From 2034aa15c82570c989dfe5ab3647c55e8106e852 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Tue, 1 Nov 2016 20:42:45 +0300 Subject: [PATCH 001/347] QJSEngine has been added --- common.pri | 8 +- demo_r1/mainwindow.cpp | 4 +- include/lrglobal.h | 14 + include/lrreportengine.h | 1 + include/lrscriptenginemanagerintf.h | 11 +- limereport/items/lrtextitemeditor.cpp | 2 +- limereport/lrglobal.h | 14 + limereport/lritemdesignintf.cpp | 22 +- limereport/lrreportengine.cpp | 2 +- limereport/lrreportengine.h | 1 + limereport/lrreportrender.cpp | 2 +- limereport/lrscriptenginemanager.cpp | 463 +++++++++++++++++-- limereport/lrscriptenginemanager.h | 98 +++- limereport/lrscriptenginemanagerintf.h | 11 +- limereport/scriptbrowser/lrscriptbrowser.cpp | 2 +- 15 files changed, 595 insertions(+), 60 deletions(-) diff --git a/common.pri b/common.pri index 8eee2c5..78398e5 100644 --- a/common.pri +++ b/common.pri @@ -1,6 +1,6 @@ CONFIG += build_translations CONFIG += zint - +#CONFIG += qjsengine #greaterThan(QT_MAJOR_VERSION, 4) { # QT += uitools #} @@ -68,11 +68,15 @@ TRANSLATIONS_PATH = $$PWD/translations greaterThan(QT_MAJOR_VERSION, 4) { DEFINES+=HAVE_QT5 - QT+= printsupport widgets + QT+= printsupport widgets qml contains(QT,uitools){ message(uitools) DEFINES += HAVE_UI_LOADER } + contains(CONFIG, qjsengine){ + message(qjsengine) + DEFINES += USE_QJSENGINE + } } lessThan(QT_MAJOR_VERSION, 5){ diff --git a/demo_r1/mainwindow.cpp b/demo_r1/mainwindow.cpp index b5afab8..0634a15 100644 --- a/demo_r1/mainwindow.cpp +++ b/demo_r1/mainwindow.cpp @@ -93,8 +93,8 @@ MainWindow::MainWindow(QWidget *parent) : report->dataManager()->addModel("string_list",stringListModel,true); QStringList strList; strList<<"value1"<<"value2"; - QScriptValue value = qScriptValueFromSequence(report->scriptManager()->scriptEngine(),strList); - report->scriptManager()->scriptEngine()->globalObject().setProperty("test_list",value); + //QScriptValue value = qScriptValueFromSequence(report->scriptManager()->scriptEngine(),strList); + //report->scriptManager()->scriptEngine()->globalObject().setProperty("test_list",value); } diff --git a/include/lrglobal.h b/include/lrglobal.h index e64cd43..ea1d3ce 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -42,6 +42,12 @@ # define LIMEREPORT_EXPORT /**/ #endif +#ifdef USE_QJSENGINE +#include +#else +#include +#endif + namespace LimeReport { #ifdef __GNUC__ @@ -83,6 +89,7 @@ namespace Const{ const QString GROUP_FUNCTION_RX = "(%1\\s*"+GROUP_FUNCTION_PARAM_RX+")"; const QString GROUP_FUNCTION_NAME_RX = "%1\\s*\\((.*[^\\)])\\)"; const int SCENE_MARGIN = 50; + const QString FUNCTION_MANAGER_NAME = "LimeReport"; } QString extractClassName(QString className); enum RenderPass {FirstPass, SecondPass}; @@ -117,6 +124,13 @@ namespace Const{ typedef QStyleOptionViewItem StyleOptionViewItem; #endif +#ifdef USE_QJSENGINE + typedef QJSEngine ScriptEngineType; + typedef QJSValue ScriptValueType; +#else + typedef QScriptEngine ScriptEngineType; + typedef QScriptValue ScriptValueType; +#endif } // namespace LimeReport diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 814d831..804e764 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -33,6 +33,7 @@ #include #include #include +//#include #include "lrglobal.h" #include "lrdatasourcemanagerintf.h" diff --git a/include/lrscriptenginemanagerintf.h b/include/lrscriptenginemanagerintf.h index d7662ff..4c2767a 100644 --- a/include/lrscriptenginemanagerintf.h +++ b/include/lrscriptenginemanagerintf.h @@ -30,15 +30,19 @@ #ifndef LRSCRIPTENGINEMANAGERINTF_H #define LRSCRIPTENGINEMANAGERINTF_H -#include +//#include +#include "lrglobal.h" namespace LimeReport{ + class IScriptEngineManager{ public: - virtual QScriptEngine* scriptEngine() = 0; - virtual bool addFunction(const QString& name, QScriptEngine::FunctionSignature function, + virtual ScriptEngineType* scriptEngine() = 0; +#ifndef USE_QJSENGINE + virtual bool addFunction(const QString& name, ScriptEngineType::FunctionSignature function, const QString& category="", const QString& description="") = 0; +#endif virtual bool addFunction(const QString &name, const QString& script, const QString &category="", const QString &description="") = 0; virtual const QString& lastError() const = 0; @@ -46,4 +50,5 @@ public: }; } //namespace LimeReport + #endif // LRSCRIPTENGINEMANAGERINTF_H diff --git a/limereport/items/lrtextitemeditor.cpp b/limereport/items/lrtextitemeditor.cpp index e2b6778..cba99ff 100644 --- a/limereport/items/lrtextitemeditor.cpp +++ b/limereport/items/lrtextitemeditor.cpp @@ -133,7 +133,7 @@ void TextItemEditor::initUI() ui->tabWidget->setVisible(false); } - foreach (LimeReport::ScriptFunctionDesc functionDesc, se.functionsDescriber()) { + foreach (LimeReport::ScriptFunctionDesc functionDesc, se.functionsDescribers()) { dataWords< +#else +#include +#endif + namespace LimeReport { #ifdef __GNUC__ @@ -83,6 +89,7 @@ namespace Const{ const QString GROUP_FUNCTION_RX = "(%1\\s*"+GROUP_FUNCTION_PARAM_RX+")"; const QString GROUP_FUNCTION_NAME_RX = "%1\\s*\\((.*[^\\)])\\)"; const int SCENE_MARGIN = 50; + const QString FUNCTION_MANAGER_NAME = "LimeReport"; } QString extractClassName(QString className); enum RenderPass {FirstPass, SecondPass}; @@ -117,6 +124,13 @@ namespace Const{ typedef QStyleOptionViewItem StyleOptionViewItem; #endif +#ifdef USE_QJSENGINE + typedef QJSEngine ScriptEngineType; + typedef QJSValue ScriptValueType; +#else + typedef QScriptEngine ScriptEngineType; + typedef QScriptValue ScriptValueType; +#endif } // namespace LimeReport diff --git a/limereport/lritemdesignintf.cpp b/limereport/lritemdesignintf.cpp index db18eb2..655c39b 100644 --- a/limereport/lritemdesignintf.cpp +++ b/limereport/lritemdesignintf.cpp @@ -215,27 +215,27 @@ QString ContentItemDesignIntf::expandScripts(QString context, DataSourceManager* if (context.contains(rx)){ ScriptEngineManager::instance().setDataManager(dataManager); - QScriptEngine* se = ScriptEngineManager::instance().scriptEngine(); + ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); - QScriptValue svThis = se->globalObject().property("THIS"); - if (svThis.isValid()){ - se->newQObject(svThis, this); - } else { - svThis = se->newQObject(this); - se->globalObject().setProperty("THIS",svThis); - } + //QJSValue svThis = se->globalObject().property("THIS"); + //if (!svThis.isUndefined()){ + // se->newQObject(svThis, this); + //} else { + ScriptValueType svThis = se->newQObject(this); + se->globalObject().setProperty("THIS",svThis); + //} ScriptExtractor scriptExtractor(context); if (scriptExtractor.parse()){ for(int i=0; ievaluate(scriptBody); - if (!se->hasUncaughtException()) { + ScriptValueType value = se->evaluate(scriptBody); + if (!value.isError()) { m_varValue = value.toVariant(); context.replace(scriptExtractor.scriptAt(i),value.toString()); } else { - context.replace(scriptExtractor.scriptAt(i),se->uncaughtException().toString()); + context.replace(scriptExtractor.scriptAt(i),value.toString()); } } } diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 7ff4095..2ce78ee 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -775,7 +775,7 @@ IDataSourceManager *ReportEngine::dataManager() return d->dataManagerIntf(); } -IScriptEngineManager* ReportEngine::scriptManager() +IScriptEngineManager *ReportEngine::scriptManager() { Q_D(ReportEngine); return d->scriptManagerIntf(); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 814d831..804e764 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -33,6 +33,7 @@ #include #include #include +//#include #include "lrglobal.h" #include "lrdatasourcemanagerintf.h" diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 42dacef..1f4924c 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -167,7 +167,7 @@ void ReportRender::setScriptContext(ScriptEngineContext* scriptContext) bool ReportRender::runInitScript(){ if (m_scriptEngineContext){ - QScriptValue res = ScriptEngineManager::instance().scriptEngine()->evaluate(m_scriptEngineContext->initScript()); + ScriptValueType res = ScriptEngineManager::instance().scriptEngine()->evaluate(m_scriptEngineContext->initScript()); if (res.isBool()) return res.toBool(); } return true; diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 976aa22..6aaedca 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -181,7 +181,7 @@ void ScriptEngineModel::updateModel() beginResetModel(); m_rootNode->clear(); QMap categories; - foreach(ScriptFunctionDesc funcDesc, m_scriptManager->functionsDescriber()){ + foreach(ScriptFunctionDesc funcDesc, m_scriptManager->functionsDescribers()){ ScriptEngineNode* categ; QString categoryName = (!funcDesc.category.isEmpty())?funcDesc.category:"NO CATEGORY"; if (categories.contains(categoryName)){ @@ -328,6 +328,44 @@ void ScriptEngineManager::deleteFunction(const QString &functionsName) } } +bool ScriptEngineManager::addFunction(const JSFunctionDesc &functionDescriber) +{ + ScriptValueType functionManager = scriptEngine()->globalObject().property(functionDescriber.managerName()); +#ifdef USE_QJSENGINE + if (functionManager.isUndefined()){ +#else + if (!functionManager.isValid()){ +#endif + functionManager = scriptEngine()->newQObject(functionDescriber.manager()); + scriptEngine()->globalObject().setProperty( + functionDescriber.managerName(), + functionManager + ); + } + + if (functionManager.toQObject() == functionDescriber.manager()){ + ScriptValueType checkWrapper = scriptEngine()->evaluate(functionDescriber.scriptWrapper()); + if (!checkWrapper.isError()){ + ScriptFunctionDesc funct; + funct.name = functionDescriber.name(); + funct.description = functionDescriber.description(); + funct.category = functionDescriber.category(); + funct.type = ScriptFunctionDesc::Native; + m_functions.append(funct); + if (m_model) + m_model->updateModel(); + return true; + } else { + m_lastError = checkWrapper.toString(); + return false; + } + } else { + m_lastError = tr("Function manger with name \"%1\" already exists !"); + return false; + } + +} + bool ScriptEngineManager::containsFunction(const QString& functionName){ foreach (ScriptFunctionDesc funct, m_functions) { if (funct.name.compare(functionName)== 0){ @@ -337,7 +375,8 @@ bool ScriptEngineManager::containsFunction(const QString& functionName){ return false; } -bool ScriptEngineManager::addFunction(const QString& name, +#ifndef USE_QJSENGINE +Q_DECL_DEPRECATED bool ScriptEngineManager::addFunction(const QString& name, QScriptEngine::FunctionSignature function, const QString& category, const QString& description) @@ -360,23 +399,23 @@ bool ScriptEngineManager::addFunction(const QString& name, return false; } } +#endif bool ScriptEngineManager::addFunction(const QString& name, const QString& script, const QString& category, const QString& description) { - QScriptSyntaxCheckResult cr = m_scriptEngine->checkSyntax(script); - if (cr.state() == QScriptSyntaxCheckResult::Valid){ + ScriptValueType functionValue = m_scriptEngine->evaluate(script); + if (!functionValue.isError()){ ScriptFunctionDesc funct; - funct.scriptValue = m_scriptEngine->evaluate(script); + funct.scriptValue = functionValue; funct.name = name; funct.category = category; funct.description = description; funct.type = ScriptFunctionDesc::Script; - funct.scriptValue.setData(m_scriptEngine->toScriptValue(this)); m_functions.append(funct); m_model->updateModel(); return true; } else { - m_lastError = cr.errorMessage(); + m_lastError = functionValue.toString(); return false; } } @@ -395,12 +434,18 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ m_dataManager = dataManager; if (m_dataManager){ foreach(QString func, m_dataManager->groupFunctionNames()){ - if (isFunctionExists(func)) deleteFunction(func); - addFunction(func, groupFunction,"GROUP FUNCTIONS", func+"(\""+tr("FieldName")+"\",\""+tr("BandName")+"\")"); - } - foreach(ScriptFunctionDesc func, m_functions){ - if (func.type==ScriptFunctionDesc::Native) - m_scriptEngine->globalObject().setProperty(func.name,func.scriptValue); + JSFunctionDesc describer( + func, + "GROUP FUNCTIONS", + func+"(\""+tr("FieldName")+"\",\""+tr("BandName")+"\")", + LimeReport::Const::FUNCTION_MANAGER_NAME, + m_functionManager, + QString("function %1(fieldName,bandName){\ + return %2.calcGroupFunction(\"%1\",fieldName,bandName);}" + ).arg(func) + .arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + addFunction(describer); } } } @@ -411,27 +456,211 @@ void ScriptEngineManager::updateModel() } +bool ScriptEngineManager::createLineFunction() +{ + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("SYSTEM"); + fd.setName("line"); + fd.setDescription("line(\""+tr("BandName")+"\")"); + fd.setScriptWrapper(QString("function line(bandName){ return %1.line(bandName);}").arg(LimeReport::Const::FUNCTION_MANAGER_NAME)); + + return addFunction(fd); + +} + +bool ScriptEngineManager::createNumberFomatFunction() +{ + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("NUMBER"); + fd.setName("numberFormat"); + fd.setDescription("numberFormat(\""+tr("Value")+"\",\""+tr("Format")+"\",\""+ + tr("Precision")+"\",\""+ + tr("Locale")+"\")" + ); + fd.setScriptWrapper(QString("function numberFormat(value, format, precision, locale){" + " if(typeof(format)==='undefined') format = \"f\"; " + " if(typeof(precision)==='undefined') precision=2; " + " if(typeof(locale)==='undefined') locale=\"\"; " + "return %1.numberFormat(value,format,precision,locale);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createDateFormatFunction(){ +// addFunction("dateFormat",dateFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("DATE&TIME"); + fd.setName("dateFormat"); + fd.setDescription("dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); + fd.setScriptWrapper(QString("function dateFormat(value, format){" + " if(typeof(format)==='undefined') format = \"dd.MM.yyyy\"; " + "return %1.dateFormat(value,format);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createTimeFormatFunction(){ +// addFunction("timeFormat",timeFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("DATE&TIME"); + fd.setName("timeFormat"); + fd.setDescription("timeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); + fd.setScriptWrapper(QString("function timeFormat(value, format){" + " if(typeof(format)==='undefined') format = \"hh:mm\"; " + "return %1.timeFormat(value,format);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createDateTimeFormatFunction(){ +// addFunction("dateTimeFormat", dateTimeFormat, "DATE&TIME", "dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("DATE&TIME"); + fd.setName("dateTimeFormat"); + fd.setDescription("dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); + fd.setScriptWrapper(QString("function dateTimeFormat(value, format){" + " if(typeof(format)==='undefined') format = \"dd.MM.yyyy hh:mm\"; " + "return %1.dateTimeFormat(value,format);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createDateFunction(){ +// addFunction("date",date,"DATE&TIME","date()"); + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("DATE&TIME"); + fd.setName("date"); + fd.setDescription("date()"); + fd.setScriptWrapper(QString("function date(){" + "return %1.date();}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + + +bool ScriptEngineManager::createNowFunction(){ +// addFunction("now",now,"DATE&TIME","now()"); + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("DATE&TIME"); + fd.setName("now"); + fd.setDescription("now()"); + fd.setScriptWrapper(QString("function now(){" + "return %1.now();}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createCurrencyFormatFunction(){ +// addFunction("currencyFormat",currencyFormat,"NUMBER","currencyFormat(\""+tr("Value")+"\",\""+tr("Locale")+"\")"); + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("NUMBER"); + fd.setName("currencyFormat"); + fd.setDescription("currencyFormat(\""+tr("Value")+"\",\""+tr("Locale")+"\")"); + fd.setScriptWrapper(QString("function currencyFormat(value, locale){" + " if(typeof(locale)==='undefined') locale = \"\"; " + "return %1.currencyFormat(value,locale);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createCurrencyUSBasedFormatFunction(){ +// addFunction("currencyUSBasedFormat",currencyUSBasedFormat,"NUMBER","currencyUSBasedFormat(\""+tr("Value")+",\""+tr("CurrencySymbol")+"\")"); + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("NUMBER"); + fd.setName("currencyUSBasedFormat"); + fd.setDescription("currencyUSBasedFormat(\""+tr("Value")+",\""+tr("CurrencySymbol")+"\")"); + fd.setScriptWrapper(QString("function currencyUSBasedFormat(value, currencySymbol){" + " if(typeof(currencySymbol)==='undefined') currencySymbol = \"\"; " + "return %1.currencyFormat(value,currencySymbol);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createSetVariableFunction(){ +// addFunction("setVariable", setVariable, "GENERAL", "setVariable(\""+tr("Name")+"\",\""+tr("Value")+"\")"); + JSFunctionDesc fd; + + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("GENERAL"); + fd.setName("setVariable"); + fd.setDescription("setVariable(\""+tr("Name")+"\",\""+tr("Value")+"\")"); + fd.setScriptWrapper(QString("function setVariable(name, value){" + "return %1.setVariable(name,value);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + ScriptEngineManager::ScriptEngineManager() :m_model(0), m_dataManager(0) { - m_scriptEngine = new QScriptEngine; + m_scriptEngine = new ScriptEngineType; + m_functionManager = new ScriptFunctionsManager(this); + m_functionManager->setScriptEngineManager(this); - //addFunction("dateToStr",dateToStr,"DATE", "dateToStr(\"value\",\"format\")"); - addFunction("line",line,"SYSTEM", "line(\""+tr("BandName")+"\")"); - addFunction("numberFormat",numberFormat,"NUMBER", "numberFormat(\""+tr("Value")+"\",\""+tr("Format")+"\",\""+ - tr("Precision")+"\",\""+ - tr("Locale")+"\")"); - addFunction("dateFormat",dateFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); - addFunction("timeFormat",timeFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); - addFunction("dateTimeFormat", dateTimeFormat, "DATE&TIME", "dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); - addFunction("date",date,"DATE&TIME","date()"); - addFunction("now",now,"DATE&TIME","now()"); + createLineFunction(); + createNumberFomatFunction(); + createDateFormatFunction(); + createTimeFormatFunction(); + createDateTimeFormatFunction(); + createDateFunction(); + createNowFunction(); #if QT_VERSION>0x040800 - addFunction("currencyFormat",currencyFormat,"NUMBER","currencyFormat(\""+tr("Value")+"\",\""+tr("Locale")+"\")"); - addFunction("currencyUSBasedFormat",currencyUSBasedFormat,"NUMBER","currencyUSBasedFormat(\""+tr("Value")+",\""+tr("CurrencySymbol")+"\")"); + createCurrencyFormatFunction(); + createCurrencyUSBasedFormatFunction(); #endif - addFunction("setVariable", setVariable, "GENERAL", "setVariable(\""+tr("Name")+"\",\""+tr("Value")+"\")"); + createSetVariableFunction(); +// addFunction("line",line,"SYSTEM", "line(\""+tr("BandName")+"\")"); +// addFunction("numberFormat",numberFormat,"NUMBER", "numberFormat(\""+tr("Value")+"\",\""+tr("Format")+"\",\""+ +// tr("Precision")+"\",\""+ +// tr("Locale")+"\")"); + +// addFunction("dateFormat",dateFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); +// addFunction("timeFormat",timeFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); +// addFunction("dateTimeFormat", dateTimeFormat, "DATE&TIME", "dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); +// addFunction("date",date,"DATE&TIME","date()"); +// addFunction("now",now,"DATE&TIME","now()"); +// addFunction("currencyFormat",currencyFormat,"NUMBER","currencyFormat(\""+tr("Value")+"\",\""+tr("Locale")+"\")"); +// addFunction("currencyUSBasedFormat",currencyUSBasedFormat,"NUMBER","currencyUSBasedFormat(\""+tr("Value")+",\""+tr("CurrencySymbol")+"\")"); +// addFunction("setVariable", setVariable, "GENERAL", "setVariable(\""+tr("Name")+"\",\""+tr("Value")+"\")"); +#ifndef USE_QJSENGINE QScriptValue colorCtor = m_scriptEngine->newFunction(constructColor); m_scriptEngine->globalObject().setProperty("QColor", colorCtor); @@ -439,7 +668,7 @@ ScriptEngineManager::ScriptEngineManager() m_scriptEngine->setDefaultPrototype(qMetaTypeId(), fontProto); QScriptValue fontConstructor = m_scriptEngine->newFunction(QFontPrototype::constructorQFont, fontProto); m_scriptEngine->globalObject().setProperty("QFont", fontConstructor); - +#endif // foreach(QString func, dataManager()->groupFunctionNames()){ // addFunction(func, groupFunction,"GROUP FUNCTIONS", func+"(\""+tr("FieldName")+"\",\""+tr("BandName")+"\")"); // } @@ -753,5 +982,183 @@ DialogDescriber::Ptr DialogDescriber::create(const QString& name, const QByteArr return res; } +QString JSFunctionDesc::name() const +{ + return m_name; +} + +void JSFunctionDesc::setName(const QString &name) +{ + m_name = name; +} + +QString JSFunctionDesc::category() const +{ + return m_category; +} + +void JSFunctionDesc::setCategory(const QString &category) +{ + m_category = category; +} + +QString JSFunctionDesc::description() const +{ + return m_description; +} + +void JSFunctionDesc::setDescription(const QString &description) +{ + m_description = description; +} + +QString JSFunctionDesc::managerName() const +{ + return m_managerName; +} + +void JSFunctionDesc::setManagerName(const QString &managerName) +{ + m_managerName = managerName; +} + +QObject *JSFunctionDesc::manager() const +{ + return m_manager; +} + +void JSFunctionDesc::setManager(QObject *manager) +{ + m_manager = manager; +} + +QString JSFunctionDesc::scriptWrapper() const +{ + return m_scriptWrapper; +} + +void JSFunctionDesc::setScriptWrapper(const QString &scriptWrapper) +{ + m_scriptWrapper = scriptWrapper; +} + +QVariant ScriptFunctionsManager::calcGroupFunction(const QString &name, const QString &fieldName, const QString &bandName) +{ + if (m_scriptEngineManager->dataManager()){ + GroupFunction* gf = m_scriptEngineManager->dataManager()->groupFunction(name,fieldName,bandName); + if (gf){ + if (gf->isValid()){ + return gf->calculate(); + }else{ + return gf->error(); + } + } + else { + return QString(QObject::tr("Function %1 not found or have wrong arguments").arg(name)); + } + } else { + return QString(QObject::tr("Datasource manager not found")); + } +} + +QVariant ScriptFunctionsManager::line(const QString &bandName) +{ + QString varName = QLatin1String("line_")+bandName.toLower(); + QVariant res; + if (scriptEngineManager()->dataManager()->variable(varName).isValid()){ + res=scriptEngineManager()->dataManager()->variable(varName); + } else res=QString("Variable line for band %1 not found").arg(bandName); + return res; +} + +QVariant ScriptFunctionsManager::numberFormat(QVariant value, const char &format, int precision, const QString& locale) +{ + return (locale.isEmpty())?QString::number(value.toDouble(),format,precision): + QLocale(locale).toString(value.toDouble(),format,precision); +} + +QVariant ScriptFunctionsManager::dateFormat(QVariant value, const QString &format) +{ + return QLocale().toString(value.toDate(),format); +} + +QVariant ScriptFunctionsManager::timeFormat(QVariant value, const QString &format) +{ + return QLocale().toString(value.toTime(),format); +} + +QVariant ScriptFunctionsManager::dateTimeFormat(QVariant value, const QString &format) +{ + return QLocale().toString(value.toDateTime(),format); +} + +QVariant ScriptFunctionsManager::date() +{ + return QDate::currentDate(); +} + +QVariant ScriptFunctionsManager::now() +{ + return QDateTime::currentDateTime(); +} + +QVariant ScriptFunctionsManager::currencyFormat(QVariant value, const QString &locale) +{ + QString l = (!locale.isEmpty())?locale:QLocale::system().name(); + return QLocale(l).toCurrencyString(value.toDouble()); +} + +QVariant ScriptFunctionsManager::currencyUSBasedFormat(QVariant value, const QString ¤cySymbol) +{ + QString CurrencySymbol = (!currencySymbol.isEmpty())?currencySymbol:QLocale::system().currencySymbol(); + // Format it using USA locale + QString vTempStr=QLocale(QLocale::English, QLocale::UnitedStates).toCurrencyString(value.toDouble()); + // Replace currency symbol if necesarry + if (CurrencySymbol!="") vTempStr.replace("$", CurrencySymbol); + return vTempStr; +} + +void ScriptFunctionsManager::setVariable(const QString &name, QVariant value) +{ + DataSourceManager* dm = scriptEngineManager()->dataManager(); + dm->changeVariable(name,value); +} +#ifdef USE_QJSENGINE +QFont ScriptFunctionsManager::font(const QString &family, int pointSize, bool bold, bool italic, bool underLine) +{ + QFont result (family, pointSize); + result.setBold(bold); + result.setItalic(italic); + result.setUnderline(underLine); + return result; +} +#endif +QFont ScriptFunctionsManager::font(QVariantMap params){ + if (!params.contains("family")){ + return QFont(); + } else { + QFont result(params.value("family").toString()); + if (params.contains("pointSize")) + result.setPointSize(params.value("pointSize").toInt()); + if (params.contains("bold")) + result.setBold(params.value("bold").toBool()); + if (params.contains("italic")) + result.setItalic(params.value("italic").toBool()); + if (params.contains("underline")) + result.setUnderline(params.value("underline").toBool()); + return result; + } +} + +ScriptEngineManager *ScriptFunctionsManager::scriptEngineManager() const +{ + return m_scriptEngineManager; +} + +void ScriptFunctionsManager::setScriptEngineManager(ScriptEngineManager *scriptEngineManager) +{ + m_scriptEngineManager = scriptEngineManager; +} + } //namespace LimeReport diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 0c738d9..63a2f45 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -39,11 +39,15 @@ #include #include + +//#include + #ifdef HAVE_UI_LOADER #include #endif #include "base/lrsingleton.h" +#include "lrglobal.h" #include "lrscriptenginemanagerintf.h" #include "lrcollection.h" @@ -53,7 +57,7 @@ class DataSourceManager; struct ScriptFunctionDesc{ enum FuncType {Native,Script}; - QScriptValue scriptValue; + ScriptValueType scriptValue; QString name; QString description; QString category; @@ -169,22 +173,91 @@ private: QString m_initScript; }; +class JSFunctionDesc{ +public: + JSFunctionDesc(){} + JSFunctionDesc(const QString& functionName, + const QString& functionCategory, + const QString& functionDescription, + const QString& functionManagerName, + QObject* functionManger, + const QString& functionScriptWrapper + ): m_name(functionName), m_category(functionCategory), m_description(functionDescription), + m_managerName(functionManagerName), m_manager(functionManger), m_scriptWrapper(functionScriptWrapper) + {} + QString name() const; + void setName(const QString &name); + + QString category() const; + void setCategory(const QString &category); + + QString description() const; + void setDescription(const QString &description); + + QString managerName() const; + void setManagerName(const QString &managerName); + + QObject *manager() const; + void setManager(QObject *manager); + + QString scriptWrapper() const; + void setScriptWrapper(const QString &scriptWrapper); + +private: + QString m_name; + QString m_category; + QString m_description; + QString m_managerName; + QObject* m_manager; + QString m_scriptWrapper; +}; + +class ScriptFunctionsManager : public QObject{ + Q_OBJECT +public: + explicit ScriptFunctionsManager(QObject* parent = 0):QObject(parent){} + Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& fieldName, const QString& bandName); + Q_INVOKABLE QVariant line(const QString& bandName); + Q_INVOKABLE QVariant numberFormat(QVariant value, const char &format, int precision, const QString &locale); + Q_INVOKABLE QVariant dateFormat(QVariant value, const QString& format); + Q_INVOKABLE QVariant timeFormat(QVariant value, const QString& format); + Q_INVOKABLE QVariant dateTimeFormat(QVariant value, const QString& format); + Q_INVOKABLE QVariant date(); + Q_INVOKABLE QVariant now(); + Q_INVOKABLE QVariant currencyFormat(QVariant value, const QString& locale); + Q_INVOKABLE QVariant currencyUSBasedFormat(QVariant value, const QString& currencySymbol); + Q_INVOKABLE void setVariable(const QString& name, QVariant value); + Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} +#ifdef USE_QJSENGINE + Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); +#endif + Q_INVOKABLE QFont font(QVariantMap params); + ScriptEngineManager *scriptEngineManager() const; + void setScriptEngineManager(ScriptEngineManager *scriptEngineManager); + static QColor createQColor(const QString& color){ return QColor(color);} +private: + ScriptEngineManager* m_scriptEngineManager; +}; + class ScriptEngineManager : public QObject, public Singleton, public IScriptEngineManager { Q_OBJECT public: - QScriptEngine* scriptEngine(){return m_scriptEngine;} - ~ScriptEngineManager(); friend class Singleton; + ScriptEngineType* scriptEngine(){return m_scriptEngine;} + ~ScriptEngineManager(); bool isFunctionExists(const QString& functionName) const; void deleteFunction(const QString& functionsName); - bool addFunction(const QString& name, QScriptEngine::FunctionSignature function, - const QString& category="", const QString& description=""); + + bool addFunction(const JSFunctionDesc& functionsDescriber); +#ifndef USE_QJSENGINE + bool addFunction(const QString &name, QScriptEngine::FunctionSignature function, const QString &category, const QString &description); +#endif bool addFunction(const QString &name, const QString& script, const QString &category="", const QString &description=""); const QString& lastError() const {return m_lastError;} QStringList functionsNames(); - const QList& functionsDescriber(){return m_functions;} + const QList& functionsDescribers(){return m_functions;} ScriptEngineModel* model(){return m_model;} void setContext(ScriptEngineContext* context){m_context=context;} DataSourceManager* dataManager() const {return m_dataManager;} @@ -195,14 +268,25 @@ protected: bool containsFunction(const QString &functionName); private: Q_DISABLE_COPY(ScriptEngineManager) + bool createLineFunction(); + bool createNumberFomatFunction(); + bool createDateFormatFunction(); + bool createTimeFormatFunction(); + bool createDateTimeFormatFunction(); + bool createDateFunction(); + bool createNowFunction(); + bool createCurrencyFormatFunction(); + bool createCurrencyUSBasedFormatFunction(); + bool createSetVariableFunction(); private: ScriptEngineManager(); - QScriptEngine* m_scriptEngine; + ScriptEngineType* m_scriptEngine; QString m_lastError; QList m_functions; ScriptEngineModel* m_model; ScriptEngineContext* m_context; DataSourceManager* m_dataManager; + ScriptFunctionsManager* m_functionManager; }; class ScriptExtractor diff --git a/limereport/lrscriptenginemanagerintf.h b/limereport/lrscriptenginemanagerintf.h index d7662ff..4c2767a 100644 --- a/limereport/lrscriptenginemanagerintf.h +++ b/limereport/lrscriptenginemanagerintf.h @@ -30,15 +30,19 @@ #ifndef LRSCRIPTENGINEMANAGERINTF_H #define LRSCRIPTENGINEMANAGERINTF_H -#include +//#include +#include "lrglobal.h" namespace LimeReport{ + class IScriptEngineManager{ public: - virtual QScriptEngine* scriptEngine() = 0; - virtual bool addFunction(const QString& name, QScriptEngine::FunctionSignature function, + virtual ScriptEngineType* scriptEngine() = 0; +#ifndef USE_QJSENGINE + virtual bool addFunction(const QString& name, ScriptEngineType::FunctionSignature function, const QString& category="", const QString& description="") = 0; +#endif virtual bool addFunction(const QString &name, const QString& script, const QString &category="", const QString &description="") = 0; virtual const QString& lastError() const = 0; @@ -46,4 +50,5 @@ public: }; } //namespace LimeReport + #endif // LRSCRIPTENGINEMANAGERINTF_H diff --git a/limereport/scriptbrowser/lrscriptbrowser.cpp b/limereport/scriptbrowser/lrscriptbrowser.cpp index ea38798..8719229 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.cpp +++ b/limereport/scriptbrowser/lrscriptbrowser.cpp @@ -66,7 +66,7 @@ void ScriptBrowser::updateFunctionTree() { ScriptEngineManager* sm = reportEditor()->scriptManager(); QMap categ; - foreach(ScriptFunctionDesc fd, sm->functionsDescriber()){ + foreach(ScriptFunctionDesc fd, sm->functionsDescribers()){ QString functionCategory = (fd.category!="") ? fd.category : tr("NO CATEGORY"); if (categ.contains(functionCategory)){ QTreeWidgetItem* item = new QTreeWidgetItem(categ.value(fd.category),QStringList(fd.name)); From 7c02c77aaf46d16a960fedb19a96b83565616db7 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 2 Nov 2016 01:34:45 +0300 Subject: [PATCH 002/347] CharItem has been added --- limereport/items/images/pie_chart2.png | Bin 0 -> 2237 bytes limereport/items/items.qrc | 1 + limereport/items/lrchartitem.cpp | 1062 ++++++++++++++++++++++++ limereport/items/lrchartitem.h | 208 +++++ limereport/items/lrchartitemeditor.cpp | 249 ++++++ limereport/items/lrchartitemeditor.h | 57 ++ limereport/items/lrchartitemeditor.ui | 223 +++++ limereport/limereport.pri | 13 +- limereport/lrcolorindicator.cpp | 38 + limereport/lrcolorindicator.h | 20 + 10 files changed, 1868 insertions(+), 3 deletions(-) create mode 100644 limereport/items/images/pie_chart2.png create mode 100644 limereport/items/lrchartitem.cpp create mode 100644 limereport/items/lrchartitem.h create mode 100644 limereport/items/lrchartitemeditor.cpp create mode 100644 limereport/items/lrchartitemeditor.h create mode 100644 limereport/items/lrchartitemeditor.ui create mode 100644 limereport/lrcolorindicator.cpp create mode 100644 limereport/lrcolorindicator.h diff --git a/limereport/items/images/pie_chart2.png b/limereport/items/images/pie_chart2.png new file mode 100644 index 0000000000000000000000000000000000000000..f4f788d26c970938c4d4f5bf500e7837197a7a08 GIT binary patch literal 2237 zcmV;u2txOXP)`fA`MJe$B39@7i9+P2(i>HgS`*q?ERKXhRWo5=3c1q5`TuAR!)j zK|G`q4@kfhZK;sp0p44vkf2RlL?cI{v{g$(Dj<+HY1b)nNF9G<)@yrbKW6R+4?A{j zD}e;A^w&AN(%kKmsDc#$^C=WPI9O@1Ej1NCl7r27xgt+&uzW zK`x0tH2>NIc`m<6IELK8ZuFQO;=#TEbW#GY{ zExq@MLS~q>w~3VF;|LD`ZDS%G(uo&YZclTue!`xcKfY88C*M=1{XFmjFmtuih^vr0 zz)pcYl24ZpjSe0hytVw0?9cDS#m99$thHEc(b@nOAtX|Ew=zbf2niZhKA3&kOwJvf zYjkEOEas_14Smf3lFY}XaDLF28$Ep2$TxG_N(V^GBA%C`)oQYI?i6mbI9`d7ikM$s_~Ox51x-Kk%+YvJUp#_I0@XVxm=ZV+HdAfG7umBagY zd?&ZP^Z>5RqLkv&$zynbdx1^iG*-t5t*|-<6Jxc4k59l~pQGV#roR6h6hHNOGUu2%QZt++&6G(AV$X@$J6RfpJ`!rLk0}{<~-BJ9Cs& zdjV9m9{P%JRfOAI!29qI%+wZfMm|Bx%h8t~A?^0KGfSs7N4haT{&?Zk@n@Gc$(dd` zYP(#S`P%56v3VIh+@f0v&wk8J6^TRJvNv)RNu`P?coYoxbv2dz{hw_MFU)`G^^ezxA} zB6I+{hR^{*2lOu1z_6t8fxK-ec0YU;&3U^P@A1xL#!?*v== z-K}$k(k97z1>MZUpdCq`hAH{aby3tN_vl zgb-q&H#_2{9KUyua& zVU@rtiB%3LiPc@i>D@SvOQf4DHqUEoO#oO47>lU};bgNDFCwKN?+ss@(8TC9erzHl znw&_FG1a*jt0kx|?5cH$3!lby9XfHHAgnemrrIqK7-QAxS~yu-Zck&3qJPs?RNGrm zZWYSLC>s+S)g{&uk&1|QM4JY$rEcd^v*~ZW1=y&%fgbHOJaHIhe@X#YT+d3=8rEa)A=JXdt`iiHGl~0i?wj_ zy$@zzHZeq({Z_UC{Ii zTGMn`B3^e2*7#PDGyU9Ke2n|HKT3bGL^><^=jGQpasH?6#ny#a!2ayW_;meRJ>iVS zJXH&;g||O?=3t~7xoxEb6!JaXvHgCwFYn`G?JWOloF<5;2vr@&8dAcin7Nse{OydC zc2g)6$fP}#SmwjoH#s@=^L8z)zG^W~0yEdsmhTeCC;W8zP-XB?|IYFkWGP=knk-ry zqFA9+7XXgq;JOZ;>*0D1R<@{xlboG-$yDc#T@Jf#`ICwC`bGwmFS#=F)skP?eapau zJva5>=DR{ z5VCZor8HP;0*k3y%jx8j`TvL0s{|sFqbslStX&z;0sG&GSJuA)-k;PYjT($;00000 LNkvXXu0mjfzduLo literal 0 HcmV?d00001 diff --git a/limereport/items/items.qrc b/limereport/items/items.qrc index 86b8d74..44004cd 100644 --- a/limereport/items/items.qrc +++ b/limereport/items/items.qrc @@ -33,5 +33,6 @@ images/GroupFooter16.png images/GroupHeader16.png images/ReportPage16.png + images/pie_chart2.png diff --git a/limereport/items/lrchartitem.cpp b/limereport/items/lrchartitem.cpp new file mode 100644 index 0000000..28c2218 --- /dev/null +++ b/limereport/items/lrchartitem.cpp @@ -0,0 +1,1062 @@ +#include "lrchartitem.h" +#include +#include + +#include "lrdesignelementsfactory.h" +#include "lrchartitemeditor.h" +#include "lrdatasourcemanager.h" +#include "lrpagedesignintf.h" +#include "lrreportengine_p.h" +#include "lrdatadesignintf.h" + +namespace{ + +const QString xmlTag = "ChartItem"; + +LimeReport::BaseDesignIntf * createChartItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new LimeReport::ChartItem(owner,parent); +} +bool registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, LimeReport::ItemAttribs(QObject::tr("Chart Item"),"Item"), createChartItem + ); +} + +namespace LimeReport{ + +QColor generateColor() +{ + int red = (qrand()%(256 - 1)) + 1; + int green = (qrand()%(256 - 1)) + 1; + int blue = (qrand()%(256 - 1)) + 1;; + return QColor(red,green,blue); +} + +QColor color_map[39] = { + QColor(51,102,204), QColor(220,57,18), QColor(225, 153, 0), QColor(16, 150, 24), QColor(153,0,153), + QColor(0,153,198), QColor(221, 68, 119), + QColor(255,0,0), QColor(0,0,139), QColor(0,205,0), QColor(233,30,99), QColor(255,255,0), QColor(244,67,54), + QColor(156,39,176), QColor(103,58,183), QColor(63,81,181), QColor(33,153,243), + QColor(0,150,136), QColor(78,175,80), QColor(139,195,74), QColor(205,228,57), + QColor(0,139,0), QColor(0,0,255), QColor(255,235,59), QColor(255,193,7), + QColor(255,152,0), QColor(255,87,34), QColor(121,85,72), QColor(158,158,158), + QColor(96,125,139), QColor(241,153,185), QColor(64,64,64), + QColor(188,229,218), QColor(139,0,0), QColor(139,139,0), QColor(171, 130, 255), + QColor(139, 123, 139), QColor(255, 0, 255), QColor(139, 69, 19) + }; +//QColor color_map1[55] = { +// QColor(245,147,51), QColor(244,89,73), QColor(0,142,195), QColor(1,107,159), +// QColor(242,219,127), QColor(1,127,111), QColor(143,149,166), QColor(1,173,235), +// QColor(35,63,142), QColor(121,78,38), QColor(254,195,115), QColor(237,38,110), +// QColor(240,102,125), QColor(92,97,98), QColor(0,101,94), QColor(239,59,31), +// QColor(1,73,133), QColor(0,89,151), QColor(237,27,35), QColor(219,3,107), +// QColor(0,173,239), QColor(167,138,117), QColor(0,134,124), QColor(0,110,68), +// QColor(242,199,17), QColor(247,168,114), QColor(65,174,74), QColor(1,142,76), +// QColor(1,82,165), QColor(0,111,134), QColor(69,128,43), QColor(254,222,86), +// QColor(152,262,59), QColor(237,0,137), QColor(188,26,141), QColor(0,57,115), +// QColor(150,180,127), QColor(146,154,160), QColor(1,82,132), QColor(23,97,134), +// QColor(95,194,171), QColor(0,114,187), QColor(200,133,183), QColor(81,33,127), +// QColor(0,254,0), QColor(0,0,254), QColor(254,254,0), +// QColor(254,0,254),QColor(0,254,254), QColor(0,80,0), QColor(80,0,0), +// QColor(0,0,80), QColor(80,80,0), QColor(80,0,80), +// QColor(0,80,80), +//}; + +QString SeriesItem::name() const +{ + return m_name; +} + +void SeriesItem::setName(const QString &name) +{ + m_name = name; +} + +QString SeriesItem::valuesColumn() const +{ + return m_valuesColumn; +} + +void SeriesItem::setValuesColumn(const QString &valuesColumn) +{ + m_valuesColumn = valuesColumn; +} + +QString SeriesItem::labelsColumn() const +{ + return m_labelsColumn; +} + +void SeriesItem::setLabelsColumn(const QString &labelsColumn) +{ + m_labelsColumn = labelsColumn; +} + +SeriesItem *SeriesItem::clone() +{ + SeriesItem* result = new SeriesItem(); + result->setName(name()); + result->setLabelsColumn(labelsColumn()); + result->setValuesColumn(valuesColumn()); + result->setColor(color()); + return result; +} + +void SeriesItem::fillSeriesData(IDataSource *dataSource) +{ + if (dataSource){ + dataSource->first(); + int currentColorIndex = 0; + while(!dataSource->eof()){ + if (!m_labelsColumn.isEmpty()) + m_data.labels().append(dataSource->data(m_labelsColumn).toString()); + m_data.values().append(dataSource->data(m_valuesColumn).toDouble()); + m_data.colors().append((currentColorIndex<32)?color_map[currentColorIndex]:generateColor()); + dataSource->next(); + currentColorIndex++; + } + } +} + +QColor SeriesItem::color() const +{ + return m_color; +} + +void SeriesItem::setColor(const QColor &color) +{ + m_color = color; +} + +ChartItem::ChartItem(QObject *owner, QGraphicsItem *parent) + : ItemDesignIntf(xmlTag, owner, parent), m_legendBorder(true), + m_legendAlign(LegendAlignCenter), m_titleAlign(TitleAlignCenter), + m_chartType(Pie), m_labelsField("") +{ + m_labels<<"First"<<"Second"<<"Thrid"; + m_chart = new PieChart(this); +} + +ChartItem::~ChartItem() +{ + foreach (SeriesItem* series, m_series) { + delete series; + } + m_series.clear(); + delete m_chart; +} + +ChartItem::TitleAlign ChartItem::titleAlign() const +{ + return m_titleAlign; +} + +void ChartItem::setTitleAlign(const TitleAlign &titleAlign) +{ + if (m_titleAlign != titleAlign){ + TitleAlign oldValue = m_titleAlign; + m_titleAlign = titleAlign; + notify("titleAlign",oldValue,m_titleAlign); + update(); + } +} + +void ChartItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + painter->save(); + setupPainter(painter); + painter->setFont(transformToSceneFont(painter->font())); + painter->setRenderHint(QPainter::Antialiasing,true); + painter->setRenderHint(QPainter::TextAntialiasing,true); + qreal borderMargin = (rect().height()*0.01>10)?(10):(rect().height()*0.01); + qreal maxTitleHeight = rect().height()*0.2; + + QFont tmpFont = painter->font(); + + qreal titleOffset = !m_title.isEmpty()?(((painter->fontMetrics().height()+borderMargin*2)fontMetrics().height()+borderMargin*2): + (maxTitleHeight)):0; + + QRectF titleRect = QRectF(borderMargin,borderMargin,rect().width()-borderMargin*2,titleOffset); + QRectF legendRect = m_chart->calcChartLegendRect(painter->font(), rect(), false, borderMargin, titleOffset); + QRectF diagramRect = rect().adjusted(borderMargin,titleOffset+borderMargin, + -(legendRect.width()+borderMargin*2),-borderMargin); + + paintChartTitle(painter, titleRect); + m_chart->paintChartLegend(painter,legendRect); + m_chart->paintChart(painter,diagramRect); + + painter->restore(); + ItemDesignIntf::paint(painter,option,widget); +} + +BaseDesignIntf *ChartItem::createSameTypeItem(QObject *owner, QGraphicsItem *parent) +{ + ChartItem* result = new ChartItem(owner,parent); + foreach (SeriesItem* series, m_series) { + result->m_series.append(series->clone()); + } + return result; +} + +QObject *ChartItem::createElement(const QString &collectionName, const QString &elementType) +{ + Q_UNUSED(elementType); + if (collectionName.compare("series")==0){ + SeriesItem* seriesItem = new SeriesItem(); + m_series.append(seriesItem); + return seriesItem; + } + return 0; +} + +int ChartItem::elementsCount(const QString &collectionName) +{ + if (collectionName.compare("series")==0) + return m_series.count(); + return 0; +} + +QObject *ChartItem::elementAt(const QString &collectionName, int index) +{ + if (collectionName.compare("series")==0) + return m_series.at(index); + return 0; +} + +void ChartItem::updateItemSize(DataSourceManager *dataManager, RenderPass , int ) +{ + if (dataManager && dataManager->dataSource(m_datasource)){ + IDataSource* ds = dataManager->dataSource(m_datasource); + foreach (SeriesItem* series, m_series) { + series->fillSeriesData(ds); + } + fillLabels(ds); + } +} + +void ChartItem::fillLabels(IDataSource *dataSource) +{ + m_labels.clear(); + if (dataSource && !m_labelsField.isEmpty()){ + dataSource->first(); + while(!dataSource->eof()){ + m_labels.append(dataSource->data(m_labelsField).toString()); + dataSource->next(); + } + } +} + +QWidget *ChartItem::defaultEditor() +{ + QSettings* l_settings = (page()->settings() != 0) ? + page()->settings() : + (page()->reportEditor()!=0) ? page()->reportEditor()->settings() : 0; + QWidget* editor = new ChartItemEditor(this,page(),l_settings); + editor->setAttribute(Qt::WA_DeleteOnClose); + return editor; +} + +QList ChartItem::labels() const +{ + return m_labels; +} + +void ChartItem::setLabels(const QList &labels) +{ + m_labels = labels; +} + +QString ChartItem::labelsField() const +{ + return m_labelsField; +} + +void ChartItem::setLabelsField(const QString &labelsField) +{ + m_labelsField = labelsField; +} + +ChartItem::ChartType ChartItem::chartType() const +{ + return m_chartType; +} + +void ChartItem::setChartType(const ChartType &chartType) +{ + if (m_chartType != chartType){ + ChartType oldValue = m_chartType; + m_chartType = chartType; + delete m_chart; + switch (m_chartType) { + case Pie: + m_chart = new PieChart(this); + break; + case VerticalBar: + m_chart = new VerticalBarChart(this); + break; + case HorizontalBar: + m_chart = new HorizontalBarChart(this); + break; + } + notify("chartType",oldValue,m_chartType); + update(); + } +} + +QString ChartItem::datasource() const +{ + return m_datasource; +} + +void ChartItem::setDatasource(const QString &datasource) +{ + m_datasource = datasource; +} + +void ChartItem::paintChartTitle(QPainter *painter, QRectF titleRect) +{ + painter->save(); + QFont tmpFont = painter->font(); + QFontMetrics fm(tmpFont); + while ((fm.height()>titleRect.height() || fm.width(m_title)>titleRect.width()) + && tmpFont.pixelSize()>1) { + tmpFont.setPixelSize(tmpFont.pixelSize()-1); + fm = QFontMetrics(tmpFont); + } + painter->setFont(tmpFont); + Qt::AlignmentFlag align = Qt::AlignCenter; + switch (m_titleAlign) { + case TitleAlignLeft: + align = Qt::AlignLeft; + break; + case TitleAlignCenter: + align = Qt::AlignCenter; + break; + case TitleAlignRight: + align = Qt::AlignRight; + break; + } + painter->drawText(titleRect, align, m_title); + painter->restore(); +} + + +ChartItem::LegendAlign ChartItem::legendAlign() const +{ + return m_legendAlign; +} + +void ChartItem::setLegendAlign(const LegendAlign &legendAlign) +{ + if (m_legendAlign != legendAlign){ + LegendAlign oldValue = m_legendAlign; + m_legendAlign = legendAlign; + notify("legendAlign",oldValue,m_legendAlign); + update(); + } +} + +bool ChartItem::drawLegendBorder() const +{ + return m_legendBorder; +} + +void ChartItem::setDrawLegendBorder(bool legendBorder) +{ + if (m_legendBorder!=legendBorder){ + m_legendBorder = legendBorder; + notify("legendBorder",!m_legendBorder,m_legendBorder); + update(); + } +} + +QString ChartItem::chartTitle() const +{ + return m_title; +} + +void ChartItem::setChartTitle(const QString &title) +{ + if (m_title != title){ + QString oldValue = m_title; + m_title = title; + update(); + notify("chartTitle",oldValue,title); + } +} + +QList &ChartItem::series() +{ + return m_series; +} + +void ChartItem::setSeries(const QList &series) +{ + m_series = series; +} + +bool ChartItem::isSeriesExists(const QString &name) +{ + foreach (SeriesItem* series, m_series) { + if (series->name().compare(name)==0) return true; + } + return false; +} + +AbstractChart::AbstractChart(ChartItem *chartItem) + :m_chartItem(chartItem) +{ + m_designLabels<legendAlign()) { + case ChartItem::LegendAlignTop: + legendTopMargin = titleOffset+borderMargin; + legendBottomMargin = parentRect.height()-(legendSize.height()+titleOffset); + break; + case ChartItem::LegendAlignCenter: + legendTopMargin = titleOffset+(parentRect.height()-titleOffset-legendSize.height())/2; + legendBottomMargin = (parentRect.height()-titleOffset-legendSize.height())/2; + break; + case ChartItem::LegendAlignBottom: + legendTopMargin = parentRect.height()-(legendSize.height()+titleOffset); + legendBottomMargin = borderMargin; + break; + } + + qreal rightOffset = !takeAllRect?((legendSize.width()>parentRect.width()/2-borderMargin)? + (parentRect.width()/2): + (parentRect.width()-legendSize.width())):0; + + QRectF legendRect = parentRect.adjusted( + rightOffset, + (legendSize.height()>(parentRect.height()-titleOffset))?(titleOffset):(legendTopMargin), + -borderMargin, + (legendSize.height()>(parentRect.height()-titleOffset))?(0):(-legendBottomMargin) + ); + + return legendRect; +} + +void AbstractChart::prepareLegendToPaint(QRectF &legendRect, QPainter *painter) +{ + QFont tmpFont = painter->font(); + QSizeF legendSize = calcChartLegendSize(tmpFont); + + if ((legendSize.height()>legendRect.height() || legendSize.width()>legendRect.width())){ + while ( (legendSize.height()>legendRect.height() || legendSize.width()>legendRect.width()) + && tmpFont.pixelSize()>1) + { + tmpFont.setPixelSize(tmpFont.pixelSize()-1); + painter->setFont(tmpFont); + legendSize = calcChartLegendSize(tmpFont); + } + painter->setFont(tmpFont); + legendRect = calcChartLegendRect(tmpFont, legendRect, true, 0, 0); + } +} + +void PieChart::drawPercent(QPainter *painter, QRectF chartRect, qreal startAngle, qreal angle) +{ + painter->save(); + + QPointF center(chartRect.left()+chartRect.width()/2,chartRect.top()+chartRect.height()/2); + qreal percent = angle/3.6; + qreal radAngle = qDegreesToRadians(angle/2+startAngle); + qreal radius = painter->fontMetrics().width("99,9%"); + qreal border = chartRect.height()*0.02; + qreal length = (chartRect.height())/2-(radius/2+border); + qreal x,y; + x = length*qCos(radAngle); + y = length*qSin(radAngle); + QPointF endPoint(center.x()+x,center.y()-y); + painter->setPen(Qt::white); + QRectF textRect(endPoint.x()-(radius/2),endPoint.y()-(radius/2),radius,radius); + + qreal arcLength = 3.14 * length * angle / 180; + if (arcLength >= radius) + painter->drawText(textRect,Qt::AlignCenter,QString::number(percent,'f',1)+"%"); + painter->restore(); + +} + +void PieChart::paintChart(QPainter *painter, QRectF chartRect) +{ + painter->save(); + QPen pen(Qt::white); + pen.setWidthF(2); + painter->setPen(pen); + + QBrush brush(Qt::transparent); + painter->setBrush(brush); + painter->setBackground(QBrush(Qt::NoBrush)); + + QRectF tmpRect = chartRect; + if (chartRect.height()>chartRect.width()){ + tmpRect.setHeight(chartRect.width()); + tmpRect.adjust(0,(chartRect.bottom()-tmpRect.bottom())/2, + 0,(chartRect.bottom()-tmpRect.bottom())/2); + } else { + tmpRect.setWidth(chartRect.height()); + } + + chartRect = tmpRect; + painter->drawRect(chartRect); + + if (!m_chartItem->series().isEmpty()&&!m_chartItem->series().at(0)->data()->values().isEmpty()){ + SeriesItem* si = m_chartItem->series().at(0); + qreal sum = 0; + foreach(qreal value, si->data()->values()){ + sum+=value; + } + qreal onePercent = sum / 100; + qreal currentDegree = 0; + int currentColor = 0; + for(int i=0; idata()->values().count();++i){ + qreal value = si->data()->values().at(i); + qreal sectorDegree = (value/onePercent)*3.6; + painter->setBrush(si->data()->colors().at(i)); + painter->drawPie(chartRect,currentDegree*16,sectorDegree*16); + drawPercent(painter, chartRect, currentDegree, sectorDegree); + currentDegree += sectorDegree; + currentColor++; + } + } else { + painter->setBrush(color_map[0]); + painter->drawPie(chartRect,0,260*16); + drawPercent(painter, chartRect, 0, 260); + painter->setBrush(color_map[1]); + painter->drawPie(chartRect,260*16,40*16); + drawPercent(painter, chartRect, 260, 40); + painter->setBrush(color_map[2]); + painter->drawPie(chartRect,300*16,60*16); + drawPercent(painter, chartRect, 300, 60); + } + + pen.setWidthF(1); + pen.setColor(Qt::gray); + painter->setPen(pen); + painter->setBrush(Qt::NoBrush); + painter->drawEllipse(chartRect); + painter->restore(); +} + +void PieChart::paintChartLegend(QPainter *painter, QRectF legendRect) +{ + prepareLegendToPaint(legendRect, painter); + + int indicatorSize = painter->fontMetrics().height()/2; + painter->setRenderHint(QPainter::Antialiasing,false); + + if (m_chartItem->drawLegendBorder()) + painter->drawRect(legendRect); + + painter->setRenderHint(QPainter::Antialiasing,true); + QRectF indicatorsRect = legendRect.adjusted(painter->fontMetrics().height()/2,painter->fontMetrics().height()/2,0,0); + + if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ + qreal cw = 0; + SeriesItem* si = m_chartItem->series().at(0); + for (int i=0;idata()->labels().count();++i){ + QString label = si->data()->labels().at(i); + painter->setPen(Qt::black); + painter->drawText(indicatorsRect.adjusted(indicatorSize+indicatorSize/2,cw,0,0),label); + painter->setPen(si->data()->colors().at(i)); + painter->setBrush(si->data()->colors().at(i)); + painter->drawEllipse( + indicatorsRect.adjusted( + 0, + cw+indicatorSize/2, + -(indicatorsRect.width()-indicatorSize), + -(indicatorsRect.height()-(cw+indicatorSize+indicatorSize/2)) + ) + ); + cw += painter->fontMetrics().height(); + } + } else { + qreal cw = 0; + for (int i=0;isetPen(Qt::black); + painter->drawText(indicatorsRect.adjusted(indicatorSize+indicatorSize/2,cw,0,0),label); + painter->setBrush(color_map[i]); + painter->setPen(color_map[i]); + painter->drawEllipse( + indicatorsRect.adjusted( + 0, + cw+indicatorSize/2, + -(indicatorsRect.width()-indicatorSize), + -(indicatorsRect.height()-(cw+indicatorSize+indicatorSize/2)) + ) + ); + cw += painter->fontMetrics().height(); + } + + } +} + +QSizeF PieChart::calcChartLegendSize(const QFont &font) +{ + QFontMetrics fm(font); + + qreal cw = 0; + qreal maxWidth = 0; + + if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ + SeriesItem* si = m_chartItem->series().at(0); + foreach(QString label, si->data()->labels()){ + cw += fm.height(); + if (maxWidthfontMetrics().width(QString::number(delta))+4; +} + +qreal VerticalBarChart::valuesVMargin(QPainter *painter) +{ + return painter->fontMetrics().height(); +} + +QRectF VerticalBarChart::labelsRect(QPainter *painter, QRectF labelsRect) +{ + qreal maxWidth = 0; + + foreach (QString label, m_chartItem->labels()) { + if (painter->fontMetrics().width(label)>maxWidth) + maxWidth = painter->fontMetrics().width(label); + } + + if (maxWidth+vPadding(m_chartItem->rect())> labelsRect.height()) + return labelsRect; + else + return labelsRect.adjusted(0,(labelsRect.height()-(maxWidth+vPadding(m_chartItem->rect()))),0,0); +} + +void VerticalBarChart::paintChart(QPainter *painter, QRectF chartRect) +{ + QRectF calcRect = labelsRect(painter, chartRect.adjusted( + hPadding(chartRect)*2+valuesHMargin(painter), + chartRect.height()*0.5, + -(hPadding(chartRect)*2), + -vPadding(chartRect) + )); + + qreal barsShift = calcRect.height(); + paintVerticalGrid(painter, chartRect.adjusted( + hPadding(chartRect), + vPadding(chartRect)+valuesVMargin(painter), + -hPadding(chartRect),-(vPadding(chartRect)+barsShift) )); + + paintVerticalBars(painter, chartRect.adjusted( + hPadding(chartRect)*2+valuesHMargin(painter), + vPadding(chartRect)+valuesVMargin(painter), + -(hPadding(chartRect)*2), + -(vPadding(chartRect)+barsShift) )); + paintLabels(painter,calcRect); +} + + +void VerticalBarChart::paintVerticalGrid(QPainter *painter, QRectF gridRect) +{ + int delta = int(maxValue()-minValue()); + delta = genNextValue(delta); + + painter->setRenderHint(QPainter::Antialiasing,false); + qreal vStep = gridRect.height() / 4; + + for (int i=0;i<5;i++){ + painter->drawText(QRectF(gridRect.bottomLeft()-QPointF(0,vStep*i+painter->fontMetrics().height()), + QSizeF(valuesHMargin(painter),painter->fontMetrics().height())), + QString::number(minValue()+i*delta/4)); + painter->drawLine(gridRect.bottomLeft()-QPointF(-valuesHMargin(painter),vStep*i), + gridRect.bottomRight()-QPointF(0,vStep*i)); + } + + painter->setRenderHint(QPainter::Antialiasing,true); +} + + + +void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect) +{ + painter->save(); + painter->setRenderHint(QPainter::Antialiasing,false); + int delta = int(maxValue()-minValue()); + delta = genNextValue(delta); + + qreal vStep = barsRect.height() / delta; + qreal hStep = (barsRect.width() / valuesCount()) / seriesCount(); + qreal topShift = (delta - (maxValue()-minValue())) * vStep +barsRect.top(); + + if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ + int curSeries = 0; + foreach (SeriesItem* series, m_chartItem->series()) { + qreal curHOffset = curSeries*hStep+barsRect.left(); + painter->setBrush(series->color()); + foreach (qreal value, series->data()->values()) { + painter->drawRect(QRectF(curHOffset, maxValue()*vStep+topShift, hStep, -value*vStep)); + curHOffset+=hStep*seriesCount(); + } + curSeries++; + } + } else { + qreal curHOffset = barsRect.left(); + int curColor = 0; + for (int i=0; i<9; ++i){ + if (curColor==3) curColor=0; + painter->setBrush(color_map[curColor]); + painter->drawRect(QRectF(curHOffset, maxValue()*vStep+barsRect.top(), hStep, -designValues()[i]*vStep)); + curHOffset+=hStep; + curColor++; + } + } + painter->restore(); +} + + + +void VerticalBarChart::paintLabels(QPainter *painter, QRectF labelsRect) +{ + painter->save(); + qreal hStep = (labelsRect.width() / valuesCount()); + int curLabel = 0; + + if (!m_chartItem->labels().isEmpty()){ + painter->rotate(270); + painter->translate(-(labelsRect.top()+labelsRect.height()),labelsRect.left()); + foreach (QString label, m_chartItem->labels()) { + painter->drawText(QRectF(QPoint(0,0), + QSize(labelsRect.height()-4,hStep)),Qt::AlignVCenter|Qt::AlignRight,label); + curLabel++; + painter->translate(0,hStep); + } + painter->rotate(-270); + } + painter->restore(); +} + +AbstractSeriesChart::AbstractSeriesChart(ChartItem *chartItem) + :AbstractChart(chartItem) +{ + m_designValues[0] = 10; + m_designValues[1] = 35; + m_designValues[2] = 15; + m_designValues[3] = 5; + m_designValues[4] = 20; + m_designValues[5] = 10; + m_designValues[6] = 40; + m_designValues[7] = 20; + m_designValues[8] = 5; +} + +qreal AbstractSeriesChart::maxValue() +{ + if (m_chartItem->itemMode()==DesignMode) return 40; + qreal maxValue = 0; + foreach(SeriesItem* series, m_chartItem->series()){ + foreach(qreal value, series->data()->values()){ + if (value>maxValue) maxValue=value; + } + } + return maxValue; +} + +qreal AbstractSeriesChart::minValue() +{ + if (m_chartItem->itemMode()==DesignMode) return 0; + qreal minValue = 0; + foreach(SeriesItem* series, m_chartItem->series()){ + foreach(qreal value, series->data()->values()){ + if (valueitemMode()==DesignMode) return 3; + return (m_chartItem->series().isEmpty())?(0):(m_chartItem->series().at(0)->data()->labels().count()); +} + +int AbstractSeriesChart::seriesCount() +{ + if (m_chartItem->itemMode()==DesignMode) return 3; + return m_chartItem->series().count(); +} + +QSizeF AbstractSeriesChart::calcChartLegendSize(const QFont &font) +{ + QFontMetrics fm(font); + + qreal cw = 0; + qreal maxWidth = 0; + + if (!m_chartItem->series().isEmpty()){ + foreach(SeriesItem* series, m_chartItem->series()){ + cw += fm.height(); + if (maxWidthname())) + maxWidth = fm.width(series->name())+10; + } + } else { + foreach(QString label, m_designLabels){ + cw += fm.height(); + if (maxWidthfontMetrics().width(QString::number(delta))+4; +} + +qreal HorizontalBarChart::valuesVMargin(QPainter *painter) +{ + return painter->fontMetrics().height(); +} + +void HorizontalBarChart::paintChart(QPainter *painter, QRectF chartRect) +{ + QRectF calcRect = labelsRect(painter, chartRect.adjusted( + hPadding(chartRect), + vPadding(chartRect)*2, + -(chartRect.width()*0.5), + -(vPadding(chartRect)*2+valuesVMargin(painter)) + )); + + qreal barsShift = calcRect.width(); + + paintHorizontalGrid(painter, chartRect.adjusted( + hPadding(chartRect)+barsShift, + vPadding(chartRect), + -(hPadding(chartRect)),-vPadding(chartRect))); + paintHorizontalBars(painter, chartRect.adjusted( + hPadding(chartRect)+barsShift, + vPadding(chartRect)*2, + -(hPadding(chartRect)), + -(vPadding(chartRect)*2) )); + + paintLabels(painter,calcRect); +} + +void HorizontalBarChart::paintHorizontalGrid(QPainter *painter, QRectF gridRect) +{ + painter->save(); + int delta = int(maxValue()-minValue()); + delta = genNextValue(delta); + + painter->setRenderHint(QPainter::Antialiasing,false); + qreal hStep = (gridRect.width()-painter->fontMetrics().width(QString::number(maxValue()))) / 4; + + painter->setFont(adaptValuesFont(hStep-4,painter->font())); + + for (int i=0;i<5;i++){ + painter->drawText(QRectF(gridRect.left()+4+hStep*i,gridRect.bottom()-painter->fontMetrics().height(), + hStep,painter->fontMetrics().height()), + QString::number(minValue()+i*delta/4)); + painter->drawLine( gridRect.left()+hStep*i, gridRect.bottom(), + gridRect.left()+hStep*i, gridRect.top()); + + } + painter->restore(); +} + +void HorizontalBarChart::paintHorizontalBars(QPainter *painter, QRectF barsRect) +{ + painter->save(); + painter->setRenderHint(QPainter::Antialiasing,false); + int delta = int(maxValue()-minValue()); + delta = genNextValue(delta); + + qreal vStep = (barsRect.height()-painter->fontMetrics().height()) / valuesCount() / seriesCount(); + qreal hStep = (barsRect.width()-painter->fontMetrics().width(QString::number(maxValue()))) / delta; + + if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ + int curSeries = 0; + foreach (SeriesItem* series, m_chartItem->series()) { + qreal curVOffset = curSeries*vStep+barsRect.top(); + painter->setBrush(series->color()); + foreach (qreal value, series->data()->values()) { + painter->drawRect(QRectF((-minValue()*hStep)+barsRect.left(), curVOffset, value*hStep, vStep)); + curVOffset+=vStep*seriesCount(); + } + curSeries++; + } + } else { + qreal curVOffset = barsRect.top(); + int curColor = 0; + for (int i=0; i<9; ++i){ + if (curColor==3) curColor=0; + painter->setBrush(color_map[curColor]); + painter->drawRect(QRectF(barsRect.left(), curVOffset, designValues()[i]*hStep, vStep)); + curVOffset+=vStep; + curColor++; + } + } + painter->restore(); +} + +QRectF HorizontalBarChart::labelsRect(QPainter *painter, QRectF labelsRect) +{ + qreal maxWidth = 0; + + foreach (QString label, m_chartItem->labels()) { + if (painter->fontMetrics().width(label)>maxWidth) + maxWidth = painter->fontMetrics().width(label); + } + + if (maxWidth+hPadding(m_chartItem->rect())*2> labelsRect.width()) + return labelsRect; + else + return labelsRect.adjusted(0,0,-(labelsRect.width()-(maxWidth+hPadding(m_chartItem->rect())*2)),0); +} + +QFont HorizontalBarChart::adaptLabelsFont(QRectF rect, QFont font) +{ + QString maxWord; + QFontMetrics fm(font); + + foreach(QString label, m_chartItem->labels()){ + foreach (QString currentWord, label.split(QRegExp("\\W+"))){ + if (fm.width(maxWord)rect.width() && tmpFont.pixelSize()>1){ + tmpFont.setPixelSize(tmpFont.pixelSize()-1); + QFontMetricsF tmpFM(tmpFont); + curWidth = tmpFM.width(maxWord); + } + return tmpFont; +} + +QFont HorizontalBarChart::adaptValuesFont(qreal width, QFont font) +{ + QString strValue = QString::number(maxValue()); + QFont tmpFont = font; + QScopedPointer fm(new QFontMetricsF(tmpFont)); + qreal curWidth = fm->width(strValue); + while (curWidth>width && tmpFont.pixelSize()>1){ + tmpFont.setPixelSize(tmpFont.pixelSize()-1); + fm.reset(new QFontMetricsF(tmpFont)); + curWidth = fm->width(strValue); + } + return tmpFont; +} + +void HorizontalBarChart::paintLabels(QPainter *painter, QRectF labelsRect) +{ + painter->save(); + painter->setFont(adaptLabelsFont(labelsRect.adjusted(0,0,-hPadding(m_chartItem->rect()),0), + painter->font())); + qreal vStep = (labelsRect.height() / valuesCount()); + int curLabel = 0; + + painter->translate(labelsRect.topLeft()); + if (!m_chartItem->labels().isEmpty()){ + foreach (QString label, m_chartItem->labels()) { + painter->drawText(QRectF(QPoint(0,vStep*curLabel), + QSize(labelsRect.width()-hPadding(m_chartItem->rect()),vStep)), + Qt::AlignVCenter | Qt::AlignRight | Qt::TextWordWrap,label); + + curLabel++; + } + } + painter->restore(); +} + +qreal AbstractBarChart::hPadding(QRectF chartRect) +{ + return (chartRect.width()*0.02); +} + +qreal AbstractBarChart::vPadding(QRectF chartRect) +{ + return (chartRect.height()*0.02); +} + +void AbstractBarChart::paintChartLegend(QPainter *painter, QRectF legendRect) +{ + prepareLegendToPaint(legendRect, painter); + int indicatorSize = painter->fontMetrics().height()/2; + painter->setPen(Qt::black); + painter->setRenderHint(QPainter::Antialiasing,false); + if (m_chartItem->drawLegendBorder()) + painter->drawRect(legendRect); + painter->setRenderHint(QPainter::Antialiasing,true); + QRectF indicatorsRect = legendRect.adjusted(painter->fontMetrics().height()/2,painter->fontMetrics().height()/2,0,0); + + if (!m_chartItem->series().isEmpty()){ + qreal cw = 0; + foreach(SeriesItem* series, m_chartItem->series()){ + QString label = series->name(); + painter->drawText(indicatorsRect.adjusted(indicatorSize+indicatorSize/2,cw,0,0),label); + painter->setBrush(series->color()); + painter->drawEllipse( + indicatorsRect.adjusted( + 0, + cw+indicatorSize/2, + -(indicatorsRect.width()-indicatorSize), + -(indicatorsRect.height()-(cw+indicatorSize+indicatorSize/2)) + ) + ); + cw += painter->fontMetrics().height(); + } + } else { + qreal cw = 0; + for (int i=0;idrawText(indicatorsRect.adjusted(indicatorSize+indicatorSize/2,cw,0,0),label); + painter->setBrush(color_map[i]); + painter->drawEllipse( + indicatorsRect.adjusted( + 0, + cw+indicatorSize/2, + -(indicatorsRect.width()-indicatorSize), + -(indicatorsRect.height()-(cw+indicatorSize+indicatorSize/2)) + ) + ); + cw += painter->fontMetrics().height(); + } + + } +} + +} // namespace LimeReport diff --git a/limereport/items/lrchartitem.h b/limereport/items/lrchartitem.h new file mode 100644 index 0000000..c89ea76 --- /dev/null +++ b/limereport/items/lrchartitem.h @@ -0,0 +1,208 @@ +#ifndef LRCHARTITEM_H +#define LRCHARTITEM_H +#include "lritemdesignintf.h" + +namespace LimeReport{ + +QColor generateColor(); +extern QColor color_map[39]; + +class IDataSource; + +class SeriesItemData : public QObject{ + Q_OBJECT +public: + QList& values(){ return m_values;} + QList& labels(){ return m_labels;} + QList& colors() { return m_colors;} +private: + QList m_values; + QList m_labels; + QList m_colors; +}; + +class SeriesItem : public QObject{ + Q_OBJECT + Q_PROPERTY(QString name READ name WRITE setName) + Q_PROPERTY(QString valuesColumn READ valuesColumn WRITE setValuesColumn ) + Q_PROPERTY(QString labelsColumn READ labelsColumn WRITE setLabelsColumn ) + Q_PROPERTY(QColor color READ color WRITE setColor) +public: + SeriesItem(QObject* parent = 0):QObject(parent){} + QString name() const; + void setName(const QString &name); + QString valuesColumn() const; + void setValuesColumn(const QString &valuesColumn); + QString labelsColumn() const; + void setLabelsColumn(const QString &labelsColumn); + SeriesItem* clone(); + void fillSeriesData(IDataSource* dataSource); + SeriesItemData* data(){ return &m_data;} + QColor color() const; + void setColor(const QColor &color); +private: + QString m_name; + QString m_valuesColumn; + QString m_labelsColumn; + SeriesItemData m_data; + QColor m_color; +}; + +class ChartItem; + +class AbstractChart { +public: + AbstractChart(ChartItem* chartItem); + virtual ~AbstractChart(){} + virtual void paintChart(QPainter *painter, QRectF rect) = 0; + virtual void paintChartLegend(QPainter *painter, QRectF legendRect) =0; + virtual QSizeF calcChartLegendSize(const QFont &font) = 0; + virtual QRectF calcChartLegendRect(const QFont& font, const QRectF& parentRect, bool takeAllRect, qreal borderMargin, qreal titleOffset); +protected: + virtual void prepareLegendToPaint(QRectF& legendRect, QPainter *painter); +protected: + ChartItem* m_chartItem; + QList m_designLabels; +}; + +class AbstractSeriesChart: public AbstractChart{ +public: + AbstractSeriesChart(ChartItem* chartItem); +protected: + qreal maxValue(); + qreal minValue(); + int valuesCount(); + int seriesCount(); + QSizeF calcChartLegendSize(const QFont &font); + qreal* designValues(){ return m_designValues;} +private: + qreal m_designValues [9]; +}; + +class PieChart : public AbstractChart{ +public: + PieChart(ChartItem* chartItem):AbstractChart(chartItem){} + QSizeF calcChartLegendSize(const QFont &font); + void paintChart(QPainter *painter, QRectF chartRect); + void paintChartLegend(QPainter *painter, QRectF legendRect); +protected: + void drawPercent(QPainter *painter, QRectF chartRect, qreal startAngle, qreal angle); +}; + +class AbstractBarChart: public AbstractSeriesChart{ +public: + AbstractBarChart(ChartItem* chartItem):AbstractSeriesChart(chartItem){} + qreal hPadding(QRectF chartRect); + qreal vPadding(QRectF chartRect); + void paintChartLegend(QPainter *painter, QRectF legendRect); +}; + +class HorizontalBarChart: public AbstractBarChart{ +public: + HorizontalBarChart(ChartItem* chartItem):AbstractBarChart(chartItem){} + qreal valuesHMargin(QPainter *painter); + qreal valuesVMargin(QPainter *painter); + void paintChart(QPainter *painter, QRectF chartRect); + void paintHorizontalGrid(QPainter *painter, QRectF gridRect); + void paintHorizontalBars(QPainter *painter, QRectF barsRect); + QRectF labelsRect(QPainter* painter, QRectF labelsRect); + void paintLabels(QPainter *painter, QRectF labelsRect); +protected: + QFont adaptLabelsFont(QRectF rect, QFont font); + QFont adaptValuesFont(qreal width, QFont font); +}; + +class VerticalBarChart: public AbstractBarChart{ +public: + VerticalBarChart(ChartItem* chartItem):AbstractBarChart(chartItem){} + qreal valuesHMargin(QPainter *painter); + qreal valuesVMargin(QPainter *painter); + QRectF labelsRect(QPainter* painter, QRectF labelsRect); + void paintChart(QPainter *painter, QRectF chartRect); + void paintVerticalGrid(QPainter *painter, QRectF gridRect); + void paintVerticalBars(QPainter *painter, QRectF barsRect); + void paintLabels(QPainter *painter, QRectF labelsRect); +}; + +class ChartItem : public LimeReport::ItemDesignIntf +{ + Q_OBJECT + Q_ENUMS(LegendAlign) + Q_ENUMS(TitleAlign) + Q_ENUMS(ChartType) + Q_PROPERTY(ACollectionProperty series READ fakeCollectionReader) + Q_PROPERTY(QString datasource READ datasource WRITE setDatasource) + Q_PROPERTY(QString chartTitle READ chartTitle WRITE setChartTitle) + Q_PROPERTY(bool drawLegendBorder READ drawLegendBorder WRITE setDrawLegendBorder) + Q_PROPERTY(LegendAlign legendAlign READ legendAlign WRITE setLegendAlign) + Q_PROPERTY(TitleAlign titleAlign READ titleAlign WRITE setTitleAlign) + Q_PROPERTY(ChartType chartType READ chartType WRITE setChartType) + Q_PROPERTY(QString labelsField READ labelsField WRITE setLabelsField) + friend class AbstractChart; +public: + + enum LegendAlign{LegendAlignTop,LegendAlignCenter,LegendAlignBottom}; + enum TitleAlign{TitleAlignLeft, TitleAlignCenter, TitleAlignRight}; + enum ChartType{Pie, VerticalBar, HorizontalBar}; + + ChartItem(QObject* owner, QGraphicsItem* parent); + ~ChartItem(); + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + + QList &series(); + void setSeries(const QList &series); + bool isSeriesExists(const QString& name); + + QString datasource() const; + void setDatasource(const QString &datasource); + + QString chartTitle() const; + void setChartTitle(const QString &chartTitle); + + bool drawLegendBorder() const; + void setDrawLegendBorder(bool drawLegendBorder); + + LegendAlign legendAlign() const; + void setLegendAlign(const LegendAlign &legendAlign); + + TitleAlign titleAlign() const; + void setTitleAlign(const TitleAlign &titleAlign); + + ChartType chartType() const; + void setChartType(const ChartType &chartType); + + QString labelsField() const; + void setLabelsField(const QString &labelsField); + + QList labels() const; + void setLabels(const QList &labels); + +protected: + void paintChartTitle(QPainter* painter, QRectF titleRect); + virtual BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent); + //ICollectionContainer + QObject* createElement(const QString& collectionName,const QString& elementType); + int elementsCount(const QString& collectionName); + QObject* elementAt(const QString& collectionName,int index); + void collectionLoadFinished(const QString& collectionName){Q_UNUSED(collectionName)} + void updateItemSize(DataSourceManager *dataManager, RenderPass, int); + void fillLabels(IDataSource* dataSource); + QWidget* defaultEditor(); + +private: + QList m_series; +// QList< QPointer > m_series; + QString m_datasource; + QPixmap m_chartImage; + QString m_title; + AbstractChart* m_chart; + bool m_legendBorder; + LegendAlign m_legendAlign; + TitleAlign m_titleAlign; + ChartType m_chartType; + QString m_labelsField; + QList m_labels; +}; + +} //namespace LimeReport +#endif // LRCHARTITEM_H diff --git a/limereport/items/lrchartitemeditor.cpp b/limereport/items/lrchartitemeditor.cpp new file mode 100644 index 0000000..cfb9761 --- /dev/null +++ b/limereport/items/lrchartitemeditor.cpp @@ -0,0 +1,249 @@ +#include "lrchartitemeditor.h" +#include "ui_lrchartitemeditor.h" +#include "lrchartitem.h" +#include "lrpagedesignintf.h" +#include + +ChartItemEditor::ChartItemEditor(LimeReport::ChartItem *item, LimeReport::PageDesignIntf *page, QSettings *settings, QWidget *parent): + QWidget(parent), ui(new Ui::ChartItemEditor), m_charItem(item), m_page(page), + m_settings(settings), m_ownedSettings(false), m_isReadingSetting(false) +{ + ui->setupUi(this); + QHBoxLayout* colorLayout = new QHBoxLayout(); + colorLayout->setMargin(0); + m_colorButton = new QToolButton(); + m_colorButton->setText("..."); + m_colorButton->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); + m_colorIndicator = new ColorIndicator(); + m_colorIndicator->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum); + ui->colorWidget->setLayout(colorLayout); + colorLayout->addWidget(m_colorIndicator); + colorLayout->addWidget(m_colorButton); + colorLayout->insertStretch(0); + readSetting(); + init(); + + connect(m_colorButton, SIGNAL(clicked(bool)), this, SLOT(slotChangeSeriesColor())); +} + +ChartItemEditor::~ChartItemEditor() +{ +#ifdef Q_OS_WIN + writeSetting(); +#endif +#ifdef Q_OS_MAC + writeSetting(); +#endif + delete ui; +} + +QSettings* ChartItemEditor::settings() +{ + if (m_settings){ + return m_settings; + } else { + m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_ownedSettings = true; + return m_settings; + } +} + +void ChartItemEditor::readSetting() +{ + if (settings()==0) return; + + m_isReadingSetting = true; + + settings()->beginGroup("ChartItemEditor"); + QVariant v = settings()->value("Geometry"); + if (v.isValid()){ + restoreGeometry(v.toByteArray()); + } + v = settings()->value("State"); + if (v.isValid()){ + ui->splitter->restoreState(v.toByteArray()); + } + + settings()->endGroup(); + + m_isReadingSetting = false; +} + +void ChartItemEditor::writeSetting() +{ + if (settings()!=0){ + settings()->beginGroup("ChartItemEditor"); + settings()->setValue("Geometry",saveGeometry()); + settings()->setValue("State",ui->splitter->saveState()); + settings()->endGroup(); + } +} + +void ChartItemEditor::rebuildTable() +{ + ui->tableWidget->clearContents(); + ui->tableWidget->setRowCount(m_charItem->series().count()); + for( int i=0;iseries().count();++i){ + QTableWidgetItem* newRow = new QTableWidgetItem(m_charItem->series().at(i)->name()); + ui->tableWidget->setItem(i,0,newRow); + } +} + +void ChartItemEditor::init() +{ + m_initing = true; + + ui->tableWidget->setColumnCount(1); + ui->tableWidget->setRowCount(m_charItem->series().count()); + ui->tableWidget->horizontalHeader()->setStretchLastSection(true); + ui->tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem("Series name")); + + rebuildTable(); + + if (!m_charItem->datasource().isEmpty()){ + if (m_page && m_page->datasourceManager()){ + LimeReport::IDataSource* ds = m_page->datasourceManager()->dataSource(m_charItem->datasource()); + if (ds){ + for (int i=0;icolumnCount();++i){ + ui->valuesFieldComboBox->addItem(ds->columnNameByIndex(i)); + ui->labelsFieldComboBox->addItem(ds->columnNameByIndex(i)); + } + } + } + + } + ui->labelsFieldComboBox->setCurrentText(m_charItem->labelsField()); + if (!m_charItem->series().isEmpty()){ + enableSeriesEditor(); + ui->tableWidget->selectRow(0); + } else { + disableSeriesEditor(); + } + + m_initing = false; +} + +void ChartItemEditor::enableSeriesEditor() +{ + ui->seriesNameLineEdit->setEnabled(true); + ui->valuesFieldComboBox->setEnabled(true); + m_colorButton->setEnabled(true); + m_colorIndicator->setEnabled(true); +} + +void ChartItemEditor::disableSeriesEditor() +{ + ui->seriesNameLineEdit->setText(""); + ui->seriesNameLineEdit->setDisabled(true); + ui->valuesFieldComboBox->setDisabled(true); + m_colorButton->setDisabled(true); + m_colorIndicator->setDisabled(true); + ui->valuesFieldComboBox->setCurrentText(""); +} + +LimeReport::SeriesItem *ChartItemEditor::currentSeries() +{ + int curRow = ui->tableWidget->currentRow(); + if ((curRow>-1) && !m_charItem->series().isEmpty() && m_charItem->series().count()>curRow){ + return m_charItem->series().at(curRow); + } + return 0; +} + +void ChartItemEditor::resizeEvent(QResizeEvent *) +{ +#ifdef Q_OS_UNIX + writeSetting(); +#endif +} + +void ChartItemEditor::moveEvent(QMoveEvent *) +{ +#ifdef Q_OS_UNIX + writeSetting(); +#endif +} + +void ChartItemEditor::on_splitter_splitterMoved(int , int ) +{ +#ifdef Q_OS_UNIX + writeSetting(); +#endif +} + + +void ChartItemEditor::on_pbOk_clicked() +{ + close(); +} + +void ChartItemEditor::slotAddSeries() +{ + LimeReport::SeriesItem* series = new LimeReport::SeriesItem(); + int curSeriesNumber = m_charItem->series().count(); + while (m_charItem->isSeriesExists("Series"+QString::number(curSeriesNumber))) curSeriesNumber++; + series->setName("Series"+QString::number(curSeriesNumber)); + series->setValuesColumn(""); + series->setLabelsColumn(""); + series->setColor((m_charItem->series().count()<32)?LimeReport::color_map[m_charItem->series().count()]:LimeReport::generateColor()); + m_charItem->series().append(series); + ui->tableWidget->setRowCount(m_charItem->series().count()); + ui->tableWidget->setItem(m_charItem->series().count()-1, 0, new QTableWidgetItem(series->name())); + ui->tableWidget->selectRow(m_charItem->series().count()-1); + ui->valuesFieldComboBox->setCurrentText(""); +} + +void ChartItemEditor::slotDeleteSeries() +{ + QList itemsToRemove; + foreach(QModelIndex index,ui->tableWidget->selectionModel()->selectedRows()){ + itemsToRemove.append(m_charItem->series().at(index.row())); + }; + foreach (LimeReport::SeriesItem* series, itemsToRemove){ + m_charItem->series().removeOne(series); + delete series; + } + rebuildTable(); + disableSeriesEditor(); +} + +void ChartItemEditor::on_tableWidget_itemSelectionChanged() +{ + if (ui->tableWidget->selectionModel()->hasSelection()){ + LimeReport::SeriesItem* series = m_charItem->series().at(ui->tableWidget->selectionModel()->currentIndex().row()); + ui->seriesNameLineEdit->setText(series->name()); + ui->valuesFieldComboBox->setCurrentText(series->valuesColumn()); + m_colorIndicator->setColor(series->color()); + enableSeriesEditor(); + } +} + +void ChartItemEditor::on_seriesNameLineEdit_textChanged(const QString &arg1) +{ + if (currentSeries()){ + currentSeries()->setName(arg1); + ui->tableWidget->currentItem()->setText(arg1); + } +} + +void ChartItemEditor::on_valuesFieldComboBox_currentTextChanged(const QString &arg1) +{ + if (currentSeries()){ + currentSeries()->setValuesColumn(arg1); + } +} + +void ChartItemEditor::on_labelsFieldComboBox_currentTextChanged(const QString &arg1) +{ + if (!m_initing) + m_charItem->setLabelsField(arg1); +} + +void ChartItemEditor::slotChangeSeriesColor() +{ + QColorDialog colorDialog; + if (colorDialog.exec()){ + currentSeries()->setColor(colorDialog.selectedColor()); + m_colorIndicator->setColor(colorDialog.selectedColor()); + } +} diff --git a/limereport/items/lrchartitemeditor.h b/limereport/items/lrchartitemeditor.h new file mode 100644 index 0000000..4e3d699 --- /dev/null +++ b/limereport/items/lrchartitemeditor.h @@ -0,0 +1,57 @@ +#ifndef CHARITEMEDITOR_H +#define CHARITEMEDITOR_H + +#include +#include "lrchartitem.h" +#include "lrcolorindicator.h" +#include +#include + +namespace Ui { +class ChartItemEditor; +} + +class ChartItemEditor : public QWidget +{ + Q_OBJECT +public: + ChartItemEditor(LimeReport::ChartItem* item, LimeReport::PageDesignIntf* page, + QSettings* settings=0, QWidget *parent = 0); + ~ChartItemEditor(); +public: + QSettings *settings(); + void rebuildTable(); + +protected: + void resizeEvent(QResizeEvent *); + void moveEvent(QMoveEvent *); +private slots: + void on_splitter_splitterMoved(int, int); + void on_pbOk_clicked(); + void slotAddSeries(); + void slotDeleteSeries(); + void on_tableWidget_itemSelectionChanged(); + void on_seriesNameLineEdit_textChanged(const QString &arg1); + void on_valuesFieldComboBox_currentTextChanged(const QString &arg1); + void on_labelsFieldComboBox_currentTextChanged(const QString &arg1); + void slotChangeSeriesColor(); +private: + void readSetting(); + void writeSetting(); + void init(); + void enableSeriesEditor(); + void disableSeriesEditor(); + LimeReport::SeriesItem* currentSeries(); +private: + Ui::ChartItemEditor *ui; + LimeReport::ChartItem* m_charItem; + LimeReport::PageDesignIntf* m_page; + QSettings* m_settings; + bool m_ownedSettings; + bool m_isReadingSetting; + QToolButton* m_colorButton; + ColorIndicator* m_colorIndicator; + bool m_initing; +}; + +#endif // CHARITEMEDITOR_H diff --git a/limereport/items/lrchartitemeditor.ui b/limereport/items/lrchartitemeditor.ui new file mode 100644 index 0000000..8e21a59 --- /dev/null +++ b/limereport/items/lrchartitemeditor.ui @@ -0,0 +1,223 @@ + + + ChartItemEditor + + + + 0 + 0 + 380 + 268 + + + + Form + + + + + + + 0 + 0 + + + + Series + + + + + + Qt::Horizontal + + + + + 4 + + + + + + + + + + Add + + + + + + + Delete + + + + + + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + 4 + + + 2 + + + 2 + + + 2 + + + + + Name + + + + + + + + + + Values field + + + + + + + true + + + + + + + Color + + + + + + + + + + + + + + + + + + 16777215 + 10 + + + + QFrame::HLine + + + + + + + + + + + + Labels field + + + + + + + true + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Ok + + + + + + + + + + + + + pbAddSeries + clicked() + ChartItemEditor + slotAddSeries() + + + 57 + 136 + + + 8 + 75 + + + + + pbDeleteSeries + clicked() + ChartItemEditor + slotDeleteSeries() + + + 142 + 136 + + + 372 + 137 + + + + + + slotAddSeries() + slotDeleteSeries() + + diff --git a/limereport/limereport.pri b/limereport/limereport.pri index f7efc40..613ea8e 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -89,7 +89,10 @@ SOURCES += \ $$REPORT_PATH/lrsimplecrypt.cpp \ $$REPORT_PATH/lraboutdialog.cpp \ $$REPORT_PATH/lrsettingdialog.cpp \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ + $$REPORT_PATH/lrcolorindicator.cpp \ + $$REPORT_PATH/items/lrchartitem.cpp \ + $$REPORT_PATH/items/lrchartitemeditor.cpp contains(CONFIG, zint){ SOURCES += $$REPORT_PATH/items/lrbarcodeitem.cpp @@ -188,8 +191,11 @@ HEADERS += \ $$REPORT_PATH/lrcallbackdatasourceintf.h \ $$REPORT_PATH/lrsettingdialog.h \ $$REPORT_PATH/lrpreviewreportwidget_p.h \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h - + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ + $$REPORT_PATH/lrcolorindicator.h \ + $$REPORT_PATH/items/lrchartitem.h \ + $$REPORT_PATH/items/lrchartitemeditor.h + contains(CONFIG,zint){ HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h } @@ -206,6 +212,7 @@ FORMS += \ $$REPORT_PATH/lraboutdialog.ui \ $$REPORT_PATH/lrsettingdialog.ui \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ + $$REPORT_PATH/items/lrchartitemeditor.ui RESOURCES += \ diff --git a/limereport/lrcolorindicator.cpp b/limereport/lrcolorindicator.cpp new file mode 100644 index 0000000..73662f1 --- /dev/null +++ b/limereport/lrcolorindicator.cpp @@ -0,0 +1,38 @@ +#include "lrcolorindicator.h" +#include + +void ColorIndicator::paintEvent(QPaintEvent* event) +{ + QPainter painter(this); + painter.save(); + painter.setBrush(m_color); + painter.setPen(Qt::gray); + QRect rect = event->rect().adjusted(3,3,-4,-4); + rect.setWidth(rect.height()); + painter.setRenderHint(QPainter::Antialiasing); + painter.drawEllipse(rect); + painter.restore(); +} + +ColorIndicator::ColorIndicator(QWidget *parent) + :QWidget(parent), m_color(Qt::white){ + setAttribute(Qt::WA_StaticContents); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); + setFocusPolicy(Qt::NoFocus); +} + +QColor ColorIndicator::color() const +{ + return m_color; +} + +void ColorIndicator::setColor(const QColor &color) +{ + m_color = color; + update(); +} + +QSize ColorIndicator::sizeHint() const +{ + return QSize(20,20); +} diff --git a/limereport/lrcolorindicator.h b/limereport/lrcolorindicator.h new file mode 100644 index 0000000..5ed1754 --- /dev/null +++ b/limereport/lrcolorindicator.h @@ -0,0 +1,20 @@ +#ifndef COLORINDICATOR_H +#define COLORINDICATOR_H + +#include +#include + +class ColorIndicator : public QWidget{ + Q_OBJECT +public: + ColorIndicator(QWidget* parent = 0); + QColor color() const; + void setColor(const QColor &color); + QSize sizeHint() const; +protected: + void paintEvent(QPaintEvent *event); +private: + QColor m_color; +}; + +#endif // COLORINDICATOR_H From db87e5dc9ec9689e5286a31f98f2ea11bfe52e69 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 2 Nov 2016 11:15:05 +0300 Subject: [PATCH 003/347] Build with uitools has been fixed --- limereport/lrreportrender.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 1f4924c..6791398 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -295,9 +295,9 @@ void ReportRender::initVariables() #ifdef HAVE_UI_LOADER void ReportRender::initDialogs(){ if (m_scriptEngineContext){ - QScriptEngine* se = ScriptEngineManager::instance().scriptEngine(); + ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); foreach(DialogDescriber::Ptr dialog, m_scriptEngineContext->dialogsDescriber()){ - QScriptValue sv = se->newQObject(m_scriptEngineContext->getDialog(dialog->name())); + ScriptValueType sv = se->newQObject(m_scriptEngineContext->getDialog(dialog->name())); se->globalObject().setProperty(dialog->name(),sv); } } From cf1b2a4146181f4224c5a7fb3abfd9d2bfc91d8f Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 2 Nov 2016 14:54:36 +0300 Subject: [PATCH 004/347] qjsengine and uitools are switched on --- common.pri | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/common.pri b/common.pri index 78398e5..fcefb93 100644 --- a/common.pri +++ b/common.pri @@ -1,12 +1,12 @@ CONFIG += build_translations CONFIG += zint -#CONFIG += qjsengine -#greaterThan(QT_MAJOR_VERSION, 4) { -# QT += uitools -#} -#lessThan(QT_MAJOR_VERSION, 5){ -# CONFIG += uitools -#} +CONFIG += qjsengine +greaterThan(QT_MAJOR_VERSION, 4) { + QT += uitools +} +lessThan(QT_MAJOR_VERSION, 5){ + CONFIG += uitools +} ZINT_PATH = $$PWD/3rdparty/zint-2.4.4 From 97c1eb3f771bfcf1a21b78217c38c07554631ae4 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 4 Nov 2016 21:42:15 +0300 Subject: [PATCH 005/347] Dialogs for QJSEngine has been fixed. Child objects registration has been added --- limereport/lrreportrender.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 6791398..fc08cc9 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -293,11 +293,24 @@ void ReportRender::initVariables() } #ifdef HAVE_UI_LOADER + +#ifdef USE_QJSENGINE +void registerChildObjects(ScriptEngineType* se, ScriptValueType* sv){ + foreach(QObject* obj, sv->toQObject()->children()){ + ScriptValueType child = se->newQObject(obj); + sv->setProperty(obj->objectName(),child); + registerChildObjects(se, &child); + } +} +#endif void ReportRender::initDialogs(){ if (m_scriptEngineContext){ ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); foreach(DialogDescriber::Ptr dialog, m_scriptEngineContext->dialogsDescriber()){ ScriptValueType sv = se->newQObject(m_scriptEngineContext->getDialog(dialog->name())); +#ifdef USE_QJSENGINE + registerChildObjects(se,&sv); +#endif se->globalObject().setProperty(dialog->name(),sv); } } From 7406789cbb7484da7e63de55fdf6b4a3c3278b5d Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 11 Feb 2017 00:21:03 +0300 Subject: [PATCH 006/347] QJSEngine -> QQmlEngine --- include/lrglobal.h | 12 +- limereport/lrglobal.h | 12 +- limereport/lrreportrender.cpp | 33 ++- limereport/lrscriptenginemanager.cpp | 314 +++++++++++++++++---------- limereport/lrscriptenginemanager.h | 8 +- 5 files changed, 247 insertions(+), 132 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index 82a0364..421f8d7 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -43,7 +43,8 @@ #endif #ifdef USE_QJSENGINE -#include +//#include +#include #else #include #endif @@ -138,8 +139,15 @@ namespace Const{ #endif #ifdef USE_QJSENGINE - typedef QJSEngine ScriptEngineType; + typedef QQmlEngine ScriptEngineType; typedef QJSValue ScriptValueType; + template + static inline QJSValue getCppOwnedJSValue(QJSEngine &e, T *p) + { + QJSValue res = e.newQObject(p); + QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); + return res; + } #else typedef QScriptEngine ScriptEngineType; typedef QScriptValue ScriptValueType; diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 82a0364..421f8d7 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -43,7 +43,8 @@ #endif #ifdef USE_QJSENGINE -#include +//#include +#include #else #include #endif @@ -138,8 +139,15 @@ namespace Const{ #endif #ifdef USE_QJSENGINE - typedef QJSEngine ScriptEngineType; + typedef QQmlEngine ScriptEngineType; typedef QJSValue ScriptValueType; + template + static inline QJSValue getCppOwnedJSValue(QJSEngine &e, T *p) + { + QJSValue res = e.newQObject(p); + QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); + return res; + } #else typedef QScriptEngine ScriptEngineType; typedef QScriptValue ScriptValueType; diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 2d0701c..4092f82 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -167,17 +167,29 @@ void ReportRender::setScriptContext(ScriptEngineContext* scriptContext) bool ReportRender::runInitScript(){ if (m_scriptEngineContext){ - QScriptEngine* engine = ScriptEngineManager::instance().scriptEngine(); + ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); +#ifndef USE_QJSENGINE engine->pushContext(); - QScriptValue res = engine->evaluate(m_scriptEngineContext->initScript()); +#endif + ScriptValueType res = engine->evaluate(m_scriptEngineContext->initScript()); if (res.isBool()) return res.toBool(); +#ifdef USE_QJSENGINE + if (res.isError()){ + QMessageBox::critical(0,tr("Error"), + QString("Line %1: %2 ").arg(res.property("lineNumber").toString()) + .arg(res.toString()) + ); + return false; + } +#else if (engine->hasUncaughtException()) { QMessageBox::critical(0,tr("Error"), QString("Line %1: %2 ").arg(engine->uncaughtExceptionLineNumber()) .arg(engine->uncaughtException().toString()) ); return false; - } + } +#endif } return true; } @@ -269,8 +281,9 @@ void ReportRender::renderPage(PageDesignIntf* patternPage) renderBand(tearOffBand, 0, StartNewPageAsNeeded); savePage(true); - +#ifndef USE_QJSENGINE ScriptEngineManager::instance().scriptEngine()->popContext(); +#endif } } @@ -1262,18 +1275,26 @@ void ReportRender::baseDesignIntfToScript(BaseDesignIntf *item) if (item->metaObject()->indexOfSignal("afterRender()")!=-1) item->disconnect(SIGNAL(afterRender())); - QScriptEngine* engine = ScriptEngineManager::instance().scriptEngine(); - QScriptValue sItem = engine->globalObject().property(item->patternName()); + ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); + +#ifdef USE_QJSENGINE + //sItem = engine->newQObject(item); + ScriptValueType sItem = getCppOwnedJSValue(*engine, item); + engine->globalObject().setProperty(item->patternName(), sItem); +#else + ScriptValueType sItem = engine->globalObject().property(item->patternName()); if (sItem.isValid()){ engine->newQObject(sItem, item); } else { sItem = engine->newQObject(item); engine->globalObject().setProperty(item->patternName(),sItem); } +#endif foreach(BaseDesignIntf* child, item->childBaseItems()){ baseDesignIntfToScript(child); } } + } } diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index ad0d84d..dab7272 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -196,141 +196,141 @@ void ScriptEngineModel::updateModel() endResetModel(); } -QScriptValue line(QScriptContext* pcontext, QScriptEngine* pengine){ - ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); - DataSourceManager* dm = sm->dataManager(); - QString band = pcontext->argument(0).toString(); - QScriptValue res; - QString varName = QLatin1String("line_")+band.toLower(); - if (dm->variable(varName).isValid()){ - res=pengine->newVariant(dm->variable(varName)); - } else res=pengine->newVariant(QString("Variable line for band %1 not found").arg(band)); - return res; -} +//QScriptValue line(QScriptContext* pcontext, QScriptEngine* pengine){ +// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); +// DataSourceManager* dm = sm->dataManager(); +// QString band = pcontext->argument(0).toString(); +// QScriptValue res; +// QString varName = QLatin1String("line_")+band.toLower(); +// if (dm->variable(varName).isValid()){ +// res=pengine->newVariant(dm->variable(varName)); +// } else res=pengine->newVariant(QString("Variable line for band %1 not found").arg(band)); +// return res; +//} -QScriptValue setVariable(QScriptContext* pcontext, QScriptEngine* /*pengine*/){ +//QScriptValue setVariable(QScriptContext* pcontext, QScriptEngine* /*pengine*/){ - QString name = pcontext->argument(0).toString(); - QVariant value = pcontext->argument(1).toVariant(); +// QString name = pcontext->argument(0).toString(); +// QVariant value = pcontext->argument(1).toVariant(); - ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); - DataSourceManager* dm = sm->dataManager(); +// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); +// DataSourceManager* dm = sm->dataManager(); - dm->changeVariable(name,value); - return QScriptValue(); -} +// dm->changeVariable(name,value); +// return QScriptValue(); +//} -QScriptValue getVariable(QScriptContext* pcontext, QScriptEngine* pengine){ +//QScriptValue getVariable(QScriptContext* pcontext, QScriptEngine* pengine){ - QString name = pcontext->argument(0).toString(); +// QString name = pcontext->argument(0).toString(); - ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); - DataSourceManager* dm = sm->dataManager(); - QScriptValue res = pengine->newVariant(dm->variable(name)); +// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); +// DataSourceManager* dm = sm->dataManager(); +// QScriptValue res = pengine->newVariant(dm->variable(name)); - return res; -} +// return res; +//} -QScriptValue getField(QScriptContext* pcontext, QScriptEngine* pengine){ +//QScriptValue getField(QScriptContext* pcontext, QScriptEngine* pengine){ - QString name = pcontext->argument(0).toString(); +// QString name = pcontext->argument(0).toString(); - ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); - DataSourceManager* dm = sm->dataManager(); - QScriptValue res = pengine->newVariant(dm->fieldData(name)); +// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); +// DataSourceManager* dm = sm->dataManager(); +// QScriptValue res = pengine->newVariant(dm->fieldData(name)); - return res; -} +// return res; +//} -QScriptValue numberFormat(QScriptContext* pcontext, QScriptEngine* pengine){ - QVariant value = pcontext->argument(0).toVariant(); - char format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString()[0].toLatin1():'f'; - int precision = (pcontext->argumentCount()>2)?pcontext->argument(2).toInt32():2; - QString locale = (pcontext->argumentCount()>3)?pcontext->argument(3).toString():""; - QScriptValue res = (locale.isEmpty())?pengine->newVariant(QString::number(value.toDouble(),format,precision)): - pengine->newVariant(QLocale(locale).toString(value.toDouble(),format,precision)); - return res; -} -#if QT_VERSION>0x040800 -QScriptValue currencyFormat(QScriptContext* pcontext, QScriptEngine* pengine){ - QVariant value = pcontext->argument(0).toVariant(); - QString locale = (pcontext->argumentCount()>1)?pcontext->argument(1).toString():QLocale::system().name(); - return pengine->newVariant(QLocale(locale).toCurrencyString(value.toDouble())); -} +//QScriptValue numberFormat(QScriptContext* pcontext, QScriptEngine* pengine){ +// QVariant value = pcontext->argument(0).toVariant(); +// char format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString()[0].toLatin1():'f'; +// int precision = (pcontext->argumentCount()>2)?pcontext->argument(2).toInt32():2; +// QString locale = (pcontext->argumentCount()>3)?pcontext->argument(3).toString():""; +// QScriptValue res = (locale.isEmpty())?pengine->newVariant(QString::number(value.toDouble(),format,precision)): +// pengine->newVariant(QLocale(locale).toString(value.toDouble(),format,precision)); +// return res; +//} +//#if QT_VERSION>0x040800 +//QScriptValue currencyFormat(QScriptContext* pcontext, QScriptEngine* pengine){ +// QVariant value = pcontext->argument(0).toVariant(); +// QString locale = (pcontext->argumentCount()>1)?pcontext->argument(1).toString():QLocale::system().name(); +// return pengine->newVariant(QLocale(locale).toCurrencyString(value.toDouble())); +//} -QScriptValue currencyUSBasedFormat(QScriptContext* pcontext, QScriptEngine* pengine){ - QVariant value = pcontext->argument(0).toVariant(); - QString CurrencySymbol = (pcontext->argumentCount()>1)?pcontext->argument(1).toString():QLocale::system().currencySymbol(); - // Format it using USA locale - QString vTempStr=QLocale(QLocale::English, QLocale::UnitedStates).toCurrencyString(value.toDouble()); - // Replace currency symbol if necesarry - if (CurrencySymbol!="") vTempStr.replace("$", CurrencySymbol); - return pengine->newVariant(vTempStr); -} -#endif -QScriptValue dateFormat(QScriptContext* pcontext, QScriptEngine* pengine){ - QVariant value = pcontext->argument(0).toVariant(); - QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"dd.MM.yyyy"; - QScriptValue res = pengine->newVariant(QLocale().toString(value.toDate(),format)); - return res; -} +//QScriptValue currencyUSBasedFormat(QScriptContext* pcontext, QScriptEngine* pengine){ +// QVariant value = pcontext->argument(0).toVariant(); +// QString CurrencySymbol = (pcontext->argumentCount()>1)?pcontext->argument(1).toString():QLocale::system().currencySymbol(); +// // Format it using USA locale +// QString vTempStr=QLocale(QLocale::English, QLocale::UnitedStates).toCurrencyString(value.toDouble()); +// // Replace currency symbol if necesarry +// if (CurrencySymbol!="") vTempStr.replace("$", CurrencySymbol); +// return pengine->newVariant(vTempStr); +//} +//#endif +//QScriptValue dateFormat(QScriptContext* pcontext, QScriptEngine* pengine){ +// QVariant value = pcontext->argument(0).toVariant(); +// QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"dd.MM.yyyy"; +// QScriptValue res = pengine->newVariant(QLocale().toString(value.toDate(),format)); +// return res; +//} -QScriptValue timeFormat(QScriptContext* pcontext, QScriptEngine* pengine){ - QVariant value = pcontext->argument(0).toVariant(); - QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"hh:mm"; - QScriptValue res = pengine->newVariant(QLocale().toString(value.toTime(),format)); - return res; -} +//QScriptValue timeFormat(QScriptContext* pcontext, QScriptEngine* pengine){ +// QVariant value = pcontext->argument(0).toVariant(); +// QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"hh:mm"; +// QScriptValue res = pengine->newVariant(QLocale().toString(value.toTime(),format)); +// return res; +//} -QScriptValue dateTimeFormat(QScriptContext* pcontext, QScriptEngine* pengine){ - QVariant value = pcontext->argument(0).toVariant(); - QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"dd.MM.yyyy hh:mm"; - QScriptValue res = pengine->newVariant(QLocale().toString(value.toDateTime(),format)); - return res; -} +//QScriptValue dateTimeFormat(QScriptContext* pcontext, QScriptEngine* pengine){ +// QVariant value = pcontext->argument(0).toVariant(); +// QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"dd.MM.yyyy hh:mm"; +// QScriptValue res = pengine->newVariant(QLocale().toString(value.toDateTime(),format)); +// return res; +//} -QScriptValue now(QScriptContext* /*pcontext*/, QScriptEngine* pengine){ - return pengine->newVariant(QDateTime::currentDateTime()); -} +//QScriptValue now(QScriptContext* /*pcontext*/, QScriptEngine* pengine){ +// return pengine->newVariant(QDateTime::currentDateTime()); +//} -QScriptValue date(QScriptContext* /*pcontext*/, QScriptEngine* pengine){ - return pengine->newVariant(QDate::currentDate()); -} +//QScriptValue date(QScriptContext* /*pcontext*/, QScriptEngine* pengine){ +// return pengine->newVariant(QDate::currentDate()); +//} -QScriptValue callGroupFunction(const QString& functionName, QScriptContext* pcontext, QScriptEngine* pengine){ +//QScriptValue callGroupFunction(const QString& functionName, QScriptContext* pcontext, QScriptEngine* pengine){ - ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); - DataSourceManager* dm = sm->dataManager(); +// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); +// DataSourceManager* dm = sm->dataManager(); - QString expression; - QString band; +// QString expression; +// QString band; - if (functionName.compare("COUNT",Qt::CaseInsensitive) == 0 && pcontext->argumentCount()==1){ - expression = " "; - band = pcontext->argument(0).toString(); - } else { - expression = dm->getExpression(pcontext->argument(0).toString()); - band = pcontext->argument(1).toString(); - } +// if (functionName.compare("COUNT",Qt::CaseInsensitive) == 0 && pcontext->argumentCount()==1){ +// expression = " "; +// band = pcontext->argument(0).toString(); +// } else { +// expression = dm->getExpression(pcontext->argument(0).toString()); +// band = pcontext->argument(1).toString(); +// } - QScriptValue res; - GroupFunction* gf = dm->groupFunction(functionName,expression,band); - if (gf){ - if (gf->isValid()){ - res=pengine->newVariant(gf->calculate()); - }else{ - res=pengine->newVariant(gf->error()); - } - } - else { - res=pengine->newVariant(QString(QObject::tr("Function %1 not found or have wrong arguments").arg(functionName))); - } - return res; -} +// QScriptValue res; +// GroupFunction* gf = dm->groupFunction(functionName,expression,band); +// if (gf){ +// if (gf->isValid()){ +// res=pengine->newVariant(gf->calculate()); +// }else{ +// res=pengine->newVariant(gf->error()); +// } +// } +// else { +// res=pengine->newVariant(QString(QObject::tr("Function %1 not found or have wrong arguments").arg(functionName))); +// } +// return res; +//} -QScriptValue groupFunction(QScriptContext* pcontext, QScriptEngine* pengine){ - return callGroupFunction(pcontext->callee().property("functionName").toString(),pcontext,pengine); -} +//QScriptValue groupFunction(QScriptContext* pcontext, QScriptEngine* pengine){ +// return callGroupFunction(pcontext->callee().property("functionName").toString(),pcontext,pengine); +//} ScriptEngineManager::~ScriptEngineManager() { @@ -589,16 +589,24 @@ QString ScriptEngineManager::expandScripts(QString context, QVariant& varValue, if (ScriptEngineManager::instance().dataManager()!=dataManager()) ScriptEngineManager::instance().setDataManager(dataManager()); - QScriptEngine* se = ScriptEngineManager::instance().scriptEngine(); + ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); if (reportItem){ - QScriptValue svThis = se->globalObject().property("THIS"); + + ScriptValueType svThis; + +#ifdef USE_QJSENGINE + svThis = getCppOwnedJSValue(*se, reportItem); + se->globalObject().setProperty("THIS",svThis); +#else + svThis = se->globalObject().property("THIS"); if (svThis.isValid()){ - se->newQObject(svThis, this); + se->newQObject(svThis, reportItem); } else { - svThis = se->newQObject(this); + svThis = se->newQObject(reportItem); se->globalObject().setProperty("THIS",svThis); } +#endif } ScriptExtractor scriptExtractor(context); @@ -606,16 +614,26 @@ QString ScriptEngineManager::expandScripts(QString context, QVariant& varValue, for(int i=0; ievaluate(scriptBody); + ScriptValueType value = se->evaluate(scriptBody); +#ifdef USE_QJSENGINE + if (!value.isError()){ + varValue = value.toVariant(); + context.replace(scriptExtractor.scriptAt(i),value.toString()); + } else { + context.replace(scriptExtractor.scriptAt(i),value.toString()); + } +#else if (!se->hasUncaughtException()) { varValue = value.toVariant(); context.replace(scriptExtractor.scriptAt(i),value.toString()); } else { context.replace(scriptExtractor.scriptAt(i),se->uncaughtException().toString()); } +#endif } } } + return context; } @@ -629,14 +647,18 @@ QVariant ScriptEngineManager::evaluateScript(const QString& script){ if (ScriptEngineManager::instance().dataManager()!=dataManager()) ScriptEngineManager::instance().setDataManager(dataManager()); - QScriptEngine* se = ScriptEngineManager::instance().scriptEngine(); + ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); ScriptExtractor scriptExtractor(script); if (scriptExtractor.parse()){ QString scriptBody = expandDataFields(scriptExtractor.bodyAt(0),EscapeSymbols, varValue, 0); scriptBody = expandUserVariables(scriptBody, FirstPass, EscapeSymbols, varValue); - QScriptValue value = se->evaluate(scriptBody); + ScriptValueType value = se->evaluate(scriptBody); +#ifdef USE_QJSENGINE + if (!value.isError()){ +#else if (!se->hasUncaughtException()) { +#endif return value.toVariant(); } } @@ -820,6 +842,36 @@ bool ScriptEngineManager::createSetVariableFunction(){ return addFunction(fd); } +bool ScriptEngineManager::createGetVariableFunction() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("GENERAL"); + fd.setName("getVariable"); + fd.setDescription("getVariable(\""+tr("Name")+"\")"); + fd.setScriptWrapper(QString("function getVariable(name){" + "return %1.getVariable(name);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createGetFieldFunction() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory("GENERAL"); + fd.setName("getField"); + fd.setDescription("getField(\""+tr("Name")+"\")"); + fd.setScriptWrapper(QString("function getField(name){" + "return %1.getField(name);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + ScriptEngineManager::ScriptEngineManager() :m_model(0), m_dataManager(0) { @@ -839,6 +891,8 @@ ScriptEngineManager::ScriptEngineManager() createCurrencyUSBasedFormatFunction(); #endif createSetVariableFunction(); + createGetFieldFunction(); + createGetVariableFunction(); // addFunction("line",line,"SYSTEM", "line(\""+tr("BandName")+"\")"); // addFunction("numberFormat",numberFormat,"NUMBER", "numberFormat(\""+tr("Value")+"\",\""+tr("Format")+"\",\""+ @@ -1235,10 +1289,17 @@ void JSFunctionDesc::setScriptWrapper(const QString &scriptWrapper) m_scriptWrapper = scriptWrapper; } -QVariant ScriptFunctionsManager::calcGroupFunction(const QString &name, const QString &fieldName, const QString &bandName) +QVariant ScriptFunctionsManager::calcGroupFunction(const QString &name, const QString &expressionID, const QString &bandName) { if (m_scriptEngineManager->dataManager()){ - GroupFunction* gf = m_scriptEngineManager->dataManager()->groupFunction(name,fieldName,bandName); + QString expression = ""; + if (name.compare("COUNT",Qt::CaseInsensitive) == 0){ + expression = " "; + } else { + expression = m_scriptEngineManager->dataManager()->getExpression(expressionID); + } + + GroupFunction* gf = m_scriptEngineManager->dataManager()->groupFunction(name,expression,bandName); if (gf){ if (gf->isValid()){ return gf->calculate(); @@ -1316,6 +1377,19 @@ void ScriptFunctionsManager::setVariable(const QString &name, QVariant value) DataSourceManager* dm = scriptEngineManager()->dataManager(); dm->changeVariable(name,value); } + +QVariant ScriptFunctionsManager::getVariable(const QString &name) +{ + DataSourceManager* dm = scriptEngineManager()->dataManager(); + return dm->variable(name); +} + +QVariant ScriptFunctionsManager::getField(const QString &field) +{ + DataSourceManager* dm = scriptEngineManager()->dataManager(); + return dm->fieldData(field); +} + #ifdef USE_QJSENGINE QFont ScriptFunctionsManager::font(const QString &family, int pointSize, bool bold, bool italic, bool underLine) { diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index b338bbb..726013b 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -216,7 +216,7 @@ class ScriptFunctionsManager : public QObject{ Q_OBJECT public: explicit ScriptFunctionsManager(QObject* parent = 0):QObject(parent){} - Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& fieldName, const QString& bandName); + Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName); Q_INVOKABLE QVariant line(const QString& bandName); Q_INVOKABLE QVariant numberFormat(QVariant value, const char &format, int precision, const QString &locale); Q_INVOKABLE QVariant dateFormat(QVariant value, const QString& format); @@ -226,7 +226,9 @@ public: Q_INVOKABLE QVariant now(); Q_INVOKABLE QVariant currencyFormat(QVariant value, const QString& locale); Q_INVOKABLE QVariant currencyUSBasedFormat(QVariant value, const QString& currencySymbol); - Q_INVOKABLE void setVariable(const QString& name, QVariant value); + Q_INVOKABLE void setVariable(const QString& name, QVariant value); + Q_INVOKABLE QVariant getVariable(const QString& name); + Q_INVOKABLE QVariant getField(const QString& field); Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} #ifdef USE_QJSENGINE Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); @@ -283,6 +285,8 @@ private: bool createCurrencyFormatFunction(); bool createCurrencyUSBasedFormatFunction(); bool createSetVariableFunction(); + bool createGetVariableFunction(); + bool createGetFieldFunction(); private: ScriptEngineManager(); ScriptEngineType* m_scriptEngine; From d9285813ac2fd342879ce5f67b4cb106c4aeba23 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 16 Feb 2017 04:11:39 +0300 Subject: [PATCH 007/347] Database connections have been refactored "defaultConnection" has been added to Designer keepDbCredentials property has been added to Connection setPassPharse(QString& passPharse) method has been added to ReportEngine IDbCredentialsProvider interface has been added registerDbCredentialsProvider(IDbCredentialsProvider *provider) has been added to IDataSourceManager --- include/lrdatasourcemanagerintf.h | 23 ++++--- include/lrreportengine.h | 1 + limereport/databrowser/lrconnectiondialog.cpp | 2 + limereport/databrowser/lrconnectiondialog.ui | 7 +++ limereport/lrdatadesignintf.cpp | 14 ++++- limereport/lrdatadesignintf.h | 10 ++- limereport/lrdatasourcemanager.cpp | 46 +++++++++++--- limereport/lrdatasourcemanager.h | 5 +- limereport/lrdatasourcemanagerintf.h | 23 ++++--- limereport/lrreportengine.cpp | 61 ++++++++++++++++++- limereport/lrreportengine.h | 1 + limereport/lrreportengine_p.h | 3 + limereport/lrsimplecrypt.cpp | 21 ++++++- limereport/lrsimplecrypt.h | 1 + limereport/serializators/lrserializatorintf.h | 10 ++- limereport/serializators/lrstorageintf.h | 26 ++++---- .../lrxmlbasetypesserializators.cpp | 4 +- .../lrxmlbasetypesserializators.h | 17 +++++- limereport/serializators/lrxmlreader.cpp | 9 +++ limereport/serializators/lrxmlreader.h | 24 +++++--- limereport/serializators/lrxmlwriter.cpp | 9 +++ limereport/serializators/lrxmlwriter.h | 4 ++ 22 files changed, 257 insertions(+), 64 deletions(-) diff --git a/include/lrdatasourcemanagerintf.h b/include/lrdatasourcemanagerintf.h index 85cf388..57bd0c1 100644 --- a/include/lrdatasourcemanagerintf.h +++ b/include/lrdatasourcemanagerintf.h @@ -37,18 +37,25 @@ class QString; class QAbstractItemModel; namespace LimeReport{ +class IDbCredentialsProvider{ +public: + virtual QString getUserName(const QString& connectionName) = 0; + virtual QString getPassword(const QString& connectionName) = 0; +}; + class IDataSourceManager{ public: - virtual void setReportVariable(const QString& name, const QVariant& value)=0; - virtual void setDefaultDatabasePath(const QString &defaultDatabasePath)=0; - virtual void deleteVariable(const QString& name)=0; - virtual bool containsVariable(const QString& variableName)=0; - virtual QVariant variable(const QString& variableName)=0; - virtual bool addModel(const QString& name, QAbstractItemModel *model, bool owned)=0; - virtual void removeModel(const QString& name)=0; - virtual bool containsDatasource(const QString& dataSourceName)=0; + virtual void setReportVariable(const QString& name, const QVariant& value) = 0; + virtual void setDefaultDatabasePath(const QString &defaultDatabasePath) = 0; + virtual void deleteVariable(const QString& name) = 0; + virtual bool containsVariable(const QString& variableName) = 0; + virtual QVariant variable(const QString& variableName) = 0; + virtual bool addModel(const QString& name, QAbstractItemModel *model, bool owned) = 0; + virtual void removeModel(const QString& name) = 0; + virtual bool containsDatasource(const QString& dataSourceName) = 0; virtual void clearUserVariables()=0; virtual ICallbackDatasource* createCallbackDatasouce(const QString& name) = 0; + virtual void registerDbCredentialsProvider(IDbCredentialsProvider* provider) = 0; //virtual void addCallbackDatasource(ICallbackDatasource* datasource, const QString& name) = 0; }; diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 0d5b309..dbbb2a8 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -101,6 +101,7 @@ public: void setResultEditable(bool value); bool resultIsEditable(); bool isBusy(); + void setPassPharse(QString& passPharse); signals: void renderStarted(); void renderFinished(); diff --git a/limereport/databrowser/lrconnectiondialog.cpp b/limereport/databrowser/lrconnectiondialog.cpp index 60652cf..b90545e 100644 --- a/limereport/databrowser/lrconnectiondialog.cpp +++ b/limereport/databrowser/lrconnectiondialog.cpp @@ -122,6 +122,7 @@ ConnectionDesc *ConnectionDialog::uiToConnection(LimeReport::ConnectionDesc* con result ->setPassword(ui->lePassword->text()); result ->setDatabaseName(ui->leDataBase->text()); result ->setAutoconnect(ui->cbAutoConnect->isChecked()); + result->setKeepDBCredentials(!ui->cbbKeepCredentials->isChecked()); return result ; } @@ -137,6 +138,7 @@ void ConnectionDialog::connectionToUI() ui->lePassword->setText(m_connection->password()); ui->cbbDrivers->setCurrentIndex(ui->cbbDrivers->findText(m_connection->driver())); ui->cbAutoConnect->setChecked(m_connection->autoconnect()); + ui->cbbKeepCredentials->setChecked(!m_connection->keepDBCredentials()); } void ConnectionDialog::on_toolButton_clicked() diff --git a/limereport/databrowser/lrconnectiondialog.ui b/limereport/databrowser/lrconnectiondialog.ui index aa06393..60bf527 100644 --- a/limereport/databrowser/lrconnectiondialog.ui +++ b/limereport/databrowser/lrconnectiondialog.ui @@ -137,6 +137,13 @@ + + + + Dont keep credentals in lrxml + + + diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index ccff471..0d2d14b 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -351,13 +351,13 @@ void ModelToDataSource::slotModelDestroed() ConnectionDesc::ConnectionDesc(QSqlDatabase db, QObject *parent) : QObject(parent), m_connectionName(db.connectionName()), m_connectionHost(db.hostName()), m_connectionDriver(db.driverName()), m_databaseName(db.databaseName()), m_user(db.userName()), m_password(db.password()), m_autoconnect(false), - m_internal(false) + m_internal(false), m_keepDBCredentials(true) {} ConnectionDesc::ConnectionDesc(QObject *parent) :QObject(parent),m_connectionName(""),m_connectionHost(""),m_connectionDriver(""), m_databaseName(""), m_user(""), m_password(""), m_autoconnect(false), - m_internal(false) + m_internal(false), m_keepDBCredentials(true) {} ConnectionDesc::Ptr ConnectionDesc::create(QSqlDatabase db, QObject *parent) @@ -391,6 +391,16 @@ QString ConnectionDesc::connectionNameForReport(const QString &connectionName) return connectionName.compare(tr("defaultConnection")) == 0 ? QSqlDatabase::defaultConnection : connectionName; } +bool ConnectionDesc::keepDBCredentials() const +{ + return m_keepDBCredentials; +} + +void ConnectionDesc::setKeepDBCredentials(bool keepDBCredentals) +{ + m_keepDBCredentials = keepDBCredentals; +} + QueryDesc::QueryDesc(QString queryName, QString queryText, QString connection) :m_queryName(queryName), m_queryText(queryText), m_connectionName(connection) {} diff --git a/limereport/lrdatadesignintf.h b/limereport/lrdatadesignintf.h index d2c9685..e2f8134 100644 --- a/limereport/lrdatadesignintf.h +++ b/limereport/lrdatadesignintf.h @@ -110,6 +110,7 @@ class ConnectionDesc : public QObject{ Q_PROPERTY(QString password READ password WRITE setPassword) Q_PROPERTY(QString host READ host WRITE setHost) Q_PROPERTY(bool autoconnect READ autoconnect WRITE setAutoconnect) + Q_PROPERTY(bool keepDBCredentials READ keepDBCredentials WRITE setKeepDBCredentials) public: typedef QSharedPointer Ptr; ConnectionDesc(QSqlDatabase db, QObject* parent=0); @@ -124,17 +125,19 @@ public: void setDatabaseName(const QString &value){m_databaseName=value;} QString databaseName(){return m_databaseName;} void setUserName(const QString &value){m_user=value;} - QString userName(){return m_user;} + QString userName(){ return m_user; } void setPassword(const QString &value){m_password=value;} - QString password(){return m_password;} + QString password(){ return m_password; } void setAutoconnect(bool value){m_autoconnect=value;} bool autoconnect(){return m_autoconnect;} bool isEqual(const QSqlDatabase& db); bool isInternal(){ return m_internal; } void setInternal(bool value) {m_internal = value;} + bool keepDBCredentials() const; + void setKeepDBCredentials(bool keepDBCredentials); public: static QString connectionNameForUser(const QString& connectionName); - static QString connectionNameForReport(const QString& connectionName); + static QString connectionNameForReport(const QString& connectionName); signals: void nameChanged(const QString& oldName,const QString& newName); private: @@ -146,6 +149,7 @@ private: QString m_password; bool m_autoconnect; bool m_internal; + bool m_keepDBCredentials; }; class IConnectionController{ diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 5607117..74dd69e 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -217,7 +217,7 @@ void DataSourceModel::updateModel() } DataSourceManager::DataSourceManager(QObject *parent) : - QObject(parent), m_lastError(""), m_designTime(true), m_needUpdate(false) + QObject(parent), m_lastError(""), m_designTime(true), m_needUpdate(false), m_dbCredentialsProvider(0) { m_groupFunctionFactory.registerFunctionCreator(QLatin1String("COUNT"),new ConstructorGroupFunctionCreator); m_groupFunctionFactory.registerFunctionCreator(QLatin1String("SUM"),new ConstructorGroupFunctionCreator); @@ -324,6 +324,11 @@ ICallbackDatasource *DataSourceManager::createCallbackDatasouce(const QString& n return ds; } +void DataSourceManager::registerDbCredentialsProvider(IDbCredentialsProvider *provider) +{ + m_dbCredentialsProvider = provider; +} + void DataSourceManager::addCallbackDatasource(ICallbackDatasource *datasource, const QString& name) { IDataSource* datasourceIntf = dynamic_cast(datasource); @@ -567,6 +572,11 @@ int DataSourceManager::connectionIndexByName(const QString &connectionName) return -1; } +QList& DataSourceManager::conections() +{ + return m_connections; +} + bool DataSourceManager::dataSourceIsValid(const QString &name) { if (m_datasources.value(name.toLower())) return !m_datasources.value(name.toLower())->isInvalid(); @@ -704,10 +714,19 @@ void DataSourceManager::putProxyDesc(ProxyDesc *proxyDesc) bool DataSourceManager::initAndOpenDB(QSqlDatabase& db, ConnectionDesc& connectionDesc){ bool connected = false; + + db.setHostName(replaceVariables(connectionDesc.host())); db.setUserName(replaceVariables(connectionDesc.userName())); db.setPassword(replaceVariables(connectionDesc.password())); + if (!connectionDesc.keepDBCredentials() && m_dbCredentialsProvider){ + if (!m_dbCredentialsProvider->getUserName(connectionDesc.name()).isEmpty()) + db.setUserName(m_dbCredentialsProvider->getUserName(connectionDesc.name())); + if (!m_dbCredentialsProvider->getPassword(connectionDesc.name()).isEmpty()) + db.setPassword(m_dbCredentialsProvider->getPassword(connectionDesc.name())); + } + QString dbName = replaceVariables(connectionDesc.databaseName()); if (connectionDesc.driver().compare("QSQLITE")==0){ if (!defaultDatabasePath().isEmpty()){ @@ -726,7 +745,6 @@ bool DataSourceManager::initAndOpenDB(QSqlDatabase& db, ConnectionDesc& connecti } connected=db.open(); - connectionDesc.setInternal(true); if (!connected) setLastError(db.lastError().text()); return connected; } @@ -758,10 +776,17 @@ bool DataSourceManager::connectConnection(ConnectionDesc *connectionDesc) } if (!QSqlDatabase::contains(connectionDesc->name())){ - QSqlDatabase db = QSqlDatabase::addDatabase(connectionDesc->driver(),connectionDesc->name()); - connected=initAndOpenDB(db, *connectionDesc); + QString dbError; + { + QSqlDatabase db = QSqlDatabase::addDatabase(connectionDesc->driver(),connectionDesc->name()); + connectionDesc->setInternal(true); + connected=initAndOpenDB(db, *connectionDesc); + dbError = db.lastError().text(); + } if (!connected){ - setLastError(db.lastError().text()); + if (!dbError.trimmed().isEmpty()) + setLastError(dbError); + QSqlDatabase::removeDatabase(connectionDesc->name()); return false; } } else { @@ -868,8 +893,9 @@ bool DataSourceManager::isConnection(const QString &connectionName) bool DataSourceManager::isConnectionConnected(const QString &connectionName) { - if (isConnection(connectionName)){ - return QSqlDatabase::database(connectionName).isOpen(); + if (isConnection(connectionName) && QSqlDatabase::contains(connectionName)){ + QSqlDatabase db = QSqlDatabase::database(connectionName); + return db.isValid() && QSqlDatabase::database(connectionName).isOpen(); } return false; } @@ -893,8 +919,10 @@ void DataSourceManager::disconnectConnection(const QString& connectionName) ConnectionDesc* connectionDesc = connectionByName(connectionName); if (connectionDesc->isInternal()){ - QSqlDatabase db = QSqlDatabase::database(connectionName); - if (db.isOpen()) db.close(); + { + QSqlDatabase db = QSqlDatabase::database(connectionName); + if (db.isOpen()) db.close(); + } if (QSqlDatabase::contains(connectionName)) QSqlDatabase::removeDatabase(connectionName); } diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index c60bfa5..77967c5 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -115,6 +115,7 @@ public: bool addModel(const QString& name, QAbstractItemModel *model, bool owned); void removeModel(const QString& name); ICallbackDatasource* createCallbackDatasouce(const QString &name); + void registerDbCredentialsProvider(IDbCredentialsProvider *provider); void addCallbackDatasource(ICallbackDatasource *datasource, const QString &name); void setReportVariable(const QString& name, const QVariant& value); void deleteVariable(const QString& name); @@ -150,6 +151,7 @@ public: int proxyIndexByName(const QString& dataSourceName); int connectionIndexByName(const QString& connectionName); + QList &conections(); bool dataSourceIsValid(const QString& name); IDataSource* dataSource(const QString& name); IDataSourceHolder* dataSourceHolder(const QString& name); @@ -250,8 +252,7 @@ private: ReportSettings* m_reportSettings; QHash m_groupFunctionsExpressionsMap; QVector m_groupFunctionsExpressions; - - + IDbCredentialsProvider* m_dbCredentialsProvider; }; } diff --git a/limereport/lrdatasourcemanagerintf.h b/limereport/lrdatasourcemanagerintf.h index 85cf388..57bd0c1 100644 --- a/limereport/lrdatasourcemanagerintf.h +++ b/limereport/lrdatasourcemanagerintf.h @@ -37,18 +37,25 @@ class QString; class QAbstractItemModel; namespace LimeReport{ +class IDbCredentialsProvider{ +public: + virtual QString getUserName(const QString& connectionName) = 0; + virtual QString getPassword(const QString& connectionName) = 0; +}; + class IDataSourceManager{ public: - virtual void setReportVariable(const QString& name, const QVariant& value)=0; - virtual void setDefaultDatabasePath(const QString &defaultDatabasePath)=0; - virtual void deleteVariable(const QString& name)=0; - virtual bool containsVariable(const QString& variableName)=0; - virtual QVariant variable(const QString& variableName)=0; - virtual bool addModel(const QString& name, QAbstractItemModel *model, bool owned)=0; - virtual void removeModel(const QString& name)=0; - virtual bool containsDatasource(const QString& dataSourceName)=0; + virtual void setReportVariable(const QString& name, const QVariant& value) = 0; + virtual void setDefaultDatabasePath(const QString &defaultDatabasePath) = 0; + virtual void deleteVariable(const QString& name) = 0; + virtual bool containsVariable(const QString& variableName) = 0; + virtual QVariant variable(const QString& variableName) = 0; + virtual bool addModel(const QString& name, QAbstractItemModel *model, bool owned) = 0; + virtual void removeModel(const QString& name) = 0; + virtual bool containsDatasource(const QString& dataSourceName) = 0; virtual void clearUserVariables()=0; virtual ICallbackDatasource* createCallbackDatasouce(const QString& name) = 0; + virtual void registerDbCredentialsProvider(IDbCredentialsProvider* provider) = 0; //virtual void addCallbackDatasource(ICallbackDatasource* datasource, const QString& name) = 0; }; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 2ea54d9..fb7ee7c 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -59,7 +59,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_printer(new QPrinter(QPrinter::HighResolution)), m_printerSelected(false), m_showProgressDialog(true), m_reportName(""), m_activePreview(0), m_previewWindowIcon(":/report/images/logo32"), m_previewWindowTitle(tr("Preview")), - m_reportRendering(false), m_resultIsEditable(true) + m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy") { m_datasources = new DataSourceManager(this); m_datasources->setReportSettings(&m_reportSettings); @@ -513,14 +513,29 @@ bool ReportEnginePrivate::loadFromFile(const QString &fileName) { if (!QFile::exists(fileName)) return false; - clearReport(); + clearReport(); ItemsReaderIntf::Ptr reader = FileXMLReader::create(fileName); + reader->setPassPhrase(m_passPhrase); if (reader->first()){ if (reader->readItem(this)){ m_fileName=fileName; QFileInfo fi(fileName); m_reportName = fi.fileName(); + + QString dbSettingFileName = fi.absolutePath()+"/"+fi.baseName()+".db"; + if (QFile::exists(dbSettingFileName)){ + QSettings dbcredentals(dbSettingFileName, QSettings::IniFormat); + foreach (ConnectionDesc* connection, dataManager()->conections()) { + if (!connection->keepDBCredentials()){ + dbcredentals.beginGroup(connection->name()); + connection->setUserName(dbcredentals.value("user").toString()); + connection->setPassword(dbcredentals.value("password").toString()); + dbcredentals.endGroup(); + } + } + } + dataManager()->connectAutoConnections(); return true; }; @@ -533,6 +548,7 @@ bool ReportEnginePrivate::loadFromByteArray(QByteArray* data, const QString &nam clearReport(); ItemsReaderIntf::Ptr reader = ByteArrayXMLReader::create(data); + reader->setPassPhrase(m_passPhrase); if (reader->first()){ if (reader->readItem(this)){ m_fileName = ""; @@ -548,6 +564,7 @@ bool ReportEnginePrivate::loadFromString(const QString &report, const QString &n clearReport(); ItemsReaderIntf::Ptr reader = StringXMLreader::create(report); + reader->setPassPhrase(m_passPhrase); if (reader->first()){ if (reader->readItem(this)){ m_fileName = ""; @@ -566,10 +583,35 @@ bool ReportEnginePrivate::saveToFile(const QString &fileName) if (fi.suffix().isEmpty()) fn+=".lrxml"; + QString dbSettingFileName = fi.absolutePath()+"/"+fi.baseName()+".db"; + QSettings dbcredentals(dbSettingFileName, QSettings::IniFormat); + + foreach (ConnectionDesc* connection, dataManager()->conections()) { + if (!connection->keepDBCredentials()){ + dbcredentals.beginGroup(connection->name()); + dbcredentals.setValue("user",connection->userName()); + dbcredentals.setValue("password",connection->password()); + dbcredentals.endGroup(); + connection->setPassword(""); + connection->setUserName(""); + } + } + QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); + writer->setPassPhrase(m_passPhrase); writer->putItem(this); - m_fileName=fn; + m_fileName=fn; bool saved = writer->saveToFile(fn); + + foreach (ConnectionDesc* connection, dataManager()->conections()) { + if (!connection->keepDBCredentials()){ + dbcredentals.beginGroup(connection->name()); + connection->setUserName(dbcredentals.value("user").toString()); + connection->setPassword(dbcredentals.value("password").toString()); + dbcredentals.endGroup(); + } + } + if (saved){ foreach(PageDesignIntf* page, m_pages){ page->setToSaved(); @@ -581,6 +623,7 @@ bool ReportEnginePrivate::saveToFile(const QString &fileName) QByteArray ReportEnginePrivate::saveToByteArray() { QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); + writer->setPassPhrase(m_passPhrase); writer->putItem(this); QByteArray result = writer->saveToByteArray(); if (!result.isEmpty()){ @@ -593,6 +636,7 @@ QByteArray ReportEnginePrivate::saveToByteArray() QString ReportEnginePrivate::saveToString(){ QScopedPointer< ItemsWriterIntf > writer(new XMLWriter()); + writer->setPassPhrase(m_passPhrase); writer->putItem(this); QString result = writer->saveToString(); if (!result.isEmpty()){ @@ -629,6 +673,11 @@ QString ReportEnginePrivate::renderToString() }else return QString(); } +void ReportEnginePrivate::setPassPhrase(const QString &passPhrase) +{ + m_passPhrase = passPhrase; +} + bool ReportEnginePrivate::resultIsEditable() const { return m_resultIsEditable; @@ -807,6 +856,12 @@ bool ReportEngine::isBusy() return d->isBusy(); } +void ReportEngine::setPassPharse(QString &passPharse) +{ + Q_D(ReportEngine); + d->setPassPhrase(passPharse); +} + void ReportEngine::setShowProgressDialog(bool value) { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 0d5b309..dbbb2a8 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -101,6 +101,7 @@ public: void setResultEditable(bool value); bool resultIsEditable(); bool isBusy(); + void setPassPharse(QString& passPharse); signals: void renderStarted(); void renderFinished(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 85aff24..4ec3508 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -125,6 +125,8 @@ public: bool resultIsEditable() const; void setResultEditable(bool value); + void setPassPhrase(const QString &passPhrase); + signals: void pagesLoadFinished(); void datasourceCollectionLoadFinished(const QString& collectionName); @@ -175,6 +177,7 @@ private: ReportSettings m_reportSettings; bool m_reportRendering; bool m_resultIsEditable; + QString m_passPhrase; }; } diff --git a/limereport/lrsimplecrypt.cpp b/limereport/lrsimplecrypt.cpp index 0b9aa06..d79273e 100644 --- a/limereport/lrsimplecrypt.cpp +++ b/limereport/lrsimplecrypt.cpp @@ -41,6 +41,8 @@ const int b = 16; /* number of bytes in key */ const int c = 4; /* number words in key = ceil(8*b/w)*/ const int t = 26; /* size of table S = 2*(r+1) words */ +const char* passPhrase = "HjccbzHjlbyfCkjy"; + WORD P = 0xb7e15163, Q = 0x9e3779b9; #define ROTL(x,y) (((x)<<(y&(w-1))) | ((x)>>(w-(y&(w-1))))) @@ -64,11 +66,15 @@ namespace LimeReport { class ChipperPrivate{ friend class Chipper; +public: + ChipperPrivate():m_prepared(false){} + bool isPrepared(){ return m_prepared;} private: void RC5_SETUP(const char *K); void RC5_ENCRYPT(WORD *pt, WORD *ct); void RC5_DECRYPT(WORD *ct, WORD *pt); WORD S[26]; + bool m_prepared; }; void ChipperPrivate::RC5_SETUP(const char *K) @@ -82,6 +88,7 @@ void ChipperPrivate::RC5_SETUP(const char *K) A = S[i] = ROTL(S[i]+(A+B),3); B = L[j] = ROTL(L[j]+(A+B),(A+B)); } + m_prepared = true; } void ChipperPrivate::RC5_ENCRYPT(WORD *pt, WORD *ct) @@ -111,7 +118,8 @@ QByteArray Chipper::cryptString(QString value) buff += value; WTB pt, ct, prior; - d->RC5_SETUP("HjccbzHjlbyfCkjy"); + if (!d->isPrepared()) + d->RC5_SETUP(passPhrase); prior.word[0]=0; prior.word[1]=0; @@ -144,7 +152,8 @@ QString Chipper::decryptByteArray(QByteArray value) QByteArray result; WTB pt, ct, prior; - d->RC5_SETUP("HjccbzHjlbyfCkjy"); + if (!d->isPrepared()) + d->RC5_SETUP(passPhrase); prior.word[0] = 0; prior.word[1] = 0; @@ -174,6 +183,14 @@ QString Chipper::decryptByteArray(QByteArray value) Chipper::Chipper(): d(new ChipperPrivate()){} +Chipper::Chipper(QString passphrase): d(new ChipperPrivate()) +{ + if (!passphrase.trimmed().isEmpty()){ + passphrase = passphrase.leftJustified(16,'#'); + d->RC5_SETUP(passphrase.toLatin1().data()); + } +} + Chipper::~Chipper() { delete d; diff --git a/limereport/lrsimplecrypt.h b/limereport/lrsimplecrypt.h index 68978b5..4088726 100644 --- a/limereport/lrsimplecrypt.h +++ b/limereport/lrsimplecrypt.h @@ -42,6 +42,7 @@ public: QByteArray cryptString(QString value); QString decryptByteArray(QByteArray value); Chipper(); + Chipper(QString passphrase); ~Chipper(); private: ChipperPrivate* d; diff --git a/limereport/serializators/lrserializatorintf.h b/limereport/serializators/lrserializatorintf.h index ce6a44b..b16263a 100644 --- a/limereport/serializators/lrserializatorintf.h +++ b/limereport/serializators/lrserializatorintf.h @@ -35,10 +35,16 @@ namespace LimeReport { class SerializatorIntf { public: - virtual QVariant loadValue()=0; - virtual void save(const QVariant& value,QString name)=0; + virtual QVariant loadValue() = 0; + virtual void save(const QVariant& value,QString name) = 0; virtual ~SerializatorIntf(){} }; +class CryptedSerializator : public virtual SerializatorIntf +{ +public: + virtual void setPassPhrase(const QString& passPhrase) = 0; +}; + } #endif // LRSERIALIZATORINTF_H diff --git a/limereport/serializators/lrstorageintf.h b/limereport/serializators/lrstorageintf.h index 85fb7ad..74b83ef 100644 --- a/limereport/serializators/lrstorageintf.h +++ b/limereport/serializators/lrstorageintf.h @@ -39,18 +39,19 @@ namespace LimeReport{ class ObjectLoadingStateIntf{ public: - virtual bool isLoading()=0; - virtual void objectLoadStarted()=0; - virtual void objectLoadFinished()=0; + virtual bool isLoading() = 0; + virtual void objectLoadStarted() = 0; + virtual void objectLoadFinished() = 0; }; class ItemsWriterIntf { public: - virtual void putItem(QObject* item)=0; + virtual void putItem(QObject* item) = 0; virtual bool saveToFile(QString fileName) = 0; virtual QString saveToString() = 0; virtual QByteArray saveToByteArray() = 0; + virtual void setPassPhrase(const QString& passPhrase) = 0; virtual ~ItemsWriterIntf(){} }; @@ -58,14 +59,15 @@ class ItemsReaderIntf { public: typedef QSharedPointer Ptr; - virtual bool first()=0; - virtual bool next()=0; - virtual bool prior()=0; - virtual QString itemType()=0; - virtual QString itemClassName()=0; - virtual bool readItem(QObject *item)=0; - virtual int firstLevelItemsCount()=0; - virtual QString lastError()=0; + virtual bool first() = 0; + virtual bool next() = 0; + virtual bool prior() = 0; + virtual QString itemType() = 0; + virtual QString itemClassName() = 0; + virtual bool readItem(QObject *item) = 0; + virtual int firstLevelItemsCount() = 0; + virtual QString lastError() = 0; + virtual void setPassPhrase(const QString& passPhrase) = 0; virtual ~ItemsReaderIntf(){} }; diff --git a/limereport/serializators/lrxmlbasetypesserializators.cpp b/limereport/serializators/lrxmlbasetypesserializators.cpp index ebc4260..c0c2ce7 100644 --- a/limereport/serializators/lrxmlbasetypesserializators.cpp +++ b/limereport/serializators/lrxmlbasetypesserializators.cpp @@ -109,7 +109,7 @@ void XmlQStringSerializator::save(const QVariant &value, QString name) QDomElement _node = doc()->createElement(name); _node.setAttribute("Type","QString"); if (name.compare("password")==0){ - Chipper chipper; + Chipper chipper(passPhrase()); QByteArray ba = chipper.cryptString(value.toString()); //ba.append(); _node.setAttribute("Value",QString(ba.toBase64())); @@ -123,7 +123,7 @@ QVariant XmlQStringSerializator::loadValue() { if (node()->tagName().compare("password")==0){ QByteArray ba; - Chipper chipper; + Chipper chipper(passPhrase()); ba.append(node()->attribute("Value").toLatin1()); return chipper.decryptByteArray(QByteArray::fromBase64(ba)); } else diff --git a/limereport/serializators/lrxmlbasetypesserializators.h b/limereport/serializators/lrxmlbasetypesserializators.h index 70bd40d..56f62c1 100644 --- a/limereport/serializators/lrxmlbasetypesserializators.h +++ b/limereport/serializators/lrxmlbasetypesserializators.h @@ -36,7 +36,7 @@ namespace LimeReport{ -class XmlBaseSerializator : public SerializatorIntf{ +class XmlBaseSerializator : public virtual SerializatorIntf{ public: XmlBaseSerializator(QDomDocument *doc, QDomElement *node):m_doc(doc),m_node(node){} protected: @@ -48,10 +48,21 @@ private: QDomElement *m_node; }; -class XmlQStringSerializator : public XmlBaseSerializator +class XmlCryptedSerializator : public XmlBaseSerializator, public virtual CryptedSerializator{ +public: + XmlCryptedSerializator(QDomDocument *doc, QDomElement *node) + :XmlBaseSerializator(doc, node){} + virtual void setPassPhrase(const QString& passPhrase) {m_passPhrase = passPhrase;} +protected: + QString passPhrase(){ return m_passPhrase;} +private: + QString m_passPhrase; +}; + +class XmlQStringSerializator : public XmlCryptedSerializator { public: - XmlQStringSerializator(QDomDocument *doc, QDomElement *node):XmlBaseSerializator(doc,node){} + XmlQStringSerializator(QDomDocument *doc, QDomElement *node):XmlCryptedSerializator(doc,node){} private: virtual void save(const QVariant &value,QString name); virtual QVariant loadValue(); diff --git a/limereport/serializators/lrxmlreader.cpp b/limereport/serializators/lrxmlreader.cpp index 545c4ca..bee2ff8 100644 --- a/limereport/serializators/lrxmlreader.cpp +++ b/limereport/serializators/lrxmlreader.cpp @@ -135,6 +135,11 @@ QString XMLReader::lastError() return m_error; } +void XMLReader::setPassPhrase(const QString &passPhrase) +{ + m_passPhrase = passPhrase; +} + bool XMLReader::extractFirstNode() { if (m_firstNode.isNull()){ @@ -166,6 +171,10 @@ QVariant XMLReader::getValue(QDomElement *node) if (creator) { QScopedPointerserializator(creator(m_doc.data(),node)); + CryptedSerializator* cs = dynamic_cast(serializator.data()); + if (cs){ + cs->setPassPhrase(m_passPhrase); + } return serializator->loadValue(); } return QVariant(); diff --git a/limereport/serializators/lrxmlreader.h b/limereport/serializators/lrxmlreader.h index f677c68..0bc17ee 100644 --- a/limereport/serializators/lrxmlreader.h +++ b/limereport/serializators/lrxmlreader.h @@ -44,14 +44,17 @@ public: XMLReader(); XMLReader(QSharedPointer doc); protected: +//ItemsReaderIntf interface + bool first(); + bool next(); + bool prior(); + QString itemType(); + QString itemClassName(); + bool readItem(QObject *item); + int firstLevelItemsCount(); + QString lastError(); + void setPassPhrase(const QString &passPhrase); - virtual bool first(); - virtual bool next(); - virtual bool prior(); - virtual QString itemType(); - virtual QString itemClassName(); - virtual bool readItem(QObject *item); - virtual int firstLevelItemsCount(); virtual bool prepareReader(QDomDocument *doc); void readItemFromNode(QObject *item, QDomElement *node); @@ -60,7 +63,7 @@ protected: void readCollection(QObject *item, QDomElement *node); QVariant getValue(QDomElement *node); - virtual QString lastError(); + protected: bool extractFirstNode(); QString m_error; @@ -68,6 +71,11 @@ private: QSharedPointer m_doc; QDomElement m_curNode; QDomElement m_firstNode; + QString m_passPhrase; + + + + }; class FileXMLReader : public XMLReader{ diff --git a/limereport/serializators/lrxmlwriter.cpp b/limereport/serializators/lrxmlwriter.cpp index 1a6e68a..3038373 100644 --- a/limereport/serializators/lrxmlwriter.cpp +++ b/limereport/serializators/lrxmlwriter.cpp @@ -113,6 +113,11 @@ QByteArray XMLWriter::saveToByteArray() return res; } +void XMLWriter::setPassPhrase(const QString &passPhrase) +{ + m_passPhrase = passPhrase; +} + QDomElement XMLWriter::putQObjectItem(QString name, QObject *item) { Q_UNUSED(name) @@ -158,6 +163,10 @@ void XMLWriter::saveProperty(QString name, QObject* item, QDomElement *node) if (creator) { QScopedPointer serializator(creator(m_doc.data(),node)); + CryptedSerializator* cs = dynamic_cast(serializator.data()); + if (cs){ + cs->setPassPhrase(m_passPhrase); + } serializator->save( item->property(name.toLatin1()), name diff --git a/limereport/serializators/lrxmlwriter.h b/limereport/serializators/lrxmlwriter.h index 399e2e2..0259a75 100644 --- a/limereport/serializators/lrxmlwriter.h +++ b/limereport/serializators/lrxmlwriter.h @@ -44,10 +44,13 @@ public: XMLWriter(QSharedPointer doc); ~XMLWriter() {} private: + // ItemsWriterIntf interface void putItem(QObject* item); bool saveToFile(QString fileName); QString saveToString(); QByteArray saveToByteArray(); + void setPassPhrase(const QString &passPhrase); + void init(); QDomElement putQObjectItem(QString name, QObject* item); void putChildQObjectItem(QString name, QObject* item, QDomElement* parentNode); @@ -66,6 +69,7 @@ private: QSharedPointer m_doc; QString m_fileName; QDomElement m_rootElement; + QString m_passPhrase; }; } From 29b9ae1036aa15f499e144670db7fd2d9be78cd6 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 1 Mar 2017 04:10:38 +0300 Subject: [PATCH 008/347] Version has been changed --- common.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.pri b/common.pri index 6154dbc..7fadeef 100644 --- a/common.pri +++ b/common.pri @@ -56,7 +56,7 @@ RCC_DIR = $${ARCH_DIR}/$${BUILD_TYPE}/rcc LIMEREPORT_VERSION_MAJOR = 1 LIMEREPORT_VERSION_MINOR = 4 -LIMEREPORT_VERSION_RELEASE = 1 +LIMEREPORT_VERSION_RELEASE = 2 LIMEREPORT_VERSION = '\\"$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}\\"' DEFINES += LIMEREPORT_VERSION_STR=\"$${LIMEREPORT_VERSION}\" From aa040e80313e2f7f3b9cca407defb3f0aed1b3f9 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 3 Mar 2017 02:23:23 +0300 Subject: [PATCH 009/347] LRDemo_r2 will get first template file to show --- demo_r2/mainwindow.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/demo_r2/mainwindow.cpp b/demo_r2/mainwindow.cpp index 5ad3ac4..b7bde34 100644 --- a/demo_r2/mainwindow.cpp +++ b/demo_r2/mainwindow.cpp @@ -50,10 +50,21 @@ MainWindow::MainWindow(QWidget *parent) : resize(screenWidth*0.8, screenHeight*0.8); move(x, y); - if (QFile::exists(QApplication::applicationDirPath()+"/demo_reports/categories.lrxml")){ - m_report.loadFromFile(QApplication::applicationDirPath()+"/demo_reports/categories.lrxml"); - m_preview->refreshPages(); + + if (ui->treeWidget->topLevelItemCount()>0){ + int index = 0; + while (indextreeWidget->topLevelItemCount()){ + if (ui->treeWidget->topLevelItem(index)->childCount()>0) + ++index; + else { + m_report.loadFromFile(ui->treeWidget->topLevelItem(index)->data(0,Qt::UserRole).toString()); + ui->treeWidget->setCurrentItem(ui->treeWidget->topLevelItem(index)); + break; + } + } + } + m_preview->refreshPages(); } From 4c6c0dfd3be3cafc5cc7ab6c68414229ba9ac08e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 3 Mar 2017 23:47:10 +0300 Subject: [PATCH 010/347] QString -> tr --- limereport/lrscriptenginemanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index b975c03..5b6faa8 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -568,7 +568,7 @@ QString ScriptEngineManager::expandDataFields(QString context, ExpandType expand } else { QString error; if (reportItem){ - error = QString("Field %1 not found in %2 !!! ").arg(field).arg(reportItem->objectName()); + error = tr("Field %1 not found in %2 !!! ").arg(field).arg(reportItem->objectName()); dataManager()->putError(error); } varValue = QVariant(); From 242dbe75d2e9a76d87eaa831ada56e81dfff1a31 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 4 Mar 2017 00:21:21 +0300 Subject: [PATCH 011/347] useAlternateBackgroundColor property has been added --- limereport/bands/lrdataband.cpp | 17 +++++++++++++++++ limereport/bands/lrdataband.h | 5 ++++- limereport/bands/lrsubdetailband.h | 1 + limereport/lrbanddesignintf.cpp | 27 ++++++++++++++++++++++++--- limereport/lrbanddesignintf.h | 5 ++++- limereport/lrreportrender.cpp | 15 ++++++++------- 6 files changed, 58 insertions(+), 12 deletions(-) diff --git a/limereport/bands/lrdataband.cpp b/limereport/bands/lrdataband.cpp index 342622a..4a67e58 100644 --- a/limereport/bands/lrdataband.cpp +++ b/limereport/bands/lrdataband.cpp @@ -79,6 +79,23 @@ bool DataBand::isUnique() const return false; } +void DataBand::preparePopUpMenu(QMenu &menu) +{ + DataBandDesignIntf::preparePopUpMenu(menu); + + QAction* autoSplittableAction = menu.addAction(tr("useAlternateBackgroundColor")); + autoSplittableAction->setCheckable(true); + autoSplittableAction->setChecked(useAlternateBackgroundColor()); +} + +void DataBand::processPopUpAction(QAction *action) +{ + DataBandDesignIntf::processPopUpAction(action); + if (action->text().compare(tr("useAlternateBackgroundColor")) == 0){ + setProperty("useAlternateBackgroundColor",action->isChecked()); + } +} + QColor DataBand::bandColor() const { return QColor(Qt::darkGreen); diff --git a/limereport/bands/lrdataband.h b/limereport/bands/lrdataband.h index fd180e8..f2ea27a 100644 --- a/limereport/bands/lrdataband.h +++ b/limereport/bands/lrdataband.h @@ -48,10 +48,13 @@ class DataBand : public DataBandDesignIntf Q_PROPERTY(bool startNewPage READ startNewPage WRITE setStartNewPage) Q_PROPERTY(bool startFromNewPage READ startFromNewPage WRITE setStartFromNewPage) Q_PROPERTY(QColor alternateBackgroundColor READ alternateBackgroundColor WRITE setAlternateBackgroundColor) + Q_PROPERTY(bool useAlternateBackgroundColor READ useAlternateBackgroundColor WRITE setUseAlternateBackgroundColor) public: DataBand(QObject* owner = 0, QGraphicsItem* parent=0); bool isUnique() const; bool isData() const {return true;} + void preparePopUpMenu(QMenu &menu); + void processPopUpAction(QAction *action); protected: QColor bandColor() const; private: @@ -82,7 +85,7 @@ class DataFooterBand : public BandDesignIntf Q_OBJECT Q_PROPERTY(int columnsCount READ columnsCount WRITE setColumnsCount) Q_PROPERTY(BandColumnsLayoutType columnsFillDirection READ columnsFillDirection WRITE setColumnsFillDirection) - Q_PROPERTY(bool printAlways READ printAlways() WRITE setPrintAlways()) + Q_PROPERTY(bool printAlways READ printAlways WRITE setPrintAlways) public: DataFooterBand(QObject* owner=0, QGraphicsItem* parent=0); bool isUnique() const {return false;} diff --git a/limereport/bands/lrsubdetailband.h b/limereport/bands/lrsubdetailband.h index c9b4c76..ae094e4 100644 --- a/limereport/bands/lrsubdetailband.h +++ b/limereport/bands/lrsubdetailband.h @@ -43,6 +43,7 @@ class SubDetailBand : public DataBandDesignIntf Q_PROPERTY(BandColumnsLayoutType columnsFillDirection READ columnsFillDirection WRITE setColumnsFillDirection) Q_PROPERTY(bool keepFooterTogether READ keepFooterTogether WRITE setKeepFooterTogether) Q_PROPERTY(QColor alternateBackgroundColor READ alternateBackgroundColor WRITE setAlternateBackgroundColor) + Q_PROPERTY(bool useAlternateBackgroundColor READ useAlternateBackgroundColor WRITE setUseAlternateBackgroundColor) public: SubDetailBand(QObject* owner = 0, QGraphicsItem* parent=0); bool isUnique() const {return false;} diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 9a704f2..ed9a534 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -147,7 +147,8 @@ BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, Q m_startNewPage(false), m_startFromNewPage(false), m_printAlways(false), - m_repeatOnEachRow(false) + m_repeatOnEachRow(false), + m_useAlternateBackgroundColor(false) { setPossibleResizeDirectionFlags(ResizeBottom); setPossibleMoveFlags(TopBotom); @@ -447,7 +448,7 @@ void BandDesignIntf::preparePopUpMenu(QMenu &menu) QAction* autoSplittableAction = menu.addAction(tr("Splittable")); autoSplittableAction->setCheckable(true); - autoSplittableAction->setChecked(isSplittable()); + autoSplittableAction->setChecked(isSplittable()); } void BandDesignIntf::processPopUpAction(QAction *action) @@ -780,6 +781,21 @@ void BandDesignIntf::childBandDeleted(QObject *band) m_childBands.removeAt(m_childBands.indexOf(reinterpret_cast(band))); } +bool BandDesignIntf::useAlternateBackgroundColor() const +{ + return m_useAlternateBackgroundColor; +} + +void BandDesignIntf::setUseAlternateBackgroundColor(bool useAlternateBackgroundColor) +{ + if (m_useAlternateBackgroundColor != useAlternateBackgroundColor){ + QColor oldValue = m_useAlternateBackgroundColor; + m_useAlternateBackgroundColor=useAlternateBackgroundColor; + if (!isLoading()) + notify("useAlternateBackgroundColor",oldValue,useAlternateBackgroundColor); + } +} + QColor BandDesignIntf::alternateBackgroundColor() const { if (metaObject()->indexOfProperty("alternateBackgroundColor")!=-1) @@ -790,7 +806,12 @@ QColor BandDesignIntf::alternateBackgroundColor() const void BandDesignIntf::setAlternateBackgroundColor(const QColor &alternateBackgroundColor) { - m_alternateBackgroundColor = alternateBackgroundColor; + if (m_alternateBackgroundColor != alternateBackgroundColor){ + QColor oldValue = m_alternateBackgroundColor; + m_alternateBackgroundColor=alternateBackgroundColor; + if (!isLoading()) + notify("alternateBackgroundColor",oldValue,alternateBackgroundColor); + } } bool BandDesignIntf::repeatOnEachRow() const diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index 0d92f5e..c53b9e3 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -219,6 +219,8 @@ public: void setRepeatOnEachRow(bool repeatOnEachRow); QColor alternateBackgroundColor() const; void setAlternateBackgroundColor(const QColor &alternateBackgroundColor); + bool useAlternateBackgroundColor() const; + void setUseAlternateBackgroundColor(bool useAlternateBackgroundColor); signals: void bandRendered(BandDesignIntf* band); @@ -276,7 +278,8 @@ private: bool m_printAlways; bool m_repeatOnEachRow; QMap m_slicedItems; - QColor m_alternateBackgroundColor; + QColor m_alternateBackgroundColor; + bool m_useAlternateBackgroundColor; }; class DataBandDesignIntf : public BandDesignIntf{ diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index aceca92..a497565 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -431,13 +431,14 @@ BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesign if (patternBand->isFooter()) m_lastRenderedFooter = patternBand; - - bandClone->setBackgroundColor( - (datasources()->variable(QLatin1String("line_")+patternBand->objectName().toLower()).toInt() %2 !=0 ? - bandClone->backgroundColor(): - bandClone->alternateBackgroundColor() - ) - ); + if (bandClone->useAlternateBackgroundColor()){ + bandClone->setBackgroundColor( + (datasources()->variable(QLatin1String("line_")+patternBand->objectName().toLower()).toInt() %2 == 0 ? + bandClone->backgroundColor() : + bandClone->alternateBackgroundColor() + ) + ); + } patternBand->emitBandRendered(bandClone); emit(patternBand->afterRender()); From b963428f4c88deb954e3d7222106afc04345eb28 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 4 Mar 2017 00:30:52 +0300 Subject: [PATCH 012/347] "Transparent" menu item has been added to TextItem context menu --- limereport/items/lrtextitem.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index e36d251..b2115bf 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -105,6 +105,10 @@ void TextItem::preparePopUpMenu(QMenu &menu) action->setCheckable(true); action->setChecked(stretchToMaxHeight()); + action = menu.addAction(tr("Transparent")); + action->setCheckable(true); + action->setChecked(backgroundMode() == TransparentMode); + } void TextItem::processPopUpAction(QAction *action) @@ -124,6 +128,13 @@ void TextItem::processPopUpAction(QAction *action) if (action->text().compare(tr("Stretch to max height")) == 0){ setProperty("stretchToMaxHeight",action->isChecked()); } + if (action->text().compare(tr("Transparent")) == 0){ + if (action->isChecked()){ + setProperty("backgroundMode",TransparentMode); + } else { + setProperty("backgroundMode",OpaqueMode); + } + } } void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, QWidget* widget) { From d25001583946f84a8bd8abde3c171b4a1d05173e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 5 Mar 2017 16:39:50 +0300 Subject: [PATCH 013/347] Default system printer will selected in "printer select dialog" by default --- limereport/lrpreviewreportwidget.cpp | 7 +++++++ limereport/lrreportengine.cpp | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 986e95d..dcddb74 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include @@ -157,7 +158,13 @@ void PreviewReportWidget::lastPage() void PreviewReportWidget::print() { + + QPrinterInfo pi; QPrinter printer(QPrinter::HighResolution); + + if (!pi.defaultPrinter().isNull()) + printer.setPrinterName(pi.defaultPrinterName()); + QPrintDialog dialog(&printer,QApplication::activeWindow()); if (dialog.exec()==QDialog::Accepted){ if (!d_ptr->m_reportPages.isEmpty()) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index d4b4fa2..6f9c6e0 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -29,6 +29,7 @@ ****************************************************************************/ #include #include +#include #include #include #include @@ -271,6 +272,9 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer, cons bool ReportEnginePrivate::printReport(QPrinter* printer) { if (!printer&&!m_printerSelected){ + QPrinterInfo pi; + if (!pi.defaultPrinter().isNull()) + m_printer.data()->setPrinterName(pi.defaultPrinterName()); QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); m_printerSelected = dialog.exec()!=QDialog::Rejected; } @@ -294,8 +298,10 @@ bool ReportEnginePrivate::printReport(QPrinter* printer) bool ReportEnginePrivate::printPages(ReportPages pages, QPrinter *printer, PrintRange printRange) { - if (!printer&&!m_printerSelected){ + QPrinterInfo pi; + if (!pi.defaultPrinter().isNull()) + m_printer.data()->setPrinterName(pi.defaultPrinterName()); QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); m_printerSelected = dialog.exec()!=QDialog::Rejected; if (m_printerSelected){ From 11b94026be8f13b840a0cae4919cee495691cdc7 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 6 Mar 2017 14:34:19 +0300 Subject: [PATCH 014/347] Russian translation has been updated --- translations/limereport_ru.ts | 404 +++++++++++++++++----------------- 1 file changed, 204 insertions(+), 200 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 3a76892..ea926cf 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -55,6 +55,22 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600; color:#555555;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600; color:#555555;"> framework</span></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#000000;">This library 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.</span></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; color:#000000;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> @@ -64,133 +80,117 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600;">G</span><span style=" font-family:'sans-serif'; font-weight:600;">NU LESSER GENERAL PUBLIC LICENSE</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Version 2.1, February 1999</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Everyone is permitted to copy and distribute verbatim copies</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">of this license document, but changing it is not allowed.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">[This is the first released version of the Lesser GPL. It also counts</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> as the successor of the GNU Library Public License, version 2, hence</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> the version number 2.1.]</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600;">P</span><span style=" font-family:'sans-serif'; font-weight:600;">reamble</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">0.</span><span style=" font-family:'sans-serif';"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">1.</span><span style=" font-family:'sans-serif';"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">2.</span><span style=" font-family:'sans-serif';"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif';">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">3.</span><span style=" font-family:'sans-serif';"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">4.</span><span style=" font-family:'sans-serif';"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">5.</span><span style=" font-family:'sans-serif';"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">6.</span><span style=" font-family:'sans-serif';"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">7.</span><span style=" font-family:'sans-serif';"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">8.</span><span style=" font-family:'sans-serif';"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">9.</span><span style=" font-family:'sans-serif';"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">10.</span><span style=" font-family:'sans-serif';"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">11.</span><span style=" font-family:'sans-serif';"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">12.</span><span style=" font-family:'sans-serif';"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">13.</span><span style=" font-family:'sans-serif';"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">14.</span><span style=" font-family:'sans-serif';"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">NO WARRANTY</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">15.</span><span style=" font-family:'sans-serif';"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">16.</span><span style=" font-family:'sans-serif';"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">END OF TERMS AND CONDITIONS</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">one line to give the library's name and an idea of what it does.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic;">year</span><span style=" font-family:'monospace';"> </span><span style=" font-family:'monospace'; font-style:italic;">name of author</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is free software; you can redistribute it and/or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">modify it under the terms of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License as published by the Free Software Foundation; either</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">version 2.1 of the License, or (at your option) any later version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is distributed in the hope that it will be useful,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Lesser General Public License for more details.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">You should have received a copy of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License along with this library; if not, write to the Free Software</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Also add information on how to contact you by electronic and paper mail.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">the library `Frob' (a library for tweaking knobs) written</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">by James Random Hacker.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">signature of Ty Coon</span><span style=" font-family:'monospace';">, 1 April 1990</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Ty Coon, President of Vice</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">That's all there is to it!</span></p></body></html> - +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">G</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">NU LESSER GENERAL PUBLIC LICENSE</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Version 2.1, February 1999</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Everyone is permitted to copy and distribute verbatim copies</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">of this license document, but changing it is not allowed.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; color:#000000; background-color:#ffffff;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">[This is the first released version of the Lesser GPL. It also counts</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;"> as the successor of the GNU Library Public License, version 2, hence</span></p> +<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;"> the version number 2.1.]</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">P</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">reamble</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">0.</span><span style=" font-family:'sans-serif'; color:#000000;"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">1.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">2.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> +<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> +<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> +<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> +<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif'; color:#000000;">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">3.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">4.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">5.</span><span style=" font-family:'sans-serif'; color:#000000;"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">6.</span><span style=" font-family:'sans-serif'; color:#000000;"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> +<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> +<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> +<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> +<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> +<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">7.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> +<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> +<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">8.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">9.</span><span style=" font-family:'sans-serif'; color:#000000;"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">10.</span><span style=" font-family:'sans-serif'; color:#000000;"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">11.</span><span style=" font-family:'sans-serif'; color:#000000;"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">12.</span><span style=" font-family:'sans-serif'; color:#000000;"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">13.</span><span style=" font-family:'sans-serif'; color:#000000;"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">14.</span><span style=" font-family:'sans-serif'; color:#000000;"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">NO WARRANTY</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">15.</span><span style=" font-family:'sans-serif'; color:#000000;"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">16.</span><span style=" font-family:'sans-serif'; color:#000000;"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333; background-color:#ffffff;">END OF TERMS AND CONDITIONS</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; font-style:italic; color:#000000;">one line to give the library's name and an idea of what it does.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic; color:#000000;">year</span><span style=" font-family:'monospace'; color:#000000;"> </span><span style=" font-family:'monospace'; font-style:italic; color:#000000;">name of author</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic; color:#000000; background-color:#ffffff;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">This library is free software; you can redistribute it and/or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">modify it under the terms of the GNU Lesser General Public</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">License as published by the Free Software Foundation; either</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">version 2.1 of the License, or (at your option) any later version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; color:#000000; background-color:#ffffff;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">This library is distributed in the hope that it will be useful,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">Lesser General Public License for more details.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; color:#000000; background-color:#ffffff;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">You should have received a copy of the GNU Lesser General Public</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">License along with this library; if not, write to the Free Software</span></p> +<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Also add information on how to contact you by electronic and paper mail.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">the library `Frob' (a library for tweaking knobs) written</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">by James Random Hacker.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; color:#000000; background-color:#ffffff;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; font-style:italic; color:#000000;">signature of Ty Coon</span><span style=" font-family:'monospace'; color:#000000;">, 1 April 1990</span></p> +<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">Ty Coon, President of Vice</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">That's all there is to it!</span></p></body></html> + @@ -286,7 +286,7 @@ p, li { white-space: pre-wrap; } LimeReport::ConnectionDesc defaultConnection - + Соединение по умолчанию @@ -365,18 +365,18 @@ p, li { white-space: pre-wrap; } Dont keep credentals in lrxml - + Не хранить учетные данные в lrxml defaultConnection - + Соединение по умолчанию LimeReport::ContentItemDesignIntf Variable %1 not found - Переменная %1 не найдена + Переменная %1 не найдена @@ -447,7 +447,7 @@ p, li { white-space: pre-wrap; } User variables - Пользовательские переменные + Пользовательские переменные Do you really want to delete "%1" datasource ? @@ -522,7 +522,7 @@ p, li { white-space: pre-wrap; } Database "%1" not found - + База данных "%1;" не найдена @@ -537,7 +537,7 @@ p, li { white-space: pre-wrap; } External variables - Внешние переменные + Внешние переменные @@ -593,11 +593,11 @@ p, li { white-space: pre-wrap; } Group field not found - + Поле группы не найдено Datasource "%1" not found !!! - + Источник данных "%1;" не найден !!! @@ -616,7 +616,7 @@ p, li { white-space: pre-wrap; } Wrong script syntax "%1" - + Неверный синтаксис скрипта "%1" @@ -739,7 +739,7 @@ p, li { white-space: pre-wrap; } LimeReport::PageItemDesignIntf Paste - Вставить + Вставить @@ -853,23 +853,23 @@ p, li { white-space: pre-wrap; } Esc - + Esc Show Toolbar - + Показывать Панель Инструментов Show toolbar - + Показывать Панель Инструментов Font - Шрифт + Шрифт Text align - + Выравнивание текста @@ -891,43 +891,43 @@ p, li { white-space: pre-wrap; } fullPage - Страница целиком + Страница целиком gridStep - Шаг сетки + Шаг сетки oldPrintMode - Старый режим печати + Старый режим печати resourcePath - Путь к ресурсам + Путь к ресурсам autoSize - Автоматический размер + Автоматический размер center - Центрировать + Центрировать field - Поле + Поле image - Изображение + Изображение keepAspectRatio - Сохранять соотношение сторон + Сохранять соотношение сторон scale - Масштабировать + Масштабировать leftMargin @@ -955,15 +955,15 @@ p, li { white-space: pre-wrap; } condition - Условие + Условие keepGroupTogether - Сохранять группу вместе + Сохранять группу вместе groupFieldName - Столбец группы + Столбец группы geometry @@ -1027,43 +1027,43 @@ p, li { white-space: pre-wrap; } textIndent - Отступ текста + Отступ текста textLayoutDirection - Направление текста + Направление текста lineSpacing - Межстрочный интервал + Межстрочный интервал underlines - Подчеркивание + Подчеркивание underlineLineSize - Толщина подчеркивания + Толщина подчеркивания format - Формат + Формат valueType - Тип значения + Тип значения adaptFontToSize - Шрифт по размеру + Шрифт по размеру followTo - Следует за + Следует за backgroundBrushStyle - Стиль заполнения фона + Стиль заполнения фона autoHeight @@ -1075,11 +1075,11 @@ p, li { white-space: pre-wrap; } alternateBackgroundColor - Альтернативный цвет фона + Альтернативный цвет фона columnsCount - Количество столбцов + Количество столбцов columnsFillDirection @@ -1175,35 +1175,35 @@ p, li { white-space: pre-wrap; } allowHTML - Разрешить HTML + Разрешить HTML allowHTMLInFields - Разрешить HTML в полях + Разрешить HTML в полях printAlways - Печатать всегда + Печатать всегда borderColor - Цвет границ + Цвет границ startNewPage - Начинать новую страницу + Начинать новую страницу startFromNewPage - Начинать с новой страницы + Начинать с новой страницы resetPageNumber - Обнулять номер страницы + Обнулять номер страницы columnCount - + Количество столбцов @@ -1236,19 +1236,19 @@ p, li { white-space: pre-wrap; } Page - + Страница Script - + Скрипт Error - Ошибка + Ошибка Wrong file format - + Неверный формат файла @@ -1535,7 +1535,7 @@ p, li { white-space: pre-wrap; } page index out of range - + номер страницы выходит за пределы дипазона @@ -1638,7 +1638,7 @@ p, li { white-space: pre-wrap; } defaultConnection - + Соединение по умолчанию @@ -1653,53 +1653,53 @@ p, li { white-space: pre-wrap; } Form - Форма + Форма ... - + Type - Тип + Тип Name - Имя переменной + Имя переменной NO CATEGORY - + Error - Ошибка + Ошибка Dialog with name: %1 already exists - + Диалог с именем: %1 уже существует ui file must cointain QDialog instead QWidget or QMainWindow - + файл ui должен содержать QDialog вместо QWidget или QMainWindow wrong file format - + неверный формат файла LimeReport::ScriptEngineContext Dialog with name: %1 can`t be created - + Диалог с именем: %1 не может быть создан LimeReport::ScriptEngineManager FieldName - Имя поля + Имя поля BandName @@ -1727,11 +1727,15 @@ p, li { white-space: pre-wrap; } Variable %1 not found - Переменная %1 не найдена + Переменная %1 не найдена Name - Имя переменной + Имя переменной + + + Field %1 not found in %2 !!! + Поле %1 не найдено в %2 !!! @@ -1758,15 +1762,15 @@ p, li { white-space: pre-wrap; } Designer Setting - + Настройки Дизайнера Report Setting - + Настройки Отчета Suppress absent fields and variables warning - + Скрывать предупреждения об отсутсвующих полях и переменных @@ -1787,7 +1791,7 @@ p, li { white-space: pre-wrap; } LimeReport::TearOffBand Tear-off Band - Отрыв данных + Отрыв данных @@ -1896,7 +1900,7 @@ p, li { white-space: pre-wrap; } Esc - + Esc @@ -2110,11 +2114,11 @@ p, li { white-space: pre-wrap; } Tear-off Band - Отрыв данных + Отрыв данных Wrong file format - + Неверный формат файла From 6529ced062c619d3549349fe3fedaf9e514738ea Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 8 Mar 2017 04:59:40 +0300 Subject: [PATCH 015/347] COUNT function has been fixed --- limereport/lrscriptenginemanager.cpp | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 5b6faa8..613b4dc 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1295,13 +1295,7 @@ void JSFunctionDesc::setScriptWrapper(const QString &scriptWrapper) QVariant ScriptFunctionsManager::calcGroupFunction(const QString &name, const QString &expressionID, const QString &bandName) { if (m_scriptEngineManager->dataManager()){ - QString expression = ""; - if (name.compare("COUNT",Qt::CaseInsensitive) == 0){ - expression = " "; - } else { - expression = m_scriptEngineManager->dataManager()->getExpression(expressionID); - } - + QString expression = m_scriptEngineManager->dataManager()->getExpression(expressionID); GroupFunction* gf = m_scriptEngineManager->dataManager()->groupFunction(name,expression,bandName); if (gf){ if (gf->isValid()){ From 0505801e3a09218955cdfd761e05f4530cface12 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 19 Mar 2017 14:03:13 +0300 Subject: [PATCH 016/347] printBeforePageHeader property has been added to "ReportHeader" band --- limereport/bands/lrreportheader.cpp | 15 ++++++++++++++- limereport/bands/lrreportheader.h | 4 ++++ limereport/lrreportrender.cpp | 21 +++++++++++++++++---- limereport/lrreportrender.h | 4 +++- 4 files changed, 38 insertions(+), 6 deletions(-) diff --git a/limereport/bands/lrreportheader.cpp b/limereport/bands/lrreportheader.cpp index 5b853b7..e08f418 100644 --- a/limereport/bands/lrreportheader.cpp +++ b/limereport/bands/lrreportheader.cpp @@ -46,7 +46,7 @@ bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instanc namespace LimeReport { ReportHeader::ReportHeader(QObject *owner, QGraphicsItem *parent) - : BandDesignIntf(LimeReport::BandDesignIntf::ReportHeader,xmlTag,owner,parent) { + : BandDesignIntf(LimeReport::BandDesignIntf::ReportHeader,xmlTag,owner,parent), m_printBeforePageHeader(false) { setBandTypeText(tr("Report Header")); setMarkerColor(bandColor()); } @@ -60,5 +60,18 @@ QColor ReportHeader::bandColor() const return QColor(152,69,167); } +bool ReportHeader::printBeforePageHeader() const +{ + return m_printBeforePageHeader; +} + +void ReportHeader::setPrintBeforePageHeader(bool printBeforePageHeader) +{ + if (m_printBeforePageHeader != printBeforePageHeader){ + m_printBeforePageHeader = printBeforePageHeader; + notify("printBeforePageHeader",!m_printBeforePageHeader,m_printBeforePageHeader); + } +} + } diff --git a/limereport/bands/lrreportheader.h b/limereport/bands/lrreportheader.h index bc70667..d532ff9 100644 --- a/limereport/bands/lrreportheader.h +++ b/limereport/bands/lrreportheader.h @@ -39,11 +39,15 @@ class ReportHeader : public LimeReport::BandDesignIntf { Q_OBJECT Q_PROPERTY(bool splittable READ isSplittable WRITE setSplittable ) + Q_PROPERTY(bool printBeforePageHeader READ printBeforePageHeader WRITE setPrintBeforePageHeader) public: ReportHeader(QObject* owner = 0, QGraphicsItem *parent=0); virtual BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); + bool printBeforePageHeader() const; + void setPrintBeforePageHeader(bool printBeforePageHeader); protected: QColor bandColor() const; + bool m_printBeforePageHeader; }; } #endif // LRREPORTHEADER_H diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 36f7961..2476930 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -257,11 +257,12 @@ void ReportRender::renderPage(PageDesignIntf* patternPage) } clearPageMap(); - startNewPage(); + startNewPage(true); + renderReportHeader(m_patternPageItem, AfterPageHeader); - renderBand(m_patternPageItem->bandByType(BandDesignIntf::ReportHeader), 0, StartNewPageAsNeeded); +// renderBand(m_patternPageItem->bandByType(BandDesignIntf::ReportHeader), 0, StartNewPageAsNeeded); BandDesignIntf* lastRenderedBand = 0; for (int i=0;idataBandCount() && !m_renderCanceled;i++){ @@ -605,6 +606,17 @@ void ReportRender::renderPageHeader(PageItemDesignIntf *patternPage) } } +void ReportRender::renderReportHeader(PageItemDesignIntf *patternPage, PageRenderStage stage) +{ + BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::ReportHeader); + if (band){ + if (band->property("printBeforePageHeader").toBool() && stage == BeforePageHeader ) + renderBand(band, 0, StartNewPageAsNeeded); + if (!band->property("printBeforePageHeader").toBool() && stage == AfterPageHeader ) + renderBand(band, 0, StartNewPageAsNeeded); + } +} + void ReportRender::renderPageFooter(PageItemDesignIntf *patternPage) { BandDesignIntf* band = patternPage->bandByType(BandDesignIntf::PageFooter); @@ -897,7 +909,7 @@ bool ReportRender::registerBand(BandDesignIntf *band, bool registerInChildren) } - if (band->height()<=m_maxHeightByColumn[m_currentColumn]){ + if (band->height() <= m_maxHeightByColumn[m_currentColumn]){ if (band->bandType()==BandDesignIntf::PageFooter){ for (int i=0;ibeforeRender(); + if (isFirst) renderReportHeader(m_patternPageItem, BeforePageHeader); renderPageHeader(m_patternPageItem); m_pageFooterHeight = calcPageFooterHeight(m_patternPageItem); diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 8e62b0b..1759712 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -70,6 +70,7 @@ public: enum DataRenderMode {StartNewPageAsNeeded, NotStartNewPage, ForcedStartPage}; enum BandPrintMode {PrintAlwaysPrintable, PrintNotAlwaysPrintable }; enum ResetPageNuberType{BandReset, PageReset}; + enum PageRenderStage{BeforePageHeader, AfterPageHeader}; typedef QSharedPointer Ptr; ~ReportRender(); ReportRender(QObject *parent = 0); @@ -102,6 +103,7 @@ private: BandDesignIntf* renderBand(BandDesignIntf *patternBand, BandDesignIntf *bandData, DataRenderMode mode = NotStartNewPage, bool isLast = false); void renderDataBand(BandDesignIntf* dataBand); void renderPageHeader(PageItemDesignIntf* patternPage); + void renderReportHeader(PageItemDesignIntf* patternPage, PageRenderStage stage); void renderPageFooter(PageItemDesignIntf* patternPage); void moveTearOffBand(); void renderPageItems(PageItemDesignIntf* patternPage); @@ -138,7 +140,7 @@ private: BandDesignIntf* saveUppperPartReturnBottom(BandDesignIntf *band, int height, BandDesignIntf *patternBand); BandDesignIntf* renderData(BandDesignIntf* patternBand); void startNewColumn(); - void startNewPage(); + void startNewPage(bool isFirst = false); void resetPageNumber(ResetPageNuberType resetType); int findLastPageNumber(int currentPage); void savePage(bool isLast = false); From 4559925af437b8012f128ff21435e277b0b27719 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 21 Mar 2017 18:01:35 +0300 Subject: [PATCH 017/347] aggregate functions can be called in data header --- limereport/bands/lrsubdetailband.h | 1 + limereport/lrbanddesignintf.cpp | 24 ++++++++ limereport/lrbanddesignintf.h | 7 ++- limereport/lrbasedesignintf.cpp | 14 ++++- limereport/lrbasedesignintf.h | 3 + limereport/lrdatasourcemanager.cpp | 6 +- limereport/lrreportrender.cpp | 90 ++++++++++++++++++++++++------ limereport/lrreportrender.h | 7 +++ 8 files changed, 131 insertions(+), 21 deletions(-) diff --git a/limereport/bands/lrsubdetailband.h b/limereport/bands/lrsubdetailband.h index ae094e4..afbc6c5 100644 --- a/limereport/bands/lrsubdetailband.h +++ b/limereport/bands/lrsubdetailband.h @@ -64,6 +64,7 @@ class SubDetailHeaderBand : public BandDesignIntf public: SubDetailHeaderBand(QObject* owner = 0, QGraphicsItem* parent=0); bool isUnique() const; + bool isHeader() const {return true;} protected: QColor bandColor() const; private: diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index ed9a534..42342ad 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -461,6 +461,19 @@ void BandDesignIntf::processPopUpAction(QAction *action) } } +void BandDesignIntf::recalcItems(DataSourceManager* dataManager) +{ + foreach(BaseDesignIntf* bi, childBaseItems()){ + ContentItemDesignIntf* ci = dynamic_cast(bi); + if (bi){ + ContentItemDesignIntf* pci = dynamic_cast(bi->patternItem()); + ci->setContent(pci->content()); + } + } + + updateItemSize(dataManager,FirstPass,height()); +} + BaseDesignIntf* BandDesignIntf::cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent) { int maxBottom = 0; @@ -966,6 +979,17 @@ void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass p BaseDesignIntf::updateItemSize(dataManager, pass, maxHeight); } +void BandDesignIntf::restoreItems() +{ + foreach(BaseDesignIntf* bi, childBaseItems()){ + ContentItemDesignIntf* ci = dynamic_cast(bi); + if (ci){ + ContentItemDesignIntf* pci = dynamic_cast(bi->patternItem()); + ci->setContent(pci->content()); + } + } +} + void BandDesignIntf::updateBandNameLabel() { if (m_bandNameLabel) m_bandNameLabel->updateLabel(); diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index c53b9e3..c440aab 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -128,6 +128,8 @@ public: virtual QIcon bandIcon() const; virtual bool isUnique() const; void updateItemSize(DataSourceManager *dataManager, RenderPass pass=FirstPass, int maxHeight=0); + void restoreItems(); + void recalcItems(DataSourceManager* dataManager); void updateBandNameLabel(); virtual QColor selectionColor() const; @@ -220,8 +222,8 @@ public: QColor alternateBackgroundColor() const; void setAlternateBackgroundColor(const QColor &alternateBackgroundColor); bool useAlternateBackgroundColor() const; - void setUseAlternateBackgroundColor(bool useAlternateBackgroundColor); - + void setUseAlternateBackgroundColor(bool useAlternateBackgroundColor); + void replaceGroupsFunction(BandDesignIntf *band); signals: void bandRendered(BandDesignIntf* band); protected: @@ -248,6 +250,7 @@ protected: void moveItemsDown(qreal startPos, qreal offset); void preparePopUpMenu(QMenu &menu); void processPopUpAction(QAction *action); + private slots: void childBandDeleted(QObject* band); private: diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 944277e..1e02ecf 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -79,7 +79,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_changingItemAlign(false), m_borderColor(Qt::black), m_reportSettings(0), - m_patternName("") + m_patternName(""), + m_patternItem(0) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -712,6 +713,16 @@ void BaseDesignIntf::setPatternName(const QString &patternName) m_patternName = patternName; } +BaseDesignIntf* BaseDesignIntf::patternItem() const +{ + return m_patternItem; +} + +void BaseDesignIntf::setPatternItem(BaseDesignIntf *patternItem) +{ + m_patternItem = patternItem; +} + ReportSettings *BaseDesignIntf::reportSettings() const { return m_reportSettings; @@ -1330,6 +1341,7 @@ BaseDesignIntf *BaseDesignIntf::cloneItem(ItemMode mode, QObject *owner, QGraphi { BaseDesignIntf *clone = cloneItemWOChild(mode, owner, parent); clone->setPatternName(this->objectName()); + clone->setPatternItem(this); #ifdef HAVE_QT5 foreach(QObject * child, children()) { #else diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index c925579..812fefc 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -272,6 +272,8 @@ public: void setZValueProperty(qreal value); QString patternName() const; void setPatternName(const QString &patternName); + BaseDesignIntf* patternItem() const; + void setPatternItem(BaseDesignIntf* patternItem); Q_INVOKABLE QString setItemWidth(qreal width); Q_INVOKABLE QString setItemHeight(qreal height); @@ -397,6 +399,7 @@ private: QColor m_borderColor; ReportSettings* m_reportSettings; QString m_patternName; + BaseDesignIntf* m_patternItem; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanged(QObject* object, QPointF newPos, QPointF oldPos); diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index dc2c32e..1198f8b 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -258,7 +258,11 @@ void DataSourceManager::clearGroupFuntionsExpressions() QString DataSourceManager::getExpression(QString index) { - return m_groupFunctionsExpressions.at(index.toInt()); + bool ok = false; + int i = index.toInt(&ok); + if (ok && m_groupFunctionsExpressions.size()>i) + return m_groupFunctionsExpressions.at(index.toInt()); + else return ""; } bool DataSourceManager::designTime() const diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 2476930..99d5cf3 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -259,11 +259,8 @@ void ReportRender::renderPage(PageDesignIntf* patternPage) clearPageMap(); startNewPage(true); - renderReportHeader(m_patternPageItem, AfterPageHeader); -// renderBand(m_patternPageItem->bandByType(BandDesignIntf::ReportHeader), 0, StartNewPageAsNeeded); - BandDesignIntf* lastRenderedBand = 0; for (int i=0;idataBandCount() && !m_renderCanceled;i++){ lastRenderedBand = m_patternPageItem->dataBandAt(i); @@ -318,6 +315,7 @@ void ReportRender::initRenderPage() m_renderPageItem->initFromItem(m_patternPageItem); m_renderPageItem->setItemMode(PreviewMode); m_renderPageItem->setPatternName(m_patternPageItem->objectName()); + m_renderPageItem->setPatternItem(m_patternPageItem); } } @@ -393,6 +391,21 @@ void ReportRender::extractGroupsFunction(BandDesignIntf *band) } } +bool ReportRender::containsGroupsFunction(BandDesignIntf *band){ + foreach(BaseDesignIntf* item,band->childBaseItems()){ + ContentItemDesignIntf* contentItem = dynamic_cast(item); + if (contentItem){ + QString content = contentItem->content(); + foreach(QString functionName, m_datasources->groupFunctionNames()){ + QRegExp rx(QString(Const::GROUP_FUNCTION_RX).arg(functionName)); + if (rx.indexIn(content)>=0){ + return true; + } + } + } + } + return false; +} void ReportRender::replaceGroupsFunction(BandDesignIntf *band) { @@ -517,20 +530,20 @@ void ReportRender::renderDataBand(BandDesignIntf *dataBand) BandDesignIntf* header = dataBand->bandHeader(); BandDesignIntf* footer = dataBand->bandFooter(); - if (header && header->printAlways()) renderBand(header, 0); + if (header && header->printAlways()) renderDataHeader(header); if(bandDatasource && !bandDatasource->eof() && !m_renderCanceled){ QString varName = QLatin1String("line_")+dataBand->objectName().toLower(); datasources()->setReportVariable(varName,1); - if (header && !header->printAlways()) - renderBand(header, 0); - - if (dataBand->bandHeader() && dataBand->bandHeader()->reprintOnEachPage()) + if (header && header->reprintOnEachPage()) m_reprintableBands.append(dataBand->bandHeader()); - renderChildHeader(dataBand,PrintNotAlwaysPrintable); + if (header && !header->printAlways()) + renderDataHeader(header); + + //renderChildHeader(dataBand,PrintNotAlwaysPrintable); renderGroupHeader(dataBand, bandDatasource, true); bool firstTime = true; @@ -578,7 +591,8 @@ void ReportRender::renderDataBand(BandDesignIntf *dataBand) firstTime = false; } - m_reprintableBands.removeOne(dataBand->bandHeader()); + m_reprintableBands.removeOne(header); + if (header) recalcIfNeeded(header); renderGroupFooter(dataBand); @@ -702,13 +716,48 @@ void ReportRender::renderChildBands(BandDesignIntf *parentBand) } } +BandDesignIntf* ReportRender::findRecalcableBand(BandDesignIntf* patternBand){ + + QList::iterator it = m_recalcBands.begin(); + for (;it !=m_recalcBands.end() ;++it){ + if ((*it)->patternItem() == patternBand){ + BandDesignIntf* result = (*it); + m_recalcBands.erase(it); + return result; + } + } + return 0; +} + +void ReportRender::recalcIfNeeded(BandDesignIntf* band){ + BandDesignIntf* recalcBand = findRecalcableBand(band); + if (recalcBand){ + QString bandName = recalcBand->objectName(); + recalcBand->restoreItems(); + recalcBand->setObjectName(recalcBand->patternItem()->objectName()); + replaceGroupsFunction(recalcBand); + recalcBand->updateItemSize(datasources()); + recalcBand->setObjectName(bandName); + datasources()->clearGroupFunctionValues(recalcBand->patternItem()->objectName()); + } +} + +void ReportRender::renderDataHeader(BandDesignIntf *header) +{ + recalcIfNeeded(header); + BandDesignIntf* renderedHeader = renderBand(header, 0); + if (containsGroupsFunction(header)) + m_recalcBands.append(renderedHeader); +} + void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* dataSource, bool firstTime) { foreach(BandDesignIntf* band,parentBand->childrenByType(BandDesignIntf::GroupHeader)){ IGroupBand* gb = dynamic_cast(band); - if (gb&&gb->isNeedToClose(m_datasources)){ + if (gb&&gb->isNeedToClose(datasources())){ if (band->childBands().count()>0){ dataSource->prior(); + foreach (BandDesignIntf* subBand, band->childrenByType(BandDesignIntf::GroupHeader)) { foreach(BandDesignIntf* footer, subBand->childrenByType(BandDesignIntf::GroupFooter)){ renderBand(footer, 0); @@ -723,10 +772,6 @@ void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* da dataSource->next(); } closeDataGroup(band); -// if (gb->isNeedToStartNewPage()){ -// savePage(); -// startNewPage(); -// } } if (!gb->isStarted()){ @@ -734,12 +779,15 @@ void ReportRender::renderGroupHeader(BandDesignIntf *parentBand, IDataSource* da m_reprintableBands.append(band); gb->startGroup(m_datasources); openDataGroup(band); + BandDesignIntf* renderedHeader = 0; if (!firstTime && gb->startNewPage()){ if (gb->resetPageNumber()) resetPageNumber(BandReset); - renderBand(band, 0, ForcedStartPage); + renderedHeader = renderBand(band, 0, ForcedStartPage); } else { - renderBand(band, 0, StartNewPageAsNeeded); + renderedHeader = renderBand(band, 0, StartNewPageAsNeeded); } + if (containsGroupsFunction(band)) + m_recalcBands.append(renderedHeader); } renderGroupHeader(band, dataSource, firstTime); @@ -753,6 +801,7 @@ void ReportRender::renderGroupFooterByHeader(BandDesignIntf* groupHeader){ foreach (BandDesignIntf* footer, groupHeader->childrenByType(BandDesignIntf::GroupFooter)){ renderBand(footer, 0, StartNewPageAsNeeded); } + recalcIfNeeded(groupHeader); } void ReportRender::renderGroupFooter(BandDesignIntf *parentBand) @@ -780,6 +829,7 @@ void ReportRender::initGroups() if (band->isHeader()){ IGroupBand* gb = dynamic_cast(band); if (gb) gb->closeGroup(); + extractGroupsFunction(band); } } } @@ -852,6 +902,7 @@ void ReportRender::closeDataGroup(BandDesignIntf *band) groupBand->closeGroup(); if (band->reprintOnEachPage()) m_reprintableBands.removeOne(band); } + recalcIfNeeded(band); closeGroup(band); } @@ -1056,6 +1107,11 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand) if (patternBand->isFooter()){ replaceGroupsFunction(bandClone); } + + if (patternBand->isHeader()){ + replaceGroupsFunction(bandClone); + } + bandClone->updateItemSize(m_datasources); baseDesignIntfToScript(bandClone); diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 1759712..21048c9 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -90,6 +90,7 @@ private: void baseDesignIntfToScript(BaseDesignIntf* item); + void renderPage(PageDesignIntf *patternPage); void initDatasources(); void initDatasource(const QString &name); @@ -112,13 +113,18 @@ private: void renderChildHeader(BandDesignIntf* parent, BandPrintMode printMode); void renderChildFooter(BandDesignIntf* parent, BandPrintMode printMode); void renderChildBands(BandDesignIntf* parentBand); + void recalcIfNeeded(BandDesignIntf *band); + void renderDataHeader(BandDesignIntf* header); void renderGroupHeader(BandDesignIntf* parentBand, IDataSource* dataSource, bool firstTime); void renderGroupFooter(BandDesignIntf* parentBand); void initGroups(); + bool containsGroupsFunction(BandDesignIntf* band); void extractGroupsFunction(BandDesignIntf* band); void replaceGroupsFunction(BandDesignIntf* band); + BandDesignIntf *findRecalcableBand(BandDesignIntf *patternBand); + void popPageFooterGroupValues(BandDesignIntf* dataBand); void pushPageFooterGroupValues(BandDesignIntf* dataBand); @@ -162,6 +168,7 @@ private: QList m_renderedPages; QMultiMap< BandDesignIntf*, GroupBandsHolder* > m_childBands; QList m_reprintableBands; + QList m_recalcBands; // QList m_lastRenderedHeaders; //int m_maxHeightByColumn[0]; From 188ab54ee2b042dac413ae56277dd8fb4dccffbb Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 22 Mar 2017 14:42:09 +0300 Subject: [PATCH 018/347] ReportEnginePrivate has been changed to ReportEngine in PrewiewWindow and DesignerWindow --- include/lrpreviewreportwidget.h | 3 ++- include/lrreportengine.h | 4 ++++ limereport/lrpreviewreportwidget.cpp | 7 ++++--- limereport/lrpreviewreportwidget.h | 3 ++- limereport/lrpreviewreportwindow.cpp | 4 +++- limereport/lrpreviewreportwindow.h | 19 +++++++++++-------- limereport/lrreportdesignwidget.cpp | 6 +++--- limereport/lrreportdesignwidget.h | 2 +- limereport/lrreportdesignwindow.cpp | 4 ++-- limereport/lrreportdesignwindow.h | 4 ++-- limereport/lrreportengine.cpp | 9 ++++++--- limereport/lrreportengine.h | 4 ++++ 12 files changed, 44 insertions(+), 25 deletions(-) diff --git a/include/lrpreviewreportwidget.h b/include/lrpreviewreportwidget.h index 4e35ea6..e33f75f 100644 --- a/include/lrpreviewreportwidget.h +++ b/include/lrpreviewreportwidget.h @@ -12,6 +12,7 @@ class PreviewReportWidget; class PreviewReportWidgetPrivate; class ReportEnginePrivate; +class ReportEngine; class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget { @@ -20,7 +21,7 @@ class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget friend class PreviewReportWindow; friend class PreviewReportWidgetPrivate; public: - explicit PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent = 0); + explicit PreviewReportWidget(ReportEngine *report, QWidget *parent = 0); ~PreviewReportWidget(); public slots: void refreshPages(); diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 9bd87b5..cbeb76b 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -63,11 +63,15 @@ class DataSourceManager; class ReportEnginePrivate; class PageDesignIntf; class PageItemDesignIntf; +class ReportDesignWidget; +class PreviewReportWidget; typedef QList< QSharedPointer > ReportPages; class LIMEREPORT_EXPORT ReportEngine : public QObject{ Q_OBJECT + friend class ReportDesignWidget; + friend class PreviewReportWidget; public: static void setSettings(QSettings *value){m_settings=value;} public: diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index dcddb74..53f289a 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -60,14 +60,15 @@ PageItemDesignIntf::Ptr PreviewReportWidgetPrivate::currentPage() else return PageItemDesignIntf::Ptr(0); } -PreviewReportWidget::PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent) : +PreviewReportWidget::PreviewReportWidget(ReportEngine *report, QWidget *parent) : QWidget(parent), ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this)) { ui->setupUi(this); - d_ptr->m_previewPage = report->createPreviewPage(); + d_ptr->m_report = report->d_ptr; + d_ptr->m_previewPage = d_ptr->m_report->createPreviewPage(); d_ptr->m_previewPage->setItemMode( LimeReport::PreviewMode ); - d_ptr->m_report = report; + ui->errorsView->setVisible(false); connect(ui->graphicsView->verticalScrollBar(),SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int))); diff --git a/limereport/lrpreviewreportwidget.h b/limereport/lrpreviewreportwidget.h index 4e35ea6..e33f75f 100644 --- a/limereport/lrpreviewreportwidget.h +++ b/limereport/lrpreviewreportwidget.h @@ -12,6 +12,7 @@ class PreviewReportWidget; class PreviewReportWidgetPrivate; class ReportEnginePrivate; +class ReportEngine; class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget { @@ -20,7 +21,7 @@ class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget friend class PreviewReportWindow; friend class PreviewReportWidgetPrivate; public: - explicit PreviewReportWidget(ReportEnginePrivate *report, QWidget *parent = 0); + explicit PreviewReportWidget(ReportEngine *report, QWidget *parent = 0); ~PreviewReportWidget(); public slots: void refreshPages(); diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index b000547..02ee7ad 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -34,6 +34,8 @@ #include "lrreportengine_p.h" #include "lrpreviewreportwidget.h" #include "lrpreviewreportwidget_p.h" +#include "items/editors/lrfonteditorwidget.h" +#include "items/editors/lrtextalignmenteditorwidget.h" #include #include @@ -43,7 +45,7 @@ namespace LimeReport{ -PreviewReportWindow::PreviewReportWindow(ReportEnginePrivate *report,QWidget *parent, QSettings *settings, Qt::WindowFlags flags) : +PreviewReportWindow::PreviewReportWindow(ReportEngine *report, QWidget *parent, QSettings *settings, Qt::WindowFlags flags) : QMainWindow(parent,flags), ui(new Ui::PreviewReportWindow), m_settings(settings), m_ownedSettings(false) { diff --git a/limereport/lrpreviewreportwindow.h b/limereport/lrpreviewreportwindow.h index 92b2829..e61bf76 100644 --- a/limereport/lrpreviewreportwindow.h +++ b/limereport/lrpreviewreportwindow.h @@ -34,15 +34,10 @@ #include #include #include +#include +#include -#include "lrpagedesignintf.h" -#include "lrreportrender.h" -#include "serializators/lrstorageintf.h" #include "serializators/lrxmlreader.h" -#include "lrpreviewreportwidget.h" - -#include "items/editors/lrfonteditorwidget.h" -#include "items/editors/lrtextalignmenteditorwidget.h" namespace LimeReport { @@ -50,11 +45,19 @@ namespace Ui { class PreviewReportWindow; } +class PreviewReportWidget; +class FontEditorWidget; +class TextAlignmentEditorWidget; +class ReportEngine; +class PageItemDesignIntf; +typedef QList< QSharedPointer > ReportPages; + + class PreviewReportWindow : public QMainWindow { Q_OBJECT public: - explicit PreviewReportWindow(ReportEnginePrivate *report, QWidget *parent = 0, QSettings* settings=0, Qt::WindowFlags flags=0); + explicit PreviewReportWindow(ReportEngine *report, QWidget *parent = 0, QSettings* settings=0, Qt::WindowFlags flags=0); ~PreviewReportWindow(); void setReportReader(ItemsReaderIntf::Ptr reader); void setPages(ReportPages pages); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 6a6ff0c..30c5137 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -48,7 +48,7 @@ namespace LimeReport { // ReportDesignIntf -ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow *mainWindow, QWidget *parent) : +ReportDesignWidget::ReportDesignWidget(ReportEngine *report, QMainWindow *mainWindow, QWidget *parent) : QWidget(parent), m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false) { m_tabWidget = new QTabWidget(this); @@ -63,7 +63,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow m_report->appendPage("page1"); } else { - m_report=report; + m_report=report->d_ptr; if (!m_report->pageCount()) m_report->appendPage("page1"); } @@ -74,7 +74,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow connect(m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slotCurrentTabChanged(int))); //m_instance=this; - m_scriptEditor->setPlainText(report->scriptContext()->initScript()); + m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); m_zoomer = new GraphicsViewZoomer(activeView()); #ifdef Q_OS_WIN m_defaultFont = QFont("Arial",10); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 28a1998..46bfbda 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -150,7 +150,7 @@ protected: void createTabs(); private: bool eventFilter(QObject *target, QEvent *event); - ReportDesignWidget(ReportEnginePrivate* report,QMainWindow *mainWindow,QWidget *parent = 0); + ReportDesignWidget(ReportEngine* report,QMainWindow *mainWindow,QWidget *parent = 0); private: ReportEnginePrivate* m_report; QGraphicsView *m_view; diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 358aa6b..82dba6a 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -62,7 +62,7 @@ namespace LimeReport{ ReportDesignWindow* ReportDesignWindow::m_instance=0; -ReportDesignWindow::ReportDesignWindow(ReportEnginePrivate *report, QWidget *parent, QSettings* settings) : +ReportDesignWindow::ReportDesignWindow(ReportEngine *report, QWidget *parent, QSettings* settings) : QMainWindow(parent), m_textAttibutesIsChanging(false), m_settings(settings), m_ownedSettings(false), m_progressDialog(0), m_showProgressDialog(true) { initReportEditor(report); @@ -437,7 +437,7 @@ void ReportDesignWindow::createMainMenu() m_recentFilesMenu->setDisabled(m_recentFiles.isEmpty()); } -void ReportDesignWindow::initReportEditor(ReportEnginePrivate* report) +void ReportDesignWindow::initReportEditor(ReportEngine* report) { m_reportDesignWidget=new ReportDesignWidget(report,this,this); setCentralWidget(m_reportDesignWidget); diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 147f47f..94d5670 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -59,7 +59,7 @@ class ReportDesignWindow : public QMainWindow { Q_OBJECT public: - explicit ReportDesignWindow(ReportEnginePrivate* report, QWidget *parent = 0, QSettings* settings=0); + explicit ReportDesignWindow(ReportEngine *report, QWidget *parent = 0, QSettings* settings=0); ~ReportDesignWindow(); static ReportDesignWindow* instance(){return m_instance;} @@ -134,7 +134,7 @@ private: void createItemsActions(); void createObjectInspector(); void createObjectsBrowser(); - void initReportEditor(ReportEnginePrivate* report); + void initReportEditor(ReportEngine *report); void createDataWindow(); void createScriptWindow(); void updateRedoUndo(); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 6f9c6e0..3bb60d1 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -371,7 +371,8 @@ void ReportEnginePrivate::previewReport(PreviewHints hints) ReportPages pages = renderToPages(); dataManager()->setDesignTime(true); if (pages.count()>0){ - PreviewReportWindow* w = new PreviewReportWindow(this,0,settings()); + Q_Q(ReportEngine); + PreviewReportWindow* w = new PreviewReportWindow(q,0,settings()); w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint| Qt::WindowMinMaxButtonsHint); w->setAttribute(Qt::WA_DeleteOnClose,true); w->setWindowModality(Qt::ApplicationModal); @@ -405,7 +406,8 @@ void ReportEnginePrivate::previewReport(PreviewHints hints) PreviewReportWidget* ReportEnginePrivate::createPreviewWidget(QWidget* parent){ - PreviewReportWidget* widget = new PreviewReportWidget(this, parent); + Q_Q(ReportEngine); + PreviewReportWidget* widget = new PreviewReportWidget(q, parent); try{ dataManager()->setDesignTime(false); ReportPages pages = renderToPages(); @@ -478,7 +480,8 @@ PageDesignIntf* ReportEngine::createPreviewScene(QObject* parent){ void ReportEnginePrivate::designReport() { if (!m_designerWindow) { - m_designerWindow = new LimeReport::ReportDesignWindow(this,QApplication::activeWindow(),settings()); + Q_Q(ReportEngine); + m_designerWindow = new LimeReport::ReportDesignWindow(q,QApplication::activeWindow(),settings()); m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); m_designerWindow->setWindowIcon(QIcon(":report/images/logo32")); m_designerWindow->setShowProgressDialog(m_showProgressDialog); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 9bd87b5..cbeb76b 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -63,11 +63,15 @@ class DataSourceManager; class ReportEnginePrivate; class PageDesignIntf; class PageItemDesignIntf; +class ReportDesignWidget; +class PreviewReportWidget; typedef QList< QSharedPointer > ReportPages; class LIMEREPORT_EXPORT ReportEngine : public QObject{ Q_OBJECT + friend class ReportDesignWidget; + friend class PreviewReportWidget; public: static void setSettings(QSettings *value){m_settings=value;} public: From cd2e748a9bbe110ac4ceda2a9c924d2791d42d46 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 7 Apr 2017 21:01:51 +0300 Subject: [PATCH 019/347] QtDesigner integration has been added QtDesigner intergration has been added --- common.pri | 2 + .../3rdparty/designer/pluginmanager_p.h | 109 ++++++++++ .../designer/qdesigner_integration_p.h | 126 +++++++++++ .../3rdparty/designer/shared_global_p.h | 72 +++++++ .../designerintegrationv2/README.txt | 10 + .../designerintegration.pri | 11 + .../designerintegrationv2/formresizer.cpp | 198 ++++++++++++++++++ .../designerintegrationv2/formresizer.h | 99 +++++++++ .../designerintegrationv2/sizehandlerect.cpp | 188 +++++++++++++++++ .../designerintegrationv2/sizehandlerect.h | 82 ++++++++ .../designerintegrationv2/widgethost.cpp | 111 ++++++++++ .../designerintegrationv2/widgethost.h | 80 +++++++ .../widgethostconstants.h | 41 ++++ .../3rdparty/qtcreator/namespace_global.h | 48 +++++ limereport/dialogdesigner/dialogdesigner.pri | 17 ++ .../dialogdesigner/lrdialogdesigner.cpp | 171 +++++++++++++++ limereport/dialogdesigner/lrdialogdesigner.h | 48 +++++ limereport/limereport.pri | 34 +-- limereport/lrreportdesignwidget.cpp | 59 +++++- limereport/lrreportdesignwidget.h | 22 +- limereport/lrreportdesignwindow.cpp | 138 +++++++++++- limereport/lrreportdesignwindow.h | 17 +- limereport/lrreportrender.cpp | 2 +- limereport/lrscriptenginemanager.h | 12 +- limereport/scriptbrowser/lrscriptbrowser.cpp | 2 +- 25 files changed, 1662 insertions(+), 37 deletions(-) create mode 100644 limereport/dialogdesigner/3rdparty/designer/pluginmanager_p.h create mode 100644 limereport/dialogdesigner/3rdparty/designer/qdesigner_integration_p.h create mode 100644 limereport/dialogdesigner/3rdparty/designer/shared_global_p.h create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/README.txt create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/designerintegration.pri create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/formresizer.cpp create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/formresizer.h create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.cpp create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.h create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethost.cpp create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethost.h create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethostconstants.h create mode 100644 limereport/dialogdesigner/3rdparty/qtcreator/namespace_global.h create mode 100644 limereport/dialogdesigner/dialogdesigner.pri create mode 100644 limereport/dialogdesigner/lrdialogdesigner.cpp create mode 100644 limereport/dialogdesigner/lrdialogdesigner.h diff --git a/common.pri b/common.pri index 7d148ef..f9e80f3 100644 --- a/common.pri +++ b/common.pri @@ -1,6 +1,8 @@ CONFIG += build_translations CONFIG += zint CONFIG += qjsengine +CONFIG += dialogdesigner + greaterThan(QT_MAJOR_VERSION, 4) { QT += uitools } diff --git a/limereport/dialogdesigner/3rdparty/designer/pluginmanager_p.h b/limereport/dialogdesigner/3rdparty/designer/pluginmanager_p.h new file mode 100644 index 0000000..1706182 --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/designer/pluginmanager_p.h @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information +** to ensure GNU General Public Licensing requirements will be met: +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. In addition, as a special +** exception, Nokia gives you certain additional rights. These rights +** are described in the Nokia Qt GPL Exception version 1.3, included in +** the file GPL_EXCEPTION.txt in this package. +** +** Qt for Windows(R) Licensees +** As a special exception, Nokia, as the sole copyright holder for Qt +** Designer, grants users of the Qt/Eclipse Integration plug-in the +** right for the Qt/Eclipse Integration to link to functionality +** provided by Qt Designer and its related libraries. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef PLUGINMANAGER_H +#define PLUGINMANAGER_H + +#include "shared_global_p.h" + +#include +#include + +QT_BEGIN_NAMESPACE + +class QDesignerFormEditorInterface; +class QDesignerCustomWidgetInterface; +class QDesignerPluginManagerPrivate; + +class QDESIGNER_SHARED_EXPORT QDesignerPluginManager: public QObject +{ + Q_OBJECT +public: + explicit QDesignerPluginManager(QDesignerFormEditorInterface *core); + virtual ~QDesignerPluginManager(); + + QDesignerFormEditorInterface *core() const; + + QObject *instance(const QString &plugin) const; + + QStringList registeredPlugins() const; + + QStringList findPlugins(const QString &path); + + QStringList pluginPaths() const; + void setPluginPaths(const QStringList &plugin_paths); + + QStringList disabledPlugins() const; + void setDisabledPlugins(const QStringList &disabled_plugins); + + QStringList failedPlugins() const; + QString failureReason(const QString &pluginName) const; + + QList instances() const; + QList registeredCustomWidgets() const; + + bool registerNewPlugins(); + +public slots: + bool syncSettings(); + void ensureInitialized(); + +private: + void updateRegisteredPlugins(); + void registerPath(const QString &path); + void registerPlugin(const QString &plugin); + +private: + static QStringList defaultPluginPaths(); + + QDesignerPluginManagerPrivate *m_d; +}; + +QT_END_NAMESPACE + +#endif // PLUGINMANAGER_H diff --git a/limereport/dialogdesigner/3rdparty/designer/qdesigner_integration_p.h b/limereport/dialogdesigner/3rdparty/designer/qdesigner_integration_p.h new file mode 100644 index 0000000..f59c001 --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/designer/qdesigner_integration_p.h @@ -0,0 +1,126 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information +** to ensure GNU General Public Licensing requirements will be met: +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. In addition, as a special +** exception, Nokia gives you certain additional rights. These rights +** are described in the Nokia Qt GPL Exception version 1.3, included in +** the file GPL_EXCEPTION.txt in this package. +** +** Qt for Windows(R) Licensees +** As a special exception, Nokia, as the sole copyright holder for Qt +** Designer, grants users of the Qt/Eclipse Integration plug-in the +** right for the Qt/Eclipse Integration to link to functionality +** provided by Qt Designer and its related libraries. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef QDESIGNER_INTEGRATION_H +#define QDESIGNER_INTEGRATION_H + +#include "shared_global_p.h" +#include + +#include + +QT_BEGIN_NAMESPACE + +class QDesignerFormEditorInterface; +class QDesignerFormWindowInterface; +class QDesignerResourceBrowserInterface; + +class QVariant; +class QWidget; + +namespace qdesigner_internal { + +struct Selection; +class QDesignerIntegrationPrivate; + +class QDESIGNER_SHARED_EXPORT QDesignerIntegration: public QDesignerIntegrationInterface +{ + Q_OBJECT +public: + explicit QDesignerIntegration(QDesignerFormEditorInterface *core, QObject *parent = 0); + virtual ~QDesignerIntegration(); + + static void requestHelp(const QDesignerFormEditorInterface *core, const QString &manual, const QString &document); + + virtual QWidget *containerWindow(QWidget *widget) const; + + // Load plugins into widget database and factory. + static void initializePlugins(QDesignerFormEditorInterface *formEditor); + void emitObjectNameChanged(QDesignerFormWindowInterface *formWindow, QObject *object, const QString &newName, const QString &oldName); + + // Create a resource browser specific to integration. Language integration takes precedence + virtual QDesignerResourceBrowserInterface *createResourceBrowser(QWidget *parent = 0); + +signals: + void propertyChanged(QDesignerFormWindowInterface *formWindow, const QString &name, const QVariant &value); + void objectNameChanged(QDesignerFormWindowInterface *formWindow, QObject *object, const QString &newName, const QString &oldName); + void helpRequested(const QString &manual, const QString &document); + +public slots: + virtual void updateProperty(const QString &name, const QVariant &value, bool enableSubPropertyHandling); + // Additional signals of designer property editor + virtual void updatePropertyComment(const QString &name, const QString &value); + virtual void resetProperty(const QString &name); + virtual void addDynamicProperty(const QString &name, const QVariant &value); + virtual void removeDynamicProperty(const QString &name); + + + virtual void updateActiveFormWindow(QDesignerFormWindowInterface *formWindow); + virtual void setupFormWindow(QDesignerFormWindowInterface *formWindow); + virtual void updateSelection(); + virtual void updateGeometry(); + virtual void activateWidget(QWidget *widget); + + void updateCustomWidgetPlugins(); + +private slots: + void updatePropertyPrivate(const QString &name, const QVariant &value); + +private: + void initialize(); + void getSelection(Selection &s); + QObject *propertyEditorObject(); + + QDesignerIntegrationPrivate *m_d; +}; + +} // namespace qdesigner_internal + +QT_END_NAMESPACE + +#endif // QDESIGNER_INTEGRATION_H diff --git a/limereport/dialogdesigner/3rdparty/designer/shared_global_p.h b/limereport/dialogdesigner/3rdparty/designer/shared_global_p.h new file mode 100644 index 0000000..3b9ff24 --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/designer/shared_global_p.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies). +** Contact: Qt Software Information (qt-info@nokia.com) +** +** This file is part of the Qt Designer of the Qt Toolkit. +** +** Commercial Usage +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information +** to ensure GNU General Public Licensing requirements will be met: +** http://www.fsf.org/licensing/licenses/info/GPLv2.html and +** http://www.gnu.org/copyleft/gpl.html. In addition, as a special +** exception, Nokia gives you certain additional rights. These rights +** are described in the Nokia Qt GPL Exception version 1.3, included in +** the file GPL_EXCEPTION.txt in this package. +** +** Qt for Windows(R) Licensees +** As a special exception, Nokia, as the sole copyright holder for Qt +** Designer, grants users of the Qt/Eclipse Integration plug-in the +** right for the Qt/Eclipse Integration to link to functionality +** provided by Qt Designer and its related libraries. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +****************************************************************************/ + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists for the convenience +// of Qt Designer. This header +// file may change from version to version without notice, or even be removed. +// +// We mean it. +// + +#ifndef SHARED_GLOBAL_H +#define SHARED_GLOBAL_H + +#include + +#ifdef QT_DESIGNER_STATIC +#define QDESIGNER_SHARED_EXTERN +#define QDESIGNER_SHARED_IMPORT +#else +#define QDESIGNER_SHARED_EXTERN Q_DECL_EXPORT +#define QDESIGNER_SHARED_IMPORT Q_DECL_IMPORT +#endif + +#ifndef QT_NO_SHARED_EXPORT +# ifdef QDESIGNER_SHARED_LIBRARY +# define QDESIGNER_SHARED_EXPORT QDESIGNER_SHARED_EXTERN +# else +# define QDESIGNER_SHARED_EXPORT QDESIGNER_SHARED_IMPORT +# endif +#else +# define QDESIGNER_SHARED_EXPORT +#endif + +#endif // SHARED_GLOBAL_H diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/README.txt b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/README.txt new file mode 100644 index 0000000..f5351ea --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/README.txt @@ -0,0 +1,10 @@ +This is a new Designer integration, started on 28.02.2008. + +The reason for it is the introduction of layout caching +in Qt 4.4, which unearthed a lot of mainwindow-size related +bugs in Designer and all integrations. + +The goal of it is to have a closed layout chain from +integration top level to form window. + +Friedemann diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/designerintegration.pri b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/designerintegration.pri new file mode 100644 index 0000000..f3a02f6 --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/designerintegration.pri @@ -0,0 +1,11 @@ +INCLUDEPATH *= $$PWD $$PWD/.. + +SOURCES += $$PWD/widgethost.cpp \ + $$PWD/sizehandlerect.cpp \ + $$PWD/formresizer.cpp + +HEADERS += $$PWD/widgethost.h \ + $$PWD/sizehandlerect.h \ + $$PWD/formresizer.h \ + $$PWD/widgethostconstants.h \ + $$PWD/../namespace_global.h diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/formresizer.cpp b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/formresizer.cpp new file mode 100644 index 0000000..e0d88ed --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/formresizer.cpp @@ -0,0 +1,198 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ + +#include "formresizer.h" +#include "sizehandlerect.h" +#include "widgethostconstants.h" + +#include + +#include + +#include +#include +#include +#include +#include + +enum { debugFormResizer = 0 }; + +using namespace SharedTools::Internal; + +FormResizer::FormResizer(QWidget *parent) : + QWidget(parent), + m_frame(new QFrame), + m_formWindow(0) +{ + // Make the resize grip of a mainwindow form find us as resizable window. + setWindowFlags(windowFlags() | Qt::SubWindow); + setBackgroundRole(QPalette::Base); + + QVBoxLayout *handleLayout = new QVBoxLayout(this); + handleLayout->setMargin(SELECTION_MARGIN); + handleLayout->addWidget(m_frame); + + m_frame->setFrameStyle(QFrame::Panel | QFrame::Raised); + QVBoxLayout *layout = new QVBoxLayout(m_frame); + layout->setMargin(0); + // handles + m_handles.reserve(SizeHandleRect::Left); + for (int i = SizeHandleRect::LeftTop; i <= SizeHandleRect::Left; ++i) { + SizeHandleRect *shr = new SizeHandleRect(this, static_cast(i), this); + connect(shr, SIGNAL(mouseButtonReleased(QRect,QRect)), this, SIGNAL(formWindowSizeChanged(QRect,QRect))); + m_handles.push_back(shr); + } + setState(SelectionHandleActive); + updateGeometry(); +} + +void FormResizer::updateGeometry() +{ + const QRect &geom = m_frame->geometry(); + + if (debugFormResizer) + qDebug() << "FormResizer::updateGeometry() " << size() << " frame " << geom; + + const int w = SELECTION_HANDLE_SIZE; + const int h = SELECTION_HANDLE_SIZE; + + const Handles::iterator hend = m_handles.end(); + for (Handles::iterator it = m_handles.begin(); it != hend; ++it) { + SizeHandleRect *hndl = *it;; + switch (hndl->dir()) { + case SizeHandleRect::LeftTop: + hndl->move(geom.x() - w / 2, geom.y() - h / 2); + break; + case SizeHandleRect::Top: + hndl->move(geom.x() + geom.width() / 2 - w / 2, geom.y() - h / 2); + break; + case SizeHandleRect::RightTop: + hndl->move(geom.x() + geom.width() - w / 2, geom.y() - h / 2); + break; + case SizeHandleRect::Right: + hndl->move(geom.x() + geom.width() - w / 2, geom.y() + geom.height() / 2 - h / 2); + break; + case SizeHandleRect::RightBottom: + hndl->move(geom.x() + geom.width() - w / 2, geom.y() + geom.height() - h / 2); + break; + case SizeHandleRect::Bottom: + hndl->move(geom.x() + geom.width() / 2 - w / 2, geom.y() + geom.height() - h / 2); + break; + case SizeHandleRect::LeftBottom: + hndl->move(geom.x() - w / 2, geom.y() + geom.height() - h / 2); + break; + case SizeHandleRect::Left: + hndl->move(geom.x() - w / 2, geom.y() + geom.height() / 2 - h / 2); + break; + default: + break; + } + } +} + +void FormResizer::update() +{ + const Handles::iterator hend = m_handles.end(); + for (Handles::iterator it = m_handles.begin(); it != hend; ++it) { + (*it)->update(); + } +} + +void FormResizer::setState(SelectionHandleState st) +{ + if (debugFormResizer) + qDebug() << "FormResizer::setState " << st; + + const Handles::iterator hend = m_handles.end(); + for (Handles::iterator it = m_handles.begin(); it != hend; ++it) + (*it)->setState(st); +} + +void FormResizer::setFormWindow(QDesignerFormWindowInterface *fw) +{ + if (debugFormResizer) + qDebug() << "FormResizer::setFormWindow " << fw; + QVBoxLayout *layout = qobject_cast(m_frame->layout()); + Q_ASSERT(layout); + if (layout->count()) + delete layout->takeAt(0); + m_formWindow = fw; + + if (m_formWindow) + layout->addWidget(m_formWindow); + mainContainerChanged(); + connect(fw, SIGNAL(mainContainerChanged(QWidget*)), this, SLOT(mainContainerChanged())); +} + +void FormResizer::resizeEvent(QResizeEvent *event) +{ + if (debugFormResizer) + qDebug() << ">FormResizer::resizeEvent" << event->size(); + updateGeometry(); + QWidget::resizeEvent(event); + if (debugFormResizer) + qDebug() << "lineWidth(); + const QMargins frameMargins = m_frame->contentsMargins(); + const int margin = 2* SELECTION_MARGIN; + QSize size = QSize( margin, margin ); + size += QSize( qMax( frameMargins.left(), lineWidth ), qMax( frameMargins.top(), lineWidth ) ); + size += QSize( qMax( frameMargins.right(), lineWidth ), qMax( frameMargins.bottom(), lineWidth ) ); + return size; +} + +QWidget *FormResizer::mainContainer() +{ + if (m_formWindow) + return m_formWindow->mainContainer(); + return 0; +} + +void FormResizer::mainContainerChanged() +{ + const QSize maxWidgetSize = QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + if (const QWidget *mc = mainContainer()) { + // Set Maximum size which is not handled via a hint (as opposed to minimum size) + const QSize maxWidgetSize = QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); + const QSize formMaxSize = mc->maximumSize(); + QSize newMaxSize = maxWidgetSize; + if (formMaxSize != maxWidgetSize) + newMaxSize = formMaxSize + decorationSize(); + if (debugFormResizer) + qDebug() << "FormResizer::mainContainerChanged" << mc << " Size " << mc->size()<< newMaxSize; + setMaximumSize(newMaxSize); + resize(decorationSize() + mc->size()); + } else { + setMaximumSize(maxWidgetSize); + } +} diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/formresizer.h b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/formresizer.h new file mode 100644 index 0000000..c7bd689 --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/formresizer.h @@ -0,0 +1,99 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ +#ifndef FORMRESIZER_H +#define FORMRESIZER_H + +#include "namespace_global.h" + +#include "widgethostconstants.h" + +#include +#include + +QT_FORWARD_DECLARE_CLASS(QDesignerFormWindowInterface) +QT_FORWARD_DECLARE_CLASS(QFrame) + +namespace SharedTools { +namespace Internal { + +class SizeHandleRect; + +/* A window to embed a form window interface as follows: + * + * Widget + * | + * +---+----+ + * | | + * | | + * Handles QVBoxLayout [margin: SELECTION_MARGIN] + * | + * Frame [margin: lineWidth] + * | + * QVBoxLayout + * | + * QDesignerFormWindowInterface + * + * Can be embedded into a QScrollArea. */ + +class FormResizer : public QWidget +{ + Q_OBJECT +public: + + FormResizer(QWidget *parent = 0); + + void updateGeometry(); + void setState(SelectionHandleState st); + void update(); + + void setFormWindow(QDesignerFormWindowInterface *fw); + +signals: + void formWindowSizeChanged(const QRect &oldGeo, const QRect &newGeo); + +protected: + virtual void resizeEvent(QResizeEvent *event); + +private slots: + void mainContainerChanged(); + +private: + QSize decorationSize() const; + QWidget *mainContainer(); + + QFrame *m_frame; + typedef QVector Handles; + Handles m_handles; + QDesignerFormWindowInterface * m_formWindow; +}; + +} +} // namespace SharedTools + +#endif // FORMRESIZER_H diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.cpp b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.cpp new file mode 100644 index 0000000..4247769 --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.cpp @@ -0,0 +1,188 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ +#include "sizehandlerect.h" +#include "widgethostconstants.h" + +#include + +#include +#include +#include +#include + +enum { debugSizeHandle = 0 }; + +using namespace SharedTools::Internal; + +SizeHandleRect::SizeHandleRect(QWidget *parent, Direction d, QWidget *resizable) : + QWidget(parent), + m_dir(d), + m_resizable(resizable), + m_state(SelectionHandleOff) +{ + setBackgroundRole(QPalette::Text); + setAutoFillBackground(true); + + setFixedSize(SELECTION_HANDLE_SIZE, SELECTION_HANDLE_SIZE); + setMouseTracking(false); + updateCursor(); +} + +void SizeHandleRect::updateCursor() +{ + switch (m_dir) { + case Right: + case RightTop: + setCursor(Qt::SizeHorCursor); + return; + case RightBottom: + setCursor(Qt::SizeFDiagCursor); + return; + case LeftBottom: + case Bottom: + setCursor(Qt::SizeVerCursor); + return; + default: + break; + } + + setCursor(Qt::ArrowCursor); +} + +void SizeHandleRect::paintEvent(QPaintEvent *) +{ + switch (m_state) { + case SelectionHandleOff: + break; + case SelectionHandleInactive: { + QPainter p(this); + p.setPen(Qt::red); + p.drawRect(0, 0, width() - 1, height() - 1); + } + break; + case SelectionHandleActive: { + QPainter p(this); + p.setPen(Qt::blue); + p.drawRect(0, 0, width() - 1, height() - 1); + } + break; + } +} + +void SizeHandleRect::mousePressEvent(QMouseEvent *e) +{ + e->accept(); + + if (e->button() != Qt::LeftButton) + return; + + m_startSize = m_curSize = m_resizable->size(); + m_startPos = m_curPos = m_resizable->mapFromGlobal(e->globalPos()); + if (debugSizeHandle) + qDebug() << "SizeHandleRect::mousePressEvent" << m_startSize << m_startPos << m_curPos; + +} + +void SizeHandleRect::mouseMoveEvent(QMouseEvent *e) +{ + if (!(e->buttons() & Qt::LeftButton)) + return; + + // Try resize with delta against start position. + // We don't take little deltas in consecutive move events as this + // causes the handle and the mouse cursor to become out of sync + // once a min/maxSize limit is hit. When the cursor reenters the valid + // areas, it will now snap to it. + m_curPos = m_resizable->mapFromGlobal(e->globalPos()); + QSize delta = QSize(m_curPos.x() - m_startPos.x(), m_curPos.y() - m_startPos.y()); + switch (m_dir) { + case Right: + case RightTop: // Only width + delta.setHeight(0); + break; + case RightBottom: // All dimensions + break; + case LeftBottom: + case Bottom: // Only height + delta.setWidth(0); + break; + default: + delta = QSize(0, 0); + break; + } + if (delta != QSize(0, 0)) + tryResize(delta); +} + +void SizeHandleRect::mouseReleaseEvent(QMouseEvent *e) +{ + if (e->button() != Qt::LeftButton) + return; + + e->accept(); + if (m_startSize != m_curSize) { + const QRect startRect = QRect(0, 0, m_startPos.x(), m_startPos.y()); + const QRect newRect = QRect(0, 0, m_curPos.x(), m_curPos.y()); + if (debugSizeHandle) + qDebug() << "SizeHandleRect::mouseReleaseEvent" << startRect << newRect; + emit mouseButtonReleased(startRect, newRect); + } +} + +void SizeHandleRect::tryResize(const QSize &delta) +{ + // Try resize with delta against start position + QSize newSize = m_startSize + delta; + newSize = newSize.expandedTo(m_resizable->minimumSizeHint()); + newSize = newSize.expandedTo(m_resizable->minimumSize()); + newSize = newSize.boundedTo(m_resizable->maximumSize()); + if (newSize == m_resizable->size()) + return; + if (debugSizeHandle) + qDebug() << "SizeHandleRect::tryResize by (" << m_startSize << '+' << delta << ')' << newSize; + m_resizable->resize(newSize); + m_curSize = m_resizable->size(); +} + +void SizeHandleRect::setState(SelectionHandleState st) +{ + if (st == m_state) + return; + switch (st) { + case SelectionHandleOff: + hide(); + break; + case SelectionHandleInactive: + case SelectionHandleActive: + show(); + raise(); + break; + } + m_state = st; +} diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.h b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.h new file mode 100644 index 0000000..c916b00 --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/sizehandlerect.h @@ -0,0 +1,82 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ +#ifndef SIZEHANDLERECT_H +#define SIZEHANDLERECT_H + +#include "namespace_global.h" + +#include "widgethostconstants.h" + +#include +#include + +namespace SharedTools { +namespace Internal { + +class SizeHandleRect : public QWidget +{ + Q_OBJECT +public: + enum Direction { LeftTop, Top, RightTop, Right, RightBottom, Bottom, LeftBottom, Left }; + + SizeHandleRect(QWidget *parent, Direction d, QWidget *resizable); + + Direction dir() const { return m_dir; } + void updateCursor(); + void setState(SelectionHandleState st); + +signals: + + void mouseButtonReleased(const QRect &, const QRect &); + +protected: + void paintEvent(QPaintEvent *e); + void mousePressEvent(QMouseEvent *e); + void mouseMoveEvent(QMouseEvent *e); + void mouseReleaseEvent(QMouseEvent *e); + +private: + void tryResize(const QSize &delta); + +private: + const Direction m_dir; + QPoint m_startPos; + QPoint m_curPos; + QSize m_startSize; + QSize m_curSize; + QWidget *m_resizable; + SelectionHandleState m_state; +}; + +} +} // namespace SharedTools + + +#endif // SIZEHANDLERECT_H + diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethost.cpp b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethost.cpp new file mode 100644 index 0000000..b78eb4b --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethost.cpp @@ -0,0 +1,111 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ + +#include "widgethost.h" +#include "formresizer.h" +#include "widgethostconstants.h" + +#include +#include + +#include +#include +#include +#include +#include + +using namespace SharedTools; + +// ---------- WidgetHost +WidgetHost::WidgetHost(QWidget *parent, QDesignerFormWindowInterface *formWindow) : + QScrollArea(parent), + m_formWindow(0), + m_formResizer(new Internal::FormResizer) +{ + setWidget(m_formResizer); + // Re-set flag (gets cleared by QScrollArea): Make the resize grip of a mainwindow form find the resizer as resizable window. + m_formResizer->setWindowFlags(m_formResizer->windowFlags() | Qt::SubWindow); + setFormWindow(formWindow); +} + +WidgetHost::~WidgetHost() +{ + if (m_formWindow) + delete m_formWindow; +} + +void WidgetHost::setFormWindow(QDesignerFormWindowInterface *fw) +{ + m_formWindow = fw; + if (!fw) + return; + + m_formResizer->setFormWindow(fw); + + setBackgroundRole(QPalette::Base); + m_formWindow->setAutoFillBackground(true); + m_formWindow->setBackgroundRole(QPalette::Background); + + connect(m_formResizer, SIGNAL(formWindowSizeChanged(QRect, QRect)), + this, SLOT(fwSizeWasChanged(QRect, QRect))); + connect(m_formWindow, SIGNAL(destroyed(QObject*)), this, SLOT(formWindowDeleted(QObject*))); +} + +QSize WidgetHost::formWindowSize() const +{ + if (!m_formWindow || !m_formWindow->mainContainer()) + return QSize(); + return m_formWindow->mainContainer()->size(); +} + +void WidgetHost::fwSizeWasChanged(const QRect &, const QRect &) +{ + // newGeo is the mouse coordinates, thus moving the Right will actually emit wrong height + emit formWindowSizeChanged(formWindowSize().width(), formWindowSize().height()); +} + +void WidgetHost::formWindowDeleted(QObject *object) +{ + if (object == m_formWindow) m_formWindow = 0; +} + +void WidgetHost::updateFormWindowSelectionHandles(bool active) +{ + Internal::SelectionHandleState state = Internal::SelectionHandleOff; + const QDesignerFormWindowCursorInterface *cursor = m_formWindow->cursor(); + if (cursor->isWidgetSelected(m_formWindow->mainContainer())) + state = active ? Internal::SelectionHandleActive : Internal::SelectionHandleInactive; + + m_formResizer->setState(state); +} + +QWidget *WidgetHost::integrationContainer() const +{ + return m_formResizer; +} diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethost.h b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethost.h new file mode 100644 index 0000000..82b9fef --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethost.h @@ -0,0 +1,80 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ + +#ifndef WIDGETHOST_H +#define WIDGETHOST_H + +#include "namespace_global.h" + +#include + +QT_FORWARD_DECLARE_CLASS(QDesignerFormWindowInterface) + +namespace SharedTools { + +namespace Internal { + class FormResizer; +} + +/* A scroll area that embeds a Designer form window */ + +class WidgetHost : public QScrollArea +{ + Q_OBJECT +public: + WidgetHost(QWidget *parent = 0, QDesignerFormWindowInterface *formWindow = 0); + virtual ~WidgetHost(); + // Show handles if active and main container is selected. + void updateFormWindowSelectionHandles(bool active); + + inline QDesignerFormWindowInterface *formWindow() const { return m_formWindow; } + + QWidget *integrationContainer() const; + +protected: + void setFormWindow(QDesignerFormWindowInterface *fw); + +signals: + void formWindowSizeChanged(int, int); + +private slots: + void fwSizeWasChanged(const QRect &, const QRect &); + void formWindowDeleted(QObject* object); + +private: + QSize formWindowSize() const; + + QDesignerFormWindowInterface *m_formWindow; + Internal::FormResizer *m_formResizer; + QSize m_oldFakeWidgetSize; +}; + +} // namespace SharedTools + +#endif // WIDGETHOST_H diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethostconstants.h b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethostconstants.h new file mode 100644 index 0000000..b1f7fff --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/designerintegrationv2/widgethostconstants.h @@ -0,0 +1,41 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ + +#ifndef WIDGETHOST_CONSTANTS_H +#define WIDGETHOST_CONSTANTS_H + +namespace SharedTools { + namespace Internal { + enum { SELECTION_HANDLE_SIZE = 6, SELECTION_MARGIN = 10 }; + enum SelectionHandleState { SelectionHandleOff, SelectionHandleInactive, SelectionHandleActive }; + } +} + +#endif // WIDGETHOST_CONSTANTS_H + diff --git a/limereport/dialogdesigner/3rdparty/qtcreator/namespace_global.h b/limereport/dialogdesigner/3rdparty/qtcreator/namespace_global.h new file mode 100644 index 0000000..7b6ba3f --- /dev/null +++ b/limereport/dialogdesigner/3rdparty/qtcreator/namespace_global.h @@ -0,0 +1,48 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Qt Software Information (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at qt-sales@nokia.com. +** +**************************************************************************/ + +#ifndef NAMESPACE_GLOBAL_H +#define NAMESPACE_GLOBAL_H + +#include + +#if QT_VERSION < 0x040400 +# define QT_ADD_NAMESPACE(name) ::name +# define QT_USE_NAMESPACE +# define QT_BEGIN_NAMESPACE +# define QT_END_NAMESPACE +# define QT_BEGIN_INCLUDE_NAMESPACE +# define QT_END_INCLUDE_NAMESPACE +# define QT_BEGIN_MOC_NAMESPACE +# define QT_END_MOC_NAMESPACE +# define QT_FORWARD_DECLARE_CLASS(name) class name; +# define QT_MANGLE_NAMESPACE(name) name +#endif + +#endif // NAMESPACE_GLOBAL_H diff --git a/limereport/dialogdesigner/dialogdesigner.pri b/limereport/dialogdesigner/dialogdesigner.pri new file mode 100644 index 0000000..37a1ea1 --- /dev/null +++ b/limereport/dialogdesigner/dialogdesigner.pri @@ -0,0 +1,17 @@ +include(../../common.pri) +include($$PWD/3rdparty/qtcreator/designerintegrationv2/designerintegration.pri) +INCLUDEPATH *= $$PWD/3rdparty/designer +greaterThan(QT_MAJOR_VERSION, 4) { + contains(QT,uitools){ + DEFINES += HAVE_QTDESIGNER_INTEGRATION + } +} +lessThan(QT_MAJOR_VERSION, 5){ + contains(CONFIG,uitools){ + DEFINES += HAVE_QTDESIGNER_INTEGRATION + } +} +QT += designer designercomponents-private + +SOURCES += $$PWD/lrdialogdesigner.cpp +HEADERS += $$PWD/lrdialogdesigner.h diff --git a/limereport/dialogdesigner/lrdialogdesigner.cpp b/limereport/dialogdesigner/lrdialogdesigner.cpp new file mode 100644 index 0000000..cc5d258 --- /dev/null +++ b/limereport/dialogdesigner/lrdialogdesigner.cpp @@ -0,0 +1,171 @@ +#include "lrdialogdesigner.h" + +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include "pluginmanager_p.h" +//#include + +#include "widgethost.h" + +namespace LimeReport{ + +DialogDesigner::DialogDesigner(QObject *parent) : QObject(parent) +{ + QDesignerComponents::initializeResources(); + m_formEditor = QDesignerComponents::createFormEditor(this); + QDesignerComponents::initializePlugins(m_formEditor); + QDesignerComponents::createTaskMenu(m_formEditor, this); + + foreach ( QObject* o, QPluginLoader::staticInstances() << m_formEditor->pluginManager()->instances() ) + { + if ( QDesignerFormEditorPluginInterface* fep = qobject_cast( o ) ) + { + // initialize plugin if needed + if ( !fep->isInitialized() ) + fep->initialize( m_formEditor ); + + // set action chackable +// fep->action()->setCheckable( true ); + +// // add action mode to group +// aModes->addAction( fep->action() ); + } + } + + + m_widgetBox = QDesignerComponents::createWidgetBox(m_formEditor, 0); + m_widgetBox->setWindowTitle(tr("Widget Box")); + m_widgetBox->setObjectName(QLatin1String("WidgetBox")); + m_formEditor->setWidgetBox(m_widgetBox); + m_formEditor->setTopLevel(m_widgetBox); + m_designerToolWindows.append(m_widgetBox); + connect(m_widgetBox, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + + m_objectInspector = QDesignerComponents::createObjectInspector(m_formEditor, 0); + m_objectInspector->setWindowTitle(tr("Object Inspector")); + m_objectInspector->setObjectName(QLatin1String("ObjectInspector")); + m_formEditor->setObjectInspector(m_objectInspector); + m_designerToolWindows.append(m_objectInspector); + connect(m_objectInspector, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + + m_propertyEditor = QDesignerComponents::createPropertyEditor(m_formEditor, 0); + m_propertyEditor->setWindowTitle(tr("Property Editor")); + m_propertyEditor->setObjectName(QLatin1String("PropertyEditor")); + m_formEditor->setPropertyEditor(m_propertyEditor); + m_designerToolWindows.append(m_propertyEditor); + connect(m_propertyEditor, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + + m_signalSlotEditor = QDesignerComponents::createSignalSlotEditor(m_formEditor, 0); + m_signalSlotEditor->setWindowTitle(tr("Signals && Slots Editor")); + m_signalSlotEditor->setObjectName(QLatin1String("SignalsAndSlotsEditor")); + + m_designerToolWindows.append(m_signalSlotEditor); + connect(m_signalSlotEditor, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + + m_resourcesEditor = QDesignerComponents::createResourceEditor(m_formEditor, 0); + m_resourcesEditor->setWindowTitle(tr("Resource Editor")); + m_resourcesEditor->setObjectName(QLatin1String("ResourceEditor")); + m_designerToolWindows.append(m_resourcesEditor); + connect(m_resourcesEditor, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + + m_actionEditor = QDesignerComponents::createActionEditor(m_formEditor, 0); + m_actionEditor->setWindowTitle(tr("Action Editor")); + m_actionEditor->setObjectName("ActionEditor"); + m_formEditor->setActionEditor(m_actionEditor); + m_designerToolWindows.append(m_actionEditor); + connect(m_formEditor, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + + m_designerIntegration = new QDesignerIntegration(m_formEditor,this); + m_formEditor->setIntegration(m_designerIntegration); + +} + +DialogDesigner::~DialogDesigner() +{ + for (int i = 0; iformWindowManager()->createFormWindow(0, Qt::Window); + wnd->setContents(content); + m_formEditor->formWindowManager()->setActiveFormWindow(wnd); + m_formEditor->objectInspector()->setFormWindow(wnd); + wnd->editWidgets(); + + SharedTools::WidgetHost *placeholder = new SharedTools::WidgetHost(0,wnd); + placeholder->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); + placeholder->setFocusProxy( wnd ); + + return placeholder; + +} + +void DialogDesigner::setActiveEditor(QWidget *widget) +{ + SharedTools::WidgetHost* wh = dynamic_cast(widget); + if (wh){ + m_formEditor->formWindowManager()->setActiveFormWindow(wh->formWindow()); + } + +} + +QWidget* DialogDesigner::widgetBox() const +{ + return m_widgetBox; +} + +QWidget* DialogDesigner::actionEditor() const +{ + return m_actionEditor; +} + +QWidget* DialogDesigner::propertyEditor() const +{ + return m_propertyEditor; +} + +QWidget* DialogDesigner::objectInspector() const +{ + return m_objectInspector; +} + +QWidget *DialogDesigner::signalSlotEditor() const +{ + return m_signalSlotEditor; +} + +QWidget *DialogDesigner::resourcesEditor() const +{ + return m_resourcesEditor; +} + +void DialogDesigner::objectDestroyed(QObject *object) +{ + for ( int i = 0; i +#include + +class QDesignerFormEditorInterface; +class QDesignerFormWindowInterface; +class QDesignerIntegrationInterface; +class QDesignerWidgetBoxInterface; +class QDesignerActionEditorInterface; +class QDesignerPropertyEditorInterface; +class QDesignerObjectInspectorInterface; +class QDesignerFormWindowManagerInterface; + +namespace LimeReport{ + +class DialogDesigner : public QObject +{ + Q_OBJECT +public: + explicit DialogDesigner(QObject *parent = 0); + ~DialogDesigner(); + QWidget* createFormEditor(const QString& content); + void setActiveEditor(QWidget* widget); + QWidget* widgetBox() const; + QWidget* actionEditor() const; + QWidget* propertyEditor() const; + QWidget* objectInspector() const; + QWidget* signalSlotEditor() const; + QWidget* resourcesEditor() const; +private slots: + void objectDestroyed(QObject* object); +private: + QDesignerFormEditorInterface* m_formEditor; + QDesignerIntegrationInterface* m_designerIntegration; + QDesignerWidgetBoxInterface* m_widgetBox; + QDesignerActionEditorInterface* m_actionEditor; + QDesignerPropertyEditorInterface* m_propertyEditor; + QDesignerObjectInspectorInterface* m_objectInspector; + QWidget* m_signalSlotEditor; + QWidget* m_resourcesEditor; + QVector m_designerToolWindows; +}; + +} // namespace LimeReport + +#endif // DIALOGDESIGNER_H diff --git a/limereport/limereport.pri b/limereport/limereport.pri index 7f621e9..41b3e3f 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -1,5 +1,9 @@ include(../common.pri) +contains(CONFIG,dialogdesigner){ + include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) +} + DEFINES += INSPECT_BASEDESIGN INCLUDEPATH += \ @@ -19,6 +23,15 @@ SOURCES += \ $$REPORT_PATH/bands/lrgroupbands.cpp \ $$REPORT_PATH/bands/lrsubdetailband.cpp \ $$REPORT_PATH/bands/lrtearoffband.cpp \ + $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ + $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ + $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ + $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ + $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ + $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ + $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ + $$REPORT_PATH/serializators/lrxmlreader.cpp \ + $$REPORT_PATH/serializators/lrxmlwriter.cpp \ $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ @@ -44,16 +57,8 @@ SOURCES += \ $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ - $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ - $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ - $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ - $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ - $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ - $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ - $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ - $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ - $$REPORT_PATH/serializators/lrxmlreader.cpp \ - $$REPORT_PATH/serializators/lrxmlwriter.cpp \ + $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ $$REPORT_PATH/items/lralignpropitem.cpp \ $$REPORT_PATH/items/lrhorizontallayout.cpp \ @@ -88,8 +93,8 @@ SOURCES += \ $$REPORT_PATH/lrgroupfunctions.cpp \ $$REPORT_PATH/lrsimplecrypt.cpp \ $$REPORT_PATH/lraboutdialog.cpp \ - $$REPORT_PATH/lrsettingdialog.cpp \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp + $$REPORT_PATH/lrsettingdialog.cpp + contains(CONFIG, zint){ SOURCES += $$REPORT_PATH/items/lrbarcodeitem.cpp @@ -145,6 +150,7 @@ HEADERS += \ $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ $$REPORT_PATH/items/editors/lritemeditorwidget.h \ $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ @@ -187,8 +193,8 @@ HEADERS += \ $$REPORT_PATH/lraboutdialog.h \ $$REPORT_PATH/lrcallbackdatasourceintf.h \ $$REPORT_PATH/lrsettingdialog.h \ - $$REPORT_PATH/lrpreviewreportwidget_p.h \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h + $$REPORT_PATH/lrpreviewreportwidget_p.h + contains(CONFIG,zint){ HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 6a6ff0c..6acb22a 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -33,6 +33,7 @@ #include "lrreportengine_p.h" #include "lrbasedesignintf.h" #include "lrsettingdialog.h" +#include "dialogdesigner/lrdialogdesigner.h" #include #include @@ -46,10 +47,8 @@ namespace LimeReport { -// ReportDesignIntf - ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow *mainWindow, QWidget *parent) : - QWidget(parent), m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false) + QWidget(parent), m_dialogDesigner(new DialogDesigner(this)), m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false) { m_tabWidget = new QTabWidget(this); m_tabWidget->setTabPosition(QTabWidget::South); @@ -73,7 +72,6 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow connect(m_report,SIGNAL(cleared()),this,SIGNAL(cleared())); connect(m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slotCurrentTabChanged(int))); - //m_instance=this; m_scriptEditor->setPlainText(report->scriptContext()->initScript()); m_zoomer = new GraphicsViewZoomer(activeView()); #ifdef Q_OS_WIN @@ -81,6 +79,39 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow #endif } +DialogDesigner *ReportDesignWidget::dialogDesigner() const +{ + return m_dialogDesigner; +} + +QWidget *ReportDesignWidget::toolWindow(ReportDesignWidget::ToolWindowType windowType) +{ + switch (windowType) { + case WidgetBox: + return dialogDesigner()->widgetBox(); + case PropertyEditor: + return dialogDesigner()->propertyEditor(); + case ObjectInspector: + return dialogDesigner()->objectInspector(); + case ActionEditor: + return dialogDesigner()->actionEditor(); + case ResourceEditor: + return dialogDesigner()->resourcesEditor(); + case SignalSlotEditor: + return dialogDesigner()->signalSlotEditor(); + default: + return 0; + } +} + +ReportDesignWidget::EditorTabType ReportDesignWidget::activeTabType() +{ + QString tabType = m_tabWidget->tabWhatsThis(m_tabWidget->currentIndex()); + if ( tabType.compare("dialog") == 0) return Dialog; + if ( tabType.compare("script") == 0) return Script; + return Page; +} + bool ReportDesignWidget::useMagnet() const { return m_useMagnet; @@ -139,6 +170,7 @@ void ReportDesignWidget::loadState(QSettings* settings) void ReportDesignWidget::createTabs(){ + int pageIndex = -1; for (int i = 0; ipageCount();++i){ QGraphicsView* view = new QGraphicsView(qobject_cast(this)); view->setBackgroundBrush(QBrush(Qt::gray)); @@ -152,11 +184,22 @@ void ReportDesignWidget::createTabs(){ view->centerOn(0,0); view->scale(0.5,0.5); connectPage(m_report->pageAt(i)); - m_tabWidget->addTab(view,QIcon(),tr("Page")+QString::number(i+1)); + pageIndex = m_tabWidget->addTab(view,QIcon(),m_report->pageAt(i)->pageItem()->objectName()); + m_tabWidget->setTabWhatsThis(pageIndex, "page"); } +#ifdef HAVE_QTDESIGNER_INTEGRATION + QWidget* dialogEditor; + foreach(DialogDescriber::Ptr dialogDesc, m_report->scriptContext()->dialogDescribers()){ + dialogEditor = m_dialogDesigner->createFormEditor(dialogDesc->description()); + pageIndex = m_tabWidget->addTab(dialogEditor,QIcon(),dialogDesc->name()); + m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); + } +#endif m_scriptEditor = new QTextEdit(this); - m_tabWidget->addTab(m_scriptEditor,QIcon(),tr("Script")); + pageIndex = m_tabWidget->addTab(m_scriptEditor,QIcon(),tr("Script")); + m_tabWidget->setTabWhatsThis(pageIndex,"script"); m_tabWidget->setCurrentIndex(0); + } ReportDesignWidget::~ReportDesignWidget() @@ -189,7 +232,6 @@ void ReportDesignWidget::connectPage(PageDesignIntf *page) connect(page, SIGNAL(pageUpdateFinished(LimeReport::PageDesignIntf*)), this, SIGNAL(activePageUpdated(LimeReport::PageDesignIntf*))); - //activeView()->centerOn(0,0); emit activePageChanged(); } @@ -605,6 +647,9 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) } m_zoomer->setView(view); } + if (activeTabType() == Dialog){ + m_dialogDesigner->setActiveEditor(m_tabWidget->widget(index)); + } emit activePageChanged(); } diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 28a1998..d624617 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -48,6 +48,7 @@ namespace LimeReport { class ReportEnginePrivate; class DataBrowser; class ReportDesignWindow; +class DialogDesigner; class ReportDesignWidget : public QWidget { @@ -55,8 +56,20 @@ class ReportDesignWidget : public QWidget Q_PROPERTY(QObject* datasourcesManager READ dataManager()) friend class ReportDesignWindow; public: + enum ToolWindowType{ + WidgetBox = 1, + ObjectInspector = 2, + ActionEditor = 3, + SignalSlotEditor = 4, + PropertyEditor = 5, + ResourceEditor = 6 + }; + enum EditorTabType{ + Page, + Dialog, + Script + }; ~ReportDesignWidget(); -// static ReportDesignWidget* instance(){return m_instance;} void createStartPage(); void clear(); DataSourceManager* dataManager(); @@ -76,7 +89,6 @@ public: QList selectedItems(); QStringList datasourcesNames(); void scale( qreal sx, qreal sy); -// void setDatabrowser(DataBrowser* databrowser); ReportEnginePrivate* report(){return m_report;} QString reportFileName(); bool isNeedToSave(); @@ -88,7 +100,9 @@ public: bool useGrid(){ return m_useGrid;} bool useMagnet() const; void setUseMagnet(bool useMagnet); - + DialogDesigner *dialogDesigner() const; + QWidget* toolWindow(ToolWindowType windowType); + EditorTabType activeTabType(); public slots: void saveToFile(const QString&); bool save(); @@ -155,6 +169,7 @@ private: ReportEnginePrivate* m_report; QGraphicsView *m_view; QTextEdit* m_scriptEditor; + DialogDesigner* m_dialogDesigner; QMainWindow *m_mainWindow; QTabWidget* m_tabWidget; GraphicsViewZoomer* m_zoomer; @@ -163,7 +178,6 @@ private: int m_horizontalGridStep; bool m_useGrid; bool m_useMagnet; -// static ReportDesignWidget* m_instance; }; } diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 358aa6b..8bdb62d 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -73,6 +73,14 @@ ReportDesignWindow::ReportDesignWindow(ReportEnginePrivate *report, QWidget *par createDataWindow(); createScriptWindow(); createObjectsBrowser(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + createDialogWidgetBox(); + createDialogPropertyEditor(); + createDialogObjectInspector(); + createDialogActionEditor(); + createDialogResourceEditor(); + createDialogSignalSlotEditor(); +#endif m_instance=this; m_statusBar=new QStatusBar(this); m_lblReportName = new QLabel(report->reportFileName(),this); @@ -82,6 +90,8 @@ ReportDesignWindow::ReportDesignWindow(ReportEnginePrivate *report, QWidget *par restoreSetting(); m_hideLeftPanel->setChecked(isDockAreaVisible(Qt::LeftDockWidgetArea)); m_hideRightPanel->setChecked(isDockAreaVisible(Qt::RightDockWidgetArea)); + m_editorTabType = ReportDesignWidget::Page; + showDefaultEditors(); } ReportDesignWindow::~ReportDesignWindow() @@ -475,7 +485,6 @@ void ReportDesignWindow::createObjectInspector() m_objectInspector->setModel(m_propertyModel); m_objectInspector->setAlternatingRowColors(true); m_objectInspector->setRootIsDecorated(!m_propertyModel->subclassesAsLevel()); - QDockWidget *objectDoc = new QDockWidget(this); QWidget* w = new QWidget(objectDoc); QVBoxLayout* l = new QVBoxLayout(w); @@ -485,6 +494,7 @@ void ReportDesignWindow::createObjectInspector() objectDoc->setWindowTitle(tr("Object Inspector")); objectDoc->setWidget(w); objectDoc->setObjectName("objectInspector"); + m_pageEditors.append(objectDoc); addDockWidget(Qt::LeftDockWidgetArea,objectDoc); } @@ -497,9 +507,73 @@ void ReportDesignWindow::createObjectsBrowser() doc->setObjectName("structureDoc"); addDockWidget(Qt::RightDockWidgetArea,doc); m_objectsBrowser->setMainWindow(this); + m_pageEditors.append(doc); m_objectsBrowser->setReportEditor(m_reportDesignWidget); } +#ifdef HAVE_QTDESIGNER_INTEGRATION + +void ReportDesignWindow::createDialogWidgetBox() +{ + QDockWidget *doc = new QDockWidget(this); + doc->setWindowTitle(tr("Widget Box")); + doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::WidgetBox)); + doc->setObjectName("WidgetBox"); + addDockWidget(Qt::LeftDockWidgetArea,doc); + m_dialogEditors.append(doc); +} + +void ReportDesignWindow::createDialogPropertyEditor() +{ + QDockWidget *doc = new QDockWidget(this); + doc->setWindowTitle(tr("Property Editor")); + doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::PropertyEditor)); + doc->setObjectName("PropertyEditor"); + addDockWidget(Qt::RightDockWidgetArea,doc); + m_dialogEditors.append(doc); +} + +void ReportDesignWindow::createDialogObjectInspector() +{ + QDockWidget *doc = new QDockWidget(this); + doc->setWindowTitle(tr("Object Inspector")); + doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::ObjectInspector)); + doc->setObjectName("ObjectInspector"); + addDockWidget(Qt::RightDockWidgetArea,doc); + m_dialogEditors.append(doc); +} + +void ReportDesignWindow::createDialogActionEditor() +{ + QDockWidget *doc = new QDockWidget(this); + doc->setWindowTitle(tr("Action Editor")); + doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::ActionEditor)); + doc->setObjectName("ActionEditor"); + addDockWidget(Qt::BottomDockWidgetArea,doc); + m_dialogEditors.append(doc); +} + +void ReportDesignWindow::createDialogResourceEditor() +{ + QDockWidget *doc = new QDockWidget(this); + doc->setWindowTitle(tr("Resource Editor")); + doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::ResourceEditor)); + doc->setObjectName("ResourceEditor"); + addDockWidget(Qt::BottomDockWidgetArea,doc); + m_dialogEditors.append(doc); +} + +void ReportDesignWindow::createDialogSignalSlotEditor() +{ + QDockWidget *doc = new QDockWidget(this); + doc->setWindowTitle(tr("SignalSlot Editor")); + doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::SignalSlotEditor)); + doc->setObjectName("SignalSlotEditor"); + addDockWidget(Qt::BottomDockWidgetArea,doc); + m_dialogEditors.append(doc); +} + +#endif void ReportDesignWindow::createDataWindow() { QDockWidget *dataDoc = new QDockWidget(this); @@ -510,6 +584,7 @@ void ReportDesignWindow::createDataWindow() addDockWidget(Qt::LeftDockWidgetArea,dataDoc); m_dataBrowser->setSettings(settings()); m_dataBrowser->setMainWindow(this); + m_pageEditors.append(dataDoc); m_dataBrowser->setReportEditor(m_reportDesignWidget); } @@ -522,6 +597,7 @@ void ReportDesignWindow::createScriptWindow() dataDoc->setObjectName("scriptDoc"); addDockWidget(Qt::LeftDockWidgetArea,dataDoc); m_scriptBrowser->setReportEditor(m_reportDesignWidget); + m_pageEditors.append(dataDoc); #ifdef HAVE_UI_LOADER m_scriptBrowser->updateDialogsTree(); #endif @@ -544,6 +620,8 @@ void ReportDesignWindow::startNewReport() m_newPageFooter->setEnabled(true); m_newReportHeader->setEnabled(true); m_newReportFooter->setEnabled(true); + m_editorTabType = ReportDesignWidget::Page; + showDefaultEditors(); } void ReportDesignWindow::writePosition() @@ -557,7 +635,16 @@ void ReportDesignWindow::writePosition() void ReportDesignWindow::writeState() { settings()->beginGroup("DesignerWindow"); - settings()->setValue("State",saveState()); + switch (m_editorTabType) { + case ReportDesignWidget::Page: + settings()->setValue("PageEditorsState", saveState()); + settings()->setValue("DialogEditorsState", m_dialogEditorsState); + break; + default: + settings()->setValue("DialogEditorsState", saveState()); + settings()->setValue("PageEditorsState", m_pageEditorsState); + break; + } settings()->setValue("InspectorFirsColumnWidth",m_objectInspector->columnWidth(0)); settings()->endGroup(); settings()->beginGroup("RecentFiles"); @@ -650,9 +737,15 @@ void ReportDesignWindow::restoreSetting() resize(screenWidth*0.8, screenHeight*0.8); move(x, y); } - v = settings()->value("State"); + v = settings()->value("PageEditorsState"); if (v.isValid()){ + m_pageEditorsState = v.toByteArray(); restoreState(v.toByteArray()); + m_editorTabType = ReportDesignWidget::Page; + } + v = settings()->value("DialogEditorsState"); + if (v.isValid()){ + m_dialogEditorsState = v.toByteArray(); } v = settings()->value("InspectorFirsColumnWidth"); if (v.isValid()){ @@ -954,6 +1047,8 @@ void ReportDesignWindow::slotLoadReport() unsetCursor(); setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); addRecentFile(fileName); + m_editorTabType = ReportDesignWidget::Page; + showDefaultEditors(); } } @@ -1120,11 +1215,48 @@ void ReportDesignWindow::updateAvaibleBands(){ } } + +void ReportDesignWindow::showDefaultEditors(){ + foreach (QDockWidget* w, m_pageEditors) { + w->setVisible(m_editorTabType != ReportDesignWidget::Dialog); + } + foreach (QDockWidget* w, m_dialogEditors) { + w->setVisible(m_editorTabType == ReportDesignWidget::Dialog); + } +} + void ReportDesignWindow::slotActivePageChanged() { m_propertyModel->setObject(0); updateRedoUndo(); updateAvaibleBands(); + + switch (m_editorTabType) { + case ReportDesignWidget::Dialog: + m_dialogEditorsState = saveState(); + break; + default: + m_pageEditorsState = saveState(); + break; + } + + m_editorTabType = m_reportDesignWidget->activeTabType(); + + switch (m_editorTabType) { + case ReportDesignWidget::Dialog: + if (!m_dialogEditorsState.isEmpty()) + restoreState(m_dialogEditorsState); + else + showDefaultEditors(); + break; + default: + if (!m_pageEditors.isEmpty()) + restoreState(m_pageEditorsState); + else + showDefaultEditors(); + break; + } + } void ReportDesignWindow::renderStarted() diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 147f47f..ec37638 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -126,6 +126,7 @@ protected: void hideDockWidgets(Qt::DockWidgetArea area, bool value); bool isDockAreaVisible(Qt::DockWidgetArea area); private: + void initReportEditor(ReportEnginePrivate* report); void createActions(); void createBandsButton(); void createMainMenu(); @@ -134,9 +135,16 @@ private: void createItemsActions(); void createObjectInspector(); void createObjectsBrowser(); - void initReportEditor(ReportEnginePrivate* report); void createDataWindow(); void createScriptWindow(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + void createDialogWidgetBox(); + void createDialogPropertyEditor(); + void createDialogObjectInspector(); + void createDialogActionEditor(); + void createDialogResourceEditor(); + void createDialogSignalSlotEditor(); +#endif void updateRedoUndo(); void updateAvaibleBands(); void startNewReport(); @@ -146,6 +154,7 @@ private: void removeNotExistedRecentFiles(); void removeNotExistedRecentFilesFromMenu(const QString& fileName); void addRecentFile(const QString& fileName); + void showDefaultEditors(); private: static ReportDesignWindow* m_instance; QStatusBar* m_statusBar; @@ -235,6 +244,12 @@ private: QProgressDialog* m_progressDialog; bool m_showProgressDialog; QMap m_recentFiles; + QVector m_pageEditors; + QVector m_dialogEditors; + ReportDesignWidget::EditorTabType m_editorTabType; + QByteArray m_pageEditorsState; + QByteArray m_dialogEditorsState; + }; class ObjectNameValidator : public ValidatorIntf{ diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 2476930..4c23026 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -341,7 +341,7 @@ void registerChildObjects(ScriptEngineType* se, ScriptValueType* sv){ void ReportRender::initDialogs(){ if (m_scriptEngineContext){ ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); - foreach(DialogDescriber::Ptr dialog, m_scriptEngineContext->dialogsDescriber()){ + foreach(DialogDescriber::Ptr dialog, m_scriptEngineContext->dialogDescribers()){ ScriptValueType sv = se->newQObject(m_scriptEngineContext->getDialog(dialog->name())); #ifdef USE_QJSENGINE registerChildObjects(se,&sv); diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 726013b..36ecda2 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -144,21 +144,21 @@ public: #endif explicit ScriptEngineContext(QObject* parent=0):QObject(parent){} #ifdef HAVE_UI_LOADER - void addDialog(const QString& name, const QByteArray &description); + void addDialog(const QString& name, const QByteArray &description); bool previewDialog(const QString& dialogName); bool containsDialog(const QString& dialogName); - const QVector& dialogsDescriber(){return m_dialogs;} + const QVector& dialogDescribers(){return m_dialogs;} void deleteDialog(const QString& dialogName); QDialog *getDialog(const QString &dialogName); #endif - void clear(); + void clear(); QString initScript() const; - void setInitScript(const QString& initScript); + void setInitScript(const QString& initScript); protected: QObject* createElement(const QString& collectionName,const QString& elementType); - int elementsCount(const QString& collectionName); + int elementsCount(const QString& collectionName); QObject* elementAt(const QString& collectionName,int index); - void collectionLoadFinished(const QString &collectionName); + void collectionLoadFinished(const QString &collectionName); #ifdef HAVE_UI_LOADER QDialog *createDialog(DialogDescriber *cont); QDialog *findDialog(const QString &dialogName); diff --git a/limereport/scriptbrowser/lrscriptbrowser.cpp b/limereport/scriptbrowser/lrscriptbrowser.cpp index 8e6dcc3..1bd052d 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.cpp +++ b/limereport/scriptbrowser/lrscriptbrowser.cpp @@ -117,7 +117,7 @@ void ScriptBrowser::updateDialogsTree() { ui->twDialogs->clear(); ScriptEngineContext* sc = reportEditor()->scriptContext(); - foreach(DialogDescriber::Ptr dc, sc->dialogsDescriber()){ + foreach(DialogDescriber::Ptr dc, sc->dialogDescribers()){ QTreeWidgetItem* dialogItem = new QTreeWidgetItem(ui->twDialogs,QStringList(dc->name())); dialogItem->setIcon(0,QIcon(":/scriptbrowser/images/dialog")); fillDialog(dialogItem,dc->description()); From 0692435b26861b4eb9dcffa8c6703a76bfa64abd Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 11 Apr 2017 11:23:34 +0300 Subject: [PATCH 020/347] Dialog designers tool bar integration has been added --- limereport/dialogdesigner/dialogdesigner.pri | 3 + limereport/dialogdesigner/dialogdesigner.qrc | 9 ++ .../dialogdesigner/images/buddytool.png | Bin 0 -> 997 bytes limereport/dialogdesigner/images/editform.png | Bin 0 -> 349 bytes .../dialogdesigner/images/signalslottool.png | Bin 0 -> 1128 bytes .../dialogdesigner/images/tabordertool.png | Bin 0 -> 1205 bytes .../dialogdesigner/images/widgettool.png | Bin 0 -> 1039 bytes .../dialogdesigner/lrdialogdesigner.cpp | 99 +++++++++++++++--- limereport/dialogdesigner/lrdialogdesigner.h | 14 ++- limereport/lrreportdesignwidget.cpp | 48 ++++++++- limereport/lrreportdesignwidget.h | 12 ++- limereport/lrreportdesignwindow.cpp | 27 ++++- limereport/lrreportdesignwindow.h | 7 ++ limereport/lrscriptenginemanager.cpp | 11 ++ limereport/lrscriptenginemanager.h | 3 +- 15 files changed, 209 insertions(+), 24 deletions(-) create mode 100644 limereport/dialogdesigner/dialogdesigner.qrc create mode 100644 limereport/dialogdesigner/images/buddytool.png create mode 100644 limereport/dialogdesigner/images/editform.png create mode 100644 limereport/dialogdesigner/images/signalslottool.png create mode 100644 limereport/dialogdesigner/images/tabordertool.png create mode 100644 limereport/dialogdesigner/images/widgettool.png diff --git a/limereport/dialogdesigner/dialogdesigner.pri b/limereport/dialogdesigner/dialogdesigner.pri index 37a1ea1..df76e68 100644 --- a/limereport/dialogdesigner/dialogdesigner.pri +++ b/limereport/dialogdesigner/dialogdesigner.pri @@ -15,3 +15,6 @@ QT += designer designercomponents-private SOURCES += $$PWD/lrdialogdesigner.cpp HEADERS += $$PWD/lrdialogdesigner.h + +RESOURCES += \ + $$PWD/dialogdesigner.qrc diff --git a/limereport/dialogdesigner/dialogdesigner.qrc b/limereport/dialogdesigner/dialogdesigner.qrc new file mode 100644 index 0000000..67c62fb --- /dev/null +++ b/limereport/dialogdesigner/dialogdesigner.qrc @@ -0,0 +1,9 @@ + + + images/buddytool.png + images/editform.png + images/signalslottool.png + images/tabordertool.png + images/widgettool.png + + diff --git a/limereport/dialogdesigner/images/buddytool.png b/limereport/dialogdesigner/images/buddytool.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd968bbf5fb473cecf134e7c1dc0793e869445d GIT binary patch literal 997 zcmVM&= zaCqIkO%%LMHg(=I2^41ZLv&gA?K~%)&gM4jz?bvB&pGG&dCq&D!z&VrM8Qnb|5Pvl zku6b^8jVKu_V!|Ma1c734t;%n{C!|xfNNxA1pWQ}d~A6R^`xq*Dsqw91q=-hp{1n- zjg5^^sZ?ldYePdr16ONnD>^zl_;XWJ6Q4&hnoCMZNN@}o9v+6OUImRt!_CxcHSfuY zVx;cwZXPEPy*D>Evt;U#n3(7opx5iUnYK%d_V#wZn07%i%9x(Jy1IB=t=8~3#Ylo6 zI0vAt$gHfa3<`w;6%`fe>FMF7v>O`l?Cj({#mStKNlr>~44^}#tt*vEgocJfB9UOH z$8PusMME5!jv&&hOs0$_Wg8$5CEh4!K;8)YMd78QZpdA@__JsLlf# zl)(GPD|#j4keoZukdl((9H6eQj+f$ci5@wf3B1i`eHQQ{19)-{i%T*WpM~juBqUK+ zAr6Uf449ahfL5!u)ICWO#n!ZxvTPaPT_K>1!Q!(R{46;SNPS_Bae*n#6Yib|vDMwL z*)CvaW(HKMq~!|~5-kTB6+l_6wdB6Q1s6~=$1+H|7q)v#zKEmq3he+sfGSC^H}LEY z1_Of6$=D8_0_AZly6y+WZ^G(kj@txNmNyvSlPw4b%+Ah2H>3ld1(}oh4m2ge%Y;9= z;SUJb<`xKpnq)pUAr=6ckByCCa&i)*qoW8tp983F;#*}r7W4K1Nv^Qh%!v$=?fVym z1Lo%DU^I>`$;e@Miz^Wpn+wy6IDEZi-`oO8c7-X|&kDi;^YimO^O=tyK?goPJ&mcU zDcn=MVvrmxSpI4X$-;etN!TmDD3bN<8#4Y{7QEK$zbC} z0jSOmLqXhr4iP!?!=XB-QZyCrgE?!9ZSyNEUVH$xx5FWX?ONHvdKYA^XfiD_Jq&*2)<;3$TJbVi36-_g=il`qIOwd2kX!xaZ$hv=M+6gnf=5 z%-sAu5Vb{-5Keg6z6ToxtcEP8Gx3I*Up#5&CjSdyHKgEj;JW7j1y~JP&z$rdsg5DL TV66v=00000NkvXXu0mjfW+uQs literal 0 HcmV?d00001 diff --git a/limereport/dialogdesigner/images/editform.png b/limereport/dialogdesigner/images/editform.png new file mode 100644 index 0000000000000000000000000000000000000000..452fcd8878b7c7999b5317aae0cb90c28df36a36 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAH3s;Exc>kD-yxy_$O8fhL*Fs( z!rTArAO26TYTokr|C4Y3r{DNL<@)~%ENYmvXLW(Yb#V6h5A=elF{r5}E)%Jgjs8 literal 0 HcmV?d00001 diff --git a/limereport/dialogdesigner/images/signalslottool.png b/limereport/dialogdesigner/images/signalslottool.png new file mode 100644 index 0000000000000000000000000000000000000000..e80fd1caa625d6fa6342bec58bc5619386b21b7c GIT binary patch literal 1128 zcmV-u1eg1XP)cij(J$Niew-Fe^V>79p}CBfF#Kb$!;@Xr6oIsZ9~ zbnN2g!X37hN<@?QD9@FMS-QHNbHDQdnYPE<4jlUQhdo-#v^F=Rb->(gnJ9`0f&hSY zI!&om!We_K7NwN$0KL7vbar-j0S^XflUsfE!c|7cMrmDlmAxQXj6O$|&=&2aAGZH}F|O#iK$G&W``#@;ZFV;UM7`~->d z0w|7RwAPCQuACb?`{J`Z*uQUw=S@$~as1>(B4!9eyt#;=#G!OVCX>Qi>*1Mf#=l<_ zaHF58@;t0sv62tp%hS@FUKKtqnVMZ{4BMcQ1miXq_pXi`WE|&%HU}MbU000q% zk~D$j_~4zFXm5RtTZ08Y`QikroFmidIQ-oo^!zo#XkikioHwri2p$UX4?E|Wn~e!1 zn@qBwmF>$J9GT(Z;op*JPIIMi80X;cTjL;p_Y1X{3|`a%^&l;EeAJca~;^EqDjO1raQ`Fbz*syU^0x&r6 zW>I7jarE`{a<4EASUjNmPn6W+5)nkmr&0my)~%(jwTX194jm}Uy$D$k`YrjzDWtf%a>_RX!^pwsMfIt4q2=Kgt9{qXmBY{%f3bP(3D5 uf*=5X8s)Qs!JF5X4Cvmyy`_t#srw(dSG7JJtV|{V0000}MF0#M1Cu_l5A*Z$SYBQhmX?;VxUe9(MHMfom^nUMU0s!!IeEUgC^f|E z^@4hL8Qf}VL2qv_1_uXWx7#HqJv}{exm>ud*1osYV zu~;xLFaU?cA+ULPcv!?4Q$WYslxFN9+N{03J-UHeIkSmVbES!HW^QzJR3_x!>2wOL zp$TKwxYZDCZEevFtX8WOQh;KdUJFu$rdpVJ?)3mV&!dfL(ACuyK1&KxM8g~f^pQ+V zOvs)llarGeA0Nla$cWV1Y_{kI9UUFg%p$(Q*w~l|vysAFb&dv+=g)e5gx%fU(G7mN zX2aW`Hz7W&K}|G)6W{%bxC0ktf5YlT?UmcueY8<>g=Z}yMpGUo&9n)RDXPJlpRG9d zm01Kh;qh-<;c}0m?8i3j{^Sa3e(S*XRtK8f-BLqS-g$jIgmKI_;MKeMheMiKOp~dp zDO@%W$Xjslne?F3F(Nf>J#P4XUdij}X~4frR0CeQhGwTUb237M{lzz7s4i<}w@N*)zU;u<+#C|qb8-4s5Q%9fG2;i2x9gFo z({So$P@qZJV0Ly^rsP+WE5DMADaL1Q33nN= znZl)&^>`^GZ=Li!5u=FSuak@1#vlr>1@X0YO>)P-I41^geG?GE2E3a3n@@wJjC|B| zuAyl-HnsLOlr;yD{cBKG*1xdtV=*}ReLx5s@D8u6tjMc#O)?hXXng<$SA)n85gAA3 zG^UIHNDmFTlCVK>NePTbBQi2FWPRw-?MTh4z;nr&G1-@0iR`K_l(ht9W&M_C_K3lW zO94R}g#IU&_9tha9Ne?Ncz9dFfxkD!?Zu|J)OEJqK`5Vd#)jN;T}VGtfz3PKz*9+w z0y|#G!s*`wf*8n;!C=^+xJU7TVyj}OB1w^~NKw3|NDaX_WoOEVD5|mHonsYpRg;YQ zwbV$?EXCQ@fN-b5M#X)KhZRpMo>e@r*riBNB!+mAxm|ld!UuVk>c^Ht&WCz8s*}L` zrV6~L2pdG0+^e`>@t|U};xWY*#p8-6LNMN{Zp=@-ZR!fwg?iY#L5WsVI7Ib-$w&7< Tg6EMl00000NkvXXu0mjf6WBk& literal 0 HcmV?d00001 diff --git a/limereport/dialogdesigner/images/widgettool.png b/limereport/dialogdesigner/images/widgettool.png new file mode 100644 index 0000000000000000000000000000000000000000..a52224e068c4ac63c6e1ed7c41025d1108e6caaa GIT binary patch literal 1039 zcmV+q1n~QbP)z8wB<%qK}Q^REM+ z&I^UY*xK3}!Z3vEx~SD^sMqTVf9Ltvs&)jhAdBpkOz$F5?sA@59=$lEdbV3qlS4v zp-7Q);0MT$-^9ek1kMaS!k6U;u^6Yq02NUc1LIu=PjT?f~B}@ZgzlFAmWt@qaBAKITLZ_X+fPJ_A8~#t7P?#&K&>iu3S8W|JF52MVZ~N&)rhwPKG=tq{Egu`L51UR9A^|4gOY00I?wLDFZex_Lj4k@8kH9eWsN+9+UoVG+w4kSKB?LXT51x z(Qbo{tMq*i&)!bAiGfZyv!Gk|d8cEF*tGaj6 #include #include +#include +#include #include "pluginmanager_p.h" //#include @@ -30,64 +32,70 @@ DialogDesigner::DialogDesigner(QObject *parent) : QObject(parent) QDesignerComponents::initializePlugins(m_formEditor); QDesignerComponents::createTaskMenu(m_formEditor, this); + m_editWidgetsAction = new QAction(tr("Edit Widgets")); + m_editWidgetsAction->setIcon(QIcon(":/images/images/widgettool.png")); + m_editWidgetsAction->setEnabled(false); + connect(m_editWidgetsAction, SIGNAL(triggered()), this, SLOT(slotEditWidgets())); + connect(m_formEditor->formWindowManager(), SIGNAL(activeFormWindowChanged(QDesignerFormWindowInterface*)), + this, SLOT(slotActiveFormWindowChanged(QDesignerFormWindowInterface*)) ); + + m_modes = new QActionGroup(this); + m_modes->setExclusive(true); + m_modes->addAction(m_editWidgetsAction); + foreach ( QObject* o, QPluginLoader::staticInstances() << m_formEditor->pluginManager()->instances() ) { if ( QDesignerFormEditorPluginInterface* fep = qobject_cast( o ) ) { - // initialize plugin if needed if ( !fep->isInitialized() ) fep->initialize( m_formEditor ); - - // set action chackable -// fep->action()->setCheckable( true ); - -// // add action mode to group -// aModes->addAction( fep->action() ); + fep->action()->setCheckable( true ); + fep->action()->setIcon(QIcon(iconPathByName(fep->action()->objectName()))); + m_modes->addAction(fep->action()); } } - m_widgetBox = QDesignerComponents::createWidgetBox(m_formEditor, 0); m_widgetBox->setWindowTitle(tr("Widget Box")); m_widgetBox->setObjectName(QLatin1String("WidgetBox")); m_formEditor->setWidgetBox(m_widgetBox); m_formEditor->setTopLevel(m_widgetBox); m_designerToolWindows.append(m_widgetBox); - connect(m_widgetBox, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + connect(m_widgetBox, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) ); m_objectInspector = QDesignerComponents::createObjectInspector(m_formEditor, 0); m_objectInspector->setWindowTitle(tr("Object Inspector")); m_objectInspector->setObjectName(QLatin1String("ObjectInspector")); m_formEditor->setObjectInspector(m_objectInspector); m_designerToolWindows.append(m_objectInspector); - connect(m_objectInspector, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + connect(m_objectInspector, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) ); m_propertyEditor = QDesignerComponents::createPropertyEditor(m_formEditor, 0); m_propertyEditor->setWindowTitle(tr("Property Editor")); m_propertyEditor->setObjectName(QLatin1String("PropertyEditor")); m_formEditor->setPropertyEditor(m_propertyEditor); m_designerToolWindows.append(m_propertyEditor); - connect(m_propertyEditor, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + connect(m_propertyEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) ); m_signalSlotEditor = QDesignerComponents::createSignalSlotEditor(m_formEditor, 0); m_signalSlotEditor->setWindowTitle(tr("Signals && Slots Editor")); m_signalSlotEditor->setObjectName(QLatin1String("SignalsAndSlotsEditor")); m_designerToolWindows.append(m_signalSlotEditor); - connect(m_signalSlotEditor, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + connect(m_signalSlotEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) ); m_resourcesEditor = QDesignerComponents::createResourceEditor(m_formEditor, 0); m_resourcesEditor->setWindowTitle(tr("Resource Editor")); m_resourcesEditor->setObjectName(QLatin1String("ResourceEditor")); m_designerToolWindows.append(m_resourcesEditor); - connect(m_resourcesEditor, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + connect(m_resourcesEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) ); m_actionEditor = QDesignerComponents::createActionEditor(m_formEditor, 0); m_actionEditor->setWindowTitle(tr("Action Editor")); m_actionEditor->setObjectName("ActionEditor"); m_formEditor->setActionEditor(m_actionEditor); m_designerToolWindows.append(m_actionEditor); - connect(m_formEditor, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed(QObject*)) ); + connect(m_formEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) ); m_designerIntegration = new QDesignerIntegration(m_formEditor,this); m_formEditor->setIntegration(m_designerIntegration); @@ -105,6 +113,28 @@ DialogDesigner::~DialogDesigner() delete m_formEditor; } +void DialogDesigner::initToolBar(QToolBar *tb) +{ + tb->setIconSize(QSize(16,16)); + tb->addAction(m_formEditor->formWindowManager()->actionCopy()); + tb->addAction(m_formEditor->formWindowManager()->actionPaste()); + tb->addAction(m_formEditor->formWindowManager()->actionCut()); + tb->addAction(m_formEditor->formWindowManager()->actionUndo()); + tb->addAction(m_formEditor->formWindowManager()->actionRedo()); + + tb->addActions(m_modes->actions()); + + tb->addAction(m_formEditor->formWindowManager()->actionHorizontalLayout()); + tb->addAction(m_formEditor->formWindowManager()->actionVerticalLayout()); + tb->addAction(m_formEditor->formWindowManager()->actionSplitHorizontal()); + tb->addAction(m_formEditor->formWindowManager()->actionSplitVertical()); + tb->addAction(m_formEditor->formWindowManager()->actionGridLayout()); + m_formEditor->formWindowManager()->actionFormLayout()->setIcon(QIcon(":/images/images/editform.png")); + tb->addAction(m_formEditor->formWindowManager()->actionFormLayout()); + tb->addAction(m_formEditor->formWindowManager()->actionBreakLayout()); + tb->addAction(m_formEditor->formWindowManager()->actionAdjustSize()); +} + QWidget *DialogDesigner::createFormEditor(const QString &content) { QDesignerFormWindowInterface* wnd = m_formEditor->formWindowManager()->createFormWindow(0, Qt::Window); @@ -113,12 +143,22 @@ QWidget *DialogDesigner::createFormEditor(const QString &content) m_formEditor->objectInspector()->setFormWindow(wnd); wnd->editWidgets(); + connect(wnd, SIGNAL(changed()), this, SIGNAL(dialogChanged())); + SharedTools::WidgetHost *placeholder = new SharedTools::WidgetHost(0,wnd); placeholder->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); placeholder->setFocusProxy( wnd ); - return placeholder; + return placeholder; +} +QByteArray DialogDesigner::getDialogDescription(QWidget *form) +{ + SharedTools::WidgetHost* wh = dynamic_cast(form); + if (wh){ + return wh->formWindow()->contents().toUtf8(); + } + return QByteArray(); } void DialogDesigner::setActiveEditor(QWidget *widget) @@ -127,7 +167,6 @@ void DialogDesigner::setActiveEditor(QWidget *widget) if (wh){ m_formEditor->formWindowManager()->setActiveFormWindow(wh->formWindow()); } - } QWidget* DialogDesigner::widgetBox() const @@ -160,7 +199,7 @@ QWidget *DialogDesigner::resourcesEditor() const return m_resourcesEditor; } -void DialogDesigner::objectDestroyed(QObject *object) +void DialogDesigner::slotObjectDestroyed(QObject *object) { for ( int i = 0; iformWindowManager()->formWindowCount(); ++i){ + m_formEditor->formWindowManager()->formWindow(i)->editWidgets(); + } +} + +void DialogDesigner::slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow) +{ + if (formWindow){ + m_editWidgetsAction->setEnabled(true); + m_activeWindowName = formWindow->objectName(); + } +} + +QString DialogDesigner::iconPathByName(const QString &name) +{ + if (name.compare("__qt_edit_signals_slots_action") == 0) + return ":/images/images/signalslottool.png"; + if (name.compare("__qt_edit_buddies_action") == 0) + return ":/images/images/buddytool.png"; + if (name.compare("_qt_edit_tab_order_action") == 0) + return ":/images/images/tabordertool.png"; + return ""; +} + } diff --git a/limereport/dialogdesigner/lrdialogdesigner.h b/limereport/dialogdesigner/lrdialogdesigner.h index 2620b71..bebc4dd 100644 --- a/limereport/dialogdesigner/lrdialogdesigner.h +++ b/limereport/dialogdesigner/lrdialogdesigner.h @@ -3,6 +3,7 @@ #include #include +#include class QDesignerFormEditorInterface; class QDesignerFormWindowInterface; @@ -21,7 +22,9 @@ class DialogDesigner : public QObject public: explicit DialogDesigner(QObject *parent = 0); ~DialogDesigner(); + void initToolBar(QToolBar* tb); QWidget* createFormEditor(const QString& content); + QByteArray getDialogDescription(QWidget* form); void setActiveEditor(QWidget* widget); QWidget* widgetBox() const; QWidget* actionEditor() const; @@ -29,8 +32,14 @@ public: QWidget* objectInspector() const; QWidget* signalSlotEditor() const; QWidget* resourcesEditor() const; +signals: + void dialogChanged(); private slots: - void objectDestroyed(QObject* object); + void slotObjectDestroyed(QObject* object); + void slotEditWidgets(); + void slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow); +private: + QString iconPathByName(const QString& name); private: QDesignerFormEditorInterface* m_formEditor; QDesignerIntegrationInterface* m_designerIntegration; @@ -41,6 +50,9 @@ private: QWidget* m_signalSlotEditor; QWidget* m_resourcesEditor; QVector m_designerToolWindows; + QAction* m_editWidgetsAction; + QActionGroup* m_modes; + QString m_activeWindowName; }; } // namespace LimeReport diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 6acb22a..97621ab 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -48,7 +48,11 @@ namespace LimeReport { ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow *mainWindow, QWidget *parent) : - QWidget(parent), m_dialogDesigner(new DialogDesigner(this)), m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false) + QWidget(parent), +#ifdef HAVE_QTDESIGNER_INTEGRATION + m_dialogDesigner(new DialogDesigner(this)), +#endif + m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false) { m_tabWidget = new QTabWidget(this); m_tabWidget->setTabPosition(QTabWidget::South); @@ -74,9 +78,14 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow m_scriptEditor->setPlainText(report->scriptContext()->initScript()); m_zoomer = new GraphicsViewZoomer(activeView()); + #ifdef Q_OS_WIN m_defaultFont = QFont("Arial",10); #endif + +#ifdef HAVE_QTDESIGNER_INTEGRATION + connect(m_dialogDesigner, SIGNAL(dialogChanged()), this, SLOT(slotDialogChanged())); +#endif } DialogDesigner *ReportDesignWidget::dialogDesigner() const @@ -112,6 +121,20 @@ ReportDesignWidget::EditorTabType ReportDesignWidget::activeTabType() return Page; } +void ReportDesignWidget::initDialogDesignerToolBar(QToolBar *toolBar) +{ + m_dialogDesigner->initToolBar(toolBar); +} + +void ReportDesignWidget::updateDialogs() +{ + for ( int i = 0; icount(); ++i ){ + if (m_tabWidget->tabWhatsThis(i).compare("dialog") == 0){ + m_report->scriptContext()->changeDialog(m_tabWidget->tabText(i), m_dialogDesigner->getDialogDescription(m_tabWidget->widget(i))); + } + } +} + bool ReportDesignWidget::useMagnet() const { return m_useMagnet; @@ -299,7 +322,12 @@ void ReportDesignWidget::slotItemSelected(BaseDesignIntf *item){ } void ReportDesignWidget::saveToFile(const QString &fileName){ + m_report->scriptContext()->setInitScript(m_scriptEditor->toPlainText()); +#ifdef HAVE_QTDESIGNER_INTEGRATION + updateDialogs(); +#endif + if (m_report->saveToFile(fileName)) { m_report->emitSaveFinished(); } @@ -308,6 +336,10 @@ void ReportDesignWidget::saveToFile(const QString &fileName){ bool ReportDesignWidget::save() { m_report->scriptContext()->setInitScript(m_scriptEditor->toPlainText()); +#ifdef HAVE_QTDESIGNER_INTEGRATION + updateDialogs(); +#endif + if (!m_report->reportFileName().isEmpty()){ if (m_report->saveToFile()){ m_report->emitSaveFinished(); @@ -499,12 +531,18 @@ void ReportDesignWidget::setBorders(const BaseDesignIntf::BorderLines& borders) void ReportDesignWidget::previewReport() { report()->scriptContext()->setInitScript(m_scriptEditor->toPlainText()); +#ifdef HAVE_QTDESIGNER_INTEGRATION + updateDialogs(); +#endif report()->previewReport(); } void ReportDesignWidget::printReport() { report()->scriptContext()->setInitScript(m_scriptEditor->toPlainText()); +#ifdef HAVE_QTDESIGNER_INTEGRATION + updateDialogs(); +#endif setCursor(Qt::WaitCursor); report()->printReport(); setCursor(Qt::ArrowCursor); @@ -653,6 +691,14 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) emit activePageChanged(); } +#ifdef HAVE_QTDESIGNER_INTEGRATION + +void ReportDesignWidget::slotDialogChanged() +{ +} + +#endif + bool ReportDesignWidget::eventFilter(QObject *target, QEvent *event) { if (event->type() == QEvent::Wheel){ diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index d624617..ee6a157 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -54,7 +54,6 @@ class ReportDesignWidget : public QWidget { Q_OBJECT Q_PROPERTY(QObject* datasourcesManager READ dataManager()) - friend class ReportDesignWindow; public: enum ToolWindowType{ WidgetBox = 1, @@ -69,6 +68,7 @@ public: Dialog, Script }; + ReportDesignWidget(ReportEnginePrivate* report,QMainWindow *mainWindow,QWidget *parent = 0); ~ReportDesignWidget(); void createStartPage(); void clear(); @@ -103,6 +103,10 @@ public: DialogDesigner *dialogDesigner() const; QWidget* toolWindow(ToolWindowType windowType); EditorTabType activeTabType(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + void initDialogDesignerToolBar(QToolBar* toolBar); + void updateDialogs(); +#endif public slots: void saveToFile(const QString&); bool save(); @@ -135,13 +139,16 @@ public slots: void printReport(); void addPage(); void deleteCurrentPage(); + void slotPagesLoadFinished(); private slots: void slotItemSelected(LimeReport::BaseDesignIntf *item); void slotSelectionChanged(); - void slotPagesLoadFinished(); void slotDatasourceCollectionLoaded(const QString&); void slotSceneRectChanged(QRectF); void slotCurrentTabChanged(int index); +#ifdef HAVE_QTDESIGNER_INTEGRATION + void slotDialogChanged(); +#endif signals: void insertModeStarted(); void itemInserted(LimeReport::PageDesignIntf*,QPointF,const QString&); @@ -164,7 +171,6 @@ protected: void createTabs(); private: bool eventFilter(QObject *target, QEvent *event); - ReportDesignWidget(ReportEnginePrivate* report,QMainWindow *mainWindow,QWidget *parent = 0); private: ReportEnginePrivate* m_report; QGraphicsView *m_view; diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 8bdb62d..febddfd 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -80,6 +80,7 @@ ReportDesignWindow::ReportDesignWindow(ReportEnginePrivate *report, QWidget *par createDialogActionEditor(); createDialogResourceEditor(); createDialogSignalSlotEditor(); + createDialogDesignerToolBar(); #endif m_instance=this; m_statusBar=new QStatusBar(this); @@ -87,11 +88,12 @@ ReportDesignWindow::ReportDesignWindow(ReportEnginePrivate *report, QWidget *par m_statusBar->insertWidget(0,m_lblReportName); setStatusBar(m_statusBar); setWindowTitle("Lime Report Designer"); + showDefaultEditors(); + showDefaultToolBars(); restoreSetting(); m_hideLeftPanel->setChecked(isDockAreaVisible(Qt::LeftDockWidgetArea)); m_hideRightPanel->setChecked(isDockAreaVisible(Qt::RightDockWidgetArea)); m_editorTabType = ReportDesignWidget::Page; - showDefaultEditors(); } ReportDesignWindow::~ReportDesignWindow() @@ -323,6 +325,9 @@ void ReportDesignWindow::createToolBars() addToolBar(m_itemsBordersEditorBar); createReportToolBar(); + + m_pageTools << m_mainToolBar << m_reportToolBar << m_fontEditorBar << m_textAlignmentEditorBar << m_itemsBordersEditorBar; + } void ReportDesignWindow::createItemsActions() @@ -573,6 +578,14 @@ void ReportDesignWindow::createDialogSignalSlotEditor() m_dialogEditors.append(doc); } +void ReportDesignWindow::createDialogDesignerToolBar() +{ + m_dialogDesignerToolBar = addToolBar(tr("Dialog Designer Tools")); + m_dialogDesignerToolBar->setObjectName("DialogDesignerTools"); + m_reportDesignWidget->initDialogDesignerToolBar(m_dialogDesignerToolBar); + m_dialogTools << m_dialogDesignerToolBar; +} + #endif void ReportDesignWindow::createDataWindow() { @@ -622,6 +635,7 @@ void ReportDesignWindow::startNewReport() m_newReportFooter->setEnabled(true); m_editorTabType = ReportDesignWidget::Page; showDefaultEditors(); + showDefaultToolBars(); } void ReportDesignWindow::writePosition() @@ -1048,6 +1062,7 @@ void ReportDesignWindow::slotLoadReport() setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); addRecentFile(fileName); m_editorTabType = ReportDesignWidget::Page; + showDefaultToolBars(); showDefaultEditors(); } } @@ -1215,6 +1230,14 @@ void ReportDesignWindow::updateAvaibleBands(){ } } +void ReportDesignWindow::showDefaultToolBars(){ + foreach (QToolBar* tb, m_pageTools){ + tb->setVisible(m_editorTabType != ReportDesignWidget::Dialog); + } + foreach (QToolBar* tb, m_dialogTools){ + tb->setVisible(m_editorTabType == ReportDesignWidget::Dialog); + } +} void ReportDesignWindow::showDefaultEditors(){ foreach (QDockWidget* w, m_pageEditors) { @@ -1248,12 +1271,14 @@ void ReportDesignWindow::slotActivePageChanged() restoreState(m_dialogEditorsState); else showDefaultEditors(); + showDefaultToolBars(); break; default: if (!m_pageEditors.isEmpty()) restoreState(m_pageEditorsState); else showDefaultEditors(); + showDefaultToolBars(); break; } diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index ec37638..0abe16c 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -144,6 +144,7 @@ private: void createDialogActionEditor(); void createDialogResourceEditor(); void createDialogSignalSlotEditor(); + void createDialogDesignerToolBar(); #endif void updateRedoUndo(); void updateAvaibleBands(); @@ -154,6 +155,7 @@ private: void removeNotExistedRecentFiles(); void removeNotExistedRecentFilesFromMenu(const QString& fileName); void addRecentFile(const QString& fileName); + void showDefaultToolBars(); void showDefaultEditors(); private: static ReportDesignWindow* m_instance; @@ -162,6 +164,9 @@ private: QToolBar* m_fontToolBar; QToolBar* m_reportToolBar; QToolBar* m_alignToolBar; +#ifdef HAVE_QTDESIGNER_INTEGRATION + QToolBar* m_dialogDesignerToolBar; +#endif QToolButton* m_newBandButton; QMenuBar* m_mainMenu; QMenu* m_fileMenu; @@ -249,6 +254,8 @@ private: ReportDesignWidget::EditorTabType m_editorTabType; QByteArray m_pageEditorsState; QByteArray m_dialogEditorsState; + QVector m_pageTools; + QVector m_dialogTools; }; diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 613b4dc..b57ea88 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1067,6 +1067,17 @@ void ScriptEngineContext::addDialog(const QString& name, const QByteArray& descr m_dialogs.push_back(DialogDescriber::create(name,description)); } +bool ScriptEngineContext::changeDialog(const QString& name, const QByteArray& description) +{ + foreach( DialogDescriber::Ptr describer, m_dialogs){ + if (describer->name().compare(name) == 0){ + describer->setDescription(description); + return true; + } + } + return false; +} + bool ScriptEngineContext::previewDialog(const QString& dialogName) { QDialog* dialog = getDialog(dialogName); diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 36ecda2..af97b63 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -144,7 +144,8 @@ public: #endif explicit ScriptEngineContext(QObject* parent=0):QObject(parent){} #ifdef HAVE_UI_LOADER - void addDialog(const QString& name, const QByteArray &description); + void addDialog(const QString& name, const QByteArray& description); + bool changeDialog(const QString& name, const QByteArray &description); bool previewDialog(const QString& dialogName); bool containsDialog(const QString& dialogName); const QVector& dialogDescribers(){return m_dialogs;} From 7b04b6efcac7d8140c0755cb60207d2ccf3da205 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 14 Apr 2017 02:43:34 +0300 Subject: [PATCH 021/347] Dialog Designer intergration has been finished --- limereport/dialogdesigner/dialogdesigner.qrc | 3 + .../dialogdesigner/lrdialogdesigner.cpp | 161 +++++++++++++++--- limereport/dialogdesigner/lrdialogdesigner.h | 43 ++++- limereport/dialogdesigner/templates/Dialog.ui | 18 ++ limereport/images/addDialog.png | Bin 0 -> 332 bytes limereport/images/deleteDialog.png | Bin 0 -> 245 bytes limereport/lrreportdesignwidget.cpp | 161 ++++++++++++++---- limereport/lrreportdesignwidget.h | 24 ++- limereport/lrreportdesignwindow.cpp | 40 ++++- limereport/lrreportdesignwindow.h | 8 + limereport/lrscriptenginemanager.cpp | 49 ++++++ limereport/lrscriptenginemanager.h | 6 + limereport/report.qrc | 2 + limereport/scriptbrowser/lrscriptbrowser.cpp | 8 +- limereport/scriptbrowser/lrscriptbrowser.h | 1 + 15 files changed, 448 insertions(+), 76 deletions(-) create mode 100644 limereport/dialogdesigner/templates/Dialog.ui create mode 100644 limereport/images/addDialog.png create mode 100644 limereport/images/deleteDialog.png diff --git a/limereport/dialogdesigner/dialogdesigner.qrc b/limereport/dialogdesigner/dialogdesigner.qrc index 67c62fb..3911131 100644 --- a/limereport/dialogdesigner/dialogdesigner.qrc +++ b/limereport/dialogdesigner/dialogdesigner.qrc @@ -6,4 +6,7 @@ images/tabordertool.png images/widgettool.png + + templates/Dialog.ui + diff --git a/limereport/dialogdesigner/lrdialogdesigner.cpp b/limereport/dialogdesigner/lrdialogdesigner.cpp index 643cf50..e71fb78 100644 --- a/limereport/dialogdesigner/lrdialogdesigner.cpp +++ b/limereport/dialogdesigner/lrdialogdesigner.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include "pluginmanager_p.h" //#include @@ -25,14 +26,14 @@ namespace LimeReport{ -DialogDesigner::DialogDesigner(QObject *parent) : QObject(parent) +DialogDesignerManager::DialogDesignerManager(QObject *parent) : QObject(parent) { QDesignerComponents::initializeResources(); m_formEditor = QDesignerComponents::createFormEditor(this); QDesignerComponents::initializePlugins(m_formEditor); QDesignerComponents::createTaskMenu(m_formEditor, this); - m_editWidgetsAction = new QAction(tr("Edit Widgets")); + m_editWidgetsAction = new QAction(tr("Edit Widgets"), this); m_editWidgetsAction->setIcon(QIcon(":/images/images/widgettool.png")); m_editWidgetsAction->setEnabled(false); connect(m_editWidgetsAction, SIGNAL(triggered()), this, SLOT(slotEditWidgets())); @@ -102,7 +103,7 @@ DialogDesigner::DialogDesigner(QObject *parent) : QObject(parent) } -DialogDesigner::~DialogDesigner() +DialogDesignerManager::~DialogDesignerManager() { for (int i = 0; isetIconSize(QSize(16,16)); + m_formEditor->formWindowManager()->actionCopy()->setIcon(QIcon(":/report/images/copy")); tb->addAction(m_formEditor->formWindowManager()->actionCopy()); + m_formEditor->formWindowManager()->actionPaste()->setIcon(QIcon(":/report/images/paste")); tb->addAction(m_formEditor->formWindowManager()->actionPaste()); + m_formEditor->formWindowManager()->actionCut()->setIcon(QIcon(":/report/images/cut")); tb->addAction(m_formEditor->formWindowManager()->actionCut()); + m_formEditor->formWindowManager()->actionUndo()->setIcon(QIcon(":/report/images/undo")); tb->addAction(m_formEditor->formWindowManager()->actionUndo()); + m_formEditor->formWindowManager()->actionRedo()->setIcon(QIcon(":/report/images/redo")); tb->addAction(m_formEditor->formWindowManager()->actionRedo()); tb->addActions(m_modes->actions()); @@ -135,7 +141,7 @@ void DialogDesigner::initToolBar(QToolBar *tb) tb->addAction(m_formEditor->formWindowManager()->actionAdjustSize()); } -QWidget *DialogDesigner::createFormEditor(const QString &content) +QWidget *DialogDesignerManager::createFormEditor(const QString &content) { QDesignerFormWindowInterface* wnd = m_formEditor->formWindowManager()->createFormWindow(0, Qt::Window); wnd->setContents(content); @@ -143,25 +149,32 @@ QWidget *DialogDesigner::createFormEditor(const QString &content) m_formEditor->objectInspector()->setFormWindow(wnd); wnd->editWidgets(); - connect(wnd, SIGNAL(changed()), this, SIGNAL(dialogChanged())); + DialogDesigner* dialogDesigner = new DialogDesigner(wnd, m_formEditor); - SharedTools::WidgetHost *placeholder = new SharedTools::WidgetHost(0,wnd); - placeholder->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); - placeholder->setFocusProxy( wnd ); + connect(dialogDesigner, SIGNAL(dialogChanged()), this, SLOT(slotDialogChanged())); + connect(dialogDesigner, SIGNAL(dialogNameChanged(QString,QString)), this, SIGNAL(dialogNameChanged(QString,QString))); + connect(dialogDesigner, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*))); + + m_dialogDesigners.append(dialogDesigner); + + return dialogDesigner; - return placeholder; } -QByteArray DialogDesigner::getDialogDescription(QWidget *form) +QByteArray DialogDesignerManager::getDialogDescription(QWidget *form) { - SharedTools::WidgetHost* wh = dynamic_cast(form); - if (wh){ - return wh->formWindow()->contents().toUtf8(); + QByteArray result; + DialogDesigner* dialogDesigner = dynamic_cast(form); + Q_ASSERT(dialogDesigner != NULL); + //SharedTools::WidgetHost* wh = dynamic_cast(form); + if (dialogDesigner){ + result = dialogDesigner->dialogContent(); + //wh->formWindow()->setDirty(false); } - return QByteArray(); + return result; } -void DialogDesigner::setActiveEditor(QWidget *widget) +void DialogDesignerManager::setActiveEditor(QWidget *widget) { SharedTools::WidgetHost* wh = dynamic_cast(widget); if (wh){ @@ -169,52 +182,70 @@ void DialogDesigner::setActiveEditor(QWidget *widget) } } -QWidget* DialogDesigner::widgetBox() const +void DialogDesignerManager::setDirty(bool value) +{ + foreach(DialogDesigner* dialogDesigner, m_dialogDesigners){ + dialogDesigner->setChanged(value); + } +} + +QWidget* DialogDesignerManager::widgetBox() const { return m_widgetBox; } -QWidget* DialogDesigner::actionEditor() const +QWidget* DialogDesignerManager::actionEditor() const { return m_actionEditor; } -QWidget* DialogDesigner::propertyEditor() const +QWidget* DialogDesignerManager::propertyEditor() const { return m_propertyEditor; } -QWidget* DialogDesigner::objectInspector() const +QWidget* DialogDesignerManager::objectInspector() const { return m_objectInspector; } -QWidget *DialogDesigner::signalSlotEditor() const +QWidget *DialogDesignerManager::signalSlotEditor() const { return m_signalSlotEditor; } -QWidget *DialogDesigner::resourcesEditor() const +QWidget *DialogDesignerManager::resourcesEditor() const { return m_resourcesEditor; } -void DialogDesigner::slotObjectDestroyed(QObject *object) +void DialogDesignerManager::slotObjectDestroyed(QObject* object) { + + QList::Iterator it = m_dialogDesigners.begin(); + while(it!=m_dialogDesigners.end()){ + if (*it == object){ + it = m_dialogDesigners.erase(it); + return; + } else { + ++it; + } + } + for ( int i = 0; iformWindowManager()->formWindowCount(); ++i){ m_formEditor->formWindowManager()->formWindow(i)->editWidgets(); } } -void DialogDesigner::slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow) +void DialogDesignerManager::slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow) { if (formWindow){ m_editWidgetsAction->setEnabled(true); @@ -222,7 +253,15 @@ void DialogDesigner::slotActiveFormWindowChanged(QDesignerFormWindowInterface *f } } -QString DialogDesigner::iconPathByName(const QString &name) +void DialogDesignerManager::slotDialogChanged() +{ + DialogDesigner* dialogDesigner = dynamic_cast(sender()); + if (dialogDesigner){ + emit dialogChanged(dialogDesigner->dialogName()); + } +} + +QString DialogDesignerManager::iconPathByName(const QString &name) { if (name.compare("__qt_edit_signals_slots_action") == 0) return ":/images/images/signalslottool.png"; @@ -233,4 +272,74 @@ QString DialogDesigner::iconPathByName(const QString &name) return ""; } +DialogDesigner::DialogDesigner(QDesignerFormWindowInterface* wnd, QDesignerFormEditorInterface* formEditor, QWidget *parent, Qt::WindowFlags flags) + :QWidget(parent, flags), m_formEditor(formEditor) +{ + m_dialogName = wnd->mainContainer()->objectName(); + connect(wnd, SIGNAL(changed()), this, SIGNAL(dialogChanged())); + connect(wnd->mainContainer(), SIGNAL(objectNameChanged(QString)), this, SLOT(slotMainContainerNameChanged(QString))); + + m_designerHolder = new SharedTools::WidgetHost(this,wnd); + m_designerHolder->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); + m_designerHolder->setFocusProxy( wnd ); + + QVBoxLayout* l = new QVBoxLayout(this); + l->addWidget(m_designerHolder); + setLayout(l); + +} + +DialogDesigner::~DialogDesigner(){} + +QString DialogDesigner::dialogName() const +{ + return m_dialogName; +} + +void DialogDesigner::setDialogName(const QString &dialogName) +{ + m_dialogName = dialogName; +} + +bool DialogDesigner::isChanged() +{ + return m_designerHolder->formWindow()->isDirty(); +} + +void DialogDesigner::setChanged(bool value) +{ + m_designerHolder->formWindow()->setDirty(false); +} + +QByteArray DialogDesigner::dialogContent() +{ + if (m_designerHolder && m_designerHolder->formWindow()) + return m_designerHolder->formWindow()->contents().toUtf8(); + return QByteArray(); +} + +void DialogDesigner::undo() +{ + Q_ASSERT(m_formEditor != NULL); + if (m_formEditor){ + m_formEditor->formWindowManager()->actionUndo()->trigger(); + } +} + +void DialogDesigner::redo() +{ + Q_ASSERT(m_formEditor != NULL); + if (m_formEditor){ + m_formEditor->formWindowManager()->actionRedo()->trigger(); + } +} + +void DialogDesigner::slotMainContainerNameChanged(QString newName) +{ + if (m_dialogName.compare(newName) != 0){ + emit dialogNameChanged(m_dialogName, newName); + m_dialogName = newName; + } +} + } diff --git a/limereport/dialogdesigner/lrdialogdesigner.h b/limereport/dialogdesigner/lrdialogdesigner.h index bebc4dd..8a0bfbe 100644 --- a/limereport/dialogdesigner/lrdialogdesigner.h +++ b/limereport/dialogdesigner/lrdialogdesigner.h @@ -14,18 +14,48 @@ class QDesignerPropertyEditorInterface; class QDesignerObjectInspectorInterface; class QDesignerFormWindowManagerInterface; +namespace SharedTools{ + class WidgetHost; +} + namespace LimeReport{ -class DialogDesigner : public QObject +class DialogDesigner : public QWidget{ + Q_OBJECT +public: + DialogDesigner(QDesignerFormWindowInterface *wnd, QDesignerFormEditorInterface* formEditor, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags()); + ~DialogDesigner(); + QString dialogName() const; + void setDialogName(const QString &dialogName); + bool isChanged(); + void setChanged(bool value); + QByteArray dialogContent(); +public slots: + void undo(); + void redo(); +signals: + void dialogChanged(); + void dialogNameChanged(QString oldName, QString newName); + +private slots: + void slotMainContainerNameChanged(QString newName); +private: + QString m_dialogName; + SharedTools::WidgetHost* m_designerHolder; + QDesignerFormEditorInterface* m_formEditor; +}; + +class DialogDesignerManager : public QObject { Q_OBJECT public: - explicit DialogDesigner(QObject *parent = 0); - ~DialogDesigner(); + explicit DialogDesignerManager(QObject *parent = 0); + ~DialogDesignerManager(); void initToolBar(QToolBar* tb); QWidget* createFormEditor(const QString& content); QByteArray getDialogDescription(QWidget* form); - void setActiveEditor(QWidget* widget); + void setActiveEditor(QWidget* widget); + void setDirty(bool value); QWidget* widgetBox() const; QWidget* actionEditor() const; QWidget* propertyEditor() const; @@ -33,11 +63,13 @@ public: QWidget* signalSlotEditor() const; QWidget* resourcesEditor() const; signals: - void dialogChanged(); + void dialogChanged(QString dialogName); + void dialogNameChanged(QString oldName, QString newName); private slots: void slotObjectDestroyed(QObject* object); void slotEditWidgets(); void slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow); + void slotDialogChanged(); private: QString iconPathByName(const QString& name); private: @@ -53,6 +85,7 @@ private: QAction* m_editWidgetsAction; QActionGroup* m_modes; QString m_activeWindowName; + QList m_dialogDesigners; }; } // namespace LimeReport diff --git a/limereport/dialogdesigner/templates/Dialog.ui b/limereport/dialogdesigner/templates/Dialog.ui new file mode 100644 index 0000000..6eb9e5f --- /dev/null +++ b/limereport/dialogdesigner/templates/Dialog.ui @@ -0,0 +1,18 @@ + + $ClassName$ + + + + 0 + 0 + 400 + 300 + + + + $ClassName$ + + + + + diff --git a/limereport/images/addDialog.png b/limereport/images/addDialog.png new file mode 100644 index 0000000000000000000000000000000000000000..6023700b8d477a8a22e12ced91acbe37d7b7c821 GIT binary patch literal 332 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~4_RSXVCc7-eQ3-~9PMKdqdXAw7lL{z#FW zgy`I6?(_OFj6L<7A@^L(+wzzhzRr>Hv6|_;`sKgH7f$o6yVkn8^rG5Ht`3{rug4Zu z<$32h)Zgjj>f}~E$+#xHJ*iQ`daGY_=VGaA_l1{~zMpt{S0KaI3s3aEpSamKC%f?^ zci6-O$E>B!otW18{Br5+&e;k%doMp%Obb*kyu7cqW|7pDi9s)f8t?x3^R+(U=k~w3 aHVhIP!I}+!P0s*5$>8bg=d#Wzp$PzZS%Jj> literal 0 HcmV?d00001 diff --git a/limereport/images/deleteDialog.png b/limereport/images/deleteDialog.png new file mode 100644 index 0000000000000000000000000000000000000000..53914900832bdccb2912a5c7fdb17c0db523f10b GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE(~4_RSXVCc7-p*!14`y0f=d z9BA`TymgiR1~1T@1cUl-JnMDUmoDL`YV6I?Hvj^e>C=)De)&5({0PnZuP%B(=zf6* f`-{xkAq))p?}JZWvQW4KbPa>2tDnm{r-UW|gbz>v literal 0 HcmV?d00001 diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 97621ab..ec1332c 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -50,9 +50,9 @@ namespace LimeReport { ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow *mainWindow, QWidget *parent) : QWidget(parent), #ifdef HAVE_QTDESIGNER_INTEGRATION - m_dialogDesigner(new DialogDesigner(this)), + m_dialogDesignerManager(new DialogDesignerManager(this)), #endif - m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false) + m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), m_dialogChanged(false) { m_tabWidget = new QTabWidget(this); m_tabWidget->setTabPosition(QTabWidget::South); @@ -75,6 +75,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow connect(m_report,SIGNAL(pagesLoadFinished()),this,SLOT(slotPagesLoadFinished())); connect(m_report,SIGNAL(cleared()),this,SIGNAL(cleared())); connect(m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slotCurrentTabChanged(int))); + connect(m_report->scriptContext(), SIGNAL(dialogDeleted(QString)), this, SLOT(slotDialogDeleted(QString))); m_scriptEditor->setPlainText(report->scriptContext()->initScript()); m_zoomer = new GraphicsViewZoomer(activeView()); @@ -84,35 +85,49 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivate *report, QMainWindow #endif #ifdef HAVE_QTDESIGNER_INTEGRATION - connect(m_dialogDesigner, SIGNAL(dialogChanged()), this, SLOT(slotDialogChanged())); + connect(m_dialogDesignerManager, SIGNAL(dialogChanged(QString)), + this, SLOT(slotDialogChanged(QString))); + connect(m_dialogDesignerManager, SIGNAL(dialogNameChanged(QString,QString)), + this, SLOT(slotDialogNameChanged(QString,QString))); #endif } -DialogDesigner *ReportDesignWidget::dialogDesigner() const +#ifdef HAVE_QTDESIGNER_INTEGRATION +DialogDesignerManager *ReportDesignWidget::dialogDesignerManager() const { - return m_dialogDesigner; + return m_dialogDesignerManager; } +QString ReportDesignWidget::activeDialogName() +{ + if (activeDialogPage()) + return activeDialogPage()->dialogName(); + return ""; +} + + QWidget *ReportDesignWidget::toolWindow(ReportDesignWidget::ToolWindowType windowType) { switch (windowType) { case WidgetBox: - return dialogDesigner()->widgetBox(); + return dialogDesignerManager()->widgetBox(); case PropertyEditor: - return dialogDesigner()->propertyEditor(); + return dialogDesignerManager()->propertyEditor(); case ObjectInspector: - return dialogDesigner()->objectInspector(); + return dialogDesignerManager()->objectInspector(); case ActionEditor: - return dialogDesigner()->actionEditor(); + return dialogDesignerManager()->actionEditor(); case ResourceEditor: - return dialogDesigner()->resourcesEditor(); + return dialogDesignerManager()->resourcesEditor(); case SignalSlotEditor: - return dialogDesigner()->signalSlotEditor(); + return dialogDesignerManager()->signalSlotEditor(); default: return 0; } } +#endif + ReportDesignWidget::EditorTabType ReportDesignWidget::activeTabType() { QString tabType = m_tabWidget->tabWhatsThis(m_tabWidget->currentIndex()); @@ -121,20 +136,24 @@ ReportDesignWidget::EditorTabType ReportDesignWidget::activeTabType() return Page; } +#ifdef HAVE_QTDESIGNER_INTEGRATION + void ReportDesignWidget::initDialogDesignerToolBar(QToolBar *toolBar) { - m_dialogDesigner->initToolBar(toolBar); + m_dialogDesignerManager->initToolBar(toolBar); } void ReportDesignWidget::updateDialogs() { for ( int i = 0; icount(); ++i ){ if (m_tabWidget->tabWhatsThis(i).compare("dialog") == 0){ - m_report->scriptContext()->changeDialog(m_tabWidget->tabText(i), m_dialogDesigner->getDialogDescription(m_tabWidget->widget(i))); + m_report->scriptContext()->changeDialog(m_tabWidget->tabText(i), m_dialogDesignerManager->getDialogDescription(m_tabWidget->widget(i))); } } } +#endif + bool ReportDesignWidget::useMagnet() const { return m_useMagnet; @@ -210,21 +229,38 @@ void ReportDesignWidget::createTabs(){ pageIndex = m_tabWidget->addTab(view,QIcon(),m_report->pageAt(i)->pageItem()->objectName()); m_tabWidget->setTabWhatsThis(pageIndex, "page"); } -#ifdef HAVE_QTDESIGNER_INTEGRATION - QWidget* dialogEditor; - foreach(DialogDescriber::Ptr dialogDesc, m_report->scriptContext()->dialogDescribers()){ - dialogEditor = m_dialogDesigner->createFormEditor(dialogDesc->description()); - pageIndex = m_tabWidget->addTab(dialogEditor,QIcon(),dialogDesc->name()); - m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); - } -#endif + m_scriptEditor = new QTextEdit(this); pageIndex = m_tabWidget->addTab(m_scriptEditor,QIcon(),tr("Script")); m_tabWidget->setTabWhatsThis(pageIndex,"script"); m_tabWidget->setCurrentIndex(0); +#ifdef HAVE_QTDESIGNER_INTEGRATION + QWidget* dialogDesigner; + foreach(DialogDescriber::Ptr dialogDesc, m_report->scriptContext()->dialogDescribers()){ + dialogDesigner = m_dialogDesignerManager->createFormEditor(dialogDesc->description()); + pageIndex = m_tabWidget->addTab(dialogDesigner,QIcon(),dialogDesc->name()); + m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); + + } +#endif + } +#ifdef HAVE_QTDESIGNER_INTEGRATION +void ReportDesignWidget::createNewDialogTab(const QString& dialogName, const QByteArray& description) +{ + QWidget* dialogDesigner = m_dialogDesignerManager->createFormEditor(description); + int pageIndex = m_tabWidget->addTab(dialogDesigner,QIcon(),dialogName); + m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); +} + +DialogDesigner*ReportDesignWidget::activeDialogPage() +{ + return dynamic_cast(m_tabWidget->currentWidget()); +} +#endif + ReportDesignWidget::~ReportDesignWidget() { delete m_zoomer; @@ -301,6 +337,8 @@ PageDesignIntf * ReportDesignWidget::activePage() return 0; } + + QList ReportDesignWidget::selectedItems(){ return activePage()->selectedItems(); } @@ -321,16 +359,26 @@ void ReportDesignWidget::slotItemSelected(BaseDesignIntf *item){ emit itemSelected(item); } -void ReportDesignWidget::saveToFile(const QString &fileName){ +bool ReportDesignWidget::saveToFile(const QString &fileName){ + bool result = false; m_report->scriptContext()->setInitScript(m_scriptEditor->toPlainText()); #ifdef HAVE_QTDESIGNER_INTEGRATION updateDialogs(); #endif if (m_report->saveToFile(fileName)) { - m_report->emitSaveFinished(); + m_report->emitSaveFinished(); + result = true; } + +#ifdef HAVE_QTDESIGNER_INTEGRATION + if (result){ + m_dialogChanged = false; + m_dialogDesignerManager->setDirty(false); + } +#endif + return result; } bool ReportDesignWidget::save() @@ -340,24 +388,32 @@ bool ReportDesignWidget::save() updateDialogs(); #endif + bool result = false; + if (!m_report->reportFileName().isEmpty()){ if (m_report->saveToFile()){ m_report->emitSaveFinished(); - return true; + result = true; } } else { m_report->emitSaveReport(); if (m_report->isSaved()) { m_report->emitSaveFinished(); - return true; + result = true; } - if (m_report->saveToFile(QFileDialog::getSaveFileName(this,tr("Report file name"),"","Report files (*.lrxml);; All files (*)"))){ + else if (m_report->saveToFile(QFileDialog::getSaveFileName(this,tr("Report file name"),"","Report files (*.lrxml);; All files (*)"))){ m_report->emitSaveFinished(); - return true; + result = true; }; } - return false; +#ifdef HAVE_QTDESIGNER_INTEGRATION + if (result){ + m_dialogChanged = false; + m_dialogDesignerManager->setDirty(false); + } +#endif + return result; } bool ReportDesignWidget::loadFromFile(const QString &fileName) @@ -367,6 +423,7 @@ bool ReportDesignWidget::loadFromFile(const QString &fileName) //connectPage(m_report->pageAt(0)); m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); emit loaded(); + m_dialogChanged = false; return true; } else { QMessageBox::critical(this,tr("Error"),tr("Wrong file format")); @@ -390,7 +447,7 @@ QString ReportDesignWidget::reportFileName() bool ReportDesignWidget::isNeedToSave() { if(m_report) - return m_report->isNeedToSave(); + return (m_report->isNeedToSave() || m_dialogChanged); return false; } @@ -409,12 +466,20 @@ void ReportDesignWidget::undo() { if (activePage()) activePage()->undo(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + if (activeDialogPage()) + activeDialogPage()->undo(); +#endif } void ReportDesignWidget::redo() { if (activePage()) activePage()->redo(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + if (activeDialogPage()) + activeDialogPage()->redo(); +#endif } void ReportDesignWidget::copy() @@ -667,6 +732,16 @@ void ReportDesignWidget::slotPagesLoadFinished() emit loaded(); } +void ReportDesignWidget::slotDialogDeleted(QString dialogName) +{ + for (int i = 0; icount(); ++i ){ + if (m_tabWidget->tabText(i).compare(dialogName) == 0){ + delete m_tabWidget->widget(i); + break; + } + } +} + void ReportDesignWidget::slotDatasourceCollectionLoaded(const QString & /*collectionName*/) { } @@ -685,16 +760,40 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) } m_zoomer->setView(view); } +#ifdef HAVE_QTDESIGNER_INTEGRATION if (activeTabType() == Dialog){ - m_dialogDesigner->setActiveEditor(m_tabWidget->widget(index)); + m_dialogDesignerManager->setActiveEditor(m_tabWidget->widget(index)); } + updateDialogs(); +#endif emit activePageChanged(); } #ifdef HAVE_QTDESIGNER_INTEGRATION -void ReportDesignWidget::slotDialogChanged() +void ReportDesignWidget::addNewDialog() { + QFile templateUi(":/templates/templates/Dialog.ui"); + templateUi.open(QIODevice::ReadOnly|QIODevice::Text); + QString templateStr = templateUi.readAll(); + QString dialogName = m_report->scriptContext()->getNewDialogName(); + templateStr.replace("$ClassName$", dialogName); + m_report->scriptContext()->addDialog(dialogName,templateStr.toUtf8()); + createNewDialogTab(dialogName, templateStr.toUtf8()); +} + +void ReportDesignWidget::slotDialogChanged(QString ) +{ + m_dialogChanged = true; +} + +void ReportDesignWidget::slotDialogNameChanged(QString oldName, QString newName) +{ + for (int i = 0; i < m_tabWidget->count(); ++i){ + if (m_tabWidget->tabText(i).compare(oldName) == 0) + m_tabWidget->setTabText(i, newName); + } + m_report->scriptContext()->changeDialogName(oldName, newName); } #endif diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index ee6a157..455b685 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -48,6 +48,7 @@ namespace LimeReport { class ReportEnginePrivate; class DataBrowser; class ReportDesignWindow; +class DialogDesignerManager; class DialogDesigner; class ReportDesignWidget : public QWidget @@ -100,15 +101,17 @@ public: bool useGrid(){ return m_useGrid;} bool useMagnet() const; void setUseMagnet(bool useMagnet); - DialogDesigner *dialogDesigner() const; - QWidget* toolWindow(ToolWindowType windowType); EditorTabType activeTabType(); #ifdef HAVE_QTDESIGNER_INTEGRATION void initDialogDesignerToolBar(QToolBar* toolBar); void updateDialogs(); + DialogDesignerManager *dialogDesignerManager() const; + QString activeDialogName(); + DialogDesigner* activeDialogPage(); + QWidget* toolWindow(ToolWindowType windowType); #endif public slots: - void saveToFile(const QString&); + bool saveToFile(const QString&); bool save(); bool loadFromFile(const QString&); void deleteSelectedItems(); @@ -140,6 +143,10 @@ public slots: void addPage(); void deleteCurrentPage(); void slotPagesLoadFinished(); + void slotDialogDeleted(QString dialogName); +#ifdef HAVE_QTDESIGNER_INTEGRATION + void addNewDialog(); +#endif private slots: void slotItemSelected(LimeReport::BaseDesignIntf *item); void slotSelectionChanged(); @@ -147,7 +154,8 @@ private slots: void slotSceneRectChanged(QRectF); void slotCurrentTabChanged(int index); #ifdef HAVE_QTDESIGNER_INTEGRATION - void slotDialogChanged(); + void slotDialogChanged(QString); + void slotDialogNameChanged(QString oldName, QString newName); #endif signals: void insertModeStarted(); @@ -169,13 +177,18 @@ signals: void pageDeleted(); protected: void createTabs(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + void createNewDialogTab(const QString& dialogName,const QByteArray& description); +#endif private: bool eventFilter(QObject *target, QEvent *event); private: ReportEnginePrivate* m_report; QGraphicsView *m_view; QTextEdit* m_scriptEditor; - DialogDesigner* m_dialogDesigner; +#ifdef HAVE_QTDESIGNER_INTEGRATION + DialogDesignerManager* m_dialogDesignerManager; +#endif QMainWindow *m_mainWindow; QTabWidget* m_tabWidget; GraphicsViewZoomer* m_zoomer; @@ -184,6 +197,7 @@ private: int m_horizontalGridStep; bool m_useGrid; bool m_useMagnet; + bool m_dialogChanged; }; } diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index febddfd..b2df5a1 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -211,11 +211,6 @@ void ReportDesignWindow::createActions() m_testAction->setIcon(QIcon(":/report/images/pin")); connect(m_testAction,SIGNAL(triggered()),this,SLOT(slotTest())); -// m_printReportAction = new QAction(tr("Print Report"),this); -// m_printReportAction->setIcon(QIcon(":/report/images/print")); -// m_printReportAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_P)); -// connect(m_printReportAction,SIGNAL(triggered()),this,SLOT(slotPrintReport())); - m_editLayoutMode = new QAction(tr("Edit layouts mode"),this); m_editLayoutMode->setIcon(QIcon(":/report/images/editlayout")); m_editLayoutMode->setCheckable(true); @@ -231,15 +226,22 @@ void ReportDesignWindow::createActions() m_hideLeftPanel = new QAction(tr("Hide left panel"),this); m_hideLeftPanel->setCheckable(true); -// m_hideLeftPanel->setChecked(true); m_hideLeftPanel->setIcon(QIcon(":/report/images/hideLeftPanel")); connect(m_hideLeftPanel,SIGNAL(toggled(bool)), this, SLOT(slotHideLeftPanel(bool))); m_hideRightPanel = new QAction(tr("Hide right panel"),this); m_hideRightPanel->setCheckable(true); -// m_hideRightPanel->setChecked(true); m_hideRightPanel->setIcon(QIcon(":/report/images/hideRightPanel")); connect(m_hideRightPanel,SIGNAL(toggled(bool)), this, SLOT(slotHideRightPanel(bool))); +#ifdef HAVE_QTDESIGNER_INTEGRATION + m_deleteDialogAction = new QAction(tr("Delete dialog"), this); + m_deleteDialogAction->setIcon(QIcon(":/report//images/deleteDialog")); + connect(m_deleteDialogAction, SIGNAL(triggered()), this, SLOT(slotDeleteDialog())); + + m_addNewDialogAction = new QAction(tr("Add new dialog"), this); + m_addNewDialogAction->setIcon(QIcon(":/report//images/addDialog")); + connect(m_addNewDialogAction, SIGNAL(triggered()), this, SLOT(slotAddNewDialog())); +#endif } void ReportDesignWindow::createReportToolBar() @@ -252,7 +254,6 @@ void ReportDesignWindow::createReportToolBar() m_reportToolBar->setObjectName("reportTools"); createItemsActions(); m_reportToolBar->addSeparator(); - //m_reportToolBar->addAction(m_editLayoutMode); m_reportToolBar->addAction(m_addHLayout); m_reportToolBar->addSeparator(); m_reportToolBar->addAction(m_deleteItemAction); @@ -286,6 +287,9 @@ void ReportDesignWindow::createToolBars() m_mainToolBar->addAction(m_newPageAction); m_mainToolBar->addAction(m_deletePageAction); +#ifdef HAVE_QTDESIGNER_INTEGRATION + m_mainToolBar->addAction(m_addNewDialogAction); +#endif m_mainToolBar->addSeparator(); m_mainToolBar->addAction(m_copyAction); @@ -582,6 +586,11 @@ void ReportDesignWindow::createDialogDesignerToolBar() { m_dialogDesignerToolBar = addToolBar(tr("Dialog Designer Tools")); m_dialogDesignerToolBar->setObjectName("DialogDesignerTools"); + m_dialogDesignerToolBar->addAction(m_saveReportAction); + m_dialogDesignerToolBar->addAction(m_previewReportAction); + m_dialogDesignerToolBar->addSeparator(); + m_dialogDesignerToolBar->addAction(m_deleteDialogAction); + m_dialogDesignerToolBar->addSeparator(); m_reportDesignWidget->initDialogDesignerToolBar(m_dialogDesignerToolBar); m_dialogTools << m_dialogDesignerToolBar; } @@ -1257,6 +1266,7 @@ void ReportDesignWindow::slotActivePageChanged() switch (m_editorTabType) { case ReportDesignWidget::Dialog: m_dialogEditorsState = saveState(); + m_scriptBrowser->updateDialogsTree(); break; default: m_pageEditorsState = saveState(); @@ -1388,6 +1398,20 @@ void ReportDesignWindow::slotPageDeleted() m_deletePageAction->setEnabled(m_reportDesignWidget->report()->pageCount()>1); } +#ifdef HAVE_QTDESIGNER_INTEGRATION +void ReportDesignWindow::slotDeleteDialog() +{ + if ( m_editorTabType == ReportDesignWidget::Dialog ){ + m_reportDesignWidget->report()->scriptContext()->deleteDialog(m_reportDesignWidget->activeDialogName()); + } +} + +void ReportDesignWindow::slotAddNewDialog() +{ + m_reportDesignWidget->addNewDialog(); +} +#endif + void ReportDesignWindow::closeEvent(QCloseEvent * event) { if (checkNeedToSave()){ diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 0abe16c..c3e2578 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -119,6 +119,10 @@ private slots: void slotLoadRecentFile(const QString fileName); void slotPageAdded(PageDesignIntf* ); void slotPageDeleted(); +#ifdef HAVE_QTDESIGNER_INTEGRATION + void slotDeleteDialog(); + void slotAddNewDialog(); +#endif protected: void closeEvent(QCloseEvent *event); void resizeEvent(QResizeEvent *); @@ -217,6 +221,10 @@ private: QAction* m_addHLayout; QAction* m_hideLeftPanel; QAction* m_hideRightPanel; +#ifdef HAVE_QTDESIGNER_INTEGRATION + QAction* m_deleteDialogAction; + QAction* m_addNewDialogAction; +#endif QMenu* m_recentFilesMenu; QSignalMapper* m_bandsAddSignalsMap; diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index b57ea88..785640a 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1065,6 +1065,7 @@ void DialogDescriber::setDescription(const QByteArray &description) void ScriptEngineContext::addDialog(const QString& name, const QByteArray& description) { m_dialogs.push_back(DialogDescriber::create(name,description)); + emit dialogAdded(name); } bool ScriptEngineContext::changeDialog(const QString& name, const QByteArray& description) @@ -1072,6 +1073,37 @@ bool ScriptEngineContext::changeDialog(const QString& name, const QByteArray& de foreach( DialogDescriber::Ptr describer, m_dialogs){ if (describer->name().compare(name) == 0){ describer->setDescription(description); + { + QList::Iterator it = m_createdDialogs.begin(); + while(it!=m_createdDialogs.end()){ + if ((*it)->objectName()==name){ + it = m_createdDialogs.erase(it); + } else { + ++it; + } + } + } + return true; + } + } + return false; +} + +bool ScriptEngineContext::changeDialogName(const QString& oldName, const QString& newName) +{ + foreach( DialogDescriber::Ptr describer, m_dialogs){ + if (describer->name().compare(oldName) == 0){ + describer->setName(newName); + { + QList::Iterator it = m_createdDialogs.begin(); + while(it!=m_createdDialogs.end()){ + if ((*it)->objectName()==oldName){ + it = m_createdDialogs.erase(it); + } else { + ++it; + } + } + } return true; } } @@ -1106,6 +1138,7 @@ void ScriptEngineContext::deleteDialog(const QString& dialogName) while(it!=m_dialogs.end()){ if ((*it)->name()==dialogName){ it = m_dialogs.erase(it); + emit dialogDeleted(dialogName); } else { ++it; } @@ -1188,6 +1221,10 @@ QDialog* ScriptEngineContext::createDialog(DialogDescriber* cont) buffer.open(QIODevice::ReadOnly); QDialog* dialog = dynamic_cast(loader.load(&buffer)); m_createdDialogs.push_back(QSharedPointer(dialog)); + if (cont->name().compare(dialog->objectName())){ + cont->setName(dialog->objectName()); + emit dialogNameChanged(dialog->objectName()); + } return dialog; } @@ -1225,6 +1262,18 @@ QDialog* ScriptEngineContext::getDialog(const QString& dialogName) } return 0; } + +QString ScriptEngineContext::getNewDialogName() +{ + QString result = "Dialog"; + int index = m_dialogs.size() - 1; + while (containsDialog(result)){ + index++; + result = QString("Dialog%1").arg(index); + } + return result; +} + #endif QString ScriptEngineContext::initScript() const { diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index af97b63..235599a 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -146,15 +146,21 @@ public: #ifdef HAVE_UI_LOADER void addDialog(const QString& name, const QByteArray& description); bool changeDialog(const QString& name, const QByteArray &description); + bool changeDialogName(const QString& oldName, const QString& newName); bool previewDialog(const QString& dialogName); bool containsDialog(const QString& dialogName); const QVector& dialogDescribers(){return m_dialogs;} void deleteDialog(const QString& dialogName); QDialog *getDialog(const QString &dialogName); + QString getNewDialogName(); #endif void clear(); QString initScript() const; void setInitScript(const QString& initScript); +signals: + void dialogNameChanged(QString dialogName); + void dialogDeleted(QString dialogName); + void dialogAdded(QString dialogName); protected: QObject* createElement(const QString& collectionName,const QString& elementType); int elementsCount(const QString& collectionName); diff --git a/limereport/report.qrc b/limereport/report.qrc index 6548420..1e7c5d6 100644 --- a/limereport/report.qrc +++ b/limereport/report.qrc @@ -175,5 +175,7 @@ images/addBand2.png images/edit_control_4_24.png images/logo_32x32_1.png + images/addDialog.png + images/deleteDialog.png diff --git a/limereport/scriptbrowser/lrscriptbrowser.cpp b/limereport/scriptbrowser/lrscriptbrowser.cpp index 1bd052d..1ef6b73 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.cpp +++ b/limereport/scriptbrowser/lrscriptbrowser.cpp @@ -59,6 +59,7 @@ void ScriptBrowser::setReportEditor(ReportDesignWidget* report) m_report=report; connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); connect(m_report,SIGNAL(loaded()),this,SLOT(slotUpdate())); + connect(m_report->scriptContext(), SIGNAL(dialogAdded(QString)), this, SLOT(slotDialogAdded(QString))); updateFunctionTree(); } @@ -138,6 +139,11 @@ void ScriptBrowser::slotUpdate() updateFunctionTree(); } +void ScriptBrowser::slotDialogAdded(QString) +{ + updateDialogsTree(); +} + #ifdef HAVE_UI_LOADER void ScriptBrowser::on_tbAddDialog_clicked() { @@ -157,7 +163,7 @@ void ScriptBrowser::on_tbAddDialog_clicked() if (!m_report->scriptContext()->containsDialog(dialog->objectName())){ file.seek(0); m_report->scriptContext()->addDialog(dialog->objectName(),file.readAll()); - updateDialogsTree(); + //updateDialogsTree(); } else { QMessageBox::critical(this,tr("Error"),tr("Dialog with name: %1 already exists").arg(dialog->objectName())); } diff --git a/limereport/scriptbrowser/lrscriptbrowser.h b/limereport/scriptbrowser/lrscriptbrowser.h index 3214617..dd7d9ae 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.h +++ b/limereport/scriptbrowser/lrscriptbrowser.h @@ -62,6 +62,7 @@ protected: private slots: void slotClear(); void slotUpdate(); + void slotDialogAdded(QString); #ifdef HAVE_UI_LOADER void on_tbAddDialog_clicked(); void on_tbRunDialog_clicked(); From 02a8ef8b5c760228aa4ead8e45a11ded3b067f3a Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 18 Apr 2017 20:00:59 +0300 Subject: [PATCH 022/347] Crash on destroy has been fixed --- .../dialogdesigner/lrdialogdesigner.cpp | 2 +- limereport/lrreportdesignwidget.cpp | 1 + limereport/lrreportdesignwindow.cpp | 63 +++++++++++-------- limereport/lrreportdesignwindow.h | 1 + 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/limereport/dialogdesigner/lrdialogdesigner.cpp b/limereport/dialogdesigner/lrdialogdesigner.cpp index e71fb78..6a33752 100644 --- a/limereport/dialogdesigner/lrdialogdesigner.cpp +++ b/limereport/dialogdesigner/lrdialogdesigner.cpp @@ -96,7 +96,7 @@ DialogDesignerManager::DialogDesignerManager(QObject *parent) : QObject(parent) m_actionEditor->setObjectName("ActionEditor"); m_formEditor->setActionEditor(m_actionEditor); m_designerToolWindows.append(m_actionEditor); - connect(m_formEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) ); + connect(m_actionEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) ); m_designerIntegration = new QDesignerIntegration(m_formEditor,this); m_formEditor->setIntegration(m_designerIntegration); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index ec1332c..7c7c2bc 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -253,6 +253,7 @@ void ReportDesignWidget::createNewDialogTab(const QString& dialogName, const QBy QWidget* dialogDesigner = m_dialogDesignerManager->createFormEditor(description); int pageIndex = m_tabWidget->addTab(dialogDesigner,QIcon(),dialogName); m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); + m_tabWidget->setCurrentIndex(pageIndex); } DialogDesigner*ReportDesignWidget::activeDialogPage() diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index b2df5a1..b44eff7 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -78,8 +78,8 @@ ReportDesignWindow::ReportDesignWindow(ReportEnginePrivate *report, QWidget *par createDialogPropertyEditor(); createDialogObjectInspector(); createDialogActionEditor(); - createDialogResourceEditor(); createDialogSignalSlotEditor(); + createDialogResourceEditor(); createDialogDesignerToolBar(); #endif m_instance=this; @@ -330,7 +330,9 @@ void ReportDesignWindow::createToolBars() createReportToolBar(); - m_pageTools << m_mainToolBar << m_reportToolBar << m_fontEditorBar << m_textAlignmentEditorBar << m_itemsBordersEditorBar; + m_pageTools << m_mainToolBar << m_reportToolBar << m_fontEditorBar + << m_textAlignmentEditorBar << m_itemsAlignmentEditorBar + << m_itemsBordersEditorBar; } @@ -544,42 +546,45 @@ void ReportDesignWindow::createDialogPropertyEditor() void ReportDesignWindow::createDialogObjectInspector() { - QDockWidget *doc = new QDockWidget(this); - doc->setWindowTitle(tr("Object Inspector")); - doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::ObjectInspector)); - doc->setObjectName("ObjectInspector"); - addDockWidget(Qt::RightDockWidgetArea,doc); - m_dialogEditors.append(doc); + QDockWidget *dock = new QDockWidget(this); + dock->setWindowTitle(tr("Object Inspector")); + dock->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::ObjectInspector)); + dock->setObjectName("ObjectInspector"); + addDockWidget(Qt::RightDockWidgetArea,dock); + m_dialogEditors.append(dock); } void ReportDesignWindow::createDialogActionEditor() { - QDockWidget *doc = new QDockWidget(this); - doc->setWindowTitle(tr("Action Editor")); - doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::ActionEditor)); - doc->setObjectName("ActionEditor"); - addDockWidget(Qt::BottomDockWidgetArea,doc); - m_dialogEditors.append(doc); + QDockWidget *dock = new QDockWidget(this); + dock->setWindowTitle(tr("Action Editor")); + dock->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::ActionEditor)); + dock->setObjectName("ActionEditor"); + addDockWidget(Qt::BottomDockWidgetArea,dock); + m_dialogEditors.append(dock); + m_docksToTabify.append(dock); } void ReportDesignWindow::createDialogResourceEditor() { - QDockWidget *doc = new QDockWidget(this); - doc->setWindowTitle(tr("Resource Editor")); - doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::ResourceEditor)); - doc->setObjectName("ResourceEditor"); - addDockWidget(Qt::BottomDockWidgetArea,doc); - m_dialogEditors.append(doc); + QDockWidget *dock = new QDockWidget(this); + dock->setWindowTitle(tr("Resource Editor")); + dock->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::ResourceEditor)); + dock->setObjectName("ResourceEditor"); + addDockWidget(Qt::BottomDockWidgetArea,dock); + m_dialogEditors.append(dock); + m_docksToTabify.append(dock); } void ReportDesignWindow::createDialogSignalSlotEditor() { - QDockWidget *doc = new QDockWidget(this); - doc->setWindowTitle(tr("SignalSlot Editor")); - doc->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::SignalSlotEditor)); - doc->setObjectName("SignalSlotEditor"); - addDockWidget(Qt::BottomDockWidgetArea,doc); - m_dialogEditors.append(doc); + QDockWidget *dock = new QDockWidget(this); + dock->setWindowTitle(tr("SignalSlot Editor")); + dock->setWidget(m_reportDesignWidget->toolWindow(ReportDesignWidget::SignalSlotEditor)); + dock->setObjectName("SignalSlotEditor"); + addDockWidget(Qt::BottomDockWidgetArea,dock); + m_dialogEditors.append(dock); + m_docksToTabify.append(dock); } void ReportDesignWindow::createDialogDesignerToolBar() @@ -1252,9 +1257,15 @@ void ReportDesignWindow::showDefaultEditors(){ foreach (QDockWidget* w, m_pageEditors) { w->setVisible(m_editorTabType != ReportDesignWidget::Dialog); } +#ifdef HAVE_QTDESIGNER_INTEGRATION foreach (QDockWidget* w, m_dialogEditors) { w->setVisible(m_editorTabType == ReportDesignWidget::Dialog); } + for ( int i = 0; i < m_docksToTabify.size() - 1; ++i){ + tabifyDockWidget(m_docksToTabify.at(i),m_docksToTabify.at(i+1)); + } + m_docksToTabify.at(0)->raise(); +#endif } void ReportDesignWindow::slotActivePageChanged() diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index c3e2578..658c984 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -259,6 +259,7 @@ private: QMap m_recentFiles; QVector m_pageEditors; QVector m_dialogEditors; + QVector m_docksToTabify; ReportDesignWidget::EditorTabType m_editorTabType; QByteArray m_pageEditorsState; QByteArray m_dialogEditorsState; From 3bdec95a8c87bd6a7053f60ad6a72b4dce3dd82f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 18 Apr 2017 21:47:35 +0300 Subject: [PATCH 023/347] Icons have been changed --- limereport/images/copy3.png | Bin 0 -> 778 bytes limereport/images/paste2.png | Bin 0 -> 749 bytes limereport/images/save.png | Bin 868 -> 536 bytes limereport/images/toBack.png | Bin 591 -> 334 bytes limereport/images/toBottom.png | Bin 518 -> 295 bytes limereport/images/toCenter.png | Bin 505 -> 302 bytes limereport/images/toFront.png | Bin 634 -> 359 bytes limereport/images/toLeft1.png | Bin 503 -> 297 bytes limereport/images/toRight.png | Bin 504 -> 299 bytes limereport/images/toSameHeight.png | Bin 459 -> 239 bytes limereport/images/toSameWidth.png | Bin 453 -> 235 bytes limereport/images/toTop.png | Bin 516 -> 292 bytes limereport/images/toVCernter.png | Bin 518 -> 297 bytes limereport/images/zoom_in1.png | Bin 845 -> 467 bytes limereport/images/zoom_out1.png | Bin 849 -> 466 bytes limereport/report.qrc | 6 ++++-- 16 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 limereport/images/copy3.png create mode 100644 limereport/images/paste2.png diff --git a/limereport/images/copy3.png b/limereport/images/copy3.png new file mode 100644 index 0000000000000000000000000000000000000000..928dcf115df53f384e4c35ee17bd4f9dff61f145 GIT binary patch literal 778 zcmV+l1NHogP)i$__4I7)RUV~Impfj3HaCSiy` zSAjN4b|+tlK30GwRqPkJm- zd@Vm=B>(^a?eXbjnl@sXHTe4W{{H;?{QBPJ*x=~f`1$tp`SPyOtCPZ#p~#=i-OBm< z_uAvp^Y-x5=FnoXTwuIaV6|6pwP}j6hw=66R)00^^XkXm!eg>rcg|{b$!KD?Sy!b{ zkFSjE^yJ#)(%$FST7o(0@8iGOxM8nbWxQZ+!(?H$SyZV{VVhjn;?3jj+wAn_D1@&-rwog)a1vEynp0*t-jQ$ ztI3&js%TP}OgV%!HFh$Eq;|&Gx76gu&)>qg(V?--nzPNFu*{p7yM>UmeT=Spg{XA3 z%cjoZzslRZvd^2X%ayImmafc~ugsUL$&R2b7^U|?WiWMT#Z7FGr*;4lXR3r;RD*V2jyB4EdB z&j%JT7la773ki#eA`AG7OGpNQ1*D+@kx|hxU;$ZkIFJJiC?EtB!2-$%0Tr--8bUxF zETD-H&;kqSAOv*50{RF61F(RRF%+1Xt^^CffhELqNC3zM0Ou+xf3QClbpQYW07*qo IM6N<$f}JjCdH?_b literal 0 HcmV?d00001 diff --git a/limereport/images/paste2.png b/limereport/images/paste2.png new file mode 100644 index 0000000000000000000000000000000000000000..11399d9e72e17ecf3ab7ddfd13cd1c059f70a7d1 GIT binary patch literal 749 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47#|1tgt+=uYGWe%L=_wDhUate&0dQYatMU=Gw(J|h+=64785-e49~V-Q|%2GkN-XA)L# z5>jUzT5lXuX9PsSwT3_xRBHf2HTprdAOzGNTn7{ZvJHZ34MOS-oKjV*Puf)-w*^X7 z9kVMxY+JhDreu$G`9YhKy*9-=tqZnU{{R2Kc(--o4y%GKmbn`&{{R2?>-Uem&6YXq zEwWad-+FV?XQ7APEUWk>Q9CYe{r2li-bRa@wHBGH%+i;c9l3ijYfn!Yh_fFq@bSZ0%dFBeUv?Zn~3rzOj+>x>^He+v6?xCcZO`)C>U9UVi`{eEI z*PoweEHg`6WSTtRBx$zs=!u3`pPo2- zZ-4!kaVka3!^&3QV>z{kD@7T?4r|#}rePV9bti;&f zu;`YMEhm>=e0&HPS*P#sK5}dG@!MNZ-`jcS!S2I1H|@Hx>g>b4!07Hz`S%n^F_r}R z1v5B2yO9RsBze2LFm$lWdH^|`1s;*b3=G`DAk4@xYmNj^kiEpy*OmPti;$qK?oRGS zwLqa}PZ!4!iOas{PYX2}@U%WGQw%M*5-6ar@qjhN;pH~zT5-9q>!weAjQ^~DGCN0! zMOD+#>(oY{J1@@s-f}6}%XjNF<`>gu{bYQ4UQ+DXHQjK&Yg_8-?;dLrOz7^e*ly2| z#8Aqja;%hTj%1L-u?ft2JmCj=AL>;_9}IZ3@%ZP|)vuoYW#7%FrYmc5Dgx*n22WQ% Jmvv4FO#o1iOb`G7 literal 0 HcmV?d00001 diff --git a/limereport/images/save.png b/limereport/images/save.png index e6fe0b29ab08185a4ce50d74e389ac9a045a8078..2b31666d2e6aedb9c9ce84d613ba2900800dec1c 100644 GIT binary patch delta 146 zcmaFDHiKn?GCyN{fKP~P^+~(rS!O`Au`rBLu2A7cI0FL%V@Z%-FoVOh8)+a;lDE4H zLkFv@$K>aXav={{gaow=ytwiv0OgE4T^vIsE+;3XIJ2$c;pxd?5?%CbDcQ0<=y?y)k-BVz+uixL`Ai%-J_mP>irLFa}n~R(4@gv8Mwl}c| z2?;f0oSev;6D=)wR{nHQ3ux%o-MnDKiWMt%EHN<_);MtBNE^!x z31Fy2Y}b7JOZjvu(4VR$t`Q|Ei6yC4iOEH&K$^kGz|c(B&_LJFEX2sj%D~*p$VA(~ m*vi15?q$_R6dk$wDVb@NxHa%^Im8Rpz~JfX=d#Wzp$PyXu&4+C diff --git a/limereport/images/toBack.png b/limereport/images/toBack.png index 883ae1944f0af2822390ed87dda98a80a4c6f0ef..1fc9fe18ba9cec3679f1ebf0723920306f07dd65 100644 GIT binary patch delta 146 zcmX@la*k<&3ipHnpAgs5{WjGn?Iz}R$!)yvmcqcmz*rLG7tG-B>_!@hljQC0!qCAg z>oM7YQ7-Z!i;$o>zj9*&D~Qgf&g;-d9PoRM^zV=jVPj z;F~P=Z~hcJDOo;Vvs;}Y KUMwFx^mZVxG7o`Fz1|tJQGhIUiT|=`FBO@yVb1Neg pZ3AN~1B1GkRU1(>mdKI%cPYCIBYfm(>6O diff --git a/limereport/images/toBottom.png b/limereport/images/toBottom.png index 73c104df84f076788ab923b074a5f385cc38e861..3f9fe616b73e0785d11d73b37c94737f4754f852 100644 GIT binary patch delta 130 zcmZo;SUkfCW9u1u7*vUjLaBYoMte@D9&Y3;5$%Y fz_Vf@BM&RX{jZ#=F&WHRKs^keu6{1-oD!Mk04(LhAK4%hK3dfhF?ITh8GMBr3MTP zuM!v-tY$DUh!@P+6=(yLs1EQ6aRt(TmD(p>uAiu1BzI-bne#va#*!evUYjlCPTZko7XuKocxi!hJu=Z~5|gBa30T^vIsF87}Ec*5;4|d1}wjbelYS8EsoMgg$Leg2|6w`u7GL9Wm3o@-+ z>LeJKWx7RN<4v$HW6@MSP#Nn|n9|Na9AIl)k5nV~E7%n p87_R;IFr+SDhH!l&bLR~#2BvnGS9y~eHF-522WQ%mvv4FO#pfQEsFpE delta 344 zcmZ3-^pkmliZ4sLqpu?a!^VE@KZ&di3=9g%9znhg3{`3j3=J&|48MRv4KElNN(~qo zUL`OvSj}Ky5HFasE6@fgQ61nD;tHhg6IJ{wwI6=IGSMhs?xptC3ZNKcNswPKgTu2M zX&_FLx4VnR-VIwfP24Y6|A3oCm`C>WM@^tv43VBLjv*44lM@;k+}KPSln$^k7ci!Y zg_)J{`Kd7K<;j)t#kDZVbDQsPP?*H9OOj=6YLe6C!zwB|N?K}qikhtA6Q)g^IypSR zg+oL0bl1uit5zC6G-z(v%CN+kMf~LJyn{eXR7+eVN>UO_QmvAUQsaO$gOP!unXaLM zuAy0ok&%^wxs{QLwt=ygfkEBNs*NZ*a`RI%(<*Um;NNnH7pQ^3)78&qol`;+0MZp_ AHvj+t diff --git a/limereport/images/toFront.png b/limereport/images/toFront.png index 8d04661a1d71b5cfea0797c69e5f467f62845027..f6666ba4754138e1b2c8310e44a01729cff412f6 100644 GIT binary patch delta 135 zcmeyx@|mdKI;Vst06M57-2eap delta 437 zcmaFP^owPJiVI7+qpu?a!^VE@KZ&di3=9g%9znhg3{`3j3=J&|48MRv4KElNN(~qo zUL`OvSj}Ky5HFasE6@fgu`$3W#1%+S)Ld6@-_8*TWXhHV`2{ol!UG;3Dqaj!$e85q z?jl#jrJxPua29w(7Bet#3xhBt!>leJhGoZY62~0=*1@5ysSd(a_My$QHjy(^6hvT{nXU4u-~UX2QnY+Q!m8%XO@+ zt=ZMZt<7T^+NZbo&!0YBTu(tkLqkDDM~6jRKu}azTwGkRk=vu8u}|+#ny03xXQrfW zE%S=miRX+=OpM$LH+Qa_Y1!4#y0lfaivi@ilL9W&Ytk+NS*j(j5hZCUi6yC4$wjF^ ziowXh&`j6RK-bVL#K_3Xz}(8nMBBjF%D|xRWz|NQ4zPyY{FKbJO57Uww;bXHYGCkm L^>bP0l+XkKS&4|h diff --git a/limereport/images/toLeft1.png b/limereport/images/toLeft1.png index 18900601dbdd6256f2cdff28811d15b05f360562..88cc447cf31f2f3f3f706d7aaa8bf8dca05bc722 100644 GIT binary patch delta 135 zcmey)ypm~x3SUKlPl)To&sXddRs1ToCl=<*?c;ZBWME)mED7=pW^j0RBMrn!@^*J& z=wOxgnD|f5=OK%b5R(R5?K4xLl$NK9V~E7%5i9$Q^DK{|Bmi|Wc)I$ztaD0e0sw(tDy0Ab delta 342 zcmZ3<^qqNviZ4sLqpu?a!^VE@KZ&di3=9g%9znhg3{`3j3=J&|48MRv4KElNN(~qo zUL`OvSj}Ky5HFasE6@fgQ61nD;tHhg6IJ{wwI6=IGSMhs?xptC3ZNKcNswPKgTu2M zX&_FLx4VnR-VIwfP24Y6|A3oCm`C>WM@^tv4B?(Gjv*44lM@nB9GD|mW+X7^9XNC7 z)Uk61J5>%GJ$v}v!ES*E$q%223%Ce5m^ZUzE6!?Qayq26DCv>Vq@V)EOvy;gN>&%;;J*%SxEf_(L=|!?H6hiYKRU+61&hwZt`|BqgyV)hf9tHL)ZnmBGls&`j6R zK-bVL#K_3Xz}(8nMBBjF%D|xRWz|L$9l7}_nQ4`{HSlja#0%8G;OXk;vd$@?2>>LJ BZ%F_E diff --git a/limereport/images/toRight.png b/limereport/images/toRight.png index e4946f435e93f52dac919883ea80454b0f60e8c9..14b348f5b6609be9b8e9399c05e6fe1590df96de 100644 GIT binary patch delta 137 zcmeytyqal(3SUKlPl#*B`5^m56~9XDiG}%c^Xz{;U|?WiED7=pW^j0RBMrn!@^*J& z=wOxgnD|f5?;(qj5R=lg75v&jDIHH2#}J9j$q5dOJv=-StTPfA^b|N5mvAhY?RX+e nP0d8tK>1;tkm3QCSz8%q&SBM*VfKjv>SOS9^>bP0l+XkKvy3T& delta 343 zcmZ3@^n-bViZ4sLqpu?a!^VE@KZ&di3=9g%9znhg3{`3j3=J&|48MRv4KElNN(~qo zUL`OvSj}Ky5HFasE6@fgQ61nD;tHhg6IJ{wwL8uSO*G1vE2=&b3KU~33GxeOaCmkj z4a7^T>Yws0lQSA;QzeF+}2Wa)JY64-ZcS>x={jy#r?s zojP{zV5h)?q{OGs9=eJ>cr5rnKLeIG2rCv?&#|D_V7B$x+FE_=@U_r zhfH3lv{og3%6e76sCH=$E5n*{7Ts{AoiRW=R7+eVN>UO_QmvAUQWIlKQW=a449#>6 z4Rj67LX3>849u;JOtcM*tqct6URG^H(UF^&n0}NOI69~X5kN^t{3lp3g)B@;EM+4~I2LRDf0g2WD R!3zKY002ovPDHLkV1mXuA@KkJ delta 349 zcmaFQc$#^FiZ4sLqpu?a!^VE@KZ&di3=9g%9znhg3{`3j3=J&|48MRv4KElNN(~qo zUL`OvSj}Ky5HFasE6@fg;St~y;tHhg6IJ{wweNmBJJHBSE-tD2HBgMPB*-tA!Qt7B zG!Q4r+ucQ+``V2Di9K@l54c%`d1OC-)C8Kv5a;RQ7$R{w_q;b>g8~oB1+6gGkOTbR z?N`mTc)2LiY{K+QVv;dSCJSz47Ffm*5PE3OnuZ;&PF|cFcn&}!E=o*@Z7#Ud^m|Gc{Xd4(?85q>PtlEgABh@N5KP5A*61N8aEr)o48W=oX L{an^LB{Ts5i^gXUX8ODtJRZEw0v+$hS*(7`I}G4ZsV<3ko9 zA!ZZq^lobg1_pUg7sn8Z%gG5T4valK5iBz%Ft{{G@^y$gm?sxRaWiZzVDznJICc)G Ol)=;0&t;ucLK6U}%^|q} delta 346 zcmaFOc$9g9N&ri`qpu?a!^VE@KZ&di3=9g%9znhg3{`3j3=J&|48MRv4KElNN(~qo zUL`OvSj}Ky5HFasE6@fg;St~y;tHhg6IJ{wwX09swVm^wXlf}pMvC-_I>m4#PBYxdk_T-M2~`G4jTpz|42OI#yLQW8s2t&)pU6JtwK8H@}J z&2$Y7bPdfyjEt-d%&m+}v<-}{3=HaCR&7Mlk(-~AnO2Eg1OJvoyg&^Mp00i_>zopr E0Qp#PV*mgE diff --git a/limereport/images/toTop.png b/limereport/images/toTop.png index 7b91b8eef064047b131a9cbdd1911fa8d707398c..58c25e4d6f2d5adba6b3ea712e688b453e51385a 100644 GIT binary patch delta 133 zcmZo+S;90yMX(~kC&cyP=ganqDt?vPO=mnNmgLB-d-Eonfq{XsB*-tA!Qt7BG!Q4r z+uensgH_gJ;y*d}hb%%uEF$$DwkAL+RZkbk5Q)pl2@dQ%84Zlw2~3O@tU?KCX=zQt iCE^a{>}}qiYz&jPF>>Buu5tuwVDNPHb6Mw<&;$T?Whk)# delta 358 zcmZ3&)WR}BC4eQ}(btiIVPik{pF~y$1_p&>k04(LhAK4%hK3dfhF?ITh8GMBr3MTP zuM!v-tY$DUh!@P+6=(yLs1EQ6aRt)$i7I}T+D&IX9)7+&(KJV{X8ZKRKw-v`AirP+ zhi5m^K%69RcNdMl8@6tmxL>aR0XK^4s3S=_o@<{1O+Q!UAKjVMV; zEJ?LWE=mPb3`PcqX1az3x`t*UMn+Z!=2k`~+6Kl}1_pI6t2Tmlz%=CMr(~v8;?}^w S&vtbH diff --git a/limereport/images/toVCernter.png b/limereport/images/toVCernter.png index 3e0689bcef591e42209b8c82098ddd4aa3ca0699..79f2fe054a75acafed01d40cc0a19dee83a3df58 100644 GIT binary patch delta 135 zcmZo;S;;g(g|8yOC&ab;La1M*cGDS;iG}%czh3{p$-uzCSQ6wH%;50sMjD8dGHkQd*uajv*44lM@t}44N3a7=(p|l{Z=VFgOV+Dkw0d l9n>s3bKn_Y$@EEF4Bbo&U;FRpbO3cRc)I$ztaD0e0stK#EEoU) delta 357 zcmZ3<)W$MF#g`@B(btiIVPik{pF~y$1_p&>k04(LhAK4%hK3dfhF?ITh8GMBr3MTP zuM!v-tY$DUh!@P+6=(yLs1EQ6aRt(TmD){bJi0H0PBhAwyLjV@El`ZHB*-tA!Qt7B zG!Q4r+ucQD?}n|LChnK3f56Qm%p?2xqbATShBQwX#}J9jQ_s2cH8}7vJ8b%LuR8kI z|9XyTMGSrqx|dE=b`7*^nZVAW_~PA?EUN?7_u~VNO z4UL!*+Ut6GTg|1f%n4H_CC(B*uq%(}ccIPyiuzyX>dH4*;=k_`-UYNVTeZYBq9i4; zB-JXpC>2OC7#SFv=^7g78k&U|8Ce;aTN#;X8yH&|7}UM2+6dHv(2$#-l9^VCTLb@= RL%cu@44$rjF6*2UngE5ic}D;M diff --git a/limereport/images/zoom_in1.png b/limereport/images/zoom_in1.png index 4e6fc7a9a55818197bcfc2f37563bc7b1fe4de63..f1d1b62ec47c175ad4824232c7df1ced2ea12103 100644 GIT binary patch delta 427 zcmV;c0aX6Y2GawO85#xv001BJ|6u?C00v@9M??Th0D1sG#JX33lj{KuRoTr}jz{@@F`+t7_=XrTgVooHFV{1Tm zyuv^S&;i}htPfEq&4KrUe{<$X#?Y)Pz>*g%2ZAJ{DGqm!SXo}>?emqv&j4U=b9>|Q z;ri)bnlbh}Kx}J=Lb^EBx?C$^-Cl`p$mi0tqO%h|IE&hOAzefc1nv5n25KaMS2*;n z-=&2CR3$#uS>%;m6IF?GaZ>{byC>)Xn5~9gT*)=3a-jnqw}B2|f41wMS8(XM+u#JC z*Y8rUmFz>&S-e88-?a@S#}obntSdvFTO(gN5JZh6P?b1ltAW|BJK>C>SyjmiM^Zxo zzFx3R7X67nHw+VS9=HR($KN~<5-@<@4Yw~xu%TJvdZ%8aOw2h0UKoBS_+J>{57+R7 Vr8R_-5&!@I07*qo1w^hwV1l}aynFxv literal 845 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>`T@Ck7RDoCDXhK9DD zU-0DJy~l5FpSyQp?*7Kq*%ojGcV1ll_4~)CZ|`1xeDd)1%^T0o9=@?DZH^UC!PavN z{{H>*^~a|xPfnb=vwPXmzSLP3zyJLH{`1T6TibVCS_b5nEcN~Q=f{qVOETx$WzTc? z^5etCGqX}=TbzGz`1$+$+b%4exwjT*RNexYo6pbRe0FZ<#igr`Pt2HW3lz+nXSe0t zJfO*kZfx9fVe!2EjX*=HPl8a&Y)c?JWtKVIoe;*G&(H6^xcvUh>*wzuTz`7{{QZNU zzP&woW5b(I&!4=#d*{WaGk5nLzPWk#<(2ndUA^}7^zmEU_FY|b;o;$vcXl4QwjLNb zDSI{?22!3SL4Lsul~4XYzWVLZ^#?ajzqnTZ{q&pfzrVk^aJS~-r@#L`UHS3u@4vTS zKK}UmODRS*L#FG01ahK@^*J&=wOxg z0CG4BJR*x37`TN&n2}-D90{Nxdx@v7EBga(7GWOQ&mT2`vBz-0)5S4F;&O5V1GAf2 zntz&@8=FMJ*A|8_i}}5CnV7^-l{Cd1Y_o_rZxw)Otv;PIomiNKD4!ThGN=_SFSEq zZmzGTD>gCwY@0XF?UQ3&*q6G*sWf^bn4dLwR3Gx$kxo8$JggD-O6%zMbq7< zFJHcR@!}=tC+^AG%pnIZU*>(MJ3&muuGu=^2y-VtLqxu^fQ8l)V5($LEpd$~Nl7e8 zwMs5Z1yT$~28L$3h6cKZW+6sKRtDx)Mkd+@##ROfbuX(nqG-s?PsvQH#I1pU%OPH% O1_n=8KbLh*2~7ZG>y``v diff --git a/limereport/images/zoom_out1.png b/limereport/images/zoom_out1.png index cce6ea29053eb2f9da890f09efdbdd43f9cb0dd5..04db40649174825046d7b455a6bac81d1779746a 100644 GIT binary patch delta 451 zcmV;!0X+WE2GRqN8Gi-<001BJ|6u?C00v@9M??Th0D1sG#JX3300009a7bBm000XU z000XU0RWnu7ytkO2XskIMF-&o5)vyCgg2mU0004BNklGAgYVXOnE?RS9W_AZ5N$yd6nmoe{e zM7Zj<6LS0#34cce$pD3HiAXpq!kjxd5>Vo4Cc%{-6PR~i8%0h5aCDyVk?Z+3ik#x= zPDk8#3v_@j!)kG?o>0%X13NIRme_W@7Bm3EZcen|%4>lFy?&RfUJfKz^)kJFSA;d+ zAbICNiKkKI6o%Epu$v=tOdj%Lg#c(&OlhV`jLAcm*F1jr_Vu5LH058Y0mL)I(On@T tF(uSu@;gW*G_8Q}EGqkc14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>|BWU zo6pYu{rl(Zk55;goH%u7_oSUAX>+Xq|NsB}=a=KRw(q>Sq+p@j&p$tQTwIc~zzJv+ z(2z}M=VZ*WIecUD^Y{0+U0AsAP&?45?D-Bio}K}kw)5iB)yF4g&vyh0X3cZha&G>K z+dB{4*a#G#x4$uCt}W1=nRD$@W?NLBv;!iDGvMT#&(9ydxpnu&<@aA+KY#z=_KS<_qEgn48?f7ArVBEud} z7sn8Z%gG5qkdpK*AuTbbfiaAqBcb)vO`98*7CU!TRxDJik^95c6K3sVk7#X6EAYsOsBl>_ z%`Ad-a(iE1NQqC*oOyOfc$oQ}l^_3TaS;wS=I1Z&u-4I8yCyg1txd#3CAn{WeGb#D zEUO*nJUYbmsk^;>^5n_w?04LG)+q?4FizkI;pW-F`12h@K$o)cTF<0Vpg&YgTq8?+%fw`5DiMD~Um4QLs%c_ki8glbfGSez?YvA8< Rh!?1V!PC{xWt~$(697hElh^images/hlayuot_3_24.png images/addBand1.png images/delete1.png - images/copy2.png + images/copy2.png images/new_leaf1.png - images/paste1.png + images/paste1.png images/zoom_in1.png images/zoom_out1.png images/folder3.png @@ -177,5 +177,7 @@ images/logo_32x32_1.png images/addDialog.png images/deleteDialog.png + images/copy3.png + images/paste2.png From 170057639447a001e32dd059808b3acc9a1be853 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 19 Apr 2017 02:04:14 +0400 Subject: [PATCH 024/347] Qt4 build fixed --- .../designer/qdesigner_integration_p.h | 2 +- limereport/dialogdesigner/dialogdesigner.pri | 10 +++- .../dialogdesigner/lrdialogdesigner.cpp | 47 ++++++++++++------- limereport/dialogdesigner/lrdialogdesigner.h | 8 ++-- limereport/lrpreviewreportwidget.cpp | 8 +++- limereport/lrreportengine.cpp | 10 ++++ 6 files changed, 60 insertions(+), 25 deletions(-) diff --git a/limereport/dialogdesigner/3rdparty/designer/qdesigner_integration_p.h b/limereport/dialogdesigner/3rdparty/designer/qdesigner_integration_p.h index f59c001..6c76d10 100644 --- a/limereport/dialogdesigner/3rdparty/designer/qdesigner_integration_p.h +++ b/limereport/dialogdesigner/3rdparty/designer/qdesigner_integration_p.h @@ -94,7 +94,7 @@ signals: public slots: virtual void updateProperty(const QString &name, const QVariant &value, bool enableSubPropertyHandling); // Additional signals of designer property editor - virtual void updatePropertyComment(const QString &name, const QString &value); +// virtual void updatePropertyComment(const QString &name, const QString &value); virtual void resetProperty(const QString &name); virtual void addDynamicProperty(const QString &name, const QVariant &value); virtual void removeDynamicProperty(const QString &name); diff --git a/limereport/dialogdesigner/dialogdesigner.pri b/limereport/dialogdesigner/dialogdesigner.pri index df76e68..9bd17dd 100644 --- a/limereport/dialogdesigner/dialogdesigner.pri +++ b/limereport/dialogdesigner/dialogdesigner.pri @@ -11,7 +11,15 @@ lessThan(QT_MAJOR_VERSION, 5){ DEFINES += HAVE_QTDESIGNER_INTEGRATION } } -QT += designer designercomponents-private + +greaterThan(QT_MAJOR_VERSION, 4) { + QT *= designer designercomponents-private + +} else { + CONFIG *= designer + qtAddLibrary( QtDesignerComponents ) +} +#QT += designer designercomponents-private SOURCES += $$PWD/lrdialogdesigner.cpp HEADERS += $$PWD/lrdialogdesigner.h diff --git a/limereport/dialogdesigner/lrdialogdesigner.cpp b/limereport/dialogdesigner/lrdialogdesigner.cpp index 6a33752..82a08d0 100644 --- a/limereport/dialogdesigner/lrdialogdesigner.cpp +++ b/limereport/dialogdesigner/lrdialogdesigner.cpp @@ -3,9 +3,6 @@ #include #include -#include -#include - #include #include #include @@ -19,10 +16,17 @@ #include #include #include -#include "pluginmanager_p.h" -//#include +#if HAVE_QT5 +#include +#endif +#if HAVE_QT4 +#include "qdesigner_integration_p.h" +#include +#endif +#include "pluginmanager_p.h" #include "widgethost.h" +#include namespace LimeReport{ @@ -98,7 +102,12 @@ DialogDesignerManager::DialogDesignerManager(QObject *parent) : QObject(parent) m_designerToolWindows.append(m_actionEditor); connect(m_actionEditor, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*)) ); +#ifdef HAVE_QT4 + m_designerIntegration = new qdesigner_internal::QDesignerIntegration(m_formEditor,this); +#endif +#ifdef HAVE_QT5 m_designerIntegration = new QDesignerIntegration(m_formEditor,this); +#endif m_formEditor->setIntegration(m_designerIntegration); } @@ -151,7 +160,7 @@ QWidget *DialogDesignerManager::createFormEditor(const QString &content) DialogDesigner* dialogDesigner = new DialogDesigner(wnd, m_formEditor); - connect(dialogDesigner, SIGNAL(dialogChanged()), this, SLOT(slotDialogChanged())); + connect(dialogDesigner, SIGNAL(dialogChanged(QString)), this, SIGNAL(dialogChanged(QString))); connect(dialogDesigner, SIGNAL(dialogNameChanged(QString,QString)), this, SIGNAL(dialogNameChanged(QString,QString))); connect(dialogDesigner, SIGNAL(destroyed(QObject*)), this, SLOT(slotObjectDestroyed(QObject*))); @@ -253,14 +262,6 @@ void DialogDesignerManager::slotActiveFormWindowChanged(QDesignerFormWindowInter } } -void DialogDesignerManager::slotDialogChanged() -{ - DialogDesigner* dialogDesigner = dynamic_cast(sender()); - if (dialogDesigner){ - emit dialogChanged(dialogDesigner->dialogName()); - } -} - QString DialogDesignerManager::iconPathByName(const QString &name) { if (name.compare("__qt_edit_signals_slots_action") == 0) @@ -276,8 +277,7 @@ DialogDesigner::DialogDesigner(QDesignerFormWindowInterface* wnd, QDesignerFormE :QWidget(parent, flags), m_formEditor(formEditor) { m_dialogName = wnd->mainContainer()->objectName(); - connect(wnd, SIGNAL(changed()), this, SIGNAL(dialogChanged())); - connect(wnd->mainContainer(), SIGNAL(objectNameChanged(QString)), this, SLOT(slotMainContainerNameChanged(QString))); + connect(wnd, SIGNAL(changed()), this, SLOT(slotDialogChanged())); m_designerHolder = new SharedTools::WidgetHost(this,wnd); m_designerHolder->setFrameStyle( QFrame::NoFrame | QFrame::Plain ); @@ -308,7 +308,7 @@ bool DialogDesigner::isChanged() void DialogDesigner::setChanged(bool value) { - m_designerHolder->formWindow()->setDirty(false); + m_designerHolder->formWindow()->setDirty(value); } QByteArray DialogDesigner::dialogContent() @@ -342,4 +342,17 @@ void DialogDesigner::slotMainContainerNameChanged(QString newName) } } +void DialogDesigner::slotDialogChanged() +{ + Q_ASSERT(m_designerHolder != NULL); + if (m_designerHolder && m_designerHolder->formWindow()){ + if ( m_designerHolder->formWindow()->mainContainer()->objectName().compare(m_dialogName) !=0 ){ + emit dialogNameChanged(m_dialogName, m_designerHolder->formWindow()->mainContainer()->objectName()); + m_dialogName = m_designerHolder->formWindow()->mainContainer()->objectName(); + } + emit dialogChanged(m_dialogName); + m_designerHolder->formWindow()->setDirty(false); + } +} + } diff --git a/limereport/dialogdesigner/lrdialogdesigner.h b/limereport/dialogdesigner/lrdialogdesigner.h index 8a0bfbe..a5c33bc 100644 --- a/limereport/dialogdesigner/lrdialogdesigner.h +++ b/limereport/dialogdesigner/lrdialogdesigner.h @@ -4,6 +4,7 @@ #include #include #include +#include class QDesignerFormEditorInterface; class QDesignerFormWindowInterface; @@ -23,7 +24,7 @@ namespace LimeReport{ class DialogDesigner : public QWidget{ Q_OBJECT public: - DialogDesigner(QDesignerFormWindowInterface *wnd, QDesignerFormEditorInterface* formEditor, QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = Qt::WindowFlags()); + DialogDesigner(QDesignerFormWindowInterface *wnd, QDesignerFormEditorInterface* formEditor, QWidget *parent = NULL, Qt::WindowFlags flags = Qt::WindowFlags()); ~DialogDesigner(); QString dialogName() const; void setDialogName(const QString &dialogName); @@ -34,11 +35,11 @@ public slots: void undo(); void redo(); signals: - void dialogChanged(); + void dialogChanged(QString dialogName); void dialogNameChanged(QString oldName, QString newName); - private slots: void slotMainContainerNameChanged(QString newName); + void slotDialogChanged(); private: QString m_dialogName; SharedTools::WidgetHost* m_designerHolder; @@ -69,7 +70,6 @@ private slots: void slotObjectDestroyed(QObject* object); void slotEditWidgets(); void slotActiveFormWindowChanged(QDesignerFormWindowInterface *formWindow); - void slotDialogChanged(); private: QString iconPathByName(const QString& name); private: diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index dcddb74..fdf2e3b 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -163,8 +163,12 @@ void PreviewReportWidget::print() QPrinter printer(QPrinter::HighResolution); if (!pi.defaultPrinter().isNull()) - printer.setPrinterName(pi.defaultPrinterName()); - +#ifdef HAVE_QT4 + printer.setPrinterName(pi.defaultPrinter().printerName()); +#endif +#ifdef HAVE_QT5 + printer.setPrinterName(pi.defaultPrinterName()); +#endif QPrintDialog dialog(&printer,QApplication::activeWindow()); if (dialog.exec()==QDialog::Accepted){ if (!d_ptr->m_reportPages.isEmpty()) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 6f9c6e0..10ea8bb 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -274,7 +274,12 @@ bool ReportEnginePrivate::printReport(QPrinter* printer) if (!printer&&!m_printerSelected){ QPrinterInfo pi; if (!pi.defaultPrinter().isNull()) +#ifdef HAVE_QT4 + m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); +#endif +#ifdef HAVE_QT5 m_printer.data()->setPrinterName(pi.defaultPrinterName()); +#endif QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); m_printerSelected = dialog.exec()!=QDialog::Rejected; } @@ -301,7 +306,12 @@ bool ReportEnginePrivate::printPages(ReportPages pages, QPrinter *printer, Print if (!printer&&!m_printerSelected){ QPrinterInfo pi; if (!pi.defaultPrinter().isNull()) +#ifdef HAVE_QT4 + m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); +#endif +#ifdef HAVE_QT5 m_printer.data()->setPrinterName(pi.defaultPrinterName()); +#endif QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); m_printerSelected = dialog.exec()!=QDialog::Rejected; if (m_printerSelected){ From 64c4a7fc3d69bad258bb254a3609adee3eda43ff Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 19 Apr 2017 02:44:57 +0400 Subject: [PATCH 025/347] Icons have been changed --- limereport/dialogdesigner/dialogdesigner.pri | 1 - limereport/images/zoom_in1.png | Bin 467 -> 564 bytes limereport/images/zoom_out1.png | Bin 466 -> 484 bytes 3 files changed, 1 deletion(-) diff --git a/limereport/dialogdesigner/dialogdesigner.pri b/limereport/dialogdesigner/dialogdesigner.pri index 9bd17dd..960b7c3 100644 --- a/limereport/dialogdesigner/dialogdesigner.pri +++ b/limereport/dialogdesigner/dialogdesigner.pri @@ -19,7 +19,6 @@ greaterThan(QT_MAJOR_VERSION, 4) { CONFIG *= designer qtAddLibrary( QtDesignerComponents ) } -#QT += designer designercomponents-private SOURCES += $$PWD/lrdialogdesigner.cpp HEADERS += $$PWD/lrdialogdesigner.h diff --git a/limereport/images/zoom_in1.png b/limereport/images/zoom_in1.png index f1d1b62ec47c175ad4824232c7df1ced2ea12103..e26b6ecee167f61de5ea87e4d6468de1db9541c8 100644 GIT binary patch delta 503 zcmVy{D6rGa-K#DhUuk@ErgE0l`T`K~y-)rIRs88(|d3 ze`gdzLnK+Qm_UtL61;;#Aw;x-HIz=CajQ_lfG$GmeC<$|aEOC+35bQ*cF0&cx+bLH zpadjCE(C;Lwm_Gbq&7k+*CDx}$3>{V>EnIx|Nq|mzyAk!3}M)XqDm3qEszER{d9jB z_@HaX;f(}}Dy;*1KCeHJoKA5+7y{s=UcziO01kD{$P9g1QKcW*PcN-s-L~Zn{rID$ zsFJ0q(l&s{Nf4VC_rzd$W;?Tw&+DgVR@mHqh5*RX1hEGX5rCRmS%}Sx??zmjSXX9W z;Pd*23b!=3W*^g|ZUs}JH~`D9lX@wVoL(fmk*8)>cyo{;^=O&rsV(TuZ`YRHG$@zOj_h?I2EweS zwveNVUU!!r-hbHvXzH3#7M%O{j0yS4q@VV=ho|x?OLJ=jK~L)?3dI~|tMOwKc%o}Y zRd9l%kH-P{cHHLgAInXmCa|JwMs?uCA>d5kx>v1S)ivYj+FwvqDeV~(K0Coz{eDx7 t0I$UOy<36pHGcix_`T5T&HGtdbGa-KxEE3ChHmd*t0bof)K~y-)m69<_0$~`( ze`iMFa89|_61asoxCO$6f{W4MlGqmrAz;pCaOk?*-~^!8?^3Rn>_gF6yh5+vwGAZ46aE6M zD?^@JBVRcXM2#d+l{jXrf!VG*;f$eKRmllQQbPc~Ua(CT{fRy|3=?o3xC6e&-#ic! zFo53;w=YMqp;_X3r(UB>%sB&I7=9=CUl`yI*YJd;HH4B900000NkvXXu0jG}g2EZL A`2YX_ diff --git a/limereport/images/zoom_out1.png b/limereport/images/zoom_out1.png index 04db40649174825046d7b455a6bac81d1779746a..ad1ab694d3ff3040dccc77f408200fc9412532c1 100644 GIT binary patch delta 458 zcmV;*0X6>81LOmcB!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0004o zNklNeu=IEhn(p z%lFS1PF~x~@b$-MkU@n&Ll$6l22gVY5dYtFWYK?g@a6lb|9`EEbN>V7-vhA%x?U!r zpa77rk95vr@U@P`Fr1r%mmxo-l|f8U8mtb(03Z$kF|cVyHpI^=2E4h zIf)Ec?w!UkU}M`A21O|itcJ57b3g%z3w-_l8K(gUKz_S&|1?92cR5Z2PF&juqA;S8 z2^cjX10KxT(tinxF07jGKfl4S?;I#OfGtA-%pgMDR_x%1FK;5w-8#x4$ScAiBdQ2- zHqgLz2j?;@*x$w=VaUet>G>}MH7n7FH;=r&fGr^z0IBt`Kt-{Im61Woh7ZiXcjObp z-{1ceVTpIsj`YpjsO4fxL^6tUUfbZ}BF#P|=un-`?0H5@%>lAs?0000007*qoM6N<$fcSmN#TmBH5lV1Hw0{ps=c`C+UBr|oxuSD0dRDl@R95JHj13$>P|=8cMEiYEyHSY zte#NMw*xyctd`hzycRS7!){Kr;L2-(0=<5hs$LExSM@TzepiGw-ynJCK#8YObvSFLbLyJ$Hrx0000 Date: Thu, 20 Apr 2017 23:34:32 +0300 Subject: [PATCH 026/347] Prevent multi run initscript Prevent multi run initscript Prevent multi run initscript & Build without HAVE_UI_LOADER has been fixed --- limereport/items/lrtextitem.cpp | 2 +- limereport/lrreportdesignwidget.cpp | 3 +- limereport/lrreportdesignwindow.cpp | 2 + limereport/lrreportengine.cpp | 28 ++- limereport/lrreportengine_p.h | 1 - limereport/lrreportrender.cpp | 179 +++---------- limereport/lrreportrender.h | 22 +- limereport/lrscriptenginemanager.cpp | 249 +++++++------------ limereport/lrscriptenginemanager.h | 6 + limereport/scriptbrowser/lrscriptbrowser.cpp | 5 +- limereport/scriptbrowser/lrscriptbrowser.h | 2 +- 11 files changed, 166 insertions(+), 333 deletions(-) diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 4f4d258..d674bf2 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -503,7 +503,7 @@ TextItem::TextPtr TextItem::textDocument() const } //text->documentLayout(); - if (m_lineSpacing != 1 || m_textIndent !=0 ){ + if (m_lineSpacing != 1 || m_textIndent != 0 ){ for ( QTextBlock block = text->begin(); block.isValid(); block = block.next()) { diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 6648354..b082273 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -77,8 +77,9 @@ ReportDesignWidget::ReportDesignWidget(ReportEngine *report, QMainWindow *mainWi connect(m_report,SIGNAL(pagesLoadFinished()),this,SLOT(slotPagesLoadFinished())); connect(m_report,SIGNAL(cleared()),this,SIGNAL(cleared())); connect(m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slotCurrentTabChanged(int))); +#ifdef HAVE_UI_LOADER connect(m_report->scriptContext(), SIGNAL(dialogDeleted(QString)), this, SLOT(slotDialogDeleted(QString))); - +#endif //m_instance=this; m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); m_zoomer = new GraphicsViewZoomer(activeView()); diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 2f15315..cee9775 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -1277,7 +1277,9 @@ void ReportDesignWindow::slotActivePageChanged() switch (m_editorTabType) { case ReportDesignWidget::Dialog: m_dialogEditorsState = saveState(); +#ifdef HAVE_UI_LOADER m_scriptBrowser->updateDialogsTree(); +#endif break; default: m_pageEditorsState = saveState(); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 8dcd2fc..0729fca 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -795,22 +795,34 @@ ReportPages ReportEnginePrivate::renderToPages() connect(m_reportRender.data(),SIGNAL(pageRendered(int)), this, SIGNAL(renderPageFinished(int))); + if (m_pages.count()){ +#ifdef HAVE_UI_LOADER + m_scriptEngineContext->initDialogs(); +#endif ReportPages result; m_reportRendering = true; - emit renderStarted(); + m_reportRender->setDatasources(dataManager()); m_reportRender->setScriptContext(scriptContext()); - foreach(PageDesignIntf* page , m_pages){ - m_pages.at(0)->setReportSettings(&m_reportSettings); - result.append(m_reportRender->renderPageToPages(page)); + foreach (PageDesignIntf* page, m_pages) { + scriptContext()->baseDesignIntfToScript(page->pageItem()); } - m_reportRender->secondRenderPass(result); - emit renderFinished(); - m_reportRender.clear(); - m_reportRendering = false; + if (m_scriptEngineContext->runInitScript()){ + emit renderStarted(); + + foreach(PageDesignIntf* page , m_pages){ + page->setReportSettings(&m_reportSettings); + result.append(m_reportRender->renderPageToPages(page)); + } + + m_reportRender->secondRenderPass(result); + emit renderFinished(); + m_reportRender.clear(); + m_reportRendering = false; + } return result; } else { return ReportPages(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index f900217..8a989d6 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -181,7 +181,6 @@ private: bool m_reportRendering; bool m_resultIsEditable; QString m_passPhrase; - QFileSystemWatcher *m_fileWatcher; }; diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 039a3ba..008b17e 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -165,35 +165,6 @@ void ReportRender::setScriptContext(ScriptEngineContext* scriptContext) m_scriptEngineContext=scriptContext; } -bool ReportRender::runInitScript(){ - if (m_scriptEngineContext){ - ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); -#ifndef USE_QJSENGINE - engine->pushContext(); -#endif - ScriptValueType res = engine->evaluate(m_scriptEngineContext->initScript()); - if (res.isBool()) return res.toBool(); -#ifdef USE_QJSENGINE - if (res.isError()){ - QMessageBox::critical(0,tr("Error"), - QString("Line %1: %2 ").arg(res.property("lineNumber").toString()) - .arg(res.toString()) - ); - return false; - } -#else - if (engine->hasUncaughtException()) { - QMessageBox::critical(0,tr("Error"), - QString("Line %1: %2 ").arg(engine->uncaughtExceptionLineNumber()) - .arg(engine->uncaughtException().toString()) - ); - return false; - } -#endif - } - return true; -} - void ReportRender::initDatasources(){ try{ datasources()->setAllDatasourcesToFirst(); @@ -222,67 +193,55 @@ void ReportRender::renderPage(PageDesignIntf* patternPage) m_curentNameIndex = 0; m_patternPageItem = patternPage->pageItem(); - if (m_patternPageItem->resetPageNumber() && m_pageCount>0) { resetPageNumber(PageReset); } + m_renderCanceled = false; BandDesignIntf* reportFooter = m_patternPageItem->bandByType(BandDesignIntf::ReportFooter); m_reportFooterHeight = 0; if (reportFooter) m_reportFooterHeight = reportFooter->height(); + initGroups(); -#ifdef HAVE_UI_LOADER - initDialogs(); -#endif + clearPageMap(); - if (m_scriptEngineContext){ - baseDesignIntfToScript(patternPage->pageItem()); - foreach (BaseDesignIntf* item, patternPage->pageItem()->childBaseItems()){ - baseDesignIntfToScript(item); - } + try{ + datasources()->setAllDatasourcesToFirst(); + datasources()->clearGroupFuntionsExpressions(); + } catch(ReportError &exception){ + //TODO possible should thow exeption + QMessageBox::critical(0,tr("Error"),exception.what()); + return; } - if (runInitScript()){ + clearPageMap(); + startNewPage(true); - clearPageMap(); + renderReportHeader(m_patternPageItem, AfterPageHeader); - try{ - datasources()->setAllDatasourcesToFirst(); - datasources()->clearGroupFuntionsExpressions(); - } catch(ReportError &exception){ - //TODO possible should thow exeption - QMessageBox::critical(0,tr("Error"),exception.what()); - return; - } + BandDesignIntf* lastRenderedBand = 0; + for (int i=0;idataBandCount() && !m_renderCanceled;i++){ + lastRenderedBand = m_patternPageItem->dataBandAt(i); + initDatasource(lastRenderedBand->datasourceName()); + renderDataBand(lastRenderedBand); + if (idataBandCount()-1) closeFooterGroup(lastRenderedBand); + } - clearPageMap(); - startNewPage(true); + if (reportFooter) + renderBand(reportFooter, 0, StartNewPageAsNeeded); + if (lastRenderedBand && lastRenderedBand->keepFooterTogether()) + closeFooterGroup(lastRenderedBand); - renderReportHeader(m_patternPageItem, AfterPageHeader); + BandDesignIntf* tearOffBand = m_patternPageItem->bandByType(BandDesignIntf::TearOffBand); + if (tearOffBand) + renderBand(tearOffBand, 0, StartNewPageAsNeeded); - BandDesignIntf* lastRenderedBand = 0; - for (int i=0;idataBandCount() && !m_renderCanceled;i++){ - lastRenderedBand = m_patternPageItem->dataBandAt(i); - initDatasource(lastRenderedBand->datasourceName()); - renderDataBand(lastRenderedBand); - if (idataBandCount()-1) closeFooterGroup(lastRenderedBand); - } - - if (reportFooter) - renderBand(reportFooter, 0, StartNewPageAsNeeded); - if (lastRenderedBand && lastRenderedBand->keepFooterTogether()) - closeFooterGroup(lastRenderedBand); - - BandDesignIntf* tearOffBand = m_patternPageItem->bandByType(BandDesignIntf::TearOffBand); - if (tearOffBand) - renderBand(tearOffBand, 0, StartNewPageAsNeeded); - - savePage(true); + savePage(true); #ifndef USE_QJSENGINE - ScriptEngineManager::instance().scriptEngine()->popContext(); + ScriptEngineManager::instance().scriptEngine()->popContext(); #endif - } + } int ReportRender::pageCount() @@ -325,31 +284,6 @@ void ReportRender::initVariables() m_datasources->setReportVariable("#PAGE_COUNT",0); } -#ifdef HAVE_UI_LOADER - -#ifdef USE_QJSENGINE -void registerChildObjects(ScriptEngineType* se, ScriptValueType* sv){ - foreach(QObject* obj, sv->toQObject()->children()){ - ScriptValueType child = se->newQObject(obj); - sv->setProperty(obj->objectName(),child); - registerChildObjects(se, &child); - } -} -#endif -void ReportRender::initDialogs(){ - if (m_scriptEngineContext){ - ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); - foreach(DialogDescriber::Ptr dialog, m_scriptEngineContext->dialogDescribers()){ - ScriptValueType sv = se->newQObject(m_scriptEngineContext->getDialog(dialog->name())); -#ifdef USE_QJSENGINE - registerChildObjects(se,&sv); -#endif - se->globalObject().setProperty(dialog->name(),sv); - } - } -} -#endif - void ReportRender::clearPageMap() { m_renderedPages.clear(); @@ -548,7 +482,6 @@ void ReportRender::renderDataBand(BandDesignIntf *dataBand) if (header && !header->printAlways()) renderDataHeader(header); - //renderChildHeader(dataBand,PrintNotAlwaysPrintable); renderGroupHeader(dataBand, bandDatasource, true); bool firstTime = true; @@ -662,14 +595,10 @@ void ReportRender::renderPageItems(PageItemDesignIntf* patternPage) m_renderPageItem, m_renderPageItem); pageItems.append(cloneItem); - //cloneItem->updateItemSize(m_datasources); } } m_renderPageItem->restoreLinks(); m_renderPageItem->updateSubItemsSize(FirstPass,m_datasources); -// foreach(BaseDesignIntf* item, pageItems){ -// item->updateItemSize(m_datasources); -// } } qreal ReportRender::calcPageFooterHeight(PageItemDesignIntf *patternPage) @@ -1068,9 +997,6 @@ void ReportRender::secondRenderPass(ReportPages renderedPages) foreach(BaseDesignIntf* item, page->childBaseItems()){ item->updateItemSize(m_datasources, SecondPass); } -// foreach(BandDesignIntf* band, page->childBands()){ -// band->updateItemSize(m_datasources, SecondPass); -// } } } @@ -1080,7 +1006,6 @@ BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, i BandDesignIntf* upperBandPart = dynamic_cast(band->cloneUpperPart(sliceHeight)); BandDesignIntf* bottomBandPart = dynamic_cast(band->cloneBottomPart(sliceHeight)); if (!bottomBandPart->isEmpty()){ - //bottomBandPart->updateItemSize(FirstPass,height); if (patternBand->keepFooterTogether()) closeFooterGroup(patternBand); } @@ -1097,8 +1022,7 @@ BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, i savePage(); startNewPage(); } -// if (!bottomBandPart->isEmpty() && patternBand->keepFooterTogether()) -// openFooterGroup(patternBand); + delete band; return bottomBandPart; } @@ -1107,7 +1031,7 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand) { BandDesignIntf* bandClone = dynamic_cast(patternBand->cloneItem(PreviewMode)); - baseDesignIntfToScript(bandClone); + m_scriptEngineContext->baseDesignIntfToScript(bandClone); emit(patternBand->beforeRender()); if (patternBand->isFooter()){ @@ -1120,7 +1044,7 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand) bandClone->updateItemSize(m_datasources); - baseDesignIntfToScript(bandClone); + m_scriptEngineContext->baseDesignIntfToScript(bandClone); emit(patternBand->afterData()); return bandClone; @@ -1143,7 +1067,7 @@ void ReportRender::startNewPage(bool isFirst) initColumns(); initRenderPage(); - baseDesignIntfToScript(m_renderPageItem); + m_scriptEngineContext->baseDesignIntfToScript(m_renderPageItem); m_renderPageItem->setObjectName(QLatin1String("ReportPage")+QString::number(m_pageCount)); m_maxHeightByColumn[m_currentColumn]=m_renderPageItem->pageRect().height(); @@ -1360,37 +1284,4 @@ void ReportRender::cancelRender(){ m_renderCanceled = true; } -void ReportRender::baseDesignIntfToScript(BaseDesignIntf *item) -{ - if ( item ) { - - if (item->metaObject()->indexOfSignal("beforeRender()")!=-1) - item->disconnect(SIGNAL(beforeRender())); - if (item->metaObject()->indexOfSignal("afterData()")!=-1) - item->disconnect(SIGNAL(afterData())); - if (item->metaObject()->indexOfSignal("afterRender()")!=-1) - item->disconnect(SIGNAL(afterRender())); - - ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); - -#ifdef USE_QJSENGINE - //sItem = engine->newQObject(item); - ScriptValueType sItem = getCppOwnedJSValue(*engine, item); - engine->globalObject().setProperty(item->patternName(), sItem); -#else - ScriptValueType sItem = engine->globalObject().property(item->patternName()); - if (sItem.isValid()){ - engine->newQObject(sItem, item); - } else { - sItem = engine->newQObject(item); - engine->globalObject().setProperty(item->patternName(),sItem); - } -#endif - foreach(BaseDesignIntf* child, item->childBaseItems()){ - baseDesignIntfToScript(child); - } - } - -} - -} +} // namespace LimeReport diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 21048c9..cb3bca1 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -87,29 +87,20 @@ signals: public slots: void cancelRender(); private: - - void baseDesignIntfToScript(BaseDesignIntf* item); - - - void renderPage(PageDesignIntf *patternPage); void initDatasources(); void initDatasource(const QString &name); void initRenderPage(); -#ifdef HAVE_UI_LOADER - void initDialogs(); -#endif void initVariables(); - bool runInitScript(); + void initGroups(); void clearPageMap(); + + void renderPage(PageDesignIntf *patternPage); BandDesignIntf* renderBand(BandDesignIntf *patternBand, BandDesignIntf *bandData, DataRenderMode mode = NotStartNewPage, bool isLast = false); void renderDataBand(BandDesignIntf* dataBand); void renderPageHeader(PageItemDesignIntf* patternPage); void renderReportHeader(PageItemDesignIntf* patternPage, PageRenderStage stage); void renderPageFooter(PageItemDesignIntf* patternPage); - void moveTearOffBand(); void renderPageItems(PageItemDesignIntf* patternPage); - qreal calcPageFooterHeight(PageItemDesignIntf* patternPage); - qreal calcSlicePercent(qreal height); void renderChildHeader(BandDesignIntf* parent, BandPrintMode printMode); void renderChildFooter(BandDesignIntf* parent, BandPrintMode printMode); void renderChildBands(BandDesignIntf* parentBand); @@ -117,8 +108,10 @@ private: void renderDataHeader(BandDesignIntf* header); void renderGroupHeader(BandDesignIntf* parentBand, IDataSource* dataSource, bool firstTime); void renderGroupFooter(BandDesignIntf* parentBand); + void moveTearOffBand(); + qreal calcPageFooterHeight(PageItemDesignIntf* patternPage); + qreal calcSlicePercent(qreal height); - void initGroups(); bool containsGroupsFunction(BandDesignIntf* band); void extractGroupsFunction(BandDesignIntf* band); void replaceGroupsFunction(BandDesignIntf* band); @@ -169,10 +162,7 @@ private: QMultiMap< BandDesignIntf*, GroupBandsHolder* > m_childBands; QList m_reprintableBands; QList m_recalcBands; -// QList m_lastRenderedHeaders; - //int m_maxHeightByColumn[0]; - //int m_currentStartDataPos; int m_currentIndex; int m_pageCount; diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 785640a..6a781cd 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -32,12 +32,14 @@ #include #include #include +#include #ifdef HAVE_UI_LOADER #include #include #include #endif #include "lrdatasourcemanager.h" +#include "lrbasedesignintf.h" Q_DECLARE_METATYPE(QColor) Q_DECLARE_METATYPE(QFont) @@ -192,146 +194,9 @@ void ScriptEngineModel::updateModel() } categ->addChild(funcDesc.name,funcDesc.description,ScriptEngineNode::Function,QIcon(":/report/images/function")); } - //reset(); endResetModel(); } -//QScriptValue line(QScriptContext* pcontext, QScriptEngine* pengine){ -// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); -// DataSourceManager* dm = sm->dataManager(); -// QString band = pcontext->argument(0).toString(); -// QScriptValue res; -// QString varName = QLatin1String("line_")+band.toLower(); -// if (dm->variable(varName).isValid()){ -// res=pengine->newVariant(dm->variable(varName)); -// } else res=pengine->newVariant(QString("Variable line for band %1 not found").arg(band)); -// return res; -//} - -//QScriptValue setVariable(QScriptContext* pcontext, QScriptEngine* /*pengine*/){ - -// QString name = pcontext->argument(0).toString(); -// QVariant value = pcontext->argument(1).toVariant(); - -// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); -// DataSourceManager* dm = sm->dataManager(); - -// dm->changeVariable(name,value); -// return QScriptValue(); -//} - -//QScriptValue getVariable(QScriptContext* pcontext, QScriptEngine* pengine){ - -// QString name = pcontext->argument(0).toString(); - -// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); -// DataSourceManager* dm = sm->dataManager(); -// QScriptValue res = pengine->newVariant(dm->variable(name)); - -// return res; -//} - -//QScriptValue getField(QScriptContext* pcontext, QScriptEngine* pengine){ - -// QString name = pcontext->argument(0).toString(); - -// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); -// DataSourceManager* dm = sm->dataManager(); -// QScriptValue res = pengine->newVariant(dm->fieldData(name)); - -// return res; -//} - -//QScriptValue numberFormat(QScriptContext* pcontext, QScriptEngine* pengine){ -// QVariant value = pcontext->argument(0).toVariant(); -// char format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString()[0].toLatin1():'f'; -// int precision = (pcontext->argumentCount()>2)?pcontext->argument(2).toInt32():2; -// QString locale = (pcontext->argumentCount()>3)?pcontext->argument(3).toString():""; -// QScriptValue res = (locale.isEmpty())?pengine->newVariant(QString::number(value.toDouble(),format,precision)): -// pengine->newVariant(QLocale(locale).toString(value.toDouble(),format,precision)); -// return res; -//} -//#if QT_VERSION>0x040800 -//QScriptValue currencyFormat(QScriptContext* pcontext, QScriptEngine* pengine){ -// QVariant value = pcontext->argument(0).toVariant(); -// QString locale = (pcontext->argumentCount()>1)?pcontext->argument(1).toString():QLocale::system().name(); -// return pengine->newVariant(QLocale(locale).toCurrencyString(value.toDouble())); -//} - -//QScriptValue currencyUSBasedFormat(QScriptContext* pcontext, QScriptEngine* pengine){ -// QVariant value = pcontext->argument(0).toVariant(); -// QString CurrencySymbol = (pcontext->argumentCount()>1)?pcontext->argument(1).toString():QLocale::system().currencySymbol(); -// // Format it using USA locale -// QString vTempStr=QLocale(QLocale::English, QLocale::UnitedStates).toCurrencyString(value.toDouble()); -// // Replace currency symbol if necesarry -// if (CurrencySymbol!="") vTempStr.replace("$", CurrencySymbol); -// return pengine->newVariant(vTempStr); -//} -//#endif -//QScriptValue dateFormat(QScriptContext* pcontext, QScriptEngine* pengine){ -// QVariant value = pcontext->argument(0).toVariant(); -// QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"dd.MM.yyyy"; -// QScriptValue res = pengine->newVariant(QLocale().toString(value.toDate(),format)); -// return res; -//} - -//QScriptValue timeFormat(QScriptContext* pcontext, QScriptEngine* pengine){ -// QVariant value = pcontext->argument(0).toVariant(); -// QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"hh:mm"; -// QScriptValue res = pengine->newVariant(QLocale().toString(value.toTime(),format)); -// return res; -//} - -//QScriptValue dateTimeFormat(QScriptContext* pcontext, QScriptEngine* pengine){ -// QVariant value = pcontext->argument(0).toVariant(); -// QString format = (pcontext->argumentCount()>1)?pcontext->argument(1).toString().toLatin1():"dd.MM.yyyy hh:mm"; -// QScriptValue res = pengine->newVariant(QLocale().toString(value.toDateTime(),format)); -// return res; -//} - -//QScriptValue now(QScriptContext* /*pcontext*/, QScriptEngine* pengine){ -// return pengine->newVariant(QDateTime::currentDateTime()); -//} - -//QScriptValue date(QScriptContext* /*pcontext*/, QScriptEngine* pengine){ -// return pengine->newVariant(QDate::currentDate()); -//} - -//QScriptValue callGroupFunction(const QString& functionName, QScriptContext* pcontext, QScriptEngine* pengine){ - -// ScriptEngineManager* sm = qscriptvalue_cast(pcontext->callee().data()); -// DataSourceManager* dm = sm->dataManager(); - -// QString expression; -// QString band; - -// if (functionName.compare("COUNT",Qt::CaseInsensitive) == 0 && pcontext->argumentCount()==1){ -// expression = " "; -// band = pcontext->argument(0).toString(); -// } else { -// expression = dm->getExpression(pcontext->argument(0).toString()); -// band = pcontext->argument(1).toString(); -// } - -// QScriptValue res; -// GroupFunction* gf = dm->groupFunction(functionName,expression,band); -// if (gf){ -// if (gf->isValid()){ -// res=pengine->newVariant(gf->calculate()); -// }else{ -// res=pengine->newVariant(gf->error()); -// } -// } -// else { -// res=pengine->newVariant(QString(QObject::tr("Function %1 not found or have wrong arguments").arg(functionName))); -// } -// return res; -//} - -//QScriptValue groupFunction(QScriptContext* pcontext, QScriptEngine* pengine){ -// return callGroupFunction(pcontext->callee().property("functionName").toString(),pcontext,pengine); -//} - ScriptEngineManager::~ScriptEngineManager() { delete m_model; @@ -896,20 +761,6 @@ ScriptEngineManager::ScriptEngineManager() createSetVariableFunction(); createGetFieldFunction(); createGetVariableFunction(); - -// addFunction("line",line,"SYSTEM", "line(\""+tr("BandName")+"\")"); -// addFunction("numberFormat",numberFormat,"NUMBER", "numberFormat(\""+tr("Value")+"\",\""+tr("Format")+"\",\""+ -// tr("Precision")+"\",\""+ -// tr("Locale")+"\")"); - -// addFunction("dateFormat",dateFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); -// addFunction("timeFormat",timeFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); -// addFunction("dateTimeFormat", dateTimeFormat, "DATE&TIME", "dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); -// addFunction("date",date,"DATE&TIME","date()"); -// addFunction("now",now,"DATE&TIME","now()"); -// addFunction("currencyFormat",currencyFormat,"NUMBER","currencyFormat(\""+tr("Value")+"\",\""+tr("Locale")+"\")"); -// addFunction("currencyUSBasedFormat",currencyUSBasedFormat,"NUMBER","currencyUSBasedFormat(\""+tr("Value")+",\""+tr("CurrencySymbol")+"\")"); -// addFunction("setVariable", setVariable, "GENERAL", "setVariable(\""+tr("Name")+"\",\""+tr("Value")+"\")"); #ifndef USE_QJSENGINE QScriptValue colorCtor = m_scriptEngine->newFunction(constructColor); m_scriptEngine->globalObject().setProperty("QColor", colorCtor); @@ -919,15 +770,6 @@ ScriptEngineManager::ScriptEngineManager() QScriptValue fontConstructor = m_scriptEngine->newFunction(QFontPrototype::constructorQFont, fontProto); m_scriptEngine->globalObject().setProperty("QFont", fontConstructor); #endif -// foreach(QString func, dataManager()->groupFunctionNames()){ -// addFunction(func, groupFunction,"GROUP FUNCTIONS", func+"(\""+tr("FieldName")+"\",\""+tr("BandName")+"\")"); -// } - -// foreach(ScriptFunctionDesc func, m_functions){ -// if (func.type==ScriptFunctionDesc::Native) -// m_scriptEngine->globalObject().setProperty(func.name,func.scriptValue); -// } - m_model = new ScriptEngineModel(this); } @@ -1275,6 +1117,93 @@ QString ScriptEngineContext::getNewDialogName() } #endif + +void ScriptEngineContext::baseDesignIntfToScript(BaseDesignIntf* item) +{ + if ( item ) { + + if (item->metaObject()->indexOfSignal("beforeRender()")!=-1) + item->disconnect(SIGNAL(beforeRender())); + if (item->metaObject()->indexOfSignal("afterData()")!=-1) + item->disconnect(SIGNAL(afterData())); + if (item->metaObject()->indexOfSignal("afterRender()")!=-1) + item->disconnect(SIGNAL(afterRender())); + + ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); + +#ifdef USE_QJSENGINE + //sItem = engine->newQObject(item); + ScriptValueType sItem = getCppOwnedJSValue(*engine, item); + engine->globalObject().setProperty(item->patternName(), sItem); +#else + ScriptValueType sItem = engine->globalObject().property(item->patternName()); + if (sItem.isValid()){ + engine->newQObject(sItem, item); + } else { + sItem = engine->newQObject(item); + engine->globalObject().setProperty(item->patternName(),sItem); + } +#endif + foreach(BaseDesignIntf* child, item->childBaseItems()){ + baseDesignIntfToScript(child); + } + } +} + +#ifdef HAVE_UI_LOADER + +#ifdef USE_QJSENGINE +void registerChildObjects(ScriptEngineType* se, ScriptValueType* sv){ + foreach(QObject* obj, sv->toQObject()->children()){ + ScriptValueType child = se->newQObject(obj); + sv->setProperty(obj->objectName(),child); + registerChildObjects(se, &child); + } +} +#endif + +void ScriptEngineContext::initDialogs(){ + ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); + foreach(DialogDescriber::Ptr dialog, dialogDescribers()){ + ScriptValueType sv = se->newQObject(getDialog(dialog->name())); +#ifdef USE_QJSENGINE + registerChildObjects(se,&sv); +#endif + se->globalObject().setProperty(dialog->name(),sv); + } +} + +#endif + + +bool ScriptEngineContext::runInitScript(){ + + ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); +#ifndef USE_QJSENGINE + engine->pushContext(); +#endif + ScriptValueType res = engine->evaluate(initScript()); + if (res.isBool()) return res.toBool(); +#ifdef USE_QJSENGINE + if (res.isError()){ + QMessageBox::critical(0,tr("Error"), + QString("Line %1: %2 ").arg(res.property("lineNumber").toString()) + .arg(res.toString()) + ); + return false; + } +#else + if (engine->hasUncaughtException()) { + QMessageBox::critical(0,tr("Error"), + QString("Line %1: %2 ").arg(engine->uncaughtExceptionLineNumber()) + .arg(engine->uncaughtException().toString()) + ); + return false; + } +#endif + return true; +} + QString ScriptEngineContext::initScript() const { return m_initScript; diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 235599a..2e5786f 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -54,6 +54,7 @@ namespace LimeReport{ class DataSourceManager; +class BaseDesignIntf; struct ScriptFunctionDesc{ enum FuncType {Native,Script}; @@ -153,14 +154,19 @@ public: void deleteDialog(const QString& dialogName); QDialog *getDialog(const QString &dialogName); QString getNewDialogName(); + void initDialogs(); #endif + void baseDesignIntfToScript(BaseDesignIntf *item); void clear(); QString initScript() const; void setInitScript(const QString& initScript); + bool runInitScript(); +#ifdef HAVE_UI_LOADER signals: void dialogNameChanged(QString dialogName); void dialogDeleted(QString dialogName); void dialogAdded(QString dialogName); +#endif protected: QObject* createElement(const QString& collectionName,const QString& elementType); int elementsCount(const QString& collectionName); diff --git a/limereport/scriptbrowser/lrscriptbrowser.cpp b/limereport/scriptbrowser/lrscriptbrowser.cpp index 1ef6b73..98d0568 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.cpp +++ b/limereport/scriptbrowser/lrscriptbrowser.cpp @@ -59,7 +59,9 @@ void ScriptBrowser::setReportEditor(ReportDesignWidget* report) m_report=report; connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); connect(m_report,SIGNAL(loaded()),this,SLOT(slotUpdate())); +#ifdef HAVE_UI_LOADER connect(m_report->scriptContext(), SIGNAL(dialogAdded(QString)), this, SLOT(slotDialogAdded(QString))); +#endif updateFunctionTree(); } @@ -139,12 +141,13 @@ void ScriptBrowser::slotUpdate() updateFunctionTree(); } +#ifdef HAVE_UI_LOADER + void ScriptBrowser::slotDialogAdded(QString) { updateDialogsTree(); } -#ifdef HAVE_UI_LOADER void ScriptBrowser::on_tbAddDialog_clicked() { QFileDialog fileDialog(this); diff --git a/limereport/scriptbrowser/lrscriptbrowser.h b/limereport/scriptbrowser/lrscriptbrowser.h index dd7d9ae..54bf077 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.h +++ b/limereport/scriptbrowser/lrscriptbrowser.h @@ -62,8 +62,8 @@ protected: private slots: void slotClear(); void slotUpdate(); - void slotDialogAdded(QString); #ifdef HAVE_UI_LOADER + void slotDialogAdded(QString); void on_tbAddDialog_clicked(); void on_tbRunDialog_clicked(); void on_tbDeleteDialog_clicked(); From fb494db9479afd3029eecb01deea429376339d3b Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 2 Jun 2017 22:11:53 +0300 Subject: [PATCH 027/347] Extended area has been added to page in design mode --- limereport/lrpagedesignintf.cpp | 2 +- limereport/lrpageitemdesignintf.cpp | 76 +++++++++++++++++++++++------ limereport/lrpageitemdesignintf.h | 12 ++++- 3 files changed, 74 insertions(+), 16 deletions(-) diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 0928856..cbd2161 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -130,7 +130,7 @@ void PageDesignIntf::updatePageRect() } this->setSceneRect(-Const::SCENE_MARGIN, -Const::SCENE_MARGIN, pageItem()->geometry().width() + Const::SCENE_MARGIN*2, - pageItem()->geometry().height() + Const::SCENE_MARGIN*2); + pageItem()->boundingRect().height() + Const::SCENE_MARGIN*2); emit sceneRectChanged(sceneRect()); } diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 150df06..7c23d12 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -49,7 +49,8 @@ PageItemDesignIntf::PageItemDesignIntf(QObject *owner, QGraphicsItem *parent) : ItemsContainerDesignInft("PageItem",owner,parent), m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(A4), m_sizeChainging(false), - m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false) + m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), + m_isExtendedInDesignMode(false), m_extendedHeight(1000) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -61,7 +62,8 @@ PageItemDesignIntf::PageItemDesignIntf(const PageSize pageSize, const QRectF &re ItemsContainerDesignInft("PageItem",owner,parent), m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(pageSize), m_sizeChainging(false), - m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false) + m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), + m_isExtendedInDesignMode(false), m_extendedHeight(1000) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -79,14 +81,24 @@ void PageItemDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsIte { if (itemMode() & DesignMode){ + QRectF rect = pageRect(); + if (isExtendedInDesignMode()) rect.adjust(0,0,0,m_extendedHeight); ppainter->save(); ppainter->setOpacity(0.8); ppainter->fillRect(boundingRect(),pageBorderColor()); ppainter->setOpacity(1); - ppainter->fillRect(pageRect(),Qt::white); - paintGrid(ppainter); + ppainter->fillRect(rect,Qt::white); + paintGrid(ppainter,rect); ppainter->setPen(gridColor()); ppainter->drawRect(boundingRect()); + if (m_isExtendedInDesignMode){ + QPen pen; + pen.setColor(Qt::red); + pen.setStyle(Qt::DashLine); + pen.setWidth(2); + ppainter->setPen(pen); + ppainter->drawLine(pageRect().bottomLeft(),pageRect().bottomRight()); + } ppainter->restore(); } @@ -140,6 +152,16 @@ QColor PageItemDesignIntf::gridColor() const return QColor(170,200,150); } +QRectF PageItemDesignIntf::boundingRect() const +{ + if (!isExtendedInDesignMode()) + return BaseDesignIntf::boundingRect(); + else { + QRectF result = BaseDesignIntf::boundingRect(); + return result.adjusted(0,0,0,m_extendedHeight); + } +} + void PageItemDesignIntf::clear() { foreach(QGraphicsItem* item, childItems()){ @@ -303,6 +325,32 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } +int PageItemDesignIntf::extendedHeight() const +{ + return m_extendedHeight; +} + +void PageItemDesignIntf::setExtendedHeight(int extendedHeight) +{ + m_extendedHeight = extendedHeight; + PageDesignIntf* page = dynamic_cast(scene()); + if (page) page->updatePageRect(); + update(); +} + +bool PageItemDesignIntf::isExtendedInDesignMode() const +{ + return m_isExtendedInDesignMode; +} + +void PageItemDesignIntf::setExtendedInDesignMode(bool pageIsExtended) +{ + m_isExtendedInDesignMode = pageIsExtended; + PageDesignIntf* page = dynamic_cast(scene()); + if (page) page->updatePageRect(); + update(); +} + bool PageItemDesignIntf::resetPageNumber() const { return m_resetPageNumber; @@ -630,27 +678,27 @@ void PageItemDesignIntf::updateMarginRect() update(); } -void PageItemDesignIntf::paintGrid(QPainter *ppainter) +void PageItemDesignIntf::paintGrid(QPainter *ppainter, QRectF rect) { ppainter->save(); ppainter->setPen(QPen(gridColor())); ppainter->setOpacity(0.5); - for (int i=0;i<=(pageRect().height()-50)/100;i++){ - ppainter->drawLine(pageRect().x(),(i*100)+pageRect().y()+50,pageRect().right(),i*100+pageRect().y()+50); + for (int i=0;i<=(rect.height()-50)/100;i++){ + ppainter->drawLine(rect.x(),(i*100)+rect.y()+50,rect.right(),i*100+rect.y()+50); }; - for (int i=0;i<=((pageRect().width()-50)/100);i++){ - ppainter->drawLine(i*100+pageRect().x()+50,pageRect().y(),i*100+pageRect().x()+50,pageRect().bottom()); + for (int i=0;i<=((rect.width()-50)/100);i++){ + ppainter->drawLine(i*100+rect.x()+50,rect.y(),i*100+rect.x()+50,rect.bottom()); }; ppainter->setPen(QPen(gridColor())); ppainter->setOpacity(1); - for (int i=0;i<=(pageRect().width()/100);i++){ - ppainter->drawLine(i*100+pageRect().x(),pageRect().y(),i*100+pageRect().x(),pageRect().bottom()); + for (int i=0;i<=(rect.width()/100);i++){ + ppainter->drawLine(i*100+rect.x(),rect.y(),i*100+rect.x(),rect.bottom()); }; - for (int i=0;i<=pageRect().height()/100;i++){ - ppainter->drawLine(pageRect().x(),i*100+pageRect().y(),pageRect().right(),i*100+pageRect().y()); + for (int i=0;i<=rect.height()/100;i++){ + ppainter->drawLine(rect.x(),i*100+rect.y(),rect.right(),i*100+rect.y()); }; - ppainter->drawRect(pageRect()); + ppainter->drawRect(rect); ppainter->restore(); } diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index ef9b06d..f488b07 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -53,6 +53,8 @@ class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft Q_PROPERTY(bool fullPage READ fullPage WRITE setFullPage) Q_PROPERTY(bool oldPrintMode READ oldPrintMode WRITE setOldPrintMode) Q_PROPERTY(bool resetPageNumber READ resetPageNumber WRITE setResetPageNumber) + Q_PROPERTY(bool isExtendedInDesignMode READ isExtendedInDesignMode WRITE setExtendedInDesignMode) + Q_PROPERTY(int extendedHeight READ extendedHeight WRITE setExtendedHeight) friend class ReportRender; public: enum Orientation { Portrait, Landscape }; @@ -74,6 +76,7 @@ public: virtual QColor selectionColor() const; virtual QColor pageBorderColor() const; virtual QColor gridColor() const; + virtual QRectF boundingRect() const; void clear(); const BandsList& childBands() const {return m_bands;} BandDesignIntf * bandByType(BandDesignIntf::BandsType bandType) const; @@ -118,6 +121,11 @@ public: void setResetPageNumber(bool resetPageNumber); void updateSubItemsSize(RenderPass pass, DataSourceManager *dataManager); + bool isExtendedInDesignMode() const; + void setExtendedInDesignMode(bool isExtendedInDesignMode); + int extendedHeight() const; + void setExtendedHeight(int extendedHeight); + protected slots: void bandDeleted(QObject* band); void bandGeometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); @@ -131,7 +139,7 @@ protected: QColor selectionMarkerColor(){return Qt::transparent;} void preparePopUpMenu(QMenu &menu); private: - void paintGrid(QPainter *ppainter); + void paintGrid(QPainter *ppainter, QRectF rect); void initColumnsPos(QVector&posByColumns, qreal pos, int columnCount); private: int m_topMargin; @@ -146,6 +154,8 @@ private: bool m_fullPage; bool m_oldPrintMode; bool m_resetPageNumber; + bool m_isExtendedInDesignMode; + int m_extendedHeight; }; typedef QList ReportPages; From 1c2de351660f5fa75f3164d1e4d7109b47babc2c Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Fri, 16 Jun 2017 03:17:17 +0300 Subject: [PATCH 028/347] CONFIG qtscriptengine & no_formdesigner have been added --- common.pri | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/common.pri b/common.pri index 11c63f8..6481360 100644 --- a/common.pri +++ b/common.pri @@ -4,8 +4,12 @@ CONFIG += build_translations CONFIG += zint } -CONFIG += qjsengine -CONFIG += dialogdesigner +!contains(CONFIG, qtscriptengine){ + CONFIG += qjsengine +} +!contains(CONFIG, no_formdesigner){ + CONFIG += dialogdesigner +} ZINT_PATH = $$PWD/3rdparty/zint-2.4.4 contains(CONFIG,zint){ From 96c823487274a7757006c8c335a5d3ea5f296718 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 28 Jun 2017 17:15:05 +0300 Subject: [PATCH 029/347] Russian translation has been fixed --- limereport/lrscriptenginemanager.cpp | 4 +- translations/limereport_ru.ts | 391 +++++++++++++++------------ 2 files changed, 213 insertions(+), 182 deletions(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 6a781cd..ecf2222 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -256,7 +256,7 @@ bool ScriptEngineManager::addFunction(const JSFunctionDesc &functionDescriber) return false; } } else { - m_lastError = tr("Function manger with name \"%1\" already exists !"); + m_lastError = tr("Function manger with name \"%1\" already exists!"); return false; } @@ -433,7 +433,7 @@ QString ScriptEngineManager::expandDataFields(QString context, ExpandType expand } else { QString error; if (reportItem){ - error = tr("Field %1 not found in %2 !!! ").arg(field).arg(reportItem->objectName()); + error = tr("Field %1 not found in %2!").arg(field).arg(reportItem->objectName()); dataManager()->putError(error); } varValue = QVariant(); diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 6ba7051..7f6a738 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1,6 +1,13 @@ + + $ClassName$ + + $ClassName$ + + + LRVariableDialog @@ -55,22 +62,6 @@ <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600; color:#555555;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600; color:#555555;"> framework</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600; color:#000000;">This library 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.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; color:#000000;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -85,117 +76,133 @@ p, li { white-space: pre-wrap; } <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> <p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">G</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">NU LESSER GENERAL PUBLIC LICENSE</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Version 2.1, February 1999</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Everyone is permitted to copy and distribute verbatim copies</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">of this license document, but changing it is not allowed.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; color:#000000; background-color:#ffffff;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">[This is the first released version of the Lesser GPL. It also counts</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;"> as the successor of the GNU Library Public License, version 2, hence</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;"> the version number 2.1.]</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">P</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">reamble</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">0.</span><span style=" font-family:'sans-serif'; color:#000000;"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">1.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">2.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> -<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> -<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> -<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif'; color:#000000;">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">3.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">4.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">5.</span><span style=" font-family:'sans-serif'; color:#000000;"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">6.</span><span style=" font-family:'sans-serif'; color:#000000;"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> -<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> -<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> -<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> -<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">7.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> -<li style=" font-family:'sans-serif'; color:#000000;" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">8.</span><span style=" font-family:'sans-serif'; color:#000000;"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">9.</span><span style=" font-family:'sans-serif'; color:#000000;"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">10.</span><span style=" font-family:'sans-serif'; color:#000000;"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">11.</span><span style=" font-family:'sans-serif'; color:#000000;"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">12.</span><span style=" font-family:'sans-serif'; color:#000000;"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">13.</span><span style=" font-family:'sans-serif'; color:#000000;"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">14.</span><span style=" font-family:'sans-serif'; color:#000000;"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">NO WARRANTY</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">15.</span><span style=" font-family:'sans-serif'; color:#000000;"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#000000;">16.</span><span style=" font-family:'sans-serif'; color:#000000;"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333; background-color:#ffffff;">END OF TERMS AND CONDITIONS</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; font-style:italic; color:#000000;">one line to give the library's name and an idea of what it does.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic; color:#000000;">year</span><span style=" font-family:'monospace'; color:#000000;"> </span><span style=" font-family:'monospace'; font-style:italic; color:#000000;">name of author</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic; color:#000000; background-color:#ffffff;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">This library is free software; you can redistribute it and/or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">modify it under the terms of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">License as published by the Free Software Foundation; either</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">version 2.1 of the License, or (at your option) any later version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; color:#000000; background-color:#ffffff;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">This library is distributed in the hope that it will be useful,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">Lesser General Public License for more details.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; color:#000000; background-color:#ffffff;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">You should have received a copy of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">License along with this library; if not, write to the Free Software</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">Also add information on how to contact you by electronic and paper mail.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">the library `Frob' (a library for tweaking knobs) written</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000; background-color:#ffffff;">by James Random Hacker.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; color:#000000; background-color:#ffffff;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; font-style:italic; color:#000000;">signature of Ty Coon</span><span style=" font-family:'monospace'; color:#000000;">, 1 April 1990</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'monospace'; color:#000000;">Ty Coon, President of Vice</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; background-color:#ffffff;"><span style=" font-family:'sans-serif'; color:#000000; background-color:#ffffff;">That's all there is to it!</span></p></body></html> - +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600;">G</span><span style=" font-family:'sans-serif'; font-weight:600;">NU LESSER GENERAL PUBLIC LICENSE</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Version 2.1, February 1999</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Everyone is permitted to copy and distribute verbatim copies</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">of this license document, but changing it is not allowed.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">[This is the first released version of the Lesser GPL. It also counts</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> as the successor of the GNU Library Public License, version 2, hence</span></p> +<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> the version number 2.1.]</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600;">P</span><span style=" font-family:'sans-serif'; font-weight:600;">reamble</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">0.</span><span style=" font-family:'sans-serif';"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">1.</span><span style=" font-family:'sans-serif';"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">2.</span><span style=" font-family:'sans-serif';"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> +<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> +<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> +<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> +<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif';">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">3.</span><span style=" font-family:'sans-serif';"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">4.</span><span style=" font-family:'sans-serif';"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">5.</span><span style=" font-family:'sans-serif';"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">6.</span><span style=" font-family:'sans-serif';"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> +<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> +<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> +<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> +<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> +<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">7.</span><span style=" font-family:'sans-serif';"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> +<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> +<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">8.</span><span style=" font-family:'sans-serif';"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">9.</span><span style=" font-family:'sans-serif';"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">10.</span><span style=" font-family:'sans-serif';"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">11.</span><span style=" font-family:'sans-serif';"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">12.</span><span style=" font-family:'sans-serif';"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">13.</span><span style=" font-family:'sans-serif';"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">14.</span><span style=" font-family:'sans-serif';"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">NO WARRANTY</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">15.</span><span style=" font-family:'sans-serif';"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">16.</span><span style=" font-family:'sans-serif';"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">END OF TERMS AND CONDITIONS</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">one line to give the library's name and an idea of what it does.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic;">year</span><span style=" font-family:'monospace';"> </span><span style=" font-family:'monospace'; font-style:italic;">name of author</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is free software; you can redistribute it and/or</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">modify it under the terms of the GNU Lesser General Public</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License as published by the Free Software Foundation; either</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">version 2.1 of the License, or (at your option) any later version.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is distributed in the hope that it will be useful,</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Lesser General Public License for more details.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">You should have received a copy of the GNU Lesser General Public</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License along with this library; if not, write to the Free Software</span></p> +<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Also add information on how to contact you by electronic and paper mail.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">the library `Frob' (a library for tweaking knobs) written</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">by James Random Hacker.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">signature of Ty Coon</span><span style=" font-family:'monospace';">, 1 April 1990</span></p> +<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Ty Coon, President of Vice</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">That's all there is to it!</span></p></body></html> + @@ -381,7 +388,7 @@ p, li { white-space: pre-wrap; } LimeReport::ContentItemDesignIntf Variable %1 not found - Переменная %1 не найдена + Переменная %1 не найдена @@ -392,7 +399,7 @@ p, li { white-space: pre-wrap; } useAlternateBackgroundColor - Использовать альтернативный цвет фона + Использовать альтернативный цвет фона @@ -451,7 +458,7 @@ p, li { white-space: pre-wrap; } User variables - Пользовательские переменные + Пользовательские переменные Error @@ -524,11 +531,19 @@ p, li { white-space: pre-wrap; } connection with name "%1" already exists! - соединение "%1" уже существует! + соединение "%1" уже существует! datasource with name "%1" already exists! - источник данных "%1" уже существует! + источник данных "%1" уже существует! + + + Connection with name "%1" already exists! + Соединение "%1" уже существует! + + + Datasource with name "%1" already exists! + Источник данных "%1" уже существует! @@ -550,31 +565,31 @@ p, li { white-space: pre-wrap; } LimeReport::DialogDesignerManager Edit Widgets - Редактировать виджеты + Редактировать виджеты Widget Box - Панель виджетов + Панель виджетов Object Inspector - Инспектор объектов + Инспектор объектов Property Editor - Редактор свойств + Редактор свойств Signals && Slots Editor - Редактор сигналов и слотов + Редактор сигналов и слотов Resource Editor - Редактор ресурсов + Редактор ресурсов Action Editor - Редактор действий + Редактор действий @@ -928,43 +943,43 @@ p, li { white-space: pre-wrap; } fullPage - Страница целиком + Страница целиком gridStep - Шаг сетки + Шаг сетки oldPrintMode - Старый режим печати + Старый режим печати resourcePath - Путь к ресурсам + Путь к ресурсам autoSize - Автоматический размер + Автоматический размер center - Центрировать + Центрировать field - Поле + Поле image - Изображение + Изображение keepAspectRatio - Сохранять соотношение сторон + Сохранять соотношение сторон scale - Масштабировать + Масштабировать leftMargin @@ -992,15 +1007,15 @@ p, li { white-space: pre-wrap; } condition - Условие + Условие keepGroupTogether - Сохранять группу вместе + Сохранять группу вместе groupFieldName - Столбец группы + Столбец группы geometry @@ -1064,43 +1079,43 @@ p, li { white-space: pre-wrap; } textIndent - Отступ текста + Отступ текста textLayoutDirection - Направление текста + Направление текста lineSpacing - Межстрочный интервал + Межстрочный интервал underlines - Подчеркивание + Подчеркивание underlineLineSize - Толщина подчеркивания + Толщина подчеркивания format - Формат + Формат valueType - Тип значения + Тип значения adaptFontToSize - Шрифт по размеру + Шрифт по размеру followTo - Следует за + Следует за backgroundBrushStyle - Стиль заполнения фона + Стиль заполнения фона autoHeight @@ -1112,11 +1127,11 @@ p, li { white-space: pre-wrap; } alternateBackgroundColor - Альтернативный цвет фона + Альтернативный цвет фона columnsCount - Количество столбцов + Количество столбцов columnsFillDirection @@ -1212,31 +1227,31 @@ p, li { white-space: pre-wrap; } allowHTML - Разрешить HTML + Разрешить HTML allowHTMLInFields - Разрешить HTML в полях + Разрешить HTML в полях printAlways - Печатать всегда + Печатать всегда borderColor - Цвет границ + Цвет границ startNewPage - Начинать новую страницу + Начинать новую страницу startFromNewPage - Начинать с новой страницы + Начинать с новой страницы resetPageNumber - Обнулять номер страницы + Обнулять номер страницы columnCount @@ -1528,35 +1543,35 @@ p, li { white-space: pre-wrap; } Delete dialog - Удалить диалог + Удалить диалог Add new dialog - Добавить диалог + Добавить диалог Widget Box - Панель виджетов + Панель виджетов Property Editor - Редактор свойств + Редактор свойств Action Editor - Редактор действий + Редактор действий Resource Editor - Редактор ресурсов + Редактор ресурсов SignalSlot Editor - Редактор сигналов и слотов + Редактор сигналов и слотов Dialog Designer Tools - Инструменты создания диалогов + Инструменты создания диалогов Report has been modified! Do you want save the report? @@ -1775,7 +1790,7 @@ This preview is no longer valid. Error - Ошибка + Ошибка @@ -1816,6 +1831,22 @@ This preview is no longer valid. Name Имя переменной + + Function manger with name "%1" already exists ! + Менеджер функций с именем "%1" уже существует! + + + Field %1 not found in %2 !!! + Поле %1 не найдено в %2 !!! + + + Function manger with name "%1" already exists! + Менеджер функций с именем "%1" уже существует! + + + Field %1 not found in %2! + Поле %1 не найдено в %2! + LimeReport::SettingDialog @@ -1936,7 +1967,7 @@ This preview is no longer valid. Transparent - Прозрачный + Прозрачный @@ -2205,7 +2236,7 @@ This preview is no longer valid. Datasource manager not found - Менеджер источников данных не найден + Менеджер источников данных не найден Master datasource "%1" not found! From 815a67e17d718da6aac3a2ae9a2f0acf1464c298 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 29 Jun 2017 03:04:30 +0300 Subject: [PATCH 030/347] Function categories have been translated --- limereport/lrscriptenginemanager.cpp | 26 +++++++++++++------------- translations/limereport_ru.ts | 20 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index ecf2222..11b4cbc 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -332,7 +332,7 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ foreach(QString func, m_dataManager->groupFunctionNames()){ JSFunctionDesc describer( func, - "GROUP FUNCTIONS", + tr("GROUP FUNCTIONS"), func+"(\""+tr("FieldName")+"\",\""+tr("BandName")+"\")", LimeReport::Const::FUNCTION_MANAGER_NAME, m_functionManager, @@ -545,7 +545,7 @@ bool ScriptEngineManager::createLineFunction() fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("SYSTEM"); + fd.setCategory(tr("SYSTEM")); fd.setName("line"); fd.setDescription("line(\""+tr("BandName")+"\")"); fd.setScriptWrapper(QString("function line(bandName){ return %1.line(bandName);}").arg(LimeReport::Const::FUNCTION_MANAGER_NAME)); @@ -560,7 +560,7 @@ bool ScriptEngineManager::createNumberFomatFunction() fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("NUMBER"); + fd.setCategory(tr("NUMBER")); fd.setName("numberFormat"); fd.setDescription("numberFormat(\""+tr("Value")+"\",\""+tr("Format")+"\",\""+ tr("Precision")+"\",\""+ @@ -582,7 +582,7 @@ bool ScriptEngineManager::createDateFormatFunction(){ fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("DATE&TIME"); + fd.setCategory(tr("DATE&TIME")); fd.setName("dateFormat"); fd.setDescription("dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); fd.setScriptWrapper(QString("function dateFormat(value, format){" @@ -599,7 +599,7 @@ bool ScriptEngineManager::createTimeFormatFunction(){ fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("DATE&TIME"); + fd.setCategory(tr("DATE&TIME")); fd.setName("timeFormat"); fd.setDescription("timeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); fd.setScriptWrapper(QString("function timeFormat(value, format){" @@ -616,7 +616,7 @@ bool ScriptEngineManager::createDateTimeFormatFunction(){ fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("DATE&TIME"); + fd.setCategory(tr("DATE&TIME")); fd.setName("dateTimeFormat"); fd.setDescription("dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); fd.setScriptWrapper(QString("function dateTimeFormat(value, format){" @@ -633,7 +633,7 @@ bool ScriptEngineManager::createDateFunction(){ fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("DATE&TIME"); + fd.setCategory(tr("DATE&TIME")); fd.setName("date"); fd.setDescription("date()"); fd.setScriptWrapper(QString("function date(){" @@ -650,7 +650,7 @@ bool ScriptEngineManager::createNowFunction(){ fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("DATE&TIME"); + fd.setCategory(tr("DATE&TIME")); fd.setName("now"); fd.setDescription("now()"); fd.setScriptWrapper(QString("function now(){" @@ -666,7 +666,7 @@ bool ScriptEngineManager::createCurrencyFormatFunction(){ fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("NUMBER"); + fd.setCategory(tr("NUMBER")); fd.setName("currencyFormat"); fd.setDescription("currencyFormat(\""+tr("Value")+"\",\""+tr("Locale")+"\")"); fd.setScriptWrapper(QString("function currencyFormat(value, locale){" @@ -683,7 +683,7 @@ bool ScriptEngineManager::createCurrencyUSBasedFormatFunction(){ fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("NUMBER"); + fd.setCategory(tr("NUMBER")); fd.setName("currencyUSBasedFormat"); fd.setDescription("currencyUSBasedFormat(\""+tr("Value")+",\""+tr("CurrencySymbol")+"\")"); fd.setScriptWrapper(QString("function currencyUSBasedFormat(value, currencySymbol){" @@ -700,7 +700,7 @@ bool ScriptEngineManager::createSetVariableFunction(){ fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("GENERAL"); + fd.setCategory(tr("GENERAL")); fd.setName("setVariable"); fd.setDescription("setVariable(\""+tr("Name")+"\",\""+tr("Value")+"\")"); fd.setScriptWrapper(QString("function setVariable(name, value){" @@ -715,7 +715,7 @@ bool ScriptEngineManager::createGetVariableFunction() JSFunctionDesc fd; fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("GENERAL"); + fd.setCategory(tr("GENERAL")); fd.setName("getVariable"); fd.setDescription("getVariable(\""+tr("Name")+"\")"); fd.setScriptWrapper(QString("function getVariable(name){" @@ -730,7 +730,7 @@ bool ScriptEngineManager::createGetFieldFunction() JSFunctionDesc fd; fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); - fd.setCategory("GENERAL"); + fd.setCategory(tr("GENERAL")); fd.setName("getField"); fd.setDescription("getField(\""+tr("Name")+"\")"); fd.setScriptWrapper(QString("function getField(name){" diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 987aad9..1e6188e 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1991,6 +1991,26 @@ This preview is no longer valid. Field %1 not found in %2! Поле %1 не найдено в %2! + + GROUP FUNCTIONS + АГРЕГАТНЫЕ ФУНКЦИИ + + + SYSTEM + СИСТЕМНЫЕ + + + NUMBER + ЧИСЛОВЫЕ + + + DATE&TIME + ДАТА И ВРЕМЯ + + + GENERAL + ОБЩИЕ + LimeReport::SettingDialog From ec3724247584e0bd79a3dc5eed91b4c7018f4c95 Mon Sep 17 00:00:00 2001 From: Spiek Date: Tue, 11 Jul 2017 10:58:42 +0200 Subject: [PATCH 031/347] Build Environment for Windows has been fixed - language files are now compile-able if path to build environment contains white spaces - demo reports are now copied correctly if REPORTS_DIR or EXTRA_DIR contains white spaces --- demo_r1/demo_r1.pro | 2 +- demo_r2/demo_r2.pro | 2 +- limereport/limereport.pro | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/demo_r1/demo_r1.pro b/demo_r1/demo_r1.pro index b620055..7f15359 100644 --- a/demo_r1/demo_r1.pro +++ b/demo_r1/demo_r1.pro @@ -54,7 +54,7 @@ win32 { DESTDIR = $$DEST_DIR RC_FILE += mainicon.rc - QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR\\*) $$quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$shell_quote($$EXTRA_DIR\\*) $$shell_quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) !contains(CONFIG, static_build){ contains(CONFIG,zint){ LIBS += -L$${DEST_LIBS} -lQtZint diff --git a/demo_r2/demo_r2.pro b/demo_r2/demo_r2.pro index f327957..ae33d88 100644 --- a/demo_r2/demo_r2.pro +++ b/demo_r2/demo_r2.pro @@ -59,6 +59,6 @@ win32 { } LIBS += -L$${DEST_LIBS} -llimereport - QMAKE_POST_LINK += $$QMAKE_COPY_DIR \"$$EXTRA_DIR\" \"$$REPORTS_DIR\\demo_reports\" $$escape_expand(\\n\\t) + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$shell_quote($$EXTRA_DIR\\*) $$shell_quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) } diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 5f85023..5832173 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -87,16 +87,16 @@ contains(CONFIG,build_translations){ return($$result) } - TRANSLATIONS = $$prependAll(LANGUAGES, $$TRANSLATIONS_PATH/limereport_,.ts) + TRANSLATIONS = $$prependAll(LANGUAGES, \"$$TRANSLATIONS_PATH/limereport_,.ts\") qtPrepareTool(LUPDATE, lupdate) - ts.commands = $$LUPDATE $$PWD -ts $$TRANSLATIONS + ts.commands = $$LUPDATE $$shell_quote($$PWD) -ts $$TRANSLATIONS TRANSLATIONS_FILES = qtPrepareTool(LRELEASE, lrelease) for(tsfile, TRANSLATIONS) { qmfile = $$tsfile - qmfile ~= s,.ts$,.qm, + qmfile ~= s,".ts\"$",".qm\"", qm.commands += $$LRELEASE -removeidentical $$tsfile -qm $$qmfile $$escape_expand(\\n\\t) tmp_command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile $$escape_expand(\\n\\t) TRANSLATIONS_FILES += $$qmfile From 4e1a680e09f30802c566a53afde01163ffba716f Mon Sep 17 00:00:00 2001 From: Spiek Date: Tue, 11 Jul 2017 10:59:40 +0200 Subject: [PATCH 032/347] Syntax Error in mainicon.rc files has been fixed --- demo_r1/mainicon.rc | 2 +- demo_r2/mainicon.rc | 2 +- designer/mainicon.rc | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/demo_r1/mainicon.rc b/demo_r1/mainicon.rc index 83c0128..ef4125c 100644 --- a/demo_r1/mainicon.rc +++ b/demo_r1/mainicon.rc @@ -1 +1 @@ -DI_ICON1 ICON "main.ico" +IDI_ICON1 ICON "main.ico" diff --git a/demo_r2/mainicon.rc b/demo_r2/mainicon.rc index 83c0128..ef4125c 100644 --- a/demo_r2/mainicon.rc +++ b/demo_r2/mainicon.rc @@ -1 +1 @@ -DI_ICON1 ICON "main.ico" +IDI_ICON1 ICON "main.ico" diff --git a/designer/mainicon.rc b/designer/mainicon.rc index 83c0128..ef4125c 100644 --- a/designer/mainicon.rc +++ b/designer/mainicon.rc @@ -1 +1 @@ -DI_ICON1 ICON "main.ico" +IDI_ICON1 ICON "main.ico" From 1b8bd14b358761a7847bd7362a55d4625490e833 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 13 Jul 2017 14:39:07 +0300 Subject: [PATCH 033/347] Labels column has been fixed --- limereport/items/lrchartitem.cpp | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/limereport/items/lrchartitem.cpp b/limereport/items/lrchartitem.cpp index 28c2218..4b03242 100644 --- a/limereport/items/lrchartitem.cpp +++ b/limereport/items/lrchartitem.cpp @@ -42,24 +42,7 @@ QColor color_map[39] = { QColor(96,125,139), QColor(241,153,185), QColor(64,64,64), QColor(188,229,218), QColor(139,0,0), QColor(139,139,0), QColor(171, 130, 255), QColor(139, 123, 139), QColor(255, 0, 255), QColor(139, 69, 19) - }; -//QColor color_map1[55] = { -// QColor(245,147,51), QColor(244,89,73), QColor(0,142,195), QColor(1,107,159), -// QColor(242,219,127), QColor(1,127,111), QColor(143,149,166), QColor(1,173,235), -// QColor(35,63,142), QColor(121,78,38), QColor(254,195,115), QColor(237,38,110), -// QColor(240,102,125), QColor(92,97,98), QColor(0,101,94), QColor(239,59,31), -// QColor(1,73,133), QColor(0,89,151), QColor(237,27,35), QColor(219,3,107), -// QColor(0,173,239), QColor(167,138,117), QColor(0,134,124), QColor(0,110,68), -// QColor(242,199,17), QColor(247,168,114), QColor(65,174,74), QColor(1,142,76), -// QColor(1,82,165), QColor(0,111,134), QColor(69,128,43), QColor(254,222,86), -// QColor(152,262,59), QColor(237,0,137), QColor(188,26,141), QColor(0,57,115), -// QColor(150,180,127), QColor(146,154,160), QColor(1,82,132), QColor(23,97,134), -// QColor(95,194,171), QColor(0,114,187), QColor(200,133,183), QColor(81,33,127), -// QColor(0,254,0), QColor(0,0,254), QColor(254,254,0), -// QColor(254,0,254),QColor(0,254,254), QColor(0,80,0), QColor(80,0,0), -// QColor(0,0,80), QColor(80,80,0), QColor(80,0,80), -// QColor(0,80,80), -//}; +}; QString SeriesItem::name() const { @@ -228,6 +211,7 @@ void ChartItem::updateItemSize(DataSourceManager *dataManager, RenderPass , int if (dataManager && dataManager->dataSource(m_datasource)){ IDataSource* ds = dataManager->dataSource(m_datasource); foreach (SeriesItem* series, m_series) { + series->setLabelsColumn(m_labelsField); series->fillSeriesData(ds); } fillLabels(ds); From 3b1d6bfbbe7a959abc0132373b769f5dcd188dd8 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Fri, 14 Jul 2017 18:36:31 +0300 Subject: [PATCH 034/347] Datasource editor has been added to chart item --- limereport/items/images/pie_chart2.png | Bin 2237 -> 500 bytes .../propertyItems/lrdatasourcepropitem.cpp | 3 +++ 2 files changed, 3 insertions(+) diff --git a/limereport/items/images/pie_chart2.png b/limereport/items/images/pie_chart2.png index f4f788d26c970938c4d4f5bf500e7837197a7a08..9973e5747ff41f67ea9d6bf9892e8e6243e92da4 100644 GIT binary patch delta 484 zcmVmzTe+uvb z01EH{Laa2H00007bV*G`2jK?}4 zyXtsFArV@LlMtoPV22j^0PW^vr)=HY7brUDJJed7R9aA>C2_NkDMV<8fFPvPwSV&G z#?+R7EE zKESkxo|^N_nGAct2aK(5EOP*u_{4euY!tUO2Y~t8Q?w?BnQto(Ad||6W?t`?13}qz zfe$E>Dz_{_5XC3f1E7)$;d2KD*4z)0lS+I*LQJAY8{CHegw$xmcQ5&_3Yln-i56G+L_t(o!=;y9Y#dh=$A9aY!A1e`MBcduKmp?gtM$c5Eww1g`YgIlI!_|2h9N_s%(j z8(2?I3`;-)BEiOG0CQw~+Fb9R;yOqLkOBsQF)7?V0$D*YAl5u?t(~`+s51VqunWW^u1p{B(}N>Lzfvsuqq*Mfh?`B71VAeaY`rz5e}ZtbSqmp? zVP|$qna=BAj{;|pj8AuND1b!jA>fOy%zUNjkM6x?;K80Pz4wShW|*|MiIn5x2oC^l zV+5i?IembI9`d7ik zM$s_~Ox51x-Kk%+YvJUp#_I0@XVxm=ZV+HdAfG7umBagYd?&ZPfAj#Z%%YUy(#d0Z ze|v#V;WSpq2(7R>1`}hof{#zYU!SAlZ>GNg8x%kFc{1sKc9tI^<>WJOfAr(SL8H2C zG2aEIR|uUAFWh5=^w8Ju-SO?d(SdPXnWeE*r~bQV=sRy73Z&ifbT)_MA z56sjSaYjBt%FEH0e;*<3_P8@kr#45rF+cuz;neYGmo>?mUO8&JT$%aW=-|P@k>Y(g zB12=bPV49o>HGLk5Vx@jNMO~K|BQ-J8e%PIdPPdN_alOrSX!)MwZpd30V;!s`dyiM z3>Zr|y8(31xp<`LkM7=CepseuA4(~fU;PO^m*2z2o%O_Pe_-MWtqidi#9GiHgB^c} z{^Bx4ZxTKCYnrVV9zE2XTsOt#zf90~@vRNS zR|2uBgHal#1+kW^XzxGBO*yfxv)RNu`P?coYoxbv2dz{hw_MFU)`G^^ezxA}B6I+{hR^{*2lOu1z_6t8fxK-ec0YU;&3U^P@A1xL#!?*v==-K}$k(k97z1>MZU zprX0U} zyIp#}ORN>fShNvcSb;ID`q~I0*Qe+3ZuDyJRLIGj{E7FjkT|FvjMg^PszAn6sx*QH{OI;3)7$bGEOGKSkndiif{EgyScdl>hG{F<0crDbO#b^1Zdgae8X~A z`iNE(SZ!k=gg`nH>vgc!V6EOjs?lrw3w|1JfB6n>OTCh09wo#AYb0m^MxYqLbtKwE zwBm)Ncj@Y2t+n&@)|85Lh?Ek~DWHr(nHXha^cr7n^y%<^w#;PflUNmDmB1>ARSqbL z)m_Bt-8ha*q?;@@&ueQ<09Xkai>U_TWU~`5BBdbj4PTqk#OO7CY$76>oJfx`)wvg| zes+S z)g{&uk&1|QM4JY$rEcd^v*~ZW1=y&%fgbHO{ArjC4et*cHS& zVnNh+(cQ!|PTX_cYdEun|e@UnX@x5nINp5Nt)GY z^=p{4&S#ZrKVO|YcKLkpI?_?}^%l8v=uxtro3D_W=-NT3E9Efhn^3!dM6th2DlM1_ z-lRHr?6NZLUnXstUDpvEe|A}qe?MNh80+S?dh2|pkQw%h`K@HrK7+Yk(DVsf({xxO zUUv%C_*RiK{oGr8jQh4fN`J9LIxG3-<<~fI{-^E5)`eHV{_M#3bp2XA;f%#RRST*0D1R<@{xlboG-$yDc#T@Jf#`ICwC`bGwmFS#=F)skP?eapauJva5< zebvFlSVg3pbmBV8ol9I?e|X29n?Jr3gw-?JM8C3_-(L4%a+T3+EE&!2_tWK(l3yv7 z{EFY38*wsTp8#mb3%1@oZ-TJe48m#5bP1iiV(7N zrKL1jYXXa@TFdF=lKKCK)2jp`lA|lH@~mAM&jI`2h*#FX0p6d~5hRTojA;M>002ov JPDHLkV1oFuO27aB diff --git a/limereport/objectinspector/propertyItems/lrdatasourcepropitem.cpp b/limereport/objectinspector/propertyItems/lrdatasourcepropitem.cpp index 4463051..b6d4456 100644 --- a/limereport/objectinspector/propertyItems/lrdatasourcepropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrdatasourcepropitem.cpp @@ -54,6 +54,9 @@ namespace{ bool VARIABLE_IS_NOT_USED registredImageFieldProp = LimeReport::ObjectPropFactory::instance().registerCreator( LimeReport::APropIdent("field","LimeReport::ImageItem"),QObject::tr("field"),createFieldPropItem ); + bool VARIABLE_IS_NOT_USED registredChartDatasouceProp = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("datasource","LimeReport::ChartItem"),QObject::tr("datasource"),createDatasourcePropItem + ); } QWidget* LimeReport::DatasourcePropItem::createProperyEditor(QWidget *parent) const{ From 6b0195cb89e085b660f2c0d4400870a749a45793 Mon Sep 17 00:00:00 2001 From: Spiek Date: Tue, 18 Jul 2017 18:09:28 +0200 Subject: [PATCH 035/347] If compiling in debug mode append a "d" to the Target and also link to that files --- 3rdparty/zint-2.4.4/backend_qt4/Zint.pro | 6 +++++- demo_r1/demo_r1.pro | 14 ++++++++++++-- demo_r2/demo_r2.pro | 14 ++++++++++++-- designer/designer.pro | 13 +++++++++++-- limereport/limereport.pro | 14 ++++++++++++-- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/3rdparty/zint-2.4.4/backend_qt4/Zint.pro b/3rdparty/zint-2.4.4/backend_qt4/Zint.pro index b8c6bd5..5ee72e0 100644 --- a/3rdparty/zint-2.4.4/backend_qt4/Zint.pro +++ b/3rdparty/zint-2.4.4/backend_qt4/Zint.pro @@ -26,7 +26,11 @@ unix{ INCLUDEPATH += $$PWD/../backend DEFINES += _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS ZINT_VERSION=\\\"$$VERSION\\\" -TARGET = QtZint +contains(CONFIG,release) { + TARGET = QtZint +} else { + TARGET = QtZintd +} !contains(DEFINES, NO_PNG) { SOURCES += $$PWD/../backend/png.c diff --git a/demo_r1/demo_r1.pro b/demo_r1/demo_r1.pro index 7f15359..20c576f 100644 --- a/demo_r1/demo_r1.pro +++ b/demo_r1/demo_r1.pro @@ -1,7 +1,12 @@ include(../common.pri) QT += core gui -TARGET = LRDemo_r1 +contains(CONFIG,release) { + TARGET = LRDemo_r1 +} else { + TARGET = LRDemo_r1d +} + TEMPLATE = app SOURCES += main.cpp\ @@ -60,7 +65,12 @@ win32 { LIBS += -L$${DEST_LIBS} -lQtZint } } - LIBS += -L$${DEST_LIBS} -llimereport + LIBS += -L$${DEST_LIBS} + contains(CONFIG,release) { + LIBS += -llimereport + } else { + LIBS += -llimereportd + } } diff --git a/demo_r2/demo_r2.pro b/demo_r2/demo_r2.pro index ae33d88..a30cc83 100644 --- a/demo_r2/demo_r2.pro +++ b/demo_r2/demo_r2.pro @@ -1,7 +1,12 @@ include(../common.pri) QT += core gui -TARGET = LRDemo_r2 +contains(CONFIG,release) { + TARGET = LRDemo_r2 +} else { + TARGET = LRDemo_r2d +} + TEMPLATE = app SOURCES += main.cpp\ @@ -57,7 +62,12 @@ win32 { LIBS += -L$${DEST_LIBS} -lQtZint } } - LIBS += -L$${DEST_LIBS} -llimereport + LIBS += -L$${DEST_LIBS} + contains(CONFIG,release) { + LIBS += -llimereport + } else { + LIBS += -llimereportd + } QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$shell_quote($$EXTRA_DIR\\*) $$shell_quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) } diff --git a/designer/designer.pro b/designer/designer.pro index fef1c0f..f8a22c3 100644 --- a/designer/designer.pro +++ b/designer/designer.pro @@ -1,7 +1,11 @@ include(../common.pri) QT += core gui -TARGET = LRDesigner +contains(CONFIG,release) { + TARGET = LRDesigner +} else { + TARGET = LRDesignerd +} TEMPLATE = app SOURCES += main.cpp @@ -47,6 +51,11 @@ win32 { LIBS += -L$${DEST_LIBS} -lQtZint } } - LIBS += -L$${DEST_LIBS} -llimereport + LIBS += -L$${DEST_LIBS} + contains(CONFIG,release) { + LIBS += -llimereport + } else { + LIBS += -llimereportd + } } diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 5832173..6f4e488 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -1,4 +1,9 @@ -TARGET = limereport +contains(CONFIG,release) { + TARGET = limereport +} else { + TARGET = limereportd +} + TEMPLATE = lib contains(CONFIG, static_build){ @@ -73,7 +78,12 @@ contains(CONFIG,zint){ message(zint) INCLUDEPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt4 DEPENDPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt4 - LIBS += -L$${DEST_LIBS} -lQtZint + LIBS += -L$${DEST_LIBS} + contains(CONFIG,release) { + LIBS += -lQtZint + } else { + LIBS += -lQtZintd + } } ####### From 881089fd2f2e6420b3614953737f405e2f61bcb8 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 29 Jul 2017 00:54:43 +0300 Subject: [PATCH 036/347] Some translation functionality has been added --- include/lrreportengine.h | 6 ++ limereport/limereport.pri | 6 +- limereport/lrbasedesignintf.cpp | 26 ++++++-- limereport/lrbasedesignintf.h | 6 ++ limereport/lrcollection.h | 2 +- limereport/lritemdesignintf.cpp | 6 ++ limereport/lritemdesignintf.h | 1 + limereport/lrreportengine.cpp | 83 +++++++++++++++++++++++- limereport/lrreportengine.h | 6 ++ limereport/lrreportengine_p.h | 15 ++++- limereport/lrreporttranslation.cpp | 70 ++++++++++++++++++++ limereport/lrreporttranslation.h | 67 +++++++++++++++++++ limereport/serializators/lrxmlreader.cpp | 41 ++++++++++-- limereport/serializators/lrxmlreader.h | 1 + limereport/serializators/lrxmlwriter.cpp | 44 ++++++++++++- limereport/serializators/lrxmlwriter.h | 2 + 16 files changed, 362 insertions(+), 20 deletions(-) create mode 100644 limereport/lrreporttranslation.cpp create mode 100644 limereport/lrreporttranslation.h diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 108c4e7..64f01bb 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -107,6 +107,12 @@ public: bool resultIsEditable(); bool isBusy(); void setPassPharse(QString& passPharse); + + + QList aviableLanguages(); + bool addTranslationLanguage(QLocale::Language language); + bool setReportLanguage(QLocale::Language language); + signals: void renderStarted(); void renderFinished(); diff --git a/limereport/limereport.pri b/limereport/limereport.pri index 9cbb795..cf5c18e 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -97,7 +97,8 @@ SOURCES += \ $$REPORT_PATH/lritemscontainerdesignitf.cpp \ $$REPORT_PATH/lrcolorindicator.cpp \ $$REPORT_PATH/items/lrchartitem.cpp \ - $$REPORT_PATH/items/lrchartitemeditor.cpp + $$REPORT_PATH/items/lrchartitemeditor.cpp \ + $$REPORT_PATH/lrreporttranslation.cpp contains(CONFIG, staticlib){ SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp @@ -205,7 +206,8 @@ HEADERS += \ $$REPORT_PATH/lritemscontainerdesignitf.h \ $$REPORT_PATH/lrcolorindicator.h \ $$REPORT_PATH/items/lrchartitem.h \ - $$REPORT_PATH/items/lrchartitemeditor.h + $$REPORT_PATH/items/lrchartitemeditor.h \ + $$REPORT_PATH/lrreporttranslation.h contains(CONFIG, staticlib){ HEADERS += $$REPORT_PATH/lrfactoryinitializer.h diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 8160db9..76e41f2 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1423,6 +1423,21 @@ QList BaseDesignIntf::childBaseItems() return resList; } + +void BaseDesignIntf::addChildItems(QList* list){ + foreach(BaseDesignIntf* item, childBaseItems()){ + list->append(item); + item->addChildItems(list); + } +} + +QList BaseDesignIntf::allChildBaseItems() +{ + QList resList; + addChildItems(&resList); + return resList; +} + BaseDesignIntf *BaseDesignIntf::childByName(const QString &name) { foreach(BaseDesignIntf* item, childBaseItems()){ @@ -1539,11 +1554,8 @@ BaseDesignIntf *Marker::object() const return m_object; } +QMap BaseDesignIntf::getStringForTranslation(){ + return QMap(); +} + } //namespace LimeReport - - - - - - - diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 8e77cc9..d9ce55d 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -237,6 +237,7 @@ public: virtual void beforeDelete(); QList childBaseItems(); + QList allChildBaseItems(); BaseDesignIntf* childByName(const QString& name); virtual QWidget *defaultEditor(); @@ -274,6 +275,7 @@ public: void setPatternName(const QString &patternName); BaseDesignIntf* patternItem() const; void setPatternItem(BaseDesignIntf* patternItem); + virtual QMap getStringForTranslation(); Q_INVOKABLE QString setItemWidth(qreal width); Q_INVOKABLE QString setItemHeight(qreal height); @@ -284,6 +286,7 @@ public: Q_INVOKABLE QString setItemPosX(qreal xValue); Q_INVOKABLE QString setItemPosY(qreal yValue); + protected: //ICollectionContainer @@ -344,6 +347,8 @@ protected: virtual void preparePopUpMenu(QMenu& menu){Q_UNUSED(menu)} virtual void processPopUpAction(QAction* action){Q_UNUSED(action)} + void addChildItems(QList* list); + private: void updateSelectionMarker(); int resizeDirectionFlags(QPointF position); @@ -400,6 +405,7 @@ private: ReportSettings* m_reportSettings; QString m_patternName; BaseDesignIntf* m_patternItem; + signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanged(QObject* object, QPointF newPos, QPointF oldPos); diff --git a/limereport/lrcollection.h b/limereport/lrcollection.h index d5d5ffe..641ddff 100644 --- a/limereport/lrcollection.h +++ b/limereport/lrcollection.h @@ -45,7 +45,7 @@ Q_DECLARE_METATYPE(ACollectionProperty) namespace LimeReport{ -const int VARIABLE_IS_NOT_USED COLLECTION_TYPE_ID = qMetaTypeId(); +const int COLLECTION_TYPE_ID = qMetaTypeId(); class ICollectionContainer{ public: virtual QObject* createElement(const QString& collectionName,const QString& elementType)=0; diff --git a/limereport/lritemdesignintf.cpp b/limereport/lritemdesignintf.cpp index 5987086..a830c96 100644 --- a/limereport/lritemdesignintf.cpp +++ b/limereport/lritemdesignintf.cpp @@ -116,4 +116,10 @@ void ItemDesignIntf::initFlags() Spacer::Spacer(QObject *owner, QGraphicsItem *parent) :ItemDesignIntf("Spacer",owner,parent){} +QMap ContentItemDesignIntf::getStringForTranslation(){ + QMapmap; + map.insert("content",content()); + return map; +} + }// namespace LimeReport diff --git a/limereport/lritemdesignintf.h b/limereport/lritemdesignintf.h index a9c8d7a..f07fd9f 100644 --- a/limereport/lritemdesignintf.h +++ b/limereport/lritemdesignintf.h @@ -75,6 +75,7 @@ public: :ItemDesignIntf(xmlTypeName,owner,parent){} virtual QString content() const = 0; virtual void setContent(const QString& value) = 0; + QMap getStringForTranslation(); }; class LayoutDesignIntf : public ItemDesignIntf{ diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 96a0da4..18af591 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -90,6 +90,11 @@ ReportEnginePrivate::~ReportEnginePrivate() } foreach(PageDesignIntf* page,m_pages) delete page; m_pages.clear(); + + foreach(ReportTranslation* translation, m_translations) + delete translation; + m_translations.clear(); + if (m_ownedSettings&&m_settings) delete m_settings; } @@ -178,10 +183,14 @@ void ReportEnginePrivate::clearReport() { foreach(PageDesignIntf* page,m_pages) delete page; m_pages.clear(); + foreach(ReportTranslation* reportTranslation, m_translations) + delete reportTranslation; + m_translations.clear(); m_datasources->clear(DataSourceManager::Owned); m_fileName=""; m_scriptEngineContext->clear(); m_reportSettings.setDefaultValues(); + emit cleared(); } @@ -379,7 +388,7 @@ bool ReportEnginePrivate::printToPDF(const QString &fileName) void ReportEnginePrivate::previewReport(PreviewHints hints) { - QTime start = QTime::currentTime(); +// QTime start = QTime::currentTime(); try{ dataManager()->setDesignTime(false); ReportPages pages = renderToPages(); @@ -733,11 +742,62 @@ QString ReportEnginePrivate::renderToString() }else return QString(); } +PageDesignIntf* ReportEnginePrivate::getPageByName(const QString& pageName) +{ + foreach(PageDesignIntf* page, m_pages){ + if ( page->objectName().compare(pageName, Qt::CaseInsensitive) == 0) + return page; + } + return 0; +} + void ReportEnginePrivate::setPassPhrase(const QString &passPhrase) { m_passPhrase = passPhrase; } +bool ReportEnginePrivate::addTranslationLanguage(QLocale::Language language) +{ + if (!m_translations.keys().contains(language)){ + ReportTranslation* translation = new ReportTranslation(language,m_pages); + m_translations.insert(language, translation); + return true; + } else { + m_lastError = tr("Language %1 already exists").arg(QLocale::languageToString(language)); + return false; + } +} + +bool ReportEnginePrivate::setReportLanguage(QLocale::Language language){ + if (!m_translations.keys().contains(language)) return false; + ReportTranslation* translation = m_translations.value(language); + + foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){ + PageDesignIntf* page = getPageByName(pageTranslation->pageName); + if (page){ + foreach(ItemTranslation itemTranslation, pageTranslation->itemsTranslation){ + BaseDesignIntf* item = page->pageItem()->childByName(itemTranslation.itemName); + if (item) { + foreach(PropertyTranslation propertyTranslation, itemTranslation.propertyesTranslation){ + item->setProperty(propertyTranslation.propertyName.toLatin1(),propertyTranslation.value); + } + } + } + } + } + return true; +} + +QList ReportEnginePrivate::aviableLanguages() +{ + return m_translations.keys(); +} + +ReportTranslation*ReportEnginePrivate::reportTranslation(QLocale::Language language) +{ + return m_translations.value(language); +} + bool ReportEnginePrivate::resultIsEditable() const { return m_resultIsEditable; @@ -934,6 +994,24 @@ void ReportEngine::setPassPharse(QString &passPharse) d->setPassPhrase(passPharse); } +QList ReportEngine::aviableLanguages() +{ + Q_D(ReportEngine); + return d->aviableLanguages(); +} + +bool ReportEngine::addTranslationLanguage(QLocale::Language language) +{ + Q_D(ReportEngine); + return d->addTranslationLanguage(language); +} + +bool ReportEngine::setReportLanguage(QLocale::Language language) +{ + Q_D(ReportEngine); + return d->setReportLanguage(language); +} + void ReportEngine::setShowProgressDialog(bool value) { Q_D(ReportEngine); @@ -1046,6 +1124,5 @@ ReportEngine::ReportEngine(ReportEnginePrivate &dd, QObject *parent) connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); } +}// namespace LimeReport - -} diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 108c4e7..64f01bb 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -107,6 +107,12 @@ public: bool resultIsEditable(); bool isBusy(); void setPassPharse(QString& passPharse); + + + QList aviableLanguages(); + bool addTranslationLanguage(QLocale::Language language); + bool setReportLanguage(QLocale::Language language); + signals: void renderStarted(); void renderFinished(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 0c65284..c31e019 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -41,6 +41,7 @@ #include "lrreportrender.h" #include "serializators/lrstorageintf.h" #include "lrscriptenginemanager.h" +#include "lrreporttranslation.h" class QFileSystemWatcher; @@ -52,7 +53,7 @@ class ReportDesignWindow; //TODO: Add on render callback -class ReportEnginePrivate : public QObject, public ICollectionContainer +class ReportEnginePrivate : public QObject, public ICollectionContainer, public ITranslationContainer { Q_OBJECT Q_DECLARE_PUBLIC(ReportEngine) @@ -60,6 +61,8 @@ class ReportEnginePrivate : public QObject, public ICollectionContainer Q_PROPERTY(QObject* datasourcesManager READ dataManager) Q_PROPERTY(QObject* scriptContext READ scriptContext) Q_PROPERTY(bool suppressFieldAndVarError READ suppressFieldAndVarError WRITE setSuppressFieldAndVarError) + Q_PROPERTY(ATranslationProperty translation READ fakeTranslationReader) + friend class PreviewReportWidget; public: static void printReport(ItemsReaderIntf::Ptr reader, QPrinter &printer); @@ -128,6 +131,10 @@ public: void setResultEditable(bool value); void setPassPhrase(const QString &passPhrase); + bool addTranslationLanguage(QLocale::Language language); + bool setReportLanguage(QLocale::Language language); + QList aviableLanguages(); + ReportTranslation* reportTranslation(QLocale::Language language); signals: void pagesLoadFinished(); @@ -157,8 +164,13 @@ private: void saveError(QString message); void showError(QString message); //ICollectionContainer + //ITranslationContainer + Translations* translations(){ return &m_translations;} + //ITranslationContainer ReportPages renderToPages(); QString renderToString(); + PageDesignIntf* getPageByName(const QString& pageName); + ATranslationProperty fakeTranslationReader(){ return ATranslationProperty();} private: QList m_pages; DataSourceManager* m_datasources; @@ -182,6 +194,7 @@ private: bool m_resultIsEditable; QString m_passPhrase; QFileSystemWatcher *m_fileWatcher; + Translations m_translations; }; } diff --git a/limereport/lrreporttranslation.cpp b/limereport/lrreporttranslation.cpp new file mode 100644 index 0000000..bc8717a --- /dev/null +++ b/limereport/lrreporttranslation.cpp @@ -0,0 +1,70 @@ +#include "lrreporttranslation.h" + +#include "lrbasedesignintf.h" +#include "lrpagedesignintf.h" + +namespace LimeReport{ + +ReportTranslation::ReportTranslation(QLocale::Language language, QList pages) + : m_language(language) +{ + foreach (PageDesignIntf* page, pages){ + m_pagesTranslation.append(createPageTranslation(page)); + } +} + +ReportTranslation::ReportTranslation(const ReportTranslation& reportTranslation) + :m_language(reportTranslation.m_language) +{ + foreach(PageTranslation* pageTranslation, reportTranslation.m_pagesTranslation){ + m_pagesTranslation.append(pageTranslation); + } +} + +ReportTranslation::~ReportTranslation() +{ + foreach(PageTranslation* page, m_pagesTranslation){ + delete page; + } + m_pagesTranslation.clear(); +} + +PageTranslation* ReportTranslation::createPageTranslation(PageDesignIntf* page) +{ + PageTranslation* pageTranslation = new PageTranslation; + pageTranslation->pageName = page->objectName(); + foreach(BaseDesignIntf* item, page->pageItem()->allChildBaseItems()){ + QMap stringsForTranslation = item->getStringForTranslation(); + if (!stringsForTranslation.isEmpty()){ + ItemTranslation itemTranslation; + itemTranslation.itemName = item->objectName(); + foreach(QString propertyName, stringsForTranslation.keys()){ + PropertyTranslation propertyTranslation; + propertyTranslation.propertyName = propertyName; + propertyTranslation.value = stringsForTranslation.value(propertyName); + itemTranslation.propertyesTranslation.append(propertyTranslation); + } + pageTranslation->itemsTranslation.append(itemTranslation); + } + } + return pageTranslation; +} + +QList ReportTranslation::pagesTranslation() const +{ + return m_pagesTranslation; +} + +PageTranslation*ReportTranslation::createEmptyPageTranslation() +{ + PageTranslation* pageTranslation = new PageTranslation; + m_pagesTranslation.append(pageTranslation); + return pageTranslation; +} + +QLocale::Language ReportTranslation::language() const +{ + return m_language; +} + +} //namespace LimeReport diff --git a/limereport/lrreporttranslation.h b/limereport/lrreporttranslation.h new file mode 100644 index 0000000..8af2de7 --- /dev/null +++ b/limereport/lrreporttranslation.h @@ -0,0 +1,67 @@ +#ifndef REPORTTRANSLATION_H +#define REPORTTRANSLATION_H + +#include +#include +#include +#include + +#include "lrpagedesignintf.h" + + +class ATranslationProperty{ +public: + ATranslationProperty(){} + ATranslationProperty(const ACollectionProperty& ){} + virtual ~ATranslationProperty(){} +}; + +Q_DECLARE_METATYPE(ATranslationProperty) +const int TRANSLATION_TYPE_ID = qMetaTypeId(); + +namespace LimeReport{ + +struct PropertyTranslation{ + QString propertyName; + QString value; +}; + +struct ItemTranslation{ + QString itemName; + QList propertyesTranslation; +}; + +struct PageTranslation{ + QString pageName; + QList itemsTranslation; +}; + +class ReportTranslation{ +public: + ReportTranslation(QLocale::Language language) :m_language(language){} + ReportTranslation(QLocale::Language language, QList pages); + ReportTranslation(const ReportTranslation& reportTranslation); + ~ReportTranslation(); + QLocale::Language language() const; + QList pagesTranslation() const; + PageTranslation* createEmptyPageTranslation(); +private: + PageTranslation* createPageTranslation(PageDesignIntf* page); +private: + QLocale::Language m_language; + QList m_pagesTranslation; +}; + + +typedef QMap Translations; + +class ITranslationContainer{ +public: + virtual Translations* translations() = 0; +}; + +} // namespace LimeReport + +//Q_DECLARE_METATYPE(ReportTranslation) + +#endif // REPORTTRANSLATION_H diff --git a/limereport/serializators/lrxmlreader.cpp b/limereport/serializators/lrxmlreader.cpp index 2e791cd..3cf11ad 100644 --- a/limereport/serializators/lrxmlreader.cpp +++ b/limereport/serializators/lrxmlreader.cpp @@ -33,6 +33,7 @@ #include "lrbasedesignintf.h" #include "lrdesignelementsfactory.h" #include "lrcollection.h" +#include "lrreporttranslation.h" #include @@ -112,11 +113,12 @@ void XMLReader::readItemFromNode(QObject* item,QDomElement *node) QDomElement currentNode =node->childNodes().at(i).toElement(); if (currentNode.attribute("Type")=="Object"){ readQObject(item,¤tNode); - }else if (currentNode.attribute("Type")=="Collection") + } else if (currentNode.attribute("Type")=="Collection") { readCollection(item,¤tNode); - } - else readProperty(item,¤tNode); + } else if (currentNode.attribute("Type")=="Translation"){ + readTranslation(item,¤tNode); + } else readProperty(item,¤tNode); } if (lf) lf->objectLoadFinished(); @@ -191,7 +193,7 @@ void XMLReader::readCollection(QObject *item, QDomElement *node) ICollectionContainer* collection = dynamic_cast(item); if (collection){ QString collectionName = node->nodeName(); - for(int i=0;ichildNodes().count();i++){ + for(int i = 0; i < node->childNodes().count(); ++i){ QDomElement currentNode =node->childNodes().at(i).toElement(); QObject* obj = collection->createElement(collectionName,currentNode.attribute("ClassName")); if (obj) @@ -201,6 +203,37 @@ void XMLReader::readCollection(QObject *item, QDomElement *node) } } +void XMLReader::readTranslation(QObject* item, QDomElement* node) +{ + ITranslationContainer* tranclationContainer = dynamic_cast(item); + if (tranclationContainer){ + Translations* translations = tranclationContainer->translations(); + for (int langIndex = 0; langIndexchildNodes().count(); ++langIndex){ + QDomElement languageNode = node->childNodes().at(langIndex).toElement(); + ReportTranslation* curTranslation = new ReportTranslation((QLocale::Language)(languageNode.attributeNode("Value").value().toInt())); + for (int pageIndex = 0; pageIndex < languageNode.childNodes().count(); ++pageIndex){ + QDomElement pageNode = languageNode.childNodes().at(pageIndex).toElement(); + PageTranslation* pageTranslation = curTranslation->createEmptyPageTranslation(); + pageTranslation->pageName = pageNode.nodeName(); + for (int itemIndex = 0; itemIndex < pageNode.childNodes().count(); ++itemIndex){ + QDomElement itemNode = pageNode.childNodes().at(itemIndex).toElement(); + ItemTranslation itemTranslation; + itemTranslation.itemName = itemNode.nodeName(); + for (int propertyIndex = 0; propertyIndex < itemNode.childNodes().count(); ++propertyIndex){ + QDomElement propertyNode = itemNode.childNodes().at(propertyIndex).toElement(); + PropertyTranslation propertyTranslation; + propertyTranslation.propertyName = propertyNode.nodeName(); + propertyTranslation.value = propertyNode.attribute("Value"); + itemTranslation.propertyesTranslation.append(propertyTranslation); + } + pageTranslation->itemsTranslation.append(itemTranslation); + } + } + translations->insert(curTranslation->language(),curTranslation); + } + } +} + FileXMLReader::FileXMLReader(QString fileName) : m_fileName(fileName) { diff --git a/limereport/serializators/lrxmlreader.h b/limereport/serializators/lrxmlreader.h index c0f3508..3dbbc5c 100644 --- a/limereport/serializators/lrxmlreader.h +++ b/limereport/serializators/lrxmlreader.h @@ -61,6 +61,7 @@ protected: void readProperty(QObject *item, QDomElement *node); void readQObject(QObject *item, QDomElement *node); void readCollection(QObject *item, QDomElement *node); + void readTranslation(QObject *item, QDomElement *node); QVariant getValue(QDomElement *node); protected: diff --git a/limereport/serializators/lrxmlwriter.cpp b/limereport/serializators/lrxmlwriter.cpp index 3038373..b0f0bee 100644 --- a/limereport/serializators/lrxmlwriter.cpp +++ b/limereport/serializators/lrxmlwriter.cpp @@ -31,6 +31,7 @@ #include "lrbasedesignintf.h" #include "serializators/lrxmlserializatorsfactory.h" #include "lrcollection.h" +#include "lrreporttranslation.h" #include namespace LimeReport{ @@ -137,7 +138,9 @@ void XMLWriter::saveProperty(QString name, QObject* item, QDomElement *node) typeName = item->property(name.toLatin1()).typeName(); CreateSerializator creator=0; - if (isCollection(name,item)) { saveCollection(name,item,node); return;} + if (isCollection(name, item)) { saveCollection(name,item,node); return; } + if (isTranslation(name, item)) { saveTranslation(name, item, node); return; } + if (isQObject(name,item)) { if (qvariant_cast(item->property(name.toLatin1()))) putQObjectProperty(name,qvariant_cast(item->property(name.toLatin1())),node); @@ -193,9 +196,15 @@ bool XMLWriter::isCollection(QString propertyName, QObject* item) return QMetaType::type(prop.typeName())==COLLECTION_TYPE_ID; } +bool XMLWriter::isTranslation(QString propertyName, QObject* item) +{ + QMetaProperty prop=item->metaObject()->property(item->metaObject()->indexOfProperty(propertyName.toLatin1())); + return QMetaType::type(prop.typeName())==TRANSLATION_TYPE_ID; +} + void XMLWriter::saveCollection(QString propertyName, QObject *item, QDomElement *node) { - ICollectionContainer * collection=dynamic_cast(item); + ICollectionContainer * collection = dynamic_cast(item); QDomElement collectionNode=m_doc->createElement(propertyName); collectionNode.setAttribute("Type","Collection"); @@ -206,6 +215,37 @@ void XMLWriter::saveCollection(QString propertyName, QObject *item, QDomElement node->appendChild(collectionNode); } +void XMLWriter::saveTranslation(QString propertyName, QObject* item, QDomElement* node) +{ + ITranslationContainer* translationsContainer = dynamic_cast(item); + if (translationsContainer){ + QDomElement translationsNode=m_doc->createElement(propertyName); + translationsNode.setAttribute("Type","Translation"); + Translations* translations = translationsContainer->translations(); + foreach(QLocale::Language language, translations->keys()){ + QDomElement languageNode = m_doc->createElement(QLocale::languageToString(language)); + languageNode.setAttribute("Value",QString::number(language)); + translationsNode.appendChild(languageNode); + ReportTranslation* curTranslation = translations->value(language); + foreach(PageTranslation* page, curTranslation->pagesTranslation()){ + QDomElement pageNode = m_doc->createElement(page->pageName); + languageNode.appendChild(pageNode); + foreach(ItemTranslation item, page->itemsTranslation){ + QDomElement itemNode = m_doc->createElement(item.itemName); + pageNode.appendChild(itemNode); + foreach(PropertyTranslation property, item.propertyesTranslation){ + QDomElement propertyNode = m_doc->createElement(property.propertyName); + propertyNode.setAttribute("Value",property.value); + itemNode.appendChild(propertyNode); + } + } + } + } + node->appendChild(translationsNode); + } + +} + bool XMLWriter::isQObject(QString propertyName, QObject *item) { QMetaProperty prop=item->metaObject()->property(item->metaObject()->indexOfProperty(propertyName.toLatin1())); diff --git a/limereport/serializators/lrxmlwriter.h b/limereport/serializators/lrxmlwriter.h index 0259a75..05d47a7 100644 --- a/limereport/serializators/lrxmlwriter.h +++ b/limereport/serializators/lrxmlwriter.h @@ -62,7 +62,9 @@ private: bool enumOrFlag(QString name, QObject* item); QString extractClassName(QObject* item); bool isCollection(QString propertyName, QObject *item); + bool isTranslation(QString propertyName, QObject *item); void saveCollection(QString propertyName, QObject *item, QDomElement *node); + void saveTranslation(QString propertyName, QObject *item, QDomElement *node); bool isQObject(QString propertyName, QObject *item); bool replaceNode(QDomElement node, QObject *item); private: From 8c5a9fcd918a0a7d083a826f608f8b69fa487ed2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 5 Aug 2017 01:38:19 +0300 Subject: [PATCH 037/347] Translation has been updated --- include/lrreportengine.h | 1 + limereport/limereport.pri | 11 +- limereport/limereport.pro | 1 - limereport/lrreportdesignwidget.cpp | 10 +- limereport/lrreportdesignwidget.h | 5 +- limereport/lrreportengine.cpp | 17 +- limereport/lrreportengine.h | 1 + limereport/lrreportengine_p.h | 2 +- limereport/lrreporttranslation.cpp | 91 +++++++- limereport/lrreporttranslation.h | 14 +- limereport/serializators/lrxmlreader.cpp | 16 +- limereport/serializators/lrxmlwriter.cpp | 12 +- limereport/translationeditor/images/add.png | Bin 0 -> 655 bytes .../translationeditor/images/checked.png | Bin 0 -> 265 bytes .../translationeditor/images/green_check.png | Bin 0 -> 1347 bytes .../translationeditor/images/question.png | Bin 0 -> 542 bytes .../translationeditor/images/remove.png | Bin 0 -> 867 bytes .../translationeditor/translationeditor.cpp | 165 ++++++++++++++ .../translationeditor/translationeditor.h | 45 ++++ .../translationeditor/translationeditor.qrc | 8 + .../translationeditor/translationeditor.ui | 214 ++++++++++++++++++ 21 files changed, 575 insertions(+), 38 deletions(-) create mode 100644 limereport/translationeditor/images/add.png create mode 100644 limereport/translationeditor/images/checked.png create mode 100644 limereport/translationeditor/images/green_check.png create mode 100644 limereport/translationeditor/images/question.png create mode 100644 limereport/translationeditor/images/remove.png create mode 100644 limereport/translationeditor/translationeditor.cpp create mode 100644 limereport/translationeditor/translationeditor.h create mode 100644 limereport/translationeditor/translationeditor.qrc create mode 100644 limereport/translationeditor/translationeditor.ui diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 64f01bb..f785713 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -72,6 +72,7 @@ class LIMEREPORT_EXPORT ReportEngine : public QObject{ Q_OBJECT friend class ReportDesignWidget; friend class PreviewReportWidget; + friend class TranslationEditor; public: static void setSettings(QSettings *value){m_settings=value;} public: diff --git a/limereport/limereport.pri b/limereport/limereport.pri index cf5c18e..2f91286 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -72,6 +72,7 @@ SOURCES += \ $$REPORT_PATH/items/lrtextitemeditor.cpp \ $$REPORT_PATH/items/lrshapeitem.cpp \ $$REPORT_PATH/items/lrtextitem.cpp \ + $$REPORT_PATH/translationeditor/translationeditor.cpp \ $$REPORT_PATH/lrbanddesignintf.cpp \ $$REPORT_PATH/lrpageitemdesignintf.cpp \ $$REPORT_PATH/lrpagedesignintf.cpp \ @@ -172,6 +173,7 @@ HEADERS += \ $$REPORT_PATH/items/lrshapeitem.h \ $$REPORT_PATH/items/lrimageitem.h \ $$REPORT_PATH/items/lrsimpletagparser.h \ + $$REPORT_PATH/translationeditor/translationeditor.h \ $$REPORT_PATH/lrfactoryinitializer.h \ $$REPORT_PATH/lrbanddesignintf.h \ $$REPORT_PATH/lrpageitemdesignintf.h \ @@ -204,7 +206,7 @@ HEADERS += \ $$REPORT_PATH/lrsettingdialog.h \ $$REPORT_PATH/lrpreviewreportwidget_p.h \ $$REPORT_PATH/lritemscontainerdesignitf.h \ - $$REPORT_PATH/lrcolorindicator.h \ + $$REPORT_PATH/lrcolorindicator.h \ $$REPORT_PATH/items/lrchartitem.h \ $$REPORT_PATH/items/lrchartitemeditor.h \ $$REPORT_PATH/lrreporttranslation.h @@ -229,12 +231,13 @@ FORMS += \ $$REPORT_PATH/lraboutdialog.ui \ $$REPORT_PATH/lrsettingdialog.ui \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ - $$REPORT_PATH/items/lrchartitemeditor.ui + $$REPORT_PATH/items/lrchartitemeditor.ui \ + $$REPORT_PATH/translationeditor/translationeditor.ui RESOURCES += \ $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ $$REPORT_PATH/report.qrc \ $$REPORT_PATH/items/items.qrc \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc - + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \ + $$REPORT_PATH/translationeditor/translationeditor.qrc diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 6f4e488..7d45253 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -86,7 +86,6 @@ contains(CONFIG,zint){ } } -####### ####Automatically build required translation files (*.qm) contains(CONFIG,build_translations){ diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index b082273..ce6a6fa 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -34,6 +34,7 @@ #include "lrbasedesignintf.h" #include "lrsettingdialog.h" #include "dialogdesigner/lrdialogdesigner.h" +#include "translationeditor/translationeditor.h" #include #include @@ -137,6 +138,7 @@ ReportDesignWidget::EditorTabType ReportDesignWidget::activeTabType() QString tabType = m_tabWidget->tabWhatsThis(m_tabWidget->currentIndex()); if ( tabType.compare("dialog") == 0) return Dialog; if ( tabType.compare("script") == 0) return Script; + if ( tabType.compare("translations") == 0) return Translations; return Page; } @@ -245,10 +247,13 @@ void ReportDesignWidget::createTabs(){ dialogDesigner = m_dialogDesignerManager->createFormEditor(dialogDesc->description()); pageIndex = m_tabWidget->addTab(dialogDesigner,QIcon(),dialogDesc->name()); m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); - } #endif + m_traslationEditor = new TranslationEditor(this); + pageIndex = m_tabWidget->addTab(m_traslationEditor,QIcon(),tr("Translations")); + m_tabWidget->setTabWhatsThis(pageIndex,"translations"); + } #ifdef HAVE_QTDESIGNER_INTEGRATION @@ -771,6 +776,9 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) } updateDialogs(); #endif + if (activeTabType() == Translations){ + m_traslationEditor->setReportEngine(report()); + } emit activePageChanged(); } diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 82717af..9ae27ed 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -50,6 +50,7 @@ class DataBrowser; class ReportDesignWindow; class DialogDesignerManager; class DialogDesigner; +class TranslationEditor; class ReportDesignWidget : public QWidget { @@ -67,7 +68,8 @@ public: enum EditorTabType{ Page, Dialog, - Script + Script, + Translations }; ReportDesignWidget(ReportEngine* report, QMainWindow *mainWindow, QWidget *parent = 0); ~ReportDesignWidget(); @@ -186,6 +188,7 @@ private: ReportEnginePrivate* m_report; QGraphicsView *m_view; QTextEdit* m_scriptEditor; + TranslationEditor* m_traslationEditor; #ifdef HAVE_QTDESIGNER_INTEGRATION DialogDesignerManager* m_dialogDesignerManager; #endif diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 18af591..33fec2a 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -167,6 +167,15 @@ void ReportEnginePrivate::showError(QString message) QMessageBox::critical(0,tr("Error"),message); } +void ReportEnginePrivate::updateTranslations() +{ + foreach(ReportTranslation* translation, m_translations.values()){ + foreach(PageDesignIntf* page, m_pages){ + translation->updatePageTranslation(page); + } + } +} + void ReportEnginePrivate::slotDataSourceCollectionLoaded(const QString &collectionName) { emit datasourceCollectionLoadFinished(collectionName); @@ -775,11 +784,11 @@ bool ReportEnginePrivate::setReportLanguage(QLocale::Language language){ foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){ PageDesignIntf* page = getPageByName(pageTranslation->pageName); if (page){ - foreach(ItemTranslation itemTranslation, pageTranslation->itemsTranslation){ - BaseDesignIntf* item = page->pageItem()->childByName(itemTranslation.itemName); + foreach(ItemTranslation* itemTranslation, pageTranslation->itemsTranslation){ + BaseDesignIntf* item = page->pageItem()->childByName(itemTranslation->itemName); if (item) { - foreach(PropertyTranslation propertyTranslation, itemTranslation.propertyesTranslation){ - item->setProperty(propertyTranslation.propertyName.toLatin1(),propertyTranslation.value); + foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){ + item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value); } } } diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 64f01bb..f785713 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -72,6 +72,7 @@ class LIMEREPORT_EXPORT ReportEngine : public QObject{ Q_OBJECT friend class ReportDesignWidget; friend class PreviewReportWidget; + friend class TranslationEditor; public: static void setSettings(QSettings *value){m_settings=value;} public: diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index c31e019..23c53cc 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -135,7 +135,6 @@ public: bool setReportLanguage(QLocale::Language language); QList aviableLanguages(); ReportTranslation* reportTranslation(QLocale::Language language); - signals: void pagesLoadFinished(); void datasourceCollectionLoadFinished(const QString& collectionName); @@ -166,6 +165,7 @@ private: //ICollectionContainer //ITranslationContainer Translations* translations(){ return &m_translations;} + void updateTranslations(); //ITranslationContainer ReportPages renderToPages(); QString renderToString(); diff --git a/limereport/lrreporttranslation.cpp b/limereport/lrreporttranslation.cpp index bc8717a..2df00eb 100644 --- a/limereport/lrreporttranslation.cpp +++ b/limereport/lrreporttranslation.cpp @@ -34,22 +34,65 @@ PageTranslation* ReportTranslation::createPageTranslation(PageDesignIntf* page) PageTranslation* pageTranslation = new PageTranslation; pageTranslation->pageName = page->objectName(); foreach(BaseDesignIntf* item, page->pageItem()->allChildBaseItems()){ - QMap stringsForTranslation = item->getStringForTranslation(); - if (!stringsForTranslation.isEmpty()){ - ItemTranslation itemTranslation; - itemTranslation.itemName = item->objectName(); - foreach(QString propertyName, stringsForTranslation.keys()){ - PropertyTranslation propertyTranslation; - propertyTranslation.propertyName = propertyName; - propertyTranslation.value = stringsForTranslation.value(propertyName); - itemTranslation.propertyesTranslation.append(propertyTranslation); - } - pageTranslation->itemsTranslation.append(itemTranslation); - } + createItemTranslation(item, pageTranslation); } return pageTranslation; } +void ReportTranslation::createItemTranslation(BaseDesignIntf* item, PageTranslation* pageTranslation){ + QMap stringsForTranslation = item->getStringForTranslation(); + if (!stringsForTranslation.isEmpty()){ + ItemTranslation* itemTranslation = new ItemTranslation; + itemTranslation->itemName = item->objectName(); + foreach(QString propertyName, stringsForTranslation.keys()){ + PropertyTranslation* propertyTranslation = new PropertyTranslation; + propertyTranslation->propertyName = propertyName; + propertyTranslation->value = stringsForTranslation.value(propertyName); + propertyTranslation->sourceValue = stringsForTranslation.value(propertyName); + propertyTranslation->checked = false; + propertyTranslation->sourceHasBeenChanged = false; + itemTranslation->propertyesTranslation.append(propertyTranslation); + } + pageTranslation->itemsTranslation.insert(itemTranslation->itemName, itemTranslation); + } +} + +PageTranslation* ReportTranslation::findPageTranslation(const QString& page_name) +{ + foreach(PageTranslation* page, m_pagesTranslation){ + if (page->pageName.compare(page_name) == 0){ + return page; + } + } + return 0; +} + +void ReportTranslation::updatePageTranslation(PageDesignIntf* page) +{ + PageTranslation* pageTranslation = findPageTranslation(page->objectName()); + if (!pageTranslation){ + pageTranslation = createPageTranslation(page); + m_pagesTranslation.append(pageTranslation); + } + if (pageTranslation){ + foreach(BaseDesignIntf* item, page->pageItem()->allChildBaseItems()){ + QMap stringsForTranslation = item->getStringForTranslation(); + if (!stringsForTranslation.isEmpty()){ + ItemTranslation* itemTranslation = pageTranslation->itemsTranslation.value(item->objectName()); + if (itemTranslation){ + foreach(QString propertyName, stringsForTranslation.keys()){ + PropertyTranslation* propertyTranslation = itemTranslation->findProperty(propertyName); + propertyTranslation->sourceValue = stringsForTranslation.value(propertyName); + propertyTranslation->sourceHasBeenChanged = propertyTranslation->value != propertyTranslation->sourceValue; + } + } else { + createItemTranslation(item, pageTranslation); + } + } + } + } +} + QList ReportTranslation::pagesTranslation() const { return m_pagesTranslation; @@ -67,4 +110,28 @@ QLocale::Language ReportTranslation::language() const return m_language; } +PropertyTranslation* ItemTranslation::findProperty(const QString& propertyName) +{ + foreach(PropertyTranslation* propertyTranslation, propertyesTranslation){ + if (propertyTranslation->propertyName.compare(propertyName) == 0){ + return propertyTranslation; + } + } + return 0; +} + +ItemTranslation::~ItemTranslation() +{ + foreach(PropertyTranslation* property, propertyesTranslation){ + delete property; + } +} + +PageTranslation::~PageTranslation() +{ + foreach(ItemTranslation* item, itemsTranslation){ + delete item; + } +} + } //namespace LimeReport diff --git a/limereport/lrreporttranslation.h b/limereport/lrreporttranslation.h index 8af2de7..cae7622 100644 --- a/limereport/lrreporttranslation.h +++ b/limereport/lrreporttranslation.h @@ -24,16 +24,22 @@ namespace LimeReport{ struct PropertyTranslation{ QString propertyName; QString value; + QString sourceValue; + bool checked; + bool sourceHasBeenChanged; }; struct ItemTranslation{ QString itemName; - QList propertyesTranslation; + PropertyTranslation* findProperty(const QString& propertyName); + ~ItemTranslation(); + QList propertyesTranslation; }; struct PageTranslation{ QString pageName; - QList itemsTranslation; + ~PageTranslation(); + QHash itemsTranslation; }; class ReportTranslation{ @@ -45,6 +51,9 @@ public: QLocale::Language language() const; QList pagesTranslation() const; PageTranslation* createEmptyPageTranslation(); + void updatePageTranslation(PageDesignIntf* page); + PageTranslation* findPageTranslation(const QString& page_name); + void createItemTranslation(BaseDesignIntf* item, PageTranslation* pageTranslation); private: PageTranslation* createPageTranslation(PageDesignIntf* page); private: @@ -58,6 +67,7 @@ typedef QMap Translations; class ITranslationContainer{ public: virtual Translations* translations() = 0; + virtual void updateTranslations() = 0; }; } // namespace LimeReport diff --git a/limereport/serializators/lrxmlreader.cpp b/limereport/serializators/lrxmlreader.cpp index 3cf11ad..9b15b30 100644 --- a/limereport/serializators/lrxmlreader.cpp +++ b/limereport/serializators/lrxmlreader.cpp @@ -217,16 +217,18 @@ void XMLReader::readTranslation(QObject* item, QDomElement* node) pageTranslation->pageName = pageNode.nodeName(); for (int itemIndex = 0; itemIndex < pageNode.childNodes().count(); ++itemIndex){ QDomElement itemNode = pageNode.childNodes().at(itemIndex).toElement(); - ItemTranslation itemTranslation; - itemTranslation.itemName = itemNode.nodeName(); + ItemTranslation* itemTranslation = new ItemTranslation(); + itemTranslation->itemName = itemNode.nodeName(); for (int propertyIndex = 0; propertyIndex < itemNode.childNodes().count(); ++propertyIndex){ QDomElement propertyNode = itemNode.childNodes().at(propertyIndex).toElement(); - PropertyTranslation propertyTranslation; - propertyTranslation.propertyName = propertyNode.nodeName(); - propertyTranslation.value = propertyNode.attribute("Value"); - itemTranslation.propertyesTranslation.append(propertyTranslation); + PropertyTranslation* propertyTranslation = new PropertyTranslation; + propertyTranslation->propertyName = propertyNode.nodeName(); + propertyTranslation->value = propertyNode.attribute("Value"); + propertyTranslation->sourceValue = propertyNode.attribute("SourceValue"); + propertyTranslation->checked = propertyNode.attribute("Checked").compare("Y") == 0; + itemTranslation->propertyesTranslation.append(propertyTranslation); } - pageTranslation->itemsTranslation.append(itemTranslation); + pageTranslation->itemsTranslation.insert(itemTranslation->itemName, itemTranslation); } } translations->insert(curTranslation->language(),curTranslation); diff --git a/limereport/serializators/lrxmlwriter.cpp b/limereport/serializators/lrxmlwriter.cpp index b0f0bee..2f77dd1 100644 --- a/limereport/serializators/lrxmlwriter.cpp +++ b/limereport/serializators/lrxmlwriter.cpp @@ -230,12 +230,14 @@ void XMLWriter::saveTranslation(QString propertyName, QObject* item, QDomElement foreach(PageTranslation* page, curTranslation->pagesTranslation()){ QDomElement pageNode = m_doc->createElement(page->pageName); languageNode.appendChild(pageNode); - foreach(ItemTranslation item, page->itemsTranslation){ - QDomElement itemNode = m_doc->createElement(item.itemName); + foreach(ItemTranslation* item, page->itemsTranslation){ + QDomElement itemNode = m_doc->createElement(item->itemName); pageNode.appendChild(itemNode); - foreach(PropertyTranslation property, item.propertyesTranslation){ - QDomElement propertyNode = m_doc->createElement(property.propertyName); - propertyNode.setAttribute("Value",property.value); + foreach(PropertyTranslation* property, item->propertyesTranslation){ + QDomElement propertyNode = m_doc->createElement(property->propertyName); + propertyNode.setAttribute("Value",property->value); + propertyNode.setAttribute("SourceValue", property->sourceValue); + propertyNode.setAttribute("Checked", property->checked ? "Y":"N"); itemNode.appendChild(propertyNode); } } diff --git a/limereport/translationeditor/images/add.png b/limereport/translationeditor/images/add.png new file mode 100644 index 0000000000000000000000000000000000000000..b5671255c10af83f7c735089053e072312309f46 GIT binary patch literal 655 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl45bDP46hOx7_4S6Fo+k-*%fF5lvo|$6XN>+|Nqe4p+P%> zI^K2oZSiY;-RimCv+;SO^GfHMM>Wcw%8ADlWt(MV4#h~+Nkr_65UCOoEEfc7v0ZGd z*{=y<ee8#eZZdZXqvpiiKLnJPz_PYx;F$k~-0>MO;$dew^e*B+rdHST*uS>zT(rq^j z6+$kDY;QauckuG2c`0Iz){M6cbBx*#%x`>MsW;PIK<@xQ(|jF;jP>ObM?HnyAO2pd zxJ2y4CmZGE97mt`Gdb$7-j%s~UGA$@R|Jn}zu13&o{o}-xk1lkhiL*&tY9`zxOX7Iu0%`U735TH+c}l9E`GYL#4+3Zxi}3=GY54GnY+ z%|eWftPISpj7+o*jI9g|>RwiDMA49&pOTqYiCY8zmP5Qi4U!-mg7ec#$`gxH85~pc glTsBta}(23gHjVyDhp4hf>H^Cr>mdKI;Vst08H=T#{d8T literal 0 HcmV?d00001 diff --git a/limereport/translationeditor/images/checked.png b/limereport/translationeditor/images/checked.png new file mode 100644 index 0000000000000000000000000000000000000000..8149629267018c615fe9e4833a4adc7deb884c31 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPt2Ma$3qg0IZCZLdHiEBiObAE1aYF-J0b5UwyNotBh zd1gt5g1e`0KzJjcI8afcr;B5V#p$b)Hu5$Y@UZ0ftvTp1ag%>rf|AQ&Hl7K;GB})? zj;%Z}RrPmV-R%#nJv2EvDxMYYh+2BFHR;0}9i?oC2aNiR+=@HQzdsU~bN2hP3pdg> zA1%tYc=B^szVnfjnKg+fDg1}{C+2>*eQ({zzZMKgTe~DWM4f D#8X|= literal 0 HcmV?d00001 diff --git a/limereport/translationeditor/images/green_check.png b/limereport/translationeditor/images/green_check.png new file mode 100644 index 0000000000000000000000000000000000000000..ada2461a8c8ca04fe43fb09e9b61be5028dc2ed5 GIT binary patch literal 1347 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij{$(1uzuN zO$^M949qMH4K0j}94#zNTuhu@O`VKQondBR(`)JIW?|rD>1=B0Vq|FOYGi3_;^yq? z>S}20Wa#E(?grEAnO9trn3tRivo{lHFI2A+UcFY%MX8A;`9&f5`8lu@5Rj2yl3$#W zU!dR|Y^I>$o0y!L2NKW(MG(ZlE~!PCWvMA{Mftf3;1IUT#Nq;=cM13$qBn({P}2uG zMjwHrA^SF|DpLDW0lk+&v2)dh(oLek3MSWZkes>@JhKf*sqD%bgokI6KrIOt{T| z-p0nd@u6Mmd{U?Z@b`J?-nMUU)FI`lpBPL}(yJ3cG_blyz!}brfy8W0pnhM-MoY={4(q5D}aX04?J%>ND0usyFvre)K zeL5h!;-P-0u5UcUMq87af=vAj+Uym#?qHkRGVemian^Yb%6}Ahem&@)5jDTbm2Zkf z%)*1tfvum#XYI;bpxMhPHE}`0PRFxSydgo$m_Ax7d}DZYddmu<=S&-I1m-L66qEY2 dmaBn*nc;MTXZV%(`#C|yny0Iu%Q~loCIFE|$T0u_ literal 0 HcmV?d00001 diff --git a/limereport/translationeditor/images/question.png b/limereport/translationeditor/images/question.png new file mode 100644 index 0000000000000000000000000000000000000000..badcba0370684a7f24dabbe20055263908f98998 GIT binary patch literal 542 zcmV+(0^$9MP)02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00D+cL_t(I%e9k1NRx3G#(%nj zj`+lq2hmQ0 zposbo2_{9GG&2WI2TunPGMsG(pWFNLzR&yeJnswVfiMhZtrZ|Z)>?&OsMBhD|4n2v z8O3N&oGqY@J7{B);`9MK)pumGS)DmKpU=y`JfNSSXViR)UKUZbg7p51DoZGlNSsaJ z`@Zhqy`a5SG=z`j z(>(md*B@}n@9$hpV~k!seIQl(^l%y(WAtAUkKvrtL}8Gzp(j-d)qNt}Mf?BP{#LW@Lh8rAKw`uG_d96lQ8Z^H@X7eM|cVXvum(LUg!LjFp gBmaXS(7Al>A1pSRrYECP9RL6T07*qoM6N<$f?7K1tpET3 literal 0 HcmV?d00001 diff --git a/limereport/translationeditor/images/remove.png b/limereport/translationeditor/images/remove.png new file mode 100644 index 0000000000000000000000000000000000000000..8a974cfac9fb94cf56b6fbb3c0a41b2a51a0c489 GIT binary patch literal 867 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFf4Ghh64GnY+%|eWftPISpj7+o*jI9g|>RwiD zMA49&pOTqYiCY8zmP5Qi4Kg4bg7ec#$`gxH85~pclTsDjGK*5n^NX^J6`X^OXIygw z#s%Zjs*s412wxwo>o&VLD%pv!KEDqCnPJ9xT8_)M#KFn9D&Ot1$xG*O?ww(L&$1$4@h~zp zZ8~w`{l6BUR}-VA-Y*aHEw@iE+CI&*QSMXRt&i(gX+LEtx$0)V=kx@PGckqr_u37c zn2)SA{<33#!}OEJJw2fU?Isgcx)kMFa!yQo_&{#ip@aMj8+jWAADJK1d}`P_dEuVt z->-;q|I7YUvg+ktp0#sUTOP~3-IgmNwfl⪻v|Cn$Cxg1(lcmN*eRt^?Ba=+!Lyt z8@c;Z#*N=edE4}ySFnqhW%*rs?zD@OzqjpD$c^{}DWRHkd;H%u*Q87>ICie*=9A;! z=6kJpgMVVIKPowh8I!Yi|tM zaqYCof8KxJYmcvx=eD2r!)E%=tDEgk@2i<;e@OYak(m4MdBBKe@O1TaS?83{1OO%i BO0WO` literal 0 HcmV?d00001 diff --git a/limereport/translationeditor/translationeditor.cpp b/limereport/translationeditor/translationeditor.cpp new file mode 100644 index 0000000..6576702 --- /dev/null +++ b/limereport/translationeditor/translationeditor.cpp @@ -0,0 +1,165 @@ +#include "translationeditor.h" +#include "ui_translationeditor.h" +#include "lrreportengine.h" +#include "lrreportengine_p.h" +#include "lrreporttranslation.h" + +namespace LimeReport { + +TranslationEditor::TranslationEditor(QWidget *parent) : + QWidget(parent), + ui(new Ui::TranslationEditor), m_translationContainer(0) +{ + ui->setupUi(this); + ui->splitter_3->setStretchFactor(1,10); + ui->splitter_3->setStretchFactor(0,2); + ui->splitter_2->setStretchFactor(1,2); + ui->splitter->setStretchFactor(0,2); + QTableWidgetItem* item = new QTableWidgetItem(); + item->setIcon(QIcon(":/translationeditor/images/checked.png")); + ui->tbStrings->setColumnCount(4); + ui->tbStrings->setColumnWidth(0,30); + ui->tbStrings->setColumnWidth(1,100); + ui->tbStrings->setColumnWidth(2,100); + ui->tbStrings->setHorizontalHeaderItem(0,item); + ui->tbStrings->setHorizontalHeaderItem(1,new QTableWidgetItem(tr("Report Item"))); + ui->tbStrings->setHorizontalHeaderItem(2,new QTableWidgetItem(tr("Property"))); + ui->tbStrings->setHorizontalHeaderItem(3,new QTableWidgetItem(tr("Source text"))); + //ui->tbStrings->setSortingEnabled(true); + +} + +void TranslationEditor::setReportEngine(ITranslationContainer* translationContainer) +{ + m_translationContainer = translationContainer; + if (m_translationContainer){ + m_translationContainer->updateTranslations(); + updateUi(); + } +} + +TranslationEditor::~TranslationEditor() +{ + delete ui; +} + + +void TranslationEditor::updateUi() +{ + ui->lvLanguages->clear(); + + Q_ASSERT(m_translationContainer != 0); + if (m_translationContainer){ + Translations* translations = m_translationContainer->translations(); + Q_ASSERT(translations != 0); + if (translations){ + foreach(QLocale::Language language, translations->keys()){ + ui->lvLanguages->addItem(QLocale::languageToString(language)); + } + if (!translations->keys().isEmpty()){ + ui->lvLanguages->item(0)->setSelected(true); + activateLanguage(translations->keys().at(0)); + } + } + } +} + +void TranslationEditor::activateLanguage(QLocale::Language language) +{ + ui->teTranslation->setEnabled(false); + ui->cbChecked->setEnabled(false); + ui->twPages->clear(); + Translations* translations = m_translationContainer->translations(); + Q_ASSERT(translations != 0); + if (translations){ + m_currentReportTranslation = translations->value(language); + Q_ASSERT(m_currentReportTranslation != 0); + if (m_currentReportTranslation){ + foreach(PageTranslation* pageTranslation, m_currentReportTranslation->pagesTranslation()){ + QTreeWidgetItem* pageItem = new QTreeWidgetItem(); + pageItem->setText(0,pageTranslation->pageName); + ui->twPages->addTopLevelItem(pageItem); + } + } + if (ui->twPages->topLevelItem(0)){ + ui->twPages->topLevelItem(0)->setSelected(true); + activatePage(m_currentReportTranslation->findPageTranslation(ui->twPages->topLevelItem(0)->text(0))); + } + } +} + +void TranslationEditor::activatePage(PageTranslation* pageTranslation) +{ + ui->teTranslation->setEnabled(false); + ui->cbChecked->setEnabled(false); + Q_ASSERT(pageTranslation != 0); + if(pageTranslation){ + ui->tbStrings->clearContents(); + ui->tbStrings->setRowCount(0); + m_currentPageTranslation = pageTranslation; + QStringList items = pageTranslation->itemsTranslation.keys(); + items.sort(); + foreach(QString itemName, items){ + ItemTranslation* itemTranslation = pageTranslation->itemsTranslation.value(itemName); + int rowIndex = ui->tbStrings->rowCount(); + ui->tbStrings->setRowCount(rowIndex+1); + foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){ + QTableWidgetItem* checkItem = new QTableWidgetItem(); + if (propertyTranslation->checked) + checkItem->setIcon(QIcon(":/translationeditor/images/checked.png")); + ui->tbStrings->setItem(rowIndex,0,checkItem); + ui->tbStrings->setItem(rowIndex,1,new QTableWidgetItem(itemTranslation->itemName)); + ui->tbStrings->setItem(rowIndex,2,new QTableWidgetItem(propertyTranslation->propertyName)); + ui->tbStrings->setItem(rowIndex,3,new QTableWidgetItem(propertyTranslation->sourceValue)); + } + } + } + +} + +void TranslationEditor::activateTranslation(const QString& itemName, const QString& propertyName) +{ + Q_ASSERT(m_currentPageTranslation != 0); + if (m_currentPageTranslation){ + ItemTranslation* itemTranslation = m_currentPageTranslation->itemsTranslation.value(itemName); + Q_ASSERT(itemTranslation !=0 ); + if (itemTranslation){ + m_currentPropertyTranslation = m_currentPageTranslation->itemsTranslation.value(itemName)->findProperty(propertyName); + Q_ASSERT(m_currentPropertyTranslation != 0); + if (m_currentPropertyTranslation){ + ui->teTranslation->setEnabled(true); + ui->cbChecked->setEnabled(true); + ui->teTranslation->setText(m_currentPropertyTranslation->value); + ui->cbChecked->setChecked(m_currentPropertyTranslation->checked); + } + } + } +} + +void TranslationEditor::on_tbStrings_itemSelectionChanged() +{ + activateTranslation(ui->tbStrings->item(ui->tbStrings->currentRow(),1)->text(), ui->tbStrings->item(ui->tbStrings->currentRow(),2)->text()); +} + +void TranslationEditor::on_teTranslation_textChanged() +{ + m_currentPropertyTranslation->value = ui->teTranslation->toPlainText(); +} + +void TranslationEditor::on_cbChecked_toggled(bool checked) +{ + m_currentPropertyTranslation->checked = checked; + ui->tbStrings->item(ui->tbStrings->currentRow(),0)->setIcon(checked ? QIcon(":/translationeditor/images/checked.png"):QIcon()); +} + +void TranslationEditor::on_twPages_itemSelectionChanged() +{ + if (!ui->twPages->selectedItems().isEmpty()){ + activatePage(m_currentReportTranslation->findPageTranslation(ui->twPages->selectedItems().at(0)->text(0))); + } +} + +} //namespace LimeReport + + + diff --git a/limereport/translationeditor/translationeditor.h b/limereport/translationeditor/translationeditor.h new file mode 100644 index 0000000..ca153c3 --- /dev/null +++ b/limereport/translationeditor/translationeditor.h @@ -0,0 +1,45 @@ +#ifndef TRANSLATIONEDITOR_H +#define TRANSLATIONEDITOR_H + +#include +#include +#include +#include "lrreporttranslation.h" + +namespace LimeReport { + +namespace Ui { +class TranslationEditor; +} + + +class TranslationEditor : public QWidget +{ + Q_OBJECT + +public: + explicit TranslationEditor(QWidget *parent = 0); + void setReportEngine(ITranslationContainer* translationContainer); + ~TranslationEditor(); + void updateUi(); + void activateLanguage(QLocale::Language language); + void activatePage(PageTranslation* pageTranslation); + void activateTranslation(const QString& itemName, const QString& propertyName); +private slots: + void on_tbStrings_itemSelectionChanged(); + void on_teTranslation_textChanged(); + void on_cbChecked_toggled(bool checked); + void on_twPages_itemSelectionChanged(); +private: + Ui::TranslationEditor *ui; + ITranslationContainer* m_translationContainer; + QMap m_reportTranslations; + QMap m_pageTranslations; + ReportTranslation* m_currentReportTranslation; + PageTranslation* m_currentPageTranslation; + PropertyTranslation* m_currentPropertyTranslation; +}; + +} //namespace LimeReport + +#endif // TRANSLATIONEDITOR_H diff --git a/limereport/translationeditor/translationeditor.qrc b/limereport/translationeditor/translationeditor.qrc new file mode 100644 index 0000000..706f7af --- /dev/null +++ b/limereport/translationeditor/translationeditor.qrc @@ -0,0 +1,8 @@ + + + images/add.png + images/remove.png + images/checked.png + images/question.png + + diff --git a/limereport/translationeditor/translationeditor.ui b/limereport/translationeditor/translationeditor.ui new file mode 100644 index 0000000..aac3734 --- /dev/null +++ b/limereport/translationeditor/translationeditor.ui @@ -0,0 +1,214 @@ + + + LimeReport::TranslationEditor + + + + 0 + 0 + 873 + 525 + + + + Form + + + + + + Qt::Horizontal + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + Qt::Vertical + + + + Languages + + + true + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + ... + + + + :/translationeditor/images/add.png:/translationeditor/images/add.png + + + + + + + ... + + + + :/translationeditor/images/remove.png:/translationeditor/images/remove.png + + + + + + + + + + + + + Pages + + + true + + + + + + false + + + false + + + + 1 + + + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Sunken + + + + + + Qt::Vertical + + + + Strings + + + true + + + + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + 2 + + + true + + + + + + + + + Source Text + + + + + + + + + Translation + + + true + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Checked + + + + + + + + + + + + + + + + + + + + From 103ce472aa7226ac4812c8afab936456a4b45dac Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 14 Aug 2017 22:39:38 +0300 Subject: [PATCH 038/347] Splittable band has been fixed --- limereport/items/lrhorizontallayout.h | 1 + limereport/items/lrtextitem.cpp | 2 +- limereport/lrbanddesignintf.cpp | 29 +++++++++++++++--------- limereport/lrbanddesignintf.h | 18 +++++++++++++-- limereport/lritemscontainerdesignitf.cpp | 4 ++-- limereport/lritemscontainerdesignitf.h | 4 ++-- 6 files changed, 40 insertions(+), 18 deletions(-) diff --git a/limereport/items/lrhorizontallayout.h b/limereport/items/lrhorizontallayout.h index 67cceef..c2a52e3 100644 --- a/limereport/items/lrhorizontallayout.h +++ b/limereport/items/lrhorizontallayout.h @@ -74,6 +74,7 @@ public: bool isEmpty() const; LayoutType layoutType() const; void setLayoutType(const LayoutType &layoutType); + bool isSplittable() const { return true;} protected: void collectionLoadFinished(const QString &collectionName); void objectLoadFinished(); diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index b604766..3e7b208 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -794,7 +794,7 @@ QString TextItem::getTextPart(int height, int skipHeight){ int textPos = 0; TextPtr text = textDocument(); - + text->documentLayout(); QTextBlock curBlock = text->begin(); QString resultText = ""; diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index d3a02d3..85c3859 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -123,7 +123,8 @@ BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, Q m_startFromNewPage(false), m_printAlways(false), m_repeatOnEachRow(false), - m_useAlternateBackgroundColor(false) + m_useAlternateBackgroundColor(false), + m_bottomSpace() { setPossibleResizeDirectionFlags(ResizeBottom); setPossibleMoveFlags(TopBotom); @@ -502,7 +503,8 @@ BaseDesignIntf* BandDesignIntf::cloneUpperPart(int height, QObject *owner, QGrap { int maxBottom = 0; BandDesignIntf* upperPart = dynamic_cast(createSameTypeItem(owner,parent)); - BaseDesignIntf* upperItem; + upperPart->m_bottomSpace = this->bottomSpace(); + BaseDesignIntf* upperItem = 0; upperPart->initFromItem(this); @@ -548,6 +550,7 @@ bool itemLessThen(QGraphicsItem* i1, QGraphicsItem* i2){ BaseDesignIntf *BandDesignIntf::cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent) { BandDesignIntf* bottomPart = dynamic_cast(createSameTypeItem(owner,parent)); + bottomPart->m_bottomSpace = this->bottomSpace(); bottomPart->initFromItem(this); QList bandItems; @@ -564,17 +567,16 @@ BaseDesignIntf *BandDesignIntf::cloneBottomPart(int height, QObject *owner, QGra } else if ((item->geometry().top()geometry().bottom()>height)){ int sliceHeight = height-item->geometry().top(); - if (item->canBeSplitted(sliceHeight)) { + if (item->isSplittable() && item->canBeSplitted(sliceHeight)) { BaseDesignIntf* tmpItem=item->cloneBottomPart(sliceHeight,bottomPart,bottomPart); tmpItem->setPos(tmpItem->pos().x(),0); if (tmpItem->pos().y()<0) tmpItem->setPos(tmpItem->pos().x(),0); - qreal sizeOffset = (m_slicedItems.value(tmpItem->objectName())->height()+tmpItem->height()) - item->height(); - qreal bottomOffset = (height - m_slicedItems.value(tmpItem->objectName())->pos().y())-m_slicedItems.value(tmpItem->objectName())->height(); - moveItemsDown(item->pos().y()+item->height(), sizeOffset + bottomOffset); - } - else if (item->isSplittable()){ - BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart); - tmpItem->setPos(tmpItem->pos().x(),0); + BaseDesignIntf* slicedItem = m_slicedItems.value(tmpItem->objectName()); + if (slicedItem){ + qreal sizeOffset = (slicedItem->height()+tmpItem->height()) - item->height(); + qreal bottomOffset = (height - slicedItem->pos().y())-m_slicedItems.value(tmpItem->objectName())->height(); + moveItemsDown(item->pos().y()+item->height(), sizeOffset + bottomOffset); + } } else { if ((item->geometry().bottom()-height)>height){ BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(),bottomPart,bottomPart); @@ -765,6 +767,11 @@ void BandDesignIntf::setAlternateBackgroundColor(const QColor &alternateBackgrou } } +qreal BandDesignIntf::bottomSpace() const +{ + return m_bottomSpace.isValid() ? m_bottomSpace.value() : height()-findMaxBottom(); +} + void BandDesignIntf::slotPropertyObjectNameChanged(const QString &, const QString& newName) { update(); @@ -906,7 +913,7 @@ void BandDesignIntf::setKeepFooterTogether(bool value) void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) { qreal spaceBorder=0; - if (keepBottomSpaceOption()) spaceBorder=height()-findMaxBottom(); + if (keepBottomSpaceOption()) spaceBorder = bottomSpace(); if (borderLines()!=0){ spaceBorder += borderLineSize(); } diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index aa313ab..e17c807 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -82,6 +82,18 @@ private: BandDesignIntf* m_band; }; +class InitializedValue{ +public: + InitializedValue(): m_value(-1), m_isInitialized(false){} + InitializedValue(qreal value): m_value(value), m_isInitialized(true){} + qreal value() const { return m_value;} + void setValue( qreal value){ m_value = value; m_isInitialized = true;} + bool isValid() const{ return m_isInitialized;} +private: + qreal m_value; + bool m_isInitialized; +}; + class BandDesignIntf : public ItemsContainerDesignInft { Q_OBJECT @@ -225,6 +237,7 @@ public: bool useAlternateBackgroundColor() const; void setUseAlternateBackgroundColor(bool useAlternateBackgroundColor); void replaceGroupsFunction(BandDesignIntf *band); + qreal bottomSpace() const; signals: void bandRendered(BandDesignIntf* band); protected: @@ -279,8 +292,9 @@ private: bool m_printAlways; bool m_repeatOnEachRow; QMap m_slicedItems; - QColor m_alternateBackgroundColor; - bool m_useAlternateBackgroundColor; + QColor m_alternateBackgroundColor; + bool m_useAlternateBackgroundColor; + InitializedValue m_bottomSpace; }; class DataBandDesignIntf : public BandDesignIntf{ diff --git a/limereport/lritemscontainerdesignitf.cpp b/limereport/lritemscontainerdesignitf.cpp index dcad6ee..0e31eb8 100644 --- a/limereport/lritemscontainerdesignitf.cpp +++ b/limereport/lritemscontainerdesignitf.cpp @@ -91,7 +91,7 @@ void ItemsContainerDesignInft::arrangeSubItems(RenderPass pass, DataSourceManage } } -qreal ItemsContainerDesignInft::findMaxBottom() +qreal ItemsContainerDesignInft::findMaxBottom() const { qreal maxBottom=0; foreach(QGraphicsItem* item,childItems()){ @@ -103,7 +103,7 @@ qreal ItemsContainerDesignInft::findMaxBottom() return maxBottom; } -qreal ItemsContainerDesignInft::findMaxHeight() +qreal ItemsContainerDesignInft::findMaxHeight() const { qreal maxHeight=0; foreach(QGraphicsItem* item,childItems()){ diff --git a/limereport/lritemscontainerdesignitf.h b/limereport/lritemscontainerdesignitf.h index 86b2509..26e3f11 100644 --- a/limereport/lritemscontainerdesignitf.h +++ b/limereport/lritemscontainerdesignitf.h @@ -44,8 +44,8 @@ public: protected: void snapshotItemsLayout(); void arrangeSubItems(RenderPass pass, DataSourceManager *dataManager, ArrangeType type = AsNeeded); - qreal findMaxBottom(); - qreal findMaxHeight(); + qreal findMaxBottom() const; + qreal findMaxHeight() const; private: QVector m_containerItems; From 552e3f65c4cb4abf0c129d6a421904057f26e53f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 15 Aug 2017 01:30:13 +0300 Subject: [PATCH 039/347] Finish 1.4.38 # Conflicts: # limereport/lrbanddesignintf.cpp # limereport/lrbanddesignintf.h --- limereport/lrbanddesignintf.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 254c24f..63ebcc7 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -801,11 +801,6 @@ qreal BandDesignIntf::bottomSpace() const return m_bottomSpace.isValid() ? m_bottomSpace.value() : height()-findMaxBottom(); } -qreal BandDesignIntf::bottomSpace() const -{ - return m_bottomSpace.isValid() ? m_bottomSpace.value() : height()-findMaxBottom(); -} - void BandDesignIntf::slotPropertyObjectNameChanged(const QString &, const QString& newName) { update(); From b232b79d8c7fa1c069d96b942a459112a857751f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 16 Aug 2017 01:18:56 +0300 Subject: [PATCH 040/347] Translation has been finished --- include/lrreportengine.h | 2 - limereport/limereport.pri | 11 ++- limereport/lrreportengine.cpp | 34 ++++--- limereport/lrreportengine.h | 2 - limereport/lrreportengine_p.h | 3 + limereport/lrreporttranslation.h | 4 + .../languageselectdialog.cpp | 26 ++++++ .../translationeditor/languageselectdialog.h | 23 +++++ .../translationeditor/languageselectdialog.ui | 88 +++++++++++++++++++ .../translationeditor/translationeditor.cpp | 74 ++++++++++++++-- .../translationeditor/translationeditor.h | 9 +- .../translationeditor/translationeditor.ui | 10 ++- 12 files changed, 257 insertions(+), 29 deletions(-) create mode 100644 limereport/translationeditor/languageselectdialog.cpp create mode 100644 limereport/translationeditor/languageselectdialog.h create mode 100644 limereport/translationeditor/languageselectdialog.ui diff --git a/include/lrreportengine.h b/include/lrreportengine.h index f785713..b8b0d68 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -109,9 +109,7 @@ public: bool isBusy(); void setPassPharse(QString& passPharse); - QList aviableLanguages(); - bool addTranslationLanguage(QLocale::Language language); bool setReportLanguage(QLocale::Language language); signals: diff --git a/limereport/limereport.pri b/limereport/limereport.pri index 2f91286..69af57f 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -96,10 +96,11 @@ SOURCES += \ $$REPORT_PATH/lraboutdialog.cpp \ $$REPORT_PATH/lrsettingdialog.cpp \ $$REPORT_PATH/lritemscontainerdesignitf.cpp \ - $$REPORT_PATH/lrcolorindicator.cpp \ + $$REPORT_PATH/lrcolorindicator.cpp \ $$REPORT_PATH/items/lrchartitem.cpp \ $$REPORT_PATH/items/lrchartitemeditor.cpp \ - $$REPORT_PATH/lrreporttranslation.cpp + $$REPORT_PATH/lrreporttranslation.cpp \ + $$REPORT_PATH/translationeditor/languageselectdialog.cpp contains(CONFIG, staticlib){ SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp @@ -209,7 +210,8 @@ HEADERS += \ $$REPORT_PATH/lrcolorindicator.h \ $$REPORT_PATH/items/lrchartitem.h \ $$REPORT_PATH/items/lrchartitemeditor.h \ - $$REPORT_PATH/lrreporttranslation.h + $$REPORT_PATH/lrreporttranslation.h \ + $$REPORT_PATH/translationeditor/languageselectdialog.h contains(CONFIG, staticlib){ HEADERS += $$REPORT_PATH/lrfactoryinitializer.h @@ -232,7 +234,8 @@ FORMS += \ $$REPORT_PATH/lrsettingdialog.ui \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ $$REPORT_PATH/items/lrchartitemeditor.ui \ - $$REPORT_PATH/translationeditor/translationeditor.ui + $$REPORT_PATH/translationeditor/translationeditor.ui \ + $$PWD/translationeditor/languageselectdialog.ui RESOURCES += \ $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 33fec2a..50d1d48 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -64,7 +64,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_showProgressDialog(true), m_reportName(""), m_activePreview(0), m_previewWindowIcon(":/report/images/logo32"), m_previewWindowTitle(tr("Preview")), m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), - m_fileWatcher( new QFileSystemWatcher( this ) ) + m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage) { #ifdef HAVE_STATIC_BUILD initResources(); @@ -768,7 +768,12 @@ void ReportEnginePrivate::setPassPhrase(const QString &passPhrase) bool ReportEnginePrivate::addTranslationLanguage(QLocale::Language language) { if (!m_translations.keys().contains(language)){ - ReportTranslation* translation = new ReportTranslation(language,m_pages); + ReportTranslation* translation = 0; + if (!m_translations.contains(QLocale::AnyLanguage)){ + translation = new ReportTranslation(QLocale::AnyLanguage,m_pages); + m_translations.insert(QLocale::AnyLanguage,translation); + } + translation = new ReportTranslation(language,m_pages); m_translations.insert(language, translation); return true; } else { @@ -777,8 +782,14 @@ bool ReportEnginePrivate::addTranslationLanguage(QLocale::Language language) } } -bool ReportEnginePrivate::setReportLanguage(QLocale::Language language){ - if (!m_translations.keys().contains(language)) return false; +bool ReportEnginePrivate::removeTranslationLanguage(QLocale::Language language) +{ + return m_translations.remove(language) != 0; +} + +void ReportEnginePrivate::activateLanguage(QLocale::Language language) +{ + if (!m_translations.keys().contains(language)) return; ReportTranslation* translation = m_translations.value(language); foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){ @@ -794,6 +805,12 @@ bool ReportEnginePrivate::setReportLanguage(QLocale::Language language){ } } } +} + +bool ReportEnginePrivate::setReportLanguage(QLocale::Language language){ + m_reportLanguage = language; + if (!m_translations.keys().contains(language)) return false; +// activateLanguage(language); return true; } @@ -861,7 +878,7 @@ ReportPages ReportEnginePrivate::renderToPages() dataManager()->connectAllDatabases(); dataManager()->setDesignTime(false); dataManager()->updateDatasourceModel(); - + activateLanguage(m_reportLanguage); connect(m_reportRender.data(),SIGNAL(pageRendered(int)), this, SIGNAL(renderPageFinished(int))); @@ -892,6 +909,7 @@ ReportPages ReportEnginePrivate::renderToPages() m_reportRender.clear(); m_reportRendering = false; } + activateLanguage(QLocale::AnyLanguage); return result; } else { return ReportPages(); @@ -1009,12 +1027,6 @@ QList ReportEngine::aviableLanguages() return d->aviableLanguages(); } -bool ReportEngine::addTranslationLanguage(QLocale::Language language) -{ - Q_D(ReportEngine); - return d->addTranslationLanguage(language); -} - bool ReportEngine::setReportLanguage(QLocale::Language language) { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index f785713..b8b0d68 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -109,9 +109,7 @@ public: bool isBusy(); void setPassPharse(QString& passPharse); - QList aviableLanguages(); - bool addTranslationLanguage(QLocale::Language language); bool setReportLanguage(QLocale::Language language); signals: diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 23c53cc..c8d6307 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -132,6 +132,7 @@ public: void setPassPhrase(const QString &passPhrase); bool addTranslationLanguage(QLocale::Language language); + bool removeTranslationLanguage(QLocale::Language language); bool setReportLanguage(QLocale::Language language); QList aviableLanguages(); ReportTranslation* reportTranslation(QLocale::Language language); @@ -195,6 +196,8 @@ private: QString m_passPhrase; QFileSystemWatcher *m_fileWatcher; Translations m_translations; + QLocale::Language m_reportLanguage; + void activateLanguage(QLocale::Language language); }; } diff --git a/limereport/lrreporttranslation.h b/limereport/lrreporttranslation.h index cae7622..3c7b376 100644 --- a/limereport/lrreporttranslation.h +++ b/limereport/lrreporttranslation.h @@ -66,8 +66,12 @@ typedef QMap Translations; class ITranslationContainer{ public: + virtual ~ITranslationContainer(){} virtual Translations* translations() = 0; virtual void updateTranslations() = 0; + virtual bool addTranslationLanguage(QLocale::Language language) = 0; + virtual bool removeTranslationLanguage(QLocale::Language language) = 0; + virtual QList aviableLanguages() = 0; }; } // namespace LimeReport diff --git a/limereport/translationeditor/languageselectdialog.cpp b/limereport/translationeditor/languageselectdialog.cpp new file mode 100644 index 0000000..f52be35 --- /dev/null +++ b/limereport/translationeditor/languageselectdialog.cpp @@ -0,0 +1,26 @@ +#include "languageselectdialog.h" +#include "ui_languageselectdialog.h" +#include +#include +#include + +LanguageSelectDialog::LanguageSelectDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::LanguageSelectDialog) +{ + ui->setupUi(this); + for (int i = 2; icomboBox->addItem(QLocale::languageToString(static_cast(i)),static_cast(i)); + } + ui->comboBox->setCurrentText(""); +} + +LanguageSelectDialog::~LanguageSelectDialog() +{ + delete ui; +} + +QLocale::Language LanguageSelectDialog::getSelectedLanguage() +{ + return ui->comboBox->itemData(ui->comboBox->currentIndex()).value(); +} diff --git a/limereport/translationeditor/languageselectdialog.h b/limereport/translationeditor/languageselectdialog.h new file mode 100644 index 0000000..3286527 --- /dev/null +++ b/limereport/translationeditor/languageselectdialog.h @@ -0,0 +1,23 @@ +#ifndef LANGUAGESELECTDIALOG_H +#define LANGUAGESELECTDIALOG_H + +#include +#include + +namespace Ui { +class LanguageSelectDialog; +} + +class LanguageSelectDialog : public QDialog +{ + Q_OBJECT + +public: + explicit LanguageSelectDialog(QWidget *parent = 0); + ~LanguageSelectDialog(); + QLocale::Language getSelectedLanguage(); +private: + Ui::LanguageSelectDialog *ui; +}; + +#endif // LANGUAGESELECTDIALOG_H diff --git a/limereport/translationeditor/languageselectdialog.ui b/limereport/translationeditor/languageselectdialog.ui new file mode 100644 index 0000000..1575429 --- /dev/null +++ b/limereport/translationeditor/languageselectdialog.ui @@ -0,0 +1,88 @@ + + + LanguageSelectDialog + + + + 0 + 0 + 336 + 109 + + + + Dialog + + + + + + + + + 0 + 0 + + + + Language + + + + + + + true + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + LanguageSelectDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + LanguageSelectDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/limereport/translationeditor/translationeditor.cpp b/limereport/translationeditor/translationeditor.cpp index 6576702..4db0a6a 100644 --- a/limereport/translationeditor/translationeditor.cpp +++ b/limereport/translationeditor/translationeditor.cpp @@ -3,12 +3,15 @@ #include "lrreportengine.h" #include "lrreportengine_p.h" #include "lrreporttranslation.h" +#include "languageselectdialog.h" +#include namespace LimeReport { TranslationEditor::TranslationEditor(QWidget *parent) : QWidget(parent), - ui(new Ui::TranslationEditor), m_translationContainer(0) + ui(new Ui::TranslationEditor), m_translationContainer(0), + m_currentReportTranslation(0), m_currentPageTranslation(0), m_currentPropertyTranslation(0) { ui->setupUi(this); ui->splitter_3->setStretchFactor(1,10); @@ -25,6 +28,7 @@ TranslationEditor::TranslationEditor(QWidget *parent) : ui->tbStrings->setHorizontalHeaderItem(1,new QTableWidgetItem(tr("Report Item"))); ui->tbStrings->setHorizontalHeaderItem(2,new QTableWidgetItem(tr("Property"))); ui->tbStrings->setHorizontalHeaderItem(3,new QTableWidgetItem(tr("Source text"))); + new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_Return), this, SLOT(slotItemChecked())); //ui->tbStrings->setSortingEnabled(true); } @@ -32,6 +36,10 @@ TranslationEditor::TranslationEditor(QWidget *parent) : void TranslationEditor::setReportEngine(ITranslationContainer* translationContainer) { m_translationContainer = translationContainer; + m_currentReportTranslation = 0; + m_currentPageTranslation = 0; + m_currentPropertyTranslation = 0; + if (m_translationContainer){ m_translationContainer->updateTranslations(); updateUi(); @@ -43,10 +51,22 @@ TranslationEditor::~TranslationEditor() delete ui; } +QLocale::Language TranslationEditor::getLanguageByName(const QString& languageName){ + foreach(QLocale::Language language, m_translationContainer->translations()->keys()){ + if (QLocale::languageToString(language).compare(languageName) == 0){ + return language; + } + } + return QLocale::AnyLanguage; +} void TranslationEditor::updateUi() { ui->lvLanguages->clear(); + ui->twPages->clear(); + ui->tbStrings->clearContents(); + ui->teTranslation->setPlainText(""); + ui->cbChecked->setEnabled(false); Q_ASSERT(m_translationContainer != 0); if (m_translationContainer){ @@ -54,11 +74,12 @@ void TranslationEditor::updateUi() Q_ASSERT(translations != 0); if (translations){ foreach(QLocale::Language language, translations->keys()){ - ui->lvLanguages->addItem(QLocale::languageToString(language)); + if (language != QLocale::AnyLanguage) + ui->lvLanguages->addItem(QLocale::languageToString(language)); } if (!translations->keys().isEmpty()){ ui->lvLanguages->item(0)->setSelected(true); - activateLanguage(translations->keys().at(0)); + activateLanguage(getLanguageByName(ui->lvLanguages->item(0)->text())); } } } @@ -138,18 +159,22 @@ void TranslationEditor::activateTranslation(const QString& itemName, const QStri void TranslationEditor::on_tbStrings_itemSelectionChanged() { - activateTranslation(ui->tbStrings->item(ui->tbStrings->currentRow(),1)->text(), ui->tbStrings->item(ui->tbStrings->currentRow(),2)->text()); + if (m_currentPageTranslation) + activateTranslation(ui->tbStrings->item(ui->tbStrings->currentRow(),1)->text(), ui->tbStrings->item(ui->tbStrings->currentRow(),2)->text()); } void TranslationEditor::on_teTranslation_textChanged() { - m_currentPropertyTranslation->value = ui->teTranslation->toPlainText(); + if (m_currentPropertyTranslation) + m_currentPropertyTranslation->value = ui->teTranslation->toPlainText(); } void TranslationEditor::on_cbChecked_toggled(bool checked) { - m_currentPropertyTranslation->checked = checked; - ui->tbStrings->item(ui->tbStrings->currentRow(),0)->setIcon(checked ? QIcon(":/translationeditor/images/checked.png"):QIcon()); + if (m_currentPropertyTranslation){ + m_currentPropertyTranslation->checked = checked; + ui->tbStrings->item(ui->tbStrings->currentRow(),0)->setIcon(checked ? QIcon(":/translationeditor/images/checked.png"):QIcon()); + } } void TranslationEditor::on_twPages_itemSelectionChanged() @@ -159,7 +184,42 @@ void TranslationEditor::on_twPages_itemSelectionChanged() } } +void TranslationEditor::on_tbAddLanguage_clicked() +{ + LanguageSelectDialog dialog; + if (dialog.exec()){ + m_translationContainer->addTranslationLanguage(dialog.getSelectedLanguage()); + updateUi(); + activateLanguage(dialog.getSelectedLanguage()); + } +} + +void TranslationEditor::on_tbDeleteLanguage_clicked() +{ + m_translationContainer->removeTranslationLanguage(m_currentReportTranslation->language()); + updateUi(); +} + +void TranslationEditor::slotItemChecked() +{ + if (ui->tbStrings->currentRow()tbStrings->rowCount()){ + ui->cbChecked->setChecked(true); + ui->tbStrings->selectRow(ui->tbStrings->currentRow()+1); + ui->teTranslation->setFocus(); + } +} + +void TranslationEditor::on_lvLanguages_itemSelectionChanged() +{ + if (ui->lvLanguages->currentItem() && m_currentReportTranslation){ + activateLanguage(getLanguageByName(ui->lvLanguages->currentItem()->text())); + } +} + } //namespace LimeReport + + + diff --git a/limereport/translationeditor/translationeditor.h b/limereport/translationeditor/translationeditor.h index ca153c3..a270eb4 100644 --- a/limereport/translationeditor/translationeditor.h +++ b/limereport/translationeditor/translationeditor.h @@ -29,7 +29,14 @@ private slots: void on_tbStrings_itemSelectionChanged(); void on_teTranslation_textChanged(); void on_cbChecked_toggled(bool checked); - void on_twPages_itemSelectionChanged(); + void on_twPages_itemSelectionChanged(); + void on_tbAddLanguage_clicked(); + void on_tbDeleteLanguage_clicked(); + void slotItemChecked(); + void on_lvLanguages_itemSelectionChanged(); + +private: + QLocale::Language getLanguageByName(const QString& languageName); private: Ui::TranslationEditor *ui; ITranslationContainer* m_translationContainer; diff --git a/limereport/translationeditor/translationeditor.ui b/limereport/translationeditor/translationeditor.ui index aac3734..86f7a2f 100644 --- a/limereport/translationeditor/translationeditor.ui +++ b/limereport/translationeditor/translationeditor.ui @@ -56,7 +56,7 @@ - + ... @@ -64,10 +64,13 @@ :/translationeditor/images/add.png:/translationeditor/images/add.png + + true + - + ... @@ -75,6 +78,9 @@ :/translationeditor/images/remove.png:/translationeditor/images/remove.png + + true + From 54c5bc65edc847968ac7ed94a860c087ce487958 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 18 Aug 2017 22:55:29 +0300 Subject: [PATCH 041/347] TOC has been added --- limereport/lrbanddesignintf.h | 1 + limereport/lrdatadesignintf.cpp | 1 + limereport/lrdatasourcemanager.cpp | 1 + limereport/lrpageitemdesignintf.cpp | 34 ++++- limereport/lrpageitemdesignintf.h | 12 ++ limereport/lrreportengine.cpp | 34 ++++- limereport/lrreportengine_p.h | 2 +- limereport/lrreportrender.cpp | 15 +- limereport/lrscriptenginemanager.cpp | 129 +++++++++++++++++- limereport/lrscriptenginemanager.h | 32 ++++- .../editors/lrbuttonlineeditor.cpp | 1 + 11 files changed, 241 insertions(+), 21 deletions(-) diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index 92a171d..4e205cb 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -240,6 +240,7 @@ public: qreal bottomSpace() const; signals: void bandRendered(BandDesignIntf* band); + void bandRegistred(); protected: void trimToMaxHeight(int maxHeight); void setBandTypeText(const QString& value); diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index 2bc5e3a..9f5e64d 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -687,6 +687,7 @@ bool CallbackDatasource::prior(){ void CallbackDatasource::first(){ m_currentRow = 0; + m_getDataFromCache = false; m_eof=checkIfEmpty(); bool result=false; diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 6ff7d9e..83b438c 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -389,6 +389,7 @@ QSharedPointerDataSourceManager::previewSQL(const QString &c void DataSourceManager::updateDatasourceModel() { m_datasourcesModel.updateModel(); + emit datasourcesChanged(); m_needUpdate = false; } diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 2f8f3ff..72c4327 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -50,7 +50,7 @@ PageItemDesignIntf::PageItemDesignIntf(QObject *owner, QGraphicsItem *parent) : m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(A4), m_sizeChainging(false), m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), - m_isExtendedInDesignMode(false), m_extendedHeight(1000) + m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -63,7 +63,7 @@ PageItemDesignIntf::PageItemDesignIntf(const PageSize pageSize, const QRectF &re m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(pageSize), m_sizeChainging(false), m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), - m_isExtendedInDesignMode(false), m_extendedHeight(1000) + m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -331,6 +331,36 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } +QString PageItemDesignIntf::initScript() const +{ + return m_initScript; +} + +void PageItemDesignIntf::setInitScript(const QString& value) +{ + if (m_initScript.compare(value) != 0){ + QString old_value = m_initScript; + m_initScript = value; + if (!isLoading()) + notify("initScript", old_value, value); + } +} + +bool PageItemDesignIntf::getIsTOC() const +{ + return m_isTOC; +} + +void PageItemDesignIntf::setIsTOC(bool isTOC) +{ + if (m_isTOC != isTOC){ + m_isTOC = isTOC; + if (!isLoading()){ + notify("pageIsTOC", !isTOC, isTOC); + } + } +} + int PageItemDesignIntf::extendedHeight() const { return m_extendedHeight; diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index f488b07..3910d75 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -55,6 +55,8 @@ class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft Q_PROPERTY(bool resetPageNumber READ resetPageNumber WRITE setResetPageNumber) Q_PROPERTY(bool isExtendedInDesignMode READ isExtendedInDesignMode WRITE setExtendedInDesignMode) Q_PROPERTY(int extendedHeight READ extendedHeight WRITE setExtendedHeight) + Q_PROPERTY(bool pageIsTOC READ getIsTOC WRITE setIsTOC) + Q_PROPERTY(QString initScript READ initScript WRITE setInitScript) friend class ReportRender; public: enum Orientation { Portrait, Landscape }; @@ -126,6 +128,14 @@ public: int extendedHeight() const; void setExtendedHeight(int extendedHeight); + bool getIsTOC() const; + void setIsTOC(bool isTOC); + + QString initScript() const; + void setInitScript(const QString& value); +signals: + void beforeFirstPageRendered(); + void afterLastPageRendered(); protected slots: void bandDeleted(QObject* band); void bandGeometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); @@ -156,6 +166,8 @@ private: bool m_resetPageNumber; bool m_isExtendedInDesignMode; int m_extendedHeight; + bool m_isTOC; + QString m_initScript; }; typedef QList ReportPages; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 50d1d48..eb23fab 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -574,7 +574,7 @@ void ReportEnginePrivate::designReport() m_designerWindow->setWindowIcon(QIcon(":report/images/logo32")); m_designerWindow->setShowProgressDialog(m_showProgressDialog); } - + m_datasources->updateDatasourceModel(); #ifdef Q_OS_WIN m_designerWindow->setWindowModality(Qt::ApplicationModal); #endif @@ -893,22 +893,41 @@ ReportPages ReportEnginePrivate::renderToPages() m_reportRender->setScriptContext(scriptContext()); foreach (PageDesignIntf* page, m_pages) { - scriptContext()->baseDesignIntfToScript(page->pageItem()); + scriptContext()->baseDesignIntfToScript(page->pageItem()->objectName(), page->pageItem()); } if (m_scriptEngineContext->runInitScript()){ emit renderStarted(); foreach(PageDesignIntf* page , m_pages){ - page->setReportSettings(&m_reportSettings); - result.append(m_reportRender->renderPageToPages(page)); + if (!page->pageItem()->getIsTOC()){ + page->setReportSettings(&m_reportSettings); + result.append(m_reportRender->renderPageToPages(page)); + } + } + + bool isFirst = true; + + foreach(PageDesignIntf* page , m_pages){ + if (page->pageItem()->getIsTOC()){ + page->setReportSettings(&m_reportSettings); + if (isFirst){ + ReportPages pages = m_reportRender->renderPageToPages(page); + for (int i=0; irenderPageToPages(page)); + } + isFirst = false; } m_reportRender->secondRenderPass(result); emit renderFinished(); m_reportRender.clear(); - m_reportRendering = false; } + m_reportRendering = false; activateLanguage(QLocale::AnyLanguage); return result; } else { @@ -1145,5 +1164,10 @@ ReportEngine::ReportEngine(ReportEnginePrivate &dd, QObject *parent) connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); } +ScriptEngineManager*LimeReport::ReportEnginePrivate::scriptManager(){ + ScriptEngineManager::instance().setDataManager(dataManager()); + return &ScriptEngineManager::instance(); +} + }// namespace LimeReport diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index c8d6307..29d0aa3 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -78,7 +78,7 @@ public: int pageCount() {return m_pages.count();} DataSourceManager* dataManager(){return m_datasources;} ScriptEngineContext* scriptContext(){return m_scriptEngineContext;} - ScriptEngineManager* scriptManager(){return &ScriptEngineManager::instance();} + ScriptEngineManager* scriptManager(); IDataSourceManager* dataManagerIntf(){return m_datasources;} IScriptEngineManager* scriptManagerIntf(){ diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 5af0b3d..710b5f5 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -982,6 +982,8 @@ bool ReportRender::registerBand(BandDesignIntf *band, bool registerInChildren) if (band->isData()) m_renderedDataBandCount++; band->setObjectName(band->objectName()+QString::number(++m_curentNameIndex)); renameChildItems(band); + if (m_lastDataBand) + emit m_lastDataBand->bandRegistred(); return true; } else return false; } @@ -1065,7 +1067,7 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand) { BandDesignIntf* bandClone = dynamic_cast(patternBand->cloneItem(PreviewMode)); - m_scriptEngineContext->baseDesignIntfToScript(bandClone); + m_scriptEngineContext->baseDesignIntfToScript(patternBand->page()->pageItem()->objectName(), bandClone); emit(patternBand->beforeRender()); if (patternBand->isFooter()){ @@ -1078,7 +1080,7 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand) bandClone->updateItemSize(m_datasources); - m_scriptEngineContext->baseDesignIntfToScript(bandClone); + //m_scriptEngineContext->baseDesignIntfToScript(bandClone); emit(patternBand->afterData()); return bandClone; @@ -1101,7 +1103,7 @@ void ReportRender::startNewPage(bool isFirst) initColumns(); initRenderPage(); - m_scriptEngineContext->baseDesignIntfToScript(m_renderPageItem); + m_scriptEngineContext->baseDesignIntfToScript(m_renderPageItem->patternName(), m_renderPageItem); m_renderPageItem->setObjectName(QLatin1String("ReportPage")+QString::number(m_pageCount)); m_maxHeightByColumn[m_currentColumn]=m_renderPageItem->pageRect().height(); @@ -1110,7 +1112,11 @@ void ReportRender::startNewPage(bool isFirst) emit m_patternPageItem->beforeRender(); - if (isFirst) renderReportHeader(m_patternPageItem, BeforePageHeader); + if (isFirst) { + renderReportHeader(m_patternPageItem, BeforePageHeader); + emit m_patternPageItem->beforeFirstPageRendered(); + } + renderPageHeader(m_patternPageItem); m_pageFooterHeight = calcPageFooterHeight(m_patternPageItem); @@ -1303,6 +1309,7 @@ void ReportRender::savePage(bool isLast) moveTearOffBand(); emit m_patternPageItem->afterRender(); + if (isLast) emit m_patternPageItem->afterLastPageRendered(); } diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 11b4cbc..5f18bc8 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -201,6 +201,8 @@ ScriptEngineManager::~ScriptEngineManager() { delete m_model; m_model = 0; + delete m_tableOfContens; + m_tableOfContens = 0; delete m_scriptEngine; } @@ -342,8 +344,10 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ .arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); addFunction(describer); - } + ICallbackDatasource* tableOfContens = m_dataManager->createCallbackDatasource("tableofcontens"); + connect(tableOfContens, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), + m_tableOfContens, SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); } } } @@ -534,6 +538,11 @@ QVariant ScriptEngineManager::evaluateScript(const QString& script){ return QVariant(); } +void ScriptEngineManager::addTableOfContensItem(const QString& content, int pageNumber, int indent) +{ + m_tableOfContens->setItem(content, pageNumber, indent); +} + void ScriptEngineManager::updateModel() { @@ -740,6 +749,36 @@ bool ScriptEngineManager::createGetFieldFunction() return addFunction(fd); } +bool ScriptEngineManager::createAddTableOfContensItemFunction() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory(tr("GENERAL")); + fd.setName("addTableOfContensItem"); + fd.setDescription("addTableOfContensItem(\""+tr("Content")+"\", \""+tr("Page Number")+", \""+tr("Indent")+"\")"); + fd.setScriptWrapper(QString("function addTableOfContensItem(content, pageNumber, indent){" + "return %1.addTableOfContensItem(content, pageNumber, indent);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createClearTableOfContensFunction() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory(tr("GENERAL")); + fd.setName("clearTableOfContens"); + fd.setDescription("clearTableOfContens()"); + fd.setScriptWrapper(QString("function clearTableOfContens(){" + "return %1.clearTableOfContens();}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + ScriptEngineManager::ScriptEngineManager() :m_model(0), m_dataManager(0) { @@ -770,8 +809,11 @@ ScriptEngineManager::ScriptEngineManager() QScriptValue fontConstructor = m_scriptEngine->newFunction(QFontPrototype::constructorQFont, fontProto); m_scriptEngine->globalObject().setProperty("QFont", fontConstructor); #endif - m_model = new ScriptEngineModel(this); + createAddTableOfContensItemFunction(); + createClearTableOfContensFunction(); + m_model = new ScriptEngineModel(this); + m_tableOfContens = new TableOfContens(); } bool ScriptExtractor::parse() @@ -1118,10 +1160,9 @@ QString ScriptEngineContext::getNewDialogName() #endif -void ScriptEngineContext::baseDesignIntfToScript(BaseDesignIntf* item) +void ScriptEngineContext::baseDesignIntfToScript(const QString& pageName, BaseDesignIntf* item) { if ( item ) { - if (item->metaObject()->indexOfSignal("beforeRender()")!=-1) item->disconnect(SIGNAL(beforeRender())); if (item->metaObject()->indexOfSignal("afterData()")!=-1) @@ -1134,9 +1175,9 @@ void ScriptEngineContext::baseDesignIntfToScript(BaseDesignIntf* item) #ifdef USE_QJSENGINE //sItem = engine->newQObject(item); ScriptValueType sItem = getCppOwnedJSValue(*engine, item); - engine->globalObject().setProperty(item->patternName(), sItem); + engine->globalObject().setProperty(pageName+"_"+item->patternName(), sItem); #else - ScriptValueType sItem = engine->globalObject().property(item->patternName()); + ScriptValueType sItem = engine->globalObject().property(pageName+"_"+item->patternName()); if (sItem.isValid()){ engine->newQObject(sItem, item); } else { @@ -1145,7 +1186,7 @@ void ScriptEngineContext::baseDesignIntfToScript(BaseDesignIntf* item) } #endif foreach(BaseDesignIntf* child, item->childBaseItems()){ - baseDesignIntfToScript(child); + baseDesignIntfToScript(pageName, child); } } } @@ -1179,6 +1220,7 @@ void ScriptEngineContext::initDialogs(){ bool ScriptEngineContext::runInitScript(){ ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); + ScriptEngineManager::instance().clearTableOfContens(); #ifndef USE_QJSENGINE engine->pushContext(); #endif @@ -1376,6 +1418,16 @@ QVariant ScriptFunctionsManager::getField(const QString &field) return dm->fieldData(field); } +void ScriptFunctionsManager::addTableOfContensItem(const QString& content, int pageNumber, int indent) +{ + scriptEngineManager()->addTableOfContensItem(content, pageNumber, indent); +} + +void ScriptFunctionsManager::clearTableOfContens() +{ + scriptEngineManager()->clearTableOfContens(); +} + #ifdef USE_QJSENGINE QFont ScriptFunctionsManager::font(const QString &family, int pointSize, bool bold, bool italic, bool underLine) { @@ -1413,5 +1465,68 @@ void ScriptFunctionsManager::setScriptEngineManager(ScriptEngineManager *scriptE m_scriptEngineManager = scriptEngineManager; } +TableOfContens::~TableOfContens() +{ + clear(); +} + +void TableOfContens::setItem(const QString& content, int pageNumber, int indent) +{ + ContentItem * item = 0; + if (m_hash.contains(content)){ + ContentItem* item = m_hash.value(content); + item->pageNumber = pageNumber; + item->indent = indent; + } else { + ContentItem* item = new ContentItem; + item->content = content; + item->pageNumber = pageNumber; + item->indent = indent; + + m_tableOfContens.append(item); + m_hash.insert(content, item); + } + +} + +void TableOfContens::slotOneSlotDS(CallbackInfo info, QVariant& data) +{ + QStringList columns; + columns << "Content" << "Page number"; + + switch (info.dataType) { + case LimeReport::CallbackInfo::RowCount: + data = m_tableOfContens.count(); + break; + case LimeReport::CallbackInfo::ColumnCount: + data = columns.size(); + break; + case LimeReport::CallbackInfo::ColumnHeaderData: { + data = columns.at(info.index); + break; + } + case LimeReport::CallbackInfo::ColumnData: + if (info.index < m_tableOfContens.count()){ + ContentItem* item = m_tableOfContens.at(info.index); + if (info.columnName == "Content") + data = item->content.rightJustified(item->indent+item->content.size()); + else + data = QString::number(item->pageNumber); + } + break; + default: break; + } +} + +void LimeReport::TableOfContens::clear(){ + + m_hash.clear(); + foreach(ContentItem* item, m_tableOfContens){ + delete item; + } + m_tableOfContens.clear(); + +} + } //namespace LimeReport diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 2e5786f..7e46490 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -49,6 +49,7 @@ #include "base/lrsingleton.h" #include "lrglobal.h" #include "lrscriptenginemanagerintf.h" +#include "lrcallbackdatasourceintf.h" #include "lrcollection.h" namespace LimeReport{ @@ -56,6 +57,26 @@ namespace LimeReport{ class DataSourceManager; class BaseDesignIntf; +struct ContentItem { + QString content; + int indent; + int pageNumber; +}; + +class TableOfContens : public QObject{ + Q_OBJECT +public: + ~TableOfContens(); + void setItem(const QString& content, int pageNumber, int indent = 0); + void clear(); +private slots: + void slotOneSlotDS(LimeReport::CallbackInfo info, QVariant &data); +private: + QVector m_tableOfContens; + QHash m_hash; +}; + + struct ScriptFunctionDesc{ enum FuncType {Native,Script}; ScriptValueType scriptValue; @@ -156,7 +177,7 @@ public: QString getNewDialogName(); void initDialogs(); #endif - void baseDesignIntfToScript(BaseDesignIntf *item); + void baseDesignIntfToScript(const QString& pageName, BaseDesignIntf *item); void clear(); QString initScript() const; void setInitScript(const QString& initScript); @@ -242,7 +263,9 @@ public: Q_INVOKABLE void setVariable(const QString& name, QVariant value); Q_INVOKABLE QVariant getVariable(const QString& name); Q_INVOKABLE QVariant getField(const QString& field); - Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} + Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} + Q_INVOKABLE void addTableOfContensItem(const QString& content, int pageNumber, int indent = 0); + Q_INVOKABLE void clearTableOfContens(); #ifdef USE_QJSENGINE Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); #endif @@ -282,6 +305,8 @@ public: QString expandDataFields(QString context, ExpandType expandType, QVariant &varValue, QObject* reportItem); QString expandScripts(QString context, QVariant &varValue, QObject* reportItem); QVariant evaluateScript(const QString &script); + void addTableOfContensItem(const QString& content, int pageNumber, int indent); + void clearTableOfContens(){ m_tableOfContens->clear(); } protected: void updateModel(); @@ -300,6 +325,8 @@ private: bool createSetVariableFunction(); bool createGetVariableFunction(); bool createGetFieldFunction(); + bool createAddTableOfContensItemFunction(); + bool createClearTableOfContensFunction(); private: ScriptEngineManager(); ScriptEngineType* m_scriptEngine; @@ -309,6 +336,7 @@ private: ScriptEngineContext* m_context; DataSourceManager* m_dataManager; ScriptFunctionsManager* m_functionManager; + TableOfContens* m_tableOfContens; }; class ScriptExtractor diff --git a/limereport/objectinspector/editors/lrbuttonlineeditor.cpp b/limereport/objectinspector/editors/lrbuttonlineeditor.cpp index 4f1bc64..8459594 100644 --- a/limereport/objectinspector/editors/lrbuttonlineeditor.cpp +++ b/limereport/objectinspector/editors/lrbuttonlineeditor.cpp @@ -131,6 +131,7 @@ void ButtonLineEditor::editingByEditorFinished() { setText(qobject_cast(sender())->text()); m_lineEdit->setFocus(); + emit editingFinished(); } } //namespace LimeReport From f68a8fff65957675d8f9e0ab467fd7107c6b10f1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 19 Aug 2017 01:16:57 +0300 Subject: [PATCH 042/347] addTableOfContensItem function has been modified --- limereport/lrpageitemdesignintf.cpp | 15 ------------- limereport/lrpageitemdesignintf.h | 5 ----- limereport/lrreportdesignwidget.cpp | 5 +++++ limereport/lrscriptenginemanager.cpp | 32 ++++++++++++++-------------- limereport/lrscriptenginemanager.h | 6 +++--- 5 files changed, 24 insertions(+), 39 deletions(-) diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 72c4327..95b9144 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -331,21 +331,6 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } -QString PageItemDesignIntf::initScript() const -{ - return m_initScript; -} - -void PageItemDesignIntf::setInitScript(const QString& value) -{ - if (m_initScript.compare(value) != 0){ - QString old_value = m_initScript; - m_initScript = value; - if (!isLoading()) - notify("initScript", old_value, value); - } -} - bool PageItemDesignIntf::getIsTOC() const { return m_isTOC; diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 3910d75..c39788a 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -56,7 +56,6 @@ class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft Q_PROPERTY(bool isExtendedInDesignMode READ isExtendedInDesignMode WRITE setExtendedInDesignMode) Q_PROPERTY(int extendedHeight READ extendedHeight WRITE setExtendedHeight) Q_PROPERTY(bool pageIsTOC READ getIsTOC WRITE setIsTOC) - Q_PROPERTY(QString initScript READ initScript WRITE setInitScript) friend class ReportRender; public: enum Orientation { Portrait, Landscape }; @@ -130,9 +129,6 @@ public: bool getIsTOC() const; void setIsTOC(bool isTOC); - - QString initScript() const; - void setInitScript(const QString& value); signals: void beforeFirstPageRendered(); void afterLastPageRendered(); @@ -167,7 +163,6 @@ private: bool m_isExtendedInDesignMode; int m_extendedHeight; bool m_isTOC; - QString m_initScript; }; typedef QList ReportPages; diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 738dedc..285622f 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -237,6 +237,8 @@ void ReportDesignWidget::createTabs(){ connectPage(m_report->pageAt(i)); pageIndex = m_tabWidget->addTab(view,QIcon(),m_report->pageAt(i)->pageItem()->objectName()); m_tabWidget->setTabWhatsThis(pageIndex, "page"); + connect(m_report->pageAt(i)->pageItem(), SIGNAL(propertyObjectNameChanged(QString,QString)), + this, SLOT(slotPagePropertyObjectNameChanged(QString,QString))); } m_scriptEditor = new QTextEdit(this); @@ -827,6 +829,9 @@ void ReportDesignWidget::slotPagePropertyObjectNameChanged(const QString &oldVal void ReportDesignWidget::slotTabMoved(int from, int to) { + Q_UNUSED(from) + Q_UNUSED(to) + QList pages; for ( int i = 0; i < m_tabWidget->tabBar()->count(); ++i){ diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 5f18bc8..b0ca34c 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -538,9 +538,9 @@ QVariant ScriptEngineManager::evaluateScript(const QString& script){ return QVariant(); } -void ScriptEngineManager::addTableOfContensItem(const QString& content, int pageNumber, int indent) +void ScriptEngineManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent) { - m_tableOfContens->setItem(content, pageNumber, indent); + m_tableOfContens->setItem(uniqKey, content, pageNumber, indent); } void ScriptEngineManager::updateModel() @@ -756,9 +756,9 @@ bool ScriptEngineManager::createAddTableOfContensItemFunction() fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); fd.setCategory(tr("GENERAL")); fd.setName("addTableOfContensItem"); - fd.setDescription("addTableOfContensItem(\""+tr("Content")+"\", \""+tr("Page Number")+", \""+tr("Indent")+"\")"); - fd.setScriptWrapper(QString("function addTableOfContensItem(content, pageNumber, indent){" - "return %1.addTableOfContensItem(content, pageNumber, indent);}" + fd.setDescription("addTableOfContensItem(\""+tr("Unique identifier")+" \""+tr("Content")+"\", \""+tr("Page Number")+", \""+tr("Indent")+"\")"); + fd.setScriptWrapper(QString("function addTableOfContensItem(uniqKey, content, pageNumber, indent){" + "return %1.addTableOfContensItem(uniqKey, content, pageNumber, indent);}" ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); return addFunction(fd); @@ -1418,9 +1418,9 @@ QVariant ScriptFunctionsManager::getField(const QString &field) return dm->fieldData(field); } -void ScriptFunctionsManager::addTableOfContensItem(const QString& content, int pageNumber, int indent) +void ScriptFunctionsManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent) { - scriptEngineManager()->addTableOfContensItem(content, pageNumber, indent); + scriptEngineManager()->addTableOfContensItem(uniqKey, content, pageNumber, indent); } void ScriptFunctionsManager::clearTableOfContens() @@ -1470,21 +1470,21 @@ TableOfContens::~TableOfContens() clear(); } -void TableOfContens::setItem(const QString& content, int pageNumber, int indent) +void TableOfContens::setItem(const QString& uniqKey, const QString& content, int pageNumber, int indent) { ContentItem * item = 0; - if (m_hash.contains(content)){ - ContentItem* item = m_hash.value(content); - item->pageNumber = pageNumber; - item->indent = indent; - } else { - ContentItem* item = new ContentItem; + if (m_hash.contains(uniqKey)){ + item = m_hash.value(uniqKey); + item->content = content; + item->pageNumber = pageNumber; + item->indent = indent; + } else { + item = new ContentItem; item->content = content; item->pageNumber = pageNumber; item->indent = indent; - m_tableOfContens.append(item); - m_hash.insert(content, item); + m_hash.insert(uniqKey, item); } } diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 7e46490..fa55a45 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -67,7 +67,7 @@ class TableOfContens : public QObject{ Q_OBJECT public: ~TableOfContens(); - void setItem(const QString& content, int pageNumber, int indent = 0); + void setItem(const QString& uniqKey, const QString& content, int pageNumber, int indent = 0); void clear(); private slots: void slotOneSlotDS(LimeReport::CallbackInfo info, QVariant &data); @@ -264,7 +264,7 @@ public: Q_INVOKABLE QVariant getVariable(const QString& name); Q_INVOKABLE QVariant getField(const QString& field); Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} - Q_INVOKABLE void addTableOfContensItem(const QString& content, int pageNumber, int indent = 0); + Q_INVOKABLE void addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent = 0); Q_INVOKABLE void clearTableOfContens(); #ifdef USE_QJSENGINE Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); @@ -305,7 +305,7 @@ public: QString expandDataFields(QString context, ExpandType expandType, QVariant &varValue, QObject* reportItem); QString expandScripts(QString context, QVariant &varValue, QObject* reportItem); QVariant evaluateScript(const QString &script); - void addTableOfContensItem(const QString& content, int pageNumber, int indent); + void addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent); void clearTableOfContens(){ m_tableOfContens->clear(); } protected: From 9f2bfc66d77cea48db91b43ae75b9f3f2da6e650 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 19 Aug 2017 01:33:10 +0300 Subject: [PATCH 043/347] TOC demo has been added --- ...t1_report_header_group_subdetail_TOC.lrxml | 1139 +++++++++++++++++ 1 file changed, 1139 insertions(+) create mode 100644 demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml diff --git a/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml b/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml new file mode 100644 index 0000000..ca60553 --- /dev/null +++ b/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml @@ -0,0 +1,1139 @@ + + + + + + + page2 + + + + + + + + TOC + + + + DataBand1 + + + + TextItem1 + + + + + DataBand1 + + + + + + + $D{tableofcontens.Content} + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem2 + + + + + DataBand1 + + + + + + + $D{tableofcontens.Page number} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TOC + + + + + + + + + + + tableofcontens + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + page1 + + + + + + + + ReportPage1 + + + + ReportHeader1 + + + + TextItem1 + + + + + ReportHeader1 + + + + + + + Lime +Report + + + + + + + + + + + + + + + + + + + + + + + + + + + ImageItem1 + + + + + ReportHeader1 + + + + + + + 89504e470d0a1a0a0000000d494844520000006400000071080600000023f9067c000000097048597300000dd700000dd70142289b780000119c49444154789ced9d79701cd59dc73feff55cba46b7c18eed8d84c1b6c02c4636b58ea928d8c609b0bb64c3429104ca5420b001c292cd3ae50d7120091bbb300e570a0c2609391c0889b99c1828b0036c42488c8d8d1cf9968c25d91aeb1849a3397afa78fb47cf48e383b2248f3c9a91be5553d3d3afbbe7757ffbbddfeffd8ef704a780dfef07104208745d17a73a7e1c83871002c330304d13c00638e503deb871a36bf1e2c5771886e1374d5328a546ba9e630642086f2010f8d3b469d35ec7e1c2729deaa44020e002beee72b9ced6340da5d4782b49135c2e577e28145a0b6c077a80e82909e9eaea12b66d8b6834aaaf5cb9f2059fcf67bb5c2e4388715e868b4824622e58b060e6a5975eba2810084c00a602fb180421a2b7b7570098a669ad58b1621b70180802d688d63ab711abadadfdbc94b2ce344d17e00524c0295b4812524a05f402078056c0601032681c274001d1d9b367cf9152da899e46e13c4b31684212308128104e6c8f6378b04b4b4b63272b182a2149a894cf38860129e5c9f79fe17a8ce31418276494619c905186e1ca9013a094e2b8b1c9b806360c199b36428410ac59b3068fc7a3b5b5b5b9bababa4428143a9ea49c47d23ed5d8d8686fdebcd92461a31a2cd24608c0c2850b7d555555cb84105f554a598ccd56226ddb8eb6b4b43c595d5dfd108e5818f41021ad843cf0c003f1bababab57bf6ec79aba9a9a9c2300c4f3aaf9f0d104208cbb2ac8f3efa28004c04dac904215eaf97b56bd7aab56bd776242a509cb8fe586b25c9f1591c88e0989804839427692344d7f56465e240178ef5722c43e190613104e19e36426ebdf5569e7aeaa964454cc64d2b082150437420a58d90a79e7a0aa514efbfff3eab57af1e6bddd431b02c8bbd7bf7aa1d3b760cf9dcb40af59e9e1e317dfaf4090f3ffc70795f5f9fb42c6b4c12a394b21b1b1b3bafbcf2ca761cb5f7cc7759008140c05b5555f5359fcf779bdfef5763d1bb2884909665450dc3580bfc08a7eb36067b7eda0859b06001d3a74fd78195c033c0598087b1a76541c2e721a5acb46d3b309413d346c8e6cd9b939b16d08df356b8187b26faa48a6bd8b6ddc710959bb476590c6858a1c4672cb68e54d864ca7492625c5443ad44aec2e7f3118b9dd431f8b148ab71f1b5d75ea3a4a4c4130c06dddddddda2afaf6fccb590847151eddab5cb7cf4d147e389dd99d1b2ce39e79c7ee3a26ddb63dab8d8dadafae4a38f3efa50625f668c8bf7dd775fbcaeae6ecdae5dbbde3874e85085aeeb1e31d6ecef806ddb564b4b4b07703699322e161414b06edd3ab56eddba2e1c197214d0d275fd2c4252cbd2851091841b62d0481b21e1709844450c9c40ba1ec6669705098baf52ca66880185692364f7eeddcc98312359199381e0afb186fefbcecfcf27128964c6b83863c60c945284c361d78e1d3bdcb66dd3d1d131e644881002d33469686830972f5f9e941d99d1b2745d777b3c9e2f5e72c9255799a6698f455b168e96a55f78e1851b962f5fbe9e449ac1604f4e2b211b366c50b5b5b507dadbdbff1608048ae2f1b89b2178cb720022d1428cfafa7a1ba8648881e9692364e6cc995c7bedb516b0056804ca0177baae9f6550802ea554b66d674686ecdab52b591113c7853bd66d59966ddb0619362e82330689e3a8bf63a5ab3a1ec96e3a738172c761ac47c60ffbdec7637b4719c60919651895849c247226db9403c731348c14f2919221a7052104adadad1228080402aeaeae2e2984c80a992484108661a88686065d08116588f274541202e0f7fb27e4e7e7ff72c284093312ba7c56b49244d449a4babafac96f7ce31b8f3030141814462d21f7dd775fd7942953beb67dfbf6a99d9d9d2596656585295f08816559768a3fe428d94ec8d2a54b59b56a958993131f05f271e45d56b4129cb19821840867cc1f924eac5ab50a9c9b8ae1bc6182ec21230995202373093b23802185618e420cb9eea352edede93926934165eb2767d4dee2e26294526cd9b2456cd8b0411ac6a04363338e8450a7bebe5e2554f5cc587bd38d7038ecaea9a939b7aaaaaa3012896493fc10b66d5b4d4d4d6dafbefaea61ce60f4fb097fb264c9127efef39f9fc62507609a66797e7efe8352ca595eaf17b247a80bdbb663c160f027c0c33856ef918d7eafacaca4a1a1a1f0e8d1a3de482422a2d1a8d075ddb8fcf2cbfb18620ad7c9b06cd9324a4a4a8e02d700938032b22b705b0171b7db5d6e18c6d1a19c382c42962d5be6292d2d5d5b565676594272d9e170f843e0cb38898e3aa7f1f056ae5c090331c2dd89eb659b2bd8300c23c299705099a629955213344d3b0b48469b848099c01e1c07d5e93ebc64026932c62b9bc848be3c4356db874548381c3e7e324c158bc5bc38ddcb41d2d7df67f33450c3aaf3b0083959ac956ddb9263f3d2d3d9c5642321c3c2a81c188e658c1332ca907142dc19afc1e8c219893ab9f762b4da4a64811b615a1034503fdc86f56117b691620bfde3bfc0c2dfc3d042cb720be924a49f849716e3bdb01caf5be2366c8a8a3d7c420a2a04e4d90a6528621797d3da1aa1cd52e85183d89fdb885eb681380965604609ecee4e63edb204e9214408a46dca7228bc773ee72d9acc055e8d85122e9282a9273b65820fa6158361531f3579775a31af4d29e2fd8e183df7be4f647777d69bde8785d327c48c23224151d9f466d95faee1bfce2d67e6604f15804732cbe36156b187dbaafd341f8ef0649ec66fdf0d70f8a583843501961a3bc40c8b903e7c0acb8058103e781136de4f61a0a5e0dc0a669ecea3f348a67cb290fbefba80db3f33891fe8162fbfda4c72fead3141ca500951000b8ffcc6cf960945bcf1001cdae34ca0e1e1844766296c4b61db0a4b2994022500211002a426909ac475fc30d3ab31694e254f3c5dc7e2a5efb1fcd7fb69c4b167e57cfefb500991f75ccc9485d6f65bdcbfbc792e0a671af914580a3b6e61e8367a632f47767773784f0f6d2d7d043b6284f35c70561ebe73fd949d5fc6e4e9c55495fba870493c9a18a88f0026e5f36f3f9ecf3fe4bbb8f3e9ddd4e3182e739a945313229cf80261c5e51dd3a8f9ce6c7ee4d198e894258e51604b4df5e956744f0fcdcfede783c71bd819b368c3310c8670e68bd719485e71013ea0e8a6f39875fbf95c3eab8c4bbc927c2106c647255e2e5e71098fb784f9da6bcdd47b35a2ba95bba47c2c21791a442de8a140a18744c18edff91fa9e3db9a9692eaac004d424105ed65b37aae7a70d3b35b8334006d4000e8c021248663b94d9dfb2369fbf23eb397bf3fb397376e3a8fb9df9bc36d930b982585f33f0228f372e1e397f2fdea67f9ba6e71c82389c67394928f1d27479df7585dd3fc44a1f6c62abf6bdd1d9e63c800c82b82e90b50776f523d37fc2ab4354883807ae03d9c55630ee01013c46921111c726289ed10d029042dc0ee67f6f2d2dc17b9635b07eb554ad72405727201f35ff92cb70065713b7733b34e2024d5aa1eb811ff25a2f1dbf20f2bca8f6f4b76e104c5d5f7c3dd6fc0e40bd08c3e05f42868c621a10fa755243d8827d39214602b852520ecd1683f1ae5c36bdfe47b1f74f08bd403dd92fc4bcfe6ba697e2e000a4f56f75cc03137a5be95101940eb0d1496f9f88e4772776abbb015ea48dc133cfa8535dd2cb82b71627fe86dd27f3cd4d5779402e21696df4de4608803dfdfca836d11de4af5ace4bba87c643ed703a5621407689c0efa09e9b909c403cef681ebc99b90c77fba044b530fb614f6fe5e5a17bfee59d75531abfd24d74bfa4086eda0ea359c94b8973fe2c0abcdacb0ed810001af46de45657c0a98a29cf0d26c097c18342440e3f550fc8cb3a3fd465c530ab9c125b83ff54025a4aaefe4e0dc17f84553c4b3bdd45fd03782f55240ac3bcedfdb63fcb67faf80420f155f9ac66c72b4db9200d5cf393f1e9c8328f430df2d5973ec511a91c973f58b5fe0b95e83bf9f555eb2c3eff78747ba72af7c446720ca2bfd3b14b804de4f4fe47cc04f0ea65d1ff386dd7201555e8d678fd92f04d6d4b976f8a6e7a2ca11d6fb6a6a6a9add6ef7888713be759858b74e8352031a9726707fa280b3812272508ef43ff8835fa2a0c8cd1382c4a02f8180eeea0e7ee99988f015291ccda9bba6a62636d273987812352bf512b31447fa2b2c90856efc3832243709d9f4cfb826e673b3142c4e2dec3388def5176da3955fa14bd11f9663e7e7e78fb8a12f39f0f3695808e2294502671e2e37d995333228c8b995f08fe54c724b7e985a60d8988fede4ede79bb46d3e8fcb48040e9b30bc64c6e122cf8526a134f9db56d8e178ff1a8a39450680acef4274c570f519fc9f61130147c5792fc0be6f6f6153698167afdbed8e4b29873ce5693a90a7512a0525c9df96c26a8dd08333d6c939038a8c5970de6f38e4ff194bde3ec29a884947678c8eeb37f112d0545c5cbc4fd3b4e440ef8cbe910dd7915fe0667eff0ee1b4dcad1d1ce1582b40ce2019c06c037d97ff8187be3283f74b3cd41c8e500fecaeaeaeeef8b84510471a93f229714bae4edd173589bdd8c4411cdb58b2ebca1952925a8a8d935c19f8e96e5e07b624eef2e8f9e79f7f467ddbea1e10ff0bcf2f427a24b334415db2ccb4b0f7f570b83dc61101bd2a073d89a96aa3c279e3ba8170e22ecdcaca4aef89a78d0c9abee89001f0d9c94cf46afc777fa180b049f48583ec0082ca592839e756ac3e991e6fe338920084659d997b5ebf18aa9e75b68fde88cfe7e26a2958942c570a5ac31c7db89ead3899b97de4a250cf7405001efb147ce133cef6772f42f83dccf7481e4c3da6374ef8a77b780f382c1c07987ec2857200191fe96ebe0a2efb0a886b9cdfff53cb451ec9e3405ef2184b616fefa471f587bc0bb42867c6ba9cebae20c3841cb81ece790ef883f33b7233177a246b85e0bcd4e39afb68bff3cfbc0e1cc27180252775c939648c90e012284de487beb808f9d9a9d47a258f4b416dea711d317a57ed60d3ce2e3e948203b6a2931c5e012e2384bc77f500192d5fc65deea3ce2bf989382eecb4374ee4378dfcf5f106de96827db6a2951c951d496484907f7ad9f90e2ec15be0e6f36ec9d3380ea77ef4c689ac6f62cb9d7fe26501fb6c45234e5044ce6956a9c8a896a5e02c4df018c79111b731df6c65e757dee645609f721249735690a722a3843cbd9b8e8321965bea5899a09c94858826e800f625be739e0cc82021f7d6c2b7fe4aecfa4dbcb4a79b27535526af86fbdfab98f7bbcb9907484b41d919b31764161923e47b5ba1cc8bdad24ed757dfe1a1963e7e9f5aae09bc574d65c9cfeaf857a0b44b47cb73e59effe37864b4cbead2513e17e6bb015a96fd8de55d3a5b53cbdd92c2ebce61d9f7e7b008288e9ae3848c3862a6e31afef57ef63e5ccfd2b0c947a9e5f92e26fc470df7947999468ec662a522e38424a080d80fb6b1f5b9fd2cd52d82c9c71e36d11b82f49678f82403b158394b4ada08494e4283f37087e3c9b381de5bde61d3a666be6b9a447b747a9fdfcf9f3eb3815f3586083010a6aa12ff99aeea8f1aa46d60a8699a3671e2c4e22baeb8a2fcf6db6f374a4b4b6ddb1eda184e0ac1ae964ef9c10b4fbc531cfae3d3cda1f8d45bf7f9dfa9ad2d6a9f397346f7e73ef739dfecd9b32bdd6eb77df0e0c1981022428ed9b4d24288104254545414af5fbffebaaaaaaa3abfdf1f95520eeb414d9c34894fd7fe58b6f7463cdece4eb14dc517959496868a8b8bfbdc6eb795b23cf66660238e5d2b67c628696b2145454545f3e6cd5b98b6eb1516503da9f2a4658661d8dddddd79c0361c67558c1c6929a345a80f099665c50f1f3e5c8a331d949b1c2103864948228c3463537f0b215c96657971727f732a606e585d56281452baae1f8c46a3d5baaebb1273659d11082144341a8d0583c120391e753268ac5ebd5a5fbd7af5ddc00ca00a279bf64cc2064252ca1edbb6738a94614d1c80f34022c07ee00867befb528069db762f39e6b01aae9625185884385373f62413496db24f86a88f1ba39d9290840017524af737bff9cd0be6cd9be79b3367ceb9050505166476b42c84c8bad1ba10826834aa0b216a841027f42ca724c4344d9452bacbe572af58b1e21edbb693339266db5b396a5058580810370c43eaba6e92129f7c4a429a9b9bed8e8e8e8d6d6d6de78442a1024065cb7a50a31cc2e5727976eedcd9c4406ac5a05673d670a698a9022ac8d2c1e42886e976bb038661b400d1c11022189828c633a2551b9b48ae241407aca1ca81f1d6917e1c33edc8ff0311504d2a89d602380000000049454e44ae426082 + + + + + + +
+ + + + ShapeItem1 + + + + + ReportHeader1 + + + + + + + + + + + + + + + + + ShapeItem2 + + + + + ReportHeader1 + + + + + + + + + + + + + + + + + TextItem9 + + + + + ReportHeader1 + + + + + + + REPORT + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem10 + + + + + ReportHeader1 + + + + + + + HEADER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + + + + + + + + + DataBand1 + + + + TextItem3 + + + + + DataBand1 + + + + + + + $D{orders.OrderDate} + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem4 + + + + + DataBand1 + + + + + + + $D{orders.OrderID} + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem12 + + + + + DataBand1 + + + + + + + DATA BAND + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem16 + + + + + DataBand1 + + + + + + + OrderID + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem17 + + + + + DataBand1 + + + + + + + Order Date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + + + + + orders + + + + + + + + + + + + + GroupBandHeader1 + + + + TextItem2 + + + + + GroupBandHeader1 + + + + + + + $D{orders.CompanyName} + + + + + + + + + + + + + + + + + + + + + + + + + + + ShapeItem3 + + + + + GroupBandHeader1 + + + + + + + + + + + + + + + + + TextItem11 + + + + + GroupBandHeader1 + + + + + + + GROUP HEADER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + DataBand1 + + + + CompanyName + + + + + + + + + SubDetailBand1 + + + + TextItem5 + + + + + SubDetailBand1 + + + + + + + $D{orderitems.ProductName} + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem6 + + + + + SubDetailBand1 + + + + + + + $D{orderitems.Quantity} + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem7 + + + + + SubDetailBand1 + + + + + + + $S{line("SubDetailBand1")} + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem13 + + + + + SubDetailBand1 + + + + + + + SUBDETAIL BAND + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + DataBand1 + + + + orderitems + + + + + + + + + SubDetailFooterBand1 + + + + TextItem8 + + + + + SubDetailFooterBand1 + + + + + + + $S{SUM($D{orderitems.Quantity},"SubDetailBand1")} + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem14 + + + + + SubDetailFooterBand1 + + + + + + + SUBDETAIL FOOTER + + + + + + + + + + + + + + + + + + + + + + + + + + + TextItem15 + + + + + SubDetailFooterBand1 + + + + + + + Total + + + + + + + + + + + + + + + + + + + + + + + + + + + ShapeItem4 + + + + + SubDetailFooterBand1 + + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + SubDetailBand1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + datasources + + + + northwind + QSQLITE + ./demo_reports/northwind.db + + + + + + + + + + + orders + Select * from orders +inner join customers on customers.customerid = orders.customerid order by companyname +limit 50 + northwind + + + + + + orderitems + Select * from orderitems + inner join products on products.productid = orderitems.productid +where orderid = $D{orders.orderid} + northwind + orders + + + + + + + + + ReportPage1_DataBand1.bandRegistred.connect(SB1AfterData); +ReportPage1_SubDetailBand1.bandRegistred.connect(SB2AfterData); + +function SB1AfterData(){ + addTableOfContensItem(getField("orders.OrderID"),getField("orders.OrderID"), getVariable("#PAGE")); +} + +function SB2AfterData(){ + addTableOfContensItem(getField("orders.OrderID")+getField("orderItems.ProductName"), getField("orderItems.ProductName"), getVariable("#PAGE"), 5); +} + + + +
+
From 2c50a9a791db53344e43b5d93e6ee7b2733e4f83 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 25 Aug 2017 18:01:59 +0300 Subject: [PATCH 044/347] init commit --- limereport/items/lrtextitem.cpp | 10 ++-- limereport/lrbanddesignintf.cpp | 13 ++++++ limereport/lrbanddesignintf.h | 8 ++++ limereport/lrbasedesignintf.cpp | 18 +++++++- limereport/lrbasedesignintf.h | 5 +- limereport/lrreportengine.cpp | 9 ++++ limereport/lrreportrender.cpp | 17 +++++++ limereport/lrreportrender.h | 2 + limereport/lrscriptenginemanager.cpp | 69 ++++++++++++++++++++++++---- limereport/lrscriptenginemanager.h | 22 +++++++-- 10 files changed, 154 insertions(+), 19 deletions(-) diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 51aba72..3876496 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -736,13 +736,17 @@ void TextItem::expandContent(DataSourceManager* dataManager, RenderPass pass) ExpandType expandType = (allowHTML() && !allowHTMLInFields())?ReplaceHTMLSymbols:NoEscapeSymbols; switch(pass){ case FirstPass: - context=expandUserVariables(context, pass, expandType, dataManager); - context=expandScripts(context, dataManager); - context=expandDataFields(context, expandType, dataManager); + if (!fillInSecondPass()){ + context=expandUserVariables(context, pass, expandType, dataManager); + context=expandScripts(context, dataManager); + context=expandDataFields(context, expandType, dataManager); + } break; case SecondPass:; context=expandUserVariables(context, pass, expandType, dataManager); context=expandScripts(context, dataManager); + if (fillInSecondPass()) + context=expandDataFields(context, expandType, dataManager); } if (expandType == NoEscapeSymbols && !m_varValue.isNull() &&m_valueType!=Default) { diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 63ebcc7..4b5930b 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -178,6 +178,13 @@ QString BandDesignIntf::translateBandName(const BaseDesignIntf* item) const{ } } +void BandDesignIntf::copyBookmarks(BandDesignIntf* sourceBand) +{ + foreach(QString key, sourceBand->bookmarks()){ + addBookmark(key,sourceBand->getBookMark(key)); + } +} + void BandDesignIntf::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { @@ -801,6 +808,12 @@ qreal BandDesignIntf::bottomSpace() const return m_bottomSpace.isValid() ? m_bottomSpace.value() : height()-findMaxBottom(); } +QVariant BandDesignIntf::getBookMark(const QString& key){ + if (m_bookmarks.contains(key)) + return m_bookmarks.value(key); + else return QVariant(); +} + void BandDesignIntf::slotPropertyObjectNameChanged(const QString &, const QString& newName) { update(); diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index 4e205cb..aa1674d 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -238,6 +238,12 @@ public: void setUseAlternateBackgroundColor(bool useAlternateBackgroundColor); void replaceGroupsFunction(BandDesignIntf *band); qreal bottomSpace() const; + + void addBookmark(const QString& key, const QVariant& value){ m_bookmarks.insert(key, value);} + QList bookmarks(){ return m_bookmarks.keys();} + QVariant getBookMark(const QString& key); + void copyBookmarks(BandDesignIntf* sourceBand); + signals: void bandRendered(BandDesignIntf* band); void bandRegistred(); @@ -262,6 +268,7 @@ protected: void preparePopUpMenu(QMenu &menu); void processPopUpAction(QAction *action); QString translateBandName(const BaseDesignIntf *item) const; + private slots: void childBandDeleted(QObject* band); void slotPropertyObjectNameChanged(const QString&,const QString&); @@ -296,6 +303,7 @@ private: QColor m_alternateBackgroundColor; bool m_useAlternateBackgroundColor; InitializedValue m_bottomSpace; + QMap m_bookmarks; }; class DataBandDesignIntf : public BandDesignIntf{ diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 76e41f2..e0b0741 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -79,7 +79,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_borderColor(Qt::black), m_reportSettings(0), m_patternName(""), - m_patternItem(0) + m_patternItem(0), + m_fillInSecondPass(false) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -702,6 +703,21 @@ void BaseDesignIntf::turnOnSelectionMarker(bool value) } } +bool BaseDesignIntf::fillInSecondPass() const +{ + return m_fillInSecondPass; +} + +void BaseDesignIntf::setFillInSecondPass(bool fillInSecondPass) +{ + + if (m_fillInSecondPass != fillInSecondPass){ + m_fillInSecondPass = fillInSecondPass; + notify("fillInSecondPass",!fillInSecondPass,fillInSecondPass); + } + +} + QString BaseDesignIntf::patternName() const { return (m_patternName.isEmpty()) ? objectName() : m_patternName; diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index d9ce55d..f3ce631 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -96,6 +96,7 @@ class BaseDesignIntf : Q_PROPERTY(int borderLineSize READ borderLineSize WRITE setBorderLineSize) Q_PROPERTY(bool isVisible READ isVisible WRITE setItemVisible DESIGNABLE false) Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor) + Q_PROPERTY(bool fillInSecondPass READ fillInSecondPass WRITE setFillInSecondPass) friend class ReportRender; public: enum BGMode { TransparentMode, OpaqueMode}; @@ -276,6 +277,8 @@ public: BaseDesignIntf* patternItem() const; void setPatternItem(BaseDesignIntf* patternItem); virtual QMap getStringForTranslation(); + bool fillInSecondPass() const; + void setFillInSecondPass(bool fillInSecondPass); Q_INVOKABLE QString setItemWidth(qreal width); Q_INVOKABLE QString setItemHeight(qreal height); @@ -286,7 +289,6 @@ public: Q_INVOKABLE QString setItemPosX(qreal xValue); Q_INVOKABLE QString setItemPosY(qreal yValue); - protected: //ICollectionContainer @@ -405,6 +407,7 @@ private: ReportSettings* m_reportSettings; QString m_patternName; BaseDesignIntf* m_patternItem; + bool m_fillInSecondPass; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 00422e0..f47f7e3 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -75,6 +75,11 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_datasources = new DataSourceManager(this); m_datasources->setReportSettings(&m_reportSettings); m_scriptEngineContext = new ScriptEngineContext(this); + + ICallbackDatasource* tableOfContens = m_datasources->createCallbackDatasource("tableofcontens"); + connect(tableOfContens, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), + m_scriptEngineContext->tableOfContens(), SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); + m_datasources->setObjectName("datasources"); connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &))); @@ -917,6 +922,8 @@ ReportPages ReportEnginePrivate::renderToPages() bool isFirst = true; +// m_reportRender->secondRenderPass(result); + foreach(PageDesignIntf* page , m_pages){ if (page->pageItem()->getIsTOC()){ page->setReportSettings(&m_reportSettings); @@ -933,6 +940,7 @@ ReportPages ReportEnginePrivate::renderToPages() } m_reportRender->secondRenderPass(result); + emit renderFinished(); m_reportRender.clear(); } @@ -1174,6 +1182,7 @@ ReportEngine::ReportEngine(ReportEnginePrivate &dd, QObject *parent) } ScriptEngineManager*LimeReport::ReportEnginePrivate::scriptManager(){ + ScriptEngineManager::instance().setContext(scriptContext()); ScriptEngineManager::instance().setDataManager(dataManager()); return &ScriptEngineManager::instance(); } diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 710b5f5..8b64082 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -420,6 +420,7 @@ BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesign } patternBand->emitBandRendered(bandClone); + m_scriptEngineContext->setCurrentBand(bandClone); emit(patternBand->afterRender()); if ( isLast && bandClone->keepFooterTogether() && bandClone->sliceLastRow() ){ @@ -1025,12 +1026,23 @@ BandDesignIntf* ReportRender::sliceBand(BandDesignIntf *band, BandDesignIntf* pa } +void ReportRender::updateTOC(BaseDesignIntf* item, int pageNumber){ + BandDesignIntf* band = dynamic_cast(item); + if (band){ + TableOfContens* toc = m_scriptEngineContext->tableOfContens(); + foreach (QString key, band->bookmarks()){ + toc->setItem(key, band->getBookMark(key).toString(), pageNumber); + } + } +} + void ReportRender::secondRenderPass(ReportPages renderedPages) { for(int i=0; isetReportVariable("#PAGE_COUNT",findLastPageNumber(i)); foreach(BaseDesignIntf* item, page->childBaseItems()){ + if (!m_scriptEngineContext->tableOfContens()->isEmpty()) updateTOC(item, i+1); item->updateItemSize(m_datasources, SecondPass); } } @@ -1044,10 +1056,13 @@ BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, i if (!bottomBandPart->isEmpty()){ if (patternBand->keepFooterTogether()) closeFooterGroup(patternBand); + if (upperBandPart->isEmpty()) + bottomBandPart->copyBookmarks(band); } if (!upperBandPart->isEmpty()){ upperBandPart->updateItemSize(m_datasources, FirstPass, height); registerBand(upperBandPart); + upperBandPart->copyBookmarks(band); } else delete upperBandPart; if (band->columnsCount()>1 && @@ -1068,6 +1083,7 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand) BandDesignIntf* bandClone = dynamic_cast(patternBand->cloneItem(PreviewMode)); m_scriptEngineContext->baseDesignIntfToScript(patternBand->page()->pageItem()->objectName(), bandClone); + m_scriptEngineContext->setCurrentBand(bandClone); emit(patternBand->beforeRender()); if (patternBand->isFooter()){ @@ -1308,6 +1324,7 @@ void ReportRender::savePage(bool isLast) } moveTearOffBand(); + m_scriptEngineContext->setCurrentPage(m_renderPageItem); emit m_patternPageItem->afterRender(); if (isLast) emit m_patternPageItem->afterLastPageRendered(); diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 8f60dca..a0a72db 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -158,6 +158,7 @@ private: qreal maxColumnHeight(); void renameChildItems(BaseDesignIntf *item); void renderGroupFooterByHeader(BandDesignIntf *groupHeader); + void updateTOC(BaseDesignIntf* item, int pageNumber); private: DataSourceManager* m_datasources; ScriptEngineContext* m_scriptEngineContext; @@ -189,6 +190,7 @@ private: unsigned long long m_curentNameIndex; + }; } // namespace LimeReport #endif // LRREPORTRENDER_H diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index b0ca34c..1496021 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -40,6 +40,7 @@ #endif #include "lrdatasourcemanager.h" #include "lrbasedesignintf.h" +#include "lrbanddesignintf.h" Q_DECLARE_METATYPE(QColor) Q_DECLARE_METATYPE(QFont) @@ -201,8 +202,6 @@ ScriptEngineManager::~ScriptEngineManager() { delete m_model; m_model = 0; - delete m_tableOfContens; - m_tableOfContens = 0; delete m_scriptEngine; } @@ -345,9 +344,12 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ ); addFunction(describer); } - ICallbackDatasource* tableOfContens = m_dataManager->createCallbackDatasource("tableofcontens"); - connect(tableOfContens, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), - m_tableOfContens, SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); + +// qDebug()<<"is script context exists before set datamanager is called"<< (m_context == 0); + +// ICallbackDatasource* tableOfContens = m_dataManager->createCallbackDatasource("tableofcontens"); +// connect(tableOfContens, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), +// m_tableOfContens, SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); } } } @@ -431,8 +433,8 @@ QString ScriptEngineManager::expandDataFields(QString context, ExpandType expand fieldValue = replaceHTMLSymbols(varValue.toString()); else fieldValue = varValue.toString(); } - - context.replace(rx.cap(0),fieldValue); + if (varValue.isValid()) + context.replace(rx.cap(0),fieldValue); } else { QString error; @@ -540,7 +542,20 @@ QVariant ScriptEngineManager::evaluateScript(const QString& script){ void ScriptEngineManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent) { - m_tableOfContens->setItem(uniqKey, content, pageNumber, indent); + Q_ASSERT(m_context != 0); + if (m_context){ + BandDesignIntf* currentBand = m_context->getCurrentBand(); + m_context->tableOfContens()->setItem(uniqKey, content, pageNumber, indent); + if (currentBand) + currentBand->addBookmark(uniqKey, content); + } +} + +void ScriptEngineManager::clearTableOfContens(){ + if (m_context) { + if (m_context->tableOfContens()) + m_context->tableOfContens()->clear(); + } } void ScriptEngineManager::updateModel() @@ -813,7 +828,6 @@ ScriptEngineManager::ScriptEngineManager() createClearTableOfContensFunction(); m_model = new ScriptEngineModel(this); - m_tableOfContens = new TableOfContens(); } bool ScriptExtractor::parse() @@ -1049,6 +1063,7 @@ void ScriptEngineContext::clear() m_createdDialogs.clear(); #endif m_initScript.clear(); + m_tableOfContens->clear(); m_lastError=""; } @@ -1131,6 +1146,36 @@ DialogDescriber* ScriptEngineContext::findDialogContainer(const QString& dialogN return 0; } +TableOfContens* ScriptEngineContext::tableOfContens() const +{ + return m_tableOfContens; +} + +void ScriptEngineContext::setTableOfContens(TableOfContens* tableOfContens) +{ + m_tableOfContens = tableOfContens; +} + +PageItemDesignIntf* ScriptEngineContext::getCurrentPage() const +{ + return m_currentPage; +} + +void ScriptEngineContext::setCurrentPage(PageItemDesignIntf* currentPage) +{ + m_currentPage = currentPage; +} + +BandDesignIntf* ScriptEngineContext::getCurrentBand() const +{ + return m_currentBand; +} + +void ScriptEngineContext::setCurrentBand(BandDesignIntf* currentBand) +{ + m_currentBand = currentBand; +} + QDialog* ScriptEngineContext::getDialog(const QString& dialogName) { QDialog* dialog = findDialog(dialogName); @@ -1221,6 +1266,9 @@ bool ScriptEngineContext::runInitScript(){ ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); ScriptEngineManager::instance().clearTableOfContens(); + ScriptEngineManager::instance().setContext(this); + m_tableOfContens->clear(); + #ifndef USE_QJSENGINE engine->pushContext(); #endif @@ -1477,7 +1525,8 @@ void TableOfContens::setItem(const QString& uniqKey, const QString& content, int item = m_hash.value(uniqKey); item->content = content; item->pageNumber = pageNumber; - item->indent = indent; + if (indent>0) + item->indent = indent; } else { item = new ContentItem; item->content = content; diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index fa55a45..e8ce2f6 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -56,6 +56,8 @@ namespace LimeReport{ class DataSourceManager; class BaseDesignIntf; +class PageItemDesignIntf; +class BandDesignIntf; struct ContentItem { QString content; @@ -66,9 +68,11 @@ struct ContentItem { class TableOfContens : public QObject{ Q_OBJECT public: + TableOfContens(QObject* parent = 0):QObject(parent){} ~TableOfContens(); void setItem(const QString& uniqKey, const QString& content, int pageNumber, int indent = 0); void clear(); + bool isEmpty(){ return m_tableOfContens.isEmpty();} private slots: void slotOneSlotDS(LimeReport::CallbackInfo info, QVariant &data); private: @@ -164,7 +168,7 @@ public: #ifdef HAVE_UI_LOADER typedef QSharedPointer DialogPtr; #endif - explicit ScriptEngineContext(QObject* parent=0):QObject(parent){} + explicit ScriptEngineContext(QObject* parent=0):QObject(parent), m_tableOfContens(new TableOfContens(this)){} #ifdef HAVE_UI_LOADER void addDialog(const QString& name, const QByteArray& description); bool changeDialog(const QString& name, const QByteArray &description); @@ -182,7 +186,15 @@ public: QString initScript() const; void setInitScript(const QString& initScript); bool runInitScript(); -#ifdef HAVE_UI_LOADER + + BandDesignIntf* getCurrentBand() const; + void setCurrentBand(BandDesignIntf* currentBand); + PageItemDesignIntf* getCurrentPage() const; + void setCurrentPage(PageItemDesignIntf* currentPage); + TableOfContens* tableOfContens() const; + void setTableOfContens(TableOfContens* tableOfContens); + +#ifdef HAVE_UI_LOADER signals: void dialogNameChanged(QString dialogName); void dialogDeleted(QString dialogName); @@ -205,6 +217,9 @@ private: #endif QString m_lastError; QString m_initScript; + BandDesignIntf* m_currentBand; + PageItemDesignIntf* m_currentPage; + TableOfContens* m_tableOfContens; }; class JSFunctionDesc{ @@ -306,7 +321,7 @@ public: QString expandScripts(QString context, QVariant &varValue, QObject* reportItem); QVariant evaluateScript(const QString &script); void addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent); - void clearTableOfContens(){ m_tableOfContens->clear(); } + void clearTableOfContens(); protected: void updateModel(); @@ -336,7 +351,6 @@ private: ScriptEngineContext* m_context; DataSourceManager* m_dataManager; ScriptFunctionsManager* m_functionManager; - TableOfContens* m_tableOfContens; }; class ScriptExtractor From 992c53e19aeb50023ea37cfb9721549b344fbb52 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 31 Aug 2017 02:53:34 +0300 Subject: [PATCH 045/347] TOC generation has been changed --- ...t1_report_header_group_subdetail_TOC.lrxml | 370 +++++++++++++----- include/lrdatasourcemanagerintf.h | 1 - include/lrglobal.h | 3 +- limereport/items/lrtextitem.cpp | 24 +- limereport/items/lrtextitem.h | 1 + limereport/lrbasedesignintf.h | 2 +- limereport/lrdatadesignintf.cpp | 54 ++- limereport/lrdatadesignintf.h | 4 + limereport/lrdatasourcemanager.cpp | 22 +- limereport/lrdatasourcemanager.h | 7 + limereport/lrdatasourcemanagerintf.h | 1 - limereport/lrglobal.h | 3 +- limereport/lritemdesignintf.cpp | 10 + limereport/lritemdesignintf.h | 10 +- limereport/lrpageitemdesignintf.cpp | 2 +- limereport/lrpageitemdesignintf.h | 4 +- limereport/lrreportengine.cpp | 28 +- limereport/lrreportrender.cpp | 53 ++- limereport/lrreportrender.h | 9 +- limereport/lrscriptenginemanager.cpp | 77 ++-- limereport/lrscriptenginemanager.h | 7 +- 21 files changed, 515 insertions(+), 177 deletions(-) diff --git a/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml b/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml index ca60553..732b484 100644 --- a/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml +++ b/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml @@ -1,27 +1,27 @@ - + - + page2 - + - + - + TOC - + - + DataBand1 - + - + TextItem1 - + @@ -37,7 +37,7 @@ - + @@ -49,18 +49,19 @@ - - + + + - + TextItem2 - + @@ -71,12 +72,19 @@ - $D{tableofcontens.Page number} + $S{ +getFieldByKeyField( + "tableofcontens", + "Page number", + "Content Key", + "$D{tableofcontens.Content Key}" +) +} - + @@ -96,6 +104,7 @@ + @@ -145,25 +154,25 @@ - + page1 - + - + - + ReportPage1 - + - + ReportHeader1 - + - + TextItem1 - + @@ -180,7 +189,7 @@ Report - + @@ -200,10 +209,11 @@ Report + - + ImageItem1 - + @@ -224,9 +234,9 @@ Report
- + ShapeItem1 - + @@ -246,9 +256,9 @@ Report - + ShapeItem2 - + @@ -268,9 +278,9 @@ Report - + TextItem9 - + @@ -286,7 +296,7 @@ Report - + @@ -306,10 +316,11 @@ Report + - + TextItem10 - + @@ -325,7 +336,7 @@ Report - + @@ -345,6 +356,7 @@ Report + @@ -354,7 +366,7 @@ Report - + @@ -363,13 +375,13 @@ Report - + DataBand1 - + - + TextItem3 - + @@ -385,7 +397,7 @@ Report - + @@ -405,10 +417,11 @@ Report + - + TextItem4 - + @@ -424,7 +437,7 @@ Report - + @@ -444,10 +457,11 @@ Report + - + TextItem12 - + @@ -463,7 +477,7 @@ Report - + @@ -483,10 +497,11 @@ Report + - + TextItem16 - + @@ -502,7 +517,7 @@ Report - + @@ -522,10 +537,11 @@ Report + - + TextItem17 - + @@ -541,7 +557,7 @@ Report - + @@ -561,6 +577,7 @@ Report + @@ -570,7 +587,7 @@ Report - + @@ -588,13 +605,13 @@ Report - + GroupBandHeader1 - + - + TextItem2 - + @@ -610,7 +627,7 @@ Report - + @@ -630,10 +647,11 @@ Report + - + ShapeItem3 - + @@ -653,9 +671,9 @@ Report - + TextItem11 - + @@ -671,7 +689,7 @@ Report - + @@ -691,6 +709,7 @@ Report + @@ -700,7 +719,7 @@ Report - + DataBand1 @@ -714,13 +733,13 @@ Report - + SubDetailBand1 - + - + TextItem5 - + @@ -736,7 +755,7 @@ Report - + @@ -756,10 +775,11 @@ Report + - + TextItem6 - + @@ -775,7 +795,7 @@ Report - + @@ -795,10 +815,11 @@ Report + - + TextItem7 - + @@ -814,7 +835,7 @@ Report - + @@ -834,10 +855,11 @@ Report + - + TextItem13 - + @@ -853,7 +875,7 @@ Report - + @@ -873,6 +895,7 @@ Report + @@ -882,7 +905,7 @@ Report - + DataBand1 @@ -896,13 +919,13 @@ Report - + SubDetailFooterBand1 - + - + TextItem8 - + @@ -918,7 +941,7 @@ Report - + @@ -938,10 +961,11 @@ Report + - + TextItem14 - + @@ -957,7 +981,7 @@ Report - + @@ -977,10 +1001,11 @@ Report + - + TextItem15 - + @@ -996,7 +1021,7 @@ Report - + @@ -1016,10 +1041,11 @@ Report + - + ShapeItem4 - + @@ -1047,7 +1073,7 @@ Report - + SubDetailBand1 @@ -1057,6 +1083,128 @@ Report + + PageFooter1 + + + + TextItem18 + + + + + PageFooter1 + + + + + + + Page $V{#PAGE} from $V{#PAGE_COUNT} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + + + + + + + + + PageHeader18 + + + + TextItem19 + + + + + PageHeader18 + + + + + + + Page $V{#PAGE} from $V{#PAGE_COUNT} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ReportPage1 + + + + + + + + + + + + + @@ -1080,10 +1228,10 @@ Report - + datasources - + northwind QSQLITE @@ -1096,7 +1244,7 @@ Report - + orders Select * from orders @@ -1106,7 +1254,7 @@ limit 50 - + orderitems Select * from orderitems @@ -1119,18 +1267,26 @@ where orderid = $D{orders.orderid} - + - ReportPage1_DataBand1.bandRegistred.connect(SB1AfterData); -ReportPage1_SubDetailBand1.bandRegistred.connect(SB2AfterData); + ReportPage1_DataBand1.afterRender.connect(SB1AfterData); +ReportPage1_SubDetailBand1.afterRender.connect(SB2AfterData); +ReportPage1_GroupBandHeader1.afterRender.connect(SB3AfterData); + +var firstLevel = "&nbsp;&nbsp;&nbsp;&nbsp;"; +var secondLevel = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; function SB1AfterData(){ - addTableOfContensItem(getField("orders.OrderID"),getField("orders.OrderID"), getVariable("#PAGE")); + addTableOfContensItem(getField("orders.OrderID"),firstLevel+getField("orders.OrderID")); } function SB2AfterData(){ - addTableOfContensItem(getField("orders.OrderID")+getField("orderItems.ProductName"), getField("orderItems.ProductName"), getVariable("#PAGE"), 5); + addTableOfContensItem(getField("orders.OrderID")+getField("orderItems.ProductName"), secondLevel+"<i>"+getField("orderItems.ProductName")+"</i>"); +} + +function SB3AfterData(){ + addTableOfContensItem(getField("orders.CompanyName"), "<b>"+getField("orders.CompanyName")+"</b>"); } diff --git a/include/lrdatasourcemanagerintf.h b/include/lrdatasourcemanagerintf.h index e3a6ce7..c0b345e 100644 --- a/include/lrdatasourcemanagerintf.h +++ b/include/lrdatasourcemanagerintf.h @@ -56,7 +56,6 @@ public: virtual void clearUserVariables()=0; virtual ICallbackDatasource* createCallbackDatasource(const QString& name) = 0; virtual void registerDbCredentialsProvider(IDbCredentialsProvider* provider) = 0; - //virtual void addCallbackDatasource(ICallbackDatasource* datasource, const QString& name) = 0; }; } diff --git a/include/lrglobal.h b/include/lrglobal.h index 297022d..a8ed17d 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -83,6 +83,7 @@ namespace Const{ const qreal SELECTION_OPACITY = 0.3; const QString FIELD_RX = "\\$D\\s*\\{\\s*([^{}]*)\\s*\\}"; const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}"; + const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(((?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"))(\\w+\\.?\\w+)((?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,\\s*\\\"(\\w+)\\\"\\s*\\)"; @@ -108,7 +109,7 @@ namespace Const{ QVector normalizeCaptures(const QRegExp ®); enum ExpandType {EscapeSymbols, NoEscapeSymbols, ReplaceHTMLSymbols}; - enum RenderPass {FirstPass, SecondPass}; + enum RenderPass {FirstPass = 1, SecondPass = 2}; enum ArrangeType {AsNeeded, Force}; enum PreviewHint{ShowAllPreviewBars = 0, HidePreviewToolBar = 1, diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 3876496..4689ebb 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -339,7 +339,7 @@ void TextItem::updateLayout() bool TextItem::isNeedExpandContent() const { QRegExp rx("$*\\{[^{]*\\}"); - return content().contains(rx); + return content().contains(rx) || isContentBackedUp(); } QString TextItem::replaceBR(QString text) @@ -733,23 +733,35 @@ void TextItem::setAlignment(Qt::Alignment value) void TextItem::expandContent(DataSourceManager* dataManager, RenderPass pass) { QString context=content(); - ExpandType expandType = (allowHTML() && !allowHTMLInFields())?ReplaceHTMLSymbols:NoEscapeSymbols; + foreach (QString variableName, dataManager->variableNamesByRenderPass(SecondPass)) { + QRegExp rx(QString(Const::NAMED_VARIABLE_RX).arg(variableName)); + if (context.contains(rx) && pass == FirstPass){ + backupContent(); + break; + } + } + + ExpandType expandType = (allowHTML() && !allowHTMLInFields()) ? ReplaceHTMLSymbols : NoEscapeSymbols; switch(pass){ case FirstPass: if (!fillInSecondPass()){ context=expandUserVariables(context, pass, expandType, dataManager); context=expandScripts(context, dataManager); context=expandDataFields(context, expandType, dataManager); + } else { + context=expandDataFields(context, expandType, dataManager); } break; - case SecondPass:; + case SecondPass: + if (isContentBackedUp()) { + restoreContent(); + context = content(); + } context=expandUserVariables(context, pass, expandType, dataManager); context=expandScripts(context, dataManager); - if (fillInSecondPass()) - context=expandDataFields(context, expandType, dataManager); } - if (expandType == NoEscapeSymbols && !m_varValue.isNull() &&m_valueType!=Default) { + if (expandType == NoEscapeSymbols && !m_varValue.isNull() &&m_valueType != Default) { setContent(formatFieldValue()); } else { setContent(context); diff --git a/limereport/items/lrtextitem.h b/limereport/items/lrtextitem.h index 6dc735b..d8f3bd4 100644 --- a/limereport/items/lrtextitem.h +++ b/limereport/items/lrtextitem.h @@ -71,6 +71,7 @@ class TextItem : public LimeReport::ContentItemDesignIntf, IPageInit { Q_PROPERTY(BrushStyle backgroundBrushStyle READ backgroundBrushStyle WRITE setBackgroundBrushStyle) Q_PROPERTY(qreal textIndent READ textIndent WRITE setTextIndent) Q_PROPERTY(Qt::LayoutDirection textLayoutDirection READ textLayoutDirection WRITE setTextLayoutDirection) + Q_PROPERTY(bool fillInSecondPass READ fillInSecondPass WRITE setFillInSecondPass) public: enum AutoWidth{NoneAutoWidth,MaxWordLength,MaxStringLength}; diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index f3ce631..5e86669 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -96,7 +96,7 @@ class BaseDesignIntf : Q_PROPERTY(int borderLineSize READ borderLineSize WRITE setBorderLineSize) Q_PROPERTY(bool isVisible READ isVisible WRITE setItemVisible DESIGNABLE false) Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor) - Q_PROPERTY(bool fillInSecondPass READ fillInSecondPass WRITE setFillInSecondPass) + friend class ReportRender; public: enum BGMode { TransparentMode, OpaqueMode}; diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index 9f5e64d..3cdb434 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -291,6 +291,16 @@ QVariant ModelToDataSource::data(const QString &columnName) return m_model->data(m_model->index(currentRow(),columnIndexByName(columnName))); } +QVariant ModelToDataSource::dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) +{ + for( int i=0; i < m_model->rowCount(); ++i ){ + if (m_model->data(m_model->index(i, columnIndexByName(keyColumnName))) == keyData){ + return m_model->data(m_model->index(i, columnIndexByName(columnName))); + } + } + return QVariant(); +} + int ModelToDataSource::columnCount() { if (isInvalid()) return 0; @@ -702,17 +712,24 @@ void CallbackDatasource::first(){ else m_eof = !result; } +QVariant CallbackDatasource::callbackData(const QString& columnName, int row) +{ + CallbackInfo info; + QVariant result; + info.dataType = CallbackInfo::ColumnData; + info.columnName = columnName; + info.index = row; + emit getCallbackData(info, result); + return result; +} + QVariant CallbackDatasource::data(const QString& columnName) { QVariant result; if (!bof()) { if (!m_getDataFromCache){ - CallbackInfo info; - info.dataType = CallbackInfo::ColumnData; - info.columnName = columnName; - info.index = m_currentRow; - emit getCallbackData(info,result); + result = callbackData(columnName, m_currentRow); } else { result = m_valuesCache[columnName]; } @@ -720,6 +737,31 @@ QVariant CallbackDatasource::data(const QString& columnName) return result; } +QVariant CallbackDatasource::dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) +{ + int backupCurrentRow = m_currentRow; + int currentRow = 0; + QVariant result = QVariant(); + first(); + if (!checkIfEmpty()){ + do { + QVariant key = callbackData(keyColumnName, currentRow); + if (key == keyData){ + result = callbackData(columnName, currentRow); + break; + } + currentRow++; + } while (next()); + } + + first(); + if (backupCurrentRow != -1){ + for (int i = 0; i < backupCurrentRow; ++i) + next(); + } + return result; +} + int CallbackDatasource::columnCount(){ CallbackInfo info; if (m_columnCount == -1){ @@ -781,7 +823,7 @@ int CallbackDatasource::columnIndexByName(QString name) bool CallbackDatasource::checkNextRecord(int recordNum){ if (bof()) checkIfEmpty(); if (m_rowCount > 0) { - return (m_currentRow < (m_rowCount-1)); + return (recordNum < (m_rowCount-1)); } else { QVariant result = false; CallbackInfo info; diff --git a/limereport/lrdatadesignintf.h b/limereport/lrdatadesignintf.h index e51a3af..3a91a30 100644 --- a/limereport/lrdatadesignintf.h +++ b/limereport/lrdatadesignintf.h @@ -58,6 +58,7 @@ public: virtual bool bof() = 0; virtual bool eof() = 0; virtual QVariant data(const QString& columnName) = 0; + virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0; virtual int columnCount() = 0; virtual QString columnNameByIndex(int columnIndex) = 0; virtual int columnIndexByName(QString name) = 0; @@ -359,6 +360,7 @@ public: bool eof(); bool bof(); QVariant data(const QString& columnName); + QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData); int columnCount(); QString columnNameByIndex(int columnIndex); int columnIndexByName(QString name); @@ -390,6 +392,7 @@ public: bool bof(){return m_currentRow == -1;} bool eof(){return m_eof;} QVariant data(const QString &columnName); + QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData); int columnCount(); QString columnNameByIndex(int columnIndex); int columnIndexByName(QString name); @@ -407,6 +410,7 @@ private: int m_rowCount; QHash m_valuesCache; bool m_getDataFromCache; + QVariant callbackData(const QString& columnName, int row); }; class CallbackDatasourceHolder :public QObject, public IDataSourceHolder{ diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 83b438c..09cf5c6 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -224,7 +224,7 @@ DataSourceManager::DataSourceManager(QObject *parent) : m_groupFunctionFactory.registerFunctionCreator(QLatin1String("AVG"),new ConstructorGroupFunctionCreator); m_groupFunctionFactory.registerFunctionCreator(QLatin1String("MIN"),new ConstructorGroupFunctionCreator); m_groupFunctionFactory.registerFunctionCreator(QLatin1String("MAX"),new ConstructorGroupFunctionCreator); - setSystemVariable(QLatin1String("#PAGE"),1,FirstPass); + setSystemVariable(QLatin1String("#PAGE"),1,SecondPass); setSystemVariable(QLatin1String("#PAGE_COUNT"),0,SecondPass); setSystemVariable(QLatin1String("#IS_LAST_PAGEFOOTER"),false,FirstPass); setSystemVariable(QLatin1String("#IS_FIRST_PAGEFOOTER"),false,FirstPass); @@ -1377,6 +1377,15 @@ QVariant DataSourceManager::fieldData(const QString &fieldName) return QVariant(); } +QVariant DataSourceManager::fieldDataByKey(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue) +{ + IDataSource* ds = dataSource(datasourceName); + if (ds){ + return ds->dataByKeyField(valueFieldName, keyFieldName, keyValue); + } + return QVariant(); +} + QVariant DataSourceManager::variable(const QString &variableName) { if (m_userVariables.containsVariable(variableName)) @@ -1403,6 +1412,17 @@ QStringList DataSourceManager::variableNames() return m_reportVariables.variableNames(); } +QStringList DataSourceManager::variableNamesByRenderPass(RenderPass pass) +{ + QStringList result; + foreach(QString variableName, m_reportVariables.variableNames()){ + if (m_reportVariables.variablePass(variableName) == pass){ + result.append(variableName); + } + } + return result; +} + QStringList DataSourceManager::namesOfUserVariables(){ return m_userVariables.variableNames(); } diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index ea77064..5483b55 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -126,6 +126,7 @@ public: QVariant variable(const QString& variableName); RenderPass variablePass(const QString& name); QStringList variableNames(); + QStringList variableNamesByRenderPass(RenderPass pass); QStringList namesOfUserVariables(); VarDesc::VarType variableType(const QString& name); bool variableIsSystem(const QString& name); @@ -161,6 +162,12 @@ public: QStringList fieldNames(const QString& datasourceName); bool containsField(const QString& fieldName); QVariant fieldData(const QString& fieldName); + QVariant fieldDataByKey( + const QString& datasourceName, + const QString& valueFieldName, + const QString& keyFieldName, + QVariant keyValue + ); QString extractDataSource(const QString& fieldName); QString extractFieldName(const QString& fieldName); diff --git a/limereport/lrdatasourcemanagerintf.h b/limereport/lrdatasourcemanagerintf.h index e3a6ce7..c0b345e 100644 --- a/limereport/lrdatasourcemanagerintf.h +++ b/limereport/lrdatasourcemanagerintf.h @@ -56,7 +56,6 @@ public: virtual void clearUserVariables()=0; virtual ICallbackDatasource* createCallbackDatasource(const QString& name) = 0; virtual void registerDbCredentialsProvider(IDbCredentialsProvider* provider) = 0; - //virtual void addCallbackDatasource(ICallbackDatasource* datasource, const QString& name) = 0; }; } diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 297022d..a8ed17d 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -83,6 +83,7 @@ namespace Const{ const qreal SELECTION_OPACITY = 0.3; const QString FIELD_RX = "\\$D\\s*\\{\\s*([^{}]*)\\s*\\}"; const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}"; + const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(((?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"))(\\w+\\.?\\w+)((?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,\\s*\\\"(\\w+)\\\"\\s*\\)"; @@ -108,7 +109,7 @@ namespace Const{ QVector normalizeCaptures(const QRegExp ®); enum ExpandType {EscapeSymbols, NoEscapeSymbols, ReplaceHTMLSymbols}; - enum RenderPass {FirstPass, SecondPass}; + enum RenderPass {FirstPass = 1, SecondPass = 2}; enum ArrangeType {AsNeeded, Force}; enum PreviewHint{ShowAllPreviewBars = 0, HidePreviewToolBar = 1, diff --git a/limereport/lritemdesignintf.cpp b/limereport/lritemdesignintf.cpp index a830c96..e9363e0 100644 --- a/limereport/lritemdesignintf.cpp +++ b/limereport/lritemdesignintf.cpp @@ -122,4 +122,14 @@ QMap ContentItemDesignIntf::getStringForTranslation(){ return map; } +bool ContentItemDesignIntf::isContentBackedUp() const +{ + return m_contentBackedUp; +} + +void ContentItemDesignIntf::setContentBackedUp(bool contentBackedUp) +{ + m_contentBackedUp = contentBackedUp; +} + }// namespace LimeReport diff --git a/limereport/lritemdesignintf.h b/limereport/lritemdesignintf.h index f07fd9f..44f0363 100644 --- a/limereport/lritemdesignintf.h +++ b/limereport/lritemdesignintf.h @@ -61,6 +61,7 @@ private: class Spacer :public ItemDesignIntf{ public: Spacer(QObject* owner,QGraphicsItem* parent); + bool isEmpty() const {return true;} protected: BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent){ return new Spacer(owner, parent); @@ -72,10 +73,17 @@ class ContentItemDesignIntf : public ItemDesignIntf Q_OBJECT public: ContentItemDesignIntf(const QString& xmlTypeName, QObject* owner = 0,QGraphicsItem* parent = 0) - :ItemDesignIntf(xmlTypeName,owner,parent){} + :ItemDesignIntf(xmlTypeName,owner,parent), m_contentBackedUp(false){} virtual QString content() const = 0; virtual void setContent(const QString& value) = 0; QMap getStringForTranslation(); + void backupContent(){ m_contentBackUp = content(); m_contentBackedUp = true;} + void restoreContent() {setContent(m_contentBackUp);} + bool isContentBackedUp() const; + void setContentBackedUp(bool contentBackedUp); +private: + QString m_contentBackUp; + bool m_contentBackedUp; }; class LayoutDesignIntf : public ItemDesignIntf{ diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 95b9144..ac7b5b6 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -331,7 +331,7 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } -bool PageItemDesignIntf::getIsTOC() const +bool PageItemDesignIntf::isTOC() const { return m_isTOC; } diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index c39788a..d484492 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -55,7 +55,7 @@ class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft Q_PROPERTY(bool resetPageNumber READ resetPageNumber WRITE setResetPageNumber) Q_PROPERTY(bool isExtendedInDesignMode READ isExtendedInDesignMode WRITE setExtendedInDesignMode) Q_PROPERTY(int extendedHeight READ extendedHeight WRITE setExtendedHeight) - Q_PROPERTY(bool pageIsTOC READ getIsTOC WRITE setIsTOC) + Q_PROPERTY(bool pageIsTOC READ isTOC WRITE setIsTOC) friend class ReportRender; public: enum Orientation { Portrait, Landscape }; @@ -127,7 +127,7 @@ public: int extendedHeight() const; void setExtendedHeight(int extendedHeight); - bool getIsTOC() const; + bool isTOC() const; void setIsTOC(bool isTOC); signals: void beforeFirstPageRendered(); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index f47f7e3..e582fc2 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -914,29 +914,35 @@ ReportPages ReportEnginePrivate::renderToPages() emit renderStarted(); foreach(PageDesignIntf* page , m_pages){ - if (!page->pageItem()->getIsTOC()){ + if (!page->pageItem()->isTOC()){ page->setReportSettings(&m_reportSettings); result.append(m_reportRender->renderPageToPages(page)); } } - bool isFirst = true; // m_reportRender->secondRenderPass(result); - foreach(PageDesignIntf* page , m_pages){ - if (page->pageItem()->getIsTOC()){ + for (int i=0; ipageItem()->isTOC()){ page->setReportSettings(&m_reportSettings); - if (isFirst){ - ReportPages pages = m_reportRender->renderPageToPages(page); - for (int i=0; i1) secondPage = m_pages.at(1); + ReportPages pages = m_reportRender->renderTOC( + page, + true, + secondPage && secondPage->pageItem()->resetPageNumber() + ); + for (int j=0; jrenderPageToPages(page)); + } } - isFirst = false; } m_reportRender->secondRenderPass(result); diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 8b64082..cd701c7 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -148,7 +148,7 @@ void ReportRender::renameChildItems(BaseDesignIntf *item){ ReportRender::ReportRender(QObject *parent) :QObject(parent), m_renderPageItem(0), m_pageCount(0), - m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0) + m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_renderingFirstTOC(false) { initColumns(); } @@ -188,15 +188,24 @@ void ReportRender::initDatasource(const QString& name){ } } -void ReportRender::renderPage(PageDesignIntf* patternPage) +void ReportRender::renderPage(PageDesignIntf* patternPage, bool isTOC, bool isFirst, bool resetPageNumbers) { m_curentNameIndex = 0; m_patternPageItem = patternPage->pageItem(); + m_renderingFirstTOC = isTOC && isFirst; - if (m_patternPageItem->resetPageNumber() && m_pageCount>0) { + if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) { resetPageNumber(PageReset); } + if (m_renderingFirstTOC && resetPageNumbers){ + PagesRange range; + range.firstPage = 0; + range.lastPage = 0; + m_ranges.insert(0,range); + m_pageCount = 0; + } + m_renderCanceled = false; BandDesignIntf* reportFooter = m_patternPageItem->bandByType(BandDesignIntf::ReportFooter); m_reportFooterHeight = 0; @@ -238,6 +247,12 @@ void ReportRender::renderPage(PageDesignIntf* patternPage) renderBand(tearOffBand, 0, StartNewPageAsNeeded); savePage(true); + + if (m_renderingFirstTOC && resetPageNumbers && m_ranges.count()>1){ + m_ranges[1].firstPage = m_ranges.at(0).lastPage+1; + m_ranges[1].lastPage += m_ranges.at(0).lastPage+1; + } + #ifndef USE_QJSENGINE ScriptEngineManager::instance().scriptEngine()->popContext(); #endif @@ -267,6 +282,11 @@ ReportPages ReportRender::renderPageToPages(PageDesignIntf *patternPage) return m_renderedPages; } +ReportPages ReportRender::renderTOC(PageDesignIntf* patternPage, bool first, bool resetPages){ + renderPage(patternPage, true, first, resetPages); + return m_renderedPages; +} + void ReportRender::initRenderPage() { if (!m_renderPageItem) { @@ -1038,11 +1058,21 @@ void ReportRender::updateTOC(BaseDesignIntf* item, int pageNumber){ void ReportRender::secondRenderPass(ReportPages renderedPages) { + + if (!m_scriptEngineContext->tableOfContens()->isEmpty()){ + for(int i=0; ichildBaseItems()){ + updateTOC(item, findPageNumber(i)); + } + } + } + for(int i=0; isetReportVariable("#PAGE",findPageNumber(i)); m_datasources->setReportVariable("#PAGE_COUNT",findLastPageNumber(i)); foreach(BaseDesignIntf* item, page->childBaseItems()){ - if (!m_scriptEngineContext->tableOfContens()->isEmpty()) updateTOC(item, i+1); item->updateItemSize(m_datasources, SecondPass); } } @@ -1155,7 +1185,7 @@ void ReportRender::resetPageNumber(ResetPageNuberType resetType) { PagesRange range; if (!m_ranges.isEmpty()){ - m_ranges.last().lastPage = (resetType == BandReset)? m_pageCount : m_pageCount-1; + currentRange().lastPage = (resetType == BandReset)? m_pageCount : m_pageCount-1; range.firstPage = m_pageCount+((resetType == BandReset)? 1 : 0); } else { range.firstPage = m_pageCount; @@ -1175,6 +1205,15 @@ int ReportRender::findLastPageNumber(int currentPage) return 0; } +int ReportRender::findPageNumber(int currentPage) +{ + foreach (PagesRange range, m_ranges) { + if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) ) + return (currentPage - range.firstPage)+1; + } + return 0; +} + void ReportRender::cutGroups() { m_popupedExpression.clear(); @@ -1302,13 +1341,13 @@ void ReportRender::savePage(bool isLast) } } - if (m_ranges.last().lastPage==0 && m_ranges.count()>1) { + if (currentRange(m_renderingFirstTOC).lastPage==0 && m_ranges.count()>1) { m_datasources->setReportVariable("#PAGE",1); } else { m_datasources->setReportVariable("#PAGE",m_datasources->variable("#PAGE").toInt()+1); } - m_ranges.last().lastPage = m_pageCount; + currentRange(m_renderingFirstTOC).lastPage = m_pageCount; BandDesignIntf* pageFooter = m_renderPageItem->bandByType(BandDesignIntf::PageFooter); if (pageFooter) pageFooter->setBandIndex(++m_currentIndex); diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index a0a72db..182a8fb 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -82,6 +82,7 @@ public: PageItemDesignIntf::Ptr pageAt(int index); QString renderPageToString(PageDesignIntf *patternPage); ReportPages renderPageToPages(PageDesignIntf *patternPage); + ReportPages renderTOC(PageDesignIntf* patternPage, bool first, bool resetPages); void secondRenderPass(ReportPages renderedPages); signals: void pageRendered(int renderedPageCount); @@ -95,7 +96,7 @@ private: void initGroups(); void clearPageMap(); - void renderPage(PageDesignIntf *patternPage); + void renderPage(PageDesignIntf *patternPage, bool isTOC = false, bool isFirst = false, bool resetPageNumbers = false); BandDesignIntf* renderBand(BandDesignIntf *patternBand, BandDesignIntf *bandData, DataRenderMode mode = NotStartNewPage, bool isLast = false); void renderDataBand(BandDesignIntf* dataBand); void renderPageHeader(PageItemDesignIntf* patternPage); @@ -147,6 +148,7 @@ private: void startNewPage(bool isFirst = false); void resetPageNumber(ResetPageNuberType resetType); int findLastPageNumber(int currentPage); + int findPageNumber(int currentPage); void savePage(bool isLast = false); QString toString(); void initColumns(); @@ -159,6 +161,7 @@ private: void renameChildItems(BaseDesignIntf *item); void renderGroupFooterByHeader(BandDesignIntf *groupHeader); void updateTOC(BaseDesignIntf* item, int pageNumber); + PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();} private: DataSourceManager* m_datasources; ScriptEngineContext* m_scriptEngineContext; @@ -188,9 +191,7 @@ private: QList m_ranges; QVector m_columnedBandItems; unsigned long long m_curentNameIndex; - - - + bool m_renderingFirstTOC; }; } // namespace LimeReport #endif // LRREPORTRENDER_H diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 1496021..9fc11f3 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -364,21 +364,21 @@ QString ScriptEngineManager::expandUserVariables(QString context, RenderPass pas pos += rx.matchedLength(); if (dataManager()->containsVariable(variable) ){ try { - if (pass==dataManager()->variablePass(variable)){ - varValue = dataManager()->variable(variable); - switch (expandType){ - case EscapeSymbols: - context.replace(rx.cap(0),escapeSimbols(varValue.toString())); - break; - case NoEscapeSymbols: - context.replace(rx.cap(0),varValue.toString()); - break; - case ReplaceHTMLSymbols: - context.replace(rx.cap(0),replaceHTMLSymbols(varValue.toString())); - break; - } - pos=0; + + varValue = dataManager()->variable(variable); + switch (expandType){ + case EscapeSymbols: + context.replace(rx.cap(0),escapeSimbols(varValue.toString())); + break; + case NoEscapeSymbols: + context.replace(rx.cap(0),varValue.toString()); + break; + case ReplaceHTMLSymbols: + context.replace(rx.cap(0),replaceHTMLSymbols(varValue.toString())); + break; } + pos=0; + } catch (ReportError e){ dataManager()->putError(e.what()); if (!dataManager()->reportSettings() || dataManager()->reportSettings()->suppressAbsentFieldsAndVarsWarnings()) @@ -540,12 +540,12 @@ QVariant ScriptEngineManager::evaluateScript(const QString& script){ return QVariant(); } -void ScriptEngineManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent) +void ScriptEngineManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int indent) { Q_ASSERT(m_context != 0); if (m_context){ BandDesignIntf* currentBand = m_context->getCurrentBand(); - m_context->tableOfContens()->setItem(uniqKey, content, pageNumber, indent); + m_context->tableOfContens()->setItem(uniqKey, content, 0, indent); if (currentBand) currentBand->addBookmark(uniqKey, content); } @@ -764,6 +764,25 @@ bool ScriptEngineManager::createGetFieldFunction() return addFunction(fd); } +bool ScriptEngineManager::createGetFieldByKeyFunction() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory(tr("GENERAL")); + fd.setName("getFieldByKeyField"); + fd.setDescription("getFieldByKeyField(\""+tr("Datasource")+"\", \""+ + tr("ValueField")+"\",\""+ + tr("KeyField")+"\", \""+ + tr("KeyFieldValue")+"\")" + ); + fd.setScriptWrapper(QString("function getFieldByKeyField(datasource, valueFieldName, keyFieldName, keyValue){" + "return %1.getFieldByKeyField(datasource, valueFieldName, keyFieldName, keyValue);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + bool ScriptEngineManager::createAddTableOfContensItemFunction() { JSFunctionDesc fd; @@ -771,9 +790,9 @@ bool ScriptEngineManager::createAddTableOfContensItemFunction() fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); fd.setCategory(tr("GENERAL")); fd.setName("addTableOfContensItem"); - fd.setDescription("addTableOfContensItem(\""+tr("Unique identifier")+" \""+tr("Content")+"\", \""+tr("Page Number")+", \""+tr("Indent")+"\")"); - fd.setScriptWrapper(QString("function addTableOfContensItem(uniqKey, content, pageNumber, indent){" - "return %1.addTableOfContensItem(uniqKey, content, pageNumber, indent);}" + fd.setDescription("addTableOfContensItem(\""+tr("Unique identifier")+" \""+tr("Content")+"\", \""+tr("Indent")+"\")"); + fd.setScriptWrapper(QString("function addTableOfContensItem(uniqKey, content, indent){" + "return %1.addTableOfContensItem(uniqKey, content, indent);}" ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); return addFunction(fd); @@ -814,6 +833,7 @@ ScriptEngineManager::ScriptEngineManager() #endif createSetVariableFunction(); createGetFieldFunction(); + createGetFieldByKeyFunction(); createGetVariableFunction(); #ifndef USE_QJSENGINE QScriptValue colorCtor = m_scriptEngine->newFunction(constructColor); @@ -1466,9 +1486,15 @@ QVariant ScriptFunctionsManager::getField(const QString &field) return dm->fieldData(field); } -void ScriptFunctionsManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent) +QVariant ScriptFunctionsManager::getFieldByKeyField(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue) { - scriptEngineManager()->addTableOfContensItem(uniqKey, content, pageNumber, indent); + DataSourceManager* dm = scriptEngineManager()->dataManager(); + return dm->fieldDataByKey(datasourceName, valueFieldName, keyFieldName, keyValue); +} + +void ScriptFunctionsManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int indent) +{ + scriptEngineManager()->addTableOfContensItem(uniqKey, content, indent); } void ScriptFunctionsManager::clearTableOfContens() @@ -1532,6 +1558,7 @@ void TableOfContens::setItem(const QString& uniqKey, const QString& content, int item->content = content; item->pageNumber = pageNumber; item->indent = indent; + item->uniqKey = uniqKey; m_tableOfContens.append(item); m_hash.insert(uniqKey, item); } @@ -1541,7 +1568,7 @@ void TableOfContens::setItem(const QString& uniqKey, const QString& content, int void TableOfContens::slotOneSlotDS(CallbackInfo info, QVariant& data) { QStringList columns; - columns << "Content" << "Page number"; + columns << "Content" << "Page number" << "Content Key"; switch (info.dataType) { case LimeReport::CallbackInfo::RowCount: @@ -1557,9 +1584,11 @@ void TableOfContens::slotOneSlotDS(CallbackInfo info, QVariant& data) case LimeReport::CallbackInfo::ColumnData: if (info.index < m_tableOfContens.count()){ ContentItem* item = m_tableOfContens.at(info.index); - if (info.columnName == "Content") + if (info.columnName.compare("Content",Qt::CaseInsensitive) == 0) data = item->content.rightJustified(item->indent+item->content.size()); - else + if (info.columnName.compare("Content Key",Qt::CaseInsensitive) == 0) + data = item->uniqKey; + if (info.columnName.compare("Page number",Qt::CaseInsensitive) == 0) data = QString::number(item->pageNumber); } break; diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index e8ce2f6..717a693 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -63,6 +63,7 @@ struct ContentItem { QString content; int indent; int pageNumber; + QString uniqKey; }; class TableOfContens : public QObject{ @@ -278,8 +279,9 @@ public: Q_INVOKABLE void setVariable(const QString& name, QVariant value); Q_INVOKABLE QVariant getVariable(const QString& name); Q_INVOKABLE QVariant getField(const QString& field); + Q_INVOKABLE QVariant getFieldByKeyField(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue); Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} - Q_INVOKABLE void addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent = 0); + Q_INVOKABLE void addTableOfContensItem(const QString& uniqKey, const QString& content, int indent = 0); Q_INVOKABLE void clearTableOfContens(); #ifdef USE_QJSENGINE Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); @@ -320,7 +322,7 @@ public: QString expandDataFields(QString context, ExpandType expandType, QVariant &varValue, QObject* reportItem); QString expandScripts(QString context, QVariant &varValue, QObject* reportItem); QVariant evaluateScript(const QString &script); - void addTableOfContensItem(const QString& uniqKey, const QString& content, int pageNumber, int indent); + void addTableOfContensItem(const QString& uniqKey, const QString& content, int indent); void clearTableOfContens(); protected: @@ -340,6 +342,7 @@ private: bool createSetVariableFunction(); bool createGetVariableFunction(); bool createGetFieldFunction(); + bool createGetFieldByKeyFunction(); bool createAddTableOfContensItemFunction(); bool createClearTableOfContensFunction(); private: From 5c3c032ea37fb6715170da77c0cd8ad3e1482c61 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Sep 2017 02:02:51 +0300 Subject: [PATCH 046/347] Changing the language from the script has been added --- .../change_lang_from_script.lrxml | 127 ++++++++++++++++++ limereport/lrreportdesignwidget.cpp | 1 + limereport/lrreportengine.cpp | 24 +++- limereport/lrreportengine_p.h | 2 + limereport/lrscriptenginemanager.cpp | 97 ++++++++++++- limereport/lrscriptenginemanager.h | 54 +++++++- 6 files changed, 300 insertions(+), 5 deletions(-) create mode 100644 demo_r1/demo_reports/change_lang_from_script.lrxml diff --git a/demo_r1/demo_reports/change_lang_from_script.lrxml b/demo_r1/demo_reports/change_lang_from_script.lrxml new file mode 100644 index 0000000..a5d3704 --- /dev/null +++ b/demo_r1/demo_reports/change_lang_from_script.lrxml @@ -0,0 +1,127 @@ + + + + + + + page1 + + + + + + + + Reportpage1 + + + + TextItem1 + + + + + Reportpage1 + + + + + + + Test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + datasources + + + + + + + + + + + + Dialog + + + + function OnAccept(){ + engine.setReportTranslation(Dialog.comboBox.currentText); +} +Dialog.accepted.connect(OnAccept); + +var comboBox = LimeReport.createWrapper(Dialog.comboBox); +comboBox.addItems(engine.aviableReportTranslations()); + +Dialog.exec() == 1; + + + + + + + + + + + + + + + + + + + + + diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 84a9a7e..9472f13 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -268,6 +268,7 @@ void ReportDesignWidget::createNewDialogTab(const QString& dialogName, const QBy int pageIndex = m_tabWidget->addTab(dialogDesigner,QIcon(),dialogName); m_tabWidget->setTabWhatsThis(pageIndex,"dialog"); m_tabWidget->setCurrentIndex(pageIndex); + m_dialogDesignerManager->setActiveEditor(dialogDesigner); } DialogDesigner*ReportDesignWidget::activeDialogPage() diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index e582fc2..bc3f626 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -304,6 +304,24 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) delete painter; } +QStringList ReportEnginePrivate::aviableReportTranslations() +{ + QStringList result; + foreach (QLocale::Language language, aviableLanguages()){ + result << QLocale::languageToString(language); + } + return result; +} + +void ReportEnginePrivate::setReportTranslation(const QString &languageName) +{ + foreach(QLocale::Language language, aviableLanguages()){ + if (QLocale::languageToString(language).compare(languageName) == 0){ + setReportLanguage(language); + } + } +}; + bool ReportEnginePrivate::printReport(QPrinter* printer) { if (!printer&&!m_printerSelected){ @@ -892,7 +910,7 @@ ReportPages ReportEnginePrivate::renderToPages() dataManager()->connectAllDatabases(); dataManager()->setDesignTime(false); dataManager()->updateDatasourceModel(); - activateLanguage(m_reportLanguage); + connect(m_reportRender.data(),SIGNAL(pageRendered(int)), this, SIGNAL(renderPageFinished(int))); @@ -910,7 +928,11 @@ ReportPages ReportEnginePrivate::renderToPages() scriptContext()->baseDesignIntfToScript(page->pageItem()->objectName(), page->pageItem()); } + scriptContext()->qobjectToScript("engine",this); + if (m_scriptEngineContext->runInitScript()){ + + activateLanguage(m_reportLanguage); emit renderStarted(); foreach(PageDesignIntf* page , m_pages){ diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 5167bc6..4bda29d 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -67,6 +67,8 @@ class ReportEnginePrivate : public QObject, public ICollectionContainer, public public: static void printReport(ItemsReaderIntf::Ptr reader, QPrinter &printer); static void printReport(ReportPages pages, QPrinter &printer); + Q_INVOKABLE QStringList aviableReportTranslations(); + Q_INVOKABLE void setReportTranslation(const QString& languageName); public: explicit ReportEnginePrivate(QObject *parent = 0); virtual ~ReportEnginePrivate(); diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 9fc11f3..6ee0689 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -819,6 +819,10 @@ ScriptEngineManager::ScriptEngineManager() m_scriptEngine = new ScriptEngineType; m_functionManager = new ScriptFunctionsManager(this); m_functionManager->setScriptEngineManager(this); +#ifndef USE_QJSENGINE + m_scriptEngine->setDefaultPrototype(qMetaTypeId(), + m_scriptEngine->newQObject(new ComboBoxPrototype())); +#endif createLineFunction(); createNumberFomatFunction(); @@ -1238,7 +1242,6 @@ void ScriptEngineContext::baseDesignIntfToScript(const QString& pageName, BaseDe ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); #ifdef USE_QJSENGINE - //sItem = engine->newQObject(item); ScriptValueType sItem = getCppOwnedJSValue(*engine, item); engine->globalObject().setProperty(pageName+"_"+item->patternName(), sItem); #else @@ -1247,7 +1250,7 @@ void ScriptEngineContext::baseDesignIntfToScript(const QString& pageName, BaseDe engine->newQObject(sItem, item); } else { sItem = engine->newQObject(item); - engine->globalObject().setProperty(item->patternName(),sItem); + engine->globalObject().setProperty(pageName+"_"+item->patternName(),sItem); } #endif foreach(BaseDesignIntf* child, item->childBaseItems()){ @@ -1256,6 +1259,23 @@ void ScriptEngineContext::baseDesignIntfToScript(const QString& pageName, BaseDe } } +void ScriptEngineContext::qobjectToScript(const QString& name, QObject *item) +{ + ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); +#ifdef USE_QJSENGINE + ScriptValueType sItem = getCppOwnedJSValue(*engine, item); + engine->globalObject().setProperty(name, sItem); +#else + ScriptValueType sItem = engine->globalObject().property(name); + if (sItem.isValid()){ + engine->newQObject(sItem, item); + } else { + sItem = engine->newQObject(item); + engine->globalObject().setProperty(name,sItem); + } +#endif +} + #ifdef HAVE_UI_LOADER #ifdef USE_QJSENGINE @@ -1502,7 +1522,10 @@ void ScriptFunctionsManager::clearTableOfContens() scriptEngineManager()->clearTableOfContens(); } + + #ifdef USE_QJSENGINE + QFont ScriptFunctionsManager::font(const QString &family, int pointSize, bool bold, bool italic, bool underLine) { QFont result (family, pointSize); @@ -1511,6 +1534,45 @@ QFont ScriptFunctionsManager::font(const QString &family, int pointSize, bool bo result.setUnderline(underLine); return result; } + +void ScriptFunctionsManager::addItemsToComboBox(QJSValue object, const QStringList &values) +{ + QComboBox* comboBox = dynamic_cast(object.toQObject()); + if (comboBox){ + comboBox->addItems(values); + } +} + +void ScriptFunctionsManager::addItemToComboBox(QJSValue object, const QString &value) +{ + QComboBox* comboBox = dynamic_cast(object.toQObject()); + if (comboBox){ + comboBox->addItem(value); + } +} + +QJSValue ScriptFunctionsManager::createComboBoxWrapper(QJSValue comboBox) +{ + QComboBox* item = dynamic_cast(comboBox.toQObject()); + if (item){ + ComboBoxWrapper* wrapper = new ComboBoxWrapper(item); + return m_scriptEngineManager->scriptEngine()->newQObject(wrapper); + } + return QJSValue(); +} + +QJSValue ScriptFunctionsManager::createWrapper(QJSValue item) +{ + QObject* object = item.toQObject(); + if (object){ + IWrapperCreator* wrapper = m_wrappersFactory.value(object->metaObject()->className()); + if (wrapper){ + return m_scriptEngineManager->scriptEngine()->newQObject(wrapper->createWrapper(item.toQObject())); + } + } + return QJSValue(); +} + #endif QFont ScriptFunctionsManager::font(QVariantMap params){ if (!params.contains("family")){ @@ -1606,5 +1668,36 @@ void LimeReport::TableOfContens::clear(){ } +#ifdef USE_QJSENGINE + +QObject* ComboBoxWrapperCreator::createWrapper(QObject *item) +{ + QComboBox* comboBox = dynamic_cast(item); + if (comboBox){ + return new ComboBoxWrapper(comboBox); + } + return 0; +} + +#endif + +#ifndef USE_QJSENGINE +void ComboBoxPrototype::addItem(const QString &text) +{ + QComboBox* comboBox = qscriptvalue_cast(thisObject()); + if (comboBox){ + comboBox->addItem(text); + } +} + +void ComboBoxPrototype::addItems(const QStringList &texts) +{ + QComboBox* comboBox = qscriptvalue_cast(thisObject()); + if (comboBox){ + comboBox->addItems(texts); + } +} +#endif + } //namespace LimeReport diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 717a693..162a21e 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -38,7 +38,7 @@ #include #include #include - +#include //#include @@ -183,6 +183,7 @@ public: void initDialogs(); #endif void baseDesignIntfToScript(const QString& pageName, BaseDesignIntf *item); + void qobjectToScript(const QString &name, QObject* item); void clear(); QString initScript() const; void setInitScript(const QString& initScript); @@ -262,10 +263,48 @@ private: QString m_scriptWrapper; }; + +#ifndef USE_QJSENGINE +class ComboBoxPrototype : public QObject, public QScriptable{ + Q_OBJECT +public: + ComboBoxPrototype(QObject* parent = 0):QObject(parent){} +public slots: + void addItem( const QString& text); + void addItems(const QStringList& texts); +}; +#endif + +#ifdef USE_QJSENGINE + +class IWrapperCreator{ +public: + virtual QObject* createWrapper(QObject* item) = 0; + virtual ~IWrapperCreator(){} +}; + +class ComboBoxWrapper : public QObject{ + Q_OBJECT +public: + ComboBoxWrapper(QComboBox* comboBox, QObject* parent = 0) : QObject(parent), m_comboBox(comboBox){} + Q_INVOKABLE void addItems(const QStringList& texts){ m_comboBox->addItems(texts);} + Q_INVOKABLE void addItem(const QString& text){ m_comboBox->addItem(text);} +private: + QComboBox* m_comboBox; +}; + +class ComboBoxWrapperCreator: public IWrapperCreator{ +private: + QObject* createWrapper(QObject* item); +}; + +#endif + class ScriptFunctionsManager : public QObject{ Q_OBJECT public: - explicit ScriptFunctionsManager(QObject* parent = 0):QObject(parent){} + explicit ScriptFunctionsManager(QObject* parent = 0):QObject(parent){ m_wrappersFactory.insert("QComboBox",new ComboBoxWrapperCreator());} + ~ScriptFunctionsManager(){ foreach(IWrapperCreator* wrapper, m_wrappersFactory.values()){ delete wrapper;} m_wrappersFactory.clear();} Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName); Q_INVOKABLE QVariant line(const QString& bandName); Q_INVOKABLE QVariant numberFormat(QVariant value, const char &format, int precision, const QString &locale); @@ -283,8 +322,13 @@ public: Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} Q_INVOKABLE void addTableOfContensItem(const QString& uniqKey, const QString& content, int indent = 0); Q_INVOKABLE void clearTableOfContens(); + #ifdef USE_QJSENGINE Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); + Q_INVOKABLE void addItemsToComboBox(QJSValue object, const QStringList& values); + Q_INVOKABLE void addItemToComboBox(QJSValue object, const QString& value); + Q_INVOKABLE QJSValue createComboBoxWrapper(QJSValue comboBox); + Q_INVOKABLE QJSValue createWrapper(QJSValue item); #endif Q_INVOKABLE QFont font(QVariantMap params); ScriptEngineManager *scriptEngineManager() const; @@ -292,6 +336,7 @@ public: static QColor createQColor(const QString& color){ return QColor(color);} private: ScriptEngineManager* m_scriptEngineManager; + QMap m_wrappersFactory; }; class ScriptEngineManager : public QObject, public Singleton, public IScriptEngineManager @@ -435,4 +480,9 @@ public: }; } + +#ifndef USE_QJSENGINE +Q_DECLARE_METATYPE(LimeReport::ComboBoxPrototype*); +#endif + #endif // LRSCRIPTENGINEMANAGER_H From ba828a984f379b3293d97ded2d43e3b99947ee12 Mon Sep 17 00:00:00 2001 From: Rodrigo Torres Date: Mon, 4 Sep 2017 00:44:16 -0300 Subject: [PATCH 047/347] Update zint --- 3rdparty/3rdparty.pro | 11 +- 3rdparty/zint-2.6.1/COPYING | 674 + 3rdparty/zint-2.6.1/backend/2of5.c | 357 + 3rdparty/zint-2.6.1/backend/CMakeLists.txt | 31 + 3rdparty/zint-2.6.1/backend/DEVELOPER | 133 + 3rdparty/zint-2.6.1/backend/LICENSE | 13 + 3rdparty/zint-2.6.1/backend/auspost.c | 254 + 3rdparty/zint-2.6.1/backend/aztec.c | 1681 ++ 3rdparty/zint-2.6.1/backend/aztec.h | 145 + 3rdparty/zint-2.6.1/backend/bmp.c | 147 + 3rdparty/zint-2.6.1/backend/bmp.h | 76 + 3rdparty/zint-2.6.1/backend/codablock.c | 1008 + 3rdparty/zint-2.6.1/backend/code.c | 591 + 3rdparty/zint-2.6.1/backend/code1.c | 1765 ++ 3rdparty/zint-2.6.1/backend/code1.h | 102 + 3rdparty/zint-2.6.1/backend/code128.c | 1088 + 3rdparty/zint-2.6.1/backend/code16k.c | 733 + 3rdparty/zint-2.6.1/backend/code49.c | 345 + 3rdparty/zint-2.6.1/backend/code49.h | 558 + 3rdparty/zint-2.6.1/backend/common.c | 317 + 3rdparty/zint-2.6.1/backend/common.h | 79 + 3rdparty/zint-2.6.1/backend/composite.c | 1872 ++ 3rdparty/zint-2.6.1/backend/composite.h | 73 + 3rdparty/zint-2.6.1/backend/dllversion.c | 31 + 3rdparty/zint-2.6.1/backend/dmatrix.c | 1318 + 3rdparty/zint-2.6.1/backend/dmatrix.h | 237 + 3rdparty/zint-2.6.1/backend/dotcode.c | 1463 + 3rdparty/zint-2.6.1/backend/eci.c | 309 + 3rdparty/zint-2.6.1/backend/eci.h | 252 + 3rdparty/zint-2.6.1/backend/emf.c | 1222 + 3rdparty/zint-2.6.1/backend/emf.h | 216 + 3rdparty/zint-2.6.1/backend/font.h | 419 + 3rdparty/zint-2.6.1/backend/gb18030.h | 23324 ++++++++++++++++ 3rdparty/zint-2.6.1/backend/gb2312.h | 7478 +++++ 3rdparty/zint-2.6.1/backend/gif.c | 402 + 3rdparty/zint-2.6.1/backend/gridmtx.c | 1208 + 3rdparty/zint-2.6.1/backend/gridmtx.h | 184 + 3rdparty/zint-2.6.1/backend/gs1.c | 358 + 3rdparty/zint-2.6.1/backend/gs1.h | 46 + 3rdparty/zint-2.6.1/backend/hanxin.c | 1576 ++ 3rdparty/zint-2.6.1/backend/hanxin.h | 460 + 3rdparty/zint-2.6.1/backend/imail.c | 605 + 3rdparty/zint-2.6.1/backend/large.c | 191 + 3rdparty/zint-2.6.1/backend/large.h | 50 + 3rdparty/zint-2.6.1/backend/library.c | 1312 + 3rdparty/zint-2.6.1/backend/libzint.rc | 42 + 3rdparty/zint-2.6.1/backend/maxicode.c | 733 + 3rdparty/zint-2.6.1/backend/maxicode.h | 104 + 3rdparty/zint-2.6.1/backend/medical.c | 306 + 3rdparty/zint-2.6.1/backend/ms_stdint.h | 234 + 3rdparty/zint-2.6.1/backend/pcx.c | 172 + 3rdparty/zint-2.6.1/backend/pcx.h | 76 + 3rdparty/zint-2.6.1/backend/pdf417.c | 1296 + 3rdparty/zint-2.6.1/backend/pdf417.h | 514 + 3rdparty/zint-2.6.1/backend/plessey.c | 492 + 3rdparty/zint-2.6.1/backend/png.c | 191 + 3rdparty/zint-2.6.1/backend/postal.c | 621 + 3rdparty/zint-2.6.1/backend/ps.c | 974 + 3rdparty/zint-2.6.1/backend/qr.c | 2983 ++ 3rdparty/zint-2.6.1/backend/qr.h | 167 + 3rdparty/zint-2.6.1/backend/raster.c | 1138 + 3rdparty/zint-2.6.1/backend/reedsol.c | 164 + 3rdparty/zint-2.6.1/backend/reedsol.h | 50 + 3rdparty/zint-2.6.1/backend/render.c | 778 + 3rdparty/zint-2.6.1/backend/rss.c | 2307 ++ 3rdparty/zint-2.6.1/backend/rss.h | 298 + 3rdparty/zint-2.6.1/backend/sjis.h | 6886 +++++ 3rdparty/zint-2.6.1/backend/stdint_msvc.h | 52 + 3rdparty/zint-2.6.1/backend/svg.c | 679 + 3rdparty/zint-2.6.1/backend/telepen.c | 167 + 3rdparty/zint-2.6.1/backend/tif.c | 289 + 3rdparty/zint-2.6.1/backend/tif.h | 87 + 3rdparty/zint-2.6.1/backend/upcean.c | 936 + 3rdparty/zint-2.6.1/backend/zint.h | 283 + 3rdparty/zint-2.6.1/backend_qt/CMakeLists.txt | 21 + 3rdparty/zint-2.6.1/backend_qt/backend_qt.pro | 120 + .../zint-2.6.1/backend_qt/backend_vc8.pro | 71 + 3rdparty/zint-2.6.1/backend_qt/qzint.cpp | 692 + 3rdparty/zint-2.6.1/backend_qt/qzint.h | 128 + 3rdparty/zint-2.6.1/backend_qt/readme | 9 + common.pri | 2 +- limereport/limereport.pro | 4 +- 82 files changed, 78771 insertions(+), 9 deletions(-) create mode 100644 3rdparty/zint-2.6.1/COPYING create mode 100644 3rdparty/zint-2.6.1/backend/2of5.c create mode 100644 3rdparty/zint-2.6.1/backend/CMakeLists.txt create mode 100644 3rdparty/zint-2.6.1/backend/DEVELOPER create mode 100644 3rdparty/zint-2.6.1/backend/LICENSE create mode 100644 3rdparty/zint-2.6.1/backend/auspost.c create mode 100644 3rdparty/zint-2.6.1/backend/aztec.c create mode 100644 3rdparty/zint-2.6.1/backend/aztec.h create mode 100644 3rdparty/zint-2.6.1/backend/bmp.c create mode 100644 3rdparty/zint-2.6.1/backend/bmp.h create mode 100644 3rdparty/zint-2.6.1/backend/codablock.c create mode 100644 3rdparty/zint-2.6.1/backend/code.c create mode 100644 3rdparty/zint-2.6.1/backend/code1.c create mode 100644 3rdparty/zint-2.6.1/backend/code1.h create mode 100644 3rdparty/zint-2.6.1/backend/code128.c create mode 100644 3rdparty/zint-2.6.1/backend/code16k.c create mode 100644 3rdparty/zint-2.6.1/backend/code49.c create mode 100644 3rdparty/zint-2.6.1/backend/code49.h create mode 100644 3rdparty/zint-2.6.1/backend/common.c create mode 100644 3rdparty/zint-2.6.1/backend/common.h create mode 100644 3rdparty/zint-2.6.1/backend/composite.c create mode 100644 3rdparty/zint-2.6.1/backend/composite.h create mode 100644 3rdparty/zint-2.6.1/backend/dllversion.c create mode 100644 3rdparty/zint-2.6.1/backend/dmatrix.c create mode 100644 3rdparty/zint-2.6.1/backend/dmatrix.h create mode 100644 3rdparty/zint-2.6.1/backend/dotcode.c create mode 100644 3rdparty/zint-2.6.1/backend/eci.c create mode 100644 3rdparty/zint-2.6.1/backend/eci.h create mode 100644 3rdparty/zint-2.6.1/backend/emf.c create mode 100644 3rdparty/zint-2.6.1/backend/emf.h create mode 100644 3rdparty/zint-2.6.1/backend/font.h create mode 100644 3rdparty/zint-2.6.1/backend/gb18030.h create mode 100644 3rdparty/zint-2.6.1/backend/gb2312.h create mode 100644 3rdparty/zint-2.6.1/backend/gif.c create mode 100644 3rdparty/zint-2.6.1/backend/gridmtx.c create mode 100644 3rdparty/zint-2.6.1/backend/gridmtx.h create mode 100644 3rdparty/zint-2.6.1/backend/gs1.c create mode 100644 3rdparty/zint-2.6.1/backend/gs1.h create mode 100644 3rdparty/zint-2.6.1/backend/hanxin.c create mode 100644 3rdparty/zint-2.6.1/backend/hanxin.h create mode 100644 3rdparty/zint-2.6.1/backend/imail.c create mode 100644 3rdparty/zint-2.6.1/backend/large.c create mode 100644 3rdparty/zint-2.6.1/backend/large.h create mode 100644 3rdparty/zint-2.6.1/backend/library.c create mode 100644 3rdparty/zint-2.6.1/backend/libzint.rc create mode 100644 3rdparty/zint-2.6.1/backend/maxicode.c create mode 100644 3rdparty/zint-2.6.1/backend/maxicode.h create mode 100644 3rdparty/zint-2.6.1/backend/medical.c create mode 100644 3rdparty/zint-2.6.1/backend/ms_stdint.h create mode 100644 3rdparty/zint-2.6.1/backend/pcx.c create mode 100644 3rdparty/zint-2.6.1/backend/pcx.h create mode 100644 3rdparty/zint-2.6.1/backend/pdf417.c create mode 100644 3rdparty/zint-2.6.1/backend/pdf417.h create mode 100644 3rdparty/zint-2.6.1/backend/plessey.c create mode 100644 3rdparty/zint-2.6.1/backend/png.c create mode 100644 3rdparty/zint-2.6.1/backend/postal.c create mode 100644 3rdparty/zint-2.6.1/backend/ps.c create mode 100644 3rdparty/zint-2.6.1/backend/qr.c create mode 100644 3rdparty/zint-2.6.1/backend/qr.h create mode 100644 3rdparty/zint-2.6.1/backend/raster.c create mode 100644 3rdparty/zint-2.6.1/backend/reedsol.c create mode 100644 3rdparty/zint-2.6.1/backend/reedsol.h create mode 100644 3rdparty/zint-2.6.1/backend/render.c create mode 100644 3rdparty/zint-2.6.1/backend/rss.c create mode 100644 3rdparty/zint-2.6.1/backend/rss.h create mode 100644 3rdparty/zint-2.6.1/backend/sjis.h create mode 100644 3rdparty/zint-2.6.1/backend/stdint_msvc.h create mode 100644 3rdparty/zint-2.6.1/backend/svg.c create mode 100644 3rdparty/zint-2.6.1/backend/telepen.c create mode 100644 3rdparty/zint-2.6.1/backend/tif.c create mode 100644 3rdparty/zint-2.6.1/backend/tif.h create mode 100644 3rdparty/zint-2.6.1/backend/upcean.c create mode 100644 3rdparty/zint-2.6.1/backend/zint.h create mode 100644 3rdparty/zint-2.6.1/backend_qt/CMakeLists.txt create mode 100644 3rdparty/zint-2.6.1/backend_qt/backend_qt.pro create mode 100644 3rdparty/zint-2.6.1/backend_qt/backend_vc8.pro create mode 100644 3rdparty/zint-2.6.1/backend_qt/qzint.cpp create mode 100644 3rdparty/zint-2.6.1/backend_qt/qzint.h create mode 100644 3rdparty/zint-2.6.1/backend_qt/readme diff --git a/3rdparty/3rdparty.pro b/3rdparty/3rdparty.pro index 7630102..75d28ff 100644 --- a/3rdparty/3rdparty.pro +++ b/3rdparty/3rdparty.pro @@ -1,6 +1,5 @@ -ZINT_PATH = $$PWD/zint-2.4.4/ -ZINT_VERSION = 2.4.4 -INCLUDEPATH += $${ZINT_PATH}/backend $${ZINT_PATH}/backend_qt4 -DEPENDPATH += $${ZINT_PATH}/backend $${ZINT_PATH}/backend_qt4 -include($${ZINT_PATH}/backend_qt4/Zint.pro) - +ZINT_PATH = $$PWD/zint-2.6.1/ +ZINT_VERSION = 2.6.1 +INCLUDEPATH += $${ZINT_PATH}/backend $${ZINT_PATH}/backend_qt +DEPENDPATH += $${ZINT_PATH}/backend $${ZINT_PATH}/backend_qt +include($${ZINT_PATH}/backend_qt/backend_qt.pro) diff --git a/3rdparty/zint-2.6.1/COPYING b/3rdparty/zint-2.6.1/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/3rdparty/zint-2.6.1/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/3rdparty/zint-2.6.1/backend/2of5.c b/3rdparty/zint-2.6.1/backend/2of5.c new file mode 100644 index 0000000..60010b8 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/2of5.c @@ -0,0 +1,357 @@ +/* 2of5.c - Handles Code 2 of 5 barcodes */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include "common.h" +#ifdef _MSC_VER +#include +#define inline _inline +#endif + +static const char *C25MatrixTable[10] = { + "113311", "311131", "131131", "331111", "113131", "313111", + "133111", "111331", "311311", "131311" +}; + +static const char *C25IndustTable[10] = { + "1111313111", "3111111131", "1131111131", "3131111111", "1111311131", + "3111311111", "1131311111", "1111113131", "3111113111", "1131113111" +}; + +static const char *C25InterTable[10] = { + "11331", "31113", "13113", "33111", "11313", "31311", "13311", "11133", + "31131", "13131" +}; + +static inline char check_digit(unsigned int count) { + return itoc((10 - (count % 10)) % 10); +} + +/* Code 2 of 5 Standard (Code 2 of 5 Matrix) */ +int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) { + + int i, error_number; + char dest[512]; /* 6 + 80 * 6 + 6 + 1 ~ 512*/ + + if (length > 80) { + strcpy(symbol->errtxt, "301: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "302: Invalid characters in data"); + return error_number; + } + + /* start character */ + strcpy(dest, "411111"); + + for (i = 0; i < length; i++) { + lookup(NEON, C25MatrixTable, source[i], dest); + } + + /* Stop character */ + strcat(dest, "41111"); + + expand(symbol, dest); + ustrcpy(symbol->text, source); + return error_number; +} + +/* Code 2 of 5 Industrial */ +int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) { + + int i, error_number; + char dest[512]; /* 6 + 40 * 10 + 6 + 1 */ + + if (length > 45) { + strcpy(symbol->errtxt, "303: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "304: Invalid character in data"); + return error_number; + } + + /* start character */ + strcpy(dest, "313111"); + + for (i = 0; i < length; i++) { + lookup(NEON, C25IndustTable, source[i], dest); + } + + /* Stop character */ + strcat(dest, "31113"); + + expand(symbol, dest); + ustrcpy(symbol->text, source); + return error_number; +} + +/* Code 2 of 5 IATA */ +int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, error_number; + char dest[512]; /* 4 + 45 * 10 + 3 + 1 */ + + if (length > 45) { + strcpy(symbol->errtxt, "305: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "306: Invalid characters in data"); + return error_number; + } + + /* start */ + strcpy(dest, "1111"); + + for (i = 0; i < length; i++) { + lookup(NEON, C25IndustTable, source[i], dest); + } + + /* stop */ + strcat(dest, "311"); + + expand(symbol, dest); + ustrcpy(symbol->text, source); + return error_number; +} + +/* Code 2 of 5 Data Logic */ +int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) { + + int i, error_number; + char dest[512]; /* 4 + 80 * 6 + 3 + 1 */ + + if (length > 80) { + strcpy(symbol->errtxt, "307: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "308: Invalid characters in data"); + return error_number; + } + + /* start character */ + strcpy(dest, "1111"); + + for (i = 0; i < length; i++) { + lookup(NEON, C25MatrixTable, source[i], dest); + } + + /* Stop character */ + strcat(dest, "311"); + + expand(symbol, dest); + ustrcpy(symbol->text, source); + return error_number; +} + +/* Code 2 of 5 Interleaved */ +int interleaved_two_of_five(struct zint_symbol *symbol, const unsigned char source[], size_t length) { + + int i, j, k, error_number; + char bars[7], spaces[7], mixed[14], dest[1000]; +#ifndef _MSC_VER + unsigned char temp[length + 2]; +#else + unsigned char* temp = (unsigned char *) _alloca((length + 2) * sizeof (unsigned char)); +#endif + + if (length > 89) { + strcpy(symbol->errtxt, "309: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "310: Invalid characters in data"); + return error_number; + } + + ustrcpy(temp, (unsigned char *) ""); + /* Input must be an even number of characters for Interlaced 2 of 5 to work: + if an odd number of characters has been entered then add a leading zero */ + if (length & 1) { + ustrcpy(temp, (unsigned char *) "0"); + length++; + } + strcat((char*) temp, (char*) source); + + /* start character */ + strcpy(dest, "1111"); + + for (i = 0; i < length; i += 2) { + /* look up the bars and the spaces and put them in two strings */ + strcpy(bars, ""); + lookup(NEON, C25InterTable, temp[i], bars); + strcpy(spaces, ""); + lookup(NEON, C25InterTable, temp[i + 1], spaces); + + /* then merge (interlace) the strings together */ + k = 0; + for (j = 0; j <= 4; j++) { + mixed[k] = bars[j]; + k++; + mixed[k] = spaces[j]; + k++; + } + mixed[k] = '\0'; + strcat(dest, mixed); + } + + /* Stop character */ + strcat(dest, "311"); + + expand(symbol, dest); + ustrcpy(symbol->text, temp); + return error_number; + +} + +/* Interleaved 2-of-5 (ITF) */ +int itf14(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, error_number, zeroes; + unsigned int count; + char localstr[16]; + + count = 0; + + if (length > 13) { + strcpy(symbol->errtxt, "311: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "312: Invalid character in data"); + return error_number; + } + + /* Add leading zeros as required */ + zeroes = 13 - length; + for (i = 0; i < zeroes; i++) { + localstr[i] = '0'; + } + strcpy(localstr + zeroes, (char *) source); + + /* Calculate the check digit - the same method used for EAN-13 */ + for (i = 12; i >= 0; i--) { + count += ctoi(localstr[i]); + + if (!(i & 1)) { + count += 2 * ctoi(localstr[i]); + } + } + localstr[13] = check_digit(count); + localstr[14] = '\0'; + error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr)); + ustrcpy(symbol->text, (unsigned char*) localstr); + return error_number; +} + +/* Deutshe Post Leitcode */ +int dpleit(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, error_number; + unsigned int count; + char localstr[16]; + int zeroes; + + count = 0; + if (length > 13) { + strcpy(symbol->errtxt, "313: Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "314: Invalid characters in data"); + return error_number; + } + + zeroes = 13 - length; + for (i = 0; i < zeroes; i++) + localstr[i] = '0'; + strcpy(localstr + zeroes, (char *) source); + + for (i = 12; i >= 0; i--) { + count += 4 * ctoi(localstr[i]); + + if (i & 1) { + count += 5 * ctoi(localstr[i]); + } + } + localstr[13] = check_digit(count); + localstr[14] = '\0'; + error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr)); + ustrcpy(symbol->text, (unsigned char*) localstr); + return error_number; +} + +/* Deutsche Post Identcode */ +int dpident(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, error_number, zeroes; + unsigned int count; + char localstr[16]; + + count = 0; + if (length > 11) { + strcpy(symbol->errtxt, "315: Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "316: Invalid characters in data"); + return error_number; + } + + zeroes = 11 - length; + for (i = 0; i < zeroes; i++) + localstr[i] = '0'; + strcpy(localstr + zeroes, (char *) source); + + for (i = 10; i >= 0; i--) { + count += 4 * ctoi(localstr[i]); + + if (i & 1) { + count += 5 * ctoi(localstr[i]); + } + } + localstr[11] = check_digit(count); + localstr[12] = '\0'; + error_number = interleaved_two_of_five(symbol, (unsigned char *) localstr, strlen(localstr)); + ustrcpy(symbol->text, (unsigned char*) localstr); + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/CMakeLists.txt b/3rdparty/zint-2.6.1/backend/CMakeLists.txt new file mode 100644 index 0000000..9de4127 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/CMakeLists.txt @@ -0,0 +1,31 @@ +# (c) 2008 by BogDan Vatra < bogdan@licentia.eu > + +project(zint) + +find_package(PNG) + +set(zint_COMMON_SRCS common.c library.c render.c large.c reedsol.c gs1.c eci.c) +set(zint_ONEDIM_SRCS code.c code128.c 2of5.c upcean.c telepen.c medical.c plessey.c rss.c) +set(zint_POSTAL_SRCS postal.c auspost.c imail.c) +set(zint_TWODIM_SRCS code16k.c codablock.c dmatrix.c pdf417.c qr.c maxicode.c composite.c aztec.c code49.c code1.c gridmtx.c hanxin.c dotcode.c) +set(zint_OUTPUT_SRCS render.c ps.c svg.c emf.c bmp.c pcx.c gif.c png.c tif.c raster.c) +set(zint_SRCS ${zint_OUTPUT_SRCS} ${zint_COMMON_SRCS} ${zint_ONEDIM_SRCS} ${zint_POSTAL_SRCS} ${zint_TWODIM_SRCS}) + +if(PNG_FOUND) + include_directories( ${PNG_INCLUDES} ) +else(PNG_FOUND) + add_definitions (-DNO_PNG) +endif(PNG_FOUND) + +add_library(zint SHARED ${zint_SRCS}) + +set_target_properties(zint PROPERTIES SOVERSION "${ZINT_VERSION_MAJOR}.${ZINT_VERSION_MINOR}" + VERSION ${ZINT_VERSION}) + +if(PNG_FOUND) + target_link_libraries(zint ${PNG_LIBRARIES} ) +endif(PNG_FOUND) +target_link_libraries(zint -lm) + +install(TARGETS zint ${INSTALL_TARGETS_DEFAULT_ARGS} ) +install(FILES zint.h DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel) diff --git a/3rdparty/zint-2.6.1/backend/DEVELOPER b/3rdparty/zint-2.6.1/backend/DEVELOPER new file mode 100644 index 0000000..478c78a --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/DEVELOPER @@ -0,0 +1,133 @@ +Contents +-------- + +Here is a guide to which bit of source code does what. + +2of5.c: + Matrix 2 of 5 + Industrial 2 of 5 + IATA 2 of 5 + Data Logic + Interleaved 2 of 5 + ITF-14 + Deutche Post Leitcode + Deutche Post Identcode + +auspost.c: + Australia Post Standard Customer Barcode + Australia Post Customer Barcode 2 + Australia Post Customer Barcode 3 + Australia Post Reply Paid Barcode + Australia Post Routing Barcode + Australia Post Redirect Barcode + +aztec.c: + Aztec Code + Compact Aztec Code + Aztec Runes + +blockf.c: + Codablock-F + +code128.c: + Code 128 + Code 128 Subset B + NVE-18 + GS1-128 (UCC/EAN-128) + EAN-14 + +code16k.c: + Code 16k + +code.c: + Code 11 + Code 39 + Pharmazentral Nummer (PZN) + Extended Code 39 (Code 39+) + Code 93 + LOGMARS + Channel Code + +code1.c: + Code One + +code49.c: + Code 49 + +composite.c: + CC-A Composite Symbology + CC-B Composite Symbology + CC-C Composite Symbology + +dotcode.c: + Dot Code + +dm200.c: + Data Matrix ECC 200 + +gridmtx.c: + Grid Matrix + +hanxin.c: + Han Xin Code + +imail.c: + USPS OneCode (Intelligent Mail) + +maxicode.c: + UPS Maxicode + +medical.c: + Pharma Code + Two Track Pharma Code + Codabar + Code 32 + +pdf417.c: + PDF417 + Truncated PDF417 + MicroPDF417 + +plessey.c: + UK Plessey Code (bidirectional) + MSI Plessey + +postal.c: + PostNet + PLANET + Facing Identification Mark (FIM) + Royal Mail 4-State Country Code (RM4SCC) + KIX Code + DAFT Code + Flattermarken + Korean Postal Code + Japanese Postal Code + +qr.c: + QR Code + Micro QR Code + UPNQR + +rss.c: + GS1 DataBar (DataBar-14) (RSS-14) + GS1 DataBar Stacked (RSS-14 Stacked) + GS1 DataBar Stacked Omnidirectional (DataBar-14 Stacked Omnidirectional) + (RSS-14 Stacked Omnidirectional) + GS1 DataBar Limited (RSS Limited) + GS1 DataBar Expanded (RSS Expanded) + GS1 DataBar Expanded Stacked (RSS Expanded Stacked) + +telepen.c: + Telepen ASCII + Telepen Numeric + +upcean.c: + UPC-A + UPC-E + EAN-2 add-on + EAN-5 add-on + EAN-8 + EAN-13 + SBN (verification) + ISBN (verification) + ISBN-13 (verification) \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/LICENSE b/3rdparty/zint-2.6.1/backend/LICENSE new file mode 100644 index 0000000..723ef63 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/LICENSE @@ -0,0 +1,13 @@ +ZINT was originally developed by Robin Stuart and licensed under the terms of the GPL (Gnu +Public License). In 2013 Robin Stuart and all developers that contributed to the code agreed +to change the license to a less restrictive one (see ZINT mailing list of May 2013 for +related mails) under the following conditions: +- the names of original copyright holder Robin Stuart and contributors are not removed, + neither from sources nor from the manual +- the documentation is done in British English (as Robin said: "Oh, and please don't + replace the word "colour" with "color" in the documentation - that really annoys me!") + +Change to BSD-license is done for backend and therefore for ZINT shared library only, for +the frontends and Qt4-backend the GPL is still valid. Since BSD-license is GPL-compatible +this gives the possibility to include ZINT library in own products or link against it from +own software. diff --git a/3rdparty/zint-2.6.1/backend/auspost.c b/3rdparty/zint-2.6.1/backend/auspost.c new file mode 100644 index 0000000..35438a7 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/auspost.c @@ -0,0 +1,254 @@ +/* auspost.c - Handles Australia Post 4-State Barcode */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#define GDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz #" + +static const char *AusNTable[10] = { + "00", "01", "02", "10", "11", "12", "20", "21", "22", "30" +}; + +static const char *AusCTable[64] = { + "222", "300", "301", "302", "310", "311", "312", "320", "321", "322", + "000", "001", "002", "010", "011", "012", "020", "021", "022", "100", "101", "102", "110", + "111", "112", "120", "121", "122", "200", "201", "202", "210", "211", "212", "220", "221", + "023", "030", "031", "032", "033", "103", "113", "123", "130", "131", "132", "133", "203", + "213", "223", "230", "231", "232", "233", "303", "313", "323", "330", "331", "332", "333", + "003", "013" +}; + +static const char *AusBarTable[64] = { + "000", "001", "002", "003", "010", "011", "012", "013", "020", "021", + "022", "023", "030", "031", "032", "033", "100", "101", "102", "103", "110", "111", "112", + "113", "120", "121", "122", "123", "130", "131", "132", "133", "200", "201", "202", "203", + "210", "211", "212", "213", "220", "221", "222", "223", "230", "231", "232", "233", "300", + "301", "302", "303", "310", "311", "312", "313", "320", "321", "322", "323", "330", "331", + "332", "333" +}; + +#include +#include +#include +#include "common.h" +#include "reedsol.h" +#ifdef _MSC_VER +#define inline _inline +#endif + +static inline char convert_pattern(char data, int shift) { + return (data - '0') << shift; +} + +/* Adds Reed-Solomon error correction to auspost */ +void rs_error(char data_pattern[]) { + size_t reader, triple_writer = 0; + char triple[31], inv_triple[31]; + unsigned char result[5]; + + for (reader = 2; reader < strlen(data_pattern); reader += 3, triple_writer++) { + triple[triple_writer] = convert_pattern(data_pattern[reader], 4) + + convert_pattern(data_pattern[reader + 1], 2) + + convert_pattern(data_pattern[reader + 2], 0); + } + + for (reader = 0; reader < triple_writer; reader++) { + inv_triple[reader] = triple[(triple_writer - 1) - reader]; + } + + rs_init_gf(0x43); + rs_init_code(4, 1); + rs_encode(triple_writer, (unsigned char*) inv_triple, result); + + for (reader = 4; reader > 0; reader--) { + strcat(data_pattern, AusBarTable[(int) result[reader - 1]]); + } + rs_free(); +} + +/* Handles Australia Posts's 4 State Codes */ +int australia_post(struct zint_symbol *symbol, unsigned char source[], int length) { + /* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically + (i.e. the FCC doesn't need to be specified by the user) dependent + on the length of the input string */ + + /* The contents of data_pattern conform to the following standard: + 0 = Tracker, Ascender and Descender + 1 = Tracker and Ascender + 2 = Tracker and Descender + 3 = Tracker only */ + int error_number, zeroes; + int writer; + unsigned int loopey, reader; + size_t h; + + char data_pattern[200]; + char fcc[3] = {0, 0, 0}, dpid[10]; + char localstr[30]; + + error_number = 0; + strcpy(localstr, ""); + + /* Do all of the length checking first to avoid stack smashing */ + if (symbol->symbology == BARCODE_AUSPOST) { + /* Format control code (FCC) */ + switch (length) { + case 8: + strcpy(fcc, "11"); + break; + case 13: + strcpy(fcc, "59"); + break; + case 16: + strcpy(fcc, "59"); + error_number = is_sane(NEON, source, length); + break; + case 18: + strcpy(fcc, "62"); + break; + case 23: + strcpy(fcc, "62"); + error_number = is_sane(NEON, source, length); + break; + default: + strcpy(symbol->errtxt, "401: Auspost input is wrong length"); + return ZINT_ERROR_TOO_LONG; + } + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "402: Invalid characters in data"); + return error_number; + } + } else { + if (length > 8) { + strcpy(symbol->errtxt, "403: Auspost input is too long"); + return ZINT_ERROR_TOO_LONG; + } + switch (symbol->symbology) { + case BARCODE_AUSREPLY: strcpy(fcc, "45"); + break; + case BARCODE_AUSROUTE: strcpy(fcc, "87"); + break; + case BARCODE_AUSREDIRECT: strcpy(fcc, "92"); + break; + } + + /* Add leading zeros as required */ + zeroes = 8 - length; + memset(localstr, '0', zeroes); + localstr[8] = '\0'; + } + + strcat(localstr, (char*) source); + h = strlen(localstr); + error_number = is_sane(GDSET, (unsigned char *) localstr, h); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "404: Invalid characters in data"); + return error_number; + } + + /* Verifiy that the first 8 characters are numbers */ + memcpy(dpid, localstr, 8); + dpid[8] = '\0'; + error_number = is_sane(NEON, (unsigned char *) dpid, strlen(dpid)); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "405: Invalid characters in DPID"); + return error_number; + } + + /* Start character */ + strcpy(data_pattern, "13"); + + /* Encode the FCC */ + for (reader = 0; reader < 2; reader++) { + lookup(NEON, AusNTable, fcc[reader], data_pattern); + } + + /* printf("AUSPOST FCC: %s ", fcc); */ + + /* Delivery Point Identifier (DPID) */ + for (reader = 0; reader < 8; reader++) { + lookup(NEON, AusNTable, dpid[reader], data_pattern); + } + + /* Customer Information */ + if (h > 8) { + if ((h == 13) || (h == 18)) { + for (reader = 8; reader < h; reader++) { + lookup(GDSET, AusCTable, localstr[reader], data_pattern); + } + } else if ((h == 16) || (h == 23)) { + for (reader = 8; reader < h; reader++) { + lookup(NEON, AusNTable, localstr[reader], data_pattern); + } + } + } + + /* Filler bar */ + h = strlen(data_pattern); + switch (h) { + case 22: + case 37: + case 52: + strcat(data_pattern, "3"); + break; + default: + break; + } + + /* Reed Solomon error correction */ + rs_error(data_pattern); + + /* Stop character */ + strcat(data_pattern, "13"); + + /* Turn the symbol into a bar pattern ready for plotting */ + writer = 0; + h = strlen(data_pattern); + for (loopey = 0; loopey < h; loopey++) { + if ((data_pattern[loopey] == '1') || (data_pattern[loopey] == '0')) { + set_module(symbol, 0, writer); + } + set_module(symbol, 1, writer); + if ((data_pattern[loopey] == '2') || (data_pattern[loopey] == '0')) { + set_module(symbol, 2, writer); + } + writer += 2; + } + + symbol->row_height[0] = 3; + symbol->row_height[1] = 2; + symbol->row_height[2] = 3; + + symbol->rows = 3; + symbol->width = writer - 1; + + return error_number; +} + diff --git a/3rdparty/zint-2.6.1/backend/aztec.c b/3rdparty/zint-2.6.1/backend/aztec.c new file mode 100644 index 0000000..9b17375 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/aztec.c @@ -0,0 +1,1681 @@ +/* aztec.c - Handles Aztec 2D Symbols */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include "aztec.h" +#include "reedsol.h" + +static int AztecMap[22801]; + +static int count_doubles(const unsigned char source[], const int posn, const size_t src_len) { + int c = 0; + int i = posn; + int cond = 1; + + do { + if (((source[i] == '.') || (source[i] == ',')) && (source[i + 1] == ' ')) { + c++; + } else { + cond = 0; + } + i += 2; + } while ((i < src_len) && cond); + + return c; +} + +static int count_cr(char source[], int posn, int length) { + int c = 0; + int i = posn; + int cond = 1; + + do { + if (source[i] == 13) { + c++; + } else { + cond = 0; + } + i++; + } while ((i < length) && cond); + + return c; +} + +static int count_dotcomma(char source[], int posn, int length) { + int c = 0; + int i = posn; + int cond = 1; + + do { + if ((source[i] == '.') || (source[i] == ',')) { + c++; + } else { + cond = 0; + } + i++; + } while ((i < length) && cond); + + return c; +} + +static int count_spaces(char source[], int posn, int length) { + int c = 0; + int i = posn; + int cond = 1; + + do { + if (source[i] == ' ') { + c++; + } else { + cond = 0; + } + i++; + } while ((i < length) && cond); + + return c; +} + +static char get_next_mode(char encode_mode[], const size_t src_len, const int posn) { + int i = posn; + + do { + i++; + } while ((i < src_len) && (encode_mode[i] == encode_mode[posn])); + if (i >= src_len) { + return 'E'; + } else { + return encode_mode[i]; + } +} + +static int aztec_text_process(const unsigned char source[], const size_t src_len, char binary_string[], const int gs1, const int eci, const int debug) { + + char *encode_mode; + int i, j; + char current_mode; + int count; + char next_mode; + char *reduced_source; + char *reduced_encode_mode; + int reduced_length; + int byte_mode = 0; + + encode_mode=(char*)alloca(src_len); + reduced_source=(char*)alloca(src_len); + reduced_encode_mode=(char*)alloca(src_len); + + if ((!encode_mode) || + (!reduced_source) || + (!reduced_encode_mode)) return -1; + + for (i = 0; i < src_len; i++) { + if (source[i] > 128) { + encode_mode[i] = 'B'; + } else { + encode_mode[i] = AztecModes[(int) source[i]]; + } + } + + // Deal first with letter combinations which can be combined to one codeword + // Combinations are (CR LF) (. SP) (, SP) (: SP) in Punct mode + current_mode = 'U'; + for (i = 0; i < src_len - 1; i++) { + // Combination (CR LF) should always be in Punct mode + if ((source[i] == 13) && (source[i + 1] == 10)) { + encode_mode[i] = 'P'; + encode_mode[i + 1] = 'P'; + } + + // Combination (: SP) should always be in Punct mode + if ((source[i] == ':') && (source[i + 1] == ' ')) { + encode_mode[i + 1] = 'P'; + } + + // Combinations (. SP) and (, SP) sometimes use fewer bits in Digit mode + if (((source[i] == '.') || (source[i] == ',')) && (source[i + 1] == ' ') && (encode_mode[i] == 'X')) { + count = count_doubles(source, i, src_len); + next_mode = get_next_mode(encode_mode, src_len, i); + + if (current_mode == 'U') { + if ((next_mode == 'D') && (count <= 5)) { + for (j = 0; j < (2 * count); j++) { + encode_mode[i + j] = 'D'; + } + } + } + + if (current_mode == 'L') { + if ((next_mode == 'U') && (count == 1)) { + encode_mode[i] = 'D'; + encode_mode[i + 1] = 'D'; + } + if ((next_mode == 'D') && (count <= 4)) { + for (j = 0; j < (2 * count); j++) { + encode_mode[i + j] = 'D'; + } + } + } + + if (current_mode == 'M') { + if ((next_mode == 'D') && (count == 1)) { + encode_mode[i] = 'D'; + encode_mode[i + 1] = 'D'; + } + } + + if (current_mode == 'D') { + if ((next_mode != 'D') && (count <= 4)) { + for (j = 0; j < (2 * count); j++) { + encode_mode[i + j] = 'D'; + } + } + if ((next_mode == 'D') && (count <= 7)) { + for (j = 0; j < (2 * count); j++) { + encode_mode[i + j] = 'D'; + } + } + } + + // Default is Punct mode + if (encode_mode[i] == 'X') { + encode_mode[i] = 'P'; + encode_mode[i + 1] = 'P'; + } + } + + if ((encode_mode[i] != 'X') && (encode_mode[i] != 'B')) { + current_mode = encode_mode[i]; + } + } + + if (debug) { + printf("First Pass:\n"); + for (i = 0; i < src_len; i++) { + printf("%c", encode_mode[i]); + } + printf("\n"); + } + + // Reduce two letter combinations to one codeword marked as [abcd] in Punct mode + i = 0; + j = 0; + do { + if ((source[i] == 13) && (source[i + 1] == 10)) { // CR LF + reduced_source[j] = 'a'; + reduced_encode_mode[j] = encode_mode[i]; + i += 2; + } else if (((source[i] == '.') && (source[i + 1] == ' ')) && (encode_mode[i] == 'P')) { + reduced_source[j] = 'b'; + reduced_encode_mode[j] = encode_mode[i]; + i += 2; + } else if (((source[i] == ',') && (source[i + 1] == ' ')) && (encode_mode[i] == 'P')) { + reduced_source[j] = 'c'; + reduced_encode_mode[j] = encode_mode[i]; + i += 2; + } else if ((source[i] == ':') && (source[i + 1] == ' ')) { + reduced_source[j] = 'd'; + reduced_encode_mode[j] = encode_mode[i]; + i += 2; + } else { + reduced_source[j] = source[i]; + reduced_encode_mode[j] = encode_mode[i]; + i++; + } + j++; + } while (i < src_len); + + reduced_length = j; + + current_mode = 'U'; + for(i = 0; i < reduced_length; i++) { + + // Resolve Carriage Return (CR) which can be Punct or Mixed mode + if (reduced_source[i] == 13) { + count = count_cr(reduced_source, i, reduced_length); + next_mode = get_next_mode(reduced_encode_mode, reduced_length, i); + + if ((current_mode == 'U') && ((next_mode == 'U') || (next_mode == 'B')) && (count == 1)) { + reduced_encode_mode[i] = 'P'; + } + + if ((current_mode == 'L') && ((next_mode == 'L') || (next_mode == 'B')) && (count == 1)) { + reduced_encode_mode[i] = 'P'; + } + + if ((current_mode == 'P') || (next_mode == 'P')) { + reduced_encode_mode[i] = 'P'; + } + + if (current_mode == 'D') { + if (((next_mode == 'E') || (next_mode == 'U') || (next_mode == 'D') || (next_mode == 'B')) && (count <= 2)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'P'; + } + } + if ((next_mode == 'L') && (count == 1)) { + reduced_encode_mode[i] = 'P'; + } + } + + // Default is Mixed mode + if (reduced_encode_mode[i] == 'X') { + reduced_encode_mode[i] = 'M'; + } + } + + // Resolve full stop and comma which can be in Punct or Digit mode + if ((reduced_source[i] == '.') || (reduced_source[i] == ',')) { + count = count_dotcomma(reduced_source, i, reduced_length); + next_mode = get_next_mode(reduced_encode_mode, reduced_length, i); + + if (current_mode == 'U') { + if (((next_mode == 'U') || (next_mode == 'L') || (next_mode == 'M') || (next_mode == 'B')) && (count == 1)) { + reduced_encode_mode[i] = 'P'; + } + } + + if (current_mode == 'L') { + if ((next_mode == 'L') && (count <= 2)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'P'; + } + } + if (((next_mode == 'M') || (next_mode == 'B')) && (count == 1)) { + reduced_encode_mode[i] = 'P'; + } + } + + if (current_mode == 'M') { + if (((next_mode == 'E') || (next_mode == 'U') || (next_mode == 'L') || (next_mode == 'M')) && (count <= 4)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'P'; + } + } + if ((next_mode == 'B') && (count <= 2)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'P'; + } + } + } + + if ((current_mode == 'P') && (next_mode != 'D') && (count <= 9)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'P'; + } + } + + // Default is Digit mode + if (reduced_encode_mode[i] == 'X') { + reduced_encode_mode[i] = 'D'; + } + } + + // Resolve Space (SP) which can be any mode except Punct + if (reduced_source[i] == ' ') { + count = count_spaces(reduced_source, i, reduced_length); + next_mode = get_next_mode(reduced_encode_mode, reduced_length, i); + + if (current_mode == 'U') { + if ((next_mode == 'E') && (count <= 5)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'U'; + } + } + if (((next_mode == 'U') || (next_mode == 'L') || (next_mode == 'M') || (next_mode == 'P') || (next_mode == 'B')) && (count <= 9)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'U'; + } + } + } + + if (current_mode == 'L') { + if ((next_mode == 'E') && (count <= 5)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'L'; + } + } + if ((next_mode == 'U') && (count == 1)) { + reduced_encode_mode[i] = 'L'; + } + if ((next_mode == 'L') && (count <= 14)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'L'; + } + } + if (((next_mode == 'M') || (next_mode == 'P') || (next_mode == 'B')) && (count <= 9)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'L'; + } + } + } + + if (current_mode == 'M') { + if (((next_mode == 'E') || (next_mode == 'U')) && (count <= 9)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'M'; + } + } + + if (((next_mode == 'L') || (next_mode == 'B')) && (count <= 14)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'M'; + } + } + + if (((next_mode == 'M') || (next_mode == 'P')) && (count <= 19)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'M'; + } + } + } + + if (current_mode == 'P') { + if ((next_mode == 'E') && (count <= 5)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'U'; + } + } + + if (((next_mode == 'U') || (next_mode == 'L') || (next_mode == 'M') || (next_mode == 'P') || (next_mode == 'B')) && (count <= 9)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'U'; + } + } + } + + // Default is Digit mode + if (reduced_encode_mode[i] == 'X') { + reduced_encode_mode[i] = 'D'; + } + } + + if (reduced_encode_mode[i] != 'B') { + current_mode = reduced_encode_mode[i]; + } + } + + // Decide when to use P/S instead of P/L and U/S instead of U/L + current_mode = 'U'; + for(i = 0; i < reduced_length; i++) { + + if (reduced_encode_mode[i] != current_mode) { + + for (count = 0; ((i + count) <= reduced_length) && (reduced_encode_mode[i + count] == reduced_encode_mode[i]); count++); + next_mode = get_next_mode(reduced_encode_mode, reduced_length, i); + + if (reduced_encode_mode[i] == 'P') { + if ((current_mode == 'U') && (count <= 2)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'p'; + } + } + + if ((current_mode == 'L') && (next_mode != 'U') && (count <= 2)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'p'; + } + } + + if ((current_mode == 'L') && (next_mode == 'U') && (count == 1)) { + reduced_encode_mode[i] = 'p'; + } + + if ((current_mode == 'M') && (next_mode != 'M') && (count == 1)) { + reduced_encode_mode[i] = 'p'; + } + + if ((current_mode == 'M') && (next_mode == 'M') && (count <= 2)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'p'; + } + } + + if ((current_mode == 'D') && (next_mode != 'D') && (count <= 3)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'p'; + } + } + + if ((current_mode == 'D') && (next_mode == 'D') && (count <= 6)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'p'; + } + } + } + + if (reduced_encode_mode[i] == 'U') { + if ((current_mode == 'L') && ((next_mode == 'L') || (next_mode == 'M')) && (count <= 2)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'u'; + } + } + + if ((current_mode == 'L') && ((next_mode == 'E') || (next_mode == 'D') || (next_mode == 'B') || (next_mode == 'P')) && (count == 1)) { + reduced_encode_mode[i] = 'u'; + } + + if ((current_mode == 'D') && (next_mode == 'D') && (count == 1)) { + reduced_encode_mode[i] = 'u'; + } + + if ((current_mode == 'D') && (next_mode == 'P') && (count <= 2)) { + for (j = 0; j < count; j++) { + reduced_encode_mode[i + j] = 'u'; + } + } + } + } + + if ((reduced_encode_mode[i] != 'p') && (reduced_encode_mode[i] != 'u') && (reduced_encode_mode[i] != 'B')) { + current_mode = reduced_encode_mode[i]; + } + } + + if (debug) { + for (i = 0; i < reduced_length; i++) { + printf("%c", reduced_source[i]); + } + printf("\n"); + for (i = 0; i < reduced_length; i++) { + printf("%c", reduced_encode_mode[i]); + } + printf("\n"); + } + + strcpy(binary_string, ""); + + if (gs1) { + bin_append(0, 5, binary_string); // P/S + bin_append(0, 5, binary_string); // FLG(n) + bin_append(0, 3, binary_string); // FLG(0) + } + + if (eci != 3) { + bin_append(0, 5, binary_string); // P/S + bin_append(0, 5, binary_string); // FLG(n) + if (eci < 10) { + bin_append(1, 3, binary_string); // FLG(1) + bin_append(2 + eci, 4, binary_string); + } + if ((eci >= 10) && (eci <= 99)) { + bin_append(2, 3, binary_string); // FLG(2) + bin_append(2 + (eci / 10), 4, binary_string); + bin_append(2 + (eci % 10), 4, binary_string); + } + if ((eci >= 100) && (eci <= 999)) { + bin_append(3, 3, binary_string); // FLG(3) + bin_append(2 + (eci / 100), 4, binary_string); + bin_append(2 + ((eci % 100) / 10), 4, binary_string); + bin_append(2 + (eci % 10), 4, binary_string); + } + if ((eci >= 1000) && (eci <= 9999)) { + bin_append(4, 3, binary_string); // FLG(4) + bin_append(2 + (eci / 1000), 4, binary_string); + bin_append(2 + ((eci % 1000) / 100), 4, binary_string); + bin_append(2 + ((eci % 100) / 10), 4, binary_string); + bin_append(2 + (eci % 10), 4, binary_string); + } + if ((eci >= 10000) && (eci <= 99999)) { + bin_append(5, 3, binary_string); // FLG(5) + bin_append(2 + (eci / 10000), 4, binary_string); + bin_append(2 + ((eci % 10000) / 1000), 4, binary_string); + bin_append(2 + ((eci % 1000) / 100), 4, binary_string); + bin_append(2 + ((eci % 100) / 10), 4, binary_string); + bin_append(2 + (eci % 10), 4, binary_string); + } + if (eci >= 100000) { + bin_append(6, 3, binary_string); // FLG(6) + bin_append(2 + (eci / 100000), 4, binary_string); + bin_append(2 + ((eci % 100000) / 10000), 4, binary_string); + bin_append(2 + ((eci % 10000) / 1000), 4, binary_string); + bin_append(2 + ((eci % 1000) / 100), 4, binary_string); + bin_append(2 + ((eci % 100) / 10), 4, binary_string); + bin_append(2 + (eci % 10), 4, binary_string); + } + } + + current_mode = 'U'; + for(i = 0; i < reduced_length; i++) { + if (reduced_encode_mode[i] != current_mode) { + // Change mode + if (current_mode == 'U') { + switch (reduced_encode_mode[i]) { + case 'L': + bin_append(28, 5, binary_string); // L/L + break; + case 'M': + bin_append(29, 5, binary_string); // M/L + break; + case 'P': + bin_append(29, 5, binary_string); // M/L + bin_append(30, 5, binary_string); // P/L + break; + case 'p': + bin_append(0, 5, binary_string); // P/S + break; + case 'D': + bin_append(30, 5, binary_string); // D/L + break; + case 'B': + bin_append(31, 5, binary_string); // B/S + break; + } + } + + if (current_mode == 'L') { + switch (reduced_encode_mode[i]) { + case 'U': + bin_append(30, 5, binary_string); // D/L + bin_append(14, 4, binary_string); // U/L + break; + case 'u': + bin_append(28, 5, binary_string); // U/S + break; + case 'M': + bin_append(29, 5, binary_string); // M/L + break; + case 'P': + bin_append(30, 5, binary_string); // P/L + break; + case 'p': + bin_append(0, 5, binary_string); // P/S + break; + case 'D': + bin_append(30, 5, binary_string); // D/L + break; + case 'B': + bin_append(31, 5, binary_string); // B/S + break; + } + } + + if (current_mode == 'M') { + switch (reduced_encode_mode[i]) { + case 'U': + bin_append(29, 5, binary_string); // U/L + break; + case 'L': + bin_append(28, 5, binary_string); // L/L + break; + case 'P': + bin_append(30, 5, binary_string); // P/L + break; + case 'p': + bin_append(0, 5, binary_string); // P/S + break; + case 'D': + bin_append(29, 5, binary_string); // U/L + bin_append(30, 5, binary_string); // D/L + break; + case 'B': + bin_append(31, 5, binary_string); // B/S + break; + } + } + + if (current_mode == 'P') { + switch (reduced_encode_mode[i]) { + case 'U': + bin_append(31, 5, binary_string); // U/L + break; + case 'L': + bin_append(31, 5, binary_string); // U/L + bin_append(28, 5, binary_string); // L/L + break; + case 'M': + bin_append(31, 5, binary_string); // U/L + bin_append(29, 5, binary_string); // M/L + break; + case 'D': + bin_append(31, 5, binary_string); // U/L + bin_append(30, 5, binary_string); // D/L + break; + case 'B': + bin_append(31, 5, binary_string); // U/L + current_mode = 'U'; + bin_append(31, 5, binary_string); // B/S + break; + } + } + + if (current_mode == 'D') { + switch (reduced_encode_mode[i]) { + case 'U': + bin_append(14, 4, binary_string); // U/L + break; + case 'u': + bin_append(15, 4, binary_string); // U/S + break; + case 'L': + bin_append(14, 4, binary_string); // U/L + bin_append(28, 5, binary_string); // L/L + break; + case 'M': + bin_append(14, 4, binary_string); // U/L + bin_append(29, 5, binary_string); // M/L + break; + case 'P': + bin_append(14, 4, binary_string); // U/L + bin_append(29, 5, binary_string); // M/L + bin_append(30, 5, binary_string); // P/L + break; + case 'p': + bin_append(0, 4, binary_string); // P/S + break; + case 'B': + bin_append(14, 4, binary_string); // U/L + current_mode = 'U'; + bin_append(31, 5, binary_string); // B/S + break; + } + } + + // Byte mode length descriptor + if ((reduced_encode_mode[i] == 'B') && (!byte_mode)) { + for (count = 0; ((i + count) < reduced_length) && (reduced_encode_mode[i] == 'B'); count++); + + if (count > 2079) { + return ZINT_ERROR_TOO_LONG; + } + + if (count > 31) { + /* Put 00000 followed by 11-bit number of bytes less 31 */ + bin_append(0, 5, binary_string); + bin_append(count - 31, 11, binary_string); + } else { + /* Put 5-bit number of bytes */ + bin_append(count, 5, binary_string); + } + byte_mode = 1; + } + + if ((reduced_encode_mode[i] != 'B') && byte_mode) { + byte_mode = 0; + } + + if ((reduced_encode_mode[i] != 'B') && (reduced_encode_mode[i] != 'u') && (reduced_encode_mode[i] != 'p')) { + current_mode = reduced_encode_mode[i]; + } + } + + if ((reduced_encode_mode[i] == 'U') || (reduced_encode_mode[i] == 'u')) { + if (reduced_source[i] == ' ') { + bin_append(1, 5, binary_string); // SP + } else { + bin_append(AztecSymbolChar[(int) reduced_source[i]], 5, binary_string); + } + } + + if (reduced_encode_mode[i] == 'L') { + if (reduced_source[i] == ' ') { + bin_append(1, 5, binary_string); // SP + } else { + bin_append(AztecSymbolChar[(int) reduced_source[i]], 5, binary_string); + } + } + + if (reduced_encode_mode[i] == 'M') { + if (reduced_source[i] == ' ') { + bin_append(1, 5, binary_string); // SP + } else if (reduced_source[i] == 13) { + bin_append(14, 5, binary_string); // CR + } else { + bin_append(AztecSymbolChar[(int) reduced_source[i]], 5, binary_string); + } + } + + if ((reduced_encode_mode[i] == 'P') || (reduced_encode_mode[i] == 'p')) { + if (gs1 && (reduced_source[i] == '[')) { + bin_append(0, 5, binary_string); // FLG(0) = FNC1 + } else if (reduced_source[i] == 13) { + bin_append(1, 5, binary_string); // CR + } else if (reduced_source[i] == 'a') { + bin_append(2, 5, binary_string); // CR LF + } else if (reduced_source[i] == 'b') { + bin_append(3, 5, binary_string); // . SP + } else if (reduced_source[i] == 'c') { + bin_append(4, 5, binary_string); // , SP + } else if (reduced_source[i] == 'd') { + bin_append(5, 5, binary_string); // : SP + } else if (reduced_source[i] == ',') { + bin_append(17, 5, binary_string); // Comma + } else if (reduced_source[i] == '.') { + bin_append(19, 5, binary_string); // Full stop + } else { + bin_append(AztecSymbolChar[(int) reduced_source[i]], 5, binary_string); + } + } + + if (reduced_encode_mode[i] == 'D') { + if (reduced_source[i] == ' ') { + bin_append(1, 4, binary_string); // SP + } else if (reduced_source[i] == ',') { + bin_append(12, 4, binary_string); // Comma + } else if (reduced_source[i] == '.') { + bin_append(13, 4, binary_string); // Full stop + } else { + bin_append(AztecSymbolChar[(int) reduced_source[i]], 4, binary_string); + } + } + + if (reduced_encode_mode[i] == 'B') { + bin_append(reduced_source[i], 8, binary_string); + } + } + + if (debug) { + printf("Binary String:\n"); + printf("%s\n", binary_string); + } + + return 0; +} + +/* Prevent data from obscuring reference grid */ +static int avoidReferenceGrid(int output) { + + if (output > 10) { + output++; + } + if (output > 26) { + output++; + } + if (output > 42) { + output++; + } + if (output > 58) { + output++; + } + if (output > 74) { + output++; + } + if (output > 90) { + output++; + } + if (output > 106) { + output++; + } + if (output > 122) { + output++; + } + if (output > 138) { + output++; + } + + return output; +} + +/* Calculate the position of the bits in the grid */ +static void populate_map() { + int layer, start, length, n, i; + int x, y; + + for (x = 0; x < 151; x++) { + for (y = 0; y < 151; y++) { + AztecMap[(x * 151) + y] = 0; + } + } + + for (layer = 1; layer < 33; layer++) { + start = (112 * (layer - 1)) + (16 * (layer - 1) * (layer - 1)) + 2; + length = 28 + ((layer - 1) * 4) + (layer * 4); + /* Top */ + i = 0; + x = 64 - ((layer - 1) * 2); + y = 63 - ((layer - 1) * 2); + for (n = start; n < (start + length); n += 2) { + AztecMap[(avoidReferenceGrid(x + i) * 151) + avoidReferenceGrid(y)] = n; + AztecMap[(avoidReferenceGrid(x + i) * 151) + avoidReferenceGrid(y - 1)] = n + 1; + i++; + } + /* Right */ + i = 0; + x = 78 + ((layer - 1) * 2); + y = 64 - ((layer - 1) * 2); + for (n = start + length; n < (start + (length * 2)); n += 2) { + AztecMap[(avoidReferenceGrid(x) * 151) + avoidReferenceGrid(y + i)] = n; + AztecMap[(avoidReferenceGrid(x + 1) * 151) + avoidReferenceGrid(y + i)] = n + 1; + i++; + } + /* Bottom */ + i = 0; + x = 77 + ((layer - 1) * 2); + y = 78 + ((layer - 1) * 2); + for (n = start + (length * 2); n < (start + (length * 3)); n += 2) { + AztecMap[(avoidReferenceGrid(x - i) * 151) + avoidReferenceGrid(y)] = n; + AztecMap[(avoidReferenceGrid(x - i) * 151) + avoidReferenceGrid(y + 1)] = n + 1; + i++; + } + /* Left */ + i = 0; + x = 63 - ((layer - 1) * 2); + y = 77 + ((layer - 1) * 2); + for (n = start + (length * 3); n < (start + (length * 4)); n += 2) { + AztecMap[(avoidReferenceGrid(x) * 151) + avoidReferenceGrid(y - i)] = n; + AztecMap[(avoidReferenceGrid(x - 1) * 151) + avoidReferenceGrid(y - i)] = n + 1; + i++; + } + } + + /* Central finder pattern */ + for (y = 69; y <= 81; y++) { + for (x = 69; x <= 81; x++) { + AztecMap[(x * 151) + y] = 1; + } + } + for (y = 70; y <= 80; y++) { + for (x = 70; x <= 80; x++) { + AztecMap[(x * 151) + y] = 0; + } + } + for (y = 71; y <= 79; y++) { + for (x = 71; x <= 79; x++) { + AztecMap[(x * 151) + y] = 1; + } + } + for (y = 72; y <= 78; y++) { + for (x = 72; x <= 78; x++) { + AztecMap[(x * 151) + y] = 0; + } + } + for (y = 73; y <= 77; y++) { + for (x = 73; x <= 77; x++) { + AztecMap[(x * 151) + y] = 1; + } + } + for (y = 74; y <= 76; y++) { + for (x = 74; x <= 76; x++) { + AztecMap[(x * 151) + y] = 0; + } + } + + /* Guide bars */ + for (y = 11; y < 151; y += 16) { + for (x = 1; x < 151; x += 2) { + AztecMap[(x * 151) + y] = 1; + AztecMap[(y * 151) + x] = 1; + } + } + + /* Descriptor */ + for (i = 0; i < 10; i++) { + /* Top */ + AztecMap[(avoidReferenceGrid(66 + i) * 151) + avoidReferenceGrid(64)] = 20000 + i; + } + for (i = 0; i < 10; i++) { + /* Right */ + AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(66 + i)] = 20010 + i; + } + for (i = 0; i < 10; i++) { + /* Bottom */ + AztecMap[(avoidReferenceGrid(75 - i) * 151) + avoidReferenceGrid(77)] = 20020 + i; + } + for (i = 0; i < 10; i++) { + /* Left */ + AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(75 - i)] = 20030 + i; + } + + /* Orientation */ + AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(64)] = 1; + AztecMap[(avoidReferenceGrid(65) * 151) + avoidReferenceGrid(64)] = 1; + AztecMap[(avoidReferenceGrid(64) * 151) + avoidReferenceGrid(65)] = 1; + AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(64)] = 1; + AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(65)] = 1; + AztecMap[(avoidReferenceGrid(77) * 151) + avoidReferenceGrid(76)] = 1; +} + +int aztec(struct zint_symbol *symbol, unsigned char source[], const size_t length) { + int x, y, i, j, p, data_blocks, ecc_blocks, layers, total_bits; + char binary_string[20000], bit_pattern[20045], descriptor[42]; + char adjusted_string[20000]; + unsigned char desc_data[4], desc_ecc[6]; + int err_code, ecc_level, compact, data_length, data_maxsize, codeword_size, adjusted_length; + int remainder, padbits, count, gs1, adjustment_size; + int debug = symbol->debug, reader = 0; + int comp_loop = 4; + +#ifdef _MSC_VER + unsigned int* data_part; + unsigned int* ecc_part; +#endif + + memset(binary_string, 0, 20000); + memset(adjusted_string, 0, 20000); + + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + } else { + gs1 = 0; + } + if (symbol->output_options & READER_INIT) { + reader = 1; + comp_loop = 1; + } + if (gs1 && reader) { + strcpy(symbol->errtxt, "501: Cannot encode in GS1 and Reader Initialisation mode at the same time"); + return ZINT_ERROR_INVALID_OPTION; + } + + populate_map(); + + err_code = aztec_text_process(source, length, binary_string, gs1, symbol->eci, symbol->debug); + + if (err_code != 0) { + strcpy(symbol->errtxt, "502: Input too long or too many extended ASCII characters"); + return err_code; + } + + if (!((symbol->option_1 >= -1) && (symbol->option_1 <= 4))) { + strcpy(symbol->errtxt, "503: Invalid error correction level - using default instead"); + err_code = ZINT_WARN_INVALID_OPTION; + symbol->option_1 = -1; + } + + ecc_level = symbol->option_1; + + if ((ecc_level == -1) || (ecc_level == 0)) { + ecc_level = 2; + } + + data_length = (int) strlen(binary_string); + + layers = 0; /* Keep compiler happy! */ + data_maxsize = 0; /* Keep compiler happy! */ + adjustment_size = 0; + if (symbol->option_2 == 0) { /* The size of the symbol can be determined by Zint */ + do { + /* Decide what size symbol to use - the smallest that fits the data */ + compact = 0; /* 1 = Aztec Compact, 0 = Normal Aztec */ + layers = 0; + + switch (ecc_level) { + /* For each level of error correction work out the smallest symbol which + the data will fit in */ + case 1: for (i = 32; i > 0; i--) { + if ((data_length + adjustment_size) < Aztec10DataSizes[i - 1]) { + layers = i; + compact = 0; + data_maxsize = Aztec10DataSizes[i - 1]; + } + } + for (i = comp_loop; i > 0; i--) { + if ((data_length + adjustment_size) < AztecCompact10DataSizes[i - 1]) { + layers = i; + compact = 1; + data_maxsize = AztecCompact10DataSizes[i - 1]; + } + } + break; + case 2: for (i = 32; i > 0; i--) { + if ((data_length + adjustment_size) < Aztec23DataSizes[i - 1]) { + layers = i; + compact = 0; + data_maxsize = Aztec23DataSizes[i - 1]; + } + } + for (i = comp_loop; i > 0; i--) { + if ((data_length + adjustment_size) < AztecCompact23DataSizes[i - 1]) { + layers = i; + compact = 1; + data_maxsize = AztecCompact23DataSizes[i - 1]; + } + } + break; + case 3: for (i = 32; i > 0; i--) { + if ((data_length + adjustment_size) < Aztec36DataSizes[i - 1]) { + layers = i; + compact = 0; + data_maxsize = Aztec36DataSizes[i - 1]; + } + } + for (i = comp_loop; i > 0; i--) { + if ((data_length + adjustment_size) < AztecCompact36DataSizes[i - 1]) { + layers = i; + compact = 1; + data_maxsize = AztecCompact36DataSizes[i - 1]; + } + } + break; + case 4: for (i = 32; i > 0; i--) { + if ((data_length + adjustment_size) < Aztec50DataSizes[i - 1]) { + layers = i; + compact = 0; + data_maxsize = Aztec50DataSizes[i - 1]; + } + } + for (i = comp_loop; i > 0; i--) { + if ((data_length + adjustment_size) < AztecCompact50DataSizes[i - 1]) { + layers = i; + compact = 1; + data_maxsize = AztecCompact50DataSizes[i - 1]; + } + } + break; + } + + if (layers == 0) { /* Couldn't find a symbol which fits the data */ + strcpy(symbol->errtxt, "504: Input too long (too many bits for selected ECC)"); + return ZINT_ERROR_TOO_LONG; + } + + /* Determine codeword bitlength - Table 3 */ + codeword_size = 6; /* if (layers <= 2) */ + if ((layers >= 3) && (layers <= 8)) { + codeword_size = 8; + } + if ((layers >= 9) && (layers <= 22)) { + codeword_size = 10; + } + if (layers >= 23) { + codeword_size = 12; + } + + j = 0; + i = 0; + do { + if ((j + 1) % codeword_size == 0) { + /* Last bit of codeword */ + int t, done = 0; + count = 0; + + /* Discover how many '1's in current codeword */ + for (t = 0; t < (codeword_size - 1); t++) { + if (binary_string[(i - (codeword_size - 1)) + t] == '1') count++; + } + + if (count == (codeword_size - 1)) { + adjusted_string[j] = '0'; + j++; + done = 1; + } + + if (count == 0) { + adjusted_string[j] = '1'; + j++; + done = 1; + } + + if (done == 0) { + adjusted_string[j] = binary_string[i]; + j++; + i++; + } + } + adjusted_string[j] = binary_string[i]; + j++; + i++; + } while (i <= (data_length + 1)); + adjusted_string[j] = '\0'; + adjusted_length = (int) strlen(adjusted_string); + adjustment_size = adjusted_length - data_length; + + /* Add padding */ + remainder = adjusted_length % codeword_size; + + padbits = codeword_size - remainder; + if (padbits == codeword_size) { + padbits = 0; + } + + for (i = 0; i < padbits; i++) { + strcat(adjusted_string, "1"); + } + adjusted_length = (int) strlen(adjusted_string); + + count = 0; + for (i = (adjusted_length - codeword_size); i < adjusted_length; i++) { + if (adjusted_string[i] == '1') { + count++; + } + } + if (count == codeword_size) { + adjusted_string[adjusted_length - 1] = '0'; + } + + if (debug) { + printf("Codewords:\n"); + for (i = 0; i < (adjusted_length / codeword_size); i++) { + for (j = 0; j < codeword_size; j++) { + printf("%c", adjusted_string[(i * codeword_size) + j]); + } + printf("\n"); + } + } + + } while (adjusted_length > data_maxsize); + /* This loop will only repeat on the rare occasions when the rule about not having all 1s or all 0s + means that the binary string has had to be lengthened beyond the maximum number of bits that can + be encoded in a symbol of the selected size */ + + } else { /* The size of the symbol has been specified by the user */ + if ((reader == 1) && ((symbol->option_2 >= 2) && (symbol->option_2 <= 4))) { + symbol->option_2 = 5; + } + if ((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) { + compact = 1; + layers = symbol->option_2; + } + if ((symbol->option_2 >= 5) && (symbol->option_2 <= 36)) { + compact = 0; + layers = symbol->option_2 - 4; + } + if ((symbol->option_2 < 0) || (symbol->option_2 > 36)) { + strcpy(symbol->errtxt, "510: Invalid Aztec Code size"); + return ZINT_ERROR_INVALID_OPTION; + } + + /* Determine codeword bitlength - Table 3 */ + if ((layers >= 0) && (layers <= 2)) { + codeword_size = 6; + } + if ((layers >= 3) && (layers <= 8)) { + codeword_size = 8; + } + if ((layers >= 9) && (layers <= 22)) { + codeword_size = 10; + } + if (layers >= 23) { + codeword_size = 12; + } + + j = 0; + i = 0; + do { + if ((j + 1) % codeword_size == 0) { + /* Last bit of codeword */ + int t, done = 0; + count = 0; + + /* Discover how many '1's in current codeword */ + for (t = 0; t < (codeword_size - 1); t++) { + if (binary_string[(i - (codeword_size - 1)) + t] == '1') count++; + } + + if (count == (codeword_size - 1)) { + adjusted_string[j] = '0'; + j++; + done = 1; + } + + if (count == 0) { + adjusted_string[j] = '1'; + j++; + done = 1; + } + + if (done == 0) { + adjusted_string[j] = binary_string[i]; + j++; + i++; + } + } + adjusted_string[j] = binary_string[i]; + j++; + i++; + } while (i <= (data_length + 1)); + adjusted_string[j] = '\0'; + adjusted_length = (int) strlen(adjusted_string); + + remainder = adjusted_length % codeword_size; + + padbits = codeword_size - remainder; + if (padbits == codeword_size) { + padbits = 0; + } + + for (i = 0; i < padbits; i++) { + strcat(adjusted_string, "1"); + } + adjusted_length = (int) strlen(adjusted_string); + + count = 0; + for (i = (adjusted_length - codeword_size); i < adjusted_length; i++) { + if (adjusted_string[i] == '1') { + count++; + } + } + if (count == codeword_size) { + adjusted_string[adjusted_length - 1] = '0'; + } + + /* Check if the data actually fits into the selected symbol size */ + if (compact) { + data_maxsize = codeword_size * (AztecCompactSizes[layers - 1] - 3); + } else { + data_maxsize = codeword_size * (AztecSizes[layers - 1] - 3); + } + + if (adjusted_length > data_maxsize) { + strcpy(symbol->errtxt, "505: Data too long for specified Aztec Code symbol size"); + return ZINT_ERROR_TOO_LONG; + } + + if (debug) { + printf("Codewords:\n"); + for (i = 0; i < (adjusted_length / codeword_size); i++) { + for (j = 0; j < codeword_size; j++) { + printf("%c", adjusted_string[(i * codeword_size) + j]); + } + printf("\n"); + } + } + + } + + if (reader && (layers > 22)) { + strcpy(symbol->errtxt, "506: Data too long for reader initialisation symbol"); + return ZINT_ERROR_TOO_LONG; + } + + data_blocks = adjusted_length / codeword_size; + + if (compact) { + ecc_blocks = AztecCompactSizes[layers - 1] - data_blocks; + } else { + ecc_blocks = AztecSizes[layers - 1] - data_blocks; + } + + if (debug) { + printf("Generating a "); + if (compact) { + printf("compact"); + } else { + printf("full-size"); + } + printf(" symbol with %d layers\n", layers); + printf("Requires "); + if (compact) { + printf("%d", AztecCompactSizes[layers - 1]); + } else { + printf("%d", AztecSizes[layers - 1]); + } + printf(" codewords of %d-bits\n", codeword_size); + printf(" (%d data words, %d ecc words)\n", data_blocks, ecc_blocks); + } + +#ifndef _MSC_VER + unsigned int data_part[data_blocks + 3], ecc_part[ecc_blocks + 3]; +#else + data_part = (unsigned int*) _alloca((data_blocks + 3) * sizeof (unsigned int)); + ecc_part = (unsigned int*) _alloca((ecc_blocks + 3) * sizeof (unsigned int)); +#endif + /* Copy across data into separate integers */ + memset(data_part, 0, (data_blocks + 2) * sizeof (int)); + memset(ecc_part, 0, (ecc_blocks + 2) * sizeof (int)); + + /* Split into codewords and calculate reed-solomon error correction codes */ + for (i = 0; i < data_blocks; i++) { + for (p = 0; p < codeword_size; p++) { + if (adjusted_string[i * codeword_size + p] == '1') { + data_part[i] += 0x01 << (codeword_size - (p + 1)); + } + } + } + + switch (codeword_size) { + case 6: + rs_init_gf(0x43); + break; + case 8: + rs_init_gf(0x12d); + break; + case 10: + rs_init_gf(0x409); + break; + case 12: + rs_init_gf(0x1069); + break; + } + + rs_init_code(ecc_blocks, 1); + rs_encode_long(data_blocks, data_part, ecc_part); + for (i = (ecc_blocks - 1); i >= 0; i--) { + bin_append(ecc_part[i], codeword_size, adjusted_string); + } + rs_free(); + + /* Invert the data so that actual data is on the outside and reed-solomon on the inside */ + memset(bit_pattern, '0', 20045); + + total_bits = (data_blocks + ecc_blocks) * codeword_size; + for (i = 0; i < total_bits; i++) { + bit_pattern[i] = adjusted_string[total_bits - i - 1]; + } + + /* Now add the symbol descriptor */ + memset(desc_data, 0, 4); + memset(desc_ecc, 0, 6); + memset(descriptor, 0, 42); + + if (compact) { + /* The first 2 bits represent the number of layers minus 1 */ + if ((layers - 1) & 0x02) { + descriptor[0] = '1'; + } else { + descriptor[0] = '0'; + } + if ((layers - 1) & 0x01) { + descriptor[1] = '1'; + } else { + descriptor[1] = '0'; + } + /* The next 6 bits represent the number of data blocks minus 1 */ + if (reader) { + descriptor[2] = '1'; + } else { + if ((data_blocks - 1) & 0x20) { + descriptor[2] = '1'; + } else { + descriptor[2] = '0'; + } + } + + for (i = 3; i < 8; i++) { + if ((data_blocks - 1) & (0x10 >> (i - 3))) { + descriptor[i] = '1'; + } else { + descriptor[i] = '0'; + } + } + + descriptor[8] = '\0'; + if (debug) printf("Mode Message = %s\n", descriptor); + } else { + /* The first 5 bits represent the number of layers minus 1 */ + for (i = 0; i < 5; i++) { + if ((layers - 1) & (0x10 >> i)) { + descriptor[i] = '1'; + } else { + descriptor[i] = '0'; + } + } + + /* The next 11 bits represent the number of data blocks minus 1 */ + if (reader) { + descriptor[5] = '1'; + } else { + if ((data_blocks - 1) & 0x400) { + descriptor[5] = '1'; + } else { + descriptor[5] = '0'; + } + } + for (i = 6; i < 16; i++) { + if ((data_blocks - 1) & (0x200 >> (i - 6))) { + descriptor[i] = '1'; + } else { + descriptor[i] = '0'; + } + } + descriptor[16] = '\0'; + if (debug) printf("Mode Message = %s\n", descriptor); + } + + /* Split into 4-bit codewords */ + for (i = 0; i < 4; i++) { + if (descriptor[i * 4] == '1') { + desc_data[i] += 8; + } + if (descriptor[(i * 4) + 1] == '1') { + desc_data[i] += 4; + } + if (descriptor[(i * 4) + 2] == '1') { + desc_data[i] += 2; + } + if (descriptor[(i * 4) + 3] == '1') { + desc_data[i] += 1; + } + } + + /* Add reed-solomon error correction with Galois field GF(16) and prime modulus + x^4 + x + 1 (section 7.2.3)*/ + + rs_init_gf(0x13); + if (compact) { + rs_init_code(5, 1); + rs_encode(2, desc_data, desc_ecc); + for (i = 0; i < 5; i++) { + if (desc_ecc[4 - i] & 0x08) { + descriptor[(i * 4) + 8] = '1'; + } else { + descriptor[(i * 4) + 8] = '0'; + } + if (desc_ecc[4 - i] & 0x04) { + descriptor[(i * 4) + 9] = '1'; + } else { + descriptor[(i * 4) + 9] = '0'; + } + if (desc_ecc[4 - i] & 0x02) { + descriptor[(i * 4) + 10] = '1'; + } else { + descriptor[(i * 4) + 10] = '0'; + } + if (desc_ecc[4 - i] & 0x01) { + descriptor[(i * 4) + 11] = '1'; + } else { + descriptor[(i * 4) + 11] = '0'; + } + } + } else { + rs_init_code(6, 1); + rs_encode(4, desc_data, desc_ecc); + for (i = 0; i < 6; i++) { + if (desc_ecc[5 - i] & 0x08) { + descriptor[(i * 4) + 16] = '1'; + } else { + descriptor[(i * 4) + 16] = '0'; + } + if (desc_ecc[5 - i] & 0x04) { + descriptor[(i * 4) + 17] = '1'; + } else { + descriptor[(i * 4) + 17] = '0'; + } + if (desc_ecc[5 - i] & 0x02) { + descriptor[(i * 4) + 18] = '1'; + } else { + descriptor[(i * 4) + 18] = '0'; + } + if (desc_ecc[5 - i] & 0x01) { + descriptor[(i * 4) + 19] = '1'; + } else { + descriptor[(i * 4) + 19] = '0'; + } + } + } + rs_free(); + + /* Merge descriptor with the rest of the symbol */ + for (i = 0; i < 40; i++) { + if (compact) { + bit_pattern[2000 + i - 2] = descriptor[i]; + } else { + bit_pattern[20000 + i - 2] = descriptor[i]; + } + } + + /* Plot all of the data into the symbol in pre-defined spiral pattern */ + if (compact) { + + for (y = AztecCompactOffset[layers - 1]; y < (27 - AztecCompactOffset[layers - 1]); y++) { + for (x = AztecCompactOffset[layers - 1]; x < (27 - AztecCompactOffset[layers - 1]); x++) { + if (CompactAztecMap[(y * 27) + x] == 1) { + set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]); + } + if (CompactAztecMap[(y * 27) + x] >= 2) { + if (bit_pattern[CompactAztecMap[(y * 27) + x] - 2] == '1') { + set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]); + } + } + } + symbol->row_height[y - AztecCompactOffset[layers - 1]] = 1; + } + symbol->rows = 27 - (2 * AztecCompactOffset[layers - 1]); + symbol->width = 27 - (2 * AztecCompactOffset[layers - 1]); + } else { + + for (y = AztecOffset[layers - 1]; y < (151 - AztecOffset[layers - 1]); y++) { + for (x = AztecOffset[layers - 1]; x < (151 - AztecOffset[layers - 1]); x++) { + if (AztecMap[(y * 151) + x] == 1) { + set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]); + } + if (AztecMap[(y * 151) + x] >= 2) { + if (bit_pattern[AztecMap[(y * 151) + x] - 2] == '1') { + set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]); + } + } + } + symbol->row_height[y - AztecOffset[layers - 1]] = 1; + } + symbol->rows = 151 - (2 * AztecOffset[layers - 1]); + symbol->width = 151 - (2 * AztecOffset[layers - 1]); + } + + return err_code; +} + +/* Encodes Aztec runes as specified in ISO/IEC 24778:2008 Annex A */ +int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length) { + int input_value, error_number, i, y, x; + char binary_string[28]; + unsigned char data_codewords[3], ecc_codewords[6]; + + error_number = 0; + input_value = 0; + if (length > 3) { + strcpy(symbol->errtxt, "507: Input too large"); + return ZINT_ERROR_INVALID_DATA; + } + error_number = is_sane(NEON, source, length); + if (error_number != 0) { + strcpy(symbol->errtxt, "508: Invalid characters in input"); + return ZINT_ERROR_INVALID_DATA; + } + switch (length) { + case 3: input_value = 100 * ctoi(source[0]); + input_value += 10 * ctoi(source[1]); + input_value += ctoi(source[2]); + break; + case 2: input_value = 10 * ctoi(source[0]); + input_value += ctoi(source[1]); + break; + case 1: input_value = ctoi(source[0]); + break; + } + + if (input_value > 255) { + strcpy(symbol->errtxt, "509: Input too large"); + return ZINT_ERROR_INVALID_DATA; + } + + strcpy(binary_string, ""); + bin_append(input_value, 8, binary_string); + + data_codewords[0] = 0; + data_codewords[1] = 0; + + for (i = 0; i < 2; i++) { + if (binary_string[i * 4] == '1') { + data_codewords[i] += 8; + } + if (binary_string[(i * 4) + 1] == '1') { + data_codewords[i] += 4; + } + if (binary_string[(i * 4) + 2] == '1') { + data_codewords[i] += 2; + } + if (binary_string[(i * 4) + 3] == '1') { + data_codewords[i] += 1; + } + } + + rs_init_gf(0x13); + rs_init_code(5, 1); + rs_encode(2, data_codewords, ecc_codewords); + rs_free(); + + strcpy(binary_string, ""); + + for (i = 0; i < 5; i++) { + if (ecc_codewords[4 - i] & 0x08) { + binary_string[(i * 4) + 8] = '1'; + } else { + binary_string[(i * 4) + 8] = '0'; + } + if (ecc_codewords[4 - i] & 0x04) { + binary_string[(i * 4) + 9] = '1'; + } else { + binary_string[(i * 4) + 9] = '0'; + } + if (ecc_codewords[4 - i] & 0x02) { + binary_string[(i * 4) + 10] = '1'; + } else { + binary_string[(i * 4) + 10] = '0'; + } + if (ecc_codewords[4 - i] & 0x01) { + binary_string[(i * 4) + 11] = '1'; + } else { + binary_string[(i * 4) + 11] = '0'; + } + } + + for (i = 0; i < 28; i += 2) { + if (binary_string[i] == '1') { + binary_string[i] = '0'; + } else { + binary_string[i] = '1'; + } + } + + for (y = 8; y < 19; y++) { + for (x = 8; x < 19; x++) { + if (CompactAztecMap[(y * 27) + x] == 1) { + set_module(symbol, y - 8, x - 8); + } + if (CompactAztecMap[(y * 27) + x] >= 2) { + if (binary_string[CompactAztecMap[(y * 27) + x] - 2000] == '1') { + set_module(symbol, y - 8, x - 8); + } + } + } + symbol->row_height[y - 8] = 1; + } + symbol->rows = 11; + symbol->width = 11; + + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/aztec.h b/3rdparty/zint-2.6.1/backend/aztec.h new file mode 100644 index 0000000..8760568 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/aztec.h @@ -0,0 +1,145 @@ +/* aztec.c - Handles Aztec Mesa 2D Symbols */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#define UPPER 1 +#define LOWER 2 +#define MIXED 4 +#define PUNC 8 +#define DIGIT 16 +#define BINARY 32 + +static const unsigned short int CompactAztecMap[] = { + /* 27 x 27 data grid */ + 609, 608, 411, 413, 415, 417, 419, 421, 423, 425, 427, 429, 431, 433, 435, 437, 439, 441, 443, 445, 447, 449, 451, 453, 455, 457, 459, + 607, 606, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454, 456, 458, + 605, 604, 409, 408, 243, 245, 247, 249, 251, 253, 255, 257, 259, 261, 263, 265, 267, 269, 271, 273, 275, 277, 279, 281, 283, 460, 461, + 603, 602, 407, 406, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 462, 463, + 601, 600, 405, 404, 241, 240, 107, 109, 111, 113, 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, 284, 285, 464, 465, + 599, 598, 403, 402, 239, 238, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 286, 287, 466, 467, + 597, 596, 401, 400, 237, 236, 105, 104, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 140, 141, 288, 289, 468, 469, + 595, 594, 399, 398, 235, 234, 103, 102, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 142, 143, 290, 291, 470, 471, + 593, 592, 397, 396, 233, 232, 101, 100, 1, 1, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 0, 1, 28, 29, 144, 145, 292, 293, 472, 473, + 591, 590, 395, 394, 231, 230, 99, 98, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 30, 31, 146, 147, 294, 295, 474, 475, + 589, 588, 393, 392, 229, 228, 97, 96, 2027, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2007, 32, 33, 148, 149, 296, 297, 476, 477, + 587, 586, 391, 390, 227, 226, 95, 94, 2026, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2008, 34, 35, 150, 151, 298, 299, 478, 479, + 585, 584, 389, 388, 225, 224, 93, 92, 2025, 1, 0, 1, 0, 0, 0, 1, 0, 1, 2009, 36, 37, 152, 153, 300, 301, 480, 481, + 583, 582, 387, 386, 223, 222, 91, 90, 2024, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2010, 38, 39, 154, 155, 302, 303, 482, 483, + 581, 580, 385, 384, 221, 220, 89, 88, 2023, 1, 0, 1, 0, 0, 0, 1, 0, 1, 2011, 40, 41, 156, 157, 304, 305, 484, 485, + 579, 578, 383, 382, 219, 218, 87, 86, 2022, 1, 0, 1, 1, 1, 1, 1, 0, 1, 2012, 42, 43, 158, 159, 306, 307, 486, 487, + 577, 576, 381, 380, 217, 216, 85, 84, 2021, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2013, 44, 45, 160, 161, 308, 309, 488, 489, + 575, 574, 379, 378, 215, 214, 83, 82, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 46, 47, 162, 163, 310, 311, 490, 491, + 573, 572, 377, 376, 213, 212, 81, 80, 0, 0, 2020, 2019, 2018, 2017, 2016, 2015, 2014, 0, 0, 48, 49, 164, 165, 312, 313, 492, 493, + 571, 570, 375, 374, 211, 210, 78, 76, 74, 72, 70, 68, 66, 64, 62, 60, 58, 56, 54, 50, 51, 166, 167, 314, 315, 494, 495, + 569, 568, 373, 372, 209, 208, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59, 57, 55, 52, 53, 168, 169, 316, 317, 496, 497, + 567, 566, 371, 370, 206, 204, 202, 200, 198, 196, 194, 192, 190, 188, 186, 184, 182, 180, 178, 176, 174, 170, 171, 318, 319, 498, 499, + 565, 564, 369, 368, 207, 205, 203, 201, 199, 197, 195, 193, 191, 189, 187, 185, 183, 181, 179, 177, 175, 172, 173, 320, 321, 500, 501, + 563, 562, 366, 364, 362, 360, 358, 356, 354, 352, 350, 348, 346, 344, 342, 340, 338, 336, 334, 332, 330, 328, 326, 322, 323, 502, 503, + 561, 560, 367, 365, 363, 361, 359, 357, 355, 353, 351, 349, 347, 345, 343, 341, 339, 337, 335, 333, 331, 329, 327, 324, 325, 504, 505, + 558, 556, 554, 552, 550, 548, 546, 544, 542, 540, 538, 536, 534, 532, 530, 528, 526, 524, 522, 520, 518, 516, 514, 512, 510, 506, 507, + 559, 557, 555, 553, 551, 549, 547, 545, 543, 541, 539, 537, 535, 533, 531, 529, 527, 525, 523, 521, 519, 517, 515, 513, 511, 508, 509 +}; + +static const char AztecSymbolChar[128] = { + /* From Table 2 */ + 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, 1, 6, 7, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 0, 18, 0, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 21, 22, + 23, 24, 25, 26, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 21, 28, 22, 23, 24, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 29, 25, 30, 26, 27 +}; + +static const char AztecModes[129] = "BMMMMMMMMMMMMXBBBBBBBBBBBBBMMMMMXPPPPPPPPPPPXPXPDDDDDDDDDDPPPPPPMUUUUUUUUUUUUUUUUUUUUUUUUUUPMPMMMLLLLLLLLLLLLLLLLLLLLLLLLLLPMPMM"; + +static const unsigned short int AztecSizes[32] = { + /* Codewords per symbol */ + 21, 48, 60, 88, 120, 156, 196, 240, 230, 272, 316, 364, 416, 470, 528, 588, 652, 720, 790, + 864, 940, 1020, 920, 992, 1066, 1144, 1224, 1306, 1392, 1480, 1570, 1664 +}; + +static const int AztecCompactSizes[4] = { + 17, 40, 51, 76 +}; + +static const unsigned short int Aztec10DataSizes[32] = { + /* Data bits per symbol maximum with 10% error correction */ + 96, 246, 408, 616, 840, 1104, 1392, 1704, 2040, 2420, 2820, 3250, 3720, 4200, 4730, + 5270, 5840, 6450, 7080, 7750, 8430, 9150, 9900, 10680, 11484, 12324, 13188, 14076, + 15000, 15948, 16920, 17940 +}; + +static const unsigned short int Aztec23DataSizes[32] = { + /* Data bits per symbol maximum with 23% error correction */ + 84, 204, 352, 520, 720, 944, 1184, 1456, 1750, 2070, 2410, 2780, 3180, 3590, 4040, + 4500, 5000, 5520, 6060, 6630, 7210, 7830, 8472, 9132, 9816, 10536, 11280, 12036, + 12828, 13644, 14472, 15348 +}; + +static const unsigned short int Aztec36DataSizes[32] = { + /* Data bits per symbol maximum with 36% error correction */ + 66, 168, 288, 432, 592, 776, 984, 1208, 1450, 1720, 2000, 2300, 2640, 2980, 3350, + 3740, 4150, 4580, 5030, 5500, 5990, 6500, 7032, 7584, 8160, 8760, 9372, 9996, 10656, + 11340, 12024, 12744 +}; + +static const unsigned short int Aztec50DataSizes[32] = { + /* Data bits per symbol maximum with 50% error correction */ + 48, 126, 216, 328, 456, 600, 760, 936, 1120, 1330, 1550, 1790, 2050, 2320, 2610, + 2910, 3230, 3570, 3920, 4290, 4670, 5070, 5484, 5916, 6360, 6828, 7308, 7800, 8316, + 8844, 9384, 9948 +}; + +static const unsigned short int AztecCompact10DataSizes [4] = { + 78, 198, 336, 520 +}; + +static const unsigned short int AztecCompact23DataSizes [4] = { + 66, 168, 288, 440 +}; + +static const unsigned short int AztecCompact36DataSizes [4] = { + 48, 138, 232, 360 +}; + +static const unsigned short int AztecCompact50DataSizes [4] = { + 36, 102, 176, 280 +}; + +static const char AztecOffset[32] = { + 66, 64, 62, 60, 57, 55, 53, 51, 49, 47, 45, 42, 40, 38, 36, 34, 32, 30, 28, 25, 23, 21, + 19, 17, 15, 13, 10, 8, 6, 4, 2, 0 +}; + +static const char AztecCompactOffset[4] = { + 6, 4, 2, 0 +}; diff --git a/3rdparty/zint-2.6.1/backend/bmp.c b/3rdparty/zint-2.6.1/backend/bmp.c new file mode 100644 index 0000000..536bb4f --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/bmp.c @@ -0,0 +1,147 @@ +/* bmp.c - Handles output to Windows Bitmap file */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include "common.h" +#include "bmp.h" /* Bitmap header structure */ +#include +#ifdef _MSC_VER +#include +#include +#endif + +#define SSET "0123456789ABCDEF" + +int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) { + int i, row, column; + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + int row_size; + unsigned int data_size; + unsigned char *bitmap_file_start, *bmp_posn; + char *bitmap; + FILE *bmp_file; + bitmap_file_header_t file_header; + bitmap_info_header_t info_header; + + if (symbol->bitmap != NULL) + free(symbol->bitmap); + + row_size = 4 * floor((24.0 * symbol->bitmap_width + 31) / 32); + bitmap = (char *) malloc(row_size * symbol->bitmap_height); + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + /* Pixel Plotting */ + i = 0; + for (row = 0; row < symbol->bitmap_height; row++) { + for (column = 0; column < symbol->bitmap_width; column++) { + i = (3 * column) + (row * row_size); + switch (*(pixelbuf + (symbol->bitmap_width * (symbol->bitmap_height - row - 1)) + column)) { + case '1': + bitmap[i] = fgblu; + bitmap[i + 1] = fggrn; + bitmap[i + 2] = fgred; + break; + default: + bitmap[i] = bgblu; + bitmap[i + 1] = bggrn; + bitmap[i + 2] = bgred; + break; + + } + } + } + + data_size = symbol->bitmap_height * row_size; + symbol->bitmap_byte_length = data_size; + + file_header.header_field = 0x4d42; // "BM" + file_header.file_size = sizeof (bitmap_file_header_t) + sizeof (bitmap_info_header_t) + data_size; + file_header.reserved = 0; + file_header.data_offset = sizeof (bitmap_file_header_t) + sizeof (bitmap_info_header_t); + + info_header.header_size = sizeof (bitmap_info_header_t); + info_header.width = symbol->bitmap_width; + info_header.height = symbol->bitmap_height; + info_header.colour_planes = 1; + info_header.bits_per_pixel = 24; + info_header.compression_method = 0; // BI_RGB + info_header.image_size = 0; + info_header.horiz_res = 0; + info_header.vert_res = 0; + info_header.colours = 0; + info_header.important_colours = 0; + + bitmap_file_start = (unsigned char*) malloc(file_header.file_size); + memset(bitmap_file_start, 0xff, file_header.file_size); + + bmp_posn = bitmap_file_start; + memcpy(bitmap_file_start, &file_header, sizeof (bitmap_file_header_t)); + bmp_posn += sizeof (bitmap_file_header_t); + memcpy(bmp_posn, &info_header, sizeof (bitmap_info_header_t)); + bmp_posn += sizeof (bitmap_info_header_t); + memcpy(bmp_posn, bitmap, data_size); + + /* Open output file in binary mode */ + if ((symbol->output_options & BARCODE_STDOUT) != 0) { +#ifdef _MSC_VER + if (-1 == _setmode(_fileno(stdout), _O_BINARY)) { + strcpy(symbol->errtxt, "600: Can't open output file"); + free(bitmap_file_start); + free(bitmap); + return ZINT_ERROR_FILE_ACCESS; + } +#endif + bmp_file = stdout; + } else { + if (!(bmp_file = fopen(symbol->outfile, "wb"))) { + free(bitmap_file_start); + free(bitmap); + strcpy(symbol->errtxt, "601: Can't open output file"); + return ZINT_ERROR_FILE_ACCESS; + } + } + + fwrite(bitmap_file_start, file_header.file_size, 1, bmp_file); + fclose(bmp_file); + + free(bitmap_file_start); + free(bitmap); + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/bmp.h b/3rdparty/zint-2.6.1/backend/bmp.h new file mode 100644 index 0000000..ed88f86 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/bmp.h @@ -0,0 +1,76 @@ +/* bmp.h - header structure for Windows bitmap files + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#ifndef BMP_H +#define BMP_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#include +#include "stdint_msvc.h" +#else +#include +#endif + +#pragma pack (1) + + typedef struct bitmap_file_header { + uint16_t header_field; + uint32_t file_size; + uint32_t reserved; + uint32_t data_offset; + } bitmap_file_header_t; + + typedef struct bitmap_info_header { + uint32_t header_size; + int32_t width; + int32_t height; + uint16_t colour_planes; + uint16_t bits_per_pixel; + uint32_t compression_method; + uint32_t image_size; + int32_t horiz_res; + int32_t vert_res; + uint32_t colours; + uint32_t important_colours; + } bitmap_info_header_t; + +#pragma pack () + +#ifdef __cplusplus +} +#endif + +#endif /* BMP_H */ + diff --git a/3rdparty/zint-2.6.1/backend/codablock.c b/3rdparty/zint-2.6.1/backend/codablock.c new file mode 100644 index 0000000..d6e1524 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/codablock.c @@ -0,0 +1,1008 @@ +/* codablock.c - Handles Codablock-F and Codablock-E */ + +/* + libzint - the open source barcode library + Copyright (C) 2016 Harald Oehlmann + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include "gs1.h" + +#define uchar unsigned char + +/* FTab C128 flags - may be added */ +#define CodeA 1 +#define CodeB 2 +#define CodeC 4 +#define CEnd 8 +#define CShift 16 +#define CFill 32 +#define CodeFNC1 64 +#define ZTNum (CodeA+CodeB+CodeC) +#define ZTFNC1 (CodeA+CodeB+CodeC+CodeFNC1) + +/* ASCII-Extension for Codablock-F */ +#define aFNC1 (uchar)(128) +#define aFNC2 (uchar)(129) +#define aFNC3 (uchar)(130) +#define aFNC4 (uchar)(131) +#define aCodeA (uchar)(132) +#define aCodeB (uchar)(133) +#define aCodeC (uchar)(134) +#define aShift (uchar)(135) + +static const char *C128Table[107] = { + /* Code 128 character encodation - Table 1 */ + "212222", "222122", "222221", "121223", "121322", "131222", "122213", + "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", + "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", + "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", + "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", + "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", + "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", + "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", + "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", + "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", + "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", + "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", + "2331112" +}; + +/* Code F Analysing-Chart */ +typedef struct sCharacterSetTable +{ + int CharacterSet; /* Still possible character sets for actual*/ + int AFollowing; /* Still following Characters in Charset A */ + int BFollowing; /* Still following Characters in Charset B */ + int CFollowing; /* Still following Characters in Charset C */ +} CharacterSetTable; + +/* Find the possible Code-128 Character sets for a character + * The result is an or of CodeA,CodeB,CodeC,CodeFNC1 in dependency of the + * possible Code 128 character sets. + */ +int GetPossibleCharacterSet(unsigned char C) +{ + if (C<='\x19') /* Dec:31 */ + return CodeA; + if (C>='0' && C<='9') + return ZTNum; /* ZTNum=CodeA+CodeB+CodeC */ + if (C==aFNC1) + return ZTFNC1; /* ZTFNC1=CodeA+CodeB+CodeC+CodeFNC1 */ + if (C>='\x60' && C<='\x7f') /* 60 to 127 */ + return CodeB; + return CodeA+CodeB; +} + +/* Create a Table with the following information for each Data character: + * int CharacterSet is an or of CodeA,CodeB,CodeC,CodeFNC1, in + * dependency which character set is applicable. + * (Result of GetPossibleCharacterSet) + * int AFollowing,BFollowing The number of source characters you still may encode + * in this character set. + * int CFollowing The number of characters encodable in CodeC if we + * start here. + */ +static void CreateCharacterSetTable(CharacterSetTable T[], unsigned char *data,const size_t dataLength) +{ + int charCur; + int runChar; + + /* Treat the Data backwards */ + charCur=dataLength-1; + T[charCur].CharacterSet=GetPossibleCharacterSet(data[charCur]); + T[charCur].AFollowing=((T[charCur].CharacterSet & CodeA)==0)?0:1; + T[charCur].BFollowing=((T[charCur].CharacterSet & CodeB)==0)?0:1; + T[charCur].CFollowing=0; + + for (charCur--;charCur>=0;charCur--) + { + T[charCur].CharacterSet=GetPossibleCharacterSet(data[charCur]); + T[charCur].AFollowing= + ((T[charCur].CharacterSet & CodeA)==0)?0:T[charCur+1].AFollowing+1; + T[charCur].BFollowing= + ((T[charCur].CharacterSet & CodeB)==0)?0:T[charCur+1].BFollowing+1; + T[charCur].CFollowing=0; + + } + /* Find the CodeC-chains */ + for (charCur=0;charCur=dataLength) + break; + /* Only a Number may follow */ + if (T[runChar].CharacterSet==ZTNum) + T[charCur].CFollowing+=2; + else + break; + } + ++runChar; + } while (runChar0 && runChar44) are requested the columns is extended. + * A oneLigner may be choosen if shorter. + * Parameters : + * T Pointer on the Characters which fit in the row + * If a different count is calculated it is corrected + * in the callers workspace. + * pFillings Output of filling characters + * pSet Output of the character sets used, allocated by me. + * Data The Data string to encode, exceptionnally not an out + * Return value Resulting row count + */ + +static int Columns2Rows(CharacterSetTable *T, unsigned char *data, const size_t dataLength, + int * pRows, int * pUseColumns, int * pSet, int * pFillings) +{ + int useColumns; /* Usable Characters per line */ + int fillings; /* Number of filling characters */ + int rowsCur; + int charCur; + int runChar; + int emptyColumns; /* Number of codes still empty in line. */ + int emptyColumns2; /* Alternative emptyColumns to compare */ + int fOneLiner; /* Flag if One Liner */ + int CPaires; /* Number of digit pairs which may fit in the line */ + int characterSetCur; /* Current Character Set */ + + useColumns=*pUseColumns; + if (useColumns<3) + useColumns=3; + + /* >>> Loop until rowsCur<44 */ + do { + memset(pSet,0,dataLength*sizeof(int)); + charCur=0; + rowsCur=0; + fOneLiner=1; /* First try one-Liner */ + + /* >>> Line and OneLiner-try Loop */ + do{ + /* >> Start Character */ + emptyColumns=useColumns; /* Remained place in Line */ + if (fOneLiner) + emptyColumns+=2; + + /* >>Choose in Set A or B */ + /* (C is changed as an option later on) */ + + pSet[charCur]=characterSetCur= + (T[charCur].AFollowing > T[charCur].BFollowing) + ? CodeA : CodeB; + + /* >> Test on Numeric Mode C */ + CPaires=RemainingDigits(T,charCur, emptyColumns); + if (CPaires>=4) + { + /* 4 Digits in Numeric compression ->OK */ + /* > May an odd start find more ? */ + /* Skip leading 's */ + /* Typical structure : 12... */ + /* Test if numeric after one isn't better.*/ + runChar=charCur; + emptyColumns2=emptyColumns; + while (T[runChar].CharacterSet==ZTFNC1) + { + ++runChar; + --emptyColumns2; + } + if (CPaires>=RemainingDigits(T,runChar+1,emptyColumns2-1)) + { + /* Start odd is not better */ + /* We start in C */ + pSet[charCur]=characterSetCur=CodeC; + /* Inkrement charCur */ + if (T[charCur].CharacterSet!=ZTFNC1) + ++charCur; /* 2 Num.Digits */ + } + } + ++charCur; + --emptyColumns; + + /* >> Following characters */ + while(emptyColumns>0 && charCur> Check switching to CodeC */ + /* Switch if : + * - Character not FNC1 + * - 4 real Digits will fit in line + * - an odd Start will not be better + */ + if (T[charCur].CharacterSet==ZTNum + && (CPaires=RemainingDigits(T,charCur, emptyColumns-1))>=4 + && CPaires > RemainingDigits(T,charCur+1,emptyColumns-2)) + { + /* > Change to C */ + pSet[charCur]=characterSetCur=CodeC; + charCur+=2; /* 2 Digit */ + emptyColumns-=2; /* 12 */ + } else if (characterSetCur==CodeA) + { + if(T[charCur].AFollowing==0) + { + /* Must change to B */ + if (emptyColumns==1) + { + /* Can't switch: */ + pSet[charCur-1]|=CEnd+CFill; + emptyColumns=0; + }else{ + /* or ? */ + if (T[charCur].BFollowing==1) + { + pSet[charCur]|=CShift; + } else { + pSet[charCur]|=CodeB; + characterSetCur = CodeB; + } + emptyColumns-=2; + ++charCur; + } + }else{ + --emptyColumns; + ++charCur; + } + } else { /* Last possibility : CodeB */ + if(T[charCur].BFollowing==0) + { + /* Must change to A */ + if (emptyColumns==1) + { + /* Can't switch: */ + pSet[charCur-1]|=CEnd+CFill; + emptyColumns=0; + } else { + /* or ? */ + if (T[charCur].AFollowing==1) + { + pSet[charCur]|=CShift; + } else { + pSet[charCur]|=CodeA; + characterSetCur = CodeA; + } + emptyColumns-=2; + ++charCur; + } + }else{ + --emptyColumns; + ++charCur; + } + } + break; + case CodeC: + if(T[charCur].CFollowing>0) + { + charCur+=(T[charCur].CharacterSet==ZTFNC1)?1:2; + emptyColumns--; + }else{ + /* Must change to A or B */ + if (emptyColumns==1) + { + /* Can't switch: */ + pSet[charCur-1]|=CEnd+CFill; + emptyColumns=0; + }else{ + /* or ?*/ + characterSetCur=pSet[charCur]= + (T[charCur].AFollowing > T[charCur].BFollowing) + ?CodeA:CodeB; + emptyColumns-=2; + ++charCur; + } + } + break; + } /* switch */ + } /* while */ + + /* > End of Codeline */ + pSet[charCur-1]|=CEnd; + ++rowsCur; + if ( fOneLiner) + { + if (charCur44) { + ++useColumns; + if (useColumns > 62) { + return ZINT_ERROR_TOO_LONG; + } + } + } while(rowsCur>44); + #ifdef _DEBUG + printf(" -> out: rowsCur <%i>, useColumns <%i>, fillings <%i>\n",rowsCur,useColumns,fillings); + #endif + *pUseColumns=useColumns; + *pRows=rowsCur; + *pFillings=fillings; + return 0; +} +/* Find columns if row count is given. + */ +static int Rows2Columns(CharacterSetTable *T, unsigned char *data, const size_t dataLength, + int * pRows, int * pUseColumns, int * pSet, int * pFillings) +{ + int errorCur; + int rowsCur; + int rowsRequested; /* Number of requested rows */ + int backupRows = 0; + int fillings; + int backupFillings = 0; + int useColumns; + int testColumns; /* To enter into Width2Rows */ + int backupColumns = 0; + int fBackupOk = 0; /* The memorysed set is o.k. */ + int testListSize = 0; + int pTestList[62]; +#ifndef _MSC_VER + int *pBackupSet[dataLength]; +#else + int *pBackupSet = (int *)_alloca(dataLength*sizeof(int)); +#endif + + rowsRequested=*pRows; + + #ifdef _DEBUG + fprintf(stderr,"Optimizer : Searching <%i> rows\n",rowsRequested); + #endif + + if (rowsRequested==1) + /* OneLiners are self-calibrating */ + testColumns=32767; + else { + /* First guess */ + testColumns=dataLength/rowsRequested; + if (testColumns > 62) + testColumns = 62; + else if (testColumns < 1) + testColumns = 1; + } + + for (;;) { + pTestList[testListSize] = testColumns; + testListSize++; + useColumns=testColumns; /* Make a copy because it may be modified */ + errorCur = Columns2Rows(T, data, dataLength, &rowsCur, &useColumns, pSet, &fillings); + if (errorCur != 0) + return errorCur; + if (rowsCur<=rowsRequested) { + /* Less or exactly line number found */ + /* check if column count below already tested or Count = 1*/ + int fInTestList = (rowsCur == 1 || testColumns == 1); + int posCur; + for (posCur = 0; posCur < testListSize && ! fInTestList; posCur++) { + if ( pTestList[posCur] == testColumns-1 ) + fInTestList = 1; + } + if (fInTestList) { + /* >> Smaller Width already tested + * if rowsCur=rowsRequested->Exit + * if rowsCur0 + * -> New search for rowsRequested:=rowsCur + */ + if ( rowsCur == rowsRequested || fillings == 0 || testColumns == 1 ) { + /* Exit with actual */ + *pFillings=fillings; + *pRows=rowsCur; + *pUseColumns = useColumns; + return 0; + } + /* Search again for smaller Line number */ + rowsRequested=rowsCur; + pTestList[0] = testColumns; + testListSize = 1; + } + /* > Test more rows (shorter CDB) */ + fBackupOk=(rowsCur==rowsRequested); + memcpy(pBackupSet,pSet,dataLength*sizeof(int)); + backupFillings=fillings; + backupColumns=useColumns; + backupRows=rowsCur; + --testColumns; + } else { + /* > To many rows */ + int fInTestList = fBackupOk; + int posCur; + for (posCur = 0; posCur < testListSize && ! fInTestList; posCur++) { + if ( pTestList[posCur] == testColumns+1 ) + fInTestList = 1; + } + if (fInTestList) { + /* The next less-rows (larger) code was + * already tested. So give the larger + * back. + */ + memcpy(pSet,pBackupSet,dataLength*sizeof(int)); + *pFillings=backupFillings; + *pRows=backupRows; + *pUseColumns=backupColumns; + return 0; + } + /* > Test less rows (longer code) */ + backupRows=rowsCur; + memcpy(pBackupSet,pSet,dataLength*sizeof(int)); + backupFillings=fillings; + backupColumns=useColumns; + fBackupOk=0; + ++testColumns; + } + } +} + +/* Print a character in character set A + */ +void A2C128_A(uchar **ppOutPos,uchar c) +{ + uchar * pOutPos = *ppOutPos; + switch(c){ + case aCodeB: *pOutPos=100; break; + case aFNC4: *pOutPos=101; break; + case aFNC1: *pOutPos=102; break; + case aFNC2: *pOutPos=97; break; + case aFNC3: *pOutPos=96; break; + case aCodeC: *pOutPos=99; break; + case aShift: *pOutPos=98; break; + default: + /* +++ HaO 13.11.98 c>' ' && c < '\x1F' corrected */ + if(c>=' ' && c<='_') + *pOutPos=(uchar)(c-' '); + else + *pOutPos=(uchar)(c+64); + break; + } + (*ppOutPos)++; +} +/* Output c in Set B + */ +void A2C128_B(uchar **ppOutPos,uchar c) +{ + uchar * pOutPos = *ppOutPos; + switch(c){ + case aFNC1: *pOutPos=102; break; + case aFNC2: *pOutPos=97; break; + case aFNC3: *pOutPos=96; break; + case aFNC4: *pOutPos=100; break; + case aCodeA: *pOutPos=101; break; + case aCodeC: *pOutPos=99; break; + case aShift: *pOutPos=98; break; + default: *pOutPos=(uchar)(c-' '); break; + } + ++(*ppOutPos); +} +/* Output c1, c2 in Set C + */ +void A2C128_C(uchar **ppOutPos,uchar c1,uchar c2) +{ + uchar * pOutPos = *ppOutPos; + switch(c1){ + case aFNC1: *pOutPos=102; break; + case aCodeB: *pOutPos=100; break; + case aCodeA: *pOutPos=101; break; + default: *pOutPos=(char)(10 * (c1- '0') + (c2 - '0'));break; + } + (*ppOutPos)++; +} +/* Output a character in Characterset + */ +void ASCIIZ128(uchar **ppOutPos, int CharacterSet,uchar c1, uchar c2) +{ + if (CharacterSet==CodeA) + A2C128_A(ppOutPos,c1); + else if(CharacterSet==CodeB) + A2C128_B(ppOutPos,c1); + else + A2C128_C(ppOutPos,c1,c2); +} +/* XLate Table A of Codablock-F Specification and call output + */ +void SumASCII(uchar **ppOutPos, int Sum, int CharacterSet) +{ + switch (CharacterSet){ + case CodeA: + A2C128_A(ppOutPos, (uchar)Sum); + break; + case CodeB: + if (Sum<=31) + A2C128_B(ppOutPos, (uchar)(Sum+96)); + else if(Sum<=47) + A2C128_B(ppOutPos, (uchar)Sum); + else + A2C128_B(ppOutPos, (uchar)(Sum+10)); + break; + case CodeC: + A2C128_C(ppOutPos + ,(char)(Sum/10+'0') ,(uchar)(Sum%10+'0')); + break; + } +} + +/* Main function called by zint framework + */ +int codablock(struct zint_symbol *symbol,const unsigned char source[], const size_t length) { + size_t charCur,dataLength; + int Error; + int rows, columns, useColumns; + int fillings; + int Sum1,Sum2; + uchar * pOutPos; + int rowCur; + int characterSetCur; + int emptyColumns; + char dest[1000]; + int r, c; +#ifdef _MSC_VER + CharacterSetTable *T; + unsigned char *data; + int *pSet; + uchar * pOutput; +#endif + + /* Parameter check */ + /* option1: rows 0: automatic, 1..44 */ + rows = symbol->option_1; + if (rows > 44) { + strcpy(symbol->errtxt, "410: Row parameter not in 0..44"); + return ZINT_ERROR_INVALID_OPTION; + } + /* option_2: (usable data) columns: 0: automatic, 6..66 */ + columns = symbol->option_2; + if ( ! (columns <= 0 || (columns >= 6 && columns <=66)) ) { + strcpy(symbol->errtxt, "411: Columns parameter not in 0,6..66"); + return ZINT_ERROR_INVALID_OPTION; + } + /* GS1 not implemented */ + if (symbol->input_mode == GS1_MODE) { + strcpy(symbol->errtxt, "412: GS1 mode not supported"); + return ZINT_ERROR_INVALID_OPTION; + } +#ifndef _MSC_VER + unsigned char data[length*2+1]; +#else + data = (unsigned char *) _alloca(length * 2+1); +#endif + + dataLength = 0; + if (symbol->output_options & READER_INIT) { + data[dataLength] = aFNC3; + dataLength++; + } + /* Replace all Codes>127 with Code-128 */ + for (charCur=0;charCur127) + { + data[dataLength] = aFNC4; + dataLength++; + data[dataLength] = (unsigned char)(source[charCur]&127); + } else + data[dataLength] = source[charCur]; + dataLength++; + } + + /* Build character set table */ +#ifndef _MSC_VER + CharacterSetTable T[dataLength]; + int pSet[dataLength]; +#else + T=(CharacterSetTable *)_alloca(dataLength*sizeof(CharacterSetTable)); + pSet = (int *)_alloca(dataLength*sizeof(int)); +#endif + CreateCharacterSetTable(T,data,dataLength); + + /* Find final row and column count */ + /* nor row nor column count given */ + if ( rows <= 0 && columns <= 5 ) { + /* Use Code128 until reasonable size */ + if (dataLength < 9) { + rows = 1; + } else { + /* use 1/1 aspect/ratio Codablock */ + columns = ((int)floor(sqrt(1.0*dataLength))+5); + if (columns > 64) + columns = 64; + #ifdef _DEBUG + printf("Auto column count for %d characters:%d\n",dataLength,columns); + #endif + } + } + /* There are 5 Codewords for Organisation Start(2),row(1),CheckSum,Stop */ + useColumns = columns - 5; + if ( rows > 0 ) { + /* row count given */ + Error=Rows2Columns(T,data,dataLength,&rows,&useColumns,pSet,&fillings); + } else { + /* column count given */ + Error=Columns2Rows(T,data,dataLength,&rows,&useColumns,pSet,&fillings); + } + if (Error != 0) { + strcpy(symbol->errtxt, "413: Data string to long"); + return Error; + } + /* Checksum */ + Sum1=Sum2=0; + if (rows>1) + { + size_t charCur; + for (charCur=0 ; charCur>> Build C128 code numbers */ + /* The C128 column count contains Start (2CW), Row ID, Checksum, Stop */ +#ifndef _MSC_VER + uchar pOutput[columns * rows]; +#else + pOutput = (unsigned char *)_alloca(columns * rows * sizeof(char)); +#endif + pOutPos = pOutput; + charCur=0; + /* >> Loop over rows */ + for (rowCur=0 ; rowCur=dataLength) + { + /* >> Empty line with StartCCodeBCodeC */ + characterSetCur=CodeC; + /* CDB Start C*/ + *pOutPos='\x67'; + pOutPos++; + *pOutPos='\x63'; + pOutPos++; + SumASCII(&pOutPos,rowCur+42,CodeC); + emptyColumns=useColumns-2; + while (emptyColumns>0) + { + if(characterSetCur==CodeC) + { + A2C128_C(&pOutPos,aCodeB,'\0'); + characterSetCur=CodeB; + }else{ + A2C128_B(&pOutPos,aCodeC); + characterSetCur=CodeC; + } + --emptyColumns; + } + }else{ + /* >> Normal Line */ + /* > Startcode */ + switch (pSet[charCur] & (CodeA+CodeB+CodeC)){ + case CodeA: + *pOutPos = '\x67'; + pOutPos++; + if (rows>1) { + *pOutPos = '\x62'; + pOutPos++; + } + characterSetCur=CodeA; + break; + case CodeB: + if (rows==1) { + *pOutPos = '\x68'; + pOutPos++; + } else { + *pOutPos = '\x67'; + pOutPos++; + *pOutPos = '\x64'; + pOutPos++; + } + characterSetCur=CodeB; + break; + case CodeC: + default: + if (rows==1) { + *pOutPos = '\x69'; + pOutPos++; + } else { + *pOutPos = '\x67'; + pOutPos++; + *pOutPos = '\x63'; + pOutPos++; + } + characterSetCur=CodeC; + break; + } + if (rows>1) + { + /* > Set F1 */ + /* In first line : # of rows */ + /* In Case of CodeA we shifted to CodeB */ + SumASCII(&pOutPos + ,(rowCur==0)?rows-2:rowCur+42 + ,(characterSetCur==CodeA)?CodeB:characterSetCur + ); + } + /* >>> Data */ + emptyColumns=useColumns; + /* +++ One liner don't have start/stop code */ + if (rows == 1) + emptyColumns +=2; + /* >> Character loop */ + while (emptyColumns>0) + { + /* ? Change character set */ + /* not at first possition (It was then the start set) */ + /* +++ special case for one-ligner */ + if (emptyColumns> Shift it and put out the shifted character */ + ASCIIZ128(&pOutPos,characterSetCur,aShift,'\0'); + emptyColumns-=2; + characterSetCur=(characterSetCur==CodeB)?CodeA:CodeB; + ASCIIZ128(&pOutPos,characterSetCur,data[charCur],'\0'); + characterSetCur=(characterSetCur==CodeB)?CodeA:CodeB; + }else{ + /* Normal Character */ + if (characterSetCur==CodeC) + { + if (data[charCur]==aFNC1) + A2C128_C(&pOutPos,aFNC1,'\0'); + else + { + A2C128_C(&pOutPos,data[charCur],data[charCur+1]); + ++charCur; + /* We need this here to get the good index */ + /* for the termination flags in Set. */ + } + }else + ASCIIZ128(&pOutPos,characterSetCur,data[charCur],'\0'); + --emptyColumns; + } + /* >> End Criteria */ + if ((pSet[charCur] & CFill)!=0) + { + /* Fill Line but leave space for checks in last line */ + if(rowCur==rows-1 && emptyColumns>=2) + emptyColumns-=2; + while(emptyColumns>0) + { + switch(characterSetCur){ + case CodeC: + A2C128_C(&pOutPos,aCodeB,'\0'); + characterSetCur=CodeB; + break; + case CodeB: + A2C128_B(&pOutPos,aCodeC); + characterSetCur=CodeC; + break; + case CodeA: + A2C128_A(&pOutPos,aCodeC); + characterSetCur=CodeC; + break; + } + --emptyColumns; + } + } + if ((pSet[charCur] & CEnd)!=0) + emptyColumns=0; + ++charCur; + } /* Loop over characters */ + } /* if filling-Line / normal */ + + /* Add checksum in last line */ + if(rows>1 && rowCur==rows-1) + { + SumASCII(&pOutPos,Sum1,characterSetCur); + SumASCII(&pOutPos,Sum2,characterSetCur); + } + /* Add Code 128 checksum */ + { + int Sum=0; + int Pos=0; + for ( ; Pos < useColumns+3 ; Pos++) + { + Sum = (Sum + + ((Pos==0?1:Pos) * pOutput[columns*rowCur+Pos]) % 103 + ) % 103; + } + *pOutPos=(uchar)Sum; + pOutPos++; + } + /* Add end character */ + *pOutPos=106; + pOutPos++; + } /* End Lineloop */ + + #ifdef _DEBUG + /* Dump the output to the screen + */ + printf("\nCode 128 Code Numbers:\n"); + { /* start a new level of local variables */ + int DPos, DPos2; + for (DPos=0 ; DPos< rows ; DPos++) + { + for (DPos2=0 ; DPos2 < columns ; DPos2++) + { + printf("%3d ",(int)(pOutput[DPos*columns+DPos2])); + } + printf("\n"); + } + } + printf("rows=%i columns=%i fillings=%i\n", rows, columns, fillings); + #endif + + /* Paint the C128 patterns */ + for (r = 0; r < rows; r++) { + strcpy(dest, ""); + for(c = 0; c < columns; c++) { + strcat(dest, C128Table[pOutput[r * columns + c]]); + } + expand(symbol, dest); + symbol->row_height[r] = 10; + } + + if (!(symbol->output_options & BARCODE_BIND)) { + symbol->output_options += BARCODE_BIND; + } + + if (symbol->border_width < 2) { + symbol->border_width = 2; + } + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/code.c b/3rdparty/zint-2.6.1/backend/code.c new file mode 100644 index 0000000..cac63ae --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/code.c @@ -0,0 +1,591 @@ +/* code.c - Handles Code 11, 39, 39+ and 93 */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* In version 0.5 this file was 1,553 lines long! */ + +#include +#include +#include +#include "common.h" + +#define SODIUM "0123456789-" +#define SILVER "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd" + +static const char *C11Table[11] = { + "111121", "211121", "121121", "221111", "112121", "212111", "122111", + "111221", "211211", "211111", "112111" +}; + +/* Code 39 tables checked against ISO/IEC 16388:2007 */ + +/* Incorporates Table A1 */ + +static const char *C39Table[43] = { + /* Code 39 character assignments (Table 1) */ + "1112212111", "2112111121", "1122111121", "2122111111", "1112211121", + "2112211111", "1122211111", "1112112121", "2112112111", "1122112111", "2111121121", + "1121121121", "2121121111", "1111221121", "2111221111", "1121221111", "1111122121", + "2111122111", "1121122111", "1111222111", "2111111221", "1121111221", "2121111211", + "1111211221", "2111211211", "1121211211", "1111112221", "2111112211", "1121112211", + "1111212211", "2211111121", "1221111121", "2221111111", "1211211121", "2211211111", + "1221211111", "1211112121", "2211112111", "1221112111", "1212121111", "1212111211", + "1211121211", "1112121211" +}; + +static const char *EC39Ctrl[128] = { + /* Encoding the full ASCII character set in Code 39 (Table A2) */ + "%U", "$A", "$B", "$C", "$D", "$E", "$F", "$G", "$H", "$I", "$J", "$K", + "$L", "$M", "$N", "$O", "$P", "$Q", "$R", "$S", "$T", "$U", "$V", "$W", "$X", "$Y", "$Z", + "%A", "%B", "%C", "%D", "%E", " ", "/A", "/B", "/C", "/D", "/E", "/F", "/G", "/H", "/I", "/J", + "/K", "/L", "-", ".", "/O", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/Z", "%F", + "%G", "%H", "%I", "%J", "%V", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "%K", "%L", "%M", "%N", "%O", + "%W", "+A", "+B", "+C", "+D", "+E", "+F", "+G", "+H", "+I", "+J", "+K", "+L", "+M", "+N", "+O", + "+P", "+Q", "+R", "+S", "+T", "+U", "+V", "+W", "+X", "+Y", "+Z", "%P", "%Q", "%R", "%S", "%T" +}; + +static const char *C93Ctrl[128] = { + "bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK", + "aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ", + "bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "$", "%", "cF", "cG", "cH", "cI", "cJ", + "+", "cL", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF", + "bG", "bH", "bI", "bJ", "bV", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", + "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bK", "bL", "bM", "bN", "bO", + "bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO", + "dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT" +}; + +static const char *C93Table[47] = { + "131112", "111213", "111312", "111411", "121113", "121212", "121311", + "111114", "131211", "141111", "211113", "211212", "211311", "221112", "221211", "231111", + "112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122", + "131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221", + "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131", + "121221", "312111", "311121", "122211" +}; + +/* Global Variables for Channel Code */ +int S[11], B[11]; +long value; +long target_value; +char pattern[30]; + +/* Function Prototypes */ +void NextS(int Chan, int i, int MaxS, int MaxB); +void NextB(int Chan, int i, int MaxB, int MaxS); + +/* *********************** CODE 11 ******************** */ +int code_11(struct zint_symbol *symbol, unsigned char source[], int length) { /* Code 11 */ + + unsigned int i; + int h, c_digit, c_weight, c_count, k_digit, k_weight, k_count; + int weight[128], error_number; + char dest[1024]; /* 6 + 121 * 6 + 2 * 6 + 5 + 1 ~ 1024*/ + char checkstr[3]; + + if (length > 121) { + strcpy(symbol->errtxt, "320: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(SODIUM, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "321: Invalid characters in data"); + return error_number; + } + c_weight = 1; + c_count = 0; + k_weight = 1; + k_count = 0; + + /* start character */ + strcpy(dest, "112211"); + + /* Draw main body of barcode */ + for (i = 0; i < (unsigned int) length; i++) { + lookup(SODIUM, C11Table, source[i], dest); + if (source[i] == '-') + weight[i] = 10; + else + weight[i] = ctoi(source[i]); + } + + /* Calculate C checksum */ + for (h = length - 1; h >= 0; h--) { + c_count += (c_weight * weight[h]); + c_weight++; + + if (c_weight > 10) { + c_weight = 1; + } + } + c_digit = c_count % 11; + + weight[length] = c_digit; + + /* Calculate K checksum */ + for (h = length; h >= 0; h--) { + k_count += (k_weight * weight[h]); + k_weight++; + + if (k_weight > 9) { + k_weight = 1; + } + } + k_digit = k_count % 11; + + checkstr[0] = itoc(c_digit); + checkstr[1] = itoc(k_digit); + if (checkstr[0] == 'A') { + checkstr[0] = '-'; + } + if (checkstr[1] == 'A') { + checkstr[1] = '-'; + } + checkstr[2] = '\0'; + lookup(SODIUM, C11Table, checkstr[0], dest); + lookup(SODIUM, C11Table, checkstr[1], dest); + + /* Stop character */ + strcat(dest, "11221"); + + expand(symbol, dest); + + ustrcpy(symbol->text, source); + strcat((char*) symbol->text, checkstr); + return error_number; +} + +/* Code 39 */ +int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length) { + unsigned int i; + unsigned int counter; + char check_digit; + int error_number; + char dest[775]; + char localstr[2] = {0}; + + counter = 0; + + if ((symbol->option_2 < 0) || (symbol->option_2 > 1)) { + symbol->option_2 = 0; + } + + if ((symbol->symbology == BARCODE_LOGMARS) && (length > 59)) { + strcpy(symbol->errtxt, "322: Input too long"); + return ZINT_ERROR_TOO_LONG; + } else if (length > 74) { + strcpy(symbol->errtxt, "323: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + to_upper(source); + error_number = is_sane(SILVER, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "324: Invalid characters in data"); + return error_number; + } + + /* Start character */ + strcpy(dest, "1211212111"); + + for (i = 0; i < (unsigned int) length; i++) { + lookup(SILVER, C39Table, source[i], dest); + counter += posn(SILVER, source[i]); + } + + if ((symbol->symbology == BARCODE_LOGMARS) || (symbol->option_2 == 1)) { + + counter = counter % 43; + if (counter < 10) { + check_digit = itoc(counter); + } else { + if (counter < 36) { + check_digit = (counter - 10) + 'A'; + } else { + switch (counter) { + case 36: check_digit = '-'; + break; + case 37: check_digit = '.'; + break; + case 38: check_digit = ' '; + break; + case 39: check_digit = '$'; + break; + case 40: check_digit = '/'; + break; + case 41: check_digit = '+'; + break; + case 42: check_digit = 37; + break; + default: check_digit = ' '; + break; /* Keep compiler happy */ + } + } + } + lookup(SILVER, C39Table, check_digit, dest); + + /* Display a space check digit as _, otherwise it looks like an error */ + if (check_digit == ' ') { + check_digit = '_'; + } + + localstr[0] = check_digit; + localstr[1] = '\0'; + } + + /* Stop character */ + strcat(dest, "121121211"); + + if ((symbol->symbology == BARCODE_LOGMARS) || (symbol->symbology == BARCODE_HIBC_39)) { + /* LOGMARS uses wider 'wide' bars than normal Code 39 */ + counter = (unsigned int) strlen(dest); + for (i = 0; i < counter; i++) { + if (dest[i] == '2') { + dest[i] = '3'; + } + } + } + + expand(symbol, dest); + + if (symbol->symbology == BARCODE_CODE39) { + strcpy((char*) symbol->text, "*"); + strcat((char*) symbol->text, (char*) source); + strcat((char*) symbol->text, localstr); + strcat((char*) symbol->text, "*"); + } else { + strcpy((char*) symbol->text, (char*) source); + strcat((char*) symbol->text, localstr); + } + return error_number; +} + +/* Pharmazentral Nummer (PZN) */ +int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length) { + + int i, error_number, zeroes; + unsigned int count, check_digit; + char localstr[11]; + + count = 0; + if (length > 7) { + strcpy(symbol->errtxt, "325: Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "326: Invalid characters in data"); + return error_number; + } + + localstr[0] = '-'; + zeroes = 7 - length + 1; + for (i = 1; i < zeroes; i++) + localstr[i] = '0'; + strcpy(localstr + zeroes, (char *) source); + + for (i = 1; i < 8; i++) { + count += i * ctoi(localstr[i]); + } + + check_digit = count % 11; + if (check_digit == 11) { + check_digit = 0; + } + localstr[8] = itoc(check_digit); + localstr[9] = '\0'; + if (localstr[8] == 'A') { + strcpy(symbol->errtxt, "327: Invalid PZN Data"); + return ZINT_ERROR_INVALID_DATA; + } + error_number = c39(symbol, (unsigned char *) localstr, strlen(localstr)); + ustrcpy(symbol->text, (unsigned char *) "PZN"); + strcat((char*) symbol->text, localstr); + return error_number; +} + +/* Extended Code 39 - ISO/IEC 16388:2007 Annex A */ +int ec39(struct zint_symbol *symbol, unsigned char source[], int length) { + + unsigned char buffer[150] = {0}; + unsigned int i; + int error_number; + + if (length > 74) { + strcpy(symbol->errtxt, "328: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* Creates a buffer string and places control characters into it */ + for (i = 0; i < (unsigned int) length; i++) { + if (source[i] > 127) { + /* Cannot encode extended ASCII */ + strcpy(symbol->errtxt, "329: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + strcat((char*) buffer, EC39Ctrl[source[i]]); + } + + /* Then sends the buffer to the C39 function */ + error_number = c39(symbol, buffer, ustrlen(buffer)); + + for (i = 0; i < (unsigned int) length; i++) + symbol->text[i] = source[i] ? source[i] : ' '; + symbol->text[length] = '\0'; + + return error_number; +} + +/* Code 93 is an advancement on Code 39 and the definition is a lot tighter */ +int c93(struct zint_symbol *symbol, unsigned char source[], int length) { + + /* SILVER includes the extra characters a, b, c and d to represent Code 93 specific + shift characters 1, 2, 3 and 4 respectively. These characters are never used by + c39() and ec39() */ + + int i; + int h, weight, c, k, values[128], error_number; + char buffer[220]; + char dest[670]; + char set_copy[] = SILVER; + + error_number = 0; + strcpy(buffer, ""); + + if (length > 107) { + strcpy(symbol->errtxt, "330: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* Message Content */ + for (i = 0; i < length; i++) { + if (source[i] > 127) { + /* Cannot encode extended ASCII */ + strcpy(symbol->errtxt, "331: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + strcat(buffer, C93Ctrl[source[i]]); + symbol->text[i] = source[i] ? source[i] : ' '; + } + + /* Now we can check the true length of the barcode */ + h = (int) strlen(buffer); + if (h > 107) { + strcpy(symbol->errtxt, "332: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + for (i = 0; i < h; i++) { + values[i] = posn(SILVER, buffer[i]); + } + + /* Putting the data into dest[] is not done until after check digits are calculated */ + + /* Check digit C */ + c = 0; + weight = 1; + for (i = h - 1; i >= 0; i--) { + c += values[i] * weight; + weight++; + if (weight == 21) + weight = 1; + } + c = c % 47; + values[h] = c; + buffer[h] = set_copy[c]; + + /* Check digit K */ + k = 0; + weight = 1; + for (i = h; i >= 0; i--) { + k += values[i] * weight; + weight++; + if (weight == 16) + weight = 1; + } + k = k % 47; + buffer[++h] = set_copy[k]; + buffer[++h] = '\0'; + + /* Start character */ + strcpy(dest, "111141"); + + for (i = 0; i < h; i++) { + lookup(SILVER, C93Table, buffer[i], dest); + } + + /* Stop character */ + strcat(dest, "1111411"); + expand(symbol, dest); + + symbol->text[length] = set_copy[c]; + symbol->text[length + 1] = set_copy[k]; + symbol->text[length + 2] = '\0'; + + return error_number; +} + +/* NextS() and NextB() are from ANSI/AIM BC12-1998 and are Copyright (c) AIM 1997 */ + +/* Their are used here on the understanding that they form part of the specification + for Channel Code and therefore their use is permitted under the following terms + set out in that document: + + "It is the intent and understanding of AIM [t]hat the symbology presented in this + specification is entirely in the public domain and free of all use restrictions, + licenses and fees. AIM USA, its memer companies, or individual officers + assume no liability for the use of this document." */ + +void CheckCharacter() { + int i; + char part[3]; + + if (value == target_value) { + /* Target reached - save the generated pattern */ + strcpy(pattern, "11110"); + for (i = 0; i < 11; i++) { + part[0] = itoc(S[i]); + part[1] = itoc(B[i]); + part[2] = '\0'; + strcat(pattern, part); + } + } +} + +void NextB(int Chan, int i, int MaxB, int MaxS) { + int b; + + b = (S[i] + B[i - 1] + S[i - 1] + B[i - 2] > 4) ? 1 : 2; + if (i < Chan + 2) { + for (; b <= MaxB; b++) { + B[i] = b; + NextS(Chan, i + 1, MaxS, MaxB + 1 - b); + } + } else if (b <= MaxB) { + B[i] = MaxB; + CheckCharacter(); + value++; + } +} + +void NextS(int Chan, int i, int MaxS, int MaxB) { + int s; + + for (s = (i < Chan + 2) ? 1 : MaxS; s <= MaxS; s++) { + S[i] = s; + NextB(Chan, i, MaxB, MaxS + 1 - s); + } +} + +/* Channel Code - According to ANSI/AIM BC12-1998 */ +int channel_code(struct zint_symbol *symbol, unsigned char source[], int length) { + int channels, i; + int error_number = 0, range = 0, zeroes; + char hrt[9]; + + target_value = 0; + + if (length > 7) { + strcpy(symbol->errtxt, "333: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "334: Invalid characters in data"); + return error_number; + } + + if ((symbol->option_2 < 3) || (symbol->option_2 > 8)) { + channels = 0; + } else { + channels = symbol->option_2; + } + if (channels == 0) { + channels = length + 1; + } + if (channels == 2) { + channels = 3; + } + + for (i = 0; i < length; i++) { + target_value *= 10; + target_value += ctoi((char) source[i]); + } + + switch (channels) { + case 3: if (target_value > 26) { + range = 1; + } + break; + case 4: if (target_value > 292) { + range = 1; + } + break; + case 5: if (target_value > 3493) { + range = 1; + } + break; + case 6: if (target_value > 44072) { + range = 1; + } + break; + case 7: if (target_value > 576688) { + range = 1; + } + break; + case 8: if (target_value > 7742862) { + range = 1; + } + break; + } + if (range) { + strcpy(symbol->errtxt, "335: Value out of range"); + return ZINT_ERROR_INVALID_DATA; + } + + for (i = 0; i < 11; i++) { + B[i] = 0; + S[i] = 0; + } + + B[0] = S[1] = B[1] = S[2] = B[2] = 1; + value = 0; + NextS(channels, 3, channels, channels); + + zeroes = channels - 1 - length; + memset(hrt, '0', zeroes); + strcpy(hrt + zeroes, (char *) source); + ustrcpy(symbol->text, (unsigned char *) hrt); + + expand(symbol, pattern); + + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/code1.c b/3rdparty/zint-2.6.1/backend/code1.c new file mode 100644 index 0000000..5e5861a --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/code1.c @@ -0,0 +1,1765 @@ +/* code1.c - USS Code One */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include "common.h" +#include "code1.h" +#include "reedsol.h" +#include "large.h" +#include +#include +#include + +void horiz(struct zint_symbol *symbol, int row_no, int full) { + int i; + + if (full) { + for (i = 0; i < symbol->width; i++) { + set_module(symbol, row_no, i); + } + } else { + for (i = 1; i < symbol->width - 1; i++) { + set_module(symbol, row_no, i); + } + } +} + +void central_finder(struct zint_symbol *symbol, int start_row, int row_count, int full_rows) { + int i; + + for (i = 0; i < row_count; i++) { + if (i < full_rows) { + horiz(symbol, start_row + (i * 2), 1); + } else { + horiz(symbol, start_row + (i * 2), 0); + if (i != row_count - 1) { + set_module(symbol, start_row + (i * 2) + 1, 1); + set_module(symbol, start_row + (i * 2) + 1, symbol->width - 2); + } + } + } +} + +void vert(struct zint_symbol *symbol, int column, int height, int top) { + int i; + + if (top) { + for (i = 0; i < height; i++) { + set_module(symbol, i, column); + } + } else { + for (i = 0; i < height; i++) { + set_module(symbol, symbol->rows - i - 1, column); + } + } +} + +void spigot(struct zint_symbol *symbol, int row_no) { + int i; + + for (i = symbol->width - 1; i > 0; i--) { + if (module_is_set(symbol, row_no, i - 1)) { + set_module(symbol, row_no, i); + } + } +} + +int isedi(unsigned char input) { + int result = 0; + + if (input == 13) { + result = 1; + } + if (input == '*') { + result = 1; + } + if (input == '>') { + result = 1; + } + if (input == ' ') { + result = 1; + } + if ((input >= '0') && (input <= '9')) { + result = 1; + } + if ((input >= 'A') && (input <= 'Z')) { + result = 1; + } + + return result; +} + +int dq4bi(unsigned char source[], int sourcelen, int position) { + int i; + + for (i = position; isedi(source[position + i]) && ((position + i) < sourcelen); i++); + + if ((position + i) == sourcelen) { + /* Reached end of input */ + return 0; + } + + if (source[position + i - 1] == 13) { + return 1; + } + if (source[position + i - 1] == '*') { + return 1; + } + if (source[position + i - 1] == '>') { + return 1; + } + + return 0; +} + +static int c1_look_ahead_test(unsigned char source[], int sourcelen, int position, int current_mode, int gs1) { + float ascii_count, c40_count, text_count, edi_count, byte_count; + char reduced_char; + int done, best_scheme, best_count, sp; + + /* Step J */ + if (current_mode == C1_ASCII) { + ascii_count = 0.0; + c40_count = 1.0; + text_count = 1.0; + edi_count = 1.0; + byte_count = 2.0; + } else { + ascii_count = 1.0; + c40_count = 2.0; + text_count = 2.0; + edi_count = 2.0; + byte_count = 3.0; + } + + switch (current_mode) { + case C1_C40: c40_count = 0.0; + break; + case C1_TEXT: text_count = 0.0; + break; + case C1_BYTE: byte_count = 0.0; + break; + case C1_EDI: edi_count = 0.0; + break; + } + + for (sp = position; (sp < sourcelen) && (sp <= (position + 8)); sp++) { + + if (source[sp] <= 127) { + reduced_char = source[sp]; + } else { + reduced_char = source[sp] - 127; + } + + /* Step L */ + if ((source[sp] >= '0') && (source[sp] <= '9')) { + ascii_count += 0.5; + } else { + ascii_count = ceil(ascii_count); + if (source[sp] > 127) { + ascii_count += 2.0; + } else { + ascii_count += 1.0; + } + } + + /* Step M */ + done = 0; + if (reduced_char == ' ') { + c40_count += (2.0 / 3.0); + done = 1; + } + if ((reduced_char >= '0') && (reduced_char <= '9')) { + c40_count += (2.0 / 3.0); + done = 1; + } + if ((reduced_char >= 'A') && (reduced_char <= 'Z')) { + c40_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] > 127) { + c40_count += (4.0 / 3.0); + } + if (done == 0) { + c40_count += (4.0 / 3.0); + } + + /* Step N */ + done = 0; + if (reduced_char == ' ') { + text_count += (2.0 / 3.0); + done = 1; + } + if ((reduced_char >= '0') && (reduced_char <= '9')) { + text_count += (2.0 / 3.0); + done = 1; + } + if ((reduced_char >= 'a') && (reduced_char <= 'z')) { + text_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] > 127) { + text_count += (4.0 / 3.0); + } + if (done == 0) { + text_count += (4.0 / 3.0); + } + + /* Step O */ + done = 0; + if (source[sp] == 13) { + edi_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] == '*') { + edi_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] == '>') { + edi_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] == ' ') { + edi_count += (2.0 / 3.0); + done = 1; + } + if ((source[sp] >= '0') && (source[sp] <= '9')) { + edi_count += (2.0 / 3.0); + done = 1; + } + if ((source[sp] >= 'A') && (source[sp] <= 'Z')) { + edi_count += (2.0 / 3.0); + done = 1; + } + if (source[sp] > 127) { + edi_count += (13.0 / 3.0); + } else { + if (done == 0) { + edi_count += (10.0 / 3.0); + } + } + + /* Step P */ + if (gs1 && (source[sp] == '[')) { + byte_count += 3.0; + } else { + byte_count += 1.0; + } + + } + + ascii_count = ceil(ascii_count); + c40_count = ceil(c40_count); + text_count = ceil(text_count); + edi_count = ceil(edi_count); + byte_count = ceil(byte_count); + best_scheme = C1_ASCII; + + if (sp == sourcelen) { + /* Step K */ + best_count = (int) edi_count; + + if (text_count <= best_count) { + best_count = (int) text_count; + best_scheme = C1_TEXT; + } + + if (c40_count <= best_count) { + best_count = (int) c40_count; + best_scheme = C1_C40; + } + + if (ascii_count <= best_count) { + best_count = (int) ascii_count; + best_scheme = C1_ASCII; + } + + if (byte_count <= best_count) { + best_count = (int) byte_count; + best_scheme = C1_BYTE; + } + } else { + /* Step Q */ + + if (((edi_count + 1.0 <= ascii_count) && (edi_count + 1.0 <= c40_count)) && + ((edi_count + 1.0 <= byte_count) && (edi_count + 1.0 <= text_count))) { + best_scheme = C1_EDI; + } + + if ((c40_count + 1.0 <= ascii_count) && (c40_count + 1.0 <= text_count)) { + + if (c40_count < edi_count) { + best_scheme = C1_C40; + } else { + done = 0; + if (c40_count == edi_count) { + if (dq4bi(source, sourcelen, position)) { + best_scheme = C1_EDI; + } else { + best_scheme = C1_C40; + } + } + } + } + + if (((text_count + 1.0 <= ascii_count) && (text_count + 1.0 <= c40_count)) && + ((text_count + 1.0 <= byte_count) && (text_count + 1.0 <= edi_count))) { + best_scheme = C1_TEXT; + } + + if (((ascii_count + 1.0 <= byte_count) && (ascii_count + 1.0 <= c40_count)) && + ((ascii_count + 1.0 <= text_count) && (ascii_count + 1.0 <= edi_count))) { + best_scheme = C1_ASCII; + } + + if (((byte_count + 1.0 <= ascii_count) && (byte_count + 1.0 <= c40_count)) && + ((byte_count + 1.0 <= text_count) && (byte_count + 1.0 <= edi_count))) { + best_scheme = C1_BYTE; + } + } + + return best_scheme; +} + +int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int target[], int length) { + int current_mode, next_mode; + int sp, tp, gs1, i, j, p, latch; + int c40_buffer[6], c40_p; + int text_buffer[6], text_p; + int edi_buffer[6], edi_p; + char decimal_binary[40]; + int byte_start = 0; + + sp = 0; + tp = 0; + latch = 0; + memset(c40_buffer, 0, 6); + c40_p = 0; + memset(text_buffer, 0, 6); + text_p = 0; + memset(edi_buffer, 0, 6); + edi_p = 0; + strcpy(decimal_binary, ""); + + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + } else { + gs1 = 0; + } + if (gs1) { + /* FNC1 */ + target[tp] = 232; + tp++; + } + + /* Step A */ + current_mode = C1_ASCII; + next_mode = C1_ASCII; + + do { + if (current_mode != next_mode) { + /* Change mode */ + switch (next_mode) { + case C1_C40: target[tp] = 230; + tp++; + break; + case C1_TEXT: target[tp] = 239; + tp++; + break; + case C1_EDI: target[tp] = 238; + tp++; + break; + case C1_BYTE: target[tp] = 231; + tp++; + break; + } + } + + if ((current_mode != C1_BYTE) && (next_mode == C1_BYTE)) { + byte_start = tp; + } + current_mode = next_mode; + + if (current_mode == C1_ASCII) { + /* Step B - ASCII encodation */ + next_mode = C1_ASCII; + + if ((length - sp) >= 21) { + /* Step B1 */ + j = 0; + + for (i = 0; i < 21; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if (j == 21) { + next_mode = C1_DECIMAL; + bin_append(15, 4, decimal_binary); + } + } + + if ((next_mode == C1_ASCII) && ((length - sp) >= 13)) { + /* Step B2 */ + j = 0; + + for (i = 0; i < 13; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if (j == 13) { + latch = 0; + for (i = sp + 13; i < length; i++) { + if (!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { + latch = 1; + } + } + + if (!(latch)) { + next_mode = C1_DECIMAL; + bin_append(15, 4, decimal_binary); + } + } + } + + if (next_mode == C1_ASCII) { /* Step B3 */ + if (istwodigits(source, sp) && ((sp + 1) != length)) { + target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130; + tp++; + sp += 2; + } else { + if ((gs1) && (source[sp] == '[')) { + if ((length - sp) >= 15) { + /* Step B4 */ + j = 0; + + for (i = 0; i < 15; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if (j == 15) { + target[tp] = 236; /* FNC1 and change to Decimal */ + tp++; + sp++; + next_mode = C1_DECIMAL; + } + } + + if ((length - sp) >= 7) { /* Step B5 */ + j = 0; + + for (i = 0; i < 7; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if (j == 7) { + latch = 0; + for (i = sp + 7; i < length; i++) { + if (!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { + latch = 1; + } + } + + if (!(latch)) { + target[tp] = 236; /* FNC1 and change to Decimal */ + tp++; + sp++; + next_mode = C1_DECIMAL; + } + } + } + } + + if (next_mode == C1_ASCII) { + + /* Step B6 */ + next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); + + if (next_mode == C1_ASCII) { + if (source[sp] > 127) { + /* Step B7 */ + target[tp] = 235; /* FNC4 */ + tp++; + target[tp] = (source[sp] - 128) + 1; + tp++; + sp++; + } else { + /* Step B8 */ + if ((gs1) && (source[sp] == '[')) { + target[tp] = 232; /* FNC1 */ + tp++; + sp++; + } else { + target[tp] = source[sp] + 1; + tp++; + sp++; + } + } + } + } + } + } + } + + if (current_mode == C1_C40) { + /* Step C - C40 encodation */ + int shift_set, value, done = 0, latch = 0; + + next_mode = C1_C40; + if (c40_p == 0) { + if ((length - sp) >= 12) { + j = 0; + + for (i = 0; i < 12; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if (j == 12) { + next_mode = C1_ASCII; + done = 1; + } + } + + if ((length - sp) >= 8) { + j = 0; + + for (i = 0; i < 8; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if ((length - sp) == 8) { + latch = 1; + } else { + latch = 1; + for (j = sp + 8; j < length; j++) { + if ((source[j] <= '0') || (source[j] >= '9')) { + latch = 0; + } + } + } + + if ((j == 8) && latch) { + next_mode = C1_ASCII; + done = 1; + } + } + + if (!(done)) { + next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); + } + } + + if (next_mode != C1_C40) { + target[tp] = 255; /* Unlatch */ + tp++; + } else { + if (source[sp] > 127) { + c40_buffer[c40_p] = 1; + c40_p++; + c40_buffer[c40_p] = 30; /* Upper Shift */ + c40_p++; + shift_set = c40_shift[source[sp] - 128]; + value = c40_value[source[sp] - 128]; + } else { + shift_set = c40_shift[source[sp]]; + value = c40_value[source[sp]]; + } + + if (gs1 && (source[sp] == '[')) { + shift_set = 2; + value = 27; /* FNC1 */ + } + + if (shift_set != 0) { + c40_buffer[c40_p] = shift_set - 1; + c40_p++; + } + c40_buffer[c40_p] = value; + c40_p++; + + if (c40_p >= 3) { + int iv; + + iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + + c40_buffer[0] = c40_buffer[3]; + c40_buffer[1] = c40_buffer[4]; + c40_buffer[2] = c40_buffer[5]; + c40_buffer[3] = 0; + c40_buffer[4] = 0; + c40_buffer[5] = 0; + c40_p -= 3; + } + sp++; + } + } + + if (current_mode == C1_TEXT) { + /* Step D - Text encodation */ + int shift_set, value, done = 0, latch = 0; + + next_mode = C1_TEXT; + if (text_p == 0) { + if ((length - sp) >= 12) { + j = 0; + + for (i = 0; i < 12; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if (j == 12) { + next_mode = C1_ASCII; + done = 1; + } + } + + if ((length - sp) >= 8) { + j = 0; + + for (i = 0; i < 8; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if ((length - sp) == 8) { + latch = 1; + } else { + latch = 1; + for (j = sp + 8; j < length; j++) { + if ((source[j] <= '0') || (source[j] >= '9')) { + latch = 0; + } + } + } + + if ((j == 8) && latch) { + next_mode = C1_ASCII; + done = 1; + } + } + + if (!(done)) { + next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); + } + } + + if (next_mode != C1_TEXT) { + target[tp] = 255; + tp++; /* Unlatch */ + } else { + if (source[sp] > 127) { + text_buffer[text_p] = 1; + text_p++; + text_buffer[text_p] = 30; + text_p++; /* Upper Shift */ + shift_set = text_shift[source[sp] - 128]; + value = text_value[source[sp] - 128]; + } else { + shift_set = text_shift[source[sp]]; + value = text_value[source[sp]]; + } + + if (gs1 && (source[sp] == '[')) { + shift_set = 2; + value = 27; /* FNC1 */ + } + + if (shift_set != 0) { + text_buffer[text_p] = shift_set - 1; + text_p++; + } + text_buffer[text_p] = value; + text_p++; + + if (text_p >= 3) { + int iv; + + iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + + text_buffer[0] = text_buffer[3]; + text_buffer[1] = text_buffer[4]; + text_buffer[2] = text_buffer[5]; + text_buffer[3] = 0; + text_buffer[4] = 0; + text_buffer[5] = 0; + text_p -= 3; + } + sp++; + } + } + + if (current_mode == C1_EDI) { + /* Step E - EDI Encodation */ + int value = 0, latch = 0; + + next_mode = C1_EDI; + if (edi_p == 0) { + if ((length - sp) >= 12) { + j = 0; + + for (i = 0; i < 12; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if (j == 12) { + next_mode = C1_ASCII; + } + } + + if ((length - sp) >= 8) { + j = 0; + + for (i = 0; i < 8; i++) { + if ((source[sp + i] >= '0') && (source[sp + i] <= '9')) { + j++; + } + } + + if ((length - sp) == 8) { + latch = 1; + } else { + latch = 1; + for (j = sp + 8; j < length; j++) { + if ((source[j] <= '0') || (source[j] >= '9')) { + latch = 0; + } + } + } + + if ((j == 8) && latch) { + next_mode = C1_ASCII; + } + } + + if (!((isedi(source[sp]) && isedi(source[sp + 1])) && isedi(source[sp + 2]))) { + next_mode = C1_ASCII; + } + } + + if (next_mode != C1_EDI) { + target[tp] = 255; /* Unlatch */ + tp++; + } else { + if (source[sp] == 13) { + value = 0; + } + if (source[sp] == '*') { + value = 1; + } + if (source[sp] == '>') { + value = 2; + } + if (source[sp] == ' ') { + value = 3; + } + if ((source[sp] >= '0') && (source[sp] <= '9')) { + value = source[sp] - '0' + 4; + } + if ((source[sp] >= 'A') && (source[sp] <= 'Z')) { + value = source[sp] - 'A' + 14; + } + + edi_buffer[edi_p] = value; + edi_p++; + + if (edi_p >= 3) { + int iv; + + iv = (1600 * edi_buffer[0]) + (40 * edi_buffer[1]) + (edi_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + + edi_buffer[0] = edi_buffer[3]; + edi_buffer[1] = edi_buffer[4]; + edi_buffer[2] = edi_buffer[5]; + edi_buffer[3] = 0; + edi_buffer[4] = 0; + edi_buffer[5] = 0; + edi_p -= 3; + } + sp++; + } + } + + if (current_mode == C1_DECIMAL) { + /* Step F - Decimal encodation */ + int decimal_count, data_left; + + next_mode = C1_DECIMAL; + + data_left = length - sp; + decimal_count = 0; + + if (data_left >= 1) { + if ((source[sp] >= '0') && (source[sp] <= '9')) { + decimal_count = 1; + } + } + if (data_left >= 2) { + if ((decimal_count == 1) && ((source[sp + 1] >= '0') && (source[sp + 1] <= '9'))) { + decimal_count = 2; + } + } + if (data_left >= 3) { + if ((decimal_count == 2) && ((source[sp + 2] >= '0') && (source[sp + 2] <= '9'))) { + decimal_count = 3; + } + } + + if (decimal_count != 3) { + size_t bits_left_in_byte, target_count; + int sub_target; + /* Finish Decimal mode and go back to ASCII */ + + bin_append(63, 6, decimal_binary); /* Unlatch */ + + target_count = 3; + if (strlen(decimal_binary) <= 16) { + target_count = 2; + } + if (strlen(decimal_binary) <= 8) { + target_count = 1; + } + bits_left_in_byte = (8 * target_count) - strlen(decimal_binary); + if (bits_left_in_byte == 8) { + bits_left_in_byte = 0; + } + + if (bits_left_in_byte == 2) { + bin_append(1, 2, decimal_binary); + } + + if ((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) { + if (decimal_count >= 1) { + bin_append(ctoi(source[sp]) + 1, 4, decimal_binary); + sp++; + } else { + bin_append(15, 4, decimal_binary); + } + } + + if (bits_left_in_byte == 6) { + bin_append(1, 2, decimal_binary); + } + + /* Binary buffer is full - transfer to target */ + if (target_count >= 1) { + sub_target = 0; + + for (i = 0; i < 8; i++) { + if (decimal_binary[i] == '1') { + sub_target += 128 >> i; + } + } + target[tp] = sub_target; + tp++; + } + if (target_count >= 2) { + sub_target = 0; + + for (i = 0; i < 8; i++) { + if (decimal_binary[i + 8] == '1') { + sub_target += 128 >> i; + } + } + target[tp] = sub_target; + tp++; + } + if (target_count == 3) { + sub_target = 0; + + for (i = 0; i < 8; i++) { + if (decimal_binary[i + 16] == '1') { + sub_target += 128 >> i; + } + } + target[tp] = sub_target; + tp++; + } + + next_mode = C1_ASCII; + } else { + /* There are three digits - convert the value to binary */ + bin_append((100 * ctoi(source[sp])) + (10 * ctoi(source[sp + 1])) + ctoi(source[sp + 2]) + 1, 10, decimal_binary); + sp += 3; + } + + if (strlen(decimal_binary) >= 24) { + int target1 = 0, target2 = 0, target3 = 0; + char temp_binary[40]; + + /* Binary buffer is full - transfer to target */ + + for (p = 0; p < 8; p++) { + if (decimal_binary[p] == '1') { + target1 += (0x80 >> p); + } + if (decimal_binary[p + 8] == '1') { + target2 += (0x80 >> p); + } + if (decimal_binary[p + 16] == '1') { + target3 += (0x80 >> p); + } + } + target[tp] = target1; + tp++; + target[tp] = target2; + tp++; + target[tp] = target3; + tp++; + + strcpy(temp_binary, ""); + if (strlen(decimal_binary) > 24) { + for (i = 0; i <= (int) (strlen(decimal_binary) - 24); i++) { + temp_binary[i] = decimal_binary[i + 24]; + } + strcpy(decimal_binary, temp_binary); + } + } + } + + if (current_mode == C1_BYTE) { + next_mode = C1_BYTE; + + if (gs1 && (source[sp] == '[')) { + next_mode = C1_ASCII; + } else { + if (source[sp] <= 127) { + next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); + } + } + + if (next_mode != C1_BYTE) { + /* Insert byte field length */ + if ((tp - byte_start) <= 249) { + for (i = tp; i >= byte_start; i--) { + target[i + 1] = target[i]; + } + target[byte_start] = (tp - byte_start); + tp++; + } else { + for (i = tp; i >= byte_start; i--) { + target[i + 2] = target[i]; + } + target[byte_start] = 249 + ((tp - byte_start) / 250); + target[byte_start + 1] = ((tp - byte_start) % 250); + tp += 2; + } + } else { + target[tp] = source[sp]; + tp++; + sp++; + } + } + + if (tp > 1480) { + /* Data is too large for symbol */ + strcpy(symbol->errtxt, "511: Input data too long"); + return 0; + } + } while (sp < length); + + /* Empty buffers */ + if (c40_p == 2) { + int iv; + + c40_buffer[2] = 1; + iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + target[tp] = 255; + tp++; /* Unlatch */ + } + if (c40_p == 1) { + int iv; + + c40_buffer[1] = 1; + c40_buffer[2] = 31; /* Pad */ + iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + target[tp] = 255; + tp++; /* Unlatch */ + } + if (text_p == 2) { + int iv; + + text_buffer[2] = 1; + iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + target[tp] = 255; + tp++; /* Unlatch */ + } + if (text_p == 1) { + int iv; + + text_buffer[1] = 1; + text_buffer[2] = 31; /* Pad */ + iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; + target[tp] = iv / 256; + tp++; + target[tp] = iv % 256; + tp++; + target[tp] = 255; + tp++; /* Unlatch */ + } + + if (current_mode == C1_DECIMAL) { + size_t bits_left_in_byte, target_count; + int sub_target; + /* Finish Decimal mode and go back to ASCII */ + + bin_append(63, 6, decimal_binary); /* Unlatch */ + + target_count = 3; + if (strlen(decimal_binary) <= 16) { + target_count = 2; + } + if (strlen(decimal_binary) <= 8) { + target_count = 1; + } + bits_left_in_byte = (8 * target_count) - strlen(decimal_binary); + if (bits_left_in_byte == 8) { + bits_left_in_byte = 0; + } + + if (bits_left_in_byte == 2) { + bin_append(1, 2, decimal_binary); + } + + if ((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) { + bin_append(15, 4, decimal_binary); + } + + if (bits_left_in_byte == 6) { + bin_append(1, 2, decimal_binary); + } + + /* Binary buffer is full - transfer to target */ + if (target_count >= 1) { + sub_target = 0; + + for (i = 0; i < 8; i++) { + if (decimal_binary[i] == '1') { + sub_target += 128 >> i; + } + } + target[tp] = sub_target; + tp++; + } + if (target_count >= 2) { + sub_target = 0; + + for (i = 0; i < 8; i++) { + if (decimal_binary[i + 8] == '1') { + sub_target += 128 >> i; + } + } + target[tp] = sub_target; + tp++; + } + if (target_count == 3) { + sub_target = 0; + + for (i = 0; i < 8; i++) { + if (decimal_binary[i + 16] == '1') { + sub_target += 128 >> i; + } + } + target[tp] = sub_target; + tp++; + } + } + + if (current_mode == C1_BYTE) { + /* Insert byte field length */ + if ((tp - byte_start) <= 249) { + for (i = tp; i >= byte_start; i--) { + target[i + 1] = target[i]; + } + target[byte_start] = (tp - byte_start); + tp++; + } else { + for (i = tp; i >= byte_start; i--) { + target[i + 2] = target[i]; + } + target[byte_start] = 249 + ((tp - byte_start) / 250); + target[byte_start + 1] = ((tp - byte_start) % 250); + tp += 2; + } + } + + /* Re-check length of data */ + if (tp > 1480) { + /* Data is too large for symbol */ + strcpy(symbol->errtxt, "512: Input data too long"); + return 0; + } + /* + printf("targets:\n"); + for(i = 0; i < tp; i++) { + printf("[%d]", target[i]); + } + printf("\n"); + */ + return tp; +} + +void block_copy(struct zint_symbol *symbol, char grid[][120], int start_row, int start_col, int height, int width, int row_offset, int col_offset) { + int i, j; + + for (i = start_row; i < (start_row + height); i++) { + for (j = start_col; j < (start_col + width); j++) { + if (grid[i][j] == '1') { + set_module(symbol, i + row_offset, j + col_offset); + } + } + } +} + +int code_one(struct zint_symbol *symbol, unsigned char source[], int length) { + int size = 1, i, j, data_blocks; + + char datagrid[136][120]; + int row, col; + int sub_version = 0; + + if ((symbol->option_2 < 0) || (symbol->option_2 > 10)) { + strcpy(symbol->errtxt, "513: Invalid symbol size"); + return ZINT_ERROR_INVALID_OPTION; + } + + if (symbol->option_2 == 9) { + /* Version S */ + int codewords; + short int elreg[112]; + unsigned int data[15], ecc[15]; + int stream[30]; + int block_width; + + if (length > 18) { + strcpy(symbol->errtxt, "514: Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + if (is_sane(NEON, source, length) == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "515: Invalid input data (Version S encodes numeric input only)"); + return ZINT_ERROR_INVALID_DATA; + } + + sub_version = 3; + codewords = 12; + block_width = 6; /* Version S-30 */ + if (length <= 12) { + /* Version S-20 */ + sub_version = 2; + codewords = 8; + block_width = 4; + } + if (length <= 6) { + /* Version S-10 */ + sub_version = 1; + codewords = 4; + block_width = 2; + } + + binary_load(elreg, (char *) source, length); + + for (i = 0; i < 15; i++) { + data[i] = 0; + ecc[i] = 0; + } + + for (i = 0; i < codewords; i++) { + data[codewords - i - 1] += 1 * elreg[(i * 5)]; + data[codewords - i - 1] += 2 * elreg[(i * 5) + 1]; + data[codewords - i - 1] += 4 * elreg[(i * 5) + 2]; + data[codewords - i - 1] += 8 * elreg[(i * 5) + 3]; + data[codewords - i - 1] += 16 * elreg[(i * 5) + 4]; + } + + rs_init_gf(0x25); + rs_init_code(codewords, 1); + rs_encode_long(codewords, data, ecc); + rs_free(); + + for (i = 0; i < codewords; i++) { + stream[i] = data[i]; + stream[i + codewords] = ecc[codewords - i - 1]; + } + + for (i = 0; i < 136; i++) { + for (j = 0; j < 120; j++) { + datagrid[i][j] = '0'; + } + } + + i = 0; + for (row = 0; row < 2; row++) { + for (col = 0; col < block_width; col++) { + if (stream[i] & 0x10) { + datagrid[row * 2][col * 5] = '1'; + } + if (stream[i] & 0x08) { + datagrid[row * 2][(col * 5) + 1] = '1'; + } + if (stream[i] & 0x04) { + datagrid[row * 2][(col * 5) + 2] = '1'; + } + if (stream[i] & 0x02) { + datagrid[(row * 2) + 1][col * 5] = '1'; + } + if (stream[i] & 0x01) { + datagrid[(row * 2) + 1][(col * 5) + 1] = '1'; + } + if (stream[i + 1] & 0x10) { + datagrid[row * 2][(col * 5) + 3] = '1'; + } + if (stream[i + 1] & 0x08) { + datagrid[row * 2][(col * 5) + 4] = '1'; + } + if (stream[i + 1] & 0x04) { + datagrid[(row * 2) + 1][(col * 5) + 2] = '1'; + } + if (stream[i + 1] & 0x02) { + datagrid[(row * 2) + 1][(col * 5) + 3] = '1'; + } + if (stream[i + 1] & 0x01) { + datagrid[(row * 2) + 1][(col * 5) + 4] = '1'; + } + i += 2; + } + } + + size = 9; + symbol->rows = 8; + symbol->width = 10 * sub_version + 1; + } + + if (symbol->option_2 == 10) { + /* Version T */ + unsigned int data[40], ecc[25]; + unsigned int stream[65]; + int data_length; + int data_cw, ecc_cw, block_width; + + for (i = 0; i < 40; i++) { + data[i] = 0; + } + data_length = c1_encode(symbol, source, data, length); + + if (data_length == 0) { + return ZINT_ERROR_TOO_LONG; + } + + if (data_length > 38) { + strcpy(symbol->errtxt, "516: Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + + size = 10; + sub_version = 3; + data_cw = 38; + ecc_cw = 22; + block_width = 12; + if (data_length <= 24) { + sub_version = 2; + data_cw = 24; + ecc_cw = 16; + block_width = 8; + } + if (data_length <= 10) { + sub_version = 1; + data_cw = 10; + ecc_cw = 10; + block_width = 4; + } + + for (i = data_length; i < data_cw; i++) { + data[i] = 129; /* Pad */ + } + + /* Calculate error correction data */ + rs_init_gf(0x12d); + rs_init_code(ecc_cw, 1); + rs_encode_long(data_cw, data, ecc); + rs_free(); + + /* "Stream" combines data and error correction data */ + for (i = 0; i < data_cw; i++) { + stream[i] = data[i]; + } + for (i = 0; i < ecc_cw; i++) { + stream[data_cw + i] = ecc[ecc_cw - i - 1]; + } + + for (i = 0; i < 136; i++) { + for (j = 0; j < 120; j++) { + datagrid[i][j] = '0'; + } + } + + i = 0; + for (row = 0; row < 5; row++) { + for (col = 0; col < block_width; col++) { + if (stream[i] & 0x80) { + datagrid[row * 2][col * 4] = '1'; + } + if (stream[i] & 0x40) { + datagrid[row * 2][(col * 4) + 1] = '1'; + } + if (stream[i] & 0x20) { + datagrid[row * 2][(col * 4) + 2] = '1'; + } + if (stream[i] & 0x10) { + datagrid[row * 2][(col * 4) + 3] = '1'; + } + if (stream[i] & 0x08) { + datagrid[(row * 2) + 1][col * 4] = '1'; + } + if (stream[i] & 0x04) { + datagrid[(row * 2) + 1][(col * 4) + 1] = '1'; + } + if (stream[i] & 0x02) { + datagrid[(row * 2) + 1][(col * 4) + 2] = '1'; + } + if (stream[i] & 0x01) { + datagrid[(row * 2) + 1][(col * 4) + 3] = '1'; + } + i++; + } + } + + symbol->rows = 16; + symbol->width = (sub_version * 16) + 1; + } + + if ((symbol->option_2 != 9) && (symbol->option_2 != 10)) { + /* Version A to H */ + unsigned int data[1500], ecc[600]; + unsigned int sub_data[190], sub_ecc[75]; + unsigned int stream[2100]; + int data_length; + + for (i = 0; i < 1500; i++) { + data[i] = 0; + } + data_length = c1_encode(symbol, source, data, length); + + if (data_length == 0) { + strcpy(symbol->errtxt, "517: Input data is too long"); + return ZINT_ERROR_TOO_LONG; + } + + for (i = 7; i >= 0; i--) { + if (c1_data_length[i] >= data_length) { + size = i + 1; + } + } + + if (symbol->option_2 > size) { + size = symbol->option_2; + } + + if ((symbol-> option_2 != 0) && (symbol->option_2 < size)) { + strcpy(symbol->errtxt, "518: Input too long for selected symbol size"); + return ZINT_ERROR_TOO_LONG; + } + + for (i = data_length; i < c1_data_length[size - 1]; i++) { + data[i] = 129; /* Pad */ + } + + /* Calculate error correction data */ + data_length = c1_data_length[size - 1]; + for (i = 0; i < 190; i++) { + sub_data[i] = 0; + } + for (i = 0; i < 75; i++) { + sub_ecc[i] = 0; + } + + data_blocks = c1_blocks[size - 1]; + + rs_init_gf(0x12d); + rs_init_code(c1_ecc_blocks[size - 1], 0); + for (i = 0; i < data_blocks; i++) { + for (j = 0; j < c1_data_blocks[size - 1]; j++) { + + sub_data[j] = data[j * data_blocks + i]; + } + rs_encode_long(c1_data_blocks[size - 1], sub_data, sub_ecc); + for (j = 0; j < c1_ecc_blocks[size - 1]; j++) { + ecc[c1_ecc_length[size - 1] - (j * data_blocks + i) - 1] = sub_ecc[j]; + } + } + rs_free(); + + /* "Stream" combines data and error correction data */ + for (i = 0; i < data_length; i++) { + stream[i] = data[i]; + } + for (i = 0; i < c1_ecc_length[size - 1]; i++) { + stream[data_length + i] = ecc[i]; + } + + for (i = 0; i < 136; i++) { + for (j = 0; j < 120; j++) { + datagrid[i][j] = '0'; + } + } + + i = 0; + for (row = 0; row < c1_grid_height[size - 1]; row++) { + for (col = 0; col < c1_grid_width[size - 1]; col++) { + if (stream[i] & 0x80) { + datagrid[row * 2][col * 4] = '1'; + } + if (stream[i] & 0x40) { + datagrid[row * 2][(col * 4) + 1] = '1'; + } + if (stream[i] & 0x20) { + datagrid[row * 2][(col * 4) + 2] = '1'; + } + if (stream[i] & 0x10) { + datagrid[row * 2][(col * 4) + 3] = '1'; + } + if (stream[i] & 0x08) { + datagrid[(row * 2) + 1][col * 4] = '1'; + } + if (stream[i] & 0x04) { + datagrid[(row * 2) + 1][(col * 4) + 1] = '1'; + } + if (stream[i] & 0x02) { + datagrid[(row * 2) + 1][(col * 4) + 2] = '1'; + } + if (stream[i] & 0x01) { + datagrid[(row * 2) + 1][(col * 4) + 3] = '1'; + } + i++; + } + } + + symbol->rows = c1_height[size - 1]; + symbol->width = c1_width[size - 1]; + } + + switch (size) { + case 1: /* Version A */ + central_finder(symbol, 6, 3, 1); + vert(symbol, 4, 6, 1); + vert(symbol, 12, 5, 0); + set_module(symbol, 5, 12); + spigot(symbol, 0); + spigot(symbol, 15); + block_copy(symbol, datagrid, 0, 0, 5, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 5, 12, 0, 2); + block_copy(symbol, datagrid, 5, 0, 5, 12, 6, 0); + block_copy(symbol, datagrid, 5, 12, 5, 4, 6, 2); + break; + case 2: /* Version B */ + central_finder(symbol, 8, 4, 1); + vert(symbol, 4, 8, 1); + vert(symbol, 16, 7, 0); + set_module(symbol, 7, 16); + spigot(symbol, 0); + spigot(symbol, 21); + block_copy(symbol, datagrid, 0, 0, 7, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 7, 16, 0, 2); + block_copy(symbol, datagrid, 7, 0, 7, 16, 8, 0); + block_copy(symbol, datagrid, 7, 16, 7, 4, 8, 2); + break; + case 3: /* Version C */ + central_finder(symbol, 11, 4, 2); + vert(symbol, 4, 11, 1); + vert(symbol, 26, 13, 1); + vert(symbol, 4, 10, 0); + vert(symbol, 26, 10, 0); + spigot(symbol, 0); + spigot(symbol, 27); + block_copy(symbol, datagrid, 0, 0, 10, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 10, 20, 0, 2); + block_copy(symbol, datagrid, 0, 24, 10, 4, 0, 4); + block_copy(symbol, datagrid, 10, 0, 10, 4, 8, 0); + block_copy(symbol, datagrid, 10, 4, 10, 20, 8, 2); + block_copy(symbol, datagrid, 10, 24, 10, 4, 8, 4); + break; + case 4: /* Version D */ + central_finder(symbol, 16, 5, 1); + vert(symbol, 4, 16, 1); + vert(symbol, 20, 16, 1); + vert(symbol, 36, 16, 1); + vert(symbol, 4, 15, 0); + vert(symbol, 20, 15, 0); + vert(symbol, 36, 15, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 27); + spigot(symbol, 39); + block_copy(symbol, datagrid, 0, 0, 15, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 15, 14, 0, 2); + block_copy(symbol, datagrid, 0, 18, 15, 14, 0, 4); + block_copy(symbol, datagrid, 0, 32, 15, 4, 0, 6); + block_copy(symbol, datagrid, 15, 0, 15, 4, 10, 0); + block_copy(symbol, datagrid, 15, 4, 15, 14, 10, 2); + block_copy(symbol, datagrid, 15, 18, 15, 14, 10, 4); + block_copy(symbol, datagrid, 15, 32, 15, 4, 10, 6); + break; + case 5: /* Version E */ + central_finder(symbol, 22, 5, 2); + vert(symbol, 4, 22, 1); + vert(symbol, 26, 24, 1); + vert(symbol, 48, 22, 1); + vert(symbol, 4, 21, 0); + vert(symbol, 26, 21, 0); + vert(symbol, 48, 21, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 39); + spigot(symbol, 51); + block_copy(symbol, datagrid, 0, 0, 21, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 21, 20, 0, 2); + block_copy(symbol, datagrid, 0, 24, 21, 20, 0, 4); + block_copy(symbol, datagrid, 0, 44, 21, 4, 0, 6); + block_copy(symbol, datagrid, 21, 0, 21, 4, 10, 0); + block_copy(symbol, datagrid, 21, 4, 21, 20, 10, 2); + block_copy(symbol, datagrid, 21, 24, 21, 20, 10, 4); + block_copy(symbol, datagrid, 21, 44, 21, 4, 10, 6); + break; + case 6: /* Version F */ + central_finder(symbol, 31, 5, 3); + vert(symbol, 4, 31, 1); + vert(symbol, 26, 35, 1); + vert(symbol, 48, 31, 1); + vert(symbol, 70, 35, 1); + vert(symbol, 4, 30, 0); + vert(symbol, 26, 30, 0); + vert(symbol, 48, 30, 0); + vert(symbol, 70, 30, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 24); + spigot(symbol, 45); + spigot(symbol, 57); + spigot(symbol, 69); + block_copy(symbol, datagrid, 0, 0, 30, 4, 0, 0); + block_copy(symbol, datagrid, 0, 4, 30, 20, 0, 2); + block_copy(symbol, datagrid, 0, 24, 30, 20, 0, 4); + block_copy(symbol, datagrid, 0, 44, 30, 20, 0, 6); + block_copy(symbol, datagrid, 0, 64, 30, 4, 0, 8); + block_copy(symbol, datagrid, 30, 0, 30, 4, 10, 0); + block_copy(symbol, datagrid, 30, 4, 30, 20, 10, 2); + block_copy(symbol, datagrid, 30, 24, 30, 20, 10, 4); + block_copy(symbol, datagrid, 30, 44, 30, 20, 10, 6); + block_copy(symbol, datagrid, 30, 64, 30, 4, 10, 8); + break; + case 7: /* Version G */ + central_finder(symbol, 47, 6, 2); + vert(symbol, 6, 47, 1); + vert(symbol, 27, 49, 1); + vert(symbol, 48, 47, 1); + vert(symbol, 69, 49, 1); + vert(symbol, 90, 47, 1); + vert(symbol, 6, 46, 0); + vert(symbol, 27, 46, 0); + vert(symbol, 48, 46, 0); + vert(symbol, 69, 46, 0); + vert(symbol, 90, 46, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 24); + spigot(symbol, 36); + spigot(symbol, 67); + spigot(symbol, 79); + spigot(symbol, 91); + spigot(symbol, 103); + block_copy(symbol, datagrid, 0, 0, 46, 6, 0, 0); + block_copy(symbol, datagrid, 0, 6, 46, 19, 0, 2); + block_copy(symbol, datagrid, 0, 25, 46, 19, 0, 4); + block_copy(symbol, datagrid, 0, 44, 46, 19, 0, 6); + block_copy(symbol, datagrid, 0, 63, 46, 19, 0, 8); + block_copy(symbol, datagrid, 0, 82, 46, 6, 0, 10); + block_copy(symbol, datagrid, 46, 0, 46, 6, 12, 0); + block_copy(symbol, datagrid, 46, 6, 46, 19, 12, 2); + block_copy(symbol, datagrid, 46, 25, 46, 19, 12, 4); + block_copy(symbol, datagrid, 46, 44, 46, 19, 12, 6); + block_copy(symbol, datagrid, 46, 63, 46, 19, 12, 8); + block_copy(symbol, datagrid, 46, 82, 46, 6, 12, 10); + break; + case 8: /* Version H */ + central_finder(symbol, 69, 6, 3); + vert(symbol, 6, 69, 1); + vert(symbol, 26, 73, 1); + vert(symbol, 46, 69, 1); + vert(symbol, 66, 73, 1); + vert(symbol, 86, 69, 1); + vert(symbol, 106, 73, 1); + vert(symbol, 126, 69, 1); + vert(symbol, 6, 68, 0); + vert(symbol, 26, 68, 0); + vert(symbol, 46, 68, 0); + vert(symbol, 66, 68, 0); + vert(symbol, 86, 68, 0); + vert(symbol, 106, 68, 0); + vert(symbol, 126, 68, 0); + spigot(symbol, 0); + spigot(symbol, 12); + spigot(symbol, 24); + spigot(symbol, 36); + spigot(symbol, 48); + spigot(symbol, 60); + spigot(symbol, 87); + spigot(symbol, 99); + spigot(symbol, 111); + spigot(symbol, 123); + spigot(symbol, 135); + spigot(symbol, 147); + block_copy(symbol, datagrid, 0, 0, 68, 6, 0, 0); + block_copy(symbol, datagrid, 0, 6, 68, 18, 0, 2); + block_copy(symbol, datagrid, 0, 24, 68, 18, 0, 4); + block_copy(symbol, datagrid, 0, 42, 68, 18, 0, 6); + block_copy(symbol, datagrid, 0, 60, 68, 18, 0, 8); + block_copy(symbol, datagrid, 0, 78, 68, 18, 0, 10); + block_copy(symbol, datagrid, 0, 96, 68, 18, 0, 12); + block_copy(symbol, datagrid, 0, 114, 68, 6, 0, 14); + block_copy(symbol, datagrid, 68, 0, 68, 6, 12, 0); + block_copy(symbol, datagrid, 68, 6, 68, 18, 12, 2); + block_copy(symbol, datagrid, 68, 24, 68, 18, 12, 4); + block_copy(symbol, datagrid, 68, 42, 68, 18, 12, 6); + block_copy(symbol, datagrid, 68, 60, 68, 18, 12, 8); + block_copy(symbol, datagrid, 68, 78, 68, 18, 12, 10); + block_copy(symbol, datagrid, 68, 96, 68, 18, 12, 12); + block_copy(symbol, datagrid, 68, 114, 68, 6, 12, 14); + break; + case 9: /* Version S */ + horiz(symbol, 5, 1); + horiz(symbol, 7, 1); + set_module(symbol, 6, 0); + set_module(symbol, 6, symbol->width - 1); + unset_module(symbol, 7, 1); + unset_module(symbol, 7, symbol->width - 2); + switch (sub_version) { + case 1: /* Version S-10 */ + set_module(symbol, 0, 5); + block_copy(symbol, datagrid, 0, 0, 4, 5, 0, 0); + block_copy(symbol, datagrid, 0, 5, 4, 5, 0, 1); + break; + case 2: /* Version S-20 */ + set_module(symbol, 0, 10); + set_module(symbol, 4, 10); + block_copy(symbol, datagrid, 0, 0, 4, 10, 0, 0); + block_copy(symbol, datagrid, 0, 10, 4, 10, 0, 1); + break; + case 3: /* Version S-30 */ + set_module(symbol, 0, 15); + set_module(symbol, 4, 15); + set_module(symbol, 6, 15); + block_copy(symbol, datagrid, 0, 0, 4, 15, 0, 0); + block_copy(symbol, datagrid, 0, 15, 4, 15, 0, 1); + break; + } + break; + case 10: /* Version T */ + horiz(symbol, 11, 1); + horiz(symbol, 13, 1); + horiz(symbol, 15, 1); + set_module(symbol, 12, 0); + set_module(symbol, 12, symbol->width - 1); + set_module(symbol, 14, 0); + set_module(symbol, 14, symbol->width - 1); + unset_module(symbol, 13, 1); + unset_module(symbol, 13, symbol->width - 2); + unset_module(symbol, 15, 1); + unset_module(symbol, 15, symbol->width - 2); + switch (sub_version) { + case 1: /* Version T-16 */ + set_module(symbol, 0, 8); + set_module(symbol, 10, 8); + block_copy(symbol, datagrid, 0, 0, 10, 8, 0, 0); + block_copy(symbol, datagrid, 0, 8, 10, 8, 0, 1); + break; + case 2: /* Version T-32 */ + set_module(symbol, 0, 16); + set_module(symbol, 10, 16); + set_module(symbol, 12, 16); + block_copy(symbol, datagrid, 0, 0, 10, 16, 0, 0); + block_copy(symbol, datagrid, 0, 16, 10, 16, 0, 1); + break; + case 3: /* Verion T-48 */ + set_module(symbol, 0, 24); + set_module(symbol, 10, 24); + set_module(symbol, 12, 24); + set_module(symbol, 14, 24); + block_copy(symbol, datagrid, 0, 0, 10, 24, 0, 0); + block_copy(symbol, datagrid, 0, 24, 10, 24, 0, 1); + break; + } + break; + } + + for (i = 0; i < symbol->rows; i++) { + symbol->row_height[i] = 1; + } + + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/code1.h b/3rdparty/zint-2.6.1/backend/code1.h new file mode 100644 index 0000000..e517544 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/code1.h @@ -0,0 +1,102 @@ +/* code1.h - Lookup info for USS Code One */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +static const char c40_shift[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +}; + +static const char c40_value[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 15, 16, 17, 18, 19, 20, 21, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 22, 23, 24, 25, 26, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 +}; + +static const char text_shift[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3 +}; + +static const char text_value[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 15, 16, 17, 18, 19, 20, 21, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 22, 23, 24, 25, 26, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 28, 29, 30, 31 +}; + +static const unsigned short int c1_height[] = { + 16, 22, 28, 40, 52, 70, 104, 148 +}; + +static const unsigned short int c1_width[] = { + 18, 22, 32, 42, 54, 76, 98, 134 +}; + +static const unsigned short int c1_data_length[] = { + 10, 19, 44, 91, 182, 370, 732, 1480 +}; + +static const unsigned short int c1_ecc_length[] = { + 10, 16, 26, 44, 70, 140, 280, 560 +}; + +static const unsigned short int c1_blocks[] = { + 1, 1, 1, 1, 1, 2, 4, 8 +}; + +static const unsigned short int c1_data_blocks[] = { + 10, 19, 44, 91, 182, 185, 183, 185 +}; + +static const unsigned short int c1_ecc_blocks[] = { + 10, 16, 26, 44, 70, 70, 70, 70 +}; + +static const unsigned short int c1_grid_width[] = { + 4, 5, 7, 9, 12, 17, 22, 30 +}; + +static const unsigned short int c1_grid_height[] = { + 5, 7, 10, 15, 21, 30, 46, 68 +}; + +#define C1_ASCII 1 +#define C1_C40 2 +#define C1_DECIMAL 3 +#define C1_TEXT 4 +#define C1_EDI 5 +#define C1_BYTE 6 \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/code128.c b/3rdparty/zint-2.6.1/backend/code128.c new file mode 100644 index 0000000..54ccf60 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/code128.c @@ -0,0 +1,1088 @@ +/* code128.c - Handles Code 128 and derivatives */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + Bugfixes thanks to Christian Sakowski and BogDan Vatra + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include "gs1.h" + +#define TRUE 1 +#define FALSE 0 +#define SHIFTA 90 +#define LATCHA 91 +#define SHIFTB 92 +#define LATCHB 93 +#define SHIFTC 94 +#define LATCHC 95 +#define AORB 96 +#define ABORC 97 + +#define DPDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*" + +static int list[2][170]; + +/* Code 128 tables checked against ISO/IEC 15417:2007 */ + +static const char *C128Table[107] = { + /* Code 128 character encodation - Table 1 */ + "212222", "222122", "222221", "121223", "121322", "131222", "122213", + "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", + "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", + "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", + "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", + "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", + "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", + "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", + "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", + "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", + "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", + "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", + "2331112" +}; + +/* Determine appropriate mode for a given character */ +int parunmodd(const unsigned char llyth) { + int modd; + modd = 0; + + if (llyth <= 31) { + modd = SHIFTA; + } else if ((llyth >= 48) && (llyth <= 57)) { + modd = ABORC; + } else if (llyth <= 95) { + modd = AORB; + } else if (llyth <= 127) { + modd = SHIFTB; + } else if (llyth <= 159) { + modd = SHIFTA; + } else if (llyth <= 223) { + modd = AORB; + } else { + modd = SHIFTB; + } + + return modd; +} + +/** + * bring together same type blocks + */ +void grwp(int *indexliste) { + int i, j; + + /* bring together same type blocks */ + if (*(indexliste) > 1) { + i = 1; + while (i < *(indexliste)) { + if (list[1][i - 1] == list[1][i]) { + /* bring together */ + list[0][i - 1] = list[0][i - 1] + list[0][i]; + j = i + 1; + + /* decreace the list */ + while (j < *(indexliste)) { + list[0][j - 1] = list[0][j]; + list[1][j - 1] = list[1][j]; + j++; + } + *(indexliste) = *(indexliste) - 1; + i--; + } + i++; + } + } +} + +/** + * Implements rules from ISO 15417 Annex E + */ +void dxsmooth(int *indexliste) { + int i, current, last, next, length; + + for (i = 0; i < *(indexliste); i++) { + current = list[1][i]; + length = list[0][i]; + if (i != 0) { + last = list[1][i - 1]; + } else { + last = FALSE; + } + if (i != *(indexliste) - 1) { + next = list[1][i + 1]; + } else { + next = FALSE; + } + + if (i == 0) { /* first block */ + if ((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { + /* Rule 1a */ + list[1][i] = LATCHC; + } + if (current == ABORC) { + if (length >= 4) { + /* Rule 1b */ + list[1][i] = LATCHC; + } else { + list[1][i] = AORB; + current = AORB; + } + } + if (current == SHIFTA) { + /* Rule 1c */ + list[1][i] = LATCHA; + } + if ((current == AORB) && (next == SHIFTA)) { + /* Rule 1c */ + list[1][i] = LATCHA; + current = LATCHA; + } + if (current == AORB) { + /* Rule 1d */ + list[1][i] = LATCHB; + } + } else { + if ((current == ABORC) && (length >= 4)) { + /* Rule 3 */ + list[1][i] = LATCHC; + current = LATCHC; + } + if (current == ABORC) { + list[1][i] = AORB; + current = AORB; + } + if ((current == AORB) && (last == LATCHA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == AORB) && (last == LATCHB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == AORB) && (next == SHIFTA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == AORB) && (next == SHIFTB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if (current == AORB) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (length > 1)) { + /* Rule 4 */ + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (length > 1)) { + /* Rule 5 */ + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (last == LATCHA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (last == LATCHB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (last == LATCHC)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (last == LATCHC)) { + list[1][i] = LATCHB; + current = LATCHB; + } + } /* Rule 2 is implimented elsewhere, Rule 6 is implied */ + } + grwp(indexliste); + +} + +/** + * Translate Code 128 Set A characters into barcodes. + * This set handles all control characters NULL to US. + */ +void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) { + + if (source > 127) { + if (source < 160) { + strcat(dest, C128Table[(source - 128) + 64]); + values[(*bar_chars)] = (source - 128) + 64; + } else { + strcat(dest, C128Table[(source - 128) - 32]); + values[(*bar_chars)] = (source - 128) - 32; + } + } else { + if (source < 32) { + strcat(dest, C128Table[source + 64]); + values[(*bar_chars)] = source + 64; + } else { + strcat(dest, C128Table[source - 32]); + values[(*bar_chars)] = source - 32; + } + } + (*bar_chars)++; +} + +/** + * Translate Code 128 Set B characters into barcodes. + * This set handles all characters which are not part of long numbers and not + * control characters. + */ +void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars) { + if (source > 127) { + strcat(dest, C128Table[source - 32 - 128]); + values[(*bar_chars)] = source - 32 - 128; + } else { + strcat(dest, C128Table[source - 32]); + values[(*bar_chars)] = source - 32; + } + (*bar_chars)++; +} + +/* Translate Code 128 Set C characters into barcodes + * This set handles numbers in a compressed form + */ +void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars) { + int weight; + + weight = (10 * ctoi(source_a)) + ctoi(source_b); + strcat(dest, C128Table[weight]); + values[(*bar_chars)] = weight; + (*bar_chars)++; +} + +/* Handle Code 128 and NVE-18 */ +int code_128(struct zint_symbol *symbol, unsigned char source[], const size_t length) { + int i, j, k, values[170] = {0}, bar_characters, read, total_sum; + int error_number, indexchaine, indexliste, f_state; + size_t sourcelen; + char set[170] = {' '}, fset[170] = {' '}, mode, last_set, current_set = ' '; + float glyph_count; + char dest[1000]; + + error_number = 0; + strcpy(dest, ""); + + sourcelen = length; + + j = 0; + bar_characters = 0; + f_state = 0; + + if (sourcelen > 160) { + /* This only blocks rediculously long input - the actual length of the + resulting barcode depends on the type of data, so this is trapped later */ + strcpy(symbol->errtxt, "340: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* Detect extended ASCII characters */ + for (i = 0; i < sourcelen; i++) { + if (source[i] >= 128) + fset[i] = 'f'; + } + fset[i] = '\0'; + + /* Decide when to latch to extended mode - Annex E note 3 */ + j = 0; + for (i = 0; i < sourcelen; i++) { + if (fset[i] == 'f') { + j++; + } else { + j = 0; + } + + if (j >= 5) { + for (k = i; k > (i - 5); k--) { + fset[k] = 'F'; + } + } + + if ((j >= 3) && (i == (sourcelen - 1))) { + for (k = i; k > (i - 3); k--) { + fset[k] = 'F'; + } + } + } + + /* Decide if it is worth reverting to 646 encodation for a few characters as described in 4.3.4.2 (d) */ + for (i = 1; i < sourcelen; i++) { + if ((fset[i - 1] == 'F') && (fset[i] == ' ')) { + /* Detected a change from 8859-1 to 646 - count how long for */ + for (j = 0; (fset[i + j] == ' ') && ((i + j) < sourcelen); j++); + if ((j < 5) || ((j < 3) && ((i + j) == (sourcelen - 1)))) { + /* Uses the same figures recommended by Annex E note 3 */ + /* Change to shifting back rather than latching back */ + for (k = 0; k < j; k++) { + fset[i + k] = 'n'; + } + } + } + } + + /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ + indexliste = 0; + indexchaine = 0; + + mode = parunmodd(source[indexchaine]); + if ((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { + mode = AORB; + } + + for (i = 0; i < 170; i++) { + list[0][i] = 0; + } + + do { + list[1][indexliste] = mode; + while ((list[1][indexliste] == mode) && (indexchaine < sourcelen)) { + list[0][indexliste]++; + indexchaine++; + mode = parunmodd(source[indexchaine]); + if ((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { + mode = AORB; + } + } + indexliste++; + } while (indexchaine < sourcelen); + + dxsmooth(&indexliste); + + /* Resolve odd length LATCHC blocks */ + if ((list[1][0] == LATCHC) && (list[0][0] & 1)) { + /* Rule 2 */ + list[0][1]++; + list[0][0]--; + if (indexliste == 1) { + list[0][1] = 1; + list[1][1] = LATCHB; + indexliste = 2; + } + } + if (indexliste > 1) { + for (i = 1; i < indexliste; i++) { + if ((list[1][i] == LATCHC) && (list[0][i] & 1)) { + /* Rule 3b */ + list[0][i - 1]++; + list[0][i]--; + } + } + } + + /* Put set data into set[] */ + + read = 0; + for (i = 0; i < indexliste; i++) { + for (j = 0; j < list[0][i]; j++) { + switch (list[1][i]) { + case SHIFTA: set[read] = 'a'; + break; + case LATCHA: set[read] = 'A'; + break; + case SHIFTB: set[read] = 'b'; + break; + case LATCHB: set[read] = 'B'; + break; + case LATCHC: set[read] = 'C'; + break; + } + read++; + } + } + + /* Adjust for strings which start with shift characters - make them latch instead */ + if (set[0] == 'a') { + i = 0; + do { + set[i] = 'A'; + i++; + } while (set[i] == 'a'); + } + + if (set[0] == 'b') { + i = 0; + do { + set[i] = 'B'; + i++; + } while (set[i] == 'b'); + } + + /* Now we can calculate how long the barcode is going to be - and stop it from + being too long */ + last_set = ' '; + glyph_count = 0.0; + for (i = 0; i < sourcelen; i++) { + if ((set[i] == 'a') || (set[i] == 'b')) { + glyph_count = glyph_count + 1.0; + } + if ((fset[i] == 'f') || (fset[i] == 'n')) { + glyph_count = glyph_count + 1.0; + } + if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { + if (set[i] != last_set) { + last_set = set[i]; + glyph_count = glyph_count + 1.0; + } + } + if (i == 0) { + if (fset[i] == 'F') { + glyph_count = glyph_count + 2.0; + } + } else { + if ((fset[i] == 'F') && (fset[i - 1] != 'F')) { + glyph_count = glyph_count + 2.0; + } + if ((fset[i] != 'F') && (fset[i - 1] == 'F')) { + glyph_count = glyph_count + 2.0; + } + } + + if (set[i] == 'C') { + glyph_count = glyph_count + 0.5; + } else { + glyph_count = glyph_count + 1.0; + } + } + if (glyph_count > 60.0) { + strcpy(symbol->errtxt, "341: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* So now we know what start character to use - we can get on with it! */ + if (symbol->output_options & READER_INIT) { + /* Reader Initialisation mode */ + switch (set[0]) { + case 'A': /* Start A */ + strcat(dest, C128Table[103]); + values[0] = 103; + current_set = 'A'; + strcat(dest, C128Table[96]); /* FNC3 */ + values[1] = 96; + bar_characters++; + break; + case 'B': /* Start B */ + strcat(dest, C128Table[104]); + values[0] = 104; + current_set = 'B'; + strcat(dest, C128Table[96]); /* FNC3 */ + values[1] = 96; + bar_characters++; + break; + case 'C': /* Start C */ + strcat(dest, C128Table[104]); /* Start B */ + values[0] = 105; + strcat(dest, C128Table[96]); /* FNC3 */ + values[1] = 96; + strcat(dest, C128Table[99]); /* Code C */ + values[2] = 99; + bar_characters += 2; + current_set = 'C'; + break; + } + } else { + /* Normal mode */ + switch (set[0]) { + case 'A': /* Start A */ + strcat(dest, C128Table[103]); + values[0] = 103; + current_set = 'A'; + break; + case 'B': /* Start B */ + strcat(dest, C128Table[104]); + values[0] = 104; + current_set = 'B'; + break; + case 'C': /* Start C */ + strcat(dest, C128Table[105]); + values[0] = 105; + current_set = 'C'; + break; + } + } + bar_characters++; + last_set = set[0]; + + if (fset[0] == 'F') { + switch (current_set) { + case 'A': + strcat(dest, C128Table[101]); + strcat(dest, C128Table[101]); + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + strcat(dest, C128Table[100]); + strcat(dest, C128Table[100]); + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } + + /* Encode the data */ + read = 0; + do { + + if ((read != 0) && (set[read] != current_set)) { + /* Latch different code set */ + switch (set[read]) { + case 'A': strcat(dest, C128Table[101]); + values[bar_characters] = 101; + bar_characters++; + current_set = 'A'; + break; + case 'B': strcat(dest, C128Table[100]); + values[bar_characters] = 100; + bar_characters++; + current_set = 'B'; + break; + case 'C': strcat(dest, C128Table[99]); + values[bar_characters] = 99; + bar_characters++; + current_set = 'C'; + break; + } + } + + if (read != 0) { + if ((fset[read] == 'F') && (f_state == 0)) { + /* Latch beginning of extended mode */ + switch (current_set) { + case 'A': + strcat(dest, C128Table[101]); + strcat(dest, C128Table[101]); + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + strcat(dest, C128Table[100]); + strcat(dest, C128Table[100]); + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } + if ((fset[read] == ' ') && (f_state == 1)) { + /* Latch end of extended mode */ + switch (current_set) { + case 'A': + strcat(dest, C128Table[101]); + strcat(dest, C128Table[101]); + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + strcat(dest, C128Table[100]); + strcat(dest, C128Table[100]); + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 0; + } + } + + if ((fset[read] == 'f') || (fset[read] == 'n')) { + /* Shift to or from extended mode */ + switch (current_set) { + case 'A': + strcat(dest, C128Table[101]); /* FNC 4 */ + values[bar_characters] = 101; + break; + case 'B': + strcat(dest, C128Table[100]); /* FNC 4 */ + values[bar_characters] = 100; + break; + } + bar_characters++; + } + + if ((set[read] == 'a') || (set[read] == 'b')) { + /* Insert shift character */ + strcat(dest, C128Table[98]); + values[bar_characters] = 98; + bar_characters++; + } + + switch (set[read]) { /* Encode data characters */ + case 'a': + case 'A': c128_set_a(source[read], dest, values, &bar_characters); + read++; + break; + case 'b': + case 'B': c128_set_b(source[read], dest, values, &bar_characters); + read++; + break; + case 'C': c128_set_c(source[read], source[read + 1], dest, values, &bar_characters); + read += 2; + break; + } + + } while (read < sourcelen); + + /* check digit calculation */ + total_sum = 0; + + for (i = 0; i < bar_characters; i++) { + if (i > 0) { + values[i] *= i; + } + total_sum += values[i]; + } + strcat(dest, C128Table[total_sum % 103]); + + /* Stop character */ + strcat(dest, C128Table[106]); + expand(symbol, dest); + return error_number; +} + +/* Handle EAN-128 (Now known as GS1-128) */ +int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length) { + int i, j, values[170], bar_characters, read, total_sum; + int error_number, indexchaine, indexliste; + char set[170], mode, last_set; + float glyph_count; + char dest[1000]; + int separator_row, linkage_flag, c_count; +#ifndef _MSC_VER + char reduced[length + 1]; +#else + char* reduced = (char*) _alloca(length + 1); +#endif + error_number = 0; + strcpy(dest, ""); + linkage_flag = 0; + + j = 0; + bar_characters = 0; + separator_row = 0; + + memset(values, 0, sizeof (values)); + memset(set, ' ', sizeof (set)); + + if (length > 160) { + /* This only blocks rediculously long input - the actual length of the + resulting barcode depends on the type of data, so this is trapped later */ + strcpy(symbol->errtxt, "342: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + for (i = 0; i < length; i++) { + if (source[i] == '\0') { + /* Null characters not allowed! */ + strcpy(symbol->errtxt, "343: NULL character in input data"); + return ZINT_ERROR_INVALID_DATA; + } + } + + /* if part of a composite symbol make room for the separator pattern */ + if (symbol->symbology == BARCODE_EAN128_CC) { + separator_row = symbol->rows; + symbol->row_height[symbol->rows] = 1; + symbol->rows += 1; + } + + if (symbol->input_mode != GS1_MODE) { + /* GS1 data has not been checked yet */ + error_number = gs1_verify(symbol, source, length, reduced); + if (error_number != 0) { + return error_number; + } + } + + /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ + indexliste = 0; + indexchaine = 0; + + mode = parunmodd(reduced[indexchaine]); + if (reduced[indexchaine] == '[') { + mode = ABORC; + } + + for (i = 0; i < 170; i++) { + list[0][i] = 0; + } + + do { + list[1][indexliste] = mode; + while ((list[1][indexliste] == mode) && (indexchaine < (int) strlen(reduced))) { + list[0][indexliste]++; + indexchaine++; + mode = parunmodd(reduced[indexchaine]); + if (reduced[indexchaine] == '[') { + mode = ABORC; + } + } + indexliste++; + } while (indexchaine < (int) strlen(reduced)); + + dxsmooth(&indexliste); + + /* Put set data into set[] */ + read = 0; + for (i = 0; i < indexliste; i++) { + for (j = 0; j < list[0][i]; j++) { + switch (list[1][i]) { + case SHIFTA: set[read] = 'a'; + break; + case LATCHA: set[read] = 'A'; + break; + case SHIFTB: set[read] = 'b'; + break; + case LATCHB: set[read] = 'B'; + break; + case LATCHC: set[read] = 'C'; + break; + } + read++; + } + } + + /* Watch out for odd-length Mode C blocks */ + c_count = 0; + for (i = 0; i < read; i++) { + if (set[i] == 'C') { + if (reduced[i] == '[') { + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } else { + c_count++; + } + } else { + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } + } + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + for (i = 1; i < read - 1; i++) { + if ((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) { + set[i] = 'B'; + } + } + + /* Now we can calculate how long the barcode is going to be - and stop it from + being too long */ + last_set = ' '; + glyph_count = 0.0; + for (i = 0; i < (int) strlen(reduced); i++) { + if ((set[i] == 'a') || (set[i] == 'b')) { + glyph_count = glyph_count + 1.0; + } + if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { + if (set[i] != last_set) { + last_set = set[i]; + glyph_count = glyph_count + 1.0; + } + } + + if ((set[i] == 'C') && (reduced[i] != '[')) { + glyph_count = glyph_count + 0.5; + } else { + glyph_count = glyph_count + 1.0; + } + } + if (glyph_count > 60.0) { + strcpy(symbol->errtxt, "344: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* So now we know what start character to use - we can get on with it! */ + switch (set[0]) { + case 'A': /* Start A */ + strcat(dest, C128Table[103]); + values[0] = 103; + break; + case 'B': /* Start B */ + strcat(dest, C128Table[104]); + values[0] = 104; + break; + case 'C': /* Start C */ + strcat(dest, C128Table[105]); + values[0] = 105; + break; + } + bar_characters++; + + strcat(dest, C128Table[102]); + values[1] = 102; + bar_characters++; + + /* Encode the data */ + read = 0; + do { + + if ((read != 0) && (set[read] != set[read - 1])) { /* Latch different code set */ + switch (set[read]) { + case 'A': strcat(dest, C128Table[101]); + values[bar_characters] = 101; + bar_characters++; + break; + case 'B': strcat(dest, C128Table[100]); + values[bar_characters] = 100; + bar_characters++; + break; + case 'C': strcat(dest, C128Table[99]); + values[bar_characters] = 99; + bar_characters++; + break; + } + } + + if ((set[read] == 'a') || (set[read] == 'b')) { + /* Insert shift character */ + strcat(dest, C128Table[98]); + values[bar_characters] = 98; + bar_characters++; + } + + if (reduced[read] != '[') { + switch (set[read]) { /* Encode data characters */ + case 'A': + case 'a': + c128_set_a(reduced[read], dest, values, &bar_characters); + read++; + break; + case 'B': + case 'b': + c128_set_b(reduced[read], dest, values, &bar_characters); + read++; + break; + case 'C': + c128_set_c(reduced[read], reduced[read + 1], dest, values, &bar_characters); + read += 2; + break; + } + } else { + strcat(dest, C128Table[102]); + values[bar_characters] = 102; + bar_characters++; + read++; + } + } while (read < (int) strlen(reduced)); + + /* "...note that the linkage flag is an extra code set character between + the last data character and the Symbol Check Character" (GS1 Specification) */ + + /* Linkage flags in GS1-128 are determined by ISO/IEC 24723 section 7.4 */ + + switch (symbol->option_1) { + case 1: + case 2: + /* CC-A or CC-B 2D component */ + switch (set[strlen(reduced) - 1]) { + case 'A': linkage_flag = 100; + break; + case 'B': linkage_flag = 99; + break; + case 'C': linkage_flag = 101; + break; + } + break; + case 3: + /* CC-C 2D component */ + switch (set[strlen(reduced) - 1]) { + case 'A': linkage_flag = 99; + break; + case 'B': linkage_flag = 101; + break; + case 'C': linkage_flag = 100; + break; + } + break; + } + + if (linkage_flag != 0) { + strcat(dest, C128Table[linkage_flag]); + values[bar_characters] = linkage_flag; + bar_characters++; + } + + /* check digit calculation */ + total_sum = 0; + for (i = 0; i < bar_characters; i++) { + if (i > 0) { + values[i] *= i; + + } + total_sum += values[i]; + } + strcat(dest, C128Table[total_sum % 103]); + values[bar_characters] = total_sum % 103; + bar_characters++; + + /* Stop character */ + strcat(dest, C128Table[106]); + values[bar_characters] = 106; + bar_characters++; + expand(symbol, dest); + + /* Add the separator pattern for composite symbols */ + if (symbol->symbology == BARCODE_EAN128_CC) { + for (i = 0; i < symbol->width; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + set_module(symbol, separator_row, i); + } + } + } + + for (i = 0; i < length; i++) { + if ((source[i] != '[') && (source[i] != ']')) { + symbol->text[i] = source[i]; + } + if (source[i] == '[') { + symbol->text[i] = '('; + } + if (source[i] == ']') { + symbol->text[i] = ')'; + } + } + + return error_number; +} + +/* Add check digit if encoding an NVE18 symbol */ +int nve_18(struct zint_symbol *symbol, unsigned char source[], int length) { + int error_number, zeroes, i, nve_check, total_sum, sourcelen; + unsigned char ean128_equiv[25]; + + memset(ean128_equiv, 0, 25); + sourcelen = length; + + if (sourcelen > 17) { + strcpy(symbol->errtxt, "345: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "346: Invalid characters in data"); + return error_number; + } + zeroes = 17 - sourcelen; + strcpy((char *) ean128_equiv, "[00]"); + memset(ean128_equiv + 4, '0', zeroes); + strcpy((char*) ean128_equiv + 4 + zeroes, (char*) source); + + total_sum = 0; + for (i = sourcelen - 1; i >= 0; i--) { + total_sum += ctoi(source[i]); + + if (!(i & 1)) { + total_sum += 2 * ctoi(source[i]); + } + } + nve_check = 10 - total_sum % 10; + if (nve_check == 10) { + nve_check = 0; + } + ean128_equiv[21] = itoc(nve_check); + ean128_equiv[22] = '\0'; + + error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); + + return error_number; +} + +/* EAN-14 - A version of EAN-128 */ +int ean_14(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, count, check_digit; + int error_number, zeroes; + unsigned char ean128_equiv[20]; + + if (length > 13) { + strcpy(symbol->errtxt, "347: Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "348: Invalid character in data"); + return error_number; + } + + zeroes = 13 - length; + strcpy((char*) ean128_equiv, "[01]"); + memset(ean128_equiv + 4, '0', zeroes); + ustrcpy(ean128_equiv + 4 + zeroes, source); + + count = 0; + for (i = length - 1; i >= 0; i--) { + count += ctoi(source[i]); + + if (!(i & 1)) { + count += 2 * ctoi(source[i]); + } + } + check_digit = 10 - (count % 10); + if (check_digit == 10) { + check_digit = 0; + } + ean128_equiv[17] = itoc(check_digit); + ean128_equiv[18] = '\0'; + + error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); + + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/code16k.c b/3rdparty/zint-2.6.1/backend/code16k.c new file mode 100644 index 0000000..f4578f3 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/code16k.c @@ -0,0 +1,733 @@ +/* code16k.c - Handles Code 16k stacked symbology */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* Updated to comply with BS EN 12323:2005 */ + +/* Code 16k can hold up to 77 characters or 154 numbers */ + +#include +#include +#include +#include "common.h" + +#define TRUE 1 +#define FALSE 0 +#define SHIFTA 90 +#define LATCHA 91 +#define SHIFTB 92 +#define LATCHB 93 +#define SHIFTC 94 +#define LATCHC 95 +#define AORB 96 +#define ABORC 97 +#define CANDB 98 +#define CANDBB 99 + +extern int parunmodd(const unsigned char llyth); + +static int list[2][170]; + +static const char *C16KTable[107] = { + /* EN 12323 Table 1 - "Code 16K" character encodations */ + "212222", "222122", "222221", "121223", "121322", "131222", "122213", + "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", + "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", + "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", + "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", + "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", + "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", + "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", + "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", + "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", + "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", + "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", + "211133" +}; + + +static const char *C16KStartStop[8] = { + /* EN 12323 Table 3 and Table 4 - Start patterns and stop patterns */ + "3211", "2221", "2122", "1411", "1132", "1231", "1114", "3112" +}; + +/* EN 12323 Table 5 - Start and stop values defining row numbers */ +static const int C16KStartValues[16] = { + 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7 +}; + +static const int C16KStopValues[16] = { + 0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3 +}; + +static void grwp16(unsigned int *indexliste) { + int i, j; + + /* bring together same type blocks */ + if (*(indexliste) > 1) { + i = 1; + while(i < (int)*(indexliste)) { + if (list[1][i - 1] == list[1][i]) { + /* bring together */ + list[0][i - 1] = list[0][i - 1] + list[0][i]; + j = i + 1; + + /* decreace the list */ + while(j < (int)*(indexliste)) { + list[0][j - 1] = list[0][j]; + list[1][j - 1] = list[1][j]; + j++; + } + *(indexliste) = *(indexliste) - 1; + i--; + } + i++; + } + } +} + +/* Implements rules from ISO 15417 Annex E */ +static void dxsmooth16(unsigned int *indexliste) { + int i, current, last, next, length; + + for(i = 0; i < (int)*(indexliste); i++) { + current = list[1][i]; + length = list[0][i]; + if (i != 0) { + last = list[1][i - 1]; + } else { + last = FALSE; + } + if (i != *(indexliste) - 1) { + next = list[1][i + 1]; + } else { + next = FALSE; + } + + if (i == 0) { + /* first block */ + if ((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { + /* Rule 1a */ + list[1][i] = LATCHC; + } + if (current == ABORC) { + if (length >= 4) { + /* Rule 1b */ + list[1][i] = LATCHC; + } else { + list[1][i] = AORB; + current = AORB; + } + } + if (current == SHIFTA) { + /* Rule 1c */ + list[1][i] = LATCHA; + } + if ((current == AORB) && (next == SHIFTA)) { + /* Rule 1c */ + list[1][i] = LATCHA; + current = LATCHA; + } + if (current == AORB) { + /* Rule 1d */ + list[1][i] = LATCHB; + } + } else { + if ((current == ABORC) && (length >= 4)) { + /* Rule 3 */ + list[1][i] = LATCHC; + current = LATCHC; + } + if (current == ABORC) { + list[1][i] = AORB; + current = AORB; + } + if ((current == AORB) && (last == LATCHA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == AORB) && (last == LATCHB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == AORB) && (next == SHIFTA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == AORB) && (next == SHIFTB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if (current == AORB) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (length > 1)) { + /* Rule 4 */ + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (length > 1)) { + /* Rule 5 */ + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (last == LATCHA)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (last == LATCHB)) { + list[1][i] = LATCHB; + current = LATCHB; + } + if ((current == SHIFTA) && (last == LATCHC)) { + list[1][i] = LATCHA; + current = LATCHA; + } + if ((current == SHIFTB) && (last == LATCHC)) { + list[1][i] = LATCHB; + current = LATCHB; + } + } /* Rule 2 is implimented elsewhere, Rule 6 is implied */ + } + grwp16(indexliste); + +} + +static void c16k_set_a(const unsigned char source, unsigned int values[], unsigned int *bar_chars) { + if (source > 127) { + if (source < 160) { + values[(*bar_chars)] = source + 64 - 128; + } else { + values[(*bar_chars)] = source - 32 - 128; + } + } else { + if (source < 32) { + values[(*bar_chars)] = source + 64; + } else { + values[(*bar_chars)] = source - 32; + } + } + (*bar_chars)++; +} + +static void c16k_set_b(const unsigned char source, unsigned int values[], unsigned int *bar_chars) { + if (source > 127) { + values[(*bar_chars)] = source - 32 - 128; + } else { + values[(*bar_chars)] = source - 32; + } + (*bar_chars)++; +} + +static void c16k_set_c(const unsigned char source_a, unsigned char source_b, unsigned int values[], unsigned int *bar_chars) { + int weight; + + weight = (10 * ctoi(source_a)) + ctoi(source_b); + values[(*bar_chars)] = weight; + (*bar_chars)++; +} + +int code16k(struct zint_symbol *symbol, unsigned char source[], const size_t length) { + char width_pattern[100]; + int current_row, rows_needed, flip_flop, looper, first_check, second_check; + int indexchaine, f_state; + char set[160] = {' '}, fset[160] = {' '}, mode, last_set, current_set; + unsigned int pads_needed, indexliste, i, j, k, m, read, mx_reader, writer; + unsigned int values[160] = {0}; + unsigned int bar_characters; + float glyph_count; + int errornum, first_sum, second_sum; + size_t input_length; + int gs1, c_count; + + errornum = 0; + strcpy(width_pattern, ""); + input_length = length; + + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + } else { + gs1 = 0; + } + + if (input_length > 157) { + strcpy(symbol->errtxt, "420: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + bar_characters = 0; + + /* Detect extended ASCII characters */ + for (i = 0; i < (unsigned int) input_length; i++) { + if (source[i] >= 128) { + fset[i] = 'f'; + } + } + fset[i] = '\0'; + + /* Decide when to latch to extended mode */ + for (i = 0; i < (unsigned int) input_length; i++) { + j = 0; + if (fset[i] == 'f') { + do { + j++; + } while (fset[i + j] == 'f'); + if ((j >= 5) || ((j >= 3) && ((i + j) == (input_length - 1)))) { + for (k = 0; k <= j; k++) { + fset[i + k] = 'F'; + } + } + } + } + + /* Decide if it is worth reverting to 646 encodation for a few characters */ + if (input_length > 1) { + for (i = 1; i < (unsigned int) input_length; i++) { + if ((fset[i - 1] == 'F') && (fset[i] == ' ')) { + /* Detected a change from 8859-1 to 646 - count how long for */ + for (j = 0; (fset[i + j] == ' ') && ((i + j) < (unsigned int) input_length); j++); + if ((j < 5) || ((j < 3) && ((i + j) == (input_length - 1)))) { + /* Change to shifting back rather than latching back */ + for (k = 0; k < j; k++) { + fset[i + k] = 'n'; + } + } + } + } + } + /* Detect mode A, B and C characters */ + indexliste = 0; + indexchaine = 0; + + mode = parunmodd(source[indexchaine]); + if ((gs1) && (source[indexchaine] == '[')) { + mode = ABORC; + } /* FNC1 */ + + for (i = 0; i < 160; i++) { + list[0][i] = 0; + } + + do { + list[1][indexliste] = mode; + while ((list[1][indexliste] == mode) && (indexchaine < input_length)) { + list[0][indexliste]++; + indexchaine++; + mode = parunmodd(source[indexchaine]); + if ((gs1) && (source[indexchaine] == '[')) { + mode = ABORC; + } /* FNC1 */ + } + indexliste++; + } while (indexchaine < input_length); + + dxsmooth16(&indexliste); + + /* Put set data into set[] */ + read = 0; + for (i = 0; i < indexliste; i++) { + for (j = 0; j < list[0][i]; j++) { + switch (list[1][i]) { + case SHIFTA: set[read] = 'a'; + break; + case LATCHA: set[read] = 'A'; + break; + case SHIFTB: set[read] = 'b'; + break; + case LATCHB: set[read] = 'B'; + break; + case LATCHC: set[read] = 'C'; + break; + } + read++; + } + } + + /* Adjust for strings which start with shift characters - make them latch instead */ + if (set[0] == 'a') { + i = 0; + do { + set[i] = 'A'; + i++; + } while (set[i] == 'a'); + } + + if (set[0] == 'b') { + i = 0; + do { + set[i] = 'B'; + i++; + } while (set[i] == 'b'); + } + + /* Watch out for odd-length Mode C blocks */ + c_count = 0; + for (i = 0; i < read; i++) { + if (set[i] == 'C') { + if (source[i] == '[') { + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } else { + c_count++; + } + } else { + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + c_count = 0; + } + } + if (c_count & 1) { + if ((i - c_count) != 0) { + set[i - c_count] = 'B'; + } else { + set[i - 1] = 'B'; + } + } + for (i = 1; i < read - 1; i++) { + if ((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) { + set[i] = 'B'; + } + } + + /* Make sure the data will fit in the symbol */ + last_set = ' '; + glyph_count = 0.0; + for (i = 0; i < input_length; i++) { + if ((set[i] == 'a') || (set[i] == 'b')) { + glyph_count = glyph_count + 1.0; + } + if ((fset[i] == 'f') || (fset[i] == 'n')) { + glyph_count = glyph_count + 1.0; + } + if (((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { + if (set[i] != last_set) { + last_set = set[i]; + glyph_count = glyph_count + 1.0; + } + } + if (i == 0) { + if ((set[i] == 'B') && (set[1] == 'C')) { + glyph_count = glyph_count - 1.0; + } + if ((set[i] == 'B') && (set[1] == 'B')) { + if (set[2] == 'C') { + glyph_count = glyph_count - 1.0; + } + } + if (fset[i] == 'F') { + glyph_count = glyph_count + 2.0; + } + } else { + if ((fset[i] == 'F') && (fset[i - 1] != 'F')) { + glyph_count = glyph_count + 2.0; + } + if ((fset[i] != 'F') && (fset[i - 1] == 'F')) { + glyph_count = glyph_count + 2.0; + } + } + + if ((set[i] == 'C') && (!((gs1) && (source[i] == '[')))) { + glyph_count = glyph_count + 0.5; + } else { + glyph_count = glyph_count + 1.0; + } + } + + if ((gs1) && (set[0] != 'A')) { + /* FNC1 can be integrated with mode character */ + glyph_count--; + } + + if (glyph_count > 77.0) { + strcpy(symbol->errtxt, "421: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* Calculate how tall the symbol will be */ + glyph_count = glyph_count + 2.0; + i = (int)glyph_count; + rows_needed = (i / 5); + if (i % 5 > 0) { + rows_needed++; + } + + if (rows_needed == 1) { + rows_needed = 2; + } + + /* start with the mode character - Table 2 */ + m = 0; + switch (set[0]) { + case 'A': m = 0; + break; + case 'B': m = 1; + break; + case 'C': m = 2; + break; + } + + if (symbol->output_options & READER_INIT) { + if (m == 2) { + m = 5; + } + if (gs1) { + strcpy(symbol->errtxt, "422: Cannot use both GS1 mode and Reader Initialisation"); + return ZINT_ERROR_INVALID_OPTION; + } else { + if ((set[0] == 'B') && (set[1] == 'C')) { + m = 6; + } + } + values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */ + values[bar_characters + 1] = 96; /* FNC3 */ + bar_characters += 2; + } else { + if (gs1) { + /* Integrate FNC1 */ + switch (set[0]) { + case 'B': m = 3; + break; + case 'C': m = 4; + break; + } + } else { + if ((set[0] == 'B') && (set[1] == 'C')) { + m = 5; + } + if (((set[0] == 'B') && (set[1] == 'B')) && (set[2] == 'C')) { + m = 6; + } + } + values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */ + bar_characters++; + } + + current_set = set[0]; + f_state = 0; + /* f_state remembers if we are in Extended ASCII mode (value 1) or + in ISO/IEC 646 mode (value 0) */ + if (fset[0] == 'F') { + switch (current_set) { + case 'A': + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } + + read = 0; + + /* Encode the data */ + do { + + if ((read != 0) && (set[read] != set[read - 1])) { + /* Latch different code set */ + switch (set[read]) { + case 'A': + values[bar_characters] = 101; + bar_characters++; + current_set = 'A'; + break; + case 'B': + values[bar_characters] = 100; + bar_characters++; + current_set = 'B'; + break; + case 'C': + if (!((read == 1) && (set[0] == 'B'))) { + /* Not Mode C/Shift B */ + if (!((read == 2) && ((set[0] == 'B') && (set[1] == 'B')))) { + /* Not Mode C/Double Shift B */ + values[bar_characters] = 99; + bar_characters++; + } + } + current_set = 'C'; + break; + } + } + + if (read != 0) { + if ((fset[read] == 'F') && (f_state == 0)) { + /* Latch beginning of extended mode */ + switch (current_set) { + case 'A': + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 1; + } + if ((fset[read] == ' ') && (f_state == 1)) { + /* Latch end of extended mode */ + switch (current_set) { + case 'A': + values[bar_characters] = 101; + values[bar_characters + 1] = 101; + break; + case 'B': + values[bar_characters] = 100; + values[bar_characters + 1] = 100; + break; + } + bar_characters += 2; + f_state = 0; + } + } + + if ((fset[i] == 'f') || (fset[i] == 'n')) { + /* Shift extended mode */ + switch (current_set) { + case 'A': + values[bar_characters] = 101; /* FNC 4 */ + break; + case 'B': + values[bar_characters] = 100; /* FNC 4 */ + break; + } + bar_characters++; + } + + if ((set[i] == 'a') || (set[i] == 'b')) { + /* Insert shift character */ + values[bar_characters] = 98; + bar_characters++; + } + + if (!((gs1) && (source[read] == '['))) { + switch (set[read]) { /* Encode data characters */ + case 'A': + case 'a': + c16k_set_a(source[read], values, &bar_characters); + read++; + break; + case 'B': + case 'b': + c16k_set_b(source[read], values, &bar_characters); + read++; + break; + case 'C': c16k_set_c(source[read], source[read + 1], values, &bar_characters); + read += 2; + break; + } + } else { + values[bar_characters] = 102; + bar_characters++; + read++; + } + } while (read < ustrlen(source)); + + pads_needed = 5 - ((bar_characters + 2) % 5); + if (pads_needed == 5) { + pads_needed = 0; + } + if ((bar_characters + pads_needed) < 8) { + pads_needed += 8 - (bar_characters + pads_needed); + } + for (i = 0; i < pads_needed; i++) { + values[bar_characters] = 106; + bar_characters++; + } + + /* Calculate check digits */ + first_sum = 0; + second_sum = 0; + for (i = 0; i < bar_characters; i++) { + first_sum += (i + 2) * values[i]; + second_sum += (i + 1) * values[i]; + } + first_check = first_sum % 107; + second_sum += first_check * (bar_characters + 1); + second_check = second_sum % 107; + values[bar_characters] = first_check; + values[bar_characters + 1] = second_check; + bar_characters += 2; + + for (current_row = 0; current_row < rows_needed; current_row++) { + + strcpy(width_pattern, ""); + strcat(width_pattern, C16KStartStop[C16KStartValues[current_row]]); + strcat(width_pattern, "1"); + for (i = 0; i < 5; i++) { + strcat(width_pattern, C16KTable[values[(current_row * 5) + i]]); + } + strcat(width_pattern, C16KStartStop[C16KStopValues[current_row]]); + + /* Write the information into the symbol */ + writer = 0; + flip_flop = 1; + for (mx_reader = 0; mx_reader < strlen(width_pattern); mx_reader++) { + for (looper = 0; looper < ctoi(width_pattern[mx_reader]); looper++) { + if (flip_flop == 1) { + set_module(symbol, current_row, writer); + writer++; + } else { + writer++; + } + } + if (flip_flop == 0) { + flip_flop = 1; + } else { + flip_flop = 0; + } + } + symbol->row_height[current_row] = 10; + } + + symbol->rows = rows_needed; + symbol->width = 70; + return errornum; +} + + diff --git a/3rdparty/zint-2.6.1/backend/code49.c b/3rdparty/zint-2.6.1/backend/code49.c new file mode 100644 index 0000000..8ab92a6 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/code49.c @@ -0,0 +1,345 @@ +/* code49.c - Handles Code 49 */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include "common.h" +#include "code49.h" + +#define INSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%!&*" + +/* "!" represents Shift 1 and "&" represents Shift 2, "*" represents FNC1 */ + +int code_49(struct zint_symbol *symbol, unsigned char source[], const int length) { + int i, j, rows, M, x_count, y_count, z_count, posn_val, local_value; + char intermediate[170] = ""; + int codewords[170], codeword_count; + int c_grid[8][8]; /* Refers to table 3 */ + int w_grid[8][4]; /* Refets to table 2 */ + int pad_count = 0; + char pattern[80]; + int gs1; + size_t h; + + if (length > 81) { + strcpy(symbol->errtxt, "430: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + strcpy(intermediate, "*"); /* FNC1 */ + } else { + gs1 = 0; + } + + for (i = 0; i < length; i++) { + if (source[i] > 127) { + strcpy(symbol->errtxt, "431: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + if (gs1 && (source[i] == '[')) + strcat(intermediate, "*"); /* FNC1 */ + else + strcat(intermediate, c49_table7[source[i]]); + } + + codeword_count = 0; + i = 0; + h = strlen(intermediate); + do { + if ((intermediate[i] >= '0') && (intermediate[i] <= '9')) { + /* Numeric data */ + for (j = 0; (intermediate[i + j] >= '0') && (intermediate[i + j] <= '9'); j++); + if (j >= 5) { + /* Use Numeric Encodation Method */ + int block_count, c; + int block_remain; + int block_value; + + codewords[codeword_count] = 48; /* Numeric Shift */ + codeword_count++; + + block_count = j / 5; + block_remain = j % 5; + + for (c = 0; c < block_count; c++) { + if ((c == block_count - 1) && (block_remain == 2)) { + /* Rule (d) */ + block_value = 100000; + block_value += ctoi(intermediate[i]) * 1000; + block_value += ctoi(intermediate[i + 1]) * 100; + block_value += ctoi(intermediate[i + 2]) * 10; + block_value += ctoi(intermediate[i + 3]); + + codewords[codeword_count] = block_value / (48 * 48); + block_value = block_value - (48 * 48) * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 4; + block_value = ctoi(intermediate[i]) * 100; + block_value += ctoi(intermediate[i + 1]) * 10; + block_value += ctoi(intermediate[i + 2]); + + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 3; + } else { + block_value = ctoi(intermediate[i]) * 10000; + block_value += ctoi(intermediate[i + 1]) * 1000; + block_value += ctoi(intermediate[i + 2]) * 100; + block_value += ctoi(intermediate[i + 3]) * 10; + block_value += ctoi(intermediate[i + 4]); + + codewords[codeword_count] = block_value / (48 * 48); + block_value = block_value - (48 * 48) * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 5; + } + } + + switch (block_remain) { + case 1: + /* Rule (a) */ + codewords[codeword_count] = posn(INSET, intermediate[i]); + codeword_count++; + i++; + break; + case 3: + /* Rule (b) */ + block_value = ctoi(intermediate[i]) * 100; + block_value += ctoi(intermediate[i + 1]) * 10; + block_value += ctoi(intermediate[i + 2]); + + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 3; + break; + case 4: + /* Rule (c) */ + block_value = 100000; + block_value += ctoi(intermediate[i]) * 1000; + block_value += ctoi(intermediate[i + 1]) * 100; + block_value += ctoi(intermediate[i + 2]) * 10; + block_value += ctoi(intermediate[i + 3]); + + codewords[codeword_count] = block_value / (48 * 48); + block_value = block_value - (48 * 48) * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value / 48; + block_value = block_value - 48 * codewords[codeword_count]; + codeword_count++; + codewords[codeword_count] = block_value; + codeword_count++; + i += 4; + break; + } + if (i < h) { + /* There is more to add */ + codewords[codeword_count] = 48; /* Numeric Shift */ + codeword_count++; + } + } else { + codewords[codeword_count] = posn(INSET, intermediate[i]); + codeword_count++; + i++; + } + } else { + codewords[codeword_count] = posn(INSET, intermediate[i]); + codeword_count++; + i++; + } + } while (i < h); + + switch (codewords[0]) { + /* Set starting mode value */ + case 48: M = 2; + break; + case 43: M = 4; + break; + case 44: M = 5; + break; + default: M = 0; + break; + } + + if (M != 0) { + codeword_count--; + for (i = 0; i < codeword_count; i++) { + codewords[i] = codewords[i + 1]; + } + } + + if (codeword_count > 49) { + strcpy(symbol->errtxt, "432: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* Place codewords in code character array (c grid) */ + rows = 0; + do { + for (i = 0; i < 7; i++) { + if (((rows * 7) + i) < codeword_count) { + c_grid[rows][i] = codewords[(rows * 7) + i]; + } else { + c_grid[rows][i] = 48; /* Pad */ + pad_count++; + } + } + rows++; + } while ((rows * 7) < codeword_count); + + if ((((rows <= 6) && (pad_count < 5))) || (rows > 6) || (rows == 1)) { + /* Add a row */ + for (i = 0; i < 7; i++) { + c_grid[rows][i] = 48; /* Pad */ + } + rows++; + } + + /* Add row count and mode character */ + c_grid[rows - 1][6] = (7 * (rows - 2)) + M; + + /* Add row check character */ + for (i = 0; i < rows - 1; i++) { + int row_sum = 0; + + for (j = 0; j < 7; j++) { + row_sum += c_grid[i][j]; + } + c_grid[i][7] = row_sum % 49; + } + + /* Calculate Symbol Check Characters */ + posn_val = 0; + x_count = c_grid[rows - 1][6] * 20; + y_count = c_grid[rows - 1][6] * 16; + z_count = c_grid[rows - 1][6] * 38; + for (i = 0; i < rows - 1; i++) { + for (j = 0; j < 4; j++) { + local_value = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1]; + x_count += c49_x_weight[posn_val] * local_value; + y_count += c49_y_weight[posn_val] * local_value; + z_count += c49_z_weight[posn_val] * local_value; + posn_val++; + } + } + + if (rows > 6) { + /* Add Z Symbol Check */ + c_grid[rows - 1][0] = (z_count % 2401) / 49; + c_grid[rows - 1][1] = (z_count % 2401) % 49; + } + + local_value = (c_grid[rows - 1][0] * 49) + c_grid[rows - 1][1]; + x_count += c49_x_weight[posn_val] * local_value; + y_count += c49_y_weight[posn_val] * local_value; + posn_val++; + + /* Add Y Symbol Check */ + c_grid[rows - 1][2] = (y_count % 2401) / 49; + c_grid[rows - 1][3] = (y_count % 2401) % 49; + + local_value = (c_grid[rows - 1][2] * 49) + c_grid[rows - 1][3]; + x_count += c49_x_weight[posn_val] * local_value; + + /* Add X Symbol Check */ + c_grid[rows - 1][4] = (x_count % 2401) / 49; + c_grid[rows - 1][5] = (x_count % 2401) % 49; + + /* Add last row check character */ + j = 0; + for (i = 0; i < 7; i++) { + j += c_grid[rows - 1][i]; + } + c_grid[rows - 1][7] = j % 49; + + /* Transfer data to symbol character array (w grid) */ + for (i = 0; i < rows; i++) { + for (j = 0; j < 4; j++) { + w_grid[i][j] = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1]; + } + } + + for (i = 0; i < rows; i++) { + strcpy(pattern, "10"); /* Start character */ + for (j = 0; j < 4; j++) { + if (i != (rows - 1)) { + if (c49_table4[i][j] == 'E') { + /* Even Parity */ + bin_append(c49_even_bitpattern[w_grid[i][j]], 16, pattern); + } else { + /* Odd Parity */ + bin_append(c49_odd_bitpattern[w_grid[i][j]], 16, pattern); + } + } else { + /* Last row uses all even parity */ + bin_append(c49_even_bitpattern[w_grid[i][j]], 16, pattern); + } + } + strcat(pattern, "1111"); /* Stop character */ + + /* Expand into symbol */ + symbol->row_height[i] = 10; + + for (j = 0; j < strlen(pattern); j++) { + if (pattern[j] == '1') { + set_module(symbol, i, j); + } + } + } + + symbol->rows = rows; + symbol->width = strlen(pattern); + symbol->whitespace_width = 10; + if (!(symbol->output_options & BARCODE_BIND)) { + symbol->output_options += BARCODE_BIND; + } + symbol->border_width = 2; + + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/code49.h b/3rdparty/zint-2.6.1/backend/code49.h new file mode 100644 index 0000000..01dec46 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/code49.h @@ -0,0 +1,558 @@ +/* code49.h - Code 49 Tables */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* This data set taken from ANSI/AIM-BC6-2000, 4th April 2000 */ + +static const char *c49_table7[128] = { + /* Table 7: Code 49 ASCII Chart */ + "! ", "!A", "!B", "!C", "!D", "!E", "!F", "!G", "!H", "!I", "!J", "!K", "!L", + "!M", "!N", "!O", "!P", "!Q", "!R", "!S", "!T", "!U", "!V", "!W", "!X", "!Y", + "!Z", "!1", "!2", "!3", "!4", "!5", " ", "!6", "!7", "!8", "$", "%", "!9", "!0", + "!-", "!.", "!$", "+", "!/", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", + "7", "8", "9", "!+", "&1", "&2", "&3", "&4", "&5", "&6", "A", "B", "C", "D", "E", + "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", + "V", "W", "X", "Y", "Z", "&7", "&8", "&9", "&0", "&-", "&.", "&A", "&B", "&C", + "&D", "&E", "&F", "&G", "&H", "&I", "&J", "&K", "&L", "&M", "&N", "&O", "&P", + "&Q", "&R", "&S", "&T", "&U", "&V", "&W", "&X", "&Y", "&Z", "&$", "&/", "&+", + "&%", "& " +}; + +/* Table 5: Check Character Weighting Values */ +static const char c49_x_weight[] = { + 1, 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, + 39, 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10 +}; + +static const char c49_y_weight[] = { + 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39, + 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24 +}; + +static const char c49_z_weight[] = { + 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39, 11, + 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24, 30 +}; + +static const char *c49_table4[8] = { + /* Table 4: Row Parity Pattern for Code 49 Symbols */ + "OEEO", "EOEO", "OOEE", "EEOO", "OEOE", "EOOE", "OOOO", "EEEE" +}; + +static const unsigned short int c49_even_bitpattern[] = { + /* Appendix E - Code 49 Encodation Patterns (Even Symbol Character Parity) */ + 0xBE5C, 0xC16E, 0x86DC, 0xC126, 0x864C, 0x9EDC, 0xC726, 0x9E4C, 0xDF26, 0x82CC, + 0x8244, 0x8ECC, 0xC322, 0x8E44, 0xBECC, 0xCF22, 0xBE44, 0xC162, 0x86C4, 0xC762, + 0x9EC4, 0xDF62, 0x812E, 0x872E, 0x9F2E, 0x836E, 0x8326, 0x8F6E, 0x8F26, 0xBF6E, + 0x8166, 0x8122, 0x8766, 0x8722, 0x9F66, 0x9F22, 0x8362, 0x8F62, 0xBF62, 0xA2E0, + 0xE8B8, 0xFA2E, 0xD370, 0xF4DC, 0xD130, 0xF44C, 0xAEE0, 0xEBB8, 0xFAEE, 0xA660, + 0xE998, 0xFA66, 0xA220, 0xE888, 0xFA22, 0xD730, 0xF5CC, 0xD310, 0xF4C4, 0xAE20, + 0xEB88, 0xFAE2, 0x9170, 0xE45C, 0xD8B8, 0xF62E, 0xC9B8, 0xF26E, 0xB370, 0xC898, + 0xF226, 0xB130, 0xEC4C, 0x9770, 0xE5DC, 0x9330, 0xE4CC, 0x9110, 0xE444, 0xD888, + 0xF622, 0xCB98, 0xF2E6, 0xB730, 0xC988, 0xF262, 0xB310, 0xECC4, 0x9710, 0xE5C4, + 0xDB88, 0xF6E2, 0x88B8, 0xE22E, 0xCC5C, 0xB8B8, 0xEE2E, 0xC4DC, 0x99B8, 0xC44C, + 0x9898, 0xE626, 0xDC4C, 0x8BB8, 0xE2EE, 0x8998, 0xE266, 0xBBB8, 0x8888, 0xE222, + 0xB998, 0xCC44, 0xB888, 0xEE22, 0xC5CC, 0x9B98, 0xC4C4, 0x9988, 0xE662, 0xDCC4, + 0x8B88, 0xE2E2, 0xCDC4, 0xBB88, 0xEEE2, 0x845C, 0xC62E, 0x9C5C, 0xDE2E, 0xC26E, + 0x8CDC, 0xC226, 0x8C4C, 0xBCDC, 0xCE26, 0xBC4C, 0x85DC, 0x84CC, 0x9DDC, 0x8444, + 0x9CCC, 0xC622, 0x9C44, 0xDE22, 0xC2E6, 0x8DCC, 0xC262, 0x8CC4, 0xBDCC, 0xCE62, + 0xBCC4, 0x85C4, 0xC6E2, 0x9DC4, 0xDEE2, 0x822E, 0x8E2E, 0x866E, 0x8626, 0x9E6E, + 0x9E26, 0x82EE, 0x8266, 0x8EEE, 0x8222, 0x8E66, 0xBEEE, 0x8E22, 0xBE66, 0x86E6, + 0x8662, 0x9EE6, 0x9E62, 0x82E2, 0x8EE2, 0xBEE2, 0xA170, 0xE85C, 0xD1B8, 0xF46E, + 0xD098, 0xF426, 0xA770, 0xE9DC, 0xA330, 0xE8CC, 0xA110, 0xE844, 0xD7B8, 0xF5EE, + 0xD398, 0xF4E6, 0xD188, 0xF462, 0xAF30, 0xEBCC, 0xA710, 0xE9C4, 0xD788, 0xF5E2, + 0x90B8, 0xE42E, 0xD85C, 0xC8DC, 0xB1B8, 0xC84C, 0xB098, 0xEC26, 0x93B8, 0xE4EE, + 0x9198, 0xE466, 0x9088, 0xE422, 0xD844, 0xCBDC, 0xB7B8, 0xC9CC, 0xB398, 0xC8C4, + 0xB188, 0xEC62, 0x9798, 0xE5E6, 0x9388, 0xE4E2, 0xD9C4, 0xCBC4, 0xB788, 0xEDE2, + 0x885C, 0xCC2E, 0xB85C, 0xC46E, 0x98DC, 0xC426, 0x984C, 0xDC26, 0x89DC, 0x88CC, + 0xB9DC, 0x8844, 0xB8CC, 0xCC22, 0xB844, 0xC5EE, 0x9BDC, 0xC4E6, 0x99CC, 0xC462, + 0x98C4, 0xDC62, 0x8BCC, 0x89C4, 0xBBCC, 0xCCE2, 0xB9C4, 0xC5E2, 0x9BC4, 0xDDE2, + 0x842E, 0x9C2E, 0x8C6E, 0x8C26, 0xBC6E, 0x84EE, 0x8466, 0x9CEE, 0x8422, 0x9C66, + 0x9C22, 0x8DEE, 0x8CE6, 0xBDEE, 0x8C62, 0xBCE6, 0xBC62, 0x85E6, 0x84E2, 0x9DE6, + 0x9CE2, 0x8DE2, 0xBDE2, 0xA0B8, 0xE82E, 0xD0DC, 0xD04C, 0xA3B8, 0xE8EE, 0xA198, + 0xE866, 0xA088, 0xE822, 0xD3DC, 0xD1CC, 0xD0C4, 0xAFB8, 0xEBEE, 0xA798, 0xE9E6, + 0xA388, 0xE8E2, 0xD7CC, 0xD3C4, 0x905C, 0xD82E, 0xC86E, 0xB0DC, 0xC826, 0xB04C, + 0x91DC, 0x90CC, 0x9044, 0xD822, 0xC9EE, 0xB3DC, 0xC8E6, 0xB1CC, 0xC862, 0xB0C4, + 0x97DC, 0x93CC, 0x91C4, 0xD8E2, 0xCBE6, 0xB7CC, 0xC9E2, 0xB3C4, 0x882E, 0x986E, + 0x9826, 0x88EE, 0x8866, 0xB8EE, 0x8822, 0xB866, 0x99EE, 0x98E6, 0x9862, 0x8BEE, + 0x89E6, 0xBBEE, 0x88E2, 0xB9E6, 0xB8E2, 0x9BE6, 0x99E2, 0xA05C, 0xD06E, 0xD026, + 0xA1DC, 0xA0CC, 0xA044, 0xD1EE, 0xD0E6, 0xD062, 0xA7DC, 0xA3CC, 0xA1C4, 0xD7EE, + 0xD3E6, 0xD1E2, 0x902E, 0xB06E, 0x90EE, 0x9066, 0x9022, 0xB1EE, 0xB0E6, 0xB062, + 0x93EE, 0x91E6, 0x90E2, 0xB7EE, 0xB3E6, 0xB1E2, 0xA9C0, 0xEA70, 0xFA9C, 0xD460, + 0xF518, 0xFD46, 0xA840, 0xEA10, 0xFA84, 0xED78, 0xFB5E, 0x94E0, 0xE538, 0xF94E, + 0xDA70, 0xF69C, 0xCA30, 0xF28C, 0xB460, 0xED18, 0xFB46, 0x9420, 0xE508, 0xF942, + 0xDA10, 0xF684, 0x9AF0, 0xE6BC, 0xDD78, 0xF75E, 0x8A70, 0xE29C, 0xCD38, 0xF34E, + 0xBA70, 0xEE9C, 0xC518, 0xF146, 0x9A30, 0xE68C, 0xDD18, 0xF746, 0x8A10, 0xE284, + 0xCD08, 0xF342, 0xBA10, 0xEE84, 0x8D78, 0xE35E, 0xCEBC, 0xBD78, 0xEF5E, 0x8538, + 0xE14E, 0xC69C, 0x9D38, 0xE74E, 0xDE9C, 0xC28C, 0x8D18, 0xE346, 0xCE8C, 0xBD18, + 0xEF46, 0x8508, 0xE142, 0xC684, 0x9D08, 0xE742, 0xDE84, 0x86BC, 0xC75E, 0x9EBC, + 0xDF5E, 0x829C, 0xC34E, 0x8E9C, 0xCF4E, 0xBE9C, 0xC146, 0x868C, 0xC746, 0x9E8C, + 0xDF46, 0x8284, 0xC342, 0x8E84, 0xCF42, 0xBE84, 0x835E, 0x8F5E, 0xBF5E, 0x814E, + 0x874E, 0x9F4E, 0x8346, 0x8F46, 0xBF46, 0x8142, 0x8742, 0x9F42, 0xD2F0, 0xF4BC, + 0xADE0, 0xEB78, 0xFADE, 0xA4E0, 0xE938, 0xFA4E, 0xD670, 0xF59C, 0xD230, 0xF48C, + 0xAC60, 0xEB18, 0xFAC6, 0xA420, 0xE908, 0xFA42, 0xD610, 0xF584, 0xC978, 0xF25E, + 0xB2F0, 0xECBC, 0x96F0, 0xE5BC, 0x9270, 0xE49C, 0xD938, 0xF64E, 0xCB38, 0xF2CE, + 0xB670, 0xC918, 0xF246, 0xB230, 0xEC8C, 0x9630, 0xE58C, 0x9210, 0xE484, 0xD908, + 0xF642, 0xCB08, 0xF2C2, 0xB610, 0xED84, 0xC4BC, 0x9978, 0xE65E, 0xDCBC, 0x8B78, + 0xE2DE, 0x8938, 0xE24E, 0xBB78, 0xCC9C, 0xB938, 0xEE4E, 0xC59C, 0x9B38, 0xC48C, + 0x9918, 0xE646, 0xDC8C, 0x8B18, 0xE2C6, 0x8908, 0xE242, 0xBB18, 0xCC84, 0xB908, + 0xEE42, 0xC584, 0x9B08, 0xE6C2, 0xDD84, 0xC25E, 0x8CBC, 0xCE5E, 0xBCBC, 0x85BC, + 0x849C, 0x9DBC, 0xC64E, 0x9C9C, 0xDE4E, 0xC2CE, 0x8D9C, 0xC246, 0x8C8C, 0xBD9C, + 0xCE46, 0xBC8C, 0x858C, 0x8484, 0x9D8C, 0xC642, 0x9C84, 0xDE42, 0xC2C2, 0x8D84, + 0xCEC2, 0xBD84, 0x865E, 0x9E5E, 0x82DE, 0x824E, 0x8EDE, 0x8E4E, 0xBEDE, 0xBE4E, + 0x86CE, 0x8646, 0x9ECE, 0x9E46, 0x82C6, 0x8242, 0x8EC6, 0x8E42, 0xBEC6, 0xBE42, + 0x86C2, 0x9EC2, 0xD178, 0xF45E, 0xA6F0, 0xE9BC, 0xA270, 0xE89C, 0xD778, 0xF5DE, + 0xD338, 0xF4CE, 0xD118, 0xF446, 0xAE70, 0xEB9C, 0xA630, 0xE98C, 0xA210, 0xE884, + 0xD718, 0xF5C6, 0xD308, 0xF4C2, 0xAE10, 0xEB84, 0xC8BC, 0xB178, 0xEC5E, 0x9378, + 0xE4DE, 0x9138, 0xE44E, 0xD89C, 0xCBBC, 0xB778, 0xC99C, 0xB338, 0xC88C, 0xB118, + 0xEC46, 0x9738, 0xE5CE, 0x9318, 0xE4C6, 0x9108, 0xE442, 0xD884, 0xCB8C, 0xB718, + 0xC984, 0xB308, 0xECC2, 0x9708, 0xE5C2, 0xDB84, 0xC45E, 0x98BC, 0xDC5E, 0x89BC, + 0x889C, 0xB9BC, 0xCC4E, 0xB89C, 0xC5DE, 0x9BBC, 0xC4CE, 0x999C, 0xC446, 0x988C, + 0xDC46, 0x8B9C, 0x898C, 0xBB9C, 0x8884, 0xB98C, 0xCC42, 0xB884, 0xC5C6, 0x9B8C, + 0xC4C2, 0x9984, 0xDCC2, 0x8B84, 0xCDC2, 0xBB84, 0x8C5E, 0xBC5E, 0x84DE, 0x844E, + 0x9CDE, 0x9C4E, 0x8DDE, 0x8CCE, 0xBDDE, 0x8C46, 0xBCCE, 0xBC46, 0x85CE, 0x84C6, + 0x9DCE, 0x8442, 0x9CC6, 0x9C42, 0x8DC6, 0x8CC2, 0xBDC6, 0xBCC2, 0x85C2, 0x9DC2, + 0xD0BC, 0xA378, 0xE8DE, 0xA138, 0xE84E, 0xD3BC, 0xD19C, 0xD08C, 0xAF78, 0xEBDE, + 0xA738, 0xE9CE, 0xA318, 0xE8C6, 0xA108, 0xE842, 0xD79C, 0xD38C, 0xD184, 0xAF18, + 0xEBC6, 0xA708, 0xE9C2, 0xC85E, 0xB0BC, 0x91BC, 0x909C, 0xD84E, 0xC9DE, 0xB3BC, + 0xC8CE, 0xB19C, 0xC846, 0xB08C, 0x97BC, 0x939C, 0x918C, 0x9084, 0xD842, 0xCBCE, + 0xB79C, 0xC9C6, 0xB38C, 0xC8C2, 0xB184, 0x978C, 0x9384, 0xD9C2, 0x985E, 0x88DE, + 0x884E, 0xB8DE, 0xB84E, 0x99DE, 0x98CE, 0x9846, 0x8BDE, 0x89CE, 0xBBDE, 0x88C6, + 0xB9CE, 0x8842, 0xB8C6, 0xB842, 0x9BCE, 0x99C6, 0x98C2, 0x8BC6, 0x89C2, 0xBBC6, + 0xB9C2, 0xD05E, 0xA1BC, 0xA09C, 0xD1DE, 0xD0CE, 0xD046, 0xA7BC, 0xA39C, 0xA18C, + 0xA084, 0xD7DE, 0xD3CE, 0xD1C6, 0xD0C2, 0xAF9C, 0xA78C, 0xA384, 0xB05E, 0x90DE, + 0x904E, 0xB1DE, 0xB0CE, 0xB046, 0x93DE, 0x91CE, 0x90C6, 0x9042, 0xB7DE, 0xB3CE, + 0xB1C6, 0xB0C2, 0x97CE, 0x93C6, 0x91C2, 0xA0DE, 0xA04E, 0xA3DE, 0xA1CE, 0xA0C6, + 0xA042, 0xAFDE, 0xA7CE, 0xA3C6, 0xA1C2, 0xD4F0, 0xF53C, 0xA8E0, 0xEA38, 0xFA8E, + 0xD430, 0xF50C, 0xA820, 0xEA08, 0xFA82, 0xDAF8, 0xF6BE, 0xCA78, 0xF29E, 0xB4F0, + 0xED3C, 0x9470, 0xE51C, 0xDA38, 0xF68E, 0xCA18, 0xF286, 0xB430, 0xED0C, 0x9410, + 0xE504, 0xDA08, 0xF682, 0xCD7C, 0xBAF8, 0xEEBE, 0xC53C, 0x9A78, 0xE69E, 0xDD3C, + 0x8A38, 0xE28E, 0xCD1C, 0xBA38, 0xEE8E, 0xC50C, 0x9A18, 0xE686, 0xDD0C, 0x8A08, + 0xE282, 0xCD04, 0xBA08, 0xEE82, 0xC6BE, 0x9D7C, 0xDEBE, 0xC29E, 0x8D3C, 0xCE9E, + 0xBD3C, 0x851C, 0xC68E, 0x9D1C, 0xDE8E, 0xC286, 0x8D0C, 0xCE86, 0xBD0C, 0x8504, + 0xC682, 0x9D04, 0xDE82, 0x8EBE, 0xBEBE, 0x869E, 0x9E9E, 0x828E, 0x8E8E, 0xBE8E, + 0x8686, 0x9E86, 0x8282, 0x8E82, 0xBE82, 0xE97C, 0xD6F8, 0xF5BE, 0xD278, 0xF49E, + 0xACF0, 0xEB3C, 0xA470, 0xE91C, 0xD638, 0xF58E, 0xD218, 0xF486, 0xAC30, 0xEB0C, + 0xA410, 0xE904, 0xD608, 0xF582, 0x92F8, 0xE4BE, 0xD97C, 0xCB7C, 0xB6F8, 0xC93C, + 0xB278, 0xEC9E, 0x9678, 0xE59E, 0x9238, 0xE48E, 0xD91C, 0xCB1C, 0xB638, 0xC90C, + 0xB218, 0xEC86, 0x9618, 0xE586, 0x9208, 0xE482, 0xD904, 0xCB04, 0xB608, 0xED82, + 0x897C, 0xCCBE, 0xB97C, 0xC5BE, 0x9B7C, 0xC49E, 0x993C, 0xDC9E, 0x8B3C, 0x891C, + 0xBB3C, 0xCC8E, 0xB91C, 0xC58E, 0x9B1C, 0xC486, 0x990C, 0xDC86, 0x8B0C, 0x8904, + 0xBB0C, 0xCC82, 0xB904, 0xC582, 0x9B04, 0xDD82, 0x84BE, 0x9CBE, 0x8DBE, 0x8C9E, + 0xBDBE, 0xBC9E, 0x859E, 0x848E, 0x9D9E, 0x9C8E, 0x8D8E, 0x8C86, 0xBD8E, 0xBC86, + 0x8586, 0x8482, 0x9D86, 0x9C82, 0x8D82, 0xBD82, 0xA2F8, 0xE8BE, 0xD37C, 0xD13C, + 0xAEF8, 0xEBBE, 0xA678, 0xE99E, 0xA238, 0xE88E, 0xD73C, 0xD31C, 0xD10C, 0xAE38, + 0xEB8E, 0xA618, 0xE986, 0xA208, 0xE882, 0xD70C, 0xD304, 0x917C, 0xD8BE, 0xC9BE, + 0xB37C, 0xC89E, 0xB13C, 0x977C, 0x933C, 0x911C, 0xD88E, 0xCB9E, 0xB73C, 0xC98E, + 0xB31C, 0xC886, 0xB10C, 0x971C, 0x930C, 0x9104, 0xD882, 0xCB86, 0xB70C, 0xC982, + 0xB304, 0x88BE, 0xB8BE, 0x99BE, 0x989E, 0x8BBE, 0x899E, 0xBBBE, 0x888E, 0xB99E, + 0xB88E, 0x9B9E, 0x998E, 0x9886, 0x8B8E, 0x8986, 0xBB8E, 0x8882, 0xB986, 0xB882, + 0x9B86, 0x9982, 0xA17C, 0xD1BE, 0xD09E, 0xA77C, 0xA33C, 0xA11C, 0xD7BE, 0xD39E, + 0xD18E, 0xD086, 0xAF3C, 0xA71C, 0xA30C, 0xA104, 0xD78E, 0xD386, 0xD182, 0x90BE, + 0xB1BE, 0xB09E, 0x93BE, 0x919E, 0x908E, 0xB7BE, 0xB39E, 0xB18E, 0xB086, 0x979E, + 0x938E, 0x9186, 0x9082, 0xB78E, 0xB386, 0xB182, 0xA0BE, 0xA3BE, 0xA19E, 0xA08E, + 0xAFBE, 0xA79E, 0xA38E, 0xA186, 0xA082, 0xA9F0, 0xEA7C, 0xD478, 0xF51E, 0xA870, + 0xEA1C, 0xD418, 0xF506, 0xA810, 0xEA04, 0xED7E, 0x94F8, 0xE53E, 0xDA7C, 0xCA3C, + 0xB478, 0xED1E, 0x9438, 0xE50E, 0xDA1C, 0xCA0C, 0xB418, 0xED06, 0x9408, 0xE502, + 0xDA04, 0x9AFC, 0xDD7E, 0x8A7C, 0xCD3E, 0xBA7C, 0xC51E, 0x9A3C, 0xDD1E, 0x8A1C, + 0xCD0E, 0xBA1C, 0xC506, 0x9A0C, 0xDD06, 0x8A04, 0xCD02, 0xBA04, 0x8D7E, 0xBD7E, + 0x853E, 0x9D3E, 0x8D1E, 0xBD1E, 0x850E, 0x9D0E, 0x8D06, 0xBD06, 0x8502, 0x9D02, + 0xD2FC, 0xADF8, 0xEB7E, 0xA4F8, 0xE93E, 0xD67C, 0xD23C, 0xAC78, 0xEB1E, 0xA438, + 0xE90E, 0xD61C, 0xD20C, 0xAC18, 0xEB06, 0xA408, 0xE902, 0xC97E, 0xB2FC, 0x96FC, + 0x927C, 0xD93E, 0xCB3E, 0xB67C, 0xC91E, 0xB23C, 0x963C, 0x921C, 0xD90E, 0xCB0E, + 0xB61C, 0xC906, 0xB20C, 0x960C, 0x9204, 0xD902, 0x997E, 0x8B7E, 0x893E, 0xBB7E, + 0xB93E, 0xE4A0, 0xF928, 0xD940, 0xF650, 0xFD94, 0xCB40, 0xF2D0, 0xEDA0, 0xFB68, + 0x8940, 0xE250, 0xCCA0, 0xF328, 0xB940, 0xEE50, 0xFB94, 0xC5A0, 0xF168, 0x9B40, + 0xE6D0, 0xF9B4, 0xDDA0, 0xF768, 0xFDDA, 0x84A0, 0xE128, 0xC650, 0xF194, 0x9CA0, + 0xE728, 0xF9CA, 0xDE50, 0xF794, 0xC2D0, 0x8DA0, 0xE368, 0xCED0, 0xF3B4, 0xBDA0, + 0xEF68, 0xFBDA, 0x8250, 0xC328, 0x8E50, 0xE394, 0xCF28, 0xF3CA, 0xBE50, 0xEF94, + 0xC168, 0x86D0, 0xE1B4, 0xC768, 0xF1DA, 0x9ED0, 0xE7B4, 0xDF68, 0xF7DA, 0x8128, + 0xC194, 0x8728, 0xE1CA, 0xC794, 0x9F28, 0xE7CA, 0x8368, 0xC3B4, 0x8F68, 0xE3DA, + 0xCFB4, 0xBF68, 0xEFDA, 0xE8A0, 0xFA28, 0xD340, 0xF4D0, 0xFD34, 0xEBA0, 0xFAE8, + 0x9140, 0xE450, 0xF914, 0xD8A0, 0xF628, 0xFD8A, 0xC9A0, 0xF268, 0xB340, 0xECD0, + 0xFB34, 0x9740, 0xE5D0, 0xF974, 0xDBA0, 0xF6E8, 0xFDBA, 0x88A0, 0xE228, 0xCC50, + 0xF314, 0xB8A0, 0xEE28, 0xFB8A, 0xC4D0, 0xF134, 0x99A0, 0xE668, 0xF99A, 0xDCD0, + 0xF734, 0x8BA0, 0xE2E8, 0xCDD0, 0xF374, 0xBBA0, 0xEEE8, 0xFBBA, 0x8450, 0xE114, + 0xC628, 0xF18A, 0x9C50, 0xE714, 0xDE28, 0xF78A, 0xC268, 0x8CD0, 0xE334, 0xCE68, + 0xF39A, 0xBCD0, 0xEF34, 0x85D0, 0xE174, 0xC6E8, 0xF1BA, 0x9DD0, 0xE774, 0xDEE8, + 0xF7BA, 0x8228, 0xC314, 0x8E28, 0xE38A, 0xCF14, 0xC134, 0x8668, 0xE19A, 0xC734, + 0x9E68, 0xE79A, 0xDF34, 0x82E8, 0xC374, 0x8EE8, 0xE3BA, 0xCF74, 0xBEE8, 0xEFBA, + 0x8114, 0xC18A, 0x8714, 0xC78A, 0x8334, 0xC39A, 0x8F34, 0xCF9A, 0x8174, 0xC1BA, + 0x8774, 0xC7BA, 0x9F74, 0xDFBA, 0xA140, 0xE850, 0xFA14, 0xD1A0, 0xF468, 0xFD1A, + 0xA740, 0xE9D0, 0xFA74, 0xD7A0, 0xF5E8, 0xFD7A, 0x90A0, 0xE428, 0xF90A, 0xD850, + 0xF614, 0xC8D0, 0xF234, 0xB1A0, 0xEC68, 0xFB1A, 0x93A0, 0xE4E8, 0xF93A, 0xD9D0, + 0xF674, 0xCBD0, 0xF2F4, 0xB7A0, 0xEDE8, 0xFB7A, 0x8850, 0xE214, 0xCC28, 0xF30A, + 0xB850, 0xEE14, 0xC468, 0xF11A, 0x98D0, 0xE634, 0xDC68, 0xF71A, 0x89D0, 0xE274, + 0xCCE8, 0xF33A, 0xB9D0, 0xEE74, 0xC5E8, 0xF17A, 0x9BD0, 0xE6F4, 0xDDE8, 0xF77A, + 0x8428, 0xE10A, 0xC614, 0x9C28, 0xE70A, 0xC234, 0x8C68, 0xE31A, 0xCE34, 0xBC68, + 0xEF1A, 0x84E8, 0xE13A, 0xC674, 0x9CE8, 0xE73A, 0xDE74, 0xC2F4, 0x8DE8, 0xE37A, + 0xCEF4, 0xBDE8, 0xEF7A, 0x8214, 0xC30A, 0x8E14, 0xC11A, 0x8634, 0xC71A, 0x9E34, + 0x8274, 0xC33A, 0x8E74, 0xCF3A, 0xBE74, 0xC17A, 0x86F4, 0xC77A, 0x9EF4, 0xDF7A, + 0x810A, 0x870A, 0x831A, 0x8F1A, 0x813A, 0x873A, 0x9F3A, 0x837A, 0x8F7A, 0xBF7A, + 0xA0A0, 0xE828, 0xFA0A, 0xD0D0, 0xF434, 0xA3A0, 0xE8E8, 0xFA3A, 0xD3D0, 0xF4F4, + 0xAFA0, 0xEBE8, 0xFAFA, 0x9050, 0xE414, 0xD828, 0xF60A, 0xC868, 0xF21A, 0xB0D0, + 0xEC34, 0x91D0, 0xE474, 0xD8E8, 0xF63A, 0xC9E8, 0xF27A, 0xB3D0, 0xECF4, 0x97D0, + 0xE5F4, 0xDBE8, 0xF6FA, 0x8828, 0xE20A, 0xCC14, 0xC434, 0x9868, 0xE61A, 0xDC34, + 0x88E8, 0xE23A, 0xCC74, 0xB8E8, 0xEE3A, 0xC4F4, 0x99E8, 0xE67A, 0xDCF4, 0x8BE8, + 0xE2FA, 0xCDF4, 0xBBE8, 0xEEFA, 0x8414, 0xC60A, 0xC21A, 0x8C34, 0xCE1A, 0x8474, + 0xC63A, 0x9C74, 0xDE3A, 0xC27A, 0x8CF4, 0xCE7A, 0xBCF4, 0x85F4, 0xC6FA, 0x9DF4, + 0xDEFA, 0x820A, 0x861A, 0x823A, 0x8E3A, 0x867A, 0x9E7A, 0x82FA, 0x8EFA, 0xBEFA, + 0xA050, 0xE814, 0xD068, 0xF41A, 0xA1D0, 0xE874, 0xD1E8, 0xF47A, 0xA7D0, 0xE9F4, + 0xD7E8, 0xF5FA, 0x9028, 0xE40A, 0xC834, 0xB068, 0xEC1A, 0x90E8, 0xE43A, 0xD874, + 0xC8F4, 0xB1E8, 0xEC7A, 0x93E8, 0xE4FA, 0xD9F4, 0xCBF4, 0xB7E8, 0xEDFA, 0x8814, + 0xC41A, 0x9834, 0x8874, 0xCC3A, 0xB874, 0xC47A, 0x98F4, 0xDC7A, 0x89F4, 0xCCFA, + 0xB9F4, 0xC5FA, 0x9BF4, 0xDDFA, 0x840A, 0x8C1A, 0x843A, 0x9C3A, 0x8C7A, 0xBC7A, + 0x84FA, 0x9CFA, 0x8DFA, 0xBDFA, 0xEA40, 0xFA90, 0xED60, 0xFB58, 0xE520, 0xF948, + 0xDA40, 0xF690, 0xFDA4, 0x9AC0, 0xE6B0, 0xF9AC, 0xDD60, 0xF758, 0xFDD6, 0x8A40, + 0xE290, 0xCD20, 0xF348, 0xBA40, 0xEE90, 0xFBA4, 0x8D60, 0xE358, 0xCEB0, 0xF3AC, + 0xBD60, 0xEF58, 0xFBD6, 0x8520, 0xE148, 0xC690, 0xF1A4, 0x9D20, 0xE748, 0xF9D2, + 0xDE90, 0xF7A4, 0x86B0, 0xE1AC, 0xC758, 0xF1D6, 0x9EB0, 0xE7AC, 0xDF58, 0xF7D6, + 0x8290, 0xC348, 0x8E90, 0xE3A4, 0xCF48, 0xF3D2, 0xBE90, 0xEFA4, 0x8358, 0xC3AC, + 0x8F58, 0xE3D6, 0xCFAC, 0xBF58, 0xEFD6, 0x8148, 0xC1A4, 0x8748, 0xE1D2, 0xC7A4, + 0x9F48, 0xE7D2, 0xDFA4, 0xD2C0, 0xF4B0, 0xFD2C, 0xEB60, 0xFAD8, 0xE920, 0xFA48, + 0xD640, 0xF590, 0xFD64, 0xC960, 0xF258, 0xB2C0, 0xECB0, 0xFB2C, 0x96C0, 0xE5B0, + 0xF96C, 0x9240, 0xE490, 0xF924, 0xD920, 0xF648, 0xFD92, 0xCB20, 0xF2C8, 0xB640, + 0xED90, 0xFB64, 0xC4B0, 0xF12C, 0x9960, 0xE658, 0xF996, 0xDCB0, 0xF72C, 0x8B60, + 0xE2D8, 0x8920, 0xE248, 0xBB60, 0xCC90, 0xF324, 0xB920, 0xEE48, 0xFB92, 0xC590, + 0xF164, 0x9B20, 0xE6C8, 0xF9B2, 0xDD90, 0xF764, 0xC258, 0x8CB0, 0xE32C, 0xCE58, + 0xF396, 0xBCB0, 0xEF2C, 0x85B0, 0xE16C, 0x8490, 0xE124, 0x9DB0, 0xC648, 0xF192, + 0x9C90, 0xE724, 0xDE48, 0xF792, 0xC2C8, 0x8D90, 0xE364, 0xCEC8, 0xF3B2, 0xBD90, + 0xEF64, 0xC12C, 0x8658, 0xE196, 0xC72C, 0x9E58, 0xE796, 0xDF2C, 0x82D8, 0x8248, + 0x8ED8, 0xC324, 0x8E48, 0xE392, 0xBED8, 0xCF24, 0xBE48, 0xEF92, 0xC164, 0x86C8, + 0xE1B2, 0xC764, 0x9EC8, 0xE7B2, 0xDF64, 0x832C, 0xC396, 0x8F2C, 0xCF96, 0x816C, + 0x8124, 0x876C, 0xC192, 0x8724, 0x9F6C, 0xC792, 0x9F24, 0x8364, 0xC3B2, 0x8F64, + 0xCFB2, 0xBF64, 0xD160, 0xF458, 0xFD16, 0xA6C0, 0xE9B0, 0xFA6C, 0xA240, 0xE890, + 0xFA24, 0xD760, 0xF5D8, 0xFD76, 0xD320, 0xF4C8, 0xFD32, 0xAE40, 0xEB90, 0xFAE4, + 0xC8B0, 0xF22C, 0xB160, 0xEC58, 0xFB16, 0x9360, 0xE4D8, 0xF936, 0x9120, 0xE448, + 0xF912, 0xD890, 0xF624, 0xCBB0, 0xF2EC, 0xB760, 0xC990, 0xF264, 0xB320, 0xECC8, + 0xFB32, 0x9720, 0xE5C8, 0xF972, 0xDB90, 0xF6E4, 0xC458, 0xF116, 0x98B0, 0xE62C, + 0xDC58, 0xF716, 0x89B0, 0xE26C, 0x8890, 0xE224, 0xB9B0, 0xCC48, 0xF312, 0xB890, + 0xEE24, 0xC5D8, 0xF176, 0x9BB0, 0xC4C8, 0xF132, 0x9990, 0xE664, 0xDCC8, 0xF732, + 0x8B90, 0xE2E4, 0xCDC8, 0xF372, 0xBB90, 0xEEE4, 0xC22C, 0x8C58, 0xE316, 0xCE2C, + 0xBC58, 0xEF16, 0x84D8, 0xE136, 0x8448, 0xE112, 0x9CD8, 0xC624, 0x9C48, 0xE712, + 0xDE24, 0xC2EC, 0x8DD8, 0xC264, 0x8CC8, 0xE332, 0xBDD8, 0xCE64, 0xBCC8, 0xEF32, + 0x85C8, 0xE172, 0xC6E4, 0x9DC8, 0xE772, 0xDEE4, 0xC116, 0x862C, 0xC716, 0x9E2C, + 0x826C, 0x8224, 0x8E6C, 0xC312, 0x8E24, 0xBE6C, 0xCF12, 0xC176, 0x86EC, 0xC132, + 0x8664, 0x9EEC, 0xC732, 0x9E64, 0xDF32, 0x82E4, 0xC372, 0x8EE4, 0xCF72, 0xBEE4, + 0x8316, 0x8F16, 0x8136, 0x8112, 0x8736, 0x8712, 0x9F36, 0x8376, 0x8332, 0x8F76, + 0x8F32, 0xBF76, 0x8172, 0x8772, 0x9F72, 0xD0B0, 0xF42C, 0xA360, 0xE8D8, 0xFA36, + 0xA120, 0xE848, 0xFA12, 0xD3B0, 0xF4EC, 0xD190, 0xF464, 0xAF60, 0xEBD8, 0xFAF6, + 0xA720, 0xE9C8, 0xFA72, 0xD790, 0xF5E4, 0xC858, 0xF216, 0xB0B0, 0xEC2C, 0x91B0, + 0xE46C, 0x9090, 0xE424, 0xD848, 0xF612, 0xC9D8, 0xF276, 0xB3B0, 0xC8C8, 0xF232, + 0xB190, 0xEC64, 0x97B0, 0xE5EC, 0x9390, 0xE4E4, 0xD9C8, 0xF672, 0xCBC8, 0xF2F2, + 0xB790, 0xEDE4, 0xC42C, 0x9858, 0xE616, 0xDC2C, 0x88D8, 0xE236, 0x8848, 0xE212, + 0xB8D8, 0xCC24, 0xB848, 0xEE12, 0xC4EC, 0x99D8, 0xC464, 0x98C8, 0xE632, 0xDC64, + 0x8BD8, 0xE2F6, 0x89C8, 0xE272, 0xBBD8, 0xCCE4, 0xB9C8, 0xEE72, 0xC5E4, 0x9BC8, + 0xE6F2, 0xDDE4, 0xC216, 0x8C2C, 0xCE16, 0x846C, 0x8424, 0x9C6C, 0xC612, 0x9C24, + 0xC276, 0x8CEC, 0xC232, 0x8C64, 0xBCEC, 0xCE32, 0xBC64, 0x85EC, 0x84E4, 0x9DEC, + 0xC672, 0x9CE4, 0xDE72, 0xC2F2, 0x8DE4, 0xCEF2, 0xBDE4, 0x8616, 0x8236, 0x8212, + 0x8E36, 0x8E12, 0x8676, 0x8632, 0x9E76, 0x9E32, 0x82F6, 0x8272, 0x8EF6, 0x8E72, + 0xBEF6, 0xBE72, 0x86F2, 0x9EF2, 0xD058, 0xF416, 0xA1B0, 0xE86C, 0xA090, 0xE824, + 0xD1D8, 0xF476, 0xD0C8, 0xF432, 0xA7B0, 0xE9EC, 0xA390, 0xE8E4, 0xD7D8, 0xF5F6, + 0xD3C8, 0xF4F2, 0xAF90, 0xEBE4, 0xC82C, 0xB058, 0xEC16, 0x90D8, 0xE436, 0x9048, + 0xE412, 0xD824, 0xC8EC, 0xB1D8, 0xC864, 0xB0C8, 0xEC32, 0x93D8, 0xE4F6, 0x91C8, + 0xE472, 0xD8E4, 0xCBEC, 0xB7D8, 0xC9E4, 0xB3C8, 0xECF2, 0x97C8, 0xE5F2, 0xDBE4, + 0xC416, 0x982C, 0x886C, 0x8824, 0xB86C, 0xCC12, 0xC476, 0x98EC, 0xC432, 0x9864, + 0xDC32, 0x89EC, 0x88E4, 0xB9EC, 0xCC72, 0xB8E4, 0xC5F6, 0x9BEC, 0xC4F2, 0x99E4, + 0xDCF2, 0x8BE4, 0xCDF2, 0xBBE4, 0x8C16, 0x8436, 0x8412, 0x9C36, 0x8C76, 0x8C32, + 0xBC76, 0x84F6, 0x8472, 0x9CF6, 0x9C72, 0x8DF6, 0x8CF2, 0xBDF6, 0xBCF2, 0x85F2, + 0x9DF2, 0xD02C, 0xA0D8, 0xE836, 0xA048, 0xE812, 0xD0EC, 0xD064, 0xA3D8, 0xE8F6, + 0xA1C8, 0xE872, 0xD3EC, 0xD1E4, 0xAFD8, 0xEBF6, 0xA7C8, 0xE9F2, 0xC816, 0x906C, + 0x9024, 0xC876, 0xB0EC, 0xC832, 0xB064, 0x91EC, 0x90E4, 0xD872, 0xC9F6, 0xB3EC, + 0xC8F2, 0xB1E4, 0x97EC, 0x93E4, 0xD9F2, 0x8836, 0x8812, 0x9876, 0x9832, 0x88F6, + 0x8872, 0xB8F6, 0xB872, 0x99F6, 0x98F2, 0x8BF6, 0x89F2, 0xBBF6, 0xB9F2, 0xD4C0, + 0xF530, 0xFD4C, 0xEA20, 0xFA88, 0xDAE0, 0xF6B8, 0xFDAE, 0xCA60, 0xF298, 0xB4C0, + 0xED30, 0xFB4C, 0x9440, 0xE510, 0xF944, 0xDA20, 0xF688, 0xFDA2, 0xCD70, 0xF35C, + 0xBAE0, 0xEEB8, 0xFBAE, 0xC530, 0xF14C, 0x9A60, 0xE698, 0xF9A6, 0xDD30, 0xF74C, + 0x8A20, 0xE288, 0xCD10, 0xF344, 0xBA20, 0xEE88, 0xFBA2, 0xC6B8, 0xF1AE, 0x9D70, + 0xE75C, 0xDEB8, 0xF7AE, 0xC298, 0x8D30, 0xE34C, 0xCE98, 0xF3A6, 0xBD30, 0xEF4C, + 0x8510, 0xE144, 0xC688, 0xF1A2, 0x9D10, 0xE744, 0xDE88, 0xF7A2, 0xC35C, 0x8EB8, + 0xE3AE, 0xCF5C, 0xBEB8, 0xEFAE, 0xC14C, 0x8698, 0xE1A6, 0xC74C, 0x9E98, 0xE7A6, + 0xDF4C, 0x8288, 0xC344, 0x8E88, 0xE3A2, 0xCF44, 0xBE88, 0xEFA2, 0xC1AE, 0x875C, + 0xC7AE, 0x9F5C, 0xDFAE, 0x834C, 0xC3A6, 0x8F4C, 0xCFA6, 0xBF4C, 0x8144, 0xC1A2, + 0x8744, 0xC7A2, 0x9F44, 0xDFA2, 0xE970, 0xFA5C, 0xD6E0, 0xF5B8, 0xFD6E, 0xD260, + 0xF498, 0xFD26, 0xACC0, 0xEB30, 0xFACC, 0xA440, 0xE910, 0xFA44, 0xD620, 0xF588, + 0xFD62, 0x92E0, 0xE4B8, 0xF92E, 0xD970, 0xF65C, 0xCB70, 0xF2DC, 0xB6E0, 0xC930, + 0xF24C, 0xB260, 0xEC98, 0xFB26, 0x9660, 0xE598, 0xF966, 0x9220, 0xE488, 0xF922, + 0xD910, 0xF644, 0xCB10, 0xF2C4, 0xB620, 0xED88, 0xFB62, 0x8970, 0xE25C, 0xCCB8, + 0xF32E, 0xB970, 0xEE5C, 0xC5B8, 0xF16E, 0x9B70, 0xC498, 0xF126, 0x9930, 0xE64C, + 0xDC98, 0xF726, 0x8B30, 0xE2CC, 0x8910, 0xE244, 0xBB30, 0xCC88, 0xF322, 0xB910, + 0xEE44, 0xC588, 0xF162, 0x9B10, 0xE6C4, 0xDD88, 0xF762, 0x84B8, 0xE12E, 0xC65C, + 0x9CB8, 0xE72E, 0xDE5C, 0xC2DC, 0x8DB8, 0xC24C, 0x8C98, 0xE326, 0xBDB8, 0xCE4C, + 0xBC98, 0xEF26, 0x8598, 0xE166, 0x8488, 0xE122, 0x9D98, 0xC644, 0x9C88, 0xE722, + 0xDE44, 0xC2C4, 0x8D88, 0xE362, 0xCEC4, 0xBD88, 0xEF62, 0x825C, 0xC32E, 0x8E5C, + 0xCF2E +}; + +static const unsigned short int c49_odd_bitpattern[] = { + /* Appendix E - Code 49 Encodation Patterns (Odd Symbol Character Parity) */ + 0xC940, 0xF250, 0xECA0, 0xFB28, 0xE5A0, 0xF968, 0xDB40, 0xF6D0, 0xFDB4, 0xC4A0, + 0xF128, 0x9940, 0xE650, 0xF994, 0xDCA0, 0xF728, 0xFDCA, 0x8B40, 0xE2D0, 0xCDA0, + 0xF368, 0xBB40, 0xEED0, 0xFBB4, 0xC250, 0x8CA0, 0xE328, 0xCE50, 0xF394, 0xBCA0, + 0xEF28, 0xFBCA, 0x85A0, 0xE168, 0xC6D0, 0xF1B4, 0x9DA0, 0xE768, 0xF9DA, 0xDED0, + 0xF7B4, 0xC128, 0x8650, 0xE194, 0xC728, 0xF1CA, 0x9E50, 0xE794, 0xDF28, 0xF7CA, + 0x82D0, 0xC368, 0x8ED0, 0xE3B4, 0xCF68, 0xF3DA, 0xBED0, 0xEFB4, 0x8328, 0xC394, + 0x8F28, 0xE3CA, 0xCF94, 0x8168, 0xC1B4, 0x8768, 0xE1DA, 0xC7B4, 0x9F68, 0xE7DA, + 0xDFB4, 0xD140, 0xF450, 0xFD14, 0xE9A0, 0xFA68, 0xD740, 0xF5D0, 0xFD74, 0xC8A0, + 0xF228, 0xB140, 0xEC50, 0xFB14, 0x9340, 0xE4D0, 0xF934, 0xD9A0, 0xF668, 0xFD9A, + 0xCBA0, 0xF2E8, 0xB740, 0xEDD0, 0xFB74, 0xC450, 0xF114, 0x98A0, 0xE628, 0xF98A, + 0xDC50, 0xF714, 0x89A0, 0xE268, 0xCCD0, 0xF334, 0xB9A0, 0xEE68, 0xFB9A, 0xC5D0, + 0xF174, 0x9BA0, 0xE6E8, 0xF9BA, 0xDDD0, 0xF774, 0xC228, 0x8C50, 0xE314, 0xCE28, + 0xF38A, 0xBC50, 0xEF14, 0x84D0, 0xE134, 0xC668, 0xF19A, 0x9CD0, 0xE734, 0xDE68, + 0xF79A, 0xC2E8, 0x8DD0, 0xE374, 0xCEE8, 0xF3BA, 0xBDD0, 0xEF74, 0xC114, 0x8628, + 0xE18A, 0xC714, 0x9E28, 0xE78A, 0x8268, 0xC334, 0x8E68, 0xE39A, 0xCF34, 0xBE68, + 0xEF9A, 0xC174, 0x86E8, 0xE1BA, 0xC774, 0x9EE8, 0xE7BA, 0xDF74, 0x8314, 0xC38A, + 0x8F14, 0x8134, 0xC19A, 0x8734, 0xC79A, 0x9F34, 0x8374, 0xC3BA, 0x8F74, 0xCFBA, + 0xBF74, 0xD0A0, 0xF428, 0xFD0A, 0xA340, 0xE8D0, 0xFA34, 0xD3A0, 0xF4E8, 0xFD3A, + 0xAF40, 0xEBD0, 0xFAF4, 0xC850, 0xF214, 0xB0A0, 0xEC28, 0xFB0A, 0x91A0, 0xE468, + 0xF91A, 0xD8D0, 0xF634, 0xC9D0, 0xF274, 0xB3A0, 0xECE8, 0xFB3A, 0x97A0, 0xE5E8, + 0xF97A, 0xDBD0, 0xF6F4, 0xC428, 0xF10A, 0x9850, 0xE614, 0xDC28, 0xF70A, 0x88D0, + 0xE234, 0xCC68, 0xF31A, 0xB8D0, 0xEE34, 0xC4E8, 0xF13A, 0x99D0, 0xE674, 0xDCE8, + 0xF73A, 0x8BD0, 0xE2F4, 0xCDE8, 0xF37A, 0xBBD0, 0xEEF4, 0xC214, 0x8C28, 0xE30A, + 0xCE14, 0x8468, 0xE11A, 0xC634, 0x9C68, 0xE71A, 0xDE34, 0xC274, 0x8CE8, 0xE33A, + 0xCE74, 0xBCE8, 0xEF3A, 0x85E8, 0xE17A, 0xC6F4, 0x9DE8, 0xE77A, 0xDEF4, 0xC10A, + 0x8614, 0xC70A, 0x8234, 0xC31A, 0x8E34, 0xCF1A, 0xC13A, 0x8674, 0xC73A, 0x9E74, + 0xDF3A, 0x82F4, 0xC37A, 0x8EF4, 0xCF7A, 0xBEF4, 0x830A, 0x811A, 0x871A, 0x833A, + 0x8F3A, 0x817A, 0x877A, 0x9F7A, 0xD050, 0xF414, 0xA1A0, 0xE868, 0xFA1A, 0xD1D0, + 0xF474, 0xA7A0, 0xE9E8, 0xFA7A, 0xD7D0, 0xF5F4, 0xC828, 0xF20A, 0xB050, 0xEC14, + 0x90D0, 0xE434, 0xD868, 0xF61A, 0xC8E8, 0xF23A, 0xB1D0, 0xEC74, 0x93D0, 0xE4F4, + 0xD9E8, 0xF67A, 0xCBE8, 0xF2FA, 0xB7D0, 0xEDF4, 0xC414, 0x9828, 0xE60A, 0x8868, + 0xE21A, 0xCC34, 0xB868, 0xEE1A, 0xC474, 0x98E8, 0xE63A, 0xDC74, 0x89E8, 0xE27A, + 0xCCF4, 0xB9E8, 0xEE7A, 0xC5F4, 0x9BE8, 0xE6FA, 0xDDF4, 0xC20A, 0x8C14, 0x8434, + 0xC61A, 0x9C34, 0xC23A, 0x8C74, 0xCE3A, 0xBC74, 0x84F4, 0xC67A, 0x9CF4, 0xDE7A, + 0xC2FA, 0x8DF4, 0xCEFA, 0xBDF4, 0x860A, 0x821A, 0x8E1A, 0x863A, 0x9E3A, 0x827A, + 0x8E7A, 0xBE7A, 0x86FA, 0x9EFA, 0xD028, 0xF40A, 0xA0D0, 0xE834, 0xD0E8, 0xF43A, + 0xA3D0, 0xE8F4, 0xD3E8, 0xF4FA, 0xAFD0, 0xEBF4, 0xC814, 0x9068, 0xE41A, 0xD834, + 0xC874, 0xB0E8, 0xEC3A, 0x91E8, 0xE47A, 0xD8F4, 0xC9F4, 0xB3E8, 0xECFA, 0x97E8, + 0xE5FA, 0xDBF4, 0xC40A, 0x8834, 0xCC1A, 0xC43A, 0x9874, 0xDC3A, 0x88F4, 0xCC7A, + 0xB8F4, 0xC4FA, 0x99F4, 0xDCFA, 0x8BF4, 0xCDFA, 0xBBF4, 0x841A, 0x8C3A, 0x847A, + 0x9C7A, 0x8CFA, 0xBCFA, 0x85FA, 0x9DFA, 0xF520, 0xFD48, 0xDAC0, 0xF6B0, 0xFDAC, + 0xCA40, 0xF290, 0xED20, 0xFB48, 0xCD60, 0xF358, 0xBAC0, 0xEEB0, 0xFBAC, 0xC520, + 0xF148, 0x9A40, 0xE690, 0xF9A4, 0xDD20, 0xF748, 0xFDD2, 0xC6B0, 0xF1AC, 0x9D60, + 0xE758, 0xF9D6, 0xDEB0, 0xF7AC, 0xC290, 0x8D20, 0xE348, 0xCE90, 0xF3A4, 0xBD20, + 0xEF48, 0xFBD2, 0xC358, 0x8EB0, 0xE3AC, 0xCF58, 0xF3D6, 0xBEB0, 0xEFAC, 0xC148, + 0x8690, 0xE1A4, 0xC748, 0xF1D2, 0x9E90, 0xE7A4, 0xDF48, 0xF7D2, 0xC1AC, 0x8758, + 0xE1D6, 0xC7AC, 0x9F58, 0xE7D6, 0xDFAC, 0x8348, 0xC3A4, 0x8F48, 0xE3D2, 0xCFA4, + 0xBF48, 0xEFD2, 0xE960, 0xFA58, 0xD6C0, 0xF5B0, 0xFD6C, 0xD240, 0xF490, 0xFD24, + 0xEB20, 0xFAC8, 0x92C0, 0xE4B0, 0xF92C, 0xD960, 0xF658, 0xFD96, 0xCB60, 0xF2D8, + 0xB6C0, 0xC920, 0xF248, 0xB240, 0xEC90, 0xFB24, 0x9640, 0xE590, 0xF964, 0xDB20, + 0xF6C8, 0xFDB2, 0x8960, 0xE258, 0xCCB0, 0xF32C, 0xB960, 0xEE58, 0xFB96, 0xC5B0, + 0xF16C, 0x9B60, 0xC490, 0xF124, 0x9920, 0xE648, 0xF992, 0xDC90, 0xF724, 0x8B20, + 0xE2C8, 0xCD90, 0xF364, 0xBB20, 0xEEC8, 0xFBB2, 0x84B0, 0xE12C, 0xC658, 0xF196, + 0x9CB0, 0xE72C, 0xDE58, 0xF796, 0xC2D8, 0x8DB0, 0xC248, 0x8C90, 0xE324, 0xBDB0, + 0xCE48, 0xF392, 0xBC90, 0xEF24, 0x8590, 0xE164, 0xC6C8, 0xF1B2, 0x9D90, 0xE764, + 0xDEC8, 0xF7B2, 0x8258, 0xC32C, 0x8E58, 0xE396, 0xCF2C, 0xBE58, 0xEF96, 0xC16C, + 0x86D8, 0xC124, 0x8648, 0xE192, 0x9ED8, 0xC724, 0x9E48, 0xE792, 0xDF24, 0x82C8, + 0xC364, 0x8EC8, 0xE3B2, 0xCF64, 0xBEC8, 0xEFB2, 0x812C, 0xC196, 0x872C, 0xC796, + 0x9F2C, 0x836C, 0x8324, 0x8F6C, 0xC392, 0x8F24, 0xBF6C, 0xCF92, 0x8164, 0xC1B2, + 0x8764, 0xC7B2, 0x9F64, 0xDFB2, 0xA2C0, 0xE8B0, 0xFA2C, 0xD360, 0xF4D8, 0xFD36, + 0xD120, 0xF448, 0xFD12, 0xAEC0, 0xEBB0, 0xFAEC, 0xA640, 0xE990, 0xFA64, 0xD720, + 0xF5C8, 0xFD72, 0x9160, 0xE458, 0xF916, 0xD8B0, 0xF62C, 0xC9B0, 0xF26C, 0xB360, + 0xC890, 0xF224, 0xB120, 0xEC48, 0xFB12, 0x9760, 0xE5D8, 0xF976, 0x9320, 0xE4C8, + 0xF932, 0xD990, 0xF664, 0xCB90, 0xF2E4, 0xB720, 0xEDC8, 0xFB72, 0x88B0, 0xE22C, + 0xCC58, 0xF316, 0xB8B0, 0xEE2C, 0xC4D8, 0xF136, 0x99B0, 0xC448, 0xF112, 0x9890, + 0xE624, 0xDC48, 0xF712, 0x8BB0, 0xE2EC, 0x8990, 0xE264, 0xBBB0, 0xCCC8, 0xF332, + 0xB990, 0xEE64, 0xC5C8, 0xF172, 0x9B90, 0xE6E4, 0xDDC8, 0xF772, 0x8458, 0xE116, + 0xC62C, 0x9C58, 0xE716, 0xDE2C, 0xC26C, 0x8CD8, 0xC224, 0x8C48, 0xE312, 0xBCD8, + 0xCE24, 0xBC48, 0xEF12, 0x85D8, 0xE176, 0x84C8, 0xE132, 0x9DD8, 0xC664, 0x9CC8, + 0xE732, 0xDE64, 0xC2E4, 0x8DC8, 0xE372, 0xCEE4, 0xBDC8, 0xEF72, 0x822C, 0xC316, + 0x8E2C, 0xCF16, 0xC136, 0x866C, 0xC112, 0x8624, 0x9E6C, 0xC712, 0x9E24, 0x82EC, + 0x8264, 0x8EEC, 0xC332, 0x8E64, 0xBEEC, 0xCF32, 0xBE64, 0xC172, 0x86E4, 0xC772, + 0x9EE4, 0xDF72, 0x8116, 0x8716, 0x8336, 0x8312, 0x8F36, 0x8F12, 0x8176, 0x8132, + 0x8776, 0x8732, 0x9F76, 0x9F32, 0x8372, 0x8F72, 0xBF72, 0xA160, 0xE858, 0xFA16, + 0xD1B0, 0xF46C, 0xD090, 0xF424, 0xA760, 0xE9D8, 0xFA76, 0xA320, 0xE8C8, 0xFA32, + 0xD7B0, 0xF5EC, 0xD390, 0xF4E4, 0xAF20, 0xEBC8, 0xFAF2, 0x90B0, 0xE42C, 0xD858, + 0xF616, 0xC8D8, 0xF236, 0xB1B0, 0xC848, 0xF212, 0xB090, 0xEC24, 0x93B0, 0xE4EC, + 0x9190, 0xE464, 0xD8C8, 0xF632, 0xCBD8, 0xF2F6, 0xB7B0, 0xC9C8, 0xF272, 0xB390, + 0xECE4, 0x9790, 0xE5E4, 0xDBC8, 0xF6F2, 0x8858, 0xE216, 0xCC2C, 0xB858, 0xEE16, + 0xC46C, 0x98D8, 0xC424, 0x9848, 0xE612, 0xDC24, 0x89D8, 0xE276, 0x88C8, 0xE232, + 0xB9D8, 0xCC64, 0xB8C8, 0xEE32, 0xC5EC, 0x9BD8, 0xC4E4, 0x99C8, 0xE672, 0xDCE4, + 0x8BC8, 0xE2F2, 0xCDE4, 0xBBC8, 0xEEF2, 0x842C, 0xC616, 0x9C2C, 0xC236, 0x8C6C, + 0xC212, 0x8C24, 0xBC6C, 0xCE12, 0x84EC, 0x8464, 0x9CEC, 0xC632, 0x9C64, 0xDE32, + 0xC2F6, 0x8DEC, 0xC272, 0x8CE4, 0xBDEC, 0xCE72, 0xBCE4, 0x85E4, 0xC6F2, 0x9DE4, + 0xDEF2, 0x8216, 0x8E16, 0x8636, 0x8612, 0x9E36, 0x8276, 0x8232, 0x8E76, 0x8E32, + 0xBE76, 0x86F6, 0x8672, 0x9EF6, 0x9E72, 0x82F2, 0x8EF2, 0xBEF2, 0xA0B0, 0xE82C, + 0xD0D8, 0xF436, 0xD048, 0xF412, 0xA3B0, 0xE8EC, 0xA190, 0xE864, 0xD3D8, 0xF4F6, + 0xD1C8, 0xF472, 0xAFB0, 0xEBEC, 0xA790, 0xE9E4, 0xD7C8, 0xF5F2, 0x9058, 0xE416, + 0xD82C, 0xC86C, 0xB0D8, 0xC824, 0xB048, 0xEC12, 0x91D8, 0xE476, 0x90C8, 0xE432, + 0xD864, 0xC9EC, 0xB3D8, 0xC8E4, 0xB1C8, 0xEC72, 0x97D8, 0xE5F6, 0x93C8, 0xE4F2, + 0xD9E4, 0xCBE4, 0xB7C8, 0xEDF2, 0x882C, 0xCC16, 0xC436, 0x986C, 0xC412, 0x9824, + 0x88EC, 0x8864, 0xB8EC, 0xCC32, 0xB864, 0xC4F6, 0x99EC, 0xC472, 0x98E4, 0xDC72, + 0x8BEC, 0x89E4, 0xBBEC, 0xCCF2, 0xB9E4, 0xC5F2, 0x9BE4, 0xDDF2, 0x8416, 0x8C36, + 0x8C12, 0x8476, 0x8432, 0x9C76, 0x9C32, 0x8CF6, 0x8C72, 0xBCF6, 0xBC72, 0x85F6, + 0x84F2, 0x9DF6, 0x9CF2, 0x8DF2, 0xBDF2, 0xA058, 0xE816, 0xD06C, 0xD024, 0xA1D8, + 0xE876, 0xA0C8, 0xE832, 0xD1EC, 0xD0E4, 0xA7D8, 0xE9F6, 0xA3C8, 0xE8F2, 0xD7EC, + 0xD3E4, 0x902C, 0xC836, 0xB06C, 0xC812, 0x90EC, 0x9064, 0xD832, 0xC8F6, 0xB1EC, + 0xC872, 0xB0E4, 0x93EC, 0x91E4, 0xD8F2, 0xCBF6, 0xB7EC, 0xC9F2, 0xB3E4, 0x8816, + 0x9836, 0x8876, 0x8832, 0xB876, 0x98F6, 0x9872, 0x89F6, 0x88F2, 0xB9F6, 0xB8F2, + 0x9BF6, 0x99F2, 0xEA60, 0xFA98, 0xD440, 0xF510, 0xFD44, 0xED70, 0xFB5C, 0x94C0, + 0xE530, 0xF94C, 0xDA60, 0xF698, 0xFDA6, 0xCA20, 0xF288, 0xB440, 0xED10, 0xFB44, + 0x9AE0, 0xE6B8, 0xF9AE, 0xDD70, 0xF75C, 0x8A60, 0xE298, 0xCD30, 0xF34C, 0xBA60, + 0xEE98, 0xFBA6, 0xC510, 0xF144, 0x9A20, 0xE688, 0xF9A2, 0xDD10, 0xF744, 0x8D70, + 0xE35C, 0xCEB8, 0xF3AE, 0xBD70, 0xEF5C, 0x8530, 0xE14C, 0xC698, 0xF1A6, 0x9D30, + 0xE74C, 0xDE98, 0xF7A6, 0xC288, 0x8D10, 0xE344, 0xCE88, 0xF3A2, 0xBD10, 0xEF44, + 0x86B8, 0xE1AE, 0xC75C, 0x9EB8, 0xE7AE, 0xDF5C, 0x8298, 0xC34C, 0x8E98, 0xE3A6, + 0xCF4C, 0xBE98, 0xEFA6, 0xC144, 0x8688, 0xE1A2, 0xC744, 0x9E88, 0xE7A2, 0xDF44, + 0x835C, 0xC3AE, 0x8F5C, 0xCFAE, 0xBF5C, 0x814C, 0xC1A6, 0x874C, 0xC7A6, 0x9F4C, + 0xDFA6, 0x8344, 0xC3A2, 0x8F44, 0xCFA2, 0xBF44, 0xD2E0, 0xF4B8, 0xFD2E, 0xADC0, + 0xEB70, 0xFADC, 0xA4C0, 0xE930, 0xFA4C, 0xD660, 0xF598, 0xFD66, 0xD220, 0xF488, + 0xFD22, 0xAC40, 0xEB10, 0xFAC4, 0xC970, 0xF25C, 0xB2E0, 0xECB8, 0xFB2E, 0x96E0, + 0xE5B8, 0xF96E, 0x9260, 0xE498, 0xF926, 0xD930, 0xF64C, 0xCB30, 0xF2CC, 0xB660, + 0xC910, 0xF244, 0xB220, 0xEC88, 0xFB22, 0x9620, 0xE588, 0xF962, 0xDB10, 0xF6C4, + 0xC4B8, 0xF12E, 0x9970, 0xE65C, 0xDCB8, 0xF72E, 0x8B70, 0xE2DC, 0x8930, 0xE24C, + 0xBB70, 0xCC98, 0xF326, 0xB930, 0xEE4C, 0xC598, 0xF166, 0x9B30, 0xC488, 0xF122, + 0x9910, 0xE644, 0xDC88, 0xF722, 0x8B10, 0xE2C4, 0xCD88, 0xF362, 0xBB10, 0xEEC4, + 0xC25C, 0x8CB8, 0xE32E, 0xCE5C, 0xBCB8, 0xEF2E, 0x85B8, 0xE16E, 0x8498, 0xE126, + 0x9DB8, 0xC64C, 0x9C98, 0xE726, 0xDE4C, 0xC2CC, 0x8D98, 0xC244, 0x8C88, 0xE322, + 0xBD98, 0xCE44, 0xBC88, 0xEF22, 0x8588, 0xE162, 0xC6C4, 0x9D88, 0xE762, 0xDEC4, + 0xC12E, 0x865C, 0xC72E, 0x9E5C, 0xDF2E, 0x82DC, 0x824C, 0x8EDC, 0xC326, 0x8E4C, + 0xBEDC, 0xCF26, 0xBE4C, 0xC166, 0x86CC, 0xC122, 0x8644, 0x9ECC, 0xC722, 0x9E44, + 0xDF22, 0x82C4, 0xC362, 0x8EC4, 0xCF62, 0xBEC4, 0x832E, 0x8F2E, 0x816E, 0x8126, + 0x876E, 0x8726, 0x9F6E, 0x9F26, 0x8366, 0x8322, 0x8F66, 0x8F22, 0xBF66, 0x8162, + 0x8762, 0x9F62, 0xD170, 0xF45C, 0xA6E0, 0xE9B8, 0xFA6E, 0xA260, 0xE898, 0xFA26, + 0xD770, 0xF5DC, 0xD330, 0xF4CC, 0xD110, 0xF444, 0xAE60, 0xEB98, 0xFAE6, 0xA620, + 0xE988, 0xFA62, 0xD710, 0xF5C4, 0xC8B8, 0xF22E, 0xB170, 0xEC5C, 0x9370, 0xE4DC, + 0x9130, 0xE44C, 0xD898, 0xF626, 0xCBB8, 0xF2EE, 0xB770, 0xC998, 0xF266, 0xB330, + 0xC888, 0xF222, 0xB110, 0xEC44, 0x9730, 0xE5CC, 0x9310, 0xE4C4, 0xD988, 0xF662, + 0xCB88, 0xF2E2, 0xB710, 0xEDC4, 0xC45C, 0x98B8, 0xE62E, 0xDC5C, 0x89B8, 0xE26E, + 0x8898, 0xE226, 0xB9B8, 0xCC4C, 0xB898, 0xEE26, 0xC5DC, 0x9BB8, 0xC4CC, 0x9998, + 0xC444, 0x9888, 0xE622, 0xDC44, 0x8B98, 0xE2E6, 0x8988, 0xE262, 0xBB98, 0xCCC4, + 0xB988, 0xEE62, 0xC5C4, 0x9B88, 0xE6E2, 0xDDC4, 0xC22E, 0x8C5C, 0xCE2E, 0xBC5C, + 0x84DC, 0x844C, 0x9CDC, 0xC626, 0x9C4C, 0xDE26, 0xC2EE, 0x8DDC, 0xC266, 0x8CCC, + 0xC222, 0xBDDC, 0x8C44, 0xBCCC, 0xCE22, 0xBC44, 0x85CC, 0x84C4, 0x9DCC, 0xC662, + 0x9CC4, 0xDE62, 0xC2E2, 0x8DC4, 0xCEE2, 0xBDC4, 0x862E, 0x9E2E, 0x826E, 0x8226, + 0x8E6E, 0x8E26, 0xBE6E, 0x86EE, 0x8666, 0x9EEE, 0x8622, 0x9E66, 0x9E22, 0x82E6, + 0x8262, 0x8EE6, 0x8E62, 0xBEE6, 0xBE62, 0x86E2, 0x9EE2, 0xD0B8, 0xF42E, 0xA370, + 0xE8DC, 0xA130, 0xE84C, 0xD3B8, 0xF4EE, 0xD198, 0xF466, 0xD088, 0xF422, 0xAF70, + 0xEBDC, 0xA730, 0xE9CC, 0xA310, 0xE8C4, 0xD798, 0xF5E6, 0xD388, 0xF4E2, 0xAF10, + 0xEBC4, 0xC85C, 0xB0B8, 0xEC2E, 0x91B8, 0xE46E, 0x9098, 0xE426, 0xD84C, 0xC9DC, + 0xB3B8, 0xC8CC, 0xB198, 0xC844, 0xB088, 0xEC22, 0x97B8, 0xE5EE, 0x9398, 0xE4E6, + 0x9188, 0xE462, 0xD8C4, 0xCBCC, 0xB798, 0xC9C4, 0xB388, 0xECE2, 0x9788, 0xE5E2, + 0xDBC4, 0xC42E, 0x985C, 0xDC2E, 0x88DC, 0x884C, 0xB8DC, 0xCC26, 0xB84C, 0xC4EE, + 0x99DC, 0xC466, 0x98CC, 0xC422, 0x9844, 0xDC22, 0x8BDC, 0x89CC, 0xBBDC, 0x88C4, + 0xB9CC, 0xCC62, 0xB8C4, 0xC5E6, 0x9BCC, 0xC4E2, 0x99C4, 0xDCE2, 0x8BC4, 0xCDE2, + 0xBBC4, 0x8C2E, 0x846E, 0x8426, 0x9C6E, 0x9C26, 0x8CEE, 0x8C66, 0xBCEE, 0x8C22, + 0xBC66, 0x85EE, 0x84E6, 0x9DEE, 0x8462, 0x9CE6, 0x9C62, 0x8DE6, 0x8CE2, 0xBDE6, + 0xBCE2, 0x85E2, 0x9DE2, 0xD05C, 0xA1B8, 0xE86E, 0xA098, 0xE826, 0xD1DC, 0xD0CC, + 0xD044, 0xA7B8, 0xE9EE, 0xA398, 0xE8E6, 0xA188, 0xE862, 0xD7DC, 0xD3CC, 0xD1C4, + 0xAF98, 0xEBE6, 0xA788, 0xE9E2, 0xC82E, 0xB05C, 0x90DC, 0x904C, 0xD826, 0xC8EE, + 0xB1DC, 0xC866, 0xB0CC, 0xC822, 0xB044, 0x93DC, 0x91CC, 0x90C4, 0xD862, 0xCBEE, + 0xB7DC, 0xC9E6, 0xB3CC, 0xC8E2, 0xB1C4, 0x97CC, 0x93C4, 0xD9E2, 0x982E, 0x886E, + 0x8826, 0xB86E, 0x98EE, 0x9866, 0x9822, 0x89EE, 0x88E6, 0xB9EE, 0x8862, 0xB8E6, + 0xB862, 0x9BEE, 0x99E6, 0x98E2, 0x8BE6, 0x89E2, 0xBBE6, 0xB9E2, 0xD02E, 0xA0DC, + 0xA04C, 0xD0EE, 0xD066, 0xD022, 0xA3DC, 0xA1CC, 0xA0C4, 0xD3EE, 0xD1E6, 0xD0E2, + 0xAFDC, 0xA7CC, 0xA3C4, 0x906E, 0x9026, 0xB0EE, 0xB066, 0x91EE, 0x90E6, 0x9062, + 0xB3EE, 0xB1E6, 0xB0E2, 0x97EE, 0x93E6, 0x91E2, 0xD4E0, 0xF538, 0xFD4E, 0xA8C0, + 0xEA30, 0xFA8C, 0xD420, 0xF508, 0xFD42, 0xDAF0, 0xF6BC, 0xCA70, 0xF29C, 0xB4E0, + 0xED38, 0xFB4E, 0x9460, 0xE518, 0xF946, 0xDA30, 0xF68C, 0xCA10, 0xF284, 0xB420, + 0xED08, 0xFB42, 0xCD78, 0xF35E, 0xBAF0, 0xEEBC, 0xC538, 0xF14E, 0x9A70, 0xE69C, + 0xDD38, 0xF74E, 0x8A30, 0xE28C, 0xCD18, 0xF346, 0xBA30, 0xEE8C, 0xC508, 0xF142, + 0x9A10, 0xE684, 0xDD08, 0xF742, 0xC6BC, 0x9D78, 0xE75E, 0xDEBC, 0xC29C, 0x8D38, + 0xE34E, 0xCE9C, 0xBD38, 0xEF4E, 0x8518, 0xE146, 0xC68C, 0x9D18, 0xE746, 0xDE8C, + 0xC284, 0x8D08, 0xE342, 0xCE84, 0xBD08, 0xEF42, 0xC35E, 0x8EBC, 0xCF5E, 0xBEBC, + 0xC14E, 0x869C, 0xC74E, 0x9E9C, 0xDF4E, 0x828C, 0xC346, 0x8E8C, 0xCF46, 0xBE8C, + 0xC142, 0x8684, 0xC742, 0x9E84, 0xDF42, 0x875E, 0x9F5E, 0x834E, 0x8F4E, 0xBF4E, + 0x8146, 0x8746, 0x9F46, 0x8342, 0x8F42, 0xBF42, 0xE978, 0xFA5E, 0xD6F0, 0xF5BC, + 0xD270, 0xF49C, 0xACE0, 0xEB38, 0xFACE, 0xA460, 0xE918, 0xFA46, 0xD630, 0xF58C, + 0xD210, 0xF484, 0xAC20, 0xEB08, 0xFAC2, 0x92F0, 0xE4BC, 0xD978, 0xF65E, 0xCB78, + 0xF2DE, 0xB6F0, 0xC938, 0xF24E, 0xB270, 0xEC9C, 0x9670, 0xE59C, 0x9230, 0xE48C, + 0xD918, 0xF646, 0xCB18, 0xF2C6, 0xB630, 0xC908, 0xF242, 0xB210, 0xEC84, 0x9610, + 0xE584, 0xDB08, 0xF6C2, 0x8978, 0xE25E, 0xCCBC, 0xB978, 0xEE5E, 0xC5BC, 0x9B78, + 0xC49C, 0x9938, 0xE64E, 0xDC9C, 0x8B38, 0xE2CE, 0x8918, 0xE246, 0xBB38, 0xCC8C, + 0xB918, 0xEE46, 0xC58C, 0x9B18, 0xC484, 0x9908, 0xE642, 0xDC84, 0x8B08, 0xE2C2, + 0xCD84, 0xBB08, 0xEEC2, 0x84BC, 0xC65E, 0x9CBC, 0xDE5E, 0xC2DE, 0x8DBC, 0xC24E, + 0x8C9C, 0xBDBC, 0xCE4E, 0xBC9C, 0x859C, 0x848C, 0x9D9C, 0xC646, 0x9C8C, 0xDE46, + 0xC2C6, 0x8D8C, 0xC242, 0x8C84, 0xBD8C, 0xCE42, 0xBC84, 0x8584, 0xC6C2, 0x9D84, + 0xDEC2, 0x825E, 0x8E5E, 0xBE5E, 0x86DE, 0x864E, 0x9EDE, 0x9E4E, 0x82CE, 0x8246, + 0x8ECE, 0x8E46, 0xBECE, 0xBE46, 0x86C6, 0x8642, 0x9EC6, 0x9E42, 0x82C2, 0x8EC2, + 0xBEC2, 0xA2F0, 0xE8BC, 0xD378, 0xF4DE, 0xD138, 0xF44E, 0xAEF0, 0xEBBC, 0xA670, + 0xE99C, 0xA230, 0xE88C, 0xD738, 0xF5CE, 0xD318, 0xF4C6, 0xD108, 0xF442, 0xAE30, + 0xEB8C, 0xA610, 0xE984, 0xD708, 0xF5C2, 0x9178, 0xE45E, 0xD8BC, 0xC9BC, 0xB378, + 0xC89C, 0xB138, 0xEC4E, 0x9778, 0xE5DE, 0x9338, 0xE4CE, 0x9118, 0xE446, 0xD88C, + 0xCB9C, 0xB738, 0xC98C, 0xB318, 0xC884, 0xB108, 0xEC42, 0x9718, 0xE5C6, 0x9308, + 0xE4C2, 0xD984, 0xCB84, 0xB708, 0xEDC2, 0x88BC, 0xCC5E, 0xB8BC, 0xC4DE, 0x99BC, + 0xC44E, 0x989C, 0xDC4E, 0x8BBC, 0x899C, 0xBBBC, 0x888C, 0xB99C, 0xCC46, 0xB88C, + 0xC5CE, 0x9B9C, 0xC4C6, 0x998C, 0xC442, 0x9884, 0xDC42, 0x8B8C, 0x8984, 0xBB8C, + 0xCCC2, 0xB984, 0xC5C2, 0x9B84, 0xDDC2, 0x845E, 0x9C5E, 0x8CDE, 0x8C4E, 0xBCDE, + 0xBC4E, 0x85DE, 0x84CE, 0x9DDE, 0x8446, 0x9CCE, 0x9C46, 0x8DCE, 0x8CC6, 0xBDCE, + 0x8C42, 0xBCC6, 0xBC42, 0x85C6, 0x84C2, 0x9DC6, 0x9CC2, 0x8DC2, 0xBDC2, 0xA178, + 0xE85E, 0xD1BC, 0xD09C, 0xA778, 0xE9DE, 0xA338, 0xE8CE, 0xA118, 0xE846, 0xD7BC, + 0xD39C, 0xD18C, 0xD084, 0xAF38, 0xEBCE, 0xA718, 0xE9C6, 0xA308, 0xE8C2, 0xD78C, + 0xD384, 0x90BC, 0xD85E, 0xC8DE, 0xB1BC, 0xC84E, 0xB09C, 0x93BC, 0x919C, 0x908C, + 0xD846, 0xCBDE, 0xB7BC, 0xC9CE, 0xB39C, 0xC8C6, 0xB18C, 0xC842, 0xB084, 0x979C, + 0x938C, 0x9184, 0xD8C2, 0xCBC6, 0xB78C, 0xC9C2, 0xB384, 0x885E, 0xB85E, 0x98DE, + 0x984E, 0x89DE, 0x88CE, 0xB9DE, 0x8846, 0xB8CE, 0xB846, 0x9BDE, 0x99CE, 0x98C6, + 0x9842, 0x8BCE, 0x89C6, 0xBBCE, 0x88C2, 0xB9C6, 0xB8C2, 0x9BC6, 0x99C2, 0xA0BC, + 0xD0DE, 0xD04E, 0xA3BC, 0xA19C, 0xA08C, 0xD3DE, 0xD1CE, 0xD0C6, 0xD042, 0xAFBC, + 0xA79C, 0xA38C, 0xA184, 0xD7CE, 0xD3C6, 0xD1C2, 0x905E, 0xB0DE, 0xB04E, 0x91DE, + 0x90CE, 0x9046, 0xB3DE, 0xB1CE, 0xB0C6, 0xB042, 0x97DE, 0x93CE, 0x91C6, 0x90C2, + 0xB7CE, 0xB3C6, 0xB1C2, 0xA05E, 0xA1DE, 0xA0CE, 0xA046, 0xA7DE, 0xA3CE, 0xA1C6, + 0xA0C2, 0xA9E0, 0xEA78, 0xFA9E, 0xD470, 0xF51C, 0xA860, 0xEA18, 0xFA86, 0xD410, + 0xF504, 0xED7C, 0x94F0, 0xE53C, 0xDA78, 0xF69E, 0xCA38, 0xF28E, 0xB470, 0xED1C, + 0x9430, 0xE50C, 0xDA18, 0xF686, 0xCA08, 0xF282, 0xB410, 0xED04, 0x9AF8, 0xE6BE, + 0xDD7C, 0x8A78, 0xE29E, 0xCD3C, 0xBA78, 0xEE9E, 0xC51C, 0x9A38, 0xE68E, 0xDD1C, + 0x8A18, 0xE286, 0xCD0C, 0xBA18, 0xEE86, 0xC504, 0x9A08, 0xE682, 0xDD04, 0x8D7C, + 0xCEBE, 0xBD7C, 0x853C, 0xC69E, 0x9D3C, 0xDE9E, 0xC28E, 0x8D1C, 0xCE8E, 0xBD1C, + 0x850C, 0xC686, 0x9D0C, 0xDE86, 0xC282, 0x8D04, 0xCE82, 0xBD04, 0x86BE, 0x9EBE, + 0x829E, 0x8E9E, 0xBE9E, 0x868E, 0x9E8E, 0x8286, 0x8E86, 0xBE86, 0x8682, 0x9E82, + 0xD2F8, 0xF4BE, 0xADF0, 0xEB7C, 0xA4F0, 0xE93C, 0xD678, 0xF59E, 0xD238, 0xF48E, + 0xAC70, 0xEB1C, 0xA430, 0xE90C, 0xD618, 0xF586, 0xD208, 0xF482, 0xAC10, 0xEB04, + 0xC97C, 0xB2F8, 0xECBE, 0x96F8, 0xE5BE, 0x9278, 0xE49E, 0xD93C, 0xCB3C, 0xB678, + 0xC91C, 0xB238, 0xEC8E, 0x9638, 0xE58E, 0x9218, 0xE486, 0xD90C, 0xCB0C, 0xB618, + 0xC904, 0xB208, 0xEC82, 0x9608, 0xE582, 0xDB04, 0xC4BE, 0x997C, 0xDCBE, 0x8B7C, + 0x893C, 0xBB7C, 0xCC9E, 0xB93C, 0xC59E, 0x9B3C, 0xC48E, 0x991C, 0xDC8E, 0x8B1C, + 0x890C, 0xBB1C, 0xCC86, 0xB90C, 0xC586, 0x9B0C, 0xC482, 0x9904, 0xDC82, 0x8B04, + 0xCD82, 0xBB04, 0x8CBE, 0xBCBE, 0x85BE, 0x849E, 0x9DBE, 0x9C9E, 0x8D9E, 0x8C8E, + 0xBD9E, 0xBC8E, 0x858E, 0x8486, 0x9D8E, 0x9C86, 0x8D86, 0x8C82, 0xBD86, 0xBC82, + 0x8582, 0x9D82, 0xD17C, 0xA6F8, 0xE9BE, 0xA278, 0xE89E, 0xD77C, 0xD33C, 0xD11C, + 0xAE78, 0xEB9E, 0xA638, 0xE98E, 0xA218, 0xE886, 0xD71C, 0xD30C, 0xD104, 0xAE18, + 0xEB86, 0xA608, 0xE982, 0xC8BE, 0xB17C, 0x937C, 0x913C, 0xD89E, 0xCBBE, 0xB77C, + 0xC99E, 0xB33C, 0xC88E, 0xB11C, 0x973C, 0x931C, 0x910C, 0xD886, 0xCB8E, 0xB71C, + 0xC986, 0xB30C, 0xC882, 0xB104, 0x970C, 0x9304, 0xD982, 0x98BE, 0x89BE, 0x889E, + 0xB9BE, 0xB89E, 0x9BBE, 0x999E, 0x988E, 0x8B9E, 0x898E, 0xBB9E, 0x8886, 0xB98E, + 0xB886, 0x9B8E, 0x9986, 0x9882, 0x8B86, 0x8982, 0xBB86, 0xB982, 0xD0BE, 0xA37C, + 0xA13C, 0xD3BE, 0xD19E, 0xD08E, 0xAF7C, 0xA73C, 0xA31C, 0xA10C, 0xD79E, 0xD38E, + 0xD186, 0xD082, 0xAF1C, 0xA70C, 0xA304, 0xB0BE, 0x91BE, 0x909E, 0xB3BE, 0xB19E, + 0xB08E, 0x97BE, 0x939E, 0x918E, 0x9086, 0xB79E, 0xB38E, 0xB186, 0xB082, 0x978E, + 0x9386, 0x9182, 0xA1BE, 0xA09E, 0xA7BE, 0xA39E, 0xA18E, 0xA086, 0xAF9E, 0xA78E, + 0xA386, 0xA182, 0xD4F8, 0xF53E, 0xA8F0, 0xEA3C, 0xD438, 0xF50E, 0xA830, 0xEA0C, + 0xD408, 0xF502, 0xDAFC, 0xCA7C, 0xB4F8, 0xED3E, 0x9478, 0xE51E, 0xDA3C, 0xCA1C, + 0xB438, 0xED0E, 0x9418, 0xE506, 0xDA0C, 0xCA04, 0xB408, 0xED02, 0xCD7E, 0xBAFC, + 0xC53E, 0x9A7C, 0xDD3E, 0x8A3C, 0xCD1E, 0xBA3C, 0xC50E, 0x9A1C, 0xDD0E, 0x8A0C, + 0xCD06, 0xBA0C, 0xC502, 0x9A04, 0xDD02, 0x9D7E, 0x8D3E, 0xBD3E, 0x851E, 0x9D1E, + 0x8D0E, 0xBD0E, 0x8506, 0x9D06, 0x8D02, 0xBD02, 0xE97E, 0xD6FC, 0xD27C, 0xACF8, + 0xEB3E, 0xA478, 0xE91E, 0xD63C, 0xD21C, 0xAC38, 0xEB0E, 0xA418, 0xE906, 0xD60C, + 0xD204, 0x92FC, 0xD97E, 0xCB7E, 0xB6FC, 0xC93E, 0xB27C, 0x967C, 0x923C, 0xD91E, + 0xCB1E, 0xB63C, 0xC90E, 0xB21C, 0x961C, 0x920C, 0xD906, 0xCB06, 0xB60C, 0xC902, + 0xB204, 0x897E, 0xB97E, 0x9B7E, 0x993E, 0x8B3E, 0x891E, 0xBB3E, 0xB91E, 0x9B1E, + 0x990E, 0x8B0E, 0x8906, 0xBB0E, 0xB906, 0x9B06, 0x9902, 0xA2FC, 0xD37E, 0xD13E, + 0xAEFC +}; diff --git a/3rdparty/zint-2.6.1/backend/common.c b/3rdparty/zint-2.6.1/backend/common.c new file mode 100644 index 0000000..708c417 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/common.c @@ -0,0 +1,317 @@ +/* common.c - Contains functions needed for a number of barcodes */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ +#include +#include +#include +#include "common.h" + +/* Local replacement for strlen() with unsigned char strings */ +size_t ustrlen(const unsigned char data[]) { + return strlen((const char*) data); +} + +/* Converts a character 0-9 to its equivalent integer value */ +int ctoi(const char source) { + if ((source >= '0') && (source <= '9')) + return (source - '0'); + return (source - 'A' + 10); +} + + +/* Convert an integer value to a string representing its binary equivalent */ +void bin_append(const int arg, const int length, char *binary) { + int i; + int start; + size_t posn = strlen(binary); + + start = 0x01 << (length - 1); + + for (i = 0; i < length; i++) { + binary[posn + i] = '0'; + if (arg & (start >> i)) { + binary[posn + i] = '1'; + } + } + binary[posn + length] = '\0'; + + return; +} + +/* Converts an integer value to its hexadecimal character */ +char itoc(const int source) { + if ((source >= 0) && (source <= 9)) { + return ('0' + source); + } else { + return ('A' + (source - 10)); + } +} +/* Converts lower case characters to upper case in a string source[] */ +void to_upper(unsigned char source[]) { + size_t i, src_len = ustrlen(source); + + for (i = 0; i < src_len; i++) { + if ((source[i] >= 'a') && (source[i] <= 'z')) { + source [i] = (source[i] - 'a') + 'A'; + } + } +} + +/* Verifies that a string only uses valid characters */ +int is_sane(const char test_string[], const unsigned char source[], const size_t length) { + unsigned int j, latch; + size_t i, lt = strlen(test_string); + + for (i = 0; i < length; i++) { + latch = FALSE; + for (j = 0; j < lt; j++) { + if (source[i] == test_string[j]) { + latch = TRUE; + break; + } + } + if (!(latch)) { + return ZINT_ERROR_INVALID_DATA; + } + } + + return 0; +} + +/* Replaces huge switch statements for looking up in tables */ +void lookup(const char set_string[], const char *table[], const char data, char dest[]) { + size_t i, n = strlen(set_string); + + for (i = 0; i < n; i++) { + if (data == set_string[i]) { + strcat(dest, table[i]); + } + } +} + +/* Returns the position of data in set_string */ +int posn(const char set_string[], const char data) { + int i, n = (int)strlen(set_string); + + for (i = 0; i < n; i++) { + if (data == set_string[i]) { + return i; + } + } + return -1; +} + +/* Return true (1) if a module is dark/black, otherwise false (0) */ +int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord) { + return (symbol->encoded_data[y_coord][x_coord / 7] >> (x_coord % 7)) & 1; +} + +/* Set a module to dark/black */ +void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord) { + symbol->encoded_data[y_coord][x_coord / 7] |= 1 << (x_coord % 7); +} + +/* Set (or unset) a module to white */ +void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord) { + symbol->encoded_data[y_coord][x_coord / 7] &= ~(1 << (x_coord % 7)); +} + +/* Expands from a width pattern to a bit pattern */ +void expand(struct zint_symbol *symbol, const char data[]) { + + size_t reader, n = strlen(data); + int writer, i; + char latch; + + writer = 0; + latch = '1'; + + for (reader = 0; reader < n; reader++) { + for (i = 0; i < ctoi(data[reader]); i++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer); + } + writer++; + } + + latch = (latch == '1' ? '0' : '1'); + } + + if (symbol->symbology != BARCODE_PHARMA) { + if (writer > symbol->width) { + symbol->width = writer; + } + } else { + /* Pharmacode One ends with a space - adjust for this */ + if (writer > symbol->width + 2) { + symbol->width = writer - 2; + } + } + symbol->rows = symbol->rows + 1; +} + +/* Indicates which symbologies can have row binding */ +int is_stackable(const int symbology) { + if (symbology < BARCODE_PDF417) { + return 1; + } + + switch (symbology) { + case BARCODE_CODE128B: + case BARCODE_ISBNX: + case BARCODE_EAN14: + case BARCODE_NVE18: + case BARCODE_KOREAPOST: + case BARCODE_PLESSEY: + case BARCODE_TELEPEN_NUM: + case BARCODE_ITF14: + case BARCODE_CODE32: + case BARCODE_CODABLOCKF: + return 1; + } + + return 0; +} + +/* Indicates which symbols can have addon (EAN-2 and EAN-5) */ +int is_extendable(const int symbology) { + if (symbology == BARCODE_EANX) { + return 1; + } + if (symbology == BARCODE_UPCA) { + return 1; + } + if (symbology == BARCODE_UPCE) { + return 1; + } + if (symbology == BARCODE_ISBNX) { + return 1; + } + if (symbology == BARCODE_UPCA_CC) { + return 1; + } + if (symbology == BARCODE_UPCE_CC) { + return 1; + } + if (symbology == BARCODE_EANX_CC) { + return 1; + } + + return 0; +} + +int istwodigits(const unsigned char source[], const size_t position) { + if ((source[position] >= '0') && (source[position] <= '9')) { + if ((source[position + 1] >= '0') && (source[position + 1] <= '9')) { + return 1; + } + } + + return 0; +} + +int utf8toutf16(struct zint_symbol *symbol, const unsigned char source[], int vals[], size_t *length) { + size_t bpos; + int jpos, error_number; + int next; + + bpos = 0; + jpos = 0; + error_number = 0; + next = 0; + + do { + if (source[bpos] <= 0x7f) { + /* 1 byte mode (7-bit ASCII) */ + vals[jpos] = source[bpos]; + next = bpos + 1; + jpos++; + } else { + if ((source[bpos] >= 0x80) && (source[bpos] <= 0xbf)) { + strcpy(symbol->errtxt, "240: Corrupt Unicode data"); + return ZINT_ERROR_INVALID_DATA; + } + if ((source[bpos] >= 0xc0) && (source[bpos] <= 0xc1)) { + strcpy(symbol->errtxt, "241: Overlong encoding not supported"); + return ZINT_ERROR_INVALID_DATA; + } + + if ((source[bpos] >= 0xc2) && (source[bpos] <= 0xdf)) { + /* 2 byte mode */ + vals[jpos] = ((source[bpos] & 0x1f) << 6) + (source[bpos + 1] & 0x3f); + next = bpos + 2; + jpos++; + } else + if ((source[bpos] >= 0xe0) && (source[bpos] <= 0xef)) { + /* 3 byte mode */ + vals[jpos] = ((source[bpos] & 0x0f) << 12) + ((source[bpos + 1] & 0x3f) << 6) + (source[bpos + 2] & 0x3f); + next = bpos + 3; + jpos++; + } else + if (source[bpos] >= 0xf0) { + strcpy(symbol->errtxt, "242: Unicode sequences of more than 3 bytes not supported"); + return ZINT_ERROR_INVALID_DATA; + } + } + + bpos = next; + + } while (bpos < *length); + *length = jpos; + + return error_number; +} + + +void set_minimum_height(struct zint_symbol *symbol, const int min_height) { + /* Enforce minimum permissable height of rows */ + int fixed_height = 0; + int zero_count = 0; + int i; + + for (i = 0; i < symbol->rows; i++) { + fixed_height += symbol->row_height[i]; + + if (symbol->row_height[i] == 0) { + zero_count++; + } + } + + if (zero_count > 0) { + if (((symbol->height - fixed_height) / zero_count) < min_height) { + for (i = 0; i < symbol->rows; i++) { + if (symbol->row_height[i] == 0) { + symbol->row_height[i] = min_height; + } + } + } + } +} diff --git a/3rdparty/zint-2.6.1/backend/common.h b/3rdparty/zint-2.6.1/backend/common.h new file mode 100644 index 0000000..4bc3fc1 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/common.h @@ -0,0 +1,79 @@ +/* common.h - Header for all common functions in common.c */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* Used in some logic */ +#ifndef __COMMON_H +#define __COMMON_H + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +/* The most commonly used set */ +#define NEON "0123456789" + +#include "zint.h" +#include + +#define ustrcpy(target,source) strcpy((char*)target,(const char*)source) + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + extern size_t ustrlen(const unsigned char source[]); + extern int ctoi(const char source); + extern char itoc(const int source); + extern void to_upper(unsigned char source[]); + extern int is_sane(const char test_string[], const unsigned char source[], const size_t length); + extern void lookup(const char set_string[], const char *table[], const char data, char dest[]); + extern void bin_append(const int arg, const int length, char *binary); + extern int posn(const char set_string[], const char data); + extern int module_is_set(const struct zint_symbol *symbol, const int y_coord, const int x_coord); + extern void set_module(struct zint_symbol *symbol, const int y_coord, const int x_coord); + extern int istwodigits(const unsigned char source[], const size_t position); + extern int parunmodd(const unsigned char llyth); + extern void expand(struct zint_symbol *symbol, const char data[]); + extern void unset_module(struct zint_symbol *symbol, const int y_coord, const int x_coord); + extern int is_stackable(const int symbology); + extern int is_extendable(const int symbology); + extern int utf8toutf16(struct zint_symbol *symbol, const unsigned char source[], int vals[], size_t *length); + extern void set_minimum_height(struct zint_symbol *symbol, const int min_height); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __COMMON_H */ diff --git a/3rdparty/zint-2.6.1/backend/composite.c b/3rdparty/zint-2.6.1/backend/composite.c new file mode 100644 index 0000000..842901c --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/composite.c @@ -0,0 +1,1872 @@ +/* composite.c - Handles GS1 Composite Symbols */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* The functions "getBit", "init928" and "encode928" are copyright BSI and are + released with permission under the following terms: + + "Copyright subsists in all BSI publications. BSI also holds the copyright, in the + UK, of the international standardisation bodies. Except as + permitted under the Copyright, Designs and Patents Act 1988 no extract may be + reproduced, stored in a retrieval system or transmitted in any form or by any + means - electronic, photocopying, recording or otherwise - without prior written + permission from BSI. + + "This does not preclude the free use, in the course of implementing the standard, + of necessary details such as symbols, and size, type or grade designations. If these + details are to be used for any other purpose than implementation then the prior + written permission of BSI must be obtained." + + The date of publication for these functions is 31 May 2006 + */ + +#include +#include +#include +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include "large.h" +#include "composite.h" +#include "pdf417.h" +#include "gs1.h" + +#define UINT unsigned short + +extern int general_rules(char field[], char type[]); +extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length); +extern int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); +extern int rss14(struct zint_symbol *symbol, unsigned char source[], int length); +extern int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length); +extern int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length); + +static UINT pwr928[69][7]; + +static int _min(int first, int second) { + + if (first <= second) + return first; + else + return second; +} + +/* gets bit in bitString at bitPos */ +static int getBit(UINT *bitStr, int bitPos) { + return !!(bitStr[bitPos >> 4] & (0x8000 >> (bitPos & 15))); +} + +/* initialize pwr928 encoding table */ +static void init928(void) { + int i, j, v; + int cw[7]; + cw[6] = 1L; + for (i = 5; i >= 0; i--) + cw[i] = 0; + + for (i = 0; i < 7; i++) + pwr928[0][i] = cw[i]; + for (j = 1; j < 69; j++) { + for (v = 0, i = 6; i >= 1; i--) { + v = (2 * cw[i]) + (v / 928); + pwr928[j][i] = cw[i] = v % 928; + } + pwr928[j][0] = cw[0] = (2 * cw[0]) + (v / 928); + } + return; +} + +/* converts bit string to base 928 values, codeWords[0] is highest order */ +static int encode928(UINT bitString[], UINT codeWords[], int bitLng) { + int i, j, b, bitCnt, cwNdx, cwCnt, cwLng; + for (cwNdx = cwLng = b = 0; b < bitLng; b += 69, cwNdx += 7) { + bitCnt = _min(bitLng - b, 69); + cwLng += cwCnt = bitCnt / 10 + 1; + for (i = 0; i < cwCnt; i++) + codeWords[cwNdx + i] = 0; /* init 0 */ + for (i = 0; i < bitCnt; i++) { + if (getBit(bitString, b + bitCnt - i - 1)) { + for (j = 0; j < cwCnt; j++) + codeWords[cwNdx + j] += pwr928[i][j + 7 - cwCnt]; + } + } + for (i = cwCnt - 1; i > 0; i--) { + /* add "carries" */ + codeWords[cwNdx + i - 1] += codeWords[cwNdx + i] / 928L; + codeWords[cwNdx + i] %= 928L; + } + } + return (cwLng); +} + +/* CC-A 2D component */ +static int cc_a(struct zint_symbol *symbol, char source[], int cc_width) { + int i, strpos, segment, bitlen, cwCnt, variant, rows; + int k, offset, j, total, rsCodeWords[8]; + int LeftRAPStart, RightRAPStart, CentreRAPStart, StartCluster; + int LeftRAP, RightRAP, CentreRAP, Cluster, dummy[5]; + int loop; + UINT codeWords[28]; + UINT bitStr[13]; + char pattern[580]; + char local_source[210]; /* A copy of source but with padding zeroes to make 208 bits */ + + variant = 0; + + for (i = 0; i < 13; i++) { + bitStr[i] = 0; + } + for (i = 0; i < 28; i++) { + codeWords[i] = 0; + } + + bitlen = (int)strlen(source); + + for (i = 0; i < 208; i++) { + local_source[i] = '0'; + } + for (i = 0; i < bitlen; i++) { + local_source[i] = source[i]; + } + local_source[208] = '\0'; + + for (segment = 0; segment < 13; segment++) { + strpos = segment * 16; + for (i = 0; i < 16; i++) { + if (local_source[strpos + i] == '1') { + bitStr[segment] += (0x8000 >> i); + } + } + } + + init928(); + /* encode codeWords from bitStr */ + cwCnt = encode928(bitStr, codeWords, bitlen); + + switch (cc_width) { + case 2: + switch (cwCnt) { + case 6: variant = 0; + break; + case 8: variant = 1; + break; + case 9: variant = 2; + break; + case 11: variant = 3; + break; + case 12: variant = 4; + break; + case 14: variant = 5; + break; + case 17: variant = 6; + break; + } + break; + case 3: + switch (cwCnt) { + case 8: variant = 7; + break; + case 10: variant = 8; + break; + case 12: variant = 9; + break; + case 14: variant = 10; + break; + case 17: variant = 11; + break; + } + break; + case 4: + switch (cwCnt) { + case 8: variant = 12; + break; + case 11: variant = 13; + break; + case 14: variant = 14; + break; + case 17: variant = 15; + break; + case 20: variant = 16; + break; + } + break; + } + + rows = ccaVariants[variant]; + k = ccaVariants[17 + variant]; + offset = ccaVariants[34 + variant]; + + /* Reed-Solomon error correction */ + + for (i = 0; i < 8; i++) { + rsCodeWords[i] = 0; + } + total = 0; + for (i = 0; i < cwCnt; i++) { + total = (codeWords[i] + rsCodeWords[k - 1]) % 929; + for (j = k - 1; j >= 0; j--) { + if (j == 0) { + rsCodeWords[j] = (929 - (total * ccaCoeffs[offset + j]) % 929) % 929; + } else { + rsCodeWords[j] = (rsCodeWords[j - 1] + 929 - (total * ccaCoeffs[offset + j]) % 929) % 929; + } + } + } + + for (j = 0; j < k; j++) { + if (rsCodeWords[j] != 0) { + rsCodeWords[j] = 929 - rsCodeWords[j]; + } + } + + for (i = k - 1; i >= 0; i--) { + codeWords[cwCnt] = rsCodeWords[i]; + cwCnt++; + } + + /* Place data into table */ + LeftRAPStart = aRAPTable[variant]; + CentreRAPStart = aRAPTable[variant + 17]; + RightRAPStart = aRAPTable[variant + 34]; + StartCluster = aRAPTable[variant + 51] / 3; + + LeftRAP = LeftRAPStart; + CentreRAP = CentreRAPStart; + RightRAP = RightRAPStart; + Cluster = StartCluster; /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ + + for (i = 0; i < rows; i++) { + strcpy(pattern, ""); + offset = 929 * Cluster; + for (j = 0; j < 5; j++) { + dummy[j] = 0; + } + for (j = 0; j < cc_width; j++) { + dummy[j + 1] = codeWords[i * cc_width + j]; + } + /* Copy the data into codebarre */ + bin_append(rap_side[LeftRAP - 1], 10, pattern); + bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern); + strcat(pattern, "0"); + if (cc_width == 3) { + bin_append(rap_centre[CentreRAP - 1], 10, pattern); + } + if (cc_width >= 2) { + bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern); + strcat(pattern, "0"); + } + if (cc_width == 4) { + bin_append(rap_centre[CentreRAP - 1], 10, pattern); + } + if (cc_width >= 3) { + bin_append(pdf_bitpattern[offset + dummy[3]], 16, pattern); + strcat(pattern, "0"); + } + if (cc_width == 4) { + bin_append(pdf_bitpattern[offset + dummy[4]], 16, pattern); + strcat(pattern, "0"); + } + bin_append(rap_side[RightRAP - 1], 10, pattern); + strcat(pattern, "1"); /* stop */ + + /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ + for (loop = 0; loop < (int) strlen(pattern); loop++) { + if (pattern[loop] == '1') { + set_module(symbol, i, loop); + } + } + symbol->row_height[i] = 2; + symbol->rows++; + symbol->width = strlen(pattern); + + /* Set up RAPs and Cluster for next row */ + LeftRAP++; + CentreRAP++; + RightRAP++; + Cluster++; + + if (LeftRAP == 53) { + LeftRAP = 1; + } + if (CentreRAP == 53) { + CentreRAP = 1; + } + if (RightRAP == 53) { + RightRAP = 1; + } + if (Cluster == 3) { + Cluster = 0; + } + } + + return 0; +} + +/* CC-B 2D component */ +static int cc_b(struct zint_symbol *symbol, char source[], int cc_width) { + int length, i, binloc; +#ifndef _MSC_VER + unsigned char data_string[(strlen(source) / 8) + 3]; +#else + unsigned char* data_string = (unsigned char*) _alloca((strlen(source) / 8) + 3); +#endif + int chainemc[180], mclength; + int k, j, p, longueur, mccorrection[50], offset; + int total, dummy[5]; + char pattern[580]; + int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster; + int LeftRAP, CentreRAP, RightRAP, Cluster, loop; + + length = strlen(source) / 8; + + for (i = 0; i < length; i++) { + binloc = i * 8; + + data_string[i] = 0; + for (p = 0; p < 8; p++) { + if (source[binloc + p] == '1') { + data_string[i] += (0x80 >> p); + } + } + } + + + mclength = 0; + + /* "the CC-B component shall have codeword 920 in the first symbol character position" (section 9a) */ + chainemc[mclength] = 920; + mclength++; + + byteprocess(chainemc, &mclength, data_string, 0, length, 0); + + /* Now figure out which variant of the symbol to use and load values accordingly */ + + variant = 0; + + if (cc_width == 2) { + variant = 13; + if (mclength <= 33) { + variant = 12; + } + if (mclength <= 29) { + variant = 11; + } + if (mclength <= 24) { + variant = 10; + } + if (mclength <= 19) { + variant = 9; + } + if (mclength <= 13) { + variant = 8; + } + if (mclength <= 8) { + variant = 7; + } + } + + if (cc_width == 3) { + variant = 23; + if (mclength <= 70) { + variant = 22; + } + if (mclength <= 58) { + variant = 21; + } + if (mclength <= 46) { + variant = 20; + } + if (mclength <= 34) { + variant = 19; + } + if (mclength <= 24) { + variant = 18; + } + if (mclength <= 18) { + variant = 17; + } + if (mclength <= 14) { + variant = 16; + } + if (mclength <= 10) { + variant = 15; + } + if (mclength <= 6) { + variant = 14; + } + } + + if (cc_width == 4) { + variant = 34; + if (mclength <= 108) { + variant = 33; + } + if (mclength <= 90) { + variant = 32; + } + if (mclength <= 72) { + variant = 31; + } + if (mclength <= 54) { + variant = 30; + } + if (mclength <= 39) { + variant = 29; + } + if (mclength <= 30) { + variant = 28; + } + if (mclength <= 24) { + variant = 27; + } + if (mclength <= 18) { + variant = 26; + } + if (mclength <= 12) { + variant = 25; + } + if (mclength <= 8) { + variant = 24; + } + } + + /* Now we have the variant we can load the data - from here on the same as MicroPDF417 code */ + variant--; + assert(variant >= 0); + symbol->option_2 = MicroVariants[variant]; /* columns */ + symbol->rows = MicroVariants[variant + 34]; /* rows */ + k = MicroVariants[variant + 68]; /* number of EC CWs */ + longueur = (symbol->option_2 * symbol->rows) - k; /* number of non-EC CWs */ + i = longueur - mclength; /* amount of padding required */ + offset = MicroVariants[variant + 102]; /* coefficient offset */ + + /* We add the padding */ + while (i > 0) { + chainemc[mclength] = 900; + mclength++; + i--; + } + + /* Reed-Solomon error correction */ + longueur = mclength; + for (loop = 0; loop < 50; loop++) { + mccorrection[loop] = 0; + } + total = 0; + for (i = 0; i < longueur; i++) { + total = (chainemc[i] + mccorrection[k - 1]) % 929; + for (j = k - 1; j >= 0; j--) { + if (j == 0) { + mccorrection[j] = (929 - (total * Microcoeffs[offset + j]) % 929) % 929; + } else { + mccorrection[j] = (mccorrection[j - 1] + 929 - (total * Microcoeffs[offset + j]) % 929) % 929; + } + } + } + + for (j = 0; j < k; j++) { + if (mccorrection[j] != 0) { + mccorrection[j] = 929 - mccorrection[j]; + } + } + /* we add these codes to the string */ + for (i = k - 1; i >= 0; i--) { + chainemc[mclength] = mccorrection[i]; + mclength++; + } + + /* Now get the RAP (Row Address Pattern) start values */ + LeftRAPStart = RAPTable[variant]; + CentreRAPStart = RAPTable[variant + 34]; + RightRAPStart = RAPTable[variant + 68]; + StartCluster = RAPTable[variant + 102] / 3; + + /* That's all values loaded, get on with the encoding */ + + LeftRAP = LeftRAPStart; + CentreRAP = CentreRAPStart; + RightRAP = RightRAPStart; + Cluster = StartCluster; + /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ + + for (i = 0; i < symbol->rows; i++) { + strcpy(pattern, ""); + offset = 929 * Cluster; + for (j = 0; j < 5; j++) { + dummy[j] = 0; + } + for (j = 0; j < symbol->option_2; j++) { + dummy[j + 1] = chainemc[i * symbol->option_2 + j]; + } + /* Copy the data into codebarre */ + bin_append(rap_side[LeftRAP - 1], 10, pattern); + bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern); + strcat(pattern, "0"); + if (cc_width == 3) { + bin_append(rap_centre[CentreRAP - 1], 10, pattern); + } + if (cc_width >= 2) { + bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern); + strcat(pattern, "0"); + } + if (cc_width == 4) { + bin_append(rap_centre[CentreRAP - 1], 10, pattern); + } + if (cc_width >= 3) { + bin_append(pdf_bitpattern[offset + dummy[3]], 16, pattern); + strcat(pattern, "0"); + } + if (cc_width == 4) { + bin_append(pdf_bitpattern[offset + dummy[4]], 16, pattern); + strcat(pattern, "0"); + } + bin_append(rap_side[RightRAP - 1], 10, pattern); + strcat(pattern, "1"); /* stop */ + + /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ + for (loop = 0; loop < (int) strlen(pattern); loop++) { + if (pattern[loop] == '1') { + set_module(symbol, i, loop); + } + } + symbol->row_height[i] = 2; + symbol->width = strlen(pattern); + + /* Set up RAPs and Cluster for next row */ + LeftRAP++; + CentreRAP++; + RightRAP++; + Cluster++; + + if (LeftRAP == 53) { + LeftRAP = 1; + } + if (CentreRAP == 53) { + CentreRAP = 1; + } + if (RightRAP == 53) { + RightRAP = 1; + } + if (Cluster == 3) { + Cluster = 0; + } + } + + return 0; +} + +/* CC-C 2D component - byte compressed PDF417 */ +static int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc_level) { + int length, i, p, binloc; +#ifndef _MSC_VER + unsigned char data_string[(strlen(source) / 8) + 4]; +#else + unsigned char* data_string = (unsigned char*) _alloca((strlen(source) / 8) + 4); +#endif + int chainemc[1000], mclength, k; + int offset, longueur, loop, total, j, mccorrection[520]; + int c1, c2, c3, dummy[35]; + char pattern[580]; + + length = strlen(source) / 8; + + for (i = 0; i < length; i++) { + binloc = i * 8; + + data_string[i] = 0; + for (p = 0; p < 8; p++) { + if (source[binloc + p] == '1') { + data_string[i] += (0x80 >> p); + } + } + } + + mclength = 0; + + chainemc[mclength] = 0; /* space for length descriptor */ + mclength++; + chainemc[mclength] = 920; /* CC-C identifier */ + mclength++; + + byteprocess(chainemc, &mclength, data_string, 0, length, 0); + + chainemc[0] = mclength; + + k = 1; + for (i = 1; i <= (ecc_level + 1); i++) { + k *= 2; + } + + /* 796 - we now take care of the Reed Solomon codes */ + switch (ecc_level) { + case 1: offset = 2; + break; + case 2: offset = 6; + break; + case 3: offset = 14; + break; + case 4: offset = 30; + break; + case 5: offset = 62; + break; + case 6: offset = 126; + break; + case 7: offset = 254; + break; + case 8: offset = 510; + break; + default: offset = 0; + break; + } + + longueur = mclength; + for (loop = 0; loop < 520; loop++) { + mccorrection[loop] = 0; + } + total = 0; + for (i = 0; i < longueur; i++) { + total = (chainemc[i] + mccorrection[k - 1]) % 929; + for (j = k - 1; j >= 0; j--) { + if (j == 0) { + mccorrection[j] = (929 - (total * coefrs[offset + j]) % 929) % 929; + } else { + mccorrection[j] = (mccorrection[j - 1] + 929 - (total * coefrs[offset + j]) % 929) % 929; + } + } + } + + for (j = 0; j < k; j++) { + if (mccorrection[j] != 0) { + mccorrection[j] = 929 - mccorrection[j]; + } + } + /* we add these codes to the string */ + for (i = k - 1; i >= 0; i--) { + chainemc[mclength] = mccorrection[i]; + mclength++; + } + + /* 818 - The CW string is finished */ + c1 = (mclength / cc_width - 1) / 3; + c2 = ecc_level * 3 + (mclength / cc_width - 1) % 3; + c3 = cc_width - 1; + + /* we now encode each row */ + for (i = 0; i <= (mclength / cc_width) - 1; i++) { + for (j = 0; j < cc_width; j++) { + dummy[j + 1] = chainemc[i * cc_width + j]; + } + k = (i / 3) * 30; + switch (i % 3) { + case 0: + dummy[0] = k + c1; + dummy[cc_width + 1] = k + c3; + offset = 0; /* cluster(0) */ + break; + case 1: + dummy[0] = k + c2; + dummy[cc_width + 1] = k + c1; + offset = 929; /* cluster(3) */ + break; + case 2: + dummy[0] = k + c3; + dummy[cc_width + 1] = k + c2; + offset = 1858; /* cluster(6) */ + break; + } + strcpy(pattern, ""); + bin_append(0x1FEA8, 17, pattern); /* Row start */ + + for (j = 0; j <= cc_width + 1; j++) { + bin_append(pdf_bitpattern[offset + dummy[j]], 16, pattern); + strcat(pattern, "0"); + } + bin_append(0x3FA29, 18, pattern); /* Row Stop */ + + for (loop = 0; loop < (int) strlen(pattern); loop++) { + if (pattern[loop] == '1') { + set_module(symbol, i, loop); + } + } + symbol->row_height[i] = 3; + } + symbol->rows = (mclength / cc_width); + symbol->width = (int)strlen(pattern); + + return 0; +} + +static int calc_padding_cca(int binary_length, int cc_width) { + int target_bitsize = 0; + + switch (cc_width) { + case 2: + if (binary_length <= 167) { + target_bitsize = 167; + } + if (binary_length <= 138) { + target_bitsize = 138; + } + if (binary_length <= 118) { + target_bitsize = 118; + } + if (binary_length <= 108) { + target_bitsize = 108; + } + if (binary_length <= 88) { + target_bitsize = 88; + } + if (binary_length <= 78) { + target_bitsize = 78; + } + if (binary_length <= 59) { + target_bitsize = 59; + } + break; + case 3: + if (binary_length <= 167) { + target_bitsize = 167; + } + if (binary_length <= 138) { + target_bitsize = 138; + } + if (binary_length <= 118) { + target_bitsize = 118; + } + if (binary_length <= 98) { + target_bitsize = 98; + } + if (binary_length <= 78) { + target_bitsize = 78; + } + break; + case 4: + if (binary_length <= 197) { + target_bitsize = 197; + } + if (binary_length <= 167) { + target_bitsize = 167; + } + if (binary_length <= 138) { + target_bitsize = 138; + } + if (binary_length <= 108) { + target_bitsize = 108; + } + if (binary_length <= 78) { + target_bitsize = 78; + } + break; + } + + return target_bitsize; +} + +int calc_padding_ccb(int binary_length, int cc_width) { + int target_bitsize = 0; + + switch (cc_width) { + case 2: + if (binary_length <= 336) { + target_bitsize = 336; + } + if (binary_length <= 296) { + target_bitsize = 296; + } + if (binary_length <= 256) { + target_bitsize = 256; + } + if (binary_length <= 208) { + target_bitsize = 208; + } + if (binary_length <= 160) { + target_bitsize = 160; + } + if (binary_length <= 104) { + target_bitsize = 104; + } + if (binary_length <= 56) { + target_bitsize = 56; + } + break; + case 3: + if (binary_length <= 768) { + target_bitsize = 768; + } + if (binary_length <= 648) { + target_bitsize = 648; + } + if (binary_length <= 536) { + target_bitsize = 536; + } + if (binary_length <= 416) { + target_bitsize = 416; + } + if (binary_length <= 304) { + target_bitsize = 304; + } + if (binary_length <= 208) { + target_bitsize = 208; + } + if (binary_length <= 152) { + target_bitsize = 152; + } + if (binary_length <= 112) { + target_bitsize = 112; + } + if (binary_length <= 72) { + target_bitsize = 72; + } + if (binary_length <= 32) { + target_bitsize = 32; + } + break; + case 4: + if (binary_length <= 1184) { + target_bitsize = 1184; + } + if (binary_length <= 1016) { + target_bitsize = 1016; + } + if (binary_length <= 840) { + target_bitsize = 840; + } + if (binary_length <= 672) { + target_bitsize = 672; + } + if (binary_length <= 496) { + target_bitsize = 496; + } + if (binary_length <= 352) { + target_bitsize = 352; + } + if (binary_length <= 264) { + target_bitsize = 264; + } + if (binary_length <= 208) { + target_bitsize = 208; + } + if (binary_length <= 152) { + target_bitsize = 152; + } + if (binary_length <= 96) { + target_bitsize = 96; + } + if (binary_length <= 56) { + target_bitsize = 56; + } + break; + } + + return target_bitsize; +} + +int calc_padding_ccc(int binary_length, int *cc_width, int lin_width, int *ecc) { + int target_bitsize = 0; + int byte_length, codewords_used, ecc_level, ecc_codewords, rows; + int codewords_total, target_codewords, target_bytesize; + int i; + + byte_length = binary_length / 8; + if (binary_length % 8 != 0) { + byte_length++; + } + + codewords_used = (byte_length / 6) * 5; + codewords_used += byte_length % 6; + + ecc_level = 7; + if (codewords_used <= 1280) { + ecc_level = 6; + } + if (codewords_used <= 640) { + ecc_level = 5; + } + if (codewords_used <= 320) { + ecc_level = 4; + } + if (codewords_used <= 160) { + ecc_level = 3; + } + if (codewords_used <= 40) { + ecc_level = 2; + } + *(ecc) = ecc_level; + ecc_codewords = 1; + for (i = 1; i <= (ecc_level + 1); i++) { + ecc_codewords *= 2; + } + + codewords_used += ecc_codewords; + codewords_used += 3; + + *(cc_width) = (lin_width - 62) / 17; + /* stop the symbol from becoming too high */ + do { + *(cc_width) = *(cc_width) + 1; + rows = codewords_used / *(cc_width); + } while (rows > 90); + + if (codewords_used % *(cc_width) != 0) { + rows++; + } + + codewords_total = *(cc_width) * rows; + + if (codewords_total > 928) { // PDF_MAX + return 0; + } + + target_codewords = codewords_total - ecc_codewords; + target_codewords -= 3; + + target_bytesize = 6 * (target_codewords / 5); + target_bytesize += target_codewords % 5; + + target_bitsize = 8 * target_bytesize; + + return target_bitsize; +} + +static int cc_binary_string(struct zint_symbol *symbol, const char source[], char binary_string[], int cc_mode, int *cc_width, int *ecc, int lin_width) { /* Handles all data encodation from section 5 of ISO/IEC 24723 */ + int encoding_method, read_posn, d1, d2, alpha_pad; + int i, j, ai_crop, fnc1_latch; + long int group_val; + int ai90_mode, latch, remainder, binary_length; + char date_str[4]; +#ifndef _MSC_VER + char general_field[strlen(source) + 1], general_field_type[strlen(source) + 1]; +#else + char* general_field = (char*) _alloca(strlen(source) + 1); + char* general_field_type = (char*) _alloca(strlen(source) + 1); +#endif + int target_bitsize; + + encoding_method = 1; + read_posn = 0; + ai_crop = 0; + fnc1_latch = 0; + alpha_pad = 0; + ai90_mode = 0; + *ecc = 0; + target_bitsize = 0; + + if ((source[0] == '1') && ((source[1] == '0') || (source[1] == '1') || (source[1] == '7')) && (strlen(source) > 8)) { + /* Source starts (10), (11) or (17) */ + encoding_method = 2; + } + + if ((source[0] == '9') && (source[1] == '0')) { + /* Source starts (90) */ + encoding_method = 3; + } + + if (encoding_method == 1) { + strcat(binary_string, "0"); + } + + if (encoding_method == 2) { + /* Encoding Method field "10" - date and lot number */ + + strcat(binary_string, "10"); + + if (source[1] == '0') { + /* No date data */ + strcat(binary_string, "11"); + read_posn = 2; + } else { + /* Production Date (11) or Expiration Date (17) */ + date_str[0] = source[2]; + date_str[1] = source[3]; + date_str[2] = '\0'; + group_val = atoi(date_str) * 384; + + date_str[0] = source[4]; + date_str[1] = source[5]; + group_val += (atoi(date_str) - 1) * 32; + + date_str[0] = source[6]; + date_str[1] = source[7]; + group_val += atoi(date_str); + + bin_append(group_val, 16, binary_string); + + if (source[1] == '1') { + /* Production Date AI 11 */ + strcat(binary_string, "0"); + } else { + /* Expiration Date AI 17 */ + strcat(binary_string, "1"); + } + read_posn = 8; + } + + if ((source[read_posn] == '1') && (source[read_posn + 1] == '0')) { + /* Followed by AI 10 - strip this from general field */ + read_posn += 2; + } else { + /* An FNC1 character needs to be inserted in the general field */ + fnc1_latch = 1; + } + } + + if (encoding_method == 3) { + /* Encodation Method field of "11" - AI 90 */ +#ifndef _MSC_VER + char ninety[strlen(source) + 1]; +#else + char* ninety = (char*) _alloca(strlen(source) + 1); +#endif + char numeric_part[4]; + int alpha, alphanum, numeric, test1, test2, test3, next_ai_posn; + int numeric_value, table3_letter; + + /* "This encodation method may be used if an element string with an AI + 90 occurs at the start of the data message, and if the data field + following the two-digit AI 90 starts with an alphanumeric string which + complies with a specific format." (para 5.2.2) */ + + i = 0; + do { + ninety[i] = source[i + 2]; + i++; + } while ((strlen(source) > i + 2) && ('[' != source[i + 2])); + ninety[i] = '\0'; + + /* Find out if the AI 90 data is alphabetic or numeric or both */ + + alpha = 0; + alphanum = 0; + numeric = 0; + + for (i = 0; i < (int) strlen(ninety); i++) { + + if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) { + /* Character is alphabetic */ + alpha += 1; + } + + if ((ninety[i] >= '0') && (ninety[i] <= '9')) { + /* Character is numeric */ + numeric += 1; + } + + switch (ninety[i]) { + case '*': + case ',': + case '-': + case '.': + case '/': alphanum += 1; + break; + } + + if (!(((ninety[i] >= '0') && (ninety[i] <= '9')) || ((ninety[i] >= 'A') && (ninety[i] <= 'Z')))) { + if ((ninety[i] != '*') && (ninety[i] != ',') && (ninety[i] != '-') && (ninety[i] != '.') && (ninety[i] != '/')) { + /* An Invalid AI 90 character */ + strcpy(symbol->errtxt, "440: Invalid AI 90 data"); + return ZINT_ERROR_INVALID_DATA; + } + } + } + + /* must start with 0, 1, 2 or 3 digits followed by an uppercase character */ + test1 = -1; + for (i = 3; i >= 0; i--) { + if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) { + test1 = i; + } + } + + test2 = 0; + for (i = 0; i < test1; i++) { + if (!((ninety[i] >= '0') && (ninety[i] <= '9'))) { + test2 = 1; + } + } + + /* leading zeros are not permitted */ + test3 = 0; + if ((test1 >= 1) && (ninety[0] == '0')) { + test3 = 1; + } + + if ((test1 != -1) && (test2 != 1) && (test3 == 0)) { + /* Encodation method "11" can be used */ + strcat(binary_string, "11"); + + numeric -= test1; + alpha--; + + /* Decide on numeric, alpha or alphanumeric mode */ + /* Alpha mode is a special mode for AI 90 */ + + if (alphanum > 0) { + /* Alphanumeric mode */ + strcat(binary_string, "0"); + ai90_mode = 1; + } else { + if (alpha > numeric) { + /* Alphabetic mode */ + strcat(binary_string, "11"); + ai90_mode = 2; + } else { + /* Numeric mode */ + strcat(binary_string, "10"); + ai90_mode = 3; + } + } + + next_ai_posn = 2 + (int)strlen(ninety); + + if (source[next_ai_posn] == '[') { + /* There are more AIs afterwords */ + if ((source[next_ai_posn + 1] == '2') && (source[next_ai_posn + 2] == '1')) { + /* AI 21 follows */ + ai_crop = 1; + } + + if ((source[next_ai_posn + 1] == '8') && (source[next_ai_posn + 2] == '0') && (source[next_ai_posn + 3] == '0') && (source[next_ai_posn + 4] == '4')) { + /* AI 8004 follows */ + ai_crop = 2; + } + } + + switch (ai_crop) { + case 0: strcat(binary_string, "0"); + break; + case 1: strcat(binary_string, "10"); + break; + case 2: strcat(binary_string, "11"); + break; + } + + if (test1 == 0) { + strcpy(numeric_part, "0"); + } else { + for (i = 0; i < test1; i++) { + numeric_part[i] = ninety[i]; + } + numeric_part[i] = '\0'; + } + + numeric_value = atoi(numeric_part); + + table3_letter = -1; + if (numeric_value < 31) { + table3_letter = posn("BDHIJKLNPQRSTVWZ", ninety[test1]); + } + + if (table3_letter != -1) { + /* Encoding can be done according to 5.2.2 c) 2) */ + /* five bit binary string representing value before letter */ + bin_append(numeric_value, 5, binary_string); + + /* followed by four bit representation of letter from Table 3 */ + bin_append(table3_letter, 4, binary_string); + } else { + /* Encoding is done according to 5.2.2 c) 3) */ + bin_append(31, 5, binary_string); + /* ten bit representation of number */ + bin_append(numeric_value, 10, binary_string); + + /* five bit representation of ASCII character */ + bin_append(ninety[test1] - 65, 5, binary_string); + } + + read_posn = test1 + 3; + } else { + /* Use general field encodation instead */ + strcat(binary_string, "0"); + read_posn = 0; + } + } + + /* Now encode the rest of the AI 90 data field */ + if (ai90_mode == 2) { + /* Alpha encodation (section 5.2.3) */ + do { + if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) { + bin_append(source[read_posn] + 4, 5, binary_string); + } + + if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) { + bin_append(source[read_posn] - 65, 6, binary_string); + } + + if (source[read_posn] == '[') { + bin_append(31, 5, binary_string); + } + + read_posn++; + } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0')); + alpha_pad = 1; /* This is overwritten if a general field is encoded */ + } + + if (ai90_mode == 1) { + /* Alphanumeric mode */ + do { + if ((source[read_posn] >= '0') && (source[read_posn] <= '9')) { + bin_append(source[read_posn] - 43, 5, binary_string); + } + + if ((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) { + bin_append(source[read_posn] - 33, 6, binary_string); + } + + switch (source[read_posn]) { + case '[': + bin_append(15, 5, binary_string); + break; + case '*': + bin_append(58, 6, binary_string); + break; + case ',': + bin_append(59, 6, binary_string); + break; + case '-': + bin_append(60, 6, binary_string); + break; + case '.': + bin_append(61, 6, binary_string); + break; + case '/': + bin_append(62, 6, binary_string); + break; + } + + read_posn++; + } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0')); + } + + read_posn += (2 * ai_crop); + + /* The compressed data field has been processed if appropriate - the + rest of the data (if any) goes into a general-purpose data compaction field */ + + j = 0; + if (fnc1_latch == 1) { + /* Encodation method "10" has been used but it is not followed by + AI 10, so a FNC1 character needs to be added */ + general_field[j] = '['; + j++; + } + + for (i = read_posn; i < (int) strlen(source); i++) { + general_field[j] = source[i]; + j++; + } + general_field[j] = '\0'; + + if (strlen(general_field) != 0) { + alpha_pad = 0; + } + + latch = 0; + for (i = 0; i < (int) strlen(general_field); i++) { + /* Table 13 - ISO/IEC 646 encodation */ + if ((general_field[i] < ' ') || (general_field[i] > 'z')) { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } else { + general_field_type[i] = ISOIEC; + } + + if (general_field[i] == '#') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == '$') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == '@') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == 92) { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == '^') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == 96) { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + + /* Table 12 - Alphanumeric encodation */ + if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '*') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == ',') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '-') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '.') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '/') { + general_field_type[i] = ALPHA_OR_ISO; + } + + /* Numeric encodation */ + if ((general_field[i] >= '0') && (general_field[i] <= '9')) { + general_field_type[i] = ANY_ENC; + } + if (general_field[i] == '[') { + /* FNC1 can be encoded in any system */ + general_field_type[i] = ANY_ENC; + } + + } + + general_field_type[strlen(general_field)] = '\0'; + + if (latch == 1) { + /* Invalid characters in input data */ + strcpy(symbol->errtxt, "441: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + + for (i = 0; i < (int) strlen(general_field); i++) { + if ((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) { + general_field_type[i + 1] = ISOIEC; + } + } + + for (i = 0; i < (int) strlen(general_field); i++) { + if ((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) { + general_field_type[i + 1] = ALPHA_OR_ISO; + } + } + + latch = general_rules(general_field, general_field_type); + + i = 0; + do { + switch (general_field_type[i]) { + case NUMERIC: + + if (i != 0) { + if ((general_field_type[i - 1] != NUMERIC) && (general_field[i - 1] != '[')) { + bin_append(0, 3, binary_string); /* Numeric latch */ + } + } + + if (general_field[i] != '[') { + d1 = ctoi(general_field[i]); + } else { + d1 = 10; + } + + if (general_field[i + 1] != '[') { + d2 = ctoi(general_field[i + 1]); + } else { + d2 = 10; + } + + bin_append((11 * d1) + d2 + 8, 7, binary_string); + + i += 2; + break; + + case ALPHA: + + if (i != 0) { + if ((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) { + bin_append(0, 4, binary_string); /* Alphanumeric latch */ + } + if (general_field_type[i - 1] == ISOIEC) { + bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */ + } + } + + if ((general_field[i] >= '0') && (general_field[i] <= '9')) { + bin_append(general_field[i] - 43, 5, binary_string); + } + + if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { + bin_append(general_field[i] - 33, 6, binary_string); + } + + switch (general_field[i]) { + case '[': + bin_append(15, 5, binary_string); + break; + case '*': + bin_append(58, 6, binary_string); + break; + case ',': + bin_append(59, 6, binary_string); + break; + case '-': + bin_append(60, 6, binary_string); + break; + case '.': + bin_append(61, 6, binary_string); + break; + case '/': + bin_append(62, 6, binary_string); + break; + } + + i++; + break; + + case ISOIEC: + + if (i != 0) { + if ((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) { + bin_append(0, 4, binary_string); /* Alphanumeric latch */ + bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */ + } + if (general_field_type[i - 1] == ALPHA) { + bin_append(4, 5, binary_string);; /* ISO/IEC 646 latch */ + } + } + + if ((general_field[i] >= '0') && (general_field[i] <= '9')) { + bin_append(general_field[i] - 43, 5, binary_string); + } + + if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { + bin_append(general_field[i] - 1, 7, binary_string); + } + + if ((general_field[i] >= 'a') && (general_field[i] <= 'z')) { + bin_append(general_field[i] - 7, 7, binary_string); + } + + if (general_field[i] == '[') strcat(binary_string, "01111"); /* FNC1/Numeric latch */ + if (general_field[i] == '!') strcat(binary_string, "11101000"); /* exclamation mark */ + if (general_field[i] == 34) strcat(binary_string, "11101001"); /* quotation mark */ + if (general_field[i] == 37) strcat(binary_string, "11101010"); /* percent sign */ + if (general_field[i] == '&') strcat(binary_string, "11101011"); /* ampersand */ + if (general_field[i] == 39) strcat(binary_string, "11101100"); /* apostrophe */ + if (general_field[i] == '(') strcat(binary_string, "11101101"); /* left parenthesis */ + if (general_field[i] == ')') strcat(binary_string, "11101110"); /* right parenthesis */ + if (general_field[i] == '*') strcat(binary_string, "11101111"); /* asterisk */ + if (general_field[i] == '+') strcat(binary_string, "11110000"); /* plus sign */ + if (general_field[i] == ',') strcat(binary_string, "11110001"); /* comma */ + if (general_field[i] == '-') strcat(binary_string, "11110010"); /* minus or hyphen */ + if (general_field[i] == '.') strcat(binary_string, "11110011"); /* period or full stop */ + if (general_field[i] == '/') strcat(binary_string, "11110100"); /* slash or solidus */ + if (general_field[i] == ':') strcat(binary_string, "11110101"); /* colon */ + if (general_field[i] == ';') strcat(binary_string, "11110110"); /* semicolon */ + if (general_field[i] == '<') strcat(binary_string, "11110111"); /* less-than sign */ + if (general_field[i] == '=') strcat(binary_string, "11111000"); /* equals sign */ + if (general_field[i] == '>') strcat(binary_string, "11111001"); /* greater-than sign */ + if (general_field[i] == '?') strcat(binary_string, "11111010"); /* question mark */ + if (general_field[i] == '_') strcat(binary_string, "11111011"); /* underline or low line */ + if (general_field[i] == ' ') strcat(binary_string, "11111100"); /* space */ + + i++; + break; + } + } while (i + latch < (int) strlen(general_field)); + + binary_length = (int)strlen(binary_string); + switch (cc_mode) { + case 1: + target_bitsize = calc_padding_cca(binary_length, *(cc_width)); + break; + case 2: + target_bitsize = calc_padding_ccb(binary_length, *(cc_width)); + break; + case 3: + target_bitsize = calc_padding_ccc(binary_length, cc_width, lin_width, ecc); + break; + } + + if (target_bitsize == 0) { + strcpy(symbol->errtxt, "442: Input too long for selected 2d component"); + return ZINT_ERROR_TOO_LONG; + } + + remainder = target_bitsize - binary_length; + + if (latch == 1) { + i = 0; + /* There is still one more numeric digit to encode */ + + if ((remainder >= 4) && (remainder <= 6)) { + bin_append(ctoi(general_field[i]) + 1, 4, binary_string); + } else { + bin_append((11 * ctoi(general_field[i])) + 18, 7, binary_string); + /* This may push the symbol up to the next size */ + } + } + + if (strlen(binary_string) > 11805) { /* (2361 * 5) */ + strcpy(symbol->errtxt, "443: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + + binary_length = (int)strlen(binary_string); + switch (cc_mode) { + case 1: + target_bitsize = calc_padding_cca(binary_length, *(cc_width)); + break; + case 2: + target_bitsize = calc_padding_ccb(binary_length, *(cc_width)); + break; + case 3: + target_bitsize = calc_padding_ccc(binary_length, cc_width, lin_width, ecc); + break; + } + + if (target_bitsize == 0) { + strcpy(symbol->errtxt, "444: Input too long for selected 2d component"); + return ZINT_ERROR_TOO_LONG; + } + + if (binary_length < target_bitsize) { + /* Now add padding to binary string */ + if (alpha_pad == 1) { + strcat(binary_string, "11111"); + alpha_pad = 0; + /* Extra FNC1 character required after Alpha encodation (section 5.2.3) */ + } + + if ((strlen(general_field) != 0) && (general_field_type[strlen(general_field) - 1] == NUMERIC)) { + strcat(binary_string, "0000"); + } + + while (strlen(binary_string) < (unsigned int) target_bitsize) { + strcat(binary_string, "00100"); + } + + if (strlen(binary_string) > (unsigned int) target_bitsize) { + binary_string[target_bitsize] = '\0'; + } + } + + return 0; +} + +int linear_dummy_run(unsigned char *source, int length) { + struct zint_symbol *dummy; + int error_number; + int linear_width; + + dummy = ZBarcode_Create(); + dummy->symbology = BARCODE_EAN128_CC; + dummy->option_1 = 3; + error_number = ean_128(dummy, source, length); + linear_width = dummy->width; + ZBarcode_Delete(dummy); + + if (error_number == 0) { + return linear_width; + } else { + return 0; + } +} + +int composite(struct zint_symbol *symbol, unsigned char source[], int length) { + int error_number, cc_mode, cc_width, ecc_level; + int j, i, k; + unsigned int rs = length + 1; + unsigned int bs = 20 * rs; + unsigned int pri_len; +#ifndef _MSC_VER + char reduced[rs]; + char binary_string[bs]; +#else + char* reduced = (char*) _alloca(rs); + char* binary_string = (char*) _alloca(bs); +#endif + struct zint_symbol *linear; + int top_shift, bottom_shift; + int linear_width = 0; + + /* Perform sanity checks on input options first */ + error_number = 0; + pri_len = (int)strlen(symbol->primary); + if (pri_len == 0) { + strcpy(symbol->errtxt, "445: No primary (linear) message in 2D composite"); + return ZINT_ERROR_INVALID_OPTION; + } + + if (length > 2990) { + strcpy(symbol->errtxt, "446: 2D component input data too long"); + return ZINT_ERROR_TOO_LONG; + } + + cc_mode = symbol->option_1; + if ((cc_mode == 3) && (symbol->symbology != BARCODE_EAN128_CC)) { + /* CC-C can only be used with a GS1-128 linear part */ + strcpy(symbol->errtxt, "447: Invalid mode (CC-C only valid with GS1-128 linear component)"); + return ZINT_ERROR_INVALID_OPTION; + } + + error_number = gs1_verify(symbol, source, length, reduced); + if (error_number != 0) { + return error_number; + } + + if (symbol->symbology == BARCODE_EAN128_CC) { + /* Do a test run of encoding the linear component to establish its width */ + linear_width = linear_dummy_run((unsigned char *) symbol->primary, pri_len); + if (linear_width == 0) { + strcpy(symbol->errtxt, "448: Invalid data"); + return ZINT_ERROR_INVALID_DATA; + } + } + + switch (symbol->symbology) { + /* Determine width of 2D component according to ISO/IEC 24723 Table 1 */ + case BARCODE_EANX_CC: + switch (pri_len) { + case 7: /* EAN-8 */ + case 10: /* EAN-8 + 2 */ + case 13: /* EAN-8 + 5 */ + cc_width = 3; + break; + case 12: /* EAN-13 */ + case 15: /* EAN-13 + 2 */ + case 18: /* EAN-13 + 5 */ + cc_width = 4; + break; + } + break; + case BARCODE_EAN128_CC: cc_width = 4; + break; + case BARCODE_RSS14_CC: cc_width = 4; + break; + case BARCODE_RSS_LTD_CC: cc_width = 3; + break; + case BARCODE_RSS_EXP_CC: cc_width = 4; + break; + case BARCODE_UPCA_CC: cc_width = 4; + break; + case BARCODE_UPCE_CC: cc_width = 2; + break; + case BARCODE_RSS14STACK_CC: cc_width = 2; + break; + case BARCODE_RSS14_OMNI_CC: cc_width = 2; + break; + case BARCODE_RSS_EXPSTACK_CC: cc_width = 4; + break; + } + + memset(binary_string, 0, bs); + + if (cc_mode < 1 || cc_mode > 3) { + cc_mode = 1; + } + + if (cc_mode == 1) { + i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear_width); + if (i == ZINT_ERROR_TOO_LONG) { + cc_mode = 2; + } + } + + if (cc_mode == 2) { + /* If the data didn't fit into CC-A it is recalculated for CC-B */ + i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear_width); + if (i == ZINT_ERROR_TOO_LONG) { + if (symbol->symbology != BARCODE_EAN128_CC) { + return ZINT_ERROR_TOO_LONG; + } else { + cc_mode = 3; + } + } + } + + if (cc_mode == 3) { + /* If the data didn't fit in CC-B (and linear part is GS1-128) it is recalculated for CC-C */ + i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear_width); + if (i == ZINT_ERROR_TOO_LONG) { + return ZINT_ERROR_TOO_LONG; + } + } + + switch (cc_mode) { + /* Note that ecc_level is only relevant to CC-C */ + case 1: error_number = cc_a(symbol, binary_string, cc_width); + break; + case 2: error_number = cc_b(symbol, binary_string, cc_width); + break; + case 3: error_number = cc_c(symbol, binary_string, cc_width, ecc_level); + break; + } + + if (error_number != 0) { + return ZINT_ERROR_ENCODING_PROBLEM; + } + + /* 2D component done, now calculate linear component */ + linear = ZBarcode_Create(); /* Symbol contains the 2D component and Linear contains the rest */ + + linear->symbology = symbol->symbology; + + if (linear->symbology != BARCODE_EAN128_CC) { + /* Set the "component linkage" flag in the linear component */ + linear->option_1 = 2; + } else { + /* GS1-128 needs to know which type of 2D component is used */ + linear->option_1 = cc_mode; + } + + switch (symbol->symbology) { + case BARCODE_EANX_CC: error_number = eanx(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_EAN128_CC: error_number = ean_128(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS14_CC: error_number = rss14(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS_LTD_CC: error_number = rsslimited(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS_EXP_CC: error_number = rssexpanded(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_UPCA_CC: error_number = eanx(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_UPCE_CC: error_number = eanx(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS14STACK_CC: error_number = rss14(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS14_OMNI_CC: error_number = rss14(linear, (unsigned char *) symbol->primary, pri_len); + break; + case BARCODE_RSS_EXPSTACK_CC: error_number = rssexpanded(linear, (unsigned char *) symbol->primary, pri_len); + break; + } + + if (error_number != 0) { + strcpy(symbol->errtxt, linear->errtxt); + strcat(symbol->errtxt, " in linear component "); + ZBarcode_Delete(linear); + return error_number; + } + + /* Merge the linear component with the 2D component */ + + top_shift = 0; + bottom_shift = 0; + + switch (symbol->symbology) { + /* Determine horizontal alignment (according to section 12.3) */ + case BARCODE_EANX_CC: + switch (pri_len) { + case 7: /* EAN-8 */ + case 10: /* EAN-8 + 2 */ + case 13: /* EAN-8 + 5 */ + bottom_shift = 13; + break; + case 12: /* EAN-13 */ + case 15: /* EAN-13 + 2 */ + case 18: /* EAN-13 + 5 */ + bottom_shift = 2; + break; + } + break; + case BARCODE_EAN128_CC: if (cc_mode == 3) { + bottom_shift = 7; + } + break; + case BARCODE_RSS14_CC: bottom_shift = 4; + break; + case BARCODE_RSS_LTD_CC: bottom_shift = 9; + break; + case BARCODE_RSS_EXP_CC: k = 1; + while ((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) { + k++; + } + top_shift = k; + break; + case BARCODE_UPCA_CC: bottom_shift = 2; + break; + case BARCODE_UPCE_CC: bottom_shift = 2; + break; + case BARCODE_RSS14STACK_CC: top_shift = 1; + break; + case BARCODE_RSS14_OMNI_CC: top_shift = 1; + break; + case BARCODE_RSS_EXPSTACK_CC: k = 1; + while ((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) { + k++; + } + top_shift = k; + break; + } + + if (top_shift != 0) { + /* Move the 2d component of the symbol horizontally */ + for (i = 0; i <= symbol->rows; i++) { + for (j = (symbol->width + top_shift); j >= top_shift; j--) { + if (module_is_set(symbol, i, j - top_shift)) { + set_module(symbol, i, j); + } else { + unset_module(symbol, i, j); + } + } + for (j = 0; j < top_shift; j++) { + unset_module(symbol, i, j); + } + } + } + + /* Merge linear and 2D components into one structure */ + for (i = 0; i <= linear->rows; i++) { + symbol->row_height[symbol->rows + i] = linear->row_height[i]; + for (j = 0; j <= linear->width; j++) { + if (module_is_set(linear, i, j)) { + set_module(symbol, i + symbol->rows, j + bottom_shift); + } else { + unset_module(symbol, i + symbol->rows, j + bottom_shift); + } + } + } + if ((linear->width + bottom_shift) > symbol->width) { + symbol->width = linear->width + bottom_shift; + } + if ((symbol->width + top_shift) > symbol->width) { + symbol->width += top_shift; + } + symbol->rows += linear->rows; + ustrcpy(symbol->text, (unsigned char *) linear->text); + + ZBarcode_Delete(linear); + + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/composite.h b/3rdparty/zint-2.6.1/backend/composite.h new file mode 100644 index 0000000..c03c11b --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/composite.h @@ -0,0 +1,73 @@ +/* composite.c - Tables for UCC.EAN Composite Symbols */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#define NUMERIC 110 +#define ALPHA 97 +#define ISOIEC 105 +#define INVALID_CHAR 100 +#define ANY_ENC 120 +#define ALPHA_OR_ISO 121 + +/* CC-A component coefficients from ISO/IEC 24728:2006 Annex F */ +static const unsigned short int ccaCoeffs[30] = { + /* k = 4 */ + 522, 568, 723, 809, + + /* k = 5 */ + 427, 919, 460, 155, 566, + + /* k = 6 */ + 861, 285, 19, 803, 17, 766, + + /* k = 7 */ + 76, 925, 537, 597, 784, 691, 437, + + /* k = 8 */ + 237, 308, 436, 284, 646, 653, 428, 379 +}; + +/* rows, error codewords, k-offset of valid CC-A sizes from ISO/IEC 24723:2006 Table 9 */ +static const char ccaVariants[51] = { + 5, 6, 7, 8, 9, 10, 12, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7, + 4, 4, 5, 5, 6, 6, 7, 4, 5, 6, 7, 7, 4, 5, 6, 7, 8, + 0, 0, 4, 4, 9, 9, 15, 0, 4, 9, 15, 15, 0, 4, 9, 15, 22 +}; + +/* following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24723:2006 tables 10 and 11 */ +static const char aRAPTable[68] = { + 39, 1, 32, 8, 14, 43, 20, 11, 1, 5, 15, 21, 40, 43, 46, 34, 29, + 0, 0, 0, 0, 0, 0, 0, 43, 33, 37, 47, 1, 20, 23, 26, 14, 9, + 19, 33, 12, 40, 46, 23, 52, 23, 13, 17, 27, 33, 52, 3, 6, 46, 41, + 6, 0, 3, 3, 3, 0, 3, 3, 0, 3, 6, 6, 0, 0, 0, 0, 3 +}; + +/* Row Address Patterns are as defined in pdf417.h */ diff --git a/3rdparty/zint-2.6.1/backend/dllversion.c b/3rdparty/zint-2.6.1/backend/dllversion.c new file mode 100644 index 0000000..d59725e --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/dllversion.c @@ -0,0 +1,31 @@ +/* Sed: http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/versions.asp */ +#if defined (_WIN32) && (defined(_USRDLL) || defined(DLL_EXPORT) || defined(PIC)) +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + +__declspec(dllexport) HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi); + +#ifdef __cplusplus +} +#endif + +HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi) +{ + if (!pdvi || (sizeof(*pdvi) != pdvi->info1.cbSize)) + return (E_INVALIDARG); + + pdvi->info1.dwMajorVersion = 2; + pdvi->info1.dwMinorVersion = 2; + pdvi->info1.dwBuildNumber = 1; + pdvi->info1.dwPlatformID = DLLVER_PLATFORM_WINDOWS; + if (sizeof(DLLVERSIONINFO2) == pdvi->info1.cbSize) + pdvi->ullVersion = MAKEDLLVERULL(2, 2, 1, 0); + + return S_OK; +} +#endif /* _WIN32 */ diff --git a/3rdparty/zint-2.6.1/backend/dmatrix.c b/3rdparty/zint-2.6.1/backend/dmatrix.c new file mode 100644 index 0000000..0fc281d --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/dmatrix.c @@ -0,0 +1,1318 @@ +/* dmatrix.c Handles Data Matrix ECC 200 symbols */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + developed from and including some functions from: + IEC16022 bar code generation + Adrian Kennard, Andrews & Arnold Ltd + with help from Cliff Hones on the RS coding + + (c) 2004 Adrian Kennard, Andrews & Arnold Ltd + (c) 2006 Stefan Schmidt + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#ifdef _MSC_VER +#include +/* ceilf (C99) not before MSVC++2013 (C++ 12.0) */ +#if _MSC_VER < 1800 +#define ceilf ceil +#endif +#endif +#include "reedsol.h" +#include "common.h" +#include "dmatrix.h" + +/* Annex M placement alorithm low level */ +static void ecc200placementbit(int *array, const int NR, const int NC, int r, int c, const int p, const char b) { + if (r < 0) { + r += NR; + c += 4 - ((NR + 4) % 8); + } + if (c < 0) { + c += NC; + r += 4 - ((NC + 4) % 8); + } + // Necessary for 26x32,26x40,26x48,36x120,36x144,72x120,72x144 + if (r >= NR) { +#ifdef DEBUG + fprintf(stderr, "r >= NR:%i,%i at r=%i->", p, b, r); +#endif + r -= NR; +#ifdef DEBUG + fprintf(stderr, "%i,c=%i\n", r, c); +#endif + } +#ifdef DEBUG + if (0 != array[r * NC + c]) { + int a = array[r * NC + c]; + fprintf(stderr, "Double:%i,%i->%i,%i at r=%i,c=%i\n", a >> 3, a & 7, p, b, r, c); + return; + } +#endif + // Check index limits + assert(r < NR); + assert(c < NC); + // Check double-assignment + assert(0 == array[r * NC + c]); + array[r * NC + c] = (p << 3) + b; +} + +static void ecc200placementblock(int *array, const int NR, const int NC, const int r, + const int c, const int p) { + ecc200placementbit(array, NR, NC, r - 2, c - 2, p, 7); + ecc200placementbit(array, NR, NC, r - 2, c - 1, p, 6); + ecc200placementbit(array, NR, NC, r - 1, c - 2, p, 5); + ecc200placementbit(array, NR, NC, r - 1, c - 1, p, 4); + ecc200placementbit(array, NR, NC, r - 1, c - 0, p, 3); + ecc200placementbit(array, NR, NC, r - 0, c - 2, p, 2); + ecc200placementbit(array, NR, NC, r - 0, c - 1, p, 1); + ecc200placementbit(array, NR, NC, r - 0, c - 0, p, 0); +} + +static void ecc200placementcornerA(int *array, const int NR, const int NC, const int p) { + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 1, 1, p, 6); + ecc200placementbit(array, NR, NC, NR - 1, 2, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); + ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); + ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); +} + +static void ecc200placementcornerB(int *array, const int NR, const int NC, const int p) { + ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 4, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 3, p, 3); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 2); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 1); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); +} + +static void ecc200placementcornerC(int *array, const int NR, const int NC, const int p) { + ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); + ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); + ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); +} + +static void ecc200placementcornerD(int *array, const int NR, const int NC, const int p) { + ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); + ecc200placementbit(array, NR, NC, NR - 1, NC - 1, p, 6); + ecc200placementbit(array, NR, NC, 0, NC - 3, p, 5); + ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); + ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); + ecc200placementbit(array, NR, NC, 1, NC - 3, p, 2); + ecc200placementbit(array, NR, NC, 1, NC - 2, p, 1); + ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); +} + +/* Annex M placement alorithm main function */ +static void ecc200placement(int *array, const int NR, const int NC) { + int r, c, p; + // invalidate + for (r = 0; r < NR; r++) + for (c = 0; c < NC; c++) + array[r * NC + c] = 0; + // start + p = 1; + r = 4; + c = 0; + do { + // check corner + if (r == NR && !c) + ecc200placementcornerA(array, NR, NC, p++); + if (r == NR - 2 && !c && NC % 4) + ecc200placementcornerB(array, NR, NC, p++); + if (r == NR - 2 && !c && (NC % 8) == 4) + ecc200placementcornerC(array, NR, NC, p++); + if (r == NR + 4 && c == 2 && !(NC % 8)) + ecc200placementcornerD(array, NR, NC, p++); + // up/right + do { + if (r < NR && c >= 0 && !array[r * NC + c]) + ecc200placementblock(array, NR, NC, r, c, p++); + r -= 2; + c += 2; + } while (r >= 0 && c < NC); + r++; + c += 3; + // down/left + do { + if (r >= 0 && c < NC && !array[r * NC + c]) + ecc200placementblock(array, NR, NC, r, c, p++); + r += 2; + c -= 2; + } while (r < NR && c >= 0); + r += 3; + c++; + } while (r < NR || c < NC); + // unfilled corner + if (!array[NR * NC - 1]) + array[NR * NC - 1] = array[NR * NC - NC - 2] = 1; +} + +/* calculate and append ecc code, and if necessary interleave */ +static void ecc200(unsigned char *binary, const int bytes, const int datablock, const int rsblock, const int skew) { + int blocks = (bytes + 2) / datablock, b; + int n, p; + rs_init_gf(0x12d); + rs_init_code(rsblock, 1); + for (b = 0; b < blocks; b++) { + unsigned char buf[256], ecc[256]; + p = 0; + for (n = b; n < bytes; n += blocks) + buf[p++] = binary[n]; + rs_encode(p, buf, ecc); + p = rsblock - 1; // comes back reversed + for (n = b; n < rsblock * blocks; n += blocks) { + if (skew) { + /* Rotate ecc data to make 144x144 size symbols acceptable */ + /* See http://groups.google.com/group/postscriptbarcode/msg/5ae8fda7757477da */ + if (b < 8) { + binary[bytes + n + 2] = ecc[p--]; + } else { + binary[bytes + n - 8] = ecc[p--]; + } + } else { + binary[bytes + n] = ecc[p--]; + } + } + } + rs_free(); +} + +/* Return true (1) if a character is valid in X12 set */ +static int isX12(const int source) { + + switch(source) { + case 13: // CR + case 42: // * + case 62: // > + case 32: // space + return 1; + } + + if ((source >= '0') && (source <= '9')) { + return 1; + } + if ((source >= 'A') && (source <= 'Z')) { + return 1; + } + + return 0; +} + +/* Insert a character into the middle of a string at position posn */ +static void dminsert(char binary_string[], const int posn, const char newbit) { + int i, end; + + end = (int) strlen(binary_string); + for (i = end + 1; i > posn; i--) { + binary_string[i] = binary_string[i - 1]; + } + binary_string[posn] = newbit; +} + +static void insert_value(unsigned char binary_stream[], const int posn, const int streamlen, const int newbit) { + int i; + + for(i = (int)streamlen; i > posn; i--) { + binary_stream[i] = binary_stream[i - 1]; + } + binary_stream[posn] = (unsigned char) newbit; +} + +static int p_r_6_2_1(const unsigned char inputData[], const size_t position, const size_t sourcelen) { + /* Annex P section (r)(6)(ii)(I) + "If one of the three X12 terminator/separator characters first + occurs in the yet to be processed data before a non-X12 character..." + */ + + size_t i; + size_t nonX12Position = 0; + size_t specialX12Position = 0; + int retval = 0; + + for (i = position; i < sourcelen; i++) { + if (nonX12Position == 0) { + if (isX12(inputData[i]) != 1) { + nonX12Position = i; + } + } + + if (specialX12Position == 0) { + if ((inputData[i] == (char) 13) || + (inputData[i] == '*') || + (inputData[i] == '>')) { + specialX12Position = i; + } + } + } + + if ((nonX12Position != 0) && (specialX12Position != 0)) { + if (specialX12Position < nonX12Position) { + retval = 1; + } + } + + return retval; +} + +/* 'look ahead test' from Annex P */ +static int look_ahead_test(const unsigned char inputData[], const size_t sourcelen, const size_t position, const int current_mode, const int gs1) { + float ascii_count, c40_count, text_count, x12_count, edf_count, b256_count, best_count; + const float stiction = (1.0F / 24.0F); // smallest change to act on, to get around floating point inaccuracies + int best_scheme; + size_t sp; + + best_scheme = DM_NULL; + + /* step (j) */ + if (current_mode == DM_ASCII) { + ascii_count = 0.0F; + c40_count = 1.0F; + text_count = 1.0F; + x12_count = 1.0F; + edf_count = 1.0F; + b256_count = 1.25F; + } else { + ascii_count = 1.0F; + c40_count = 2.0F; + text_count = 2.0F; + x12_count = 2.0F; + edf_count = 2.0F; + b256_count = 2.25F; + } + + switch (current_mode) { + case DM_C40: c40_count = 0.0F; + break; + case DM_TEXT: text_count = 0.0F; + break; + case DM_X12: x12_count = 0.0F; + break; + case DM_EDIFACT: edf_count = 0.0F; + break; + case DM_BASE256: b256_count = 0.0F; + break; + } + + sp = position; + + do { + if (sp == sourcelen) { + /* At the end of data ... step (k) */ + ascii_count = ceilf(ascii_count); + b256_count = ceilf(b256_count); + edf_count = ceilf(edf_count); + text_count = ceilf(text_count); + x12_count = ceilf(x12_count); + c40_count = ceilf(c40_count); + + best_count = c40_count; + best_scheme = DM_C40; // (k)(7) + + if (x12_count < (best_count - stiction)) { + best_count = x12_count; + best_scheme = DM_X12; // (k)(6) + } + + if (text_count < (best_count - stiction)) { + best_count = text_count; + best_scheme = DM_TEXT; // (k)(5) + } + + if (edf_count < (best_count - stiction)) { + best_count = edf_count; + best_scheme = DM_EDIFACT; // (k)(4) + } + + if (b256_count < (best_count - stiction)) { + best_count = b256_count; + best_scheme = DM_BASE256; // (k)(3) + } + + if (ascii_count <= (best_count + stiction)) { + best_scheme = DM_ASCII; // (k)(2) + } + } else { + + /* ascii ... step (l) */ + if ((inputData[sp] >= '0') && (inputData[sp] <= '9')) { + ascii_count += 0.5F; // (l)(1) + } else { + if (inputData[sp] > 127) { + ascii_count = ceilf(ascii_count) + 2.0F; // (l)(2) + } else { + ascii_count = ceilf(ascii_count) + 1.0F; // (l)(3) + } + } + + /* c40 ... step (m) */ + if ((inputData[sp] == ' ') || + (((inputData[sp] >= '0') && (inputData[sp] <= '9')) || + ((inputData[sp] >= 'A') && (inputData[sp] <= 'Z')))) { + c40_count += (2.0F / 3.0F); // (m)(1) + } else { + if (inputData[sp] > 127) { + c40_count += (8.0F / 3.0F); // (m)(2) + } else { + c40_count += (4.0F / 3.0F); // (m)(3) + } + } + + /* text ... step (n) */ + if ((inputData[sp] == ' ') || + (((inputData[sp] >= '0') && (inputData[sp] <= '9')) || + ((inputData[sp] >= 'a') && (inputData[sp] <= 'z')))) { + text_count += (2.0F / 3.0F); // (n)(1) + } else { + if (inputData[sp] > 127) { + text_count += (8.0F / 3.0F); // (n)(2) + } else { + text_count += (4.0F / 3.0F); // (n)(3) + } + } + + /* x12 ... step (o) */ + if (isX12(inputData[sp])) { + x12_count += (2.0F / 3.0F); // (o)(1) + } else { + if (inputData[sp] > 127) { + x12_count += (13.0F / 3.0F); // (o)(2) + } else { + x12_count += (10.0F / 3.0F); // (o)(3) + } + } + + /* edifact ... step (p) */ + if ((inputData[sp] >= ' ') && (inputData[sp] <= '^')) { + edf_count += (3.0F / 4.0F); // (p)(1) + } else { + if (inputData[sp] > 127) { + edf_count += 17.0F; // (p)(2) > Value changed from ISO + } else { + edf_count += 13.0F; // (p)(3) > Value changed from ISO + } + } + if ((gs1 == 1) && (inputData[sp] == '[')) { + edf_count += 13.0F; // > Value changed from ISO + } + + /* base 256 ... step (q) */ + if ((gs1 == 1) && (inputData[sp] == '[')) { + b256_count += 4.0F; // (q)(1) + } else { + b256_count += 1.0F; // (q)(2) + } + } + + + if (sp > (position + 3)) { + /* 4 data characters processed ... step (r) */ + + /* step (r)(6) */ + if (((c40_count + 1.0F) < (ascii_count - stiction)) && + ((c40_count + 1.0F) < (b256_count - stiction)) && + ((c40_count + 1.0F) < (edf_count - stiction)) && + ((c40_count + 1.0F) < (text_count - stiction))) { + + if (c40_count < (x12_count - stiction)) { + best_scheme = DM_C40; + } + + if ((c40_count >= (x12_count - stiction)) + && (c40_count <= (x12_count + stiction))) { + if (p_r_6_2_1(inputData, sp, sourcelen) == 1) { + // Test (r)(6)(ii)(i) + best_scheme = DM_X12; + } else { + best_scheme = DM_C40; + } + } + } + + /* step (r)(5) */ + if (((x12_count + 1.0F) < (ascii_count - stiction)) && + ((x12_count + 1.0F) < (b256_count - stiction)) && + ((x12_count + 1.0F) < (edf_count - stiction)) && + ((x12_count + 1.0F) < (text_count - stiction)) && + ((x12_count + 1.0F) < (c40_count - stiction))) { + best_scheme = DM_X12; + } + + /* step (r)(4) */ + if (((text_count + 1.0F) < (ascii_count - stiction)) && + ((text_count + 1.0F) < (b256_count - stiction)) && + ((text_count + 1.0F) < (edf_count - stiction)) && + ((text_count + 1.0F) < (x12_count - stiction)) && + ((text_count + 1.0F) < (c40_count - stiction))) { + best_scheme = DM_TEXT; + } + + /* step (r)(3) */ + if (((edf_count + 1.0F) < (ascii_count - stiction)) && + ((edf_count + 1.0F) < (b256_count - stiction)) && + ((edf_count + 1.0F) < (text_count - stiction)) && + ((edf_count + 1.0F) < (x12_count - stiction)) && + ((edf_count + 1.0F) < (c40_count - stiction))) { + best_scheme = DM_EDIFACT; + } + + /* step (r)(2) */ + if (((b256_count + 1.0F) <= (ascii_count + stiction)) || + (((b256_count + 1.0F) < (edf_count - stiction)) && + ((b256_count + 1.0F) < (text_count - stiction)) && + ((b256_count + 1.0F) < (x12_count - stiction)) && + ((b256_count + 1.0F) < (c40_count - stiction)))) { + best_scheme = DM_BASE256; + } + + /* step (r)(1) */ + if (((ascii_count + 1.0F) <= (b256_count + stiction)) && + ((ascii_count + 1.0F) <= (edf_count + stiction)) && + ((ascii_count + 1.0F) <= (text_count + stiction)) && + ((ascii_count + 1.0F) <= (x12_count + stiction)) && + ((ascii_count + 1.0F) <= (c40_count + stiction))) { + best_scheme = DM_ASCII; + } + } + + sp++; + } while (best_scheme == DM_NULL); // step (s) + + return best_scheme; +} + +/* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate + Supports encoding FNC1 in supporting systems */ +static int dm200encode(struct zint_symbol *symbol, const unsigned char source[], unsigned char target[], int *last_mode, size_t *length_p, int process_buffer[], int *process_p) { + + size_t sp; + int tp, i, gs1; + int current_mode, next_mode; + size_t inputlen = *length_p; + int debug = symbol->debug; +#ifndef _MSC_VER + char binary[2 * inputlen]; +#else + char* binary = (char*) _alloca(2 * inputlen); +#endif + + sp = 0; + tp = 0; + memset(process_buffer, 0, 8); + *process_p = 0; + strcpy(binary, ""); + + /* step (a) */ + current_mode = DM_ASCII; + next_mode = DM_ASCII; + + if (symbol->input_mode == GS1_MODE) { + gs1 = 1; + } else { + gs1 = 0; + } + + if (gs1) { + target[tp] = 232; + tp++; + strcat(binary, " "); + if (debug) printf("FN1 "); + } /* FNC1 */ + + if (symbol->output_options & READER_INIT) { + if (gs1) { + strcpy(symbol->errtxt, "519: Cannot encode in GS1 mode and Reader Initialisation at the same time"); + return ZINT_ERROR_INVALID_OPTION; + } else { + target[tp] = 234; + tp++; /* Reader Programming */ + strcat(binary, " "); + if (debug) printf("RP "); + } + } + + if (symbol->eci > 3) { + /* Encode ECI numbers according to Table 6 */ + target[tp] = 241; /* ECI Character */ + tp++; + if (symbol->eci <= 126) { + target[tp] = (unsigned char) symbol->eci + 1; + tp++; + } + if ((symbol->eci >= 127) && (symbol->eci <= 16382)) { + target[tp] = (unsigned char) ((symbol->eci - 127) / 254) + 128; + tp++; + target[tp] = (unsigned char) ((symbol->eci - 127) % 254) + 1; + tp++; + } + if (symbol->eci >= 16383) { + target[tp] = (unsigned char) ((symbol->eci - 16383) / 64516) + 192; + tp++; + target[tp] = (unsigned char) (((symbol->eci - 16383) / 254) % 254) + 1; + tp++; + target[tp] = (unsigned char) ((symbol->eci - 16383) % 254) + 1; + tp++; + } + if (debug) printf("ECI %d ", symbol->eci + 1); + } + + /* Check for Macro05/Macro06 */ + /* "[)>[RS]05[GS]...[RS][EOT]" -> CW 236 */ + /* "[)>[RS]06[GS]...[RS][EOT]" -> CW 237 */ + if (tp == 0 && sp == 0 && inputlen >= 9 + && source[0] == '[' && source[1] == ')' && source[2] == '>' + && source[3] == '\x1e' && source[4] == '0' + && (source[5] == '5' || source[5] == '6') + && source[6] == '\x1d' + && source[inputlen - 2] == '\x1e' && source[inputlen - 1] == '\x04') { + /* Output macro Codeword */ + if (source[5] == '5') { + target[tp] = 236; + if (debug) printf("Macro05 "); + } else { + target[tp] = 237; + if (debug) printf("Macro06 "); + } + tp++; + strcat(binary, " "); + /* Remove macro characters from input string */ + sp = 7; + inputlen -= 2; + *length_p -= 2; + } + + + while (sp < inputlen) { + + current_mode = next_mode; + + /* step (b) - ASCII encodation */ + if (current_mode == DM_ASCII) { + next_mode = DM_ASCII; + + if (istwodigits(source, sp) && ((sp + 1) != inputlen)) { + target[tp] = (unsigned char) ((10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130); + if (debug) printf("N%d ", target[tp] - 130); + tp++; + strcat(binary, " "); + sp += 2; + } else { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + + if (next_mode != DM_ASCII) { + switch (next_mode) { + case DM_C40: target[tp] = 230; + tp++; + strcat(binary, " "); + if (debug) printf("C40 "); + break; + case DM_TEXT: target[tp] = 239; + tp++; + strcat(binary, " "); + if (debug) printf("TEX "); + break; + case DM_X12: target[tp] = 238; + tp++; + strcat(binary, " "); + if (debug) printf("X12 "); + break; + case DM_EDIFACT: target[tp] = 240; + tp++; + strcat(binary, " "); + if (debug) printf("EDI "); + break; + case DM_BASE256: target[tp] = 231; + tp++; + strcat(binary, " "); + if (debug) printf("BAS "); + break; + } + } else { + if (source[sp] > 127) { + target[tp] = 235; /* FNC4 */ + if (debug) printf("FN4 "); + tp++; + target[tp] = (source[sp] - 128) + 1; + if (debug) printf("A%02X ", target[tp] - 1); + tp++; + strcat(binary, " "); + } else { + if (gs1 && (source[sp] == '[')) { + target[tp] = 232; /* FNC1 */ + if (debug) printf("FN1 "); + } else { + target[tp] = source[sp] + 1; + if (debug) printf("A%02X ", target[tp] - 1); + } + tp++; + strcat(binary, " "); + } + sp++; + } + } + + } + + /* step (c) C40 encodation */ + if (current_mode == DM_C40) { + int shift_set, value; + + next_mode = DM_C40; + if (*process_p == 0) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + } + + if (next_mode != DM_C40) { + target[tp] = 254; + tp++; + strcat(binary, " "); /* Unlatch */ + next_mode = DM_ASCII; + if (debug) printf("ASC "); + } else { + if (source[sp] > 127) { + process_buffer[*process_p] = 1; + (*process_p)++; + process_buffer[*process_p] = 30; + (*process_p)++; /* Upper Shift */ + shift_set = c40_shift[source[sp] - 128]; + value = c40_value[source[sp] - 128]; + } else { + shift_set = c40_shift[source[sp]]; + value = c40_value[source[sp]]; + } + + if (gs1 && (source[sp] == '[')) { + shift_set = 2; + value = 27; /* FNC1 */ + } + + if (shift_set != 0) { + process_buffer[*process_p] = shift_set - 1; + (*process_p)++; + } + process_buffer[*process_p] = value; + (*process_p)++; + + if (*process_p >= 3) { + int iv; + + iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1; + target[tp] = (unsigned char) (iv / 256); + tp++; + target[tp] = iv % 256; + tp++; + strcat(binary, " "); + if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]); + + process_buffer[0] = process_buffer[3]; + process_buffer[1] = process_buffer[4]; + process_buffer[2] = process_buffer[5]; + process_buffer[3] = 0; + process_buffer[4] = 0; + process_buffer[5] = 0; + *process_p -= 3; + } + sp++; + } + } + + /* step (d) Text encodation */ + if (current_mode == DM_TEXT) { + int shift_set, value; + + next_mode = DM_TEXT; + if (*process_p == 0) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + } + + if (next_mode != DM_TEXT) { + target[tp] = 254; + tp++; + strcat(binary, " "); /* Unlatch */ + next_mode = DM_ASCII; + if (debug) printf("ASC "); + } else { + if (source[sp] > 127) { + process_buffer[*process_p] = 1; + (*process_p)++; + process_buffer[*process_p] = 30; + (*process_p)++; /* Upper Shift */ + shift_set = text_shift[source[sp] - 128]; + value = text_value[source[sp] - 128]; + } else { + shift_set = text_shift[source[sp]]; + value = text_value[source[sp]]; + } + + if (gs1 && (source[sp] == '[')) { + shift_set = 2; + value = 27; /* FNC1 */ + } + + if (shift_set != 0) { + process_buffer[*process_p] = shift_set - 1; + (*process_p)++; + } + process_buffer[*process_p] = value; + (*process_p)++; + + if (*process_p >= 3) { + int iv; + + iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1; + target[tp] = (unsigned char) (iv / 256); + tp++; + target[tp] = iv % 256; + tp++; + strcat(binary, " "); + if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]); + + process_buffer[0] = process_buffer[3]; + process_buffer[1] = process_buffer[4]; + process_buffer[2] = process_buffer[5]; + process_buffer[3] = 0; + process_buffer[4] = 0; + process_buffer[5] = 0; + *process_p -= 3; + } + sp++; + } + } + + /* step (e) X12 encodation */ + if (current_mode == DM_X12) { + int value = 0; + + next_mode = DM_X12; + if (*process_p == 0) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + } + + if (next_mode != DM_X12) { + target[tp] = 254; + tp++; + strcat(binary, " "); /* Unlatch */ + next_mode = DM_ASCII; + if (debug) printf("ASC "); + } else { + if (source[sp] == 13) { + value = 0; + } + if (source[sp] == '*') { + value = 1; + } + if (source[sp] == '>') { + value = 2; + } + if (source[sp] == ' ') { + value = 3; + } + if ((source[sp] >= '0') && (source[sp] <= '9')) { + value = (source[sp] - '0') + 4; + } + if ((source[sp] >= 'A') && (source[sp] <= 'Z')) { + value = (source[sp] - 'A') + 14; + } + + process_buffer[*process_p] = value; + (*process_p)++; + + if (*process_p >= 3) { + int iv; + + iv = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + (process_buffer[2]) + 1; + target[tp] = (unsigned char) (iv / 256); + tp++; + target[tp] = iv % 256; + tp++; + strcat(binary, " "); + if (debug) printf("[%d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2]); + + process_buffer[0] = process_buffer[3]; + process_buffer[1] = process_buffer[4]; + process_buffer[2] = process_buffer[5]; + process_buffer[3] = 0; + process_buffer[4] = 0; + process_buffer[5] = 0; + *process_p -= 3; + } + sp++; + } + } + + /* step (f) EDIFACT encodation */ + if (current_mode == DM_EDIFACT) { + int value = 0; + + next_mode = DM_EDIFACT; + if (*process_p == 3) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + } + + if (next_mode != DM_EDIFACT) { + process_buffer[*process_p] = 31; + (*process_p)++; + next_mode = DM_ASCII; + } else { + value = source[sp]; + + if (source[sp] >= 64) { // '@' + value -= 64; + } + + process_buffer[*process_p] = value; + (*process_p)++; + sp++; + } + + if (*process_p >= 4) { + target[tp] = (unsigned char) ((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4)); + tp++; + target[tp] = ((process_buffer[1] & 0x0f) << 4) + ((process_buffer[2] & 0x3c) >> 2); + tp++; + target[tp] = (unsigned char) (((process_buffer[2] & 0x03) << 6) + process_buffer[3]); + tp++; + strcat(binary, " "); + if (debug) printf("[%d %d %d %d] ", process_buffer[0], process_buffer[1], process_buffer[2], process_buffer[3]); + + process_buffer[0] = process_buffer[4]; + process_buffer[1] = process_buffer[5]; + process_buffer[2] = process_buffer[6]; + process_buffer[3] = process_buffer[7]; + process_buffer[4] = 0; + process_buffer[5] = 0; + process_buffer[6] = 0; + process_buffer[7] = 0; + *process_p -= 4; + } + } + + /* step (g) Base 256 encodation */ + if (current_mode == DM_BASE256) { + next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); + + if (next_mode == DM_BASE256) { + target[tp] = source[sp]; + if (debug) printf("B%02X ", target[tp]); + tp++; + sp++; + strcat(binary, "b"); + } else { + next_mode = DM_ASCII; + if (debug) printf("ASC "); + } + } + + if (tp > 1558) { + return 0; + } + + } /* while */ + + /* Add length and randomising algorithm to b256 */ + i = 0; + while (i < tp) { + if (binary[i] == 'b') { + if ((i == 0) || (binary[i - 1] != 'b')) { + /* start of binary data */ + int binary_count; /* length of b256 data */ + + for (binary_count = 0; binary_count + i < tp && binary[binary_count + i] == 'b'; binary_count++); + + if (binary_count <= 249) { + dminsert(binary, i, 'b'); + insert_value(target, i, tp, binary_count); + tp++; + } else { + dminsert(binary, i, 'b'); + dminsert(binary, i + 1, 'b'); + insert_value(target, i, tp, (binary_count / 250) + 249); + tp++; + insert_value(target, i + 1, tp, binary_count % 250); + tp++; + } + } + } + i++; + } + + for (i = 0; i < tp; i++) { + if (binary[i] == 'b') { + int prn, temp; + + prn = ((149 * (i + 1)) % 255) + 1; + temp = target[i] + prn; + if (temp <= 255) { + target[i] = (unsigned char) (temp); + } else { + target[i] = (unsigned char) (temp - 256); + } + } + } + + *(last_mode) = current_mode; + return tp; +} + +static int dm200encode_remainder(unsigned char target[], int target_length, const unsigned char source[], const size_t inputlen, const int last_mode, const int process_buffer[], const int process_p, const int symbols_left) { + int debug = 0; + + switch (last_mode) { + case DM_C40: + case DM_TEXT: + if (process_p == 1) // 1 data character left to encode. + { + if (symbols_left > 1) { + target[target_length] = 254; + target_length++; // Unlatch and encode remaining data in ascii. + } + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } else if (process_p == 2) // 2 data characters left to encode. + { + // Pad with shift 1 value (0) and encode as double. + int intValue = (1600 * process_buffer[0]) + (40 * process_buffer[1]) + 1; // ie (0 + 1). + target[target_length] = (unsigned char) (intValue / 256); + target_length++; + target[target_length] = (unsigned char) (intValue % 256); + target_length++; + if (symbols_left > 2) { + target[target_length] = 254; // Unlatch + target_length++; + } + } else { + if (symbols_left > 0) { + target[target_length] = 254; // Unlatch + target_length++; + } + } + break; + + case DM_X12: + if ((symbols_left == process_p) && (process_p == 1)) { + // Unlatch not required! + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } else { + target[target_length] = (254); + target_length++; // Unlatch. + + if (process_p == 1) { + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } + + if (process_p == 2) { + target[target_length] = source[inputlen - 2] + 1; + target_length++; + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } + } + break; + + case DM_EDIFACT: + if (symbols_left <= 2) // Unlatch not required! + { + if (process_p == 1) { + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } + + if (process_p == 2) { + target[target_length] = source[inputlen - 2] + 1; + target_length++; + target[target_length] = source[inputlen - 1] + 1; + target_length++; + } + } else { + // Append edifact unlatch value (31) and empty buffer + if (process_p == 0) { + target[target_length] = (unsigned char) (31 << 2); + target_length++; + } + + if (process_p == 1) { + target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((31 & 0x30) >> 4)); + target_length++; + target[target_length] = (unsigned char) ((31 & 0x0f) << 4); + target_length++; + } + + if (process_p == 2) { + target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4)); + target_length++; + target[target_length] = (unsigned char) (((process_buffer[1] & 0x0f) << 4) + ((31 & 0x3c) >> 2)); + target_length++; + target[target_length] = (unsigned char) (((31 & 0x03) << 6)); + target_length++; + } + + if (process_p == 3) { + target[target_length] = (unsigned char) ((process_buffer[0] << 2) + ((process_buffer[1] & 0x30) >> 4)); + target_length++; + target[target_length] = (unsigned char) (((process_buffer[1] & 0x0f) << 4) + ((process_buffer[2] & 0x3c) >> 2)); + target_length++; + target[target_length] = (unsigned char) (((process_buffer[2] & 0x03) << 6) + 31); + target_length++; + } + } + break; + } + + if (debug) { + int i; + printf("\n\n"); + for (i = 0; i < target_length; i++) + printf("%03d ", target[i]); + + printf("\n"); + } + + return target_length; +} + +/* add pad bits */ +static void add_tail(unsigned char target[], int tp, const int tail_length) { + int i, prn, temp; + + for (i = tail_length; i > 0; i--) { + if (i == tail_length) { + target[tp] = 129; + tp++; /* Pad */ + } else { + prn = ((149 * (tp + 1)) % 253) + 1; + temp = 129 + prn; + if (temp <= 254) { + target[tp] = (unsigned char) (temp); + tp++; + } else { + target[tp] = (unsigned char) (temp - 254); + tp++; + } + } + } +} + +int data_matrix_200(struct zint_symbol *symbol,const unsigned char source[], const size_t in_length) { + int i, skew = 0; + size_t inputlen=in_length; + unsigned char binary[2200]; + int binlen; + int process_buffer[8]; /* holds remaining data to finalised */ + int process_p; /* number of characters left to finalise */ + int symbolsize, optionsize, calcsize; + int taillength, error_number = 0; + int H, W, FH, FW, datablock, bytes, rsblock; + int last_mode = DM_ASCII; + unsigned char *grid = 0; + int symbols_left; + + /* inputlen may be decremented by 2 if macro character is used */ + binlen = dm200encode(symbol, source, binary, &last_mode, &inputlen, process_buffer, &process_p); + + if (binlen == 0) { + strcpy(symbol->errtxt, "520: Data too long to fit in symbol"); + return ZINT_ERROR_TOO_LONG; + } + + if ((symbol->option_2 >= 1) && (symbol->option_2 <= DMSIZESCOUNT)) { + optionsize = intsymbol[symbol->option_2 - 1]; + } else { + optionsize = -1; + } + + calcsize = DMSIZESCOUNT - 1; + for (i = DMSIZESCOUNT - 1; i > -1; i--) { + if (matrixbytes[i] >= (binlen + process_p)) { + // Allow for the remaining data characters + calcsize = i; + } + } + + if (symbol->option_3 == DM_SQUARE) { + /* Skip rectangular symbols in square only mode */ + while (matrixH[calcsize] != matrixW[calcsize]) { + calcsize++; + } + if (optionsize != -1) { + strcpy(symbol->errtxt, "521: Can not force square symbols when symbol size is selected"); + error_number = ZINT_WARN_INVALID_OPTION; + } + } else if (symbol->option_3 != DM_DMRE) { + /* Skip DMRE symbols */ + while (isDMRE[calcsize]) { + calcsize++; + } + } + + symbolsize = optionsize; + if (calcsize > optionsize) { + symbolsize = calcsize; + if (optionsize != -1) { + strcpy(symbol->errtxt, "522: Input too long for selected symbol size"); + return ZINT_ERROR_TOO_LONG; + } + } + + // Now we know the symbol size we can handle the remaining data in the process buffer. + symbols_left = matrixbytes[symbolsize] - binlen; + binlen = dm200encode_remainder(binary, binlen, source, inputlen, last_mode, process_buffer, process_p, symbols_left); + + if (binlen > matrixbytes[symbolsize]) { + strcpy(symbol->errtxt, "523: Data too long to fit in symbol"); + return ZINT_ERROR_TOO_LONG; + } + + H = matrixH[symbolsize]; + W = matrixW[symbolsize]; + FH = matrixFH[symbolsize]; + FW = matrixFW[symbolsize]; + bytes = matrixbytes[symbolsize]; + datablock = matrixdatablock[symbolsize]; + rsblock = matrixrsblock[symbolsize]; + + taillength = bytes - binlen; + + if (taillength != 0) { + add_tail(binary, binlen, taillength); + } + + // ecc code + if (symbolsize == INTSYMBOL144) { + skew = 1; + } + ecc200(binary, bytes, datablock, rsblock, skew); + // Print Codewords +#ifdef DEBUG + { + int CWCount; + int posCur; + if (skew) + CWCount = 1558 + 620; + else + CWCount = bytes + rsblock * (bytes / datablock); + printf("Codewords (%i):", CWCount); + for (posCur = 0; posCur < CWCount; posCur++) + printf(" %3i", binary[posCur]); + puts("\n"); + } +#endif + { // placement + int x, y, NC, NR, *places; + NC = W - 2 * (W / FW); + NR = H - 2 * (H / FH); + places = (int*) malloc(NC * NR * sizeof (int)); + ecc200placement(places, NR, NC); + grid = (unsigned char*) malloc(W * H); + memset(grid, 0, W * H); + for (y = 0; y < H; y += FH) { + for (x = 0; x < W; x++) + grid[y * W + x] = 1; + for (x = 0; x < W; x += 2) + grid[(y + FH - 1) * W + x] = 1; + } + for (x = 0; x < W; x += FW) { + for (y = 0; y < H; y++) + grid[y * W + x] = 1; + for (y = 0; y < H; y += 2) + grid[y * W + x + FW - 1] = 1; + } +#ifdef DEBUG + // Print position matrix as in standard + for (y = NR - 1; y >= 0; y--) { + for (x = 0; x < NC; x++) { + int v; + if (x != 0) + fprintf(stderr, "|"); + v = places[(NR - y - 1) * NC + x]; + fprintf(stderr, "%3d.%2d", (v >> 3), 8 - (v & 7)); + } + fprintf(stderr, "\n"); + } +#endif + for (y = 0; y < NR; y++) { + for (x = 0; x < NC; x++) { + int v = places[(NR - y - 1) * NC + x]; + //fprintf (stderr, "%4d", v); + if (v == 1 || (v > 7 && (binary[(v >> 3) - 1] & (1 << (v & 7))))) + grid[(1 + y + 2 * (y / (FH - 2))) * W + 1 + x + 2 * (x / (FW - 2))] = 1; + } + //fprintf (stderr, "\n"); + } + for (y = H - 1; y >= 0; y--) { + int x; + for (x = 0; x < W; x++) { + if (grid[W * y + x]) { + set_module(symbol, (H - y) - 1, x); + } + } + symbol->row_height[(H - y) - 1] = 1; + } + free(grid); + free(places); + } + + symbol->rows = H; + symbol->width = W; + + return error_number; +} + +int dmatrix(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length) { + int error_number; + + if (symbol->option_1 <= 1) { + /* ECC 200 */ + error_number = data_matrix_200(symbol, source, in_length); + } else { + /* ECC 000 - 140 */ + strcpy(symbol->errtxt, "524: Older Data Matrix standards are no longer supported"); + error_number = ZINT_ERROR_INVALID_OPTION; + } + + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/dmatrix.h b/3rdparty/zint-2.6.1/backend/dmatrix.h new file mode 100644 index 0000000..7d1f641 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/dmatrix.h @@ -0,0 +1,237 @@ +/* dmatrix.h - Handles Data Matrix ECC 200 */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* + Containes Extended Rectangular Data Matrix (DMRE) + See http://www.dmre.info for information + Contact: harald.oehlmann@eurodatacouncil.org + */ + +#include "common.h" + +#ifndef __IEC16022ECC200_H +#define __IEC16022ECC200_H +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern int data_matrix_200(struct zint_symbol *symbol, const unsigned char source[], const size_t length); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#define MAXBARCODE 3116 + +#define DM_NULL 0 +#define DM_ASCII 1 +#define DM_C40 2 +#define DM_TEXT 3 +#define DM_X12 4 +#define DM_EDIFACT 5 +#define DM_BASE256 6 + +static const char c40_shift[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 +}; + +static const char c40_value[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 15, 16, 17, 18, 19, 20, 21, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 22, 23, 24, 25, 26, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 +}; + +static const char text_shift[] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3 +}; + +static const char text_value[] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 15, 16, 17, 18, 19, 20, 21, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + 22, 23, 24, 25, 26, 0, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27, 28, 29, 30, 31 +}; + +// Position in option array [symbol option value - 1] +// The position in the option array is by increasing total data codewords with square first +// The last comment value is the total data codewords value. +// The index of this array is the --vers parameter value -1 and is given as forst comment value + +static const unsigned short int intsymbol[] = { + 0, /* 1: 10x10 , 3*/ 1, /* 2: 12x12 , 5*/ 3, /* 3: 14x14 , 8*/ 5, /* 4: 16x16 , 12*/ + 7, /* 5: 18x18 , 18*/ 9, /* 6: 20x20 , 22*/ 12, /* 7: 22x22 , 30*/ 14, /* 8: 24x24 , 36*/ + 16, /* 9: 26x26 , 44*/ 18, /* 10: 32x32 , 62*/ 21, /* 11: 36x36 , 86*/ 24, /* 12: 40x40 ,114*/ + 26, /* 13: 44x44 ,144*/ 27, /* 14: 48x48 ,174*/ 28, /* 15: 52x52 ,204*/ 29, /* 16: 64x64 ,280*/ + 30, /* 17: 72x72 ,368*/ 31, /* 18: 80x80 ,456*/ 32, /* 19: 88x88 ,576*/ 33, /* 20: 96x96 ,696*/ + 34, /* 21:104x104,816*/ 35, /* 22:120x120,1050*/36, /* 23:132x132,1304*/37, /* 24:144x144,1558*/ + 2, /* 25: 8x18 , 5*/ 4, /* 26: 8x32 , 10*/ 6, /* 27: 12x26 , 16*/ 10, /* 28: 12x36 , 22*/ + 13, /* 29: 16x36 , 32*/ 17, /* 30: 16x48 , 49*/ 8, /* 31: 8x48 , 18*/ 11, /* 32: 8x64 , 24*/ + 15, /* 33: 12x64 , 43*/ 19, /* 34: 16x64 , 62*/ 20, /* 37: 24x48 , 80*/ 23, /* 38: 24x64 ,108*/ + 22, /* 41: 26x48 , 90*/ 25, /* 42: 26x64 ,118*/ + 0 +}; + +// Number of DM Sizes +#define DMSIZESCOUNT 38 +// Number of 144x144 for special interlace +#define INTSYMBOL144 37 + +// Is the current code a DMRE code ? +// This is the case, if intsymbol index >= 30 + +static const char isDMRE[] = { + /* 0*/ 0, /* 10x10, 3 */ 0, /* 12x12 , 5 */ 0, /* 8x18 , 5 */ 0, /* 14x14 , 8 */ + /* 4*/ 0, /* 8x32 ,10 */ 0, /* 16x16 ,12 */ 0, /* 12x26 ,16 */ 0, /* 18x18 ,18 */ + /* 8*/ 1, /* 8x48 ,18 */ 0, /* 20x20 ,22 */ 0, /* 12x36 ,22 */ 1, /* 8x64 ,24 */ + /*12*/ 0, /* 22x22 ,30 */ 0, /* 16x36 ,32 */ 0, /* 24x24 ,36 */ 1, /* 12x64 ,43 */ + /*16*/ 0, /* 26x26 ,44 */ 0, /* 16x48 ,49 */ 0, /* 32x32 ,62 */ 1, /* 16x64 ,62 */ + /*20*/ 1, /* 24x48 ,80 */ 0, /* 36x36 ,86 */ 1, /* 26x48 ,90 */ 1, /* 24x64 ,108*/ + /*24*/ 0, /* 40x40 ,114*/ 1, /* 26x64 ,118*/ 0, /* 44x44 ,144*/ 0, /* 48x48,174 */ + /*28*/ 0, /* 52x52,204 */ 0, /* 64x64,280 */ 0, /* 72x72,368 */ 0, /* 80x80,456 */ + /*32*/ 0, /* 88x88,576 */ 0, /* 96x96,696 */ 0, /*104x104,816*/ 0, /*120x120,1050*/ + /*36*/ 0, /*132x132,1304*/0 /*144x144,1558*/ +}; + +// Horizontal matrix size + +static const unsigned short int matrixH[] = { + /* 0*/ 10, /* 10x10 , 3 */ 12, /* 12x12 , 5 */ 8, /* 8x18 , 5 */ 14, /* 14x14 , 8 */ + /* 4*/ 8, /* 8x32 ,10 */ 16, /* 16x16 ,12 */ 12, /* 12x26 ,16 */ 18, /* 18x18 ,18 */ + /* 8*/ 8, /* 8x48 ,18 */ 20, /* 20x20 ,22 */ 12, /* 12x36 ,22 */ 8, /* 8x64 ,24 */ + /*12*/ 22, /* 22x22 ,30 */ 16, /* 16x36 ,32 */ 24, /* 24x24 ,36 */ 12, /* 12x64 ,43 */ + /*16*/ 26, /* 26x26 ,44 */ 16, /* 16x48 ,49 */ 32, /* 32x32 ,62 */ 16, /* 16x64 ,62 */ + /*20*/ 24, /* 24x48 ,80 */ 36, /* 36x36 ,86 */ 26, /* 26x48 ,90 */ 24, /* 24x64 ,108*/ + /*24*/ 40, /* 40x40 ,114*/ 26, /* 26x64 ,118*/ 44, /* 44x44 ,144*/ 48, /* 48x48,174 */ + /*28*/ 52, /* 52x52,204 */ 64, /* 64x64,280 */ 72, /* 72x72,368 */ 80, /* 80x80,456 */ + /*32*/ 88, /* 88x88,576 */ 96, /* 96x96,696 */ 104, /*104x104,816*/ 120, /*120x120,1050*/ + /*36*/ 132,/*132x132,1304*/144 /*144x144,1558*/ +}; + +// Vertical matrix sizes + +static const unsigned short int matrixW[] = { + /* 0*/ 10, /* 10x10 */ 12, /* 12x12 */ 18, /* 8x18 */ 14, /* 14x14 */ + /* 4*/ 32, /* 8x32 */ 16, /* 16x16 */ 26, /* 12x26 */ 18, /* 18x18 */ + /* 8*/ 48, /* 8x48 */ 20, /* 20x20 */ 36, /* 12x36 */ 64, /* 8x64 */ + /*12*/ 22, /* 22x22 */ 36, /* 16x36 */ 24, /* 24x24 */ 64, /* 12x64 */ + /*16*/ 26, /* 26x26 */ 48, /* 16x48 */ 32, /* 32x32 */ 64, /* 16x64 */ + /*20*/ 48, /* 24x48 */ 36, /* 36x36 */ 48, /* 26x48 */ 64, /* 24x64 */ + /*24*/ 40, /* 40x40 */ 64, /* 26x64 */ 44, /* 44x44 */ 48, /* 48x48 */ + /*28*/ 52, /* 52x52 */ 64, /* 64x64 */ 72, /* 72x72 */ 80, /* 80x80 */ + /*32*/ 88, /* 88x88 */ 96, /* 96x96 */ 104,/*104x104*/ 120,/*120x120*/ + /*36*/132, /*132x132*/144 /*144x144*/ +}; + +// Horizontal submodule size (including subfinder) + +static const unsigned short int matrixFH[] = { + /* 0*/ 10, /* 10x10 */ 12, /* 12x12 */ 8, /* 8x18 */ 14, /* 14x14 */ + /* 4*/ 8, /* 8x32 */ 16, /* 16x16 */ 12, /* 12x26 */ 18, /* 18x18 */ + /* 8*/ 8, /* 8x48 */ 20, /* 20x20 */ 12, /* 12x36 */ 8, /* 8x64 */ + /*12*/ 22, /* 22x22 */ 16, /* 16x36 */ 24, /* 24x24 */ 12, /* 12x64 */ + /*16*/ 26, /* 26x26 */ 16, /* 16x48 */ 16, /* 32x32 */ 16, /* 16x64 */ + /*20*/ 24, /* 24x48 */ 18, /* 36x36 */ 26, /* 26x48 */ 24, /* 24x64 */ + /*24*/ 20, /* 40x40 */ 26, /* 26x64 */ 22, /* 44x44 */ 24, /* 48x48 */ + /*28*/ 26, /* 52x52 */ 16, /* 64x64 */ 18, /* 72x72 */ 20, /* 80x80 */ + /*32*/ 22, /* 88x88 */ 24, /* 96x96 */ 26, /*104x104*/ 20, /*120x120*/ + /*36*/ 22, /*132x132*/ 24 /*144x144*/ +}; + +// Vertical submodule size (including subfinder) + +static const unsigned short int matrixFW[] = { + /* 0*/ 10, /* 10x10 */ 12, /* 12x12 */ 18, /* 8x18 */ 14, /* 14x14 */ + /* 4*/ 16, /* 8x32 */ 16, /* 16x16 */ 26, /* 12x26 */ 18, /* 18x18 */ + /* 8*/ 24, /* 8x48 */ 20, /* 20x20 */ 18, /* 12x36 */ 16, /* 8x64 */ + /*12*/ 22, /* 22x22 */ 18, /* 16x36 */ 24, /* 24x24 */ 16, /* 12x64 */ + /*16*/ 26, /* 26x26 */ 24, /* 16x48 */ 16, /* 32x32 */ 16, /* 16x64 */ + /*20*/ 24, /* 24x48 */ 18, /* 36x36 */ 24, /* 26x48 */ 16, /* 24x64 */ + /*24*/ 20, /* 40x40 */ 16, /* 26x64 */ 22, /* 44x44 */ 24, /* 48x48 */ + /*28*/ 26, /* 52x52 */ 16, /* 64x64 */ 18, /* 72x72 */ 20, /* 80x80 */ + /*32*/ 22, /* 88x88 */ 24, /* 96x96 */ 26, /*104x104*/ 20, /*120x120*/ + /*36*/ 22, /*132x132*/ 24 /*144x144*/ +}; + +// Total Data Codewords + +static const unsigned short int matrixbytes[] = { + /* 0*/ 3, /* 10x10 */ 5, /* 12x12 */ 5, /* 8x18 */ 8, /* 14x14 */ + /* 4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */ + /* 8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */ + /*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 36, /* 24x24 */ 43, /* 12x64 */ + /*16*/ 44, /* 26x26 */ 49, /* 16x48 */ 62, /* 32x32 */ 62, /* 16x64 */ + /*20*/ 80, /* 24x48 */ 86, /* 36x36 */ 90, /* 26x48 */ 108, /* 24x64 */ + /*24*/ 114, /* 40x40 */ 118, /* 26x64 */ 144, /* 44x44 */ 174, /* 48x48 */ + /*28*/ 204, /* 52x52 */ 280, /* 64x64 */ 368, /* 72x72 */ 456, /* 80x80 */ + /*32*/ 576, /* 88x88 */ 696, /* 96x96 */ 816, /*104x104*/1050, /*120x120*/ + /*36*/1304, /*132x132*/1558 /*144x144*/ +}; + +// Data Codewords per RS-Block + +static const unsigned short int matrixdatablock[] = { + /* 0*/ 3, /* 10x10 */ 5, /* 12x12 */ 5, /* 8x18 */ 8, /* 14x14 */ + /* 4*/ 10, /* 8x32 */ 12, /* 16x16 */ 16, /* 12x26 */ 18, /* 18x18 */ + /* 8*/ 18, /* 8x48 */ 22, /* 20x20 */ 22, /* 12x36 */ 24, /* 8x64 */ + /*12*/ 30, /* 22x22 */ 32, /* 16x36 */ 36, /* 24x24 */ 43, /* 12x64 */ + /*16*/ 44, /* 26x26 */ 49, /* 16x48 */ 62, /* 32x32 */ 62, /* 16x64 */ + /*20*/ 80, /* 24x48 */ 86, /* 36x36 */ 90, /* 26x48 */ 108, /* 24x64 */ + /*24*/ 114, /* 40x40 */ 118, /* 26x64 */ 144, /* 44x44 */ 174, /* 48x48 */ + /*28*/ 102, /* 52x52 */ 140, /* 64x64 */ 92, /* 72x72 */ 114, /* 80x80 */ + /*32*/ 144, /* 88x88 */ 174, /* 96x96 */ 136, /*104x104*/ 175, /*120x120*/ + /*36*/ 163, /*132x132*/ 156 /* 144x144*/ +}; + +// ECC Codewords per RS-Block + +static const unsigned short int matrixrsblock[] = { + /* 0*/ 5, /* 10x10 */ 7, /* 12x12 */ 7, /* 8x18 */ 10, /* 14x14 */ + /* 4*/ 11, /* 8x32 */ 12, /* 16x16 */ 14, /* 12x26 */ 14, /* 18x18 */ + /* 8*/ 15, /* 8x48 */ 18, /* 20x20 */ 18, /* 12x36 */ 18, /* 8x64 */ + /*12*/ 20, /* 22x22 */ 24, /* 16x36 */ 24, /* 24x24 */ 27, /* 12x64 */ + /*16*/ 28, /* 26x26 */ 28, /* 16x48 */ 36, /* 32x32 */ 36, /* 16x64 */ + /*20*/ 41, /* 24x48 */ 42, /* 36x36 */ 42, /* 26x48 */ 46, /* 24x64 */ + /*24*/ 48, /* 40x40 */ 50, /* 26x64 */ 56, /* 44x44 */ 68, /* 48x48 */ + /*28*/ 42, /* 52x52 */ 56, /* 64x64 */ 36, /* 72x72 */ 48, /* 80x80 */ + /*32*/ 56, /* 88x88 */ 68, /* 96x96 */ 56, /*104x104*/ 68, /*120x120*/ + /*36*/ 62, /*132x132*/ 62 /*144x144*/ +}; + + +#endif diff --git a/3rdparty/zint-2.6.1/backend/dotcode.c b/3rdparty/zint-2.6.1/backend/dotcode.c new file mode 100644 index 0000000..ce2219a --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/dotcode.c @@ -0,0 +1,1463 @@ +/* dotcode.c - Handles DotCode */ + +/* + libzint - the open source barcode library + Copyright (C) 2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* + * Attempts to encode DotCode according to AIMD013 Rev 1.34a, dated Feb 19, 2009 + */ + +#include +#include +#include +#include +#ifndef _MSC_VER +#include +#else +#include "ms_stdint.h" +#include +#endif +#include "common.h" +#include "gs1.h" + +#define GF 113 +#define PM 3 + +/* DotCode symbol character dot patterns, from Annex C */ +static const unsigned short int dot_patterns[113] = { + 0x155, 0x0ab, 0x0ad, 0x0b5, 0x0d5, 0x156, 0x15a, 0x16a, 0x1aa, 0x0ae, + 0x0b6, 0x0ba, 0x0d6, 0x0da, 0x0ea, 0x12b, 0x12d, 0x135, 0x14b, 0x14d, + 0x153, 0x159, 0x165, 0x169, 0x195, 0x1a5, 0x1a9, 0x057, 0x05b, 0x05d, + 0x06b, 0x06d, 0x075, 0x097, 0x09b, 0x09d, 0x0a7, 0x0b3, 0x0b9, 0x0cb, + 0x0cd, 0x0d3, 0x0d9, 0x0e5, 0x0e9, 0x12e, 0x136, 0x13a, 0x14e, 0x15c, + 0x166, 0x16c, 0x172, 0x174, 0x196, 0x19a, 0x1a6, 0x1ac, 0x1b2, 0x1b4, + 0x1ca, 0x1d2, 0x1d4, 0x05e, 0x06e, 0x076, 0x07a, 0x09e, 0x0bc, 0x0ce, + 0x0dc, 0x0e6, 0x0ec, 0x0f2, 0x0f4, 0x117, 0x11b, 0x11d, 0x127, 0x133, + 0x139, 0x147, 0x163, 0x171, 0x18b, 0x18d, 0x193, 0x199, 0x1a3, 0x1b1, + 0x1c5, 0x1c9, 0x1d1, 0x02f, 0x037, 0x03b, 0x03d, 0x04f, 0x067, 0x073, + 0x079, 0x08f, 0x0c7, 0x0e3, 0x0f1, 0x11e, 0x13c, 0x178, 0x18e, 0x19c, + 0x1b8, 0x1c6, 0x1cc +}; + +static int get_dot(char Dots[], const int Hgt, const int Wid, const int x, const int y) { + int retval = 0; + + if ((x >= 0) && (x < Wid) && (y >= 0) && (y < Hgt)) { + if (Dots[(y * Wid) + x] == '1') { + retval = 1; + } + } + + return retval; +} + +static int clr_col(char *Dots, const int Hgt, const int Wid, const int x) { + int y; + for (y = x & 1; y < Hgt; y += 2) { + if (get_dot(Dots, Hgt, Wid, x, y)) { + return 0; + } + } + + return 1; +} + +static int clr_row(char *Dots, const int Hgt, const int Wid, const int y) { + int x; + for (x = y & 1; x < Wid; x += 2) { + if (get_dot(Dots, Hgt, Wid, x, y)) { + return 0; + } + } + + return 1; +} + +/* Dot pattern scoring routine from Annex A */ +const int score_array(char Dots[], int Hgt, int Wid) { + int x, y, worstedge, first, last, sum; + int penalty_local = 0; + int penalty = 0; + + // first, guard against "pathelogical" gaps in the array + if (Hgt & 1) { + if (Hgt < 12) { + sum = 0; + for (x = 1; x < Wid - 1; x++) { + if (!(clr_col(Dots, Hgt, Wid, x))) { + sum = 0; + if (penalty_local) { + penalty += penalty_local; + penalty_local = 0; + } + } else { + sum++; + if (sum == 1) { + penalty_local = Hgt; + } else { + penalty_local *= Hgt; + } + } + } + } + } else { + if (Wid < 12) { + sum = 0; + for (y = 1; y < Hgt - 1; y++) { + if (!(clr_row(Dots, Hgt, Wid, y))) { + sum = 0; + if (penalty_local) { + penalty += penalty_local; + penalty_local = 0; + } + } else { + sum++; + if (sum == 1) { + penalty_local = Wid; + } else { + penalty_local *= Wid; + } + } + } + } + } + + sum = 0; + first = -1; + last = -1; + + // across the top edge, count printed dots and measure their extent + for (x = 0; x < Wid; x += 2) + if (get_dot(Dots, Hgt, Wid, x, 0)) { + if (first < 0) { + first = x; + } + last = x; + sum++; + } + worstedge = sum + last - first; + worstedge *= Hgt; + + sum = 0; + first = -1; + last = -1; + + //across the bottom edge, ditto + for (x = Wid & 1; x < Wid; x += 2) + if (get_dot(Dots, Hgt, Wid, x, Hgt - 1)) { + if (first < 0) { + first = x; + } + last = x; + sum++; + } + sum += last - first; + sum *= Hgt; + if (sum < worstedge) { + worstedge = sum; + } + + sum = 0; + first = -1; + last = -1; + + //down the left edge, ditto + for (y = 0; y < Hgt; y += 2) + if (get_dot(Dots, Hgt, Wid, 0, y)) { + if (first < 0) { + first = y; + } + last = y; + sum++; + } + sum += last - first; + sum *= Wid; + if (sum < worstedge) { + worstedge = sum; + } + + sum = 0; + first = -1; + last = -1; + + //down the right edge, ditto + for (y = Hgt & 1; y < Hgt; y += 2) + if (get_dot(Dots, Hgt, Wid, Wid - 1, y)) { + if (first < 0) { + first = y; + } + last = y; + sum++; + } + sum += last - first; + sum *= Wid; + if (sum < worstedge) { + worstedge = sum; + } + + // throughout the array, count the # of unprinted 5-somes (cross patterns) + // plus the # of printed dots surrounded by 8 unprinted neighbors + sum = 0; + for (y = 0; y < Hgt; y++) { + for (x = y & 1; x < Wid; x += 2) { + if ((!get_dot(Dots, Hgt, Wid, x - 1, y - 1)) + && (!get_dot(Dots, Hgt, Wid, x + 1, y - 1)) + && (!get_dot(Dots, Hgt, Wid, x - 1, y + 1)) + && (!get_dot(Dots, Hgt, Wid, x + 1, y + 1)) + && ((!get_dot(Dots, Hgt, Wid, x, y)) + || ((!get_dot(Dots, Hgt, Wid, x - 2, y)) + && (!get_dot(Dots, Hgt, Wid, x, y - 2)) + && (!get_dot(Dots, Hgt, Wid, x + 2, y)) + && (!get_dot(Dots, Hgt, Wid, x, y + 2))))) { + sum++; + } + } + } + + return (worstedge - sum * sum - penalty); +} + +//------------------------------------------------------------------------- +// "rsencode(nd,nc)" adds "nc" R-S check words to "nd" data words in wd[] +// employing Galois Field GF, where GF is prime, with a prime modulus of PM +//------------------------------------------------------------------------- + +void rsencode(int nd, int nc, unsigned char *wd) { + int i, j, k, nw, start, step, root[GF], c[GF]; + + // Start by generating "nc" roots (antilogs): + root[0] = 1; + for (i = 1; (i <= nc) && (i < GF); i++) + root[i] = (PM * root[i - 1]) % GF; + + // Here we compute how many interleaved R-S blocks will be needed + nw = nd + nc; + step = (nw + GF - 2) / (GF - 1); + + // ...& then for each such block: + for (start = 0; start < step; start++) { + int ND = (nd - start + step - 1) / step, NW = (nw - start + step - 1) / step, NC = NW - ND; + + // first compute the generator polynomial "c" of order "NC": + for (i = 1; i <= NC; i++) + c[i] = 0; + c[0] = 1; + + for (i = 1; i <= NC; i++) { + for (j = NC; j >= 1; j--) { + c[j] = (GF + c[j] - (root[i] * c[j - 1]) % GF) % GF; + } + } + + // & then compute the corresponding checkword values into wd[] + // ... (a) starting at wd[start] & (b) stepping by step + for (i = ND; i < NW; i++) + wd[start + i * step] = 0; + for (i = 0; i < ND; i++) { + k = (wd[start + i * step] + wd[start + ND * step]) % GF; + for (j = 0; j < NC - 1; j++) { + wd[start + (ND + j) * step] = (GF - ((c[j + 1] * k) % GF) + wd[start + (ND + j + 1) * step]) % GF; + } + wd[start + (ND + NC - 1) * step] = (GF - ((c[NC] * k) % GF)) % GF; + } + for (i = ND; i < NW; i++) + wd[start + i * step] = (GF - wd[start + i * step]) % GF; + } +} + +/* Check if the next character is directly encodable in code set A (Annex F.II.D) */ +int datum_a(const unsigned char source[], int position, int length) { + int retval = 0; + + if (position < length) { + if (source[position] <= 95) { + retval = 1; + } + } + + return retval; +} + +/* Check if the next character is directly encodable in code set B (Annex F.II.D) */ +int datum_b(const unsigned char source[], int position, int length) { + int retval = 0; + + if (position < length) { + if ((source[position] >= 32) && (source[position] <= 127)) { + retval = 1; + } + + switch (source[position]) { + case 9: // HT + case 28: // FS + case 29: // GS + case 30: // RS + retval = 1; + } + + if (position != length - 2) { + if ((source[position] == 13) && (source[position + 1] == 10)) { // CRLF + retval = 1; + } + } + } + + return retval; +} + +/* Check if the next characters are directly encodable in code set C (Annex F.II.D) */ +int datum_c(const unsigned char source[], int position, int length) { + int retval = 0; + + if (position <= length - 2) { + if (((source[position] >= '0') && (source[position] <= '9')) + && ((source[position + 1] >= '0') && (source[position + 1] <= '9'))) + retval = 1; + } + + return retval; +} + +/* Returns how many consecutive digits lie immediately ahead (Annex F.II.A) */ +int n_digits(const unsigned char source[], int position, int length) { + int i; + + for (i = position; ((source[i] >= '0') && (source[i] <= '9')) && (i < length); i++); + + return i - position; +} + +/* checks ahead for 10 or more digits starting "17xxxxxx10..." (Annex F.II.B) */ +int seventeen_ten(const unsigned char source[], int position, int length) { + int found = 0; + + if (n_digits(source, position, length) >= 10) { + if (((source[position] == '1') && (source[position + 1] == '7')) + && ((source[position + 8] == '1') && (source[position + 9] == '0'))) { + found = 1; + } + } + + return found; +} + +/* checks how many characters ahead can be reached while datum_c is true, + * returning the resulting number of codewords (Annex F.II.E) + */ +int ahead_c(const unsigned char source[], int position, int length) { + int count = 0; + int i; + + for (i = position; (i < length) && datum_c(source, i, length); i += 2) { + count++; + } + + return count; +} + +/* Annex F.II.F */ +int try_c(const unsigned char source[], int position, int length) { + int retval = 0; + + if (n_digits(source, position, length) > 0) { + if (ahead_c(source, position, length) > ahead_c(source, position + 1, length)) { + retval = ahead_c(source, position, length); + } + } + + return retval; +} + +/* Annex F.II.G */ +int ahead_a(const unsigned char source[], int position, int length) { + int count = 0; + int i; + + for (i = position; ((i < length) && datum_a(source, i, length)) + && (try_c(source, i, length) < 2); i++) { + count++; + } + + return count; +} + +/* Annex F.II.H */ +int ahead_b(const unsigned char source[], int position, int length) { + int count = 0; + int i; + + for (i = position; ((i < length) && datum_b(source, i, length)) + && (try_c(source, i, length) < 2); i++) { + count++; + } + + return count; +} + +/* checks if the next character is in the range 128 to 255 (Annex F.II.I) */ +int binary(const unsigned char source[], int position) { + int retval = 0; + + if (source[position] >= 128) { + retval = 1; + } + + return retval; +} + +/* Analyse input data stream and encode using algorithm from Annex F */ +int dotcode_encode_message(struct zint_symbol *symbol, const unsigned char source[], int length, unsigned char *codeword_array, int *binary_finish) { + int input_position, array_length, i; + char encoding_mode; + int inside_macro, done; + int debug = symbol->debug; + int binary_buffer_size = 0; + int lawrencium[6]; // Reversed radix 103 values + +#if defined(_MSC_VER) && _MSC_VER == 1200 + uint64_t binary_buffer = 0; +#else + uint64_t binary_buffer = 0ULL; +#endif + + input_position = 0; + array_length = 0; + encoding_mode = 'C'; + inside_macro = 0; + + if (symbol->output_options & READER_INIT) { + codeword_array[array_length] = 109; // FNC3 + array_length++; + } + + if (symbol->input_mode != GS1_MODE) { + if (length > 2) { + if (((source[input_position] >= '0') && (source[input_position] <= '9')) && + ((source[input_position + 1] >= '0') && (source[input_position + 1] <= '9'))) { + codeword_array[array_length] = 107; // FNC1 + array_length++; + } + } + } + + if (symbol->eci > 3) { + codeword_array[array_length] = 108; // FNC2 + array_length++; + if (symbol->eci <= 39) { + codeword_array[array_length] = symbol->eci; + array_length++; + } else { + // the next three codewords valued A, B & C encode the ECI value of + // (A - 40) * 12769 + B * 113 + C + 40 (Section 5.2.1) + int a, b, c; + a = (symbol->eci - 40) % 12769; + b = ((symbol->eci - 40) - (12769 * a)) % 113; + c = (symbol->eci - 40) - (12769 * a) - (113 * b); + + codeword_array[array_length] = a + 40; + array_length++; + codeword_array[array_length] = b; + array_length++; + codeword_array[array_length] = c; + array_length++; + } + } + + // Prevent encodation as a macro if a special character is in first position + if (source[input_position] == 9) { + codeword_array[array_length] = 101; // Latch A + array_length++; + codeword_array[array_length] = 73; // HT + array_length++; + encoding_mode = 'A'; + } + + if (source[input_position] == 28) { + codeword_array[array_length] = 101; // Latch A + array_length++; + codeword_array[array_length] = 92; // FS + array_length++; + encoding_mode = 'A'; + } + + if (source[input_position] == 29) { + codeword_array[array_length] = 101; // Latch A + array_length++; + codeword_array[array_length] = 93; // GS + array_length++; + encoding_mode = 'A'; + } + + if (source[input_position] == 30) { + codeword_array[array_length] = 101; // Latch A + array_length++; + codeword_array[array_length] = 94; // RS + array_length++; + encoding_mode = 'A'; + } + + do { + done = 0; + /* Step A */ + if ((input_position == length - 2) && (inside_macro != 0) && (inside_macro != 100)) { + // inside_macro only gets set to 97, 98 or 99 if the last two characters are RS/EOT + input_position += 2; + done = 1; + if (debug) { + printf("A "); + } + } + + if ((input_position == length - 1) && (inside_macro == 100)) { + // inside_macro only gets set to 100 if the last character is EOT + input_position++; + done = 1; + if (debug) { + printf("A "); + } + } + + /* Step B1 */ + if ((!done) && (encoding_mode == 'C')) { + if ((array_length == 0) && (length > 9)) { + if ((source[input_position] == '[') + && (source[input_position + 1] == ')') + && (source[input_position + 2] == '>') + && (source[input_position + 3] == 30) // RS + && (source[length - 1] == 04)) { // EOT + + + if ((source[input_position + 6] == 29) && (source[length - 2] == 30)) { // GS/RS + if ((source[input_position + 4] == '0') && (source[input_position + 5] == '5')) { + codeword_array[array_length] = 102; // Shift B + array_length++; + codeword_array[array_length] = 97; // Macro + array_length++; + input_position += 7; + inside_macro = 97; + done = 1; + if (debug) { + printf("B1/1 "); + } + } + + if ((source[input_position + 4] == '0') && (source[input_position + 5] == '6')) { + codeword_array[array_length] = 102; // Shift B + array_length++; + codeword_array[array_length] = 98; // Macro + array_length++; + input_position += 7; + inside_macro = 98; + done = 1; + if (debug) { + printf("B1/2 "); + } + } + + if ((source[input_position + 4] == '1') && (source[input_position + 5] == '2')) { + codeword_array[array_length] = 102; // Shift B + array_length++; + codeword_array[array_length] = 99; // Macro + array_length++; + input_position += 7; + inside_macro = 99; + done = 1; + if (debug) { + printf("B1/3 "); + } + } + } + + if ((!done) && (source[input_position] >= '0') && (source[input_position] <= '9') && + (source[input_position + 1] >= '0') && (source[input_position + 1] <= '9')) { + codeword_array[array_length] = 102; // Shift B + array_length++; + codeword_array[array_length] = 100; // Macro + array_length++; + input_position += 4; + inside_macro = 100; + done = 1; + if (debug) { + printf("B1/4 "); + } + } + } + } + } + + /* Step B2 */ + if ((!done) && (encoding_mode == 'C')) { + if (seventeen_ten(source, input_position, length)) { + codeword_array[array_length] = 100; // (17)...(10) + array_length++; + codeword_array[array_length] = ((source[input_position + 2] - '0') * 10) + (source[input_position + 3] - '0'); + array_length++; + codeword_array[array_length] = ((source[input_position + 4] - '0') * 10) + (source[input_position + 5] - '0'); + array_length++; + codeword_array[array_length] = ((source[input_position + 6] - '0') * 10) + (source[input_position + 7] - '0'); + array_length++; + input_position += 10; + done = 1; + if (debug) { + printf("B2/1 "); + } + } + } + + if ((!done) && (encoding_mode == 'C')) { + if (datum_c(source, input_position, length) || ((source[input_position] == '[') && (symbol->input_mode == GS1_MODE))) { + if (source[input_position] == '[') { + codeword_array[array_length] = 107; // FNC1 + input_position++; + } else { + codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0'); + input_position += 2; + } + array_length++; + done = 1; + if (debug) { + printf("B2/2 "); + } + } + } + + /* Setp B3 */ + if ((!done) && (encoding_mode == 'C')) { + if (binary(source, input_position)) { + if (n_digits(source, input_position + 1, length) > 0) { + if ((source[input_position] - 128) < 32) { + codeword_array[array_length] = 110; // Bin Shift A + array_length++; + codeword_array[array_length] = source[input_position] - 128 + 64; + array_length++; + } else { + codeword_array[array_length] = 111; // Bin Shift B + array_length++; + codeword_array[array_length] = source[input_position] - 128 - 32; + array_length++; + } + input_position++; + } else { + codeword_array[array_length] = 112; // Bin Latch + array_length++; + encoding_mode = 'X'; + } + done = 1; + if (debug) { + printf("B3 "); + } + } + } + + /* Step B4 */ + if ((!done) && (encoding_mode == 'C')) { + int m = ahead_a(source, input_position, length); + int n = ahead_b(source, input_position, length); + if (m > n) { + codeword_array[array_length] = 101; // Latch A + array_length++; + encoding_mode = 'A'; + } else { + if (n <= 4) { + codeword_array[array_length] = 101 + n; // nx Shift B + array_length++; + + for (i = 0; i < n; i++) { + codeword_array[array_length] = source[input_position] - 32; + array_length++; + input_position++; + } + } else { + codeword_array[array_length] = 106; // Latch B + array_length++; + encoding_mode = 'B'; + } + } + done = 1; + if (debug) { + printf("B4 "); + } + } + + /* Step C1 */ + if ((!done) && (encoding_mode == 'B')) { + int n = try_c(source, input_position, length); + + if (n >= 2) { + if (n <= 4) { + codeword_array[array_length] = 103 + (n - 2); // nx Shift C + array_length++; + for (i = 0; i < n; i++) { + codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0'); + array_length++; + input_position += 2; + } + } else { + codeword_array[array_length] = 106; // Latch C + array_length++; + encoding_mode = 'C'; + } + done = 1; + if (debug) { + printf("C1 "); + } + } + } + + /* Step C2 */ + if ((!done) && (encoding_mode == 'B')) { + if ((source[input_position] == '[') && (symbol->input_mode == GS1_MODE)) { + codeword_array[array_length] = 107; // FNC1 + array_length++; + input_position++; + done = 1; + if (debug) { + printf("C2/1 "); + } + } else { + if (datum_b(source, input_position, length)) { + + if ((source[input_position] >= 32) && (source[input_position] <= 127)) { + codeword_array[array_length] = source[input_position] - 32; + done = 1; + + } else if (source[input_position] == 13) { + /* CR/LF */ + codeword_array[array_length] = 96; + input_position++; + done = 1; + + } else if (input_position != 0) { + /* HT, FS, GS and RS in the first data position would be interpreted as a macro (see table 2) */ + switch(source[input_position]) { + case 9: // HT + codeword_array[array_length] = 97; + break; + case 28: // FS + codeword_array[array_length] = 98; + break; + case 29: // GS + codeword_array[array_length] = 99; + break; + case 30: // RS + codeword_array[array_length] = 100; + break; + } + done = 1; + } + + if (done == 1) { + array_length++; + input_position++; + if (debug) { + printf("C2/2 "); + } + } + } + } + } + + /* Step C3 */ + if ((!done) && (encoding_mode == 'B')) { + if (binary(source, input_position)) { + if (datum_b(source, input_position + 1, length)) { + if ((source[input_position] - 128) < 32) { + codeword_array[array_length] = 110; // Bin Shift A + array_length++; + codeword_array[array_length] = source[input_position] - 128 + 64; + array_length++; + } else { + codeword_array[array_length] = 111; // Bin Shift B + array_length++; + codeword_array[array_length] = source[input_position] - 128 - 32; + array_length++; + } + input_position++; + } else { + codeword_array[array_length] = 112; // Bin Latch + array_length++; + encoding_mode = 'X'; + } + done = 1; + if (debug) { + printf("C3 "); + } + } + } + + /* Step C4 */ + if ((!done) && (encoding_mode == 'B')) { + if (ahead_a(source, input_position, length) == 1) { + codeword_array[array_length] = 101; // Shift A + array_length++; + if (source[input_position] < 32) { + codeword_array[array_length] = source[input_position] + 64; + } else { + codeword_array[array_length] = source[input_position] - 32; + } + array_length++; + input_position++; + } else { + codeword_array[array_length] = 102; // Latch A + array_length++; + encoding_mode = 'A'; + } + done = 1; + if (debug) { + printf("C4 "); + } + } + + /* Step D1 */ + if ((!done) && (encoding_mode == 'A')) { + int n = try_c(source, input_position, length); + if (n >= 2) { + if (n <= 4) { + codeword_array[array_length] = 103 + (n - 2); // nx Shift C + array_length++; + for (i = 0; i < n; i++) { + codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0'); + array_length++; + input_position += 2; + } + } else { + codeword_array[array_length] = 106; // Latch C + array_length++; + encoding_mode = 'C'; + } + done = 1; + if (debug) { + printf("D1 "); + } + } + } + + /* Step D2 */ + if ((!done) && (encoding_mode == 'A')) { + if ((source[input_position] == '[') && (symbol->input_mode == GS1_MODE)) { + codeword_array[array_length] = 107; // FNC1 + array_length++; + input_position++; + done = 1; + if (debug) { + printf("D2/1 "); + } + } else { + if (datum_a(source, input_position, length)) { + if (source[input_position] < 32) { + codeword_array[array_length] = source[input_position] + 64; + } else { + codeword_array[array_length] = source[input_position] - 32; + } + array_length++; + input_position++; + done = 1; + if (debug) { + printf("D2/2 "); + } + } + } + } + + /* Step D3 */ + if ((!done) && (encoding_mode == 'A')) { + if (binary(source, input_position)) { + if (datum_a(source, input_position + 1, length)) { + if ((source[input_position] - 128) < 32) { + codeword_array[array_length] = 110; // Bin Shift A + array_length++; + codeword_array[array_length] = source[input_position] - 128 + 64; + array_length++; + } else { + codeword_array[array_length] = 111; // Bin Shift B + array_length++; + codeword_array[array_length] = source[input_position] - 128 - 32; + array_length++; + } + input_position++; + } else { + codeword_array[array_length] = 112; // Bin Latch + array_length++; + encoding_mode = 'X'; + } + done = 1; + if (debug) { + printf("D3 "); + } + } + } + + /* Step D4 */ + if ((!done) && (encoding_mode == 'A')) { + int n = ahead_b(source, input_position, length); + + if (n <= 6) { + codeword_array[array_length] = 95 + n; // nx Shift B + array_length++; + for (i = 0; i < n; i++) { + codeword_array[array_length] = source[input_position] - 32; + array_length++; + input_position++; + } + } else { + codeword_array[array_length] = 102; // Latch B + array_length++; + encoding_mode = 'B'; + } + done = 1; + if (debug) { + printf("D4 "); + } + } + + /* Step E1 */ + if ((!done) && (encoding_mode == 'X')) { + int n = try_c(source, input_position, length); + + if (n >= 2) { + /* Empty binary buffer */ + for (i = 0; i < (binary_buffer_size + 1); i++) { + lawrencium[i] = binary_buffer % 103; + binary_buffer /= 103; + } + + for (i = 0; i < (binary_buffer_size + 1); i++) { + codeword_array[array_length] = lawrencium[binary_buffer_size - i]; + array_length++; + } + binary_buffer = 0; + binary_buffer_size = 0; + + if (n <= 7) { + codeword_array[array_length] = 101 + n; // Interrupt for nx Shift C + array_length++; + for (i = 0; i < n; i++) { + codeword_array[array_length] = ((source[input_position] - '0') * 10) + (source[input_position + 1] - '0'); + array_length++; + input_position += 2; + } + } else { + codeword_array[array_length] = 111; // Terminate with Latch to C + array_length++; + encoding_mode = 'C'; + } + done = 1; + if (debug) { + printf("E1 "); + } + } + } + + /* Step E2 */ + /* Section 5.2.1.1 para D.2.i states: + * "Groups of six codewords, each valued between 0 and 102, are radix converted from + * base 103 into five base 259 values..." + */ + if ((!done) && (encoding_mode == 'X')) { + if (binary(source, input_position) + || binary(source, input_position + 1) + || binary(source, input_position + 2) + || binary(source, input_position + 3)) { + binary_buffer *= 259; + binary_buffer += source[input_position]; + binary_buffer_size++; + + if (binary_buffer_size == 5) { + for (i = 0; i < 6; i++) { + lawrencium[i] = binary_buffer % 103; + binary_buffer /= 103; + } + + for (i = 0; i < 6; i++) { + codeword_array[array_length] = lawrencium[5 - i]; + array_length++; + } + binary_buffer = 0; + binary_buffer_size = 0; + } + input_position++; + done = 1; + if (debug) { + printf("E2 "); + } + } + } + + /* Step E3 */ + if ((!done) && (encoding_mode == 'X')) { + /* Empty binary buffer */ + for (i = 0; i < (binary_buffer_size + 1); i++) { + lawrencium[i] = binary_buffer % 103; + binary_buffer /= 103; + } + + for (i = 0; i < (binary_buffer_size + 1); i++) { + codeword_array[array_length] = lawrencium[binary_buffer_size - i]; + array_length++; + } + binary_buffer = 0; + binary_buffer_size = 0; + + if (ahead_a(source, input_position, length) > ahead_b(source, input_position, length)) { + codeword_array[array_length] = 109; // Terminate with Latch to A + encoding_mode = 'A'; + } else { + codeword_array[array_length] = 110; // Terminate with Latch to B + encoding_mode = 'B'; + } + array_length++; + done = 1; + if (debug) { + printf("E3 "); + } + } + } while (input_position < length); + + if (encoding_mode == 'X') { + if (binary_buffer_size != 0) { + /* Empty binary buffer */ + for (i = 0; i < (binary_buffer_size + 1); i++) { + lawrencium[i] = binary_buffer % 103; + binary_buffer /= 103; + } + + for (i = 0; i < (binary_buffer_size + 1); i++) { + codeword_array[array_length] = lawrencium[binary_buffer_size - i]; + array_length++; + } + } + *(binary_finish) = 1; + } + + if (debug) { + printf("\n\n"); + } + + return array_length; +} + +/* Convert codewords to binary data stream */ +static size_t make_dotstream(unsigned char masked_array[], int array_length, char dot_stream[]) { + int i; + + dot_stream[0] = '\0'; + + /* Mask value is encoded as two dots */ + bin_append(masked_array[0], 2, dot_stream); + + /* The rest of the data uses 9-bit dot patterns from Annex C */ + for (i = 1; i < array_length; i++) { + bin_append(dot_patterns[masked_array[i]], 9, dot_stream); + } + + return strlen(dot_stream); +} + +/* Determines if a given dot is a reserved corner dot + * to be used by one of the last six bits + */ +int is_corner(int column, int row, int width, int height) { + int corner = 0; + + /* Top Left */ + if ((column == 0) && (row == 0)) { + corner = 1; + } + + /* Top Right */ + if (height % 2) { + if (((column == width - 2) && (row == 0)) + || ((column == width - 1) && (row == 1))) { + corner = 1; + } + } else { + if ((column == width - 1) && (row == 0)) { + corner = 1; + } + } + + /* Bottom Left */ + if (height % 2) { + if ((column == 0) && (row == height - 1)) { + corner = 1; + } + } else { + if (((column == 0) && (row == height - 2)) + || ((column == 1) && (row == height - 1))) { + corner = 1; + } + } + + /* Bottom Right */ + if (((column == width - 2) && (row == height - 1)) + || ((column == width - 1) && (row == height - 2))) { + corner = 1; + } + + return corner; +} + +/* Place the dots in the symbol*/ +void fold_dotstream(char dot_stream[], int width, int height, char dot_array[]) { + int column, row; + int input_position = 0; + + if (height % 2) { + /* Horizontal folding */ + for (row = 0; row < height; row++) { + for (column = 0; column < width; column++) { + if (!((column + row) % 2)) { + if (is_corner(column, row, width, height)) { + dot_array[(row * width) + column] = 'C'; + } else { + dot_array[((height - row - 1) * width) + column] = dot_stream[input_position]; + input_position++; + } + } else { + dot_array[((height - row - 1) * width) + column] = ' '; // Non-data position + } + } + } + + /* Corners */ + dot_array[width - 2] = dot_stream[input_position]; + input_position++; + dot_array[(height * width) - 2] = dot_stream[input_position]; + input_position++; + dot_array[(width * 2) - 1] = dot_stream[input_position]; + input_position++; + dot_array[((height - 1) * width) - 1] = dot_stream[input_position]; + input_position++; + dot_array[0] = dot_stream[input_position]; + input_position++; + dot_array[(height - 1) * width] = dot_stream[input_position]; + } else { + /* Vertical folding */ + for (column = 0; column < width; column++) { + for (row = 0; row < height; row++) { + if (!((column + row) % 2)) { + if (is_corner(column, row, width, height)) { + dot_array[(row * width) + column] = 'C'; + } else { + dot_array[(row * width) + column] = dot_stream[input_position]; + input_position++; + } + } else { + dot_array[(row * width) + column] = ' '; // Non-data position + } + } + } + + /* Corners */ + dot_array[((height - 1) * width) - 1] = dot_stream[input_position]; + input_position++; + dot_array[(height - 2) * width] = dot_stream[input_position]; + input_position++; + dot_array[(height * width) - 2] = dot_stream[input_position]; + input_position++; + dot_array[((height - 1) * width) + 1] = dot_stream[input_position]; + input_position++; + dot_array[width - 1] = dot_stream[input_position]; + input_position++; + dot_array[0] = dot_stream[input_position]; + } +} + +int dotcode(struct zint_symbol *symbol, const unsigned char source[], int length) { + int i, j, k; + size_t jc, n_dots; + int data_length, ecc_length; + int min_dots, min_area; + int height, width; + int mask_score[4]; + int weight; + size_t dot_stream_length; + int high_score, best_mask; + int binary_finish = 0; + int debug = 0; + int padding_dots, is_first; +#ifdef _MSC_VER + unsigned char* masked_codeword_array; +#endif + +#ifndef _MSC_VER + unsigned char codeword_array[length * 3]; +#else + char* dot_stream; + char* dot_array; + unsigned char* codeword_array = (unsigned char *) _alloca(length * 3 * sizeof (unsigned char)); +#endif /* _MSC_VER */ + + if (symbol->eci > 811799) { + strcpy(symbol->errtxt, "525: Invalid ECI"); + return ZINT_ERROR_INVALID_OPTION; + } + + data_length = dotcode_encode_message(symbol, source, length, codeword_array, &binary_finish); + + ecc_length = 3 + (data_length / 2); + + if (debug) { + printf("Codeword length = %d, ECC length = %d\n", data_length, ecc_length); + } + + min_dots = 9 * (data_length + 3 + (data_length / 2)) + 2; + min_area = min_dots * 2; + + if (symbol->option_2 == 0) { + /* Automatic sizing */ + /* Following Rule 3 (Section 5.2.2) and applying a recommended width to height ratio 3:2 */ + /* Eliminates under sized symbols */ + + float h = (float) (sqrt(min_area * 0.666)); + float w = (float) (sqrt(min_area * 1.5)); + + height = (int) h; + width = (int) w; + + if ((width + height) % 2 == 1) { + if ((width * height) < min_area) { + width++; + height++; + } + } else { + if ((h * width) < (w * height)) { + width++; + if ((width * height) < min_area) { + width--; + height++; + if ((width * height) < min_area) { + width += 2; + } + } + } else { + height++; + if ((width * height) < min_area) { + width++; + height--; + if ((width * height) < min_area) { + height += 2; + } + } + } + } + + } else { + /* User defined width */ + /* Eliminates under sized symbols */ + + width = symbol->option_2; + height = (min_area + (width - 1)) / width; + + if (!((width + height) % 2)) { + height++; + } + } + + if ((height > 200) || (width > 200)) { + strcpy(symbol->errtxt, "526: Specified symbol size is too large (E20)"); + return ZINT_ERROR_INVALID_OPTION; + } + + n_dots = (height * width) / 2; + +#ifndef _MSC_VER + char dot_stream[height * width * 3]; + char dot_array[width * height * sizeof (char) ]; +#else + dot_stream = (char *) _alloca(height * width * 3); + if (!dot_stream) return ZINT_ERROR_MEMORY; + + dot_array = (char *) _alloca(width * height * sizeof (char)); + if (!dot_array) return ZINT_ERROR_MEMORY; +#endif + + /* Add pad characters */ + padding_dots = n_dots - min_dots; /* get the number of free dots available for padding */ + is_first = 1; /* first padding character flag */ + + while (padding_dots >= 9) { + if (padding_dots < 18 && ((data_length % 2) == 0)) + padding_dots -= 9; + + else if (padding_dots >= 18) { + if ((data_length % 2) == 0) + padding_dots -= 9; + else + padding_dots -= 18; + } else + break; /* not enough padding dots left for padding */ + + if ((is_first == 1) && (binary_finish == 1)) + codeword_array[data_length] = 109; + else + codeword_array[data_length] = 106; + + data_length++; + is_first = 0; + } + + ecc_length = 3 + (data_length / 2); + +#ifndef _MSC_VER + unsigned char masked_codeword_array[data_length + 1 + ecc_length]; +#else + masked_codeword_array = (unsigned char *) _alloca((data_length + 1 + ecc_length) * sizeof (unsigned char)); +#endif /* _MSC_VER */ + + /* Evaluate data mask options */ + for (i = 0; i < 4; i++) { + switch (i) { + case 0: + masked_codeword_array[0] = 0; + for (j = 0; j < data_length; j++) { + masked_codeword_array[j + 1] = codeword_array[j]; + } + break; + case 1: + weight = 0; + masked_codeword_array[0] = 1; + for (j = 0; j < data_length; j++) { + masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113; + weight += 3; + } + break; + case 2: + weight = 0; + masked_codeword_array[0] = 2; + for (j = 0; j < data_length; j++) { + masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113; + weight += 7; + } + break; + case 3: + weight = 0; + masked_codeword_array[0] = 3; + for (j = 0; j < data_length; j++) { + masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113; + weight += 17; + } + break; + } + + rsencode(data_length + 1, ecc_length, masked_codeword_array); + + dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream); + + /* Add pad bits */ + for (jc = dot_stream_length; jc < n_dots; jc++) { + strcat(dot_stream, "1"); + } + + fold_dotstream(dot_stream, width, height, dot_array); + + mask_score[i] = score_array(dot_array, height, width); + + if (debug) { + printf("Mask %d score is %d\n", i, mask_score[i]); + } + } + + high_score = mask_score[0]; + best_mask = 0; + + for (i = 1; i < 4; i++) { + if (mask_score[i] > high_score) { + high_score = mask_score[i]; + best_mask = i; + } + } + + if (best_mask != 3) { + /* Reprocess to get symbol with best mask */ + switch (best_mask) { + case 0: + masked_codeword_array[0] = 0; + for (j = 0; j < data_length; j++) { + masked_codeword_array[j + 1] = codeword_array[j]; + } + break; + case 1: + weight = 0; + masked_codeword_array[0] = 1; + for (j = 0; j < data_length; j++) { + masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113; + weight += 3; + } + break; + case 2: + weight = 0; + masked_codeword_array[0] = 2; + for (j = 0; j < data_length; j++) { + masked_codeword_array[j + 1] = (weight + codeword_array[j]) % 113; + weight += 7; + } + break; + } + + rsencode(data_length + 1, ecc_length, masked_codeword_array); + dot_stream_length = make_dotstream(masked_codeword_array, (data_length + ecc_length + 1), dot_stream); + + /* Add pad bits */ + for (jc = dot_stream_length; jc < n_dots; jc++) { + strcat(dot_stream, "1"); + } + + fold_dotstream(dot_stream, width, height, dot_array); + } /* else { the version with the best mask is already in memory } */ + + if (debug) { + for (k = 0; k < height; k++) { + for (j = 0; j < width; j++) { + printf("%c", dot_array[(k * width) + j]); + } + printf("\n"); + } + } + + /* Copy values to symbol */ + symbol->width = width; + symbol->rows = height; + + for (k = 0; k < height; k++) { + for (j = 0; j < width; j++) { + if (dot_array[(k * width) + j] == '1') { + set_module(symbol, k, j); + } + } + symbol->row_height[k] = 1; + } + + if (!(symbol->output_options & BARCODE_DOTTY_MODE)) { + symbol->output_options += BARCODE_DOTTY_MODE; + } + + return 0; +} \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/eci.c b/3rdparty/zint-2.6.1/backend/eci.c new file mode 100644 index 0000000..4545613 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/eci.c @@ -0,0 +1,309 @@ +/* eci.c - Extended Channel Interpretations + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include "eci.h" +#include "zint.h" +#ifdef _MSC_VER +#include +#endif + +/* Convert Unicode to other character encodings */ +int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length) { + int glyph; + int bytelen; + int in_posn; + int out_posn; + int ext; + int done; + + if (eci == 26) { + /* Unicode mode, do not process - just copy data across */ + for (in_posn = 0; in_posn < *length; in_posn++) { + dest[in_posn] = source[in_posn]; + } + dest[*length] = '\0'; + return 0; + } + + in_posn = 0; + out_posn = 0; + do { + /* Single byte (ASCII) character */ + bytelen = 1; + glyph = (int) source[in_posn]; + + if ((source[in_posn] >= 0x80) && (source[in_posn] < 0xc0)) { + /* Something has gone wrong, abort */ + return ZINT_ERROR_INVALID_DATA; + } + + if ((source[in_posn] >= 0xc0) && (source[in_posn] < 0xe0)) { + /* Two-byte character */ + bytelen = 2; + glyph = (source[in_posn] & 0x1f) << 6; + + if (*length < (in_posn + 2)) { + return ZINT_ERROR_INVALID_DATA; + } + + if (source[in_posn + 1] > 0xc0) { + return ZINT_ERROR_INVALID_DATA; + } + + glyph += (source[in_posn + 1] & 0x3f); + } + + if ((source[in_posn] >= 0xe0) && (source[in_posn] < 0xf0)) { + /* Three-byte character */ + bytelen = 3; + glyph = (source[in_posn] & 0x0f) << 12; + + if (*length < (in_posn + 2)) { + return ZINT_ERROR_INVALID_DATA; + } + + if (*length < (in_posn + 3)) { + return ZINT_ERROR_INVALID_DATA; + } + + if (source[in_posn + 1] > 0xc0) { + return ZINT_ERROR_INVALID_DATA; + } + + if (source[in_posn + 2] > 0xc0) { + return ZINT_ERROR_INVALID_DATA; + } + + glyph += (source[in_posn + 1] & 0x3f) << 6; + glyph += (source[in_posn + 2] & 0x3f); + } + + if ((source[in_posn] >= 0xf0) && (source[in_posn] < 0xf7)) { + /* Four-byte character */ + bytelen = 4; + glyph = (source[in_posn] & 0x07) << 18; + + if (*length < (in_posn + 2)) { + return ZINT_ERROR_INVALID_DATA; + } + + if (*length < (in_posn + 3)) { + return ZINT_ERROR_INVALID_DATA; + } + + if (*length < (in_posn + 4)) { + return ZINT_ERROR_INVALID_DATA; + } + + if (source[in_posn + 1] > 0xc0) { + return ZINT_ERROR_INVALID_DATA; + } + + if (source[in_posn + 2] > 0xc0) { + return ZINT_ERROR_INVALID_DATA; + } + + if (source[in_posn + 3] > 0xc0) { + return ZINT_ERROR_INVALID_DATA; + } + + glyph += (source[in_posn + 1] & 0x3f) << 12; + glyph += (source[in_posn + 2] & 0x3f) << 6; + glyph += (source[in_posn + 3] & 0x3f); + } + + if (source[in_posn] >= 0xf7) { + /* More than 4 bytes not supported */ + return ZINT_ERROR_INVALID_DATA; + } + + if (glyph < 128) { + dest[out_posn] = glyph; + } else { + done = 0; + for (ext = 0; ext < 128; ext++) { + switch (eci) { + case 3: // Latin-1 + if (glyph == iso_8859_1[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 4: // Latin-2 + if (glyph == iso_8859_2[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 5: // Latin-3 + if (glyph == iso_8859_3[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 6: // Latin-4 + if (glyph == iso_8859_4[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 7: // Latin/Cyrillic + if (glyph == iso_8859_5[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 8: // Latin/Arabic + if (glyph == iso_8859_6[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 9: // Latin/Greek + if (glyph == iso_8859_7[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 10: // Latin/Hebrew + if (glyph == iso_8859_8[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 11: // Latin-5 + if (glyph == iso_8859_9[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 12: // Latin-6 + if (glyph == iso_8859_10[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 13: // Latin/Thai + if (glyph == iso_8859_11[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 15: // Latin-7 + if (glyph == iso_8859_13[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 16: // Latin-8 + if (glyph == iso_8859_14[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 17: // Latin-9 + if (glyph == iso_8859_15[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 18: // Latin-10 + if (glyph == iso_8859_16[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 21: // Windows-1250 + if (glyph == windows_1250[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 22: // Windows-1251 + if (glyph == windows_1251[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 23: // Windows-1252 + if (glyph == windows_1252[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + case 24: // Windows-1256 + if (glyph == windows_1256[ext]) { + dest[out_posn] = ext + 128; + done = 1; + } + break; + default: + break; + } + } + + if (!(done)) { + return ZINT_ERROR_INVALID_DATA; + } + } + + in_posn += bytelen; + out_posn++; + } while (in_posn < *length); + dest[out_posn] = '\0'; + *length = out_posn; + + return 0; +} + +/* Find the lowest ECI mode which will encode a given set of Unicode text */ +int get_best_eci(unsigned char source[], size_t length) { + int eci = 3; + +#ifndef _MSC_VER + unsigned char local_source[length + 1]; +#else + unsigned char *local_source = (unsigned char*) _alloca(length + 1); +#endif + + do { + if (utf_to_eci(eci, source, local_source, &length) == 0) { + return eci; + } + eci++; + } while (eci < 25); + + return 26; // If all of these fail, use Unicode! +} + diff --git a/3rdparty/zint-2.6.1/backend/eci.h b/3rdparty/zint-2.6.1/backend/eci.h new file mode 100644 index 0000000..380dd6a --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/eci.h @@ -0,0 +1,252 @@ +/* eci.c - Extended Channel Interpretations to Unicode tables + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#ifndef ECI_H +#define ECI_H + +#ifdef __cplusplus +extern "C" { +#endif + +static const unsigned short int iso_8859_1[] = {// Latin alphabet No. 1 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff +}; + +static const unsigned short int iso_8859_2[] = {// Latin alphabet No. 2 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x0104, 0x02d8, 0x0141, 0x00a4, 0x013d, 0x015a, 0x00a7, 0x00a8, 0x0160, 0x015e, 0x0164, 0x0179, 0x00ad, 0x017d, 0x017b, + 0x00b0, 0x0105, 0x02db, 0x0142, 0x00b4, 0x013e, 0x015b, 0x02c7, 0x00b8, 0x0161, 0x015f, 0x0165, 0x017a, 0x02dd, 0x017e, 0x017c, + 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, + 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, + 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, + 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 +}; + +static const unsigned short int iso_8859_3[] = {// Latin alphabet No. 3 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x0126, 0x02d8, 0x00a3, 0x00a4, 0x0000, 0x0124, 0x00a7, 0x00a8, 0x0130, 0x015e, 0x011e, 0x0134, 0x00ad, 0x0000, 0x017b, + 0x00b0, 0x0127, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x0125, 0x00b7, 0x00b8, 0x0131, 0x015f, 0x011f, 0x0135, 0x00bd, 0x0000, 0x017c, + 0x00c0, 0x00c1, 0x00c2, 0x0000, 0x00c4, 0x010a, 0x0108, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x0000, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x0120, 0x00d6, 0x00d7, 0x011c, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x016c, 0x015c, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x0000, 0x00e4, 0x010b, 0x0109, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x0000, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x0121, 0x00f6, 0x00f7, 0x011d, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x016d, 0x015d, 0x02d9 +}; + +static const unsigned short int iso_8859_4[] = {// Latin alphabet No. 4 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x0104, 0x0138, 0x0156, 0x00a4, 0x012b, 0x013b, 0x00a7, 0x00a8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00ad, 0x017d, 0x00af, + 0x00b0, 0x0105, 0x02db, 0x0157, 0x00b4, 0x0129, 0x013c, 0x02c7, 0x00b8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014a, 0x017e, 0x014b, + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x012a, + 0x0110, 0x0145, 0x014c, 0x0136, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x0168, 0x016a, 0x00df, + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x012b, + 0x0111, 0x0146, 0x014d, 0x0137, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x0169, 0x016b, 0x02d9 +}; + +static const unsigned short int iso_8859_5[] = {// Latin/Cyrillic alphabet + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040a, 0x040b, 0x040c, 0x00ad, 0x040e, 0x040f, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f, + 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045a, 0x045b, 0x045c, 0x00a7, 0x045e, 0x045f +}; + +static const unsigned short int iso_8859_6[] = {// Latin/Arabic alphabet + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x0000, 0x0000, 0x0000, 0x00a4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060c, 0x00ad, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061b, 0x0000, 0x0000, 0x0000, 0x061f, + 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064a, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, + 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +static const unsigned short int iso_8859_7[] = {// Latin/Greek alphabet + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x2018, 0x2019, 0x00a3, 0x20ac, 0x20af, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x037a, 0x00ab, 0x00ac, 0x00ad, 0x0000, 0x2015, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x0384, 0x0385, 0x0386, 0x00b7, 0x0388, 0x0389, 0x038a, 0x00bb, 0x038c, 0x00bd, 0x038e, 0x038f, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 0x039e, 0x039f, + 0x03a0, 0x03a1, 0x0000, 0x03a3, 0x03a4, 0x03a5, 0x03a6, 0x03a7, 0x03a8, 0x03a9, 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03ae, 0x03af, + 0x03b0, 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, + 0x03c0, 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03ca, 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000 +}; + +static const unsigned short int iso_8859_8[] = {// Latin/Hebrew alphabet + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x0000, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00d7, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00f7, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, + 0x05d0, 0x05d1, 0x05d2, 0x05d3, 0x05d4, 0x05d5, 0x05d6, 0x05d7, 0x05d8, 0x05d9, 0x05da, 0x05db, 0x05dc, 0x05dd, 0x05de, 0x05df, + 0x05e0, 0x05e1, 0x05e2, 0x05e3, 0x05e4, 0x05e5, 0x05e6, 0x05e7, 0x05e8, 0x05e9, 0x05ea, 0x0000, 0x0000, 0x200e, 0x200f, 0x0000 +}; + +static const unsigned short int iso_8859_9[] = {// Latin alphabet No. 5 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x011e, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x0130, 0x015e, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x011f, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0131, 0x015f, 0x00ff +}; + +static const unsigned short int iso_8859_10[] = {// Latin alphabet No. 6 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x0104, 0x0112, 0x0122, 0x012a, 0x012b, 0x0136, 0x00a7, 0x013b, 0x0110, 0x0160, 0x0166, 0x017d, 0x00ad, 0x016a, 0x014a, + 0x00b0, 0x0105, 0x0113, 0x0123, 0x012b, 0x0129, 0x0137, 0x00b7, 0x013c, 0x0111, 0x0161, 0x0167, 0x017e, 0x2015, 0x016b, 0x014b, + 0x0100, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x012e, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x0116, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x0145, 0x014c, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x0168, 0x00d8, 0x0172, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x0101, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x012f, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x0117, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x0146, 0x014d, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x0169, 0x00f8, 0x0173, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x0138 +}; + +static const unsigned short int iso_8859_11[] = {// Latin/Thai alphabet + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07, 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f, + 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17, 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f, + 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27, 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f, + 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e36, 0x0e36, 0x0e37, 0x0e38, 0x0e39, 0x0e3a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0e3f, + 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47, 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f, + 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57, 0x0e58, 0x0e59, 0x0e5a, 0x0e5b, 0x0000, 0x0000, 0x0000, 0x0000 +}; + +static const unsigned short int iso_8859_13[] = {// Latin alphabet No. 7 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x201d, 0x00a2, 0x00a3, 0x00a4, 0x201e, 0x00a6, 0x00a7, 0x00d8, 0x00a9, 0x0156, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00c6, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x201c, 0x00b5, 0x00b6, 0x00b7, 0x00f8, 0x00b9, 0x0157, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00e6, + 0x0104, 0x012e, 0x0100, 0x0106, 0x00c4, 0x00c5, 0x0118, 0x0112, 0x010c, 0x00c9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012a, 0x013b, + 0x0160, 0x0143, 0x0145, 0x00d3, 0x014c, 0x00d5, 0x00d6, 0x00d7, 0x0172, 0x0141, 0x015a, 0x016a, 0x00dc, 0x017b, 0x017d, 0x00df, + 0x0105, 0x012f, 0x0101, 0x0107, 0x00e4, 0x00e5, 0x0119, 0x0113, 0x010d, 0x00e9, 0x017a, 0x0117, 0x0123, 0x0137, 0x012b, 0x013c, + 0x0161, 0x0144, 0x0146, 0x00f3, 0x014d, 0x00f5, 0x00f6, 0x00f7, 0x0173, 0x0142, 0x015b, 0x016b, 0x00fc, 0x017c, 0x017e, 0x2019 +}; + +static const unsigned short int iso_8859_14[] = {// Latin alphabet No. 8 (Celtic) + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x1e02, 0x1e03, 0x00a3, 0x010a, 0x010b, 0x1e0a, 0x00a7, 0x1e80, 0x00a9, 0x1e82, 0x1e0b, 0x1ef2, 0x00ad, 0x00ae, 0x0178, + 0x1e1e, 0x1e1f, 0x0120, 0x0121, 0x1e40, 0x1e41, 0x00b6, 0x1e56, 0x1e81, 0x1e57, 0x1e83, 0x1e60, 0x1ef3, 0x1e84, 0x1e85, 0x1e61, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x0174, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x1e6a, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x0176, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x0175, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x1e6b, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x0177, 0x00ff +}; + +static const unsigned short int iso_8859_15[] = {// Latin alphabet No. 9 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x20ac, 0x00a5, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x017d, 0x00b5, 0x00b6, 0x00b7, 0x017e, 0x00b9, 0x00ba, 0x00bb, 0x0152, 0x0153, 0x0178, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff +}; + +static const unsigned short int iso_8859_16[] = {// Latin alphabet No. 10 + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00a0, 0x0104, 0x0105, 0x0141, 0x20ac, 0x201e, 0x0160, 0x00a7, 0x0161, 0x00a9, 0x0218, 0x00ab, 0x0179, 0x00ad, 0x017a, 0x017b, + 0x00b0, 0x00b1, 0x010c, 0x0142, 0x017d, 0x201d, 0x00b6, 0x00b7, 0x017e, 0x010d, 0x0219, 0x00bb, 0x0152, 0x0153, 0x0178, 0x017c, + 0x00c0, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0106, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00e0, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x0107, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x0111, 0x0144, 0x00f2, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x015b, 0x0171, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x0119, 0x021b, 0x00ff +}; + +static const unsigned short int windows_1250[] = { + 0x20ac, 0x0000, 0x201a, 0x0000, 0x201e, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, + 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, + 0x00a0, 0x02c7, 0x02db, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, + 0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, + 0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, + 0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, + 0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, + 0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9 +}; + +static const unsigned short int windows_1251[] = { + 0x0402, 0x0403, 0x201a, 0x0453, 0x201e, 0x2026, 0x2020, 0x2021, 0x20ac, 0x2030, 0x0409, 0x2039, 0x040a, 0x040c, 0x040b, 0x040f, + 0x0452, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, 0x203a, 0x045a, 0x045c, 0x045b, 0x045f, + 0x00a0, 0x040e, 0x045e, 0x0408, 0x00a4, 0x0490, 0x00a6, 0x00a7, 0x0401, 0x00a9, 0x0404, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x0407, + 0x00b0, 0x00b1, 0x0406, 0x0456, 0x0491, 0x00b5, 0x00b6, 0x00b7, 0x0451, 0x2116, 0x0454, 0x00bb, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041a, 0x041b, 0x041c, 0x041d, 0x041e, 0x041f, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042a, 0x042b, 0x042c, 0x042d, 0x042e, 0x042f, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043a, 0x043b, 0x043c, 0x043d, 0x043e, 0x043f, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044a, 0x044b, 0x044c, 0x044d, 0x044e, 0x044f +}; + +static const unsigned short int windows_1252[] = { + 0x20ac, 0x0000, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017d, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x0000, 0x017e, 0x0178, + 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf, + 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf, + 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df, + 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef, + 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff +}; + +static const unsigned short int windows_1256[] = { + 0x20ac, 0x067e, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021, 0x02c6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06af, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 0x06a9, 0x2122, 0x0691, 0x203a, 0x0153, 0x200c, 0x200d, 0x06ba, + 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, 0x00a8, 0x00a9, 0x06be, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af, + 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 0x00b8, 0x00b9, 0x061b, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x061f, + 0x06c1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062a, 0x062b, 0x062c, 0x062d, 0x062e, 0x062f, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00d7, 0x0637, 0x0638, 0x0639, 0x063a, 0x0640, 0x0641, 0x0642, 0x0643, + 0x00e0, 0x0644, 0x00e2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00e7, 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x0649, 0x064a, 0x00ee, 0x00ef, + 0x064b, 0x064c, 0x064d, 0x064e, 0x00f4, 0x064f, 0x0650, 0x00f7, 0x0651, 0x00f9, 0x0652, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x06d2 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* ECI_H */ + diff --git a/3rdparty/zint-2.6.1/backend/emf.c b/3rdparty/zint-2.6.1/backend/emf.c new file mode 100644 index 0000000..94c1425 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/emf.c @@ -0,0 +1,1222 @@ +/* emf.c - Support for Microsoft Enhanced Metafile Format + + libzint - the open source barcode library + Copyright (C) 2016-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* Developed according to [MS-EMF] - v20160714, Released July 14, 2016 + * and [MS-WMF] - v20160714, Released July 14, 2016 */ + +#include +#include +#include +#include +#include "common.h" +#include "emf.h" + +#define SSET "0123456789ABCDEF" + +int count_rectangles(struct zint_symbol *symbol) { + int rectangles = 0; + int this_row; + int latch, i; + + if ((symbol->symbology != BARCODE_MAXICODE) && + ((symbol->output_options & BARCODE_DOTTY_MODE) == 0)) { + for(this_row = 0; this_row < symbol->rows; this_row++) { + latch = 0; + for(i = 0; i < symbol->width; i++) { + if ((module_is_set(symbol, this_row, i)) && (latch == 0)) { + latch = 1; + rectangles++; + } + + if ((!(module_is_set(symbol, this_row, i))) && (latch == 1)) { + latch = 0; + } + } + } + } + + return rectangles; +} + +int count_circles(struct zint_symbol *symbol) { + int circles = 0; + int this_row; + int i; + + if ((symbol->symbology != BARCODE_MAXICODE) && + ((symbol->output_options & BARCODE_DOTTY_MODE) != 0)) { + for(this_row = 0; this_row < symbol->rows; this_row++) { + for(i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, this_row, i)) { + circles++; + } + } + } + } + + return circles; +} + +int count_hexagons(struct zint_symbol *symbol) { + int hexagons = 0; + int this_row; + int i; + + if (symbol->symbology == BARCODE_MAXICODE) { + for(this_row = 0; this_row < symbol->rows; this_row++) { + for(i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, this_row, i)) { + hexagons++; + } + } + } + } + + return hexagons; +} + +void utfle_copy(unsigned char *output, unsigned char *input, int length) { + int i; + int o; + + /* Convert UTF-8 to UTF-16LE - only needs to handle characters <= U+00FF */ + i = 0; + o = 0; + do { + if(input[i] <= 0x7f) { + /* 1 byte mode (7-bit ASCII) */ + output[o] = input[i]; + output[o + 1] = 0x00; + o += 2; + i++; + } else { + /* 2 byte mode */ + output[o] = ((input[i] & 0x1f) << 6) + (input[i + 1] & 0x3f); + output[o + 1] = 0x00; + o += 2; + i += 2; + } + } while (i < length); +} + +int bump_up(int input) { + /* Strings length must be a multiple of 4 bytes */ + if ((input % 2) == 1) { + input++; + } + return input; +} + +int emf_plot(struct zint_symbol *symbol) { + int i, block_width, latch, this_row; + float large_bar_height, preset_height, row_height, row_posn; + FILE *emf_file; + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + int error_number = 0; + int textoffset, xoffset, yoffset, textdone; + int large_bar_count, comp_offset; + float scaler = symbol->scale * 10; + int rectangle_count, this_rectangle; + int circle_count, this_circle; + int hexagon_count, this_hexagon; + int bytecount, recordcount; + int upcean = 0; + unsigned char regw[7]; + unsigned char regx[7]; + unsigned char regy[7]; + unsigned char regz[7]; + unsigned char output_buffer[12]; + uint32_t dx; + + emr_header_t emr_header; + emr_eof_t emr_eof; + emr_createbrushindirect_t emr_createbrushindirect_fg; + emr_createbrushindirect_t emr_createbrushindirect_bg; + emr_selectobject_t emr_selectobject_fgbrush; + emr_selectobject_t emr_selectobject_bgbrush; + emr_createpen_t emr_createpen; + emr_selectobject_t emr_selectobject_pen; + emr_rectangle_t background; + emr_ellipse_t bullseye[6]; + emr_extcreatefontindirectw_t emr_extcreatefontindirectw; + emr_selectobject_t emr_selectobject_font; + emr_exttextoutw_t emr_exttextoutw[6]; + emr_extcreatefontindirectw_t emr_extcreatefontindirectw_big; + emr_selectobject_t emr_selectobject_font_big; + + box_t box; + +#ifndef _MSC_VER + unsigned char local_text[bump_up(ustrlen(symbol->text) + 1)]; + unsigned char string_buffer[2 * bump_up(ustrlen(symbol->text) + 1)]; +#else + unsigned char* local_text; + unsigned char* string_buffer; + emr_rectangle_t *rectangle, *row_binding; + emr_ellipse_t* circle; + emr_polygon_t* hexagon; + local_text = (unsigned char*) _alloca(bump_up(ustrlen(symbol->text) + 1) * sizeof (unsigned char)); + string_buffer = (unsigned char*) _alloca(2 * bump_up(ustrlen(symbol->text) + 1) * sizeof (unsigned char)); +#endif + + row_height = 0; + textdone = 0; + comp_offset = 0; + this_rectangle = 0; + this_circle = 0; + this_hexagon = 0; + dx = 0; + latch = 0; + + for(i = 0; i < 6; i++) { + regw[i] = '\0'; + regx[i] = '\0'; + regy[i] = '\0'; + regz[i] = '\0'; + } + + if (symbol->show_hrt != 0) { + /* Copy text from symbol */ + ustrcpy(local_text, symbol->text); + } else { + /* No text needed */ + switch (symbol->symbology) { + case BARCODE_EANX: + case BARCODE_EANX_CC: + case BARCODE_ISBNX: + case BARCODE_UPCA: + case BARCODE_UPCE: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + /* For these symbols use dummy text to ensure formatting is done + * properly even if no text is required */ + for (i = 0; i < ustrlen(symbol->text); i++) { + if (symbol->text[i] == '+') { + local_text[i] = '+'; + } else { + local_text[i] = ' '; + } + local_text[ustrlen(symbol->text)] = '\0'; + } + break; + default: + /* For everything else, just remove the text */ + local_text[0] = '\0'; + break; + } + } + + /* sort out colour options */ + to_upper((unsigned char*) symbol->fgcolour); + to_upper((unsigned char*) symbol->bgcolour); + + if (strlen(symbol->fgcolour) != 6) { + strcpy(symbol->errtxt, "641: Malformed foreground colour target"); + return ZINT_ERROR_INVALID_OPTION; + } + + if (strlen(symbol->bgcolour) != 6) { + strcpy(symbol->errtxt, "642: Malformed background colour target"); + return ZINT_ERROR_INVALID_OPTION; + } + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + if (symbol->height == 0) { + symbol->height = 50; + } + + large_bar_count = 0; + preset_height = 0.0; + for (i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if (symbol->row_height[i] == 0) { + large_bar_count++; + } + } + large_bar_height = (symbol->height - preset_height) / large_bar_count; + + if (large_bar_count == 0) { + symbol->height = preset_height; + } + + while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { + comp_offset++; + } + + /* Certain symbols need whitespace otherwise characters get chopped off the sides */ + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) + || (symbol->symbology == BARCODE_ISBNX)) { + switch (ustrlen(local_text)) { + case 13: /* EAN 13 */ + case 16: + case 19: + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + break; + } + upcean = 1; + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + upcean = 1; + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + upcean = 1; + } + + if (ustrlen(local_text) != 0) { + textoffset = 9; + } else { + textoffset = 0; + } + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + + rectangle_count = count_rectangles(symbol); + circle_count = count_circles(symbol); + hexagon_count = count_hexagons(symbol); + +#ifndef _MSC_VER + emr_rectangle_t rectangle[rectangle_count]; + emr_rectangle_t row_binding[symbol->rows - 1]; + emr_ellipse_t circle[circle_count]; + emr_polygon_t hexagon[hexagon_count]; +#else + rectangle = (emr_rectangle_t*) _alloca(rectangle_count*sizeof(emr_rectangle_t)); + row_binding = (emr_rectangle_t*) _alloca((symbol->rows - 1)*sizeof(emr_rectangle_t)); + circle = (emr_ellipse_t*) _alloca(circle_count*sizeof(emr_ellipse_t)); + hexagon = (emr_polygon_t*) _alloca(hexagon_count*sizeof(emr_polygon_t)); +#endif + + /* Header */ + emr_header.type = 0x00000001; // EMR_HEADER + emr_header.size = 88; // Assuming no additional data in header + emr_header.emf_header.bounds.left = 0; + if (symbol->symbology != BARCODE_MAXICODE) { + emr_header.emf_header.bounds.right = ceil((symbol->width + xoffset + xoffset) * scaler); + emr_header.emf_header.bounds.bottom = ceil((symbol->height + textoffset + yoffset + yoffset) * scaler); + } else { + emr_header.emf_header.bounds.right = ceil((74.0F + xoffset + xoffset) * scaler); + emr_header.emf_header.bounds.bottom = ceil((72.0F + yoffset + yoffset) * scaler); + } + emr_header.emf_header.bounds.top = 0; + emr_header.emf_header.frame.left = 0; + emr_header.emf_header.frame.right = emr_header.emf_header.bounds.right * 30; + emr_header.emf_header.frame.top = 0; + emr_header.emf_header.frame.bottom = emr_header.emf_header.bounds.bottom * 30; + emr_header.emf_header.record_signature = 0x464d4520; // ENHMETA_SIGNATURE + emr_header.emf_header.version = 0x00010000;; + emr_header.emf_header.handles = 6; // Number of graphics objects + emr_header.emf_header.reserved = 0x0000; + emr_header.emf_header.n_description = 0; + emr_header.emf_header.off_description = 0; + emr_header.emf_header.n_pal_entries = 0; + emr_header.emf_header.device.cx = 1000; + emr_header.emf_header.device.cy = 1000; + emr_header.emf_header.millimeters.cx = 300; + emr_header.emf_header.millimeters.cy = 300; + bytecount = 88; + recordcount = 1; + + /* Create Brushes */ + emr_createbrushindirect_fg.type = 0x00000027; // EMR_CREATEBRUSHINDIRECT + emr_createbrushindirect_fg.size = 24; + emr_createbrushindirect_fg.ih_brush = 1; + emr_createbrushindirect_fg.log_brush.brush_style = 0x0000; // BS_SOLID + emr_createbrushindirect_fg.log_brush.color.red = fgred; + emr_createbrushindirect_fg.log_brush.color.green = fggrn; + emr_createbrushindirect_fg.log_brush.color.blue = fgblu; + emr_createbrushindirect_fg.log_brush.color.reserved = 0; + emr_createbrushindirect_fg.log_brush.brush_hatch = 0; // ignored + bytecount += 24; + recordcount++; + + emr_createbrushindirect_bg.type = 0x00000027; // EMR_CREATEBRUSHINDIRECT + emr_createbrushindirect_bg.size = 24; + emr_createbrushindirect_bg.ih_brush = 2; + emr_createbrushindirect_bg.log_brush.brush_style = 0x0000; // BS_SOLID + emr_createbrushindirect_bg.log_brush.color.red = bgred; + emr_createbrushindirect_bg.log_brush.color.green = bggrn; + emr_createbrushindirect_bg.log_brush.color.blue = bgblu; + emr_createbrushindirect_bg.log_brush.color.reserved = 0; + emr_createbrushindirect_bg.log_brush.brush_hatch = 0; // ignored + bytecount += 24; + recordcount++; + + emr_selectobject_fgbrush.type = 0x00000025; // EMR_SELECTOBJECT + emr_selectobject_fgbrush.size = 12; + emr_selectobject_fgbrush.ih_object = 1; + bytecount += 12; + recordcount++; + + emr_selectobject_bgbrush.type = 0x00000025; // EMR_SELECTOBJECT + emr_selectobject_bgbrush.size = 12; + emr_selectobject_bgbrush.ih_object = 2; + bytecount += 12; + recordcount++; + + /* Create Pens */ + emr_createpen.type = 0x00000026; // EMR_CREATEPEN + emr_createpen.size = 28; + emr_createpen.ih_pen = 3; + emr_createpen.log_pen.pen_style = 0x00000005; // PS_NULL + emr_createpen.log_pen.width.x = 1; + emr_createpen.log_pen.width.y = 0; // ignored + emr_createpen.log_pen.color_ref.red = 0; + emr_createpen.log_pen.color_ref.green = 0; + emr_createpen.log_pen.color_ref.blue = 0; + emr_createpen.log_pen.color_ref.reserved = 0; + bytecount += 28; + recordcount++; + + emr_selectobject_pen.type = 0x00000025; // EMR_SELECTOBJECT + emr_selectobject_pen.size = 12; + emr_selectobject_pen.ih_object = 3; + bytecount += 12; + recordcount++; + + /* Create font records */ + if ((symbol->show_hrt != 0) && (ustrlen(local_text) != 0)) { + emr_extcreatefontindirectw.type = 0x00000052; // EMR_EXTCREATEFONTINDIRECTW + emr_extcreatefontindirectw.size = 104; + emr_extcreatefontindirectw.ih_fonts = 4; + emr_extcreatefontindirectw.elw.height = (8 * scaler); + emr_extcreatefontindirectw.elw.width = 0; // automatic + emr_extcreatefontindirectw.elw.escapement = 0; + emr_extcreatefontindirectw.elw.orientation = 0; + emr_extcreatefontindirectw.elw.weight = 400; + emr_extcreatefontindirectw.elw.italic = 0x00; + emr_extcreatefontindirectw.elw.underline = 0x00; + emr_extcreatefontindirectw.elw.strike_out = 0x00; + emr_extcreatefontindirectw.elw.char_set = 0x01; + emr_extcreatefontindirectw.elw.out_precision = 0x00; // OUT_DEFAULT_PRECIS + emr_extcreatefontindirectw.elw.clip_precision = 0x00; // CLIP_DEFAULT_PRECIS + emr_extcreatefontindirectw.elw.quality = 0x00; + emr_extcreatefontindirectw.elw.pitch_and_family = 0x00; + for(i = 0; i < 64; i++) { + emr_extcreatefontindirectw.elw.facename[i] = '\0'; + } + utfle_copy(emr_extcreatefontindirectw.elw.facename, (unsigned char*) "sans-serif", 10); + + emr_selectobject_font.type = 0x00000025; // EMR_SELECTOBJECT + emr_selectobject_font.size = 12; + emr_selectobject_font.ih_object = 4; + + if (!((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX))) { + bytecount += 104; + recordcount++; + bytecount += 12; + recordcount++; + } + + if (upcean) { + emr_extcreatefontindirectw_big.type = 0x00000052; // EMR_EXTCREATEFONTINDIRECTW + emr_extcreatefontindirectw_big.size = 104; + if (!((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX))) { + emr_extcreatefontindirectw_big.ih_fonts = 4; + } else { + emr_extcreatefontindirectw_big.ih_fonts = 5; + } + emr_extcreatefontindirectw_big.elw.height = (11 * scaler); + emr_extcreatefontindirectw_big.elw.width = 0; // automatic + emr_extcreatefontindirectw_big.elw.escapement = 0; + emr_extcreatefontindirectw_big.elw.orientation = 0; + emr_extcreatefontindirectw_big.elw.weight = 400; + emr_extcreatefontindirectw_big.elw.italic = 0x00; + emr_extcreatefontindirectw_big.elw.underline = 0x00; + emr_extcreatefontindirectw_big.elw.strike_out = 0x00; + emr_extcreatefontindirectw_big.elw.char_set = 0x01; + emr_extcreatefontindirectw_big.elw.out_precision = 0x00; // OUT_DEFAULT_PRECIS + emr_extcreatefontindirectw_big.elw.clip_precision = 0x00; // CLIP_DEFAULT_PRECIS + emr_extcreatefontindirectw_big.elw.quality = 0x00; + emr_extcreatefontindirectw_big.elw.pitch_and_family = 0x00; + for(i = 0; i < 64; i++) { + emr_extcreatefontindirectw_big.elw.facename[i] = '\0'; + } + utfle_copy(emr_extcreatefontindirectw_big.elw.facename, (unsigned char*) "sans-serif", 10); + bytecount += 104; + recordcount++; + + emr_selectobject_font_big.type = 0x00000025; // EMR_SELECTOBJECT + emr_selectobject_font_big.size = 12; + emr_selectobject_font_big.ih_object = 5; + bytecount += 12; + recordcount++; + } + } + + /* Text */ + if ((symbol->show_hrt != 0) && (ustrlen(local_text) != 0)) { + + if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) { + latch = ustrlen(local_text); + for(i = 0; i < ustrlen(local_text); i++) { + if (local_text[i] == '+') { + latch = i; + } + } + if (latch > 8) { + // EAN-13 + for(i = 1; i <= 6; i++) { + regw[i - 1] = local_text[i]; + regx[i - 1] = local_text[i + 6]; + } + if (ustrlen(local_text) > latch) { + // With add-on + for (i = (latch + 1); i <= ustrlen(local_text); i++) { + regz[i - (latch + 1)] = local_text[i]; + } + } + local_text[1] = '\0'; + } else if (latch > 5) { + // EAN-8 + for(i = 0; i <= 3; i++) { + regw[i] = local_text[i + 4]; + } + if (ustrlen(local_text) > latch) { + // With add-on + for (i = (latch + 1); i <= ustrlen(local_text); i++) { + regz[i - (latch + 1)] = local_text[i]; + } + } + local_text[4] = '\0'; + } + + } + + if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CC)) { + latch = ustrlen(local_text); + for(i = 0; i < ustrlen(local_text); i++) { + if (local_text[i] == '+') { + latch = i; + } + } + if (ustrlen(local_text) > latch) { + // With add-on + for (i = (latch + 1); i <= ustrlen(local_text); i++) { + regz[i - (latch + 1)] = local_text[i]; + } + } + for(i = 1; i <= 5; i++) { + regw[i - 1] = local_text[i]; + regx[i - 1] = local_text[i + 6]; + } + regy[0] = local_text[11]; + local_text[1] = '\0'; + } + + if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CC)) { + latch = ustrlen(local_text); + for(i = 0; i < ustrlen(local_text); i++) { + if (local_text[i] == '+') { + latch = i; + } + } + if (ustrlen(local_text) > latch) { + // With add-on + for (i = (latch + 1); i <= ustrlen(local_text); i++) { + regz[i - (latch + 1)] = local_text[i]; + } + } + for(i = 1; i <= 6; i++) { + regw[i - 1] = local_text[i]; + } + regx[0] = local_text[7]; + local_text[1] = '\0'; + } + + for(i = 0; i <= 5; i++) { + emr_exttextoutw[i].type = 0x00000054; // EMR_EXTTEXTOUTW + emr_exttextoutw[i].bounds.top = 0; // ignored + emr_exttextoutw[i].bounds.left = 0; // ignoredemr_header.emf_header.bytes += + emr_exttextoutw[i].bounds.right = 0xffffffff; // ignored + emr_exttextoutw[i].bounds.bottom = 0xffffffff; // ignored + emr_exttextoutw[i].i_graphics_mode = 0x00000001; // GM_COMPATIBLE + emr_exttextoutw[i].ex_scale = 1.0; + emr_exttextoutw[i].ey_scale = 1.0; + emr_exttextoutw[i].w_emr_text.off_string = 76; + emr_exttextoutw[i].w_emr_text.options = 0; + emr_exttextoutw[i].w_emr_text.rectangle.top = 0; + emr_exttextoutw[i].w_emr_text.rectangle.left = 0; + emr_exttextoutw[i].w_emr_text.rectangle.right = 0xffffffff; + emr_exttextoutw[i].w_emr_text.rectangle.bottom = 0xffffffff; + if (i > 0) { + emr_exttextoutw[i].size = 76 + (6 * 6); + emr_exttextoutw[i].w_emr_text.off_dx = 76 + (2 * 6); + } + } + + emr_exttextoutw[0].w_emr_text.chars = ustrlen(local_text); + emr_exttextoutw[0].size = 76 + (6 * bump_up(ustrlen(local_text) + 1)); + emr_exttextoutw[0].w_emr_text.reference.x = (emr_header.emf_header.bounds.right - (ustrlen(local_text) * 5.3 * scaler)) / 2; // text left + emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler); // text top + emr_exttextoutw[0].w_emr_text.off_dx = 76 + (2 * bump_up(ustrlen(local_text) + 1)); + for (i = 0; i < bump_up(ustrlen(local_text) + 1) * 2; i++) { + string_buffer[i] = '\0'; + } + utfle_copy(string_buffer, local_text, ustrlen(local_text)); + bytecount += 76 + (6 * bump_up(ustrlen(local_text) + 1)); + recordcount++; + + emr_exttextoutw[1].w_emr_text.chars = ustrlen(regw); + emr_exttextoutw[2].w_emr_text.chars = ustrlen(regx); + emr_exttextoutw[3].w_emr_text.chars = ustrlen(regy); + emr_exttextoutw[4].w_emr_text.chars = ustrlen(regz); + + if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) { + if (latch > 8) { + /* EAN-13 */ + emr_exttextoutw[0].w_emr_text.reference.x = (xoffset - 9) * scaler; + emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + emr_exttextoutw[1].w_emr_text.reference.x = (8 + xoffset) * scaler; + emr_exttextoutw[1].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + emr_exttextoutw[2].w_emr_text.reference.x = (55 + xoffset) * scaler; + emr_exttextoutw[2].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + if (ustrlen(regz) > 2) { + emr_exttextoutw[4].w_emr_text.reference.x = (115 + xoffset) * scaler; + bytecount += 112; + recordcount++; + } else if (ustrlen(regz) != 0) { + emr_exttextoutw[4].w_emr_text.reference.x = (109 + xoffset) * scaler; + bytecount += 112; + recordcount++; + } + emr_exttextoutw[4].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - ((large_bar_height + 9) * scaler); + bytecount += 2 * 112; + recordcount += 2; + } else if (latch > 5) { + /* EAN-8 */ + emr_exttextoutw[0].w_emr_text.reference.x = (7 + xoffset) * scaler; + emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + emr_exttextoutw[1].w_emr_text.reference.x = (40 + xoffset) * scaler; + emr_exttextoutw[1].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + if (ustrlen(regz) > 2) { + emr_exttextoutw[4].w_emr_text.reference.x = (87 + xoffset) * scaler; + bytecount += 112; + recordcount++; + } else if (ustrlen(regz) != 0) { + emr_exttextoutw[4].w_emr_text.reference.x = (81 + xoffset) * scaler; + bytecount += 112; + recordcount++; + } + emr_exttextoutw[4].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - ((large_bar_height + 9) * scaler); + bytecount += 112; + recordcount++; + } + } + + if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CC)) { + emr_exttextoutw[0].w_emr_text.reference.x = (xoffset - 7) * scaler; + emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + emr_exttextoutw[1].w_emr_text.reference.x = (14 + xoffset) * scaler; + emr_exttextoutw[1].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + emr_exttextoutw[2].w_emr_text.reference.x = (55 + xoffset) * scaler; + emr_exttextoutw[2].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + emr_exttextoutw[3].w_emr_text.reference.x = (98 + xoffset) * scaler; + emr_exttextoutw[3].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + if (ustrlen(regz) > 2) { + emr_exttextoutw[4].w_emr_text.reference.x = (117 + xoffset) * scaler; + bytecount += 112; + recordcount++; + } else if (ustrlen(regz) != 0) { + emr_exttextoutw[4].w_emr_text.reference.x = (111 + xoffset) * scaler; + bytecount += 112; + recordcount++; + } + emr_exttextoutw[4].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - ((large_bar_height + 9) * scaler); + bytecount += (3 * 112) + 12; + recordcount += 4; + } + + if ((symbol->symbology == BARCODE_UPCE) || (symbol->symbology == BARCODE_UPCE_CC)) { + emr_exttextoutw[0].w_emr_text.reference.x = (xoffset - 7) * scaler; + emr_exttextoutw[0].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + emr_exttextoutw[1].w_emr_text.reference.x = (8 + xoffset) * scaler; + emr_exttextoutw[1].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + emr_exttextoutw[2].w_emr_text.reference.x = (53 + xoffset) * scaler; + emr_exttextoutw[2].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - (9 * scaler);; + if (ustrlen(regz) > 2) { + emr_exttextoutw[4].w_emr_text.reference.x = (71 + xoffset) * scaler; + bytecount += 112; + recordcount++; + } else if (ustrlen(regz) != 0) { + emr_exttextoutw[4].w_emr_text.reference.x = (65 + xoffset) * scaler; + bytecount += 112; + recordcount++; + } + emr_exttextoutw[4].w_emr_text.reference.y = emr_header.emf_header.bounds.bottom - ((large_bar_height + 9) * scaler); + bytecount += (2 * 112) + 12; + recordcount += 3; + } + } + + /* Make background from a rectangle */ + background.type = 0x0000002b; // EMR_RECTANGLE; + background.size = 24; + background.box.top = 0; + background.box.left = 0; + background.box.right = emr_header.emf_header.bounds.right; + background.box.bottom = emr_header.emf_header.bounds.bottom; + bytecount += 24; + recordcount++; + + /* Make bind and box rectangles if needed */ + if ((symbol->output_options & BARCODE_BIND) || (symbol->output_options & BARCODE_BOX)) { + box.top.type = 0x0000002b; // EMR_RECTANGLE; + box.top.size = 24; + box.top.box.top = 0; + box.top.box.bottom = symbol->border_width * scaler; + box.top.box.left = symbol->border_width * scaler; + box.top.box.right = emr_header.emf_header.bounds.right - (symbol->border_width * scaler); + bytecount += 24; + recordcount++; + + box.bottom.type = 0x0000002b; // EMR_RECTANGLE; + box.bottom.size = 24; + box.bottom.box.top = emr_header.emf_header.bounds.bottom - ((symbol->border_width + textoffset) * scaler); + box.bottom.box.bottom = emr_header.emf_header.bounds.bottom - (textoffset * scaler); + box.bottom.box.left = symbol->border_width * scaler; + box.bottom.box.right = emr_header.emf_header.bounds.right - (symbol->border_width * scaler); + bytecount += 24; + recordcount++; + + if (symbol->output_options & BARCODE_BOX) { + box.left.type = 0x0000002b; // EMR_RECTANGLE; + box.left.size = 24; + box.left.box.top = 0; + box.left.box.bottom = emr_header.emf_header.bounds.bottom - (textoffset * scaler); + box.left.box.left = 0; + box.left.box.right = symbol->border_width * scaler; + bytecount += 24; + recordcount++; + + box.right.type = 0x0000002b; // EMR_RECTANGLE; + box.right.size = 24; + box.right.box.top = 0; + box.right.box.bottom = emr_header.emf_header.bounds.bottom - (textoffset * scaler); + box.right.box.left = emr_header.emf_header.bounds.right - (symbol->border_width * scaler); + box.right.box.right = emr_header.emf_header.bounds.right; + bytecount += 24; + recordcount++; + } + } + + /* Make image rectangles, circles, hexagons */ + for (this_row = 0; this_row < symbol->rows; this_row++) { + + if (symbol->row_height[this_row] == 0) { + row_height = large_bar_height; + } else { + row_height = symbol->row_height[this_row]; + } + row_posn = 0; + for (i = 0; i < this_row; i++) { + if (symbol->row_height[i] == 0) { + row_posn += large_bar_height; + } else { + row_posn += symbol->row_height[i]; + } + } + row_posn += yoffset; + + if (symbol->symbology != BARCODE_MAXICODE) { + if ((symbol->output_options & BARCODE_DOTTY_MODE) != 0) { + // Use dots (circles) + for(i = 0; i < symbol->width; i++) { + if(module_is_set(symbol, this_row, i)) { + circle[this_circle].type = 0x0000002a; // EMR_ELLIPSE + circle[this_circle].size = 24; + circle[this_circle].box.top = this_row * scaler; + circle[this_circle].box.bottom = (this_row + 1) * scaler; + circle[this_circle].box.left = (i + xoffset) * scaler; + circle[this_circle].box.right = (i + xoffset + 1) * scaler; + this_circle++; + bytecount += 24; + recordcount++; + } + } + } else { + // Normal mode, with rectangles + i = 0; + if (module_is_set(symbol, this_row, 0)) { + latch = 1; + } else { + latch = 0; + } + + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); + + if (latch == 1) { + /* a bar */ + rectangle[this_rectangle].type = 0x0000002b; // EMR_RECTANGLE; + rectangle[this_rectangle].size = 24; + rectangle[this_rectangle].box.top = row_posn * scaler; + rectangle[this_rectangle].box.bottom = (row_posn + row_height) * scaler; + rectangle[this_rectangle].box.left = (i + xoffset) * scaler; + rectangle[this_rectangle].box.right = (i + xoffset + block_width) * scaler; + bytecount += 24; + recordcount++; + + if (this_row == symbol->rows - 1) { + /* Last row, extend bars if needed */ + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || + (symbol->symbology == BARCODE_ISBNX)) { + /* guard bar extensions for EAN8 and EAN13 */ + if (ustrlen(regx) != 0) { + /* EAN-13 */ + switch (i) { + case 0: + case 2: + case 46: + case 48: + case 92: + case 94: + rectangle[this_rectangle].box.bottom += (5 * scaler); + break; + } + if (i > 94) { + /* Add-on */ + rectangle[this_rectangle].box.top += (10 * scaler); + rectangle[this_rectangle].box.bottom += (5 * scaler); + } + } else if (ustrlen(regw) != 0) { + /* EAN-8 */ + switch (i) { + case 0: + case 2: + case 32: + case 34: + case 64: + case 66: + rectangle[this_rectangle].box.bottom += (5 * scaler); + break; + } + if (i > 66) { + /* Add-on */ + rectangle[this_rectangle].box.top += (10 * scaler); + rectangle[this_rectangle].box.bottom += (5 * scaler); + } + } + } + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + /* guard bar extensions for UPCA */ + if (((i >= 0) && (i <= 11)) || ((i >= 85) && (i <= 96))) { + rectangle[this_rectangle].box.bottom += (5 * scaler); + } + if ((i == 46) || (i == 48)) { + rectangle[this_rectangle].box.bottom += (5 * scaler); + } + if (i > 96) { + /* Add-on */ + rectangle[this_rectangle].box.top += (10 * scaler); + rectangle[this_rectangle].box.bottom += (5 * scaler); + } + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + /* guard bar extensions for UPCE */ + switch (i) { + case 0: + case 2: + case 46: + case 48: + case 50: + rectangle[this_rectangle].box.bottom += (5 * scaler); + break; + } + if (i > 50) { + /* Add-on */ + rectangle[this_rectangle].box.top += (10 * scaler); + rectangle[this_rectangle].box.bottom += (5 * scaler); + } + } + } + + this_rectangle++; + latch = 0; + } else { + /* a space */ + latch = 1; + } + + + i += block_width; + } while (i < symbol->width); + } + } else { + float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my; + /* Maxicode, use hexagons */ + + /* Calculate bullseye */ + for(i = 0; i < 6; i++) { + bullseye[i].type = 0x0000002a; // EMR_ELLIPSE + bullseye[i].size = 24; + } + bullseye[0].box.top = (35.60 - 10.85) * scaler; + bullseye[0].box.bottom = (35.60 + 10.85) * scaler; + bullseye[0].box.left = (35.76 - 10.85) * scaler; + bullseye[0].box.right = (35.76 + 10.85) * scaler; + bullseye[1].box.top = (35.60 - 8.97) * scaler; + bullseye[1].box.bottom = (35.60 + 8.97) * scaler; + bullseye[1].box.left = (35.76 - 8.97) * scaler; + bullseye[1].box.right = (35.76 + 8.97) * scaler; + bullseye[2].box.top = (35.60 - 7.10) * scaler; + bullseye[2].box.bottom = (35.60 + 7.10) * scaler; + bullseye[2].box.left = (35.76 - 7.10) * scaler; + bullseye[2].box.right = (35.76 + 7.10) * scaler; + bullseye[3].box.top = (35.60 - 5.22) * scaler; + bullseye[3].box.bottom = (35.60 + 5.22) * scaler; + bullseye[3].box.left = (35.76 - 5.22) * scaler; + bullseye[3].box.right = (35.76 + 5.22) * scaler; + bullseye[4].box.top = (35.60 - 3.31) * scaler; + bullseye[4].box.bottom = (35.60 + 3.31) * scaler; + bullseye[4].box.left = (35.76 - 3.31) * scaler; + bullseye[4].box.right = (35.76 + 3.31) * scaler; + bullseye[5].box.top = (35.60 - 1.43) * scaler; + bullseye[5].box.bottom = (35.60 + 1.43) * scaler; + bullseye[5].box.left = (35.76 - 1.43) * scaler; + bullseye[5].box.right = (35.76 + 1.43) * scaler; + + /* Plot hexagons */ + for(i = 0; i < symbol->width; i++) { + if(module_is_set(symbol, this_row, i)) { + hexagon[this_hexagon].type = 0x00000003; // EMR_POLYGON + hexagon[this_hexagon].size = 76; + hexagon[this_hexagon].count = 6; + + my = this_row * 2.135 + 1.43; + ay = my + 1.0 + yoffset; + by = my + 0.5 + yoffset; + cy = my - 0.5 + yoffset; + dy = my - 1.0 + yoffset; + ey = my - 0.5 + yoffset; + fy = my + 0.5 + yoffset; + if (this_row & 1) { + mx = (2.46 * i) + 1.23 + 1.23; + } else { + mx = (2.46 * i) + 1.23; + } + ax = mx + xoffset; + bx = mx + 0.86 + xoffset; + cx = mx + 0.86 + xoffset; + dx = mx + xoffset; + ex = mx - 0.86 + xoffset; + fx = mx - 0.86 + xoffset; + + hexagon[this_hexagon].a_points_a.x = ax * scaler; + hexagon[this_hexagon].a_points_a.y = ay * scaler; + hexagon[this_hexagon].a_points_b.x = bx * scaler; + hexagon[this_hexagon].a_points_b.y = by * scaler; + hexagon[this_hexagon].a_points_c.x = cx * scaler; + hexagon[this_hexagon].a_points_c.y = cy * scaler; + hexagon[this_hexagon].a_points_d.x = dx * scaler; + hexagon[this_hexagon].a_points_d.y = dy * scaler; + hexagon[this_hexagon].a_points_e.x = ex * scaler; + hexagon[this_hexagon].a_points_e.y = ey * scaler; + hexagon[this_hexagon].a_points_f.x = fx * scaler; + hexagon[this_hexagon].a_points_f.y = fy * scaler; + + hexagon[this_hexagon].bounds.top = hexagon[this_hexagon].a_points_d.y; + hexagon[this_hexagon].bounds.bottom = hexagon[this_hexagon].a_points_a.y; + hexagon[this_hexagon].bounds.left = hexagon[this_hexagon].a_points_e.x; + hexagon[this_hexagon].bounds.right = hexagon[this_hexagon].a_points_c.x; + this_hexagon++; + bytecount += 76; + recordcount++; + } + } + } + } + + if (symbol->output_options & BARCODE_BIND) { + if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { + /* row binding */ + for (i = 1; i < symbol->rows; i++) { + row_binding[i - 1].type = 0x0000002b; // EMR_RECTANGLE; + row_binding[i - 1].size = 24; + row_binding[i - 1].box.top = ((i * row_height) + yoffset - 1) * scaler; + row_binding[i - 1].box.bottom = row_binding[i - 1].box.top + (2 * scaler); + + if (symbol->symbology != BARCODE_CODABLOCKF) { + row_binding[i - 1].box.left = xoffset * scaler; + row_binding[i - 1].box.right = emr_header.emf_header.bounds.right - (xoffset * scaler); + } else { + row_binding[i - 1].box.left = (xoffset + 11) * scaler; + row_binding[i - 1].box.right = emr_header.emf_header.bounds.right - ((xoffset + 14) * scaler); + } + bytecount += 24; + recordcount++; + } + } + } + + /* Create EOF record */ + emr_eof.type = 0x0000000e; // EMR_EOF + emr_eof.size = 18; // Assuming no palette entries + emr_eof.n_pal_entries = 0; + emr_eof.off_pal_entries = 0; + emr_eof.size_last = emr_eof.size; + bytecount += 18; + recordcount++; + + /* Put final counts in header */ + emr_header.emf_header.bytes = bytecount; + emr_header.emf_header.records = recordcount; + + /* Send EMF data to file */ + if (symbol->output_options & BARCODE_STDOUT) { + emf_file = stdout; + } else { + emf_file = fopen(symbol->outfile, "w"); + } + if (emf_file == NULL) { + strcpy(symbol->errtxt, "640: Could not open output file"); + return ZINT_ERROR_FILE_ACCESS; + } + + fwrite(&emr_header, sizeof(emr_header_t), 1, emf_file); + + fwrite(&emr_createbrushindirect_fg, sizeof(emr_createbrushindirect_t), 1, emf_file); + fwrite(&emr_createbrushindirect_bg, sizeof(emr_createbrushindirect_t), 1, emf_file); + fwrite(&emr_createpen, sizeof(emr_createpen_t), 1, emf_file); + + if ((symbol->show_hrt != 0) && (ustrlen(local_text) != 0)) { + fwrite(&emr_extcreatefontindirectw, sizeof(emr_extcreatefontindirectw_t), 1, emf_file); + } + + fwrite(&emr_selectobject_bgbrush, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&emr_selectobject_pen, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&background, sizeof(emr_rectangle_t), 1, emf_file); + + fwrite(&emr_selectobject_fgbrush, sizeof(emr_selectobject_t), 1, emf_file); + + for (i = 0; i < rectangle_count; i++) { + fwrite(&rectangle[i], sizeof(emr_rectangle_t), 1, emf_file); + } + for (i = 0; i < circle_count; i++) { + fwrite(&circle[i], sizeof(emr_ellipse_t), 1, emf_file); + } + for (i = 0; i < hexagon_count; i++) { + fwrite(&hexagon[i], sizeof(emr_polygon_t), 1, emf_file); + } + + if ((symbol->output_options & BARCODE_BIND) || (symbol->output_options & BARCODE_BOX)) { + fwrite(&box.top, sizeof(emr_rectangle_t), 1, emf_file); + fwrite(&box.bottom, sizeof(emr_rectangle_t), 1, emf_file); + if (symbol->output_options & BARCODE_BOX) { + fwrite(&box.left, sizeof(emr_rectangle_t), 1, emf_file); + fwrite(&box.right, sizeof(emr_rectangle_t), 1, emf_file); + } + } + + if (symbol->output_options & BARCODE_BIND) { + if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { + for(i = 0; i < symbol->rows - 1; i++) { + fwrite(&row_binding[i], sizeof(emr_rectangle_t), 1, emf_file); + } + } + } + + if(symbol->symbology == BARCODE_MAXICODE) { + fwrite(&bullseye[0], sizeof(emr_ellipse_t), 1, emf_file); + fwrite(&emr_selectobject_bgbrush, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&bullseye[1], sizeof(emr_ellipse_t), 1, emf_file); + fwrite(&emr_selectobject_fgbrush, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&bullseye[2], sizeof(emr_ellipse_t), 1, emf_file); + fwrite(&emr_selectobject_bgbrush, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&bullseye[3], sizeof(emr_ellipse_t), 1, emf_file); + fwrite(&emr_selectobject_fgbrush, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&bullseye[4], sizeof(emr_ellipse_t), 1, emf_file); + fwrite(&emr_selectobject_bgbrush, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&bullseye[5], sizeof(emr_ellipse_t), 1, emf_file); + } + + if ((symbol->show_hrt != 0) && (ustrlen(local_text) != 0)) { + if ((symbol->symbology == BARCODE_EANX) || (symbol->symbology == BARCODE_EANX_CC) || (symbol->symbology == BARCODE_ISBNX)) { + if (ustrlen(regx) != 0) { + /* EAN-13 */ + fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file); + fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file); + for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) { + fwrite(&dx, 4, 1, emf_file); + } + fwrite(&emr_exttextoutw[1], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regw, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + fwrite(&emr_exttextoutw[2], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regx, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + if (ustrlen(regz) != 0) { + fwrite(&emr_exttextoutw[4], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regz, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + } + textdone = 1; + } else if (ustrlen(regw) != 0) { + /* EAN-8 */ + fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file); + fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file); + for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) { + fwrite(&dx, 4, 1, emf_file); + } + fwrite(&emr_exttextoutw[1], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regw, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + if (ustrlen(regz) != 0) { + fwrite(&emr_exttextoutw[4], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regz, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + } + textdone = 1; + } + } + if ((symbol->symbology == BARCODE_UPCA) || (symbol->symbology == BARCODE_UPCA_CC)) { + fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file); + fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file); + for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) { + fwrite(&dx, 4, 1, emf_file); + } + fwrite(&emr_exttextoutw[3], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regy, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + fwrite(&emr_selectobject_font_big, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&emr_exttextoutw[1], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regw, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + fwrite(&emr_exttextoutw[2], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regx, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + if (ustrlen(regz) != 0) { + fwrite(&emr_exttextoutw[4], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regz, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + } + textdone = 1; + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file); + fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file); + for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) { + fwrite(&dx, 4, 1, emf_file); + } + fwrite(&emr_exttextoutw[2], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regx, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + fwrite(&emr_selectobject_font_big, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&emr_exttextoutw[1], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regw, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + if (ustrlen(regz) != 0) { + fwrite(&emr_exttextoutw[4], sizeof(emr_exttextoutw_t), 1, emf_file); + utfle_copy(output_buffer, regz, 6); + fwrite(&output_buffer, 12, 1, emf_file); + for (i = 0; i < 6; i++) { + fwrite(&dx, 4, 1, emf_file); + } + } + textdone = 1; + } + + if (textdone == 0) { + fwrite(&emr_selectobject_font, sizeof(emr_selectobject_t), 1, emf_file); + fwrite(&emr_exttextoutw[0], sizeof(emr_exttextoutw_t), 1, emf_file); + fwrite(&string_buffer, 2 * bump_up(ustrlen(local_text) + 1), 1, emf_file); + for (i = 0; i < bump_up(ustrlen(local_text) + 1); i++) { + fwrite(&dx, 4, 1, emf_file); + } + } + } + + fwrite(&emr_eof, sizeof(emr_eof_t), 1, emf_file); + + if (symbol->output_options & BARCODE_STDOUT) { + fflush(emf_file); + } else { + fclose(emf_file); + } + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/emf.h b/3rdparty/zint-2.6.1/backend/emf.h new file mode 100644 index 0000000..da68522 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/emf.h @@ -0,0 +1,216 @@ +/* emf.h - header structure for Microsoft EMF + + libzint - the open source barcode library + Copyright (C) 2016-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#ifndef EMF_H +#define EMF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#include +#include "stdint_msvc.h" +#else +#include +#endif + +#pragma pack(1) + + typedef struct rect_l { + int32_t left; + int32_t top; + int32_t right; + int32_t bottom; + } rect_l_t; + + typedef struct size_l { + uint32_t cx; + uint32_t cy; + } size_l_t; + + typedef struct point_l { + int32_t x; + int32_t y; + } point_l_t; + + typedef struct color_ref { + uint8_t red; + uint8_t green; + uint8_t blue; + uint8_t reserved; + } color_ref_t; + + typedef struct log_brush_ex { + uint32_t brush_style; + color_ref_t color; + uint32_t brush_hatch; + } log_brush_ex_t; + + typedef struct log_pen { + uint32_t pen_style; + point_l_t width; + color_ref_t color_ref; + } log_pen_t; + + typedef struct log_font { + int32_t height; + int32_t width; + int32_t escapement; + int32_t orientation; + int32_t weight; + uint8_t italic; + uint8_t underline; + uint8_t strike_out; + uint8_t char_set; + uint8_t out_precision; + uint8_t clip_precision; + uint8_t quality; + uint8_t pitch_and_family; + unsigned char facename[64]; + } log_font_t; + + typedef struct emr_text { + point_l_t reference; + uint32_t chars; + uint32_t off_string; + uint32_t options; + rect_l_t rectangle; + uint32_t off_dx; + } emr_text_t; + + typedef struct emf_header { + rect_l_t bounds; + rect_l_t frame; + uint32_t record_signature; + uint32_t version; + uint32_t bytes; + uint32_t records; + uint16_t handles; + uint16_t reserved; + uint32_t n_description; + uint32_t off_description; + uint32_t n_pal_entries; + size_l_t device; + size_l_t millimeters; + } emf_header_t; + + typedef struct emr_header { + uint32_t type; + uint32_t size; + emf_header_t emf_header; + } emr_header_t; + + typedef struct emr_createbrushindirect { + uint32_t type; + uint32_t size; + uint32_t ih_brush; + log_brush_ex_t log_brush; + } emr_createbrushindirect_t; + + typedef struct emr_createpen { + uint32_t type; + uint32_t size; + uint32_t ih_pen; + log_pen_t log_pen; + } emr_createpen_t; + + typedef struct emr_selectobject { + uint32_t type; + uint32_t size; + uint32_t ih_object; + } emr_selectobject_t; + + typedef struct emr_rectangle { + uint32_t type; + uint32_t size; + rect_l_t box; + } emr_rectangle_t; + + typedef struct emr_ellipse { + uint32_t type; + uint32_t size; + rect_l_t box; + } emr_ellipse_t; + + typedef struct emr_polygon { + uint32_t type; + uint32_t size; + rect_l_t bounds; + uint32_t count; + point_l_t a_points_a; + point_l_t a_points_b; + point_l_t a_points_c; + point_l_t a_points_d; + point_l_t a_points_e; + point_l_t a_points_f; + } emr_polygon_t; + + typedef struct emr_extcreatefontindirectw { + uint32_t type; + uint32_t size; + uint32_t ih_fonts; + log_font_t elw; + } emr_extcreatefontindirectw_t; + + typedef struct emr_exttextoutw { + uint32_t type; + uint32_t size; + rect_l_t bounds; + uint32_t i_graphics_mode; + float ex_scale; + float ey_scale; + emr_text_t w_emr_text; + } emr_exttextoutw_t; + + typedef struct emr_eof { + uint32_t type; + uint32_t size; + uint32_t n_pal_entries; + uint32_t off_pal_entries; + uint32_t size_last; + } emr_eof_t; + + typedef struct box { + emr_rectangle_t top; + emr_rectangle_t bottom; + emr_rectangle_t left; + emr_rectangle_t right; + } box_t; + +#pragma pack() + +#ifdef __cplusplus +} +#endif + +#endif /* EMF_H */ + diff --git a/3rdparty/zint-2.6.1/backend/font.h b/3rdparty/zint-2.6.1/backend/font.h new file mode 100644 index 0000000..021efac --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/font.h @@ -0,0 +1,419 @@ +/* font.h - Font for PNG images */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +static const char ascii_font[] = { + /* Each character is 7 x 14 pixels */ + 0, 0, 8, 8, 8, 8, 8, 8, 8, 0, 8, 8, 0, 0, /* ! */ + 0, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* " */ + 0, 0, 20, 20, 20, 62, 20, 20, 62, 20, 20, 20, 0, 0, /* # */ + 0, 0, 8, 60, 74, 74, 40, 28, 10, 74, 74, 60, 8, 0, /* $ */ + 0, 0, 50, 74, 76, 56, 8, 16, 28, 50, 82, 76, 0, 0, /* % */ + 0, 0, 24, 36, 36, 36, 24, 50, 74, 68, 76, 50, 0, 0, /* & */ + 0, 8, 8, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ' */ + 0, 2, 4, 8, 8, 16, 16, 16, 16, 16, 8, 8, 4, 2, /* ( */ + 0, 32, 16, 8, 8, 4, 4, 4, 4, 4, 8, 8, 16, 32, /* ) */ + 0, 0, 0, 0, 8, 42, 28, 8, 28, 42, 8, 0, 0, 0, /* * */ + 0, 0, 0, 0, 8, 8, 8, 62, 8, 8, 8, 0, 0, 0, /* + */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 8, 8, 16, /* , */ + 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, /* - */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 28, 8, 0, /* . */ + 0, 2, 2, 4, 4, 8, 8, 8, 16, 16, 32, 32, 64, 64, /* / */ + 0, 0, 24, 36, 66, 66, 66, 66, 66, 66, 36, 24, 0, 0, /* 0 */ + 0, 0, 8, 24, 40, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* 1 */ + 0, 0, 60, 66, 66, 2, 4, 4, 8, 16, 32, 126, 0, 0, /* 2 */ + 0, 0, 126, 2, 4, 8, 28, 2, 2, 66, 66, 60, 0, 0, /* 3 */ + 0, 0, 4, 12, 20, 20, 36, 36, 68, 126, 4, 4, 0, 0, /* 4 */ + 0, 0, 126, 64, 64, 124, 66, 2, 2, 66, 66, 60, 0, 0, /* 5 */ + 0, 0, 28, 32, 64, 64, 92, 98, 66, 66, 66, 60, 0, 0, /* 6 */ + 0, 0, 126, 2, 4, 4, 8, 8, 16, 16, 32, 32, 0, 0, /* 7 */ + 0, 0, 60, 66, 66, 36, 24, 36, 66, 66, 66, 60, 0, 0, /* 8 */ + 0, 0, 60, 66, 66, 66, 70, 58, 2, 66, 68, 56, 0, 0, /* 9 */ + 0, 0, 0, 0, 8, 28, 8, 0, 0, 8, 28, 8, 0, 0, /* : */ + 0, 0, 0, 0, 0, 24, 24, 0, 0, 24, 8, 8, 16, 0, /* ; */ + 0, 0, 0, 2, 4, 8, 16, 32, 16, 8, 4, 2, 0, 0, /* < */ + 0, 0, 0, 0, 0, 126, 0, 0, 126, 0, 0, 0, 0, 0, /* = */ + 0, 0, 0, 32, 16, 8, 4, 2, 4, 8, 16, 32, 0, 0, /* > */ + 0, 0, 60, 66, 66, 4, 8, 8, 8, 0, 8, 8, 0, 0, /* ? */ + 0, 0, 28, 34, 78, 82, 82, 82, 82, 78, 32, 30, 0, 0, /* @ */ + 0, 0, 24, 36, 66, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* A */ + 0, 0, 120, 68, 66, 68, 120, 68, 66, 66, 68, 120, 0, 0, /* B */ + 0, 0, 60, 66, 66, 64, 64, 64, 64, 66, 66, 60, 0, 0, /* C */ + 0, 0, 120, 68, 66, 66, 66, 66, 66, 66, 68, 120, 0, 0, /* D */ + 0, 0, 126, 64, 64, 64, 120, 64, 64, 64, 64, 126, 0, 0, /* E */ + 0, 0, 126, 64, 64, 64, 120, 64, 64, 64, 64, 64, 0, 0, /* F */ + 0, 0, 60, 66, 66, 64, 64, 78, 66, 66, 70, 58, 0, 0, /* G */ + 0, 0, 66, 66, 66, 66, 126, 66, 66, 66, 66, 66, 0, 0, /* H */ + 0, 0, 62, 8, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* I */ + 0, 0, 14, 4, 4, 4, 4, 4, 4, 68, 68, 56, 0, 0, /* J */ + 0, 0, 66, 68, 72, 80, 96, 80, 72, 68, 66, 66, 0, 0, /* K */ + 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 126, 0, 0, /* L */ + 0, 0, 66, 102, 102, 90, 90, 66, 66, 66, 66, 66, 0, 0, /* M */ + 0, 0, 66, 66, 98, 98, 82, 74, 70, 70, 66, 66, 0, 0, /* N */ + 0, 0, 60, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* O */ + 0, 0, 124, 66, 66, 66, 66, 124, 64, 64, 64, 64, 0, 0, /* P */ + 0, 0, 60, 66, 66, 66, 66, 66, 114, 74, 70, 60, 4, 2, /* Q */ + 0, 0, 124, 66, 66, 66, 66, 124, 72, 68, 66, 66, 0, 0, /* R */ + 0, 0, 60, 66, 66, 64, 48, 12, 2, 66, 66, 60, 0, 0, /* S */ + 0, 0, 127, 8, 8, 8, 8, 8, 8, 8, 8, 8, 0, 0, /* T */ + 0, 0, 66, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* U */ + 0, 0, 66, 66, 66, 66, 36, 36, 36, 24, 24, 24, 0, 0, /* V */ + 0, 0, 34, 34, 34, 34, 34, 34, 42, 42, 42, 20, 0, 0, /* W */ + 0, 0, 66, 66, 36, 36, 24, 24, 36, 36, 66, 66, 0, 0, /* X */ + 0, 0, 34, 34, 34, 20, 20, 8, 8, 8, 8, 8, 0, 0, /* Y */ + 0, 0, 126, 2, 4, 8, 8, 16, 32, 32, 64, 126, 0, 0, /* Z */ + 0, 30, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 30, /* [ */ + 0, 64, 64, 32, 32, 16, 16, 16, 8, 8, 4, 4, 2, 2, /* \ */ + 0, 60, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 60, /* ] */ + 0, 24, 36, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ^ */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126, /* _ */ + 0, 16, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ` */ + 0, 0, 0, 0, 0, 60, 66, 2, 62, 66, 66, 62, 0, 0, /* a */ + 0, 0, 64, 64, 64, 92, 98, 66, 66, 66, 98, 92, 0, 0, /* b */ + 0, 0, 0, 0, 0, 60, 66, 64, 64, 64, 66, 60, 0, 0, /* c */ + 0, 0, 2, 2, 2, 58, 70, 66, 66, 66, 70, 58, 0, 0, /* d */ + 0, 0, 0, 0, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* e */ + 0, 0, 12, 18, 16, 16, 124, 16, 16, 16, 16, 16, 0, 0, /* f */ + 0, 0, 0, 0, 0, 58, 68, 68, 68, 56, 32, 92, 66, 60, /* g */ + 0, 0, 64, 64, 64, 92, 98, 66, 66, 66, 66, 66, 0, 0, /* h */ + 0, 0, 8, 8, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* i */ + 0, 0, 2, 2, 0, 6, 2, 2, 2, 2, 2, 34, 34, 28, /* j */ + 0, 0, 64, 64, 64, 68, 72, 80, 112, 72, 68, 66, 0, 0, /* k */ + 0, 0, 24, 8, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* l */ + 0, 0, 0, 0, 0, 52, 42, 42, 42, 42, 42, 34, 0, 0, /* m */ + 0, 0, 0, 0, 0, 92, 98, 66, 66, 66, 66, 66, 0, 0, /* n */ + 0, 0, 0, 0, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* o */ + 0, 0, 0, 0, 0, 92, 98, 66, 66, 66, 98, 92, 64, 64, /* p */ + 0, 0, 0, 0, 0, 58, 70, 66, 66, 66, 70, 58, 2, 2, /* q */ + 0, 0, 0, 0, 0, 92, 98, 66, 64, 64, 64, 64, 0, 0, /* r */ + 0, 0, 0, 0, 0, 60, 66, 32, 24, 4, 66, 60, 0, 0, /* s */ + 0, 0, 16, 16, 16, 124, 16, 16, 16, 16, 18, 12, 0, 0, /* t */ + 0, 0, 0, 0, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* u */ + 0, 0, 0, 0, 0, 34, 34, 34, 20, 20, 8, 8, 0, 0, /* v */ + 0, 0, 0, 0, 0, 34, 34, 42, 42, 42, 42, 20, 0, 0, /* w */ + 0, 0, 0, 0, 0, 66, 66, 36, 24, 36, 66, 66, 0, 0, /* x */ + 0, 0, 0, 0, 0, 66, 66, 66, 66, 70, 58, 2, 66, 60, /* y */ + 0, 0, 0, 0, 0, 126, 4, 8, 16, 16, 32, 126, 0, 0, /* z */ + 0, 6, 8, 8, 8, 8, 8, 16, 8, 8, 8, 8, 8, 6, /* { */ + 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, /* | */ + 0, 48, 8, 8, 8, 8, 8, 4, 8, 8, 8, 8, 8, 48, /* } */ + 0, 32, 82, 74, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ~ */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  */ + 0, 0, 8, 8, 0, 8, 8, 8, 8, 8, 8, 8, 0, 0, /* ¡ */ + 0, 0, 0, 0, 16, 60, 82, 80, 80, 80, 82, 60, 16, 0, /* ¢ */ + 0, 0, 0, 12, 18, 16, 16, 60, 16, 16, 60, 18, 0, 0, /* £ */ + 0, 0, 0, 0, 66, 60, 36, 36, 60, 66, 0, 0, 0, 0, /* ¤ */ + 0, 0, 34, 20, 20, 8, 62, 8, 62, 8, 8, 8, 0, 0, /* ¥ */ + 0, 0, 8, 8, 8, 8, 0, 0, 8, 8, 8, 8, 0, 0, /* ¦ */ + 0, 60, 66, 32, 24, 36, 66, 36, 24, 4, 66, 60, 0, 0, /* § */ + 0, 36, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ¨ */ + 0, 60, 66, 90, 102, 98, 98, 98, 102, 90, 66, 60, 0, 0, /* © */ + 0, 28, 34, 30, 34, 38, 26, 0, 62, 0, 0, 0, 0, 0, /* ª */ + 0, 0, 0, 0, 0, 10, 20, 40, 80, 40, 20, 10, 0, 0, /* « */ + 0, 0, 0, 0, 0, 0, 0, 0, 62, 2, 2, 2, 0, 0, /* ¬ */ + 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, /* ­ */ + 0, 60, 66, 122, 102, 102, 122, 102, 102, 102, 66, 60, 0, 0, /* ® */ + 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ¯ */ + 0, 24, 36, 36, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ° */ + 0, 0, 0, 0, 0, 0, 8, 8, 62, 8, 8, 62, 0, 0, /* ± */ + 0, 24, 36, 4, 8, 16, 32, 60, 0, 0, 0, 0, 0, 0, /* ² */ + 0, 24, 36, 4, 24, 4, 36, 24, 0, 0, 0, 0, 0, 0, /* ³ */ + 0, 4, 8, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ´ */ + 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 54, 42, 32, 32, /* µ */ + 0, 0, 30, 42, 42, 42, 42, 26, 10, 10, 10, 10, 10, 14, /* ¶ */ + 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, /* · */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 16, /* ¸ */ + 0, 8, 24, 8, 8, 8, 8, 28, 0, 0, 0, 0, 0, 0, /* ¹ */ + 0, 0, 24, 36, 36, 24, 0, 60, 0, 0, 0, 0, 0, 0, /* º */ + 0, 0, 0, 0, 0, 80, 40, 20, 10, 20, 40, 80, 0, 0, /* » */ + 0, 0, 32, 98, 36, 36, 40, 18, 22, 42, 78, 66, 0, 0, /* ¼ */ + 0, 0, 32, 98, 36, 36, 40, 20, 26, 34, 68, 78, 0, 0, /* ½ */ + 0, 0, 98, 18, 36, 24, 104, 18, 38, 42, 78, 2, 0, 0, /* ¾ */ + 0, 0, 0, 16, 16, 0, 16, 16, 16, 16, 32, 66, 66, 60, /* ¿ */ + 16, 8, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* À */ + 8, 16, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Á */ + 24, 36, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Â */ + 50, 76, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Ã */ + 0, 36, 0, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Ä */ + 0, 24, 36, 24, 36, 66, 66, 126, 66, 66, 66, 66, 0, 0, /* Å */ + 0, 0, 30, 40, 72, 72, 126, 72, 72, 72, 72, 78, 0, 0, /* Æ */ + 0, 0, 60, 66, 66, 64, 64, 64, 64, 66, 66, 60, 8, 16, /* Ç */ + 16, 8, 0, 126, 64, 64, 64, 124, 64, 64, 64, 126, 0, 0, /* È */ + 8, 16, 0, 126, 64, 64, 64, 124, 64, 64, 64, 126, 0, 0, /* É */ + 24, 36, 0, 126, 64, 64, 64, 124, 64, 64, 64, 126, 0, 0, /* Ê */ + 0, 36, 0, 126, 64, 64, 64, 124, 64, 64, 64, 126, 0, 0, /* Ë */ + 16, 8, 0, 62, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* Ì */ + 4, 8, 0, 62, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* Í */ + 8, 20, 0, 62, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* Î */ + 0, 20, 0, 62, 8, 8, 8, 8, 8, 8, 8, 62, 0, 0, /* Ï */ + 0, 0, 60, 34, 33, 33, 121, 33, 33, 33, 34, 60, 0, 0, /* Ð */ + 50, 76, 0, 98, 98, 82, 82, 74, 74, 74, 70, 70, 0, 0, /* Ñ */ + 16, 8, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ò */ + 8, 16, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ó */ + 24, 36, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ô */ + 50, 76, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Õ */ + 0, 36, 0, 60, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ö */ + 0, 0, 0, 0, 0, 65, 34, 20, 8, 20, 34, 65, 0, 0, /* × */ + 2, 2, 60, 70, 74, 74, 74, 82, 82, 82, 98, 60, 64, 64, /* Ø */ + 16, 8, 0, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ù */ + 8, 16, 0, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ú */ + 24, 36, 0, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Û */ + 0, 36, 0, 66, 66, 66, 66, 66, 66, 66, 66, 60, 0, 0, /* Ü */ + 4, 8, 0, 34, 34, 20, 20, 8, 8, 8, 8, 8, 0, 0, /* Ý */ + 0, 0, 64, 64, 124, 66, 66, 66, 66, 124, 64, 64, 0, 0, /* Þ */ + 0, 0, 24, 36, 36, 36, 56, 36, 34, 34, 34, 124, 0, 0, /* ß */ + 0, 0, 16, 8, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* à */ + 0, 0, 4, 8, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* á */ + 0, 0, 24, 36, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* â */ + 0, 0, 50, 76, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* ã */ + 0, 0, 0, 36, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* ä */ + 0, 24, 36, 24, 0, 60, 66, 14, 50, 66, 70, 58, 0, 0, /* å */ + 0, 0, 0, 0, 0, 62, 73, 25, 47, 72, 73, 62, 0, 0, /* æ */ + 0, 0, 0, 0, 0, 60, 66, 64, 64, 64, 66, 60, 8, 16, /* ç */ + 0, 0, 16, 8, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* è */ + 0, 0, 8, 16, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* é */ + 0, 0, 24, 36, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* ê */ + 0, 0, 0, 36, 0, 60, 66, 66, 126, 64, 66, 60, 0, 0, /* ë */ + 0, 0, 16, 8, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* ì */ + 0, 0, 4, 8, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* í */ + 0, 0, 24, 36, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* î */ + 0, 0, 0, 20, 0, 24, 8, 8, 8, 8, 8, 62, 0, 0, /* ï */ + 0, 20, 8, 20, 2, 30, 34, 34, 34, 34, 34, 28, 0, 0, /* ð */ + 0, 0, 50, 76, 0, 92, 98, 66, 66, 66, 66, 66, 0, 0, /* ñ */ + 0, 0, 16, 8, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* ò */ + 0, 0, 8, 16, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* ó */ + 0, 0, 24, 36, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* ô */ + 0, 0, 50, 76, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* õ */ + 0, 0, 0, 36, 0, 60, 66, 66, 66, 66, 66, 60, 0, 0, /* ö */ + 0, 0, 0, 0, 0, 0, 0, 24, 0, 126, 0, 24, 0, 0, /* ÷ */ + 0, 0, 0, 2, 4, 60, 74, 74, 82, 82, 98, 60, 64, 64, /* ø */ + 0, 0, 16, 8, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* ù */ + 0, 0, 8, 16, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* ú */ + 0, 0, 24, 36, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* û */ + 0, 0, 0, 36, 0, 66, 66, 66, 66, 66, 70, 58, 0, 0, /* ü */ + 0, 0, 8, 16, 0, 66, 66, 34, 36, 20, 28, 8, 72, 48, /* ý */ + 0, 0, 64, 64, 64, 92, 98, 66, 66, 66, 98, 92, 64, 64, /* þ */ + 0, 0, 0, 36, 0, 66, 66, 34, 36, 20, 28, 8, 72, 48, /* ÿ */ +}; + +static const char small_font[] = { + /* Each character is 5 x 9 pixels */ + 0, 2, 2, 2, 2, 0, 2, 0, 0, /* ! */ + 0, 5, 5, 5, 0, 0, 0, 0, 0, /* " */ + 0, 0, 5, 15, 5, 15, 5, 0, 0, /* # */ + 0, 0, 7, 26, 7, 18, 7, 0, 0, /* $ */ + 0, 8, 9, 2, 4, 25, 1, 0, 0, /* % */ + 0, 0, 4, 10, 4, 10, 5, 0, 0, /* & */ + 0, 2, 2, 2, 0, 0, 0, 0, 0, /* ' */ + 0, 2, 4, 4, 4, 4, 2, 0, 0, /* ( */ + 0, 4, 2, 2, 2, 2, 4, 0, 0, /* ) */ + 0, 0, 5, 2, 7, 2, 5, 0, 0, /* * */ + 0, 0, 2, 2, 15, 2, 2, 0, 0, /* + */ + 0, 0, 0, 0, 16, 3, 2, 4, 0, /* , */ + 0, 0, 0, 0, 15, 0, 0, 0, 0, /* - */ + 0, 0, 0, 0, 0, 6, 6, 0, 0, /* . */ + 0, 0, 1, 2, 4, 8, 0, 0, 0, /* / */ + 0, 2, 5, 5, 5, 5, 2, 0, 0, /* 0 */ + 0, 2, 6, 2, 2, 2, 7, 0, 0, /* 1 */ + 0, 6, 9, 1, 2, 4, 15, 0, 0, /* 2 */ + 0, 15, 1, 6, 1, 9, 6, 0, 0, /* 3 */ + 0, 2, 6, 10, 15, 2, 2, 0, 0, /* 4 */ + 0, 15, 8, 14, 1, 9, 6, 0, 0, /* 5 */ + 0, 6, 8, 14, 9, 9, 6, 0, 0, /* 6 */ + 0, 15, 1, 2, 2, 4, 4, 0, 0, /* 7 */ + 0, 6, 9, 6, 9, 9, 6, 0, 0, /* 8 */ + 0, 6, 9, 9, 7, 1, 6, 0, 0, /* 9 */ + 0, 0, 6, 6, 0, 6, 6, 0, 0, /* : */ + 0, 0, 6, 6, 0, 6, 4, 8, 0, /* ; */ + 0, 0, 1, 2, 4, 2, 1, 0, 0, /* < */ + 0, 0, 0, 15, 0, 15, 0, 0, 0, /* = */ + 0, 0, 4, 2, 1, 2, 4, 0, 0, /* > */ + 0, 2, 5, 1, 2, 0, 2, 0, 0, /* ? */ + 0, 6, 9, 11, 11, 8, 6, 0, 0, /* @ */ + 0, 6, 9, 9, 15, 9, 9, 0, 0, /* A */ + 0, 14, 9, 14, 9, 9, 14, 0, 0, /* B */ + 0, 6, 9, 8, 8, 9, 6, 0, 0, /* C */ + 0, 14, 9, 9, 9, 9, 14, 0, 0, /* D */ + 0, 15, 8, 14, 8, 8, 15, 0, 0, /* E */ + 0, 15, 8, 14, 8, 8, 8, 0, 0, /* F */ + 0, 6, 9, 8, 11, 9, 7, 0, 0, /* G */ + 0, 9, 9, 15, 9, 9, 9, 0, 0, /* H */ + 0, 7, 2, 2, 2, 2, 7, 0, 0, /* I */ + 0, 1, 1, 1, 1, 9, 6, 0, 0, /* J */ + 0, 9, 10, 12, 12, 10, 9, 0, 0, /* K */ + 0, 8, 8, 8, 8, 8, 15, 0, 0, /* L */ + 0, 9, 15, 15, 9, 9, 9, 0, 0, /* M */ + 0, 9, 13, 13, 11, 11, 9, 0, 0, /* N */ + 0, 6, 9, 9, 9, 9, 6, 0, 0, /* O */ + 0, 14, 9, 9, 14, 8, 8, 0, 0, /* P */ + 0, 6, 9, 9, 9, 13, 6, 1, 0, /* Q */ + 0, 14, 9, 9, 14, 10, 9, 0, 0, /* R */ + 0, 6, 9, 4, 2, 9, 6, 0, 0, /* S */ + 0, 7, 2, 2, 2, 2, 2, 0, 0, /* T */ + 0, 9, 9, 9, 9, 9, 6, 0, 0, /* U */ + 0, 9, 9, 9, 9, 6, 6, 0, 0, /* V */ + 0, 9, 9, 9, 15, 15, 9, 0, 0, /* W */ + 0, 9, 9, 6, 6, 9, 9, 0, 0, /* X */ + 0, 5, 5, 5, 2, 2, 2, 0, 0, /* Y */ + 0, 15, 1, 2, 4, 8, 15, 0, 0, /* Z */ + 0, 7, 4, 4, 4, 4, 7, 0, 0, /* [ */ + 0, 0, 8, 4, 2, 1, 0, 0, 0, /* \ */ + 0, 7, 1, 1, 1, 1, 7, 0, 0, /* ] */ + 0, 2, 5, 0, 0, 0, 0, 0, 0, /* ^ */ + 0, 0, 0, 0, 0, 0, 15, 0, 0, /* _ */ + 0, 4, 2, 0, 0, 0, 0, 0, 0, /* ` */ + 0, 0, 0, 7, 9, 11, 5, 0, 0, /* a */ + 0, 8, 8, 14, 9, 9, 14, 0, 0, /* b */ + 0, 0, 0, 6, 8, 8, 6, 0, 0, /* c */ + 0, 1, 1, 7, 9, 9, 7, 0, 0, /* d */ + 0, 0, 0, 6, 11, 12, 6, 0, 0, /* e */ + 0, 2, 5, 4, 14, 4, 4, 0, 0, /* f */ + 0, 0, 0, 7, 9, 6, 8, 7, 0, /* g */ + 0, 8, 8, 14, 9, 9, 9, 0, 0, /* h */ + 0, 2, 0, 6, 2, 2, 7, 0, 0, /* i */ + 0, 1, 0, 1, 1, 1, 5, 2, 0, /* j */ + 0, 8, 8, 10, 12, 10, 9, 0, 0, /* k */ + 0, 6, 2, 2, 2, 2, 7, 0, 0, /* l */ + 0, 0, 0, 10, 15, 9, 9, 0, 0, /* m */ + 0, 0, 0, 14, 9, 9, 9, 0, 0, /* n */ + 0, 0, 0, 6, 9, 9, 6, 0, 0, /* o */ + 0, 0, 0, 14, 9, 9, 14, 8, 0, /* p */ + 0, 0, 0, 7, 9, 9, 7, 1, 0, /* q */ + 0, 0, 0, 14, 9, 8, 8, 0, 0, /* r */ + 0, 0, 0, 7, 12, 3, 14, 0, 0, /* s */ + 0, 4, 4, 14, 4, 4, 3, 0, 0, /* t */ + 0, 0, 0, 9, 9, 9, 7, 0, 0, /* u */ + 0, 0, 0, 5, 5, 5, 2, 0, 0, /* v */ + 0, 0, 0, 9, 9, 15, 15, 0, 0, /* w */ + 0, 0, 0, 9, 6, 6, 9, 0, 0, /* x */ + 0, 0, 0, 9, 9, 5, 2, 4, 0, /* y */ + 0, 0, 0, 15, 2, 4, 15, 0, 0, /* z */ + 0, 1, 2, 6, 2, 2, 1, 0, 0, /* { */ + 0, 2, 2, 2, 2, 2, 2, 0, 0, /* | */ + 0, 4, 2, 3, 2, 2, 4, 0, 0, /* } */ + 0, 5, 10, 0, 0, 0, 0, 0, 0, /* ~ */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, /*  */ + 0, 2, 0, 2, 2, 2, 2, 0, 0, /* ¡ */ + 0, 0, 2, 7, 10, 10, 7, 2, 0, /* ¢ */ + 0, 0, 3, 4, 14, 4, 11, 0, 0, /* £ */ + 0, 0, 8, 7, 5, 7, 8, 0, 0, /* ¤ */ + 0, 5, 21, 2, 7, 2, 18, 0, 0, /* ¥ */ + 0, 0, 2, 2, 0, 2, 2, 0, 0, /* ¦ */ + 0, 3, 4, 6, 5, 3, 1, 6, 0, /* § */ + 0, 5, 0, 0, 0, 0, 0, 0, 0, /* ¨ */ + 0, 7, 8, 10, 12, 10, 8, 7, 0, /* © */ + 0, 6, 26, 22, 16, 16, 16, 0, 0, /* ª */ + 0, 0, 0, 4, 9, 4, 0, 0, 0, /* « */ + 0, 0, 0, 16, 15, 17, 0, 0, 0, /* ¬ */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, /* ­ */ + 0, 7, 8, 14, 12, 12, 8, 7, 0, /* ® */ + 0, 15, 16, 16, 16, 16, 16, 0, 0, /* ¯ */ + 0, 2, 5, 2, 0, 0, 0, 0, 0, /* ° */ + 0, 2, 2, 15, 2, 2, 15, 0, 0, /* ± */ + 0, 6, 2, 20, 6, 0, 16, 0, 0, /* ² */ + 0, 6, 6, 2, 6, 0, 0, 0, 0, /* ³ */ + 0, 2, 4, 0, 0, 0, 0, 0, 0, /* ´ */ + 0, 0, 0, 9, 9, 9, 14, 8, 0, /* µ */ + 0, 7, 13, 13, 5, 5, 5, 0, 0, /* ¶ */ + 0, 0, 0, 6, 6, 0, 0, 0, 0, /* · */ + 0, 0, 0, 0, 0, 0, 2, 4, 0, /* ¸ */ + 0, 2, 6, 2, 7, 0, 0, 0, 0, /* ¹ */ + 0, 4, 10, 4, 0, 0, 0, 0, 0, /* º */ + 0, 0, 0, 9, 4, 9, 0, 0, 0, /* » */ + 0, 8, 8, 8, 25, 3, 7, 1, 0, /* ¼ */ + 0, 8, 8, 8, 11, 1, 2, 3, 0, /* ½ */ + 0, 12, 12, 4, 13, 3, 7, 1, 0, /* ¾ */ + 0, 2, 0, 2, 4, 5, 2, 0, 0, /* ¿ */ + 0, 6, 9, 9, 15, 9, 9, 0, 0, /* À */ + 0, 6, 9, 9, 15, 9, 9, 0, 0, /* Á */ + 0, 6, 9, 9, 15, 9, 9, 0, 0, /* Â */ + 0, 6, 9, 9, 15, 9, 9, 0, 0, /* Ã */ + 0, 9, 6, 9, 15, 9, 9, 0, 0, /* Ä */ + 0, 6, 6, 9, 15, 9, 9, 0, 0, /* Å */ + 0, 7, 10, 11, 14, 10, 11, 0, 0, /* Æ */ + 0, 6, 9, 8, 8, 9, 6, 4, 0, /* Ç */ + 0, 15, 8, 14, 8, 8, 15, 0, 0, /* È */ + 0, 15, 8, 14, 8, 8, 15, 0, 0, /* É */ + 0, 15, 8, 14, 8, 8, 15, 0, 0, /* Ê */ + 0, 15, 8, 14, 8, 8, 15, 0, 0, /* Ë */ + 0, 7, 2, 2, 2, 2, 7, 0, 0, /* Ì */ + 0, 7, 2, 2, 2, 2, 7, 0, 0, /* Í */ + 0, 7, 2, 2, 2, 2, 7, 0, 0, /* Î */ + 0, 7, 2, 2, 2, 2, 7, 0, 0, /* Ï */ + 0, 14, 5, 13, 5, 5, 14, 0, 0, /* Ð */ + 0, 11, 9, 13, 11, 11, 9, 0, 0, /* Ñ */ + 0, 6, 9, 9, 9, 9, 6, 0, 0, /* Ò */ + 0, 6, 9, 9, 9, 9, 6, 0, 0, /* Ó */ + 0, 6, 9, 9, 9, 9, 6, 0, 0, /* Ô */ + 0, 6, 9, 9, 9, 9, 6, 0, 0, /* Õ */ + 0, 9, 6, 9, 9, 9, 6, 0, 0, /* Ö */ + 0, 0, 0, 9, 6, 6, 9, 0, 0, /* × */ + 0, 7, 11, 11, 13, 13, 14, 0, 0, /* Ø */ + 0, 9, 9, 9, 9, 9, 6, 0, 0, /* Ù */ + 0, 9, 9, 9, 9, 9, 6, 0, 0, /* Ú */ + 0, 9, 9, 9, 9, 9, 6, 0, 0, /* Û */ + 0, 9, 0, 9, 9, 9, 6, 0, 0, /* Ü */ + 0, 5, 5, 5, 2, 2, 2, 0, 0, /* Ý */ + 0, 8, 14, 9, 14, 8, 8, 0, 0, /* Þ */ + 0, 6, 9, 10, 9, 9, 10, 0, 0, /* ß */ + 0, 4, 2, 7, 9, 11, 5, 0, 0, /* à */ + 0, 2, 4, 7, 9, 11, 5, 0, 0, /* á */ + 0, 2, 5, 7, 9, 11, 5, 0, 0, /* â */ + 0, 5, 10, 7, 9, 11, 5, 0, 0, /* ã */ + 0, 5, 0, 7, 9, 11, 5, 0, 0, /* ä */ + 0, 6, 6, 7, 9, 11, 5, 0, 0, /* å */ + 0, 0, 0, 7, 11, 10, 7, 0, 0, /* æ */ + 0, 0, 0, 3, 4, 4, 3, 2, 0, /* ç */ + 0, 4, 2, 6, 11, 12, 6, 0, 0, /* è */ + 0, 2, 4, 6, 11, 12, 6, 0, 0, /* é */ + 0, 4, 10, 6, 11, 12, 6, 0, 0, /* ê */ + 0, 10, 0, 6, 11, 12, 6, 0, 0, /* ë */ + 0, 4, 2, 6, 2, 2, 7, 0, 0, /* ì */ + 0, 2, 4, 6, 2, 2, 7, 0, 0, /* í */ + 0, 2, 5, 6, 2, 2, 7, 0, 0, /* î */ + 0, 5, 0, 6, 2, 2, 7, 0, 0, /* ï */ + 0, 4, 3, 6, 9, 9, 6, 0, 0, /* ð */ + 0, 5, 10, 14, 9, 9, 9, 0, 0, /* ñ */ + 0, 4, 2, 6, 9, 9, 6, 0, 0, /* ò */ + 0, 2, 4, 6, 9, 9, 6, 0, 0, /* ó */ + 0, 6, 0, 6, 9, 9, 6, 0, 0, /* ô */ + 0, 5, 10, 6, 9, 9, 6, 0, 0, /* õ */ + 0, 5, 0, 6, 9, 9, 6, 0, 0, /* ö */ + 0, 0, 6, 0, 15, 0, 6, 0, 0, /* ÷ */ + 0, 0, 0, 7, 11, 13, 14, 0, 0, /* ø */ + 0, 4, 2, 9, 9, 9, 7, 0, 0, /* ù */ + 0, 2, 4, 9, 9, 9, 7, 0, 0, /* ú */ + 0, 6, 0, 9, 9, 9, 7, 0, 0, /* û */ + 0, 5, 0, 9, 9, 9, 7, 0, 0, /* ü */ + 0, 2, 4, 9, 9, 5, 2, 4, 0, /* ý */ + 0, 0, 8, 14, 9, 9, 14, 8, 0, /* þ */ + 0, 5, 0, 9, 9, 5, 2, 4, 0, /* ÿ */ +}; diff --git a/3rdparty/zint-2.6.1/backend/gb18030.h b/3rdparty/zint-2.6.1/backend/gb18030.h new file mode 100644 index 0000000..131aab9 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/gb18030.h @@ -0,0 +1,23324 @@ +/* gb18030.h - Unicode to GB 18030 lookup table + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +static const unsigned short int gb18030_twobyte_lookup[] = { + 0x0144, 0xA8BD, + 0x0148, 0xA8BE, + 0x01F9, 0xA8BF, + 0x0251, 0xA8BB, + 0x0261, 0xA8C0, + 0x02CA, 0xA840, + 0x02CB, 0xA841, + 0x02D9, 0xA842, + 0x2010, 0xA95C, + 0x2013, 0xA843, + 0x2015, 0xA844, + 0x2025, 0xA845, + 0x2035, 0xA846, + 0x20AC, 0xA2E3, + 0x2105, 0xA847, + 0x2109, 0xA848, + 0x2121, 0xA959, + 0x2170, 0xA2A1, + 0x2171, 0xA2A2, + 0x2172, 0xA2A3, + 0x2173, 0xA2A4, + 0x2174, 0xA2A5, + 0x2175, 0xA2A6, + 0x2176, 0xA2A7, + 0x2177, 0xA2A8, + 0x2178, 0xA2A9, + 0x2179, 0xA2AA, + 0x2196, 0xA849, + 0x2197, 0xA84A, + 0x2198, 0xA84B, + 0x2199, 0xA84C, + 0x2215, 0xA84D, + 0x221F, 0xA84E, + 0x2223, 0xA84F, + 0x2252, 0xA850, + 0x2266, 0xA851, + 0x2267, 0xA852, + 0x2295, 0xA892, + 0x22BF, 0xA853, + 0x2550, 0xA854, + 0x2551, 0xA855, + 0x2552, 0xA856, + 0x2553, 0xA857, + 0x2554, 0xA858, + 0x2555, 0xA859, + 0x2556, 0xA85A, + 0x2557, 0xA85B, + 0x2558, 0xA85C, + 0x2559, 0xA85D, + 0x255A, 0xA85E, + 0x255B, 0xA85F, + 0x255C, 0xA860, + 0x255D, 0xA861, + 0x255E, 0xA862, + 0x255F, 0xA863, + 0x2560, 0xA864, + 0x2561, 0xA865, + 0x2562, 0xA866, + 0x2563, 0xA867, + 0x2564, 0xA868, + 0x2565, 0xA869, + 0x2566, 0xA86A, + 0x2567, 0xA86B, + 0x2568, 0xA86C, + 0x2569, 0xA86D, + 0x256A, 0xA86E, + 0x256B, 0xA86F, + 0x256C, 0xA870, + 0x256D, 0xA871, + 0x256E, 0xA872, + 0x256F, 0xA873, + 0x2570, 0xA874, + 0x2571, 0xA875, + 0x2572, 0xA876, + 0x2573, 0xA877, + 0x2581, 0xA878, + 0x2582, 0xA879, + 0x2583, 0xA87A, + 0x2584, 0xA87B, + 0x2585, 0xA87C, + 0x2586, 0xA87D, + 0x2587, 0xA87E, + 0x2588, 0xA880, + 0x2589, 0xA881, + 0x258A, 0xA882, + 0x258B, 0xA883, + 0x258C, 0xA884, + 0x258D, 0xA885, + 0x258E, 0xA886, + 0x258F, 0xA887, + 0x2593, 0xA888, + 0x2594, 0xA889, + 0x2595, 0xA88A, + 0x25BC, 0xA88B, + 0x25BD, 0xA88C, + 0x25E2, 0xA88D, + 0x25E3, 0xA88E, + 0x25E4, 0xA88F, + 0x25E5, 0xA890, + 0x2609, 0xA891, + 0x2E81, 0xFE50, + 0x2E84, 0xFE54, + 0x2E88, 0xFE57, + 0x2E8B, 0xFE58, + 0x2E8C, 0xFE5D, + 0x2E97, 0xFE5E, + 0x2EA7, 0xFE6B, + 0x2EAA, 0xFE6E, + 0x2EAE, 0xFE71, + 0x2EB3, 0xFE73, + 0x2EB6, 0xFE74, + 0x2EB7, 0xFE75, + 0x2EBB, 0xFE79, + 0x2ECA, 0xFE84, + 0x2FF0, 0xA98A, + 0x2FF1, 0xA98B, + 0x2FF2, 0xA98C, + 0x2FF3, 0xA98D, + 0x2FF4, 0xA98E, + 0x2FF5, 0xA98F, + 0x2FF6, 0xA990, + 0x2FF7, 0xA991, + 0x2FF8, 0xA992, + 0x2FF9, 0xA993, + 0x2FFA, 0xA994, + 0x2FFB, 0xA995, + 0x3006, 0xA965, + 0x3007, 0xA996, + 0x3012, 0xA893, + 0x301D, 0xA894, + 0x301E, 0xA895, + 0x3021, 0xA940, + 0x3022, 0xA941, + 0x3023, 0xA942, + 0x3024, 0xA943, + 0x3025, 0xA944, + 0x3026, 0xA945, + 0x3027, 0xA946, + 0x3028, 0xA947, + 0x3029, 0xA948, + 0x303E, 0xA989, + 0x309B, 0xA961, + 0x309C, 0xA962, + 0x309D, 0xA966, + 0x309E, 0xA967, + 0x30FC, 0xA960, + 0x30FD, 0xA963, + 0x30FE, 0xA964, + 0x3231, 0xA95A, + 0x32A3, 0xA949, + 0x338E, 0xA94A, + 0x338F, 0xA94B, + 0x339C, 0xA94C, + 0x339D, 0xA94D, + 0x339E, 0xA94E, + 0x33A1, 0xA94F, + 0x33C4, 0xA950, + 0x33CE, 0xA951, + 0x33D1, 0xA952, + 0x33D2, 0xA953, + 0x33D5, 0xA954, + 0x3447, 0xFE56, + 0x3473, 0xFE55, + 0x359E, 0xFE5A, + 0x360E, 0xFE5C, + 0x361A, 0xFE5B, + 0x3918, 0xFE60, + 0x396E, 0xFE5F, + 0x39CF, 0xFE62, + 0x39D0, 0xFE65, + 0x39DF, 0xFE63, + 0x3A73, 0xFE64, + 0x3B4E, 0xFE68, + 0x3C6E, 0xFE69, + 0x3CE0, 0xFE6A, + 0x4056, 0xFE6F, + 0x415F, 0xFE70, + 0x4337, 0xFE72, + 0x43AC, 0xFE78, + 0x43B1, 0xFE77, + 0x43DD, 0xFE7A, + 0x44D6, 0xFE7B, + 0x464C, 0xFE7D, + 0x4661, 0xFE7C, + 0x4723, 0xFE80, + 0x4729, 0xFE81, + 0x477C, 0xFE82, + 0x478D, 0xFE83, + 0x4947, 0xFE85, + 0x497A, 0xFE86, + 0x497D, 0xFE87, + 0x4982, 0xFE88, + 0x4983, 0xFE89, + 0x4985, 0xFE8A, + 0x4986, 0xFE8B, + 0x499B, 0xFE8D, + 0x499F, 0xFE8C, + 0x49B6, 0xFE8F, + 0x49B7, 0xFE8E, + 0x4C77, 0xFE96, + 0x4C9F, 0xFE93, + 0x4CA0, 0xFE94, + 0x4CA1, 0xFE95, + 0x4CA2, 0xFE97, + 0x4CA3, 0xFE92, + 0x4D13, 0xFE98, + 0x4D14, 0xFE99, + 0x4D15, 0xFE9A, + 0x4D16, 0xFE9B, + 0x4D17, 0xFE9C, + 0x4D18, 0xFE9D, + 0x4D19, 0xFE9E, + 0x4DAE, 0xFE9F, + 0x4E02, 0x8140, + 0x4E04, 0x8141, + 0x4E05, 0x8142, + 0x4E06, 0x8143, + 0x4E0F, 0x8144, + 0x4E12, 0x8145, + 0x4E17, 0x8146, + 0x4E1F, 0x8147, + 0x4E20, 0x8148, + 0x4E21, 0x8149, + 0x4E23, 0x814A, + 0x4E26, 0x814B, + 0x4E29, 0x814C, + 0x4E2E, 0x814D, + 0x4E2F, 0x814E, + 0x4E31, 0x814F, + 0x4E33, 0x8150, + 0x4E35, 0x8151, + 0x4E37, 0x8152, + 0x4E3C, 0x8153, + 0x4E40, 0x8154, + 0x4E41, 0x8155, + 0x4E42, 0x8156, + 0x4E44, 0x8157, + 0x4E46, 0x8158, + 0x4E4A, 0x8159, + 0x4E51, 0x815A, + 0x4E55, 0x815B, + 0x4E57, 0x815C, + 0x4E5A, 0x815D, + 0x4E5B, 0x815E, + 0x4E62, 0x815F, + 0x4E63, 0x8160, + 0x4E64, 0x8161, + 0x4E65, 0x8162, + 0x4E67, 0x8163, + 0x4E68, 0x8164, + 0x4E6A, 0x8165, + 0x4E6B, 0x8166, + 0x4E6C, 0x8167, + 0x4E6D, 0x8168, + 0x4E6E, 0x8169, + 0x4E6F, 0x816A, + 0x4E72, 0x816B, + 0x4E74, 0x816C, + 0x4E75, 0x816D, + 0x4E76, 0x816E, + 0x4E77, 0x816F, + 0x4E78, 0x8170, + 0x4E79, 0x8171, + 0x4E7A, 0x8172, + 0x4E7B, 0x8173, + 0x4E7C, 0x8174, + 0x4E7D, 0x8175, + 0x4E7F, 0x8176, + 0x4E80, 0x8177, + 0x4E81, 0x8178, + 0x4E82, 0x8179, + 0x4E83, 0x817A, + 0x4E84, 0x817B, + 0x4E85, 0x817C, + 0x4E87, 0x817D, + 0x4E8A, 0x817E, + 0x4E90, 0x8180, + 0x4E96, 0x8181, + 0x4E97, 0x8182, + 0x4E99, 0x8183, + 0x4E9C, 0x8184, + 0x4E9D, 0x8185, + 0x4E9E, 0x8186, + 0x4EA3, 0x8187, + 0x4EAA, 0x8188, + 0x4EAF, 0x8189, + 0x4EB0, 0x818A, + 0x4EB1, 0x818B, + 0x4EB4, 0x818C, + 0x4EB6, 0x818D, + 0x4EB7, 0x818E, + 0x4EB8, 0x818F, + 0x4EB9, 0x8190, + 0x4EBC, 0x8191, + 0x4EBD, 0x8192, + 0x4EBE, 0x8193, + 0x4EC8, 0x8194, + 0x4ECC, 0x8195, + 0x4ECF, 0x8196, + 0x4ED0, 0x8197, + 0x4ED2, 0x8198, + 0x4EDA, 0x8199, + 0x4EDB, 0x819A, + 0x4EDC, 0x819B, + 0x4EE0, 0x819C, + 0x4EE2, 0x819D, + 0x4EE6, 0x819E, + 0x4EE7, 0x819F, + 0x4EE9, 0x81A0, + 0x4EED, 0x81A1, + 0x4EEE, 0x81A2, + 0x4EEF, 0x81A3, + 0x4EF1, 0x81A4, + 0x4EF4, 0x81A5, + 0x4EF8, 0x81A6, + 0x4EF9, 0x81A7, + 0x4EFA, 0x81A8, + 0x4EFC, 0x81A9, + 0x4EFE, 0x81AA, + 0x4F00, 0x81AB, + 0x4F02, 0x81AC, + 0x4F03, 0x81AD, + 0x4F04, 0x81AE, + 0x4F05, 0x81AF, + 0x4F06, 0x81B0, + 0x4F07, 0x81B1, + 0x4F08, 0x81B2, + 0x4F0B, 0x81B3, + 0x4F0C, 0x81B4, + 0x4F12, 0x81B5, + 0x4F13, 0x81B6, + 0x4F14, 0x81B7, + 0x4F15, 0x81B8, + 0x4F16, 0x81B9, + 0x4F1C, 0x81BA, + 0x4F1D, 0x81BB, + 0x4F21, 0x81BC, + 0x4F23, 0x81BD, + 0x4F28, 0x81BE, + 0x4F29, 0x81BF, + 0x4F2C, 0x81C0, + 0x4F2D, 0x81C1, + 0x4F2E, 0x81C2, + 0x4F31, 0x81C3, + 0x4F33, 0x81C4, + 0x4F35, 0x81C5, + 0x4F37, 0x81C6, + 0x4F39, 0x81C7, + 0x4F3B, 0x81C8, + 0x4F3E, 0x81C9, + 0x4F3F, 0x81CA, + 0x4F40, 0x81CB, + 0x4F41, 0x81CC, + 0x4F42, 0x81CD, + 0x4F44, 0x81CE, + 0x4F45, 0x81CF, + 0x4F47, 0x81D0, + 0x4F48, 0x81D1, + 0x4F49, 0x81D2, + 0x4F4A, 0x81D3, + 0x4F4B, 0x81D4, + 0x4F4C, 0x81D5, + 0x4F52, 0x81D6, + 0x4F54, 0x81D7, + 0x4F56, 0x81D8, + 0x4F61, 0x81D9, + 0x4F62, 0x81DA, + 0x4F66, 0x81DB, + 0x4F68, 0x81DC, + 0x4F6A, 0x81DD, + 0x4F6B, 0x81DE, + 0x4F6D, 0x81DF, + 0x4F6E, 0x81E0, + 0x4F71, 0x81E1, + 0x4F72, 0x81E2, + 0x4F75, 0x81E3, + 0x4F77, 0x81E4, + 0x4F78, 0x81E5, + 0x4F79, 0x81E6, + 0x4F7A, 0x81E7, + 0x4F7D, 0x81E8, + 0x4F80, 0x81E9, + 0x4F81, 0x81EA, + 0x4F82, 0x81EB, + 0x4F85, 0x81EC, + 0x4F86, 0x81ED, + 0x4F87, 0x81EE, + 0x4F8A, 0x81EF, + 0x4F8C, 0x81F0, + 0x4F8E, 0x81F1, + 0x4F90, 0x81F2, + 0x4F92, 0x81F3, + 0x4F93, 0x81F4, + 0x4F95, 0x81F5, + 0x4F96, 0x81F6, + 0x4F98, 0x81F7, + 0x4F99, 0x81F8, + 0x4F9A, 0x81F9, + 0x4F9C, 0x81FA, + 0x4F9E, 0x81FB, + 0x4F9F, 0x81FC, + 0x4FA1, 0x81FD, + 0x4FA2, 0x81FE, + 0x4FA4, 0x8240, + 0x4FAB, 0x8241, + 0x4FAD, 0x8242, + 0x4FB0, 0x8243, + 0x4FB1, 0x8244, + 0x4FB2, 0x8245, + 0x4FB3, 0x8246, + 0x4FB4, 0x8247, + 0x4FB6, 0x8248, + 0x4FB7, 0x8249, + 0x4FB8, 0x824A, + 0x4FB9, 0x824B, + 0x4FBA, 0x824C, + 0x4FBB, 0x824D, + 0x4FBC, 0x824E, + 0x4FBD, 0x824F, + 0x4FBE, 0x8250, + 0x4FC0, 0x8251, + 0x4FC1, 0x8252, + 0x4FC2, 0x8253, + 0x4FC6, 0x8254, + 0x4FC7, 0x8255, + 0x4FC8, 0x8256, + 0x4FC9, 0x8257, + 0x4FCB, 0x8258, + 0x4FCC, 0x8259, + 0x4FCD, 0x825A, + 0x4FD2, 0x825B, + 0x4FD3, 0x825C, + 0x4FD4, 0x825D, + 0x4FD5, 0x825E, + 0x4FD6, 0x825F, + 0x4FD9, 0x8260, + 0x4FDB, 0x8261, + 0x4FE0, 0x8262, + 0x4FE2, 0x8263, + 0x4FE4, 0x8264, + 0x4FE5, 0x8265, + 0x4FE7, 0x8266, + 0x4FEB, 0x8267, + 0x4FEC, 0x8268, + 0x4FF0, 0x8269, + 0x4FF2, 0x826A, + 0x4FF4, 0x826B, + 0x4FF5, 0x826C, + 0x4FF6, 0x826D, + 0x4FF7, 0x826E, + 0x4FF9, 0x826F, + 0x4FFB, 0x8270, + 0x4FFC, 0x8271, + 0x4FFD, 0x8272, + 0x4FFF, 0x8273, + 0x5000, 0x8274, + 0x5001, 0x8275, + 0x5002, 0x8276, + 0x5003, 0x8277, + 0x5004, 0x8278, + 0x5005, 0x8279, + 0x5006, 0x827A, + 0x5007, 0x827B, + 0x5008, 0x827C, + 0x5009, 0x827D, + 0x500A, 0x827E, + 0x500B, 0x8280, + 0x500E, 0x8281, + 0x5010, 0x8282, + 0x5011, 0x8283, + 0x5013, 0x8284, + 0x5015, 0x8285, + 0x5016, 0x8286, + 0x5017, 0x8287, + 0x501B, 0x8288, + 0x501D, 0x8289, + 0x501E, 0x828A, + 0x5020, 0x828B, + 0x5022, 0x828C, + 0x5023, 0x828D, + 0x5024, 0x828E, + 0x5027, 0x828F, + 0x502B, 0x8290, + 0x502F, 0x8291, + 0x5030, 0x8292, + 0x5031, 0x8293, + 0x5032, 0x8294, + 0x5033, 0x8295, + 0x5034, 0x8296, + 0x5035, 0x8297, + 0x5036, 0x8298, + 0x5037, 0x8299, + 0x5038, 0x829A, + 0x5039, 0x829B, + 0x503B, 0x829C, + 0x503D, 0x829D, + 0x503F, 0x829E, + 0x5040, 0x829F, + 0x5041, 0x82A0, + 0x5042, 0x82A1, + 0x5044, 0x82A2, + 0x5045, 0x82A3, + 0x5046, 0x82A4, + 0x5049, 0x82A5, + 0x504A, 0x82A6, + 0x504B, 0x82A7, + 0x504D, 0x82A8, + 0x5050, 0x82A9, + 0x5051, 0x82AA, + 0x5052, 0x82AB, + 0x5053, 0x82AC, + 0x5054, 0x82AD, + 0x5056, 0x82AE, + 0x5057, 0x82AF, + 0x5058, 0x82B0, + 0x5059, 0x82B1, + 0x505B, 0x82B2, + 0x505D, 0x82B3, + 0x505E, 0x82B4, + 0x505F, 0x82B5, + 0x5060, 0x82B6, + 0x5061, 0x82B7, + 0x5062, 0x82B8, + 0x5063, 0x82B9, + 0x5064, 0x82BA, + 0x5066, 0x82BB, + 0x5067, 0x82BC, + 0x5068, 0x82BD, + 0x5069, 0x82BE, + 0x506A, 0x82BF, + 0x506B, 0x82C0, + 0x506D, 0x82C1, + 0x506E, 0x82C2, + 0x506F, 0x82C3, + 0x5070, 0x82C4, + 0x5071, 0x82C5, + 0x5072, 0x82C6, + 0x5073, 0x82C7, + 0x5074, 0x82C8, + 0x5075, 0x82C9, + 0x5078, 0x82CA, + 0x5079, 0x82CB, + 0x507A, 0x82CC, + 0x507C, 0x82CD, + 0x507D, 0x82CE, + 0x5081, 0x82CF, + 0x5082, 0x82D0, + 0x5083, 0x82D1, + 0x5084, 0x82D2, + 0x5086, 0x82D3, + 0x5087, 0x82D4, + 0x5089, 0x82D5, + 0x508A, 0x82D6, + 0x508B, 0x82D7, + 0x508C, 0x82D8, + 0x508E, 0x82D9, + 0x508F, 0x82DA, + 0x5090, 0x82DB, + 0x5091, 0x82DC, + 0x5092, 0x82DD, + 0x5093, 0x82DE, + 0x5094, 0x82DF, + 0x5095, 0x82E0, + 0x5096, 0x82E1, + 0x5097, 0x82E2, + 0x5098, 0x82E3, + 0x5099, 0x82E4, + 0x509A, 0x82E5, + 0x509B, 0x82E6, + 0x509C, 0x82E7, + 0x509D, 0x82E8, + 0x509E, 0x82E9, + 0x509F, 0x82EA, + 0x50A0, 0x82EB, + 0x50A1, 0x82EC, + 0x50A2, 0x82ED, + 0x50A4, 0x82EE, + 0x50A6, 0x82EF, + 0x50AA, 0x82F0, + 0x50AB, 0x82F1, + 0x50AD, 0x82F2, + 0x50AE, 0x82F3, + 0x50AF, 0x82F4, + 0x50B0, 0x82F5, + 0x50B1, 0x82F6, + 0x50B3, 0x82F7, + 0x50B4, 0x82F8, + 0x50B5, 0x82F9, + 0x50B6, 0x82FA, + 0x50B7, 0x82FB, + 0x50B8, 0x82FC, + 0x50B9, 0x82FD, + 0x50BC, 0x82FE, + 0x50BD, 0x8340, + 0x50BE, 0x8341, + 0x50BF, 0x8342, + 0x50C0, 0x8343, + 0x50C1, 0x8344, + 0x50C2, 0x8345, + 0x50C3, 0x8346, + 0x50C4, 0x8347, + 0x50C5, 0x8348, + 0x50C6, 0x8349, + 0x50C7, 0x834A, + 0x50C8, 0x834B, + 0x50C9, 0x834C, + 0x50CA, 0x834D, + 0x50CB, 0x834E, + 0x50CC, 0x834F, + 0x50CD, 0x8350, + 0x50CE, 0x8351, + 0x50D0, 0x8352, + 0x50D1, 0x8353, + 0x50D2, 0x8354, + 0x50D3, 0x8355, + 0x50D4, 0x8356, + 0x50D5, 0x8357, + 0x50D7, 0x8358, + 0x50D8, 0x8359, + 0x50D9, 0x835A, + 0x50DB, 0x835B, + 0x50DC, 0x835C, + 0x50DD, 0x835D, + 0x50DE, 0x835E, + 0x50DF, 0x835F, + 0x50E0, 0x8360, + 0x50E1, 0x8361, + 0x50E2, 0x8362, + 0x50E3, 0x8363, + 0x50E4, 0x8364, + 0x50E5, 0x8365, + 0x50E8, 0x8366, + 0x50E9, 0x8367, + 0x50EA, 0x8368, + 0x50EB, 0x8369, + 0x50EF, 0x836A, + 0x50F0, 0x836B, + 0x50F1, 0x836C, + 0x50F2, 0x836D, + 0x50F4, 0x836E, + 0x50F6, 0x836F, + 0x50F7, 0x8370, + 0x50F8, 0x8371, + 0x50F9, 0x8372, + 0x50FA, 0x8373, + 0x50FC, 0x8374, + 0x50FD, 0x8375, + 0x50FE, 0x8376, + 0x50FF, 0x8377, + 0x5100, 0x8378, + 0x5101, 0x8379, + 0x5102, 0x837A, + 0x5103, 0x837B, + 0x5104, 0x837C, + 0x5105, 0x837D, + 0x5108, 0x837E, + 0x5109, 0x8380, + 0x510A, 0x8381, + 0x510C, 0x8382, + 0x510D, 0x8383, + 0x510E, 0x8384, + 0x510F, 0x8385, + 0x5110, 0x8386, + 0x5111, 0x8387, + 0x5113, 0x8388, + 0x5114, 0x8389, + 0x5115, 0x838A, + 0x5116, 0x838B, + 0x5117, 0x838C, + 0x5118, 0x838D, + 0x5119, 0x838E, + 0x511A, 0x838F, + 0x511B, 0x8390, + 0x511C, 0x8391, + 0x511D, 0x8392, + 0x511E, 0x8393, + 0x511F, 0x8394, + 0x5120, 0x8395, + 0x5122, 0x8396, + 0x5123, 0x8397, + 0x5124, 0x8398, + 0x5125, 0x8399, + 0x5126, 0x839A, + 0x5127, 0x839B, + 0x5128, 0x839C, + 0x5129, 0x839D, + 0x512A, 0x839E, + 0x512B, 0x839F, + 0x512C, 0x83A0, + 0x512D, 0x83A1, + 0x512E, 0x83A2, + 0x512F, 0x83A3, + 0x5130, 0x83A4, + 0x5131, 0x83A5, + 0x5132, 0x83A6, + 0x5133, 0x83A7, + 0x5134, 0x83A8, + 0x5135, 0x83A9, + 0x5136, 0x83AA, + 0x5137, 0x83AB, + 0x5138, 0x83AC, + 0x5139, 0x83AD, + 0x513A, 0x83AE, + 0x513B, 0x83AF, + 0x513C, 0x83B0, + 0x513D, 0x83B1, + 0x513E, 0x83B2, + 0x5142, 0x83B3, + 0x5147, 0x83B4, + 0x514A, 0x83B5, + 0x514C, 0x83B6, + 0x514E, 0x83B7, + 0x514F, 0x83B8, + 0x5150, 0x83B9, + 0x5152, 0x83BA, + 0x5153, 0x83BB, + 0x5157, 0x83BC, + 0x5158, 0x83BD, + 0x5159, 0x83BE, + 0x515B, 0x83BF, + 0x515D, 0x83C0, + 0x515E, 0x83C1, + 0x515F, 0x83C2, + 0x5160, 0x83C3, + 0x5161, 0x83C4, + 0x5163, 0x83C5, + 0x5164, 0x83C6, + 0x5166, 0x83C7, + 0x5167, 0x83C8, + 0x5169, 0x83C9, + 0x516A, 0x83CA, + 0x516F, 0x83CB, + 0x5172, 0x83CC, + 0x517A, 0x83CD, + 0x517E, 0x83CE, + 0x517F, 0x83CF, + 0x5183, 0x83D0, + 0x5184, 0x83D1, + 0x5186, 0x83D2, + 0x5187, 0x83D3, + 0x518A, 0x83D4, + 0x518B, 0x83D5, + 0x518E, 0x83D6, + 0x518F, 0x83D7, + 0x5190, 0x83D8, + 0x5191, 0x83D9, + 0x5193, 0x83DA, + 0x5194, 0x83DB, + 0x5198, 0x83DC, + 0x519A, 0x83DD, + 0x519D, 0x83DE, + 0x519E, 0x83DF, + 0x519F, 0x83E0, + 0x51A1, 0x83E1, + 0x51A3, 0x83E2, + 0x51A6, 0x83E3, + 0x51A7, 0x83E4, + 0x51A8, 0x83E5, + 0x51A9, 0x83E6, + 0x51AA, 0x83E7, + 0x51AD, 0x83E8, + 0x51AE, 0x83E9, + 0x51B4, 0x83EA, + 0x51B8, 0x83EB, + 0x51B9, 0x83EC, + 0x51BA, 0x83ED, + 0x51BE, 0x83EE, + 0x51BF, 0x83EF, + 0x51C1, 0x83F0, + 0x51C2, 0x83F1, + 0x51C3, 0x83F2, + 0x51C5, 0x83F3, + 0x51C8, 0x83F4, + 0x51CA, 0x83F5, + 0x51CD, 0x83F6, + 0x51CE, 0x83F7, + 0x51D0, 0x83F8, + 0x51D2, 0x83F9, + 0x51D3, 0x83FA, + 0x51D4, 0x83FB, + 0x51D5, 0x83FC, + 0x51D6, 0x83FD, + 0x51D7, 0x83FE, + 0x51D8, 0x8440, + 0x51D9, 0x8441, + 0x51DA, 0x8442, + 0x51DC, 0x8443, + 0x51DE, 0x8444, + 0x51DF, 0x8445, + 0x51E2, 0x8446, + 0x51E3, 0x8447, + 0x51E5, 0x8448, + 0x51E6, 0x8449, + 0x51E7, 0x844A, + 0x51E8, 0x844B, + 0x51E9, 0x844C, + 0x51EA, 0x844D, + 0x51EC, 0x844E, + 0x51EE, 0x844F, + 0x51F1, 0x8450, + 0x51F2, 0x8451, + 0x51F4, 0x8452, + 0x51F7, 0x8453, + 0x51FE, 0x8454, + 0x5204, 0x8455, + 0x5205, 0x8456, + 0x5209, 0x8457, + 0x520B, 0x8458, + 0x520C, 0x8459, + 0x520F, 0x845A, + 0x5210, 0x845B, + 0x5213, 0x845C, + 0x5214, 0x845D, + 0x5215, 0x845E, + 0x521C, 0x845F, + 0x521E, 0x8460, + 0x521F, 0x8461, + 0x5221, 0x8462, + 0x5222, 0x8463, + 0x5223, 0x8464, + 0x5225, 0x8465, + 0x5226, 0x8466, + 0x5227, 0x8467, + 0x522A, 0x8468, + 0x522C, 0x8469, + 0x522F, 0x846A, + 0x5231, 0x846B, + 0x5232, 0x846C, + 0x5234, 0x846D, + 0x5235, 0x846E, + 0x523C, 0x846F, + 0x523E, 0x8470, + 0x5244, 0x8471, + 0x5245, 0x8472, + 0x5246, 0x8473, + 0x5247, 0x8474, + 0x5248, 0x8475, + 0x5249, 0x8476, + 0x524B, 0x8477, + 0x524E, 0x8478, + 0x524F, 0x8479, + 0x5252, 0x847A, + 0x5253, 0x847B, + 0x5255, 0x847C, + 0x5257, 0x847D, + 0x5258, 0x847E, + 0x5259, 0x8480, + 0x525A, 0x8481, + 0x525B, 0x8482, + 0x525D, 0x8483, + 0x525F, 0x8484, + 0x5260, 0x8485, + 0x5262, 0x8486, + 0x5263, 0x8487, + 0x5264, 0x8488, + 0x5266, 0x8489, + 0x5268, 0x848A, + 0x526B, 0x848B, + 0x526C, 0x848C, + 0x526D, 0x848D, + 0x526E, 0x848E, + 0x5270, 0x848F, + 0x5271, 0x8490, + 0x5273, 0x8491, + 0x5274, 0x8492, + 0x5275, 0x8493, + 0x5276, 0x8494, + 0x5277, 0x8495, + 0x5278, 0x8496, + 0x5279, 0x8497, + 0x527A, 0x8498, + 0x527B, 0x8499, + 0x527C, 0x849A, + 0x527E, 0x849B, + 0x5280, 0x849C, + 0x5283, 0x849D, + 0x5284, 0x849E, + 0x5285, 0x849F, + 0x5286, 0x84A0, + 0x5287, 0x84A1, + 0x5289, 0x84A2, + 0x528A, 0x84A3, + 0x528B, 0x84A4, + 0x528C, 0x84A5, + 0x528D, 0x84A6, + 0x528E, 0x84A7, + 0x528F, 0x84A8, + 0x5291, 0x84A9, + 0x5292, 0x84AA, + 0x5294, 0x84AB, + 0x5295, 0x84AC, + 0x5296, 0x84AD, + 0x5297, 0x84AE, + 0x5298, 0x84AF, + 0x5299, 0x84B0, + 0x529A, 0x84B1, + 0x529C, 0x84B2, + 0x52A4, 0x84B3, + 0x52A5, 0x84B4, + 0x52A6, 0x84B5, + 0x52A7, 0x84B6, + 0x52AE, 0x84B7, + 0x52AF, 0x84B8, + 0x52B0, 0x84B9, + 0x52B4, 0x84BA, + 0x52B5, 0x84BB, + 0x52B6, 0x84BC, + 0x52B7, 0x84BD, + 0x52B8, 0x84BE, + 0x52B9, 0x84BF, + 0x52BA, 0x84C0, + 0x52BB, 0x84C1, + 0x52BC, 0x84C2, + 0x52BD, 0x84C3, + 0x52C0, 0x84C4, + 0x52C1, 0x84C5, + 0x52C2, 0x84C6, + 0x52C4, 0x84C7, + 0x52C5, 0x84C8, + 0x52C6, 0x84C9, + 0x52C8, 0x84CA, + 0x52CA, 0x84CB, + 0x52CC, 0x84CC, + 0x52CD, 0x84CD, + 0x52CE, 0x84CE, + 0x52CF, 0x84CF, + 0x52D1, 0x84D0, + 0x52D3, 0x84D1, + 0x52D4, 0x84D2, + 0x52D5, 0x84D3, + 0x52D7, 0x84D4, + 0x52D9, 0x84D5, + 0x52DA, 0x84D6, + 0x52DB, 0x84D7, + 0x52DC, 0x84D8, + 0x52DD, 0x84D9, + 0x52DE, 0x84DA, + 0x52E0, 0x84DB, + 0x52E1, 0x84DC, + 0x52E2, 0x84DD, + 0x52E3, 0x84DE, + 0x52E5, 0x84DF, + 0x52E6, 0x84E0, + 0x52E7, 0x84E1, + 0x52E8, 0x84E2, + 0x52E9, 0x84E3, + 0x52EA, 0x84E4, + 0x52EB, 0x84E5, + 0x52EC, 0x84E6, + 0x52ED, 0x84E7, + 0x52EE, 0x84E8, + 0x52EF, 0x84E9, + 0x52F1, 0x84EA, + 0x52F2, 0x84EB, + 0x52F3, 0x84EC, + 0x52F4, 0x84ED, + 0x52F5, 0x84EE, + 0x52F6, 0x84EF, + 0x52F7, 0x84F0, + 0x52F8, 0x84F1, + 0x52FB, 0x84F2, + 0x52FC, 0x84F3, + 0x52FD, 0x84F4, + 0x5301, 0x84F5, + 0x5302, 0x84F6, + 0x5303, 0x84F7, + 0x5304, 0x84F8, + 0x5307, 0x84F9, + 0x5309, 0x84FA, + 0x530A, 0x84FB, + 0x530B, 0x84FC, + 0x530C, 0x84FD, + 0x530E, 0x84FE, + 0x5311, 0x8540, + 0x5312, 0x8541, + 0x5313, 0x8542, + 0x5314, 0x8543, + 0x5318, 0x8544, + 0x531B, 0x8545, + 0x531C, 0x8546, + 0x531E, 0x8547, + 0x531F, 0x8548, + 0x5322, 0x8549, + 0x5324, 0x854A, + 0x5325, 0x854B, + 0x5327, 0x854C, + 0x5328, 0x854D, + 0x5329, 0x854E, + 0x532B, 0x854F, + 0x532C, 0x8550, + 0x532D, 0x8551, + 0x532F, 0x8552, + 0x5330, 0x8553, + 0x5331, 0x8554, + 0x5332, 0x8555, + 0x5333, 0x8556, + 0x5334, 0x8557, + 0x5335, 0x8558, + 0x5336, 0x8559, + 0x5337, 0x855A, + 0x5338, 0x855B, + 0x533C, 0x855C, + 0x533D, 0x855D, + 0x5340, 0x855E, + 0x5342, 0x855F, + 0x5344, 0x8560, + 0x5346, 0x8561, + 0x534B, 0x8562, + 0x534C, 0x8563, + 0x534D, 0x8564, + 0x5350, 0x8565, + 0x5354, 0x8566, + 0x5358, 0x8567, + 0x5359, 0x8568, + 0x535B, 0x8569, + 0x535D, 0x856A, + 0x5365, 0x856B, + 0x5368, 0x856C, + 0x536A, 0x856D, + 0x536C, 0x856E, + 0x536D, 0x856F, + 0x5372, 0x8570, + 0x5376, 0x8571, + 0x5379, 0x8572, + 0x537B, 0x8573, + 0x537C, 0x8574, + 0x537D, 0x8575, + 0x537E, 0x8576, + 0x5380, 0x8577, + 0x5381, 0x8578, + 0x5383, 0x8579, + 0x5387, 0x857A, + 0x5388, 0x857B, + 0x538A, 0x857C, + 0x538E, 0x857D, + 0x538F, 0x857E, + 0x5390, 0x8580, + 0x5391, 0x8581, + 0x5392, 0x8582, + 0x5393, 0x8583, + 0x5394, 0x8584, + 0x5396, 0x8585, + 0x5397, 0x8586, + 0x5399, 0x8587, + 0x539B, 0x8588, + 0x539C, 0x8589, + 0x539E, 0x858A, + 0x53A0, 0x858B, + 0x53A1, 0x858C, + 0x53A4, 0x858D, + 0x53A7, 0x858E, + 0x53AA, 0x858F, + 0x53AB, 0x8590, + 0x53AC, 0x8591, + 0x53AD, 0x8592, + 0x53AF, 0x8593, + 0x53B0, 0x8594, + 0x53B1, 0x8595, + 0x53B2, 0x8596, + 0x53B3, 0x8597, + 0x53B4, 0x8598, + 0x53B5, 0x8599, + 0x53B7, 0x859A, + 0x53B8, 0x859B, + 0x53B9, 0x859C, + 0x53BA, 0x859D, + 0x53BC, 0x859E, + 0x53BD, 0x859F, + 0x53BE, 0x85A0, + 0x53C0, 0x85A1, + 0x53C3, 0x85A2, + 0x53C4, 0x85A3, + 0x53C5, 0x85A4, + 0x53C6, 0x85A5, + 0x53C7, 0x85A6, + 0x53CE, 0x85A7, + 0x53CF, 0x85A8, + 0x53D0, 0x85A9, + 0x53D2, 0x85AA, + 0x53D3, 0x85AB, + 0x53D5, 0x85AC, + 0x53DA, 0x85AD, + 0x53DC, 0x85AE, + 0x53DD, 0x85AF, + 0x53DE, 0x85B0, + 0x53E1, 0x85B1, + 0x53E2, 0x85B2, + 0x53E7, 0x85B3, + 0x53F4, 0x85B4, + 0x53FA, 0x85B5, + 0x53FE, 0x85B6, + 0x53FF, 0x85B7, + 0x5400, 0x85B8, + 0x5402, 0x85B9, + 0x5405, 0x85BA, + 0x5407, 0x85BB, + 0x540B, 0x85BC, + 0x5414, 0x85BD, + 0x5418, 0x85BE, + 0x5419, 0x85BF, + 0x541A, 0x85C0, + 0x541C, 0x85C1, + 0x5422, 0x85C2, + 0x5424, 0x85C3, + 0x5425, 0x85C4, + 0x542A, 0x85C5, + 0x5430, 0x85C6, + 0x5433, 0x85C7, + 0x5436, 0x85C8, + 0x5437, 0x85C9, + 0x543A, 0x85CA, + 0x543D, 0x85CB, + 0x543F, 0x85CC, + 0x5441, 0x85CD, + 0x5442, 0x85CE, + 0x5444, 0x85CF, + 0x5445, 0x85D0, + 0x5447, 0x85D1, + 0x5449, 0x85D2, + 0x544C, 0x85D3, + 0x544D, 0x85D4, + 0x544E, 0x85D5, + 0x544F, 0x85D6, + 0x5451, 0x85D7, + 0x545A, 0x85D8, + 0x545D, 0x85D9, + 0x545E, 0x85DA, + 0x545F, 0x85DB, + 0x5460, 0x85DC, + 0x5461, 0x85DD, + 0x5463, 0x85DE, + 0x5465, 0x85DF, + 0x5467, 0x85E0, + 0x5469, 0x85E1, + 0x546A, 0x85E2, + 0x546B, 0x85E3, + 0x546C, 0x85E4, + 0x546D, 0x85E5, + 0x546E, 0x85E6, + 0x546F, 0x85E7, + 0x5470, 0x85E8, + 0x5474, 0x85E9, + 0x5479, 0x85EA, + 0x547A, 0x85EB, + 0x547E, 0x85EC, + 0x547F, 0x85ED, + 0x5481, 0x85EE, + 0x5483, 0x85EF, + 0x5485, 0x85F0, + 0x5487, 0x85F1, + 0x5488, 0x85F2, + 0x5489, 0x85F3, + 0x548A, 0x85F4, + 0x548D, 0x85F5, + 0x5491, 0x85F6, + 0x5493, 0x85F7, + 0x5497, 0x85F8, + 0x5498, 0x85F9, + 0x549C, 0x85FA, + 0x549E, 0x85FB, + 0x549F, 0x85FC, + 0x54A0, 0x85FD, + 0x54A1, 0x85FE, + 0x54A2, 0x8640, + 0x54A5, 0x8641, + 0x54AE, 0x8642, + 0x54B0, 0x8643, + 0x54B2, 0x8644, + 0x54B5, 0x8645, + 0x54B6, 0x8646, + 0x54B7, 0x8647, + 0x54B9, 0x8648, + 0x54BA, 0x8649, + 0x54BC, 0x864A, + 0x54BE, 0x864B, + 0x54C3, 0x864C, + 0x54C5, 0x864D, + 0x54CA, 0x864E, + 0x54CB, 0x864F, + 0x54D6, 0x8650, + 0x54D8, 0x8651, + 0x54DB, 0x8652, + 0x54E0, 0x8653, + 0x54E1, 0x8654, + 0x54E2, 0x8655, + 0x54E3, 0x8656, + 0x54E4, 0x8657, + 0x54EB, 0x8658, + 0x54EC, 0x8659, + 0x54EF, 0x865A, + 0x54F0, 0x865B, + 0x54F1, 0x865C, + 0x54F4, 0x865D, + 0x54F5, 0x865E, + 0x54F6, 0x865F, + 0x54F7, 0x8660, + 0x54F8, 0x8661, + 0x54F9, 0x8662, + 0x54FB, 0x8663, + 0x54FE, 0x8664, + 0x5500, 0x8665, + 0x5502, 0x8666, + 0x5503, 0x8667, + 0x5504, 0x8668, + 0x5505, 0x8669, + 0x5508, 0x866A, + 0x550A, 0x866B, + 0x550B, 0x866C, + 0x550C, 0x866D, + 0x550D, 0x866E, + 0x550E, 0x866F, + 0x5512, 0x8670, + 0x5513, 0x8671, + 0x5515, 0x8672, + 0x5516, 0x8673, + 0x5517, 0x8674, + 0x5518, 0x8675, + 0x5519, 0x8676, + 0x551A, 0x8677, + 0x551C, 0x8678, + 0x551D, 0x8679, + 0x551E, 0x867A, + 0x551F, 0x867B, + 0x5521, 0x867C, + 0x5525, 0x867D, + 0x5526, 0x867E, + 0x5528, 0x8680, + 0x5529, 0x8681, + 0x552B, 0x8682, + 0x552D, 0x8683, + 0x5532, 0x8684, + 0x5534, 0x8685, + 0x5535, 0x8686, + 0x5536, 0x8687, + 0x5538, 0x8688, + 0x5539, 0x8689, + 0x553A, 0x868A, + 0x553B, 0x868B, + 0x553D, 0x868C, + 0x5540, 0x868D, + 0x5542, 0x868E, + 0x5545, 0x868F, + 0x5547, 0x8690, + 0x5548, 0x8691, + 0x554B, 0x8692, + 0x554C, 0x8693, + 0x554D, 0x8694, + 0x554E, 0x8695, + 0x554F, 0x8696, + 0x5551, 0x8697, + 0x5552, 0x8698, + 0x5553, 0x8699, + 0x5554, 0x869A, + 0x5557, 0x869B, + 0x5558, 0x869C, + 0x5559, 0x869D, + 0x555A, 0x869E, + 0x555B, 0x869F, + 0x555D, 0x86A0, + 0x555E, 0x86A1, + 0x555F, 0x86A2, + 0x5560, 0x86A3, + 0x5562, 0x86A4, + 0x5563, 0x86A5, + 0x5568, 0x86A6, + 0x5569, 0x86A7, + 0x556B, 0x86A8, + 0x556F, 0x86A9, + 0x5570, 0x86AA, + 0x5571, 0x86AB, + 0x5572, 0x86AC, + 0x5573, 0x86AD, + 0x5574, 0x86AE, + 0x5579, 0x86AF, + 0x557A, 0x86B0, + 0x557D, 0x86B1, + 0x557F, 0x86B2, + 0x5585, 0x86B3, + 0x5586, 0x86B4, + 0x558C, 0x86B5, + 0x558D, 0x86B6, + 0x558E, 0x86B7, + 0x5590, 0x86B8, + 0x5592, 0x86B9, + 0x5593, 0x86BA, + 0x5595, 0x86BB, + 0x5596, 0x86BC, + 0x5597, 0x86BD, + 0x559A, 0x86BE, + 0x559B, 0x86BF, + 0x559E, 0x86C0, + 0x55A0, 0x86C1, + 0x55A1, 0x86C2, + 0x55A2, 0x86C3, + 0x55A3, 0x86C4, + 0x55A4, 0x86C5, + 0x55A5, 0x86C6, + 0x55A6, 0x86C7, + 0x55A8, 0x86C8, + 0x55A9, 0x86C9, + 0x55AA, 0x86CA, + 0x55AB, 0x86CB, + 0x55AC, 0x86CC, + 0x55AD, 0x86CD, + 0x55AE, 0x86CE, + 0x55AF, 0x86CF, + 0x55B0, 0x86D0, + 0x55B2, 0x86D1, + 0x55B4, 0x86D2, + 0x55B6, 0x86D3, + 0x55B8, 0x86D4, + 0x55BA, 0x86D5, + 0x55BC, 0x86D6, + 0x55BF, 0x86D7, + 0x55C0, 0x86D8, + 0x55C1, 0x86D9, + 0x55C2, 0x86DA, + 0x55C3, 0x86DB, + 0x55C6, 0x86DC, + 0x55C7, 0x86DD, + 0x55C8, 0x86DE, + 0x55CA, 0x86DF, + 0x55CB, 0x86E0, + 0x55CE, 0x86E1, + 0x55CF, 0x86E2, + 0x55D0, 0x86E3, + 0x55D5, 0x86E4, + 0x55D7, 0x86E5, + 0x55D8, 0x86E6, + 0x55D9, 0x86E7, + 0x55DA, 0x86E8, + 0x55DB, 0x86E9, + 0x55DE, 0x86EA, + 0x55E0, 0x86EB, + 0x55E2, 0x86EC, + 0x55E7, 0x86ED, + 0x55E9, 0x86EE, + 0x55ED, 0x86EF, + 0x55EE, 0x86F0, + 0x55F0, 0x86F1, + 0x55F1, 0x86F2, + 0x55F4, 0x86F3, + 0x55F6, 0x86F4, + 0x55F8, 0x86F5, + 0x55F9, 0x86F6, + 0x55FA, 0x86F7, + 0x55FB, 0x86F8, + 0x55FC, 0x86F9, + 0x55FF, 0x86FA, + 0x5602, 0x86FB, + 0x5603, 0x86FC, + 0x5604, 0x86FD, + 0x5605, 0x86FE, + 0x5606, 0x8740, + 0x5607, 0x8741, + 0x560A, 0x8742, + 0x560B, 0x8743, + 0x560D, 0x8744, + 0x5610, 0x8745, + 0x5611, 0x8746, + 0x5612, 0x8747, + 0x5613, 0x8748, + 0x5614, 0x8749, + 0x5615, 0x874A, + 0x5616, 0x874B, + 0x5617, 0x874C, + 0x5619, 0x874D, + 0x561A, 0x874E, + 0x561C, 0x874F, + 0x561D, 0x8750, + 0x5620, 0x8751, + 0x5621, 0x8752, + 0x5622, 0x8753, + 0x5625, 0x8754, + 0x5626, 0x8755, + 0x5628, 0x8756, + 0x5629, 0x8757, + 0x562A, 0x8758, + 0x562B, 0x8759, + 0x562E, 0x875A, + 0x562F, 0x875B, + 0x5630, 0x875C, + 0x5633, 0x875D, + 0x5635, 0x875E, + 0x5637, 0x875F, + 0x5638, 0x8760, + 0x563A, 0x8761, + 0x563C, 0x8762, + 0x563D, 0x8763, + 0x563E, 0x8764, + 0x5640, 0x8765, + 0x5641, 0x8766, + 0x5642, 0x8767, + 0x5643, 0x8768, + 0x5644, 0x8769, + 0x5645, 0x876A, + 0x5646, 0x876B, + 0x5647, 0x876C, + 0x5648, 0x876D, + 0x5649, 0x876E, + 0x564A, 0x876F, + 0x564B, 0x8770, + 0x564F, 0x8771, + 0x5650, 0x8772, + 0x5651, 0x8773, + 0x5652, 0x8774, + 0x5653, 0x8775, + 0x5655, 0x8776, + 0x5656, 0x8777, + 0x565A, 0x8778, + 0x565B, 0x8779, + 0x565D, 0x877A, + 0x565E, 0x877B, + 0x565F, 0x877C, + 0x5660, 0x877D, + 0x5661, 0x877E, + 0x5663, 0x8780, + 0x5665, 0x8781, + 0x5666, 0x8782, + 0x5667, 0x8783, + 0x566D, 0x8784, + 0x566E, 0x8785, + 0x566F, 0x8786, + 0x5670, 0x8787, + 0x5672, 0x8788, + 0x5673, 0x8789, + 0x5674, 0x878A, + 0x5675, 0x878B, + 0x5677, 0x878C, + 0x5678, 0x878D, + 0x5679, 0x878E, + 0x567A, 0x878F, + 0x567D, 0x8790, + 0x567E, 0x8791, + 0x567F, 0x8792, + 0x5680, 0x8793, + 0x5681, 0x8794, + 0x5682, 0x8795, + 0x5683, 0x8796, + 0x5684, 0x8797, + 0x5687, 0x8798, + 0x5688, 0x8799, + 0x5689, 0x879A, + 0x568A, 0x879B, + 0x568B, 0x879C, + 0x568C, 0x879D, + 0x568D, 0x879E, + 0x5690, 0x879F, + 0x5691, 0x87A0, + 0x5692, 0x87A1, + 0x5694, 0x87A2, + 0x5695, 0x87A3, + 0x5696, 0x87A4, + 0x5697, 0x87A5, + 0x5698, 0x87A6, + 0x5699, 0x87A7, + 0x569A, 0x87A8, + 0x569B, 0x87A9, + 0x569C, 0x87AA, + 0x569D, 0x87AB, + 0x569E, 0x87AC, + 0x569F, 0x87AD, + 0x56A0, 0x87AE, + 0x56A1, 0x87AF, + 0x56A2, 0x87B0, + 0x56A4, 0x87B1, + 0x56A5, 0x87B2, + 0x56A6, 0x87B3, + 0x56A7, 0x87B4, + 0x56A8, 0x87B5, + 0x56A9, 0x87B6, + 0x56AA, 0x87B7, + 0x56AB, 0x87B8, + 0x56AC, 0x87B9, + 0x56AD, 0x87BA, + 0x56AE, 0x87BB, + 0x56B0, 0x87BC, + 0x56B1, 0x87BD, + 0x56B2, 0x87BE, + 0x56B3, 0x87BF, + 0x56B4, 0x87C0, + 0x56B5, 0x87C1, + 0x56B6, 0x87C2, + 0x56B8, 0x87C3, + 0x56B9, 0x87C4, + 0x56BA, 0x87C5, + 0x56BB, 0x87C6, + 0x56BD, 0x87C7, + 0x56BE, 0x87C8, + 0x56BF, 0x87C9, + 0x56C0, 0x87CA, + 0x56C1, 0x87CB, + 0x56C2, 0x87CC, + 0x56C3, 0x87CD, + 0x56C4, 0x87CE, + 0x56C5, 0x87CF, + 0x56C6, 0x87D0, + 0x56C7, 0x87D1, + 0x56C8, 0x87D2, + 0x56C9, 0x87D3, + 0x56CB, 0x87D4, + 0x56CC, 0x87D5, + 0x56CD, 0x87D6, + 0x56CE, 0x87D7, + 0x56CF, 0x87D8, + 0x56D0, 0x87D9, + 0x56D1, 0x87DA, + 0x56D2, 0x87DB, + 0x56D3, 0x87DC, + 0x56D5, 0x87DD, + 0x56D6, 0x87DE, + 0x56D8, 0x87DF, + 0x56D9, 0x87E0, + 0x56DC, 0x87E1, + 0x56E3, 0x87E2, + 0x56E5, 0x87E3, + 0x56E6, 0x87E4, + 0x56E7, 0x87E5, + 0x56E8, 0x87E6, + 0x56E9, 0x87E7, + 0x56EA, 0x87E8, + 0x56EC, 0x87E9, + 0x56EE, 0x87EA, + 0x56EF, 0x87EB, + 0x56F2, 0x87EC, + 0x56F3, 0x87ED, + 0x56F6, 0x87EE, + 0x56F7, 0x87EF, + 0x56F8, 0x87F0, + 0x56FB, 0x87F1, + 0x56FC, 0x87F2, + 0x5700, 0x87F3, + 0x5701, 0x87F4, + 0x5702, 0x87F5, + 0x5705, 0x87F6, + 0x5707, 0x87F7, + 0x570B, 0x87F8, + 0x570C, 0x87F9, + 0x570D, 0x87FA, + 0x570E, 0x87FB, + 0x570F, 0x87FC, + 0x5710, 0x87FD, + 0x5711, 0x87FE, + 0x5712, 0x8840, + 0x5713, 0x8841, + 0x5714, 0x8842, + 0x5715, 0x8843, + 0x5716, 0x8844, + 0x5717, 0x8845, + 0x5718, 0x8846, + 0x5719, 0x8847, + 0x571A, 0x8848, + 0x571B, 0x8849, + 0x571D, 0x884A, + 0x571E, 0x884B, + 0x5720, 0x884C, + 0x5721, 0x884D, + 0x5722, 0x884E, + 0x5724, 0x884F, + 0x5725, 0x8850, + 0x5726, 0x8851, + 0x5727, 0x8852, + 0x572B, 0x8853, + 0x5731, 0x8854, + 0x5732, 0x8855, + 0x5734, 0x8856, + 0x5735, 0x8857, + 0x5736, 0x8858, + 0x5737, 0x8859, + 0x5738, 0x885A, + 0x573C, 0x885B, + 0x573D, 0x885C, + 0x573F, 0x885D, + 0x5741, 0x885E, + 0x5743, 0x885F, + 0x5744, 0x8860, + 0x5745, 0x8861, + 0x5746, 0x8862, + 0x5748, 0x8863, + 0x5749, 0x8864, + 0x574B, 0x8865, + 0x5752, 0x8866, + 0x5753, 0x8867, + 0x5754, 0x8868, + 0x5755, 0x8869, + 0x5756, 0x886A, + 0x5758, 0x886B, + 0x5759, 0x886C, + 0x5762, 0x886D, + 0x5763, 0x886E, + 0x5765, 0x886F, + 0x5767, 0x8870, + 0x576C, 0x8871, + 0x576E, 0x8872, + 0x5770, 0x8873, + 0x5771, 0x8874, + 0x5772, 0x8875, + 0x5774, 0x8876, + 0x5775, 0x8877, + 0x5778, 0x8878, + 0x5779, 0x8879, + 0x577A, 0x887A, + 0x577D, 0x887B, + 0x577E, 0x887C, + 0x577F, 0x887D, + 0x5780, 0x887E, + 0x5781, 0x8880, + 0x5787, 0x8881, + 0x5788, 0x8882, + 0x5789, 0x8883, + 0x578A, 0x8884, + 0x578D, 0x8885, + 0x578E, 0x8886, + 0x578F, 0x8887, + 0x5790, 0x8888, + 0x5791, 0x8889, + 0x5794, 0x888A, + 0x5795, 0x888B, + 0x5796, 0x888C, + 0x5797, 0x888D, + 0x5798, 0x888E, + 0x5799, 0x888F, + 0x579A, 0x8890, + 0x579C, 0x8891, + 0x579D, 0x8892, + 0x579E, 0x8893, + 0x579F, 0x8894, + 0x57A5, 0x8895, + 0x57A8, 0x8896, + 0x57AA, 0x8897, + 0x57AC, 0x8898, + 0x57AF, 0x8899, + 0x57B0, 0x889A, + 0x57B1, 0x889B, + 0x57B3, 0x889C, + 0x57B5, 0x889D, + 0x57B6, 0x889E, + 0x57B7, 0x889F, + 0x57B9, 0x88A0, + 0x57BA, 0x88A1, + 0x57BB, 0x88A2, + 0x57BC, 0x88A3, + 0x57BD, 0x88A4, + 0x57BE, 0x88A5, + 0x57BF, 0x88A6, + 0x57C0, 0x88A7, + 0x57C1, 0x88A8, + 0x57C4, 0x88A9, + 0x57C5, 0x88AA, + 0x57C6, 0x88AB, + 0x57C7, 0x88AC, + 0x57C8, 0x88AD, + 0x57C9, 0x88AE, + 0x57CA, 0x88AF, + 0x57CC, 0x88B0, + 0x57CD, 0x88B1, + 0x57D0, 0x88B2, + 0x57D1, 0x88B3, + 0x57D3, 0x88B4, + 0x57D6, 0x88B5, + 0x57D7, 0x88B6, + 0x57DB, 0x88B7, + 0x57DC, 0x88B8, + 0x57DE, 0x88B9, + 0x57E1, 0x88BA, + 0x57E2, 0x88BB, + 0x57E3, 0x88BC, + 0x57E5, 0x88BD, + 0x57E6, 0x88BE, + 0x57E7, 0x88BF, + 0x57E8, 0x88C0, + 0x57E9, 0x88C1, + 0x57EA, 0x88C2, + 0x57EB, 0x88C3, + 0x57EC, 0x88C4, + 0x57EE, 0x88C5, + 0x57F0, 0x88C6, + 0x57F1, 0x88C7, + 0x57F2, 0x88C8, + 0x57F3, 0x88C9, + 0x57F5, 0x88CA, + 0x57F6, 0x88CB, + 0x57F7, 0x88CC, + 0x57FB, 0x88CD, + 0x57FC, 0x88CE, + 0x57FE, 0x88CF, + 0x57FF, 0x88D0, + 0x5801, 0x88D1, + 0x5803, 0x88D2, + 0x5804, 0x88D3, + 0x5805, 0x88D4, + 0x5808, 0x88D5, + 0x5809, 0x88D6, + 0x580A, 0x88D7, + 0x580C, 0x88D8, + 0x580E, 0x88D9, + 0x580F, 0x88DA, + 0x5810, 0x88DB, + 0x5812, 0x88DC, + 0x5813, 0x88DD, + 0x5814, 0x88DE, + 0x5816, 0x88DF, + 0x5817, 0x88E0, + 0x5818, 0x88E1, + 0x581A, 0x88E2, + 0x581B, 0x88E3, + 0x581C, 0x88E4, + 0x581D, 0x88E5, + 0x581F, 0x88E6, + 0x5822, 0x88E7, + 0x5823, 0x88E8, + 0x5825, 0x88E9, + 0x5826, 0x88EA, + 0x5827, 0x88EB, + 0x5828, 0x88EC, + 0x5829, 0x88ED, + 0x582B, 0x88EE, + 0x582C, 0x88EF, + 0x582D, 0x88F0, + 0x582E, 0x88F1, + 0x582F, 0x88F2, + 0x5831, 0x88F3, + 0x5832, 0x88F4, + 0x5833, 0x88F5, + 0x5834, 0x88F6, + 0x5836, 0x88F7, + 0x5837, 0x88F8, + 0x5838, 0x88F9, + 0x5839, 0x88FA, + 0x583A, 0x88FB, + 0x583B, 0x88FC, + 0x583C, 0x88FD, + 0x583D, 0x88FE, + 0x583E, 0x8940, + 0x583F, 0x8941, + 0x5840, 0x8942, + 0x5841, 0x8943, + 0x5842, 0x8944, + 0x5843, 0x8945, + 0x5845, 0x8946, + 0x5846, 0x8947, + 0x5847, 0x8948, + 0x5848, 0x8949, + 0x5849, 0x894A, + 0x584A, 0x894B, + 0x584B, 0x894C, + 0x584E, 0x894D, + 0x584F, 0x894E, + 0x5850, 0x894F, + 0x5852, 0x8950, + 0x5853, 0x8951, + 0x5855, 0x8952, + 0x5856, 0x8953, + 0x5857, 0x8954, + 0x5859, 0x8955, + 0x585A, 0x8956, + 0x585B, 0x8957, + 0x585C, 0x8958, + 0x585D, 0x8959, + 0x585F, 0x895A, + 0x5860, 0x895B, + 0x5861, 0x895C, + 0x5862, 0x895D, + 0x5863, 0x895E, + 0x5864, 0x895F, + 0x5866, 0x8960, + 0x5867, 0x8961, + 0x5868, 0x8962, + 0x5869, 0x8963, + 0x586A, 0x8964, + 0x586D, 0x8965, + 0x586E, 0x8966, + 0x586F, 0x8967, + 0x5870, 0x8968, + 0x5871, 0x8969, + 0x5872, 0x896A, + 0x5873, 0x896B, + 0x5874, 0x896C, + 0x5875, 0x896D, + 0x5876, 0x896E, + 0x5877, 0x896F, + 0x5878, 0x8970, + 0x5879, 0x8971, + 0x587A, 0x8972, + 0x587B, 0x8973, + 0x587C, 0x8974, + 0x587D, 0x8975, + 0x587F, 0x8976, + 0x5882, 0x8977, + 0x5884, 0x8978, + 0x5886, 0x8979, + 0x5887, 0x897A, + 0x5888, 0x897B, + 0x588A, 0x897C, + 0x588B, 0x897D, + 0x588C, 0x897E, + 0x588D, 0x8980, + 0x588E, 0x8981, + 0x588F, 0x8982, + 0x5890, 0x8983, + 0x5891, 0x8984, + 0x5894, 0x8985, + 0x5895, 0x8986, + 0x5896, 0x8987, + 0x5897, 0x8988, + 0x5898, 0x8989, + 0x589B, 0x898A, + 0x589C, 0x898B, + 0x589D, 0x898C, + 0x58A0, 0x898D, + 0x58A1, 0x898E, + 0x58A2, 0x898F, + 0x58A3, 0x8990, + 0x58A4, 0x8991, + 0x58A5, 0x8992, + 0x58A6, 0x8993, + 0x58A7, 0x8994, + 0x58AA, 0x8995, + 0x58AB, 0x8996, + 0x58AC, 0x8997, + 0x58AD, 0x8998, + 0x58AE, 0x8999, + 0x58AF, 0x899A, + 0x58B0, 0x899B, + 0x58B1, 0x899C, + 0x58B2, 0x899D, + 0x58B3, 0x899E, + 0x58B4, 0x899F, + 0x58B5, 0x89A0, + 0x58B6, 0x89A1, + 0x58B7, 0x89A2, + 0x58B8, 0x89A3, + 0x58B9, 0x89A4, + 0x58BA, 0x89A5, + 0x58BB, 0x89A6, + 0x58BD, 0x89A7, + 0x58BE, 0x89A8, + 0x58BF, 0x89A9, + 0x58C0, 0x89AA, + 0x58C2, 0x89AB, + 0x58C3, 0x89AC, + 0x58C4, 0x89AD, + 0x58C6, 0x89AE, + 0x58C7, 0x89AF, + 0x58C8, 0x89B0, + 0x58C9, 0x89B1, + 0x58CA, 0x89B2, + 0x58CB, 0x89B3, + 0x58CC, 0x89B4, + 0x58CD, 0x89B5, + 0x58CE, 0x89B6, + 0x58CF, 0x89B7, + 0x58D0, 0x89B8, + 0x58D2, 0x89B9, + 0x58D3, 0x89BA, + 0x58D4, 0x89BB, + 0x58D6, 0x89BC, + 0x58D7, 0x89BD, + 0x58D8, 0x89BE, + 0x58D9, 0x89BF, + 0x58DA, 0x89C0, + 0x58DB, 0x89C1, + 0x58DC, 0x89C2, + 0x58DD, 0x89C3, + 0x58DE, 0x89C4, + 0x58DF, 0x89C5, + 0x58E0, 0x89C6, + 0x58E1, 0x89C7, + 0x58E2, 0x89C8, + 0x58E3, 0x89C9, + 0x58E5, 0x89CA, + 0x58E6, 0x89CB, + 0x58E7, 0x89CC, + 0x58E8, 0x89CD, + 0x58E9, 0x89CE, + 0x58EA, 0x89CF, + 0x58ED, 0x89D0, + 0x58EF, 0x89D1, + 0x58F1, 0x89D2, + 0x58F2, 0x89D3, + 0x58F4, 0x89D4, + 0x58F5, 0x89D5, + 0x58F7, 0x89D6, + 0x58F8, 0x89D7, + 0x58FA, 0x89D8, + 0x58FB, 0x89D9, + 0x58FC, 0x89DA, + 0x58FD, 0x89DB, + 0x58FE, 0x89DC, + 0x58FF, 0x89DD, + 0x5900, 0x89DE, + 0x5901, 0x89DF, + 0x5903, 0x89E0, + 0x5905, 0x89E1, + 0x5906, 0x89E2, + 0x5908, 0x89E3, + 0x5909, 0x89E4, + 0x590A, 0x89E5, + 0x590B, 0x89E6, + 0x590C, 0x89E7, + 0x590E, 0x89E8, + 0x5910, 0x89E9, + 0x5911, 0x89EA, + 0x5912, 0x89EB, + 0x5913, 0x89EC, + 0x5917, 0x89ED, + 0x5918, 0x89EE, + 0x591B, 0x89EF, + 0x591D, 0x89F0, + 0x591E, 0x89F1, + 0x5920, 0x89F2, + 0x5921, 0x89F3, + 0x5922, 0x89F4, + 0x5923, 0x89F5, + 0x5926, 0x89F6, + 0x5928, 0x89F7, + 0x592C, 0x89F8, + 0x5930, 0x89F9, + 0x5932, 0x89FA, + 0x5933, 0x89FB, + 0x5935, 0x89FC, + 0x5936, 0x89FD, + 0x593B, 0x89FE, + 0x593D, 0x8A40, + 0x593E, 0x8A41, + 0x593F, 0x8A42, + 0x5940, 0x8A43, + 0x5943, 0x8A44, + 0x5945, 0x8A45, + 0x5946, 0x8A46, + 0x594A, 0x8A47, + 0x594C, 0x8A48, + 0x594D, 0x8A49, + 0x5950, 0x8A4A, + 0x5952, 0x8A4B, + 0x5953, 0x8A4C, + 0x5959, 0x8A4D, + 0x595B, 0x8A4E, + 0x595C, 0x8A4F, + 0x595D, 0x8A50, + 0x595E, 0x8A51, + 0x595F, 0x8A52, + 0x5961, 0x8A53, + 0x5963, 0x8A54, + 0x5964, 0x8A55, + 0x5966, 0x8A56, + 0x5967, 0x8A57, + 0x5968, 0x8A58, + 0x5969, 0x8A59, + 0x596A, 0x8A5A, + 0x596B, 0x8A5B, + 0x596C, 0x8A5C, + 0x596D, 0x8A5D, + 0x596E, 0x8A5E, + 0x596F, 0x8A5F, + 0x5970, 0x8A60, + 0x5971, 0x8A61, + 0x5972, 0x8A62, + 0x5975, 0x8A63, + 0x5977, 0x8A64, + 0x597A, 0x8A65, + 0x597B, 0x8A66, + 0x597C, 0x8A67, + 0x597E, 0x8A68, + 0x597F, 0x8A69, + 0x5980, 0x8A6A, + 0x5985, 0x8A6B, + 0x5989, 0x8A6C, + 0x598B, 0x8A6D, + 0x598C, 0x8A6E, + 0x598E, 0x8A6F, + 0x598F, 0x8A70, + 0x5990, 0x8A71, + 0x5991, 0x8A72, + 0x5994, 0x8A73, + 0x5995, 0x8A74, + 0x5998, 0x8A75, + 0x599A, 0x8A76, + 0x599B, 0x8A77, + 0x599C, 0x8A78, + 0x599D, 0x8A79, + 0x599F, 0x8A7A, + 0x59A0, 0x8A7B, + 0x59A1, 0x8A7C, + 0x59A2, 0x8A7D, + 0x59A6, 0x8A7E, + 0x59A7, 0x8A80, + 0x59AC, 0x8A81, + 0x59AD, 0x8A82, + 0x59B0, 0x8A83, + 0x59B1, 0x8A84, + 0x59B3, 0x8A85, + 0x59B4, 0x8A86, + 0x59B5, 0x8A87, + 0x59B6, 0x8A88, + 0x59B7, 0x8A89, + 0x59B8, 0x8A8A, + 0x59BA, 0x8A8B, + 0x59BC, 0x8A8C, + 0x59BD, 0x8A8D, + 0x59BF, 0x8A8E, + 0x59C0, 0x8A8F, + 0x59C1, 0x8A90, + 0x59C2, 0x8A91, + 0x59C3, 0x8A92, + 0x59C4, 0x8A93, + 0x59C5, 0x8A94, + 0x59C7, 0x8A95, + 0x59C8, 0x8A96, + 0x59C9, 0x8A97, + 0x59CC, 0x8A98, + 0x59CD, 0x8A99, + 0x59CE, 0x8A9A, + 0x59CF, 0x8A9B, + 0x59D5, 0x8A9C, + 0x59D6, 0x8A9D, + 0x59D9, 0x8A9E, + 0x59DB, 0x8A9F, + 0x59DE, 0x8AA0, + 0x59DF, 0x8AA1, + 0x59E0, 0x8AA2, + 0x59E1, 0x8AA3, + 0x59E2, 0x8AA4, + 0x59E4, 0x8AA5, + 0x59E6, 0x8AA6, + 0x59E7, 0x8AA7, + 0x59E9, 0x8AA8, + 0x59EA, 0x8AA9, + 0x59EB, 0x8AAA, + 0x59ED, 0x8AAB, + 0x59EE, 0x8AAC, + 0x59EF, 0x8AAD, + 0x59F0, 0x8AAE, + 0x59F1, 0x8AAF, + 0x59F2, 0x8AB0, + 0x59F3, 0x8AB1, + 0x59F4, 0x8AB2, + 0x59F5, 0x8AB3, + 0x59F6, 0x8AB4, + 0x59F7, 0x8AB5, + 0x59F8, 0x8AB6, + 0x59FA, 0x8AB7, + 0x59FC, 0x8AB8, + 0x59FD, 0x8AB9, + 0x59FE, 0x8ABA, + 0x5A00, 0x8ABB, + 0x5A02, 0x8ABC, + 0x5A0A, 0x8ABD, + 0x5A0B, 0x8ABE, + 0x5A0D, 0x8ABF, + 0x5A0E, 0x8AC0, + 0x5A0F, 0x8AC1, + 0x5A10, 0x8AC2, + 0x5A12, 0x8AC3, + 0x5A14, 0x8AC4, + 0x5A15, 0x8AC5, + 0x5A16, 0x8AC6, + 0x5A17, 0x8AC7, + 0x5A19, 0x8AC8, + 0x5A1A, 0x8AC9, + 0x5A1B, 0x8ACA, + 0x5A1D, 0x8ACB, + 0x5A1E, 0x8ACC, + 0x5A21, 0x8ACD, + 0x5A22, 0x8ACE, + 0x5A24, 0x8ACF, + 0x5A26, 0x8AD0, + 0x5A27, 0x8AD1, + 0x5A28, 0x8AD2, + 0x5A2A, 0x8AD3, + 0x5A2B, 0x8AD4, + 0x5A2C, 0x8AD5, + 0x5A2D, 0x8AD6, + 0x5A2E, 0x8AD7, + 0x5A2F, 0x8AD8, + 0x5A30, 0x8AD9, + 0x5A33, 0x8ADA, + 0x5A35, 0x8ADB, + 0x5A37, 0x8ADC, + 0x5A38, 0x8ADD, + 0x5A39, 0x8ADE, + 0x5A3A, 0x8ADF, + 0x5A3B, 0x8AE0, + 0x5A3D, 0x8AE1, + 0x5A3E, 0x8AE2, + 0x5A3F, 0x8AE3, + 0x5A41, 0x8AE4, + 0x5A42, 0x8AE5, + 0x5A43, 0x8AE6, + 0x5A44, 0x8AE7, + 0x5A45, 0x8AE8, + 0x5A47, 0x8AE9, + 0x5A48, 0x8AEA, + 0x5A4B, 0x8AEB, + 0x5A4C, 0x8AEC, + 0x5A4D, 0x8AED, + 0x5A4E, 0x8AEE, + 0x5A4F, 0x8AEF, + 0x5A50, 0x8AF0, + 0x5A51, 0x8AF1, + 0x5A52, 0x8AF2, + 0x5A53, 0x8AF3, + 0x5A54, 0x8AF4, + 0x5A56, 0x8AF5, + 0x5A57, 0x8AF6, + 0x5A58, 0x8AF7, + 0x5A59, 0x8AF8, + 0x5A5B, 0x8AF9, + 0x5A5C, 0x8AFA, + 0x5A5D, 0x8AFB, + 0x5A5E, 0x8AFC, + 0x5A5F, 0x8AFD, + 0x5A60, 0x8AFE, + 0x5A61, 0x8B40, + 0x5A63, 0x8B41, + 0x5A64, 0x8B42, + 0x5A65, 0x8B43, + 0x5A66, 0x8B44, + 0x5A68, 0x8B45, + 0x5A69, 0x8B46, + 0x5A6B, 0x8B47, + 0x5A6C, 0x8B48, + 0x5A6D, 0x8B49, + 0x5A6E, 0x8B4A, + 0x5A6F, 0x8B4B, + 0x5A70, 0x8B4C, + 0x5A71, 0x8B4D, + 0x5A72, 0x8B4E, + 0x5A73, 0x8B4F, + 0x5A78, 0x8B50, + 0x5A79, 0x8B51, + 0x5A7B, 0x8B52, + 0x5A7C, 0x8B53, + 0x5A7D, 0x8B54, + 0x5A7E, 0x8B55, + 0x5A80, 0x8B56, + 0x5A81, 0x8B57, + 0x5A82, 0x8B58, + 0x5A83, 0x8B59, + 0x5A84, 0x8B5A, + 0x5A85, 0x8B5B, + 0x5A86, 0x8B5C, + 0x5A87, 0x8B5D, + 0x5A88, 0x8B5E, + 0x5A89, 0x8B5F, + 0x5A8A, 0x8B60, + 0x5A8B, 0x8B61, + 0x5A8C, 0x8B62, + 0x5A8D, 0x8B63, + 0x5A8E, 0x8B64, + 0x5A8F, 0x8B65, + 0x5A90, 0x8B66, + 0x5A91, 0x8B67, + 0x5A93, 0x8B68, + 0x5A94, 0x8B69, + 0x5A95, 0x8B6A, + 0x5A96, 0x8B6B, + 0x5A97, 0x8B6C, + 0x5A98, 0x8B6D, + 0x5A99, 0x8B6E, + 0x5A9C, 0x8B6F, + 0x5A9D, 0x8B70, + 0x5A9E, 0x8B71, + 0x5A9F, 0x8B72, + 0x5AA0, 0x8B73, + 0x5AA1, 0x8B74, + 0x5AA2, 0x8B75, + 0x5AA3, 0x8B76, + 0x5AA4, 0x8B77, + 0x5AA5, 0x8B78, + 0x5AA6, 0x8B79, + 0x5AA7, 0x8B7A, + 0x5AA8, 0x8B7B, + 0x5AA9, 0x8B7C, + 0x5AAB, 0x8B7D, + 0x5AAC, 0x8B7E, + 0x5AAD, 0x8B80, + 0x5AAE, 0x8B81, + 0x5AAF, 0x8B82, + 0x5AB0, 0x8B83, + 0x5AB1, 0x8B84, + 0x5AB4, 0x8B85, + 0x5AB6, 0x8B86, + 0x5AB7, 0x8B87, + 0x5AB9, 0x8B88, + 0x5ABA, 0x8B89, + 0x5ABB, 0x8B8A, + 0x5ABC, 0x8B8B, + 0x5ABD, 0x8B8C, + 0x5ABF, 0x8B8D, + 0x5AC0, 0x8B8E, + 0x5AC3, 0x8B8F, + 0x5AC4, 0x8B90, + 0x5AC5, 0x8B91, + 0x5AC6, 0x8B92, + 0x5AC7, 0x8B93, + 0x5AC8, 0x8B94, + 0x5ACA, 0x8B95, + 0x5ACB, 0x8B96, + 0x5ACD, 0x8B97, + 0x5ACE, 0x8B98, + 0x5ACF, 0x8B99, + 0x5AD0, 0x8B9A, + 0x5AD1, 0x8B9B, + 0x5AD3, 0x8B9C, + 0x5AD5, 0x8B9D, + 0x5AD7, 0x8B9E, + 0x5AD9, 0x8B9F, + 0x5ADA, 0x8BA0, + 0x5ADB, 0x8BA1, + 0x5ADD, 0x8BA2, + 0x5ADE, 0x8BA3, + 0x5ADF, 0x8BA4, + 0x5AE2, 0x8BA5, + 0x5AE4, 0x8BA6, + 0x5AE5, 0x8BA7, + 0x5AE7, 0x8BA8, + 0x5AE8, 0x8BA9, + 0x5AEA, 0x8BAA, + 0x5AEC, 0x8BAB, + 0x5AED, 0x8BAC, + 0x5AEE, 0x8BAD, + 0x5AEF, 0x8BAE, + 0x5AF0, 0x8BAF, + 0x5AF2, 0x8BB0, + 0x5AF3, 0x8BB1, + 0x5AF4, 0x8BB2, + 0x5AF5, 0x8BB3, + 0x5AF6, 0x8BB4, + 0x5AF7, 0x8BB5, + 0x5AF8, 0x8BB6, + 0x5AF9, 0x8BB7, + 0x5AFA, 0x8BB8, + 0x5AFB, 0x8BB9, + 0x5AFC, 0x8BBA, + 0x5AFD, 0x8BBB, + 0x5AFE, 0x8BBC, + 0x5AFF, 0x8BBD, + 0x5B00, 0x8BBE, + 0x5B01, 0x8BBF, + 0x5B02, 0x8BC0, + 0x5B03, 0x8BC1, + 0x5B04, 0x8BC2, + 0x5B05, 0x8BC3, + 0x5B06, 0x8BC4, + 0x5B07, 0x8BC5, + 0x5B08, 0x8BC6, + 0x5B0A, 0x8BC7, + 0x5B0B, 0x8BC8, + 0x5B0C, 0x8BC9, + 0x5B0D, 0x8BCA, + 0x5B0E, 0x8BCB, + 0x5B0F, 0x8BCC, + 0x5B10, 0x8BCD, + 0x5B11, 0x8BCE, + 0x5B12, 0x8BCF, + 0x5B13, 0x8BD0, + 0x5B14, 0x8BD1, + 0x5B15, 0x8BD2, + 0x5B18, 0x8BD3, + 0x5B19, 0x8BD4, + 0x5B1A, 0x8BD5, + 0x5B1B, 0x8BD6, + 0x5B1C, 0x8BD7, + 0x5B1D, 0x8BD8, + 0x5B1E, 0x8BD9, + 0x5B1F, 0x8BDA, + 0x5B20, 0x8BDB, + 0x5B21, 0x8BDC, + 0x5B22, 0x8BDD, + 0x5B23, 0x8BDE, + 0x5B24, 0x8BDF, + 0x5B25, 0x8BE0, + 0x5B26, 0x8BE1, + 0x5B27, 0x8BE2, + 0x5B28, 0x8BE3, + 0x5B29, 0x8BE4, + 0x5B2A, 0x8BE5, + 0x5B2B, 0x8BE6, + 0x5B2C, 0x8BE7, + 0x5B2D, 0x8BE8, + 0x5B2E, 0x8BE9, + 0x5B2F, 0x8BEA, + 0x5B30, 0x8BEB, + 0x5B31, 0x8BEC, + 0x5B33, 0x8BED, + 0x5B35, 0x8BEE, + 0x5B36, 0x8BEF, + 0x5B38, 0x8BF0, + 0x5B39, 0x8BF1, + 0x5B3A, 0x8BF2, + 0x5B3B, 0x8BF3, + 0x5B3C, 0x8BF4, + 0x5B3D, 0x8BF5, + 0x5B3E, 0x8BF6, + 0x5B3F, 0x8BF7, + 0x5B41, 0x8BF8, + 0x5B42, 0x8BF9, + 0x5B43, 0x8BFA, + 0x5B44, 0x8BFB, + 0x5B45, 0x8BFC, + 0x5B46, 0x8BFD, + 0x5B47, 0x8BFE, + 0x5B48, 0x8C40, + 0x5B49, 0x8C41, + 0x5B4A, 0x8C42, + 0x5B4B, 0x8C43, + 0x5B4C, 0x8C44, + 0x5B4D, 0x8C45, + 0x5B4E, 0x8C46, + 0x5B4F, 0x8C47, + 0x5B52, 0x8C48, + 0x5B56, 0x8C49, + 0x5B5E, 0x8C4A, + 0x5B60, 0x8C4B, + 0x5B61, 0x8C4C, + 0x5B67, 0x8C4D, + 0x5B68, 0x8C4E, + 0x5B6B, 0x8C4F, + 0x5B6D, 0x8C50, + 0x5B6E, 0x8C51, + 0x5B6F, 0x8C52, + 0x5B72, 0x8C53, + 0x5B74, 0x8C54, + 0x5B76, 0x8C55, + 0x5B77, 0x8C56, + 0x5B78, 0x8C57, + 0x5B79, 0x8C58, + 0x5B7B, 0x8C59, + 0x5B7C, 0x8C5A, + 0x5B7E, 0x8C5B, + 0x5B7F, 0x8C5C, + 0x5B82, 0x8C5D, + 0x5B86, 0x8C5E, + 0x5B8A, 0x8C5F, + 0x5B8D, 0x8C60, + 0x5B8E, 0x8C61, + 0x5B90, 0x8C62, + 0x5B91, 0x8C63, + 0x5B92, 0x8C64, + 0x5B94, 0x8C65, + 0x5B96, 0x8C66, + 0x5B9F, 0x8C67, + 0x5BA7, 0x8C68, + 0x5BA8, 0x8C69, + 0x5BA9, 0x8C6A, + 0x5BAC, 0x8C6B, + 0x5BAD, 0x8C6C, + 0x5BAE, 0x8C6D, + 0x5BAF, 0x8C6E, + 0x5BB1, 0x8C6F, + 0x5BB2, 0x8C70, + 0x5BB7, 0x8C71, + 0x5BBA, 0x8C72, + 0x5BBB, 0x8C73, + 0x5BBC, 0x8C74, + 0x5BC0, 0x8C75, + 0x5BC1, 0x8C76, + 0x5BC3, 0x8C77, + 0x5BC8, 0x8C78, + 0x5BC9, 0x8C79, + 0x5BCA, 0x8C7A, + 0x5BCB, 0x8C7B, + 0x5BCD, 0x8C7C, + 0x5BCE, 0x8C7D, + 0x5BCF, 0x8C7E, + 0x5BD1, 0x8C80, + 0x5BD4, 0x8C81, + 0x5BD5, 0x8C82, + 0x5BD6, 0x8C83, + 0x5BD7, 0x8C84, + 0x5BD8, 0x8C85, + 0x5BD9, 0x8C86, + 0x5BDA, 0x8C87, + 0x5BDB, 0x8C88, + 0x5BDC, 0x8C89, + 0x5BE0, 0x8C8A, + 0x5BE2, 0x8C8B, + 0x5BE3, 0x8C8C, + 0x5BE6, 0x8C8D, + 0x5BE7, 0x8C8E, + 0x5BE9, 0x8C8F, + 0x5BEA, 0x8C90, + 0x5BEB, 0x8C91, + 0x5BEC, 0x8C92, + 0x5BED, 0x8C93, + 0x5BEF, 0x8C94, + 0x5BF1, 0x8C95, + 0x5BF2, 0x8C96, + 0x5BF3, 0x8C97, + 0x5BF4, 0x8C98, + 0x5BF5, 0x8C99, + 0x5BF6, 0x8C9A, + 0x5BF7, 0x8C9B, + 0x5BFD, 0x8C9C, + 0x5BFE, 0x8C9D, + 0x5C00, 0x8C9E, + 0x5C02, 0x8C9F, + 0x5C03, 0x8CA0, + 0x5C05, 0x8CA1, + 0x5C07, 0x8CA2, + 0x5C08, 0x8CA3, + 0x5C0B, 0x8CA4, + 0x5C0C, 0x8CA5, + 0x5C0D, 0x8CA6, + 0x5C0E, 0x8CA7, + 0x5C10, 0x8CA8, + 0x5C12, 0x8CA9, + 0x5C13, 0x8CAA, + 0x5C17, 0x8CAB, + 0x5C19, 0x8CAC, + 0x5C1B, 0x8CAD, + 0x5C1E, 0x8CAE, + 0x5C1F, 0x8CAF, + 0x5C20, 0x8CB0, + 0x5C21, 0x8CB1, + 0x5C23, 0x8CB2, + 0x5C26, 0x8CB3, + 0x5C28, 0x8CB4, + 0x5C29, 0x8CB5, + 0x5C2A, 0x8CB6, + 0x5C2B, 0x8CB7, + 0x5C2D, 0x8CB8, + 0x5C2E, 0x8CB9, + 0x5C2F, 0x8CBA, + 0x5C30, 0x8CBB, + 0x5C32, 0x8CBC, + 0x5C33, 0x8CBD, + 0x5C35, 0x8CBE, + 0x5C36, 0x8CBF, + 0x5C37, 0x8CC0, + 0x5C43, 0x8CC1, + 0x5C44, 0x8CC2, + 0x5C46, 0x8CC3, + 0x5C47, 0x8CC4, + 0x5C4C, 0x8CC5, + 0x5C4D, 0x8CC6, + 0x5C52, 0x8CC7, + 0x5C53, 0x8CC8, + 0x5C54, 0x8CC9, + 0x5C56, 0x8CCA, + 0x5C57, 0x8CCB, + 0x5C58, 0x8CCC, + 0x5C5A, 0x8CCD, + 0x5C5B, 0x8CCE, + 0x5C5C, 0x8CCF, + 0x5C5D, 0x8CD0, + 0x5C5F, 0x8CD1, + 0x5C62, 0x8CD2, + 0x5C64, 0x8CD3, + 0x5C67, 0x8CD4, + 0x5C68, 0x8CD5, + 0x5C69, 0x8CD6, + 0x5C6A, 0x8CD7, + 0x5C6B, 0x8CD8, + 0x5C6C, 0x8CD9, + 0x5C6D, 0x8CDA, + 0x5C70, 0x8CDB, + 0x5C72, 0x8CDC, + 0x5C73, 0x8CDD, + 0x5C74, 0x8CDE, + 0x5C75, 0x8CDF, + 0x5C76, 0x8CE0, + 0x5C77, 0x8CE1, + 0x5C78, 0x8CE2, + 0x5C7B, 0x8CE3, + 0x5C7C, 0x8CE4, + 0x5C7D, 0x8CE5, + 0x5C7E, 0x8CE6, + 0x5C80, 0x8CE7, + 0x5C83, 0x8CE8, + 0x5C84, 0x8CE9, + 0x5C85, 0x8CEA, + 0x5C86, 0x8CEB, + 0x5C87, 0x8CEC, + 0x5C89, 0x8CED, + 0x5C8A, 0x8CEE, + 0x5C8B, 0x8CEF, + 0x5C8E, 0x8CF0, + 0x5C8F, 0x8CF1, + 0x5C92, 0x8CF2, + 0x5C93, 0x8CF3, + 0x5C95, 0x8CF4, + 0x5C9D, 0x8CF5, + 0x5C9E, 0x8CF6, + 0x5C9F, 0x8CF7, + 0x5CA0, 0x8CF8, + 0x5CA1, 0x8CF9, + 0x5CA4, 0x8CFA, + 0x5CA5, 0x8CFB, + 0x5CA6, 0x8CFC, + 0x5CA7, 0x8CFD, + 0x5CA8, 0x8CFE, + 0x5CAA, 0x8D40, + 0x5CAE, 0x8D41, + 0x5CAF, 0x8D42, + 0x5CB0, 0x8D43, + 0x5CB2, 0x8D44, + 0x5CB4, 0x8D45, + 0x5CB6, 0x8D46, + 0x5CB9, 0x8D47, + 0x5CBA, 0x8D48, + 0x5CBB, 0x8D49, + 0x5CBC, 0x8D4A, + 0x5CBE, 0x8D4B, + 0x5CC0, 0x8D4C, + 0x5CC2, 0x8D4D, + 0x5CC3, 0x8D4E, + 0x5CC5, 0x8D4F, + 0x5CC6, 0x8D50, + 0x5CC7, 0x8D51, + 0x5CC8, 0x8D52, + 0x5CC9, 0x8D53, + 0x5CCA, 0x8D54, + 0x5CCC, 0x8D55, + 0x5CCD, 0x8D56, + 0x5CCE, 0x8D57, + 0x5CCF, 0x8D58, + 0x5CD0, 0x8D59, + 0x5CD1, 0x8D5A, + 0x5CD3, 0x8D5B, + 0x5CD4, 0x8D5C, + 0x5CD5, 0x8D5D, + 0x5CD6, 0x8D5E, + 0x5CD7, 0x8D5F, + 0x5CD8, 0x8D60, + 0x5CDA, 0x8D61, + 0x5CDB, 0x8D62, + 0x5CDC, 0x8D63, + 0x5CDD, 0x8D64, + 0x5CDE, 0x8D65, + 0x5CDF, 0x8D66, + 0x5CE0, 0x8D67, + 0x5CE2, 0x8D68, + 0x5CE3, 0x8D69, + 0x5CE7, 0x8D6A, + 0x5CE9, 0x8D6B, + 0x5CEB, 0x8D6C, + 0x5CEC, 0x8D6D, + 0x5CEE, 0x8D6E, + 0x5CEF, 0x8D6F, + 0x5CF1, 0x8D70, + 0x5CF2, 0x8D71, + 0x5CF3, 0x8D72, + 0x5CF4, 0x8D73, + 0x5CF5, 0x8D74, + 0x5CF6, 0x8D75, + 0x5CF7, 0x8D76, + 0x5CF8, 0x8D77, + 0x5CF9, 0x8D78, + 0x5CFA, 0x8D79, + 0x5CFC, 0x8D7A, + 0x5CFD, 0x8D7B, + 0x5CFE, 0x8D7C, + 0x5CFF, 0x8D7D, + 0x5D00, 0x8D7E, + 0x5D01, 0x8D80, + 0x5D04, 0x8D81, + 0x5D05, 0x8D82, + 0x5D08, 0x8D83, + 0x5D09, 0x8D84, + 0x5D0A, 0x8D85, + 0x5D0B, 0x8D86, + 0x5D0C, 0x8D87, + 0x5D0D, 0x8D88, + 0x5D0F, 0x8D89, + 0x5D10, 0x8D8A, + 0x5D11, 0x8D8B, + 0x5D12, 0x8D8C, + 0x5D13, 0x8D8D, + 0x5D15, 0x8D8E, + 0x5D17, 0x8D8F, + 0x5D18, 0x8D90, + 0x5D19, 0x8D91, + 0x5D1A, 0x8D92, + 0x5D1C, 0x8D93, + 0x5D1D, 0x8D94, + 0x5D1F, 0x8D95, + 0x5D20, 0x8D96, + 0x5D21, 0x8D97, + 0x5D22, 0x8D98, + 0x5D23, 0x8D99, + 0x5D25, 0x8D9A, + 0x5D28, 0x8D9B, + 0x5D2A, 0x8D9C, + 0x5D2B, 0x8D9D, + 0x5D2C, 0x8D9E, + 0x5D2F, 0x8D9F, + 0x5D30, 0x8DA0, + 0x5D31, 0x8DA1, + 0x5D32, 0x8DA2, + 0x5D33, 0x8DA3, + 0x5D35, 0x8DA4, + 0x5D36, 0x8DA5, + 0x5D37, 0x8DA6, + 0x5D38, 0x8DA7, + 0x5D39, 0x8DA8, + 0x5D3A, 0x8DA9, + 0x5D3B, 0x8DAA, + 0x5D3C, 0x8DAB, + 0x5D3F, 0x8DAC, + 0x5D40, 0x8DAD, + 0x5D41, 0x8DAE, + 0x5D42, 0x8DAF, + 0x5D43, 0x8DB0, + 0x5D44, 0x8DB1, + 0x5D45, 0x8DB2, + 0x5D46, 0x8DB3, + 0x5D48, 0x8DB4, + 0x5D49, 0x8DB5, + 0x5D4D, 0x8DB6, + 0x5D4E, 0x8DB7, + 0x5D4F, 0x8DB8, + 0x5D50, 0x8DB9, + 0x5D51, 0x8DBA, + 0x5D52, 0x8DBB, + 0x5D53, 0x8DBC, + 0x5D54, 0x8DBD, + 0x5D55, 0x8DBE, + 0x5D56, 0x8DBF, + 0x5D57, 0x8DC0, + 0x5D59, 0x8DC1, + 0x5D5A, 0x8DC2, + 0x5D5C, 0x8DC3, + 0x5D5E, 0x8DC4, + 0x5D5F, 0x8DC5, + 0x5D60, 0x8DC6, + 0x5D61, 0x8DC7, + 0x5D62, 0x8DC8, + 0x5D63, 0x8DC9, + 0x5D64, 0x8DCA, + 0x5D65, 0x8DCB, + 0x5D66, 0x8DCC, + 0x5D67, 0x8DCD, + 0x5D68, 0x8DCE, + 0x5D6A, 0x8DCF, + 0x5D6D, 0x8DD0, + 0x5D6E, 0x8DD1, + 0x5D70, 0x8DD2, + 0x5D71, 0x8DD3, + 0x5D72, 0x8DD4, + 0x5D73, 0x8DD5, + 0x5D75, 0x8DD6, + 0x5D76, 0x8DD7, + 0x5D77, 0x8DD8, + 0x5D78, 0x8DD9, + 0x5D79, 0x8DDA, + 0x5D7A, 0x8DDB, + 0x5D7B, 0x8DDC, + 0x5D7C, 0x8DDD, + 0x5D7D, 0x8DDE, + 0x5D7E, 0x8DDF, + 0x5D7F, 0x8DE0, + 0x5D80, 0x8DE1, + 0x5D81, 0x8DE2, + 0x5D83, 0x8DE3, + 0x5D84, 0x8DE4, + 0x5D85, 0x8DE5, + 0x5D86, 0x8DE6, + 0x5D87, 0x8DE7, + 0x5D88, 0x8DE8, + 0x5D89, 0x8DE9, + 0x5D8A, 0x8DEA, + 0x5D8B, 0x8DEB, + 0x5D8C, 0x8DEC, + 0x5D8D, 0x8DED, + 0x5D8E, 0x8DEE, + 0x5D8F, 0x8DEF, + 0x5D90, 0x8DF0, + 0x5D91, 0x8DF1, + 0x5D92, 0x8DF2, + 0x5D93, 0x8DF3, + 0x5D94, 0x8DF4, + 0x5D95, 0x8DF5, + 0x5D96, 0x8DF6, + 0x5D97, 0x8DF7, + 0x5D98, 0x8DF8, + 0x5D9A, 0x8DF9, + 0x5D9B, 0x8DFA, + 0x5D9C, 0x8DFB, + 0x5D9E, 0x8DFC, + 0x5D9F, 0x8DFD, + 0x5DA0, 0x8DFE, + 0x5DA1, 0x8E40, + 0x5DA2, 0x8E41, + 0x5DA3, 0x8E42, + 0x5DA4, 0x8E43, + 0x5DA5, 0x8E44, + 0x5DA6, 0x8E45, + 0x5DA7, 0x8E46, + 0x5DA8, 0x8E47, + 0x5DA9, 0x8E48, + 0x5DAA, 0x8E49, + 0x5DAB, 0x8E4A, + 0x5DAC, 0x8E4B, + 0x5DAD, 0x8E4C, + 0x5DAE, 0x8E4D, + 0x5DAF, 0x8E4E, + 0x5DB0, 0x8E4F, + 0x5DB1, 0x8E50, + 0x5DB2, 0x8E51, + 0x5DB3, 0x8E52, + 0x5DB4, 0x8E53, + 0x5DB5, 0x8E54, + 0x5DB6, 0x8E55, + 0x5DB8, 0x8E56, + 0x5DB9, 0x8E57, + 0x5DBA, 0x8E58, + 0x5DBB, 0x8E59, + 0x5DBC, 0x8E5A, + 0x5DBD, 0x8E5B, + 0x5DBE, 0x8E5C, + 0x5DBF, 0x8E5D, + 0x5DC0, 0x8E5E, + 0x5DC1, 0x8E5F, + 0x5DC2, 0x8E60, + 0x5DC3, 0x8E61, + 0x5DC4, 0x8E62, + 0x5DC6, 0x8E63, + 0x5DC7, 0x8E64, + 0x5DC8, 0x8E65, + 0x5DC9, 0x8E66, + 0x5DCA, 0x8E67, + 0x5DCB, 0x8E68, + 0x5DCC, 0x8E69, + 0x5DCE, 0x8E6A, + 0x5DCF, 0x8E6B, + 0x5DD0, 0x8E6C, + 0x5DD1, 0x8E6D, + 0x5DD2, 0x8E6E, + 0x5DD3, 0x8E6F, + 0x5DD4, 0x8E70, + 0x5DD5, 0x8E71, + 0x5DD6, 0x8E72, + 0x5DD7, 0x8E73, + 0x5DD8, 0x8E74, + 0x5DD9, 0x8E75, + 0x5DDA, 0x8E76, + 0x5DDC, 0x8E77, + 0x5DDF, 0x8E78, + 0x5DE0, 0x8E79, + 0x5DE3, 0x8E7A, + 0x5DE4, 0x8E7B, + 0x5DEA, 0x8E7C, + 0x5DEC, 0x8E7D, + 0x5DED, 0x8E7E, + 0x5DF0, 0x8E80, + 0x5DF5, 0x8E81, + 0x5DF6, 0x8E82, + 0x5DF8, 0x8E83, + 0x5DF9, 0x8E84, + 0x5DFA, 0x8E85, + 0x5DFB, 0x8E86, + 0x5DFC, 0x8E87, + 0x5DFF, 0x8E88, + 0x5E00, 0x8E89, + 0x5E04, 0x8E8A, + 0x5E07, 0x8E8B, + 0x5E09, 0x8E8C, + 0x5E0A, 0x8E8D, + 0x5E0B, 0x8E8E, + 0x5E0D, 0x8E8F, + 0x5E0E, 0x8E90, + 0x5E12, 0x8E91, + 0x5E13, 0x8E92, + 0x5E17, 0x8E93, + 0x5E1E, 0x8E94, + 0x5E1F, 0x8E95, + 0x5E20, 0x8E96, + 0x5E21, 0x8E97, + 0x5E22, 0x8E98, + 0x5E23, 0x8E99, + 0x5E24, 0x8E9A, + 0x5E25, 0x8E9B, + 0x5E28, 0x8E9C, + 0x5E29, 0x8E9D, + 0x5E2A, 0x8E9E, + 0x5E2B, 0x8E9F, + 0x5E2C, 0x8EA0, + 0x5E2F, 0x8EA1, + 0x5E30, 0x8EA2, + 0x5E32, 0x8EA3, + 0x5E33, 0x8EA4, + 0x5E34, 0x8EA5, + 0x5E35, 0x8EA6, + 0x5E36, 0x8EA7, + 0x5E39, 0x8EA8, + 0x5E3A, 0x8EA9, + 0x5E3E, 0x8EAA, + 0x5E3F, 0x8EAB, + 0x5E40, 0x8EAC, + 0x5E41, 0x8EAD, + 0x5E43, 0x8EAE, + 0x5E46, 0x8EAF, + 0x5E47, 0x8EB0, + 0x5E48, 0x8EB1, + 0x5E49, 0x8EB2, + 0x5E4A, 0x8EB3, + 0x5E4B, 0x8EB4, + 0x5E4D, 0x8EB5, + 0x5E4E, 0x8EB6, + 0x5E4F, 0x8EB7, + 0x5E50, 0x8EB8, + 0x5E51, 0x8EB9, + 0x5E52, 0x8EBA, + 0x5E53, 0x8EBB, + 0x5E56, 0x8EBC, + 0x5E57, 0x8EBD, + 0x5E58, 0x8EBE, + 0x5E59, 0x8EBF, + 0x5E5A, 0x8EC0, + 0x5E5C, 0x8EC1, + 0x5E5D, 0x8EC2, + 0x5E5F, 0x8EC3, + 0x5E60, 0x8EC4, + 0x5E63, 0x8EC5, + 0x5E64, 0x8EC6, + 0x5E65, 0x8EC7, + 0x5E66, 0x8EC8, + 0x5E67, 0x8EC9, + 0x5E68, 0x8ECA, + 0x5E69, 0x8ECB, + 0x5E6A, 0x8ECC, + 0x5E6B, 0x8ECD, + 0x5E6C, 0x8ECE, + 0x5E6D, 0x8ECF, + 0x5E6E, 0x8ED0, + 0x5E6F, 0x8ED1, + 0x5E70, 0x8ED2, + 0x5E71, 0x8ED3, + 0x5E75, 0x8ED4, + 0x5E77, 0x8ED5, + 0x5E79, 0x8ED6, + 0x5E7E, 0x8ED7, + 0x5E81, 0x8ED8, + 0x5E82, 0x8ED9, + 0x5E83, 0x8EDA, + 0x5E85, 0x8EDB, + 0x5E88, 0x8EDC, + 0x5E89, 0x8EDD, + 0x5E8C, 0x8EDE, + 0x5E8D, 0x8EDF, + 0x5E8E, 0x8EE0, + 0x5E92, 0x8EE1, + 0x5E98, 0x8EE2, + 0x5E9B, 0x8EE3, + 0x5E9D, 0x8EE4, + 0x5EA1, 0x8EE5, + 0x5EA2, 0x8EE6, + 0x5EA3, 0x8EE7, + 0x5EA4, 0x8EE8, + 0x5EA8, 0x8EE9, + 0x5EA9, 0x8EEA, + 0x5EAA, 0x8EEB, + 0x5EAB, 0x8EEC, + 0x5EAC, 0x8EED, + 0x5EAE, 0x8EEE, + 0x5EAF, 0x8EEF, + 0x5EB0, 0x8EF0, + 0x5EB1, 0x8EF1, + 0x5EB2, 0x8EF2, + 0x5EB4, 0x8EF3, + 0x5EBA, 0x8EF4, + 0x5EBB, 0x8EF5, + 0x5EBC, 0x8EF6, + 0x5EBD, 0x8EF7, + 0x5EBF, 0x8EF8, + 0x5EC0, 0x8EF9, + 0x5EC1, 0x8EFA, + 0x5EC2, 0x8EFB, + 0x5EC3, 0x8EFC, + 0x5EC4, 0x8EFD, + 0x5EC5, 0x8EFE, + 0x5EC6, 0x8F40, + 0x5EC7, 0x8F41, + 0x5EC8, 0x8F42, + 0x5ECB, 0x8F43, + 0x5ECC, 0x8F44, + 0x5ECD, 0x8F45, + 0x5ECE, 0x8F46, + 0x5ECF, 0x8F47, + 0x5ED0, 0x8F48, + 0x5ED4, 0x8F49, + 0x5ED5, 0x8F4A, + 0x5ED7, 0x8F4B, + 0x5ED8, 0x8F4C, + 0x5ED9, 0x8F4D, + 0x5EDA, 0x8F4E, + 0x5EDC, 0x8F4F, + 0x5EDD, 0x8F50, + 0x5EDE, 0x8F51, + 0x5EDF, 0x8F52, + 0x5EE0, 0x8F53, + 0x5EE1, 0x8F54, + 0x5EE2, 0x8F55, + 0x5EE3, 0x8F56, + 0x5EE4, 0x8F57, + 0x5EE5, 0x8F58, + 0x5EE6, 0x8F59, + 0x5EE7, 0x8F5A, + 0x5EE9, 0x8F5B, + 0x5EEB, 0x8F5C, + 0x5EEC, 0x8F5D, + 0x5EED, 0x8F5E, + 0x5EEE, 0x8F5F, + 0x5EEF, 0x8F60, + 0x5EF0, 0x8F61, + 0x5EF1, 0x8F62, + 0x5EF2, 0x8F63, + 0x5EF3, 0x8F64, + 0x5EF5, 0x8F65, + 0x5EF8, 0x8F66, + 0x5EF9, 0x8F67, + 0x5EFB, 0x8F68, + 0x5EFC, 0x8F69, + 0x5EFD, 0x8F6A, + 0x5F05, 0x8F6B, + 0x5F06, 0x8F6C, + 0x5F07, 0x8F6D, + 0x5F09, 0x8F6E, + 0x5F0C, 0x8F6F, + 0x5F0D, 0x8F70, + 0x5F0E, 0x8F71, + 0x5F10, 0x8F72, + 0x5F12, 0x8F73, + 0x5F14, 0x8F74, + 0x5F16, 0x8F75, + 0x5F19, 0x8F76, + 0x5F1A, 0x8F77, + 0x5F1C, 0x8F78, + 0x5F1D, 0x8F79, + 0x5F1E, 0x8F7A, + 0x5F21, 0x8F7B, + 0x5F22, 0x8F7C, + 0x5F23, 0x8F7D, + 0x5F24, 0x8F7E, + 0x5F28, 0x8F80, + 0x5F2B, 0x8F81, + 0x5F2C, 0x8F82, + 0x5F2E, 0x8F83, + 0x5F30, 0x8F84, + 0x5F32, 0x8F85, + 0x5F33, 0x8F86, + 0x5F34, 0x8F87, + 0x5F35, 0x8F88, + 0x5F36, 0x8F89, + 0x5F37, 0x8F8A, + 0x5F38, 0x8F8B, + 0x5F3B, 0x8F8C, + 0x5F3D, 0x8F8D, + 0x5F3E, 0x8F8E, + 0x5F3F, 0x8F8F, + 0x5F41, 0x8F90, + 0x5F42, 0x8F91, + 0x5F43, 0x8F92, + 0x5F44, 0x8F93, + 0x5F45, 0x8F94, + 0x5F46, 0x8F95, + 0x5F47, 0x8F96, + 0x5F48, 0x8F97, + 0x5F49, 0x8F98, + 0x5F4A, 0x8F99, + 0x5F4B, 0x8F9A, + 0x5F4C, 0x8F9B, + 0x5F4D, 0x8F9C, + 0x5F4E, 0x8F9D, + 0x5F4F, 0x8F9E, + 0x5F51, 0x8F9F, + 0x5F54, 0x8FA0, + 0x5F59, 0x8FA1, + 0x5F5A, 0x8FA2, + 0x5F5B, 0x8FA3, + 0x5F5C, 0x8FA4, + 0x5F5E, 0x8FA5, + 0x5F5F, 0x8FA6, + 0x5F60, 0x8FA7, + 0x5F63, 0x8FA8, + 0x5F65, 0x8FA9, + 0x5F67, 0x8FAA, + 0x5F68, 0x8FAB, + 0x5F6B, 0x8FAC, + 0x5F6E, 0x8FAD, + 0x5F6F, 0x8FAE, + 0x5F72, 0x8FAF, + 0x5F74, 0x8FB0, + 0x5F75, 0x8FB1, + 0x5F76, 0x8FB2, + 0x5F78, 0x8FB3, + 0x5F7A, 0x8FB4, + 0x5F7D, 0x8FB5, + 0x5F7E, 0x8FB6, + 0x5F7F, 0x8FB7, + 0x5F83, 0x8FB8, + 0x5F86, 0x8FB9, + 0x5F8D, 0x8FBA, + 0x5F8E, 0x8FBB, + 0x5F8F, 0x8FBC, + 0x5F91, 0x8FBD, + 0x5F93, 0x8FBE, + 0x5F94, 0x8FBF, + 0x5F96, 0x8FC0, + 0x5F9A, 0x8FC1, + 0x5F9B, 0x8FC2, + 0x5F9D, 0x8FC3, + 0x5F9E, 0x8FC4, + 0x5F9F, 0x8FC5, + 0x5FA0, 0x8FC6, + 0x5FA2, 0x8FC7, + 0x5FA3, 0x8FC8, + 0x5FA4, 0x8FC9, + 0x5FA5, 0x8FCA, + 0x5FA6, 0x8FCB, + 0x5FA7, 0x8FCC, + 0x5FA9, 0x8FCD, + 0x5FAB, 0x8FCE, + 0x5FAC, 0x8FCF, + 0x5FAF, 0x8FD0, + 0x5FB0, 0x8FD1, + 0x5FB1, 0x8FD2, + 0x5FB2, 0x8FD3, + 0x5FB3, 0x8FD4, + 0x5FB4, 0x8FD5, + 0x5FB6, 0x8FD6, + 0x5FB8, 0x8FD7, + 0x5FB9, 0x8FD8, + 0x5FBA, 0x8FD9, + 0x5FBB, 0x8FDA, + 0x5FBE, 0x8FDB, + 0x5FBF, 0x8FDC, + 0x5FC0, 0x8FDD, + 0x5FC1, 0x8FDE, + 0x5FC2, 0x8FDF, + 0x5FC7, 0x8FE0, + 0x5FC8, 0x8FE1, + 0x5FCA, 0x8FE2, + 0x5FCB, 0x8FE3, + 0x5FCE, 0x8FE4, + 0x5FD3, 0x8FE5, + 0x5FD4, 0x8FE6, + 0x5FD5, 0x8FE7, + 0x5FDA, 0x8FE8, + 0x5FDB, 0x8FE9, + 0x5FDC, 0x8FEA, + 0x5FDE, 0x8FEB, + 0x5FDF, 0x8FEC, + 0x5FE2, 0x8FED, + 0x5FE3, 0x8FEE, + 0x5FE5, 0x8FEF, + 0x5FE6, 0x8FF0, + 0x5FE8, 0x8FF1, + 0x5FE9, 0x8FF2, + 0x5FEC, 0x8FF3, + 0x5FEF, 0x8FF4, + 0x5FF0, 0x8FF5, + 0x5FF2, 0x8FF6, + 0x5FF3, 0x8FF7, + 0x5FF4, 0x8FF8, + 0x5FF6, 0x8FF9, + 0x5FF7, 0x8FFA, + 0x5FF9, 0x8FFB, + 0x5FFA, 0x8FFC, + 0x5FFC, 0x8FFD, + 0x6007, 0x8FFE, + 0x6008, 0x9040, + 0x6009, 0x9041, + 0x600B, 0x9042, + 0x600C, 0x9043, + 0x6010, 0x9044, + 0x6011, 0x9045, + 0x6013, 0x9046, + 0x6017, 0x9047, + 0x6018, 0x9048, + 0x601A, 0x9049, + 0x601E, 0x904A, + 0x601F, 0x904B, + 0x6022, 0x904C, + 0x6023, 0x904D, + 0x6024, 0x904E, + 0x602C, 0x904F, + 0x602D, 0x9050, + 0x602E, 0x9051, + 0x6030, 0x9052, + 0x6031, 0x9053, + 0x6032, 0x9054, + 0x6033, 0x9055, + 0x6034, 0x9056, + 0x6036, 0x9057, + 0x6037, 0x9058, + 0x6038, 0x9059, + 0x6039, 0x905A, + 0x603A, 0x905B, + 0x603D, 0x905C, + 0x603E, 0x905D, + 0x6040, 0x905E, + 0x6044, 0x905F, + 0x6045, 0x9060, + 0x6046, 0x9061, + 0x6047, 0x9062, + 0x6048, 0x9063, + 0x6049, 0x9064, + 0x604A, 0x9065, + 0x604C, 0x9066, + 0x604E, 0x9067, + 0x604F, 0x9068, + 0x6051, 0x9069, + 0x6053, 0x906A, + 0x6054, 0x906B, + 0x6056, 0x906C, + 0x6057, 0x906D, + 0x6058, 0x906E, + 0x605B, 0x906F, + 0x605C, 0x9070, + 0x605E, 0x9071, + 0x605F, 0x9072, + 0x6060, 0x9073, + 0x6061, 0x9074, + 0x6065, 0x9075, + 0x6066, 0x9076, + 0x606E, 0x9077, + 0x6071, 0x9078, + 0x6072, 0x9079, + 0x6074, 0x907A, + 0x6075, 0x907B, + 0x6077, 0x907C, + 0x607E, 0x907D, + 0x6080, 0x907E, + 0x6081, 0x9080, + 0x6082, 0x9081, + 0x6085, 0x9082, + 0x6086, 0x9083, + 0x6087, 0x9084, + 0x6088, 0x9085, + 0x608A, 0x9086, + 0x608B, 0x9087, + 0x608E, 0x9088, + 0x608F, 0x9089, + 0x6090, 0x908A, + 0x6091, 0x908B, + 0x6093, 0x908C, + 0x6095, 0x908D, + 0x6097, 0x908E, + 0x6098, 0x908F, + 0x6099, 0x9090, + 0x609C, 0x9091, + 0x609E, 0x9092, + 0x60A1, 0x9093, + 0x60A2, 0x9094, + 0x60A4, 0x9095, + 0x60A5, 0x9096, + 0x60A7, 0x9097, + 0x60A9, 0x9098, + 0x60AA, 0x9099, + 0x60AE, 0x909A, + 0x60B0, 0x909B, + 0x60B3, 0x909C, + 0x60B5, 0x909D, + 0x60B6, 0x909E, + 0x60B7, 0x909F, + 0x60B9, 0x90A0, + 0x60BA, 0x90A1, + 0x60BD, 0x90A2, + 0x60BE, 0x90A3, + 0x60BF, 0x90A4, + 0x60C0, 0x90A5, + 0x60C1, 0x90A6, + 0x60C2, 0x90A7, + 0x60C3, 0x90A8, + 0x60C4, 0x90A9, + 0x60C7, 0x90AA, + 0x60C8, 0x90AB, + 0x60C9, 0x90AC, + 0x60CC, 0x90AD, + 0x60CD, 0x90AE, + 0x60CE, 0x90AF, + 0x60CF, 0x90B0, + 0x60D0, 0x90B1, + 0x60D2, 0x90B2, + 0x60D3, 0x90B3, + 0x60D4, 0x90B4, + 0x60D6, 0x90B5, + 0x60D7, 0x90B6, + 0x60D9, 0x90B7, + 0x60DB, 0x90B8, + 0x60DE, 0x90B9, + 0x60E1, 0x90BA, + 0x60E2, 0x90BB, + 0x60E3, 0x90BC, + 0x60E4, 0x90BD, + 0x60E5, 0x90BE, + 0x60EA, 0x90BF, + 0x60F1, 0x90C0, + 0x60F2, 0x90C1, + 0x60F5, 0x90C2, + 0x60F7, 0x90C3, + 0x60F8, 0x90C4, + 0x60FB, 0x90C5, + 0x60FC, 0x90C6, + 0x60FD, 0x90C7, + 0x60FE, 0x90C8, + 0x60FF, 0x90C9, + 0x6102, 0x90CA, + 0x6103, 0x90CB, + 0x6104, 0x90CC, + 0x6105, 0x90CD, + 0x6107, 0x90CE, + 0x610A, 0x90CF, + 0x610B, 0x90D0, + 0x610C, 0x90D1, + 0x6110, 0x90D2, + 0x6111, 0x90D3, + 0x6112, 0x90D4, + 0x6113, 0x90D5, + 0x6114, 0x90D6, + 0x6116, 0x90D7, + 0x6117, 0x90D8, + 0x6118, 0x90D9, + 0x6119, 0x90DA, + 0x611B, 0x90DB, + 0x611C, 0x90DC, + 0x611D, 0x90DD, + 0x611E, 0x90DE, + 0x6121, 0x90DF, + 0x6122, 0x90E0, + 0x6125, 0x90E1, + 0x6128, 0x90E2, + 0x6129, 0x90E3, + 0x612A, 0x90E4, + 0x612C, 0x90E5, + 0x612D, 0x90E6, + 0x612E, 0x90E7, + 0x612F, 0x90E8, + 0x6130, 0x90E9, + 0x6131, 0x90EA, + 0x6132, 0x90EB, + 0x6133, 0x90EC, + 0x6134, 0x90ED, + 0x6135, 0x90EE, + 0x6136, 0x90EF, + 0x6137, 0x90F0, + 0x6138, 0x90F1, + 0x6139, 0x90F2, + 0x613A, 0x90F3, + 0x613B, 0x90F4, + 0x613C, 0x90F5, + 0x613D, 0x90F6, + 0x613E, 0x90F7, + 0x6140, 0x90F8, + 0x6141, 0x90F9, + 0x6142, 0x90FA, + 0x6143, 0x90FB, + 0x6144, 0x90FC, + 0x6145, 0x90FD, + 0x6146, 0x90FE, + 0x6147, 0x9140, + 0x6149, 0x9141, + 0x614B, 0x9142, + 0x614D, 0x9143, + 0x614F, 0x9144, + 0x6150, 0x9145, + 0x6152, 0x9146, + 0x6153, 0x9147, + 0x6154, 0x9148, + 0x6156, 0x9149, + 0x6157, 0x914A, + 0x6158, 0x914B, + 0x6159, 0x914C, + 0x615A, 0x914D, + 0x615B, 0x914E, + 0x615C, 0x914F, + 0x615E, 0x9150, + 0x615F, 0x9151, + 0x6160, 0x9152, + 0x6161, 0x9153, + 0x6163, 0x9154, + 0x6164, 0x9155, + 0x6165, 0x9156, + 0x6166, 0x9157, + 0x6169, 0x9158, + 0x616A, 0x9159, + 0x616B, 0x915A, + 0x616C, 0x915B, + 0x616D, 0x915C, + 0x616E, 0x915D, + 0x616F, 0x915E, + 0x6171, 0x915F, + 0x6172, 0x9160, + 0x6173, 0x9161, + 0x6174, 0x9162, + 0x6176, 0x9163, + 0x6178, 0x9164, + 0x6179, 0x9165, + 0x617A, 0x9166, + 0x617B, 0x9167, + 0x617C, 0x9168, + 0x617D, 0x9169, + 0x617E, 0x916A, + 0x617F, 0x916B, + 0x6180, 0x916C, + 0x6181, 0x916D, + 0x6182, 0x916E, + 0x6183, 0x916F, + 0x6184, 0x9170, + 0x6185, 0x9171, + 0x6186, 0x9172, + 0x6187, 0x9173, + 0x6188, 0x9174, + 0x6189, 0x9175, + 0x618A, 0x9176, + 0x618C, 0x9177, + 0x618D, 0x9178, + 0x618F, 0x9179, + 0x6190, 0x917A, + 0x6191, 0x917B, + 0x6192, 0x917C, + 0x6193, 0x917D, + 0x6195, 0x917E, + 0x6196, 0x9180, + 0x6197, 0x9181, + 0x6198, 0x9182, + 0x6199, 0x9183, + 0x619A, 0x9184, + 0x619B, 0x9185, + 0x619C, 0x9186, + 0x619E, 0x9187, + 0x619F, 0x9188, + 0x61A0, 0x9189, + 0x61A1, 0x918A, + 0x61A2, 0x918B, + 0x61A3, 0x918C, + 0x61A4, 0x918D, + 0x61A5, 0x918E, + 0x61A6, 0x918F, + 0x61AA, 0x9190, + 0x61AB, 0x9191, + 0x61AD, 0x9192, + 0x61AE, 0x9193, + 0x61AF, 0x9194, + 0x61B0, 0x9195, + 0x61B1, 0x9196, + 0x61B2, 0x9197, + 0x61B3, 0x9198, + 0x61B4, 0x9199, + 0x61B5, 0x919A, + 0x61B6, 0x919B, + 0x61B8, 0x919C, + 0x61B9, 0x919D, + 0x61BA, 0x919E, + 0x61BB, 0x919F, + 0x61BC, 0x91A0, + 0x61BD, 0x91A1, + 0x61BF, 0x91A2, + 0x61C0, 0x91A3, + 0x61C1, 0x91A4, + 0x61C3, 0x91A5, + 0x61C4, 0x91A6, + 0x61C5, 0x91A7, + 0x61C6, 0x91A8, + 0x61C7, 0x91A9, + 0x61C9, 0x91AA, + 0x61CC, 0x91AB, + 0x61CD, 0x91AC, + 0x61CE, 0x91AD, + 0x61CF, 0x91AE, + 0x61D0, 0x91AF, + 0x61D3, 0x91B0, + 0x61D5, 0x91B1, + 0x61D6, 0x91B2, + 0x61D7, 0x91B3, + 0x61D8, 0x91B4, + 0x61D9, 0x91B5, + 0x61DA, 0x91B6, + 0x61DB, 0x91B7, + 0x61DC, 0x91B8, + 0x61DD, 0x91B9, + 0x61DE, 0x91BA, + 0x61DF, 0x91BB, + 0x61E0, 0x91BC, + 0x61E1, 0x91BD, + 0x61E2, 0x91BE, + 0x61E3, 0x91BF, + 0x61E4, 0x91C0, + 0x61E5, 0x91C1, + 0x61E7, 0x91C2, + 0x61E8, 0x91C3, + 0x61E9, 0x91C4, + 0x61EA, 0x91C5, + 0x61EB, 0x91C6, + 0x61EC, 0x91C7, + 0x61ED, 0x91C8, + 0x61EE, 0x91C9, + 0x61EF, 0x91CA, + 0x61F0, 0x91CB, + 0x61F1, 0x91CC, + 0x61F2, 0x91CD, + 0x61F3, 0x91CE, + 0x61F4, 0x91CF, + 0x61F6, 0x91D0, + 0x61F7, 0x91D1, + 0x61F8, 0x91D2, + 0x61F9, 0x91D3, + 0x61FA, 0x91D4, + 0x61FB, 0x91D5, + 0x61FC, 0x91D6, + 0x61FD, 0x91D7, + 0x61FE, 0x91D8, + 0x6200, 0x91D9, + 0x6201, 0x91DA, + 0x6202, 0x91DB, + 0x6203, 0x91DC, + 0x6204, 0x91DD, + 0x6205, 0x91DE, + 0x6207, 0x91DF, + 0x6209, 0x91E0, + 0x6213, 0x91E1, + 0x6214, 0x91E2, + 0x6219, 0x91E3, + 0x621C, 0x91E4, + 0x621D, 0x91E5, + 0x621E, 0x91E6, + 0x6220, 0x91E7, + 0x6223, 0x91E8, + 0x6226, 0x91E9, + 0x6227, 0x91EA, + 0x6228, 0x91EB, + 0x6229, 0x91EC, + 0x622B, 0x91ED, + 0x622D, 0x91EE, + 0x622F, 0x91EF, + 0x6230, 0x91F0, + 0x6231, 0x91F1, + 0x6232, 0x91F2, + 0x6235, 0x91F3, + 0x6236, 0x91F4, + 0x6238, 0x91F5, + 0x6239, 0x91F6, + 0x623A, 0x91F7, + 0x623B, 0x91F8, + 0x623C, 0x91F9, + 0x6242, 0x91FA, + 0x6244, 0x91FB, + 0x6245, 0x91FC, + 0x6246, 0x91FD, + 0x624A, 0x91FE, + 0x624F, 0x9240, + 0x6250, 0x9241, + 0x6255, 0x9242, + 0x6256, 0x9243, + 0x6257, 0x9244, + 0x6259, 0x9245, + 0x625A, 0x9246, + 0x625C, 0x9247, + 0x625D, 0x9248, + 0x625E, 0x9249, + 0x625F, 0x924A, + 0x6260, 0x924B, + 0x6261, 0x924C, + 0x6262, 0x924D, + 0x6264, 0x924E, + 0x6265, 0x924F, + 0x6268, 0x9250, + 0x6271, 0x9251, + 0x6272, 0x9252, + 0x6274, 0x9253, + 0x6275, 0x9254, + 0x6277, 0x9255, + 0x6278, 0x9256, + 0x627A, 0x9257, + 0x627B, 0x9258, + 0x627D, 0x9259, + 0x6281, 0x925A, + 0x6282, 0x925B, + 0x6283, 0x925C, + 0x6285, 0x925D, + 0x6286, 0x925E, + 0x6287, 0x925F, + 0x6288, 0x9260, + 0x628B, 0x9261, + 0x628C, 0x9262, + 0x628D, 0x9263, + 0x628E, 0x9264, + 0x628F, 0x9265, + 0x6290, 0x9266, + 0x6294, 0x9267, + 0x6299, 0x9268, + 0x629C, 0x9269, + 0x629D, 0x926A, + 0x629E, 0x926B, + 0x62A3, 0x926C, + 0x62A6, 0x926D, + 0x62A7, 0x926E, + 0x62A9, 0x926F, + 0x62AA, 0x9270, + 0x62AD, 0x9271, + 0x62AE, 0x9272, + 0x62AF, 0x9273, + 0x62B0, 0x9274, + 0x62B2, 0x9275, + 0x62B3, 0x9276, + 0x62B4, 0x9277, + 0x62B6, 0x9278, + 0x62B7, 0x9279, + 0x62B8, 0x927A, + 0x62BA, 0x927B, + 0x62BE, 0x927C, + 0x62C0, 0x927D, + 0x62C1, 0x927E, + 0x62C3, 0x9280, + 0x62CB, 0x9281, + 0x62CF, 0x9282, + 0x62D1, 0x9283, + 0x62D5, 0x9284, + 0x62DD, 0x9285, + 0x62DE, 0x9286, + 0x62E0, 0x9287, + 0x62E1, 0x9288, + 0x62E4, 0x9289, + 0x62EA, 0x928A, + 0x62EB, 0x928B, + 0x62F0, 0x928C, + 0x62F2, 0x928D, + 0x62F5, 0x928E, + 0x62F8, 0x928F, + 0x62F9, 0x9290, + 0x62FA, 0x9291, + 0x62FB, 0x9292, + 0x6300, 0x9293, + 0x6303, 0x9294, + 0x6304, 0x9295, + 0x6305, 0x9296, + 0x6306, 0x9297, + 0x630A, 0x9298, + 0x630B, 0x9299, + 0x630C, 0x929A, + 0x630D, 0x929B, + 0x630F, 0x929C, + 0x6310, 0x929D, + 0x6312, 0x929E, + 0x6313, 0x929F, + 0x6314, 0x92A0, + 0x6315, 0x92A1, + 0x6317, 0x92A2, + 0x6318, 0x92A3, + 0x6319, 0x92A4, + 0x631C, 0x92A5, + 0x6326, 0x92A6, + 0x6327, 0x92A7, + 0x6329, 0x92A8, + 0x632C, 0x92A9, + 0x632D, 0x92AA, + 0x632E, 0x92AB, + 0x6330, 0x92AC, + 0x6331, 0x92AD, + 0x6333, 0x92AE, + 0x6334, 0x92AF, + 0x6335, 0x92B0, + 0x6336, 0x92B1, + 0x6337, 0x92B2, + 0x6338, 0x92B3, + 0x633B, 0x92B4, + 0x633C, 0x92B5, + 0x633E, 0x92B6, + 0x633F, 0x92B7, + 0x6340, 0x92B8, + 0x6341, 0x92B9, + 0x6344, 0x92BA, + 0x6347, 0x92BB, + 0x6348, 0x92BC, + 0x634A, 0x92BD, + 0x6351, 0x92BE, + 0x6352, 0x92BF, + 0x6353, 0x92C0, + 0x6354, 0x92C1, + 0x6356, 0x92C2, + 0x6357, 0x92C3, + 0x6358, 0x92C4, + 0x6359, 0x92C5, + 0x635A, 0x92C6, + 0x635B, 0x92C7, + 0x635C, 0x92C8, + 0x635D, 0x92C9, + 0x6360, 0x92CA, + 0x6364, 0x92CB, + 0x6365, 0x92CC, + 0x6366, 0x92CD, + 0x6368, 0x92CE, + 0x636A, 0x92CF, + 0x636B, 0x92D0, + 0x636C, 0x92D1, + 0x636F, 0x92D2, + 0x6370, 0x92D3, + 0x6372, 0x92D4, + 0x6373, 0x92D5, + 0x6374, 0x92D6, + 0x6375, 0x92D7, + 0x6378, 0x92D8, + 0x6379, 0x92D9, + 0x637C, 0x92DA, + 0x637D, 0x92DB, + 0x637E, 0x92DC, + 0x637F, 0x92DD, + 0x6381, 0x92DE, + 0x6383, 0x92DF, + 0x6384, 0x92E0, + 0x6385, 0x92E1, + 0x6386, 0x92E2, + 0x638B, 0x92E3, + 0x638D, 0x92E4, + 0x6391, 0x92E5, + 0x6393, 0x92E6, + 0x6394, 0x92E7, + 0x6395, 0x92E8, + 0x6397, 0x92E9, + 0x6399, 0x92EA, + 0x639A, 0x92EB, + 0x639B, 0x92EC, + 0x639C, 0x92ED, + 0x639D, 0x92EE, + 0x639E, 0x92EF, + 0x639F, 0x92F0, + 0x63A1, 0x92F1, + 0x63A4, 0x92F2, + 0x63A6, 0x92F3, + 0x63AB, 0x92F4, + 0x63AF, 0x92F5, + 0x63B1, 0x92F6, + 0x63B2, 0x92F7, + 0x63B5, 0x92F8, + 0x63B6, 0x92F9, + 0x63B9, 0x92FA, + 0x63BB, 0x92FB, + 0x63BD, 0x92FC, + 0x63BF, 0x92FD, + 0x63C0, 0x92FE, + 0x63C1, 0x9340, + 0x63C2, 0x9341, + 0x63C3, 0x9342, + 0x63C5, 0x9343, + 0x63C7, 0x9344, + 0x63C8, 0x9345, + 0x63CA, 0x9346, + 0x63CB, 0x9347, + 0x63CC, 0x9348, + 0x63D1, 0x9349, + 0x63D3, 0x934A, + 0x63D4, 0x934B, + 0x63D5, 0x934C, + 0x63D7, 0x934D, + 0x63D8, 0x934E, + 0x63D9, 0x934F, + 0x63DA, 0x9350, + 0x63DB, 0x9351, + 0x63DC, 0x9352, + 0x63DD, 0x9353, + 0x63DF, 0x9354, + 0x63E2, 0x9355, + 0x63E4, 0x9356, + 0x63E5, 0x9357, + 0x63E6, 0x9358, + 0x63E7, 0x9359, + 0x63E8, 0x935A, + 0x63EB, 0x935B, + 0x63EC, 0x935C, + 0x63EE, 0x935D, + 0x63EF, 0x935E, + 0x63F0, 0x935F, + 0x63F1, 0x9360, + 0x63F3, 0x9361, + 0x63F5, 0x9362, + 0x63F7, 0x9363, + 0x63F9, 0x9364, + 0x63FA, 0x9365, + 0x63FB, 0x9366, + 0x63FC, 0x9367, + 0x63FE, 0x9368, + 0x6403, 0x9369, + 0x6404, 0x936A, + 0x6406, 0x936B, + 0x6407, 0x936C, + 0x6408, 0x936D, + 0x6409, 0x936E, + 0x640A, 0x936F, + 0x640D, 0x9370, + 0x640E, 0x9371, + 0x6411, 0x9372, + 0x6412, 0x9373, + 0x6415, 0x9374, + 0x6416, 0x9375, + 0x6417, 0x9376, + 0x6418, 0x9377, + 0x6419, 0x9378, + 0x641A, 0x9379, + 0x641D, 0x937A, + 0x641F, 0x937B, + 0x6422, 0x937C, + 0x6423, 0x937D, + 0x6424, 0x937E, + 0x6425, 0x9380, + 0x6427, 0x9381, + 0x6428, 0x9382, + 0x6429, 0x9383, + 0x642B, 0x9384, + 0x642E, 0x9385, + 0x642F, 0x9386, + 0x6430, 0x9387, + 0x6431, 0x9388, + 0x6432, 0x9389, + 0x6433, 0x938A, + 0x6435, 0x938B, + 0x6436, 0x938C, + 0x6437, 0x938D, + 0x6438, 0x938E, + 0x6439, 0x938F, + 0x643B, 0x9390, + 0x643C, 0x9391, + 0x643E, 0x9392, + 0x6440, 0x9393, + 0x6442, 0x9394, + 0x6443, 0x9395, + 0x6449, 0x9396, + 0x644B, 0x9397, + 0x644C, 0x9398, + 0x644D, 0x9399, + 0x644E, 0x939A, + 0x644F, 0x939B, + 0x6450, 0x939C, + 0x6451, 0x939D, + 0x6453, 0x939E, + 0x6455, 0x939F, + 0x6456, 0x93A0, + 0x6457, 0x93A1, + 0x6459, 0x93A2, + 0x645A, 0x93A3, + 0x645B, 0x93A4, + 0x645C, 0x93A5, + 0x645D, 0x93A6, + 0x645F, 0x93A7, + 0x6460, 0x93A8, + 0x6461, 0x93A9, + 0x6462, 0x93AA, + 0x6463, 0x93AB, + 0x6464, 0x93AC, + 0x6465, 0x93AD, + 0x6466, 0x93AE, + 0x6468, 0x93AF, + 0x646A, 0x93B0, + 0x646B, 0x93B1, + 0x646C, 0x93B2, + 0x646E, 0x93B3, + 0x646F, 0x93B4, + 0x6470, 0x93B5, + 0x6471, 0x93B6, + 0x6472, 0x93B7, + 0x6473, 0x93B8, + 0x6474, 0x93B9, + 0x6475, 0x93BA, + 0x6476, 0x93BB, + 0x6477, 0x93BC, + 0x647B, 0x93BD, + 0x647C, 0x93BE, + 0x647D, 0x93BF, + 0x647E, 0x93C0, + 0x647F, 0x93C1, + 0x6480, 0x93C2, + 0x6481, 0x93C3, + 0x6483, 0x93C4, + 0x6486, 0x93C5, + 0x6488, 0x93C6, + 0x6489, 0x93C7, + 0x648A, 0x93C8, + 0x648B, 0x93C9, + 0x648C, 0x93CA, + 0x648D, 0x93CB, + 0x648E, 0x93CC, + 0x648F, 0x93CD, + 0x6490, 0x93CE, + 0x6493, 0x93CF, + 0x6494, 0x93D0, + 0x6497, 0x93D1, + 0x6498, 0x93D2, + 0x649A, 0x93D3, + 0x649B, 0x93D4, + 0x649C, 0x93D5, + 0x649D, 0x93D6, + 0x649F, 0x93D7, + 0x64A0, 0x93D8, + 0x64A1, 0x93D9, + 0x64A2, 0x93DA, + 0x64A3, 0x93DB, + 0x64A5, 0x93DC, + 0x64A6, 0x93DD, + 0x64A7, 0x93DE, + 0x64A8, 0x93DF, + 0x64AA, 0x93E0, + 0x64AB, 0x93E1, + 0x64AF, 0x93E2, + 0x64B1, 0x93E3, + 0x64B2, 0x93E4, + 0x64B3, 0x93E5, + 0x64B4, 0x93E6, + 0x64B6, 0x93E7, + 0x64B9, 0x93E8, + 0x64BB, 0x93E9, + 0x64BD, 0x93EA, + 0x64BE, 0x93EB, + 0x64BF, 0x93EC, + 0x64C1, 0x93ED, + 0x64C3, 0x93EE, + 0x64C4, 0x93EF, + 0x64C6, 0x93F0, + 0x64C7, 0x93F1, + 0x64C8, 0x93F2, + 0x64C9, 0x93F3, + 0x64CA, 0x93F4, + 0x64CB, 0x93F5, + 0x64CC, 0x93F6, + 0x64CF, 0x93F7, + 0x64D1, 0x93F8, + 0x64D3, 0x93F9, + 0x64D4, 0x93FA, + 0x64D5, 0x93FB, + 0x64D6, 0x93FC, + 0x64D9, 0x93FD, + 0x64DA, 0x93FE, + 0x64DB, 0x9440, + 0x64DC, 0x9441, + 0x64DD, 0x9442, + 0x64DF, 0x9443, + 0x64E0, 0x9444, + 0x64E1, 0x9445, + 0x64E3, 0x9446, + 0x64E5, 0x9447, + 0x64E7, 0x9448, + 0x64E8, 0x9449, + 0x64E9, 0x944A, + 0x64EA, 0x944B, + 0x64EB, 0x944C, + 0x64EC, 0x944D, + 0x64ED, 0x944E, + 0x64EE, 0x944F, + 0x64EF, 0x9450, + 0x64F0, 0x9451, + 0x64F1, 0x9452, + 0x64F2, 0x9453, + 0x64F3, 0x9454, + 0x64F4, 0x9455, + 0x64F5, 0x9456, + 0x64F6, 0x9457, + 0x64F7, 0x9458, + 0x64F8, 0x9459, + 0x64F9, 0x945A, + 0x64FA, 0x945B, + 0x64FB, 0x945C, + 0x64FC, 0x945D, + 0x64FD, 0x945E, + 0x64FE, 0x945F, + 0x64FF, 0x9460, + 0x6501, 0x9461, + 0x6502, 0x9462, + 0x6503, 0x9463, + 0x6504, 0x9464, + 0x6505, 0x9465, + 0x6506, 0x9466, + 0x6507, 0x9467, + 0x6508, 0x9468, + 0x650A, 0x9469, + 0x650B, 0x946A, + 0x650C, 0x946B, + 0x650D, 0x946C, + 0x650E, 0x946D, + 0x650F, 0x946E, + 0x6510, 0x946F, + 0x6511, 0x9470, + 0x6513, 0x9471, + 0x6514, 0x9472, + 0x6515, 0x9473, + 0x6516, 0x9474, + 0x6517, 0x9475, + 0x6519, 0x9476, + 0x651A, 0x9477, + 0x651B, 0x9478, + 0x651C, 0x9479, + 0x651D, 0x947A, + 0x651E, 0x947B, + 0x651F, 0x947C, + 0x6520, 0x947D, + 0x6521, 0x947E, + 0x6522, 0x9480, + 0x6523, 0x9481, + 0x6524, 0x9482, + 0x6526, 0x9483, + 0x6527, 0x9484, + 0x6528, 0x9485, + 0x6529, 0x9486, + 0x652A, 0x9487, + 0x652C, 0x9488, + 0x652D, 0x9489, + 0x6530, 0x948A, + 0x6531, 0x948B, + 0x6532, 0x948C, + 0x6533, 0x948D, + 0x6537, 0x948E, + 0x653A, 0x948F, + 0x653C, 0x9490, + 0x653D, 0x9491, + 0x6540, 0x9492, + 0x6541, 0x9493, + 0x6542, 0x9494, + 0x6543, 0x9495, + 0x6544, 0x9496, + 0x6546, 0x9497, + 0x6547, 0x9498, + 0x654A, 0x9499, + 0x654B, 0x949A, + 0x654D, 0x949B, + 0x654E, 0x949C, + 0x6550, 0x949D, + 0x6552, 0x949E, + 0x6553, 0x949F, + 0x6554, 0x94A0, + 0x6557, 0x94A1, + 0x6558, 0x94A2, + 0x655A, 0x94A3, + 0x655C, 0x94A4, + 0x655F, 0x94A5, + 0x6560, 0x94A6, + 0x6561, 0x94A7, + 0x6564, 0x94A8, + 0x6565, 0x94A9, + 0x6567, 0x94AA, + 0x6568, 0x94AB, + 0x6569, 0x94AC, + 0x656A, 0x94AD, + 0x656D, 0x94AE, + 0x656E, 0x94AF, + 0x656F, 0x94B0, + 0x6571, 0x94B1, + 0x6573, 0x94B2, + 0x6575, 0x94B3, + 0x6576, 0x94B4, + 0x6578, 0x94B5, + 0x6579, 0x94B6, + 0x657A, 0x94B7, + 0x657B, 0x94B8, + 0x657C, 0x94B9, + 0x657D, 0x94BA, + 0x657E, 0x94BB, + 0x657F, 0x94BC, + 0x6580, 0x94BD, + 0x6581, 0x94BE, + 0x6582, 0x94BF, + 0x6583, 0x94C0, + 0x6584, 0x94C1, + 0x6585, 0x94C2, + 0x6586, 0x94C3, + 0x6588, 0x94C4, + 0x6589, 0x94C5, + 0x658A, 0x94C6, + 0x658D, 0x94C7, + 0x658E, 0x94C8, + 0x658F, 0x94C9, + 0x6592, 0x94CA, + 0x6594, 0x94CB, + 0x6595, 0x94CC, + 0x6596, 0x94CD, + 0x6598, 0x94CE, + 0x659A, 0x94CF, + 0x659D, 0x94D0, + 0x659E, 0x94D1, + 0x65A0, 0x94D2, + 0x65A2, 0x94D3, + 0x65A3, 0x94D4, + 0x65A6, 0x94D5, + 0x65A8, 0x94D6, + 0x65AA, 0x94D7, + 0x65AC, 0x94D8, + 0x65AE, 0x94D9, + 0x65B1, 0x94DA, + 0x65B2, 0x94DB, + 0x65B3, 0x94DC, + 0x65B4, 0x94DD, + 0x65B5, 0x94DE, + 0x65B6, 0x94DF, + 0x65B7, 0x94E0, + 0x65B8, 0x94E1, + 0x65BA, 0x94E2, + 0x65BB, 0x94E3, + 0x65BE, 0x94E4, + 0x65BF, 0x94E5, + 0x65C0, 0x94E6, + 0x65C2, 0x94E7, + 0x65C7, 0x94E8, + 0x65C8, 0x94E9, + 0x65C9, 0x94EA, + 0x65CA, 0x94EB, + 0x65CD, 0x94EC, + 0x65D0, 0x94ED, + 0x65D1, 0x94EE, + 0x65D3, 0x94EF, + 0x65D4, 0x94F0, + 0x65D5, 0x94F1, + 0x65D8, 0x94F2, + 0x65D9, 0x94F3, + 0x65DA, 0x94F4, + 0x65DB, 0x94F5, + 0x65DC, 0x94F6, + 0x65DD, 0x94F7, + 0x65DE, 0x94F8, + 0x65DF, 0x94F9, + 0x65E1, 0x94FA, + 0x65E3, 0x94FB, + 0x65E4, 0x94FC, + 0x65EA, 0x94FD, + 0x65EB, 0x94FE, + 0x65F2, 0x9540, + 0x65F3, 0x9541, + 0x65F4, 0x9542, + 0x65F5, 0x9543, + 0x65F8, 0x9544, + 0x65F9, 0x9545, + 0x65FB, 0x9546, + 0x65FC, 0x9547, + 0x65FD, 0x9548, + 0x65FE, 0x9549, + 0x65FF, 0x954A, + 0x6601, 0x954B, + 0x6604, 0x954C, + 0x6605, 0x954D, + 0x6607, 0x954E, + 0x6608, 0x954F, + 0x6609, 0x9550, + 0x660B, 0x9551, + 0x660D, 0x9552, + 0x6610, 0x9553, + 0x6611, 0x9554, + 0x6612, 0x9555, + 0x6616, 0x9556, + 0x6617, 0x9557, + 0x6618, 0x9558, + 0x661A, 0x9559, + 0x661B, 0x955A, + 0x661C, 0x955B, + 0x661E, 0x955C, + 0x6621, 0x955D, + 0x6622, 0x955E, + 0x6623, 0x955F, + 0x6624, 0x9560, + 0x6626, 0x9561, + 0x6629, 0x9562, + 0x662A, 0x9563, + 0x662B, 0x9564, + 0x662C, 0x9565, + 0x662E, 0x9566, + 0x6630, 0x9567, + 0x6632, 0x9568, + 0x6633, 0x9569, + 0x6637, 0x956A, + 0x6638, 0x956B, + 0x6639, 0x956C, + 0x663A, 0x956D, + 0x663B, 0x956E, + 0x663D, 0x956F, + 0x663F, 0x9570, + 0x6640, 0x9571, + 0x6642, 0x9572, + 0x6644, 0x9573, + 0x6645, 0x9574, + 0x6646, 0x9575, + 0x6647, 0x9576, + 0x6648, 0x9577, + 0x6649, 0x9578, + 0x664A, 0x9579, + 0x664D, 0x957A, + 0x664E, 0x957B, + 0x6650, 0x957C, + 0x6651, 0x957D, + 0x6658, 0x957E, + 0x6659, 0x9580, + 0x665B, 0x9581, + 0x665C, 0x9582, + 0x665D, 0x9583, + 0x665E, 0x9584, + 0x6660, 0x9585, + 0x6662, 0x9586, + 0x6663, 0x9587, + 0x6665, 0x9588, + 0x6667, 0x9589, + 0x6669, 0x958A, + 0x666A, 0x958B, + 0x666B, 0x958C, + 0x666C, 0x958D, + 0x666D, 0x958E, + 0x6671, 0x958F, + 0x6672, 0x9590, + 0x6673, 0x9591, + 0x6675, 0x9592, + 0x6678, 0x9593, + 0x6679, 0x9594, + 0x667B, 0x9595, + 0x667C, 0x9596, + 0x667D, 0x9597, + 0x667F, 0x9598, + 0x6680, 0x9599, + 0x6681, 0x959A, + 0x6683, 0x959B, + 0x6685, 0x959C, + 0x6686, 0x959D, + 0x6688, 0x959E, + 0x6689, 0x959F, + 0x668A, 0x95A0, + 0x668B, 0x95A1, + 0x668D, 0x95A2, + 0x668E, 0x95A3, + 0x668F, 0x95A4, + 0x6690, 0x95A5, + 0x6692, 0x95A6, + 0x6693, 0x95A7, + 0x6694, 0x95A8, + 0x6695, 0x95A9, + 0x6698, 0x95AA, + 0x6699, 0x95AB, + 0x669A, 0x95AC, + 0x669B, 0x95AD, + 0x669C, 0x95AE, + 0x669E, 0x95AF, + 0x669F, 0x95B0, + 0x66A0, 0x95B1, + 0x66A1, 0x95B2, + 0x66A2, 0x95B3, + 0x66A3, 0x95B4, + 0x66A4, 0x95B5, + 0x66A5, 0x95B6, + 0x66A6, 0x95B7, + 0x66A9, 0x95B8, + 0x66AA, 0x95B9, + 0x66AB, 0x95BA, + 0x66AC, 0x95BB, + 0x66AD, 0x95BC, + 0x66AF, 0x95BD, + 0x66B0, 0x95BE, + 0x66B1, 0x95BF, + 0x66B2, 0x95C0, + 0x66B3, 0x95C1, + 0x66B5, 0x95C2, + 0x66B6, 0x95C3, + 0x66B7, 0x95C4, + 0x66B8, 0x95C5, + 0x66BA, 0x95C6, + 0x66BB, 0x95C7, + 0x66BC, 0x95C8, + 0x66BD, 0x95C9, + 0x66BF, 0x95CA, + 0x66C0, 0x95CB, + 0x66C1, 0x95CC, + 0x66C2, 0x95CD, + 0x66C3, 0x95CE, + 0x66C4, 0x95CF, + 0x66C5, 0x95D0, + 0x66C6, 0x95D1, + 0x66C7, 0x95D2, + 0x66C8, 0x95D3, + 0x66C9, 0x95D4, + 0x66CA, 0x95D5, + 0x66CB, 0x95D6, + 0x66CC, 0x95D7, + 0x66CD, 0x95D8, + 0x66CE, 0x95D9, + 0x66CF, 0x95DA, + 0x66D0, 0x95DB, + 0x66D1, 0x95DC, + 0x66D2, 0x95DD, + 0x66D3, 0x95DE, + 0x66D4, 0x95DF, + 0x66D5, 0x95E0, + 0x66D6, 0x95E1, + 0x66D7, 0x95E2, + 0x66D8, 0x95E3, + 0x66DA, 0x95E4, + 0x66DE, 0x95E5, + 0x66DF, 0x95E6, + 0x66E0, 0x95E7, + 0x66E1, 0x95E8, + 0x66E2, 0x95E9, + 0x66E3, 0x95EA, + 0x66E4, 0x95EB, + 0x66E5, 0x95EC, + 0x66E7, 0x95ED, + 0x66E8, 0x95EE, + 0x66EA, 0x95EF, + 0x66EB, 0x95F0, + 0x66EC, 0x95F1, + 0x66ED, 0x95F2, + 0x66EE, 0x95F3, + 0x66EF, 0x95F4, + 0x66F1, 0x95F5, + 0x66F5, 0x95F6, + 0x66F6, 0x95F7, + 0x66F8, 0x95F8, + 0x66FA, 0x95F9, + 0x66FB, 0x95FA, + 0x66FD, 0x95FB, + 0x6701, 0x95FC, + 0x6702, 0x95FD, + 0x6703, 0x95FE, + 0x6704, 0x9640, + 0x6705, 0x9641, + 0x6706, 0x9642, + 0x6707, 0x9643, + 0x670C, 0x9644, + 0x670E, 0x9645, + 0x670F, 0x9646, + 0x6711, 0x9647, + 0x6712, 0x9648, + 0x6713, 0x9649, + 0x6716, 0x964A, + 0x6718, 0x964B, + 0x6719, 0x964C, + 0x671A, 0x964D, + 0x671C, 0x964E, + 0x671E, 0x964F, + 0x6720, 0x9650, + 0x6721, 0x9651, + 0x6722, 0x9652, + 0x6723, 0x9653, + 0x6724, 0x9654, + 0x6725, 0x9655, + 0x6727, 0x9656, + 0x6729, 0x9657, + 0x672E, 0x9658, + 0x6730, 0x9659, + 0x6732, 0x965A, + 0x6733, 0x965B, + 0x6736, 0x965C, + 0x6737, 0x965D, + 0x6738, 0x965E, + 0x6739, 0x965F, + 0x673B, 0x9660, + 0x673C, 0x9661, + 0x673E, 0x9662, + 0x673F, 0x9663, + 0x6741, 0x9664, + 0x6744, 0x9665, + 0x6745, 0x9666, + 0x6747, 0x9667, + 0x674A, 0x9668, + 0x674B, 0x9669, + 0x674D, 0x966A, + 0x6752, 0x966B, + 0x6754, 0x966C, + 0x6755, 0x966D, + 0x6757, 0x966E, + 0x6758, 0x966F, + 0x6759, 0x9670, + 0x675A, 0x9671, + 0x675B, 0x9672, + 0x675D, 0x9673, + 0x6762, 0x9674, + 0x6763, 0x9675, + 0x6764, 0x9676, + 0x6766, 0x9677, + 0x6767, 0x9678, + 0x676B, 0x9679, + 0x676C, 0x967A, + 0x676E, 0x967B, + 0x6771, 0x967C, + 0x6774, 0x967D, + 0x6776, 0x967E, + 0x6778, 0x9680, + 0x6779, 0x9681, + 0x677A, 0x9682, + 0x677B, 0x9683, + 0x677D, 0x9684, + 0x6780, 0x9685, + 0x6782, 0x9686, + 0x6783, 0x9687, + 0x6785, 0x9688, + 0x6786, 0x9689, + 0x6788, 0x968A, + 0x678A, 0x968B, + 0x678C, 0x968C, + 0x678D, 0x968D, + 0x678E, 0x968E, + 0x678F, 0x968F, + 0x6791, 0x9690, + 0x6792, 0x9691, + 0x6793, 0x9692, + 0x6794, 0x9693, + 0x6796, 0x9694, + 0x6799, 0x9695, + 0x679B, 0x9696, + 0x679F, 0x9697, + 0x67A0, 0x9698, + 0x67A1, 0x9699, + 0x67A4, 0x969A, + 0x67A6, 0x969B, + 0x67A9, 0x969C, + 0x67AC, 0x969D, + 0x67AE, 0x969E, + 0x67B1, 0x969F, + 0x67B2, 0x96A0, + 0x67B4, 0x96A1, + 0x67B9, 0x96A2, + 0x67BA, 0x96A3, + 0x67BB, 0x96A4, + 0x67BC, 0x96A5, + 0x67BD, 0x96A6, + 0x67BE, 0x96A7, + 0x67BF, 0x96A8, + 0x67C0, 0x96A9, + 0x67C2, 0x96AA, + 0x67C5, 0x96AB, + 0x67C6, 0x96AC, + 0x67C7, 0x96AD, + 0x67C8, 0x96AE, + 0x67C9, 0x96AF, + 0x67CA, 0x96B0, + 0x67CB, 0x96B1, + 0x67CC, 0x96B2, + 0x67CD, 0x96B3, + 0x67CE, 0x96B4, + 0x67D5, 0x96B5, + 0x67D6, 0x96B6, + 0x67D7, 0x96B7, + 0x67DB, 0x96B8, + 0x67DF, 0x96B9, + 0x67E1, 0x96BA, + 0x67E3, 0x96BB, + 0x67E4, 0x96BC, + 0x67E6, 0x96BD, + 0x67E7, 0x96BE, + 0x67E8, 0x96BF, + 0x67EA, 0x96C0, + 0x67EB, 0x96C1, + 0x67ED, 0x96C2, + 0x67EE, 0x96C3, + 0x67F2, 0x96C4, + 0x67F5, 0x96C5, + 0x67F6, 0x96C6, + 0x67F7, 0x96C7, + 0x67F8, 0x96C8, + 0x67F9, 0x96C9, + 0x67FA, 0x96CA, + 0x67FB, 0x96CB, + 0x67FC, 0x96CC, + 0x67FE, 0x96CD, + 0x6801, 0x96CE, + 0x6802, 0x96CF, + 0x6803, 0x96D0, + 0x6804, 0x96D1, + 0x6806, 0x96D2, + 0x680D, 0x96D3, + 0x6810, 0x96D4, + 0x6812, 0x96D5, + 0x6814, 0x96D6, + 0x6815, 0x96D7, + 0x6818, 0x96D8, + 0x6819, 0x96D9, + 0x681A, 0x96DA, + 0x681B, 0x96DB, + 0x681C, 0x96DC, + 0x681E, 0x96DD, + 0x681F, 0x96DE, + 0x6820, 0x96DF, + 0x6822, 0x96E0, + 0x6823, 0x96E1, + 0x6824, 0x96E2, + 0x6825, 0x96E3, + 0x6826, 0x96E4, + 0x6827, 0x96E5, + 0x6828, 0x96E6, + 0x682B, 0x96E7, + 0x682C, 0x96E8, + 0x682D, 0x96E9, + 0x682E, 0x96EA, + 0x682F, 0x96EB, + 0x6830, 0x96EC, + 0x6831, 0x96ED, + 0x6834, 0x96EE, + 0x6835, 0x96EF, + 0x6836, 0x96F0, + 0x683A, 0x96F1, + 0x683B, 0x96F2, + 0x683F, 0x96F3, + 0x6847, 0x96F4, + 0x684B, 0x96F5, + 0x684D, 0x96F6, + 0x684F, 0x96F7, + 0x6852, 0x96F8, + 0x6856, 0x96F9, + 0x6857, 0x96FA, + 0x6858, 0x96FB, + 0x6859, 0x96FC, + 0x685A, 0x96FD, + 0x685B, 0x96FE, + 0x685C, 0x9740, + 0x685D, 0x9741, + 0x685E, 0x9742, + 0x685F, 0x9743, + 0x686A, 0x9744, + 0x686C, 0x9745, + 0x686D, 0x9746, + 0x686E, 0x9747, + 0x686F, 0x9748, + 0x6870, 0x9749, + 0x6871, 0x974A, + 0x6872, 0x974B, + 0x6873, 0x974C, + 0x6875, 0x974D, + 0x6878, 0x974E, + 0x6879, 0x974F, + 0x687A, 0x9750, + 0x687B, 0x9751, + 0x687C, 0x9752, + 0x687D, 0x9753, + 0x687E, 0x9754, + 0x687F, 0x9755, + 0x6880, 0x9756, + 0x6882, 0x9757, + 0x6884, 0x9758, + 0x6887, 0x9759, + 0x6888, 0x975A, + 0x6889, 0x975B, + 0x688A, 0x975C, + 0x688B, 0x975D, + 0x688C, 0x975E, + 0x688D, 0x975F, + 0x688E, 0x9760, + 0x6890, 0x9761, + 0x6891, 0x9762, + 0x6892, 0x9763, + 0x6894, 0x9764, + 0x6895, 0x9765, + 0x6896, 0x9766, + 0x6898, 0x9767, + 0x6899, 0x9768, + 0x689A, 0x9769, + 0x689B, 0x976A, + 0x689C, 0x976B, + 0x689D, 0x976C, + 0x689E, 0x976D, + 0x689F, 0x976E, + 0x68A0, 0x976F, + 0x68A1, 0x9770, + 0x68A3, 0x9771, + 0x68A4, 0x9772, + 0x68A5, 0x9773, + 0x68A9, 0x9774, + 0x68AA, 0x9775, + 0x68AB, 0x9776, + 0x68AC, 0x9777, + 0x68AE, 0x9778, + 0x68B1, 0x9779, + 0x68B2, 0x977A, + 0x68B4, 0x977B, + 0x68B6, 0x977C, + 0x68B7, 0x977D, + 0x68B8, 0x977E, + 0x68B9, 0x9780, + 0x68BA, 0x9781, + 0x68BB, 0x9782, + 0x68BC, 0x9783, + 0x68BD, 0x9784, + 0x68BE, 0x9785, + 0x68BF, 0x9786, + 0x68C1, 0x9787, + 0x68C3, 0x9788, + 0x68C4, 0x9789, + 0x68C5, 0x978A, + 0x68C6, 0x978B, + 0x68C7, 0x978C, + 0x68C8, 0x978D, + 0x68CA, 0x978E, + 0x68CC, 0x978F, + 0x68CE, 0x9790, + 0x68CF, 0x9791, + 0x68D0, 0x9792, + 0x68D1, 0x9793, + 0x68D3, 0x9794, + 0x68D4, 0x9795, + 0x68D6, 0x9796, + 0x68D7, 0x9797, + 0x68D9, 0x9798, + 0x68DB, 0x9799, + 0x68DC, 0x979A, + 0x68DD, 0x979B, + 0x68DE, 0x979C, + 0x68DF, 0x979D, + 0x68E1, 0x979E, + 0x68E2, 0x979F, + 0x68E4, 0x97A0, + 0x68E5, 0x97A1, + 0x68E6, 0x97A2, + 0x68E7, 0x97A3, + 0x68E8, 0x97A4, + 0x68E9, 0x97A5, + 0x68EA, 0x97A6, + 0x68EB, 0x97A7, + 0x68EC, 0x97A8, + 0x68ED, 0x97A9, + 0x68EF, 0x97AA, + 0x68F2, 0x97AB, + 0x68F3, 0x97AC, + 0x68F4, 0x97AD, + 0x68F6, 0x97AE, + 0x68F7, 0x97AF, + 0x68F8, 0x97B0, + 0x68FB, 0x97B1, + 0x68FD, 0x97B2, + 0x68FE, 0x97B3, + 0x68FF, 0x97B4, + 0x6900, 0x97B5, + 0x6902, 0x97B6, + 0x6903, 0x97B7, + 0x6904, 0x97B8, + 0x6906, 0x97B9, + 0x6907, 0x97BA, + 0x6908, 0x97BB, + 0x6909, 0x97BC, + 0x690A, 0x97BD, + 0x690C, 0x97BE, + 0x690F, 0x97BF, + 0x6911, 0x97C0, + 0x6913, 0x97C1, + 0x6914, 0x97C2, + 0x6915, 0x97C3, + 0x6916, 0x97C4, + 0x6917, 0x97C5, + 0x6918, 0x97C6, + 0x6919, 0x97C7, + 0x691A, 0x97C8, + 0x691B, 0x97C9, + 0x691C, 0x97CA, + 0x691D, 0x97CB, + 0x691E, 0x97CC, + 0x6921, 0x97CD, + 0x6922, 0x97CE, + 0x6923, 0x97CF, + 0x6925, 0x97D0, + 0x6926, 0x97D1, + 0x6927, 0x97D2, + 0x6928, 0x97D3, + 0x6929, 0x97D4, + 0x692A, 0x97D5, + 0x692B, 0x97D6, + 0x692C, 0x97D7, + 0x692E, 0x97D8, + 0x692F, 0x97D9, + 0x6931, 0x97DA, + 0x6932, 0x97DB, + 0x6933, 0x97DC, + 0x6935, 0x97DD, + 0x6936, 0x97DE, + 0x6937, 0x97DF, + 0x6938, 0x97E0, + 0x693A, 0x97E1, + 0x693B, 0x97E2, + 0x693C, 0x97E3, + 0x693E, 0x97E4, + 0x6940, 0x97E5, + 0x6941, 0x97E6, + 0x6943, 0x97E7, + 0x6944, 0x97E8, + 0x6945, 0x97E9, + 0x6946, 0x97EA, + 0x6947, 0x97EB, + 0x6948, 0x97EC, + 0x6949, 0x97ED, + 0x694A, 0x97EE, + 0x694B, 0x97EF, + 0x694C, 0x97F0, + 0x694D, 0x97F1, + 0x694E, 0x97F2, + 0x694F, 0x97F3, + 0x6950, 0x97F4, + 0x6951, 0x97F5, + 0x6952, 0x97F6, + 0x6953, 0x97F7, + 0x6955, 0x97F8, + 0x6956, 0x97F9, + 0x6958, 0x97FA, + 0x6959, 0x97FB, + 0x695B, 0x97FC, + 0x695C, 0x97FD, + 0x695F, 0x97FE, + 0x6961, 0x9840, + 0x6962, 0x9841, + 0x6964, 0x9842, + 0x6965, 0x9843, + 0x6967, 0x9844, + 0x6968, 0x9845, + 0x6969, 0x9846, + 0x696A, 0x9847, + 0x696C, 0x9848, + 0x696D, 0x9849, + 0x696F, 0x984A, + 0x6970, 0x984B, + 0x6972, 0x984C, + 0x6973, 0x984D, + 0x6974, 0x984E, + 0x6975, 0x984F, + 0x6976, 0x9850, + 0x697A, 0x9851, + 0x697B, 0x9852, + 0x697D, 0x9853, + 0x697E, 0x9854, + 0x697F, 0x9855, + 0x6981, 0x9856, + 0x6983, 0x9857, + 0x6985, 0x9858, + 0x698A, 0x9859, + 0x698B, 0x985A, + 0x698C, 0x985B, + 0x698E, 0x985C, + 0x698F, 0x985D, + 0x6990, 0x985E, + 0x6991, 0x985F, + 0x6992, 0x9860, + 0x6993, 0x9861, + 0x6996, 0x9862, + 0x6997, 0x9863, + 0x6999, 0x9864, + 0x699A, 0x9865, + 0x699D, 0x9866, + 0x699E, 0x9867, + 0x699F, 0x9868, + 0x69A0, 0x9869, + 0x69A1, 0x986A, + 0x69A2, 0x986B, + 0x69A3, 0x986C, + 0x69A4, 0x986D, + 0x69A5, 0x986E, + 0x69A6, 0x986F, + 0x69A9, 0x9870, + 0x69AA, 0x9871, + 0x69AC, 0x9872, + 0x69AE, 0x9873, + 0x69AF, 0x9874, + 0x69B0, 0x9875, + 0x69B2, 0x9876, + 0x69B3, 0x9877, + 0x69B5, 0x9878, + 0x69B6, 0x9879, + 0x69B8, 0x987A, + 0x69B9, 0x987B, + 0x69BA, 0x987C, + 0x69BC, 0x987D, + 0x69BD, 0x987E, + 0x69BE, 0x9880, + 0x69BF, 0x9881, + 0x69C0, 0x9882, + 0x69C2, 0x9883, + 0x69C3, 0x9884, + 0x69C4, 0x9885, + 0x69C5, 0x9886, + 0x69C6, 0x9887, + 0x69C7, 0x9888, + 0x69C8, 0x9889, + 0x69C9, 0x988A, + 0x69CB, 0x988B, + 0x69CD, 0x988C, + 0x69CF, 0x988D, + 0x69D1, 0x988E, + 0x69D2, 0x988F, + 0x69D3, 0x9890, + 0x69D5, 0x9891, + 0x69D6, 0x9892, + 0x69D7, 0x9893, + 0x69D8, 0x9894, + 0x69D9, 0x9895, + 0x69DA, 0x9896, + 0x69DC, 0x9897, + 0x69DD, 0x9898, + 0x69DE, 0x9899, + 0x69E1, 0x989A, + 0x69E2, 0x989B, + 0x69E3, 0x989C, + 0x69E4, 0x989D, + 0x69E5, 0x989E, + 0x69E6, 0x989F, + 0x69E7, 0x98A0, + 0x69E8, 0x98A1, + 0x69E9, 0x98A2, + 0x69EA, 0x98A3, + 0x69EB, 0x98A4, + 0x69EC, 0x98A5, + 0x69EE, 0x98A6, + 0x69EF, 0x98A7, + 0x69F0, 0x98A8, + 0x69F1, 0x98A9, + 0x69F3, 0x98AA, + 0x69F4, 0x98AB, + 0x69F5, 0x98AC, + 0x69F6, 0x98AD, + 0x69F7, 0x98AE, + 0x69F8, 0x98AF, + 0x69F9, 0x98B0, + 0x69FA, 0x98B1, + 0x69FB, 0x98B2, + 0x69FC, 0x98B3, + 0x69FE, 0x98B4, + 0x6A00, 0x98B5, + 0x6A01, 0x98B6, + 0x6A02, 0x98B7, + 0x6A03, 0x98B8, + 0x6A04, 0x98B9, + 0x6A05, 0x98BA, + 0x6A06, 0x98BB, + 0x6A07, 0x98BC, + 0x6A08, 0x98BD, + 0x6A09, 0x98BE, + 0x6A0B, 0x98BF, + 0x6A0C, 0x98C0, + 0x6A0D, 0x98C1, + 0x6A0E, 0x98C2, + 0x6A0F, 0x98C3, + 0x6A10, 0x98C4, + 0x6A11, 0x98C5, + 0x6A12, 0x98C6, + 0x6A13, 0x98C7, + 0x6A14, 0x98C8, + 0x6A15, 0x98C9, + 0x6A16, 0x98CA, + 0x6A19, 0x98CB, + 0x6A1A, 0x98CC, + 0x6A1B, 0x98CD, + 0x6A1C, 0x98CE, + 0x6A1D, 0x98CF, + 0x6A1E, 0x98D0, + 0x6A20, 0x98D1, + 0x6A22, 0x98D2, + 0x6A23, 0x98D3, + 0x6A24, 0x98D4, + 0x6A25, 0x98D5, + 0x6A26, 0x98D6, + 0x6A27, 0x98D7, + 0x6A29, 0x98D8, + 0x6A2B, 0x98D9, + 0x6A2C, 0x98DA, + 0x6A2D, 0x98DB, + 0x6A2E, 0x98DC, + 0x6A30, 0x98DD, + 0x6A32, 0x98DE, + 0x6A33, 0x98DF, + 0x6A34, 0x98E0, + 0x6A36, 0x98E1, + 0x6A37, 0x98E2, + 0x6A38, 0x98E3, + 0x6A39, 0x98E4, + 0x6A3A, 0x98E5, + 0x6A3B, 0x98E6, + 0x6A3C, 0x98E7, + 0x6A3F, 0x98E8, + 0x6A40, 0x98E9, + 0x6A41, 0x98EA, + 0x6A42, 0x98EB, + 0x6A43, 0x98EC, + 0x6A45, 0x98ED, + 0x6A46, 0x98EE, + 0x6A48, 0x98EF, + 0x6A49, 0x98F0, + 0x6A4A, 0x98F1, + 0x6A4B, 0x98F2, + 0x6A4C, 0x98F3, + 0x6A4D, 0x98F4, + 0x6A4E, 0x98F5, + 0x6A4F, 0x98F6, + 0x6A51, 0x98F7, + 0x6A52, 0x98F8, + 0x6A53, 0x98F9, + 0x6A54, 0x98FA, + 0x6A55, 0x98FB, + 0x6A56, 0x98FC, + 0x6A57, 0x98FD, + 0x6A5A, 0x98FE, + 0x6A5C, 0x9940, + 0x6A5D, 0x9941, + 0x6A5E, 0x9942, + 0x6A5F, 0x9943, + 0x6A60, 0x9944, + 0x6A62, 0x9945, + 0x6A63, 0x9946, + 0x6A64, 0x9947, + 0x6A66, 0x9948, + 0x6A67, 0x9949, + 0x6A68, 0x994A, + 0x6A69, 0x994B, + 0x6A6A, 0x994C, + 0x6A6B, 0x994D, + 0x6A6C, 0x994E, + 0x6A6D, 0x994F, + 0x6A6E, 0x9950, + 0x6A6F, 0x9951, + 0x6A70, 0x9952, + 0x6A72, 0x9953, + 0x6A73, 0x9954, + 0x6A74, 0x9955, + 0x6A75, 0x9956, + 0x6A76, 0x9957, + 0x6A77, 0x9958, + 0x6A78, 0x9959, + 0x6A7A, 0x995A, + 0x6A7B, 0x995B, + 0x6A7D, 0x995C, + 0x6A7E, 0x995D, + 0x6A7F, 0x995E, + 0x6A81, 0x995F, + 0x6A82, 0x9960, + 0x6A83, 0x9961, + 0x6A85, 0x9962, + 0x6A86, 0x9963, + 0x6A87, 0x9964, + 0x6A88, 0x9965, + 0x6A89, 0x9966, + 0x6A8A, 0x9967, + 0x6A8B, 0x9968, + 0x6A8C, 0x9969, + 0x6A8D, 0x996A, + 0x6A8F, 0x996B, + 0x6A92, 0x996C, + 0x6A93, 0x996D, + 0x6A94, 0x996E, + 0x6A95, 0x996F, + 0x6A96, 0x9970, + 0x6A98, 0x9971, + 0x6A99, 0x9972, + 0x6A9A, 0x9973, + 0x6A9B, 0x9974, + 0x6A9C, 0x9975, + 0x6A9D, 0x9976, + 0x6A9E, 0x9977, + 0x6A9F, 0x9978, + 0x6AA1, 0x9979, + 0x6AA2, 0x997A, + 0x6AA3, 0x997B, + 0x6AA4, 0x997C, + 0x6AA5, 0x997D, + 0x6AA6, 0x997E, + 0x6AA7, 0x9980, + 0x6AA8, 0x9981, + 0x6AAA, 0x9982, + 0x6AAD, 0x9983, + 0x6AAE, 0x9984, + 0x6AAF, 0x9985, + 0x6AB0, 0x9986, + 0x6AB1, 0x9987, + 0x6AB2, 0x9988, + 0x6AB3, 0x9989, + 0x6AB4, 0x998A, + 0x6AB5, 0x998B, + 0x6AB6, 0x998C, + 0x6AB7, 0x998D, + 0x6AB8, 0x998E, + 0x6AB9, 0x998F, + 0x6ABA, 0x9990, + 0x6ABB, 0x9991, + 0x6ABC, 0x9992, + 0x6ABD, 0x9993, + 0x6ABE, 0x9994, + 0x6ABF, 0x9995, + 0x6AC0, 0x9996, + 0x6AC1, 0x9997, + 0x6AC2, 0x9998, + 0x6AC3, 0x9999, + 0x6AC4, 0x999A, + 0x6AC5, 0x999B, + 0x6AC6, 0x999C, + 0x6AC7, 0x999D, + 0x6AC8, 0x999E, + 0x6AC9, 0x999F, + 0x6ACA, 0x99A0, + 0x6ACB, 0x99A1, + 0x6ACC, 0x99A2, + 0x6ACD, 0x99A3, + 0x6ACE, 0x99A4, + 0x6ACF, 0x99A5, + 0x6AD0, 0x99A6, + 0x6AD1, 0x99A7, + 0x6AD2, 0x99A8, + 0x6AD3, 0x99A9, + 0x6AD4, 0x99AA, + 0x6AD5, 0x99AB, + 0x6AD6, 0x99AC, + 0x6AD7, 0x99AD, + 0x6AD8, 0x99AE, + 0x6AD9, 0x99AF, + 0x6ADA, 0x99B0, + 0x6ADB, 0x99B1, + 0x6ADC, 0x99B2, + 0x6ADD, 0x99B3, + 0x6ADE, 0x99B4, + 0x6ADF, 0x99B5, + 0x6AE0, 0x99B6, + 0x6AE1, 0x99B7, + 0x6AE2, 0x99B8, + 0x6AE3, 0x99B9, + 0x6AE4, 0x99BA, + 0x6AE5, 0x99BB, + 0x6AE6, 0x99BC, + 0x6AE7, 0x99BD, + 0x6AE8, 0x99BE, + 0x6AE9, 0x99BF, + 0x6AEA, 0x99C0, + 0x6AEB, 0x99C1, + 0x6AEC, 0x99C2, + 0x6AED, 0x99C3, + 0x6AEE, 0x99C4, + 0x6AEF, 0x99C5, + 0x6AF0, 0x99C6, + 0x6AF1, 0x99C7, + 0x6AF2, 0x99C8, + 0x6AF3, 0x99C9, + 0x6AF4, 0x99CA, + 0x6AF5, 0x99CB, + 0x6AF6, 0x99CC, + 0x6AF7, 0x99CD, + 0x6AF8, 0x99CE, + 0x6AF9, 0x99CF, + 0x6AFA, 0x99D0, + 0x6AFB, 0x99D1, + 0x6AFC, 0x99D2, + 0x6AFD, 0x99D3, + 0x6AFE, 0x99D4, + 0x6AFF, 0x99D5, + 0x6B00, 0x99D6, + 0x6B01, 0x99D7, + 0x6B02, 0x99D8, + 0x6B03, 0x99D9, + 0x6B04, 0x99DA, + 0x6B05, 0x99DB, + 0x6B06, 0x99DC, + 0x6B07, 0x99DD, + 0x6B08, 0x99DE, + 0x6B09, 0x99DF, + 0x6B0A, 0x99E0, + 0x6B0B, 0x99E1, + 0x6B0C, 0x99E2, + 0x6B0D, 0x99E3, + 0x6B0E, 0x99E4, + 0x6B0F, 0x99E5, + 0x6B10, 0x99E6, + 0x6B11, 0x99E7, + 0x6B12, 0x99E8, + 0x6B13, 0x99E9, + 0x6B14, 0x99EA, + 0x6B15, 0x99EB, + 0x6B16, 0x99EC, + 0x6B17, 0x99ED, + 0x6B18, 0x99EE, + 0x6B19, 0x99EF, + 0x6B1A, 0x99F0, + 0x6B1B, 0x99F1, + 0x6B1C, 0x99F2, + 0x6B1D, 0x99F3, + 0x6B1E, 0x99F4, + 0x6B1F, 0x99F5, + 0x6B25, 0x99F6, + 0x6B26, 0x99F7, + 0x6B28, 0x99F8, + 0x6B29, 0x99F9, + 0x6B2A, 0x99FA, + 0x6B2B, 0x99FB, + 0x6B2C, 0x99FC, + 0x6B2D, 0x99FD, + 0x6B2E, 0x99FE, + 0x6B2F, 0x9A40, + 0x6B30, 0x9A41, + 0x6B31, 0x9A42, + 0x6B33, 0x9A43, + 0x6B34, 0x9A44, + 0x6B35, 0x9A45, + 0x6B36, 0x9A46, + 0x6B38, 0x9A47, + 0x6B3B, 0x9A48, + 0x6B3C, 0x9A49, + 0x6B3D, 0x9A4A, + 0x6B3F, 0x9A4B, + 0x6B40, 0x9A4C, + 0x6B41, 0x9A4D, + 0x6B42, 0x9A4E, + 0x6B44, 0x9A4F, + 0x6B45, 0x9A50, + 0x6B48, 0x9A51, + 0x6B4A, 0x9A52, + 0x6B4B, 0x9A53, + 0x6B4D, 0x9A54, + 0x6B4E, 0x9A55, + 0x6B4F, 0x9A56, + 0x6B50, 0x9A57, + 0x6B51, 0x9A58, + 0x6B52, 0x9A59, + 0x6B53, 0x9A5A, + 0x6B54, 0x9A5B, + 0x6B55, 0x9A5C, + 0x6B56, 0x9A5D, + 0x6B57, 0x9A5E, + 0x6B58, 0x9A5F, + 0x6B5A, 0x9A60, + 0x6B5B, 0x9A61, + 0x6B5C, 0x9A62, + 0x6B5D, 0x9A63, + 0x6B5E, 0x9A64, + 0x6B5F, 0x9A65, + 0x6B60, 0x9A66, + 0x6B61, 0x9A67, + 0x6B68, 0x9A68, + 0x6B69, 0x9A69, + 0x6B6B, 0x9A6A, + 0x6B6C, 0x9A6B, + 0x6B6D, 0x9A6C, + 0x6B6E, 0x9A6D, + 0x6B6F, 0x9A6E, + 0x6B70, 0x9A6F, + 0x6B71, 0x9A70, + 0x6B72, 0x9A71, + 0x6B73, 0x9A72, + 0x6B74, 0x9A73, + 0x6B75, 0x9A74, + 0x6B76, 0x9A75, + 0x6B77, 0x9A76, + 0x6B78, 0x9A77, + 0x6B7A, 0x9A78, + 0x6B7D, 0x9A79, + 0x6B7E, 0x9A7A, + 0x6B7F, 0x9A7B, + 0x6B80, 0x9A7C, + 0x6B85, 0x9A7D, + 0x6B88, 0x9A7E, + 0x6B8C, 0x9A80, + 0x6B8E, 0x9A81, + 0x6B8F, 0x9A82, + 0x6B90, 0x9A83, + 0x6B91, 0x9A84, + 0x6B94, 0x9A85, + 0x6B95, 0x9A86, + 0x6B97, 0x9A87, + 0x6B98, 0x9A88, + 0x6B99, 0x9A89, + 0x6B9C, 0x9A8A, + 0x6B9D, 0x9A8B, + 0x6B9E, 0x9A8C, + 0x6B9F, 0x9A8D, + 0x6BA0, 0x9A8E, + 0x6BA2, 0x9A8F, + 0x6BA3, 0x9A90, + 0x6BA4, 0x9A91, + 0x6BA5, 0x9A92, + 0x6BA6, 0x9A93, + 0x6BA7, 0x9A94, + 0x6BA8, 0x9A95, + 0x6BA9, 0x9A96, + 0x6BAB, 0x9A97, + 0x6BAC, 0x9A98, + 0x6BAD, 0x9A99, + 0x6BAE, 0x9A9A, + 0x6BAF, 0x9A9B, + 0x6BB0, 0x9A9C, + 0x6BB1, 0x9A9D, + 0x6BB2, 0x9A9E, + 0x6BB6, 0x9A9F, + 0x6BB8, 0x9AA0, + 0x6BB9, 0x9AA1, + 0x6BBA, 0x9AA2, + 0x6BBB, 0x9AA3, + 0x6BBC, 0x9AA4, + 0x6BBD, 0x9AA5, + 0x6BBE, 0x9AA6, + 0x6BC0, 0x9AA7, + 0x6BC3, 0x9AA8, + 0x6BC4, 0x9AA9, + 0x6BC6, 0x9AAA, + 0x6BC7, 0x9AAB, + 0x6BC8, 0x9AAC, + 0x6BC9, 0x9AAD, + 0x6BCA, 0x9AAE, + 0x6BCC, 0x9AAF, + 0x6BCE, 0x9AB0, + 0x6BD0, 0x9AB1, + 0x6BD1, 0x9AB2, + 0x6BD8, 0x9AB3, + 0x6BDA, 0x9AB4, + 0x6BDC, 0x9AB5, + 0x6BDD, 0x9AB6, + 0x6BDE, 0x9AB7, + 0x6BDF, 0x9AB8, + 0x6BE0, 0x9AB9, + 0x6BE2, 0x9ABA, + 0x6BE3, 0x9ABB, + 0x6BE4, 0x9ABC, + 0x6BE5, 0x9ABD, + 0x6BE6, 0x9ABE, + 0x6BE7, 0x9ABF, + 0x6BE8, 0x9AC0, + 0x6BE9, 0x9AC1, + 0x6BEC, 0x9AC2, + 0x6BED, 0x9AC3, + 0x6BEE, 0x9AC4, + 0x6BF0, 0x9AC5, + 0x6BF1, 0x9AC6, + 0x6BF2, 0x9AC7, + 0x6BF4, 0x9AC8, + 0x6BF6, 0x9AC9, + 0x6BF7, 0x9ACA, + 0x6BF8, 0x9ACB, + 0x6BFA, 0x9ACC, + 0x6BFB, 0x9ACD, + 0x6BFC, 0x9ACE, + 0x6BFE, 0x9ACF, + 0x6BFF, 0x9AD0, + 0x6C00, 0x9AD1, + 0x6C01, 0x9AD2, + 0x6C02, 0x9AD3, + 0x6C03, 0x9AD4, + 0x6C04, 0x9AD5, + 0x6C08, 0x9AD6, + 0x6C09, 0x9AD7, + 0x6C0A, 0x9AD8, + 0x6C0B, 0x9AD9, + 0x6C0C, 0x9ADA, + 0x6C0E, 0x9ADB, + 0x6C12, 0x9ADC, + 0x6C17, 0x9ADD, + 0x6C1C, 0x9ADE, + 0x6C1D, 0x9ADF, + 0x6C1E, 0x9AE0, + 0x6C20, 0x9AE1, + 0x6C23, 0x9AE2, + 0x6C25, 0x9AE3, + 0x6C2B, 0x9AE4, + 0x6C2C, 0x9AE5, + 0x6C2D, 0x9AE6, + 0x6C31, 0x9AE7, + 0x6C33, 0x9AE8, + 0x6C36, 0x9AE9, + 0x6C37, 0x9AEA, + 0x6C39, 0x9AEB, + 0x6C3A, 0x9AEC, + 0x6C3B, 0x9AED, + 0x6C3C, 0x9AEE, + 0x6C3E, 0x9AEF, + 0x6C3F, 0x9AF0, + 0x6C43, 0x9AF1, + 0x6C44, 0x9AF2, + 0x6C45, 0x9AF3, + 0x6C48, 0x9AF4, + 0x6C4B, 0x9AF5, + 0x6C4C, 0x9AF6, + 0x6C4D, 0x9AF7, + 0x6C4E, 0x9AF8, + 0x6C4F, 0x9AF9, + 0x6C51, 0x9AFA, + 0x6C52, 0x9AFB, + 0x6C53, 0x9AFC, + 0x6C56, 0x9AFD, + 0x6C58, 0x9AFE, + 0x6C59, 0x9B40, + 0x6C5A, 0x9B41, + 0x6C62, 0x9B42, + 0x6C63, 0x9B43, + 0x6C65, 0x9B44, + 0x6C66, 0x9B45, + 0x6C67, 0x9B46, + 0x6C6B, 0x9B47, + 0x6C6C, 0x9B48, + 0x6C6D, 0x9B49, + 0x6C6E, 0x9B4A, + 0x6C6F, 0x9B4B, + 0x6C71, 0x9B4C, + 0x6C73, 0x9B4D, + 0x6C75, 0x9B4E, + 0x6C77, 0x9B4F, + 0x6C78, 0x9B50, + 0x6C7A, 0x9B51, + 0x6C7B, 0x9B52, + 0x6C7C, 0x9B53, + 0x6C7F, 0x9B54, + 0x6C80, 0x9B55, + 0x6C84, 0x9B56, + 0x6C87, 0x9B57, + 0x6C8A, 0x9B58, + 0x6C8B, 0x9B59, + 0x6C8D, 0x9B5A, + 0x6C8E, 0x9B5B, + 0x6C91, 0x9B5C, + 0x6C92, 0x9B5D, + 0x6C95, 0x9B5E, + 0x6C96, 0x9B5F, + 0x6C97, 0x9B60, + 0x6C98, 0x9B61, + 0x6C9A, 0x9B62, + 0x6C9C, 0x9B63, + 0x6C9D, 0x9B64, + 0x6C9E, 0x9B65, + 0x6CA0, 0x9B66, + 0x6CA2, 0x9B67, + 0x6CA8, 0x9B68, + 0x6CAC, 0x9B69, + 0x6CAF, 0x9B6A, + 0x6CB0, 0x9B6B, + 0x6CB4, 0x9B6C, + 0x6CB5, 0x9B6D, + 0x6CB6, 0x9B6E, + 0x6CB7, 0x9B6F, + 0x6CBA, 0x9B70, + 0x6CC0, 0x9B71, + 0x6CC1, 0x9B72, + 0x6CC2, 0x9B73, + 0x6CC3, 0x9B74, + 0x6CC6, 0x9B75, + 0x6CC7, 0x9B76, + 0x6CC8, 0x9B77, + 0x6CCB, 0x9B78, + 0x6CCD, 0x9B79, + 0x6CCE, 0x9B7A, + 0x6CCF, 0x9B7B, + 0x6CD1, 0x9B7C, + 0x6CD2, 0x9B7D, + 0x6CD8, 0x9B7E, + 0x6CD9, 0x9B80, + 0x6CDA, 0x9B81, + 0x6CDC, 0x9B82, + 0x6CDD, 0x9B83, + 0x6CDF, 0x9B84, + 0x6CE4, 0x9B85, + 0x6CE6, 0x9B86, + 0x6CE7, 0x9B87, + 0x6CE9, 0x9B88, + 0x6CEC, 0x9B89, + 0x6CED, 0x9B8A, + 0x6CF2, 0x9B8B, + 0x6CF4, 0x9B8C, + 0x6CF9, 0x9B8D, + 0x6CFF, 0x9B8E, + 0x6D00, 0x9B8F, + 0x6D02, 0x9B90, + 0x6D03, 0x9B91, + 0x6D05, 0x9B92, + 0x6D06, 0x9B93, + 0x6D08, 0x9B94, + 0x6D09, 0x9B95, + 0x6D0A, 0x9B96, + 0x6D0D, 0x9B97, + 0x6D0F, 0x9B98, + 0x6D10, 0x9B99, + 0x6D11, 0x9B9A, + 0x6D13, 0x9B9B, + 0x6D14, 0x9B9C, + 0x6D15, 0x9B9D, + 0x6D16, 0x9B9E, + 0x6D18, 0x9B9F, + 0x6D1C, 0x9BA0, + 0x6D1D, 0x9BA1, + 0x6D1F, 0x9BA2, + 0x6D20, 0x9BA3, + 0x6D21, 0x9BA4, + 0x6D22, 0x9BA5, + 0x6D23, 0x9BA6, + 0x6D24, 0x9BA7, + 0x6D26, 0x9BA8, + 0x6D28, 0x9BA9, + 0x6D29, 0x9BAA, + 0x6D2C, 0x9BAB, + 0x6D2D, 0x9BAC, + 0x6D2F, 0x9BAD, + 0x6D30, 0x9BAE, + 0x6D34, 0x9BAF, + 0x6D36, 0x9BB0, + 0x6D37, 0x9BB1, + 0x6D38, 0x9BB2, + 0x6D3A, 0x9BB3, + 0x6D3F, 0x9BB4, + 0x6D40, 0x9BB5, + 0x6D42, 0x9BB6, + 0x6D44, 0x9BB7, + 0x6D49, 0x9BB8, + 0x6D4C, 0x9BB9, + 0x6D50, 0x9BBA, + 0x6D55, 0x9BBB, + 0x6D56, 0x9BBC, + 0x6D57, 0x9BBD, + 0x6D58, 0x9BBE, + 0x6D5B, 0x9BBF, + 0x6D5D, 0x9BC0, + 0x6D5F, 0x9BC1, + 0x6D61, 0x9BC2, + 0x6D62, 0x9BC3, + 0x6D64, 0x9BC4, + 0x6D65, 0x9BC5, + 0x6D67, 0x9BC6, + 0x6D68, 0x9BC7, + 0x6D6B, 0x9BC8, + 0x6D6C, 0x9BC9, + 0x6D6D, 0x9BCA, + 0x6D70, 0x9BCB, + 0x6D71, 0x9BCC, + 0x6D72, 0x9BCD, + 0x6D73, 0x9BCE, + 0x6D75, 0x9BCF, + 0x6D76, 0x9BD0, + 0x6D79, 0x9BD1, + 0x6D7A, 0x9BD2, + 0x6D7B, 0x9BD3, + 0x6D7D, 0x9BD4, + 0x6D7E, 0x9BD5, + 0x6D7F, 0x9BD6, + 0x6D80, 0x9BD7, + 0x6D81, 0x9BD8, + 0x6D83, 0x9BD9, + 0x6D84, 0x9BDA, + 0x6D86, 0x9BDB, + 0x6D87, 0x9BDC, + 0x6D8A, 0x9BDD, + 0x6D8B, 0x9BDE, + 0x6D8D, 0x9BDF, + 0x6D8F, 0x9BE0, + 0x6D90, 0x9BE1, + 0x6D92, 0x9BE2, + 0x6D96, 0x9BE3, + 0x6D97, 0x9BE4, + 0x6D98, 0x9BE5, + 0x6D99, 0x9BE6, + 0x6D9A, 0x9BE7, + 0x6D9C, 0x9BE8, + 0x6DA2, 0x9BE9, + 0x6DA5, 0x9BEA, + 0x6DAC, 0x9BEB, + 0x6DAD, 0x9BEC, + 0x6DB0, 0x9BED, + 0x6DB1, 0x9BEE, + 0x6DB3, 0x9BEF, + 0x6DB4, 0x9BF0, + 0x6DB6, 0x9BF1, + 0x6DB7, 0x9BF2, + 0x6DB9, 0x9BF3, + 0x6DBA, 0x9BF4, + 0x6DBB, 0x9BF5, + 0x6DBC, 0x9BF6, + 0x6DBD, 0x9BF7, + 0x6DBE, 0x9BF8, + 0x6DC1, 0x9BF9, + 0x6DC2, 0x9BFA, + 0x6DC3, 0x9BFB, + 0x6DC8, 0x9BFC, + 0x6DC9, 0x9BFD, + 0x6DCA, 0x9BFE, + 0x6DCD, 0x9C40, + 0x6DCE, 0x9C41, + 0x6DCF, 0x9C42, + 0x6DD0, 0x9C43, + 0x6DD2, 0x9C44, + 0x6DD3, 0x9C45, + 0x6DD4, 0x9C46, + 0x6DD5, 0x9C47, + 0x6DD7, 0x9C48, + 0x6DDA, 0x9C49, + 0x6DDB, 0x9C4A, + 0x6DDC, 0x9C4B, + 0x6DDF, 0x9C4C, + 0x6DE2, 0x9C4D, + 0x6DE3, 0x9C4E, + 0x6DE5, 0x9C4F, + 0x6DE7, 0x9C50, + 0x6DE8, 0x9C51, + 0x6DE9, 0x9C52, + 0x6DEA, 0x9C53, + 0x6DED, 0x9C54, + 0x6DEF, 0x9C55, + 0x6DF0, 0x9C56, + 0x6DF2, 0x9C57, + 0x6DF4, 0x9C58, + 0x6DF5, 0x9C59, + 0x6DF6, 0x9C5A, + 0x6DF8, 0x9C5B, + 0x6DFA, 0x9C5C, + 0x6DFD, 0x9C5D, + 0x6DFE, 0x9C5E, + 0x6DFF, 0x9C5F, + 0x6E00, 0x9C60, + 0x6E01, 0x9C61, + 0x6E02, 0x9C62, + 0x6E03, 0x9C63, + 0x6E04, 0x9C64, + 0x6E06, 0x9C65, + 0x6E07, 0x9C66, + 0x6E08, 0x9C67, + 0x6E09, 0x9C68, + 0x6E0B, 0x9C69, + 0x6E0F, 0x9C6A, + 0x6E12, 0x9C6B, + 0x6E13, 0x9C6C, + 0x6E15, 0x9C6D, + 0x6E18, 0x9C6E, + 0x6E19, 0x9C6F, + 0x6E1B, 0x9C70, + 0x6E1C, 0x9C71, + 0x6E1E, 0x9C72, + 0x6E1F, 0x9C73, + 0x6E22, 0x9C74, + 0x6E26, 0x9C75, + 0x6E27, 0x9C76, + 0x6E28, 0x9C77, + 0x6E2A, 0x9C78, + 0x6E2C, 0x9C79, + 0x6E2E, 0x9C7A, + 0x6E30, 0x9C7B, + 0x6E31, 0x9C7C, + 0x6E33, 0x9C7D, + 0x6E35, 0x9C7E, + 0x6E36, 0x9C80, + 0x6E37, 0x9C81, + 0x6E39, 0x9C82, + 0x6E3B, 0x9C83, + 0x6E3C, 0x9C84, + 0x6E3D, 0x9C85, + 0x6E3E, 0x9C86, + 0x6E3F, 0x9C87, + 0x6E40, 0x9C88, + 0x6E41, 0x9C89, + 0x6E42, 0x9C8A, + 0x6E45, 0x9C8B, + 0x6E46, 0x9C8C, + 0x6E47, 0x9C8D, + 0x6E48, 0x9C8E, + 0x6E49, 0x9C8F, + 0x6E4A, 0x9C90, + 0x6E4B, 0x9C91, + 0x6E4C, 0x9C92, + 0x6E4F, 0x9C93, + 0x6E50, 0x9C94, + 0x6E51, 0x9C95, + 0x6E52, 0x9C96, + 0x6E55, 0x9C97, + 0x6E57, 0x9C98, + 0x6E59, 0x9C99, + 0x6E5A, 0x9C9A, + 0x6E5C, 0x9C9B, + 0x6E5D, 0x9C9C, + 0x6E5E, 0x9C9D, + 0x6E60, 0x9C9E, + 0x6E61, 0x9C9F, + 0x6E62, 0x9CA0, + 0x6E63, 0x9CA1, + 0x6E64, 0x9CA2, + 0x6E65, 0x9CA3, + 0x6E66, 0x9CA4, + 0x6E67, 0x9CA5, + 0x6E68, 0x9CA6, + 0x6E69, 0x9CA7, + 0x6E6A, 0x9CA8, + 0x6E6C, 0x9CA9, + 0x6E6D, 0x9CAA, + 0x6E6F, 0x9CAB, + 0x6E70, 0x9CAC, + 0x6E71, 0x9CAD, + 0x6E72, 0x9CAE, + 0x6E73, 0x9CAF, + 0x6E74, 0x9CB0, + 0x6E75, 0x9CB1, + 0x6E76, 0x9CB2, + 0x6E77, 0x9CB3, + 0x6E78, 0x9CB4, + 0x6E79, 0x9CB5, + 0x6E7A, 0x9CB6, + 0x6E7B, 0x9CB7, + 0x6E7C, 0x9CB8, + 0x6E7D, 0x9CB9, + 0x6E80, 0x9CBA, + 0x6E81, 0x9CBB, + 0x6E82, 0x9CBC, + 0x6E84, 0x9CBD, + 0x6E87, 0x9CBE, + 0x6E88, 0x9CBF, + 0x6E8A, 0x9CC0, + 0x6E8B, 0x9CC1, + 0x6E8C, 0x9CC2, + 0x6E8D, 0x9CC3, + 0x6E8E, 0x9CC4, + 0x6E91, 0x9CC5, + 0x6E92, 0x9CC6, + 0x6E93, 0x9CC7, + 0x6E94, 0x9CC8, + 0x6E95, 0x9CC9, + 0x6E96, 0x9CCA, + 0x6E97, 0x9CCB, + 0x6E99, 0x9CCC, + 0x6E9A, 0x9CCD, + 0x6E9B, 0x9CCE, + 0x6E9D, 0x9CCF, + 0x6E9E, 0x9CD0, + 0x6EA0, 0x9CD1, + 0x6EA1, 0x9CD2, + 0x6EA3, 0x9CD3, + 0x6EA4, 0x9CD4, + 0x6EA6, 0x9CD5, + 0x6EA8, 0x9CD6, + 0x6EA9, 0x9CD7, + 0x6EAB, 0x9CD8, + 0x6EAC, 0x9CD9, + 0x6EAD, 0x9CDA, + 0x6EAE, 0x9CDB, + 0x6EB0, 0x9CDC, + 0x6EB3, 0x9CDD, + 0x6EB5, 0x9CDE, + 0x6EB8, 0x9CDF, + 0x6EB9, 0x9CE0, + 0x6EBC, 0x9CE1, + 0x6EBE, 0x9CE2, + 0x6EBF, 0x9CE3, + 0x6EC0, 0x9CE4, + 0x6EC3, 0x9CE5, + 0x6EC4, 0x9CE6, + 0x6EC5, 0x9CE7, + 0x6EC6, 0x9CE8, + 0x6EC8, 0x9CE9, + 0x6EC9, 0x9CEA, + 0x6ECA, 0x9CEB, + 0x6ECC, 0x9CEC, + 0x6ECD, 0x9CED, + 0x6ECE, 0x9CEE, + 0x6ED0, 0x9CEF, + 0x6ED2, 0x9CF0, + 0x6ED6, 0x9CF1, + 0x6ED8, 0x9CF2, + 0x6ED9, 0x9CF3, + 0x6EDB, 0x9CF4, + 0x6EDC, 0x9CF5, + 0x6EDD, 0x9CF6, + 0x6EE3, 0x9CF7, + 0x6EE7, 0x9CF8, + 0x6EEA, 0x9CF9, + 0x6EEB, 0x9CFA, + 0x6EEC, 0x9CFB, + 0x6EED, 0x9CFC, + 0x6EEE, 0x9CFD, + 0x6EEF, 0x9CFE, + 0x6EF0, 0x9D40, + 0x6EF1, 0x9D41, + 0x6EF2, 0x9D42, + 0x6EF3, 0x9D43, + 0x6EF5, 0x9D44, + 0x6EF6, 0x9D45, + 0x6EF7, 0x9D46, + 0x6EF8, 0x9D47, + 0x6EFA, 0x9D48, + 0x6EFB, 0x9D49, + 0x6EFC, 0x9D4A, + 0x6EFD, 0x9D4B, + 0x6EFE, 0x9D4C, + 0x6EFF, 0x9D4D, + 0x6F00, 0x9D4E, + 0x6F01, 0x9D4F, + 0x6F03, 0x9D50, + 0x6F04, 0x9D51, + 0x6F05, 0x9D52, + 0x6F07, 0x9D53, + 0x6F08, 0x9D54, + 0x6F0A, 0x9D55, + 0x6F0B, 0x9D56, + 0x6F0C, 0x9D57, + 0x6F0D, 0x9D58, + 0x6F0E, 0x9D59, + 0x6F10, 0x9D5A, + 0x6F11, 0x9D5B, + 0x6F12, 0x9D5C, + 0x6F16, 0x9D5D, + 0x6F17, 0x9D5E, + 0x6F18, 0x9D5F, + 0x6F19, 0x9D60, + 0x6F1A, 0x9D61, + 0x6F1B, 0x9D62, + 0x6F1C, 0x9D63, + 0x6F1D, 0x9D64, + 0x6F1E, 0x9D65, + 0x6F1F, 0x9D66, + 0x6F21, 0x9D67, + 0x6F22, 0x9D68, + 0x6F23, 0x9D69, + 0x6F25, 0x9D6A, + 0x6F26, 0x9D6B, + 0x6F27, 0x9D6C, + 0x6F28, 0x9D6D, + 0x6F2C, 0x9D6E, + 0x6F2E, 0x9D6F, + 0x6F30, 0x9D70, + 0x6F32, 0x9D71, + 0x6F34, 0x9D72, + 0x6F35, 0x9D73, + 0x6F37, 0x9D74, + 0x6F38, 0x9D75, + 0x6F39, 0x9D76, + 0x6F3A, 0x9D77, + 0x6F3B, 0x9D78, + 0x6F3C, 0x9D79, + 0x6F3D, 0x9D7A, + 0x6F3F, 0x9D7B, + 0x6F40, 0x9D7C, + 0x6F41, 0x9D7D, + 0x6F42, 0x9D7E, + 0x6F43, 0x9D80, + 0x6F44, 0x9D81, + 0x6F45, 0x9D82, + 0x6F48, 0x9D83, + 0x6F49, 0x9D84, + 0x6F4A, 0x9D85, + 0x6F4C, 0x9D86, + 0x6F4E, 0x9D87, + 0x6F4F, 0x9D88, + 0x6F50, 0x9D89, + 0x6F51, 0x9D8A, + 0x6F52, 0x9D8B, + 0x6F53, 0x9D8C, + 0x6F54, 0x9D8D, + 0x6F55, 0x9D8E, + 0x6F56, 0x9D8F, + 0x6F57, 0x9D90, + 0x6F59, 0x9D91, + 0x6F5A, 0x9D92, + 0x6F5B, 0x9D93, + 0x6F5D, 0x9D94, + 0x6F5F, 0x9D95, + 0x6F60, 0x9D96, + 0x6F61, 0x9D97, + 0x6F63, 0x9D98, + 0x6F64, 0x9D99, + 0x6F65, 0x9D9A, + 0x6F67, 0x9D9B, + 0x6F68, 0x9D9C, + 0x6F69, 0x9D9D, + 0x6F6A, 0x9D9E, + 0x6F6B, 0x9D9F, + 0x6F6C, 0x9DA0, + 0x6F6F, 0x9DA1, + 0x6F70, 0x9DA2, + 0x6F71, 0x9DA3, + 0x6F73, 0x9DA4, + 0x6F75, 0x9DA5, + 0x6F76, 0x9DA6, + 0x6F77, 0x9DA7, + 0x6F79, 0x9DA8, + 0x6F7B, 0x9DA9, + 0x6F7D, 0x9DAA, + 0x6F7E, 0x9DAB, + 0x6F7F, 0x9DAC, + 0x6F80, 0x9DAD, + 0x6F81, 0x9DAE, + 0x6F82, 0x9DAF, + 0x6F83, 0x9DB0, + 0x6F85, 0x9DB1, + 0x6F86, 0x9DB2, + 0x6F87, 0x9DB3, + 0x6F8A, 0x9DB4, + 0x6F8B, 0x9DB5, + 0x6F8F, 0x9DB6, + 0x6F90, 0x9DB7, + 0x6F91, 0x9DB8, + 0x6F92, 0x9DB9, + 0x6F93, 0x9DBA, + 0x6F94, 0x9DBB, + 0x6F95, 0x9DBC, + 0x6F96, 0x9DBD, + 0x6F97, 0x9DBE, + 0x6F98, 0x9DBF, + 0x6F99, 0x9DC0, + 0x6F9A, 0x9DC1, + 0x6F9B, 0x9DC2, + 0x6F9D, 0x9DC3, + 0x6F9E, 0x9DC4, + 0x6F9F, 0x9DC5, + 0x6FA0, 0x9DC6, + 0x6FA2, 0x9DC7, + 0x6FA3, 0x9DC8, + 0x6FA4, 0x9DC9, + 0x6FA5, 0x9DCA, + 0x6FA6, 0x9DCB, + 0x6FA8, 0x9DCC, + 0x6FA9, 0x9DCD, + 0x6FAA, 0x9DCE, + 0x6FAB, 0x9DCF, + 0x6FAC, 0x9DD0, + 0x6FAD, 0x9DD1, + 0x6FAE, 0x9DD2, + 0x6FAF, 0x9DD3, + 0x6FB0, 0x9DD4, + 0x6FB1, 0x9DD5, + 0x6FB2, 0x9DD6, + 0x6FB4, 0x9DD7, + 0x6FB5, 0x9DD8, + 0x6FB7, 0x9DD9, + 0x6FB8, 0x9DDA, + 0x6FBA, 0x9DDB, + 0x6FBB, 0x9DDC, + 0x6FBC, 0x9DDD, + 0x6FBD, 0x9DDE, + 0x6FBE, 0x9DDF, + 0x6FBF, 0x9DE0, + 0x6FC1, 0x9DE1, + 0x6FC3, 0x9DE2, + 0x6FC4, 0x9DE3, + 0x6FC5, 0x9DE4, + 0x6FC6, 0x9DE5, + 0x6FC7, 0x9DE6, + 0x6FC8, 0x9DE7, + 0x6FCA, 0x9DE8, + 0x6FCB, 0x9DE9, + 0x6FCC, 0x9DEA, + 0x6FCD, 0x9DEB, + 0x6FCE, 0x9DEC, + 0x6FCF, 0x9DED, + 0x6FD0, 0x9DEE, + 0x6FD3, 0x9DEF, + 0x6FD4, 0x9DF0, + 0x6FD5, 0x9DF1, + 0x6FD6, 0x9DF2, + 0x6FD7, 0x9DF3, + 0x6FD8, 0x9DF4, + 0x6FD9, 0x9DF5, + 0x6FDA, 0x9DF6, + 0x6FDB, 0x9DF7, + 0x6FDC, 0x9DF8, + 0x6FDD, 0x9DF9, + 0x6FDF, 0x9DFA, + 0x6FE2, 0x9DFB, + 0x6FE3, 0x9DFC, + 0x6FE4, 0x9DFD, + 0x6FE5, 0x9DFE, + 0x6FE6, 0x9E40, + 0x6FE7, 0x9E41, + 0x6FE8, 0x9E42, + 0x6FE9, 0x9E43, + 0x6FEA, 0x9E44, + 0x6FEB, 0x9E45, + 0x6FEC, 0x9E46, + 0x6FED, 0x9E47, + 0x6FF0, 0x9E48, + 0x6FF1, 0x9E49, + 0x6FF2, 0x9E4A, + 0x6FF3, 0x9E4B, + 0x6FF4, 0x9E4C, + 0x6FF5, 0x9E4D, + 0x6FF6, 0x9E4E, + 0x6FF7, 0x9E4F, + 0x6FF8, 0x9E50, + 0x6FF9, 0x9E51, + 0x6FFA, 0x9E52, + 0x6FFB, 0x9E53, + 0x6FFC, 0x9E54, + 0x6FFD, 0x9E55, + 0x6FFE, 0x9E56, + 0x6FFF, 0x9E57, + 0x7000, 0x9E58, + 0x7001, 0x9E59, + 0x7002, 0x9E5A, + 0x7003, 0x9E5B, + 0x7004, 0x9E5C, + 0x7005, 0x9E5D, + 0x7006, 0x9E5E, + 0x7007, 0x9E5F, + 0x7008, 0x9E60, + 0x7009, 0x9E61, + 0x700A, 0x9E62, + 0x700B, 0x9E63, + 0x700C, 0x9E64, + 0x700D, 0x9E65, + 0x700E, 0x9E66, + 0x700F, 0x9E67, + 0x7010, 0x9E68, + 0x7012, 0x9E69, + 0x7013, 0x9E6A, + 0x7014, 0x9E6B, + 0x7015, 0x9E6C, + 0x7016, 0x9E6D, + 0x7017, 0x9E6E, + 0x7018, 0x9E6F, + 0x7019, 0x9E70, + 0x701C, 0x9E71, + 0x701D, 0x9E72, + 0x701E, 0x9E73, + 0x701F, 0x9E74, + 0x7020, 0x9E75, + 0x7021, 0x9E76, + 0x7022, 0x9E77, + 0x7024, 0x9E78, + 0x7025, 0x9E79, + 0x7026, 0x9E7A, + 0x7027, 0x9E7B, + 0x7028, 0x9E7C, + 0x7029, 0x9E7D, + 0x702A, 0x9E7E, + 0x702B, 0x9E80, + 0x702C, 0x9E81, + 0x702D, 0x9E82, + 0x702E, 0x9E83, + 0x702F, 0x9E84, + 0x7030, 0x9E85, + 0x7031, 0x9E86, + 0x7032, 0x9E87, + 0x7033, 0x9E88, + 0x7034, 0x9E89, + 0x7036, 0x9E8A, + 0x7037, 0x9E8B, + 0x7038, 0x9E8C, + 0x703A, 0x9E8D, + 0x703B, 0x9E8E, + 0x703C, 0x9E8F, + 0x703D, 0x9E90, + 0x703E, 0x9E91, + 0x703F, 0x9E92, + 0x7040, 0x9E93, + 0x7041, 0x9E94, + 0x7042, 0x9E95, + 0x7043, 0x9E96, + 0x7044, 0x9E97, + 0x7045, 0x9E98, + 0x7046, 0x9E99, + 0x7047, 0x9E9A, + 0x7048, 0x9E9B, + 0x7049, 0x9E9C, + 0x704A, 0x9E9D, + 0x704B, 0x9E9E, + 0x704D, 0x9E9F, + 0x704E, 0x9EA0, + 0x7050, 0x9EA1, + 0x7051, 0x9EA2, + 0x7052, 0x9EA3, + 0x7053, 0x9EA4, + 0x7054, 0x9EA5, + 0x7055, 0x9EA6, + 0x7056, 0x9EA7, + 0x7057, 0x9EA8, + 0x7058, 0x9EA9, + 0x7059, 0x9EAA, + 0x705A, 0x9EAB, + 0x705B, 0x9EAC, + 0x705C, 0x9EAD, + 0x705D, 0x9EAE, + 0x705F, 0x9EAF, + 0x7060, 0x9EB0, + 0x7061, 0x9EB1, + 0x7062, 0x9EB2, + 0x7063, 0x9EB3, + 0x7064, 0x9EB4, + 0x7065, 0x9EB5, + 0x7066, 0x9EB6, + 0x7067, 0x9EB7, + 0x7068, 0x9EB8, + 0x7069, 0x9EB9, + 0x706A, 0x9EBA, + 0x706E, 0x9EBB, + 0x7071, 0x9EBC, + 0x7072, 0x9EBD, + 0x7073, 0x9EBE, + 0x7074, 0x9EBF, + 0x7077, 0x9EC0, + 0x7079, 0x9EC1, + 0x707A, 0x9EC2, + 0x707B, 0x9EC3, + 0x707D, 0x9EC4, + 0x7081, 0x9EC5, + 0x7082, 0x9EC6, + 0x7083, 0x9EC7, + 0x7084, 0x9EC8, + 0x7086, 0x9EC9, + 0x7087, 0x9ECA, + 0x7088, 0x9ECB, + 0x708B, 0x9ECC, + 0x708C, 0x9ECD, + 0x708D, 0x9ECE, + 0x708F, 0x9ECF, + 0x7090, 0x9ED0, + 0x7091, 0x9ED1, + 0x7093, 0x9ED2, + 0x7097, 0x9ED3, + 0x7098, 0x9ED4, + 0x709A, 0x9ED5, + 0x709B, 0x9ED6, + 0x709E, 0x9ED7, + 0x709F, 0x9ED8, + 0x70A0, 0x9ED9, + 0x70A1, 0x9EDA, + 0x70A2, 0x9EDB, + 0x70A3, 0x9EDC, + 0x70A4, 0x9EDD, + 0x70A5, 0x9EDE, + 0x70A6, 0x9EDF, + 0x70A7, 0x9EE0, + 0x70A8, 0x9EE1, + 0x70A9, 0x9EE2, + 0x70AA, 0x9EE3, + 0x70B0, 0x9EE4, + 0x70B2, 0x9EE5, + 0x70B4, 0x9EE6, + 0x70B5, 0x9EE7, + 0x70B6, 0x9EE8, + 0x70BA, 0x9EE9, + 0x70BE, 0x9EEA, + 0x70BF, 0x9EEB, + 0x70C4, 0x9EEC, + 0x70C5, 0x9EED, + 0x70C6, 0x9EEE, + 0x70C7, 0x9EEF, + 0x70C9, 0x9EF0, + 0x70CB, 0x9EF1, + 0x70CC, 0x9EF2, + 0x70CD, 0x9EF3, + 0x70CE, 0x9EF4, + 0x70CF, 0x9EF5, + 0x70D0, 0x9EF6, + 0x70D1, 0x9EF7, + 0x70D2, 0x9EF8, + 0x70D3, 0x9EF9, + 0x70D4, 0x9EFA, + 0x70D5, 0x9EFB, + 0x70D6, 0x9EFC, + 0x70D7, 0x9EFD, + 0x70DA, 0x9EFE, + 0x70DC, 0x9F40, + 0x70DD, 0x9F41, + 0x70DE, 0x9F42, + 0x70E0, 0x9F43, + 0x70E1, 0x9F44, + 0x70E2, 0x9F45, + 0x70E3, 0x9F46, + 0x70E5, 0x9F47, + 0x70EA, 0x9F48, + 0x70EE, 0x9F49, + 0x70F0, 0x9F4A, + 0x70F1, 0x9F4B, + 0x70F2, 0x9F4C, + 0x70F3, 0x9F4D, + 0x70F4, 0x9F4E, + 0x70F5, 0x9F4F, + 0x70F6, 0x9F50, + 0x70F8, 0x9F51, + 0x70FA, 0x9F52, + 0x70FB, 0x9F53, + 0x70FC, 0x9F54, + 0x70FE, 0x9F55, + 0x70FF, 0x9F56, + 0x7100, 0x9F57, + 0x7101, 0x9F58, + 0x7102, 0x9F59, + 0x7103, 0x9F5A, + 0x7104, 0x9F5B, + 0x7105, 0x9F5C, + 0x7106, 0x9F5D, + 0x7107, 0x9F5E, + 0x7108, 0x9F5F, + 0x710B, 0x9F60, + 0x710C, 0x9F61, + 0x710D, 0x9F62, + 0x710E, 0x9F63, + 0x710F, 0x9F64, + 0x7111, 0x9F65, + 0x7112, 0x9F66, + 0x7114, 0x9F67, + 0x7117, 0x9F68, + 0x711B, 0x9F69, + 0x711C, 0x9F6A, + 0x711D, 0x9F6B, + 0x711E, 0x9F6C, + 0x711F, 0x9F6D, + 0x7120, 0x9F6E, + 0x7121, 0x9F6F, + 0x7122, 0x9F70, + 0x7123, 0x9F71, + 0x7124, 0x9F72, + 0x7125, 0x9F73, + 0x7127, 0x9F74, + 0x7128, 0x9F75, + 0x7129, 0x9F76, + 0x712A, 0x9F77, + 0x712B, 0x9F78, + 0x712C, 0x9F79, + 0x712D, 0x9F7A, + 0x712E, 0x9F7B, + 0x7132, 0x9F7C, + 0x7133, 0x9F7D, + 0x7134, 0x9F7E, + 0x7135, 0x9F80, + 0x7137, 0x9F81, + 0x7138, 0x9F82, + 0x7139, 0x9F83, + 0x713A, 0x9F84, + 0x713B, 0x9F85, + 0x713C, 0x9F86, + 0x713D, 0x9F87, + 0x713E, 0x9F88, + 0x713F, 0x9F89, + 0x7140, 0x9F8A, + 0x7141, 0x9F8B, + 0x7142, 0x9F8C, + 0x7143, 0x9F8D, + 0x7144, 0x9F8E, + 0x7146, 0x9F8F, + 0x7147, 0x9F90, + 0x7148, 0x9F91, + 0x7149, 0x9F92, + 0x714B, 0x9F93, + 0x714D, 0x9F94, + 0x714F, 0x9F95, + 0x7150, 0x9F96, + 0x7151, 0x9F97, + 0x7152, 0x9F98, + 0x7153, 0x9F99, + 0x7154, 0x9F9A, + 0x7155, 0x9F9B, + 0x7156, 0x9F9C, + 0x7157, 0x9F9D, + 0x7158, 0x9F9E, + 0x7159, 0x9F9F, + 0x715A, 0x9FA0, + 0x715B, 0x9FA1, + 0x715D, 0x9FA2, + 0x715F, 0x9FA3, + 0x7160, 0x9FA4, + 0x7161, 0x9FA5, + 0x7162, 0x9FA6, + 0x7163, 0x9FA7, + 0x7165, 0x9FA8, + 0x7169, 0x9FA9, + 0x716A, 0x9FAA, + 0x716B, 0x9FAB, + 0x716C, 0x9FAC, + 0x716D, 0x9FAD, + 0x716F, 0x9FAE, + 0x7170, 0x9FAF, + 0x7171, 0x9FB0, + 0x7174, 0x9FB1, + 0x7175, 0x9FB2, + 0x7176, 0x9FB3, + 0x7177, 0x9FB4, + 0x7179, 0x9FB5, + 0x717B, 0x9FB6, + 0x717C, 0x9FB7, + 0x717E, 0x9FB8, + 0x717F, 0x9FB9, + 0x7180, 0x9FBA, + 0x7181, 0x9FBB, + 0x7182, 0x9FBC, + 0x7183, 0x9FBD, + 0x7185, 0x9FBE, + 0x7186, 0x9FBF, + 0x7187, 0x9FC0, + 0x7188, 0x9FC1, + 0x7189, 0x9FC2, + 0x718B, 0x9FC3, + 0x718C, 0x9FC4, + 0x718D, 0x9FC5, + 0x718E, 0x9FC6, + 0x7190, 0x9FC7, + 0x7191, 0x9FC8, + 0x7192, 0x9FC9, + 0x7193, 0x9FCA, + 0x7195, 0x9FCB, + 0x7196, 0x9FCC, + 0x7197, 0x9FCD, + 0x719A, 0x9FCE, + 0x719B, 0x9FCF, + 0x719C, 0x9FD0, + 0x719D, 0x9FD1, + 0x719E, 0x9FD2, + 0x71A1, 0x9FD3, + 0x71A2, 0x9FD4, + 0x71A3, 0x9FD5, + 0x71A4, 0x9FD6, + 0x71A5, 0x9FD7, + 0x71A6, 0x9FD8, + 0x71A7, 0x9FD9, + 0x71A9, 0x9FDA, + 0x71AA, 0x9FDB, + 0x71AB, 0x9FDC, + 0x71AD, 0x9FDD, + 0x71AE, 0x9FDE, + 0x71AF, 0x9FDF, + 0x71B0, 0x9FE0, + 0x71B1, 0x9FE1, + 0x71B2, 0x9FE2, + 0x71B4, 0x9FE3, + 0x71B6, 0x9FE4, + 0x71B7, 0x9FE5, + 0x71B8, 0x9FE6, + 0x71BA, 0x9FE7, + 0x71BB, 0x9FE8, + 0x71BC, 0x9FE9, + 0x71BD, 0x9FEA, + 0x71BE, 0x9FEB, + 0x71BF, 0x9FEC, + 0x71C0, 0x9FED, + 0x71C1, 0x9FEE, + 0x71C2, 0x9FEF, + 0x71C4, 0x9FF0, + 0x71C5, 0x9FF1, + 0x71C6, 0x9FF2, + 0x71C7, 0x9FF3, + 0x71C8, 0x9FF4, + 0x71C9, 0x9FF5, + 0x71CA, 0x9FF6, + 0x71CB, 0x9FF7, + 0x71CC, 0x9FF8, + 0x71CD, 0x9FF9, + 0x71CF, 0x9FFA, + 0x71D0, 0x9FFB, + 0x71D1, 0x9FFC, + 0x71D2, 0x9FFD, + 0x71D3, 0x9FFE, + 0x71D6, 0xA040, + 0x71D7, 0xA041, + 0x71D8, 0xA042, + 0x71D9, 0xA043, + 0x71DA, 0xA044, + 0x71DB, 0xA045, + 0x71DC, 0xA046, + 0x71DD, 0xA047, + 0x71DE, 0xA048, + 0x71DF, 0xA049, + 0x71E1, 0xA04A, + 0x71E2, 0xA04B, + 0x71E3, 0xA04C, + 0x71E4, 0xA04D, + 0x71E6, 0xA04E, + 0x71E8, 0xA04F, + 0x71E9, 0xA050, + 0x71EA, 0xA051, + 0x71EB, 0xA052, + 0x71EC, 0xA053, + 0x71ED, 0xA054, + 0x71EF, 0xA055, + 0x71F0, 0xA056, + 0x71F1, 0xA057, + 0x71F2, 0xA058, + 0x71F3, 0xA059, + 0x71F4, 0xA05A, + 0x71F5, 0xA05B, + 0x71F6, 0xA05C, + 0x71F7, 0xA05D, + 0x71F8, 0xA05E, + 0x71FA, 0xA05F, + 0x71FB, 0xA060, + 0x71FC, 0xA061, + 0x71FD, 0xA062, + 0x71FE, 0xA063, + 0x71FF, 0xA064, + 0x7200, 0xA065, + 0x7201, 0xA066, + 0x7202, 0xA067, + 0x7203, 0xA068, + 0x7204, 0xA069, + 0x7205, 0xA06A, + 0x7207, 0xA06B, + 0x7208, 0xA06C, + 0x7209, 0xA06D, + 0x720A, 0xA06E, + 0x720B, 0xA06F, + 0x720C, 0xA070, + 0x720D, 0xA071, + 0x720E, 0xA072, + 0x720F, 0xA073, + 0x7210, 0xA074, + 0x7211, 0xA075, + 0x7212, 0xA076, + 0x7213, 0xA077, + 0x7214, 0xA078, + 0x7215, 0xA079, + 0x7216, 0xA07A, + 0x7217, 0xA07B, + 0x7218, 0xA07C, + 0x7219, 0xA07D, + 0x721A, 0xA07E, + 0x721B, 0xA080, + 0x721C, 0xA081, + 0x721E, 0xA082, + 0x721F, 0xA083, + 0x7220, 0xA084, + 0x7221, 0xA085, + 0x7222, 0xA086, + 0x7223, 0xA087, + 0x7224, 0xA088, + 0x7225, 0xA089, + 0x7226, 0xA08A, + 0x7227, 0xA08B, + 0x7229, 0xA08C, + 0x722B, 0xA08D, + 0x722D, 0xA08E, + 0x722E, 0xA08F, + 0x722F, 0xA090, + 0x7232, 0xA091, + 0x7233, 0xA092, + 0x7234, 0xA093, + 0x723A, 0xA094, + 0x723C, 0xA095, + 0x723E, 0xA096, + 0x7240, 0xA097, + 0x7241, 0xA098, + 0x7242, 0xA099, + 0x7243, 0xA09A, + 0x7244, 0xA09B, + 0x7245, 0xA09C, + 0x7246, 0xA09D, + 0x7249, 0xA09E, + 0x724A, 0xA09F, + 0x724B, 0xA0A0, + 0x724E, 0xA0A1, + 0x724F, 0xA0A2, + 0x7250, 0xA0A3, + 0x7251, 0xA0A4, + 0x7253, 0xA0A5, + 0x7254, 0xA0A6, + 0x7255, 0xA0A7, + 0x7257, 0xA0A8, + 0x7258, 0xA0A9, + 0x725A, 0xA0AA, + 0x725C, 0xA0AB, + 0x725E, 0xA0AC, + 0x7260, 0xA0AD, + 0x7263, 0xA0AE, + 0x7264, 0xA0AF, + 0x7265, 0xA0B0, + 0x7268, 0xA0B1, + 0x726A, 0xA0B2, + 0x726B, 0xA0B3, + 0x726C, 0xA0B4, + 0x726D, 0xA0B5, + 0x7270, 0xA0B6, + 0x7271, 0xA0B7, + 0x7273, 0xA0B8, + 0x7274, 0xA0B9, + 0x7276, 0xA0BA, + 0x7277, 0xA0BB, + 0x7278, 0xA0BC, + 0x727B, 0xA0BD, + 0x727C, 0xA0BE, + 0x727D, 0xA0BF, + 0x7282, 0xA0C0, + 0x7283, 0xA0C1, + 0x7285, 0xA0C2, + 0x7286, 0xA0C3, + 0x7287, 0xA0C4, + 0x7288, 0xA0C5, + 0x7289, 0xA0C6, + 0x728C, 0xA0C7, + 0x728E, 0xA0C8, + 0x7290, 0xA0C9, + 0x7291, 0xA0CA, + 0x7293, 0xA0CB, + 0x7294, 0xA0CC, + 0x7295, 0xA0CD, + 0x7296, 0xA0CE, + 0x7297, 0xA0CF, + 0x7298, 0xA0D0, + 0x7299, 0xA0D1, + 0x729A, 0xA0D2, + 0x729B, 0xA0D3, + 0x729C, 0xA0D4, + 0x729D, 0xA0D5, + 0x729E, 0xA0D6, + 0x72A0, 0xA0D7, + 0x72A1, 0xA0D8, + 0x72A2, 0xA0D9, + 0x72A3, 0xA0DA, + 0x72A4, 0xA0DB, + 0x72A5, 0xA0DC, + 0x72A6, 0xA0DD, + 0x72A7, 0xA0DE, + 0x72A8, 0xA0DF, + 0x72A9, 0xA0E0, + 0x72AA, 0xA0E1, + 0x72AB, 0xA0E2, + 0x72AE, 0xA0E3, + 0x72B1, 0xA0E4, + 0x72B2, 0xA0E5, + 0x72B3, 0xA0E6, + 0x72B5, 0xA0E7, + 0x72BA, 0xA0E8, + 0x72BB, 0xA0E9, + 0x72BC, 0xA0EA, + 0x72BD, 0xA0EB, + 0x72BE, 0xA0EC, + 0x72BF, 0xA0ED, + 0x72C0, 0xA0EE, + 0x72C5, 0xA0EF, + 0x72C6, 0xA0F0, + 0x72C7, 0xA0F1, + 0x72C9, 0xA0F2, + 0x72CA, 0xA0F3, + 0x72CB, 0xA0F4, + 0x72CC, 0xA0F5, + 0x72CF, 0xA0F6, + 0x72D1, 0xA0F7, + 0x72D3, 0xA0F8, + 0x72D4, 0xA0F9, + 0x72D5, 0xA0FA, + 0x72D6, 0xA0FB, + 0x72D8, 0xA0FC, + 0x72DA, 0xA0FD, + 0x72DB, 0xA0FE, + 0x72DC, 0xAA40, + 0x72DD, 0xAA41, + 0x72DF, 0xAA42, + 0x72E2, 0xAA43, + 0x72E3, 0xAA44, + 0x72E4, 0xAA45, + 0x72E5, 0xAA46, + 0x72E6, 0xAA47, + 0x72E7, 0xAA48, + 0x72EA, 0xAA49, + 0x72EB, 0xAA4A, + 0x72F5, 0xAA4B, + 0x72F6, 0xAA4C, + 0x72F9, 0xAA4D, + 0x72FD, 0xAA4E, + 0x72FE, 0xAA4F, + 0x72FF, 0xAA50, + 0x7300, 0xAA51, + 0x7302, 0xAA52, + 0x7304, 0xAA53, + 0x7305, 0xAA54, + 0x7306, 0xAA55, + 0x7307, 0xAA56, + 0x7308, 0xAA57, + 0x7309, 0xAA58, + 0x730B, 0xAA59, + 0x730C, 0xAA5A, + 0x730D, 0xAA5B, + 0x730F, 0xAA5C, + 0x7310, 0xAA5D, + 0x7311, 0xAA5E, + 0x7312, 0xAA5F, + 0x7314, 0xAA60, + 0x7318, 0xAA61, + 0x7319, 0xAA62, + 0x731A, 0xAA63, + 0x731F, 0xAA64, + 0x7320, 0xAA65, + 0x7323, 0xAA66, + 0x7324, 0xAA67, + 0x7326, 0xAA68, + 0x7327, 0xAA69, + 0x7328, 0xAA6A, + 0x732D, 0xAA6B, + 0x732F, 0xAA6C, + 0x7330, 0xAA6D, + 0x7332, 0xAA6E, + 0x7333, 0xAA6F, + 0x7335, 0xAA70, + 0x7336, 0xAA71, + 0x733A, 0xAA72, + 0x733B, 0xAA73, + 0x733C, 0xAA74, + 0x733D, 0xAA75, + 0x7340, 0xAA76, + 0x7341, 0xAA77, + 0x7342, 0xAA78, + 0x7343, 0xAA79, + 0x7344, 0xAA7A, + 0x7345, 0xAA7B, + 0x7346, 0xAA7C, + 0x7347, 0xAA7D, + 0x7348, 0xAA7E, + 0x7349, 0xAA80, + 0x734A, 0xAA81, + 0x734B, 0xAA82, + 0x734C, 0xAA83, + 0x734E, 0xAA84, + 0x734F, 0xAA85, + 0x7351, 0xAA86, + 0x7353, 0xAA87, + 0x7354, 0xAA88, + 0x7355, 0xAA89, + 0x7356, 0xAA8A, + 0x7358, 0xAA8B, + 0x7359, 0xAA8C, + 0x735A, 0xAA8D, + 0x735B, 0xAA8E, + 0x735C, 0xAA8F, + 0x735D, 0xAA90, + 0x735E, 0xAA91, + 0x735F, 0xAA92, + 0x7361, 0xAA93, + 0x7362, 0xAA94, + 0x7363, 0xAA95, + 0x7364, 0xAA96, + 0x7365, 0xAA97, + 0x7366, 0xAA98, + 0x7367, 0xAA99, + 0x7368, 0xAA9A, + 0x7369, 0xAA9B, + 0x736A, 0xAA9C, + 0x736B, 0xAA9D, + 0x736E, 0xAA9E, + 0x7370, 0xAA9F, + 0x7371, 0xAAA0, + 0x7372, 0xAB40, + 0x7373, 0xAB41, + 0x7374, 0xAB42, + 0x7375, 0xAB43, + 0x7376, 0xAB44, + 0x7377, 0xAB45, + 0x7378, 0xAB46, + 0x7379, 0xAB47, + 0x737A, 0xAB48, + 0x737B, 0xAB49, + 0x737C, 0xAB4A, + 0x737D, 0xAB4B, + 0x737F, 0xAB4C, + 0x7380, 0xAB4D, + 0x7381, 0xAB4E, + 0x7382, 0xAB4F, + 0x7383, 0xAB50, + 0x7385, 0xAB51, + 0x7386, 0xAB52, + 0x7388, 0xAB53, + 0x738A, 0xAB54, + 0x738C, 0xAB55, + 0x738D, 0xAB56, + 0x738F, 0xAB57, + 0x7390, 0xAB58, + 0x7392, 0xAB59, + 0x7393, 0xAB5A, + 0x7394, 0xAB5B, + 0x7395, 0xAB5C, + 0x7397, 0xAB5D, + 0x7398, 0xAB5E, + 0x7399, 0xAB5F, + 0x739A, 0xAB60, + 0x739C, 0xAB61, + 0x739D, 0xAB62, + 0x739E, 0xAB63, + 0x73A0, 0xAB64, + 0x73A1, 0xAB65, + 0x73A3, 0xAB66, + 0x73A4, 0xAB67, + 0x73A5, 0xAB68, + 0x73A6, 0xAB69, + 0x73A7, 0xAB6A, + 0x73A8, 0xAB6B, + 0x73AA, 0xAB6C, + 0x73AC, 0xAB6D, + 0x73AD, 0xAB6E, + 0x73B1, 0xAB6F, + 0x73B4, 0xAB70, + 0x73B5, 0xAB71, + 0x73B6, 0xAB72, + 0x73B8, 0xAB73, + 0x73B9, 0xAB74, + 0x73BC, 0xAB75, + 0x73BD, 0xAB76, + 0x73BE, 0xAB77, + 0x73BF, 0xAB78, + 0x73C1, 0xAB79, + 0x73C3, 0xAB7A, + 0x73C4, 0xAB7B, + 0x73C5, 0xAB7C, + 0x73C6, 0xAB7D, + 0x73C7, 0xAB7E, + 0x73CB, 0xAB80, + 0x73CC, 0xAB81, + 0x73CE, 0xAB82, + 0x73D2, 0xAB83, + 0x73D3, 0xAB84, + 0x73D4, 0xAB85, + 0x73D5, 0xAB86, + 0x73D6, 0xAB87, + 0x73D7, 0xAB88, + 0x73D8, 0xAB89, + 0x73DA, 0xAB8A, + 0x73DB, 0xAB8B, + 0x73DC, 0xAB8C, + 0x73DD, 0xAB8D, + 0x73DF, 0xAB8E, + 0x73E1, 0xAB8F, + 0x73E2, 0xAB90, + 0x73E3, 0xAB91, + 0x73E4, 0xAB92, + 0x73E6, 0xAB93, + 0x73E8, 0xAB94, + 0x73EA, 0xAB95, + 0x73EB, 0xAB96, + 0x73EC, 0xAB97, + 0x73EE, 0xAB98, + 0x73EF, 0xAB99, + 0x73F0, 0xAB9A, + 0x73F1, 0xAB9B, + 0x73F3, 0xAB9C, + 0x73F4, 0xAB9D, + 0x73F5, 0xAB9E, + 0x73F6, 0xAB9F, + 0x73F7, 0xABA0, + 0x73F8, 0xAC40, + 0x73F9, 0xAC41, + 0x73FA, 0xAC42, + 0x73FB, 0xAC43, + 0x73FC, 0xAC44, + 0x73FD, 0xAC45, + 0x73FE, 0xAC46, + 0x73FF, 0xAC47, + 0x7400, 0xAC48, + 0x7401, 0xAC49, + 0x7402, 0xAC4A, + 0x7404, 0xAC4B, + 0x7407, 0xAC4C, + 0x7408, 0xAC4D, + 0x740B, 0xAC4E, + 0x740C, 0xAC4F, + 0x740D, 0xAC50, + 0x740E, 0xAC51, + 0x7411, 0xAC52, + 0x7412, 0xAC53, + 0x7413, 0xAC54, + 0x7414, 0xAC55, + 0x7415, 0xAC56, + 0x7416, 0xAC57, + 0x7417, 0xAC58, + 0x7418, 0xAC59, + 0x7419, 0xAC5A, + 0x741C, 0xAC5B, + 0x741D, 0xAC5C, + 0x741E, 0xAC5D, + 0x741F, 0xAC5E, + 0x7420, 0xAC5F, + 0x7421, 0xAC60, + 0x7423, 0xAC61, + 0x7424, 0xAC62, + 0x7427, 0xAC63, + 0x7429, 0xAC64, + 0x742B, 0xAC65, + 0x742D, 0xAC66, + 0x742F, 0xAC67, + 0x7431, 0xAC68, + 0x7432, 0xAC69, + 0x7437, 0xAC6A, + 0x7438, 0xAC6B, + 0x7439, 0xAC6C, + 0x743A, 0xAC6D, + 0x743B, 0xAC6E, + 0x743D, 0xAC6F, + 0x743E, 0xAC70, + 0x743F, 0xAC71, + 0x7440, 0xAC72, + 0x7442, 0xAC73, + 0x7443, 0xAC74, + 0x7444, 0xAC75, + 0x7445, 0xAC76, + 0x7446, 0xAC77, + 0x7447, 0xAC78, + 0x7448, 0xAC79, + 0x7449, 0xAC7A, + 0x744A, 0xAC7B, + 0x744B, 0xAC7C, + 0x744C, 0xAC7D, + 0x744D, 0xAC7E, + 0x744E, 0xAC80, + 0x744F, 0xAC81, + 0x7450, 0xAC82, + 0x7451, 0xAC83, + 0x7452, 0xAC84, + 0x7453, 0xAC85, + 0x7454, 0xAC86, + 0x7456, 0xAC87, + 0x7458, 0xAC88, + 0x745D, 0xAC89, + 0x7460, 0xAC8A, + 0x7461, 0xAC8B, + 0x7462, 0xAC8C, + 0x7463, 0xAC8D, + 0x7464, 0xAC8E, + 0x7465, 0xAC8F, + 0x7466, 0xAC90, + 0x7467, 0xAC91, + 0x7468, 0xAC92, + 0x7469, 0xAC93, + 0x746A, 0xAC94, + 0x746B, 0xAC95, + 0x746C, 0xAC96, + 0x746E, 0xAC97, + 0x746F, 0xAC98, + 0x7471, 0xAC99, + 0x7472, 0xAC9A, + 0x7473, 0xAC9B, + 0x7474, 0xAC9C, + 0x7475, 0xAC9D, + 0x7478, 0xAC9E, + 0x7479, 0xAC9F, + 0x747A, 0xACA0, + 0x747B, 0xAD40, + 0x747C, 0xAD41, + 0x747D, 0xAD42, + 0x747F, 0xAD43, + 0x7482, 0xAD44, + 0x7484, 0xAD45, + 0x7485, 0xAD46, + 0x7486, 0xAD47, + 0x7488, 0xAD48, + 0x7489, 0xAD49, + 0x748A, 0xAD4A, + 0x748C, 0xAD4B, + 0x748D, 0xAD4C, + 0x748F, 0xAD4D, + 0x7491, 0xAD4E, + 0x7492, 0xAD4F, + 0x7493, 0xAD50, + 0x7494, 0xAD51, + 0x7495, 0xAD52, + 0x7496, 0xAD53, + 0x7497, 0xAD54, + 0x7498, 0xAD55, + 0x7499, 0xAD56, + 0x749A, 0xAD57, + 0x749B, 0xAD58, + 0x749D, 0xAD59, + 0x749F, 0xAD5A, + 0x74A0, 0xAD5B, + 0x74A1, 0xAD5C, + 0x74A2, 0xAD5D, + 0x74A3, 0xAD5E, + 0x74A4, 0xAD5F, + 0x74A5, 0xAD60, + 0x74A6, 0xAD61, + 0x74AA, 0xAD62, + 0x74AB, 0xAD63, + 0x74AC, 0xAD64, + 0x74AD, 0xAD65, + 0x74AE, 0xAD66, + 0x74AF, 0xAD67, + 0x74B0, 0xAD68, + 0x74B1, 0xAD69, + 0x74B2, 0xAD6A, + 0x74B3, 0xAD6B, + 0x74B4, 0xAD6C, + 0x74B5, 0xAD6D, + 0x74B6, 0xAD6E, + 0x74B7, 0xAD6F, + 0x74B8, 0xAD70, + 0x74B9, 0xAD71, + 0x74BB, 0xAD72, + 0x74BC, 0xAD73, + 0x74BD, 0xAD74, + 0x74BE, 0xAD75, + 0x74BF, 0xAD76, + 0x74C0, 0xAD77, + 0x74C1, 0xAD78, + 0x74C2, 0xAD79, + 0x74C3, 0xAD7A, + 0x74C4, 0xAD7B, + 0x74C5, 0xAD7C, + 0x74C6, 0xAD7D, + 0x74C7, 0xAD7E, + 0x74C8, 0xAD80, + 0x74C9, 0xAD81, + 0x74CA, 0xAD82, + 0x74CB, 0xAD83, + 0x74CC, 0xAD84, + 0x74CD, 0xAD85, + 0x74CE, 0xAD86, + 0x74CF, 0xAD87, + 0x74D0, 0xAD88, + 0x74D1, 0xAD89, + 0x74D3, 0xAD8A, + 0x74D4, 0xAD8B, + 0x74D5, 0xAD8C, + 0x74D6, 0xAD8D, + 0x74D7, 0xAD8E, + 0x74D8, 0xAD8F, + 0x74D9, 0xAD90, + 0x74DA, 0xAD91, + 0x74DB, 0xAD92, + 0x74DD, 0xAD93, + 0x74DF, 0xAD94, + 0x74E1, 0xAD95, + 0x74E5, 0xAD96, + 0x74E7, 0xAD97, + 0x74E8, 0xAD98, + 0x74E9, 0xAD99, + 0x74EA, 0xAD9A, + 0x74EB, 0xAD9B, + 0x74EC, 0xAD9C, + 0x74ED, 0xAD9D, + 0x74F0, 0xAD9E, + 0x74F1, 0xAD9F, + 0x74F2, 0xADA0, + 0x74F3, 0xAE40, + 0x74F5, 0xAE41, + 0x74F8, 0xAE42, + 0x74F9, 0xAE43, + 0x74FA, 0xAE44, + 0x74FB, 0xAE45, + 0x74FC, 0xAE46, + 0x74FD, 0xAE47, + 0x74FE, 0xAE48, + 0x7500, 0xAE49, + 0x7501, 0xAE4A, + 0x7502, 0xAE4B, + 0x7503, 0xAE4C, + 0x7505, 0xAE4D, + 0x7506, 0xAE4E, + 0x7507, 0xAE4F, + 0x7508, 0xAE50, + 0x7509, 0xAE51, + 0x750A, 0xAE52, + 0x750B, 0xAE53, + 0x750C, 0xAE54, + 0x750E, 0xAE55, + 0x7510, 0xAE56, + 0x7512, 0xAE57, + 0x7514, 0xAE58, + 0x7515, 0xAE59, + 0x7516, 0xAE5A, + 0x7517, 0xAE5B, + 0x751B, 0xAE5C, + 0x751D, 0xAE5D, + 0x751E, 0xAE5E, + 0x7520, 0xAE5F, + 0x7521, 0xAE60, + 0x7522, 0xAE61, + 0x7523, 0xAE62, + 0x7524, 0xAE63, + 0x7526, 0xAE64, + 0x7527, 0xAE65, + 0x752A, 0xAE66, + 0x752E, 0xAE67, + 0x7534, 0xAE68, + 0x7536, 0xAE69, + 0x7539, 0xAE6A, + 0x753C, 0xAE6B, + 0x753D, 0xAE6C, + 0x753F, 0xAE6D, + 0x7541, 0xAE6E, + 0x7542, 0xAE6F, + 0x7543, 0xAE70, + 0x7544, 0xAE71, + 0x7546, 0xAE72, + 0x7547, 0xAE73, + 0x7549, 0xAE74, + 0x754A, 0xAE75, + 0x754D, 0xAE76, + 0x7550, 0xAE77, + 0x7551, 0xAE78, + 0x7552, 0xAE79, + 0x7553, 0xAE7A, + 0x7555, 0xAE7B, + 0x7556, 0xAE7C, + 0x7557, 0xAE7D, + 0x7558, 0xAE7E, + 0x755D, 0xAE80, + 0x755E, 0xAE81, + 0x755F, 0xAE82, + 0x7560, 0xAE83, + 0x7561, 0xAE84, + 0x7562, 0xAE85, + 0x7563, 0xAE86, + 0x7564, 0xAE87, + 0x7567, 0xAE88, + 0x7568, 0xAE89, + 0x7569, 0xAE8A, + 0x756B, 0xAE8B, + 0x756C, 0xAE8C, + 0x756D, 0xAE8D, + 0x756E, 0xAE8E, + 0x756F, 0xAE8F, + 0x7570, 0xAE90, + 0x7571, 0xAE91, + 0x7573, 0xAE92, + 0x7575, 0xAE93, + 0x7576, 0xAE94, + 0x7577, 0xAE95, + 0x757A, 0xAE96, + 0x757B, 0xAE97, + 0x757C, 0xAE98, + 0x757D, 0xAE99, + 0x757E, 0xAE9A, + 0x7580, 0xAE9B, + 0x7581, 0xAE9C, + 0x7582, 0xAE9D, + 0x7584, 0xAE9E, + 0x7585, 0xAE9F, + 0x7587, 0xAEA0, + 0x7588, 0xAF40, + 0x7589, 0xAF41, + 0x758A, 0xAF42, + 0x758C, 0xAF43, + 0x758D, 0xAF44, + 0x758E, 0xAF45, + 0x7590, 0xAF46, + 0x7593, 0xAF47, + 0x7595, 0xAF48, + 0x7598, 0xAF49, + 0x759B, 0xAF4A, + 0x759C, 0xAF4B, + 0x759E, 0xAF4C, + 0x75A2, 0xAF4D, + 0x75A6, 0xAF4E, + 0x75A7, 0xAF4F, + 0x75A8, 0xAF50, + 0x75A9, 0xAF51, + 0x75AA, 0xAF52, + 0x75AD, 0xAF53, + 0x75B6, 0xAF54, + 0x75B7, 0xAF55, + 0x75BA, 0xAF56, + 0x75BB, 0xAF57, + 0x75BF, 0xAF58, + 0x75C0, 0xAF59, + 0x75C1, 0xAF5A, + 0x75C6, 0xAF5B, + 0x75CB, 0xAF5C, + 0x75CC, 0xAF5D, + 0x75CE, 0xAF5E, + 0x75CF, 0xAF5F, + 0x75D0, 0xAF60, + 0x75D1, 0xAF61, + 0x75D3, 0xAF62, + 0x75D7, 0xAF63, + 0x75D9, 0xAF64, + 0x75DA, 0xAF65, + 0x75DC, 0xAF66, + 0x75DD, 0xAF67, + 0x75DF, 0xAF68, + 0x75E0, 0xAF69, + 0x75E1, 0xAF6A, + 0x75E5, 0xAF6B, + 0x75E9, 0xAF6C, + 0x75EC, 0xAF6D, + 0x75ED, 0xAF6E, + 0x75EE, 0xAF6F, + 0x75EF, 0xAF70, + 0x75F2, 0xAF71, + 0x75F3, 0xAF72, + 0x75F5, 0xAF73, + 0x75F6, 0xAF74, + 0x75F7, 0xAF75, + 0x75F8, 0xAF76, + 0x75FA, 0xAF77, + 0x75FB, 0xAF78, + 0x75FD, 0xAF79, + 0x75FE, 0xAF7A, + 0x7602, 0xAF7B, + 0x7604, 0xAF7C, + 0x7606, 0xAF7D, + 0x7607, 0xAF7E, + 0x7608, 0xAF80, + 0x7609, 0xAF81, + 0x760B, 0xAF82, + 0x760D, 0xAF83, + 0x760E, 0xAF84, + 0x760F, 0xAF85, + 0x7611, 0xAF86, + 0x7612, 0xAF87, + 0x7613, 0xAF88, + 0x7614, 0xAF89, + 0x7616, 0xAF8A, + 0x761A, 0xAF8B, + 0x761C, 0xAF8C, + 0x761D, 0xAF8D, + 0x761E, 0xAF8E, + 0x7621, 0xAF8F, + 0x7623, 0xAF90, + 0x7627, 0xAF91, + 0x7628, 0xAF92, + 0x762C, 0xAF93, + 0x762E, 0xAF94, + 0x762F, 0xAF95, + 0x7631, 0xAF96, + 0x7632, 0xAF97, + 0x7636, 0xAF98, + 0x7637, 0xAF99, + 0x7639, 0xAF9A, + 0x763A, 0xAF9B, + 0x763B, 0xAF9C, + 0x763D, 0xAF9D, + 0x7641, 0xAF9E, + 0x7642, 0xAF9F, + 0x7644, 0xAFA0, + 0x7645, 0xB040, + 0x7646, 0xB041, + 0x7647, 0xB042, + 0x7648, 0xB043, + 0x7649, 0xB044, + 0x764A, 0xB045, + 0x764B, 0xB046, + 0x764E, 0xB047, + 0x764F, 0xB048, + 0x7650, 0xB049, + 0x7651, 0xB04A, + 0x7652, 0xB04B, + 0x7653, 0xB04C, + 0x7655, 0xB04D, + 0x7657, 0xB04E, + 0x7658, 0xB04F, + 0x7659, 0xB050, + 0x765A, 0xB051, + 0x765B, 0xB052, + 0x765D, 0xB053, + 0x765F, 0xB054, + 0x7660, 0xB055, + 0x7661, 0xB056, + 0x7662, 0xB057, + 0x7664, 0xB058, + 0x7665, 0xB059, + 0x7666, 0xB05A, + 0x7667, 0xB05B, + 0x7668, 0xB05C, + 0x7669, 0xB05D, + 0x766A, 0xB05E, + 0x766C, 0xB05F, + 0x766D, 0xB060, + 0x766E, 0xB061, + 0x7670, 0xB062, + 0x7671, 0xB063, + 0x7672, 0xB064, + 0x7673, 0xB065, + 0x7674, 0xB066, + 0x7675, 0xB067, + 0x7676, 0xB068, + 0x7677, 0xB069, + 0x7679, 0xB06A, + 0x767A, 0xB06B, + 0x767C, 0xB06C, + 0x767F, 0xB06D, + 0x7680, 0xB06E, + 0x7681, 0xB06F, + 0x7683, 0xB070, + 0x7685, 0xB071, + 0x7689, 0xB072, + 0x768A, 0xB073, + 0x768C, 0xB074, + 0x768D, 0xB075, + 0x768F, 0xB076, + 0x7690, 0xB077, + 0x7692, 0xB078, + 0x7694, 0xB079, + 0x7695, 0xB07A, + 0x7697, 0xB07B, + 0x7698, 0xB07C, + 0x769A, 0xB07D, + 0x769B, 0xB07E, + 0x769C, 0xB080, + 0x769D, 0xB081, + 0x769E, 0xB082, + 0x769F, 0xB083, + 0x76A0, 0xB084, + 0x76A1, 0xB085, + 0x76A2, 0xB086, + 0x76A3, 0xB087, + 0x76A5, 0xB088, + 0x76A6, 0xB089, + 0x76A7, 0xB08A, + 0x76A8, 0xB08B, + 0x76A9, 0xB08C, + 0x76AA, 0xB08D, + 0x76AB, 0xB08E, + 0x76AC, 0xB08F, + 0x76AD, 0xB090, + 0x76AF, 0xB091, + 0x76B0, 0xB092, + 0x76B3, 0xB093, + 0x76B5, 0xB094, + 0x76B6, 0xB095, + 0x76B7, 0xB096, + 0x76B8, 0xB097, + 0x76B9, 0xB098, + 0x76BA, 0xB099, + 0x76BB, 0xB09A, + 0x76BC, 0xB09B, + 0x76BD, 0xB09C, + 0x76BE, 0xB09D, + 0x76C0, 0xB09E, + 0x76C1, 0xB09F, + 0x76C3, 0xB0A0, + 0x76C4, 0xB140, + 0x76C7, 0xB141, + 0x76C9, 0xB142, + 0x76CB, 0xB143, + 0x76CC, 0xB144, + 0x76D3, 0xB145, + 0x76D5, 0xB146, + 0x76D9, 0xB147, + 0x76DA, 0xB148, + 0x76DC, 0xB149, + 0x76DD, 0xB14A, + 0x76DE, 0xB14B, + 0x76E0, 0xB14C, + 0x76E1, 0xB14D, + 0x76E2, 0xB14E, + 0x76E3, 0xB14F, + 0x76E4, 0xB150, + 0x76E6, 0xB151, + 0x76E7, 0xB152, + 0x76E8, 0xB153, + 0x76E9, 0xB154, + 0x76EA, 0xB155, + 0x76EB, 0xB156, + 0x76EC, 0xB157, + 0x76ED, 0xB158, + 0x76F0, 0xB159, + 0x76F3, 0xB15A, + 0x76F5, 0xB15B, + 0x76F6, 0xB15C, + 0x76F7, 0xB15D, + 0x76FA, 0xB15E, + 0x76FB, 0xB15F, + 0x76FD, 0xB160, + 0x76FF, 0xB161, + 0x7700, 0xB162, + 0x7702, 0xB163, + 0x7703, 0xB164, + 0x7705, 0xB165, + 0x7706, 0xB166, + 0x770A, 0xB167, + 0x770C, 0xB168, + 0x770E, 0xB169, + 0x770F, 0xB16A, + 0x7710, 0xB16B, + 0x7711, 0xB16C, + 0x7712, 0xB16D, + 0x7713, 0xB16E, + 0x7714, 0xB16F, + 0x7715, 0xB170, + 0x7716, 0xB171, + 0x7717, 0xB172, + 0x7718, 0xB173, + 0x771B, 0xB174, + 0x771C, 0xB175, + 0x771D, 0xB176, + 0x771E, 0xB177, + 0x7721, 0xB178, + 0x7723, 0xB179, + 0x7724, 0xB17A, + 0x7725, 0xB17B, + 0x7727, 0xB17C, + 0x772A, 0xB17D, + 0x772B, 0xB17E, + 0x772C, 0xB180, + 0x772E, 0xB181, + 0x7730, 0xB182, + 0x7731, 0xB183, + 0x7732, 0xB184, + 0x7733, 0xB185, + 0x7734, 0xB186, + 0x7739, 0xB187, + 0x773B, 0xB188, + 0x773D, 0xB189, + 0x773E, 0xB18A, + 0x773F, 0xB18B, + 0x7742, 0xB18C, + 0x7744, 0xB18D, + 0x7745, 0xB18E, + 0x7746, 0xB18F, + 0x7748, 0xB190, + 0x7749, 0xB191, + 0x774A, 0xB192, + 0x774B, 0xB193, + 0x774C, 0xB194, + 0x774D, 0xB195, + 0x774E, 0xB196, + 0x774F, 0xB197, + 0x7752, 0xB198, + 0x7753, 0xB199, + 0x7754, 0xB19A, + 0x7755, 0xB19B, + 0x7756, 0xB19C, + 0x7757, 0xB19D, + 0x7758, 0xB19E, + 0x7759, 0xB19F, + 0x775C, 0xB1A0, + 0x775D, 0xB240, + 0x775E, 0xB241, + 0x775F, 0xB242, + 0x7760, 0xB243, + 0x7764, 0xB244, + 0x7767, 0xB245, + 0x7769, 0xB246, + 0x776A, 0xB247, + 0x776D, 0xB248, + 0x776E, 0xB249, + 0x776F, 0xB24A, + 0x7770, 0xB24B, + 0x7771, 0xB24C, + 0x7772, 0xB24D, + 0x7773, 0xB24E, + 0x7774, 0xB24F, + 0x7775, 0xB250, + 0x7776, 0xB251, + 0x7777, 0xB252, + 0x7778, 0xB253, + 0x777A, 0xB254, + 0x777B, 0xB255, + 0x777C, 0xB256, + 0x7781, 0xB257, + 0x7782, 0xB258, + 0x7783, 0xB259, + 0x7786, 0xB25A, + 0x7787, 0xB25B, + 0x7788, 0xB25C, + 0x7789, 0xB25D, + 0x778A, 0xB25E, + 0x778B, 0xB25F, + 0x778F, 0xB260, + 0x7790, 0xB261, + 0x7793, 0xB262, + 0x7794, 0xB263, + 0x7795, 0xB264, + 0x7796, 0xB265, + 0x7797, 0xB266, + 0x7798, 0xB267, + 0x7799, 0xB268, + 0x779A, 0xB269, + 0x779B, 0xB26A, + 0x779C, 0xB26B, + 0x779D, 0xB26C, + 0x779E, 0xB26D, + 0x77A1, 0xB26E, + 0x77A3, 0xB26F, + 0x77A4, 0xB270, + 0x77A6, 0xB271, + 0x77A8, 0xB272, + 0x77AB, 0xB273, + 0x77AD, 0xB274, + 0x77AE, 0xB275, + 0x77AF, 0xB276, + 0x77B1, 0xB277, + 0x77B2, 0xB278, + 0x77B4, 0xB279, + 0x77B6, 0xB27A, + 0x77B7, 0xB27B, + 0x77B8, 0xB27C, + 0x77B9, 0xB27D, + 0x77BA, 0xB27E, + 0x77BC, 0xB280, + 0x77BE, 0xB281, + 0x77C0, 0xB282, + 0x77C1, 0xB283, + 0x77C2, 0xB284, + 0x77C3, 0xB285, + 0x77C4, 0xB286, + 0x77C5, 0xB287, + 0x77C6, 0xB288, + 0x77C7, 0xB289, + 0x77C8, 0xB28A, + 0x77C9, 0xB28B, + 0x77CA, 0xB28C, + 0x77CB, 0xB28D, + 0x77CC, 0xB28E, + 0x77CE, 0xB28F, + 0x77CF, 0xB290, + 0x77D0, 0xB291, + 0x77D1, 0xB292, + 0x77D2, 0xB293, + 0x77D3, 0xB294, + 0x77D4, 0xB295, + 0x77D5, 0xB296, + 0x77D6, 0xB297, + 0x77D8, 0xB298, + 0x77D9, 0xB299, + 0x77DA, 0xB29A, + 0x77DD, 0xB29B, + 0x77DE, 0xB29C, + 0x77DF, 0xB29D, + 0x77E0, 0xB29E, + 0x77E1, 0xB29F, + 0x77E4, 0xB2A0, + 0x77E6, 0xB340, + 0x77E8, 0xB341, + 0x77EA, 0xB342, + 0x77EF, 0xB343, + 0x77F0, 0xB344, + 0x77F1, 0xB345, + 0x77F2, 0xB346, + 0x77F4, 0xB347, + 0x77F5, 0xB348, + 0x77F7, 0xB349, + 0x77F9, 0xB34A, + 0x77FA, 0xB34B, + 0x77FB, 0xB34C, + 0x77FC, 0xB34D, + 0x7803, 0xB34E, + 0x7804, 0xB34F, + 0x7805, 0xB350, + 0x7806, 0xB351, + 0x7807, 0xB352, + 0x7808, 0xB353, + 0x780A, 0xB354, + 0x780B, 0xB355, + 0x780E, 0xB356, + 0x780F, 0xB357, + 0x7810, 0xB358, + 0x7813, 0xB359, + 0x7815, 0xB35A, + 0x7819, 0xB35B, + 0x781B, 0xB35C, + 0x781E, 0xB35D, + 0x7820, 0xB35E, + 0x7821, 0xB35F, + 0x7822, 0xB360, + 0x7824, 0xB361, + 0x7828, 0xB362, + 0x782A, 0xB363, + 0x782B, 0xB364, + 0x782E, 0xB365, + 0x782F, 0xB366, + 0x7831, 0xB367, + 0x7832, 0xB368, + 0x7833, 0xB369, + 0x7835, 0xB36A, + 0x7836, 0xB36B, + 0x783D, 0xB36C, + 0x783F, 0xB36D, + 0x7841, 0xB36E, + 0x7842, 0xB36F, + 0x7843, 0xB370, + 0x7844, 0xB371, + 0x7846, 0xB372, + 0x7848, 0xB373, + 0x7849, 0xB374, + 0x784A, 0xB375, + 0x784B, 0xB376, + 0x784D, 0xB377, + 0x784F, 0xB378, + 0x7851, 0xB379, + 0x7853, 0xB37A, + 0x7854, 0xB37B, + 0x7858, 0xB37C, + 0x7859, 0xB37D, + 0x785A, 0xB37E, + 0x785B, 0xB380, + 0x785C, 0xB381, + 0x785E, 0xB382, + 0x785F, 0xB383, + 0x7860, 0xB384, + 0x7861, 0xB385, + 0x7862, 0xB386, + 0x7863, 0xB387, + 0x7864, 0xB388, + 0x7865, 0xB389, + 0x7866, 0xB38A, + 0x7867, 0xB38B, + 0x7868, 0xB38C, + 0x7869, 0xB38D, + 0x786F, 0xB38E, + 0x7870, 0xB38F, + 0x7871, 0xB390, + 0x7872, 0xB391, + 0x7873, 0xB392, + 0x7874, 0xB393, + 0x7875, 0xB394, + 0x7876, 0xB395, + 0x7878, 0xB396, + 0x7879, 0xB397, + 0x787A, 0xB398, + 0x787B, 0xB399, + 0x787D, 0xB39A, + 0x787E, 0xB39B, + 0x787F, 0xB39C, + 0x7880, 0xB39D, + 0x7881, 0xB39E, + 0x7882, 0xB39F, + 0x7883, 0xB3A0, + 0x7884, 0xB440, + 0x7885, 0xB441, + 0x7886, 0xB442, + 0x7888, 0xB443, + 0x788A, 0xB444, + 0x788B, 0xB445, + 0x788F, 0xB446, + 0x7890, 0xB447, + 0x7892, 0xB448, + 0x7894, 0xB449, + 0x7895, 0xB44A, + 0x7896, 0xB44B, + 0x7899, 0xB44C, + 0x789D, 0xB44D, + 0x789E, 0xB44E, + 0x78A0, 0xB44F, + 0x78A2, 0xB450, + 0x78A4, 0xB451, + 0x78A6, 0xB452, + 0x78A8, 0xB453, + 0x78A9, 0xB454, + 0x78AA, 0xB455, + 0x78AB, 0xB456, + 0x78AC, 0xB457, + 0x78AD, 0xB458, + 0x78AE, 0xB459, + 0x78AF, 0xB45A, + 0x78B5, 0xB45B, + 0x78B6, 0xB45C, + 0x78B7, 0xB45D, + 0x78B8, 0xB45E, + 0x78BA, 0xB45F, + 0x78BB, 0xB460, + 0x78BC, 0xB461, + 0x78BD, 0xB462, + 0x78BF, 0xB463, + 0x78C0, 0xB464, + 0x78C2, 0xB465, + 0x78C3, 0xB466, + 0x78C4, 0xB467, + 0x78C6, 0xB468, + 0x78C7, 0xB469, + 0x78C8, 0xB46A, + 0x78CC, 0xB46B, + 0x78CD, 0xB46C, + 0x78CE, 0xB46D, + 0x78CF, 0xB46E, + 0x78D1, 0xB46F, + 0x78D2, 0xB470, + 0x78D3, 0xB471, + 0x78D6, 0xB472, + 0x78D7, 0xB473, + 0x78D8, 0xB474, + 0x78DA, 0xB475, + 0x78DB, 0xB476, + 0x78DC, 0xB477, + 0x78DD, 0xB478, + 0x78DE, 0xB479, + 0x78DF, 0xB47A, + 0x78E0, 0xB47B, + 0x78E1, 0xB47C, + 0x78E2, 0xB47D, + 0x78E3, 0xB47E, + 0x78E4, 0xB480, + 0x78E5, 0xB481, + 0x78E6, 0xB482, + 0x78E7, 0xB483, + 0x78E9, 0xB484, + 0x78EA, 0xB485, + 0x78EB, 0xB486, + 0x78ED, 0xB487, + 0x78EE, 0xB488, + 0x78EF, 0xB489, + 0x78F0, 0xB48A, + 0x78F1, 0xB48B, + 0x78F3, 0xB48C, + 0x78F5, 0xB48D, + 0x78F6, 0xB48E, + 0x78F8, 0xB48F, + 0x78F9, 0xB490, + 0x78FB, 0xB491, + 0x78FC, 0xB492, + 0x78FD, 0xB493, + 0x78FE, 0xB494, + 0x78FF, 0xB495, + 0x7900, 0xB496, + 0x7902, 0xB497, + 0x7903, 0xB498, + 0x7904, 0xB499, + 0x7906, 0xB49A, + 0x7907, 0xB49B, + 0x7908, 0xB49C, + 0x7909, 0xB49D, + 0x790A, 0xB49E, + 0x790B, 0xB49F, + 0x790C, 0xB4A0, + 0x790D, 0xB540, + 0x790E, 0xB541, + 0x790F, 0xB542, + 0x7910, 0xB543, + 0x7911, 0xB544, + 0x7912, 0xB545, + 0x7914, 0xB546, + 0x7915, 0xB547, + 0x7916, 0xB548, + 0x7917, 0xB549, + 0x7918, 0xB54A, + 0x7919, 0xB54B, + 0x791A, 0xB54C, + 0x791B, 0xB54D, + 0x791C, 0xB54E, + 0x791D, 0xB54F, + 0x791F, 0xB550, + 0x7920, 0xB551, + 0x7921, 0xB552, + 0x7922, 0xB553, + 0x7923, 0xB554, + 0x7925, 0xB555, + 0x7926, 0xB556, + 0x7927, 0xB557, + 0x7928, 0xB558, + 0x7929, 0xB559, + 0x792A, 0xB55A, + 0x792B, 0xB55B, + 0x792C, 0xB55C, + 0x792D, 0xB55D, + 0x792E, 0xB55E, + 0x792F, 0xB55F, + 0x7930, 0xB560, + 0x7931, 0xB561, + 0x7932, 0xB562, + 0x7933, 0xB563, + 0x7935, 0xB564, + 0x7936, 0xB565, + 0x7937, 0xB566, + 0x7938, 0xB567, + 0x7939, 0xB568, + 0x793D, 0xB569, + 0x793F, 0xB56A, + 0x7942, 0xB56B, + 0x7943, 0xB56C, + 0x7944, 0xB56D, + 0x7945, 0xB56E, + 0x7947, 0xB56F, + 0x794A, 0xB570, + 0x794B, 0xB571, + 0x794C, 0xB572, + 0x794D, 0xB573, + 0x794E, 0xB574, + 0x794F, 0xB575, + 0x7950, 0xB576, + 0x7951, 0xB577, + 0x7952, 0xB578, + 0x7954, 0xB579, + 0x7955, 0xB57A, + 0x7958, 0xB57B, + 0x7959, 0xB57C, + 0x7961, 0xB57D, + 0x7963, 0xB57E, + 0x7964, 0xB580, + 0x7966, 0xB581, + 0x7969, 0xB582, + 0x796A, 0xB583, + 0x796B, 0xB584, + 0x796C, 0xB585, + 0x796E, 0xB586, + 0x7970, 0xB587, + 0x7971, 0xB588, + 0x7972, 0xB589, + 0x7973, 0xB58A, + 0x7974, 0xB58B, + 0x7975, 0xB58C, + 0x7976, 0xB58D, + 0x7979, 0xB58E, + 0x797B, 0xB58F, + 0x797C, 0xB590, + 0x797D, 0xB591, + 0x797E, 0xB592, + 0x797F, 0xB593, + 0x7982, 0xB594, + 0x7983, 0xB595, + 0x7986, 0xB596, + 0x7987, 0xB597, + 0x7988, 0xB598, + 0x7989, 0xB599, + 0x798B, 0xB59A, + 0x798C, 0xB59B, + 0x798D, 0xB59C, + 0x798E, 0xB59D, + 0x7990, 0xB59E, + 0x7991, 0xB59F, + 0x7992, 0xB5A0, + 0x7993, 0xB640, + 0x7994, 0xB641, + 0x7995, 0xB642, + 0x7996, 0xB643, + 0x7997, 0xB644, + 0x7998, 0xB645, + 0x7999, 0xB646, + 0x799B, 0xB647, + 0x799C, 0xB648, + 0x799D, 0xB649, + 0x799E, 0xB64A, + 0x799F, 0xB64B, + 0x79A0, 0xB64C, + 0x79A1, 0xB64D, + 0x79A2, 0xB64E, + 0x79A3, 0xB64F, + 0x79A4, 0xB650, + 0x79A5, 0xB651, + 0x79A6, 0xB652, + 0x79A8, 0xB653, + 0x79A9, 0xB654, + 0x79AA, 0xB655, + 0x79AB, 0xB656, + 0x79AC, 0xB657, + 0x79AD, 0xB658, + 0x79AE, 0xB659, + 0x79AF, 0xB65A, + 0x79B0, 0xB65B, + 0x79B1, 0xB65C, + 0x79B2, 0xB65D, + 0x79B4, 0xB65E, + 0x79B5, 0xB65F, + 0x79B6, 0xB660, + 0x79B7, 0xB661, + 0x79B8, 0xB662, + 0x79BC, 0xB663, + 0x79BF, 0xB664, + 0x79C2, 0xB665, + 0x79C4, 0xB666, + 0x79C5, 0xB667, + 0x79C7, 0xB668, + 0x79C8, 0xB669, + 0x79CA, 0xB66A, + 0x79CC, 0xB66B, + 0x79CE, 0xB66C, + 0x79CF, 0xB66D, + 0x79D0, 0xB66E, + 0x79D3, 0xB66F, + 0x79D4, 0xB670, + 0x79D6, 0xB671, + 0x79D7, 0xB672, + 0x79D9, 0xB673, + 0x79DA, 0xB674, + 0x79DB, 0xB675, + 0x79DC, 0xB676, + 0x79DD, 0xB677, + 0x79DE, 0xB678, + 0x79E0, 0xB679, + 0x79E1, 0xB67A, + 0x79E2, 0xB67B, + 0x79E5, 0xB67C, + 0x79E8, 0xB67D, + 0x79EA, 0xB67E, + 0x79EC, 0xB680, + 0x79EE, 0xB681, + 0x79F1, 0xB682, + 0x79F2, 0xB683, + 0x79F3, 0xB684, + 0x79F4, 0xB685, + 0x79F5, 0xB686, + 0x79F6, 0xB687, + 0x79F7, 0xB688, + 0x79F9, 0xB689, + 0x79FA, 0xB68A, + 0x79FC, 0xB68B, + 0x79FE, 0xB68C, + 0x79FF, 0xB68D, + 0x7A01, 0xB68E, + 0x7A04, 0xB68F, + 0x7A05, 0xB690, + 0x7A07, 0xB691, + 0x7A08, 0xB692, + 0x7A09, 0xB693, + 0x7A0A, 0xB694, + 0x7A0C, 0xB695, + 0x7A0F, 0xB696, + 0x7A10, 0xB697, + 0x7A11, 0xB698, + 0x7A12, 0xB699, + 0x7A13, 0xB69A, + 0x7A15, 0xB69B, + 0x7A16, 0xB69C, + 0x7A18, 0xB69D, + 0x7A19, 0xB69E, + 0x7A1B, 0xB69F, + 0x7A1C, 0xB6A0, + 0x7A1D, 0xB740, + 0x7A1F, 0xB741, + 0x7A21, 0xB742, + 0x7A22, 0xB743, + 0x7A24, 0xB744, + 0x7A25, 0xB745, + 0x7A26, 0xB746, + 0x7A27, 0xB747, + 0x7A28, 0xB748, + 0x7A29, 0xB749, + 0x7A2A, 0xB74A, + 0x7A2B, 0xB74B, + 0x7A2C, 0xB74C, + 0x7A2D, 0xB74D, + 0x7A2E, 0xB74E, + 0x7A2F, 0xB74F, + 0x7A30, 0xB750, + 0x7A31, 0xB751, + 0x7A32, 0xB752, + 0x7A34, 0xB753, + 0x7A35, 0xB754, + 0x7A36, 0xB755, + 0x7A38, 0xB756, + 0x7A3A, 0xB757, + 0x7A3E, 0xB758, + 0x7A40, 0xB759, + 0x7A41, 0xB75A, + 0x7A42, 0xB75B, + 0x7A43, 0xB75C, + 0x7A44, 0xB75D, + 0x7A45, 0xB75E, + 0x7A47, 0xB75F, + 0x7A48, 0xB760, + 0x7A49, 0xB761, + 0x7A4A, 0xB762, + 0x7A4B, 0xB763, + 0x7A4C, 0xB764, + 0x7A4D, 0xB765, + 0x7A4E, 0xB766, + 0x7A4F, 0xB767, + 0x7A50, 0xB768, + 0x7A52, 0xB769, + 0x7A53, 0xB76A, + 0x7A54, 0xB76B, + 0x7A55, 0xB76C, + 0x7A56, 0xB76D, + 0x7A58, 0xB76E, + 0x7A59, 0xB76F, + 0x7A5A, 0xB770, + 0x7A5B, 0xB771, + 0x7A5C, 0xB772, + 0x7A5D, 0xB773, + 0x7A5E, 0xB774, + 0x7A5F, 0xB775, + 0x7A60, 0xB776, + 0x7A61, 0xB777, + 0x7A62, 0xB778, + 0x7A63, 0xB779, + 0x7A64, 0xB77A, + 0x7A65, 0xB77B, + 0x7A66, 0xB77C, + 0x7A67, 0xB77D, + 0x7A68, 0xB77E, + 0x7A69, 0xB780, + 0x7A6A, 0xB781, + 0x7A6B, 0xB782, + 0x7A6C, 0xB783, + 0x7A6D, 0xB784, + 0x7A6E, 0xB785, + 0x7A6F, 0xB786, + 0x7A71, 0xB787, + 0x7A72, 0xB788, + 0x7A73, 0xB789, + 0x7A75, 0xB78A, + 0x7A7B, 0xB78B, + 0x7A7C, 0xB78C, + 0x7A7D, 0xB78D, + 0x7A7E, 0xB78E, + 0x7A82, 0xB78F, + 0x7A85, 0xB790, + 0x7A87, 0xB791, + 0x7A89, 0xB792, + 0x7A8A, 0xB793, + 0x7A8B, 0xB794, + 0x7A8C, 0xB795, + 0x7A8E, 0xB796, + 0x7A8F, 0xB797, + 0x7A90, 0xB798, + 0x7A93, 0xB799, + 0x7A94, 0xB79A, + 0x7A99, 0xB79B, + 0x7A9A, 0xB79C, + 0x7A9B, 0xB79D, + 0x7A9E, 0xB79E, + 0x7AA1, 0xB79F, + 0x7AA2, 0xB7A0, + 0x7AA3, 0xB840, + 0x7AA4, 0xB841, + 0x7AA7, 0xB842, + 0x7AA9, 0xB843, + 0x7AAA, 0xB844, + 0x7AAB, 0xB845, + 0x7AAE, 0xB846, + 0x7AAF, 0xB847, + 0x7AB0, 0xB848, + 0x7AB1, 0xB849, + 0x7AB2, 0xB84A, + 0x7AB4, 0xB84B, + 0x7AB5, 0xB84C, + 0x7AB6, 0xB84D, + 0x7AB7, 0xB84E, + 0x7AB8, 0xB84F, + 0x7AB9, 0xB850, + 0x7ABA, 0xB851, + 0x7ABB, 0xB852, + 0x7ABC, 0xB853, + 0x7ABD, 0xB854, + 0x7ABE, 0xB855, + 0x7AC0, 0xB856, + 0x7AC1, 0xB857, + 0x7AC2, 0xB858, + 0x7AC3, 0xB859, + 0x7AC4, 0xB85A, + 0x7AC5, 0xB85B, + 0x7AC6, 0xB85C, + 0x7AC7, 0xB85D, + 0x7AC8, 0xB85E, + 0x7AC9, 0xB85F, + 0x7ACA, 0xB860, + 0x7ACC, 0xB861, + 0x7ACD, 0xB862, + 0x7ACE, 0xB863, + 0x7ACF, 0xB864, + 0x7AD0, 0xB865, + 0x7AD1, 0xB866, + 0x7AD2, 0xB867, + 0x7AD3, 0xB868, + 0x7AD4, 0xB869, + 0x7AD5, 0xB86A, + 0x7AD7, 0xB86B, + 0x7AD8, 0xB86C, + 0x7ADA, 0xB86D, + 0x7ADB, 0xB86E, + 0x7ADC, 0xB86F, + 0x7ADD, 0xB870, + 0x7AE1, 0xB871, + 0x7AE2, 0xB872, + 0x7AE4, 0xB873, + 0x7AE7, 0xB874, + 0x7AE8, 0xB875, + 0x7AE9, 0xB876, + 0x7AEA, 0xB877, + 0x7AEB, 0xB878, + 0x7AEC, 0xB879, + 0x7AEE, 0xB87A, + 0x7AF0, 0xB87B, + 0x7AF1, 0xB87C, + 0x7AF2, 0xB87D, + 0x7AF3, 0xB87E, + 0x7AF4, 0xB880, + 0x7AF5, 0xB881, + 0x7AF6, 0xB882, + 0x7AF7, 0xB883, + 0x7AF8, 0xB884, + 0x7AFB, 0xB885, + 0x7AFC, 0xB886, + 0x7AFE, 0xB887, + 0x7B00, 0xB888, + 0x7B01, 0xB889, + 0x7B02, 0xB88A, + 0x7B05, 0xB88B, + 0x7B07, 0xB88C, + 0x7B09, 0xB88D, + 0x7B0C, 0xB88E, + 0x7B0D, 0xB88F, + 0x7B0E, 0xB890, + 0x7B10, 0xB891, + 0x7B12, 0xB892, + 0x7B13, 0xB893, + 0x7B16, 0xB894, + 0x7B17, 0xB895, + 0x7B18, 0xB896, + 0x7B1A, 0xB897, + 0x7B1C, 0xB898, + 0x7B1D, 0xB899, + 0x7B1F, 0xB89A, + 0x7B21, 0xB89B, + 0x7B22, 0xB89C, + 0x7B23, 0xB89D, + 0x7B27, 0xB89E, + 0x7B29, 0xB89F, + 0x7B2D, 0xB8A0, + 0x7B2F, 0xB940, + 0x7B30, 0xB941, + 0x7B32, 0xB942, + 0x7B34, 0xB943, + 0x7B35, 0xB944, + 0x7B36, 0xB945, + 0x7B37, 0xB946, + 0x7B39, 0xB947, + 0x7B3B, 0xB948, + 0x7B3D, 0xB949, + 0x7B3F, 0xB94A, + 0x7B40, 0xB94B, + 0x7B41, 0xB94C, + 0x7B42, 0xB94D, + 0x7B43, 0xB94E, + 0x7B44, 0xB94F, + 0x7B46, 0xB950, + 0x7B48, 0xB951, + 0x7B4A, 0xB952, + 0x7B4D, 0xB953, + 0x7B4E, 0xB954, + 0x7B53, 0xB955, + 0x7B55, 0xB956, + 0x7B57, 0xB957, + 0x7B59, 0xB958, + 0x7B5C, 0xB959, + 0x7B5E, 0xB95A, + 0x7B5F, 0xB95B, + 0x7B61, 0xB95C, + 0x7B63, 0xB95D, + 0x7B64, 0xB95E, + 0x7B65, 0xB95F, + 0x7B66, 0xB960, + 0x7B67, 0xB961, + 0x7B68, 0xB962, + 0x7B69, 0xB963, + 0x7B6A, 0xB964, + 0x7B6B, 0xB965, + 0x7B6C, 0xB966, + 0x7B6D, 0xB967, + 0x7B6F, 0xB968, + 0x7B70, 0xB969, + 0x7B73, 0xB96A, + 0x7B74, 0xB96B, + 0x7B76, 0xB96C, + 0x7B78, 0xB96D, + 0x7B7A, 0xB96E, + 0x7B7C, 0xB96F, + 0x7B7D, 0xB970, + 0x7B7F, 0xB971, + 0x7B81, 0xB972, + 0x7B82, 0xB973, + 0x7B83, 0xB974, + 0x7B84, 0xB975, + 0x7B86, 0xB976, + 0x7B87, 0xB977, + 0x7B88, 0xB978, + 0x7B89, 0xB979, + 0x7B8A, 0xB97A, + 0x7B8B, 0xB97B, + 0x7B8C, 0xB97C, + 0x7B8E, 0xB97D, + 0x7B8F, 0xB97E, + 0x7B91, 0xB980, + 0x7B92, 0xB981, + 0x7B93, 0xB982, + 0x7B96, 0xB983, + 0x7B98, 0xB984, + 0x7B99, 0xB985, + 0x7B9A, 0xB986, + 0x7B9B, 0xB987, + 0x7B9E, 0xB988, + 0x7B9F, 0xB989, + 0x7BA0, 0xB98A, + 0x7BA3, 0xB98B, + 0x7BA4, 0xB98C, + 0x7BA5, 0xB98D, + 0x7BAE, 0xB98E, + 0x7BAF, 0xB98F, + 0x7BB0, 0xB990, + 0x7BB2, 0xB991, + 0x7BB3, 0xB992, + 0x7BB5, 0xB993, + 0x7BB6, 0xB994, + 0x7BB7, 0xB995, + 0x7BB9, 0xB996, + 0x7BBA, 0xB997, + 0x7BBB, 0xB998, + 0x7BBC, 0xB999, + 0x7BBD, 0xB99A, + 0x7BBE, 0xB99B, + 0x7BBF, 0xB99C, + 0x7BC0, 0xB99D, + 0x7BC2, 0xB99E, + 0x7BC3, 0xB99F, + 0x7BC4, 0xB9A0, + 0x7BC5, 0xBA40, + 0x7BC8, 0xBA41, + 0x7BC9, 0xBA42, + 0x7BCA, 0xBA43, + 0x7BCB, 0xBA44, + 0x7BCD, 0xBA45, + 0x7BCE, 0xBA46, + 0x7BCF, 0xBA47, + 0x7BD0, 0xBA48, + 0x7BD2, 0xBA49, + 0x7BD4, 0xBA4A, + 0x7BD5, 0xBA4B, + 0x7BD6, 0xBA4C, + 0x7BD7, 0xBA4D, + 0x7BD8, 0xBA4E, + 0x7BDB, 0xBA4F, + 0x7BDC, 0xBA50, + 0x7BDE, 0xBA51, + 0x7BDF, 0xBA52, + 0x7BE0, 0xBA53, + 0x7BE2, 0xBA54, + 0x7BE3, 0xBA55, + 0x7BE4, 0xBA56, + 0x7BE7, 0xBA57, + 0x7BE8, 0xBA58, + 0x7BE9, 0xBA59, + 0x7BEB, 0xBA5A, + 0x7BEC, 0xBA5B, + 0x7BED, 0xBA5C, + 0x7BEF, 0xBA5D, + 0x7BF0, 0xBA5E, + 0x7BF2, 0xBA5F, + 0x7BF3, 0xBA60, + 0x7BF4, 0xBA61, + 0x7BF5, 0xBA62, + 0x7BF6, 0xBA63, + 0x7BF8, 0xBA64, + 0x7BF9, 0xBA65, + 0x7BFA, 0xBA66, + 0x7BFB, 0xBA67, + 0x7BFD, 0xBA68, + 0x7BFF, 0xBA69, + 0x7C00, 0xBA6A, + 0x7C01, 0xBA6B, + 0x7C02, 0xBA6C, + 0x7C03, 0xBA6D, + 0x7C04, 0xBA6E, + 0x7C05, 0xBA6F, + 0x7C06, 0xBA70, + 0x7C08, 0xBA71, + 0x7C09, 0xBA72, + 0x7C0A, 0xBA73, + 0x7C0D, 0xBA74, + 0x7C0E, 0xBA75, + 0x7C10, 0xBA76, + 0x7C11, 0xBA77, + 0x7C12, 0xBA78, + 0x7C13, 0xBA79, + 0x7C14, 0xBA7A, + 0x7C15, 0xBA7B, + 0x7C17, 0xBA7C, + 0x7C18, 0xBA7D, + 0x7C19, 0xBA7E, + 0x7C1A, 0xBA80, + 0x7C1B, 0xBA81, + 0x7C1C, 0xBA82, + 0x7C1D, 0xBA83, + 0x7C1E, 0xBA84, + 0x7C20, 0xBA85, + 0x7C21, 0xBA86, + 0x7C22, 0xBA87, + 0x7C23, 0xBA88, + 0x7C24, 0xBA89, + 0x7C25, 0xBA8A, + 0x7C28, 0xBA8B, + 0x7C29, 0xBA8C, + 0x7C2B, 0xBA8D, + 0x7C2C, 0xBA8E, + 0x7C2D, 0xBA8F, + 0x7C2E, 0xBA90, + 0x7C2F, 0xBA91, + 0x7C30, 0xBA92, + 0x7C31, 0xBA93, + 0x7C32, 0xBA94, + 0x7C33, 0xBA95, + 0x7C34, 0xBA96, + 0x7C35, 0xBA97, + 0x7C36, 0xBA98, + 0x7C37, 0xBA99, + 0x7C39, 0xBA9A, + 0x7C3A, 0xBA9B, + 0x7C3B, 0xBA9C, + 0x7C3C, 0xBA9D, + 0x7C3D, 0xBA9E, + 0x7C3E, 0xBA9F, + 0x7C42, 0xBAA0, + 0x7C43, 0xBB40, + 0x7C44, 0xBB41, + 0x7C45, 0xBB42, + 0x7C46, 0xBB43, + 0x7C47, 0xBB44, + 0x7C48, 0xBB45, + 0x7C49, 0xBB46, + 0x7C4A, 0xBB47, + 0x7C4B, 0xBB48, + 0x7C4C, 0xBB49, + 0x7C4E, 0xBB4A, + 0x7C4F, 0xBB4B, + 0x7C50, 0xBB4C, + 0x7C51, 0xBB4D, + 0x7C52, 0xBB4E, + 0x7C53, 0xBB4F, + 0x7C54, 0xBB50, + 0x7C55, 0xBB51, + 0x7C56, 0xBB52, + 0x7C57, 0xBB53, + 0x7C58, 0xBB54, + 0x7C59, 0xBB55, + 0x7C5A, 0xBB56, + 0x7C5B, 0xBB57, + 0x7C5C, 0xBB58, + 0x7C5D, 0xBB59, + 0x7C5E, 0xBB5A, + 0x7C5F, 0xBB5B, + 0x7C60, 0xBB5C, + 0x7C61, 0xBB5D, + 0x7C62, 0xBB5E, + 0x7C63, 0xBB5F, + 0x7C64, 0xBB60, + 0x7C65, 0xBB61, + 0x7C66, 0xBB62, + 0x7C67, 0xBB63, + 0x7C68, 0xBB64, + 0x7C69, 0xBB65, + 0x7C6A, 0xBB66, + 0x7C6B, 0xBB67, + 0x7C6C, 0xBB68, + 0x7C6D, 0xBB69, + 0x7C6E, 0xBB6A, + 0x7C6F, 0xBB6B, + 0x7C70, 0xBB6C, + 0x7C71, 0xBB6D, + 0x7C72, 0xBB6E, + 0x7C75, 0xBB6F, + 0x7C76, 0xBB70, + 0x7C77, 0xBB71, + 0x7C78, 0xBB72, + 0x7C79, 0xBB73, + 0x7C7A, 0xBB74, + 0x7C7E, 0xBB75, + 0x7C7F, 0xBB76, + 0x7C80, 0xBB77, + 0x7C81, 0xBB78, + 0x7C82, 0xBB79, + 0x7C83, 0xBB7A, + 0x7C84, 0xBB7B, + 0x7C85, 0xBB7C, + 0x7C86, 0xBB7D, + 0x7C87, 0xBB7E, + 0x7C88, 0xBB80, + 0x7C8A, 0xBB81, + 0x7C8B, 0xBB82, + 0x7C8C, 0xBB83, + 0x7C8D, 0xBB84, + 0x7C8E, 0xBB85, + 0x7C8F, 0xBB86, + 0x7C90, 0xBB87, + 0x7C93, 0xBB88, + 0x7C94, 0xBB89, + 0x7C96, 0xBB8A, + 0x7C99, 0xBB8B, + 0x7C9A, 0xBB8C, + 0x7C9B, 0xBB8D, + 0x7CA0, 0xBB8E, + 0x7CA1, 0xBB8F, + 0x7CA3, 0xBB90, + 0x7CA6, 0xBB91, + 0x7CA7, 0xBB92, + 0x7CA8, 0xBB93, + 0x7CA9, 0xBB94, + 0x7CAB, 0xBB95, + 0x7CAC, 0xBB96, + 0x7CAD, 0xBB97, + 0x7CAF, 0xBB98, + 0x7CB0, 0xBB99, + 0x7CB4, 0xBB9A, + 0x7CB5, 0xBB9B, + 0x7CB6, 0xBB9C, + 0x7CB7, 0xBB9D, + 0x7CB8, 0xBB9E, + 0x7CBA, 0xBB9F, + 0x7CBB, 0xBBA0, + 0x7CBF, 0xBC40, + 0x7CC0, 0xBC41, + 0x7CC2, 0xBC42, + 0x7CC3, 0xBC43, + 0x7CC4, 0xBC44, + 0x7CC6, 0xBC45, + 0x7CC9, 0xBC46, + 0x7CCB, 0xBC47, + 0x7CCE, 0xBC48, + 0x7CCF, 0xBC49, + 0x7CD0, 0xBC4A, + 0x7CD1, 0xBC4B, + 0x7CD2, 0xBC4C, + 0x7CD3, 0xBC4D, + 0x7CD4, 0xBC4E, + 0x7CD8, 0xBC4F, + 0x7CDA, 0xBC50, + 0x7CDB, 0xBC51, + 0x7CDD, 0xBC52, + 0x7CDE, 0xBC53, + 0x7CE1, 0xBC54, + 0x7CE2, 0xBC55, + 0x7CE3, 0xBC56, + 0x7CE4, 0xBC57, + 0x7CE5, 0xBC58, + 0x7CE6, 0xBC59, + 0x7CE7, 0xBC5A, + 0x7CE9, 0xBC5B, + 0x7CEA, 0xBC5C, + 0x7CEB, 0xBC5D, + 0x7CEC, 0xBC5E, + 0x7CED, 0xBC5F, + 0x7CEE, 0xBC60, + 0x7CF0, 0xBC61, + 0x7CF1, 0xBC62, + 0x7CF2, 0xBC63, + 0x7CF3, 0xBC64, + 0x7CF4, 0xBC65, + 0x7CF5, 0xBC66, + 0x7CF6, 0xBC67, + 0x7CF7, 0xBC68, + 0x7CF9, 0xBC69, + 0x7CFA, 0xBC6A, + 0x7CFC, 0xBC6B, + 0x7CFD, 0xBC6C, + 0x7CFE, 0xBC6D, + 0x7CFF, 0xBC6E, + 0x7D00, 0xBC6F, + 0x7D01, 0xBC70, + 0x7D02, 0xBC71, + 0x7D03, 0xBC72, + 0x7D04, 0xBC73, + 0x7D05, 0xBC74, + 0x7D06, 0xBC75, + 0x7D07, 0xBC76, + 0x7D08, 0xBC77, + 0x7D09, 0xBC78, + 0x7D0B, 0xBC79, + 0x7D0C, 0xBC7A, + 0x7D0D, 0xBC7B, + 0x7D0E, 0xBC7C, + 0x7D0F, 0xBC7D, + 0x7D10, 0xBC7E, + 0x7D11, 0xBC80, + 0x7D12, 0xBC81, + 0x7D13, 0xBC82, + 0x7D14, 0xBC83, + 0x7D15, 0xBC84, + 0x7D16, 0xBC85, + 0x7D17, 0xBC86, + 0x7D18, 0xBC87, + 0x7D19, 0xBC88, + 0x7D1A, 0xBC89, + 0x7D1B, 0xBC8A, + 0x7D1C, 0xBC8B, + 0x7D1D, 0xBC8C, + 0x7D1E, 0xBC8D, + 0x7D1F, 0xBC8E, + 0x7D21, 0xBC8F, + 0x7D23, 0xBC90, + 0x7D24, 0xBC91, + 0x7D25, 0xBC92, + 0x7D26, 0xBC93, + 0x7D28, 0xBC94, + 0x7D29, 0xBC95, + 0x7D2A, 0xBC96, + 0x7D2C, 0xBC97, + 0x7D2D, 0xBC98, + 0x7D2E, 0xBC99, + 0x7D30, 0xBC9A, + 0x7D31, 0xBC9B, + 0x7D32, 0xBC9C, + 0x7D33, 0xBC9D, + 0x7D34, 0xBC9E, + 0x7D35, 0xBC9F, + 0x7D36, 0xBCA0, + 0x7D37, 0xBD40, + 0x7D38, 0xBD41, + 0x7D39, 0xBD42, + 0x7D3A, 0xBD43, + 0x7D3B, 0xBD44, + 0x7D3C, 0xBD45, + 0x7D3D, 0xBD46, + 0x7D3E, 0xBD47, + 0x7D3F, 0xBD48, + 0x7D40, 0xBD49, + 0x7D41, 0xBD4A, + 0x7D42, 0xBD4B, + 0x7D43, 0xBD4C, + 0x7D44, 0xBD4D, + 0x7D45, 0xBD4E, + 0x7D46, 0xBD4F, + 0x7D47, 0xBD50, + 0x7D48, 0xBD51, + 0x7D49, 0xBD52, + 0x7D4A, 0xBD53, + 0x7D4B, 0xBD54, + 0x7D4C, 0xBD55, + 0x7D4D, 0xBD56, + 0x7D4E, 0xBD57, + 0x7D4F, 0xBD58, + 0x7D50, 0xBD59, + 0x7D51, 0xBD5A, + 0x7D52, 0xBD5B, + 0x7D53, 0xBD5C, + 0x7D54, 0xBD5D, + 0x7D55, 0xBD5E, + 0x7D56, 0xBD5F, + 0x7D57, 0xBD60, + 0x7D58, 0xBD61, + 0x7D59, 0xBD62, + 0x7D5A, 0xBD63, + 0x7D5B, 0xBD64, + 0x7D5C, 0xBD65, + 0x7D5D, 0xBD66, + 0x7D5E, 0xBD67, + 0x7D5F, 0xBD68, + 0x7D60, 0xBD69, + 0x7D61, 0xBD6A, + 0x7D62, 0xBD6B, + 0x7D63, 0xBD6C, + 0x7D64, 0xBD6D, + 0x7D65, 0xBD6E, + 0x7D66, 0xBD6F, + 0x7D67, 0xBD70, + 0x7D68, 0xBD71, + 0x7D69, 0xBD72, + 0x7D6A, 0xBD73, + 0x7D6B, 0xBD74, + 0x7D6C, 0xBD75, + 0x7D6D, 0xBD76, + 0x7D6F, 0xBD77, + 0x7D70, 0xBD78, + 0x7D71, 0xBD79, + 0x7D72, 0xBD7A, + 0x7D73, 0xBD7B, + 0x7D74, 0xBD7C, + 0x7D75, 0xBD7D, + 0x7D76, 0xBD7E, + 0x7D78, 0xBD80, + 0x7D79, 0xBD81, + 0x7D7A, 0xBD82, + 0x7D7B, 0xBD83, + 0x7D7C, 0xBD84, + 0x7D7D, 0xBD85, + 0x7D7E, 0xBD86, + 0x7D7F, 0xBD87, + 0x7D80, 0xBD88, + 0x7D81, 0xBD89, + 0x7D82, 0xBD8A, + 0x7D83, 0xBD8B, + 0x7D84, 0xBD8C, + 0x7D85, 0xBD8D, + 0x7D86, 0xBD8E, + 0x7D87, 0xBD8F, + 0x7D88, 0xBD90, + 0x7D89, 0xBD91, + 0x7D8A, 0xBD92, + 0x7D8B, 0xBD93, + 0x7D8C, 0xBD94, + 0x7D8D, 0xBD95, + 0x7D8E, 0xBD96, + 0x7D8F, 0xBD97, + 0x7D90, 0xBD98, + 0x7D91, 0xBD99, + 0x7D92, 0xBD9A, + 0x7D93, 0xBD9B, + 0x7D94, 0xBD9C, + 0x7D95, 0xBD9D, + 0x7D96, 0xBD9E, + 0x7D97, 0xBD9F, + 0x7D98, 0xBDA0, + 0x7D99, 0xBE40, + 0x7D9A, 0xBE41, + 0x7D9B, 0xBE42, + 0x7D9C, 0xBE43, + 0x7D9D, 0xBE44, + 0x7D9E, 0xBE45, + 0x7D9F, 0xBE46, + 0x7DA0, 0xBE47, + 0x7DA1, 0xBE48, + 0x7DA2, 0xBE49, + 0x7DA3, 0xBE4A, + 0x7DA4, 0xBE4B, + 0x7DA5, 0xBE4C, + 0x7DA7, 0xBE4D, + 0x7DA8, 0xBE4E, + 0x7DA9, 0xBE4F, + 0x7DAA, 0xBE50, + 0x7DAB, 0xBE51, + 0x7DAC, 0xBE52, + 0x7DAD, 0xBE53, + 0x7DAF, 0xBE54, + 0x7DB0, 0xBE55, + 0x7DB1, 0xBE56, + 0x7DB2, 0xBE57, + 0x7DB3, 0xBE58, + 0x7DB4, 0xBE59, + 0x7DB5, 0xBE5A, + 0x7DB6, 0xBE5B, + 0x7DB7, 0xBE5C, + 0x7DB8, 0xBE5D, + 0x7DB9, 0xBE5E, + 0x7DBA, 0xBE5F, + 0x7DBB, 0xBE60, + 0x7DBC, 0xBE61, + 0x7DBD, 0xBE62, + 0x7DBE, 0xBE63, + 0x7DBF, 0xBE64, + 0x7DC0, 0xBE65, + 0x7DC1, 0xBE66, + 0x7DC2, 0xBE67, + 0x7DC3, 0xBE68, + 0x7DC4, 0xBE69, + 0x7DC5, 0xBE6A, + 0x7DC6, 0xBE6B, + 0x7DC7, 0xBE6C, + 0x7DC8, 0xBE6D, + 0x7DC9, 0xBE6E, + 0x7DCA, 0xBE6F, + 0x7DCB, 0xBE70, + 0x7DCC, 0xBE71, + 0x7DCD, 0xBE72, + 0x7DCE, 0xBE73, + 0x7DCF, 0xBE74, + 0x7DD0, 0xBE75, + 0x7DD1, 0xBE76, + 0x7DD2, 0xBE77, + 0x7DD3, 0xBE78, + 0x7DD4, 0xBE79, + 0x7DD5, 0xBE7A, + 0x7DD6, 0xBE7B, + 0x7DD7, 0xBE7C, + 0x7DD8, 0xBE7D, + 0x7DD9, 0xBE7E, + 0x7DDA, 0xBE80, + 0x7DDB, 0xBE81, + 0x7DDC, 0xBE82, + 0x7DDD, 0xBE83, + 0x7DDE, 0xBE84, + 0x7DDF, 0xBE85, + 0x7DE0, 0xBE86, + 0x7DE1, 0xBE87, + 0x7DE2, 0xBE88, + 0x7DE3, 0xBE89, + 0x7DE4, 0xBE8A, + 0x7DE5, 0xBE8B, + 0x7DE6, 0xBE8C, + 0x7DE7, 0xBE8D, + 0x7DE8, 0xBE8E, + 0x7DE9, 0xBE8F, + 0x7DEA, 0xBE90, + 0x7DEB, 0xBE91, + 0x7DEC, 0xBE92, + 0x7DED, 0xBE93, + 0x7DEE, 0xBE94, + 0x7DEF, 0xBE95, + 0x7DF0, 0xBE96, + 0x7DF1, 0xBE97, + 0x7DF2, 0xBE98, + 0x7DF3, 0xBE99, + 0x7DF4, 0xBE9A, + 0x7DF5, 0xBE9B, + 0x7DF6, 0xBE9C, + 0x7DF7, 0xBE9D, + 0x7DF8, 0xBE9E, + 0x7DF9, 0xBE9F, + 0x7DFA, 0xBEA0, + 0x7DFB, 0xBF40, + 0x7DFC, 0xBF41, + 0x7DFD, 0xBF42, + 0x7DFE, 0xBF43, + 0x7DFF, 0xBF44, + 0x7E00, 0xBF45, + 0x7E01, 0xBF46, + 0x7E02, 0xBF47, + 0x7E03, 0xBF48, + 0x7E04, 0xBF49, + 0x7E05, 0xBF4A, + 0x7E06, 0xBF4B, + 0x7E07, 0xBF4C, + 0x7E08, 0xBF4D, + 0x7E09, 0xBF4E, + 0x7E0A, 0xBF4F, + 0x7E0B, 0xBF50, + 0x7E0C, 0xBF51, + 0x7E0D, 0xBF52, + 0x7E0E, 0xBF53, + 0x7E0F, 0xBF54, + 0x7E10, 0xBF55, + 0x7E11, 0xBF56, + 0x7E12, 0xBF57, + 0x7E13, 0xBF58, + 0x7E14, 0xBF59, + 0x7E15, 0xBF5A, + 0x7E16, 0xBF5B, + 0x7E17, 0xBF5C, + 0x7E18, 0xBF5D, + 0x7E19, 0xBF5E, + 0x7E1A, 0xBF5F, + 0x7E1B, 0xBF60, + 0x7E1C, 0xBF61, + 0x7E1D, 0xBF62, + 0x7E1E, 0xBF63, + 0x7E1F, 0xBF64, + 0x7E20, 0xBF65, + 0x7E21, 0xBF66, + 0x7E22, 0xBF67, + 0x7E23, 0xBF68, + 0x7E24, 0xBF69, + 0x7E25, 0xBF6A, + 0x7E26, 0xBF6B, + 0x7E27, 0xBF6C, + 0x7E28, 0xBF6D, + 0x7E29, 0xBF6E, + 0x7E2A, 0xBF6F, + 0x7E2B, 0xBF70, + 0x7E2C, 0xBF71, + 0x7E2D, 0xBF72, + 0x7E2E, 0xBF73, + 0x7E2F, 0xBF74, + 0x7E30, 0xBF75, + 0x7E31, 0xBF76, + 0x7E32, 0xBF77, + 0x7E33, 0xBF78, + 0x7E34, 0xBF79, + 0x7E35, 0xBF7A, + 0x7E36, 0xBF7B, + 0x7E37, 0xBF7C, + 0x7E38, 0xBF7D, + 0x7E39, 0xBF7E, + 0x7E3A, 0xBF80, + 0x7E3C, 0xBF81, + 0x7E3D, 0xBF82, + 0x7E3E, 0xBF83, + 0x7E3F, 0xBF84, + 0x7E40, 0xBF85, + 0x7E42, 0xBF86, + 0x7E43, 0xBF87, + 0x7E44, 0xBF88, + 0x7E45, 0xBF89, + 0x7E46, 0xBF8A, + 0x7E48, 0xBF8B, + 0x7E49, 0xBF8C, + 0x7E4A, 0xBF8D, + 0x7E4B, 0xBF8E, + 0x7E4C, 0xBF8F, + 0x7E4D, 0xBF90, + 0x7E4E, 0xBF91, + 0x7E4F, 0xBF92, + 0x7E50, 0xBF93, + 0x7E51, 0xBF94, + 0x7E52, 0xBF95, + 0x7E53, 0xBF96, + 0x7E54, 0xBF97, + 0x7E55, 0xBF98, + 0x7E56, 0xBF99, + 0x7E57, 0xBF9A, + 0x7E58, 0xBF9B, + 0x7E59, 0xBF9C, + 0x7E5A, 0xBF9D, + 0x7E5B, 0xBF9E, + 0x7E5C, 0xBF9F, + 0x7E5D, 0xBFA0, + 0x7E5E, 0xC040, + 0x7E5F, 0xC041, + 0x7E60, 0xC042, + 0x7E61, 0xC043, + 0x7E62, 0xC044, + 0x7E63, 0xC045, + 0x7E64, 0xC046, + 0x7E65, 0xC047, + 0x7E66, 0xC048, + 0x7E67, 0xC049, + 0x7E68, 0xC04A, + 0x7E69, 0xC04B, + 0x7E6A, 0xC04C, + 0x7E6B, 0xC04D, + 0x7E6C, 0xC04E, + 0x7E6D, 0xC04F, + 0x7E6E, 0xC050, + 0x7E6F, 0xC051, + 0x7E70, 0xC052, + 0x7E71, 0xC053, + 0x7E72, 0xC054, + 0x7E73, 0xC055, + 0x7E74, 0xC056, + 0x7E75, 0xC057, + 0x7E76, 0xC058, + 0x7E77, 0xC059, + 0x7E78, 0xC05A, + 0x7E79, 0xC05B, + 0x7E7A, 0xC05C, + 0x7E7B, 0xC05D, + 0x7E7C, 0xC05E, + 0x7E7D, 0xC05F, + 0x7E7E, 0xC060, + 0x7E7F, 0xC061, + 0x7E80, 0xC062, + 0x7E81, 0xC063, + 0x7E83, 0xC064, + 0x7E84, 0xC065, + 0x7E85, 0xC066, + 0x7E86, 0xC067, + 0x7E87, 0xC068, + 0x7E88, 0xC069, + 0x7E89, 0xC06A, + 0x7E8A, 0xC06B, + 0x7E8B, 0xC06C, + 0x7E8C, 0xC06D, + 0x7E8D, 0xC06E, + 0x7E8E, 0xC06F, + 0x7E8F, 0xC070, + 0x7E90, 0xC071, + 0x7E91, 0xC072, + 0x7E92, 0xC073, + 0x7E93, 0xC074, + 0x7E94, 0xC075, + 0x7E95, 0xC076, + 0x7E96, 0xC077, + 0x7E97, 0xC078, + 0x7E98, 0xC079, + 0x7E99, 0xC07A, + 0x7E9A, 0xC07B, + 0x7E9C, 0xC07C, + 0x7E9D, 0xC07D, + 0x7E9E, 0xC07E, + 0x7EAE, 0xC080, + 0x7EB4, 0xC081, + 0x7EBB, 0xC082, + 0x7EBC, 0xC083, + 0x7ED6, 0xC084, + 0x7EE4, 0xC085, + 0x7EEC, 0xC086, + 0x7EF9, 0xC087, + 0x7F0A, 0xC088, + 0x7F10, 0xC089, + 0x7F1E, 0xC08A, + 0x7F37, 0xC08B, + 0x7F39, 0xC08C, + 0x7F3B, 0xC08D, + 0x7F3C, 0xC08E, + 0x7F3D, 0xC08F, + 0x7F3E, 0xC090, + 0x7F3F, 0xC091, + 0x7F40, 0xC092, + 0x7F41, 0xC093, + 0x7F43, 0xC094, + 0x7F46, 0xC095, + 0x7F47, 0xC096, + 0x7F48, 0xC097, + 0x7F49, 0xC098, + 0x7F4A, 0xC099, + 0x7F4B, 0xC09A, + 0x7F4C, 0xC09B, + 0x7F4D, 0xC09C, + 0x7F4E, 0xC09D, + 0x7F4F, 0xC09E, + 0x7F52, 0xC09F, + 0x7F53, 0xC0A0, + 0x7F56, 0xC140, + 0x7F59, 0xC141, + 0x7F5B, 0xC142, + 0x7F5C, 0xC143, + 0x7F5D, 0xC144, + 0x7F5E, 0xC145, + 0x7F60, 0xC146, + 0x7F63, 0xC147, + 0x7F64, 0xC148, + 0x7F65, 0xC149, + 0x7F66, 0xC14A, + 0x7F67, 0xC14B, + 0x7F6B, 0xC14C, + 0x7F6C, 0xC14D, + 0x7F6D, 0xC14E, + 0x7F6F, 0xC14F, + 0x7F70, 0xC150, + 0x7F73, 0xC151, + 0x7F75, 0xC152, + 0x7F76, 0xC153, + 0x7F77, 0xC154, + 0x7F78, 0xC155, + 0x7F7A, 0xC156, + 0x7F7B, 0xC157, + 0x7F7C, 0xC158, + 0x7F7D, 0xC159, + 0x7F7F, 0xC15A, + 0x7F80, 0xC15B, + 0x7F82, 0xC15C, + 0x7F83, 0xC15D, + 0x7F84, 0xC15E, + 0x7F85, 0xC15F, + 0x7F86, 0xC160, + 0x7F87, 0xC161, + 0x7F88, 0xC162, + 0x7F89, 0xC163, + 0x7F8B, 0xC164, + 0x7F8D, 0xC165, + 0x7F8F, 0xC166, + 0x7F90, 0xC167, + 0x7F91, 0xC168, + 0x7F92, 0xC169, + 0x7F93, 0xC16A, + 0x7F95, 0xC16B, + 0x7F96, 0xC16C, + 0x7F97, 0xC16D, + 0x7F98, 0xC16E, + 0x7F99, 0xC16F, + 0x7F9B, 0xC170, + 0x7F9C, 0xC171, + 0x7FA0, 0xC172, + 0x7FA2, 0xC173, + 0x7FA3, 0xC174, + 0x7FA5, 0xC175, + 0x7FA6, 0xC176, + 0x7FA8, 0xC177, + 0x7FA9, 0xC178, + 0x7FAA, 0xC179, + 0x7FAB, 0xC17A, + 0x7FAC, 0xC17B, + 0x7FAD, 0xC17C, + 0x7FAE, 0xC17D, + 0x7FB1, 0xC17E, + 0x7FB3, 0xC180, + 0x7FB4, 0xC181, + 0x7FB5, 0xC182, + 0x7FB6, 0xC183, + 0x7FB7, 0xC184, + 0x7FBA, 0xC185, + 0x7FBB, 0xC186, + 0x7FBE, 0xC187, + 0x7FC0, 0xC188, + 0x7FC2, 0xC189, + 0x7FC3, 0xC18A, + 0x7FC4, 0xC18B, + 0x7FC6, 0xC18C, + 0x7FC7, 0xC18D, + 0x7FC8, 0xC18E, + 0x7FC9, 0xC18F, + 0x7FCB, 0xC190, + 0x7FCD, 0xC191, + 0x7FCF, 0xC192, + 0x7FD0, 0xC193, + 0x7FD1, 0xC194, + 0x7FD2, 0xC195, + 0x7FD3, 0xC196, + 0x7FD6, 0xC197, + 0x7FD7, 0xC198, + 0x7FD9, 0xC199, + 0x7FDA, 0xC19A, + 0x7FDB, 0xC19B, + 0x7FDC, 0xC19C, + 0x7FDD, 0xC19D, + 0x7FDE, 0xC19E, + 0x7FE2, 0xC19F, + 0x7FE3, 0xC1A0, + 0x7FE4, 0xC240, + 0x7FE7, 0xC241, + 0x7FE8, 0xC242, + 0x7FEA, 0xC243, + 0x7FEB, 0xC244, + 0x7FEC, 0xC245, + 0x7FED, 0xC246, + 0x7FEF, 0xC247, + 0x7FF2, 0xC248, + 0x7FF4, 0xC249, + 0x7FF5, 0xC24A, + 0x7FF6, 0xC24B, + 0x7FF7, 0xC24C, + 0x7FF8, 0xC24D, + 0x7FF9, 0xC24E, + 0x7FFA, 0xC24F, + 0x7FFD, 0xC250, + 0x7FFE, 0xC251, + 0x7FFF, 0xC252, + 0x8002, 0xC253, + 0x8007, 0xC254, + 0x8008, 0xC255, + 0x8009, 0xC256, + 0x800A, 0xC257, + 0x800E, 0xC258, + 0x800F, 0xC259, + 0x8011, 0xC25A, + 0x8013, 0xC25B, + 0x801A, 0xC25C, + 0x801B, 0xC25D, + 0x801D, 0xC25E, + 0x801E, 0xC25F, + 0x801F, 0xC260, + 0x8021, 0xC261, + 0x8023, 0xC262, + 0x8024, 0xC263, + 0x802B, 0xC264, + 0x802C, 0xC265, + 0x802D, 0xC266, + 0x802E, 0xC267, + 0x802F, 0xC268, + 0x8030, 0xC269, + 0x8032, 0xC26A, + 0x8034, 0xC26B, + 0x8039, 0xC26C, + 0x803A, 0xC26D, + 0x803C, 0xC26E, + 0x803E, 0xC26F, + 0x8040, 0xC270, + 0x8041, 0xC271, + 0x8044, 0xC272, + 0x8045, 0xC273, + 0x8047, 0xC274, + 0x8048, 0xC275, + 0x8049, 0xC276, + 0x804E, 0xC277, + 0x804F, 0xC278, + 0x8050, 0xC279, + 0x8051, 0xC27A, + 0x8053, 0xC27B, + 0x8055, 0xC27C, + 0x8056, 0xC27D, + 0x8057, 0xC27E, + 0x8059, 0xC280, + 0x805B, 0xC281, + 0x805C, 0xC282, + 0x805D, 0xC283, + 0x805E, 0xC284, + 0x805F, 0xC285, + 0x8060, 0xC286, + 0x8061, 0xC287, + 0x8062, 0xC288, + 0x8063, 0xC289, + 0x8064, 0xC28A, + 0x8065, 0xC28B, + 0x8066, 0xC28C, + 0x8067, 0xC28D, + 0x8068, 0xC28E, + 0x806B, 0xC28F, + 0x806C, 0xC290, + 0x806D, 0xC291, + 0x806E, 0xC292, + 0x806F, 0xC293, + 0x8070, 0xC294, + 0x8072, 0xC295, + 0x8073, 0xC296, + 0x8074, 0xC297, + 0x8075, 0xC298, + 0x8076, 0xC299, + 0x8077, 0xC29A, + 0x8078, 0xC29B, + 0x8079, 0xC29C, + 0x807A, 0xC29D, + 0x807B, 0xC29E, + 0x807C, 0xC29F, + 0x807D, 0xC2A0, + 0x807E, 0xC340, + 0x8081, 0xC341, + 0x8082, 0xC342, + 0x8085, 0xC343, + 0x8088, 0xC344, + 0x808A, 0xC345, + 0x808D, 0xC346, + 0x808E, 0xC347, + 0x808F, 0xC348, + 0x8090, 0xC349, + 0x8091, 0xC34A, + 0x8092, 0xC34B, + 0x8094, 0xC34C, + 0x8095, 0xC34D, + 0x8097, 0xC34E, + 0x8099, 0xC34F, + 0x809E, 0xC350, + 0x80A3, 0xC351, + 0x80A6, 0xC352, + 0x80A7, 0xC353, + 0x80A8, 0xC354, + 0x80AC, 0xC355, + 0x80B0, 0xC356, + 0x80B3, 0xC357, + 0x80B5, 0xC358, + 0x80B6, 0xC359, + 0x80B8, 0xC35A, + 0x80B9, 0xC35B, + 0x80BB, 0xC35C, + 0x80C5, 0xC35D, + 0x80C7, 0xC35E, + 0x80C8, 0xC35F, + 0x80C9, 0xC360, + 0x80CA, 0xC361, + 0x80CB, 0xC362, + 0x80CF, 0xC363, + 0x80D0, 0xC364, + 0x80D1, 0xC365, + 0x80D2, 0xC366, + 0x80D3, 0xC367, + 0x80D4, 0xC368, + 0x80D5, 0xC369, + 0x80D8, 0xC36A, + 0x80DF, 0xC36B, + 0x80E0, 0xC36C, + 0x80E2, 0xC36D, + 0x80E3, 0xC36E, + 0x80E6, 0xC36F, + 0x80EE, 0xC370, + 0x80F5, 0xC371, + 0x80F7, 0xC372, + 0x80F9, 0xC373, + 0x80FB, 0xC374, + 0x80FE, 0xC375, + 0x80FF, 0xC376, + 0x8100, 0xC377, + 0x8101, 0xC378, + 0x8103, 0xC379, + 0x8104, 0xC37A, + 0x8105, 0xC37B, + 0x8107, 0xC37C, + 0x8108, 0xC37D, + 0x810B, 0xC37E, + 0x810C, 0xC380, + 0x8115, 0xC381, + 0x8117, 0xC382, + 0x8119, 0xC383, + 0x811B, 0xC384, + 0x811C, 0xC385, + 0x811D, 0xC386, + 0x811F, 0xC387, + 0x8120, 0xC388, + 0x8121, 0xC389, + 0x8122, 0xC38A, + 0x8123, 0xC38B, + 0x8124, 0xC38C, + 0x8125, 0xC38D, + 0x8126, 0xC38E, + 0x8127, 0xC38F, + 0x8128, 0xC390, + 0x8129, 0xC391, + 0x812A, 0xC392, + 0x812B, 0xC393, + 0x812D, 0xC394, + 0x812E, 0xC395, + 0x8130, 0xC396, + 0x8133, 0xC397, + 0x8134, 0xC398, + 0x8135, 0xC399, + 0x8137, 0xC39A, + 0x8139, 0xC39B, + 0x813A, 0xC39C, + 0x813B, 0xC39D, + 0x813C, 0xC39E, + 0x813D, 0xC39F, + 0x813F, 0xC3A0, + 0x8140, 0xC440, + 0x8141, 0xC441, + 0x8142, 0xC442, + 0x8143, 0xC443, + 0x8144, 0xC444, + 0x8145, 0xC445, + 0x8147, 0xC446, + 0x8149, 0xC447, + 0x814D, 0xC448, + 0x814E, 0xC449, + 0x814F, 0xC44A, + 0x8152, 0xC44B, + 0x8156, 0xC44C, + 0x8157, 0xC44D, + 0x8158, 0xC44E, + 0x815B, 0xC44F, + 0x815C, 0xC450, + 0x815D, 0xC451, + 0x815E, 0xC452, + 0x815F, 0xC453, + 0x8161, 0xC454, + 0x8162, 0xC455, + 0x8163, 0xC456, + 0x8164, 0xC457, + 0x8166, 0xC458, + 0x8168, 0xC459, + 0x816A, 0xC45A, + 0x816B, 0xC45B, + 0x816C, 0xC45C, + 0x816F, 0xC45D, + 0x8172, 0xC45E, + 0x8173, 0xC45F, + 0x8175, 0xC460, + 0x8176, 0xC461, + 0x8177, 0xC462, + 0x8178, 0xC463, + 0x8181, 0xC464, + 0x8183, 0xC465, + 0x8184, 0xC466, + 0x8185, 0xC467, + 0x8186, 0xC468, + 0x8187, 0xC469, + 0x8189, 0xC46A, + 0x818B, 0xC46B, + 0x818C, 0xC46C, + 0x818D, 0xC46D, + 0x818E, 0xC46E, + 0x8190, 0xC46F, + 0x8192, 0xC470, + 0x8193, 0xC471, + 0x8194, 0xC472, + 0x8195, 0xC473, + 0x8196, 0xC474, + 0x8197, 0xC475, + 0x8199, 0xC476, + 0x819A, 0xC477, + 0x819E, 0xC478, + 0x819F, 0xC479, + 0x81A0, 0xC47A, + 0x81A1, 0xC47B, + 0x81A2, 0xC47C, + 0x81A4, 0xC47D, + 0x81A5, 0xC47E, + 0x81A7, 0xC480, + 0x81A9, 0xC481, + 0x81AB, 0xC482, + 0x81AC, 0xC483, + 0x81AD, 0xC484, + 0x81AE, 0xC485, + 0x81AF, 0xC486, + 0x81B0, 0xC487, + 0x81B1, 0xC488, + 0x81B2, 0xC489, + 0x81B4, 0xC48A, + 0x81B5, 0xC48B, + 0x81B6, 0xC48C, + 0x81B7, 0xC48D, + 0x81B8, 0xC48E, + 0x81B9, 0xC48F, + 0x81BC, 0xC490, + 0x81BD, 0xC491, + 0x81BE, 0xC492, + 0x81BF, 0xC493, + 0x81C4, 0xC494, + 0x81C5, 0xC495, + 0x81C7, 0xC496, + 0x81C8, 0xC497, + 0x81C9, 0xC498, + 0x81CB, 0xC499, + 0x81CD, 0xC49A, + 0x81CE, 0xC49B, + 0x81CF, 0xC49C, + 0x81D0, 0xC49D, + 0x81D1, 0xC49E, + 0x81D2, 0xC49F, + 0x81D3, 0xC4A0, + 0x81D4, 0xC540, + 0x81D5, 0xC541, + 0x81D6, 0xC542, + 0x81D7, 0xC543, + 0x81D8, 0xC544, + 0x81D9, 0xC545, + 0x81DA, 0xC546, + 0x81DB, 0xC547, + 0x81DC, 0xC548, + 0x81DD, 0xC549, + 0x81DE, 0xC54A, + 0x81DF, 0xC54B, + 0x81E0, 0xC54C, + 0x81E1, 0xC54D, + 0x81E2, 0xC54E, + 0x81E4, 0xC54F, + 0x81E5, 0xC550, + 0x81E6, 0xC551, + 0x81E8, 0xC552, + 0x81E9, 0xC553, + 0x81EB, 0xC554, + 0x81EE, 0xC555, + 0x81EF, 0xC556, + 0x81F0, 0xC557, + 0x81F1, 0xC558, + 0x81F2, 0xC559, + 0x81F5, 0xC55A, + 0x81F6, 0xC55B, + 0x81F7, 0xC55C, + 0x81F8, 0xC55D, + 0x81F9, 0xC55E, + 0x81FA, 0xC55F, + 0x81FD, 0xC560, + 0x81FF, 0xC561, + 0x8203, 0xC562, + 0x8207, 0xC563, + 0x8208, 0xC564, + 0x8209, 0xC565, + 0x820A, 0xC566, + 0x820B, 0xC567, + 0x820E, 0xC568, + 0x820F, 0xC569, + 0x8211, 0xC56A, + 0x8213, 0xC56B, + 0x8215, 0xC56C, + 0x8216, 0xC56D, + 0x8217, 0xC56E, + 0x8218, 0xC56F, + 0x8219, 0xC570, + 0x821A, 0xC571, + 0x821D, 0xC572, + 0x8220, 0xC573, + 0x8224, 0xC574, + 0x8225, 0xC575, + 0x8226, 0xC576, + 0x8227, 0xC577, + 0x8229, 0xC578, + 0x822E, 0xC579, + 0x8232, 0xC57A, + 0x823A, 0xC57B, + 0x823C, 0xC57C, + 0x823D, 0xC57D, + 0x823F, 0xC57E, + 0x8240, 0xC580, + 0x8241, 0xC581, + 0x8242, 0xC582, + 0x8243, 0xC583, + 0x8245, 0xC584, + 0x8246, 0xC585, + 0x8248, 0xC586, + 0x824A, 0xC587, + 0x824C, 0xC588, + 0x824D, 0xC589, + 0x824E, 0xC58A, + 0x8250, 0xC58B, + 0x8251, 0xC58C, + 0x8252, 0xC58D, + 0x8253, 0xC58E, + 0x8254, 0xC58F, + 0x8255, 0xC590, + 0x8256, 0xC591, + 0x8257, 0xC592, + 0x8259, 0xC593, + 0x825B, 0xC594, + 0x825C, 0xC595, + 0x825D, 0xC596, + 0x825E, 0xC597, + 0x8260, 0xC598, + 0x8261, 0xC599, + 0x8262, 0xC59A, + 0x8263, 0xC59B, + 0x8264, 0xC59C, + 0x8265, 0xC59D, + 0x8266, 0xC59E, + 0x8267, 0xC59F, + 0x8269, 0xC5A0, + 0x826A, 0xC640, + 0x826B, 0xC641, + 0x826C, 0xC642, + 0x826D, 0xC643, + 0x8271, 0xC644, + 0x8275, 0xC645, + 0x8276, 0xC646, + 0x8277, 0xC647, + 0x8278, 0xC648, + 0x827B, 0xC649, + 0x827C, 0xC64A, + 0x8280, 0xC64B, + 0x8281, 0xC64C, + 0x8283, 0xC64D, + 0x8285, 0xC64E, + 0x8286, 0xC64F, + 0x8287, 0xC650, + 0x8289, 0xC651, + 0x828C, 0xC652, + 0x8290, 0xC653, + 0x8293, 0xC654, + 0x8294, 0xC655, + 0x8295, 0xC656, + 0x8296, 0xC657, + 0x829A, 0xC658, + 0x829B, 0xC659, + 0x829E, 0xC65A, + 0x82A0, 0xC65B, + 0x82A2, 0xC65C, + 0x82A3, 0xC65D, + 0x82A7, 0xC65E, + 0x82B2, 0xC65F, + 0x82B5, 0xC660, + 0x82B6, 0xC661, + 0x82BA, 0xC662, + 0x82BB, 0xC663, + 0x82BC, 0xC664, + 0x82BF, 0xC665, + 0x82C0, 0xC666, + 0x82C2, 0xC667, + 0x82C3, 0xC668, + 0x82C5, 0xC669, + 0x82C6, 0xC66A, + 0x82C9, 0xC66B, + 0x82D0, 0xC66C, + 0x82D6, 0xC66D, + 0x82D9, 0xC66E, + 0x82DA, 0xC66F, + 0x82DD, 0xC670, + 0x82E2, 0xC671, + 0x82E7, 0xC672, + 0x82E8, 0xC673, + 0x82E9, 0xC674, + 0x82EA, 0xC675, + 0x82EC, 0xC676, + 0x82ED, 0xC677, + 0x82EE, 0xC678, + 0x82F0, 0xC679, + 0x82F2, 0xC67A, + 0x82F3, 0xC67B, + 0x82F5, 0xC67C, + 0x82F6, 0xC67D, + 0x82F8, 0xC67E, + 0x82FA, 0xC680, + 0x82FC, 0xC681, + 0x82FD, 0xC682, + 0x82FE, 0xC683, + 0x82FF, 0xC684, + 0x8300, 0xC685, + 0x830A, 0xC686, + 0x830B, 0xC687, + 0x830D, 0xC688, + 0x8310, 0xC689, + 0x8312, 0xC68A, + 0x8313, 0xC68B, + 0x8316, 0xC68C, + 0x8318, 0xC68D, + 0x8319, 0xC68E, + 0x831D, 0xC68F, + 0x831E, 0xC690, + 0x831F, 0xC691, + 0x8320, 0xC692, + 0x8321, 0xC693, + 0x8322, 0xC694, + 0x8323, 0xC695, + 0x8324, 0xC696, + 0x8325, 0xC697, + 0x8326, 0xC698, + 0x8329, 0xC699, + 0x832A, 0xC69A, + 0x832E, 0xC69B, + 0x8330, 0xC69C, + 0x8332, 0xC69D, + 0x8337, 0xC69E, + 0x833B, 0xC69F, + 0x833D, 0xC6A0, + 0x833E, 0xC740, + 0x833F, 0xC741, + 0x8341, 0xC742, + 0x8342, 0xC743, + 0x8344, 0xC744, + 0x8345, 0xC745, + 0x8348, 0xC746, + 0x834A, 0xC747, + 0x834B, 0xC748, + 0x834C, 0xC749, + 0x834D, 0xC74A, + 0x834E, 0xC74B, + 0x8353, 0xC74C, + 0x8355, 0xC74D, + 0x8356, 0xC74E, + 0x8357, 0xC74F, + 0x8358, 0xC750, + 0x8359, 0xC751, + 0x835D, 0xC752, + 0x8362, 0xC753, + 0x8370, 0xC754, + 0x8371, 0xC755, + 0x8372, 0xC756, + 0x8373, 0xC757, + 0x8374, 0xC758, + 0x8375, 0xC759, + 0x8376, 0xC75A, + 0x8379, 0xC75B, + 0x837A, 0xC75C, + 0x837E, 0xC75D, + 0x837F, 0xC75E, + 0x8380, 0xC75F, + 0x8381, 0xC760, + 0x8382, 0xC761, + 0x8383, 0xC762, + 0x8384, 0xC763, + 0x8387, 0xC764, + 0x8388, 0xC765, + 0x838A, 0xC766, + 0x838B, 0xC767, + 0x838C, 0xC768, + 0x838D, 0xC769, + 0x838F, 0xC76A, + 0x8390, 0xC76B, + 0x8391, 0xC76C, + 0x8394, 0xC76D, + 0x8395, 0xC76E, + 0x8396, 0xC76F, + 0x8397, 0xC770, + 0x8399, 0xC771, + 0x839A, 0xC772, + 0x839D, 0xC773, + 0x839F, 0xC774, + 0x83A1, 0xC775, + 0x83A2, 0xC776, + 0x83A3, 0xC777, + 0x83A4, 0xC778, + 0x83A5, 0xC779, + 0x83A6, 0xC77A, + 0x83A7, 0xC77B, + 0x83AC, 0xC77C, + 0x83AD, 0xC77D, + 0x83AE, 0xC77E, + 0x83AF, 0xC780, + 0x83B5, 0xC781, + 0x83BB, 0xC782, + 0x83BE, 0xC783, + 0x83BF, 0xC784, + 0x83C2, 0xC785, + 0x83C3, 0xC786, + 0x83C4, 0xC787, + 0x83C6, 0xC788, + 0x83C8, 0xC789, + 0x83C9, 0xC78A, + 0x83CB, 0xC78B, + 0x83CD, 0xC78C, + 0x83CE, 0xC78D, + 0x83D0, 0xC78E, + 0x83D1, 0xC78F, + 0x83D2, 0xC790, + 0x83D3, 0xC791, + 0x83D5, 0xC792, + 0x83D7, 0xC793, + 0x83D9, 0xC794, + 0x83DA, 0xC795, + 0x83DB, 0xC796, + 0x83DE, 0xC797, + 0x83E2, 0xC798, + 0x83E3, 0xC799, + 0x83E4, 0xC79A, + 0x83E6, 0xC79B, + 0x83E7, 0xC79C, + 0x83E8, 0xC79D, + 0x83EB, 0xC79E, + 0x83EC, 0xC79F, + 0x83ED, 0xC7A0, + 0x83EE, 0xC840, + 0x83EF, 0xC841, + 0x83F3, 0xC842, + 0x83F4, 0xC843, + 0x83F5, 0xC844, + 0x83F6, 0xC845, + 0x83F7, 0xC846, + 0x83FA, 0xC847, + 0x83FB, 0xC848, + 0x83FC, 0xC849, + 0x83FE, 0xC84A, + 0x83FF, 0xC84B, + 0x8400, 0xC84C, + 0x8402, 0xC84D, + 0x8405, 0xC84E, + 0x8407, 0xC84F, + 0x8408, 0xC850, + 0x8409, 0xC851, + 0x840A, 0xC852, + 0x8410, 0xC853, + 0x8412, 0xC854, + 0x8413, 0xC855, + 0x8414, 0xC856, + 0x8415, 0xC857, + 0x8416, 0xC858, + 0x8417, 0xC859, + 0x8419, 0xC85A, + 0x841A, 0xC85B, + 0x841B, 0xC85C, + 0x841E, 0xC85D, + 0x841F, 0xC85E, + 0x8420, 0xC85F, + 0x8421, 0xC860, + 0x8422, 0xC861, + 0x8423, 0xC862, + 0x8429, 0xC863, + 0x842A, 0xC864, + 0x842B, 0xC865, + 0x842C, 0xC866, + 0x842D, 0xC867, + 0x842E, 0xC868, + 0x842F, 0xC869, + 0x8430, 0xC86A, + 0x8432, 0xC86B, + 0x8433, 0xC86C, + 0x8434, 0xC86D, + 0x8435, 0xC86E, + 0x8436, 0xC86F, + 0x8437, 0xC870, + 0x8439, 0xC871, + 0x843A, 0xC872, + 0x843B, 0xC873, + 0x843E, 0xC874, + 0x843F, 0xC875, + 0x8440, 0xC876, + 0x8441, 0xC877, + 0x8442, 0xC878, + 0x8443, 0xC879, + 0x8444, 0xC87A, + 0x8445, 0xC87B, + 0x8447, 0xC87C, + 0x8448, 0xC87D, + 0x8449, 0xC87E, + 0x844A, 0xC880, + 0x844B, 0xC881, + 0x844C, 0xC882, + 0x844D, 0xC883, + 0x844E, 0xC884, + 0x844F, 0xC885, + 0x8450, 0xC886, + 0x8452, 0xC887, + 0x8453, 0xC888, + 0x8454, 0xC889, + 0x8455, 0xC88A, + 0x8456, 0xC88B, + 0x8458, 0xC88C, + 0x845D, 0xC88D, + 0x845E, 0xC88E, + 0x845F, 0xC88F, + 0x8460, 0xC890, + 0x8462, 0xC891, + 0x8464, 0xC892, + 0x8465, 0xC893, + 0x8466, 0xC894, + 0x8467, 0xC895, + 0x8468, 0xC896, + 0x846A, 0xC897, + 0x846E, 0xC898, + 0x846F, 0xC899, + 0x8470, 0xC89A, + 0x8472, 0xC89B, + 0x8474, 0xC89C, + 0x8477, 0xC89D, + 0x8479, 0xC89E, + 0x847B, 0xC89F, + 0x847C, 0xC8A0, + 0x847D, 0xC940, + 0x847E, 0xC941, + 0x847F, 0xC942, + 0x8480, 0xC943, + 0x8481, 0xC944, + 0x8483, 0xC945, + 0x8484, 0xC946, + 0x8485, 0xC947, + 0x8486, 0xC948, + 0x848A, 0xC949, + 0x848D, 0xC94A, + 0x848F, 0xC94B, + 0x8490, 0xC94C, + 0x8491, 0xC94D, + 0x8492, 0xC94E, + 0x8493, 0xC94F, + 0x8494, 0xC950, + 0x8495, 0xC951, + 0x8496, 0xC952, + 0x8498, 0xC953, + 0x849A, 0xC954, + 0x849B, 0xC955, + 0x849D, 0xC956, + 0x849E, 0xC957, + 0x849F, 0xC958, + 0x84A0, 0xC959, + 0x84A2, 0xC95A, + 0x84A3, 0xC95B, + 0x84A4, 0xC95C, + 0x84A5, 0xC95D, + 0x84A6, 0xC95E, + 0x84A7, 0xC95F, + 0x84A8, 0xC960, + 0x84A9, 0xC961, + 0x84AA, 0xC962, + 0x84AB, 0xC963, + 0x84AC, 0xC964, + 0x84AD, 0xC965, + 0x84AE, 0xC966, + 0x84B0, 0xC967, + 0x84B1, 0xC968, + 0x84B3, 0xC969, + 0x84B5, 0xC96A, + 0x84B6, 0xC96B, + 0x84B7, 0xC96C, + 0x84BB, 0xC96D, + 0x84BC, 0xC96E, + 0x84BE, 0xC96F, + 0x84C0, 0xC970, + 0x84C2, 0xC971, + 0x84C3, 0xC972, + 0x84C5, 0xC973, + 0x84C6, 0xC974, + 0x84C7, 0xC975, + 0x84C8, 0xC976, + 0x84CB, 0xC977, + 0x84CC, 0xC978, + 0x84CE, 0xC979, + 0x84CF, 0xC97A, + 0x84D2, 0xC97B, + 0x84D4, 0xC97C, + 0x84D5, 0xC97D, + 0x84D7, 0xC97E, + 0x84D8, 0xC980, + 0x84D9, 0xC981, + 0x84DA, 0xC982, + 0x84DB, 0xC983, + 0x84DC, 0xC984, + 0x84DE, 0xC985, + 0x84E1, 0xC986, + 0x84E2, 0xC987, + 0x84E4, 0xC988, + 0x84E7, 0xC989, + 0x84E8, 0xC98A, + 0x84E9, 0xC98B, + 0x84EA, 0xC98C, + 0x84EB, 0xC98D, + 0x84ED, 0xC98E, + 0x84EE, 0xC98F, + 0x84EF, 0xC990, + 0x84F1, 0xC991, + 0x84F2, 0xC992, + 0x84F3, 0xC993, + 0x84F4, 0xC994, + 0x84F5, 0xC995, + 0x84F6, 0xC996, + 0x84F7, 0xC997, + 0x84F8, 0xC998, + 0x84F9, 0xC999, + 0x84FA, 0xC99A, + 0x84FB, 0xC99B, + 0x84FD, 0xC99C, + 0x84FE, 0xC99D, + 0x8500, 0xC99E, + 0x8501, 0xC99F, + 0x8502, 0xC9A0, + 0x8503, 0xCA40, + 0x8504, 0xCA41, + 0x8505, 0xCA42, + 0x8506, 0xCA43, + 0x8507, 0xCA44, + 0x8508, 0xCA45, + 0x8509, 0xCA46, + 0x850A, 0xCA47, + 0x850B, 0xCA48, + 0x850D, 0xCA49, + 0x850E, 0xCA4A, + 0x850F, 0xCA4B, + 0x8510, 0xCA4C, + 0x8512, 0xCA4D, + 0x8514, 0xCA4E, + 0x8515, 0xCA4F, + 0x8516, 0xCA50, + 0x8518, 0xCA51, + 0x8519, 0xCA52, + 0x851B, 0xCA53, + 0x851C, 0xCA54, + 0x851D, 0xCA55, + 0x851E, 0xCA56, + 0x8520, 0xCA57, + 0x8522, 0xCA58, + 0x8523, 0xCA59, + 0x8524, 0xCA5A, + 0x8525, 0xCA5B, + 0x8526, 0xCA5C, + 0x8527, 0xCA5D, + 0x8528, 0xCA5E, + 0x8529, 0xCA5F, + 0x852A, 0xCA60, + 0x852D, 0xCA61, + 0x852E, 0xCA62, + 0x852F, 0xCA63, + 0x8530, 0xCA64, + 0x8531, 0xCA65, + 0x8532, 0xCA66, + 0x8533, 0xCA67, + 0x8534, 0xCA68, + 0x8535, 0xCA69, + 0x8536, 0xCA6A, + 0x853E, 0xCA6B, + 0x853F, 0xCA6C, + 0x8540, 0xCA6D, + 0x8541, 0xCA6E, + 0x8542, 0xCA6F, + 0x8544, 0xCA70, + 0x8545, 0xCA71, + 0x8546, 0xCA72, + 0x8547, 0xCA73, + 0x854B, 0xCA74, + 0x854C, 0xCA75, + 0x854D, 0xCA76, + 0x854E, 0xCA77, + 0x854F, 0xCA78, + 0x8550, 0xCA79, + 0x8551, 0xCA7A, + 0x8552, 0xCA7B, + 0x8553, 0xCA7C, + 0x8554, 0xCA7D, + 0x8555, 0xCA7E, + 0x8557, 0xCA80, + 0x8558, 0xCA81, + 0x855A, 0xCA82, + 0x855B, 0xCA83, + 0x855C, 0xCA84, + 0x855D, 0xCA85, + 0x855F, 0xCA86, + 0x8560, 0xCA87, + 0x8561, 0xCA88, + 0x8562, 0xCA89, + 0x8563, 0xCA8A, + 0x8565, 0xCA8B, + 0x8566, 0xCA8C, + 0x8567, 0xCA8D, + 0x8569, 0xCA8E, + 0x856A, 0xCA8F, + 0x856B, 0xCA90, + 0x856C, 0xCA91, + 0x856D, 0xCA92, + 0x856E, 0xCA93, + 0x856F, 0xCA94, + 0x8570, 0xCA95, + 0x8571, 0xCA96, + 0x8573, 0xCA97, + 0x8575, 0xCA98, + 0x8576, 0xCA99, + 0x8577, 0xCA9A, + 0x8578, 0xCA9B, + 0x857C, 0xCA9C, + 0x857D, 0xCA9D, + 0x857F, 0xCA9E, + 0x8580, 0xCA9F, + 0x8581, 0xCAA0, + 0x8582, 0xCB40, + 0x8583, 0xCB41, + 0x8586, 0xCB42, + 0x8588, 0xCB43, + 0x8589, 0xCB44, + 0x858A, 0xCB45, + 0x858B, 0xCB46, + 0x858C, 0xCB47, + 0x858D, 0xCB48, + 0x858E, 0xCB49, + 0x8590, 0xCB4A, + 0x8591, 0xCB4B, + 0x8592, 0xCB4C, + 0x8593, 0xCB4D, + 0x8594, 0xCB4E, + 0x8595, 0xCB4F, + 0x8596, 0xCB50, + 0x8597, 0xCB51, + 0x8598, 0xCB52, + 0x8599, 0xCB53, + 0x859A, 0xCB54, + 0x859D, 0xCB55, + 0x859E, 0xCB56, + 0x859F, 0xCB57, + 0x85A0, 0xCB58, + 0x85A1, 0xCB59, + 0x85A2, 0xCB5A, + 0x85A3, 0xCB5B, + 0x85A5, 0xCB5C, + 0x85A6, 0xCB5D, + 0x85A7, 0xCB5E, + 0x85A9, 0xCB5F, + 0x85AB, 0xCB60, + 0x85AC, 0xCB61, + 0x85AD, 0xCB62, + 0x85B1, 0xCB63, + 0x85B2, 0xCB64, + 0x85B3, 0xCB65, + 0x85B4, 0xCB66, + 0x85B5, 0xCB67, + 0x85B6, 0xCB68, + 0x85B8, 0xCB69, + 0x85BA, 0xCB6A, + 0x85BB, 0xCB6B, + 0x85BC, 0xCB6C, + 0x85BD, 0xCB6D, + 0x85BE, 0xCB6E, + 0x85BF, 0xCB6F, + 0x85C0, 0xCB70, + 0x85C2, 0xCB71, + 0x85C3, 0xCB72, + 0x85C4, 0xCB73, + 0x85C5, 0xCB74, + 0x85C6, 0xCB75, + 0x85C7, 0xCB76, + 0x85C8, 0xCB77, + 0x85CA, 0xCB78, + 0x85CB, 0xCB79, + 0x85CC, 0xCB7A, + 0x85CD, 0xCB7B, + 0x85CE, 0xCB7C, + 0x85D1, 0xCB7D, + 0x85D2, 0xCB7E, + 0x85D4, 0xCB80, + 0x85D6, 0xCB81, + 0x85D7, 0xCB82, + 0x85D8, 0xCB83, + 0x85D9, 0xCB84, + 0x85DA, 0xCB85, + 0x85DB, 0xCB86, + 0x85DD, 0xCB87, + 0x85DE, 0xCB88, + 0x85DF, 0xCB89, + 0x85E0, 0xCB8A, + 0x85E1, 0xCB8B, + 0x85E2, 0xCB8C, + 0x85E3, 0xCB8D, + 0x85E5, 0xCB8E, + 0x85E6, 0xCB8F, + 0x85E7, 0xCB90, + 0x85E8, 0xCB91, + 0x85EA, 0xCB92, + 0x85EB, 0xCB93, + 0x85EC, 0xCB94, + 0x85ED, 0xCB95, + 0x85EE, 0xCB96, + 0x85EF, 0xCB97, + 0x85F0, 0xCB98, + 0x85F1, 0xCB99, + 0x85F2, 0xCB9A, + 0x85F3, 0xCB9B, + 0x85F4, 0xCB9C, + 0x85F5, 0xCB9D, + 0x85F6, 0xCB9E, + 0x85F7, 0xCB9F, + 0x85F8, 0xCBA0, + 0x85F9, 0xCC40, + 0x85FA, 0xCC41, + 0x85FC, 0xCC42, + 0x85FD, 0xCC43, + 0x85FE, 0xCC44, + 0x8600, 0xCC45, + 0x8601, 0xCC46, + 0x8602, 0xCC47, + 0x8603, 0xCC48, + 0x8604, 0xCC49, + 0x8606, 0xCC4A, + 0x8607, 0xCC4B, + 0x8608, 0xCC4C, + 0x8609, 0xCC4D, + 0x860A, 0xCC4E, + 0x860B, 0xCC4F, + 0x860C, 0xCC50, + 0x860D, 0xCC51, + 0x860E, 0xCC52, + 0x860F, 0xCC53, + 0x8610, 0xCC54, + 0x8612, 0xCC55, + 0x8613, 0xCC56, + 0x8614, 0xCC57, + 0x8615, 0xCC58, + 0x8617, 0xCC59, + 0x8618, 0xCC5A, + 0x8619, 0xCC5B, + 0x861A, 0xCC5C, + 0x861B, 0xCC5D, + 0x861C, 0xCC5E, + 0x861D, 0xCC5F, + 0x861E, 0xCC60, + 0x861F, 0xCC61, + 0x8620, 0xCC62, + 0x8621, 0xCC63, + 0x8622, 0xCC64, + 0x8623, 0xCC65, + 0x8624, 0xCC66, + 0x8625, 0xCC67, + 0x8626, 0xCC68, + 0x8628, 0xCC69, + 0x862A, 0xCC6A, + 0x862B, 0xCC6B, + 0x862C, 0xCC6C, + 0x862D, 0xCC6D, + 0x862E, 0xCC6E, + 0x862F, 0xCC6F, + 0x8630, 0xCC70, + 0x8631, 0xCC71, + 0x8632, 0xCC72, + 0x8633, 0xCC73, + 0x8634, 0xCC74, + 0x8635, 0xCC75, + 0x8636, 0xCC76, + 0x8637, 0xCC77, + 0x8639, 0xCC78, + 0x863A, 0xCC79, + 0x863B, 0xCC7A, + 0x863D, 0xCC7B, + 0x863E, 0xCC7C, + 0x863F, 0xCC7D, + 0x8640, 0xCC7E, + 0x8641, 0xCC80, + 0x8642, 0xCC81, + 0x8643, 0xCC82, + 0x8644, 0xCC83, + 0x8645, 0xCC84, + 0x8646, 0xCC85, + 0x8647, 0xCC86, + 0x8648, 0xCC87, + 0x8649, 0xCC88, + 0x864A, 0xCC89, + 0x864B, 0xCC8A, + 0x864C, 0xCC8B, + 0x8652, 0xCC8C, + 0x8653, 0xCC8D, + 0x8655, 0xCC8E, + 0x8656, 0xCC8F, + 0x8657, 0xCC90, + 0x8658, 0xCC91, + 0x8659, 0xCC92, + 0x865B, 0xCC93, + 0x865C, 0xCC94, + 0x865D, 0xCC95, + 0x865F, 0xCC96, + 0x8660, 0xCC97, + 0x8661, 0xCC98, + 0x8663, 0xCC99, + 0x8664, 0xCC9A, + 0x8665, 0xCC9B, + 0x8666, 0xCC9C, + 0x8667, 0xCC9D, + 0x8668, 0xCC9E, + 0x8669, 0xCC9F, + 0x866A, 0xCCA0, + 0x866D, 0xCD40, + 0x866F, 0xCD41, + 0x8670, 0xCD42, + 0x8672, 0xCD43, + 0x8673, 0xCD44, + 0x8674, 0xCD45, + 0x8675, 0xCD46, + 0x8676, 0xCD47, + 0x8677, 0xCD48, + 0x8678, 0xCD49, + 0x8683, 0xCD4A, + 0x8684, 0xCD4B, + 0x8685, 0xCD4C, + 0x8686, 0xCD4D, + 0x8687, 0xCD4E, + 0x8688, 0xCD4F, + 0x8689, 0xCD50, + 0x868E, 0xCD51, + 0x868F, 0xCD52, + 0x8690, 0xCD53, + 0x8691, 0xCD54, + 0x8692, 0xCD55, + 0x8694, 0xCD56, + 0x8696, 0xCD57, + 0x8697, 0xCD58, + 0x8698, 0xCD59, + 0x8699, 0xCD5A, + 0x869A, 0xCD5B, + 0x869B, 0xCD5C, + 0x869E, 0xCD5D, + 0x869F, 0xCD5E, + 0x86A0, 0xCD5F, + 0x86A1, 0xCD60, + 0x86A2, 0xCD61, + 0x86A5, 0xCD62, + 0x86A6, 0xCD63, + 0x86AB, 0xCD64, + 0x86AD, 0xCD65, + 0x86AE, 0xCD66, + 0x86B2, 0xCD67, + 0x86B3, 0xCD68, + 0x86B7, 0xCD69, + 0x86B8, 0xCD6A, + 0x86B9, 0xCD6B, + 0x86BB, 0xCD6C, + 0x86BC, 0xCD6D, + 0x86BD, 0xCD6E, + 0x86BE, 0xCD6F, + 0x86BF, 0xCD70, + 0x86C1, 0xCD71, + 0x86C2, 0xCD72, + 0x86C3, 0xCD73, + 0x86C5, 0xCD74, + 0x86C8, 0xCD75, + 0x86CC, 0xCD76, + 0x86CD, 0xCD77, + 0x86D2, 0xCD78, + 0x86D3, 0xCD79, + 0x86D5, 0xCD7A, + 0x86D6, 0xCD7B, + 0x86D7, 0xCD7C, + 0x86DA, 0xCD7D, + 0x86DC, 0xCD7E, + 0x86DD, 0xCD80, + 0x86E0, 0xCD81, + 0x86E1, 0xCD82, + 0x86E2, 0xCD83, + 0x86E3, 0xCD84, + 0x86E5, 0xCD85, + 0x86E6, 0xCD86, + 0x86E7, 0xCD87, + 0x86E8, 0xCD88, + 0x86EA, 0xCD89, + 0x86EB, 0xCD8A, + 0x86EC, 0xCD8B, + 0x86EF, 0xCD8C, + 0x86F5, 0xCD8D, + 0x86F6, 0xCD8E, + 0x86F7, 0xCD8F, + 0x86FA, 0xCD90, + 0x86FB, 0xCD91, + 0x86FC, 0xCD92, + 0x86FD, 0xCD93, + 0x86FF, 0xCD94, + 0x8701, 0xCD95, + 0x8704, 0xCD96, + 0x8705, 0xCD97, + 0x8706, 0xCD98, + 0x870B, 0xCD99, + 0x870C, 0xCD9A, + 0x870E, 0xCD9B, + 0x870F, 0xCD9C, + 0x8710, 0xCD9D, + 0x8711, 0xCD9E, + 0x8714, 0xCD9F, + 0x8716, 0xCDA0, + 0x8719, 0xCE40, + 0x871B, 0xCE41, + 0x871D, 0xCE42, + 0x871F, 0xCE43, + 0x8720, 0xCE44, + 0x8724, 0xCE45, + 0x8726, 0xCE46, + 0x8727, 0xCE47, + 0x8728, 0xCE48, + 0x872A, 0xCE49, + 0x872B, 0xCE4A, + 0x872C, 0xCE4B, + 0x872D, 0xCE4C, + 0x872F, 0xCE4D, + 0x8730, 0xCE4E, + 0x8732, 0xCE4F, + 0x8733, 0xCE50, + 0x8735, 0xCE51, + 0x8736, 0xCE52, + 0x8738, 0xCE53, + 0x8739, 0xCE54, + 0x873A, 0xCE55, + 0x873C, 0xCE56, + 0x873D, 0xCE57, + 0x8740, 0xCE58, + 0x8741, 0xCE59, + 0x8742, 0xCE5A, + 0x8743, 0xCE5B, + 0x8744, 0xCE5C, + 0x8745, 0xCE5D, + 0x8746, 0xCE5E, + 0x874A, 0xCE5F, + 0x874B, 0xCE60, + 0x874D, 0xCE61, + 0x874F, 0xCE62, + 0x8750, 0xCE63, + 0x8751, 0xCE64, + 0x8752, 0xCE65, + 0x8754, 0xCE66, + 0x8755, 0xCE67, + 0x8756, 0xCE68, + 0x8758, 0xCE69, + 0x875A, 0xCE6A, + 0x875B, 0xCE6B, + 0x875C, 0xCE6C, + 0x875D, 0xCE6D, + 0x875E, 0xCE6E, + 0x875F, 0xCE6F, + 0x8761, 0xCE70, + 0x8762, 0xCE71, + 0x8766, 0xCE72, + 0x8767, 0xCE73, + 0x8768, 0xCE74, + 0x8769, 0xCE75, + 0x876A, 0xCE76, + 0x876B, 0xCE77, + 0x876C, 0xCE78, + 0x876D, 0xCE79, + 0x876F, 0xCE7A, + 0x8771, 0xCE7B, + 0x8772, 0xCE7C, + 0x8773, 0xCE7D, + 0x8775, 0xCE7E, + 0x8777, 0xCE80, + 0x8778, 0xCE81, + 0x8779, 0xCE82, + 0x877A, 0xCE83, + 0x877F, 0xCE84, + 0x8780, 0xCE85, + 0x8781, 0xCE86, + 0x8784, 0xCE87, + 0x8786, 0xCE88, + 0x8787, 0xCE89, + 0x8789, 0xCE8A, + 0x878A, 0xCE8B, + 0x878C, 0xCE8C, + 0x878E, 0xCE8D, + 0x878F, 0xCE8E, + 0x8790, 0xCE8F, + 0x8791, 0xCE90, + 0x8792, 0xCE91, + 0x8794, 0xCE92, + 0x8795, 0xCE93, + 0x8796, 0xCE94, + 0x8798, 0xCE95, + 0x8799, 0xCE96, + 0x879A, 0xCE97, + 0x879B, 0xCE98, + 0x879C, 0xCE99, + 0x879D, 0xCE9A, + 0x879E, 0xCE9B, + 0x87A0, 0xCE9C, + 0x87A1, 0xCE9D, + 0x87A2, 0xCE9E, + 0x87A3, 0xCE9F, + 0x87A4, 0xCEA0, + 0x87A5, 0xCF40, + 0x87A6, 0xCF41, + 0x87A7, 0xCF42, + 0x87A9, 0xCF43, + 0x87AA, 0xCF44, + 0x87AE, 0xCF45, + 0x87B0, 0xCF46, + 0x87B1, 0xCF47, + 0x87B2, 0xCF48, + 0x87B4, 0xCF49, + 0x87B6, 0xCF4A, + 0x87B7, 0xCF4B, + 0x87B8, 0xCF4C, + 0x87B9, 0xCF4D, + 0x87BB, 0xCF4E, + 0x87BC, 0xCF4F, + 0x87BE, 0xCF50, + 0x87BF, 0xCF51, + 0x87C1, 0xCF52, + 0x87C2, 0xCF53, + 0x87C3, 0xCF54, + 0x87C4, 0xCF55, + 0x87C5, 0xCF56, + 0x87C7, 0xCF57, + 0x87C8, 0xCF58, + 0x87C9, 0xCF59, + 0x87CC, 0xCF5A, + 0x87CD, 0xCF5B, + 0x87CE, 0xCF5C, + 0x87CF, 0xCF5D, + 0x87D0, 0xCF5E, + 0x87D4, 0xCF5F, + 0x87D5, 0xCF60, + 0x87D6, 0xCF61, + 0x87D7, 0xCF62, + 0x87D8, 0xCF63, + 0x87D9, 0xCF64, + 0x87DA, 0xCF65, + 0x87DC, 0xCF66, + 0x87DD, 0xCF67, + 0x87DE, 0xCF68, + 0x87DF, 0xCF69, + 0x87E1, 0xCF6A, + 0x87E2, 0xCF6B, + 0x87E3, 0xCF6C, + 0x87E4, 0xCF6D, + 0x87E6, 0xCF6E, + 0x87E7, 0xCF6F, + 0x87E8, 0xCF70, + 0x87E9, 0xCF71, + 0x87EB, 0xCF72, + 0x87EC, 0xCF73, + 0x87ED, 0xCF74, + 0x87EF, 0xCF75, + 0x87F0, 0xCF76, + 0x87F1, 0xCF77, + 0x87F2, 0xCF78, + 0x87F3, 0xCF79, + 0x87F4, 0xCF7A, + 0x87F5, 0xCF7B, + 0x87F6, 0xCF7C, + 0x87F7, 0xCF7D, + 0x87F8, 0xCF7E, + 0x87FA, 0xCF80, + 0x87FB, 0xCF81, + 0x87FC, 0xCF82, + 0x87FD, 0xCF83, + 0x87FF, 0xCF84, + 0x8800, 0xCF85, + 0x8801, 0xCF86, + 0x8802, 0xCF87, + 0x8804, 0xCF88, + 0x8805, 0xCF89, + 0x8806, 0xCF8A, + 0x8807, 0xCF8B, + 0x8808, 0xCF8C, + 0x8809, 0xCF8D, + 0x880B, 0xCF8E, + 0x880C, 0xCF8F, + 0x880D, 0xCF90, + 0x880E, 0xCF91, + 0x880F, 0xCF92, + 0x8810, 0xCF93, + 0x8811, 0xCF94, + 0x8812, 0xCF95, + 0x8814, 0xCF96, + 0x8817, 0xCF97, + 0x8818, 0xCF98, + 0x8819, 0xCF99, + 0x881A, 0xCF9A, + 0x881C, 0xCF9B, + 0x881D, 0xCF9C, + 0x881E, 0xCF9D, + 0x881F, 0xCF9E, + 0x8820, 0xCF9F, + 0x8823, 0xCFA0, + 0x8824, 0xD040, + 0x8825, 0xD041, + 0x8826, 0xD042, + 0x8827, 0xD043, + 0x8828, 0xD044, + 0x8829, 0xD045, + 0x882A, 0xD046, + 0x882B, 0xD047, + 0x882C, 0xD048, + 0x882D, 0xD049, + 0x882E, 0xD04A, + 0x882F, 0xD04B, + 0x8830, 0xD04C, + 0x8831, 0xD04D, + 0x8833, 0xD04E, + 0x8834, 0xD04F, + 0x8835, 0xD050, + 0x8836, 0xD051, + 0x8837, 0xD052, + 0x8838, 0xD053, + 0x883A, 0xD054, + 0x883B, 0xD055, + 0x883D, 0xD056, + 0x883E, 0xD057, + 0x883F, 0xD058, + 0x8841, 0xD059, + 0x8842, 0xD05A, + 0x8843, 0xD05B, + 0x8846, 0xD05C, + 0x8847, 0xD05D, + 0x8848, 0xD05E, + 0x8849, 0xD05F, + 0x884A, 0xD060, + 0x884B, 0xD061, + 0x884E, 0xD062, + 0x884F, 0xD063, + 0x8850, 0xD064, + 0x8851, 0xD065, + 0x8852, 0xD066, + 0x8853, 0xD067, + 0x8855, 0xD068, + 0x8856, 0xD069, + 0x8858, 0xD06A, + 0x885A, 0xD06B, + 0x885B, 0xD06C, + 0x885C, 0xD06D, + 0x885D, 0xD06E, + 0x885E, 0xD06F, + 0x885F, 0xD070, + 0x8860, 0xD071, + 0x8866, 0xD072, + 0x8867, 0xD073, + 0x886A, 0xD074, + 0x886D, 0xD075, + 0x886F, 0xD076, + 0x8871, 0xD077, + 0x8873, 0xD078, + 0x8874, 0xD079, + 0x8875, 0xD07A, + 0x8876, 0xD07B, + 0x8878, 0xD07C, + 0x8879, 0xD07D, + 0x887A, 0xD07E, + 0x887B, 0xD080, + 0x887C, 0xD081, + 0x8880, 0xD082, + 0x8883, 0xD083, + 0x8886, 0xD084, + 0x8887, 0xD085, + 0x8889, 0xD086, + 0x888A, 0xD087, + 0x888C, 0xD088, + 0x888E, 0xD089, + 0x888F, 0xD08A, + 0x8890, 0xD08B, + 0x8891, 0xD08C, + 0x8893, 0xD08D, + 0x8894, 0xD08E, + 0x8895, 0xD08F, + 0x8897, 0xD090, + 0x8898, 0xD091, + 0x8899, 0xD092, + 0x889A, 0xD093, + 0x889B, 0xD094, + 0x889D, 0xD095, + 0x889E, 0xD096, + 0x889F, 0xD097, + 0x88A0, 0xD098, + 0x88A1, 0xD099, + 0x88A3, 0xD09A, + 0x88A5, 0xD09B, + 0x88A6, 0xD09C, + 0x88A7, 0xD09D, + 0x88A8, 0xD09E, + 0x88A9, 0xD09F, + 0x88AA, 0xD0A0, + 0x88AC, 0xD140, + 0x88AE, 0xD141, + 0x88AF, 0xD142, + 0x88B0, 0xD143, + 0x88B2, 0xD144, + 0x88B3, 0xD145, + 0x88B4, 0xD146, + 0x88B5, 0xD147, + 0x88B6, 0xD148, + 0x88B8, 0xD149, + 0x88B9, 0xD14A, + 0x88BA, 0xD14B, + 0x88BB, 0xD14C, + 0x88BD, 0xD14D, + 0x88BE, 0xD14E, + 0x88BF, 0xD14F, + 0x88C0, 0xD150, + 0x88C3, 0xD151, + 0x88C4, 0xD152, + 0x88C7, 0xD153, + 0x88C8, 0xD154, + 0x88CA, 0xD155, + 0x88CB, 0xD156, + 0x88CC, 0xD157, + 0x88CD, 0xD158, + 0x88CF, 0xD159, + 0x88D0, 0xD15A, + 0x88D1, 0xD15B, + 0x88D3, 0xD15C, + 0x88D6, 0xD15D, + 0x88D7, 0xD15E, + 0x88DA, 0xD15F, + 0x88DB, 0xD160, + 0x88DC, 0xD161, + 0x88DD, 0xD162, + 0x88DE, 0xD163, + 0x88E0, 0xD164, + 0x88E1, 0xD165, + 0x88E6, 0xD166, + 0x88E7, 0xD167, + 0x88E9, 0xD168, + 0x88EA, 0xD169, + 0x88EB, 0xD16A, + 0x88EC, 0xD16B, + 0x88ED, 0xD16C, + 0x88EE, 0xD16D, + 0x88EF, 0xD16E, + 0x88F2, 0xD16F, + 0x88F5, 0xD170, + 0x88F6, 0xD171, + 0x88F7, 0xD172, + 0x88FA, 0xD173, + 0x88FB, 0xD174, + 0x88FD, 0xD175, + 0x88FF, 0xD176, + 0x8900, 0xD177, + 0x8901, 0xD178, + 0x8903, 0xD179, + 0x8904, 0xD17A, + 0x8905, 0xD17B, + 0x8906, 0xD17C, + 0x8907, 0xD17D, + 0x8908, 0xD17E, + 0x8909, 0xD180, + 0x890B, 0xD181, + 0x890C, 0xD182, + 0x890D, 0xD183, + 0x890E, 0xD184, + 0x890F, 0xD185, + 0x8911, 0xD186, + 0x8914, 0xD187, + 0x8915, 0xD188, + 0x8916, 0xD189, + 0x8917, 0xD18A, + 0x8918, 0xD18B, + 0x891C, 0xD18C, + 0x891D, 0xD18D, + 0x891E, 0xD18E, + 0x891F, 0xD18F, + 0x8920, 0xD190, + 0x8922, 0xD191, + 0x8923, 0xD192, + 0x8924, 0xD193, + 0x8926, 0xD194, + 0x8927, 0xD195, + 0x8928, 0xD196, + 0x8929, 0xD197, + 0x892C, 0xD198, + 0x892D, 0xD199, + 0x892E, 0xD19A, + 0x892F, 0xD19B, + 0x8931, 0xD19C, + 0x8932, 0xD19D, + 0x8933, 0xD19E, + 0x8935, 0xD19F, + 0x8937, 0xD1A0, + 0x8938, 0xD240, + 0x8939, 0xD241, + 0x893A, 0xD242, + 0x893B, 0xD243, + 0x893C, 0xD244, + 0x893D, 0xD245, + 0x893E, 0xD246, + 0x893F, 0xD247, + 0x8940, 0xD248, + 0x8942, 0xD249, + 0x8943, 0xD24A, + 0x8945, 0xD24B, + 0x8946, 0xD24C, + 0x8947, 0xD24D, + 0x8948, 0xD24E, + 0x8949, 0xD24F, + 0x894A, 0xD250, + 0x894B, 0xD251, + 0x894C, 0xD252, + 0x894D, 0xD253, + 0x894E, 0xD254, + 0x894F, 0xD255, + 0x8950, 0xD256, + 0x8951, 0xD257, + 0x8952, 0xD258, + 0x8953, 0xD259, + 0x8954, 0xD25A, + 0x8955, 0xD25B, + 0x8956, 0xD25C, + 0x8957, 0xD25D, + 0x8958, 0xD25E, + 0x8959, 0xD25F, + 0x895A, 0xD260, + 0x895B, 0xD261, + 0x895C, 0xD262, + 0x895D, 0xD263, + 0x8960, 0xD264, + 0x8961, 0xD265, + 0x8962, 0xD266, + 0x8963, 0xD267, + 0x8964, 0xD268, + 0x8965, 0xD269, + 0x8967, 0xD26A, + 0x8968, 0xD26B, + 0x8969, 0xD26C, + 0x896A, 0xD26D, + 0x896B, 0xD26E, + 0x896C, 0xD26F, + 0x896D, 0xD270, + 0x896E, 0xD271, + 0x896F, 0xD272, + 0x8970, 0xD273, + 0x8971, 0xD274, + 0x8972, 0xD275, + 0x8973, 0xD276, + 0x8974, 0xD277, + 0x8975, 0xD278, + 0x8976, 0xD279, + 0x8977, 0xD27A, + 0x8978, 0xD27B, + 0x8979, 0xD27C, + 0x897A, 0xD27D, + 0x897C, 0xD27E, + 0x897D, 0xD280, + 0x897E, 0xD281, + 0x8980, 0xD282, + 0x8982, 0xD283, + 0x8984, 0xD284, + 0x8985, 0xD285, + 0x8987, 0xD286, + 0x8988, 0xD287, + 0x8989, 0xD288, + 0x898A, 0xD289, + 0x898B, 0xD28A, + 0x898C, 0xD28B, + 0x898D, 0xD28C, + 0x898E, 0xD28D, + 0x898F, 0xD28E, + 0x8990, 0xD28F, + 0x8991, 0xD290, + 0x8992, 0xD291, + 0x8993, 0xD292, + 0x8994, 0xD293, + 0x8995, 0xD294, + 0x8996, 0xD295, + 0x8997, 0xD296, + 0x8998, 0xD297, + 0x8999, 0xD298, + 0x899A, 0xD299, + 0x899B, 0xD29A, + 0x899C, 0xD29B, + 0x899D, 0xD29C, + 0x899E, 0xD29D, + 0x899F, 0xD29E, + 0x89A0, 0xD29F, + 0x89A1, 0xD2A0, + 0x89A2, 0xD340, + 0x89A3, 0xD341, + 0x89A4, 0xD342, + 0x89A5, 0xD343, + 0x89A6, 0xD344, + 0x89A7, 0xD345, + 0x89A8, 0xD346, + 0x89A9, 0xD347, + 0x89AA, 0xD348, + 0x89AB, 0xD349, + 0x89AC, 0xD34A, + 0x89AD, 0xD34B, + 0x89AE, 0xD34C, + 0x89AF, 0xD34D, + 0x89B0, 0xD34E, + 0x89B1, 0xD34F, + 0x89B2, 0xD350, + 0x89B3, 0xD351, + 0x89B4, 0xD352, + 0x89B5, 0xD353, + 0x89B6, 0xD354, + 0x89B7, 0xD355, + 0x89B8, 0xD356, + 0x89B9, 0xD357, + 0x89BA, 0xD358, + 0x89BB, 0xD359, + 0x89BC, 0xD35A, + 0x89BD, 0xD35B, + 0x89BE, 0xD35C, + 0x89BF, 0xD35D, + 0x89C0, 0xD35E, + 0x89C3, 0xD35F, + 0x89CD, 0xD360, + 0x89D3, 0xD361, + 0x89D4, 0xD362, + 0x89D5, 0xD363, + 0x89D7, 0xD364, + 0x89D8, 0xD365, + 0x89D9, 0xD366, + 0x89DB, 0xD367, + 0x89DD, 0xD368, + 0x89DF, 0xD369, + 0x89E0, 0xD36A, + 0x89E1, 0xD36B, + 0x89E2, 0xD36C, + 0x89E4, 0xD36D, + 0x89E7, 0xD36E, + 0x89E8, 0xD36F, + 0x89E9, 0xD370, + 0x89EA, 0xD371, + 0x89EC, 0xD372, + 0x89ED, 0xD373, + 0x89EE, 0xD374, + 0x89F0, 0xD375, + 0x89F1, 0xD376, + 0x89F2, 0xD377, + 0x89F4, 0xD378, + 0x89F5, 0xD379, + 0x89F6, 0xD37A, + 0x89F7, 0xD37B, + 0x89F8, 0xD37C, + 0x89F9, 0xD37D, + 0x89FA, 0xD37E, + 0x89FB, 0xD380, + 0x89FC, 0xD381, + 0x89FD, 0xD382, + 0x89FE, 0xD383, + 0x89FF, 0xD384, + 0x8A01, 0xD385, + 0x8A02, 0xD386, + 0x8A03, 0xD387, + 0x8A04, 0xD388, + 0x8A05, 0xD389, + 0x8A06, 0xD38A, + 0x8A08, 0xD38B, + 0x8A09, 0xD38C, + 0x8A0A, 0xD38D, + 0x8A0B, 0xD38E, + 0x8A0C, 0xD38F, + 0x8A0D, 0xD390, + 0x8A0E, 0xD391, + 0x8A0F, 0xD392, + 0x8A10, 0xD393, + 0x8A11, 0xD394, + 0x8A12, 0xD395, + 0x8A13, 0xD396, + 0x8A14, 0xD397, + 0x8A15, 0xD398, + 0x8A16, 0xD399, + 0x8A17, 0xD39A, + 0x8A18, 0xD39B, + 0x8A19, 0xD39C, + 0x8A1A, 0xD39D, + 0x8A1B, 0xD39E, + 0x8A1C, 0xD39F, + 0x8A1D, 0xD3A0, + 0x8A1E, 0xD440, + 0x8A1F, 0xD441, + 0x8A20, 0xD442, + 0x8A21, 0xD443, + 0x8A22, 0xD444, + 0x8A23, 0xD445, + 0x8A24, 0xD446, + 0x8A25, 0xD447, + 0x8A26, 0xD448, + 0x8A27, 0xD449, + 0x8A28, 0xD44A, + 0x8A29, 0xD44B, + 0x8A2A, 0xD44C, + 0x8A2B, 0xD44D, + 0x8A2C, 0xD44E, + 0x8A2D, 0xD44F, + 0x8A2E, 0xD450, + 0x8A2F, 0xD451, + 0x8A30, 0xD452, + 0x8A31, 0xD453, + 0x8A32, 0xD454, + 0x8A33, 0xD455, + 0x8A34, 0xD456, + 0x8A35, 0xD457, + 0x8A36, 0xD458, + 0x8A37, 0xD459, + 0x8A38, 0xD45A, + 0x8A39, 0xD45B, + 0x8A3A, 0xD45C, + 0x8A3B, 0xD45D, + 0x8A3C, 0xD45E, + 0x8A3D, 0xD45F, + 0x8A3F, 0xD460, + 0x8A40, 0xD461, + 0x8A41, 0xD462, + 0x8A42, 0xD463, + 0x8A43, 0xD464, + 0x8A44, 0xD465, + 0x8A45, 0xD466, + 0x8A46, 0xD467, + 0x8A47, 0xD468, + 0x8A49, 0xD469, + 0x8A4A, 0xD46A, + 0x8A4B, 0xD46B, + 0x8A4C, 0xD46C, + 0x8A4D, 0xD46D, + 0x8A4E, 0xD46E, + 0x8A4F, 0xD46F, + 0x8A50, 0xD470, + 0x8A51, 0xD471, + 0x8A52, 0xD472, + 0x8A53, 0xD473, + 0x8A54, 0xD474, + 0x8A55, 0xD475, + 0x8A56, 0xD476, + 0x8A57, 0xD477, + 0x8A58, 0xD478, + 0x8A59, 0xD479, + 0x8A5A, 0xD47A, + 0x8A5B, 0xD47B, + 0x8A5C, 0xD47C, + 0x8A5D, 0xD47D, + 0x8A5E, 0xD47E, + 0x8A5F, 0xD480, + 0x8A60, 0xD481, + 0x8A61, 0xD482, + 0x8A62, 0xD483, + 0x8A63, 0xD484, + 0x8A64, 0xD485, + 0x8A65, 0xD486, + 0x8A66, 0xD487, + 0x8A67, 0xD488, + 0x8A68, 0xD489, + 0x8A69, 0xD48A, + 0x8A6A, 0xD48B, + 0x8A6B, 0xD48C, + 0x8A6C, 0xD48D, + 0x8A6D, 0xD48E, + 0x8A6E, 0xD48F, + 0x8A6F, 0xD490, + 0x8A70, 0xD491, + 0x8A71, 0xD492, + 0x8A72, 0xD493, + 0x8A73, 0xD494, + 0x8A74, 0xD495, + 0x8A75, 0xD496, + 0x8A76, 0xD497, + 0x8A77, 0xD498, + 0x8A78, 0xD499, + 0x8A7A, 0xD49A, + 0x8A7B, 0xD49B, + 0x8A7C, 0xD49C, + 0x8A7D, 0xD49D, + 0x8A7E, 0xD49E, + 0x8A7F, 0xD49F, + 0x8A80, 0xD4A0, + 0x8A81, 0xD540, + 0x8A82, 0xD541, + 0x8A83, 0xD542, + 0x8A84, 0xD543, + 0x8A85, 0xD544, + 0x8A86, 0xD545, + 0x8A87, 0xD546, + 0x8A88, 0xD547, + 0x8A8B, 0xD548, + 0x8A8C, 0xD549, + 0x8A8D, 0xD54A, + 0x8A8E, 0xD54B, + 0x8A8F, 0xD54C, + 0x8A90, 0xD54D, + 0x8A91, 0xD54E, + 0x8A92, 0xD54F, + 0x8A94, 0xD550, + 0x8A95, 0xD551, + 0x8A96, 0xD552, + 0x8A97, 0xD553, + 0x8A98, 0xD554, + 0x8A99, 0xD555, + 0x8A9A, 0xD556, + 0x8A9B, 0xD557, + 0x8A9C, 0xD558, + 0x8A9D, 0xD559, + 0x8A9E, 0xD55A, + 0x8A9F, 0xD55B, + 0x8AA0, 0xD55C, + 0x8AA1, 0xD55D, + 0x8AA2, 0xD55E, + 0x8AA3, 0xD55F, + 0x8AA4, 0xD560, + 0x8AA5, 0xD561, + 0x8AA6, 0xD562, + 0x8AA7, 0xD563, + 0x8AA8, 0xD564, + 0x8AA9, 0xD565, + 0x8AAA, 0xD566, + 0x8AAB, 0xD567, + 0x8AAC, 0xD568, + 0x8AAD, 0xD569, + 0x8AAE, 0xD56A, + 0x8AAF, 0xD56B, + 0x8AB0, 0xD56C, + 0x8AB1, 0xD56D, + 0x8AB2, 0xD56E, + 0x8AB3, 0xD56F, + 0x8AB4, 0xD570, + 0x8AB5, 0xD571, + 0x8AB6, 0xD572, + 0x8AB7, 0xD573, + 0x8AB8, 0xD574, + 0x8AB9, 0xD575, + 0x8ABA, 0xD576, + 0x8ABB, 0xD577, + 0x8ABC, 0xD578, + 0x8ABD, 0xD579, + 0x8ABE, 0xD57A, + 0x8ABF, 0xD57B, + 0x8AC0, 0xD57C, + 0x8AC1, 0xD57D, + 0x8AC2, 0xD57E, + 0x8AC3, 0xD580, + 0x8AC4, 0xD581, + 0x8AC5, 0xD582, + 0x8AC6, 0xD583, + 0x8AC7, 0xD584, + 0x8AC8, 0xD585, + 0x8AC9, 0xD586, + 0x8ACA, 0xD587, + 0x8ACB, 0xD588, + 0x8ACC, 0xD589, + 0x8ACD, 0xD58A, + 0x8ACE, 0xD58B, + 0x8ACF, 0xD58C, + 0x8AD0, 0xD58D, + 0x8AD1, 0xD58E, + 0x8AD2, 0xD58F, + 0x8AD3, 0xD590, + 0x8AD4, 0xD591, + 0x8AD5, 0xD592, + 0x8AD6, 0xD593, + 0x8AD7, 0xD594, + 0x8AD8, 0xD595, + 0x8AD9, 0xD596, + 0x8ADA, 0xD597, + 0x8ADB, 0xD598, + 0x8ADC, 0xD599, + 0x8ADD, 0xD59A, + 0x8ADE, 0xD59B, + 0x8ADF, 0xD59C, + 0x8AE0, 0xD59D, + 0x8AE1, 0xD59E, + 0x8AE2, 0xD59F, + 0x8AE3, 0xD5A0, + 0x8AE4, 0xD640, + 0x8AE5, 0xD641, + 0x8AE6, 0xD642, + 0x8AE7, 0xD643, + 0x8AE8, 0xD644, + 0x8AE9, 0xD645, + 0x8AEA, 0xD646, + 0x8AEB, 0xD647, + 0x8AEC, 0xD648, + 0x8AED, 0xD649, + 0x8AEE, 0xD64A, + 0x8AEF, 0xD64B, + 0x8AF0, 0xD64C, + 0x8AF1, 0xD64D, + 0x8AF2, 0xD64E, + 0x8AF3, 0xD64F, + 0x8AF4, 0xD650, + 0x8AF5, 0xD651, + 0x8AF6, 0xD652, + 0x8AF7, 0xD653, + 0x8AF8, 0xD654, + 0x8AF9, 0xD655, + 0x8AFA, 0xD656, + 0x8AFB, 0xD657, + 0x8AFC, 0xD658, + 0x8AFD, 0xD659, + 0x8AFE, 0xD65A, + 0x8AFF, 0xD65B, + 0x8B00, 0xD65C, + 0x8B01, 0xD65D, + 0x8B02, 0xD65E, + 0x8B03, 0xD65F, + 0x8B04, 0xD660, + 0x8B05, 0xD661, + 0x8B06, 0xD662, + 0x8B08, 0xD663, + 0x8B09, 0xD664, + 0x8B0A, 0xD665, + 0x8B0B, 0xD666, + 0x8B0C, 0xD667, + 0x8B0D, 0xD668, + 0x8B0E, 0xD669, + 0x8B0F, 0xD66A, + 0x8B10, 0xD66B, + 0x8B11, 0xD66C, + 0x8B12, 0xD66D, + 0x8B13, 0xD66E, + 0x8B14, 0xD66F, + 0x8B15, 0xD670, + 0x8B16, 0xD671, + 0x8B17, 0xD672, + 0x8B18, 0xD673, + 0x8B19, 0xD674, + 0x8B1A, 0xD675, + 0x8B1B, 0xD676, + 0x8B1C, 0xD677, + 0x8B1D, 0xD678, + 0x8B1E, 0xD679, + 0x8B1F, 0xD67A, + 0x8B20, 0xD67B, + 0x8B21, 0xD67C, + 0x8B22, 0xD67D, + 0x8B23, 0xD67E, + 0x8B24, 0xD680, + 0x8B25, 0xD681, + 0x8B27, 0xD682, + 0x8B28, 0xD683, + 0x8B29, 0xD684, + 0x8B2A, 0xD685, + 0x8B2B, 0xD686, + 0x8B2C, 0xD687, + 0x8B2D, 0xD688, + 0x8B2E, 0xD689, + 0x8B2F, 0xD68A, + 0x8B30, 0xD68B, + 0x8B31, 0xD68C, + 0x8B32, 0xD68D, + 0x8B33, 0xD68E, + 0x8B34, 0xD68F, + 0x8B35, 0xD690, + 0x8B36, 0xD691, + 0x8B37, 0xD692, + 0x8B38, 0xD693, + 0x8B39, 0xD694, + 0x8B3A, 0xD695, + 0x8B3B, 0xD696, + 0x8B3C, 0xD697, + 0x8B3D, 0xD698, + 0x8B3E, 0xD699, + 0x8B3F, 0xD69A, + 0x8B40, 0xD69B, + 0x8B41, 0xD69C, + 0x8B42, 0xD69D, + 0x8B43, 0xD69E, + 0x8B44, 0xD69F, + 0x8B45, 0xD6A0, + 0x8B46, 0xD740, + 0x8B47, 0xD741, + 0x8B48, 0xD742, + 0x8B49, 0xD743, + 0x8B4A, 0xD744, + 0x8B4B, 0xD745, + 0x8B4C, 0xD746, + 0x8B4D, 0xD747, + 0x8B4E, 0xD748, + 0x8B4F, 0xD749, + 0x8B50, 0xD74A, + 0x8B51, 0xD74B, + 0x8B52, 0xD74C, + 0x8B53, 0xD74D, + 0x8B54, 0xD74E, + 0x8B55, 0xD74F, + 0x8B56, 0xD750, + 0x8B57, 0xD751, + 0x8B58, 0xD752, + 0x8B59, 0xD753, + 0x8B5A, 0xD754, + 0x8B5B, 0xD755, + 0x8B5C, 0xD756, + 0x8B5D, 0xD757, + 0x8B5E, 0xD758, + 0x8B5F, 0xD759, + 0x8B60, 0xD75A, + 0x8B61, 0xD75B, + 0x8B62, 0xD75C, + 0x8B63, 0xD75D, + 0x8B64, 0xD75E, + 0x8B65, 0xD75F, + 0x8B67, 0xD760, + 0x8B68, 0xD761, + 0x8B69, 0xD762, + 0x8B6A, 0xD763, + 0x8B6B, 0xD764, + 0x8B6D, 0xD765, + 0x8B6E, 0xD766, + 0x8B6F, 0xD767, + 0x8B70, 0xD768, + 0x8B71, 0xD769, + 0x8B72, 0xD76A, + 0x8B73, 0xD76B, + 0x8B74, 0xD76C, + 0x8B75, 0xD76D, + 0x8B76, 0xD76E, + 0x8B77, 0xD76F, + 0x8B78, 0xD770, + 0x8B79, 0xD771, + 0x8B7A, 0xD772, + 0x8B7B, 0xD773, + 0x8B7C, 0xD774, + 0x8B7D, 0xD775, + 0x8B7E, 0xD776, + 0x8B7F, 0xD777, + 0x8B80, 0xD778, + 0x8B81, 0xD779, + 0x8B82, 0xD77A, + 0x8B83, 0xD77B, + 0x8B84, 0xD77C, + 0x8B85, 0xD77D, + 0x8B86, 0xD77E, + 0x8B87, 0xD780, + 0x8B88, 0xD781, + 0x8B89, 0xD782, + 0x8B8A, 0xD783, + 0x8B8B, 0xD784, + 0x8B8C, 0xD785, + 0x8B8D, 0xD786, + 0x8B8E, 0xD787, + 0x8B8F, 0xD788, + 0x8B90, 0xD789, + 0x8B91, 0xD78A, + 0x8B92, 0xD78B, + 0x8B93, 0xD78C, + 0x8B94, 0xD78D, + 0x8B95, 0xD78E, + 0x8B96, 0xD78F, + 0x8B97, 0xD790, + 0x8B98, 0xD791, + 0x8B99, 0xD792, + 0x8B9A, 0xD793, + 0x8B9B, 0xD794, + 0x8B9C, 0xD795, + 0x8B9D, 0xD796, + 0x8B9E, 0xD797, + 0x8B9F, 0xD798, + 0x8BAC, 0xD799, + 0x8BB1, 0xD79A, + 0x8BBB, 0xD79B, + 0x8BC7, 0xD79C, + 0x8BD0, 0xD79D, + 0x8BEA, 0xD79E, + 0x8C09, 0xD79F, + 0x8C1E, 0xD7A0, + 0x8C38, 0xD840, + 0x8C39, 0xD841, + 0x8C3A, 0xD842, + 0x8C3B, 0xD843, + 0x8C3C, 0xD844, + 0x8C3D, 0xD845, + 0x8C3E, 0xD846, + 0x8C3F, 0xD847, + 0x8C40, 0xD848, + 0x8C42, 0xD849, + 0x8C43, 0xD84A, + 0x8C44, 0xD84B, + 0x8C45, 0xD84C, + 0x8C48, 0xD84D, + 0x8C4A, 0xD84E, + 0x8C4B, 0xD84F, + 0x8C4D, 0xD850, + 0x8C4E, 0xD851, + 0x8C4F, 0xD852, + 0x8C50, 0xD853, + 0x8C51, 0xD854, + 0x8C52, 0xD855, + 0x8C53, 0xD856, + 0x8C54, 0xD857, + 0x8C56, 0xD858, + 0x8C57, 0xD859, + 0x8C58, 0xD85A, + 0x8C59, 0xD85B, + 0x8C5B, 0xD85C, + 0x8C5C, 0xD85D, + 0x8C5D, 0xD85E, + 0x8C5E, 0xD85F, + 0x8C5F, 0xD860, + 0x8C60, 0xD861, + 0x8C63, 0xD862, + 0x8C64, 0xD863, + 0x8C65, 0xD864, + 0x8C66, 0xD865, + 0x8C67, 0xD866, + 0x8C68, 0xD867, + 0x8C69, 0xD868, + 0x8C6C, 0xD869, + 0x8C6D, 0xD86A, + 0x8C6E, 0xD86B, + 0x8C6F, 0xD86C, + 0x8C70, 0xD86D, + 0x8C71, 0xD86E, + 0x8C72, 0xD86F, + 0x8C74, 0xD870, + 0x8C75, 0xD871, + 0x8C76, 0xD872, + 0x8C77, 0xD873, + 0x8C7B, 0xD874, + 0x8C7C, 0xD875, + 0x8C7D, 0xD876, + 0x8C7E, 0xD877, + 0x8C7F, 0xD878, + 0x8C80, 0xD879, + 0x8C81, 0xD87A, + 0x8C83, 0xD87B, + 0x8C84, 0xD87C, + 0x8C86, 0xD87D, + 0x8C87, 0xD87E, + 0x8C88, 0xD880, + 0x8C8B, 0xD881, + 0x8C8D, 0xD882, + 0x8C8E, 0xD883, + 0x8C8F, 0xD884, + 0x8C90, 0xD885, + 0x8C91, 0xD886, + 0x8C92, 0xD887, + 0x8C93, 0xD888, + 0x8C95, 0xD889, + 0x8C96, 0xD88A, + 0x8C97, 0xD88B, + 0x8C99, 0xD88C, + 0x8C9A, 0xD88D, + 0x8C9B, 0xD88E, + 0x8C9C, 0xD88F, + 0x8C9D, 0xD890, + 0x8C9E, 0xD891, + 0x8C9F, 0xD892, + 0x8CA0, 0xD893, + 0x8CA1, 0xD894, + 0x8CA2, 0xD895, + 0x8CA3, 0xD896, + 0x8CA4, 0xD897, + 0x8CA5, 0xD898, + 0x8CA6, 0xD899, + 0x8CA7, 0xD89A, + 0x8CA8, 0xD89B, + 0x8CA9, 0xD89C, + 0x8CAA, 0xD89D, + 0x8CAB, 0xD89E, + 0x8CAC, 0xD89F, + 0x8CAD, 0xD8A0, + 0x8CAE, 0xD940, + 0x8CAF, 0xD941, + 0x8CB0, 0xD942, + 0x8CB1, 0xD943, + 0x8CB2, 0xD944, + 0x8CB3, 0xD945, + 0x8CB4, 0xD946, + 0x8CB5, 0xD947, + 0x8CB6, 0xD948, + 0x8CB7, 0xD949, + 0x8CB8, 0xD94A, + 0x8CB9, 0xD94B, + 0x8CBA, 0xD94C, + 0x8CBB, 0xD94D, + 0x8CBC, 0xD94E, + 0x8CBD, 0xD94F, + 0x8CBE, 0xD950, + 0x8CBF, 0xD951, + 0x8CC0, 0xD952, + 0x8CC1, 0xD953, + 0x8CC2, 0xD954, + 0x8CC3, 0xD955, + 0x8CC4, 0xD956, + 0x8CC5, 0xD957, + 0x8CC6, 0xD958, + 0x8CC7, 0xD959, + 0x8CC8, 0xD95A, + 0x8CC9, 0xD95B, + 0x8CCA, 0xD95C, + 0x8CCB, 0xD95D, + 0x8CCC, 0xD95E, + 0x8CCD, 0xD95F, + 0x8CCE, 0xD960, + 0x8CCF, 0xD961, + 0x8CD0, 0xD962, + 0x8CD1, 0xD963, + 0x8CD2, 0xD964, + 0x8CD3, 0xD965, + 0x8CD4, 0xD966, + 0x8CD5, 0xD967, + 0x8CD6, 0xD968, + 0x8CD7, 0xD969, + 0x8CD8, 0xD96A, + 0x8CD9, 0xD96B, + 0x8CDA, 0xD96C, + 0x8CDB, 0xD96D, + 0x8CDC, 0xD96E, + 0x8CDD, 0xD96F, + 0x8CDE, 0xD970, + 0x8CDF, 0xD971, + 0x8CE0, 0xD972, + 0x8CE1, 0xD973, + 0x8CE2, 0xD974, + 0x8CE3, 0xD975, + 0x8CE4, 0xD976, + 0x8CE5, 0xD977, + 0x8CE6, 0xD978, + 0x8CE7, 0xD979, + 0x8CE8, 0xD97A, + 0x8CE9, 0xD97B, + 0x8CEA, 0xD97C, + 0x8CEB, 0xD97D, + 0x8CEC, 0xD97E, + 0x8CED, 0xD980, + 0x8CEE, 0xD981, + 0x8CEF, 0xD982, + 0x8CF0, 0xD983, + 0x8CF1, 0xD984, + 0x8CF2, 0xD985, + 0x8CF3, 0xD986, + 0x8CF4, 0xD987, + 0x8CF5, 0xD988, + 0x8CF6, 0xD989, + 0x8CF7, 0xD98A, + 0x8CF8, 0xD98B, + 0x8CF9, 0xD98C, + 0x8CFA, 0xD98D, + 0x8CFB, 0xD98E, + 0x8CFC, 0xD98F, + 0x8CFD, 0xD990, + 0x8CFE, 0xD991, + 0x8CFF, 0xD992, + 0x8D00, 0xD993, + 0x8D01, 0xD994, + 0x8D02, 0xD995, + 0x8D03, 0xD996, + 0x8D04, 0xD997, + 0x8D05, 0xD998, + 0x8D06, 0xD999, + 0x8D07, 0xD99A, + 0x8D08, 0xD99B, + 0x8D09, 0xD99C, + 0x8D0A, 0xD99D, + 0x8D0B, 0xD99E, + 0x8D0C, 0xD99F, + 0x8D0D, 0xD9A0, + 0x8D0E, 0xDA40, + 0x8D0F, 0xDA41, + 0x8D10, 0xDA42, + 0x8D11, 0xDA43, + 0x8D12, 0xDA44, + 0x8D13, 0xDA45, + 0x8D14, 0xDA46, + 0x8D15, 0xDA47, + 0x8D16, 0xDA48, + 0x8D17, 0xDA49, + 0x8D18, 0xDA4A, + 0x8D19, 0xDA4B, + 0x8D1A, 0xDA4C, + 0x8D1B, 0xDA4D, + 0x8D1C, 0xDA4E, + 0x8D20, 0xDA4F, + 0x8D51, 0xDA50, + 0x8D52, 0xDA51, + 0x8D57, 0xDA52, + 0x8D5F, 0xDA53, + 0x8D65, 0xDA54, + 0x8D68, 0xDA55, + 0x8D69, 0xDA56, + 0x8D6A, 0xDA57, + 0x8D6C, 0xDA58, + 0x8D6E, 0xDA59, + 0x8D6F, 0xDA5A, + 0x8D71, 0xDA5B, + 0x8D72, 0xDA5C, + 0x8D78, 0xDA5D, + 0x8D79, 0xDA5E, + 0x8D7A, 0xDA5F, + 0x8D7B, 0xDA60, + 0x8D7C, 0xDA61, + 0x8D7D, 0xDA62, + 0x8D7E, 0xDA63, + 0x8D7F, 0xDA64, + 0x8D80, 0xDA65, + 0x8D82, 0xDA66, + 0x8D83, 0xDA67, + 0x8D86, 0xDA68, + 0x8D87, 0xDA69, + 0x8D88, 0xDA6A, + 0x8D89, 0xDA6B, + 0x8D8C, 0xDA6C, + 0x8D8D, 0xDA6D, + 0x8D8E, 0xDA6E, + 0x8D8F, 0xDA6F, + 0x8D90, 0xDA70, + 0x8D92, 0xDA71, + 0x8D93, 0xDA72, + 0x8D95, 0xDA73, + 0x8D96, 0xDA74, + 0x8D97, 0xDA75, + 0x8D98, 0xDA76, + 0x8D99, 0xDA77, + 0x8D9A, 0xDA78, + 0x8D9B, 0xDA79, + 0x8D9C, 0xDA7A, + 0x8D9D, 0xDA7B, + 0x8D9E, 0xDA7C, + 0x8DA0, 0xDA7D, + 0x8DA1, 0xDA7E, + 0x8DA2, 0xDA80, + 0x8DA4, 0xDA81, + 0x8DA5, 0xDA82, + 0x8DA6, 0xDA83, + 0x8DA7, 0xDA84, + 0x8DA8, 0xDA85, + 0x8DA9, 0xDA86, + 0x8DAA, 0xDA87, + 0x8DAB, 0xDA88, + 0x8DAC, 0xDA89, + 0x8DAD, 0xDA8A, + 0x8DAE, 0xDA8B, + 0x8DAF, 0xDA8C, + 0x8DB0, 0xDA8D, + 0x8DB2, 0xDA8E, + 0x8DB6, 0xDA8F, + 0x8DB7, 0xDA90, + 0x8DB9, 0xDA91, + 0x8DBB, 0xDA92, + 0x8DBD, 0xDA93, + 0x8DC0, 0xDA94, + 0x8DC1, 0xDA95, + 0x8DC2, 0xDA96, + 0x8DC5, 0xDA97, + 0x8DC7, 0xDA98, + 0x8DC8, 0xDA99, + 0x8DC9, 0xDA9A, + 0x8DCA, 0xDA9B, + 0x8DCD, 0xDA9C, + 0x8DD0, 0xDA9D, + 0x8DD2, 0xDA9E, + 0x8DD3, 0xDA9F, + 0x8DD4, 0xDAA0, + 0x8DD5, 0xDB40, + 0x8DD8, 0xDB41, + 0x8DD9, 0xDB42, + 0x8DDC, 0xDB43, + 0x8DE0, 0xDB44, + 0x8DE1, 0xDB45, + 0x8DE2, 0xDB46, + 0x8DE5, 0xDB47, + 0x8DE6, 0xDB48, + 0x8DE7, 0xDB49, + 0x8DE9, 0xDB4A, + 0x8DED, 0xDB4B, + 0x8DEE, 0xDB4C, + 0x8DF0, 0xDB4D, + 0x8DF1, 0xDB4E, + 0x8DF2, 0xDB4F, + 0x8DF4, 0xDB50, + 0x8DF6, 0xDB51, + 0x8DFC, 0xDB52, + 0x8DFE, 0xDB53, + 0x8DFF, 0xDB54, + 0x8E00, 0xDB55, + 0x8E01, 0xDB56, + 0x8E02, 0xDB57, + 0x8E03, 0xDB58, + 0x8E04, 0xDB59, + 0x8E06, 0xDB5A, + 0x8E07, 0xDB5B, + 0x8E08, 0xDB5C, + 0x8E0B, 0xDB5D, + 0x8E0D, 0xDB5E, + 0x8E0E, 0xDB5F, + 0x8E10, 0xDB60, + 0x8E11, 0xDB61, + 0x8E12, 0xDB62, + 0x8E13, 0xDB63, + 0x8E15, 0xDB64, + 0x8E16, 0xDB65, + 0x8E17, 0xDB66, + 0x8E18, 0xDB67, + 0x8E19, 0xDB68, + 0x8E1A, 0xDB69, + 0x8E1B, 0xDB6A, + 0x8E1C, 0xDB6B, + 0x8E20, 0xDB6C, + 0x8E21, 0xDB6D, + 0x8E24, 0xDB6E, + 0x8E25, 0xDB6F, + 0x8E26, 0xDB70, + 0x8E27, 0xDB71, + 0x8E28, 0xDB72, + 0x8E2B, 0xDB73, + 0x8E2D, 0xDB74, + 0x8E30, 0xDB75, + 0x8E32, 0xDB76, + 0x8E33, 0xDB77, + 0x8E34, 0xDB78, + 0x8E36, 0xDB79, + 0x8E37, 0xDB7A, + 0x8E38, 0xDB7B, + 0x8E3B, 0xDB7C, + 0x8E3C, 0xDB7D, + 0x8E3E, 0xDB7E, + 0x8E3F, 0xDB80, + 0x8E43, 0xDB81, + 0x8E45, 0xDB82, + 0x8E46, 0xDB83, + 0x8E4C, 0xDB84, + 0x8E4D, 0xDB85, + 0x8E4E, 0xDB86, + 0x8E4F, 0xDB87, + 0x8E50, 0xDB88, + 0x8E53, 0xDB89, + 0x8E54, 0xDB8A, + 0x8E55, 0xDB8B, + 0x8E56, 0xDB8C, + 0x8E57, 0xDB8D, + 0x8E58, 0xDB8E, + 0x8E5A, 0xDB8F, + 0x8E5B, 0xDB90, + 0x8E5C, 0xDB91, + 0x8E5D, 0xDB92, + 0x8E5E, 0xDB93, + 0x8E5F, 0xDB94, + 0x8E60, 0xDB95, + 0x8E61, 0xDB96, + 0x8E62, 0xDB97, + 0x8E63, 0xDB98, + 0x8E64, 0xDB99, + 0x8E65, 0xDB9A, + 0x8E67, 0xDB9B, + 0x8E68, 0xDB9C, + 0x8E6A, 0xDB9D, + 0x8E6B, 0xDB9E, + 0x8E6E, 0xDB9F, + 0x8E71, 0xDBA0, + 0x8E73, 0xDC40, + 0x8E75, 0xDC41, + 0x8E77, 0xDC42, + 0x8E78, 0xDC43, + 0x8E79, 0xDC44, + 0x8E7A, 0xDC45, + 0x8E7B, 0xDC46, + 0x8E7D, 0xDC47, + 0x8E7E, 0xDC48, + 0x8E80, 0xDC49, + 0x8E82, 0xDC4A, + 0x8E83, 0xDC4B, + 0x8E84, 0xDC4C, + 0x8E86, 0xDC4D, + 0x8E88, 0xDC4E, + 0x8E89, 0xDC4F, + 0x8E8A, 0xDC50, + 0x8E8B, 0xDC51, + 0x8E8C, 0xDC52, + 0x8E8D, 0xDC53, + 0x8E8E, 0xDC54, + 0x8E91, 0xDC55, + 0x8E92, 0xDC56, + 0x8E93, 0xDC57, + 0x8E95, 0xDC58, + 0x8E96, 0xDC59, + 0x8E97, 0xDC5A, + 0x8E98, 0xDC5B, + 0x8E99, 0xDC5C, + 0x8E9A, 0xDC5D, + 0x8E9B, 0xDC5E, + 0x8E9D, 0xDC5F, + 0x8E9F, 0xDC60, + 0x8EA0, 0xDC61, + 0x8EA1, 0xDC62, + 0x8EA2, 0xDC63, + 0x8EA3, 0xDC64, + 0x8EA4, 0xDC65, + 0x8EA5, 0xDC66, + 0x8EA6, 0xDC67, + 0x8EA7, 0xDC68, + 0x8EA8, 0xDC69, + 0x8EA9, 0xDC6A, + 0x8EAA, 0xDC6B, + 0x8EAD, 0xDC6C, + 0x8EAE, 0xDC6D, + 0x8EB0, 0xDC6E, + 0x8EB1, 0xDC6F, + 0x8EB3, 0xDC70, + 0x8EB4, 0xDC71, + 0x8EB5, 0xDC72, + 0x8EB6, 0xDC73, + 0x8EB7, 0xDC74, + 0x8EB8, 0xDC75, + 0x8EB9, 0xDC76, + 0x8EBB, 0xDC77, + 0x8EBC, 0xDC78, + 0x8EBD, 0xDC79, + 0x8EBE, 0xDC7A, + 0x8EBF, 0xDC7B, + 0x8EC0, 0xDC7C, + 0x8EC1, 0xDC7D, + 0x8EC2, 0xDC7E, + 0x8EC3, 0xDC80, + 0x8EC4, 0xDC81, + 0x8EC5, 0xDC82, + 0x8EC6, 0xDC83, + 0x8EC7, 0xDC84, + 0x8EC8, 0xDC85, + 0x8EC9, 0xDC86, + 0x8ECA, 0xDC87, + 0x8ECB, 0xDC88, + 0x8ECC, 0xDC89, + 0x8ECD, 0xDC8A, + 0x8ECF, 0xDC8B, + 0x8ED0, 0xDC8C, + 0x8ED1, 0xDC8D, + 0x8ED2, 0xDC8E, + 0x8ED3, 0xDC8F, + 0x8ED4, 0xDC90, + 0x8ED5, 0xDC91, + 0x8ED6, 0xDC92, + 0x8ED7, 0xDC93, + 0x8ED8, 0xDC94, + 0x8ED9, 0xDC95, + 0x8EDA, 0xDC96, + 0x8EDB, 0xDC97, + 0x8EDC, 0xDC98, + 0x8EDD, 0xDC99, + 0x8EDE, 0xDC9A, + 0x8EDF, 0xDC9B, + 0x8EE0, 0xDC9C, + 0x8EE1, 0xDC9D, + 0x8EE2, 0xDC9E, + 0x8EE3, 0xDC9F, + 0x8EE4, 0xDCA0, + 0x8EE5, 0xDD40, + 0x8EE6, 0xDD41, + 0x8EE7, 0xDD42, + 0x8EE8, 0xDD43, + 0x8EE9, 0xDD44, + 0x8EEA, 0xDD45, + 0x8EEB, 0xDD46, + 0x8EEC, 0xDD47, + 0x8EED, 0xDD48, + 0x8EEE, 0xDD49, + 0x8EEF, 0xDD4A, + 0x8EF0, 0xDD4B, + 0x8EF1, 0xDD4C, + 0x8EF2, 0xDD4D, + 0x8EF3, 0xDD4E, + 0x8EF4, 0xDD4F, + 0x8EF5, 0xDD50, + 0x8EF6, 0xDD51, + 0x8EF7, 0xDD52, + 0x8EF8, 0xDD53, + 0x8EF9, 0xDD54, + 0x8EFA, 0xDD55, + 0x8EFB, 0xDD56, + 0x8EFC, 0xDD57, + 0x8EFD, 0xDD58, + 0x8EFE, 0xDD59, + 0x8EFF, 0xDD5A, + 0x8F00, 0xDD5B, + 0x8F01, 0xDD5C, + 0x8F02, 0xDD5D, + 0x8F03, 0xDD5E, + 0x8F04, 0xDD5F, + 0x8F05, 0xDD60, + 0x8F06, 0xDD61, + 0x8F07, 0xDD62, + 0x8F08, 0xDD63, + 0x8F09, 0xDD64, + 0x8F0A, 0xDD65, + 0x8F0B, 0xDD66, + 0x8F0C, 0xDD67, + 0x8F0D, 0xDD68, + 0x8F0E, 0xDD69, + 0x8F0F, 0xDD6A, + 0x8F10, 0xDD6B, + 0x8F11, 0xDD6C, + 0x8F12, 0xDD6D, + 0x8F13, 0xDD6E, + 0x8F14, 0xDD6F, + 0x8F15, 0xDD70, + 0x8F16, 0xDD71, + 0x8F17, 0xDD72, + 0x8F18, 0xDD73, + 0x8F19, 0xDD74, + 0x8F1A, 0xDD75, + 0x8F1B, 0xDD76, + 0x8F1C, 0xDD77, + 0x8F1D, 0xDD78, + 0x8F1E, 0xDD79, + 0x8F1F, 0xDD7A, + 0x8F20, 0xDD7B, + 0x8F21, 0xDD7C, + 0x8F22, 0xDD7D, + 0x8F23, 0xDD7E, + 0x8F24, 0xDD80, + 0x8F25, 0xDD81, + 0x8F26, 0xDD82, + 0x8F27, 0xDD83, + 0x8F28, 0xDD84, + 0x8F29, 0xDD85, + 0x8F2A, 0xDD86, + 0x8F2B, 0xDD87, + 0x8F2C, 0xDD88, + 0x8F2D, 0xDD89, + 0x8F2E, 0xDD8A, + 0x8F2F, 0xDD8B, + 0x8F30, 0xDD8C, + 0x8F31, 0xDD8D, + 0x8F32, 0xDD8E, + 0x8F33, 0xDD8F, + 0x8F34, 0xDD90, + 0x8F35, 0xDD91, + 0x8F36, 0xDD92, + 0x8F37, 0xDD93, + 0x8F38, 0xDD94, + 0x8F39, 0xDD95, + 0x8F3A, 0xDD96, + 0x8F3B, 0xDD97, + 0x8F3C, 0xDD98, + 0x8F3D, 0xDD99, + 0x8F3E, 0xDD9A, + 0x8F3F, 0xDD9B, + 0x8F40, 0xDD9C, + 0x8F41, 0xDD9D, + 0x8F42, 0xDD9E, + 0x8F43, 0xDD9F, + 0x8F44, 0xDDA0, + 0x8F45, 0xDE40, + 0x8F46, 0xDE41, + 0x8F47, 0xDE42, + 0x8F48, 0xDE43, + 0x8F49, 0xDE44, + 0x8F4A, 0xDE45, + 0x8F4B, 0xDE46, + 0x8F4C, 0xDE47, + 0x8F4D, 0xDE48, + 0x8F4E, 0xDE49, + 0x8F4F, 0xDE4A, + 0x8F50, 0xDE4B, + 0x8F51, 0xDE4C, + 0x8F52, 0xDE4D, + 0x8F53, 0xDE4E, + 0x8F54, 0xDE4F, + 0x8F55, 0xDE50, + 0x8F56, 0xDE51, + 0x8F57, 0xDE52, + 0x8F58, 0xDE53, + 0x8F59, 0xDE54, + 0x8F5A, 0xDE55, + 0x8F5B, 0xDE56, + 0x8F5C, 0xDE57, + 0x8F5D, 0xDE58, + 0x8F5E, 0xDE59, + 0x8F5F, 0xDE5A, + 0x8F60, 0xDE5B, + 0x8F61, 0xDE5C, + 0x8F62, 0xDE5D, + 0x8F63, 0xDE5E, + 0x8F64, 0xDE5F, + 0x8F65, 0xDE60, + 0x8F6A, 0xDE61, + 0x8F80, 0xDE62, + 0x8F8C, 0xDE63, + 0x8F92, 0xDE64, + 0x8F9D, 0xDE65, + 0x8FA0, 0xDE66, + 0x8FA1, 0xDE67, + 0x8FA2, 0xDE68, + 0x8FA4, 0xDE69, + 0x8FA5, 0xDE6A, + 0x8FA6, 0xDE6B, + 0x8FA7, 0xDE6C, + 0x8FAA, 0xDE6D, + 0x8FAC, 0xDE6E, + 0x8FAD, 0xDE6F, + 0x8FAE, 0xDE70, + 0x8FAF, 0xDE71, + 0x8FB2, 0xDE72, + 0x8FB3, 0xDE73, + 0x8FB4, 0xDE74, + 0x8FB5, 0xDE75, + 0x8FB7, 0xDE76, + 0x8FB8, 0xDE77, + 0x8FBA, 0xDE78, + 0x8FBB, 0xDE79, + 0x8FBC, 0xDE7A, + 0x8FBF, 0xDE7B, + 0x8FC0, 0xDE7C, + 0x8FC3, 0xDE7D, + 0x8FC6, 0xDE7E, + 0x8FC9, 0xDE80, + 0x8FCA, 0xDE81, + 0x8FCB, 0xDE82, + 0x8FCC, 0xDE83, + 0x8FCD, 0xDE84, + 0x8FCF, 0xDE85, + 0x8FD2, 0xDE86, + 0x8FD6, 0xDE87, + 0x8FD7, 0xDE88, + 0x8FDA, 0xDE89, + 0x8FE0, 0xDE8A, + 0x8FE1, 0xDE8B, + 0x8FE3, 0xDE8C, + 0x8FE7, 0xDE8D, + 0x8FEC, 0xDE8E, + 0x8FEF, 0xDE8F, + 0x8FF1, 0xDE90, + 0x8FF2, 0xDE91, + 0x8FF4, 0xDE92, + 0x8FF5, 0xDE93, + 0x8FF6, 0xDE94, + 0x8FFA, 0xDE95, + 0x8FFB, 0xDE96, + 0x8FFC, 0xDE97, + 0x8FFE, 0xDE98, + 0x8FFF, 0xDE99, + 0x9007, 0xDE9A, + 0x9008, 0xDE9B, + 0x900C, 0xDE9C, + 0x900E, 0xDE9D, + 0x9013, 0xDE9E, + 0x9015, 0xDE9F, + 0x9018, 0xDEA0, + 0x9019, 0xDF40, + 0x901C, 0xDF41, + 0x9023, 0xDF42, + 0x9024, 0xDF43, + 0x9025, 0xDF44, + 0x9027, 0xDF45, + 0x9028, 0xDF46, + 0x9029, 0xDF47, + 0x902A, 0xDF48, + 0x902B, 0xDF49, + 0x902C, 0xDF4A, + 0x9030, 0xDF4B, + 0x9031, 0xDF4C, + 0x9032, 0xDF4D, + 0x9033, 0xDF4E, + 0x9034, 0xDF4F, + 0x9037, 0xDF50, + 0x9039, 0xDF51, + 0x903A, 0xDF52, + 0x903D, 0xDF53, + 0x903F, 0xDF54, + 0x9040, 0xDF55, + 0x9043, 0xDF56, + 0x9045, 0xDF57, + 0x9046, 0xDF58, + 0x9048, 0xDF59, + 0x9049, 0xDF5A, + 0x904A, 0xDF5B, + 0x904B, 0xDF5C, + 0x904C, 0xDF5D, + 0x904E, 0xDF5E, + 0x9054, 0xDF5F, + 0x9055, 0xDF60, + 0x9056, 0xDF61, + 0x9059, 0xDF62, + 0x905A, 0xDF63, + 0x905C, 0xDF64, + 0x905D, 0xDF65, + 0x905E, 0xDF66, + 0x905F, 0xDF67, + 0x9060, 0xDF68, + 0x9061, 0xDF69, + 0x9064, 0xDF6A, + 0x9066, 0xDF6B, + 0x9067, 0xDF6C, + 0x9069, 0xDF6D, + 0x906A, 0xDF6E, + 0x906B, 0xDF6F, + 0x906C, 0xDF70, + 0x906F, 0xDF71, + 0x9070, 0xDF72, + 0x9071, 0xDF73, + 0x9072, 0xDF74, + 0x9073, 0xDF75, + 0x9076, 0xDF76, + 0x9077, 0xDF77, + 0x9078, 0xDF78, + 0x9079, 0xDF79, + 0x907A, 0xDF7A, + 0x907B, 0xDF7B, + 0x907C, 0xDF7C, + 0x907E, 0xDF7D, + 0x9081, 0xDF7E, + 0x9084, 0xDF80, + 0x9085, 0xDF81, + 0x9086, 0xDF82, + 0x9087, 0xDF83, + 0x9089, 0xDF84, + 0x908A, 0xDF85, + 0x908C, 0xDF86, + 0x908D, 0xDF87, + 0x908E, 0xDF88, + 0x908F, 0xDF89, + 0x9090, 0xDF8A, + 0x9092, 0xDF8B, + 0x9094, 0xDF8C, + 0x9096, 0xDF8D, + 0x9098, 0xDF8E, + 0x909A, 0xDF8F, + 0x909C, 0xDF90, + 0x909E, 0xDF91, + 0x909F, 0xDF92, + 0x90A0, 0xDF93, + 0x90A4, 0xDF94, + 0x90A5, 0xDF95, + 0x90A7, 0xDF96, + 0x90A8, 0xDF97, + 0x90A9, 0xDF98, + 0x90AB, 0xDF99, + 0x90AD, 0xDF9A, + 0x90B2, 0xDF9B, + 0x90B7, 0xDF9C, + 0x90BC, 0xDF9D, + 0x90BD, 0xDF9E, + 0x90BF, 0xDF9F, + 0x90C0, 0xDFA0, + 0x90C2, 0xE040, + 0x90C3, 0xE041, + 0x90C6, 0xE042, + 0x90C8, 0xE043, + 0x90C9, 0xE044, + 0x90CB, 0xE045, + 0x90CC, 0xE046, + 0x90CD, 0xE047, + 0x90D2, 0xE048, + 0x90D4, 0xE049, + 0x90D5, 0xE04A, + 0x90D6, 0xE04B, + 0x90D8, 0xE04C, + 0x90D9, 0xE04D, + 0x90DA, 0xE04E, + 0x90DE, 0xE04F, + 0x90DF, 0xE050, + 0x90E0, 0xE051, + 0x90E3, 0xE052, + 0x90E4, 0xE053, + 0x90E5, 0xE054, + 0x90E9, 0xE055, + 0x90EA, 0xE056, + 0x90EC, 0xE057, + 0x90EE, 0xE058, + 0x90F0, 0xE059, + 0x90F1, 0xE05A, + 0x90F2, 0xE05B, + 0x90F3, 0xE05C, + 0x90F5, 0xE05D, + 0x90F6, 0xE05E, + 0x90F7, 0xE05F, + 0x90F9, 0xE060, + 0x90FA, 0xE061, + 0x90FB, 0xE062, + 0x90FC, 0xE063, + 0x90FF, 0xE064, + 0x9100, 0xE065, + 0x9101, 0xE066, + 0x9103, 0xE067, + 0x9105, 0xE068, + 0x9106, 0xE069, + 0x9107, 0xE06A, + 0x9108, 0xE06B, + 0x9109, 0xE06C, + 0x910A, 0xE06D, + 0x910B, 0xE06E, + 0x910C, 0xE06F, + 0x910D, 0xE070, + 0x910E, 0xE071, + 0x910F, 0xE072, + 0x9110, 0xE073, + 0x9111, 0xE074, + 0x9112, 0xE075, + 0x9113, 0xE076, + 0x9114, 0xE077, + 0x9115, 0xE078, + 0x9116, 0xE079, + 0x9117, 0xE07A, + 0x9118, 0xE07B, + 0x911A, 0xE07C, + 0x911B, 0xE07D, + 0x911C, 0xE07E, + 0x911D, 0xE080, + 0x911F, 0xE081, + 0x9120, 0xE082, + 0x9121, 0xE083, + 0x9124, 0xE084, + 0x9125, 0xE085, + 0x9126, 0xE086, + 0x9127, 0xE087, + 0x9128, 0xE088, + 0x9129, 0xE089, + 0x912A, 0xE08A, + 0x912B, 0xE08B, + 0x912C, 0xE08C, + 0x912D, 0xE08D, + 0x912E, 0xE08E, + 0x9130, 0xE08F, + 0x9132, 0xE090, + 0x9133, 0xE091, + 0x9134, 0xE092, + 0x9135, 0xE093, + 0x9136, 0xE094, + 0x9137, 0xE095, + 0x9138, 0xE096, + 0x913A, 0xE097, + 0x913B, 0xE098, + 0x913C, 0xE099, + 0x913D, 0xE09A, + 0x913E, 0xE09B, + 0x913F, 0xE09C, + 0x9140, 0xE09D, + 0x9141, 0xE09E, + 0x9142, 0xE09F, + 0x9144, 0xE0A0, + 0x9145, 0xE140, + 0x9147, 0xE141, + 0x9148, 0xE142, + 0x9151, 0xE143, + 0x9153, 0xE144, + 0x9154, 0xE145, + 0x9155, 0xE146, + 0x9156, 0xE147, + 0x9158, 0xE148, + 0x9159, 0xE149, + 0x915B, 0xE14A, + 0x915C, 0xE14B, + 0x915F, 0xE14C, + 0x9160, 0xE14D, + 0x9166, 0xE14E, + 0x9167, 0xE14F, + 0x9168, 0xE150, + 0x916B, 0xE151, + 0x916D, 0xE152, + 0x9173, 0xE153, + 0x917A, 0xE154, + 0x917B, 0xE155, + 0x917C, 0xE156, + 0x9180, 0xE157, + 0x9181, 0xE158, + 0x9182, 0xE159, + 0x9183, 0xE15A, + 0x9184, 0xE15B, + 0x9186, 0xE15C, + 0x9188, 0xE15D, + 0x918A, 0xE15E, + 0x918E, 0xE15F, + 0x918F, 0xE160, + 0x9193, 0xE161, + 0x9194, 0xE162, + 0x9195, 0xE163, + 0x9196, 0xE164, + 0x9197, 0xE165, + 0x9198, 0xE166, + 0x9199, 0xE167, + 0x919C, 0xE168, + 0x919D, 0xE169, + 0x919E, 0xE16A, + 0x919F, 0xE16B, + 0x91A0, 0xE16C, + 0x91A1, 0xE16D, + 0x91A4, 0xE16E, + 0x91A5, 0xE16F, + 0x91A6, 0xE170, + 0x91A7, 0xE171, + 0x91A8, 0xE172, + 0x91A9, 0xE173, + 0x91AB, 0xE174, + 0x91AC, 0xE175, + 0x91B0, 0xE176, + 0x91B1, 0xE177, + 0x91B2, 0xE178, + 0x91B3, 0xE179, + 0x91B6, 0xE17A, + 0x91B7, 0xE17B, + 0x91B8, 0xE17C, + 0x91B9, 0xE17D, + 0x91BB, 0xE17E, + 0x91BC, 0xE180, + 0x91BD, 0xE181, + 0x91BE, 0xE182, + 0x91BF, 0xE183, + 0x91C0, 0xE184, + 0x91C1, 0xE185, + 0x91C2, 0xE186, + 0x91C3, 0xE187, + 0x91C4, 0xE188, + 0x91C5, 0xE189, + 0x91C6, 0xE18A, + 0x91C8, 0xE18B, + 0x91CB, 0xE18C, + 0x91D0, 0xE18D, + 0x91D2, 0xE18E, + 0x91D3, 0xE18F, + 0x91D4, 0xE190, + 0x91D5, 0xE191, + 0x91D6, 0xE192, + 0x91D7, 0xE193, + 0x91D8, 0xE194, + 0x91D9, 0xE195, + 0x91DA, 0xE196, + 0x91DB, 0xE197, + 0x91DD, 0xE198, + 0x91DE, 0xE199, + 0x91DF, 0xE19A, + 0x91E0, 0xE19B, + 0x91E1, 0xE19C, + 0x91E2, 0xE19D, + 0x91E3, 0xE19E, + 0x91E4, 0xE19F, + 0x91E5, 0xE1A0, + 0x91E6, 0xE240, + 0x91E7, 0xE241, + 0x91E8, 0xE242, + 0x91E9, 0xE243, + 0x91EA, 0xE244, + 0x91EB, 0xE245, + 0x91EC, 0xE246, + 0x91ED, 0xE247, + 0x91EE, 0xE248, + 0x91EF, 0xE249, + 0x91F0, 0xE24A, + 0x91F1, 0xE24B, + 0x91F2, 0xE24C, + 0x91F3, 0xE24D, + 0x91F4, 0xE24E, + 0x91F5, 0xE24F, + 0x91F6, 0xE250, + 0x91F7, 0xE251, + 0x91F8, 0xE252, + 0x91F9, 0xE253, + 0x91FA, 0xE254, + 0x91FB, 0xE255, + 0x91FC, 0xE256, + 0x91FD, 0xE257, + 0x91FE, 0xE258, + 0x91FF, 0xE259, + 0x9200, 0xE25A, + 0x9201, 0xE25B, + 0x9202, 0xE25C, + 0x9203, 0xE25D, + 0x9204, 0xE25E, + 0x9205, 0xE25F, + 0x9206, 0xE260, + 0x9207, 0xE261, + 0x9208, 0xE262, + 0x9209, 0xE263, + 0x920A, 0xE264, + 0x920B, 0xE265, + 0x920C, 0xE266, + 0x920D, 0xE267, + 0x920E, 0xE268, + 0x920F, 0xE269, + 0x9210, 0xE26A, + 0x9211, 0xE26B, + 0x9212, 0xE26C, + 0x9213, 0xE26D, + 0x9214, 0xE26E, + 0x9215, 0xE26F, + 0x9216, 0xE270, + 0x9217, 0xE271, + 0x9218, 0xE272, + 0x9219, 0xE273, + 0x921A, 0xE274, + 0x921B, 0xE275, + 0x921C, 0xE276, + 0x921D, 0xE277, + 0x921E, 0xE278, + 0x921F, 0xE279, + 0x9220, 0xE27A, + 0x9221, 0xE27B, + 0x9222, 0xE27C, + 0x9223, 0xE27D, + 0x9224, 0xE27E, + 0x9225, 0xE280, + 0x9226, 0xE281, + 0x9227, 0xE282, + 0x9228, 0xE283, + 0x9229, 0xE284, + 0x922A, 0xE285, + 0x922B, 0xE286, + 0x922C, 0xE287, + 0x922D, 0xE288, + 0x922E, 0xE289, + 0x922F, 0xE28A, + 0x9230, 0xE28B, + 0x9231, 0xE28C, + 0x9232, 0xE28D, + 0x9233, 0xE28E, + 0x9234, 0xE28F, + 0x9235, 0xE290, + 0x9236, 0xE291, + 0x9237, 0xE292, + 0x9238, 0xE293, + 0x9239, 0xE294, + 0x923A, 0xE295, + 0x923B, 0xE296, + 0x923C, 0xE297, + 0x923D, 0xE298, + 0x923E, 0xE299, + 0x923F, 0xE29A, + 0x9240, 0xE29B, + 0x9241, 0xE29C, + 0x9242, 0xE29D, + 0x9243, 0xE29E, + 0x9244, 0xE29F, + 0x9245, 0xE2A0, + 0x9246, 0xE340, + 0x9247, 0xE341, + 0x9248, 0xE342, + 0x9249, 0xE343, + 0x924A, 0xE344, + 0x924B, 0xE345, + 0x924C, 0xE346, + 0x924D, 0xE347, + 0x924E, 0xE348, + 0x924F, 0xE349, + 0x9250, 0xE34A, + 0x9251, 0xE34B, + 0x9252, 0xE34C, + 0x9253, 0xE34D, + 0x9254, 0xE34E, + 0x9255, 0xE34F, + 0x9256, 0xE350, + 0x9257, 0xE351, + 0x9258, 0xE352, + 0x9259, 0xE353, + 0x925A, 0xE354, + 0x925B, 0xE355, + 0x925C, 0xE356, + 0x925D, 0xE357, + 0x925E, 0xE358, + 0x925F, 0xE359, + 0x9260, 0xE35A, + 0x9261, 0xE35B, + 0x9262, 0xE35C, + 0x9263, 0xE35D, + 0x9264, 0xE35E, + 0x9265, 0xE35F, + 0x9266, 0xE360, + 0x9267, 0xE361, + 0x9268, 0xE362, + 0x9269, 0xE363, + 0x926A, 0xE364, + 0x926B, 0xE365, + 0x926C, 0xE366, + 0x926D, 0xE367, + 0x926E, 0xE368, + 0x926F, 0xE369, + 0x9270, 0xE36A, + 0x9271, 0xE36B, + 0x9272, 0xE36C, + 0x9273, 0xE36D, + 0x9275, 0xE36E, + 0x9276, 0xE36F, + 0x9277, 0xE370, + 0x9278, 0xE371, + 0x9279, 0xE372, + 0x927A, 0xE373, + 0x927B, 0xE374, + 0x927C, 0xE375, + 0x927D, 0xE376, + 0x927E, 0xE377, + 0x927F, 0xE378, + 0x9280, 0xE379, + 0x9281, 0xE37A, + 0x9282, 0xE37B, + 0x9283, 0xE37C, + 0x9284, 0xE37D, + 0x9285, 0xE37E, + 0x9286, 0xE380, + 0x9287, 0xE381, + 0x9288, 0xE382, + 0x9289, 0xE383, + 0x928A, 0xE384, + 0x928B, 0xE385, + 0x928C, 0xE386, + 0x928D, 0xE387, + 0x928F, 0xE388, + 0x9290, 0xE389, + 0x9291, 0xE38A, + 0x9292, 0xE38B, + 0x9293, 0xE38C, + 0x9294, 0xE38D, + 0x9295, 0xE38E, + 0x9296, 0xE38F, + 0x9297, 0xE390, + 0x9298, 0xE391, + 0x9299, 0xE392, + 0x929A, 0xE393, + 0x929B, 0xE394, + 0x929C, 0xE395, + 0x929D, 0xE396, + 0x929E, 0xE397, + 0x929F, 0xE398, + 0x92A0, 0xE399, + 0x92A1, 0xE39A, + 0x92A2, 0xE39B, + 0x92A3, 0xE39C, + 0x92A4, 0xE39D, + 0x92A5, 0xE39E, + 0x92A6, 0xE39F, + 0x92A7, 0xE3A0, + 0x92A8, 0xE440, + 0x92A9, 0xE441, + 0x92AA, 0xE442, + 0x92AB, 0xE443, + 0x92AC, 0xE444, + 0x92AD, 0xE445, + 0x92AF, 0xE446, + 0x92B0, 0xE447, + 0x92B1, 0xE448, + 0x92B2, 0xE449, + 0x92B3, 0xE44A, + 0x92B4, 0xE44B, + 0x92B5, 0xE44C, + 0x92B6, 0xE44D, + 0x92B7, 0xE44E, + 0x92B8, 0xE44F, + 0x92B9, 0xE450, + 0x92BA, 0xE451, + 0x92BB, 0xE452, + 0x92BC, 0xE453, + 0x92BD, 0xE454, + 0x92BE, 0xE455, + 0x92BF, 0xE456, + 0x92C0, 0xE457, + 0x92C1, 0xE458, + 0x92C2, 0xE459, + 0x92C3, 0xE45A, + 0x92C4, 0xE45B, + 0x92C5, 0xE45C, + 0x92C6, 0xE45D, + 0x92C7, 0xE45E, + 0x92C9, 0xE45F, + 0x92CA, 0xE460, + 0x92CB, 0xE461, + 0x92CC, 0xE462, + 0x92CD, 0xE463, + 0x92CE, 0xE464, + 0x92CF, 0xE465, + 0x92D0, 0xE466, + 0x92D1, 0xE467, + 0x92D2, 0xE468, + 0x92D3, 0xE469, + 0x92D4, 0xE46A, + 0x92D5, 0xE46B, + 0x92D6, 0xE46C, + 0x92D7, 0xE46D, + 0x92D8, 0xE46E, + 0x92D9, 0xE46F, + 0x92DA, 0xE470, + 0x92DB, 0xE471, + 0x92DC, 0xE472, + 0x92DD, 0xE473, + 0x92DE, 0xE474, + 0x92DF, 0xE475, + 0x92E0, 0xE476, + 0x92E1, 0xE477, + 0x92E2, 0xE478, + 0x92E3, 0xE479, + 0x92E4, 0xE47A, + 0x92E5, 0xE47B, + 0x92E6, 0xE47C, + 0x92E7, 0xE47D, + 0x92E8, 0xE47E, + 0x92E9, 0xE480, + 0x92EA, 0xE481, + 0x92EB, 0xE482, + 0x92EC, 0xE483, + 0x92ED, 0xE484, + 0x92EE, 0xE485, + 0x92EF, 0xE486, + 0x92F0, 0xE487, + 0x92F1, 0xE488, + 0x92F2, 0xE489, + 0x92F3, 0xE48A, + 0x92F4, 0xE48B, + 0x92F5, 0xE48C, + 0x92F6, 0xE48D, + 0x92F7, 0xE48E, + 0x92F8, 0xE48F, + 0x92F9, 0xE490, + 0x92FA, 0xE491, + 0x92FB, 0xE492, + 0x92FC, 0xE493, + 0x92FD, 0xE494, + 0x92FE, 0xE495, + 0x92FF, 0xE496, + 0x9300, 0xE497, + 0x9301, 0xE498, + 0x9302, 0xE499, + 0x9303, 0xE49A, + 0x9304, 0xE49B, + 0x9305, 0xE49C, + 0x9306, 0xE49D, + 0x9307, 0xE49E, + 0x9308, 0xE49F, + 0x9309, 0xE4A0, + 0x930A, 0xE540, + 0x930B, 0xE541, + 0x930C, 0xE542, + 0x930D, 0xE543, + 0x930E, 0xE544, + 0x930F, 0xE545, + 0x9310, 0xE546, + 0x9311, 0xE547, + 0x9312, 0xE548, + 0x9313, 0xE549, + 0x9314, 0xE54A, + 0x9315, 0xE54B, + 0x9316, 0xE54C, + 0x9317, 0xE54D, + 0x9318, 0xE54E, + 0x9319, 0xE54F, + 0x931A, 0xE550, + 0x931B, 0xE551, + 0x931C, 0xE552, + 0x931D, 0xE553, + 0x931E, 0xE554, + 0x931F, 0xE555, + 0x9320, 0xE556, + 0x9321, 0xE557, + 0x9322, 0xE558, + 0x9323, 0xE559, + 0x9324, 0xE55A, + 0x9325, 0xE55B, + 0x9326, 0xE55C, + 0x9327, 0xE55D, + 0x9328, 0xE55E, + 0x9329, 0xE55F, + 0x932A, 0xE560, + 0x932B, 0xE561, + 0x932C, 0xE562, + 0x932D, 0xE563, + 0x932E, 0xE564, + 0x932F, 0xE565, + 0x9330, 0xE566, + 0x9331, 0xE567, + 0x9332, 0xE568, + 0x9333, 0xE569, + 0x9334, 0xE56A, + 0x9335, 0xE56B, + 0x9336, 0xE56C, + 0x9337, 0xE56D, + 0x9338, 0xE56E, + 0x9339, 0xE56F, + 0x933A, 0xE570, + 0x933B, 0xE571, + 0x933C, 0xE572, + 0x933D, 0xE573, + 0x933F, 0xE574, + 0x9340, 0xE575, + 0x9341, 0xE576, + 0x9342, 0xE577, + 0x9343, 0xE578, + 0x9344, 0xE579, + 0x9345, 0xE57A, + 0x9346, 0xE57B, + 0x9347, 0xE57C, + 0x9348, 0xE57D, + 0x9349, 0xE57E, + 0x934A, 0xE580, + 0x934B, 0xE581, + 0x934C, 0xE582, + 0x934D, 0xE583, + 0x934E, 0xE584, + 0x934F, 0xE585, + 0x9350, 0xE586, + 0x9351, 0xE587, + 0x9352, 0xE588, + 0x9353, 0xE589, + 0x9354, 0xE58A, + 0x9355, 0xE58B, + 0x9356, 0xE58C, + 0x9357, 0xE58D, + 0x9358, 0xE58E, + 0x9359, 0xE58F, + 0x935A, 0xE590, + 0x935B, 0xE591, + 0x935C, 0xE592, + 0x935D, 0xE593, + 0x935E, 0xE594, + 0x935F, 0xE595, + 0x9360, 0xE596, + 0x9361, 0xE597, + 0x9362, 0xE598, + 0x9363, 0xE599, + 0x9364, 0xE59A, + 0x9365, 0xE59B, + 0x9366, 0xE59C, + 0x9367, 0xE59D, + 0x9368, 0xE59E, + 0x9369, 0xE59F, + 0x936B, 0xE5A0, + 0x936C, 0xE640, + 0x936D, 0xE641, + 0x936E, 0xE642, + 0x936F, 0xE643, + 0x9370, 0xE644, + 0x9371, 0xE645, + 0x9372, 0xE646, + 0x9373, 0xE647, + 0x9374, 0xE648, + 0x9375, 0xE649, + 0x9376, 0xE64A, + 0x9377, 0xE64B, + 0x9378, 0xE64C, + 0x9379, 0xE64D, + 0x937A, 0xE64E, + 0x937B, 0xE64F, + 0x937C, 0xE650, + 0x937D, 0xE651, + 0x937E, 0xE652, + 0x937F, 0xE653, + 0x9380, 0xE654, + 0x9381, 0xE655, + 0x9382, 0xE656, + 0x9383, 0xE657, + 0x9384, 0xE658, + 0x9385, 0xE659, + 0x9386, 0xE65A, + 0x9387, 0xE65B, + 0x9388, 0xE65C, + 0x9389, 0xE65D, + 0x938A, 0xE65E, + 0x938B, 0xE65F, + 0x938C, 0xE660, + 0x938D, 0xE661, + 0x938E, 0xE662, + 0x9390, 0xE663, + 0x9391, 0xE664, + 0x9392, 0xE665, + 0x9393, 0xE666, + 0x9394, 0xE667, + 0x9395, 0xE668, + 0x9396, 0xE669, + 0x9397, 0xE66A, + 0x9398, 0xE66B, + 0x9399, 0xE66C, + 0x939A, 0xE66D, + 0x939B, 0xE66E, + 0x939C, 0xE66F, + 0x939D, 0xE670, + 0x939E, 0xE671, + 0x939F, 0xE672, + 0x93A0, 0xE673, + 0x93A1, 0xE674, + 0x93A2, 0xE675, + 0x93A3, 0xE676, + 0x93A4, 0xE677, + 0x93A5, 0xE678, + 0x93A6, 0xE679, + 0x93A7, 0xE67A, + 0x93A8, 0xE67B, + 0x93A9, 0xE67C, + 0x93AA, 0xE67D, + 0x93AB, 0xE67E, + 0x93AC, 0xE680, + 0x93AD, 0xE681, + 0x93AE, 0xE682, + 0x93AF, 0xE683, + 0x93B0, 0xE684, + 0x93B1, 0xE685, + 0x93B2, 0xE686, + 0x93B3, 0xE687, + 0x93B4, 0xE688, + 0x93B5, 0xE689, + 0x93B6, 0xE68A, + 0x93B7, 0xE68B, + 0x93B8, 0xE68C, + 0x93B9, 0xE68D, + 0x93BA, 0xE68E, + 0x93BB, 0xE68F, + 0x93BC, 0xE690, + 0x93BD, 0xE691, + 0x93BE, 0xE692, + 0x93BF, 0xE693, + 0x93C0, 0xE694, + 0x93C1, 0xE695, + 0x93C2, 0xE696, + 0x93C3, 0xE697, + 0x93C4, 0xE698, + 0x93C5, 0xE699, + 0x93C6, 0xE69A, + 0x93C7, 0xE69B, + 0x93C8, 0xE69C, + 0x93C9, 0xE69D, + 0x93CB, 0xE69E, + 0x93CC, 0xE69F, + 0x93CD, 0xE6A0, + 0x93CE, 0xE740, + 0x93CF, 0xE741, + 0x93D0, 0xE742, + 0x93D1, 0xE743, + 0x93D2, 0xE744, + 0x93D3, 0xE745, + 0x93D4, 0xE746, + 0x93D5, 0xE747, + 0x93D7, 0xE748, + 0x93D8, 0xE749, + 0x93D9, 0xE74A, + 0x93DA, 0xE74B, + 0x93DB, 0xE74C, + 0x93DC, 0xE74D, + 0x93DD, 0xE74E, + 0x93DE, 0xE74F, + 0x93DF, 0xE750, + 0x93E0, 0xE751, + 0x93E1, 0xE752, + 0x93E2, 0xE753, + 0x93E3, 0xE754, + 0x93E4, 0xE755, + 0x93E5, 0xE756, + 0x93E6, 0xE757, + 0x93E7, 0xE758, + 0x93E8, 0xE759, + 0x93E9, 0xE75A, + 0x93EA, 0xE75B, + 0x93EB, 0xE75C, + 0x93EC, 0xE75D, + 0x93ED, 0xE75E, + 0x93EE, 0xE75F, + 0x93EF, 0xE760, + 0x93F0, 0xE761, + 0x93F1, 0xE762, + 0x93F2, 0xE763, + 0x93F3, 0xE764, + 0x93F4, 0xE765, + 0x93F5, 0xE766, + 0x93F6, 0xE767, + 0x93F7, 0xE768, + 0x93F8, 0xE769, + 0x93F9, 0xE76A, + 0x93FA, 0xE76B, + 0x93FB, 0xE76C, + 0x93FC, 0xE76D, + 0x93FD, 0xE76E, + 0x93FE, 0xE76F, + 0x93FF, 0xE770, + 0x9400, 0xE771, + 0x9401, 0xE772, + 0x9402, 0xE773, + 0x9403, 0xE774, + 0x9404, 0xE775, + 0x9405, 0xE776, + 0x9406, 0xE777, + 0x9407, 0xE778, + 0x9408, 0xE779, + 0x9409, 0xE77A, + 0x940A, 0xE77B, + 0x940B, 0xE77C, + 0x940C, 0xE77D, + 0x940D, 0xE77E, + 0x940E, 0xE780, + 0x940F, 0xE781, + 0x9410, 0xE782, + 0x9411, 0xE783, + 0x9412, 0xE784, + 0x9413, 0xE785, + 0x9414, 0xE786, + 0x9415, 0xE787, + 0x9416, 0xE788, + 0x9417, 0xE789, + 0x9418, 0xE78A, + 0x9419, 0xE78B, + 0x941A, 0xE78C, + 0x941B, 0xE78D, + 0x941C, 0xE78E, + 0x941D, 0xE78F, + 0x941E, 0xE790, + 0x941F, 0xE791, + 0x9420, 0xE792, + 0x9421, 0xE793, + 0x9422, 0xE794, + 0x9423, 0xE795, + 0x9424, 0xE796, + 0x9425, 0xE797, + 0x9426, 0xE798, + 0x9427, 0xE799, + 0x9428, 0xE79A, + 0x9429, 0xE79B, + 0x942A, 0xE79C, + 0x942B, 0xE79D, + 0x942C, 0xE79E, + 0x942D, 0xE79F, + 0x942E, 0xE7A0, + 0x942F, 0xE840, + 0x9430, 0xE841, + 0x9431, 0xE842, + 0x9432, 0xE843, + 0x9433, 0xE844, + 0x9434, 0xE845, + 0x9435, 0xE846, + 0x9436, 0xE847, + 0x9437, 0xE848, + 0x9438, 0xE849, + 0x9439, 0xE84A, + 0x943A, 0xE84B, + 0x943B, 0xE84C, + 0x943C, 0xE84D, + 0x943D, 0xE84E, + 0x943F, 0xE84F, + 0x9440, 0xE850, + 0x9441, 0xE851, + 0x9442, 0xE852, + 0x9443, 0xE853, + 0x9444, 0xE854, + 0x9445, 0xE855, + 0x9446, 0xE856, + 0x9447, 0xE857, + 0x9448, 0xE858, + 0x9449, 0xE859, + 0x944A, 0xE85A, + 0x944B, 0xE85B, + 0x944C, 0xE85C, + 0x944D, 0xE85D, + 0x944E, 0xE85E, + 0x944F, 0xE85F, + 0x9450, 0xE860, + 0x9451, 0xE861, + 0x9452, 0xE862, + 0x9453, 0xE863, + 0x9454, 0xE864, + 0x9455, 0xE865, + 0x9456, 0xE866, + 0x9457, 0xE867, + 0x9458, 0xE868, + 0x9459, 0xE869, + 0x945A, 0xE86A, + 0x945B, 0xE86B, + 0x945C, 0xE86C, + 0x945D, 0xE86D, + 0x945E, 0xE86E, + 0x945F, 0xE86F, + 0x9460, 0xE870, + 0x9461, 0xE871, + 0x9462, 0xE872, + 0x9463, 0xE873, + 0x9464, 0xE874, + 0x9465, 0xE875, + 0x9466, 0xE876, + 0x9467, 0xE877, + 0x9468, 0xE878, + 0x9469, 0xE879, + 0x946A, 0xE87A, + 0x946C, 0xE87B, + 0x946D, 0xE87C, + 0x946E, 0xE87D, + 0x946F, 0xE87E, + 0x9470, 0xE880, + 0x9471, 0xE881, + 0x9472, 0xE882, + 0x9473, 0xE883, + 0x9474, 0xE884, + 0x9475, 0xE885, + 0x9476, 0xE886, + 0x9477, 0xE887, + 0x9478, 0xE888, + 0x9479, 0xE889, + 0x947A, 0xE88A, + 0x947B, 0xE88B, + 0x947C, 0xE88C, + 0x947D, 0xE88D, + 0x947E, 0xE88E, + 0x947F, 0xE88F, + 0x9480, 0xE890, + 0x9481, 0xE891, + 0x9482, 0xE892, + 0x9483, 0xE893, + 0x9484, 0xE894, + 0x9491, 0xE895, + 0x9496, 0xE896, + 0x9498, 0xE897, + 0x94C7, 0xE898, + 0x94CF, 0xE899, + 0x94D3, 0xE89A, + 0x94D4, 0xE89B, + 0x94DA, 0xE89C, + 0x94E6, 0xE89D, + 0x94FB, 0xE89E, + 0x951C, 0xE89F, + 0x9520, 0xE8A0, + 0x9527, 0xE940, + 0x9533, 0xE941, + 0x953D, 0xE942, + 0x9543, 0xE943, + 0x9548, 0xE944, + 0x954B, 0xE945, + 0x9555, 0xE946, + 0x955A, 0xE947, + 0x9560, 0xE948, + 0x956E, 0xE949, + 0x9574, 0xE94A, + 0x9575, 0xE94B, + 0x9577, 0xE94C, + 0x9578, 0xE94D, + 0x9579, 0xE94E, + 0x957A, 0xE94F, + 0x957B, 0xE950, + 0x957C, 0xE951, + 0x957D, 0xE952, + 0x957E, 0xE953, + 0x9580, 0xE954, + 0x9581, 0xE955, + 0x9582, 0xE956, + 0x9583, 0xE957, + 0x9584, 0xE958, + 0x9585, 0xE959, + 0x9586, 0xE95A, + 0x9587, 0xE95B, + 0x9588, 0xE95C, + 0x9589, 0xE95D, + 0x958A, 0xE95E, + 0x958B, 0xE95F, + 0x958C, 0xE960, + 0x958D, 0xE961, + 0x958E, 0xE962, + 0x958F, 0xE963, + 0x9590, 0xE964, + 0x9591, 0xE965, + 0x9592, 0xE966, + 0x9593, 0xE967, + 0x9594, 0xE968, + 0x9595, 0xE969, + 0x9596, 0xE96A, + 0x9597, 0xE96B, + 0x9598, 0xE96C, + 0x9599, 0xE96D, + 0x959A, 0xE96E, + 0x959B, 0xE96F, + 0x959C, 0xE970, + 0x959D, 0xE971, + 0x959E, 0xE972, + 0x959F, 0xE973, + 0x95A0, 0xE974, + 0x95A1, 0xE975, + 0x95A2, 0xE976, + 0x95A3, 0xE977, + 0x95A4, 0xE978, + 0x95A5, 0xE979, + 0x95A6, 0xE97A, + 0x95A7, 0xE97B, + 0x95A8, 0xE97C, + 0x95A9, 0xE97D, + 0x95AA, 0xE97E, + 0x95AB, 0xE980, + 0x95AC, 0xE981, + 0x95AD, 0xE982, + 0x95AE, 0xE983, + 0x95AF, 0xE984, + 0x95B0, 0xE985, + 0x95B1, 0xE986, + 0x95B2, 0xE987, + 0x95B3, 0xE988, + 0x95B4, 0xE989, + 0x95B5, 0xE98A, + 0x95B6, 0xE98B, + 0x95B7, 0xE98C, + 0x95B8, 0xE98D, + 0x95B9, 0xE98E, + 0x95BA, 0xE98F, + 0x95BB, 0xE990, + 0x95BC, 0xE991, + 0x95BD, 0xE992, + 0x95BE, 0xE993, + 0x95BF, 0xE994, + 0x95C0, 0xE995, + 0x95C1, 0xE996, + 0x95C2, 0xE997, + 0x95C3, 0xE998, + 0x95C4, 0xE999, + 0x95C5, 0xE99A, + 0x95C6, 0xE99B, + 0x95C7, 0xE99C, + 0x95C8, 0xE99D, + 0x95C9, 0xE99E, + 0x95CA, 0xE99F, + 0x95CB, 0xE9A0, + 0x95CC, 0xEA40, + 0x95CD, 0xEA41, + 0x95CE, 0xEA42, + 0x95CF, 0xEA43, + 0x95D0, 0xEA44, + 0x95D1, 0xEA45, + 0x95D2, 0xEA46, + 0x95D3, 0xEA47, + 0x95D4, 0xEA48, + 0x95D5, 0xEA49, + 0x95D6, 0xEA4A, + 0x95D7, 0xEA4B, + 0x95D8, 0xEA4C, + 0x95D9, 0xEA4D, + 0x95DA, 0xEA4E, + 0x95DB, 0xEA4F, + 0x95DC, 0xEA50, + 0x95DD, 0xEA51, + 0x95DE, 0xEA52, + 0x95DF, 0xEA53, + 0x95E0, 0xEA54, + 0x95E1, 0xEA55, + 0x95E2, 0xEA56, + 0x95E3, 0xEA57, + 0x95E4, 0xEA58, + 0x95E5, 0xEA59, + 0x95E6, 0xEA5A, + 0x95E7, 0xEA5B, + 0x95EC, 0xEA5C, + 0x95FF, 0xEA5D, + 0x9607, 0xEA5E, + 0x9613, 0xEA5F, + 0x9618, 0xEA60, + 0x961B, 0xEA61, + 0x961E, 0xEA62, + 0x9620, 0xEA63, + 0x9623, 0xEA64, + 0x9624, 0xEA65, + 0x9625, 0xEA66, + 0x9626, 0xEA67, + 0x9627, 0xEA68, + 0x9628, 0xEA69, + 0x9629, 0xEA6A, + 0x962B, 0xEA6B, + 0x962C, 0xEA6C, + 0x962D, 0xEA6D, + 0x962F, 0xEA6E, + 0x9630, 0xEA6F, + 0x9637, 0xEA70, + 0x9638, 0xEA71, + 0x9639, 0xEA72, + 0x963A, 0xEA73, + 0x963E, 0xEA74, + 0x9641, 0xEA75, + 0x9643, 0xEA76, + 0x964A, 0xEA77, + 0x964E, 0xEA78, + 0x964F, 0xEA79, + 0x9651, 0xEA7A, + 0x9652, 0xEA7B, + 0x9653, 0xEA7C, + 0x9656, 0xEA7D, + 0x9657, 0xEA7E, + 0x9658, 0xEA80, + 0x9659, 0xEA81, + 0x965A, 0xEA82, + 0x965C, 0xEA83, + 0x965D, 0xEA84, + 0x965E, 0xEA85, + 0x9660, 0xEA86, + 0x9663, 0xEA87, + 0x9665, 0xEA88, + 0x9666, 0xEA89, + 0x966B, 0xEA8A, + 0x966D, 0xEA8B, + 0x966E, 0xEA8C, + 0x966F, 0xEA8D, + 0x9670, 0xEA8E, + 0x9671, 0xEA8F, + 0x9673, 0xEA90, + 0x9678, 0xEA91, + 0x9679, 0xEA92, + 0x967A, 0xEA93, + 0x967B, 0xEA94, + 0x967C, 0xEA95, + 0x967D, 0xEA96, + 0x967E, 0xEA97, + 0x967F, 0xEA98, + 0x9680, 0xEA99, + 0x9681, 0xEA9A, + 0x9682, 0xEA9B, + 0x9683, 0xEA9C, + 0x9684, 0xEA9D, + 0x9687, 0xEA9E, + 0x9689, 0xEA9F, + 0x968A, 0xEAA0, + 0x968C, 0xEB40, + 0x968E, 0xEB41, + 0x9691, 0xEB42, + 0x9692, 0xEB43, + 0x9693, 0xEB44, + 0x9695, 0xEB45, + 0x9696, 0xEB46, + 0x969A, 0xEB47, + 0x969B, 0xEB48, + 0x969D, 0xEB49, + 0x969E, 0xEB4A, + 0x969F, 0xEB4B, + 0x96A0, 0xEB4C, + 0x96A1, 0xEB4D, + 0x96A2, 0xEB4E, + 0x96A3, 0xEB4F, + 0x96A4, 0xEB50, + 0x96A5, 0xEB51, + 0x96A6, 0xEB52, + 0x96A8, 0xEB53, + 0x96A9, 0xEB54, + 0x96AA, 0xEB55, + 0x96AB, 0xEB56, + 0x96AC, 0xEB57, + 0x96AD, 0xEB58, + 0x96AE, 0xEB59, + 0x96AF, 0xEB5A, + 0x96B1, 0xEB5B, + 0x96B2, 0xEB5C, + 0x96B4, 0xEB5D, + 0x96B5, 0xEB5E, + 0x96B7, 0xEB5F, + 0x96B8, 0xEB60, + 0x96BA, 0xEB61, + 0x96BB, 0xEB62, + 0x96BF, 0xEB63, + 0x96C2, 0xEB64, + 0x96C3, 0xEB65, + 0x96C8, 0xEB66, + 0x96CA, 0xEB67, + 0x96CB, 0xEB68, + 0x96D0, 0xEB69, + 0x96D1, 0xEB6A, + 0x96D3, 0xEB6B, + 0x96D4, 0xEB6C, + 0x96D6, 0xEB6D, + 0x96D7, 0xEB6E, + 0x96D8, 0xEB6F, + 0x96D9, 0xEB70, + 0x96DA, 0xEB71, + 0x96DB, 0xEB72, + 0x96DC, 0xEB73, + 0x96DD, 0xEB74, + 0x96DE, 0xEB75, + 0x96DF, 0xEB76, + 0x96E1, 0xEB77, + 0x96E2, 0xEB78, + 0x96E3, 0xEB79, + 0x96E4, 0xEB7A, + 0x96E5, 0xEB7B, + 0x96E6, 0xEB7C, + 0x96E7, 0xEB7D, + 0x96EB, 0xEB7E, + 0x96EC, 0xEB80, + 0x96ED, 0xEB81, + 0x96EE, 0xEB82, + 0x96F0, 0xEB83, + 0x96F1, 0xEB84, + 0x96F2, 0xEB85, + 0x96F4, 0xEB86, + 0x96F5, 0xEB87, + 0x96F8, 0xEB88, + 0x96FA, 0xEB89, + 0x96FB, 0xEB8A, + 0x96FC, 0xEB8B, + 0x96FD, 0xEB8C, + 0x96FF, 0xEB8D, + 0x9702, 0xEB8E, + 0x9703, 0xEB8F, + 0x9705, 0xEB90, + 0x970A, 0xEB91, + 0x970B, 0xEB92, + 0x970C, 0xEB93, + 0x9710, 0xEB94, + 0x9711, 0xEB95, + 0x9712, 0xEB96, + 0x9714, 0xEB97, + 0x9715, 0xEB98, + 0x9717, 0xEB99, + 0x9718, 0xEB9A, + 0x9719, 0xEB9B, + 0x971A, 0xEB9C, + 0x971B, 0xEB9D, + 0x971D, 0xEB9E, + 0x971F, 0xEB9F, + 0x9720, 0xEBA0, + 0x9721, 0xEC40, + 0x9722, 0xEC41, + 0x9723, 0xEC42, + 0x9724, 0xEC43, + 0x9725, 0xEC44, + 0x9726, 0xEC45, + 0x9727, 0xEC46, + 0x9728, 0xEC47, + 0x9729, 0xEC48, + 0x972B, 0xEC49, + 0x972C, 0xEC4A, + 0x972E, 0xEC4B, + 0x972F, 0xEC4C, + 0x9731, 0xEC4D, + 0x9733, 0xEC4E, + 0x9734, 0xEC4F, + 0x9735, 0xEC50, + 0x9736, 0xEC51, + 0x9737, 0xEC52, + 0x973A, 0xEC53, + 0x973B, 0xEC54, + 0x973C, 0xEC55, + 0x973D, 0xEC56, + 0x973F, 0xEC57, + 0x9740, 0xEC58, + 0x9741, 0xEC59, + 0x9742, 0xEC5A, + 0x9743, 0xEC5B, + 0x9744, 0xEC5C, + 0x9745, 0xEC5D, + 0x9746, 0xEC5E, + 0x9747, 0xEC5F, + 0x9748, 0xEC60, + 0x9749, 0xEC61, + 0x974A, 0xEC62, + 0x974B, 0xEC63, + 0x974C, 0xEC64, + 0x974D, 0xEC65, + 0x974E, 0xEC66, + 0x974F, 0xEC67, + 0x9750, 0xEC68, + 0x9751, 0xEC69, + 0x9754, 0xEC6A, + 0x9755, 0xEC6B, + 0x9757, 0xEC6C, + 0x9758, 0xEC6D, + 0x975A, 0xEC6E, + 0x975C, 0xEC6F, + 0x975D, 0xEC70, + 0x975F, 0xEC71, + 0x9763, 0xEC72, + 0x9764, 0xEC73, + 0x9766, 0xEC74, + 0x9767, 0xEC75, + 0x9768, 0xEC76, + 0x976A, 0xEC77, + 0x976B, 0xEC78, + 0x976C, 0xEC79, + 0x976D, 0xEC7A, + 0x976E, 0xEC7B, + 0x976F, 0xEC7C, + 0x9770, 0xEC7D, + 0x9771, 0xEC7E, + 0x9772, 0xEC80, + 0x9775, 0xEC81, + 0x9777, 0xEC82, + 0x9778, 0xEC83, + 0x9779, 0xEC84, + 0x977A, 0xEC85, + 0x977B, 0xEC86, + 0x977D, 0xEC87, + 0x977E, 0xEC88, + 0x977F, 0xEC89, + 0x9780, 0xEC8A, + 0x9781, 0xEC8B, + 0x9782, 0xEC8C, + 0x9783, 0xEC8D, + 0x9784, 0xEC8E, + 0x9786, 0xEC8F, + 0x9787, 0xEC90, + 0x9788, 0xEC91, + 0x9789, 0xEC92, + 0x978A, 0xEC93, + 0x978C, 0xEC94, + 0x978E, 0xEC95, + 0x978F, 0xEC96, + 0x9790, 0xEC97, + 0x9793, 0xEC98, + 0x9795, 0xEC99, + 0x9796, 0xEC9A, + 0x9797, 0xEC9B, + 0x9799, 0xEC9C, + 0x979A, 0xEC9D, + 0x979B, 0xEC9E, + 0x979C, 0xEC9F, + 0x979D, 0xECA0, + 0x979E, 0xED40, + 0x979F, 0xED41, + 0x97A1, 0xED42, + 0x97A2, 0xED43, + 0x97A4, 0xED44, + 0x97A5, 0xED45, + 0x97A6, 0xED46, + 0x97A7, 0xED47, + 0x97A8, 0xED48, + 0x97A9, 0xED49, + 0x97AA, 0xED4A, + 0x97AC, 0xED4B, + 0x97AE, 0xED4C, + 0x97B0, 0xED4D, + 0x97B1, 0xED4E, + 0x97B3, 0xED4F, + 0x97B5, 0xED50, + 0x97B6, 0xED51, + 0x97B7, 0xED52, + 0x97B8, 0xED53, + 0x97B9, 0xED54, + 0x97BA, 0xED55, + 0x97BB, 0xED56, + 0x97BC, 0xED57, + 0x97BD, 0xED58, + 0x97BE, 0xED59, + 0x97BF, 0xED5A, + 0x97C0, 0xED5B, + 0x97C1, 0xED5C, + 0x97C2, 0xED5D, + 0x97C3, 0xED5E, + 0x97C4, 0xED5F, + 0x97C5, 0xED60, + 0x97C6, 0xED61, + 0x97C7, 0xED62, + 0x97C8, 0xED63, + 0x97C9, 0xED64, + 0x97CA, 0xED65, + 0x97CB, 0xED66, + 0x97CC, 0xED67, + 0x97CD, 0xED68, + 0x97CE, 0xED69, + 0x97CF, 0xED6A, + 0x97D0, 0xED6B, + 0x97D1, 0xED6C, + 0x97D2, 0xED6D, + 0x97D3, 0xED6E, + 0x97D4, 0xED6F, + 0x97D5, 0xED70, + 0x97D6, 0xED71, + 0x97D7, 0xED72, + 0x97D8, 0xED73, + 0x97D9, 0xED74, + 0x97DA, 0xED75, + 0x97DB, 0xED76, + 0x97DC, 0xED77, + 0x97DD, 0xED78, + 0x97DE, 0xED79, + 0x97DF, 0xED7A, + 0x97E0, 0xED7B, + 0x97E1, 0xED7C, + 0x97E2, 0xED7D, + 0x97E3, 0xED7E, + 0x97E4, 0xED80, + 0x97E5, 0xED81, + 0x97E8, 0xED82, + 0x97EE, 0xED83, + 0x97EF, 0xED84, + 0x97F0, 0xED85, + 0x97F1, 0xED86, + 0x97F2, 0xED87, + 0x97F4, 0xED88, + 0x97F7, 0xED89, + 0x97F8, 0xED8A, + 0x97F9, 0xED8B, + 0x97FA, 0xED8C, + 0x97FB, 0xED8D, + 0x97FC, 0xED8E, + 0x97FD, 0xED8F, + 0x97FE, 0xED90, + 0x97FF, 0xED91, + 0x9800, 0xED92, + 0x9801, 0xED93, + 0x9802, 0xED94, + 0x9803, 0xED95, + 0x9804, 0xED96, + 0x9805, 0xED97, + 0x9806, 0xED98, + 0x9807, 0xED99, + 0x9808, 0xED9A, + 0x9809, 0xED9B, + 0x980A, 0xED9C, + 0x980B, 0xED9D, + 0x980C, 0xED9E, + 0x980D, 0xED9F, + 0x980E, 0xEDA0, + 0x980F, 0xEE40, + 0x9810, 0xEE41, + 0x9811, 0xEE42, + 0x9812, 0xEE43, + 0x9813, 0xEE44, + 0x9814, 0xEE45, + 0x9815, 0xEE46, + 0x9816, 0xEE47, + 0x9817, 0xEE48, + 0x9818, 0xEE49, + 0x9819, 0xEE4A, + 0x981A, 0xEE4B, + 0x981B, 0xEE4C, + 0x981C, 0xEE4D, + 0x981D, 0xEE4E, + 0x981E, 0xEE4F, + 0x981F, 0xEE50, + 0x9820, 0xEE51, + 0x9821, 0xEE52, + 0x9822, 0xEE53, + 0x9823, 0xEE54, + 0x9824, 0xEE55, + 0x9825, 0xEE56, + 0x9826, 0xEE57, + 0x9827, 0xEE58, + 0x9828, 0xEE59, + 0x9829, 0xEE5A, + 0x982A, 0xEE5B, + 0x982B, 0xEE5C, + 0x982C, 0xEE5D, + 0x982D, 0xEE5E, + 0x982E, 0xEE5F, + 0x982F, 0xEE60, + 0x9830, 0xEE61, + 0x9831, 0xEE62, + 0x9832, 0xEE63, + 0x9833, 0xEE64, + 0x9834, 0xEE65, + 0x9835, 0xEE66, + 0x9836, 0xEE67, + 0x9837, 0xEE68, + 0x9838, 0xEE69, + 0x9839, 0xEE6A, + 0x983A, 0xEE6B, + 0x983B, 0xEE6C, + 0x983C, 0xEE6D, + 0x983D, 0xEE6E, + 0x983E, 0xEE6F, + 0x983F, 0xEE70, + 0x9840, 0xEE71, + 0x9841, 0xEE72, + 0x9842, 0xEE73, + 0x9843, 0xEE74, + 0x9844, 0xEE75, + 0x9845, 0xEE76, + 0x9846, 0xEE77, + 0x9847, 0xEE78, + 0x9848, 0xEE79, + 0x9849, 0xEE7A, + 0x984A, 0xEE7B, + 0x984B, 0xEE7C, + 0x984C, 0xEE7D, + 0x984D, 0xEE7E, + 0x984E, 0xEE80, + 0x984F, 0xEE81, + 0x9850, 0xEE82, + 0x9851, 0xEE83, + 0x9852, 0xEE84, + 0x9853, 0xEE85, + 0x9854, 0xEE86, + 0x9855, 0xEE87, + 0x9856, 0xEE88, + 0x9857, 0xEE89, + 0x9858, 0xEE8A, + 0x9859, 0xEE8B, + 0x985A, 0xEE8C, + 0x985B, 0xEE8D, + 0x985C, 0xEE8E, + 0x985D, 0xEE8F, + 0x985E, 0xEE90, + 0x985F, 0xEE91, + 0x9860, 0xEE92, + 0x9861, 0xEE93, + 0x9862, 0xEE94, + 0x9863, 0xEE95, + 0x9864, 0xEE96, + 0x9865, 0xEE97, + 0x9866, 0xEE98, + 0x9867, 0xEE99, + 0x9868, 0xEE9A, + 0x9869, 0xEE9B, + 0x986A, 0xEE9C, + 0x986B, 0xEE9D, + 0x986C, 0xEE9E, + 0x986D, 0xEE9F, + 0x986E, 0xEEA0, + 0x986F, 0xEF40, + 0x9870, 0xEF41, + 0x9871, 0xEF42, + 0x9872, 0xEF43, + 0x9873, 0xEF44, + 0x9874, 0xEF45, + 0x988B, 0xEF46, + 0x988E, 0xEF47, + 0x9892, 0xEF48, + 0x9895, 0xEF49, + 0x9899, 0xEF4A, + 0x98A3, 0xEF4B, + 0x98A8, 0xEF4C, + 0x98A9, 0xEF4D, + 0x98AA, 0xEF4E, + 0x98AB, 0xEF4F, + 0x98AC, 0xEF50, + 0x98AD, 0xEF51, + 0x98AE, 0xEF52, + 0x98AF, 0xEF53, + 0x98B0, 0xEF54, + 0x98B1, 0xEF55, + 0x98B2, 0xEF56, + 0x98B3, 0xEF57, + 0x98B4, 0xEF58, + 0x98B5, 0xEF59, + 0x98B6, 0xEF5A, + 0x98B7, 0xEF5B, + 0x98B8, 0xEF5C, + 0x98B9, 0xEF5D, + 0x98BA, 0xEF5E, + 0x98BB, 0xEF5F, + 0x98BC, 0xEF60, + 0x98BD, 0xEF61, + 0x98BE, 0xEF62, + 0x98BF, 0xEF63, + 0x98C0, 0xEF64, + 0x98C1, 0xEF65, + 0x98C2, 0xEF66, + 0x98C3, 0xEF67, + 0x98C4, 0xEF68, + 0x98C5, 0xEF69, + 0x98C6, 0xEF6A, + 0x98C7, 0xEF6B, + 0x98C8, 0xEF6C, + 0x98C9, 0xEF6D, + 0x98CA, 0xEF6E, + 0x98CB, 0xEF6F, + 0x98CC, 0xEF70, + 0x98CD, 0xEF71, + 0x98CF, 0xEF72, + 0x98D0, 0xEF73, + 0x98D4, 0xEF74, + 0x98D6, 0xEF75, + 0x98D7, 0xEF76, + 0x98DB, 0xEF77, + 0x98DC, 0xEF78, + 0x98DD, 0xEF79, + 0x98E0, 0xEF7A, + 0x98E1, 0xEF7B, + 0x98E2, 0xEF7C, + 0x98E3, 0xEF7D, + 0x98E4, 0xEF7E, + 0x98E5, 0xEF80, + 0x98E6, 0xEF81, + 0x98E9, 0xEF82, + 0x98EA, 0xEF83, + 0x98EB, 0xEF84, + 0x98EC, 0xEF85, + 0x98ED, 0xEF86, + 0x98EE, 0xEF87, + 0x98EF, 0xEF88, + 0x98F0, 0xEF89, + 0x98F1, 0xEF8A, + 0x98F2, 0xEF8B, + 0x98F3, 0xEF8C, + 0x98F4, 0xEF8D, + 0x98F5, 0xEF8E, + 0x98F6, 0xEF8F, + 0x98F7, 0xEF90, + 0x98F8, 0xEF91, + 0x98F9, 0xEF92, + 0x98FA, 0xEF93, + 0x98FB, 0xEF94, + 0x98FC, 0xEF95, + 0x98FD, 0xEF96, + 0x98FE, 0xEF97, + 0x98FF, 0xEF98, + 0x9900, 0xEF99, + 0x9901, 0xEF9A, + 0x9902, 0xEF9B, + 0x9903, 0xEF9C, + 0x9904, 0xEF9D, + 0x9905, 0xEF9E, + 0x9906, 0xEF9F, + 0x9907, 0xEFA0, + 0x9908, 0xF040, + 0x9909, 0xF041, + 0x990A, 0xF042, + 0x990B, 0xF043, + 0x990C, 0xF044, + 0x990E, 0xF045, + 0x990F, 0xF046, + 0x9911, 0xF047, + 0x9912, 0xF048, + 0x9913, 0xF049, + 0x9914, 0xF04A, + 0x9915, 0xF04B, + 0x9916, 0xF04C, + 0x9917, 0xF04D, + 0x9918, 0xF04E, + 0x9919, 0xF04F, + 0x991A, 0xF050, + 0x991B, 0xF051, + 0x991C, 0xF052, + 0x991D, 0xF053, + 0x991E, 0xF054, + 0x991F, 0xF055, + 0x9920, 0xF056, + 0x9921, 0xF057, + 0x9922, 0xF058, + 0x9923, 0xF059, + 0x9924, 0xF05A, + 0x9925, 0xF05B, + 0x9926, 0xF05C, + 0x9927, 0xF05D, + 0x9928, 0xF05E, + 0x9929, 0xF05F, + 0x992A, 0xF060, + 0x992B, 0xF061, + 0x992C, 0xF062, + 0x992D, 0xF063, + 0x992F, 0xF064, + 0x9930, 0xF065, + 0x9931, 0xF066, + 0x9932, 0xF067, + 0x9933, 0xF068, + 0x9934, 0xF069, + 0x9935, 0xF06A, + 0x9936, 0xF06B, + 0x9937, 0xF06C, + 0x9938, 0xF06D, + 0x9939, 0xF06E, + 0x993A, 0xF06F, + 0x993B, 0xF070, + 0x993C, 0xF071, + 0x993D, 0xF072, + 0x993E, 0xF073, + 0x993F, 0xF074, + 0x9940, 0xF075, + 0x9941, 0xF076, + 0x9942, 0xF077, + 0x9943, 0xF078, + 0x9944, 0xF079, + 0x9945, 0xF07A, + 0x9946, 0xF07B, + 0x9947, 0xF07C, + 0x9948, 0xF07D, + 0x9949, 0xF07E, + 0x994A, 0xF080, + 0x994B, 0xF081, + 0x994C, 0xF082, + 0x994D, 0xF083, + 0x994E, 0xF084, + 0x994F, 0xF085, + 0x9950, 0xF086, + 0x9951, 0xF087, + 0x9952, 0xF088, + 0x9953, 0xF089, + 0x9956, 0xF08A, + 0x9957, 0xF08B, + 0x9958, 0xF08C, + 0x9959, 0xF08D, + 0x995A, 0xF08E, + 0x995B, 0xF08F, + 0x995C, 0xF090, + 0x995D, 0xF091, + 0x995E, 0xF092, + 0x995F, 0xF093, + 0x9960, 0xF094, + 0x9961, 0xF095, + 0x9962, 0xF096, + 0x9964, 0xF097, + 0x9966, 0xF098, + 0x9973, 0xF099, + 0x9978, 0xF09A, + 0x9979, 0xF09B, + 0x997B, 0xF09C, + 0x997E, 0xF09D, + 0x9982, 0xF09E, + 0x9983, 0xF09F, + 0x9989, 0xF0A0, + 0x998C, 0xF140, + 0x998E, 0xF141, + 0x999A, 0xF142, + 0x999B, 0xF143, + 0x999C, 0xF144, + 0x999D, 0xF145, + 0x999E, 0xF146, + 0x999F, 0xF147, + 0x99A0, 0xF148, + 0x99A1, 0xF149, + 0x99A2, 0xF14A, + 0x99A3, 0xF14B, + 0x99A4, 0xF14C, + 0x99A6, 0xF14D, + 0x99A7, 0xF14E, + 0x99A9, 0xF14F, + 0x99AA, 0xF150, + 0x99AB, 0xF151, + 0x99AC, 0xF152, + 0x99AD, 0xF153, + 0x99AE, 0xF154, + 0x99AF, 0xF155, + 0x99B0, 0xF156, + 0x99B1, 0xF157, + 0x99B2, 0xF158, + 0x99B3, 0xF159, + 0x99B4, 0xF15A, + 0x99B5, 0xF15B, + 0x99B6, 0xF15C, + 0x99B7, 0xF15D, + 0x99B8, 0xF15E, + 0x99B9, 0xF15F, + 0x99BA, 0xF160, + 0x99BB, 0xF161, + 0x99BC, 0xF162, + 0x99BD, 0xF163, + 0x99BE, 0xF164, + 0x99BF, 0xF165, + 0x99C0, 0xF166, + 0x99C1, 0xF167, + 0x99C2, 0xF168, + 0x99C3, 0xF169, + 0x99C4, 0xF16A, + 0x99C5, 0xF16B, + 0x99C6, 0xF16C, + 0x99C7, 0xF16D, + 0x99C8, 0xF16E, + 0x99C9, 0xF16F, + 0x99CA, 0xF170, + 0x99CB, 0xF171, + 0x99CC, 0xF172, + 0x99CD, 0xF173, + 0x99CE, 0xF174, + 0x99CF, 0xF175, + 0x99D0, 0xF176, + 0x99D1, 0xF177, + 0x99D2, 0xF178, + 0x99D3, 0xF179, + 0x99D4, 0xF17A, + 0x99D5, 0xF17B, + 0x99D6, 0xF17C, + 0x99D7, 0xF17D, + 0x99D8, 0xF17E, + 0x99D9, 0xF180, + 0x99DA, 0xF181, + 0x99DB, 0xF182, + 0x99DC, 0xF183, + 0x99DD, 0xF184, + 0x99DE, 0xF185, + 0x99DF, 0xF186, + 0x99E0, 0xF187, + 0x99E1, 0xF188, + 0x99E2, 0xF189, + 0x99E3, 0xF18A, + 0x99E4, 0xF18B, + 0x99E5, 0xF18C, + 0x99E6, 0xF18D, + 0x99E7, 0xF18E, + 0x99E8, 0xF18F, + 0x99E9, 0xF190, + 0x99EA, 0xF191, + 0x99EB, 0xF192, + 0x99EC, 0xF193, + 0x99ED, 0xF194, + 0x99EE, 0xF195, + 0x99EF, 0xF196, + 0x99F0, 0xF197, + 0x99F1, 0xF198, + 0x99F2, 0xF199, + 0x99F3, 0xF19A, + 0x99F4, 0xF19B, + 0x99F5, 0xF19C, + 0x99F6, 0xF19D, + 0x99F7, 0xF19E, + 0x99F8, 0xF19F, + 0x99F9, 0xF1A0, + 0x99FA, 0xF240, + 0x99FB, 0xF241, + 0x99FC, 0xF242, + 0x99FD, 0xF243, + 0x99FE, 0xF244, + 0x99FF, 0xF245, + 0x9A00, 0xF246, + 0x9A01, 0xF247, + 0x9A02, 0xF248, + 0x9A03, 0xF249, + 0x9A04, 0xF24A, + 0x9A05, 0xF24B, + 0x9A06, 0xF24C, + 0x9A07, 0xF24D, + 0x9A08, 0xF24E, + 0x9A09, 0xF24F, + 0x9A0A, 0xF250, + 0x9A0B, 0xF251, + 0x9A0C, 0xF252, + 0x9A0D, 0xF253, + 0x9A0E, 0xF254, + 0x9A0F, 0xF255, + 0x9A10, 0xF256, + 0x9A11, 0xF257, + 0x9A12, 0xF258, + 0x9A13, 0xF259, + 0x9A14, 0xF25A, + 0x9A15, 0xF25B, + 0x9A16, 0xF25C, + 0x9A17, 0xF25D, + 0x9A18, 0xF25E, + 0x9A19, 0xF25F, + 0x9A1A, 0xF260, + 0x9A1B, 0xF261, + 0x9A1C, 0xF262, + 0x9A1D, 0xF263, + 0x9A1E, 0xF264, + 0x9A1F, 0xF265, + 0x9A20, 0xF266, + 0x9A21, 0xF267, + 0x9A22, 0xF268, + 0x9A23, 0xF269, + 0x9A24, 0xF26A, + 0x9A25, 0xF26B, + 0x9A26, 0xF26C, + 0x9A27, 0xF26D, + 0x9A28, 0xF26E, + 0x9A29, 0xF26F, + 0x9A2A, 0xF270, + 0x9A2B, 0xF271, + 0x9A2C, 0xF272, + 0x9A2D, 0xF273, + 0x9A2E, 0xF274, + 0x9A2F, 0xF275, + 0x9A30, 0xF276, + 0x9A31, 0xF277, + 0x9A32, 0xF278, + 0x9A33, 0xF279, + 0x9A34, 0xF27A, + 0x9A35, 0xF27B, + 0x9A36, 0xF27C, + 0x9A37, 0xF27D, + 0x9A38, 0xF27E, + 0x9A39, 0xF280, + 0x9A3A, 0xF281, + 0x9A3B, 0xF282, + 0x9A3C, 0xF283, + 0x9A3D, 0xF284, + 0x9A3E, 0xF285, + 0x9A3F, 0xF286, + 0x9A40, 0xF287, + 0x9A41, 0xF288, + 0x9A42, 0xF289, + 0x9A43, 0xF28A, + 0x9A44, 0xF28B, + 0x9A45, 0xF28C, + 0x9A46, 0xF28D, + 0x9A47, 0xF28E, + 0x9A48, 0xF28F, + 0x9A49, 0xF290, + 0x9A4A, 0xF291, + 0x9A4B, 0xF292, + 0x9A4C, 0xF293, + 0x9A4D, 0xF294, + 0x9A4E, 0xF295, + 0x9A4F, 0xF296, + 0x9A50, 0xF297, + 0x9A51, 0xF298, + 0x9A52, 0xF299, + 0x9A53, 0xF29A, + 0x9A54, 0xF29B, + 0x9A55, 0xF29C, + 0x9A56, 0xF29D, + 0x9A57, 0xF29E, + 0x9A58, 0xF29F, + 0x9A59, 0xF2A0, + 0x9A5A, 0xF340, + 0x9A5B, 0xF341, + 0x9A5C, 0xF342, + 0x9A5D, 0xF343, + 0x9A5E, 0xF344, + 0x9A5F, 0xF345, + 0x9A60, 0xF346, + 0x9A61, 0xF347, + 0x9A62, 0xF348, + 0x9A63, 0xF349, + 0x9A64, 0xF34A, + 0x9A65, 0xF34B, + 0x9A66, 0xF34C, + 0x9A67, 0xF34D, + 0x9A68, 0xF34E, + 0x9A69, 0xF34F, + 0x9A6A, 0xF350, + 0x9A6B, 0xF351, + 0x9A72, 0xF352, + 0x9A83, 0xF353, + 0x9A89, 0xF354, + 0x9A8D, 0xF355, + 0x9A8E, 0xF356, + 0x9A94, 0xF357, + 0x9A95, 0xF358, + 0x9A99, 0xF359, + 0x9AA6, 0xF35A, + 0x9AA9, 0xF35B, + 0x9AAA, 0xF35C, + 0x9AAB, 0xF35D, + 0x9AAC, 0xF35E, + 0x9AAD, 0xF35F, + 0x9AAE, 0xF360, + 0x9AAF, 0xF361, + 0x9AB2, 0xF362, + 0x9AB3, 0xF363, + 0x9AB4, 0xF364, + 0x9AB5, 0xF365, + 0x9AB9, 0xF366, + 0x9ABB, 0xF367, + 0x9ABD, 0xF368, + 0x9ABE, 0xF369, + 0x9ABF, 0xF36A, + 0x9AC3, 0xF36B, + 0x9AC4, 0xF36C, + 0x9AC6, 0xF36D, + 0x9AC7, 0xF36E, + 0x9AC8, 0xF36F, + 0x9AC9, 0xF370, + 0x9ACA, 0xF371, + 0x9ACD, 0xF372, + 0x9ACE, 0xF373, + 0x9ACF, 0xF374, + 0x9AD0, 0xF375, + 0x9AD2, 0xF376, + 0x9AD4, 0xF377, + 0x9AD5, 0xF378, + 0x9AD6, 0xF379, + 0x9AD7, 0xF37A, + 0x9AD9, 0xF37B, + 0x9ADA, 0xF37C, + 0x9ADB, 0xF37D, + 0x9ADC, 0xF37E, + 0x9ADD, 0xF380, + 0x9ADE, 0xF381, + 0x9AE0, 0xF382, + 0x9AE2, 0xF383, + 0x9AE3, 0xF384, + 0x9AE4, 0xF385, + 0x9AE5, 0xF386, + 0x9AE7, 0xF387, + 0x9AE8, 0xF388, + 0x9AE9, 0xF389, + 0x9AEA, 0xF38A, + 0x9AEC, 0xF38B, + 0x9AEE, 0xF38C, + 0x9AF0, 0xF38D, + 0x9AF1, 0xF38E, + 0x9AF2, 0xF38F, + 0x9AF3, 0xF390, + 0x9AF4, 0xF391, + 0x9AF5, 0xF392, + 0x9AF6, 0xF393, + 0x9AF7, 0xF394, + 0x9AF8, 0xF395, + 0x9AFA, 0xF396, + 0x9AFC, 0xF397, + 0x9AFD, 0xF398, + 0x9AFE, 0xF399, + 0x9AFF, 0xF39A, + 0x9B00, 0xF39B, + 0x9B01, 0xF39C, + 0x9B02, 0xF39D, + 0x9B04, 0xF39E, + 0x9B05, 0xF39F, + 0x9B06, 0xF3A0, + 0x9B07, 0xF440, + 0x9B09, 0xF441, + 0x9B0A, 0xF442, + 0x9B0B, 0xF443, + 0x9B0C, 0xF444, + 0x9B0D, 0xF445, + 0x9B0E, 0xF446, + 0x9B10, 0xF447, + 0x9B11, 0xF448, + 0x9B12, 0xF449, + 0x9B14, 0xF44A, + 0x9B15, 0xF44B, + 0x9B16, 0xF44C, + 0x9B17, 0xF44D, + 0x9B18, 0xF44E, + 0x9B19, 0xF44F, + 0x9B1A, 0xF450, + 0x9B1B, 0xF451, + 0x9B1C, 0xF452, + 0x9B1D, 0xF453, + 0x9B1E, 0xF454, + 0x9B20, 0xF455, + 0x9B21, 0xF456, + 0x9B22, 0xF457, + 0x9B24, 0xF458, + 0x9B25, 0xF459, + 0x9B26, 0xF45A, + 0x9B27, 0xF45B, + 0x9B28, 0xF45C, + 0x9B29, 0xF45D, + 0x9B2A, 0xF45E, + 0x9B2B, 0xF45F, + 0x9B2C, 0xF460, + 0x9B2D, 0xF461, + 0x9B2E, 0xF462, + 0x9B30, 0xF463, + 0x9B31, 0xF464, + 0x9B33, 0xF465, + 0x9B34, 0xF466, + 0x9B35, 0xF467, + 0x9B36, 0xF468, + 0x9B37, 0xF469, + 0x9B38, 0xF46A, + 0x9B39, 0xF46B, + 0x9B3A, 0xF46C, + 0x9B3D, 0xF46D, + 0x9B3E, 0xF46E, + 0x9B3F, 0xF46F, + 0x9B40, 0xF470, + 0x9B46, 0xF471, + 0x9B4A, 0xF472, + 0x9B4B, 0xF473, + 0x9B4C, 0xF474, + 0x9B4E, 0xF475, + 0x9B50, 0xF476, + 0x9B52, 0xF477, + 0x9B53, 0xF478, + 0x9B55, 0xF479, + 0x9B56, 0xF47A, + 0x9B57, 0xF47B, + 0x9B58, 0xF47C, + 0x9B59, 0xF47D, + 0x9B5A, 0xF47E, + 0x9B5B, 0xF480, + 0x9B5C, 0xF481, + 0x9B5D, 0xF482, + 0x9B5E, 0xF483, + 0x9B5F, 0xF484, + 0x9B60, 0xF485, + 0x9B61, 0xF486, + 0x9B62, 0xF487, + 0x9B63, 0xF488, + 0x9B64, 0xF489, + 0x9B65, 0xF48A, + 0x9B66, 0xF48B, + 0x9B67, 0xF48C, + 0x9B68, 0xF48D, + 0x9B69, 0xF48E, + 0x9B6A, 0xF48F, + 0x9B6B, 0xF490, + 0x9B6C, 0xF491, + 0x9B6D, 0xF492, + 0x9B6E, 0xF493, + 0x9B6F, 0xF494, + 0x9B70, 0xF495, + 0x9B71, 0xF496, + 0x9B72, 0xF497, + 0x9B73, 0xF498, + 0x9B74, 0xF499, + 0x9B75, 0xF49A, + 0x9B76, 0xF49B, + 0x9B77, 0xF49C, + 0x9B78, 0xF49D, + 0x9B79, 0xF49E, + 0x9B7A, 0xF49F, + 0x9B7B, 0xF4A0, + 0x9B7C, 0xF540, + 0x9B7D, 0xF541, + 0x9B7E, 0xF542, + 0x9B7F, 0xF543, + 0x9B80, 0xF544, + 0x9B81, 0xF545, + 0x9B82, 0xF546, + 0x9B83, 0xF547, + 0x9B84, 0xF548, + 0x9B85, 0xF549, + 0x9B86, 0xF54A, + 0x9B87, 0xF54B, + 0x9B88, 0xF54C, + 0x9B89, 0xF54D, + 0x9B8A, 0xF54E, + 0x9B8B, 0xF54F, + 0x9B8C, 0xF550, + 0x9B8D, 0xF551, + 0x9B8E, 0xF552, + 0x9B8F, 0xF553, + 0x9B90, 0xF554, + 0x9B91, 0xF555, + 0x9B92, 0xF556, + 0x9B93, 0xF557, + 0x9B94, 0xF558, + 0x9B95, 0xF559, + 0x9B96, 0xF55A, + 0x9B97, 0xF55B, + 0x9B98, 0xF55C, + 0x9B99, 0xF55D, + 0x9B9A, 0xF55E, + 0x9B9B, 0xF55F, + 0x9B9C, 0xF560, + 0x9B9D, 0xF561, + 0x9B9E, 0xF562, + 0x9B9F, 0xF563, + 0x9BA0, 0xF564, + 0x9BA1, 0xF565, + 0x9BA2, 0xF566, + 0x9BA3, 0xF567, + 0x9BA4, 0xF568, + 0x9BA5, 0xF569, + 0x9BA6, 0xF56A, + 0x9BA7, 0xF56B, + 0x9BA8, 0xF56C, + 0x9BA9, 0xF56D, + 0x9BAA, 0xF56E, + 0x9BAB, 0xF56F, + 0x9BAC, 0xF570, + 0x9BAD, 0xF571, + 0x9BAE, 0xF572, + 0x9BAF, 0xF573, + 0x9BB0, 0xF574, + 0x9BB1, 0xF575, + 0x9BB2, 0xF576, + 0x9BB3, 0xF577, + 0x9BB4, 0xF578, + 0x9BB5, 0xF579, + 0x9BB6, 0xF57A, + 0x9BB7, 0xF57B, + 0x9BB8, 0xF57C, + 0x9BB9, 0xF57D, + 0x9BBA, 0xF57E, + 0x9BBB, 0xF580, + 0x9BBC, 0xF581, + 0x9BBD, 0xF582, + 0x9BBE, 0xF583, + 0x9BBF, 0xF584, + 0x9BC0, 0xF585, + 0x9BC1, 0xF586, + 0x9BC2, 0xF587, + 0x9BC3, 0xF588, + 0x9BC4, 0xF589, + 0x9BC5, 0xF58A, + 0x9BC6, 0xF58B, + 0x9BC7, 0xF58C, + 0x9BC8, 0xF58D, + 0x9BC9, 0xF58E, + 0x9BCA, 0xF58F, + 0x9BCB, 0xF590, + 0x9BCC, 0xF591, + 0x9BCD, 0xF592, + 0x9BCE, 0xF593, + 0x9BCF, 0xF594, + 0x9BD0, 0xF595, + 0x9BD1, 0xF596, + 0x9BD2, 0xF597, + 0x9BD3, 0xF598, + 0x9BD4, 0xF599, + 0x9BD5, 0xF59A, + 0x9BD6, 0xF59B, + 0x9BD7, 0xF59C, + 0x9BD8, 0xF59D, + 0x9BD9, 0xF59E, + 0x9BDA, 0xF59F, + 0x9BDB, 0xF5A0, + 0x9BDC, 0xF640, + 0x9BDD, 0xF641, + 0x9BDE, 0xF642, + 0x9BDF, 0xF643, + 0x9BE0, 0xF644, + 0x9BE1, 0xF645, + 0x9BE2, 0xF646, + 0x9BE3, 0xF647, + 0x9BE4, 0xF648, + 0x9BE5, 0xF649, + 0x9BE6, 0xF64A, + 0x9BE7, 0xF64B, + 0x9BE8, 0xF64C, + 0x9BE9, 0xF64D, + 0x9BEA, 0xF64E, + 0x9BEB, 0xF64F, + 0x9BEC, 0xF650, + 0x9BED, 0xF651, + 0x9BEE, 0xF652, + 0x9BEF, 0xF653, + 0x9BF0, 0xF654, + 0x9BF1, 0xF655, + 0x9BF2, 0xF656, + 0x9BF3, 0xF657, + 0x9BF4, 0xF658, + 0x9BF5, 0xF659, + 0x9BF6, 0xF65A, + 0x9BF7, 0xF65B, + 0x9BF8, 0xF65C, + 0x9BF9, 0xF65D, + 0x9BFA, 0xF65E, + 0x9BFB, 0xF65F, + 0x9BFC, 0xF660, + 0x9BFD, 0xF661, + 0x9BFE, 0xF662, + 0x9BFF, 0xF663, + 0x9C00, 0xF664, + 0x9C01, 0xF665, + 0x9C02, 0xF666, + 0x9C03, 0xF667, + 0x9C04, 0xF668, + 0x9C05, 0xF669, + 0x9C06, 0xF66A, + 0x9C07, 0xF66B, + 0x9C08, 0xF66C, + 0x9C09, 0xF66D, + 0x9C0A, 0xF66E, + 0x9C0B, 0xF66F, + 0x9C0C, 0xF670, + 0x9C0D, 0xF671, + 0x9C0E, 0xF672, + 0x9C0F, 0xF673, + 0x9C10, 0xF674, + 0x9C11, 0xF675, + 0x9C12, 0xF676, + 0x9C13, 0xF677, + 0x9C14, 0xF678, + 0x9C15, 0xF679, + 0x9C16, 0xF67A, + 0x9C17, 0xF67B, + 0x9C18, 0xF67C, + 0x9C19, 0xF67D, + 0x9C1A, 0xF67E, + 0x9C1B, 0xF680, + 0x9C1C, 0xF681, + 0x9C1D, 0xF682, + 0x9C1E, 0xF683, + 0x9C1F, 0xF684, + 0x9C20, 0xF685, + 0x9C21, 0xF686, + 0x9C22, 0xF687, + 0x9C23, 0xF688, + 0x9C24, 0xF689, + 0x9C25, 0xF68A, + 0x9C26, 0xF68B, + 0x9C27, 0xF68C, + 0x9C28, 0xF68D, + 0x9C29, 0xF68E, + 0x9C2A, 0xF68F, + 0x9C2B, 0xF690, + 0x9C2C, 0xF691, + 0x9C2D, 0xF692, + 0x9C2E, 0xF693, + 0x9C2F, 0xF694, + 0x9C30, 0xF695, + 0x9C31, 0xF696, + 0x9C32, 0xF697, + 0x9C33, 0xF698, + 0x9C34, 0xF699, + 0x9C35, 0xF69A, + 0x9C36, 0xF69B, + 0x9C37, 0xF69C, + 0x9C38, 0xF69D, + 0x9C39, 0xF69E, + 0x9C3A, 0xF69F, + 0x9C3B, 0xF6A0, + 0x9C3C, 0xF740, + 0x9C3D, 0xF741, + 0x9C3E, 0xF742, + 0x9C3F, 0xF743, + 0x9C40, 0xF744, + 0x9C41, 0xF745, + 0x9C42, 0xF746, + 0x9C43, 0xF747, + 0x9C44, 0xF748, + 0x9C45, 0xF749, + 0x9C46, 0xF74A, + 0x9C47, 0xF74B, + 0x9C48, 0xF74C, + 0x9C49, 0xF74D, + 0x9C4A, 0xF74E, + 0x9C4B, 0xF74F, + 0x9C4C, 0xF750, + 0x9C4D, 0xF751, + 0x9C4E, 0xF752, + 0x9C4F, 0xF753, + 0x9C50, 0xF754, + 0x9C51, 0xF755, + 0x9C52, 0xF756, + 0x9C53, 0xF757, + 0x9C54, 0xF758, + 0x9C55, 0xF759, + 0x9C56, 0xF75A, + 0x9C57, 0xF75B, + 0x9C58, 0xF75C, + 0x9C59, 0xF75D, + 0x9C5A, 0xF75E, + 0x9C5B, 0xF75F, + 0x9C5C, 0xF760, + 0x9C5D, 0xF761, + 0x9C5E, 0xF762, + 0x9C5F, 0xF763, + 0x9C60, 0xF764, + 0x9C61, 0xF765, + 0x9C62, 0xF766, + 0x9C63, 0xF767, + 0x9C64, 0xF768, + 0x9C65, 0xF769, + 0x9C66, 0xF76A, + 0x9C67, 0xF76B, + 0x9C68, 0xF76C, + 0x9C69, 0xF76D, + 0x9C6A, 0xF76E, + 0x9C6B, 0xF76F, + 0x9C6C, 0xF770, + 0x9C6D, 0xF771, + 0x9C6E, 0xF772, + 0x9C6F, 0xF773, + 0x9C70, 0xF774, + 0x9C71, 0xF775, + 0x9C72, 0xF776, + 0x9C73, 0xF777, + 0x9C74, 0xF778, + 0x9C75, 0xF779, + 0x9C76, 0xF77A, + 0x9C77, 0xF77B, + 0x9C78, 0xF77C, + 0x9C79, 0xF77D, + 0x9C7A, 0xF77E, + 0x9C7B, 0xF780, + 0x9C7D, 0xF781, + 0x9C7E, 0xF782, + 0x9C80, 0xF783, + 0x9C83, 0xF784, + 0x9C84, 0xF785, + 0x9C89, 0xF786, + 0x9C8A, 0xF787, + 0x9C8C, 0xF788, + 0x9C8F, 0xF789, + 0x9C93, 0xF78A, + 0x9C96, 0xF78B, + 0x9C97, 0xF78C, + 0x9C98, 0xF78D, + 0x9C99, 0xF78E, + 0x9C9D, 0xF78F, + 0x9CAA, 0xF790, + 0x9CAC, 0xF791, + 0x9CAF, 0xF792, + 0x9CB9, 0xF793, + 0x9CBE, 0xF794, + 0x9CBF, 0xF795, + 0x9CC0, 0xF796, + 0x9CC1, 0xF797, + 0x9CC2, 0xF798, + 0x9CC8, 0xF799, + 0x9CC9, 0xF79A, + 0x9CD1, 0xF79B, + 0x9CD2, 0xF79C, + 0x9CDA, 0xF79D, + 0x9CDB, 0xF79E, + 0x9CE0, 0xF79F, + 0x9CE1, 0xF7A0, + 0x9CE3, 0xF840, + 0x9CE4, 0xF841, + 0x9CE5, 0xF842, + 0x9CE6, 0xF843, + 0x9CE7, 0xF844, + 0x9CE8, 0xF845, + 0x9CE9, 0xF846, + 0x9CEA, 0xF847, + 0x9CEB, 0xF848, + 0x9CEC, 0xF849, + 0x9CED, 0xF84A, + 0x9CEE, 0xF84B, + 0x9CEF, 0xF84C, + 0x9CF0, 0xF84D, + 0x9CF1, 0xF84E, + 0x9CF2, 0xF84F, + 0x9CF3, 0xF850, + 0x9CF4, 0xF851, + 0x9CF5, 0xF852, + 0x9CF6, 0xF853, + 0x9CF7, 0xF854, + 0x9CF8, 0xF855, + 0x9CF9, 0xF856, + 0x9CFA, 0xF857, + 0x9CFB, 0xF858, + 0x9CFC, 0xF859, + 0x9CFD, 0xF85A, + 0x9CFE, 0xF85B, + 0x9CFF, 0xF85C, + 0x9D00, 0xF85D, + 0x9D01, 0xF85E, + 0x9D02, 0xF85F, + 0x9D03, 0xF860, + 0x9D04, 0xF861, + 0x9D05, 0xF862, + 0x9D06, 0xF863, + 0x9D07, 0xF864, + 0x9D08, 0xF865, + 0x9D09, 0xF866, + 0x9D0A, 0xF867, + 0x9D0B, 0xF868, + 0x9D0C, 0xF869, + 0x9D0D, 0xF86A, + 0x9D0E, 0xF86B, + 0x9D0F, 0xF86C, + 0x9D10, 0xF86D, + 0x9D11, 0xF86E, + 0x9D12, 0xF86F, + 0x9D13, 0xF870, + 0x9D14, 0xF871, + 0x9D15, 0xF872, + 0x9D16, 0xF873, + 0x9D17, 0xF874, + 0x9D18, 0xF875, + 0x9D19, 0xF876, + 0x9D1A, 0xF877, + 0x9D1B, 0xF878, + 0x9D1C, 0xF879, + 0x9D1D, 0xF87A, + 0x9D1E, 0xF87B, + 0x9D1F, 0xF87C, + 0x9D20, 0xF87D, + 0x9D21, 0xF87E, + 0x9D22, 0xF880, + 0x9D23, 0xF881, + 0x9D24, 0xF882, + 0x9D25, 0xF883, + 0x9D26, 0xF884, + 0x9D27, 0xF885, + 0x9D28, 0xF886, + 0x9D29, 0xF887, + 0x9D2A, 0xF888, + 0x9D2B, 0xF889, + 0x9D2C, 0xF88A, + 0x9D2D, 0xF88B, + 0x9D2E, 0xF88C, + 0x9D2F, 0xF88D, + 0x9D30, 0xF88E, + 0x9D31, 0xF88F, + 0x9D32, 0xF890, + 0x9D33, 0xF891, + 0x9D34, 0xF892, + 0x9D35, 0xF893, + 0x9D36, 0xF894, + 0x9D37, 0xF895, + 0x9D38, 0xF896, + 0x9D39, 0xF897, + 0x9D3A, 0xF898, + 0x9D3B, 0xF899, + 0x9D3C, 0xF89A, + 0x9D3D, 0xF89B, + 0x9D3E, 0xF89C, + 0x9D3F, 0xF89D, + 0x9D40, 0xF89E, + 0x9D41, 0xF89F, + 0x9D42, 0xF8A0, + 0x9D43, 0xF940, + 0x9D44, 0xF941, + 0x9D45, 0xF942, + 0x9D46, 0xF943, + 0x9D47, 0xF944, + 0x9D48, 0xF945, + 0x9D49, 0xF946, + 0x9D4A, 0xF947, + 0x9D4B, 0xF948, + 0x9D4C, 0xF949, + 0x9D4D, 0xF94A, + 0x9D4E, 0xF94B, + 0x9D4F, 0xF94C, + 0x9D50, 0xF94D, + 0x9D51, 0xF94E, + 0x9D52, 0xF94F, + 0x9D53, 0xF950, + 0x9D54, 0xF951, + 0x9D55, 0xF952, + 0x9D56, 0xF953, + 0x9D57, 0xF954, + 0x9D58, 0xF955, + 0x9D59, 0xF956, + 0x9D5A, 0xF957, + 0x9D5B, 0xF958, + 0x9D5C, 0xF959, + 0x9D5D, 0xF95A, + 0x9D5E, 0xF95B, + 0x9D5F, 0xF95C, + 0x9D60, 0xF95D, + 0x9D61, 0xF95E, + 0x9D62, 0xF95F, + 0x9D63, 0xF960, + 0x9D64, 0xF961, + 0x9D65, 0xF962, + 0x9D66, 0xF963, + 0x9D67, 0xF964, + 0x9D68, 0xF965, + 0x9D69, 0xF966, + 0x9D6A, 0xF967, + 0x9D6B, 0xF968, + 0x9D6C, 0xF969, + 0x9D6D, 0xF96A, + 0x9D6E, 0xF96B, + 0x9D6F, 0xF96C, + 0x9D70, 0xF96D, + 0x9D71, 0xF96E, + 0x9D72, 0xF96F, + 0x9D73, 0xF970, + 0x9D74, 0xF971, + 0x9D75, 0xF972, + 0x9D76, 0xF973, + 0x9D77, 0xF974, + 0x9D78, 0xF975, + 0x9D79, 0xF976, + 0x9D7A, 0xF977, + 0x9D7B, 0xF978, + 0x9D7C, 0xF979, + 0x9D7D, 0xF97A, + 0x9D7E, 0xF97B, + 0x9D7F, 0xF97C, + 0x9D80, 0xF97D, + 0x9D81, 0xF97E, + 0x9D82, 0xF980, + 0x9D83, 0xF981, + 0x9D84, 0xF982, + 0x9D85, 0xF983, + 0x9D86, 0xF984, + 0x9D87, 0xF985, + 0x9D88, 0xF986, + 0x9D89, 0xF987, + 0x9D8A, 0xF988, + 0x9D8B, 0xF989, + 0x9D8C, 0xF98A, + 0x9D8D, 0xF98B, + 0x9D8E, 0xF98C, + 0x9D8F, 0xF98D, + 0x9D90, 0xF98E, + 0x9D91, 0xF98F, + 0x9D92, 0xF990, + 0x9D93, 0xF991, + 0x9D94, 0xF992, + 0x9D95, 0xF993, + 0x9D96, 0xF994, + 0x9D97, 0xF995, + 0x9D98, 0xF996, + 0x9D99, 0xF997, + 0x9D9A, 0xF998, + 0x9D9B, 0xF999, + 0x9D9C, 0xF99A, + 0x9D9D, 0xF99B, + 0x9D9E, 0xF99C, + 0x9D9F, 0xF99D, + 0x9DA0, 0xF99E, + 0x9DA1, 0xF99F, + 0x9DA2, 0xF9A0, + 0x9DA3, 0xFA40, + 0x9DA4, 0xFA41, + 0x9DA5, 0xFA42, + 0x9DA6, 0xFA43, + 0x9DA7, 0xFA44, + 0x9DA8, 0xFA45, + 0x9DA9, 0xFA46, + 0x9DAA, 0xFA47, + 0x9DAB, 0xFA48, + 0x9DAC, 0xFA49, + 0x9DAD, 0xFA4A, + 0x9DAE, 0xFA4B, + 0x9DAF, 0xFA4C, + 0x9DB0, 0xFA4D, + 0x9DB1, 0xFA4E, + 0x9DB2, 0xFA4F, + 0x9DB3, 0xFA50, + 0x9DB4, 0xFA51, + 0x9DB5, 0xFA52, + 0x9DB6, 0xFA53, + 0x9DB7, 0xFA54, + 0x9DB8, 0xFA55, + 0x9DB9, 0xFA56, + 0x9DBA, 0xFA57, + 0x9DBB, 0xFA58, + 0x9DBC, 0xFA59, + 0x9DBD, 0xFA5A, + 0x9DBE, 0xFA5B, + 0x9DBF, 0xFA5C, + 0x9DC0, 0xFA5D, + 0x9DC1, 0xFA5E, + 0x9DC2, 0xFA5F, + 0x9DC3, 0xFA60, + 0x9DC4, 0xFA61, + 0x9DC5, 0xFA62, + 0x9DC6, 0xFA63, + 0x9DC7, 0xFA64, + 0x9DC8, 0xFA65, + 0x9DC9, 0xFA66, + 0x9DCA, 0xFA67, + 0x9DCB, 0xFA68, + 0x9DCC, 0xFA69, + 0x9DCD, 0xFA6A, + 0x9DCE, 0xFA6B, + 0x9DCF, 0xFA6C, + 0x9DD0, 0xFA6D, + 0x9DD1, 0xFA6E, + 0x9DD2, 0xFA6F, + 0x9DD3, 0xFA70, + 0x9DD4, 0xFA71, + 0x9DD5, 0xFA72, + 0x9DD6, 0xFA73, + 0x9DD7, 0xFA74, + 0x9DD8, 0xFA75, + 0x9DD9, 0xFA76, + 0x9DDA, 0xFA77, + 0x9DDB, 0xFA78, + 0x9DDC, 0xFA79, + 0x9DDD, 0xFA7A, + 0x9DDE, 0xFA7B, + 0x9DDF, 0xFA7C, + 0x9DE0, 0xFA7D, + 0x9DE1, 0xFA7E, + 0x9DE2, 0xFA80, + 0x9DE3, 0xFA81, + 0x9DE4, 0xFA82, + 0x9DE5, 0xFA83, + 0x9DE6, 0xFA84, + 0x9DE7, 0xFA85, + 0x9DE8, 0xFA86, + 0x9DE9, 0xFA87, + 0x9DEA, 0xFA88, + 0x9DEB, 0xFA89, + 0x9DEC, 0xFA8A, + 0x9DED, 0xFA8B, + 0x9DEE, 0xFA8C, + 0x9DEF, 0xFA8D, + 0x9DF0, 0xFA8E, + 0x9DF1, 0xFA8F, + 0x9DF2, 0xFA90, + 0x9DF3, 0xFA91, + 0x9DF4, 0xFA92, + 0x9DF5, 0xFA93, + 0x9DF6, 0xFA94, + 0x9DF7, 0xFA95, + 0x9DF8, 0xFA96, + 0x9DF9, 0xFA97, + 0x9DFA, 0xFA98, + 0x9DFB, 0xFA99, + 0x9DFC, 0xFA9A, + 0x9DFD, 0xFA9B, + 0x9DFE, 0xFA9C, + 0x9DFF, 0xFA9D, + 0x9E00, 0xFA9E, + 0x9E01, 0xFA9F, + 0x9E02, 0xFAA0, + 0x9E03, 0xFB40, + 0x9E04, 0xFB41, + 0x9E05, 0xFB42, + 0x9E06, 0xFB43, + 0x9E07, 0xFB44, + 0x9E08, 0xFB45, + 0x9E09, 0xFB46, + 0x9E0A, 0xFB47, + 0x9E0B, 0xFB48, + 0x9E0C, 0xFB49, + 0x9E0D, 0xFB4A, + 0x9E0E, 0xFB4B, + 0x9E0F, 0xFB4C, + 0x9E10, 0xFB4D, + 0x9E11, 0xFB4E, + 0x9E12, 0xFB4F, + 0x9E13, 0xFB50, + 0x9E14, 0xFB51, + 0x9E15, 0xFB52, + 0x9E16, 0xFB53, + 0x9E17, 0xFB54, + 0x9E18, 0xFB55, + 0x9E19, 0xFB56, + 0x9E1A, 0xFB57, + 0x9E1B, 0xFB58, + 0x9E1C, 0xFB59, + 0x9E1D, 0xFB5A, + 0x9E1E, 0xFB5B, + 0x9E24, 0xFB5C, + 0x9E27, 0xFB5D, + 0x9E2E, 0xFB5E, + 0x9E30, 0xFB5F, + 0x9E34, 0xFB60, + 0x9E3B, 0xFB61, + 0x9E3C, 0xFB62, + 0x9E40, 0xFB63, + 0x9E4D, 0xFB64, + 0x9E50, 0xFB65, + 0x9E52, 0xFB66, + 0x9E53, 0xFB67, + 0x9E54, 0xFB68, + 0x9E56, 0xFB69, + 0x9E59, 0xFB6A, + 0x9E5D, 0xFB6B, + 0x9E5F, 0xFB6C, + 0x9E60, 0xFB6D, + 0x9E61, 0xFB6E, + 0x9E62, 0xFB6F, + 0x9E65, 0xFB70, + 0x9E6E, 0xFB71, + 0x9E6F, 0xFB72, + 0x9E72, 0xFB73, + 0x9E74, 0xFB74, + 0x9E75, 0xFB75, + 0x9E76, 0xFB76, + 0x9E77, 0xFB77, + 0x9E78, 0xFB78, + 0x9E79, 0xFB79, + 0x9E7A, 0xFB7A, + 0x9E7B, 0xFB7B, + 0x9E7C, 0xFB7C, + 0x9E7D, 0xFB7D, + 0x9E80, 0xFB7E, + 0x9E81, 0xFB80, + 0x9E83, 0xFB81, + 0x9E84, 0xFB82, + 0x9E85, 0xFB83, + 0x9E86, 0xFB84, + 0x9E89, 0xFB85, + 0x9E8A, 0xFB86, + 0x9E8C, 0xFB87, + 0x9E8D, 0xFB88, + 0x9E8E, 0xFB89, + 0x9E8F, 0xFB8A, + 0x9E90, 0xFB8B, + 0x9E91, 0xFB8C, + 0x9E94, 0xFB8D, + 0x9E95, 0xFB8E, + 0x9E96, 0xFB8F, + 0x9E97, 0xFB90, + 0x9E98, 0xFB91, + 0x9E99, 0xFB92, + 0x9E9A, 0xFB93, + 0x9E9B, 0xFB94, + 0x9E9C, 0xFB95, + 0x9E9E, 0xFB96, + 0x9EA0, 0xFB97, + 0x9EA1, 0xFB98, + 0x9EA2, 0xFB99, + 0x9EA3, 0xFB9A, + 0x9EA4, 0xFB9B, + 0x9EA5, 0xFB9C, + 0x9EA7, 0xFB9D, + 0x9EA8, 0xFB9E, + 0x9EA9, 0xFB9F, + 0x9EAA, 0xFBA0, + 0x9EAB, 0xFC40, + 0x9EAC, 0xFC41, + 0x9EAD, 0xFC42, + 0x9EAE, 0xFC43, + 0x9EAF, 0xFC44, + 0x9EB0, 0xFC45, + 0x9EB1, 0xFC46, + 0x9EB2, 0xFC47, + 0x9EB3, 0xFC48, + 0x9EB5, 0xFC49, + 0x9EB6, 0xFC4A, + 0x9EB7, 0xFC4B, + 0x9EB9, 0xFC4C, + 0x9EBA, 0xFC4D, + 0x9EBC, 0xFC4E, + 0x9EBF, 0xFC4F, + 0x9EC0, 0xFC50, + 0x9EC1, 0xFC51, + 0x9EC2, 0xFC52, + 0x9EC3, 0xFC53, + 0x9EC5, 0xFC54, + 0x9EC6, 0xFC55, + 0x9EC7, 0xFC56, + 0x9EC8, 0xFC57, + 0x9ECA, 0xFC58, + 0x9ECB, 0xFC59, + 0x9ECC, 0xFC5A, + 0x9ED0, 0xFC5B, + 0x9ED2, 0xFC5C, + 0x9ED3, 0xFC5D, + 0x9ED5, 0xFC5E, + 0x9ED6, 0xFC5F, + 0x9ED7, 0xFC60, + 0x9ED9, 0xFC61, + 0x9EDA, 0xFC62, + 0x9EDE, 0xFC63, + 0x9EE1, 0xFC64, + 0x9EE3, 0xFC65, + 0x9EE4, 0xFC66, + 0x9EE6, 0xFC67, + 0x9EE8, 0xFC68, + 0x9EEB, 0xFC69, + 0x9EEC, 0xFC6A, + 0x9EED, 0xFC6B, + 0x9EEE, 0xFC6C, + 0x9EF0, 0xFC6D, + 0x9EF1, 0xFC6E, + 0x9EF2, 0xFC6F, + 0x9EF3, 0xFC70, + 0x9EF4, 0xFC71, + 0x9EF5, 0xFC72, + 0x9EF6, 0xFC73, + 0x9EF7, 0xFC74, + 0x9EF8, 0xFC75, + 0x9EFA, 0xFC76, + 0x9EFD, 0xFC77, + 0x9EFF, 0xFC78, + 0x9F00, 0xFC79, + 0x9F01, 0xFC7A, + 0x9F02, 0xFC7B, + 0x9F03, 0xFC7C, + 0x9F04, 0xFC7D, + 0x9F05, 0xFC7E, + 0x9F06, 0xFC80, + 0x9F07, 0xFC81, + 0x9F08, 0xFC82, + 0x9F09, 0xFC83, + 0x9F0A, 0xFC84, + 0x9F0C, 0xFC85, + 0x9F0F, 0xFC86, + 0x9F11, 0xFC87, + 0x9F12, 0xFC88, + 0x9F14, 0xFC89, + 0x9F15, 0xFC8A, + 0x9F16, 0xFC8B, + 0x9F18, 0xFC8C, + 0x9F1A, 0xFC8D, + 0x9F1B, 0xFC8E, + 0x9F1C, 0xFC8F, + 0x9F1D, 0xFC90, + 0x9F1E, 0xFC91, + 0x9F1F, 0xFC92, + 0x9F21, 0xFC93, + 0x9F23, 0xFC94, + 0x9F24, 0xFC95, + 0x9F25, 0xFC96, + 0x9F26, 0xFC97, + 0x9F27, 0xFC98, + 0x9F28, 0xFC99, + 0x9F29, 0xFC9A, + 0x9F2A, 0xFC9B, + 0x9F2B, 0xFC9C, + 0x9F2D, 0xFC9D, + 0x9F2E, 0xFC9E, + 0x9F30, 0xFC9F, + 0x9F31, 0xFCA0, + 0x9F32, 0xFD40, + 0x9F33, 0xFD41, + 0x9F34, 0xFD42, + 0x9F35, 0xFD43, + 0x9F36, 0xFD44, + 0x9F38, 0xFD45, + 0x9F3A, 0xFD46, + 0x9F3C, 0xFD47, + 0x9F3F, 0xFD48, + 0x9F40, 0xFD49, + 0x9F41, 0xFD4A, + 0x9F42, 0xFD4B, + 0x9F43, 0xFD4C, + 0x9F45, 0xFD4D, + 0x9F46, 0xFD4E, + 0x9F47, 0xFD4F, + 0x9F48, 0xFD50, + 0x9F49, 0xFD51, + 0x9F4A, 0xFD52, + 0x9F4B, 0xFD53, + 0x9F4C, 0xFD54, + 0x9F4D, 0xFD55, + 0x9F4E, 0xFD56, + 0x9F4F, 0xFD57, + 0x9F52, 0xFD58, + 0x9F53, 0xFD59, + 0x9F54, 0xFD5A, + 0x9F55, 0xFD5B, + 0x9F56, 0xFD5C, + 0x9F57, 0xFD5D, + 0x9F58, 0xFD5E, + 0x9F59, 0xFD5F, + 0x9F5A, 0xFD60, + 0x9F5B, 0xFD61, + 0x9F5C, 0xFD62, + 0x9F5D, 0xFD63, + 0x9F5E, 0xFD64, + 0x9F5F, 0xFD65, + 0x9F60, 0xFD66, + 0x9F61, 0xFD67, + 0x9F62, 0xFD68, + 0x9F63, 0xFD69, + 0x9F64, 0xFD6A, + 0x9F65, 0xFD6B, + 0x9F66, 0xFD6C, + 0x9F67, 0xFD6D, + 0x9F68, 0xFD6E, + 0x9F69, 0xFD6F, + 0x9F6A, 0xFD70, + 0x9F6B, 0xFD71, + 0x9F6C, 0xFD72, + 0x9F6D, 0xFD73, + 0x9F6E, 0xFD74, + 0x9F6F, 0xFD75, + 0x9F70, 0xFD76, + 0x9F71, 0xFD77, + 0x9F72, 0xFD78, + 0x9F73, 0xFD79, + 0x9F74, 0xFD7A, + 0x9F75, 0xFD7B, + 0x9F76, 0xFD7C, + 0x9F77, 0xFD7D, + 0x9F78, 0xFD7E, + 0x9F79, 0xFD80, + 0x9F7A, 0xFD81, + 0x9F7B, 0xFD82, + 0x9F7C, 0xFD83, + 0x9F7D, 0xFD84, + 0x9F7E, 0xFD85, + 0x9F81, 0xFD86, + 0x9F82, 0xFD87, + 0x9F8D, 0xFD88, + 0x9F8E, 0xFD89, + 0x9F8F, 0xFD8A, + 0x9F90, 0xFD8B, + 0x9F91, 0xFD8C, + 0x9F92, 0xFD8D, + 0x9F93, 0xFD8E, + 0x9F94, 0xFD8F, + 0x9F95, 0xFD90, + 0x9F96, 0xFD91, + 0x9F97, 0xFD92, + 0x9F98, 0xFD93, + 0x9F9C, 0xFD94, + 0x9F9D, 0xFD95, + 0x9F9E, 0xFD96, + 0x9FA1, 0xFD97, + 0x9FA2, 0xFD98, + 0x9FA3, 0xFD99, + 0x9FA4, 0xFD9A, + 0x9FA5, 0xFD9B, + 0xE000, 0xAAA1, + 0xE001, 0xAAA2, + 0xE002, 0xAAA3, + 0xE003, 0xAAA4, + 0xE004, 0xAAA5, + 0xE005, 0xAAA6, + 0xE006, 0xAAA7, + 0xE007, 0xAAA8, + 0xE008, 0xAAA9, + 0xE009, 0xAAAA, + 0xE00A, 0xAAAB, + 0xE00B, 0xAAAC, + 0xE00C, 0xAAAD, + 0xE00D, 0xAAAE, + 0xE00E, 0xAAAF, + 0xE00F, 0xAAB0, + 0xE010, 0xAAB1, + 0xE011, 0xAAB2, + 0xE012, 0xAAB3, + 0xE013, 0xAAB4, + 0xE014, 0xAAB5, + 0xE015, 0xAAB6, + 0xE016, 0xAAB7, + 0xE017, 0xAAB8, + 0xE018, 0xAAB9, + 0xE019, 0xAABA, + 0xE01A, 0xAABB, + 0xE01B, 0xAABC, + 0xE01C, 0xAABD, + 0xE01D, 0xAABE, + 0xE01E, 0xAABF, + 0xE01F, 0xAAC0, + 0xE020, 0xAAC1, + 0xE021, 0xAAC2, + 0xE022, 0xAAC3, + 0xE023, 0xAAC4, + 0xE024, 0xAAC5, + 0xE025, 0xAAC6, + 0xE026, 0xAAC7, + 0xE027, 0xAAC8, + 0xE028, 0xAAC9, + 0xE029, 0xAACA, + 0xE02A, 0xAACB, + 0xE02B, 0xAACC, + 0xE02C, 0xAACD, + 0xE02D, 0xAACE, + 0xE02E, 0xAACF, + 0xE02F, 0xAAD0, + 0xE030, 0xAAD1, + 0xE031, 0xAAD2, + 0xE032, 0xAAD3, + 0xE033, 0xAAD4, + 0xE034, 0xAAD5, + 0xE035, 0xAAD6, + 0xE036, 0xAAD7, + 0xE037, 0xAAD8, + 0xE038, 0xAAD9, + 0xE039, 0xAADA, + 0xE03A, 0xAADB, + 0xE03B, 0xAADC, + 0xE03C, 0xAADD, + 0xE03D, 0xAADE, + 0xE03E, 0xAADF, + 0xE03F, 0xAAE0, + 0xE040, 0xAAE1, + 0xE041, 0xAAE2, + 0xE042, 0xAAE3, + 0xE043, 0xAAE4, + 0xE044, 0xAAE5, + 0xE045, 0xAAE6, + 0xE046, 0xAAE7, + 0xE047, 0xAAE8, + 0xE048, 0xAAE9, + 0xE049, 0xAAEA, + 0xE04A, 0xAAEB, + 0xE04B, 0xAAEC, + 0xE04C, 0xAAED, + 0xE04D, 0xAAEE, + 0xE04E, 0xAAEF, + 0xE04F, 0xAAF0, + 0xE050, 0xAAF1, + 0xE051, 0xAAF2, + 0xE052, 0xAAF3, + 0xE053, 0xAAF4, + 0xE054, 0xAAF5, + 0xE055, 0xAAF6, + 0xE056, 0xAAF7, + 0xE057, 0xAAF8, + 0xE058, 0xAAF9, + 0xE059, 0xAAFA, + 0xE05A, 0xAAFB, + 0xE05B, 0xAAFC, + 0xE05C, 0xAAFD, + 0xE05D, 0xAAFE, + 0xE05E, 0xABA1, + 0xE05F, 0xABA2, + 0xE060, 0xABA3, + 0xE061, 0xABA4, + 0xE062, 0xABA5, + 0xE063, 0xABA6, + 0xE064, 0xABA7, + 0xE065, 0xABA8, + 0xE066, 0xABA9, + 0xE067, 0xABAA, + 0xE068, 0xABAB, + 0xE069, 0xABAC, + 0xE06A, 0xABAD, + 0xE06B, 0xABAE, + 0xE06C, 0xABAF, + 0xE06D, 0xABB0, + 0xE06E, 0xABB1, + 0xE06F, 0xABB2, + 0xE070, 0xABB3, + 0xE071, 0xABB4, + 0xE072, 0xABB5, + 0xE073, 0xABB6, + 0xE074, 0xABB7, + 0xE075, 0xABB8, + 0xE076, 0xABB9, + 0xE077, 0xABBA, + 0xE078, 0xABBB, + 0xE079, 0xABBC, + 0xE07A, 0xABBD, + 0xE07B, 0xABBE, + 0xE07C, 0xABBF, + 0xE07D, 0xABC0, + 0xE07E, 0xABC1, + 0xE07F, 0xABC2, + 0xE080, 0xABC3, + 0xE081, 0xABC4, + 0xE082, 0xABC5, + 0xE083, 0xABC6, + 0xE084, 0xABC7, + 0xE085, 0xABC8, + 0xE086, 0xABC9, + 0xE087, 0xABCA, + 0xE088, 0xABCB, + 0xE089, 0xABCC, + 0xE08A, 0xABCD, + 0xE08B, 0xABCE, + 0xE08C, 0xABCF, + 0xE08D, 0xABD0, + 0xE08E, 0xABD1, + 0xE08F, 0xABD2, + 0xE090, 0xABD3, + 0xE091, 0xABD4, + 0xE092, 0xABD5, + 0xE093, 0xABD6, + 0xE094, 0xABD7, + 0xE095, 0xABD8, + 0xE096, 0xABD9, + 0xE097, 0xABDA, + 0xE098, 0xABDB, + 0xE099, 0xABDC, + 0xE09A, 0xABDD, + 0xE09B, 0xABDE, + 0xE09C, 0xABDF, + 0xE09D, 0xABE0, + 0xE09E, 0xABE1, + 0xE09F, 0xABE2, + 0xE0A0, 0xABE3, + 0xE0A1, 0xABE4, + 0xE0A2, 0xABE5, + 0xE0A3, 0xABE6, + 0xE0A4, 0xABE7, + 0xE0A5, 0xABE8, + 0xE0A6, 0xABE9, + 0xE0A7, 0xABEA, + 0xE0A8, 0xABEB, + 0xE0A9, 0xABEC, + 0xE0AA, 0xABED, + 0xE0AB, 0xABEE, + 0xE0AC, 0xABEF, + 0xE0AD, 0xABF0, + 0xE0AE, 0xABF1, + 0xE0AF, 0xABF2, + 0xE0B0, 0xABF3, + 0xE0B1, 0xABF4, + 0xE0B2, 0xABF5, + 0xE0B3, 0xABF6, + 0xE0B4, 0xABF7, + 0xE0B5, 0xABF8, + 0xE0B6, 0xABF9, + 0xE0B7, 0xABFA, + 0xE0B8, 0xABFB, + 0xE0B9, 0xABFC, + 0xE0BA, 0xABFD, + 0xE0BB, 0xABFE, + 0xE0BC, 0xACA1, + 0xE0BD, 0xACA2, + 0xE0BE, 0xACA3, + 0xE0BF, 0xACA4, + 0xE0C0, 0xACA5, + 0xE0C1, 0xACA6, + 0xE0C2, 0xACA7, + 0xE0C3, 0xACA8, + 0xE0C4, 0xACA9, + 0xE0C5, 0xACAA, + 0xE0C6, 0xACAB, + 0xE0C7, 0xACAC, + 0xE0C8, 0xACAD, + 0xE0C9, 0xACAE, + 0xE0CA, 0xACAF, + 0xE0CB, 0xACB0, + 0xE0CC, 0xACB1, + 0xE0CD, 0xACB2, + 0xE0CE, 0xACB3, + 0xE0CF, 0xACB4, + 0xE0D0, 0xACB5, + 0xE0D1, 0xACB6, + 0xE0D2, 0xACB7, + 0xE0D3, 0xACB8, + 0xE0D4, 0xACB9, + 0xE0D5, 0xACBA, + 0xE0D6, 0xACBB, + 0xE0D7, 0xACBC, + 0xE0D8, 0xACBD, + 0xE0D9, 0xACBE, + 0xE0DA, 0xACBF, + 0xE0DB, 0xACC0, + 0xE0DC, 0xACC1, + 0xE0DD, 0xACC2, + 0xE0DE, 0xACC3, + 0xE0DF, 0xACC4, + 0xE0E0, 0xACC5, + 0xE0E1, 0xACC6, + 0xE0E2, 0xACC7, + 0xE0E3, 0xACC8, + 0xE0E4, 0xACC9, + 0xE0E5, 0xACCA, + 0xE0E6, 0xACCB, + 0xE0E7, 0xACCC, + 0xE0E8, 0xACCD, + 0xE0E9, 0xACCE, + 0xE0EA, 0xACCF, + 0xE0EB, 0xACD0, + 0xE0EC, 0xACD1, + 0xE0ED, 0xACD2, + 0xE0EE, 0xACD3, + 0xE0EF, 0xACD4, + 0xE0F0, 0xACD5, + 0xE0F1, 0xACD6, + 0xE0F2, 0xACD7, + 0xE0F3, 0xACD8, + 0xE0F4, 0xACD9, + 0xE0F5, 0xACDA, + 0xE0F6, 0xACDB, + 0xE0F7, 0xACDC, + 0xE0F8, 0xACDD, + 0xE0F9, 0xACDE, + 0xE0FA, 0xACDF, + 0xE0FB, 0xACE0, + 0xE0FC, 0xACE1, + 0xE0FD, 0xACE2, + 0xE0FE, 0xACE3, + 0xE0FF, 0xACE4, + 0xE100, 0xACE5, + 0xE101, 0xACE6, + 0xE102, 0xACE7, + 0xE103, 0xACE8, + 0xE104, 0xACE9, + 0xE105, 0xACEA, + 0xE106, 0xACEB, + 0xE107, 0xACEC, + 0xE108, 0xACED, + 0xE109, 0xACEE, + 0xE10A, 0xACEF, + 0xE10B, 0xACF0, + 0xE10C, 0xACF1, + 0xE10D, 0xACF2, + 0xE10E, 0xACF3, + 0xE10F, 0xACF4, + 0xE110, 0xACF5, + 0xE111, 0xACF6, + 0xE112, 0xACF7, + 0xE113, 0xACF8, + 0xE114, 0xACF9, + 0xE115, 0xACFA, + 0xE116, 0xACFB, + 0xE117, 0xACFC, + 0xE118, 0xACFD, + 0xE119, 0xACFE, + 0xE11A, 0xADA1, + 0xE11B, 0xADA2, + 0xE11C, 0xADA3, + 0xE11D, 0xADA4, + 0xE11E, 0xADA5, + 0xE11F, 0xADA6, + 0xE120, 0xADA7, + 0xE121, 0xADA8, + 0xE122, 0xADA9, + 0xE123, 0xADAA, + 0xE124, 0xADAB, + 0xE125, 0xADAC, + 0xE126, 0xADAD, + 0xE127, 0xADAE, + 0xE128, 0xADAF, + 0xE129, 0xADB0, + 0xE12A, 0xADB1, + 0xE12B, 0xADB2, + 0xE12C, 0xADB3, + 0xE12D, 0xADB4, + 0xE12E, 0xADB5, + 0xE12F, 0xADB6, + 0xE130, 0xADB7, + 0xE131, 0xADB8, + 0xE132, 0xADB9, + 0xE133, 0xADBA, + 0xE134, 0xADBB, + 0xE135, 0xADBC, + 0xE136, 0xADBD, + 0xE137, 0xADBE, + 0xE138, 0xADBF, + 0xE139, 0xADC0, + 0xE13A, 0xADC1, + 0xE13B, 0xADC2, + 0xE13C, 0xADC3, + 0xE13D, 0xADC4, + 0xE13E, 0xADC5, + 0xE13F, 0xADC6, + 0xE140, 0xADC7, + 0xE141, 0xADC8, + 0xE142, 0xADC9, + 0xE143, 0xADCA, + 0xE144, 0xADCB, + 0xE145, 0xADCC, + 0xE146, 0xADCD, + 0xE147, 0xADCE, + 0xE148, 0xADCF, + 0xE149, 0xADD0, + 0xE14A, 0xADD1, + 0xE14B, 0xADD2, + 0xE14C, 0xADD3, + 0xE14D, 0xADD4, + 0xE14E, 0xADD5, + 0xE14F, 0xADD6, + 0xE150, 0xADD7, + 0xE151, 0xADD8, + 0xE152, 0xADD9, + 0xE153, 0xADDA, + 0xE154, 0xADDB, + 0xE155, 0xADDC, + 0xE156, 0xADDD, + 0xE157, 0xADDE, + 0xE158, 0xADDF, + 0xE159, 0xADE0, + 0xE15A, 0xADE1, + 0xE15B, 0xADE2, + 0xE15C, 0xADE3, + 0xE15D, 0xADE4, + 0xE15E, 0xADE5, + 0xE15F, 0xADE6, + 0xE160, 0xADE7, + 0xE161, 0xADE8, + 0xE162, 0xADE9, + 0xE163, 0xADEA, + 0xE164, 0xADEB, + 0xE165, 0xADEC, + 0xE166, 0xADED, + 0xE167, 0xADEE, + 0xE168, 0xADEF, + 0xE169, 0xADF0, + 0xE16A, 0xADF1, + 0xE16B, 0xADF2, + 0xE16C, 0xADF3, + 0xE16D, 0xADF4, + 0xE16E, 0xADF5, + 0xE16F, 0xADF6, + 0xE170, 0xADF7, + 0xE171, 0xADF8, + 0xE172, 0xADF9, + 0xE173, 0xADFA, + 0xE174, 0xADFB, + 0xE175, 0xADFC, + 0xE176, 0xADFD, + 0xE177, 0xADFE, + 0xE178, 0xAEA1, + 0xE179, 0xAEA2, + 0xE17A, 0xAEA3, + 0xE17B, 0xAEA4, + 0xE17C, 0xAEA5, + 0xE17D, 0xAEA6, + 0xE17E, 0xAEA7, + 0xE17F, 0xAEA8, + 0xE180, 0xAEA9, + 0xE181, 0xAEAA, + 0xE182, 0xAEAB, + 0xE183, 0xAEAC, + 0xE184, 0xAEAD, + 0xE185, 0xAEAE, + 0xE186, 0xAEAF, + 0xE187, 0xAEB0, + 0xE188, 0xAEB1, + 0xE189, 0xAEB2, + 0xE18A, 0xAEB3, + 0xE18B, 0xAEB4, + 0xE18C, 0xAEB5, + 0xE18D, 0xAEB6, + 0xE18E, 0xAEB7, + 0xE18F, 0xAEB8, + 0xE190, 0xAEB9, + 0xE191, 0xAEBA, + 0xE192, 0xAEBB, + 0xE193, 0xAEBC, + 0xE194, 0xAEBD, + 0xE195, 0xAEBE, + 0xE196, 0xAEBF, + 0xE197, 0xAEC0, + 0xE198, 0xAEC1, + 0xE199, 0xAEC2, + 0xE19A, 0xAEC3, + 0xE19B, 0xAEC4, + 0xE19C, 0xAEC5, + 0xE19D, 0xAEC6, + 0xE19E, 0xAEC7, + 0xE19F, 0xAEC8, + 0xE1A0, 0xAEC9, + 0xE1A1, 0xAECA, + 0xE1A2, 0xAECB, + 0xE1A3, 0xAECC, + 0xE1A4, 0xAECD, + 0xE1A5, 0xAECE, + 0xE1A6, 0xAECF, + 0xE1A7, 0xAED0, + 0xE1A8, 0xAED1, + 0xE1A9, 0xAED2, + 0xE1AA, 0xAED3, + 0xE1AB, 0xAED4, + 0xE1AC, 0xAED5, + 0xE1AD, 0xAED6, + 0xE1AE, 0xAED7, + 0xE1AF, 0xAED8, + 0xE1B0, 0xAED9, + 0xE1B1, 0xAEDA, + 0xE1B2, 0xAEDB, + 0xE1B3, 0xAEDC, + 0xE1B4, 0xAEDD, + 0xE1B5, 0xAEDE, + 0xE1B6, 0xAEDF, + 0xE1B7, 0xAEE0, + 0xE1B8, 0xAEE1, + 0xE1B9, 0xAEE2, + 0xE1BA, 0xAEE3, + 0xE1BB, 0xAEE4, + 0xE1BC, 0xAEE5, + 0xE1BD, 0xAEE6, + 0xE1BE, 0xAEE7, + 0xE1BF, 0xAEE8, + 0xE1C0, 0xAEE9, + 0xE1C1, 0xAEEA, + 0xE1C2, 0xAEEB, + 0xE1C3, 0xAEEC, + 0xE1C4, 0xAEED, + 0xE1C5, 0xAEEE, + 0xE1C6, 0xAEEF, + 0xE1C7, 0xAEF0, + 0xE1C8, 0xAEF1, + 0xE1C9, 0xAEF2, + 0xE1CA, 0xAEF3, + 0xE1CB, 0xAEF4, + 0xE1CC, 0xAEF5, + 0xE1CD, 0xAEF6, + 0xE1CE, 0xAEF7, + 0xE1CF, 0xAEF8, + 0xE1D0, 0xAEF9, + 0xE1D1, 0xAEFA, + 0xE1D2, 0xAEFB, + 0xE1D3, 0xAEFC, + 0xE1D4, 0xAEFD, + 0xE1D5, 0xAEFE, + 0xE1D6, 0xAFA1, + 0xE1D7, 0xAFA2, + 0xE1D8, 0xAFA3, + 0xE1D9, 0xAFA4, + 0xE1DA, 0xAFA5, + 0xE1DB, 0xAFA6, + 0xE1DC, 0xAFA7, + 0xE1DD, 0xAFA8, + 0xE1DE, 0xAFA9, + 0xE1DF, 0xAFAA, + 0xE1E0, 0xAFAB, + 0xE1E1, 0xAFAC, + 0xE1E2, 0xAFAD, + 0xE1E3, 0xAFAE, + 0xE1E4, 0xAFAF, + 0xE1E5, 0xAFB0, + 0xE1E6, 0xAFB1, + 0xE1E7, 0xAFB2, + 0xE1E8, 0xAFB3, + 0xE1E9, 0xAFB4, + 0xE1EA, 0xAFB5, + 0xE1EB, 0xAFB6, + 0xE1EC, 0xAFB7, + 0xE1ED, 0xAFB8, + 0xE1EE, 0xAFB9, + 0xE1EF, 0xAFBA, + 0xE1F0, 0xAFBB, + 0xE1F1, 0xAFBC, + 0xE1F2, 0xAFBD, + 0xE1F3, 0xAFBE, + 0xE1F4, 0xAFBF, + 0xE1F5, 0xAFC0, + 0xE1F6, 0xAFC1, + 0xE1F7, 0xAFC2, + 0xE1F8, 0xAFC3, + 0xE1F9, 0xAFC4, + 0xE1FA, 0xAFC5, + 0xE1FB, 0xAFC6, + 0xE1FC, 0xAFC7, + 0xE1FD, 0xAFC8, + 0xE1FE, 0xAFC9, + 0xE1FF, 0xAFCA, + 0xE200, 0xAFCB, + 0xE201, 0xAFCC, + 0xE202, 0xAFCD, + 0xE203, 0xAFCE, + 0xE204, 0xAFCF, + 0xE205, 0xAFD0, + 0xE206, 0xAFD1, + 0xE207, 0xAFD2, + 0xE208, 0xAFD3, + 0xE209, 0xAFD4, + 0xE20A, 0xAFD5, + 0xE20B, 0xAFD6, + 0xE20C, 0xAFD7, + 0xE20D, 0xAFD8, + 0xE20E, 0xAFD9, + 0xE20F, 0xAFDA, + 0xE210, 0xAFDB, + 0xE211, 0xAFDC, + 0xE212, 0xAFDD, + 0xE213, 0xAFDE, + 0xE214, 0xAFDF, + 0xE215, 0xAFE0, + 0xE216, 0xAFE1, + 0xE217, 0xAFE2, + 0xE218, 0xAFE3, + 0xE219, 0xAFE4, + 0xE21A, 0xAFE5, + 0xE21B, 0xAFE6, + 0xE21C, 0xAFE7, + 0xE21D, 0xAFE8, + 0xE21E, 0xAFE9, + 0xE21F, 0xAFEA, + 0xE220, 0xAFEB, + 0xE221, 0xAFEC, + 0xE222, 0xAFED, + 0xE223, 0xAFEE, + 0xE224, 0xAFEF, + 0xE225, 0xAFF0, + 0xE226, 0xAFF1, + 0xE227, 0xAFF2, + 0xE228, 0xAFF3, + 0xE229, 0xAFF4, + 0xE22A, 0xAFF5, + 0xE22B, 0xAFF6, + 0xE22C, 0xAFF7, + 0xE22D, 0xAFF8, + 0xE22E, 0xAFF9, + 0xE22F, 0xAFFA, + 0xE230, 0xAFFB, + 0xE231, 0xAFFC, + 0xE232, 0xAFFD, + 0xE233, 0xAFFE, + 0xE234, 0xF8A1, + 0xE235, 0xF8A2, + 0xE236, 0xF8A3, + 0xE237, 0xF8A4, + 0xE238, 0xF8A5, + 0xE239, 0xF8A6, + 0xE23A, 0xF8A7, + 0xE23B, 0xF8A8, + 0xE23C, 0xF8A9, + 0xE23D, 0xF8AA, + 0xE23E, 0xF8AB, + 0xE23F, 0xF8AC, + 0xE240, 0xF8AD, + 0xE241, 0xF8AE, + 0xE242, 0xF8AF, + 0xE243, 0xF8B0, + 0xE244, 0xF8B1, + 0xE245, 0xF8B2, + 0xE246, 0xF8B3, + 0xE247, 0xF8B4, + 0xE248, 0xF8B5, + 0xE249, 0xF8B6, + 0xE24A, 0xF8B7, + 0xE24B, 0xF8B8, + 0xE24C, 0xF8B9, + 0xE24D, 0xF8BA, + 0xE24E, 0xF8BB, + 0xE24F, 0xF8BC, + 0xE250, 0xF8BD, + 0xE251, 0xF8BE, + 0xE252, 0xF8BF, + 0xE253, 0xF8C0, + 0xE254, 0xF8C1, + 0xE255, 0xF8C2, + 0xE256, 0xF8C3, + 0xE257, 0xF8C4, + 0xE258, 0xF8C5, + 0xE259, 0xF8C6, + 0xE25A, 0xF8C7, + 0xE25B, 0xF8C8, + 0xE25C, 0xF8C9, + 0xE25D, 0xF8CA, + 0xE25E, 0xF8CB, + 0xE25F, 0xF8CC, + 0xE260, 0xF8CD, + 0xE261, 0xF8CE, + 0xE262, 0xF8CF, + 0xE263, 0xF8D0, + 0xE264, 0xF8D1, + 0xE265, 0xF8D2, + 0xE266, 0xF8D3, + 0xE267, 0xF8D4, + 0xE268, 0xF8D5, + 0xE269, 0xF8D6, + 0xE26A, 0xF8D7, + 0xE26B, 0xF8D8, + 0xE26C, 0xF8D9, + 0xE26D, 0xF8DA, + 0xE26E, 0xF8DB, + 0xE26F, 0xF8DC, + 0xE270, 0xF8DD, + 0xE271, 0xF8DE, + 0xE272, 0xF8DF, + 0xE273, 0xF8E0, + 0xE274, 0xF8E1, + 0xE275, 0xF8E2, + 0xE276, 0xF8E3, + 0xE277, 0xF8E4, + 0xE278, 0xF8E5, + 0xE279, 0xF8E6, + 0xE27A, 0xF8E7, + 0xE27B, 0xF8E8, + 0xE27C, 0xF8E9, + 0xE27D, 0xF8EA, + 0xE27E, 0xF8EB, + 0xE27F, 0xF8EC, + 0xE280, 0xF8ED, + 0xE281, 0xF8EE, + 0xE282, 0xF8EF, + 0xE283, 0xF8F0, + 0xE284, 0xF8F1, + 0xE285, 0xF8F2, + 0xE286, 0xF8F3, + 0xE287, 0xF8F4, + 0xE288, 0xF8F5, + 0xE289, 0xF8F6, + 0xE28A, 0xF8F7, + 0xE28B, 0xF8F8, + 0xE28C, 0xF8F9, + 0xE28D, 0xF8FA, + 0xE28E, 0xF8FB, + 0xE28F, 0xF8FC, + 0xE290, 0xF8FD, + 0xE291, 0xF8FE, + 0xE292, 0xF9A1, + 0xE293, 0xF9A2, + 0xE294, 0xF9A3, + 0xE295, 0xF9A4, + 0xE296, 0xF9A5, + 0xE297, 0xF9A6, + 0xE298, 0xF9A7, + 0xE299, 0xF9A8, + 0xE29A, 0xF9A9, + 0xE29B, 0xF9AA, + 0xE29C, 0xF9AB, + 0xE29D, 0xF9AC, + 0xE29E, 0xF9AD, + 0xE29F, 0xF9AE, + 0xE2A0, 0xF9AF, + 0xE2A1, 0xF9B0, + 0xE2A2, 0xF9B1, + 0xE2A3, 0xF9B2, + 0xE2A4, 0xF9B3, + 0xE2A5, 0xF9B4, + 0xE2A6, 0xF9B5, + 0xE2A7, 0xF9B6, + 0xE2A8, 0xF9B7, + 0xE2A9, 0xF9B8, + 0xE2AA, 0xF9B9, + 0xE2AB, 0xF9BA, + 0xE2AC, 0xF9BB, + 0xE2AD, 0xF9BC, + 0xE2AE, 0xF9BD, + 0xE2AF, 0xF9BE, + 0xE2B0, 0xF9BF, + 0xE2B1, 0xF9C0, + 0xE2B2, 0xF9C1, + 0xE2B3, 0xF9C2, + 0xE2B4, 0xF9C3, + 0xE2B5, 0xF9C4, + 0xE2B6, 0xF9C5, + 0xE2B7, 0xF9C6, + 0xE2B8, 0xF9C7, + 0xE2B9, 0xF9C8, + 0xE2BA, 0xF9C9, + 0xE2BB, 0xF9CA, + 0xE2BC, 0xF9CB, + 0xE2BD, 0xF9CC, + 0xE2BE, 0xF9CD, + 0xE2BF, 0xF9CE, + 0xE2C0, 0xF9CF, + 0xE2C1, 0xF9D0, + 0xE2C2, 0xF9D1, + 0xE2C3, 0xF9D2, + 0xE2C4, 0xF9D3, + 0xE2C5, 0xF9D4, + 0xE2C6, 0xF9D5, + 0xE2C7, 0xF9D6, + 0xE2C8, 0xF9D7, + 0xE2C9, 0xF9D8, + 0xE2CA, 0xF9D9, + 0xE2CB, 0xF9DA, + 0xE2CC, 0xF9DB, + 0xE2CD, 0xF9DC, + 0xE2CE, 0xF9DD, + 0xE2CF, 0xF9DE, + 0xE2D0, 0xF9DF, + 0xE2D1, 0xF9E0, + 0xE2D2, 0xF9E1, + 0xE2D3, 0xF9E2, + 0xE2D4, 0xF9E3, + 0xE2D5, 0xF9E4, + 0xE2D6, 0xF9E5, + 0xE2D7, 0xF9E6, + 0xE2D8, 0xF9E7, + 0xE2D9, 0xF9E8, + 0xE2DA, 0xF9E9, + 0xE2DB, 0xF9EA, + 0xE2DC, 0xF9EB, + 0xE2DD, 0xF9EC, + 0xE2DE, 0xF9ED, + 0xE2DF, 0xF9EE, + 0xE2E0, 0xF9EF, + 0xE2E1, 0xF9F0, + 0xE2E2, 0xF9F1, + 0xE2E3, 0xF9F2, + 0xE2E4, 0xF9F3, + 0xE2E5, 0xF9F4, + 0xE2E6, 0xF9F5, + 0xE2E7, 0xF9F6, + 0xE2E8, 0xF9F7, + 0xE2E9, 0xF9F8, + 0xE2EA, 0xF9F9, + 0xE2EB, 0xF9FA, + 0xE2EC, 0xF9FB, + 0xE2ED, 0xF9FC, + 0xE2EE, 0xF9FD, + 0xE2EF, 0xF9FE, + 0xE2F0, 0xFAA1, + 0xE2F1, 0xFAA2, + 0xE2F2, 0xFAA3, + 0xE2F3, 0xFAA4, + 0xE2F4, 0xFAA5, + 0xE2F5, 0xFAA6, + 0xE2F6, 0xFAA7, + 0xE2F7, 0xFAA8, + 0xE2F8, 0xFAA9, + 0xE2F9, 0xFAAA, + 0xE2FA, 0xFAAB, + 0xE2FB, 0xFAAC, + 0xE2FC, 0xFAAD, + 0xE2FD, 0xFAAE, + 0xE2FE, 0xFAAF, + 0xE2FF, 0xFAB0, + 0xE300, 0xFAB1, + 0xE301, 0xFAB2, + 0xE302, 0xFAB3, + 0xE303, 0xFAB4, + 0xE304, 0xFAB5, + 0xE305, 0xFAB6, + 0xE306, 0xFAB7, + 0xE307, 0xFAB8, + 0xE308, 0xFAB9, + 0xE309, 0xFABA, + 0xE30A, 0xFABB, + 0xE30B, 0xFABC, + 0xE30C, 0xFABD, + 0xE30D, 0xFABE, + 0xE30E, 0xFABF, + 0xE30F, 0xFAC0, + 0xE310, 0xFAC1, + 0xE311, 0xFAC2, + 0xE312, 0xFAC3, + 0xE313, 0xFAC4, + 0xE314, 0xFAC5, + 0xE315, 0xFAC6, + 0xE316, 0xFAC7, + 0xE317, 0xFAC8, + 0xE318, 0xFAC9, + 0xE319, 0xFACA, + 0xE31A, 0xFACB, + 0xE31B, 0xFACC, + 0xE31C, 0xFACD, + 0xE31D, 0xFACE, + 0xE31E, 0xFACF, + 0xE31F, 0xFAD0, + 0xE320, 0xFAD1, + 0xE321, 0xFAD2, + 0xE322, 0xFAD3, + 0xE323, 0xFAD4, + 0xE324, 0xFAD5, + 0xE325, 0xFAD6, + 0xE326, 0xFAD7, + 0xE327, 0xFAD8, + 0xE328, 0xFAD9, + 0xE329, 0xFADA, + 0xE32A, 0xFADB, + 0xE32B, 0xFADC, + 0xE32C, 0xFADD, + 0xE32D, 0xFADE, + 0xE32E, 0xFADF, + 0xE32F, 0xFAE0, + 0xE330, 0xFAE1, + 0xE331, 0xFAE2, + 0xE332, 0xFAE3, + 0xE333, 0xFAE4, + 0xE334, 0xFAE5, + 0xE335, 0xFAE6, + 0xE336, 0xFAE7, + 0xE337, 0xFAE8, + 0xE338, 0xFAE9, + 0xE339, 0xFAEA, + 0xE33A, 0xFAEB, + 0xE33B, 0xFAEC, + 0xE33C, 0xFAED, + 0xE33D, 0xFAEE, + 0xE33E, 0xFAEF, + 0xE33F, 0xFAF0, + 0xE340, 0xFAF1, + 0xE341, 0xFAF2, + 0xE342, 0xFAF3, + 0xE343, 0xFAF4, + 0xE344, 0xFAF5, + 0xE345, 0xFAF6, + 0xE346, 0xFAF7, + 0xE347, 0xFAF8, + 0xE348, 0xFAF9, + 0xE349, 0xFAFA, + 0xE34A, 0xFAFB, + 0xE34B, 0xFAFC, + 0xE34C, 0xFAFD, + 0xE34D, 0xFAFE, + 0xE34E, 0xFBA1, + 0xE34F, 0xFBA2, + 0xE350, 0xFBA3, + 0xE351, 0xFBA4, + 0xE352, 0xFBA5, + 0xE353, 0xFBA6, + 0xE354, 0xFBA7, + 0xE355, 0xFBA8, + 0xE356, 0xFBA9, + 0xE357, 0xFBAA, + 0xE358, 0xFBAB, + 0xE359, 0xFBAC, + 0xE35A, 0xFBAD, + 0xE35B, 0xFBAE, + 0xE35C, 0xFBAF, + 0xE35D, 0xFBB0, + 0xE35E, 0xFBB1, + 0xE35F, 0xFBB2, + 0xE360, 0xFBB3, + 0xE361, 0xFBB4, + 0xE362, 0xFBB5, + 0xE363, 0xFBB6, + 0xE364, 0xFBB7, + 0xE365, 0xFBB8, + 0xE366, 0xFBB9, + 0xE367, 0xFBBA, + 0xE368, 0xFBBB, + 0xE369, 0xFBBC, + 0xE36A, 0xFBBD, + 0xE36B, 0xFBBE, + 0xE36C, 0xFBBF, + 0xE36D, 0xFBC0, + 0xE36E, 0xFBC1, + 0xE36F, 0xFBC2, + 0xE370, 0xFBC3, + 0xE371, 0xFBC4, + 0xE372, 0xFBC5, + 0xE373, 0xFBC6, + 0xE374, 0xFBC7, + 0xE375, 0xFBC8, + 0xE376, 0xFBC9, + 0xE377, 0xFBCA, + 0xE378, 0xFBCB, + 0xE379, 0xFBCC, + 0xE37A, 0xFBCD, + 0xE37B, 0xFBCE, + 0xE37C, 0xFBCF, + 0xE37D, 0xFBD0, + 0xE37E, 0xFBD1, + 0xE37F, 0xFBD2, + 0xE380, 0xFBD3, + 0xE381, 0xFBD4, + 0xE382, 0xFBD5, + 0xE383, 0xFBD6, + 0xE384, 0xFBD7, + 0xE385, 0xFBD8, + 0xE386, 0xFBD9, + 0xE387, 0xFBDA, + 0xE388, 0xFBDB, + 0xE389, 0xFBDC, + 0xE38A, 0xFBDD, + 0xE38B, 0xFBDE, + 0xE38C, 0xFBDF, + 0xE38D, 0xFBE0, + 0xE38E, 0xFBE1, + 0xE38F, 0xFBE2, + 0xE390, 0xFBE3, + 0xE391, 0xFBE4, + 0xE392, 0xFBE5, + 0xE393, 0xFBE6, + 0xE394, 0xFBE7, + 0xE395, 0xFBE8, + 0xE396, 0xFBE9, + 0xE397, 0xFBEA, + 0xE398, 0xFBEB, + 0xE399, 0xFBEC, + 0xE39A, 0xFBED, + 0xE39B, 0xFBEE, + 0xE39C, 0xFBEF, + 0xE39D, 0xFBF0, + 0xE39E, 0xFBF1, + 0xE39F, 0xFBF2, + 0xE3A0, 0xFBF3, + 0xE3A1, 0xFBF4, + 0xE3A2, 0xFBF5, + 0xE3A3, 0xFBF6, + 0xE3A4, 0xFBF7, + 0xE3A5, 0xFBF8, + 0xE3A6, 0xFBF9, + 0xE3A7, 0xFBFA, + 0xE3A8, 0xFBFB, + 0xE3A9, 0xFBFC, + 0xE3AA, 0xFBFD, + 0xE3AB, 0xFBFE, + 0xE3AC, 0xFCA1, + 0xE3AD, 0xFCA2, + 0xE3AE, 0xFCA3, + 0xE3AF, 0xFCA4, + 0xE3B0, 0xFCA5, + 0xE3B1, 0xFCA6, + 0xE3B2, 0xFCA7, + 0xE3B3, 0xFCA8, + 0xE3B4, 0xFCA9, + 0xE3B5, 0xFCAA, + 0xE3B6, 0xFCAB, + 0xE3B7, 0xFCAC, + 0xE3B8, 0xFCAD, + 0xE3B9, 0xFCAE, + 0xE3BA, 0xFCAF, + 0xE3BB, 0xFCB0, + 0xE3BC, 0xFCB1, + 0xE3BD, 0xFCB2, + 0xE3BE, 0xFCB3, + 0xE3BF, 0xFCB4, + 0xE3C0, 0xFCB5, + 0xE3C1, 0xFCB6, + 0xE3C2, 0xFCB7, + 0xE3C3, 0xFCB8, + 0xE3C4, 0xFCB9, + 0xE3C5, 0xFCBA, + 0xE3C6, 0xFCBB, + 0xE3C7, 0xFCBC, + 0xE3C8, 0xFCBD, + 0xE3C9, 0xFCBE, + 0xE3CA, 0xFCBF, + 0xE3CB, 0xFCC0, + 0xE3CC, 0xFCC1, + 0xE3CD, 0xFCC2, + 0xE3CE, 0xFCC3, + 0xE3CF, 0xFCC4, + 0xE3D0, 0xFCC5, + 0xE3D1, 0xFCC6, + 0xE3D2, 0xFCC7, + 0xE3D3, 0xFCC8, + 0xE3D4, 0xFCC9, + 0xE3D5, 0xFCCA, + 0xE3D6, 0xFCCB, + 0xE3D7, 0xFCCC, + 0xE3D8, 0xFCCD, + 0xE3D9, 0xFCCE, + 0xE3DA, 0xFCCF, + 0xE3DB, 0xFCD0, + 0xE3DC, 0xFCD1, + 0xE3DD, 0xFCD2, + 0xE3DE, 0xFCD3, + 0xE3DF, 0xFCD4, + 0xE3E0, 0xFCD5, + 0xE3E1, 0xFCD6, + 0xE3E2, 0xFCD7, + 0xE3E3, 0xFCD8, + 0xE3E4, 0xFCD9, + 0xE3E5, 0xFCDA, + 0xE3E6, 0xFCDB, + 0xE3E7, 0xFCDC, + 0xE3E8, 0xFCDD, + 0xE3E9, 0xFCDE, + 0xE3EA, 0xFCDF, + 0xE3EB, 0xFCE0, + 0xE3EC, 0xFCE1, + 0xE3ED, 0xFCE2, + 0xE3EE, 0xFCE3, + 0xE3EF, 0xFCE4, + 0xE3F0, 0xFCE5, + 0xE3F1, 0xFCE6, + 0xE3F2, 0xFCE7, + 0xE3F3, 0xFCE8, + 0xE3F4, 0xFCE9, + 0xE3F5, 0xFCEA, + 0xE3F6, 0xFCEB, + 0xE3F7, 0xFCEC, + 0xE3F8, 0xFCED, + 0xE3F9, 0xFCEE, + 0xE3FA, 0xFCEF, + 0xE3FB, 0xFCF0, + 0xE3FC, 0xFCF1, + 0xE3FD, 0xFCF2, + 0xE3FE, 0xFCF3, + 0xE3FF, 0xFCF4, + 0xE400, 0xFCF5, + 0xE401, 0xFCF6, + 0xE402, 0xFCF7, + 0xE403, 0xFCF8, + 0xE404, 0xFCF9, + 0xE405, 0xFCFA, + 0xE406, 0xFCFB, + 0xE407, 0xFCFC, + 0xE408, 0xFCFD, + 0xE409, 0xFCFE, + 0xE40A, 0xFDA1, + 0xE40B, 0xFDA2, + 0xE40C, 0xFDA3, + 0xE40D, 0xFDA4, + 0xE40E, 0xFDA5, + 0xE40F, 0xFDA6, + 0xE410, 0xFDA7, + 0xE411, 0xFDA8, + 0xE412, 0xFDA9, + 0xE413, 0xFDAA, + 0xE414, 0xFDAB, + 0xE415, 0xFDAC, + 0xE416, 0xFDAD, + 0xE417, 0xFDAE, + 0xE418, 0xFDAF, + 0xE419, 0xFDB0, + 0xE41A, 0xFDB1, + 0xE41B, 0xFDB2, + 0xE41C, 0xFDB3, + 0xE41D, 0xFDB4, + 0xE41E, 0xFDB5, + 0xE41F, 0xFDB6, + 0xE420, 0xFDB7, + 0xE421, 0xFDB8, + 0xE422, 0xFDB9, + 0xE423, 0xFDBA, + 0xE424, 0xFDBB, + 0xE425, 0xFDBC, + 0xE426, 0xFDBD, + 0xE427, 0xFDBE, + 0xE428, 0xFDBF, + 0xE429, 0xFDC0, + 0xE42A, 0xFDC1, + 0xE42B, 0xFDC2, + 0xE42C, 0xFDC3, + 0xE42D, 0xFDC4, + 0xE42E, 0xFDC5, + 0xE42F, 0xFDC6, + 0xE430, 0xFDC7, + 0xE431, 0xFDC8, + 0xE432, 0xFDC9, + 0xE433, 0xFDCA, + 0xE434, 0xFDCB, + 0xE435, 0xFDCC, + 0xE436, 0xFDCD, + 0xE437, 0xFDCE, + 0xE438, 0xFDCF, + 0xE439, 0xFDD0, + 0xE43A, 0xFDD1, + 0xE43B, 0xFDD2, + 0xE43C, 0xFDD3, + 0xE43D, 0xFDD4, + 0xE43E, 0xFDD5, + 0xE43F, 0xFDD6, + 0xE440, 0xFDD7, + 0xE441, 0xFDD8, + 0xE442, 0xFDD9, + 0xE443, 0xFDDA, + 0xE444, 0xFDDB, + 0xE445, 0xFDDC, + 0xE446, 0xFDDD, + 0xE447, 0xFDDE, + 0xE448, 0xFDDF, + 0xE449, 0xFDE0, + 0xE44A, 0xFDE1, + 0xE44B, 0xFDE2, + 0xE44C, 0xFDE3, + 0xE44D, 0xFDE4, + 0xE44E, 0xFDE5, + 0xE44F, 0xFDE6, + 0xE450, 0xFDE7, + 0xE451, 0xFDE8, + 0xE452, 0xFDE9, + 0xE453, 0xFDEA, + 0xE454, 0xFDEB, + 0xE455, 0xFDEC, + 0xE456, 0xFDED, + 0xE457, 0xFDEE, + 0xE458, 0xFDEF, + 0xE459, 0xFDF0, + 0xE45A, 0xFDF1, + 0xE45B, 0xFDF2, + 0xE45C, 0xFDF3, + 0xE45D, 0xFDF4, + 0xE45E, 0xFDF5, + 0xE45F, 0xFDF6, + 0xE460, 0xFDF7, + 0xE461, 0xFDF8, + 0xE462, 0xFDF9, + 0xE463, 0xFDFA, + 0xE464, 0xFDFB, + 0xE465, 0xFDFC, + 0xE466, 0xFDFD, + 0xE467, 0xFDFE, + 0xE468, 0xFEA1, + 0xE469, 0xFEA2, + 0xE46A, 0xFEA3, + 0xE46B, 0xFEA4, + 0xE46C, 0xFEA5, + 0xE46D, 0xFEA6, + 0xE46E, 0xFEA7, + 0xE46F, 0xFEA8, + 0xE470, 0xFEA9, + 0xE471, 0xFEAA, + 0xE472, 0xFEAB, + 0xE473, 0xFEAC, + 0xE474, 0xFEAD, + 0xE475, 0xFEAE, + 0xE476, 0xFEAF, + 0xE477, 0xFEB0, + 0xE478, 0xFEB1, + 0xE479, 0xFEB2, + 0xE47A, 0xFEB3, + 0xE47B, 0xFEB4, + 0xE47C, 0xFEB5, + 0xE47D, 0xFEB6, + 0xE47E, 0xFEB7, + 0xE47F, 0xFEB8, + 0xE480, 0xFEB9, + 0xE481, 0xFEBA, + 0xE482, 0xFEBB, + 0xE483, 0xFEBC, + 0xE484, 0xFEBD, + 0xE485, 0xFEBE, + 0xE486, 0xFEBF, + 0xE487, 0xFEC0, + 0xE488, 0xFEC1, + 0xE489, 0xFEC2, + 0xE48A, 0xFEC3, + 0xE48B, 0xFEC4, + 0xE48C, 0xFEC5, + 0xE48D, 0xFEC6, + 0xE48E, 0xFEC7, + 0xE48F, 0xFEC8, + 0xE490, 0xFEC9, + 0xE491, 0xFECA, + 0xE492, 0xFECB, + 0xE493, 0xFECC, + 0xE494, 0xFECD, + 0xE495, 0xFECE, + 0xE496, 0xFECF, + 0xE497, 0xFED0, + 0xE498, 0xFED1, + 0xE499, 0xFED2, + 0xE49A, 0xFED3, + 0xE49B, 0xFED4, + 0xE49C, 0xFED5, + 0xE49D, 0xFED6, + 0xE49E, 0xFED7, + 0xE49F, 0xFED8, + 0xE4A0, 0xFED9, + 0xE4A1, 0xFEDA, + 0xE4A2, 0xFEDB, + 0xE4A3, 0xFEDC, + 0xE4A4, 0xFEDD, + 0xE4A5, 0xFEDE, + 0xE4A6, 0xFEDF, + 0xE4A7, 0xFEE0, + 0xE4A8, 0xFEE1, + 0xE4A9, 0xFEE2, + 0xE4AA, 0xFEE3, + 0xE4AB, 0xFEE4, + 0xE4AC, 0xFEE5, + 0xE4AD, 0xFEE6, + 0xE4AE, 0xFEE7, + 0xE4AF, 0xFEE8, + 0xE4B0, 0xFEE9, + 0xE4B1, 0xFEEA, + 0xE4B2, 0xFEEB, + 0xE4B3, 0xFEEC, + 0xE4B4, 0xFEED, + 0xE4B5, 0xFEEE, + 0xE4B6, 0xFEEF, + 0xE4B7, 0xFEF0, + 0xE4B8, 0xFEF1, + 0xE4B9, 0xFEF2, + 0xE4BA, 0xFEF3, + 0xE4BB, 0xFEF4, + 0xE4BC, 0xFEF5, + 0xE4BD, 0xFEF6, + 0xE4BE, 0xFEF7, + 0xE4BF, 0xFEF8, + 0xE4C0, 0xFEF9, + 0xE4C1, 0xFEFA, + 0xE4C2, 0xFEFB, + 0xE4C3, 0xFEFC, + 0xE4C4, 0xFEFD, + 0xE4C5, 0xFEFE, + 0xE4C6, 0xA140, + 0xE4C7, 0xA141, + 0xE4C8, 0xA142, + 0xE4C9, 0xA143, + 0xE4CA, 0xA144, + 0xE4CB, 0xA145, + 0xE4CC, 0xA146, + 0xE4CD, 0xA147, + 0xE4CE, 0xA148, + 0xE4CF, 0xA149, + 0xE4D0, 0xA14A, + 0xE4D1, 0xA14B, + 0xE4D2, 0xA14C, + 0xE4D3, 0xA14D, + 0xE4D4, 0xA14E, + 0xE4D5, 0xA14F, + 0xE4D6, 0xA150, + 0xE4D7, 0xA151, + 0xE4D8, 0xA152, + 0xE4D9, 0xA153, + 0xE4DA, 0xA154, + 0xE4DB, 0xA155, + 0xE4DC, 0xA156, + 0xE4DD, 0xA157, + 0xE4DE, 0xA158, + 0xE4DF, 0xA159, + 0xE4E0, 0xA15A, + 0xE4E1, 0xA15B, + 0xE4E2, 0xA15C, + 0xE4E3, 0xA15D, + 0xE4E4, 0xA15E, + 0xE4E5, 0xA15F, + 0xE4E6, 0xA160, + 0xE4E7, 0xA161, + 0xE4E8, 0xA162, + 0xE4E9, 0xA163, + 0xE4EA, 0xA164, + 0xE4EB, 0xA165, + 0xE4EC, 0xA166, + 0xE4ED, 0xA167, + 0xE4EE, 0xA168, + 0xE4EF, 0xA169, + 0xE4F0, 0xA16A, + 0xE4F1, 0xA16B, + 0xE4F2, 0xA16C, + 0xE4F3, 0xA16D, + 0xE4F4, 0xA16E, + 0xE4F5, 0xA16F, + 0xE4F6, 0xA170, + 0xE4F7, 0xA171, + 0xE4F8, 0xA172, + 0xE4F9, 0xA173, + 0xE4FA, 0xA174, + 0xE4FB, 0xA175, + 0xE4FC, 0xA176, + 0xE4FD, 0xA177, + 0xE4FE, 0xA178, + 0xE4FF, 0xA179, + 0xE500, 0xA17A, + 0xE501, 0xA17B, + 0xE502, 0xA17C, + 0xE503, 0xA17D, + 0xE504, 0xA17E, + 0xE505, 0xA180, + 0xE506, 0xA181, + 0xE507, 0xA182, + 0xE508, 0xA183, + 0xE509, 0xA184, + 0xE50A, 0xA185, + 0xE50B, 0xA186, + 0xE50C, 0xA187, + 0xE50D, 0xA188, + 0xE50E, 0xA189, + 0xE50F, 0xA18A, + 0xE510, 0xA18B, + 0xE511, 0xA18C, + 0xE512, 0xA18D, + 0xE513, 0xA18E, + 0xE514, 0xA18F, + 0xE515, 0xA190, + 0xE516, 0xA191, + 0xE517, 0xA192, + 0xE518, 0xA193, + 0xE519, 0xA194, + 0xE51A, 0xA195, + 0xE51B, 0xA196, + 0xE51C, 0xA197, + 0xE51D, 0xA198, + 0xE51E, 0xA199, + 0xE51F, 0xA19A, + 0xE520, 0xA19B, + 0xE521, 0xA19C, + 0xE522, 0xA19D, + 0xE523, 0xA19E, + 0xE524, 0xA19F, + 0xE525, 0xA1A0, + 0xE526, 0xA240, + 0xE527, 0xA241, + 0xE528, 0xA242, + 0xE529, 0xA243, + 0xE52A, 0xA244, + 0xE52B, 0xA245, + 0xE52C, 0xA246, + 0xE52D, 0xA247, + 0xE52E, 0xA248, + 0xE52F, 0xA249, + 0xE530, 0xA24A, + 0xE531, 0xA24B, + 0xE532, 0xA24C, + 0xE533, 0xA24D, + 0xE534, 0xA24E, + 0xE535, 0xA24F, + 0xE536, 0xA250, + 0xE537, 0xA251, + 0xE538, 0xA252, + 0xE539, 0xA253, + 0xE53A, 0xA254, + 0xE53B, 0xA255, + 0xE53C, 0xA256, + 0xE53D, 0xA257, + 0xE53E, 0xA258, + 0xE53F, 0xA259, + 0xE540, 0xA25A, + 0xE541, 0xA25B, + 0xE542, 0xA25C, + 0xE543, 0xA25D, + 0xE544, 0xA25E, + 0xE545, 0xA25F, + 0xE546, 0xA260, + 0xE547, 0xA261, + 0xE548, 0xA262, + 0xE549, 0xA263, + 0xE54A, 0xA264, + 0xE54B, 0xA265, + 0xE54C, 0xA266, + 0xE54D, 0xA267, + 0xE54E, 0xA268, + 0xE54F, 0xA269, + 0xE550, 0xA26A, + 0xE551, 0xA26B, + 0xE552, 0xA26C, + 0xE553, 0xA26D, + 0xE554, 0xA26E, + 0xE555, 0xA26F, + 0xE556, 0xA270, + 0xE557, 0xA271, + 0xE558, 0xA272, + 0xE559, 0xA273, + 0xE55A, 0xA274, + 0xE55B, 0xA275, + 0xE55C, 0xA276, + 0xE55D, 0xA277, + 0xE55E, 0xA278, + 0xE55F, 0xA279, + 0xE560, 0xA27A, + 0xE561, 0xA27B, + 0xE562, 0xA27C, + 0xE563, 0xA27D, + 0xE564, 0xA27E, + 0xE565, 0xA280, + 0xE566, 0xA281, + 0xE567, 0xA282, + 0xE568, 0xA283, + 0xE569, 0xA284, + 0xE56A, 0xA285, + 0xE56B, 0xA286, + 0xE56C, 0xA287, + 0xE56D, 0xA288, + 0xE56E, 0xA289, + 0xE56F, 0xA28A, + 0xE570, 0xA28B, + 0xE571, 0xA28C, + 0xE572, 0xA28D, + 0xE573, 0xA28E, + 0xE574, 0xA28F, + 0xE575, 0xA290, + 0xE576, 0xA291, + 0xE577, 0xA292, + 0xE578, 0xA293, + 0xE579, 0xA294, + 0xE57A, 0xA295, + 0xE57B, 0xA296, + 0xE57C, 0xA297, + 0xE57D, 0xA298, + 0xE57E, 0xA299, + 0xE57F, 0xA29A, + 0xE580, 0xA29B, + 0xE581, 0xA29C, + 0xE582, 0xA29D, + 0xE583, 0xA29E, + 0xE584, 0xA29F, + 0xE585, 0xA2A0, + 0xE586, 0xA340, + 0xE587, 0xA341, + 0xE588, 0xA342, + 0xE589, 0xA343, + 0xE58A, 0xA344, + 0xE58B, 0xA345, + 0xE58C, 0xA346, + 0xE58D, 0xA347, + 0xE58E, 0xA348, + 0xE58F, 0xA349, + 0xE590, 0xA34A, + 0xE591, 0xA34B, + 0xE592, 0xA34C, + 0xE593, 0xA34D, + 0xE594, 0xA34E, + 0xE595, 0xA34F, + 0xE596, 0xA350, + 0xE597, 0xA351, + 0xE598, 0xA352, + 0xE599, 0xA353, + 0xE59A, 0xA354, + 0xE59B, 0xA355, + 0xE59C, 0xA356, + 0xE59D, 0xA357, + 0xE59E, 0xA358, + 0xE59F, 0xA359, + 0xE5A0, 0xA35A, + 0xE5A1, 0xA35B, + 0xE5A2, 0xA35C, + 0xE5A3, 0xA35D, + 0xE5A4, 0xA35E, + 0xE5A5, 0xA35F, + 0xE5A6, 0xA360, + 0xE5A7, 0xA361, + 0xE5A8, 0xA362, + 0xE5A9, 0xA363, + 0xE5AA, 0xA364, + 0xE5AB, 0xA365, + 0xE5AC, 0xA366, + 0xE5AD, 0xA367, + 0xE5AE, 0xA368, + 0xE5AF, 0xA369, + 0xE5B0, 0xA36A, + 0xE5B1, 0xA36B, + 0xE5B2, 0xA36C, + 0xE5B3, 0xA36D, + 0xE5B4, 0xA36E, + 0xE5B5, 0xA36F, + 0xE5B6, 0xA370, + 0xE5B7, 0xA371, + 0xE5B8, 0xA372, + 0xE5B9, 0xA373, + 0xE5BA, 0xA374, + 0xE5BB, 0xA375, + 0xE5BC, 0xA376, + 0xE5BD, 0xA377, + 0xE5BE, 0xA378, + 0xE5BF, 0xA379, + 0xE5C0, 0xA37A, + 0xE5C1, 0xA37B, + 0xE5C2, 0xA37C, + 0xE5C3, 0xA37D, + 0xE5C4, 0xA37E, + 0xE5C5, 0xA380, + 0xE5C6, 0xA381, + 0xE5C7, 0xA382, + 0xE5C8, 0xA383, + 0xE5C9, 0xA384, + 0xE5CA, 0xA385, + 0xE5CB, 0xA386, + 0xE5CC, 0xA387, + 0xE5CD, 0xA388, + 0xE5CE, 0xA389, + 0xE5CF, 0xA38A, + 0xE5D0, 0xA38B, + 0xE5D1, 0xA38C, + 0xE5D2, 0xA38D, + 0xE5D3, 0xA38E, + 0xE5D4, 0xA38F, + 0xE5D5, 0xA390, + 0xE5D6, 0xA391, + 0xE5D7, 0xA392, + 0xE5D8, 0xA393, + 0xE5D9, 0xA394, + 0xE5DA, 0xA395, + 0xE5DB, 0xA396, + 0xE5DC, 0xA397, + 0xE5DD, 0xA398, + 0xE5DE, 0xA399, + 0xE5DF, 0xA39A, + 0xE5E0, 0xA39B, + 0xE5E1, 0xA39C, + 0xE5E2, 0xA39D, + 0xE5E3, 0xA39E, + 0xE5E4, 0xA39F, + 0xE5E5, 0xA3A0, + 0xE5E6, 0xA440, + 0xE5E7, 0xA441, + 0xE5E8, 0xA442, + 0xE5E9, 0xA443, + 0xE5EA, 0xA444, + 0xE5EB, 0xA445, + 0xE5EC, 0xA446, + 0xE5ED, 0xA447, + 0xE5EE, 0xA448, + 0xE5EF, 0xA449, + 0xE5F0, 0xA44A, + 0xE5F1, 0xA44B, + 0xE5F2, 0xA44C, + 0xE5F3, 0xA44D, + 0xE5F4, 0xA44E, + 0xE5F5, 0xA44F, + 0xE5F6, 0xA450, + 0xE5F7, 0xA451, + 0xE5F8, 0xA452, + 0xE5F9, 0xA453, + 0xE5FA, 0xA454, + 0xE5FB, 0xA455, + 0xE5FC, 0xA456, + 0xE5FD, 0xA457, + 0xE5FE, 0xA458, + 0xE5FF, 0xA459, + 0xE600, 0xA45A, + 0xE601, 0xA45B, + 0xE602, 0xA45C, + 0xE603, 0xA45D, + 0xE604, 0xA45E, + 0xE605, 0xA45F, + 0xE606, 0xA460, + 0xE607, 0xA461, + 0xE608, 0xA462, + 0xE609, 0xA463, + 0xE60A, 0xA464, + 0xE60B, 0xA465, + 0xE60C, 0xA466, + 0xE60D, 0xA467, + 0xE60E, 0xA468, + 0xE60F, 0xA469, + 0xE610, 0xA46A, + 0xE611, 0xA46B, + 0xE612, 0xA46C, + 0xE613, 0xA46D, + 0xE614, 0xA46E, + 0xE615, 0xA46F, + 0xE616, 0xA470, + 0xE617, 0xA471, + 0xE618, 0xA472, + 0xE619, 0xA473, + 0xE61A, 0xA474, + 0xE61B, 0xA475, + 0xE61C, 0xA476, + 0xE61D, 0xA477, + 0xE61E, 0xA478, + 0xE61F, 0xA479, + 0xE620, 0xA47A, + 0xE621, 0xA47B, + 0xE622, 0xA47C, + 0xE623, 0xA47D, + 0xE624, 0xA47E, + 0xE625, 0xA480, + 0xE626, 0xA481, + 0xE627, 0xA482, + 0xE628, 0xA483, + 0xE629, 0xA484, + 0xE62A, 0xA485, + 0xE62B, 0xA486, + 0xE62C, 0xA487, + 0xE62D, 0xA488, + 0xE62E, 0xA489, + 0xE62F, 0xA48A, + 0xE630, 0xA48B, + 0xE631, 0xA48C, + 0xE632, 0xA48D, + 0xE633, 0xA48E, + 0xE634, 0xA48F, + 0xE635, 0xA490, + 0xE636, 0xA491, + 0xE637, 0xA492, + 0xE638, 0xA493, + 0xE639, 0xA494, + 0xE63A, 0xA495, + 0xE63B, 0xA496, + 0xE63C, 0xA497, + 0xE63D, 0xA498, + 0xE63E, 0xA499, + 0xE63F, 0xA49A, + 0xE640, 0xA49B, + 0xE641, 0xA49C, + 0xE642, 0xA49D, + 0xE643, 0xA49E, + 0xE644, 0xA49F, + 0xE645, 0xA4A0, + 0xE646, 0xA540, + 0xE647, 0xA541, + 0xE648, 0xA542, + 0xE649, 0xA543, + 0xE64A, 0xA544, + 0xE64B, 0xA545, + 0xE64C, 0xA546, + 0xE64D, 0xA547, + 0xE64E, 0xA548, + 0xE64F, 0xA549, + 0xE650, 0xA54A, + 0xE651, 0xA54B, + 0xE652, 0xA54C, + 0xE653, 0xA54D, + 0xE654, 0xA54E, + 0xE655, 0xA54F, + 0xE656, 0xA550, + 0xE657, 0xA551, + 0xE658, 0xA552, + 0xE659, 0xA553, + 0xE65A, 0xA554, + 0xE65B, 0xA555, + 0xE65C, 0xA556, + 0xE65D, 0xA557, + 0xE65E, 0xA558, + 0xE65F, 0xA559, + 0xE660, 0xA55A, + 0xE661, 0xA55B, + 0xE662, 0xA55C, + 0xE663, 0xA55D, + 0xE664, 0xA55E, + 0xE665, 0xA55F, + 0xE666, 0xA560, + 0xE667, 0xA561, + 0xE668, 0xA562, + 0xE669, 0xA563, + 0xE66A, 0xA564, + 0xE66B, 0xA565, + 0xE66C, 0xA566, + 0xE66D, 0xA567, + 0xE66E, 0xA568, + 0xE66F, 0xA569, + 0xE670, 0xA56A, + 0xE671, 0xA56B, + 0xE672, 0xA56C, + 0xE673, 0xA56D, + 0xE674, 0xA56E, + 0xE675, 0xA56F, + 0xE676, 0xA570, + 0xE677, 0xA571, + 0xE678, 0xA572, + 0xE679, 0xA573, + 0xE67A, 0xA574, + 0xE67B, 0xA575, + 0xE67C, 0xA576, + 0xE67D, 0xA577, + 0xE67E, 0xA578, + 0xE67F, 0xA579, + 0xE680, 0xA57A, + 0xE681, 0xA57B, + 0xE682, 0xA57C, + 0xE683, 0xA57D, + 0xE684, 0xA57E, + 0xE685, 0xA580, + 0xE686, 0xA581, + 0xE687, 0xA582, + 0xE688, 0xA583, + 0xE689, 0xA584, + 0xE68A, 0xA585, + 0xE68B, 0xA586, + 0xE68C, 0xA587, + 0xE68D, 0xA588, + 0xE68E, 0xA589, + 0xE68F, 0xA58A, + 0xE690, 0xA58B, + 0xE691, 0xA58C, + 0xE692, 0xA58D, + 0xE693, 0xA58E, + 0xE694, 0xA58F, + 0xE695, 0xA590, + 0xE696, 0xA591, + 0xE697, 0xA592, + 0xE698, 0xA593, + 0xE699, 0xA594, + 0xE69A, 0xA595, + 0xE69B, 0xA596, + 0xE69C, 0xA597, + 0xE69D, 0xA598, + 0xE69E, 0xA599, + 0xE69F, 0xA59A, + 0xE6A0, 0xA59B, + 0xE6A1, 0xA59C, + 0xE6A2, 0xA59D, + 0xE6A3, 0xA59E, + 0xE6A4, 0xA59F, + 0xE6A5, 0xA5A0, + 0xE6A6, 0xA640, + 0xE6A7, 0xA641, + 0xE6A8, 0xA642, + 0xE6A9, 0xA643, + 0xE6AA, 0xA644, + 0xE6AB, 0xA645, + 0xE6AC, 0xA646, + 0xE6AD, 0xA647, + 0xE6AE, 0xA648, + 0xE6AF, 0xA649, + 0xE6B0, 0xA64A, + 0xE6B1, 0xA64B, + 0xE6B2, 0xA64C, + 0xE6B3, 0xA64D, + 0xE6B4, 0xA64E, + 0xE6B5, 0xA64F, + 0xE6B6, 0xA650, + 0xE6B7, 0xA651, + 0xE6B8, 0xA652, + 0xE6B9, 0xA653, + 0xE6BA, 0xA654, + 0xE6BB, 0xA655, + 0xE6BC, 0xA656, + 0xE6BD, 0xA657, + 0xE6BE, 0xA658, + 0xE6BF, 0xA659, + 0xE6C0, 0xA65A, + 0xE6C1, 0xA65B, + 0xE6C2, 0xA65C, + 0xE6C3, 0xA65D, + 0xE6C4, 0xA65E, + 0xE6C5, 0xA65F, + 0xE6C6, 0xA660, + 0xE6C7, 0xA661, + 0xE6C8, 0xA662, + 0xE6C9, 0xA663, + 0xE6CA, 0xA664, + 0xE6CB, 0xA665, + 0xE6CC, 0xA666, + 0xE6CD, 0xA667, + 0xE6CE, 0xA668, + 0xE6CF, 0xA669, + 0xE6D0, 0xA66A, + 0xE6D1, 0xA66B, + 0xE6D2, 0xA66C, + 0xE6D3, 0xA66D, + 0xE6D4, 0xA66E, + 0xE6D5, 0xA66F, + 0xE6D6, 0xA670, + 0xE6D7, 0xA671, + 0xE6D8, 0xA672, + 0xE6D9, 0xA673, + 0xE6DA, 0xA674, + 0xE6DB, 0xA675, + 0xE6DC, 0xA676, + 0xE6DD, 0xA677, + 0xE6DE, 0xA678, + 0xE6DF, 0xA679, + 0xE6E0, 0xA67A, + 0xE6E1, 0xA67B, + 0xE6E2, 0xA67C, + 0xE6E3, 0xA67D, + 0xE6E4, 0xA67E, + 0xE6E5, 0xA680, + 0xE6E6, 0xA681, + 0xE6E7, 0xA682, + 0xE6E8, 0xA683, + 0xE6E9, 0xA684, + 0xE6EA, 0xA685, + 0xE6EB, 0xA686, + 0xE6EC, 0xA687, + 0xE6ED, 0xA688, + 0xE6EE, 0xA689, + 0xE6EF, 0xA68A, + 0xE6F0, 0xA68B, + 0xE6F1, 0xA68C, + 0xE6F2, 0xA68D, + 0xE6F3, 0xA68E, + 0xE6F4, 0xA68F, + 0xE6F5, 0xA690, + 0xE6F6, 0xA691, + 0xE6F7, 0xA692, + 0xE6F8, 0xA693, + 0xE6F9, 0xA694, + 0xE6FA, 0xA695, + 0xE6FB, 0xA696, + 0xE6FC, 0xA697, + 0xE6FD, 0xA698, + 0xE6FE, 0xA699, + 0xE6FF, 0xA69A, + 0xE700, 0xA69B, + 0xE701, 0xA69C, + 0xE702, 0xA69D, + 0xE703, 0xA69E, + 0xE704, 0xA69F, + 0xE705, 0xA6A0, + 0xE706, 0xA740, + 0xE707, 0xA741, + 0xE708, 0xA742, + 0xE709, 0xA743, + 0xE70A, 0xA744, + 0xE70B, 0xA745, + 0xE70C, 0xA746, + 0xE70D, 0xA747, + 0xE70E, 0xA748, + 0xE70F, 0xA749, + 0xE710, 0xA74A, + 0xE711, 0xA74B, + 0xE712, 0xA74C, + 0xE713, 0xA74D, + 0xE714, 0xA74E, + 0xE715, 0xA74F, + 0xE716, 0xA750, + 0xE717, 0xA751, + 0xE718, 0xA752, + 0xE719, 0xA753, + 0xE71A, 0xA754, + 0xE71B, 0xA755, + 0xE71C, 0xA756, + 0xE71D, 0xA757, + 0xE71E, 0xA758, + 0xE71F, 0xA759, + 0xE720, 0xA75A, + 0xE721, 0xA75B, + 0xE722, 0xA75C, + 0xE723, 0xA75D, + 0xE724, 0xA75E, + 0xE725, 0xA75F, + 0xE726, 0xA760, + 0xE727, 0xA761, + 0xE728, 0xA762, + 0xE729, 0xA763, + 0xE72A, 0xA764, + 0xE72B, 0xA765, + 0xE72C, 0xA766, + 0xE72D, 0xA767, + 0xE72E, 0xA768, + 0xE72F, 0xA769, + 0xE730, 0xA76A, + 0xE731, 0xA76B, + 0xE732, 0xA76C, + 0xE733, 0xA76D, + 0xE734, 0xA76E, + 0xE735, 0xA76F, + 0xE736, 0xA770, + 0xE737, 0xA771, + 0xE738, 0xA772, + 0xE739, 0xA773, + 0xE73A, 0xA774, + 0xE73B, 0xA775, + 0xE73C, 0xA776, + 0xE73D, 0xA777, + 0xE73E, 0xA778, + 0xE73F, 0xA779, + 0xE740, 0xA77A, + 0xE741, 0xA77B, + 0xE742, 0xA77C, + 0xE743, 0xA77D, + 0xE744, 0xA77E, + 0xE745, 0xA780, + 0xE746, 0xA781, + 0xE747, 0xA782, + 0xE748, 0xA783, + 0xE749, 0xA784, + 0xE74A, 0xA785, + 0xE74B, 0xA786, + 0xE74C, 0xA787, + 0xE74D, 0xA788, + 0xE74E, 0xA789, + 0xE74F, 0xA78A, + 0xE750, 0xA78B, + 0xE751, 0xA78C, + 0xE752, 0xA78D, + 0xE753, 0xA78E, + 0xE754, 0xA78F, + 0xE755, 0xA790, + 0xE756, 0xA791, + 0xE757, 0xA792, + 0xE758, 0xA793, + 0xE759, 0xA794, + 0xE75A, 0xA795, + 0xE75B, 0xA796, + 0xE75C, 0xA797, + 0xE75D, 0xA798, + 0xE75E, 0xA799, + 0xE75F, 0xA79A, + 0xE760, 0xA79B, + 0xE761, 0xA79C, + 0xE762, 0xA79D, + 0xE763, 0xA79E, + 0xE764, 0xA79F, + 0xE765, 0xA7A0, + 0xE766, 0xA2AB, + 0xE767, 0xA2AC, + 0xE768, 0xA2AD, + 0xE769, 0xA2AE, + 0xE76A, 0xA2AF, + 0xE76B, 0xA2B0, + 0xE76D, 0xA2E4, + 0xE76E, 0xA2EF, + 0xE76F, 0xA2F0, + 0xE770, 0xA2FD, + 0xE771, 0xA2FE, + 0xE772, 0xA4F4, + 0xE773, 0xA4F5, + 0xE774, 0xA4F6, + 0xE775, 0xA4F7, + 0xE776, 0xA4F8, + 0xE777, 0xA4F9, + 0xE778, 0xA4FA, + 0xE779, 0xA4FB, + 0xE77A, 0xA4FC, + 0xE77B, 0xA4FD, + 0xE77C, 0xA4FE, + 0xE77D, 0xA5F7, + 0xE77E, 0xA5F8, + 0xE77F, 0xA5F9, + 0xE780, 0xA5FA, + 0xE781, 0xA5FB, + 0xE782, 0xA5FC, + 0xE783, 0xA5FD, + 0xE784, 0xA5FE, + 0xE785, 0xA6B9, + 0xE786, 0xA6BA, + 0xE787, 0xA6BB, + 0xE788, 0xA6BC, + 0xE789, 0xA6BD, + 0xE78A, 0xA6BE, + 0xE78B, 0xA6BF, + 0xE78C, 0xA6C0, + 0xE78D, 0xA6D9, + 0xE78E, 0xA6DA, + 0xE78F, 0xA6DB, + 0xE790, 0xA6DC, + 0xE791, 0xA6DD, + 0xE792, 0xA6DE, + 0xE793, 0xA6DF, + 0xE794, 0xA6EC, + 0xE795, 0xA6ED, + 0xE796, 0xA6F3, + 0xE797, 0xA6F6, + 0xE798, 0xA6F7, + 0xE799, 0xA6F8, + 0xE79A, 0xA6F9, + 0xE79B, 0xA6FA, + 0xE79C, 0xA6FB, + 0xE79D, 0xA6FC, + 0xE79E, 0xA6FD, + 0xE79F, 0xA6FE, + 0xE7A0, 0xA7C2, + 0xE7A1, 0xA7C3, + 0xE7A2, 0xA7C4, + 0xE7A3, 0xA7C5, + 0xE7A4, 0xA7C6, + 0xE7A5, 0xA7C7, + 0xE7A6, 0xA7C8, + 0xE7A7, 0xA7C9, + 0xE7A8, 0xA7CA, + 0xE7A9, 0xA7CB, + 0xE7AA, 0xA7CC, + 0xE7AB, 0xA7CD, + 0xE7AC, 0xA7CE, + 0xE7AD, 0xA7CF, + 0xE7AE, 0xA7D0, + 0xE7AF, 0xA7F2, + 0xE7B0, 0xA7F3, + 0xE7B1, 0xA7F4, + 0xE7B2, 0xA7F5, + 0xE7B3, 0xA7F6, + 0xE7B4, 0xA7F7, + 0xE7B5, 0xA7F8, + 0xE7B6, 0xA7F9, + 0xE7B7, 0xA7FA, + 0xE7B8, 0xA7FB, + 0xE7B9, 0xA7FC, + 0xE7BA, 0xA7FD, + 0xE7BB, 0xA7FE, + 0xE7BC, 0xA896, + 0xE7BD, 0xA897, + 0xE7BE, 0xA898, + 0xE7BF, 0xA899, + 0xE7C0, 0xA89A, + 0xE7C1, 0xA89B, + 0xE7C2, 0xA89C, + 0xE7C3, 0xA89D, + 0xE7C4, 0xA89E, + 0xE7C5, 0xA89F, + 0xE7C6, 0xA8A0, + 0xE7C7, 0xA8BC, + 0xE7C9, 0xA8C1, + 0xE7CA, 0xA8C2, + 0xE7CB, 0xA8C3, + 0xE7CC, 0xA8C4, + 0xE7CD, 0xA8EA, + 0xE7CE, 0xA8EB, + 0xE7CF, 0xA8EC, + 0xE7D0, 0xA8ED, + 0xE7D1, 0xA8EE, + 0xE7D2, 0xA8EF, + 0xE7D3, 0xA8F0, + 0xE7D4, 0xA8F1, + 0xE7D5, 0xA8F2, + 0xE7D6, 0xA8F3, + 0xE7D7, 0xA8F4, + 0xE7D8, 0xA8F5, + 0xE7D9, 0xA8F6, + 0xE7DA, 0xA8F7, + 0xE7DB, 0xA8F8, + 0xE7DC, 0xA8F9, + 0xE7DD, 0xA8FA, + 0xE7DE, 0xA8FB, + 0xE7DF, 0xA8FC, + 0xE7E0, 0xA8FD, + 0xE7E1, 0xA8FE, + 0xE7E2, 0xA958, + 0xE7E3, 0xA95B, + 0xE7E4, 0xA95D, + 0xE7E5, 0xA95E, + 0xE7E6, 0xA95F, + 0xE7F4, 0xA997, + 0xE7F5, 0xA998, + 0xE7F6, 0xA999, + 0xE7F7, 0xA99A, + 0xE7F8, 0xA99B, + 0xE7F9, 0xA99C, + 0xE7FA, 0xA99D, + 0xE7FB, 0xA99E, + 0xE7FC, 0xA99F, + 0xE7FD, 0xA9A0, + 0xE7FE, 0xA9A1, + 0xE7FF, 0xA9A2, + 0xE800, 0xA9A3, + 0xE801, 0xA9F0, + 0xE802, 0xA9F1, + 0xE803, 0xA9F2, + 0xE804, 0xA9F3, + 0xE805, 0xA9F4, + 0xE806, 0xA9F5, + 0xE807, 0xA9F6, + 0xE808, 0xA9F7, + 0xE809, 0xA9F8, + 0xE80A, 0xA9F9, + 0xE80B, 0xA9FA, + 0xE80C, 0xA9FB, + 0xE80D, 0xA9FC, + 0xE80E, 0xA9FD, + 0xE80F, 0xA9FE, + 0xE810, 0xD7FA, + 0xE811, 0xD7FB, + 0xE812, 0xD7FC, + 0xE813, 0xD7FD, + 0xE814, 0xD7FE, + 0xE816, 0xFE51, + 0xE817, 0xFE52, + 0xE818, 0xFE53, + 0xE81E, 0xFE59, + 0xE826, 0xFE61, + 0xE82B, 0xFE66, + 0xE82C, 0xFE67, + 0xE831, 0xFE6C, + 0xE832, 0xFE6D, + 0xE83B, 0xFE76, + 0xE843, 0xFE7E, + 0xE854, 0xFE90, + 0xE855, 0xFE91, + 0xE864, 0xFEA0, + 0xF92C, 0xFD9C, + 0xF979, 0xFD9D, + 0xF995, 0xFD9E, + 0xF9E7, 0xFD9F, + 0xF9F1, 0xFDA0, + 0xFA0C, 0xFE40, + 0xFA0D, 0xFE41, + 0xFA0E, 0xFE42, + 0xFA0F, 0xFE43, + 0xFA11, 0xFE44, + 0xFA13, 0xFE45, + 0xFA14, 0xFE46, + 0xFA18, 0xFE47, + 0xFA1F, 0xFE48, + 0xFA20, 0xFE49, + 0xFA21, 0xFE4A, + 0xFA23, 0xFE4B, + 0xFA24, 0xFE4C, + 0xFA27, 0xFE4D, + 0xFA28, 0xFE4E, + 0xFA29, 0xFE4F, + 0xFE30, 0xA955, + 0xFE31, 0xA6F2, + 0xFE33, 0xA6F4, + 0xFE34, 0xA6F5, + 0xFE35, 0xA6E0, + 0xFE36, 0xA6E1, + 0xFE37, 0xA6F0, + 0xFE38, 0xA6F1, + 0xFE39, 0xA6E2, + 0xFE3A, 0xA6E3, + 0xFE3B, 0xA6EE, + 0xFE3C, 0xA6EF, + 0xFE3D, 0xA6E6, + 0xFE3E, 0xA6E7, + 0xFE3F, 0xA6E4, + 0xFE40, 0xA6E5, + 0xFE41, 0xA6E8, + 0xFE42, 0xA6E9, + 0xFE43, 0xA6EA, + 0xFE44, 0xA6EB, + 0xFE49, 0xA968, + 0xFE4A, 0xA969, + 0xFE4B, 0xA96A, + 0xFE4C, 0xA96B, + 0xFE4D, 0xA96C, + 0xFE4E, 0xA96D, + 0xFE4F, 0xA96E, + 0xFE50, 0xA96F, + 0xFE51, 0xA970, + 0xFE52, 0xA971, + 0xFE54, 0xA972, + 0xFE55, 0xA973, + 0xFE56, 0xA974, + 0xFE57, 0xA975, + 0xFE59, 0xA976, + 0xFE5A, 0xA977, + 0xFE5B, 0xA978, + 0xFE5C, 0xA979, + 0xFE5D, 0xA97A, + 0xFE5E, 0xA97B, + 0xFE5F, 0xA97C, + 0xFE60, 0xA97D, + 0xFE61, 0xA97E, + 0xFE62, 0xA980, + 0xFE63, 0xA981, + 0xFE64, 0xA982, + 0xFE65, 0xA983, + 0xFE66, 0xA984, + 0xFE68, 0xA985, + 0xFE69, 0xA986, + 0xFE6A, 0xA987, + 0xFE6B, 0xA988, + 0xFFE2, 0xA956, + 0xFFE4, 0xA957 +}; + +static const unsigned short int gb18030_fourbyte_lookup[] = { + 0x0080, 0x8130, 0x8130, + 0x0081, 0x8130, 0x8131, + 0x0082, 0x8130, 0x8132, + 0x0083, 0x8130, 0x8133, + 0x0084, 0x8130, 0x8134, + 0x0085, 0x8130, 0x8135, + 0x0086, 0x8130, 0x8136, + 0x0087, 0x8130, 0x8137, + 0x0088, 0x8130, 0x8138, + 0x0089, 0x8130, 0x8139, + 0x008A, 0x8130, 0x8230, + 0x008B, 0x8130, 0x8231, + 0x008C, 0x8130, 0x8232, + 0x008D, 0x8130, 0x8233, + 0x008E, 0x8130, 0x8234, + 0x008F, 0x8130, 0x8235, + 0x0090, 0x8130, 0x8236, + 0x0091, 0x8130, 0x8237, + 0x0092, 0x8130, 0x8238, + 0x0093, 0x8130, 0x8239, + 0x0094, 0x8130, 0x8330, + 0x0095, 0x8130, 0x8331, + 0x0096, 0x8130, 0x8332, + 0x0097, 0x8130, 0x8333, + 0x0098, 0x8130, 0x8334, + 0x0099, 0x8130, 0x8335, + 0x009A, 0x8130, 0x8336, + 0x009B, 0x8130, 0x8337, + 0x009C, 0x8130, 0x8338, + 0x009D, 0x8130, 0x8339, + 0x009E, 0x8130, 0x8430, + 0x009F, 0x8130, 0x8431, + 0x00A0, 0x8130, 0x8432, + 0x00A1, 0x8130, 0x8433, + 0x00A2, 0x8130, 0x8434, + 0x00A3, 0x8130, 0x8435, + 0x00A5, 0x8130, 0x8436, + 0x00A6, 0x8130, 0x8437, + 0x00A9, 0x8130, 0x8438, + 0x00AA, 0x8130, 0x8439, + 0x00AB, 0x8130, 0x8530, + 0x00AC, 0x8130, 0x8531, + 0x00AD, 0x8130, 0x8532, + 0x00AE, 0x8130, 0x8533, + 0x00AF, 0x8130, 0x8534, + 0x00B2, 0x8130, 0x8535, + 0x00B3, 0x8130, 0x8536, + 0x00B4, 0x8130, 0x8537, + 0x00B5, 0x8130, 0x8538, + 0x00B6, 0x8130, 0x8539, + 0x00B8, 0x8130, 0x8630, + 0x00B9, 0x8130, 0x8631, + 0x00BA, 0x8130, 0x8632, + 0x00BB, 0x8130, 0x8633, + 0x00BC, 0x8130, 0x8634, + 0x00BD, 0x8130, 0x8635, + 0x00BE, 0x8130, 0x8636, + 0x00BF, 0x8130, 0x8637, + 0x00C0, 0x8130, 0x8638, + 0x00C1, 0x8130, 0x8639, + 0x00C2, 0x8130, 0x8730, + 0x00C3, 0x8130, 0x8731, + 0x00C4, 0x8130, 0x8732, + 0x00C5, 0x8130, 0x8733, + 0x00C6, 0x8130, 0x8734, + 0x00C7, 0x8130, 0x8735, + 0x00C8, 0x8130, 0x8736, + 0x00C9, 0x8130, 0x8737, + 0x00CA, 0x8130, 0x8738, + 0x00CB, 0x8130, 0x8739, + 0x00CC, 0x8130, 0x8830, + 0x00CD, 0x8130, 0x8831, + 0x00CE, 0x8130, 0x8832, + 0x00CF, 0x8130, 0x8833, + 0x00D0, 0x8130, 0x8834, + 0x00D1, 0x8130, 0x8835, + 0x00D2, 0x8130, 0x8836, + 0x00D3, 0x8130, 0x8837, + 0x00D4, 0x8130, 0x8838, + 0x00D5, 0x8130, 0x8839, + 0x00D6, 0x8130, 0x8930, + 0x00D8, 0x8130, 0x8931, + 0x00D9, 0x8130, 0x8932, + 0x00DA, 0x8130, 0x8933, + 0x00DB, 0x8130, 0x8934, + 0x00DC, 0x8130, 0x8935, + 0x00DD, 0x8130, 0x8936, + 0x00DE, 0x8130, 0x8937, + 0x00DF, 0x8130, 0x8938, + 0x00E2, 0x8130, 0x8939, + 0x00E3, 0x8130, 0x8A30, + 0x00E4, 0x8130, 0x8A31, + 0x00E5, 0x8130, 0x8A32, + 0x00E6, 0x8130, 0x8A33, + 0x00E7, 0x8130, 0x8A34, + 0x00EB, 0x8130, 0x8A35, + 0x00EE, 0x8130, 0x8A36, + 0x00EF, 0x8130, 0x8A37, + 0x00F0, 0x8130, 0x8A38, + 0x00F1, 0x8130, 0x8A39, + 0x00F4, 0x8130, 0x8B30, + 0x00F5, 0x8130, 0x8B31, + 0x00F6, 0x8130, 0x8B32, + 0x00F8, 0x8130, 0x8B33, + 0x00FB, 0x8130, 0x8B34, + 0x00FD, 0x8130, 0x8B35, + 0x00FE, 0x8130, 0x8B36, + 0x00FF, 0x8130, 0x8B37, + 0x0100, 0x8130, 0x8B38, + 0x0102, 0x8130, 0x8B39, + 0x0103, 0x8130, 0x8C30, + 0x0104, 0x8130, 0x8C31, + 0x0105, 0x8130, 0x8C32, + 0x0106, 0x8130, 0x8C33, + 0x0107, 0x8130, 0x8C34, + 0x0108, 0x8130, 0x8C35, + 0x0109, 0x8130, 0x8C36, + 0x010A, 0x8130, 0x8C37, + 0x010B, 0x8130, 0x8C38, + 0x010C, 0x8130, 0x8C39, + 0x010D, 0x8130, 0x8D30, + 0x010E, 0x8130, 0x8D31, + 0x010F, 0x8130, 0x8D32, + 0x0110, 0x8130, 0x8D33, + 0x0111, 0x8130, 0x8D34, + 0x0112, 0x8130, 0x8D35, + 0x0114, 0x8130, 0x8D36, + 0x0115, 0x8130, 0x8D37, + 0x0116, 0x8130, 0x8D38, + 0x0117, 0x8130, 0x8D39, + 0x0118, 0x8130, 0x8E30, + 0x0119, 0x8130, 0x8E31, + 0x011A, 0x8130, 0x8E32, + 0x011C, 0x8130, 0x8E33, + 0x011D, 0x8130, 0x8E34, + 0x011E, 0x8130, 0x8E35, + 0x011F, 0x8130, 0x8E36, + 0x0120, 0x8130, 0x8E37, + 0x0121, 0x8130, 0x8E38, + 0x0122, 0x8130, 0x8E39, + 0x0123, 0x8130, 0x8F30, + 0x0124, 0x8130, 0x8F31, + 0x0125, 0x8130, 0x8F32, + 0x0126, 0x8130, 0x8F33, + 0x0127, 0x8130, 0x8F34, + 0x0128, 0x8130, 0x8F35, + 0x0129, 0x8130, 0x8F36, + 0x012A, 0x8130, 0x8F37, + 0x012C, 0x8130, 0x8F38, + 0x012D, 0x8130, 0x8F39, + 0x012E, 0x8130, 0x9030, + 0x012F, 0x8130, 0x9031, + 0x0130, 0x8130, 0x9032, + 0x0131, 0x8130, 0x9033, + 0x0132, 0x8130, 0x9034, + 0x0133, 0x8130, 0x9035, + 0x0134, 0x8130, 0x9036, + 0x0135, 0x8130, 0x9037, + 0x0136, 0x8130, 0x9038, + 0x0137, 0x8130, 0x9039, + 0x0138, 0x8130, 0x9130, + 0x0139, 0x8130, 0x9131, + 0x013A, 0x8130, 0x9132, + 0x013B, 0x8130, 0x9133, + 0x013C, 0x8130, 0x9134, + 0x013D, 0x8130, 0x9135, + 0x013E, 0x8130, 0x9136, + 0x013F, 0x8130, 0x9137, + 0x0140, 0x8130, 0x9138, + 0x0141, 0x8130, 0x9139, + 0x0142, 0x8130, 0x9230, + 0x0143, 0x8130, 0x9231, + 0x0145, 0x8130, 0x9232, + 0x0146, 0x8130, 0x9233, + 0x0147, 0x8130, 0x9234, + 0x0149, 0x8130, 0x9235, + 0x014A, 0x8130, 0x9236, + 0x014B, 0x8130, 0x9237, + 0x014C, 0x8130, 0x9238, + 0x014E, 0x8130, 0x9239, + 0x014F, 0x8130, 0x9330, + 0x0150, 0x8130, 0x9331, + 0x0151, 0x8130, 0x9332, + 0x0152, 0x8130, 0x9333, + 0x0153, 0x8130, 0x9334, + 0x0154, 0x8130, 0x9335, + 0x0155, 0x8130, 0x9336, + 0x0156, 0x8130, 0x9337, + 0x0157, 0x8130, 0x9338, + 0x0158, 0x8130, 0x9339, + 0x0159, 0x8130, 0x9430, + 0x015A, 0x8130, 0x9431, + 0x015B, 0x8130, 0x9432, + 0x015C, 0x8130, 0x9433, + 0x015D, 0x8130, 0x9434, + 0x015E, 0x8130, 0x9435, + 0x015F, 0x8130, 0x9436, + 0x0160, 0x8130, 0x9437, + 0x0161, 0x8130, 0x9438, + 0x0162, 0x8130, 0x9439, + 0x0163, 0x8130, 0x9530, + 0x0164, 0x8130, 0x9531, + 0x0165, 0x8130, 0x9532, + 0x0166, 0x8130, 0x9533, + 0x0167, 0x8130, 0x9534, + 0x0168, 0x8130, 0x9535, + 0x0169, 0x8130, 0x9536, + 0x016A, 0x8130, 0x9537, + 0x016C, 0x8130, 0x9538, + 0x016D, 0x8130, 0x9539, + 0x016E, 0x8130, 0x9630, + 0x016F, 0x8130, 0x9631, + 0x0170, 0x8130, 0x9632, + 0x0171, 0x8130, 0x9633, + 0x0172, 0x8130, 0x9634, + 0x0173, 0x8130, 0x9635, + 0x0174, 0x8130, 0x9636, + 0x0175, 0x8130, 0x9637, + 0x0176, 0x8130, 0x9638, + 0x0177, 0x8130, 0x9639, + 0x0178, 0x8130, 0x9730, + 0x0179, 0x8130, 0x9731, + 0x017A, 0x8130, 0x9732, + 0x017B, 0x8130, 0x9733, + 0x017C, 0x8130, 0x9734, + 0x017D, 0x8130, 0x9735, + 0x017E, 0x8130, 0x9736, + 0x017F, 0x8130, 0x9737, + 0x0180, 0x8130, 0x9738, + 0x0181, 0x8130, 0x9739, + 0x0182, 0x8130, 0x9830, + 0x0183, 0x8130, 0x9831, + 0x0184, 0x8130, 0x9832, + 0x0185, 0x8130, 0x9833, + 0x0186, 0x8130, 0x9834, + 0x0187, 0x8130, 0x9835, + 0x0188, 0x8130, 0x9836, + 0x0189, 0x8130, 0x9837, + 0x018A, 0x8130, 0x9838, + 0x018B, 0x8130, 0x9839, + 0x018C, 0x8130, 0x9930, + 0x018D, 0x8130, 0x9931, + 0x018E, 0x8130, 0x9932, + 0x018F, 0x8130, 0x9933, + 0x0190, 0x8130, 0x9934, + 0x0191, 0x8130, 0x9935, + 0x0192, 0x8130, 0x9936, + 0x0193, 0x8130, 0x9937, + 0x0194, 0x8130, 0x9938, + 0x0195, 0x8130, 0x9939, + 0x0196, 0x8130, 0x9A30, + 0x0197, 0x8130, 0x9A31, + 0x0198, 0x8130, 0x9A32, + 0x0199, 0x8130, 0x9A33, + 0x019A, 0x8130, 0x9A34, + 0x019B, 0x8130, 0x9A35, + 0x019C, 0x8130, 0x9A36, + 0x019D, 0x8130, 0x9A37, + 0x019E, 0x8130, 0x9A38, + 0x019F, 0x8130, 0x9A39, + 0x01A0, 0x8130, 0x9B30, + 0x01A1, 0x8130, 0x9B31, + 0x01A2, 0x8130, 0x9B32, + 0x01A3, 0x8130, 0x9B33, + 0x01A4, 0x8130, 0x9B34, + 0x01A5, 0x8130, 0x9B35, + 0x01A6, 0x8130, 0x9B36, + 0x01A7, 0x8130, 0x9B37, + 0x01A8, 0x8130, 0x9B38, + 0x01A9, 0x8130, 0x9B39, + 0x01AA, 0x8130, 0x9C30, + 0x01AB, 0x8130, 0x9C31, + 0x01AC, 0x8130, 0x9C32, + 0x01AD, 0x8130, 0x9C33, + 0x01AE, 0x8130, 0x9C34, + 0x01AF, 0x8130, 0x9C35, + 0x01B0, 0x8130, 0x9C36, + 0x01B1, 0x8130, 0x9C37, + 0x01B2, 0x8130, 0x9C38, + 0x01B3, 0x8130, 0x9C39, + 0x01B4, 0x8130, 0x9D30, + 0x01B5, 0x8130, 0x9D31, + 0x01B6, 0x8130, 0x9D32, + 0x01B7, 0x8130, 0x9D33, + 0x01B8, 0x8130, 0x9D34, + 0x01B9, 0x8130, 0x9D35, + 0x01BA, 0x8130, 0x9D36, + 0x01BB, 0x8130, 0x9D37, + 0x01BC, 0x8130, 0x9D38, + 0x01BD, 0x8130, 0x9D39, + 0x01BE, 0x8130, 0x9E30, + 0x01BF, 0x8130, 0x9E31, + 0x01C0, 0x8130, 0x9E32, + 0x01C1, 0x8130, 0x9E33, + 0x01C2, 0x8130, 0x9E34, + 0x01C3, 0x8130, 0x9E35, + 0x01C4, 0x8130, 0x9E36, + 0x01C5, 0x8130, 0x9E37, + 0x01C6, 0x8130, 0x9E38, + 0x01C7, 0x8130, 0x9E39, + 0x01C8, 0x8130, 0x9F30, + 0x01C9, 0x8130, 0x9F31, + 0x01CA, 0x8130, 0x9F32, + 0x01CB, 0x8130, 0x9F33, + 0x01CC, 0x8130, 0x9F34, + 0x01CD, 0x8130, 0x9F35, + 0x01CF, 0x8130, 0x9F36, + 0x01D1, 0x8130, 0x9F37, + 0x01D3, 0x8130, 0x9F38, + 0x01D5, 0x8130, 0x9F39, + 0x01D7, 0x8130, 0xA030, + 0x01D9, 0x8130, 0xA031, + 0x01DB, 0x8130, 0xA032, + 0x01DD, 0x8130, 0xA033, + 0x01DE, 0x8130, 0xA034, + 0x01DF, 0x8130, 0xA035, + 0x01E0, 0x8130, 0xA036, + 0x01E1, 0x8130, 0xA037, + 0x01E2, 0x8130, 0xA038, + 0x01E3, 0x8130, 0xA039, + 0x01E4, 0x8130, 0xA130, + 0x01E5, 0x8130, 0xA131, + 0x01E6, 0x8130, 0xA132, + 0x01E7, 0x8130, 0xA133, + 0x01E8, 0x8130, 0xA134, + 0x01E9, 0x8130, 0xA135, + 0x01EA, 0x8130, 0xA136, + 0x01EB, 0x8130, 0xA137, + 0x01EC, 0x8130, 0xA138, + 0x01ED, 0x8130, 0xA139, + 0x01EE, 0x8130, 0xA230, + 0x01EF, 0x8130, 0xA231, + 0x01F0, 0x8130, 0xA232, + 0x01F1, 0x8130, 0xA233, + 0x01F2, 0x8130, 0xA234, + 0x01F3, 0x8130, 0xA235, + 0x01F4, 0x8130, 0xA236, + 0x01F5, 0x8130, 0xA237, + 0x01F6, 0x8130, 0xA238, + 0x01F7, 0x8130, 0xA239, + 0x01F8, 0x8130, 0xA330, + 0x01FA, 0x8130, 0xA331, + 0x01FB, 0x8130, 0xA332, + 0x01FC, 0x8130, 0xA333, + 0x01FD, 0x8130, 0xA334, + 0x01FE, 0x8130, 0xA335, + 0x01FF, 0x8130, 0xA336, + 0x0200, 0x8130, 0xA337, + 0x0201, 0x8130, 0xA338, + 0x0202, 0x8130, 0xA339, + 0x0203, 0x8130, 0xA430, + 0x0204, 0x8130, 0xA431, + 0x0205, 0x8130, 0xA432, + 0x0206, 0x8130, 0xA433, + 0x0207, 0x8130, 0xA434, + 0x0208, 0x8130, 0xA435, + 0x0209, 0x8130, 0xA436, + 0x020A, 0x8130, 0xA437, + 0x020B, 0x8130, 0xA438, + 0x020C, 0x8130, 0xA439, + 0x020D, 0x8130, 0xA530, + 0x020E, 0x8130, 0xA531, + 0x020F, 0x8130, 0xA532, + 0x0210, 0x8130, 0xA533, + 0x0211, 0x8130, 0xA534, + 0x0212, 0x8130, 0xA535, + 0x0213, 0x8130, 0xA536, + 0x0214, 0x8130, 0xA537, + 0x0215, 0x8130, 0xA538, + 0x0216, 0x8130, 0xA539, + 0x0217, 0x8130, 0xA630, + 0x0218, 0x8130, 0xA631, + 0x0219, 0x8130, 0xA632, + 0x021A, 0x8130, 0xA633, + 0x021B, 0x8130, 0xA634, + 0x021C, 0x8130, 0xA635, + 0x021D, 0x8130, 0xA636, + 0x021E, 0x8130, 0xA637, + 0x021F, 0x8130, 0xA638, + 0x0220, 0x8130, 0xA639, + 0x0221, 0x8130, 0xA730, + 0x0222, 0x8130, 0xA731, + 0x0223, 0x8130, 0xA732, + 0x0224, 0x8130, 0xA733, + 0x0225, 0x8130, 0xA734, + 0x0226, 0x8130, 0xA735, + 0x0227, 0x8130, 0xA736, + 0x0228, 0x8130, 0xA737, + 0x0229, 0x8130, 0xA738, + 0x022A, 0x8130, 0xA739, + 0x022B, 0x8130, 0xA830, + 0x022C, 0x8130, 0xA831, + 0x022D, 0x8130, 0xA832, + 0x022E, 0x8130, 0xA833, + 0x022F, 0x8130, 0xA834, + 0x0230, 0x8130, 0xA835, + 0x0231, 0x8130, 0xA836, + 0x0232, 0x8130, 0xA837, + 0x0233, 0x8130, 0xA838, + 0x0234, 0x8130, 0xA839, + 0x0235, 0x8130, 0xA930, + 0x0236, 0x8130, 0xA931, + 0x0237, 0x8130, 0xA932, + 0x0238, 0x8130, 0xA933, + 0x0239, 0x8130, 0xA934, + 0x023A, 0x8130, 0xA935, + 0x023B, 0x8130, 0xA936, + 0x023C, 0x8130, 0xA937, + 0x023D, 0x8130, 0xA938, + 0x023E, 0x8130, 0xA939, + 0x023F, 0x8130, 0xAA30, + 0x0240, 0x8130, 0xAA31, + 0x0241, 0x8130, 0xAA32, + 0x0242, 0x8130, 0xAA33, + 0x0243, 0x8130, 0xAA34, + 0x0244, 0x8130, 0xAA35, + 0x0245, 0x8130, 0xAA36, + 0x0246, 0x8130, 0xAA37, + 0x0247, 0x8130, 0xAA38, + 0x0248, 0x8130, 0xAA39, + 0x0249, 0x8130, 0xAB30, + 0x024A, 0x8130, 0xAB31, + 0x024B, 0x8130, 0xAB32, + 0x024C, 0x8130, 0xAB33, + 0x024D, 0x8130, 0xAB34, + 0x024E, 0x8130, 0xAB35, + 0x024F, 0x8130, 0xAB36, + 0x0250, 0x8130, 0xAB37, + 0x0252, 0x8130, 0xAB38, + 0x0253, 0x8130, 0xAB39, + 0x0254, 0x8130, 0xAC30, + 0x0255, 0x8130, 0xAC31, + 0x0256, 0x8130, 0xAC32, + 0x0257, 0x8130, 0xAC33, + 0x0258, 0x8130, 0xAC34, + 0x0259, 0x8130, 0xAC35, + 0x025A, 0x8130, 0xAC36, + 0x025B, 0x8130, 0xAC37, + 0x025C, 0x8130, 0xAC38, + 0x025D, 0x8130, 0xAC39, + 0x025E, 0x8130, 0xAD30, + 0x025F, 0x8130, 0xAD31, + 0x0260, 0x8130, 0xAD32, + 0x0262, 0x8130, 0xAD33, + 0x0263, 0x8130, 0xAD34, + 0x0264, 0x8130, 0xAD35, + 0x0265, 0x8130, 0xAD36, + 0x0266, 0x8130, 0xAD37, + 0x0267, 0x8130, 0xAD38, + 0x0268, 0x8130, 0xAD39, + 0x0269, 0x8130, 0xAE30, + 0x026A, 0x8130, 0xAE31, + 0x026B, 0x8130, 0xAE32, + 0x026C, 0x8130, 0xAE33, + 0x026D, 0x8130, 0xAE34, + 0x026E, 0x8130, 0xAE35, + 0x026F, 0x8130, 0xAE36, + 0x0270, 0x8130, 0xAE37, + 0x0271, 0x8130, 0xAE38, + 0x0272, 0x8130, 0xAE39, + 0x0273, 0x8130, 0xAF30, + 0x0274, 0x8130, 0xAF31, + 0x0275, 0x8130, 0xAF32, + 0x0276, 0x8130, 0xAF33, + 0x0277, 0x8130, 0xAF34, + 0x0278, 0x8130, 0xAF35, + 0x0279, 0x8130, 0xAF36, + 0x027A, 0x8130, 0xAF37, + 0x027B, 0x8130, 0xAF38, + 0x027C, 0x8130, 0xAF39, + 0x027D, 0x8130, 0xB030, + 0x027E, 0x8130, 0xB031, + 0x027F, 0x8130, 0xB032, + 0x0280, 0x8130, 0xB033, + 0x0281, 0x8130, 0xB034, + 0x0282, 0x8130, 0xB035, + 0x0283, 0x8130, 0xB036, + 0x0284, 0x8130, 0xB037, + 0x0285, 0x8130, 0xB038, + 0x0286, 0x8130, 0xB039, + 0x0287, 0x8130, 0xB130, + 0x0288, 0x8130, 0xB131, + 0x0289, 0x8130, 0xB132, + 0x028A, 0x8130, 0xB133, + 0x028B, 0x8130, 0xB134, + 0x028C, 0x8130, 0xB135, + 0x028D, 0x8130, 0xB136, + 0x028E, 0x8130, 0xB137, + 0x028F, 0x8130, 0xB138, + 0x0290, 0x8130, 0xB139, + 0x0291, 0x8130, 0xB230, + 0x0292, 0x8130, 0xB231, + 0x0293, 0x8130, 0xB232, + 0x0294, 0x8130, 0xB233, + 0x0295, 0x8130, 0xB234, + 0x0296, 0x8130, 0xB235, + 0x0297, 0x8130, 0xB236, + 0x0298, 0x8130, 0xB237, + 0x0299, 0x8130, 0xB238, + 0x029A, 0x8130, 0xB239, + 0x029B, 0x8130, 0xB330, + 0x029C, 0x8130, 0xB331, + 0x029D, 0x8130, 0xB332, + 0x029E, 0x8130, 0xB333, + 0x029F, 0x8130, 0xB334, + 0x02A0, 0x8130, 0xB335, + 0x02A1, 0x8130, 0xB336, + 0x02A2, 0x8130, 0xB337, + 0x02A3, 0x8130, 0xB338, + 0x02A4, 0x8130, 0xB339, + 0x02A5, 0x8130, 0xB430, + 0x02A6, 0x8130, 0xB431, + 0x02A7, 0x8130, 0xB432, + 0x02A8, 0x8130, 0xB433, + 0x02A9, 0x8130, 0xB434, + 0x02AA, 0x8130, 0xB435, + 0x02AB, 0x8130, 0xB436, + 0x02AC, 0x8130, 0xB437, + 0x02AD, 0x8130, 0xB438, + 0x02AE, 0x8130, 0xB439, + 0x02AF, 0x8130, 0xB530, + 0x02B0, 0x8130, 0xB531, + 0x02B1, 0x8130, 0xB532, + 0x02B2, 0x8130, 0xB533, + 0x02B3, 0x8130, 0xB534, + 0x02B4, 0x8130, 0xB535, + 0x02B5, 0x8130, 0xB536, + 0x02B6, 0x8130, 0xB537, + 0x02B7, 0x8130, 0xB538, + 0x02B8, 0x8130, 0xB539, + 0x02B9, 0x8130, 0xB630, + 0x02BA, 0x8130, 0xB631, + 0x02BB, 0x8130, 0xB632, + 0x02BC, 0x8130, 0xB633, + 0x02BD, 0x8130, 0xB634, + 0x02BE, 0x8130, 0xB635, + 0x02BF, 0x8130, 0xB636, + 0x02C0, 0x8130, 0xB637, + 0x02C1, 0x8130, 0xB638, + 0x02C2, 0x8130, 0xB639, + 0x02C3, 0x8130, 0xB730, + 0x02C4, 0x8130, 0xB731, + 0x02C5, 0x8130, 0xB732, + 0x02C6, 0x8130, 0xB733, + 0x02C8, 0x8130, 0xB734, + 0x02CC, 0x8130, 0xB735, + 0x02CD, 0x8130, 0xB736, + 0x02CE, 0x8130, 0xB737, + 0x02CF, 0x8130, 0xB738, + 0x02D0, 0x8130, 0xB739, + 0x02D1, 0x8130, 0xB830, + 0x02D2, 0x8130, 0xB831, + 0x02D3, 0x8130, 0xB832, + 0x02D4, 0x8130, 0xB833, + 0x02D5, 0x8130, 0xB834, + 0x02D6, 0x8130, 0xB835, + 0x02D7, 0x8130, 0xB836, + 0x02D8, 0x8130, 0xB837, + 0x02DA, 0x8130, 0xB838, + 0x02DB, 0x8130, 0xB839, + 0x02DC, 0x8130, 0xB930, + 0x02DD, 0x8130, 0xB931, + 0x02DE, 0x8130, 0xB932, + 0x02DF, 0x8130, 0xB933, + 0x02E0, 0x8130, 0xB934, + 0x02E1, 0x8130, 0xB935, + 0x02E2, 0x8130, 0xB936, + 0x02E3, 0x8130, 0xB937, + 0x02E4, 0x8130, 0xB938, + 0x02E5, 0x8130, 0xB939, + 0x02E6, 0x8130, 0xBA30, + 0x02E7, 0x8130, 0xBA31, + 0x02E8, 0x8130, 0xBA32, + 0x02E9, 0x8130, 0xBA33, + 0x02EA, 0x8130, 0xBA34, + 0x02EB, 0x8130, 0xBA35, + 0x02EC, 0x8130, 0xBA36, + 0x02ED, 0x8130, 0xBA37, + 0x02EE, 0x8130, 0xBA38, + 0x02EF, 0x8130, 0xBA39, + 0x02F0, 0x8130, 0xBB30, + 0x02F1, 0x8130, 0xBB31, + 0x02F2, 0x8130, 0xBB32, + 0x02F3, 0x8130, 0xBB33, + 0x02F4, 0x8130, 0xBB34, + 0x02F5, 0x8130, 0xBB35, + 0x02F6, 0x8130, 0xBB36, + 0x02F7, 0x8130, 0xBB37, + 0x02F8, 0x8130, 0xBB38, + 0x02F9, 0x8130, 0xBB39, + 0x02FA, 0x8130, 0xBC30, + 0x02FB, 0x8130, 0xBC31, + 0x02FC, 0x8130, 0xBC32, + 0x02FD, 0x8130, 0xBC33, + 0x02FE, 0x8130, 0xBC34, + 0x02FF, 0x8130, 0xBC35, + 0x0300, 0x8130, 0xBC36, + 0x0301, 0x8130, 0xBC37, + 0x0302, 0x8130, 0xBC38, + 0x0303, 0x8130, 0xBC39, + 0x0304, 0x8130, 0xBD30, + 0x0305, 0x8130, 0xBD31, + 0x0306, 0x8130, 0xBD32, + 0x0307, 0x8130, 0xBD33, + 0x0308, 0x8130, 0xBD34, + 0x0309, 0x8130, 0xBD35, + 0x030A, 0x8130, 0xBD36, + 0x030B, 0x8130, 0xBD37, + 0x030C, 0x8130, 0xBD38, + 0x030D, 0x8130, 0xBD39, + 0x030E, 0x8130, 0xBE30, + 0x030F, 0x8130, 0xBE31, + 0x0310, 0x8130, 0xBE32, + 0x0311, 0x8130, 0xBE33, + 0x0312, 0x8130, 0xBE34, + 0x0313, 0x8130, 0xBE35, + 0x0314, 0x8130, 0xBE36, + 0x0315, 0x8130, 0xBE37, + 0x0316, 0x8130, 0xBE38, + 0x0317, 0x8130, 0xBE39, + 0x0318, 0x8130, 0xBF30, + 0x0319, 0x8130, 0xBF31, + 0x031A, 0x8130, 0xBF32, + 0x031B, 0x8130, 0xBF33, + 0x031C, 0x8130, 0xBF34, + 0x031D, 0x8130, 0xBF35, + 0x031E, 0x8130, 0xBF36, + 0x031F, 0x8130, 0xBF37, + 0x0320, 0x8130, 0xBF38, + 0x0321, 0x8130, 0xBF39, + 0x0322, 0x8130, 0xC030, + 0x0323, 0x8130, 0xC031, + 0x0324, 0x8130, 0xC032, + 0x0325, 0x8130, 0xC033, + 0x0326, 0x8130, 0xC034, + 0x0327, 0x8130, 0xC035, + 0x0328, 0x8130, 0xC036, + 0x0329, 0x8130, 0xC037, + 0x032A, 0x8130, 0xC038, + 0x032B, 0x8130, 0xC039, + 0x032C, 0x8130, 0xC130, + 0x032D, 0x8130, 0xC131, + 0x032E, 0x8130, 0xC132, + 0x032F, 0x8130, 0xC133, + 0x0330, 0x8130, 0xC134, + 0x0331, 0x8130, 0xC135, + 0x0332, 0x8130, 0xC136, + 0x0333, 0x8130, 0xC137, + 0x0334, 0x8130, 0xC138, + 0x0335, 0x8130, 0xC139, + 0x0336, 0x8130, 0xC230, + 0x0337, 0x8130, 0xC231, + 0x0338, 0x8130, 0xC232, + 0x0339, 0x8130, 0xC233, + 0x033A, 0x8130, 0xC234, + 0x033B, 0x8130, 0xC235, + 0x033C, 0x8130, 0xC236, + 0x033D, 0x8130, 0xC237, + 0x033E, 0x8130, 0xC238, + 0x033F, 0x8130, 0xC239, + 0x0340, 0x8130, 0xC330, + 0x0341, 0x8130, 0xC331, + 0x0342, 0x8130, 0xC332, + 0x0343, 0x8130, 0xC333, + 0x0344, 0x8130, 0xC334, + 0x0345, 0x8130, 0xC335, + 0x0346, 0x8130, 0xC336, + 0x0347, 0x8130, 0xC337, + 0x0348, 0x8130, 0xC338, + 0x0349, 0x8130, 0xC339, + 0x034A, 0x8130, 0xC430, + 0x034B, 0x8130, 0xC431, + 0x034C, 0x8130, 0xC432, + 0x034D, 0x8130, 0xC433, + 0x034E, 0x8130, 0xC434, + 0x034F, 0x8130, 0xC435, + 0x0350, 0x8130, 0xC436, + 0x0351, 0x8130, 0xC437, + 0x0352, 0x8130, 0xC438, + 0x0353, 0x8130, 0xC439, + 0x0354, 0x8130, 0xC530, + 0x0355, 0x8130, 0xC531, + 0x0356, 0x8130, 0xC532, + 0x0357, 0x8130, 0xC533, + 0x0358, 0x8130, 0xC534, + 0x0359, 0x8130, 0xC535, + 0x035A, 0x8130, 0xC536, + 0x035B, 0x8130, 0xC537, + 0x035C, 0x8130, 0xC538, + 0x035D, 0x8130, 0xC539, + 0x035E, 0x8130, 0xC630, + 0x035F, 0x8130, 0xC631, + 0x0360, 0x8130, 0xC632, + 0x0361, 0x8130, 0xC633, + 0x0362, 0x8130, 0xC634, + 0x0363, 0x8130, 0xC635, + 0x0364, 0x8130, 0xC636, + 0x0365, 0x8130, 0xC637, + 0x0366, 0x8130, 0xC638, + 0x0367, 0x8130, 0xC639, + 0x0368, 0x8130, 0xC730, + 0x0369, 0x8130, 0xC731, + 0x036A, 0x8130, 0xC732, + 0x036B, 0x8130, 0xC733, + 0x036C, 0x8130, 0xC734, + 0x036D, 0x8130, 0xC735, + 0x036E, 0x8130, 0xC736, + 0x036F, 0x8130, 0xC737, + 0x0370, 0x8130, 0xC738, + 0x0371, 0x8130, 0xC739, + 0x0372, 0x8130, 0xC830, + 0x0373, 0x8130, 0xC831, + 0x0374, 0x8130, 0xC832, + 0x0375, 0x8130, 0xC833, + 0x0376, 0x8130, 0xC834, + 0x0377, 0x8130, 0xC835, + 0x0378, 0x8130, 0xC836, + 0x0379, 0x8130, 0xC837, + 0x037A, 0x8130, 0xC838, + 0x037B, 0x8130, 0xC839, + 0x037C, 0x8130, 0xC930, + 0x037D, 0x8130, 0xC931, + 0x037E, 0x8130, 0xC932, + 0x037F, 0x8130, 0xC933, + 0x0380, 0x8130, 0xC934, + 0x0381, 0x8130, 0xC935, + 0x0382, 0x8130, 0xC936, + 0x0383, 0x8130, 0xC937, + 0x0384, 0x8130, 0xC938, + 0x0385, 0x8130, 0xC939, + 0x0386, 0x8130, 0xCA30, + 0x0387, 0x8130, 0xCA31, + 0x0388, 0x8130, 0xCA32, + 0x0389, 0x8130, 0xCA33, + 0x038A, 0x8130, 0xCA34, + 0x038B, 0x8130, 0xCA35, + 0x038C, 0x8130, 0xCA36, + 0x038D, 0x8130, 0xCA37, + 0x038E, 0x8130, 0xCA38, + 0x038F, 0x8130, 0xCA39, + 0x0390, 0x8130, 0xCB30, + 0x03A2, 0x8130, 0xCB31, + 0x03AA, 0x8130, 0xCB32, + 0x03AB, 0x8130, 0xCB33, + 0x03AC, 0x8130, 0xCB34, + 0x03AD, 0x8130, 0xCB35, + 0x03AE, 0x8130, 0xCB36, + 0x03AF, 0x8130, 0xCB37, + 0x03B0, 0x8130, 0xCB38, + 0x03C2, 0x8130, 0xCB39, + 0x03CA, 0x8130, 0xCC30, + 0x03CB, 0x8130, 0xCC31, + 0x03CC, 0x8130, 0xCC32, + 0x03CD, 0x8130, 0xCC33, + 0x03CE, 0x8130, 0xCC34, + 0x03CF, 0x8130, 0xCC35, + 0x03D0, 0x8130, 0xCC36, + 0x03D1, 0x8130, 0xCC37, + 0x03D2, 0x8130, 0xCC38, + 0x03D3, 0x8130, 0xCC39, + 0x03D4, 0x8130, 0xCD30, + 0x03D5, 0x8130, 0xCD31, + 0x03D6, 0x8130, 0xCD32, + 0x03D7, 0x8130, 0xCD33, + 0x03D8, 0x8130, 0xCD34, + 0x03D9, 0x8130, 0xCD35, + 0x03DA, 0x8130, 0xCD36, + 0x03DB, 0x8130, 0xCD37, + 0x03DC, 0x8130, 0xCD38, + 0x03DD, 0x8130, 0xCD39, + 0x03DE, 0x8130, 0xCE30, + 0x03DF, 0x8130, 0xCE31, + 0x03E0, 0x8130, 0xCE32, + 0x03E1, 0x8130, 0xCE33, + 0x03E2, 0x8130, 0xCE34, + 0x03E3, 0x8130, 0xCE35, + 0x03E4, 0x8130, 0xCE36, + 0x03E5, 0x8130, 0xCE37, + 0x03E6, 0x8130, 0xCE38, + 0x03E7, 0x8130, 0xCE39, + 0x03E8, 0x8130, 0xCF30, + 0x03E9, 0x8130, 0xCF31, + 0x03EA, 0x8130, 0xCF32, + 0x03EB, 0x8130, 0xCF33, + 0x03EC, 0x8130, 0xCF34, + 0x03ED, 0x8130, 0xCF35, + 0x03EE, 0x8130, 0xCF36, + 0x03EF, 0x8130, 0xCF37, + 0x03F0, 0x8130, 0xCF38, + 0x03F1, 0x8130, 0xCF39, + 0x03F2, 0x8130, 0xD030, + 0x03F3, 0x8130, 0xD031, + 0x03F4, 0x8130, 0xD032, + 0x03F5, 0x8130, 0xD033, + 0x03F6, 0x8130, 0xD034, + 0x03F7, 0x8130, 0xD035, + 0x03F8, 0x8130, 0xD036, + 0x03F9, 0x8130, 0xD037, + 0x03FA, 0x8130, 0xD038, + 0x03FB, 0x8130, 0xD039, + 0x03FC, 0x8130, 0xD130, + 0x03FD, 0x8130, 0xD131, + 0x03FE, 0x8130, 0xD132, + 0x03FF, 0x8130, 0xD133, + 0x0400, 0x8130, 0xD134, + 0x0402, 0x8130, 0xD135, + 0x0403, 0x8130, 0xD136, + 0x0404, 0x8130, 0xD137, + 0x0405, 0x8130, 0xD138, + 0x0406, 0x8130, 0xD139, + 0x0407, 0x8130, 0xD230, + 0x0408, 0x8130, 0xD231, + 0x0409, 0x8130, 0xD232, + 0x040A, 0x8130, 0xD233, + 0x040B, 0x8130, 0xD234, + 0x040C, 0x8130, 0xD235, + 0x040D, 0x8130, 0xD236, + 0x040E, 0x8130, 0xD237, + 0x040F, 0x8130, 0xD238, + 0x0450, 0x8130, 0xD239, + 0x2011, 0x8136, 0xA532, + 0x2012, 0x8136, 0xA533, + 0x2017, 0x8136, 0xA534, + 0x201A, 0x8136, 0xA535, + 0x201B, 0x8136, 0xA536, + 0x201E, 0x8136, 0xA537, + 0x201F, 0x8136, 0xA538, + 0x2020, 0x8136, 0xA539, + 0x2021, 0x8136, 0xA630, + 0x2022, 0x8136, 0xA631, + 0x2023, 0x8136, 0xA632, + 0x2024, 0x8136, 0xA633, + 0x2027, 0x8136, 0xA634, + 0x2028, 0x8136, 0xA635, + 0x2029, 0x8136, 0xA636, + 0x202A, 0x8136, 0xA637, + 0x202B, 0x8136, 0xA638, + 0x202C, 0x8136, 0xA639, + 0x202D, 0x8136, 0xA730, + 0x202E, 0x8136, 0xA731, + 0x202F, 0x8136, 0xA732, + 0x2031, 0x8136, 0xA733, + 0x2034, 0x8136, 0xA734, + 0x2036, 0x8136, 0xA735, + 0x2037, 0x8136, 0xA736, + 0x2038, 0x8136, 0xA737, + 0x2039, 0x8136, 0xA738, + 0x203A, 0x8136, 0xA739, + 0x203C, 0x8136, 0xA830, + 0x203D, 0x8136, 0xA831, + 0x203E, 0x8136, 0xA832, + 0x203F, 0x8136, 0xA833, + 0x2040, 0x8136, 0xA834, + 0x2041, 0x8136, 0xA835, + 0x2042, 0x8136, 0xA836, + 0x2043, 0x8136, 0xA837, + 0x2044, 0x8136, 0xA838, + 0x2045, 0x8136, 0xA839, + 0x2046, 0x8136, 0xA930, + 0x2047, 0x8136, 0xA931, + 0x2048, 0x8136, 0xA932, + 0x2049, 0x8136, 0xA933, + 0x204A, 0x8136, 0xA934, + 0x204B, 0x8136, 0xA935, + 0x204C, 0x8136, 0xA936, + 0x204D, 0x8136, 0xA937, + 0x204E, 0x8136, 0xA938, + 0x204F, 0x8136, 0xA939, + 0x2050, 0x8136, 0xAA30, + 0x2051, 0x8136, 0xAA31, + 0x2052, 0x8136, 0xAA32, + 0x2053, 0x8136, 0xAA33, + 0x2054, 0x8136, 0xAA34, + 0x2055, 0x8136, 0xAA35, + 0x2056, 0x8136, 0xAA36, + 0x2057, 0x8136, 0xAA37, + 0x2058, 0x8136, 0xAA38, + 0x2059, 0x8136, 0xAA39, + 0x205A, 0x8136, 0xAB30, + 0x205B, 0x8136, 0xAB31, + 0x205C, 0x8136, 0xAB32, + 0x205D, 0x8136, 0xAB33, + 0x205E, 0x8136, 0xAB34, + 0x205F, 0x8136, 0xAB35, + 0x2060, 0x8136, 0xAB36, + 0x2061, 0x8136, 0xAB37, + 0x2062, 0x8136, 0xAB38, + 0x2063, 0x8136, 0xAB39, + 0x2064, 0x8136, 0xAC30, + 0x2065, 0x8136, 0xAC31, + 0x2066, 0x8136, 0xAC32, + 0x2067, 0x8136, 0xAC33, + 0x2068, 0x8136, 0xAC34, + 0x2069, 0x8136, 0xAC35, + 0x206A, 0x8136, 0xAC36, + 0x206B, 0x8136, 0xAC37, + 0x206C, 0x8136, 0xAC38, + 0x206D, 0x8136, 0xAC39, + 0x206E, 0x8136, 0xAD30, + 0x206F, 0x8136, 0xAD31, + 0x2070, 0x8136, 0xAD32, + 0x2071, 0x8136, 0xAD33, + 0x2072, 0x8136, 0xAD34, + 0x2073, 0x8136, 0xAD35, + 0x2074, 0x8136, 0xAD36, + 0x2075, 0x8136, 0xAD37, + 0x2076, 0x8136, 0xAD38, + 0x2077, 0x8136, 0xAD39, + 0x2078, 0x8136, 0xAE30, + 0x2079, 0x8136, 0xAE31, + 0x207A, 0x8136, 0xAE32, + 0x207B, 0x8136, 0xAE33, + 0x207C, 0x8136, 0xAE34, + 0x207D, 0x8136, 0xAE35, + 0x207E, 0x8136, 0xAE36, + 0x207F, 0x8136, 0xAE37, + 0x2080, 0x8136, 0xAE38, + 0x2081, 0x8136, 0xAE39, + 0x2082, 0x8136, 0xAF30, + 0x2083, 0x8136, 0xAF31, + 0x2084, 0x8136, 0xAF32, + 0x2085, 0x8136, 0xAF33, + 0x2086, 0x8136, 0xAF34, + 0x2087, 0x8136, 0xAF35, + 0x2088, 0x8136, 0xAF36, + 0x2089, 0x8136, 0xAF37, + 0x208A, 0x8136, 0xAF38, + 0x208B, 0x8136, 0xAF39, + 0x208C, 0x8136, 0xB030, + 0x208D, 0x8136, 0xB031, + 0x208E, 0x8136, 0xB032, + 0x208F, 0x8136, 0xB033, + 0x2090, 0x8136, 0xB034, + 0x2091, 0x8136, 0xB035, + 0x2092, 0x8136, 0xB036, + 0x2093, 0x8136, 0xB037, + 0x2094, 0x8136, 0xB038, + 0x2095, 0x8136, 0xB039, + 0x2096, 0x8136, 0xB130, + 0x2097, 0x8136, 0xB131, + 0x2098, 0x8136, 0xB132, + 0x2099, 0x8136, 0xB133, + 0x209A, 0x8136, 0xB134, + 0x209B, 0x8136, 0xB135, + 0x209C, 0x8136, 0xB136, + 0x209D, 0x8136, 0xB137, + 0x209E, 0x8136, 0xB138, + 0x209F, 0x8136, 0xB139, + 0x20A0, 0x8136, 0xB230, + 0x20A1, 0x8136, 0xB231, + 0x20A2, 0x8136, 0xB232, + 0x20A3, 0x8136, 0xB233, + 0x20A4, 0x8136, 0xB234, + 0x20A5, 0x8136, 0xB235, + 0x20A6, 0x8136, 0xB236, + 0x20A7, 0x8136, 0xB237, + 0x20A8, 0x8136, 0xB238, + 0x20A9, 0x8136, 0xB239, + 0x20AA, 0x8136, 0xB330, + 0x20AB, 0x8136, 0xB331, + 0x20AD, 0x8136, 0xB332, + 0x20AE, 0x8136, 0xB333, + 0x20AF, 0x8136, 0xB334, + 0x20B0, 0x8136, 0xB335, + 0x20B1, 0x8136, 0xB336, + 0x20B2, 0x8136, 0xB337, + 0x20B3, 0x8136, 0xB338, + 0x20B4, 0x8136, 0xB339, + 0x20B5, 0x8136, 0xB430, + 0x20B6, 0x8136, 0xB431, + 0x20B7, 0x8136, 0xB432, + 0x20B8, 0x8136, 0xB433, + 0x20B9, 0x8136, 0xB434, + 0x20BA, 0x8136, 0xB435, + 0x20BB, 0x8136, 0xB436, + 0x20BC, 0x8136, 0xB437, + 0x20BD, 0x8136, 0xB438, + 0x20BE, 0x8136, 0xB439, + 0x20BF, 0x8136, 0xB530, + 0x20C0, 0x8136, 0xB531, + 0x20C1, 0x8136, 0xB532, + 0x20C2, 0x8136, 0xB533, + 0x20C3, 0x8136, 0xB534, + 0x20C4, 0x8136, 0xB535, + 0x20C5, 0x8136, 0xB536, + 0x20C6, 0x8136, 0xB537, + 0x20C7, 0x8136, 0xB538, + 0x20C8, 0x8136, 0xB539, + 0x20C9, 0x8136, 0xB630, + 0x20CA, 0x8136, 0xB631, + 0x20CB, 0x8136, 0xB632, + 0x20CC, 0x8136, 0xB633, + 0x20CD, 0x8136, 0xB634, + 0x20CE, 0x8136, 0xB635, + 0x20CF, 0x8136, 0xB636, + 0x20D0, 0x8136, 0xB637, + 0x20D1, 0x8136, 0xB638, + 0x20D2, 0x8136, 0xB639, + 0x20D3, 0x8136, 0xB730, + 0x20D4, 0x8136, 0xB731, + 0x20D5, 0x8136, 0xB732, + 0x20D6, 0x8136, 0xB733, + 0x20D7, 0x8136, 0xB734, + 0x20D8, 0x8136, 0xB735, + 0x20D9, 0x8136, 0xB736, + 0x20DA, 0x8136, 0xB737, + 0x20DB, 0x8136, 0xB738, + 0x20DC, 0x8136, 0xB739, + 0x20DD, 0x8136, 0xB830, + 0x20DE, 0x8136, 0xB831, + 0x20DF, 0x8136, 0xB832, + 0x20E0, 0x8136, 0xB833, + 0x20E1, 0x8136, 0xB834, + 0x20E2, 0x8136, 0xB835, + 0x20E3, 0x8136, 0xB836, + 0x20E4, 0x8136, 0xB837, + 0x20E5, 0x8136, 0xB838, + 0x20E6, 0x8136, 0xB839, + 0x20E7, 0x8136, 0xB930, + 0x20E8, 0x8136, 0xB931, + 0x20E9, 0x8136, 0xB932, + 0x20EA, 0x8136, 0xB933, + 0x20EB, 0x8136, 0xB934, + 0x20EC, 0x8136, 0xB935, + 0x20ED, 0x8136, 0xB936, + 0x20EE, 0x8136, 0xB937, + 0x20EF, 0x8136, 0xB938, + 0x20F0, 0x8136, 0xB939, + 0x20F1, 0x8136, 0xBA30, + 0x20F2, 0x8136, 0xBA31, + 0x20F3, 0x8136, 0xBA32, + 0x20F4, 0x8136, 0xBA33, + 0x20F5, 0x8136, 0xBA34, + 0x20F6, 0x8136, 0xBA35, + 0x20F7, 0x8136, 0xBA36, + 0x20F8, 0x8136, 0xBA37, + 0x20F9, 0x8136, 0xBA38, + 0x20FA, 0x8136, 0xBA39, + 0x20FB, 0x8136, 0xBB30, + 0x20FC, 0x8136, 0xBB31, + 0x20FD, 0x8136, 0xBB32, + 0x20FE, 0x8136, 0xBB33, + 0x20FF, 0x8136, 0xBB34, + 0x2100, 0x8136, 0xBB35, + 0x2101, 0x8136, 0xBB36, + 0x2102, 0x8136, 0xBB37, + 0x2104, 0x8136, 0xBB38, + 0x2106, 0x8136, 0xBB39, + 0x2107, 0x8136, 0xBC30, + 0x2108, 0x8136, 0xBC31, + 0x210A, 0x8136, 0xBC32, + 0x210B, 0x8136, 0xBC33, + 0x210C, 0x8136, 0xBC34, + 0x210D, 0x8136, 0xBC35, + 0x210E, 0x8136, 0xBC36, + 0x210F, 0x8136, 0xBC37, + 0x2110, 0x8136, 0xBC38, + 0x2111, 0x8136, 0xBC39, + 0x2112, 0x8136, 0xBD30, + 0x2113, 0x8136, 0xBD31, + 0x2114, 0x8136, 0xBD32, + 0x2115, 0x8136, 0xBD33, + 0x2117, 0x8136, 0xBD34, + 0x2118, 0x8136, 0xBD35, + 0x2119, 0x8136, 0xBD36, + 0x211A, 0x8136, 0xBD37, + 0x211B, 0x8136, 0xBD38, + 0x211C, 0x8136, 0xBD39, + 0x211D, 0x8136, 0xBE30, + 0x211E, 0x8136, 0xBE31, + 0x211F, 0x8136, 0xBE32, + 0x2120, 0x8136, 0xBE33, + 0x2122, 0x8136, 0xBE34, + 0x2123, 0x8136, 0xBE35, + 0x2124, 0x8136, 0xBE36, + 0x2125, 0x8136, 0xBE37, + 0x2126, 0x8136, 0xBE38, + 0x2127, 0x8136, 0xBE39, + 0x2128, 0x8136, 0xBF30, + 0x2129, 0x8136, 0xBF31, + 0x212A, 0x8136, 0xBF32, + 0x212B, 0x8136, 0xBF33, + 0x212C, 0x8136, 0xBF34, + 0x212D, 0x8136, 0xBF35, + 0x212E, 0x8136, 0xBF36, + 0x212F, 0x8136, 0xBF37, + 0x2130, 0x8136, 0xBF38, + 0x2131, 0x8136, 0xBF39, + 0x2132, 0x8136, 0xC030, + 0x2133, 0x8136, 0xC031, + 0x2134, 0x8136, 0xC032, + 0x2135, 0x8136, 0xC033, + 0x2136, 0x8136, 0xC034, + 0x2137, 0x8136, 0xC035, + 0x2138, 0x8136, 0xC036, + 0x2139, 0x8136, 0xC037, + 0x213A, 0x8136, 0xC038, + 0x213B, 0x8136, 0xC039, + 0x213C, 0x8136, 0xC130, + 0x213D, 0x8136, 0xC131, + 0x213E, 0x8136, 0xC132, + 0x213F, 0x8136, 0xC133, + 0x2140, 0x8136, 0xC134, + 0x2141, 0x8136, 0xC135, + 0x2142, 0x8136, 0xC136, + 0x2143, 0x8136, 0xC137, + 0x2144, 0x8136, 0xC138, + 0x2145, 0x8136, 0xC139, + 0x2146, 0x8136, 0xC230, + 0x2147, 0x8136, 0xC231, + 0x2148, 0x8136, 0xC232, + 0x2149, 0x8136, 0xC233, + 0x214A, 0x8136, 0xC234, + 0x214B, 0x8136, 0xC235, + 0x214C, 0x8136, 0xC236, + 0x214D, 0x8136, 0xC237, + 0x214E, 0x8136, 0xC238, + 0x214F, 0x8136, 0xC239, + 0x2150, 0x8136, 0xC330, + 0x2151, 0x8136, 0xC331, + 0x2152, 0x8136, 0xC332, + 0x2153, 0x8136, 0xC333, + 0x2154, 0x8136, 0xC334, + 0x2155, 0x8136, 0xC335, + 0x2156, 0x8136, 0xC336, + 0x2157, 0x8136, 0xC337, + 0x2158, 0x8136, 0xC338, + 0x2159, 0x8136, 0xC339, + 0x215A, 0x8136, 0xC430, + 0x215B, 0x8136, 0xC431, + 0x215C, 0x8136, 0xC432, + 0x215D, 0x8136, 0xC433, + 0x215E, 0x8136, 0xC434, + 0x215F, 0x8136, 0xC435, + 0x216C, 0x8136, 0xC436, + 0x216D, 0x8136, 0xC437, + 0x216E, 0x8136, 0xC438, + 0x216F, 0x8136, 0xC439, + 0x217A, 0x8136, 0xC530, + 0x217B, 0x8136, 0xC531, + 0x217C, 0x8136, 0xC532, + 0x217D, 0x8136, 0xC533, + 0x217E, 0x8136, 0xC534, + 0x217F, 0x8136, 0xC535, + 0x2180, 0x8136, 0xC536, + 0x2181, 0x8136, 0xC537, + 0x2182, 0x8136, 0xC538, + 0x2183, 0x8136, 0xC539, + 0x2184, 0x8136, 0xC630, + 0x2185, 0x8136, 0xC631, + 0x2186, 0x8136, 0xC632, + 0x2187, 0x8136, 0xC633, + 0x2188, 0x8136, 0xC634, + 0x2189, 0x8136, 0xC635, + 0x218A, 0x8136, 0xC636, + 0x218B, 0x8136, 0xC637, + 0x218C, 0x8136, 0xC638, + 0x218D, 0x8136, 0xC639, + 0x218E, 0x8136, 0xC730, + 0x218F, 0x8136, 0xC731, + 0x2194, 0x8136, 0xC732, + 0x2195, 0x8136, 0xC733, + 0x219A, 0x8136, 0xC734, + 0x219B, 0x8136, 0xC735, + 0x219C, 0x8136, 0xC736, + 0x219D, 0x8136, 0xC737, + 0x219E, 0x8136, 0xC738, + 0x219F, 0x8136, 0xC739, + 0x21A0, 0x8136, 0xC830, + 0x21A1, 0x8136, 0xC831, + 0x21A2, 0x8136, 0xC832, + 0x21A3, 0x8136, 0xC833, + 0x21A4, 0x8136, 0xC834, + 0x21A5, 0x8136, 0xC835, + 0x21A6, 0x8136, 0xC836, + 0x21A7, 0x8136, 0xC837, + 0x21A8, 0x8136, 0xC838, + 0x21A9, 0x8136, 0xC839, + 0x21AA, 0x8136, 0xC930, + 0x21AB, 0x8136, 0xC931, + 0x21AC, 0x8136, 0xC932, + 0x21AD, 0x8136, 0xC933, + 0x21AE, 0x8136, 0xC934, + 0x21AF, 0x8136, 0xC935, + 0x21B0, 0x8136, 0xC936, + 0x21B1, 0x8136, 0xC937, + 0x21B2, 0x8136, 0xC938, + 0x21B3, 0x8136, 0xC939, + 0x21B4, 0x8136, 0xCA30, + 0x21B5, 0x8136, 0xCA31, + 0x21B6, 0x8136, 0xCA32, + 0x21B7, 0x8136, 0xCA33, + 0x21B8, 0x8136, 0xCA34, + 0x21B9, 0x8136, 0xCA35, + 0x21BA, 0x8136, 0xCA36, + 0x21BB, 0x8136, 0xCA37, + 0x21BC, 0x8136, 0xCA38, + 0x21BD, 0x8136, 0xCA39, + 0x21BE, 0x8136, 0xCB30, + 0x21BF, 0x8136, 0xCB31, + 0x21C0, 0x8136, 0xCB32, + 0x21C1, 0x8136, 0xCB33, + 0x21C2, 0x8136, 0xCB34, + 0x21C3, 0x8136, 0xCB35, + 0x21C4, 0x8136, 0xCB36, + 0x21C5, 0x8136, 0xCB37, + 0x21C6, 0x8136, 0xCB38, + 0x21C7, 0x8136, 0xCB39, + 0x21C8, 0x8136, 0xCC30, + 0x21C9, 0x8136, 0xCC31, + 0x21CA, 0x8136, 0xCC32, + 0x21CB, 0x8136, 0xCC33, + 0x21CC, 0x8136, 0xCC34, + 0x21CD, 0x8136, 0xCC35, + 0x21CE, 0x8136, 0xCC36, + 0x21CF, 0x8136, 0xCC37, + 0x21D0, 0x8136, 0xCC38, + 0x21D1, 0x8136, 0xCC39, + 0x21D2, 0x8136, 0xCD30, + 0x21D3, 0x8136, 0xCD31, + 0x21D4, 0x8136, 0xCD32, + 0x21D5, 0x8136, 0xCD33, + 0x21D6, 0x8136, 0xCD34, + 0x21D7, 0x8136, 0xCD35, + 0x21D8, 0x8136, 0xCD36, + 0x21D9, 0x8136, 0xCD37, + 0x21DA, 0x8136, 0xCD38, + 0x21DB, 0x8136, 0xCD39, + 0x21DC, 0x8136, 0xCE30, + 0x21DD, 0x8136, 0xCE31, + 0x21DE, 0x8136, 0xCE32, + 0x21DF, 0x8136, 0xCE33, + 0x21E0, 0x8136, 0xCE34, + 0x21E1, 0x8136, 0xCE35, + 0x21E2, 0x8136, 0xCE36, + 0x21E3, 0x8136, 0xCE37, + 0x21E4, 0x8136, 0xCE38, + 0x21E5, 0x8136, 0xCE39, + 0x21E6, 0x8136, 0xCF30, + 0x21E7, 0x8136, 0xCF31, + 0x21E8, 0x8136, 0xCF32, + 0x21E9, 0x8136, 0xCF33, + 0x21EA, 0x8136, 0xCF34, + 0x21EB, 0x8136, 0xCF35, + 0x21EC, 0x8136, 0xCF36, + 0x21ED, 0x8136, 0xCF37, + 0x21EE, 0x8136, 0xCF38, + 0x21EF, 0x8136, 0xCF39, + 0x21F0, 0x8136, 0xD030, + 0x21F1, 0x8136, 0xD031, + 0x21F2, 0x8136, 0xD032, + 0x21F3, 0x8136, 0xD033, + 0x21F4, 0x8136, 0xD034, + 0x21F5, 0x8136, 0xD035, + 0x21F6, 0x8136, 0xD036, + 0x21F7, 0x8136, 0xD037, + 0x21F8, 0x8136, 0xD038, + 0x21F9, 0x8136, 0xD039, + 0x21FA, 0x8136, 0xD130, + 0x21FB, 0x8136, 0xD131, + 0x21FC, 0x8136, 0xD132, + 0x21FD, 0x8136, 0xD133, + 0x21FE, 0x8136, 0xD134, + 0x21FF, 0x8136, 0xD135, + 0x2200, 0x8136, 0xD136, + 0x2201, 0x8136, 0xD137, + 0x2202, 0x8136, 0xD138, + 0x2203, 0x8136, 0xD139, + 0x2204, 0x8136, 0xD230, + 0x2205, 0x8136, 0xD231, + 0x2206, 0x8136, 0xD232, + 0x2207, 0x8136, 0xD233, + 0x2209, 0x8136, 0xD234, + 0x220A, 0x8136, 0xD235, + 0x220B, 0x8136, 0xD236, + 0x220C, 0x8136, 0xD237, + 0x220D, 0x8136, 0xD238, + 0x220E, 0x8136, 0xD239, + 0x2210, 0x8136, 0xD330, + 0x2212, 0x8136, 0xD331, + 0x2213, 0x8136, 0xD332, + 0x2214, 0x8136, 0xD333, + 0x2216, 0x8136, 0xD334, + 0x2217, 0x8136, 0xD335, + 0x2218, 0x8136, 0xD336, + 0x2219, 0x8136, 0xD337, + 0x221B, 0x8136, 0xD338, + 0x221C, 0x8136, 0xD339, + 0x2221, 0x8136, 0xD430, + 0x2222, 0x8136, 0xD431, + 0x2224, 0x8136, 0xD432, + 0x2226, 0x8136, 0xD433, + 0x222C, 0x8136, 0xD434, + 0x222D, 0x8136, 0xD435, + 0x222F, 0x8136, 0xD436, + 0x2230, 0x8136, 0xD437, + 0x2231, 0x8136, 0xD438, + 0x2232, 0x8136, 0xD439, + 0x2233, 0x8136, 0xD530, + 0x2238, 0x8136, 0xD531, + 0x2239, 0x8136, 0xD532, + 0x223A, 0x8136, 0xD533, + 0x223B, 0x8136, 0xD534, + 0x223C, 0x8136, 0xD535, + 0x223E, 0x8136, 0xD536, + 0x223F, 0x8136, 0xD537, + 0x2240, 0x8136, 0xD538, + 0x2241, 0x8136, 0xD539, + 0x2242, 0x8136, 0xD630, + 0x2243, 0x8136, 0xD631, + 0x2244, 0x8136, 0xD632, + 0x2245, 0x8136, 0xD633, + 0x2246, 0x8136, 0xD634, + 0x2247, 0x8136, 0xD635, + 0x2249, 0x8136, 0xD636, + 0x224A, 0x8136, 0xD637, + 0x224B, 0x8136, 0xD638, + 0x224D, 0x8136, 0xD639, + 0x224E, 0x8136, 0xD730, + 0x224F, 0x8136, 0xD731, + 0x2250, 0x8136, 0xD732, + 0x2251, 0x8136, 0xD733, + 0x2253, 0x8136, 0xD734, + 0x2254, 0x8136, 0xD735, + 0x2255, 0x8136, 0xD736, + 0x2256, 0x8136, 0xD737, + 0x2257, 0x8136, 0xD738, + 0x2258, 0x8136, 0xD739, + 0x2259, 0x8136, 0xD830, + 0x225A, 0x8136, 0xD831, + 0x225B, 0x8136, 0xD832, + 0x225C, 0x8136, 0xD833, + 0x225D, 0x8136, 0xD834, + 0x225E, 0x8136, 0xD835, + 0x225F, 0x8136, 0xD836, + 0x2262, 0x8136, 0xD837, + 0x2263, 0x8136, 0xD838, + 0x2268, 0x8136, 0xD839, + 0x2269, 0x8136, 0xD930, + 0x226A, 0x8136, 0xD931, + 0x226B, 0x8136, 0xD932, + 0x226C, 0x8136, 0xD933, + 0x226D, 0x8136, 0xD934, + 0x2270, 0x8136, 0xD935, + 0x2271, 0x8136, 0xD936, + 0x2272, 0x8136, 0xD937, + 0x2273, 0x8136, 0xD938, + 0x2274, 0x8136, 0xD939, + 0x2275, 0x8136, 0xDA30, + 0x2276, 0x8136, 0xDA31, + 0x2277, 0x8136, 0xDA32, + 0x2278, 0x8136, 0xDA33, + 0x2279, 0x8136, 0xDA34, + 0x227A, 0x8136, 0xDA35, + 0x227B, 0x8136, 0xDA36, + 0x227C, 0x8136, 0xDA37, + 0x227D, 0x8136, 0xDA38, + 0x227E, 0x8136, 0xDA39, + 0x227F, 0x8136, 0xDB30, + 0x2280, 0x8136, 0xDB31, + 0x2281, 0x8136, 0xDB32, + 0x2282, 0x8136, 0xDB33, + 0x2283, 0x8136, 0xDB34, + 0x2284, 0x8136, 0xDB35, + 0x2285, 0x8136, 0xDB36, + 0x2286, 0x8136, 0xDB37, + 0x2287, 0x8136, 0xDB38, + 0x2288, 0x8136, 0xDB39, + 0x2289, 0x8136, 0xDC30, + 0x228A, 0x8136, 0xDC31, + 0x228B, 0x8136, 0xDC32, + 0x228C, 0x8136, 0xDC33, + 0x228D, 0x8136, 0xDC34, + 0x228E, 0x8136, 0xDC35, + 0x228F, 0x8136, 0xDC36, + 0x2290, 0x8136, 0xDC37, + 0x2291, 0x8136, 0xDC38, + 0x2292, 0x8136, 0xDC39, + 0x2293, 0x8136, 0xDD30, + 0x2294, 0x8136, 0xDD31, + 0x2296, 0x8136, 0xDD32, + 0x2297, 0x8136, 0xDD33, + 0x2298, 0x8136, 0xDD34, + 0x229A, 0x8136, 0xDD35, + 0x229B, 0x8136, 0xDD36, + 0x229C, 0x8136, 0xDD37, + 0x229D, 0x8136, 0xDD38, + 0x229E, 0x8136, 0xDD39, + 0x229F, 0x8136, 0xDE30, + 0x22A0, 0x8136, 0xDE31, + 0x22A1, 0x8136, 0xDE32, + 0x22A2, 0x8136, 0xDE33, + 0x22A3, 0x8136, 0xDE34, + 0x22A4, 0x8136, 0xDE35, + 0x22A6, 0x8136, 0xDE36, + 0x22A7, 0x8136, 0xDE37, + 0x22A8, 0x8136, 0xDE38, + 0x22A9, 0x8136, 0xDE39, + 0x22AA, 0x8136, 0xDF30, + 0x22AB, 0x8136, 0xDF31, + 0x22AC, 0x8136, 0xDF32, + 0x22AD, 0x8136, 0xDF33, + 0x22AE, 0x8136, 0xDF34, + 0x22AF, 0x8136, 0xDF35, + 0x22B0, 0x8136, 0xDF36, + 0x22B1, 0x8136, 0xDF37, + 0x22B2, 0x8136, 0xDF38, + 0x22B3, 0x8136, 0xDF39, + 0x22B4, 0x8136, 0xE030, + 0x22B5, 0x8136, 0xE031, + 0x22B6, 0x8136, 0xE032, + 0x22B7, 0x8136, 0xE033, + 0x22B8, 0x8136, 0xE034, + 0x22B9, 0x8136, 0xE035, + 0x22BA, 0x8136, 0xE036, + 0x22BB, 0x8136, 0xE037, + 0x22BC, 0x8136, 0xE038, + 0x22BD, 0x8136, 0xE039, + 0x22BE, 0x8136, 0xE130, + 0x22C0, 0x8136, 0xE131, + 0x22C1, 0x8136, 0xE132, + 0x22C2, 0x8136, 0xE133, + 0x22C3, 0x8136, 0xE134, + 0x22C4, 0x8136, 0xE135, + 0x22C5, 0x8136, 0xE136, + 0x22C6, 0x8136, 0xE137, + 0x22C7, 0x8136, 0xE138, + 0x22C8, 0x8136, 0xE139, + 0x22C9, 0x8136, 0xE230, + 0x22CA, 0x8136, 0xE231, + 0x22CB, 0x8136, 0xE232, + 0x22CC, 0x8136, 0xE233, + 0x22CD, 0x8136, 0xE234, + 0x22CE, 0x8136, 0xE235, + 0x22CF, 0x8136, 0xE236, + 0x22D0, 0x8136, 0xE237, + 0x22D1, 0x8136, 0xE238, + 0x22D2, 0x8136, 0xE239, + 0x22D3, 0x8136, 0xE330, + 0x22D4, 0x8136, 0xE331, + 0x22D5, 0x8136, 0xE332, + 0x22D6, 0x8136, 0xE333, + 0x22D7, 0x8136, 0xE334, + 0x22D8, 0x8136, 0xE335, + 0x22D9, 0x8136, 0xE336, + 0x22DA, 0x8136, 0xE337, + 0x22DB, 0x8136, 0xE338, + 0x22DC, 0x8136, 0xE339, + 0x22DD, 0x8136, 0xE430, + 0x22DE, 0x8136, 0xE431, + 0x22DF, 0x8136, 0xE432, + 0x22E0, 0x8136, 0xE433, + 0x22E1, 0x8136, 0xE434, + 0x22E2, 0x8136, 0xE435, + 0x22E3, 0x8136, 0xE436, + 0x22E4, 0x8136, 0xE437, + 0x22E5, 0x8136, 0xE438, + 0x22E6, 0x8136, 0xE439, + 0x22E7, 0x8136, 0xE530, + 0x22E8, 0x8136, 0xE531, + 0x22E9, 0x8136, 0xE532, + 0x22EA, 0x8136, 0xE533, + 0x22EB, 0x8136, 0xE534, + 0x22EC, 0x8136, 0xE535, + 0x22ED, 0x8136, 0xE536, + 0x22EE, 0x8136, 0xE537, + 0x22EF, 0x8136, 0xE538, + 0x22F0, 0x8136, 0xE539, + 0x22F1, 0x8136, 0xE630, + 0x22F2, 0x8136, 0xE631, + 0x22F3, 0x8136, 0xE632, + 0x22F4, 0x8136, 0xE633, + 0x22F5, 0x8136, 0xE634, + 0x22F6, 0x8136, 0xE635, + 0x22F7, 0x8136, 0xE636, + 0x22F8, 0x8136, 0xE637, + 0x22F9, 0x8136, 0xE638, + 0x22FA, 0x8136, 0xE639, + 0x22FB, 0x8136, 0xE730, + 0x22FC, 0x8136, 0xE731, + 0x22FD, 0x8136, 0xE732, + 0x22FE, 0x8136, 0xE733, + 0x22FF, 0x8136, 0xE734, + 0x2300, 0x8136, 0xE735, + 0x2301, 0x8136, 0xE736, + 0x2302, 0x8136, 0xE737, + 0x2303, 0x8136, 0xE738, + 0x2304, 0x8136, 0xE739, + 0x2305, 0x8136, 0xE830, + 0x2306, 0x8136, 0xE831, + 0x2307, 0x8136, 0xE832, + 0x2308, 0x8136, 0xE833, + 0x2309, 0x8136, 0xE834, + 0x230A, 0x8136, 0xE835, + 0x230B, 0x8136, 0xE836, + 0x230C, 0x8136, 0xE837, + 0x230D, 0x8136, 0xE838, + 0x230E, 0x8136, 0xE839, + 0x230F, 0x8136, 0xE930, + 0x2310, 0x8136, 0xE931, + 0x2311, 0x8136, 0xE932, + 0x2313, 0x8136, 0xE933, + 0x2314, 0x8136, 0xE934, + 0x2315, 0x8136, 0xE935, + 0x2316, 0x8136, 0xE936, + 0x2317, 0x8136, 0xE937, + 0x2318, 0x8136, 0xE938, + 0x2319, 0x8136, 0xE939, + 0x231A, 0x8136, 0xEA30, + 0x231B, 0x8136, 0xEA31, + 0x231C, 0x8136, 0xEA32, + 0x231D, 0x8136, 0xEA33, + 0x231E, 0x8136, 0xEA34, + 0x231F, 0x8136, 0xEA35, + 0x2320, 0x8136, 0xEA36, + 0x2321, 0x8136, 0xEA37, + 0x2322, 0x8136, 0xEA38, + 0x2323, 0x8136, 0xEA39, + 0x2324, 0x8136, 0xEB30, + 0x2325, 0x8136, 0xEB31, + 0x2326, 0x8136, 0xEB32, + 0x2327, 0x8136, 0xEB33, + 0x2328, 0x8136, 0xEB34, + 0x2329, 0x8136, 0xEB35, + 0x232A, 0x8136, 0xEB36, + 0x232B, 0x8136, 0xEB37, + 0x232C, 0x8136, 0xEB38, + 0x232D, 0x8136, 0xEB39, + 0x232E, 0x8136, 0xEC30, + 0x232F, 0x8136, 0xEC31, + 0x2330, 0x8136, 0xEC32, + 0x2331, 0x8136, 0xEC33, + 0x2332, 0x8136, 0xEC34, + 0x2333, 0x8136, 0xEC35, + 0x2334, 0x8136, 0xEC36, + 0x2335, 0x8136, 0xEC37, + 0x2336, 0x8136, 0xEC38, + 0x2337, 0x8136, 0xEC39, + 0x2338, 0x8136, 0xED30, + 0x2339, 0x8136, 0xED31, + 0x233A, 0x8136, 0xED32, + 0x233B, 0x8136, 0xED33, + 0x233C, 0x8136, 0xED34, + 0x233D, 0x8136, 0xED35, + 0x233E, 0x8136, 0xED36, + 0x233F, 0x8136, 0xED37, + 0x2340, 0x8136, 0xED38, + 0x2341, 0x8136, 0xED39, + 0x2342, 0x8136, 0xEE30, + 0x2343, 0x8136, 0xEE31, + 0x2344, 0x8136, 0xEE32, + 0x2345, 0x8136, 0xEE33, + 0x2346, 0x8136, 0xEE34, + 0x2347, 0x8136, 0xEE35, + 0x2348, 0x8136, 0xEE36, + 0x2349, 0x8136, 0xEE37, + 0x234A, 0x8136, 0xEE38, + 0x234B, 0x8136, 0xEE39, + 0x234C, 0x8136, 0xEF30, + 0x234D, 0x8136, 0xEF31, + 0x234E, 0x8136, 0xEF32, + 0x234F, 0x8136, 0xEF33, + 0x2350, 0x8136, 0xEF34, + 0x2351, 0x8136, 0xEF35, + 0x2352, 0x8136, 0xEF36, + 0x2353, 0x8136, 0xEF37, + 0x2354, 0x8136, 0xEF38, + 0x2355, 0x8136, 0xEF39, + 0x2356, 0x8136, 0xF030, + 0x2357, 0x8136, 0xF031, + 0x2358, 0x8136, 0xF032, + 0x2359, 0x8136, 0xF033, + 0x235A, 0x8136, 0xF034, + 0x235B, 0x8136, 0xF035, + 0x235C, 0x8136, 0xF036, + 0x235D, 0x8136, 0xF037, + 0x235E, 0x8136, 0xF038, + 0x235F, 0x8136, 0xF039, + 0x2360, 0x8136, 0xF130, + 0x2361, 0x8136, 0xF131, + 0x2362, 0x8136, 0xF132, + 0x2363, 0x8136, 0xF133, + 0x2364, 0x8136, 0xF134, + 0x2365, 0x8136, 0xF135, + 0x2366, 0x8136, 0xF136, + 0x2367, 0x8136, 0xF137, + 0x2368, 0x8136, 0xF138, + 0x2369, 0x8136, 0xF139, + 0x236A, 0x8136, 0xF230, + 0x236B, 0x8136, 0xF231, + 0x236C, 0x8136, 0xF232, + 0x236D, 0x8136, 0xF233, + 0x236E, 0x8136, 0xF234, + 0x236F, 0x8136, 0xF235, + 0x2370, 0x8136, 0xF236, + 0x2371, 0x8136, 0xF237, + 0x2372, 0x8136, 0xF238, + 0x2373, 0x8136, 0xF239, + 0x2374, 0x8136, 0xF330, + 0x2375, 0x8136, 0xF331, + 0x2376, 0x8136, 0xF332, + 0x2377, 0x8136, 0xF333, + 0x2378, 0x8136, 0xF334, + 0x2379, 0x8136, 0xF335, + 0x237A, 0x8136, 0xF336, + 0x237B, 0x8136, 0xF337, + 0x237C, 0x8136, 0xF338, + 0x237D, 0x8136, 0xF339, + 0x237E, 0x8136, 0xF430, + 0x237F, 0x8136, 0xF431, + 0x2380, 0x8136, 0xF432, + 0x2381, 0x8136, 0xF433, + 0x2382, 0x8136, 0xF434, + 0x2383, 0x8136, 0xF435, + 0x2384, 0x8136, 0xF436, + 0x2385, 0x8136, 0xF437, + 0x2386, 0x8136, 0xF438, + 0x2387, 0x8136, 0xF439, + 0x2388, 0x8136, 0xF530, + 0x2389, 0x8136, 0xF531, + 0x238A, 0x8136, 0xF532, + 0x238B, 0x8136, 0xF533, + 0x238C, 0x8136, 0xF534, + 0x238D, 0x8136, 0xF535, + 0x238E, 0x8136, 0xF536, + 0x238F, 0x8136, 0xF537, + 0x2390, 0x8136, 0xF538, + 0x2391, 0x8136, 0xF539, + 0x2392, 0x8136, 0xF630, + 0x2393, 0x8136, 0xF631, + 0x2394, 0x8136, 0xF632, + 0x2395, 0x8136, 0xF633, + 0x2396, 0x8136, 0xF634, + 0x2397, 0x8136, 0xF635, + 0x2398, 0x8136, 0xF636, + 0x2399, 0x8136, 0xF637, + 0x239A, 0x8136, 0xF638, + 0x239B, 0x8136, 0xF639, + 0x239C, 0x8136, 0xF730, + 0x239D, 0x8136, 0xF731, + 0x239E, 0x8136, 0xF732, + 0x239F, 0x8136, 0xF733, + 0x23A0, 0x8136, 0xF734, + 0x23A1, 0x8136, 0xF735, + 0x23A2, 0x8136, 0xF736, + 0x23A3, 0x8136, 0xF737, + 0x23A4, 0x8136, 0xF738, + 0x23A5, 0x8136, 0xF739, + 0x23A6, 0x8136, 0xF830, + 0x23A7, 0x8136, 0xF831, + 0x23A8, 0x8136, 0xF832, + 0x23A9, 0x8136, 0xF833, + 0x23AA, 0x8136, 0xF834, + 0x23AB, 0x8136, 0xF835, + 0x23AC, 0x8136, 0xF836, + 0x23AD, 0x8136, 0xF837, + 0x23AE, 0x8136, 0xF838, + 0x23AF, 0x8136, 0xF839, + 0x23B0, 0x8136, 0xF930, + 0x23B1, 0x8136, 0xF931, + 0x23B2, 0x8136, 0xF932, + 0x23B3, 0x8136, 0xF933, + 0x23B4, 0x8136, 0xF934, + 0x23B5, 0x8136, 0xF935, + 0x23B6, 0x8136, 0xF936, + 0x23B7, 0x8136, 0xF937, + 0x23B8, 0x8136, 0xF938, + 0x23B9, 0x8136, 0xF939, + 0x23BA, 0x8136, 0xFA30, + 0x23BB, 0x8136, 0xFA31, + 0x23BC, 0x8136, 0xFA32, + 0x23BD, 0x8136, 0xFA33, + 0x23BE, 0x8136, 0xFA34, + 0x23BF, 0x8136, 0xFA35, + 0x23C0, 0x8136, 0xFA36, + 0x23C1, 0x8136, 0xFA37, + 0x23C2, 0x8136, 0xFA38, + 0x23C3, 0x8136, 0xFA39, + 0x23C4, 0x8136, 0xFB30, + 0x23C5, 0x8136, 0xFB31, + 0x23C6, 0x8136, 0xFB32, + 0x23C7, 0x8136, 0xFB33, + 0x23C8, 0x8136, 0xFB34, + 0x23C9, 0x8136, 0xFB35, + 0x23CA, 0x8136, 0xFB36, + 0x23CB, 0x8136, 0xFB37, + 0x23CC, 0x8136, 0xFB38, + 0x23CD, 0x8136, 0xFB39, + 0x23CE, 0x8136, 0xFC30, + 0x23CF, 0x8136, 0xFC31, + 0x23D0, 0x8136, 0xFC32, + 0x23D1, 0x8136, 0xFC33, + 0x23D2, 0x8136, 0xFC34, + 0x23D3, 0x8136, 0xFC35, + 0x23D4, 0x8136, 0xFC36, + 0x23D5, 0x8136, 0xFC37, + 0x23D6, 0x8136, 0xFC38, + 0x23D7, 0x8136, 0xFC39, + 0x23D8, 0x8136, 0xFD30, + 0x23D9, 0x8136, 0xFD31, + 0x23DA, 0x8136, 0xFD32, + 0x23DB, 0x8136, 0xFD33, + 0x23DC, 0x8136, 0xFD34, + 0x23DD, 0x8136, 0xFD35, + 0x23DE, 0x8136, 0xFD36, + 0x23DF, 0x8136, 0xFD37, + 0x23E0, 0x8136, 0xFD38, + 0x23E1, 0x8136, 0xFD39, + 0x23E2, 0x8136, 0xFE30, + 0x23E3, 0x8136, 0xFE31, + 0x23E4, 0x8136, 0xFE32, + 0x23E5, 0x8136, 0xFE33, + 0x23E6, 0x8136, 0xFE34, + 0x23E7, 0x8136, 0xFE35, + 0x23E8, 0x8136, 0xFE36, + 0x23E9, 0x8136, 0xFE37, + 0x23EA, 0x8136, 0xFE38, + 0x23EB, 0x8136, 0xFE39, + 0x23EC, 0x8137, 0x8130, + 0x23ED, 0x8137, 0x8131, + 0x23EE, 0x8137, 0x8132, + 0x23EF, 0x8137, 0x8133, + 0x23F0, 0x8137, 0x8134, + 0x23F1, 0x8137, 0x8135, + 0x23F2, 0x8137, 0x8136, + 0x23F3, 0x8137, 0x8137, + 0x23F4, 0x8137, 0x8138, + 0x23F5, 0x8137, 0x8139, + 0x23F6, 0x8137, 0x8230, + 0x23F7, 0x8137, 0x8231, + 0x23F8, 0x8137, 0x8232, + 0x23F9, 0x8137, 0x8233, + 0x23FA, 0x8137, 0x8234, + 0x23FB, 0x8137, 0x8235, + 0x23FC, 0x8137, 0x8236, + 0x23FD, 0x8137, 0x8237, + 0x23FE, 0x8137, 0x8238, + 0x23FF, 0x8137, 0x8239, + 0x2400, 0x8137, 0x8330, + 0x2401, 0x8137, 0x8331, + 0x2402, 0x8137, 0x8332, + 0x2403, 0x8137, 0x8333, + 0x2404, 0x8137, 0x8334, + 0x2405, 0x8137, 0x8335, + 0x2406, 0x8137, 0x8336, + 0x2407, 0x8137, 0x8337, + 0x2408, 0x8137, 0x8338, + 0x2409, 0x8137, 0x8339, + 0x240A, 0x8137, 0x8430, + 0x240B, 0x8137, 0x8431, + 0x240C, 0x8137, 0x8432, + 0x240D, 0x8137, 0x8433, + 0x240E, 0x8137, 0x8434, + 0x240F, 0x8137, 0x8435, + 0x2410, 0x8137, 0x8436, + 0x2411, 0x8137, 0x8437, + 0x2412, 0x8137, 0x8438, + 0x2413, 0x8137, 0x8439, + 0x2414, 0x8137, 0x8530, + 0x2415, 0x8137, 0x8531, + 0x2416, 0x8137, 0x8532, + 0x2417, 0x8137, 0x8533, + 0x2418, 0x8137, 0x8534, + 0x2419, 0x8137, 0x8535, + 0x241A, 0x8137, 0x8536, + 0x241B, 0x8137, 0x8537, + 0x241C, 0x8137, 0x8538, + 0x241D, 0x8137, 0x8539, + 0x241E, 0x8137, 0x8630, + 0x241F, 0x8137, 0x8631, + 0x2420, 0x8137, 0x8632, + 0x2421, 0x8137, 0x8633, + 0x2422, 0x8137, 0x8634, + 0x2423, 0x8137, 0x8635, + 0x2424, 0x8137, 0x8636, + 0x2425, 0x8137, 0x8637, + 0x2426, 0x8137, 0x8638, + 0x2427, 0x8137, 0x8639, + 0x2428, 0x8137, 0x8730, + 0x2429, 0x8137, 0x8731, + 0x242A, 0x8137, 0x8732, + 0x242B, 0x8137, 0x8733, + 0x242C, 0x8137, 0x8734, + 0x242D, 0x8137, 0x8735, + 0x242E, 0x8137, 0x8736, + 0x242F, 0x8137, 0x8737, + 0x2430, 0x8137, 0x8738, + 0x2431, 0x8137, 0x8739, + 0x2432, 0x8137, 0x8830, + 0x2433, 0x8137, 0x8831, + 0x2434, 0x8137, 0x8832, + 0x2435, 0x8137, 0x8833, + 0x2436, 0x8137, 0x8834, + 0x2437, 0x8137, 0x8835, + 0x2438, 0x8137, 0x8836, + 0x2439, 0x8137, 0x8837, + 0x243A, 0x8137, 0x8838, + 0x243B, 0x8137, 0x8839, + 0x243C, 0x8137, 0x8930, + 0x243D, 0x8137, 0x8931, + 0x243E, 0x8137, 0x8932, + 0x243F, 0x8137, 0x8933, + 0x2440, 0x8137, 0x8934, + 0x2441, 0x8137, 0x8935, + 0x2442, 0x8137, 0x8936, + 0x2443, 0x8137, 0x8937, + 0x2444, 0x8137, 0x8938, + 0x2445, 0x8137, 0x8939, + 0x2446, 0x8137, 0x8A30, + 0x2447, 0x8137, 0x8A31, + 0x2448, 0x8137, 0x8A32, + 0x2449, 0x8137, 0x8A33, + 0x244A, 0x8137, 0x8A34, + 0x244B, 0x8137, 0x8A35, + 0x244C, 0x8137, 0x8A36, + 0x244D, 0x8137, 0x8A37, + 0x244E, 0x8137, 0x8A38, + 0x244F, 0x8137, 0x8A39, + 0x2450, 0x8137, 0x8B30, + 0x2451, 0x8137, 0x8B31, + 0x2452, 0x8137, 0x8B32, + 0x2453, 0x8137, 0x8B33, + 0x2454, 0x8137, 0x8B34, + 0x2455, 0x8137, 0x8B35, + 0x2456, 0x8137, 0x8B36, + 0x2457, 0x8137, 0x8B37, + 0x2458, 0x8137, 0x8B38, + 0x2459, 0x8137, 0x8B39, + 0x245A, 0x8137, 0x8C30, + 0x245B, 0x8137, 0x8C31, + 0x245C, 0x8137, 0x8C32, + 0x245D, 0x8137, 0x8C33, + 0x245E, 0x8137, 0x8C34, + 0x245F, 0x8137, 0x8C35, + 0x246A, 0x8137, 0x8C36, + 0x246B, 0x8137, 0x8C37, + 0x246C, 0x8137, 0x8C38, + 0x246D, 0x8137, 0x8C39, + 0x246E, 0x8137, 0x8D30, + 0x246F, 0x8137, 0x8D31, + 0x2470, 0x8137, 0x8D32, + 0x2471, 0x8137, 0x8D33, + 0x2472, 0x8137, 0x8D34, + 0x2473, 0x8137, 0x8D35, + 0x249C, 0x8137, 0x8D36, + 0x249D, 0x8137, 0x8D37, + 0x249E, 0x8137, 0x8D38, + 0x249F, 0x8137, 0x8D39, + 0x24A0, 0x8137, 0x8E30, + 0x24A1, 0x8137, 0x8E31, + 0x24A2, 0x8137, 0x8E32, + 0x24A3, 0x8137, 0x8E33, + 0x24A4, 0x8137, 0x8E34, + 0x24A5, 0x8137, 0x8E35, + 0x24A6, 0x8137, 0x8E36, + 0x24A7, 0x8137, 0x8E37, + 0x24A8, 0x8137, 0x8E38, + 0x24A9, 0x8137, 0x8E39, + 0x24AA, 0x8137, 0x8F30, + 0x24AB, 0x8137, 0x8F31, + 0x24AC, 0x8137, 0x8F32, + 0x24AD, 0x8137, 0x8F33, + 0x24AE, 0x8137, 0x8F34, + 0x24AF, 0x8137, 0x8F35, + 0x24B0, 0x8137, 0x8F36, + 0x24B1, 0x8137, 0x8F37, + 0x24B2, 0x8137, 0x8F38, + 0x24B3, 0x8137, 0x8F39, + 0x24B4, 0x8137, 0x9030, + 0x24B5, 0x8137, 0x9031, + 0x24B6, 0x8137, 0x9032, + 0x24B7, 0x8137, 0x9033, + 0x24B8, 0x8137, 0x9034, + 0x24B9, 0x8137, 0x9035, + 0x24BA, 0x8137, 0x9036, + 0x24BB, 0x8137, 0x9037, + 0x24BC, 0x8137, 0x9038, + 0x24BD, 0x8137, 0x9039, + 0x24BE, 0x8137, 0x9130, + 0x24BF, 0x8137, 0x9131, + 0x24C0, 0x8137, 0x9132, + 0x24C1, 0x8137, 0x9133, + 0x24C2, 0x8137, 0x9134, + 0x24C3, 0x8137, 0x9135, + 0x24C4, 0x8137, 0x9136, + 0x24C5, 0x8137, 0x9137, + 0x24C6, 0x8137, 0x9138, + 0x24C7, 0x8137, 0x9139, + 0x24C8, 0x8137, 0x9230, + 0x24C9, 0x8137, 0x9231, + 0x24CA, 0x8137, 0x9232, + 0x24CB, 0x8137, 0x9233, + 0x24CC, 0x8137, 0x9234, + 0x24CD, 0x8137, 0x9235, + 0x24CE, 0x8137, 0x9236, + 0x24CF, 0x8137, 0x9237, + 0x24D0, 0x8137, 0x9238, + 0x24D1, 0x8137, 0x9239, + 0x24D2, 0x8137, 0x9330, + 0x24D3, 0x8137, 0x9331, + 0x24D4, 0x8137, 0x9332, + 0x24D5, 0x8137, 0x9333, + 0x24D6, 0x8137, 0x9334, + 0x24D7, 0x8137, 0x9335, + 0x24D8, 0x8137, 0x9336, + 0x24D9, 0x8137, 0x9337, + 0x24DA, 0x8137, 0x9338, + 0x24DB, 0x8137, 0x9339, + 0x24DC, 0x8137, 0x9430, + 0x24DD, 0x8137, 0x9431, + 0x24DE, 0x8137, 0x9432, + 0x24DF, 0x8137, 0x9433, + 0x24E0, 0x8137, 0x9434, + 0x24E1, 0x8137, 0x9435, + 0x24E2, 0x8137, 0x9436, + 0x24E3, 0x8137, 0x9437, + 0x24E4, 0x8137, 0x9438, + 0x24E5, 0x8137, 0x9439, + 0x24E6, 0x8137, 0x9530, + 0x24E7, 0x8137, 0x9531, + 0x24E8, 0x8137, 0x9532, + 0x24E9, 0x8137, 0x9533, + 0x24EA, 0x8137, 0x9534, + 0x24EB, 0x8137, 0x9535, + 0x24EC, 0x8137, 0x9536, + 0x24ED, 0x8137, 0x9537, + 0x24EE, 0x8137, 0x9538, + 0x24EF, 0x8137, 0x9539, + 0x24F0, 0x8137, 0x9630, + 0x24F1, 0x8137, 0x9631, + 0x24F2, 0x8137, 0x9632, + 0x24F3, 0x8137, 0x9633, + 0x24F4, 0x8137, 0x9634, + 0x24F5, 0x8137, 0x9635, + 0x24F6, 0x8137, 0x9636, + 0x24F7, 0x8137, 0x9637, + 0x24F8, 0x8137, 0x9638, + 0x24F9, 0x8137, 0x9639, + 0x24FA, 0x8137, 0x9730, + 0x24FB, 0x8137, 0x9731, + 0x24FC, 0x8137, 0x9732, + 0x24FD, 0x8137, 0x9733, + 0x24FE, 0x8137, 0x9734, + 0x24FF, 0x8137, 0x9735, + 0x254C, 0x8137, 0x9736, + 0x254D, 0x8137, 0x9737, + 0x254E, 0x8137, 0x9738, + 0x254F, 0x8137, 0x9739, + 0x2574, 0x8137, 0x9830, + 0x2575, 0x8137, 0x9831, + 0x2576, 0x8137, 0x9832, + 0x2577, 0x8137, 0x9833, + 0x2578, 0x8137, 0x9834, + 0x2579, 0x8137, 0x9835, + 0x257A, 0x8137, 0x9836, + 0x257B, 0x8137, 0x9837, + 0x257C, 0x8137, 0x9838, + 0x257D, 0x8137, 0x9839, + 0x257E, 0x8137, 0x9930, + 0x257F, 0x8137, 0x9931, + 0x2580, 0x8137, 0x9932, + 0x2590, 0x8137, 0x9933, + 0x2591, 0x8137, 0x9934, + 0x2592, 0x8137, 0x9935, + 0x2596, 0x8137, 0x9936, + 0x2597, 0x8137, 0x9937, + 0x2598, 0x8137, 0x9938, + 0x2599, 0x8137, 0x9939, + 0x259A, 0x8137, 0x9A30, + 0x259B, 0x8137, 0x9A31, + 0x259C, 0x8137, 0x9A32, + 0x259D, 0x8137, 0x9A33, + 0x259E, 0x8137, 0x9A34, + 0x259F, 0x8137, 0x9A35, + 0x25A2, 0x8137, 0x9A36, + 0x25A3, 0x8137, 0x9A37, + 0x25A4, 0x8137, 0x9A38, + 0x25A5, 0x8137, 0x9A39, + 0x25A6, 0x8137, 0x9B30, + 0x25A7, 0x8137, 0x9B31, + 0x25A8, 0x8137, 0x9B32, + 0x25A9, 0x8137, 0x9B33, + 0x25AA, 0x8137, 0x9B34, + 0x25AB, 0x8137, 0x9B35, + 0x25AC, 0x8137, 0x9B36, + 0x25AD, 0x8137, 0x9B37, + 0x25AE, 0x8137, 0x9B38, + 0x25AF, 0x8137, 0x9B39, + 0x25B0, 0x8137, 0x9C30, + 0x25B1, 0x8137, 0x9C31, + 0x25B4, 0x8137, 0x9C32, + 0x25B5, 0x8137, 0x9C33, + 0x25B6, 0x8137, 0x9C34, + 0x25B7, 0x8137, 0x9C35, + 0x25B8, 0x8137, 0x9C36, + 0x25B9, 0x8137, 0x9C37, + 0x25BA, 0x8137, 0x9C38, + 0x25BB, 0x8137, 0x9C39, + 0x25BE, 0x8137, 0x9D30, + 0x25BF, 0x8137, 0x9D31, + 0x25C0, 0x8137, 0x9D32, + 0x25C1, 0x8137, 0x9D33, + 0x25C2, 0x8137, 0x9D34, + 0x25C3, 0x8137, 0x9D35, + 0x25C4, 0x8137, 0x9D36, + 0x25C5, 0x8137, 0x9D37, + 0x25C8, 0x8137, 0x9D38, + 0x25C9, 0x8137, 0x9D39, + 0x25CA, 0x8137, 0x9E30, + 0x25CC, 0x8137, 0x9E31, + 0x25CD, 0x8137, 0x9E32, + 0x25D0, 0x8137, 0x9E33, + 0x25D1, 0x8137, 0x9E34, + 0x25D2, 0x8137, 0x9E35, + 0x25D3, 0x8137, 0x9E36, + 0x25D4, 0x8137, 0x9E37, + 0x25D5, 0x8137, 0x9E38, + 0x25D6, 0x8137, 0x9E39, + 0x25D7, 0x8137, 0x9F30, + 0x25D8, 0x8137, 0x9F31, + 0x25D9, 0x8137, 0x9F32, + 0x25DA, 0x8137, 0x9F33, + 0x25DB, 0x8137, 0x9F34, + 0x25DC, 0x8137, 0x9F35, + 0x25DD, 0x8137, 0x9F36, + 0x25DE, 0x8137, 0x9F37, + 0x25DF, 0x8137, 0x9F38, + 0x25E0, 0x8137, 0x9F39, + 0x25E1, 0x8137, 0xA030, + 0x25E6, 0x8137, 0xA031, + 0x25E7, 0x8137, 0xA032, + 0x25E8, 0x8137, 0xA033, + 0x25E9, 0x8137, 0xA034, + 0x25EA, 0x8137, 0xA035, + 0x25EB, 0x8137, 0xA036, + 0x25EC, 0x8137, 0xA037, + 0x25ED, 0x8137, 0xA038, + 0x25EE, 0x8137, 0xA039, + 0x25EF, 0x8137, 0xA130, + 0x25F0, 0x8137, 0xA131, + 0x25F1, 0x8137, 0xA132, + 0x25F2, 0x8137, 0xA133, + 0x25F3, 0x8137, 0xA134, + 0x25F4, 0x8137, 0xA135, + 0x25F5, 0x8137, 0xA136, + 0x25F6, 0x8137, 0xA137, + 0x25F7, 0x8137, 0xA138, + 0x25F8, 0x8137, 0xA139, + 0x25F9, 0x8137, 0xA230, + 0x25FA, 0x8137, 0xA231, + 0x25FB, 0x8137, 0xA232, + 0x25FC, 0x8137, 0xA233, + 0x25FD, 0x8137, 0xA234, + 0x25FE, 0x8137, 0xA235, + 0x25FF, 0x8137, 0xA236, + 0x2600, 0x8137, 0xA237, + 0x2601, 0x8137, 0xA238, + 0x2602, 0x8137, 0xA239, + 0x2603, 0x8137, 0xA330, + 0x2604, 0x8137, 0xA331, + 0x2607, 0x8137, 0xA332, + 0x2608, 0x8137, 0xA333, + 0x260A, 0x8137, 0xA334, + 0x260B, 0x8137, 0xA335, + 0x260C, 0x8137, 0xA336, + 0x260D, 0x8137, 0xA337, + 0x260E, 0x8137, 0xA338, + 0x260F, 0x8137, 0xA339, + 0x2610, 0x8137, 0xA430, + 0x2611, 0x8137, 0xA431, + 0x2612, 0x8137, 0xA432, + 0x2613, 0x8137, 0xA433, + 0x2614, 0x8137, 0xA434, + 0x2615, 0x8137, 0xA435, + 0x2616, 0x8137, 0xA436, + 0x2617, 0x8137, 0xA437, + 0x2618, 0x8137, 0xA438, + 0x2619, 0x8137, 0xA439, + 0x261A, 0x8137, 0xA530, + 0x261B, 0x8137, 0xA531, + 0x261C, 0x8137, 0xA532, + 0x261D, 0x8137, 0xA533, + 0x261E, 0x8137, 0xA534, + 0x261F, 0x8137, 0xA535, + 0x2620, 0x8137, 0xA536, + 0x2621, 0x8137, 0xA537, + 0x2622, 0x8137, 0xA538, + 0x2623, 0x8137, 0xA539, + 0x2624, 0x8137, 0xA630, + 0x2625, 0x8137, 0xA631, + 0x2626, 0x8137, 0xA632, + 0x2627, 0x8137, 0xA633, + 0x2628, 0x8137, 0xA634, + 0x2629, 0x8137, 0xA635, + 0x262A, 0x8137, 0xA636, + 0x262B, 0x8137, 0xA637, + 0x262C, 0x8137, 0xA638, + 0x262D, 0x8137, 0xA639, + 0x262E, 0x8137, 0xA730, + 0x262F, 0x8137, 0xA731, + 0x2630, 0x8137, 0xA732, + 0x2631, 0x8137, 0xA733, + 0x2632, 0x8137, 0xA734, + 0x2633, 0x8137, 0xA735, + 0x2634, 0x8137, 0xA736, + 0x2635, 0x8137, 0xA737, + 0x2636, 0x8137, 0xA738, + 0x2637, 0x8137, 0xA739, + 0x2638, 0x8137, 0xA830, + 0x2639, 0x8137, 0xA831, + 0x263A, 0x8137, 0xA832, + 0x263B, 0x8137, 0xA833, + 0x263C, 0x8137, 0xA834, + 0x263D, 0x8137, 0xA835, + 0x263E, 0x8137, 0xA836, + 0x263F, 0x8137, 0xA837, + 0x2641, 0x8137, 0xA838, + 0x2E82, 0x8138, 0xFD39, + 0x2E83, 0x8138, 0xFE30, + 0x2E85, 0x8138, 0xFE31, + 0x2E86, 0x8138, 0xFE32, + 0x2E87, 0x8138, 0xFE33, + 0x2E89, 0x8138, 0xFE34, + 0x2E8A, 0x8138, 0xFE35, + 0x2E8D, 0x8138, 0xFE36, + 0x2E8E, 0x8138, 0xFE37, + 0x2E8F, 0x8138, 0xFE38, + 0x2E90, 0x8138, 0xFE39, + 0x2E91, 0x8139, 0x8130, + 0x2E92, 0x8139, 0x8131, + 0x2E93, 0x8139, 0x8132, + 0x2E94, 0x8139, 0x8133, + 0x2E95, 0x8139, 0x8134, + 0x2E96, 0x8139, 0x8135, + 0x2E98, 0x8139, 0x8136, + 0x2E99, 0x8139, 0x8137, + 0x2E9A, 0x8139, 0x8138, + 0x2E9B, 0x8139, 0x8139, + 0x2E9C, 0x8139, 0x8230, + 0x2E9D, 0x8139, 0x8231, + 0x2E9E, 0x8139, 0x8232, + 0x2E9F, 0x8139, 0x8233, + 0x2EA0, 0x8139, 0x8234, + 0x2EA1, 0x8139, 0x8235, + 0x2EA2, 0x8139, 0x8236, + 0x2EA3, 0x8139, 0x8237, + 0x2EA4, 0x8139, 0x8238, + 0x2EA5, 0x8139, 0x8239, + 0x2EA6, 0x8139, 0x8330, + 0x2EA8, 0x8139, 0x8331, + 0x2EA9, 0x8139, 0x8332, + 0x2EAB, 0x8139, 0x8333, + 0x2EAC, 0x8139, 0x8334, + 0x2EAD, 0x8139, 0x8335, + 0x2EAF, 0x8139, 0x8336, + 0x2EB0, 0x8139, 0x8337, + 0x2EB1, 0x8139, 0x8338, + 0x2EB2, 0x8139, 0x8339, + 0x2EB4, 0x8139, 0x8430, + 0x2EB5, 0x8139, 0x8431, + 0x2EB8, 0x8139, 0x8432, + 0x2EB9, 0x8139, 0x8433, + 0x2EBA, 0x8139, 0x8434, + 0x2EBC, 0x8139, 0x8435, + 0x2EBD, 0x8139, 0x8436, + 0x2EBE, 0x8139, 0x8437, + 0x2EBF, 0x8139, 0x8438, + 0x2EC0, 0x8139, 0x8439, + 0x2EC1, 0x8139, 0x8530, + 0x2EC2, 0x8139, 0x8531, + 0x2EC3, 0x8139, 0x8532, + 0x2EC4, 0x8139, 0x8533, + 0x2EC5, 0x8139, 0x8534, + 0x2EC6, 0x8139, 0x8535, + 0x2EC7, 0x8139, 0x8536, + 0x2EC8, 0x8139, 0x8537, + 0x2EC9, 0x8139, 0x8538, + 0x2ECB, 0x8139, 0x8539, + 0x2ECC, 0x8139, 0x8630, + 0x2ECD, 0x8139, 0x8631, + 0x2ECE, 0x8139, 0x8632, + 0x2ECF, 0x8139, 0x8633, + 0x2ED0, 0x8139, 0x8634, + 0x2ED1, 0x8139, 0x8635, + 0x2ED2, 0x8139, 0x8636, + 0x2ED3, 0x8139, 0x8637, + 0x2ED4, 0x8139, 0x8638, + 0x2ED5, 0x8139, 0x8639, + 0x2ED6, 0x8139, 0x8730, + 0x2ED7, 0x8139, 0x8731, + 0x2ED8, 0x8139, 0x8732, + 0x2ED9, 0x8139, 0x8733, + 0x2EDA, 0x8139, 0x8734, + 0x2EDB, 0x8139, 0x8735, + 0x2EDC, 0x8139, 0x8736, + 0x2EDD, 0x8139, 0x8737, + 0x2EDE, 0x8139, 0x8738, + 0x2EDF, 0x8139, 0x8739, + 0x2EE0, 0x8139, 0x8830, + 0x2EE1, 0x8139, 0x8831, + 0x2EE2, 0x8139, 0x8832, + 0x2EE3, 0x8139, 0x8833, + 0x2EE4, 0x8139, 0x8834, + 0x2EE5, 0x8139, 0x8835, + 0x2EE6, 0x8139, 0x8836, + 0x2EE7, 0x8139, 0x8837, + 0x2EE8, 0x8139, 0x8838, + 0x2EE9, 0x8139, 0x8839, + 0x2EEA, 0x8139, 0x8930, + 0x2EEB, 0x8139, 0x8931, + 0x2EEC, 0x8139, 0x8932, + 0x2EED, 0x8139, 0x8933, + 0x2EEE, 0x8139, 0x8934, + 0x2EEF, 0x8139, 0x8935, + 0x2EF0, 0x8139, 0x8936, + 0x2EF1, 0x8139, 0x8937, + 0x2EF2, 0x8139, 0x8938, + 0x2EF3, 0x8139, 0x8939, + 0x2EF4, 0x8139, 0x8A30, + 0x2EF5, 0x8139, 0x8A31, + 0x2EF6, 0x8139, 0x8A32, + 0x2EF7, 0x8139, 0x8A33, + 0x2EF8, 0x8139, 0x8A34, + 0x2EF9, 0x8139, 0x8A35, + 0x2EFA, 0x8139, 0x8A36, + 0x2EFB, 0x8139, 0x8A37, + 0x2EFC, 0x8139, 0x8A38, + 0x2EFD, 0x8139, 0x8A39, + 0x2EFE, 0x8139, 0x8B30, + 0x2EFF, 0x8139, 0x8B31, + 0x2F00, 0x8139, 0x8B32, + 0x2F01, 0x8139, 0x8B33, + 0x2F02, 0x8139, 0x8B34, + 0x2F03, 0x8139, 0x8B35, + 0x2F04, 0x8139, 0x8B36, + 0x2F05, 0x8139, 0x8B37, + 0x2F06, 0x8139, 0x8B38, + 0x2F07, 0x8139, 0x8B39, + 0x2F08, 0x8139, 0x8C30, + 0x2F09, 0x8139, 0x8C31, + 0x2F0A, 0x8139, 0x8C32, + 0x2F0B, 0x8139, 0x8C33, + 0x2F0C, 0x8139, 0x8C34, + 0x2F0D, 0x8139, 0x8C35, + 0x2F0E, 0x8139, 0x8C36, + 0x2F0F, 0x8139, 0x8C37, + 0x2F10, 0x8139, 0x8C38, + 0x2F11, 0x8139, 0x8C39, + 0x2F12, 0x8139, 0x8D30, + 0x2F13, 0x8139, 0x8D31, + 0x2F14, 0x8139, 0x8D32, + 0x2F15, 0x8139, 0x8D33, + 0x2F16, 0x8139, 0x8D34, + 0x2F17, 0x8139, 0x8D35, + 0x2F18, 0x8139, 0x8D36, + 0x2F19, 0x8139, 0x8D37, + 0x2F1A, 0x8139, 0x8D38, + 0x2F1B, 0x8139, 0x8D39, + 0x2F1C, 0x8139, 0x8E30, + 0x2F1D, 0x8139, 0x8E31, + 0x2F1E, 0x8139, 0x8E32, + 0x2F1F, 0x8139, 0x8E33, + 0x2F20, 0x8139, 0x8E34, + 0x2F21, 0x8139, 0x8E35, + 0x2F22, 0x8139, 0x8E36, + 0x2F23, 0x8139, 0x8E37, + 0x2F24, 0x8139, 0x8E38, + 0x2F25, 0x8139, 0x8E39, + 0x2F26, 0x8139, 0x8F30, + 0x2F27, 0x8139, 0x8F31, + 0x2F28, 0x8139, 0x8F32, + 0x2F29, 0x8139, 0x8F33, + 0x2F2A, 0x8139, 0x8F34, + 0x2F2B, 0x8139, 0x8F35, + 0x2F2C, 0x8139, 0x8F36, + 0x2F2D, 0x8139, 0x8F37, + 0x2F2E, 0x8139, 0x8F38, + 0x2F2F, 0x8139, 0x8F39, + 0x2F30, 0x8139, 0x9030, + 0x2F31, 0x8139, 0x9031, + 0x2F32, 0x8139, 0x9032, + 0x2F33, 0x8139, 0x9033, + 0x2F34, 0x8139, 0x9034, + 0x2F35, 0x8139, 0x9035, + 0x2F36, 0x8139, 0x9036, + 0x2F37, 0x8139, 0x9037, + 0x2F38, 0x8139, 0x9038, + 0x2F39, 0x8139, 0x9039, + 0x2F3A, 0x8139, 0x9130, + 0x2F3B, 0x8139, 0x9131, + 0x2F3C, 0x8139, 0x9132, + 0x2F3D, 0x8139, 0x9133, + 0x2F3E, 0x8139, 0x9134, + 0x2F3F, 0x8139, 0x9135, + 0x2F40, 0x8139, 0x9136, + 0x2F41, 0x8139, 0x9137, + 0x2F42, 0x8139, 0x9138, + 0x2F43, 0x8139, 0x9139, + 0x2F44, 0x8139, 0x9230, + 0x2F45, 0x8139, 0x9231, + 0x2F46, 0x8139, 0x9232, + 0x2F47, 0x8139, 0x9233, + 0x2F48, 0x8139, 0x9234, + 0x2F49, 0x8139, 0x9235, + 0x2F4A, 0x8139, 0x9236, + 0x2F4B, 0x8139, 0x9237, + 0x2F4C, 0x8139, 0x9238, + 0x2F4D, 0x8139, 0x9239, + 0x2F4E, 0x8139, 0x9330, + 0x2F4F, 0x8139, 0x9331, + 0x2F50, 0x8139, 0x9332, + 0x2F51, 0x8139, 0x9333, + 0x2F52, 0x8139, 0x9334, + 0x2F53, 0x8139, 0x9335, + 0x2F54, 0x8139, 0x9336, + 0x2F55, 0x8139, 0x9337, + 0x2F56, 0x8139, 0x9338, + 0x2F57, 0x8139, 0x9339, + 0x2F58, 0x8139, 0x9430, + 0x2F59, 0x8139, 0x9431, + 0x2F5A, 0x8139, 0x9432, + 0x2F5B, 0x8139, 0x9433, + 0x2F5C, 0x8139, 0x9434, + 0x2F5D, 0x8139, 0x9435, + 0x2F5E, 0x8139, 0x9436, + 0x2F5F, 0x8139, 0x9437, + 0x2F60, 0x8139, 0x9438, + 0x2F61, 0x8139, 0x9439, + 0x2F62, 0x8139, 0x9530, + 0x2F63, 0x8139, 0x9531, + 0x2F64, 0x8139, 0x9532, + 0x2F65, 0x8139, 0x9533, + 0x2F66, 0x8139, 0x9534, + 0x2F67, 0x8139, 0x9535, + 0x2F68, 0x8139, 0x9536, + 0x2F69, 0x8139, 0x9537, + 0x2F6A, 0x8139, 0x9538, + 0x2F6B, 0x8139, 0x9539, + 0x2F6C, 0x8139, 0x9630, + 0x2F6D, 0x8139, 0x9631, + 0x2F6E, 0x8139, 0x9632, + 0x2F6F, 0x8139, 0x9633, + 0x2F70, 0x8139, 0x9634, + 0x2F71, 0x8139, 0x9635, + 0x2F72, 0x8139, 0x9636, + 0x2F73, 0x8139, 0x9637, + 0x2F74, 0x8139, 0x9638, + 0x2F75, 0x8139, 0x9639, + 0x2F76, 0x8139, 0x9730, + 0x2F77, 0x8139, 0x9731, + 0x2F78, 0x8139, 0x9732, + 0x2F79, 0x8139, 0x9733, + 0x2F7A, 0x8139, 0x9734, + 0x2F7B, 0x8139, 0x9735, + 0x2F7C, 0x8139, 0x9736, + 0x2F7D, 0x8139, 0x9737, + 0x2F7E, 0x8139, 0x9738, + 0x2F7F, 0x8139, 0x9739, + 0x2F80, 0x8139, 0x9830, + 0x2F81, 0x8139, 0x9831, + 0x2F82, 0x8139, 0x9832, + 0x2F83, 0x8139, 0x9833, + 0x2F84, 0x8139, 0x9834, + 0x2F85, 0x8139, 0x9835, + 0x2F86, 0x8139, 0x9836, + 0x2F87, 0x8139, 0x9837, + 0x2F88, 0x8139, 0x9838, + 0x2F89, 0x8139, 0x9839, + 0x2F8A, 0x8139, 0x9930, + 0x2F8B, 0x8139, 0x9931, + 0x2F8C, 0x8139, 0x9932, + 0x2F8D, 0x8139, 0x9933, + 0x2F8E, 0x8139, 0x9934, + 0x2F8F, 0x8139, 0x9935, + 0x2F90, 0x8139, 0x9936, + 0x2F91, 0x8139, 0x9937, + 0x2F92, 0x8139, 0x9938, + 0x2F93, 0x8139, 0x9939, + 0x2F94, 0x8139, 0x9A30, + 0x2F95, 0x8139, 0x9A31, + 0x2F96, 0x8139, 0x9A32, + 0x2F97, 0x8139, 0x9A33, + 0x2F98, 0x8139, 0x9A34, + 0x2F99, 0x8139, 0x9A35, + 0x2F9A, 0x8139, 0x9A36, + 0x2F9B, 0x8139, 0x9A37, + 0x2F9C, 0x8139, 0x9A38, + 0x2F9D, 0x8139, 0x9A39, + 0x2F9E, 0x8139, 0x9B30, + 0x2F9F, 0x8139, 0x9B31, + 0x2FA0, 0x8139, 0x9B32, + 0x2FA1, 0x8139, 0x9B33, + 0x2FA2, 0x8139, 0x9B34, + 0x2FA3, 0x8139, 0x9B35, + 0x2FA4, 0x8139, 0x9B36, + 0x2FA5, 0x8139, 0x9B37, + 0x2FA6, 0x8139, 0x9B38, + 0x2FA7, 0x8139, 0x9B39, + 0x2FA8, 0x8139, 0x9C30, + 0x2FA9, 0x8139, 0x9C31, + 0x2FAA, 0x8139, 0x9C32, + 0x2FAB, 0x8139, 0x9C33, + 0x2FAC, 0x8139, 0x9C34, + 0x2FAD, 0x8139, 0x9C35, + 0x2FAE, 0x8139, 0x9C36, + 0x2FAF, 0x8139, 0x9C37, + 0x2FB0, 0x8139, 0x9C38, + 0x2FB1, 0x8139, 0x9C39, + 0x2FB2, 0x8139, 0x9D30, + 0x2FB3, 0x8139, 0x9D31, + 0x2FB4, 0x8139, 0x9D32, + 0x2FB5, 0x8139, 0x9D33, + 0x2FB6, 0x8139, 0x9D34, + 0x2FB7, 0x8139, 0x9D35, + 0x2FB8, 0x8139, 0x9D36, + 0x2FB9, 0x8139, 0x9D37, + 0x2FBA, 0x8139, 0x9D38, + 0x2FBB, 0x8139, 0x9D39, + 0x2FBC, 0x8139, 0x9E30, + 0x2FBD, 0x8139, 0x9E31, + 0x2FBE, 0x8139, 0x9E32, + 0x2FBF, 0x8139, 0x9E33, + 0x2FC0, 0x8139, 0x9E34, + 0x2FC1, 0x8139, 0x9E35, + 0x2FC2, 0x8139, 0x9E36, + 0x2FC3, 0x8139, 0x9E37, + 0x2FC4, 0x8139, 0x9E38, + 0x2FC5, 0x8139, 0x9E39, + 0x2FC6, 0x8139, 0x9F30, + 0x2FC7, 0x8139, 0x9F31, + 0x2FC8, 0x8139, 0x9F32, + 0x2FC9, 0x8139, 0x9F33, + 0x2FCA, 0x8139, 0x9F34, + 0x2FCB, 0x8139, 0x9F35, + 0x2FCC, 0x8139, 0x9F36, + 0x2FCD, 0x8139, 0x9F37, + 0x2FCE, 0x8139, 0x9F38, + 0x2FCF, 0x8139, 0x9F39, + 0x2FD0, 0x8139, 0xA030, + 0x2FD1, 0x8139, 0xA031, + 0x2FD2, 0x8139, 0xA032, + 0x2FD3, 0x8139, 0xA033, + 0x2FD4, 0x8139, 0xA034, + 0x2FD5, 0x8139, 0xA035, + 0x2FD6, 0x8139, 0xA036, + 0x2FD7, 0x8139, 0xA037, + 0x2FD8, 0x8139, 0xA038, + 0x2FD9, 0x8139, 0xA039, + 0x2FDA, 0x8139, 0xA130, + 0x2FDB, 0x8139, 0xA131, + 0x2FDC, 0x8139, 0xA132, + 0x2FDD, 0x8139, 0xA133, + 0x2FDE, 0x8139, 0xA134, + 0x2FDF, 0x8139, 0xA135, + 0x2FE0, 0x8139, 0xA136, + 0x2FE1, 0x8139, 0xA137, + 0x2FE2, 0x8139, 0xA138, + 0x2FE3, 0x8139, 0xA139, + 0x2FE4, 0x8139, 0xA230, + 0x2FE5, 0x8139, 0xA231, + 0x2FE6, 0x8139, 0xA232, + 0x2FE7, 0x8139, 0xA233, + 0x2FE8, 0x8139, 0xA234, + 0x2FE9, 0x8139, 0xA235, + 0x2FEA, 0x8139, 0xA236, + 0x2FEB, 0x8139, 0xA237, + 0x2FEC, 0x8139, 0xA238, + 0x2FED, 0x8139, 0xA239, + 0x2FEE, 0x8139, 0xA330, + 0x2FEF, 0x8139, 0xA331, + 0x2FFC, 0x8139, 0xA332, + 0x2FFD, 0x8139, 0xA333, + 0x2FFE, 0x8139, 0xA334, + 0x2FFF, 0x8139, 0xA335, + 0x3004, 0x8139, 0xA336, + 0x3018, 0x8139, 0xA337, + 0x3019, 0x8139, 0xA338, + 0x301A, 0x8139, 0xA339, + 0x301B, 0x8139, 0xA430, + 0x301C, 0x8139, 0xA431, + 0x301F, 0x8139, 0xA432, + 0x3020, 0x8139, 0xA433, + 0x302A, 0x8139, 0xA434, + 0x302B, 0x8139, 0xA435, + 0x302C, 0x8139, 0xA436, + 0x302D, 0x8139, 0xA437, + 0x302E, 0x8139, 0xA438, + 0x302F, 0x8139, 0xA439, + 0x3030, 0x8139, 0xA530, + 0x3031, 0x8139, 0xA531, + 0x3032, 0x8139, 0xA532, + 0x3033, 0x8139, 0xA533, + 0x3034, 0x8139, 0xA534, + 0x3035, 0x8139, 0xA535, + 0x3036, 0x8139, 0xA536, + 0x3037, 0x8139, 0xA537, + 0x3038, 0x8139, 0xA538, + 0x3039, 0x8139, 0xA539, + 0x303A, 0x8139, 0xA630, + 0x303B, 0x8139, 0xA631, + 0x303C, 0x8139, 0xA632, + 0x303D, 0x8139, 0xA633, + 0x303F, 0x8139, 0xA634, + 0x3040, 0x8139, 0xA635, + 0x3094, 0x8139, 0xA636, + 0x3095, 0x8139, 0xA637, + 0x3096, 0x8139, 0xA638, + 0x3097, 0x8139, 0xA639, + 0x3098, 0x8139, 0xA730, + 0x3099, 0x8139, 0xA731, + 0x309A, 0x8139, 0xA732, + 0x309F, 0x8139, 0xA733, + 0x30A0, 0x8139, 0xA734, + 0x30F7, 0x8139, 0xA735, + 0x30F8, 0x8139, 0xA736, + 0x30F9, 0x8139, 0xA737, + 0x30FA, 0x8139, 0xA738, + 0x30FB, 0x8139, 0xA739, + 0x30FF, 0x8139, 0xA830, + 0x3100, 0x8139, 0xA831, + 0x3101, 0x8139, 0xA832, + 0x3102, 0x8139, 0xA833, + 0x3103, 0x8139, 0xA834, + 0x3104, 0x8139, 0xA835, + 0x312A, 0x8139, 0xA836, + 0x312B, 0x8139, 0xA837, + 0x312C, 0x8139, 0xA838, + 0x312D, 0x8139, 0xA839, + 0x312E, 0x8139, 0xA930, + 0x312F, 0x8139, 0xA931, + 0x3130, 0x8139, 0xA932, + 0x3131, 0x8139, 0xA933, + 0x3132, 0x8139, 0xA934, + 0x3133, 0x8139, 0xA935, + 0x3134, 0x8139, 0xA936, + 0x3135, 0x8139, 0xA937, + 0x3136, 0x8139, 0xA938, + 0x3137, 0x8139, 0xA939, + 0x3138, 0x8139, 0xAA30, + 0x3139, 0x8139, 0xAA31, + 0x313A, 0x8139, 0xAA32, + 0x313B, 0x8139, 0xAA33, + 0x313C, 0x8139, 0xAA34, + 0x313D, 0x8139, 0xAA35, + 0x313E, 0x8139, 0xAA36, + 0x313F, 0x8139, 0xAA37, + 0x3140, 0x8139, 0xAA38, + 0x3141, 0x8139, 0xAA39, + 0x3142, 0x8139, 0xAB30, + 0x3143, 0x8139, 0xAB31, + 0x3144, 0x8139, 0xAB32, + 0x3145, 0x8139, 0xAB33, + 0x3146, 0x8139, 0xAB34, + 0x3147, 0x8139, 0xAB35, + 0x3148, 0x8139, 0xAB36, + 0x3149, 0x8139, 0xAB37, + 0x314A, 0x8139, 0xAB38, + 0x314B, 0x8139, 0xAB39, + 0x314C, 0x8139, 0xAC30, + 0x314D, 0x8139, 0xAC31, + 0x314E, 0x8139, 0xAC32, + 0x314F, 0x8139, 0xAC33, + 0x3150, 0x8139, 0xAC34, + 0x3151, 0x8139, 0xAC35, + 0x3152, 0x8139, 0xAC36, + 0x3153, 0x8139, 0xAC37, + 0x3154, 0x8139, 0xAC38, + 0x3155, 0x8139, 0xAC39, + 0x3156, 0x8139, 0xAD30, + 0x3157, 0x8139, 0xAD31, + 0x3158, 0x8139, 0xAD32, + 0x3159, 0x8139, 0xAD33, + 0x315A, 0x8139, 0xAD34, + 0x315B, 0x8139, 0xAD35, + 0x315C, 0x8139, 0xAD36, + 0x315D, 0x8139, 0xAD37, + 0x315E, 0x8139, 0xAD38, + 0x315F, 0x8139, 0xAD39, + 0x3160, 0x8139, 0xAE30, + 0x3161, 0x8139, 0xAE31, + 0x3162, 0x8139, 0xAE32, + 0x3163, 0x8139, 0xAE33, + 0x3164, 0x8139, 0xAE34, + 0x3165, 0x8139, 0xAE35, + 0x3166, 0x8139, 0xAE36, + 0x3167, 0x8139, 0xAE37, + 0x3168, 0x8139, 0xAE38, + 0x3169, 0x8139, 0xAE39, + 0x316A, 0x8139, 0xAF30, + 0x316B, 0x8139, 0xAF31, + 0x316C, 0x8139, 0xAF32, + 0x316D, 0x8139, 0xAF33, + 0x316E, 0x8139, 0xAF34, + 0x316F, 0x8139, 0xAF35, + 0x3170, 0x8139, 0xAF36, + 0x3171, 0x8139, 0xAF37, + 0x3172, 0x8139, 0xAF38, + 0x3173, 0x8139, 0xAF39, + 0x3174, 0x8139, 0xB030, + 0x3175, 0x8139, 0xB031, + 0x3176, 0x8139, 0xB032, + 0x3177, 0x8139, 0xB033, + 0x3178, 0x8139, 0xB034, + 0x3179, 0x8139, 0xB035, + 0x317A, 0x8139, 0xB036, + 0x317B, 0x8139, 0xB037, + 0x317C, 0x8139, 0xB038, + 0x317D, 0x8139, 0xB039, + 0x317E, 0x8139, 0xB130, + 0x317F, 0x8139, 0xB131, + 0x3180, 0x8139, 0xB132, + 0x3181, 0x8139, 0xB133, + 0x3182, 0x8139, 0xB134, + 0x3183, 0x8139, 0xB135, + 0x3184, 0x8139, 0xB136, + 0x3185, 0x8139, 0xB137, + 0x3186, 0x8139, 0xB138, + 0x3187, 0x8139, 0xB139, + 0x3188, 0x8139, 0xB230, + 0x3189, 0x8139, 0xB231, + 0x318A, 0x8139, 0xB232, + 0x318B, 0x8139, 0xB233, + 0x318C, 0x8139, 0xB234, + 0x318D, 0x8139, 0xB235, + 0x318E, 0x8139, 0xB236, + 0x318F, 0x8139, 0xB237, + 0x3190, 0x8139, 0xB238, + 0x3191, 0x8139, 0xB239, + 0x3192, 0x8139, 0xB330, + 0x3193, 0x8139, 0xB331, + 0x3194, 0x8139, 0xB332, + 0x3195, 0x8139, 0xB333, + 0x3196, 0x8139, 0xB334, + 0x3197, 0x8139, 0xB335, + 0x3198, 0x8139, 0xB336, + 0x3199, 0x8139, 0xB337, + 0x319A, 0x8139, 0xB338, + 0x319B, 0x8139, 0xB339, + 0x319C, 0x8139, 0xB430, + 0x319D, 0x8139, 0xB431, + 0x319E, 0x8139, 0xB432, + 0x319F, 0x8139, 0xB433, + 0x31A0, 0x8139, 0xB434, + 0x31A1, 0x8139, 0xB435, + 0x31A2, 0x8139, 0xB436, + 0x31A3, 0x8139, 0xB437, + 0x31A4, 0x8139, 0xB438, + 0x31A5, 0x8139, 0xB439, + 0x31A6, 0x8139, 0xB530, + 0x31A7, 0x8139, 0xB531, + 0x31A8, 0x8139, 0xB532, + 0x31A9, 0x8139, 0xB533, + 0x31AA, 0x8139, 0xB534, + 0x31AB, 0x8139, 0xB535, + 0x31AC, 0x8139, 0xB536, + 0x31AD, 0x8139, 0xB537, + 0x31AE, 0x8139, 0xB538, + 0x31AF, 0x8139, 0xB539, + 0x31B0, 0x8139, 0xB630, + 0x31B1, 0x8139, 0xB631, + 0x31B2, 0x8139, 0xB632, + 0x31B3, 0x8139, 0xB633, + 0x31B4, 0x8139, 0xB634, + 0x31B5, 0x8139, 0xB635, + 0x31B6, 0x8139, 0xB636, + 0x31B7, 0x8139, 0xB637, + 0x31B8, 0x8139, 0xB638, + 0x31B9, 0x8139, 0xB639, + 0x31BA, 0x8139, 0xB730, + 0x31BB, 0x8139, 0xB731, + 0x31BC, 0x8139, 0xB732, + 0x31BD, 0x8139, 0xB733, + 0x31BE, 0x8139, 0xB734, + 0x31BF, 0x8139, 0xB735, + 0x31C0, 0x8139, 0xB736, + 0x31C1, 0x8139, 0xB737, + 0x31C2, 0x8139, 0xB738, + 0x31C3, 0x8139, 0xB739, + 0x31C4, 0x8139, 0xB830, + 0x31C5, 0x8139, 0xB831, + 0x31C6, 0x8139, 0xB832, + 0x31C7, 0x8139, 0xB833, + 0x31C8, 0x8139, 0xB834, + 0x31C9, 0x8139, 0xB835, + 0x31CA, 0x8139, 0xB836, + 0x31CB, 0x8139, 0xB837, + 0x31CC, 0x8139, 0xB838, + 0x31CD, 0x8139, 0xB839, + 0x31CE, 0x8139, 0xB930, + 0x31CF, 0x8139, 0xB931, + 0x31D0, 0x8139, 0xB932, + 0x31D1, 0x8139, 0xB933, + 0x31D2, 0x8139, 0xB934, + 0x31D3, 0x8139, 0xB935, + 0x31D4, 0x8139, 0xB936, + 0x31D5, 0x8139, 0xB937, + 0x31D6, 0x8139, 0xB938, + 0x31D7, 0x8139, 0xB939, + 0x31D8, 0x8139, 0xBA30, + 0x31D9, 0x8139, 0xBA31, + 0x31DA, 0x8139, 0xBA32, + 0x31DB, 0x8139, 0xBA33, + 0x31DC, 0x8139, 0xBA34, + 0x31DD, 0x8139, 0xBA35, + 0x31DE, 0x8139, 0xBA36, + 0x31DF, 0x8139, 0xBA37, + 0x31E0, 0x8139, 0xBA38, + 0x31E1, 0x8139, 0xBA39, + 0x31E2, 0x8139, 0xBB30, + 0x31E3, 0x8139, 0xBB31, + 0x31E4, 0x8139, 0xBB32, + 0x31E5, 0x8139, 0xBB33, + 0x31E6, 0x8139, 0xBB34, + 0x31E7, 0x8139, 0xBB35, + 0x31E8, 0x8139, 0xBB36, + 0x31E9, 0x8139, 0xBB37, + 0x31EA, 0x8139, 0xBB38, + 0x31EB, 0x8139, 0xBB39, + 0x31EC, 0x8139, 0xBC30, + 0x31ED, 0x8139, 0xBC31, + 0x31EE, 0x8139, 0xBC32, + 0x31EF, 0x8139, 0xBC33, + 0x31F0, 0x8139, 0xBC34, + 0x31F1, 0x8139, 0xBC35, + 0x31F2, 0x8139, 0xBC36, + 0x31F3, 0x8139, 0xBC37, + 0x31F4, 0x8139, 0xBC38, + 0x31F5, 0x8139, 0xBC39, + 0x31F6, 0x8139, 0xBD30, + 0x31F7, 0x8139, 0xBD31, + 0x31F8, 0x8139, 0xBD32, + 0x31F9, 0x8139, 0xBD33, + 0x31FA, 0x8139, 0xBD34, + 0x31FB, 0x8139, 0xBD35, + 0x31FC, 0x8139, 0xBD36, + 0x31FD, 0x8139, 0xBD37, + 0x31FE, 0x8139, 0xBD38, + 0x31FF, 0x8139, 0xBD39, + 0x3200, 0x8139, 0xBE30, + 0x3201, 0x8139, 0xBE31, + 0x3202, 0x8139, 0xBE32, + 0x3203, 0x8139, 0xBE33, + 0x3204, 0x8139, 0xBE34, + 0x3205, 0x8139, 0xBE35, + 0x3206, 0x8139, 0xBE36, + 0x3207, 0x8139, 0xBE37, + 0x3208, 0x8139, 0xBE38, + 0x3209, 0x8139, 0xBE39, + 0x320A, 0x8139, 0xBF30, + 0x320B, 0x8139, 0xBF31, + 0x320C, 0x8139, 0xBF32, + 0x320D, 0x8139, 0xBF33, + 0x320E, 0x8139, 0xBF34, + 0x320F, 0x8139, 0xBF35, + 0x3210, 0x8139, 0xBF36, + 0x3211, 0x8139, 0xBF37, + 0x3212, 0x8139, 0xBF38, + 0x3213, 0x8139, 0xBF39, + 0x3214, 0x8139, 0xC030, + 0x3215, 0x8139, 0xC031, + 0x3216, 0x8139, 0xC032, + 0x3217, 0x8139, 0xC033, + 0x3218, 0x8139, 0xC034, + 0x3219, 0x8139, 0xC035, + 0x321A, 0x8139, 0xC036, + 0x321B, 0x8139, 0xC037, + 0x321C, 0x8139, 0xC038, + 0x321D, 0x8139, 0xC039, + 0x321E, 0x8139, 0xC130, + 0x321F, 0x8139, 0xC131, + 0x322A, 0x8139, 0xC132, + 0x322B, 0x8139, 0xC133, + 0x322C, 0x8139, 0xC134, + 0x322D, 0x8139, 0xC135, + 0x322E, 0x8139, 0xC136, + 0x322F, 0x8139, 0xC137, + 0x3230, 0x8139, 0xC138, + 0x3232, 0x8139, 0xC139, + 0x3233, 0x8139, 0xC230, + 0x3234, 0x8139, 0xC231, + 0x3235, 0x8139, 0xC232, + 0x3236, 0x8139, 0xC233, + 0x3237, 0x8139, 0xC234, + 0x3238, 0x8139, 0xC235, + 0x3239, 0x8139, 0xC236, + 0x323A, 0x8139, 0xC237, + 0x323B, 0x8139, 0xC238, + 0x323C, 0x8139, 0xC239, + 0x323D, 0x8139, 0xC330, + 0x323E, 0x8139, 0xC331, + 0x323F, 0x8139, 0xC332, + 0x3240, 0x8139, 0xC333, + 0x3241, 0x8139, 0xC334, + 0x3242, 0x8139, 0xC335, + 0x3243, 0x8139, 0xC336, + 0x3244, 0x8139, 0xC337, + 0x3245, 0x8139, 0xC338, + 0x3246, 0x8139, 0xC339, + 0x3247, 0x8139, 0xC430, + 0x3248, 0x8139, 0xC431, + 0x3249, 0x8139, 0xC432, + 0x324A, 0x8139, 0xC433, + 0x324B, 0x8139, 0xC434, + 0x324C, 0x8139, 0xC435, + 0x324D, 0x8139, 0xC436, + 0x324E, 0x8139, 0xC437, + 0x324F, 0x8139, 0xC438, + 0x3250, 0x8139, 0xC439, + 0x3251, 0x8139, 0xC530, + 0x3252, 0x8139, 0xC531, + 0x3253, 0x8139, 0xC532, + 0x3254, 0x8139, 0xC533, + 0x3255, 0x8139, 0xC534, + 0x3256, 0x8139, 0xC535, + 0x3257, 0x8139, 0xC536, + 0x3258, 0x8139, 0xC537, + 0x3259, 0x8139, 0xC538, + 0x325A, 0x8139, 0xC539, + 0x325B, 0x8139, 0xC630, + 0x325C, 0x8139, 0xC631, + 0x325D, 0x8139, 0xC632, + 0x325E, 0x8139, 0xC633, + 0x325F, 0x8139, 0xC634, + 0x3260, 0x8139, 0xC635, + 0x3261, 0x8139, 0xC636, + 0x3262, 0x8139, 0xC637, + 0x3263, 0x8139, 0xC638, + 0x3264, 0x8139, 0xC639, + 0x3265, 0x8139, 0xC730, + 0x3266, 0x8139, 0xC731, + 0x3267, 0x8139, 0xC732, + 0x3268, 0x8139, 0xC733, + 0x3269, 0x8139, 0xC734, + 0x326A, 0x8139, 0xC735, + 0x326B, 0x8139, 0xC736, + 0x326C, 0x8139, 0xC737, + 0x326D, 0x8139, 0xC738, + 0x326E, 0x8139, 0xC739, + 0x326F, 0x8139, 0xC830, + 0x3270, 0x8139, 0xC831, + 0x3271, 0x8139, 0xC832, + 0x3272, 0x8139, 0xC833, + 0x3273, 0x8139, 0xC834, + 0x3274, 0x8139, 0xC835, + 0x3275, 0x8139, 0xC836, + 0x3276, 0x8139, 0xC837, + 0x3277, 0x8139, 0xC838, + 0x3278, 0x8139, 0xC839, + 0x3279, 0x8139, 0xC930, + 0x327A, 0x8139, 0xC931, + 0x327B, 0x8139, 0xC932, + 0x327C, 0x8139, 0xC933, + 0x327D, 0x8139, 0xC934, + 0x327E, 0x8139, 0xC935, + 0x327F, 0x8139, 0xC936, + 0x3280, 0x8139, 0xC937, + 0x3281, 0x8139, 0xC938, + 0x3282, 0x8139, 0xC939, + 0x3283, 0x8139, 0xCA30, + 0x3284, 0x8139, 0xCA31, + 0x3285, 0x8139, 0xCA32, + 0x3286, 0x8139, 0xCA33, + 0x3287, 0x8139, 0xCA34, + 0x3288, 0x8139, 0xCA35, + 0x3289, 0x8139, 0xCA36, + 0x328A, 0x8139, 0xCA37, + 0x328B, 0x8139, 0xCA38, + 0x328C, 0x8139, 0xCA39, + 0x328D, 0x8139, 0xCB30, + 0x328E, 0x8139, 0xCB31, + 0x328F, 0x8139, 0xCB32, + 0x3290, 0x8139, 0xCB33, + 0x3291, 0x8139, 0xCB34, + 0x3292, 0x8139, 0xCB35, + 0x3293, 0x8139, 0xCB36, + 0x3294, 0x8139, 0xCB37, + 0x3295, 0x8139, 0xCB38, + 0x3296, 0x8139, 0xCB39, + 0x3297, 0x8139, 0xCC30, + 0x3298, 0x8139, 0xCC31, + 0x3299, 0x8139, 0xCC32, + 0x329A, 0x8139, 0xCC33, + 0x329B, 0x8139, 0xCC34, + 0x329C, 0x8139, 0xCC35, + 0x329D, 0x8139, 0xCC36, + 0x329E, 0x8139, 0xCC37, + 0x329F, 0x8139, 0xCC38, + 0x32A0, 0x8139, 0xCC39, + 0x32A1, 0x8139, 0xCD30, + 0x32A2, 0x8139, 0xCD31, + 0x32A4, 0x8139, 0xCD32, + 0x32A5, 0x8139, 0xCD33, + 0x32A6, 0x8139, 0xCD34, + 0x32A7, 0x8139, 0xCD35, + 0x32A8, 0x8139, 0xCD36, + 0x32A9, 0x8139, 0xCD37, + 0x32AA, 0x8139, 0xCD38, + 0x32AB, 0x8139, 0xCD39, + 0x32AC, 0x8139, 0xCE30, + 0x32AD, 0x8139, 0xCE31, + 0x32AE, 0x8139, 0xCE32, + 0x32AF, 0x8139, 0xCE33, + 0x32B0, 0x8139, 0xCE34, + 0x32B1, 0x8139, 0xCE35, + 0x32B2, 0x8139, 0xCE36, + 0x32B3, 0x8139, 0xCE37, + 0x32B4, 0x8139, 0xCE38, + 0x32B5, 0x8139, 0xCE39, + 0x32B6, 0x8139, 0xCF30, + 0x32B7, 0x8139, 0xCF31, + 0x32B8, 0x8139, 0xCF32, + 0x32B9, 0x8139, 0xCF33, + 0x32BA, 0x8139, 0xCF34, + 0x32BB, 0x8139, 0xCF35, + 0x32BC, 0x8139, 0xCF36, + 0x32BD, 0x8139, 0xCF37, + 0x32BE, 0x8139, 0xCF38, + 0x32BF, 0x8139, 0xCF39, + 0x32C0, 0x8139, 0xD030, + 0x32C1, 0x8139, 0xD031, + 0x32C2, 0x8139, 0xD032, + 0x32C3, 0x8139, 0xD033, + 0x32C4, 0x8139, 0xD034, + 0x32C5, 0x8139, 0xD035, + 0x32C6, 0x8139, 0xD036, + 0x32C7, 0x8139, 0xD037, + 0x32C8, 0x8139, 0xD038, + 0x32C9, 0x8139, 0xD039, + 0x32CA, 0x8139, 0xD130, + 0x32CB, 0x8139, 0xD131, + 0x32CC, 0x8139, 0xD132, + 0x32CD, 0x8139, 0xD133, + 0x32CE, 0x8139, 0xD134, + 0x32CF, 0x8139, 0xD135, + 0x32D0, 0x8139, 0xD136, + 0x32D1, 0x8139, 0xD137, + 0x32D2, 0x8139, 0xD138, + 0x32D3, 0x8139, 0xD139, + 0x32D4, 0x8139, 0xD230, + 0x32D5, 0x8139, 0xD231, + 0x32D6, 0x8139, 0xD232, + 0x32D7, 0x8139, 0xD233, + 0x32D8, 0x8139, 0xD234, + 0x32D9, 0x8139, 0xD235, + 0x32DA, 0x8139, 0xD236, + 0x32DB, 0x8139, 0xD237, + 0x32DC, 0x8139, 0xD238, + 0x32DD, 0x8139, 0xD239, + 0x32DE, 0x8139, 0xD330, + 0x32DF, 0x8139, 0xD331, + 0x32E0, 0x8139, 0xD332, + 0x32E1, 0x8139, 0xD333, + 0x32E2, 0x8139, 0xD334, + 0x32E3, 0x8139, 0xD335, + 0x32E4, 0x8139, 0xD336, + 0x32E5, 0x8139, 0xD337, + 0x32E6, 0x8139, 0xD338, + 0x32E7, 0x8139, 0xD339, + 0x32E8, 0x8139, 0xD430, + 0x32E9, 0x8139, 0xD431, + 0x32EA, 0x8139, 0xD432, + 0x32EB, 0x8139, 0xD433, + 0x32EC, 0x8139, 0xD434, + 0x32ED, 0x8139, 0xD435, + 0x32EE, 0x8139, 0xD436, + 0x32EF, 0x8139, 0xD437, + 0x32F0, 0x8139, 0xD438, + 0x32F1, 0x8139, 0xD439, + 0x32F2, 0x8139, 0xD530, + 0x32F3, 0x8139, 0xD531, + 0x32F4, 0x8139, 0xD532, + 0x32F5, 0x8139, 0xD533, + 0x32F6, 0x8139, 0xD534, + 0x32F7, 0x8139, 0xD535, + 0x32F8, 0x8139, 0xD536, + 0x32F9, 0x8139, 0xD537, + 0x32FA, 0x8139, 0xD538, + 0x32FB, 0x8139, 0xD539, + 0x32FC, 0x8139, 0xD630, + 0x32FD, 0x8139, 0xD631, + 0x32FE, 0x8139, 0xD632, + 0x32FF, 0x8139, 0xD633, + 0x3300, 0x8139, 0xD634, + 0x3301, 0x8139, 0xD635, + 0x3302, 0x8139, 0xD636, + 0x3303, 0x8139, 0xD637, + 0x3304, 0x8139, 0xD638, + 0x3305, 0x8139, 0xD639, + 0x3306, 0x8139, 0xD730, + 0x3307, 0x8139, 0xD731, + 0x3308, 0x8139, 0xD732, + 0x3309, 0x8139, 0xD733, + 0x330A, 0x8139, 0xD734, + 0x330B, 0x8139, 0xD735, + 0x330C, 0x8139, 0xD736, + 0x330D, 0x8139, 0xD737, + 0x330E, 0x8139, 0xD738, + 0x330F, 0x8139, 0xD739, + 0x3310, 0x8139, 0xD830, + 0x3311, 0x8139, 0xD831, + 0x3312, 0x8139, 0xD832, + 0x3313, 0x8139, 0xD833, + 0x3314, 0x8139, 0xD834, + 0x3315, 0x8139, 0xD835, + 0x3316, 0x8139, 0xD836, + 0x3317, 0x8139, 0xD837, + 0x3318, 0x8139, 0xD838, + 0x3319, 0x8139, 0xD839, + 0x331A, 0x8139, 0xD930, + 0x331B, 0x8139, 0xD931, + 0x331C, 0x8139, 0xD932, + 0x331D, 0x8139, 0xD933, + 0x331E, 0x8139, 0xD934, + 0x331F, 0x8139, 0xD935, + 0x3320, 0x8139, 0xD936, + 0x3321, 0x8139, 0xD937, + 0x3322, 0x8139, 0xD938, + 0x3323, 0x8139, 0xD939, + 0x3324, 0x8139, 0xDA30, + 0x3325, 0x8139, 0xDA31, + 0x3326, 0x8139, 0xDA32, + 0x3327, 0x8139, 0xDA33, + 0x3328, 0x8139, 0xDA34, + 0x3329, 0x8139, 0xDA35, + 0x332A, 0x8139, 0xDA36, + 0x332B, 0x8139, 0xDA37, + 0x332C, 0x8139, 0xDA38, + 0x332D, 0x8139, 0xDA39, + 0x332E, 0x8139, 0xDB30, + 0x332F, 0x8139, 0xDB31, + 0x3330, 0x8139, 0xDB32, + 0x3331, 0x8139, 0xDB33, + 0x3332, 0x8139, 0xDB34, + 0x3333, 0x8139, 0xDB35, + 0x3334, 0x8139, 0xDB36, + 0x3335, 0x8139, 0xDB37, + 0x3336, 0x8139, 0xDB38, + 0x3337, 0x8139, 0xDB39, + 0x3338, 0x8139, 0xDC30, + 0x3339, 0x8139, 0xDC31, + 0x333A, 0x8139, 0xDC32, + 0x333B, 0x8139, 0xDC33, + 0x333C, 0x8139, 0xDC34, + 0x333D, 0x8139, 0xDC35, + 0x333E, 0x8139, 0xDC36, + 0x333F, 0x8139, 0xDC37, + 0x3340, 0x8139, 0xDC38, + 0x3341, 0x8139, 0xDC39, + 0x3342, 0x8139, 0xDD30, + 0x3343, 0x8139, 0xDD31, + 0x3344, 0x8139, 0xDD32, + 0x3345, 0x8139, 0xDD33, + 0x3346, 0x8139, 0xDD34, + 0x3347, 0x8139, 0xDD35, + 0x3348, 0x8139, 0xDD36, + 0x3349, 0x8139, 0xDD37, + 0x334A, 0x8139, 0xDD38, + 0x334B, 0x8139, 0xDD39, + 0x334C, 0x8139, 0xDE30, + 0x334D, 0x8139, 0xDE31, + 0x334E, 0x8139, 0xDE32, + 0x334F, 0x8139, 0xDE33, + 0x3350, 0x8139, 0xDE34, + 0x3351, 0x8139, 0xDE35, + 0x3352, 0x8139, 0xDE36, + 0x3353, 0x8139, 0xDE37, + 0x3354, 0x8139, 0xDE38, + 0x3355, 0x8139, 0xDE39, + 0x3356, 0x8139, 0xDF30, + 0x3357, 0x8139, 0xDF31, + 0x3358, 0x8139, 0xDF32, + 0x3359, 0x8139, 0xDF33, + 0x335A, 0x8139, 0xDF34, + 0x335B, 0x8139, 0xDF35, + 0x335C, 0x8139, 0xDF36, + 0x335D, 0x8139, 0xDF37, + 0x335E, 0x8139, 0xDF38, + 0x335F, 0x8139, 0xDF39, + 0x3360, 0x8139, 0xE030, + 0x3361, 0x8139, 0xE031, + 0x3362, 0x8139, 0xE032, + 0x3363, 0x8139, 0xE033, + 0x3364, 0x8139, 0xE034, + 0x3365, 0x8139, 0xE035, + 0x3366, 0x8139, 0xE036, + 0x3367, 0x8139, 0xE037, + 0x3368, 0x8139, 0xE038, + 0x3369, 0x8139, 0xE039, + 0x336A, 0x8139, 0xE130, + 0x336B, 0x8139, 0xE131, + 0x336C, 0x8139, 0xE132, + 0x336D, 0x8139, 0xE133, + 0x336E, 0x8139, 0xE134, + 0x336F, 0x8139, 0xE135, + 0x3370, 0x8139, 0xE136, + 0x3371, 0x8139, 0xE137, + 0x3372, 0x8139, 0xE138, + 0x3373, 0x8139, 0xE139, + 0x3374, 0x8139, 0xE230, + 0x3375, 0x8139, 0xE231, + 0x3376, 0x8139, 0xE232, + 0x3377, 0x8139, 0xE233, + 0x3378, 0x8139, 0xE234, + 0x3379, 0x8139, 0xE235, + 0x337A, 0x8139, 0xE236, + 0x337B, 0x8139, 0xE237, + 0x337C, 0x8139, 0xE238, + 0x337D, 0x8139, 0xE239, + 0x337E, 0x8139, 0xE330, + 0x337F, 0x8139, 0xE331, + 0x3380, 0x8139, 0xE332, + 0x3381, 0x8139, 0xE333, + 0x3382, 0x8139, 0xE334, + 0x3383, 0x8139, 0xE335, + 0x3384, 0x8139, 0xE336, + 0x3385, 0x8139, 0xE337, + 0x3386, 0x8139, 0xE338, + 0x3387, 0x8139, 0xE339, + 0x3388, 0x8139, 0xE430, + 0x3389, 0x8139, 0xE431, + 0x338A, 0x8139, 0xE432, + 0x338B, 0x8139, 0xE433, + 0x338C, 0x8139, 0xE434, + 0x338D, 0x8139, 0xE435, + 0x3390, 0x8139, 0xE436, + 0x3391, 0x8139, 0xE437, + 0x3392, 0x8139, 0xE438, + 0x3393, 0x8139, 0xE439, + 0x3394, 0x8139, 0xE530, + 0x3395, 0x8139, 0xE531, + 0x3396, 0x8139, 0xE532, + 0x3397, 0x8139, 0xE533, + 0x3398, 0x8139, 0xE534, + 0x3399, 0x8139, 0xE535, + 0x339A, 0x8139, 0xE536, + 0x339B, 0x8139, 0xE537, + 0x339F, 0x8139, 0xE538, + 0x33A0, 0x8139, 0xE539, + 0x33A2, 0x8139, 0xE630, + 0x33A3, 0x8139, 0xE631, + 0x33A4, 0x8139, 0xE632, + 0x33A5, 0x8139, 0xE633, + 0x33A6, 0x8139, 0xE634, + 0x33A7, 0x8139, 0xE635, + 0x33A8, 0x8139, 0xE636, + 0x33A9, 0x8139, 0xE637, + 0x33AA, 0x8139, 0xE638, + 0x33AB, 0x8139, 0xE639, + 0x33AC, 0x8139, 0xE730, + 0x33AD, 0x8139, 0xE731, + 0x33AE, 0x8139, 0xE732, + 0x33AF, 0x8139, 0xE733, + 0x33B0, 0x8139, 0xE734, + 0x33B1, 0x8139, 0xE735, + 0x33B2, 0x8139, 0xE736, + 0x33B3, 0x8139, 0xE737, + 0x33B4, 0x8139, 0xE738, + 0x33B5, 0x8139, 0xE739, + 0x33B6, 0x8139, 0xE830, + 0x33B7, 0x8139, 0xE831, + 0x33B8, 0x8139, 0xE832, + 0x33B9, 0x8139, 0xE833, + 0x33BA, 0x8139, 0xE834, + 0x33BB, 0x8139, 0xE835, + 0x33BC, 0x8139, 0xE836, + 0x33BD, 0x8139, 0xE837, + 0x33BE, 0x8139, 0xE838, + 0x33BF, 0x8139, 0xE839, + 0x33C0, 0x8139, 0xE930, + 0x33C1, 0x8139, 0xE931, + 0x33C2, 0x8139, 0xE932, + 0x33C3, 0x8139, 0xE933, + 0x33C5, 0x8139, 0xE934, + 0x33C6, 0x8139, 0xE935, + 0x33C7, 0x8139, 0xE936, + 0x33C8, 0x8139, 0xE937, + 0x33C9, 0x8139, 0xE938, + 0x33CA, 0x8139, 0xE939, + 0x33CB, 0x8139, 0xEA30, + 0x33CC, 0x8139, 0xEA31, + 0x33CD, 0x8139, 0xEA32, + 0x33CF, 0x8139, 0xEA33, + 0x33D0, 0x8139, 0xEA34, + 0x33D3, 0x8139, 0xEA35, + 0x33D4, 0x8139, 0xEA36, + 0x33D6, 0x8139, 0xEA37, + 0x33D7, 0x8139, 0xEA38, + 0x33D8, 0x8139, 0xEA39, + 0x33D9, 0x8139, 0xEB30, + 0x33DA, 0x8139, 0xEB31, + 0x33DB, 0x8139, 0xEB32, + 0x33DC, 0x8139, 0xEB33, + 0x33DD, 0x8139, 0xEB34, + 0x33DE, 0x8139, 0xEB35, + 0x33DF, 0x8139, 0xEB36, + 0x33E0, 0x8139, 0xEB37, + 0x33E1, 0x8139, 0xEB38, + 0x33E2, 0x8139, 0xEB39, + 0x33E3, 0x8139, 0xEC30, + 0x33E4, 0x8139, 0xEC31, + 0x33E5, 0x8139, 0xEC32, + 0x33E6, 0x8139, 0xEC33, + 0x33E7, 0x8139, 0xEC34, + 0x33E8, 0x8139, 0xEC35, + 0x33E9, 0x8139, 0xEC36, + 0x33EA, 0x8139, 0xEC37, + 0x33EB, 0x8139, 0xEC38, + 0x33EC, 0x8139, 0xEC39, + 0x33ED, 0x8139, 0xED30, + 0x33EE, 0x8139, 0xED31, + 0x33EF, 0x8139, 0xED32, + 0x33F0, 0x8139, 0xED33, + 0x33F1, 0x8139, 0xED34, + 0x33F2, 0x8139, 0xED35, + 0x33F3, 0x8139, 0xED36, + 0x33F4, 0x8139, 0xED37, + 0x33F5, 0x8139, 0xED38, + 0x33F6, 0x8139, 0xED39, + 0x33F7, 0x8139, 0xEE30, + 0x33F8, 0x8139, 0xEE31, + 0x33F9, 0x8139, 0xEE32, + 0x33FA, 0x8139, 0xEE33, + 0x33FB, 0x8139, 0xEE34, + 0x33FC, 0x8139, 0xEE35, + 0x33FD, 0x8139, 0xEE36, + 0x33FE, 0x8139, 0xEE37, + 0x33FF, 0x8139, 0xEE38, + 0x3400, 0x8139, 0xEE39, + 0x3401, 0x8139, 0xEF30, + 0x3402, 0x8139, 0xEF31, + 0x3403, 0x8139, 0xEF32, + 0x3404, 0x8139, 0xEF33, + 0x3405, 0x8139, 0xEF34, + 0x3406, 0x8139, 0xEF35, + 0x3407, 0x8139, 0xEF36, + 0x3408, 0x8139, 0xEF37, + 0x3409, 0x8139, 0xEF38, + 0x340A, 0x8139, 0xEF39, + 0x340B, 0x8139, 0xF030, + 0x340C, 0x8139, 0xF031, + 0x340D, 0x8139, 0xF032, + 0x340E, 0x8139, 0xF033, + 0x340F, 0x8139, 0xF034, + 0x3410, 0x8139, 0xF035, + 0x3411, 0x8139, 0xF036, + 0x3412, 0x8139, 0xF037, + 0x3413, 0x8139, 0xF038, + 0x3414, 0x8139, 0xF039, + 0x3415, 0x8139, 0xF130, + 0x3416, 0x8139, 0xF131, + 0x3417, 0x8139, 0xF132, + 0x3418, 0x8139, 0xF133, + 0x3419, 0x8139, 0xF134, + 0x341A, 0x8139, 0xF135, + 0x341B, 0x8139, 0xF136, + 0x341C, 0x8139, 0xF137, + 0x341D, 0x8139, 0xF138, + 0x341E, 0x8139, 0xF139, + 0x341F, 0x8139, 0xF230, + 0x3420, 0x8139, 0xF231, + 0x3421, 0x8139, 0xF232, + 0x3422, 0x8139, 0xF233, + 0x3423, 0x8139, 0xF234, + 0x3424, 0x8139, 0xF235, + 0x3425, 0x8139, 0xF236, + 0x3426, 0x8139, 0xF237, + 0x3427, 0x8139, 0xF238, + 0x3428, 0x8139, 0xF239, + 0x3429, 0x8139, 0xF330, + 0x342A, 0x8139, 0xF331, + 0x342B, 0x8139, 0xF332, + 0x342C, 0x8139, 0xF333, + 0x342D, 0x8139, 0xF334, + 0x342E, 0x8139, 0xF335, + 0x342F, 0x8139, 0xF336, + 0x3430, 0x8139, 0xF337, + 0x3431, 0x8139, 0xF338, + 0x3432, 0x8139, 0xF339, + 0x3433, 0x8139, 0xF430, + 0x3434, 0x8139, 0xF431, + 0x3435, 0x8139, 0xF432, + 0x3436, 0x8139, 0xF433, + 0x3437, 0x8139, 0xF434, + 0x3438, 0x8139, 0xF435, + 0x3439, 0x8139, 0xF436, + 0x343A, 0x8139, 0xF437, + 0x343B, 0x8139, 0xF438, + 0x343C, 0x8139, 0xF439, + 0x343D, 0x8139, 0xF530, + 0x343E, 0x8139, 0xF531, + 0x343F, 0x8139, 0xF532, + 0x3440, 0x8139, 0xF533, + 0x3441, 0x8139, 0xF534, + 0x3442, 0x8139, 0xF535, + 0x3443, 0x8139, 0xF536, + 0x3444, 0x8139, 0xF537, + 0x3445, 0x8139, 0xF538, + 0x3446, 0x8139, 0xF539, + 0x3448, 0x8139, 0xF630, + 0x3449, 0x8139, 0xF631, + 0x344A, 0x8139, 0xF632, + 0x344B, 0x8139, 0xF633, + 0x344C, 0x8139, 0xF634, + 0x344D, 0x8139, 0xF635, + 0x344E, 0x8139, 0xF636, + 0x344F, 0x8139, 0xF637, + 0x3450, 0x8139, 0xF638, + 0x3451, 0x8139, 0xF639, + 0x3452, 0x8139, 0xF730, + 0x3453, 0x8139, 0xF731, + 0x3454, 0x8139, 0xF732, + 0x3455, 0x8139, 0xF733, + 0x3456, 0x8139, 0xF734, + 0x3457, 0x8139, 0xF735, + 0x3458, 0x8139, 0xF736, + 0x3459, 0x8139, 0xF737, + 0x345A, 0x8139, 0xF738, + 0x345B, 0x8139, 0xF739, + 0x345C, 0x8139, 0xF830, + 0x345D, 0x8139, 0xF831, + 0x345E, 0x8139, 0xF832, + 0x345F, 0x8139, 0xF833, + 0x3460, 0x8139, 0xF834, + 0x3461, 0x8139, 0xF835, + 0x3462, 0x8139, 0xF836, + 0x3463, 0x8139, 0xF837, + 0x3464, 0x8139, 0xF838, + 0x3465, 0x8139, 0xF839, + 0x3466, 0x8139, 0xF930, + 0x3467, 0x8139, 0xF931, + 0x3468, 0x8139, 0xF932, + 0x3469, 0x8139, 0xF933, + 0x346A, 0x8139, 0xF934, + 0x346B, 0x8139, 0xF935, + 0x346C, 0x8139, 0xF936, + 0x346D, 0x8139, 0xF937, + 0x346E, 0x8139, 0xF938, + 0x346F, 0x8139, 0xF939, + 0x3470, 0x8139, 0xFA30, + 0x3471, 0x8139, 0xFA31, + 0x3472, 0x8139, 0xFA32, + 0x3474, 0x8139, 0xFA33, + 0x3475, 0x8139, 0xFA34, + 0x3476, 0x8139, 0xFA35, + 0x3477, 0x8139, 0xFA36, + 0x3478, 0x8139, 0xFA37, + 0x3479, 0x8139, 0xFA38, + 0x347A, 0x8139, 0xFA39, + 0x347B, 0x8139, 0xFB30, + 0x347C, 0x8139, 0xFB31, + 0x347D, 0x8139, 0xFB32, + 0x347E, 0x8139, 0xFB33, + 0x347F, 0x8139, 0xFB34, + 0x3480, 0x8139, 0xFB35, + 0x3481, 0x8139, 0xFB36, + 0x3482, 0x8139, 0xFB37, + 0x3483, 0x8139, 0xFB38, + 0x3484, 0x8139, 0xFB39, + 0x3485, 0x8139, 0xFC30, + 0x3486, 0x8139, 0xFC31, + 0x3487, 0x8139, 0xFC32, + 0x3488, 0x8139, 0xFC33, + 0x3489, 0x8139, 0xFC34, + 0x348A, 0x8139, 0xFC35, + 0x348B, 0x8139, 0xFC36, + 0x348C, 0x8139, 0xFC37, + 0x348D, 0x8139, 0xFC38, + 0x348E, 0x8139, 0xFC39, + 0x348F, 0x8139, 0xFD30, + 0x3490, 0x8139, 0xFD31, + 0x3491, 0x8139, 0xFD32, + 0x3492, 0x8139, 0xFD33, + 0x3493, 0x8139, 0xFD34, + 0x3494, 0x8139, 0xFD35, + 0x3495, 0x8139, 0xFD36, + 0x3496, 0x8139, 0xFD37, + 0x3497, 0x8139, 0xFD38, + 0x3498, 0x8139, 0xFD39, + 0x3499, 0x8139, 0xFE30, + 0x349A, 0x8139, 0xFE31, + 0x349B, 0x8139, 0xFE32, + 0x349C, 0x8139, 0xFE33, + 0x349D, 0x8139, 0xFE34, + 0x349E, 0x8139, 0xFE35, + 0x349F, 0x8139, 0xFE36, + 0x34A0, 0x8139, 0xFE37, + 0x34A1, 0x8139, 0xFE38, + 0x34A2, 0x8139, 0xFE39, + 0x34A3, 0x8230, 0x8130, + 0x34A4, 0x8230, 0x8131, + 0x34A5, 0x8230, 0x8132, + 0x34A6, 0x8230, 0x8133, + 0x34A7, 0x8230, 0x8134, + 0x34A8, 0x8230, 0x8135, + 0x34A9, 0x8230, 0x8136, + 0x34AA, 0x8230, 0x8137, + 0x34AB, 0x8230, 0x8138, + 0x34AC, 0x8230, 0x8139, + 0x34AD, 0x8230, 0x8230, + 0x34AE, 0x8230, 0x8231, + 0x34AF, 0x8230, 0x8232, + 0x34B0, 0x8230, 0x8233, + 0x34B1, 0x8230, 0x8234, + 0x34B2, 0x8230, 0x8235, + 0x34B3, 0x8230, 0x8236, + 0x34B4, 0x8230, 0x8237, + 0x34B5, 0x8230, 0x8238, + 0x34B6, 0x8230, 0x8239, + 0x34B7, 0x8230, 0x8330, + 0x34B8, 0x8230, 0x8331, + 0x34B9, 0x8230, 0x8332, + 0x34BA, 0x8230, 0x8333, + 0x34BB, 0x8230, 0x8334, + 0x34BC, 0x8230, 0x8335, + 0x34BD, 0x8230, 0x8336, + 0x34BE, 0x8230, 0x8337, + 0x34BF, 0x8230, 0x8338, + 0x34C0, 0x8230, 0x8339, + 0x34C1, 0x8230, 0x8430, + 0x34C2, 0x8230, 0x8431, + 0x34C3, 0x8230, 0x8432, + 0x34C4, 0x8230, 0x8433, + 0x34C5, 0x8230, 0x8434, + 0x34C6, 0x8230, 0x8435, + 0x34C7, 0x8230, 0x8436, + 0x34C8, 0x8230, 0x8437, + 0x34C9, 0x8230, 0x8438, + 0x34CA, 0x8230, 0x8439, + 0x34CB, 0x8230, 0x8530, + 0x34CC, 0x8230, 0x8531, + 0x34CD, 0x8230, 0x8532, + 0x34CE, 0x8230, 0x8533, + 0x34CF, 0x8230, 0x8534, + 0x34D0, 0x8230, 0x8535, + 0x34D1, 0x8230, 0x8536, + 0x34D2, 0x8230, 0x8537, + 0x34D3, 0x8230, 0x8538, + 0x34D4, 0x8230, 0x8539, + 0x34D5, 0x8230, 0x8630, + 0x34D6, 0x8230, 0x8631, + 0x34D7, 0x8230, 0x8632, + 0x34D8, 0x8230, 0x8633, + 0x34D9, 0x8230, 0x8634, + 0x34DA, 0x8230, 0x8635, + 0x34DB, 0x8230, 0x8636, + 0x34DC, 0x8230, 0x8637, + 0x34DD, 0x8230, 0x8638, + 0x34DE, 0x8230, 0x8639, + 0x34DF, 0x8230, 0x8730, + 0x34E0, 0x8230, 0x8731, + 0x34E1, 0x8230, 0x8732, + 0x34E2, 0x8230, 0x8733, + 0x34E3, 0x8230, 0x8734, + 0x34E4, 0x8230, 0x8735, + 0x34E5, 0x8230, 0x8736, + 0x34E6, 0x8230, 0x8737, + 0x34E7, 0x8230, 0x8738, + 0x34E8, 0x8230, 0x8739, + 0x34E9, 0x8230, 0x8830, + 0x34EA, 0x8230, 0x8831, + 0x34EB, 0x8230, 0x8832, + 0x34EC, 0x8230, 0x8833, + 0x34ED, 0x8230, 0x8834, + 0x34EE, 0x8230, 0x8835, + 0x34EF, 0x8230, 0x8836, + 0x34F0, 0x8230, 0x8837, + 0x34F1, 0x8230, 0x8838, + 0x34F2, 0x8230, 0x8839, + 0x34F3, 0x8230, 0x8930, + 0x34F4, 0x8230, 0x8931, + 0x34F5, 0x8230, 0x8932, + 0x34F6, 0x8230, 0x8933, + 0x34F7, 0x8230, 0x8934, + 0x34F8, 0x8230, 0x8935, + 0x34F9, 0x8230, 0x8936, + 0x34FA, 0x8230, 0x8937, + 0x34FB, 0x8230, 0x8938, + 0x34FC, 0x8230, 0x8939, + 0x34FD, 0x8230, 0x8A30, + 0x34FE, 0x8230, 0x8A31, + 0x34FF, 0x8230, 0x8A32, + 0x3500, 0x8230, 0x8A33, + 0x3501, 0x8230, 0x8A34, + 0x3502, 0x8230, 0x8A35, + 0x3503, 0x8230, 0x8A36, + 0x3504, 0x8230, 0x8A37, + 0x3505, 0x8230, 0x8A38, + 0x3506, 0x8230, 0x8A39, + 0x3507, 0x8230, 0x8B30, + 0x3508, 0x8230, 0x8B31, + 0x3509, 0x8230, 0x8B32, + 0x350A, 0x8230, 0x8B33, + 0x350B, 0x8230, 0x8B34, + 0x350C, 0x8230, 0x8B35, + 0x350D, 0x8230, 0x8B36, + 0x350E, 0x8230, 0x8B37, + 0x350F, 0x8230, 0x8B38, + 0x3510, 0x8230, 0x8B39, + 0x3511, 0x8230, 0x8C30, + 0x3512, 0x8230, 0x8C31, + 0x3513, 0x8230, 0x8C32, + 0x3514, 0x8230, 0x8C33, + 0x3515, 0x8230, 0x8C34, + 0x3516, 0x8230, 0x8C35, + 0x3517, 0x8230, 0x8C36, + 0x3518, 0x8230, 0x8C37, + 0x3519, 0x8230, 0x8C38, + 0x351A, 0x8230, 0x8C39, + 0x351B, 0x8230, 0x8D30, + 0x351C, 0x8230, 0x8D31, + 0x351D, 0x8230, 0x8D32, + 0x351E, 0x8230, 0x8D33, + 0x351F, 0x8230, 0x8D34, + 0x3520, 0x8230, 0x8D35, + 0x3521, 0x8230, 0x8D36, + 0x3522, 0x8230, 0x8D37, + 0x3523, 0x8230, 0x8D38, + 0x3524, 0x8230, 0x8D39, + 0x3525, 0x8230, 0x8E30, + 0x3526, 0x8230, 0x8E31, + 0x3527, 0x8230, 0x8E32, + 0x3528, 0x8230, 0x8E33, + 0x3529, 0x8230, 0x8E34, + 0x352A, 0x8230, 0x8E35, + 0x352B, 0x8230, 0x8E36, + 0x352C, 0x8230, 0x8E37, + 0x352D, 0x8230, 0x8E38, + 0x352E, 0x8230, 0x8E39, + 0x352F, 0x8230, 0x8F30, + 0x3530, 0x8230, 0x8F31, + 0x3531, 0x8230, 0x8F32, + 0x3532, 0x8230, 0x8F33, + 0x3533, 0x8230, 0x8F34, + 0x3534, 0x8230, 0x8F35, + 0x3535, 0x8230, 0x8F36, + 0x3536, 0x8230, 0x8F37, + 0x3537, 0x8230, 0x8F38, + 0x3538, 0x8230, 0x8F39, + 0x3539, 0x8230, 0x9030, + 0x353A, 0x8230, 0x9031, + 0x353B, 0x8230, 0x9032, + 0x353C, 0x8230, 0x9033, + 0x353D, 0x8230, 0x9034, + 0x353E, 0x8230, 0x9035, + 0x353F, 0x8230, 0x9036, + 0x3540, 0x8230, 0x9037, + 0x3541, 0x8230, 0x9038, + 0x3542, 0x8230, 0x9039, + 0x3543, 0x8230, 0x9130, + 0x3544, 0x8230, 0x9131, + 0x3545, 0x8230, 0x9132, + 0x3546, 0x8230, 0x9133, + 0x3547, 0x8230, 0x9134, + 0x3548, 0x8230, 0x9135, + 0x3549, 0x8230, 0x9136, + 0x354A, 0x8230, 0x9137, + 0x354B, 0x8230, 0x9138, + 0x354C, 0x8230, 0x9139, + 0x354D, 0x8230, 0x9230, + 0x354E, 0x8230, 0x9231, + 0x354F, 0x8230, 0x9232, + 0x3550, 0x8230, 0x9233, + 0x3551, 0x8230, 0x9234, + 0x3552, 0x8230, 0x9235, + 0x3553, 0x8230, 0x9236, + 0x3554, 0x8230, 0x9237, + 0x3555, 0x8230, 0x9238, + 0x3556, 0x8230, 0x9239, + 0x3557, 0x8230, 0x9330, + 0x3558, 0x8230, 0x9331, + 0x3559, 0x8230, 0x9332, + 0x355A, 0x8230, 0x9333, + 0x355B, 0x8230, 0x9334, + 0x355C, 0x8230, 0x9335, + 0x355D, 0x8230, 0x9336, + 0x355E, 0x8230, 0x9337, + 0x355F, 0x8230, 0x9338, + 0x3560, 0x8230, 0x9339, + 0x3561, 0x8230, 0x9430, + 0x3562, 0x8230, 0x9431, + 0x3563, 0x8230, 0x9432, + 0x3564, 0x8230, 0x9433, + 0x3565, 0x8230, 0x9434, + 0x3566, 0x8230, 0x9435, + 0x3567, 0x8230, 0x9436, + 0x3568, 0x8230, 0x9437, + 0x3569, 0x8230, 0x9438, + 0x356A, 0x8230, 0x9439, + 0x356B, 0x8230, 0x9530, + 0x356C, 0x8230, 0x9531, + 0x356D, 0x8230, 0x9532, + 0x356E, 0x8230, 0x9533, + 0x356F, 0x8230, 0x9534, + 0x3570, 0x8230, 0x9535, + 0x3571, 0x8230, 0x9536, + 0x3572, 0x8230, 0x9537, + 0x3573, 0x8230, 0x9538, + 0x3574, 0x8230, 0x9539, + 0x3575, 0x8230, 0x9630, + 0x3576, 0x8230, 0x9631, + 0x3577, 0x8230, 0x9632, + 0x3578, 0x8230, 0x9633, + 0x3579, 0x8230, 0x9634, + 0x357A, 0x8230, 0x9635, + 0x357B, 0x8230, 0x9636, + 0x357C, 0x8230, 0x9637, + 0x357D, 0x8230, 0x9638, + 0x357E, 0x8230, 0x9639, + 0x357F, 0x8230, 0x9730, + 0x3580, 0x8230, 0x9731, + 0x3581, 0x8230, 0x9732, + 0x3582, 0x8230, 0x9733, + 0x3583, 0x8230, 0x9734, + 0x3584, 0x8230, 0x9735, + 0x3585, 0x8230, 0x9736, + 0x3586, 0x8230, 0x9737, + 0x3587, 0x8230, 0x9738, + 0x3588, 0x8230, 0x9739, + 0x3589, 0x8230, 0x9830, + 0x358A, 0x8230, 0x9831, + 0x358B, 0x8230, 0x9832, + 0x358C, 0x8230, 0x9833, + 0x358D, 0x8230, 0x9834, + 0x358E, 0x8230, 0x9835, + 0x358F, 0x8230, 0x9836, + 0x3590, 0x8230, 0x9837, + 0x3591, 0x8230, 0x9838, + 0x3592, 0x8230, 0x9839, + 0x3593, 0x8230, 0x9930, + 0x3594, 0x8230, 0x9931, + 0x3595, 0x8230, 0x9932, + 0x3596, 0x8230, 0x9933, + 0x3597, 0x8230, 0x9934, + 0x3598, 0x8230, 0x9935, + 0x3599, 0x8230, 0x9936, + 0x359A, 0x8230, 0x9937, + 0x359B, 0x8230, 0x9938, + 0x359C, 0x8230, 0x9939, + 0x359D, 0x8230, 0x9A30, + 0x359F, 0x8230, 0x9A31, + 0x35A0, 0x8230, 0x9A32, + 0x35A1, 0x8230, 0x9A33, + 0x35A2, 0x8230, 0x9A34, + 0x35A3, 0x8230, 0x9A35, + 0x35A4, 0x8230, 0x9A36, + 0x35A5, 0x8230, 0x9A37, + 0x35A6, 0x8230, 0x9A38, + 0x35A7, 0x8230, 0x9A39, + 0x35A8, 0x8230, 0x9B30, + 0x35A9, 0x8230, 0x9B31, + 0x35AA, 0x8230, 0x9B32, + 0x35AB, 0x8230, 0x9B33, + 0x35AC, 0x8230, 0x9B34, + 0x35AD, 0x8230, 0x9B35, + 0x35AE, 0x8230, 0x9B36, + 0x35AF, 0x8230, 0x9B37, + 0x35B0, 0x8230, 0x9B38, + 0x35B1, 0x8230, 0x9B39, + 0x35B2, 0x8230, 0x9C30, + 0x35B3, 0x8230, 0x9C31, + 0x35B4, 0x8230, 0x9C32, + 0x35B5, 0x8230, 0x9C33, + 0x35B6, 0x8230, 0x9C34, + 0x35B7, 0x8230, 0x9C35, + 0x35B8, 0x8230, 0x9C36, + 0x35B9, 0x8230, 0x9C37, + 0x35BA, 0x8230, 0x9C38, + 0x35BB, 0x8230, 0x9C39, + 0x35BC, 0x8230, 0x9D30, + 0x35BD, 0x8230, 0x9D31, + 0x35BE, 0x8230, 0x9D32, + 0x35BF, 0x8230, 0x9D33, + 0x35C0, 0x8230, 0x9D34, + 0x35C1, 0x8230, 0x9D35, + 0x35C2, 0x8230, 0x9D36, + 0x35C3, 0x8230, 0x9D37, + 0x35C4, 0x8230, 0x9D38, + 0x35C5, 0x8230, 0x9D39, + 0x35C6, 0x8230, 0x9E30, + 0x35C7, 0x8230, 0x9E31, + 0x35C8, 0x8230, 0x9E32, + 0x35C9, 0x8230, 0x9E33, + 0x35CA, 0x8230, 0x9E34, + 0x35CB, 0x8230, 0x9E35, + 0x35CC, 0x8230, 0x9E36, + 0x35CD, 0x8230, 0x9E37, + 0x35CE, 0x8230, 0x9E38, + 0x35CF, 0x8230, 0x9E39, + 0x35D0, 0x8230, 0x9F30, + 0x35D1, 0x8230, 0x9F31, + 0x35D2, 0x8230, 0x9F32, + 0x35D3, 0x8230, 0x9F33, + 0x35D4, 0x8230, 0x9F34, + 0x35D5, 0x8230, 0x9F35, + 0x35D6, 0x8230, 0x9F36, + 0x35D7, 0x8230, 0x9F37, + 0x35D8, 0x8230, 0x9F38, + 0x35D9, 0x8230, 0x9F39, + 0x35DA, 0x8230, 0xA030, + 0x35DB, 0x8230, 0xA031, + 0x35DC, 0x8230, 0xA032, + 0x35DD, 0x8230, 0xA033, + 0x35DE, 0x8230, 0xA034, + 0x35DF, 0x8230, 0xA035, + 0x35E0, 0x8230, 0xA036, + 0x35E1, 0x8230, 0xA037, + 0x35E2, 0x8230, 0xA038, + 0x35E3, 0x8230, 0xA039, + 0x35E4, 0x8230, 0xA130, + 0x35E5, 0x8230, 0xA131, + 0x35E6, 0x8230, 0xA132, + 0x35E7, 0x8230, 0xA133, + 0x35E8, 0x8230, 0xA134, + 0x35E9, 0x8230, 0xA135, + 0x35EA, 0x8230, 0xA136, + 0x35EB, 0x8230, 0xA137, + 0x35EC, 0x8230, 0xA138, + 0x35ED, 0x8230, 0xA139, + 0x35EE, 0x8230, 0xA230, + 0x35EF, 0x8230, 0xA231, + 0x35F0, 0x8230, 0xA232, + 0x35F1, 0x8230, 0xA233, + 0x35F2, 0x8230, 0xA234, + 0x35F3, 0x8230, 0xA235, + 0x35F4, 0x8230, 0xA236, + 0x35F5, 0x8230, 0xA237, + 0x35F6, 0x8230, 0xA238, + 0x35F7, 0x8230, 0xA239, + 0x35F8, 0x8230, 0xA330, + 0x35F9, 0x8230, 0xA331, + 0x35FA, 0x8230, 0xA332, + 0x35FB, 0x8230, 0xA333, + 0x35FC, 0x8230, 0xA334, + 0x35FD, 0x8230, 0xA335, + 0x35FE, 0x8230, 0xA336, + 0x35FF, 0x8230, 0xA337, + 0x3600, 0x8230, 0xA338, + 0x3601, 0x8230, 0xA339, + 0x3602, 0x8230, 0xA430, + 0x3603, 0x8230, 0xA431, + 0x3604, 0x8230, 0xA432, + 0x3605, 0x8230, 0xA433, + 0x3606, 0x8230, 0xA434, + 0x3607, 0x8230, 0xA435, + 0x3608, 0x8230, 0xA436, + 0x3609, 0x8230, 0xA437, + 0x360A, 0x8230, 0xA438, + 0x360B, 0x8230, 0xA439, + 0x360C, 0x8230, 0xA530, + 0x360D, 0x8230, 0xA531, + 0x360F, 0x8230, 0xA532, + 0x3610, 0x8230, 0xA533, + 0x3611, 0x8230, 0xA534, + 0x3612, 0x8230, 0xA535, + 0x3613, 0x8230, 0xA536, + 0x3614, 0x8230, 0xA537, + 0x3615, 0x8230, 0xA538, + 0x3616, 0x8230, 0xA539, + 0x3617, 0x8230, 0xA630, + 0x3618, 0x8230, 0xA631, + 0x3619, 0x8230, 0xA632, + 0x3919, 0x8230, 0xF238, + 0x391A, 0x8230, 0xF239, + 0x391B, 0x8230, 0xF330, + 0x391C, 0x8230, 0xF331, + 0x391D, 0x8230, 0xF332, + 0x391E, 0x8230, 0xF333, + 0x391F, 0x8230, 0xF334, + 0x3920, 0x8230, 0xF335, + 0x3921, 0x8230, 0xF336, + 0x3922, 0x8230, 0xF337, + 0x3923, 0x8230, 0xF338, + 0x3924, 0x8230, 0xF339, + 0x3925, 0x8230, 0xF430, + 0x3926, 0x8230, 0xF431, + 0x3927, 0x8230, 0xF432, + 0x3928, 0x8230, 0xF433, + 0x3929, 0x8230, 0xF434, + 0x392A, 0x8230, 0xF435, + 0x392B, 0x8230, 0xF436, + 0x392C, 0x8230, 0xF437, + 0x392D, 0x8230, 0xF438, + 0x392E, 0x8230, 0xF439, + 0x392F, 0x8230, 0xF530, + 0x3930, 0x8230, 0xF531, + 0x3931, 0x8230, 0xF532, + 0x3932, 0x8230, 0xF533, + 0x3933, 0x8230, 0xF534, + 0x3934, 0x8230, 0xF535, + 0x3935, 0x8230, 0xF536, + 0x3936, 0x8230, 0xF537, + 0x3937, 0x8230, 0xF538, + 0x3938, 0x8230, 0xF539, + 0x3939, 0x8230, 0xF630, + 0x393A, 0x8230, 0xF631, + 0x393B, 0x8230, 0xF632, + 0x393C, 0x8230, 0xF633, + 0x393D, 0x8230, 0xF634, + 0x393E, 0x8230, 0xF635, + 0x393F, 0x8230, 0xF636, + 0x3940, 0x8230, 0xF637, + 0x3941, 0x8230, 0xF638, + 0x3942, 0x8230, 0xF639, + 0x3943, 0x8230, 0xF730, + 0x3944, 0x8230, 0xF731, + 0x3945, 0x8230, 0xF732, + 0x3946, 0x8230, 0xF733, + 0x3947, 0x8230, 0xF734, + 0x3948, 0x8230, 0xF735, + 0x3949, 0x8230, 0xF736, + 0x394A, 0x8230, 0xF737, + 0x394B, 0x8230, 0xF738, + 0x394C, 0x8230, 0xF739, + 0x394D, 0x8230, 0xF830, + 0x394E, 0x8230, 0xF831, + 0x394F, 0x8230, 0xF832, + 0x3950, 0x8230, 0xF833, + 0x3951, 0x8230, 0xF834, + 0x3952, 0x8230, 0xF835, + 0x3953, 0x8230, 0xF836, + 0x3954, 0x8230, 0xF837, + 0x3955, 0x8230, 0xF838, + 0x3956, 0x8230, 0xF839, + 0x3957, 0x8230, 0xF930, + 0x3958, 0x8230, 0xF931, + 0x3959, 0x8230, 0xF932, + 0x395A, 0x8230, 0xF933, + 0x395B, 0x8230, 0xF934, + 0x395C, 0x8230, 0xF935, + 0x395D, 0x8230, 0xF936, + 0x395E, 0x8230, 0xF937, + 0x395F, 0x8230, 0xF938, + 0x3960, 0x8230, 0xF939, + 0x3961, 0x8230, 0xFA30, + 0x3962, 0x8230, 0xFA31, + 0x3963, 0x8230, 0xFA32, + 0x3964, 0x8230, 0xFA33, + 0x3965, 0x8230, 0xFA34, + 0x3966, 0x8230, 0xFA35, + 0x3967, 0x8230, 0xFA36, + 0x3968, 0x8230, 0xFA37, + 0x3969, 0x8230, 0xFA38, + 0x396A, 0x8230, 0xFA39, + 0x396B, 0x8230, 0xFB30, + 0x396C, 0x8230, 0xFB31, + 0x396D, 0x8230, 0xFB32, + 0x396F, 0x8230, 0xFB33, + 0x3970, 0x8230, 0xFB34, + 0x3971, 0x8230, 0xFB35, + 0x3972, 0x8230, 0xFB36, + 0x3973, 0x8230, 0xFB37, + 0x3974, 0x8230, 0xFB38, + 0x3975, 0x8230, 0xFB39, + 0x3976, 0x8230, 0xFC30, + 0x3977, 0x8230, 0xFC31, + 0x3978, 0x8230, 0xFC32, + 0x3979, 0x8230, 0xFC33, + 0x397A, 0x8230, 0xFC34, + 0x397B, 0x8230, 0xFC35, + 0x397C, 0x8230, 0xFC36, + 0x397D, 0x8230, 0xFC37, + 0x397E, 0x8230, 0xFC38, + 0x397F, 0x8230, 0xFC39, + 0x3980, 0x8230, 0xFD30, + 0x3981, 0x8230, 0xFD31, + 0x3982, 0x8230, 0xFD32, + 0x3983, 0x8230, 0xFD33, + 0x3984, 0x8230, 0xFD34, + 0x3985, 0x8230, 0xFD35, + 0x3986, 0x8230, 0xFD36, + 0x3987, 0x8230, 0xFD37, + 0x3988, 0x8230, 0xFD38, + 0x3989, 0x8230, 0xFD39, + 0x398A, 0x8230, 0xFE30, + 0x398B, 0x8230, 0xFE31, + 0x398C, 0x8230, 0xFE32, + 0x398D, 0x8230, 0xFE33, + 0x398E, 0x8230, 0xFE34, + 0x398F, 0x8230, 0xFE35, + 0x3990, 0x8230, 0xFE36, + 0x3991, 0x8230, 0xFE37, + 0x3992, 0x8230, 0xFE38, + 0x3993, 0x8230, 0xFE39, + 0x3994, 0x8231, 0x8130, + 0x3995, 0x8231, 0x8131, + 0x3996, 0x8231, 0x8132, + 0x3997, 0x8231, 0x8133, + 0x3998, 0x8231, 0x8134, + 0x3999, 0x8231, 0x8135, + 0x399A, 0x8231, 0x8136, + 0x399B, 0x8231, 0x8137, + 0x399C, 0x8231, 0x8138, + 0x399D, 0x8231, 0x8139, + 0x399E, 0x8231, 0x8230, + 0x399F, 0x8231, 0x8231, + 0x39A0, 0x8231, 0x8232, + 0x39A1, 0x8231, 0x8233, + 0x39A2, 0x8231, 0x8234, + 0x39A3, 0x8231, 0x8235, + 0x39A4, 0x8231, 0x8236, + 0x39A5, 0x8231, 0x8237, + 0x39A6, 0x8231, 0x8238, + 0x39A7, 0x8231, 0x8239, + 0x39A8, 0x8231, 0x8330, + 0x39A9, 0x8231, 0x8331, + 0x39AA, 0x8231, 0x8332, + 0x39AB, 0x8231, 0x8333, + 0x39AC, 0x8231, 0x8334, + 0x39AD, 0x8231, 0x8335, + 0x39AE, 0x8231, 0x8336, + 0x39AF, 0x8231, 0x8337, + 0x39B0, 0x8231, 0x8338, + 0x39B1, 0x8231, 0x8339, + 0x39B2, 0x8231, 0x8430, + 0x39B3, 0x8231, 0x8431, + 0x39B4, 0x8231, 0x8432, + 0x39B5, 0x8231, 0x8433, + 0x39B6, 0x8231, 0x8434, + 0x39B7, 0x8231, 0x8435, + 0x39B8, 0x8231, 0x8436, + 0x39B9, 0x8231, 0x8437, + 0x39BA, 0x8231, 0x8438, + 0x39BB, 0x8231, 0x8439, + 0x39BC, 0x8231, 0x8530, + 0x39BD, 0x8231, 0x8531, + 0x39BE, 0x8231, 0x8532, + 0x39BF, 0x8231, 0x8533, + 0x39C0, 0x8231, 0x8534, + 0x39C1, 0x8231, 0x8535, + 0x39C2, 0x8231, 0x8536, + 0x39C3, 0x8231, 0x8537, + 0x39C4, 0x8231, 0x8538, + 0x39C5, 0x8231, 0x8539, + 0x39C6, 0x8231, 0x8630, + 0x39C7, 0x8231, 0x8631, + 0x39C8, 0x8231, 0x8632, + 0x39C9, 0x8231, 0x8633, + 0x39CA, 0x8231, 0x8634, + 0x39CB, 0x8231, 0x8635, + 0x39CC, 0x8231, 0x8636, + 0x39CD, 0x8231, 0x8637, + 0x39CE, 0x8231, 0x8638, + 0x39D1, 0x8231, 0x8639, + 0x39D2, 0x8231, 0x8730, + 0x39D3, 0x8231, 0x8731, + 0x39D4, 0x8231, 0x8732, + 0x39D5, 0x8231, 0x8733, + 0x39D6, 0x8231, 0x8734, + 0x39D7, 0x8231, 0x8735, + 0x39D8, 0x8231, 0x8736, + 0x39D9, 0x8231, 0x8737, + 0x39DA, 0x8231, 0x8738, + 0x39DB, 0x8231, 0x8739, + 0x39DC, 0x8231, 0x8830, + 0x39DD, 0x8231, 0x8831, + 0x39DE, 0x8231, 0x8832, + 0x39E0, 0x8231, 0x8833, + 0x39E1, 0x8231, 0x8834, + 0x39E2, 0x8231, 0x8835, + 0x39E3, 0x8231, 0x8836, + 0x39E4, 0x8231, 0x8837, + 0x39E5, 0x8231, 0x8838, + 0x39E6, 0x8231, 0x8839, + 0x39E7, 0x8231, 0x8930, + 0x39E8, 0x8231, 0x8931, + 0x39E9, 0x8231, 0x8932, + 0x39EA, 0x8231, 0x8933, + 0x39EB, 0x8231, 0x8934, + 0x39EC, 0x8231, 0x8935, + 0x39ED, 0x8231, 0x8936, + 0x39EE, 0x8231, 0x8937, + 0x39EF, 0x8231, 0x8938, + 0x39F0, 0x8231, 0x8939, + 0x39F1, 0x8231, 0x8A30, + 0x39F2, 0x8231, 0x8A31, + 0x39F3, 0x8231, 0x8A32, + 0x39F4, 0x8231, 0x8A33, + 0x39F5, 0x8231, 0x8A34, + 0x39F6, 0x8231, 0x8A35, + 0x39F7, 0x8231, 0x8A36, + 0x39F8, 0x8231, 0x8A37, + 0x39F9, 0x8231, 0x8A38, + 0x39FA, 0x8231, 0x8A39, + 0x39FB, 0x8231, 0x8B30, + 0x39FC, 0x8231, 0x8B31, + 0x39FD, 0x8231, 0x8B32, + 0x39FE, 0x8231, 0x8B33, + 0x39FF, 0x8231, 0x8B34, + 0x3A00, 0x8231, 0x8B35, + 0x3A01, 0x8231, 0x8B36, + 0x3A02, 0x8231, 0x8B37, + 0x3A03, 0x8231, 0x8B38, + 0x3A04, 0x8231, 0x8B39, + 0x3A05, 0x8231, 0x8C30, + 0x3A06, 0x8231, 0x8C31, + 0x3A07, 0x8231, 0x8C32, + 0x3A08, 0x8231, 0x8C33, + 0x3A09, 0x8231, 0x8C34, + 0x3A0A, 0x8231, 0x8C35, + 0x3A0B, 0x8231, 0x8C36, + 0x3A0C, 0x8231, 0x8C37, + 0x3A0D, 0x8231, 0x8C38, + 0x3A0E, 0x8231, 0x8C39, + 0x3A0F, 0x8231, 0x8D30, + 0x3A10, 0x8231, 0x8D31, + 0x3A11, 0x8231, 0x8D32, + 0x3A12, 0x8231, 0x8D33, + 0x3A13, 0x8231, 0x8D34, + 0x3A14, 0x8231, 0x8D35, + 0x3A15, 0x8231, 0x8D36, + 0x3A16, 0x8231, 0x8D37, + 0x3A17, 0x8231, 0x8D38, + 0x3A18, 0x8231, 0x8D39, + 0x3A19, 0x8231, 0x8E30, + 0x3A1A, 0x8231, 0x8E31, + 0x3A1B, 0x8231, 0x8E32, + 0x3A1C, 0x8231, 0x8E33, + 0x3A1D, 0x8231, 0x8E34, + 0x3A1E, 0x8231, 0x8E35, + 0x3A1F, 0x8231, 0x8E36, + 0x3A20, 0x8231, 0x8E37, + 0x3A21, 0x8231, 0x8E38, + 0x3A22, 0x8231, 0x8E39, + 0x3A23, 0x8231, 0x8F30, + 0x3A24, 0x8231, 0x8F31, + 0x3A25, 0x8231, 0x8F32, + 0x3A26, 0x8231, 0x8F33, + 0x3A27, 0x8231, 0x8F34, + 0x3A28, 0x8231, 0x8F35, + 0x3A29, 0x8231, 0x8F36, + 0x3A2A, 0x8231, 0x8F37, + 0x3A2B, 0x8231, 0x8F38, + 0x3A2C, 0x8231, 0x8F39, + 0x3A2D, 0x8231, 0x9030, + 0x3A2E, 0x8231, 0x9031, + 0x3A2F, 0x8231, 0x9032, + 0x3A30, 0x8231, 0x9033, + 0x3A31, 0x8231, 0x9034, + 0x3A32, 0x8231, 0x9035, + 0x3A33, 0x8231, 0x9036, + 0x3A34, 0x8231, 0x9037, + 0x3A35, 0x8231, 0x9038, + 0x3A36, 0x8231, 0x9039, + 0x3A37, 0x8231, 0x9130, + 0x3A38, 0x8231, 0x9131, + 0x3A39, 0x8231, 0x9132, + 0x3A3A, 0x8231, 0x9133, + 0x3A3B, 0x8231, 0x9134, + 0x3A3C, 0x8231, 0x9135, + 0x3A3D, 0x8231, 0x9136, + 0x3A3E, 0x8231, 0x9137, + 0x3A3F, 0x8231, 0x9138, + 0x3A40, 0x8231, 0x9139, + 0x3A41, 0x8231, 0x9230, + 0x3A42, 0x8231, 0x9231, + 0x3A43, 0x8231, 0x9232, + 0x3A44, 0x8231, 0x9233, + 0x3A45, 0x8231, 0x9234, + 0x3A46, 0x8231, 0x9235, + 0x3A47, 0x8231, 0x9236, + 0x3A48, 0x8231, 0x9237, + 0x3A49, 0x8231, 0x9238, + 0x3A4A, 0x8231, 0x9239, + 0x3A4B, 0x8231, 0x9330, + 0x3A4C, 0x8231, 0x9331, + 0x3A4D, 0x8231, 0x9332, + 0x3A4E, 0x8231, 0x9333, + 0x3A4F, 0x8231, 0x9334, + 0x3A50, 0x8231, 0x9335, + 0x3A51, 0x8231, 0x9336, + 0x3A52, 0x8231, 0x9337, + 0x3A53, 0x8231, 0x9338, + 0x3A54, 0x8231, 0x9339, + 0x3A55, 0x8231, 0x9430, + 0x3A56, 0x8231, 0x9431, + 0x3A57, 0x8231, 0x9432, + 0x3A58, 0x8231, 0x9433, + 0x3A59, 0x8231, 0x9434, + 0x3A5A, 0x8231, 0x9435, + 0x3A5B, 0x8231, 0x9436, + 0x3A5C, 0x8231, 0x9437, + 0x3A5D, 0x8231, 0x9438, + 0x3A5E, 0x8231, 0x9439, + 0x3A5F, 0x8231, 0x9530, + 0x3A60, 0x8231, 0x9531, + 0x3A61, 0x8231, 0x9532, + 0x3A62, 0x8231, 0x9533, + 0x3A63, 0x8231, 0x9534, + 0x3A64, 0x8231, 0x9535, + 0x3A65, 0x8231, 0x9536, + 0x3A66, 0x8231, 0x9537, + 0x3A67, 0x8231, 0x9538, + 0x3A68, 0x8231, 0x9539, + 0x3A69, 0x8231, 0x9630, + 0x3A6A, 0x8231, 0x9631, + 0x3A6B, 0x8231, 0x9632, + 0x3A6C, 0x8231, 0x9633, + 0x3A6D, 0x8231, 0x9634, + 0x3A6E, 0x8231, 0x9635, + 0x3A6F, 0x8231, 0x9636, + 0x3A70, 0x8231, 0x9637, + 0x3A71, 0x8231, 0x9638, + 0x3A72, 0x8231, 0x9639, + 0x3A74, 0x8231, 0x9730, + 0x3A75, 0x8231, 0x9731, + 0x3A76, 0x8231, 0x9732, + 0x3A77, 0x8231, 0x9733, + 0x3A78, 0x8231, 0x9734, + 0x3A79, 0x8231, 0x9735, + 0x3A7A, 0x8231, 0x9736, + 0x3A7B, 0x8231, 0x9737, + 0x3A7C, 0x8231, 0x9738, + 0x3A7D, 0x8231, 0x9739, + 0x3A7E, 0x8231, 0x9830, + 0x3A7F, 0x8231, 0x9831, + 0x3A80, 0x8231, 0x9832, + 0x3A81, 0x8231, 0x9833, + 0x3A82, 0x8231, 0x9834, + 0x3A83, 0x8231, 0x9835, + 0x3A84, 0x8231, 0x9836, + 0x3A85, 0x8231, 0x9837, + 0x3A86, 0x8231, 0x9838, + 0x3A87, 0x8231, 0x9839, + 0x3A88, 0x8231, 0x9930, + 0x3A89, 0x8231, 0x9931, + 0x3A8A, 0x8231, 0x9932, + 0x3A8B, 0x8231, 0x9933, + 0x3A8C, 0x8231, 0x9934, + 0x3A8D, 0x8231, 0x9935, + 0x3A8E, 0x8231, 0x9936, + 0x3A8F, 0x8231, 0x9937, + 0x3A90, 0x8231, 0x9938, + 0x3A91, 0x8231, 0x9939, + 0x3A92, 0x8231, 0x9A30, + 0x3A93, 0x8231, 0x9A31, + 0x3A94, 0x8231, 0x9A32, + 0x3A95, 0x8231, 0x9A33, + 0x3A96, 0x8231, 0x9A34, + 0x3A97, 0x8231, 0x9A35, + 0x3A98, 0x8231, 0x9A36, + 0x3A99, 0x8231, 0x9A37, + 0x3A9A, 0x8231, 0x9A38, + 0x3A9B, 0x8231, 0x9A39, + 0x3A9C, 0x8231, 0x9B30, + 0x3A9D, 0x8231, 0x9B31, + 0x3A9E, 0x8231, 0x9B32, + 0x3A9F, 0x8231, 0x9B33, + 0x3AA0, 0x8231, 0x9B34, + 0x3AA1, 0x8231, 0x9B35, + 0x3AA2, 0x8231, 0x9B36, + 0x3AA3, 0x8231, 0x9B37, + 0x3AA4, 0x8231, 0x9B38, + 0x3AA5, 0x8231, 0x9B39, + 0x3AA6, 0x8231, 0x9C30, + 0x3AA7, 0x8231, 0x9C31, + 0x3AA8, 0x8231, 0x9C32, + 0x3AA9, 0x8231, 0x9C33, + 0x3AAA, 0x8231, 0x9C34, + 0x3AAB, 0x8231, 0x9C35, + 0x3AAC, 0x8231, 0x9C36, + 0x3AAD, 0x8231, 0x9C37, + 0x3AAE, 0x8231, 0x9C38, + 0x3AAF, 0x8231, 0x9C39, + 0x3AB0, 0x8231, 0x9D30, + 0x3AB1, 0x8231, 0x9D31, + 0x3AB2, 0x8231, 0x9D32, + 0x3AB3, 0x8231, 0x9D33, + 0x3AB4, 0x8231, 0x9D34, + 0x3AB5, 0x8231, 0x9D35, + 0x3AB6, 0x8231, 0x9D36, + 0x3AB7, 0x8231, 0x9D37, + 0x3AB8, 0x8231, 0x9D38, + 0x3AB9, 0x8231, 0x9D39, + 0x3ABA, 0x8231, 0x9E30, + 0x3ABB, 0x8231, 0x9E31, + 0x3ABC, 0x8231, 0x9E32, + 0x3ABD, 0x8231, 0x9E33, + 0x3ABE, 0x8231, 0x9E34, + 0x3ABF, 0x8231, 0x9E35, + 0x3AC0, 0x8231, 0x9E36, + 0x3AC1, 0x8231, 0x9E37, + 0x3AC2, 0x8231, 0x9E38, + 0x3AC3, 0x8231, 0x9E39, + 0x3AC4, 0x8231, 0x9F30, + 0x3AC5, 0x8231, 0x9F31, + 0x3AC6, 0x8231, 0x9F32, + 0x3AC7, 0x8231, 0x9F33, + 0x3AC8, 0x8231, 0x9F34, + 0x3AC9, 0x8231, 0x9F35, + 0x3ACA, 0x8231, 0x9F36, + 0x3ACB, 0x8231, 0x9F37, + 0x3ACC, 0x8231, 0x9F38, + 0x3ACD, 0x8231, 0x9F39, + 0x3ACE, 0x8231, 0xA030, + 0x3ACF, 0x8231, 0xA031, + 0x3AD0, 0x8231, 0xA032, + 0x3AD1, 0x8231, 0xA033, + 0x3AD2, 0x8231, 0xA034, + 0x3AD3, 0x8231, 0xA035, + 0x3AD4, 0x8231, 0xA036, + 0x3AD5, 0x8231, 0xA037, + 0x3AD6, 0x8231, 0xA038, + 0x3AD7, 0x8231, 0xA039, + 0x3AD8, 0x8231, 0xA130, + 0x3AD9, 0x8231, 0xA131, + 0x3ADA, 0x8231, 0xA132, + 0x3ADB, 0x8231, 0xA133, + 0x3ADC, 0x8231, 0xA134, + 0x3ADD, 0x8231, 0xA135, + 0x3ADE, 0x8231, 0xA136, + 0x3ADF, 0x8231, 0xA137, + 0x3AE0, 0x8231, 0xA138, + 0x3AE1, 0x8231, 0xA139, + 0x3AE2, 0x8231, 0xA230, + 0x3AE3, 0x8231, 0xA231, + 0x3AE4, 0x8231, 0xA232, + 0x3AE5, 0x8231, 0xA233, + 0x3AE6, 0x8231, 0xA234, + 0x3AE7, 0x8231, 0xA235, + 0x3AE8, 0x8231, 0xA236, + 0x3AE9, 0x8231, 0xA237, + 0x3AEA, 0x8231, 0xA238, + 0x3AEB, 0x8231, 0xA239, + 0x3AEC, 0x8231, 0xA330, + 0x3AED, 0x8231, 0xA331, + 0x3AEE, 0x8231, 0xA332, + 0x3AEF, 0x8231, 0xA333, + 0x3AF0, 0x8231, 0xA334, + 0x3AF1, 0x8231, 0xA335, + 0x3AF2, 0x8231, 0xA336, + 0x3AF3, 0x8231, 0xA337, + 0x3AF4, 0x8231, 0xA338, + 0x3AF5, 0x8231, 0xA339, + 0x3AF6, 0x8231, 0xA430, + 0x3AF7, 0x8231, 0xA431, + 0x3AF8, 0x8231, 0xA432, + 0x3AF9, 0x8231, 0xA433, + 0x3AFA, 0x8231, 0xA434, + 0x3AFB, 0x8231, 0xA435, + 0x3AFC, 0x8231, 0xA436, + 0x3AFD, 0x8231, 0xA437, + 0x3AFE, 0x8231, 0xA438, + 0x3AFF, 0x8231, 0xA439, + 0x3B00, 0x8231, 0xA530, + 0x3B01, 0x8231, 0xA531, + 0x3B02, 0x8231, 0xA532, + 0x3B03, 0x8231, 0xA533, + 0x3B04, 0x8231, 0xA534, + 0x3B05, 0x8231, 0xA535, + 0x3B06, 0x8231, 0xA536, + 0x3B07, 0x8231, 0xA537, + 0x3B08, 0x8231, 0xA538, + 0x3B09, 0x8231, 0xA539, + 0x3B0A, 0x8231, 0xA630, + 0x3B0B, 0x8231, 0xA631, + 0x3B0C, 0x8231, 0xA632, + 0x3B0D, 0x8231, 0xA633, + 0x3B0E, 0x8231, 0xA634, + 0x3B0F, 0x8231, 0xA635, + 0x3B10, 0x8231, 0xA636, + 0x3B11, 0x8231, 0xA637, + 0x3B12, 0x8231, 0xA638, + 0x3B13, 0x8231, 0xA639, + 0x3B14, 0x8231, 0xA730, + 0x3B15, 0x8231, 0xA731, + 0x3B16, 0x8231, 0xA732, + 0x3B17, 0x8231, 0xA733, + 0x3B18, 0x8231, 0xA734, + 0x3B19, 0x8231, 0xA735, + 0x3B1A, 0x8231, 0xA736, + 0x3B1B, 0x8231, 0xA737, + 0x3B1C, 0x8231, 0xA738, + 0x3B1D, 0x8231, 0xA739, + 0x3B1E, 0x8231, 0xA830, + 0x3B1F, 0x8231, 0xA831, + 0x3B20, 0x8231, 0xA832, + 0x3B21, 0x8231, 0xA833, + 0x3B22, 0x8231, 0xA834, + 0x3B23, 0x8231, 0xA835, + 0x3B24, 0x8231, 0xA836, + 0x3B25, 0x8231, 0xA837, + 0x3B26, 0x8231, 0xA838, + 0x3B27, 0x8231, 0xA839, + 0x3B28, 0x8231, 0xA930, + 0x3B29, 0x8231, 0xA931, + 0x3B2A, 0x8231, 0xA932, + 0x3B2B, 0x8231, 0xA933, + 0x3B2C, 0x8231, 0xA934, + 0x3B2D, 0x8231, 0xA935, + 0x3B2E, 0x8231, 0xA936, + 0x3B2F, 0x8231, 0xA937, + 0x3B30, 0x8231, 0xA938, + 0x3B31, 0x8231, 0xA939, + 0x3B32, 0x8231, 0xAA30, + 0x3B33, 0x8231, 0xAA31, + 0x3B34, 0x8231, 0xAA32, + 0x3B35, 0x8231, 0xAA33, + 0x3B36, 0x8231, 0xAA34, + 0x3B37, 0x8231, 0xAA35, + 0x3B38, 0x8231, 0xAA36, + 0x3B39, 0x8231, 0xAA37, + 0x3B3A, 0x8231, 0xAA38, + 0x3B3B, 0x8231, 0xAA39, + 0x3B3C, 0x8231, 0xAB30, + 0x3B3D, 0x8231, 0xAB31, + 0x3B3E, 0x8231, 0xAB32, + 0x3B3F, 0x8231, 0xAB33, + 0x3B40, 0x8231, 0xAB34, + 0x3B41, 0x8231, 0xAB35, + 0x3B42, 0x8231, 0xAB36, + 0x3B43, 0x8231, 0xAB37, + 0x3B44, 0x8231, 0xAB38, + 0x3B45, 0x8231, 0xAB39, + 0x3B46, 0x8231, 0xAC30, + 0x3B47, 0x8231, 0xAC31, + 0x3B48, 0x8231, 0xAC32, + 0x3B49, 0x8231, 0xAC33, + 0x3B4A, 0x8231, 0xAC34, + 0x3B4B, 0x8231, 0xAC35, + 0x3B4C, 0x8231, 0xAC36, + 0x3B4D, 0x8231, 0xAC37, + 0x3B4F, 0x8231, 0xAC38, + 0x3B50, 0x8231, 0xAC39, + 0x3B51, 0x8231, 0xAD30, + 0x3B52, 0x8231, 0xAD31, + 0x3B53, 0x8231, 0xAD32, + 0x3B54, 0x8231, 0xAD33, + 0x3B55, 0x8231, 0xAD34, + 0x3B56, 0x8231, 0xAD35, + 0x3B57, 0x8231, 0xAD36, + 0x3B58, 0x8231, 0xAD37, + 0x3B59, 0x8231, 0xAD38, + 0x3B5A, 0x8231, 0xAD39, + 0x3B5B, 0x8231, 0xAE30, + 0x3B5C, 0x8231, 0xAE31, + 0x3B5D, 0x8231, 0xAE32, + 0x3B5E, 0x8231, 0xAE33, + 0x3B5F, 0x8231, 0xAE34, + 0x3B60, 0x8231, 0xAE35, + 0x3B61, 0x8231, 0xAE36, + 0x3B62, 0x8231, 0xAE37, + 0x3B63, 0x8231, 0xAE38, + 0x3B64, 0x8231, 0xAE39, + 0x3B65, 0x8231, 0xAF30, + 0x3B66, 0x8231, 0xAF31, + 0x3B67, 0x8231, 0xAF32, + 0x3B68, 0x8231, 0xAF33, + 0x3B69, 0x8231, 0xAF34, + 0x3B6A, 0x8231, 0xAF35, + 0x3B6B, 0x8231, 0xAF36, + 0x3B6C, 0x8231, 0xAF37, + 0x3B6D, 0x8231, 0xAF38, + 0x3B6E, 0x8231, 0xAF39, + 0x3B6F, 0x8231, 0xB030, + 0x3B70, 0x8231, 0xB031, + 0x3B71, 0x8231, 0xB032, + 0x3B72, 0x8231, 0xB033, + 0x3B73, 0x8231, 0xB034, + 0x3B74, 0x8231, 0xB035, + 0x3B75, 0x8231, 0xB036, + 0x3B76, 0x8231, 0xB037, + 0x3B77, 0x8231, 0xB038, + 0x3B78, 0x8231, 0xB039, + 0x3B79, 0x8231, 0xB130, + 0x3B7A, 0x8231, 0xB131, + 0x3B7B, 0x8231, 0xB132, + 0x3B7C, 0x8231, 0xB133, + 0x3B7D, 0x8231, 0xB134, + 0x3B7E, 0x8231, 0xB135, + 0x3B7F, 0x8231, 0xB136, + 0x3B80, 0x8231, 0xB137, + 0x3B81, 0x8231, 0xB138, + 0x3B82, 0x8231, 0xB139, + 0x3B83, 0x8231, 0xB230, + 0x3B84, 0x8231, 0xB231, + 0x3B85, 0x8231, 0xB232, + 0x3B86, 0x8231, 0xB233, + 0x3B87, 0x8231, 0xB234, + 0x3B88, 0x8231, 0xB235, + 0x3B89, 0x8231, 0xB236, + 0x3B8A, 0x8231, 0xB237, + 0x3B8B, 0x8231, 0xB238, + 0x3B8C, 0x8231, 0xB239, + 0x3B8D, 0x8231, 0xB330, + 0x3B8E, 0x8231, 0xB331, + 0x3B8F, 0x8231, 0xB332, + 0x3B90, 0x8231, 0xB333, + 0x3B91, 0x8231, 0xB334, + 0x3B92, 0x8231, 0xB335, + 0x3B93, 0x8231, 0xB336, + 0x3B94, 0x8231, 0xB337, + 0x3B95, 0x8231, 0xB338, + 0x3B96, 0x8231, 0xB339, + 0x3B97, 0x8231, 0xB430, + 0x3B98, 0x8231, 0xB431, + 0x3B99, 0x8231, 0xB432, + 0x3B9A, 0x8231, 0xB433, + 0x3B9B, 0x8231, 0xB434, + 0x3B9C, 0x8231, 0xB435, + 0x3B9D, 0x8231, 0xB436, + 0x3B9E, 0x8231, 0xB437, + 0x3B9F, 0x8231, 0xB438, + 0x3BA0, 0x8231, 0xB439, + 0x3BA1, 0x8231, 0xB530, + 0x3BA2, 0x8231, 0xB531, + 0x3BA3, 0x8231, 0xB532, + 0x3BA4, 0x8231, 0xB533, + 0x3BA5, 0x8231, 0xB534, + 0x3BA6, 0x8231, 0xB535, + 0x3BA7, 0x8231, 0xB536, + 0x3BA8, 0x8231, 0xB537, + 0x3BA9, 0x8231, 0xB538, + 0x3BAA, 0x8231, 0xB539, + 0x3BAB, 0x8231, 0xB630, + 0x3BAC, 0x8231, 0xB631, + 0x3BAD, 0x8231, 0xB632, + 0x3BAE, 0x8231, 0xB633, + 0x3BAF, 0x8231, 0xB634, + 0x3BB0, 0x8231, 0xB635, + 0x3BB1, 0x8231, 0xB636, + 0x3BB2, 0x8231, 0xB637, + 0x3BB3, 0x8231, 0xB638, + 0x3BB4, 0x8231, 0xB639, + 0x3BB5, 0x8231, 0xB730, + 0x3BB6, 0x8231, 0xB731, + 0x3BB7, 0x8231, 0xB732, + 0x3BB8, 0x8231, 0xB733, + 0x3BB9, 0x8231, 0xB734, + 0x3BBA, 0x8231, 0xB735, + 0x3BBB, 0x8231, 0xB736, + 0x3BBC, 0x8231, 0xB737, + 0x3BBD, 0x8231, 0xB738, + 0x3BBE, 0x8231, 0xB739, + 0x3BBF, 0x8231, 0xB830, + 0x3BC0, 0x8231, 0xB831, + 0x3BC1, 0x8231, 0xB832, + 0x3BC2, 0x8231, 0xB833, + 0x3BC3, 0x8231, 0xB834, + 0x3BC4, 0x8231, 0xB835, + 0x3BC5, 0x8231, 0xB836, + 0x3BC6, 0x8231, 0xB837, + 0x3BC7, 0x8231, 0xB838, + 0x3BC8, 0x8231, 0xB839, + 0x3BC9, 0x8231, 0xB930, + 0x3BCA, 0x8231, 0xB931, + 0x3BCB, 0x8231, 0xB932, + 0x3BCC, 0x8231, 0xB933, + 0x3BCD, 0x8231, 0xB934, + 0x3BCE, 0x8231, 0xB935, + 0x3BCF, 0x8231, 0xB936, + 0x3BD0, 0x8231, 0xB937, + 0x3BD1, 0x8231, 0xB938, + 0x3BD2, 0x8231, 0xB939, + 0x3BD3, 0x8231, 0xBA30, + 0x3BD4, 0x8231, 0xBA31, + 0x3BD5, 0x8231, 0xBA32, + 0x3BD6, 0x8231, 0xBA33, + 0x3BD7, 0x8231, 0xBA34, + 0x3BD8, 0x8231, 0xBA35, + 0x3BD9, 0x8231, 0xBA36, + 0x3BDA, 0x8231, 0xBA37, + 0x3BDB, 0x8231, 0xBA38, + 0x3BDC, 0x8231, 0xBA39, + 0x3BDD, 0x8231, 0xBB30, + 0x3BDE, 0x8231, 0xBB31, + 0x3BDF, 0x8231, 0xBB32, + 0x3BE0, 0x8231, 0xBB33, + 0x3BE1, 0x8231, 0xBB34, + 0x3BE2, 0x8231, 0xBB35, + 0x3BE3, 0x8231, 0xBB36, + 0x3BE4, 0x8231, 0xBB37, + 0x3BE5, 0x8231, 0xBB38, + 0x3BE6, 0x8231, 0xBB39, + 0x3BE7, 0x8231, 0xBC30, + 0x3BE8, 0x8231, 0xBC31, + 0x3BE9, 0x8231, 0xBC32, + 0x3BEA, 0x8231, 0xBC33, + 0x3BEB, 0x8231, 0xBC34, + 0x3BEC, 0x8231, 0xBC35, + 0x3BED, 0x8231, 0xBC36, + 0x3BEE, 0x8231, 0xBC37, + 0x3BEF, 0x8231, 0xBC38, + 0x3BF0, 0x8231, 0xBC39, + 0x3BF1, 0x8231, 0xBD30, + 0x3BF2, 0x8231, 0xBD31, + 0x3BF3, 0x8231, 0xBD32, + 0x3BF4, 0x8231, 0xBD33, + 0x3BF5, 0x8231, 0xBD34, + 0x3BF6, 0x8231, 0xBD35, + 0x3BF7, 0x8231, 0xBD36, + 0x3BF8, 0x8231, 0xBD37, + 0x3BF9, 0x8231, 0xBD38, + 0x3BFA, 0x8231, 0xBD39, + 0x3BFB, 0x8231, 0xBE30, + 0x3BFC, 0x8231, 0xBE31, + 0x3BFD, 0x8231, 0xBE32, + 0x3BFE, 0x8231, 0xBE33, + 0x3BFF, 0x8231, 0xBE34, + 0x3C00, 0x8231, 0xBE35, + 0x3C01, 0x8231, 0xBE36, + 0x3C02, 0x8231, 0xBE37, + 0x3C03, 0x8231, 0xBE38, + 0x3C04, 0x8231, 0xBE39, + 0x3C05, 0x8231, 0xBF30, + 0x3C06, 0x8231, 0xBF31, + 0x3C07, 0x8231, 0xBF32, + 0x3C08, 0x8231, 0xBF33, + 0x3C09, 0x8231, 0xBF34, + 0x3C0A, 0x8231, 0xBF35, + 0x3C0B, 0x8231, 0xBF36, + 0x3C0C, 0x8231, 0xBF37, + 0x3C0D, 0x8231, 0xBF38, + 0x3C0E, 0x8231, 0xBF39, + 0x3C0F, 0x8231, 0xC030, + 0x3C10, 0x8231, 0xC031, + 0x3C11, 0x8231, 0xC032, + 0x3C12, 0x8231, 0xC033, + 0x3C13, 0x8231, 0xC034, + 0x3C14, 0x8231, 0xC035, + 0x3C15, 0x8231, 0xC036, + 0x3C16, 0x8231, 0xC037, + 0x3C17, 0x8231, 0xC038, + 0x3C18, 0x8231, 0xC039, + 0x3C19, 0x8231, 0xC130, + 0x3C1A, 0x8231, 0xC131, + 0x3C1B, 0x8231, 0xC132, + 0x3C1C, 0x8231, 0xC133, + 0x3C1D, 0x8231, 0xC134, + 0x3C1E, 0x8231, 0xC135, + 0x3C1F, 0x8231, 0xC136, + 0x3C20, 0x8231, 0xC137, + 0x3C21, 0x8231, 0xC138, + 0x3C22, 0x8231, 0xC139, + 0x3C23, 0x8231, 0xC230, + 0x3C24, 0x8231, 0xC231, + 0x3C25, 0x8231, 0xC232, + 0x3C26, 0x8231, 0xC233, + 0x3C27, 0x8231, 0xC234, + 0x3C28, 0x8231, 0xC235, + 0x3C29, 0x8231, 0xC236, + 0x3C2A, 0x8231, 0xC237, + 0x3C2B, 0x8231, 0xC238, + 0x3C2C, 0x8231, 0xC239, + 0x3C2D, 0x8231, 0xC330, + 0x3C2E, 0x8231, 0xC331, + 0x3C2F, 0x8231, 0xC332, + 0x3C30, 0x8231, 0xC333, + 0x3C31, 0x8231, 0xC334, + 0x3C32, 0x8231, 0xC335, + 0x3C33, 0x8231, 0xC336, + 0x3C34, 0x8231, 0xC337, + 0x3C35, 0x8231, 0xC338, + 0x3C36, 0x8231, 0xC339, + 0x3C37, 0x8231, 0xC430, + 0x3C38, 0x8231, 0xC431, + 0x3C39, 0x8231, 0xC432, + 0x3C3A, 0x8231, 0xC433, + 0x3C3B, 0x8231, 0xC434, + 0x3C3C, 0x8231, 0xC435, + 0x3C3D, 0x8231, 0xC436, + 0x3C3E, 0x8231, 0xC437, + 0x3C3F, 0x8231, 0xC438, + 0x3C40, 0x8231, 0xC439, + 0x3C41, 0x8231, 0xC530, + 0x3C42, 0x8231, 0xC531, + 0x3C43, 0x8231, 0xC532, + 0x3C44, 0x8231, 0xC533, + 0x3C45, 0x8231, 0xC534, + 0x3C46, 0x8231, 0xC535, + 0x3C47, 0x8231, 0xC536, + 0x3C48, 0x8231, 0xC537, + 0x3C49, 0x8231, 0xC538, + 0x3C4A, 0x8231, 0xC539, + 0x3C4B, 0x8231, 0xC630, + 0x3C4C, 0x8231, 0xC631, + 0x3C4D, 0x8231, 0xC632, + 0x3C4E, 0x8231, 0xC633, + 0x3C4F, 0x8231, 0xC634, + 0x3C50, 0x8231, 0xC635, + 0x3C51, 0x8231, 0xC636, + 0x3C52, 0x8231, 0xC637, + 0x3C53, 0x8231, 0xC638, + 0x3C54, 0x8231, 0xC639, + 0x3C55, 0x8231, 0xC730, + 0x3C56, 0x8231, 0xC731, + 0x3C57, 0x8231, 0xC732, + 0x3C58, 0x8231, 0xC733, + 0x3C59, 0x8231, 0xC734, + 0x3C5A, 0x8231, 0xC735, + 0x3C5B, 0x8231, 0xC736, + 0x3C5C, 0x8231, 0xC737, + 0x3C5D, 0x8231, 0xC738, + 0x3C5E, 0x8231, 0xC739, + 0x3C5F, 0x8231, 0xC830, + 0x3C60, 0x8231, 0xC831, + 0x3C61, 0x8231, 0xC832, + 0x3C62, 0x8231, 0xC833, + 0x3C63, 0x8231, 0xC834, + 0x3C64, 0x8231, 0xC835, + 0x3C65, 0x8231, 0xC836, + 0x3C66, 0x8231, 0xC837, + 0x3C67, 0x8231, 0xC838, + 0x3C68, 0x8231, 0xC839, + 0x3C69, 0x8231, 0xC930, + 0x3C6A, 0x8231, 0xC931, + 0x3C6B, 0x8231, 0xC932, + 0x3C6C, 0x8231, 0xC933, + 0x3C6D, 0x8231, 0xC934, + 0x3C6F, 0x8231, 0xC935, + 0x3C70, 0x8231, 0xC936, + 0x3C71, 0x8231, 0xC937, + 0x3C72, 0x8231, 0xC938, + 0x3C73, 0x8231, 0xC939, + 0x3C74, 0x8231, 0xCA30, + 0x3C75, 0x8231, 0xCA31, + 0x3C76, 0x8231, 0xCA32, + 0x3C77, 0x8231, 0xCA33, + 0x3C78, 0x8231, 0xCA34, + 0x3C79, 0x8231, 0xCA35, + 0x3C7A, 0x8231, 0xCA36, + 0x3C7B, 0x8231, 0xCA37, + 0x3C7C, 0x8231, 0xCA38, + 0x3C7D, 0x8231, 0xCA39, + 0x3C7E, 0x8231, 0xCB30, + 0x3C7F, 0x8231, 0xCB31, + 0x3C80, 0x8231, 0xCB32, + 0x3C81, 0x8231, 0xCB33, + 0x3C82, 0x8231, 0xCB34, + 0x3C83, 0x8231, 0xCB35, + 0x3C84, 0x8231, 0xCB36, + 0x3C85, 0x8231, 0xCB37, + 0x3C86, 0x8231, 0xCB38, + 0x3C87, 0x8231, 0xCB39, + 0x3C88, 0x8231, 0xCC30, + 0x3C89, 0x8231, 0xCC31, + 0x3C8A, 0x8231, 0xCC32, + 0x3C8B, 0x8231, 0xCC33, + 0x3C8C, 0x8231, 0xCC34, + 0x3C8D, 0x8231, 0xCC35, + 0x3C8E, 0x8231, 0xCC36, + 0x3C8F, 0x8231, 0xCC37, + 0x3C90, 0x8231, 0xCC38, + 0x3C91, 0x8231, 0xCC39, + 0x3C92, 0x8231, 0xCD30, + 0x3C93, 0x8231, 0xCD31, + 0x3C94, 0x8231, 0xCD32, + 0x3C95, 0x8231, 0xCD33, + 0x3C96, 0x8231, 0xCD34, + 0x3C97, 0x8231, 0xCD35, + 0x3C98, 0x8231, 0xCD36, + 0x3C99, 0x8231, 0xCD37, + 0x3C9A, 0x8231, 0xCD38, + 0x3C9B, 0x8231, 0xCD39, + 0x3C9C, 0x8231, 0xCE30, + 0x3C9D, 0x8231, 0xCE31, + 0x3C9E, 0x8231, 0xCE32, + 0x3C9F, 0x8231, 0xCE33, + 0x3CA0, 0x8231, 0xCE34, + 0x3CA1, 0x8231, 0xCE35, + 0x3CA2, 0x8231, 0xCE36, + 0x3CA3, 0x8231, 0xCE37, + 0x3CA4, 0x8231, 0xCE38, + 0x3CA5, 0x8231, 0xCE39, + 0x3CA6, 0x8231, 0xCF30, + 0x3CA7, 0x8231, 0xCF31, + 0x3CA8, 0x8231, 0xCF32, + 0x3CA9, 0x8231, 0xCF33, + 0x3CAA, 0x8231, 0xCF34, + 0x3CAB, 0x8231, 0xCF35, + 0x3CAC, 0x8231, 0xCF36, + 0x3CAD, 0x8231, 0xCF37, + 0x3CAE, 0x8231, 0xCF38, + 0x3CAF, 0x8231, 0xCF39, + 0x3CB0, 0x8231, 0xD030, + 0x3CB1, 0x8231, 0xD031, + 0x3CB2, 0x8231, 0xD032, + 0x3CB3, 0x8231, 0xD033, + 0x3CB4, 0x8231, 0xD034, + 0x3CB5, 0x8231, 0xD035, + 0x3CB6, 0x8231, 0xD036, + 0x3CB7, 0x8231, 0xD037, + 0x3CB8, 0x8231, 0xD038, + 0x3CB9, 0x8231, 0xD039, + 0x3CBA, 0x8231, 0xD130, + 0x3CBB, 0x8231, 0xD131, + 0x3CBC, 0x8231, 0xD132, + 0x3CBD, 0x8231, 0xD133, + 0x3CBE, 0x8231, 0xD134, + 0x3CBF, 0x8231, 0xD135, + 0x3CC0, 0x8231, 0xD136, + 0x3CC1, 0x8231, 0xD137, + 0x3CC2, 0x8231, 0xD138, + 0x3CC3, 0x8231, 0xD139, + 0x3CC4, 0x8231, 0xD230, + 0x3CC5, 0x8231, 0xD231, + 0x3CC6, 0x8231, 0xD232, + 0x3CC7, 0x8231, 0xD233, + 0x3CC8, 0x8231, 0xD234, + 0x3CC9, 0x8231, 0xD235, + 0x3CCA, 0x8231, 0xD236, + 0x3CCB, 0x8231, 0xD237, + 0x3CCC, 0x8231, 0xD238, + 0x3CCD, 0x8231, 0xD239, + 0x3CCE, 0x8231, 0xD330, + 0x3CCF, 0x8231, 0xD331, + 0x3CD0, 0x8231, 0xD332, + 0x3CD1, 0x8231, 0xD333, + 0x3CD2, 0x8231, 0xD334, + 0x3CD3, 0x8231, 0xD335, + 0x3CD4, 0x8231, 0xD336, + 0x3CD5, 0x8231, 0xD337, + 0x3CD6, 0x8231, 0xD338, + 0x3CD7, 0x8231, 0xD339, + 0x3CD8, 0x8231, 0xD430, + 0x3CD9, 0x8231, 0xD431, + 0x3CDA, 0x8231, 0xD432, + 0x3CDB, 0x8231, 0xD433, + 0x3CDC, 0x8231, 0xD434, + 0x3CDD, 0x8231, 0xD435, + 0x3CDE, 0x8231, 0xD436, + 0x3CDF, 0x8231, 0xD437, + 0x4057, 0x8232, 0xAF33, + 0x4058, 0x8232, 0xAF34, + 0x4059, 0x8232, 0xAF35, + 0x405A, 0x8232, 0xAF36, + 0x405B, 0x8232, 0xAF37, + 0x405C, 0x8232, 0xAF38, + 0x405D, 0x8232, 0xAF39, + 0x405E, 0x8232, 0xB030, + 0x405F, 0x8232, 0xB031, + 0x4060, 0x8232, 0xB032, + 0x4061, 0x8232, 0xB033, + 0x4062, 0x8232, 0xB034, + 0x4063, 0x8232, 0xB035, + 0x4064, 0x8232, 0xB036, + 0x4065, 0x8232, 0xB037, + 0x4066, 0x8232, 0xB038, + 0x4067, 0x8232, 0xB039, + 0x4068, 0x8232, 0xB130, + 0x4069, 0x8232, 0xB131, + 0x406A, 0x8232, 0xB132, + 0x406B, 0x8232, 0xB133, + 0x406C, 0x8232, 0xB134, + 0x406D, 0x8232, 0xB135, + 0x406E, 0x8232, 0xB136, + 0x406F, 0x8232, 0xB137, + 0x4070, 0x8232, 0xB138, + 0x4071, 0x8232, 0xB139, + 0x4072, 0x8232, 0xB230, + 0x4073, 0x8232, 0xB231, + 0x4074, 0x8232, 0xB232, + 0x4075, 0x8232, 0xB233, + 0x4076, 0x8232, 0xB234, + 0x4077, 0x8232, 0xB235, + 0x4078, 0x8232, 0xB236, + 0x4079, 0x8232, 0xB237, + 0x407A, 0x8232, 0xB238, + 0x407B, 0x8232, 0xB239, + 0x407C, 0x8232, 0xB330, + 0x407D, 0x8232, 0xB331, + 0x407E, 0x8232, 0xB332, + 0x407F, 0x8232, 0xB333, + 0x4080, 0x8232, 0xB334, + 0x4081, 0x8232, 0xB335, + 0x4082, 0x8232, 0xB336, + 0x4083, 0x8232, 0xB337, + 0x4084, 0x8232, 0xB338, + 0x4085, 0x8232, 0xB339, + 0x4086, 0x8232, 0xB430, + 0x4087, 0x8232, 0xB431, + 0x4088, 0x8232, 0xB432, + 0x4089, 0x8232, 0xB433, + 0x408A, 0x8232, 0xB434, + 0x408B, 0x8232, 0xB435, + 0x408C, 0x8232, 0xB436, + 0x408D, 0x8232, 0xB437, + 0x408E, 0x8232, 0xB438, + 0x408F, 0x8232, 0xB439, + 0x4090, 0x8232, 0xB530, + 0x4091, 0x8232, 0xB531, + 0x4092, 0x8232, 0xB532, + 0x4093, 0x8232, 0xB533, + 0x4094, 0x8232, 0xB534, + 0x4095, 0x8232, 0xB535, + 0x4096, 0x8232, 0xB536, + 0x4097, 0x8232, 0xB537, + 0x4098, 0x8232, 0xB538, + 0x4099, 0x8232, 0xB539, + 0x409A, 0x8232, 0xB630, + 0x409B, 0x8232, 0xB631, + 0x409C, 0x8232, 0xB632, + 0x409D, 0x8232, 0xB633, + 0x409E, 0x8232, 0xB634, + 0x409F, 0x8232, 0xB635, + 0x40A0, 0x8232, 0xB636, + 0x40A1, 0x8232, 0xB637, + 0x40A2, 0x8232, 0xB638, + 0x40A3, 0x8232, 0xB639, + 0x40A4, 0x8232, 0xB730, + 0x40A5, 0x8232, 0xB731, + 0x40A6, 0x8232, 0xB732, + 0x40A7, 0x8232, 0xB733, + 0x40A8, 0x8232, 0xB734, + 0x40A9, 0x8232, 0xB735, + 0x40AA, 0x8232, 0xB736, + 0x40AB, 0x8232, 0xB737, + 0x40AC, 0x8232, 0xB738, + 0x40AD, 0x8232, 0xB739, + 0x40AE, 0x8232, 0xB830, + 0x40AF, 0x8232, 0xB831, + 0x40B0, 0x8232, 0xB832, + 0x40B1, 0x8232, 0xB833, + 0x40B2, 0x8232, 0xB834, + 0x40B3, 0x8232, 0xB835, + 0x40B4, 0x8232, 0xB836, + 0x40B5, 0x8232, 0xB837, + 0x40B6, 0x8232, 0xB838, + 0x40B7, 0x8232, 0xB839, + 0x40B8, 0x8232, 0xB930, + 0x40B9, 0x8232, 0xB931, + 0x40BA, 0x8232, 0xB932, + 0x40BB, 0x8232, 0xB933, + 0x40BC, 0x8232, 0xB934, + 0x40BD, 0x8232, 0xB935, + 0x40BE, 0x8232, 0xB936, + 0x40BF, 0x8232, 0xB937, + 0x40C0, 0x8232, 0xB938, + 0x40C1, 0x8232, 0xB939, + 0x40C2, 0x8232, 0xBA30, + 0x40C3, 0x8232, 0xBA31, + 0x40C4, 0x8232, 0xBA32, + 0x40C5, 0x8232, 0xBA33, + 0x40C6, 0x8232, 0xBA34, + 0x40C7, 0x8232, 0xBA35, + 0x40C8, 0x8232, 0xBA36, + 0x40C9, 0x8232, 0xBA37, + 0x40CA, 0x8232, 0xBA38, + 0x40CB, 0x8232, 0xBA39, + 0x40CC, 0x8232, 0xBB30, + 0x40CD, 0x8232, 0xBB31, + 0x40CE, 0x8232, 0xBB32, + 0x40CF, 0x8232, 0xBB33, + 0x40D0, 0x8232, 0xBB34, + 0x40D1, 0x8232, 0xBB35, + 0x40D2, 0x8232, 0xBB36, + 0x40D3, 0x8232, 0xBB37, + 0x40D4, 0x8232, 0xBB38, + 0x40D5, 0x8232, 0xBB39, + 0x40D6, 0x8232, 0xBC30, + 0x40D7, 0x8232, 0xBC31, + 0x40D8, 0x8232, 0xBC32, + 0x40D9, 0x8232, 0xBC33, + 0x40DA, 0x8232, 0xBC34, + 0x40DB, 0x8232, 0xBC35, + 0x40DC, 0x8232, 0xBC36, + 0x40DD, 0x8232, 0xBC37, + 0x40DE, 0x8232, 0xBC38, + 0x40DF, 0x8232, 0xBC39, + 0x40E0, 0x8232, 0xBD30, + 0x40E1, 0x8232, 0xBD31, + 0x40E2, 0x8232, 0xBD32, + 0x40E3, 0x8232, 0xBD33, + 0x40E4, 0x8232, 0xBD34, + 0x40E5, 0x8232, 0xBD35, + 0x40E6, 0x8232, 0xBD36, + 0x40E7, 0x8232, 0xBD37, + 0x40E8, 0x8232, 0xBD38, + 0x40E9, 0x8232, 0xBD39, + 0x40EA, 0x8232, 0xBE30, + 0x40EB, 0x8232, 0xBE31, + 0x40EC, 0x8232, 0xBE32, + 0x40ED, 0x8232, 0xBE33, + 0x40EE, 0x8232, 0xBE34, + 0x40EF, 0x8232, 0xBE35, + 0x40F0, 0x8232, 0xBE36, + 0x40F1, 0x8232, 0xBE37, + 0x40F2, 0x8232, 0xBE38, + 0x40F3, 0x8232, 0xBE39, + 0x40F4, 0x8232, 0xBF30, + 0x40F5, 0x8232, 0xBF31, + 0x40F6, 0x8232, 0xBF32, + 0x40F7, 0x8232, 0xBF33, + 0x40F8, 0x8232, 0xBF34, + 0x40F9, 0x8232, 0xBF35, + 0x40FA, 0x8232, 0xBF36, + 0x40FB, 0x8232, 0xBF37, + 0x40FC, 0x8232, 0xBF38, + 0x40FD, 0x8232, 0xBF39, + 0x40FE, 0x8232, 0xC030, + 0x40FF, 0x8232, 0xC031, + 0x4100, 0x8232, 0xC032, + 0x4101, 0x8232, 0xC033, + 0x4102, 0x8232, 0xC034, + 0x4103, 0x8232, 0xC035, + 0x4104, 0x8232, 0xC036, + 0x4105, 0x8232, 0xC037, + 0x4106, 0x8232, 0xC038, + 0x4107, 0x8232, 0xC039, + 0x4108, 0x8232, 0xC130, + 0x4109, 0x8232, 0xC131, + 0x410A, 0x8232, 0xC132, + 0x410B, 0x8232, 0xC133, + 0x410C, 0x8232, 0xC134, + 0x410D, 0x8232, 0xC135, + 0x410E, 0x8232, 0xC136, + 0x410F, 0x8232, 0xC137, + 0x4110, 0x8232, 0xC138, + 0x4111, 0x8232, 0xC139, + 0x4112, 0x8232, 0xC230, + 0x4113, 0x8232, 0xC231, + 0x4114, 0x8232, 0xC232, + 0x4115, 0x8232, 0xC233, + 0x4116, 0x8232, 0xC234, + 0x4117, 0x8232, 0xC235, + 0x4118, 0x8232, 0xC236, + 0x4119, 0x8232, 0xC237, + 0x411A, 0x8232, 0xC238, + 0x411B, 0x8232, 0xC239, + 0x411C, 0x8232, 0xC330, + 0x411D, 0x8232, 0xC331, + 0x411E, 0x8232, 0xC332, + 0x411F, 0x8232, 0xC333, + 0x4120, 0x8232, 0xC334, + 0x4121, 0x8232, 0xC335, + 0x4122, 0x8232, 0xC336, + 0x4123, 0x8232, 0xC337, + 0x4124, 0x8232, 0xC338, + 0x4125, 0x8232, 0xC339, + 0x4126, 0x8232, 0xC430, + 0x4127, 0x8232, 0xC431, + 0x4128, 0x8232, 0xC432, + 0x4129, 0x8232, 0xC433, + 0x412A, 0x8232, 0xC434, + 0x412B, 0x8232, 0xC435, + 0x412C, 0x8232, 0xC436, + 0x412D, 0x8232, 0xC437, + 0x412E, 0x8232, 0xC438, + 0x412F, 0x8232, 0xC439, + 0x4130, 0x8232, 0xC530, + 0x4131, 0x8232, 0xC531, + 0x4132, 0x8232, 0xC532, + 0x4133, 0x8232, 0xC533, + 0x4134, 0x8232, 0xC534, + 0x4135, 0x8232, 0xC535, + 0x4136, 0x8232, 0xC536, + 0x4137, 0x8232, 0xC537, + 0x4138, 0x8232, 0xC538, + 0x4139, 0x8232, 0xC539, + 0x413A, 0x8232, 0xC630, + 0x413B, 0x8232, 0xC631, + 0x413C, 0x8232, 0xC632, + 0x413D, 0x8232, 0xC633, + 0x413E, 0x8232, 0xC634, + 0x413F, 0x8232, 0xC635, + 0x4140, 0x8232, 0xC636, + 0x4141, 0x8232, 0xC637, + 0x4142, 0x8232, 0xC638, + 0x4143, 0x8232, 0xC639, + 0x4144, 0x8232, 0xC730, + 0x4145, 0x8232, 0xC731, + 0x4146, 0x8232, 0xC732, + 0x4147, 0x8232, 0xC733, + 0x4148, 0x8232, 0xC734, + 0x4149, 0x8232, 0xC735, + 0x414A, 0x8232, 0xC736, + 0x414B, 0x8232, 0xC737, + 0x414C, 0x8232, 0xC738, + 0x414D, 0x8232, 0xC739, + 0x414E, 0x8232, 0xC830, + 0x414F, 0x8232, 0xC831, + 0x4150, 0x8232, 0xC832, + 0x4151, 0x8232, 0xC833, + 0x4152, 0x8232, 0xC834, + 0x4153, 0x8232, 0xC835, + 0x4154, 0x8232, 0xC836, + 0x4155, 0x8232, 0xC837, + 0x4156, 0x8232, 0xC838, + 0x4157, 0x8232, 0xC839, + 0x4158, 0x8232, 0xC930, + 0x4159, 0x8232, 0xC931, + 0x415A, 0x8232, 0xC932, + 0x415B, 0x8232, 0xC933, + 0x415C, 0x8232, 0xC934, + 0x415D, 0x8232, 0xC935, + 0x415E, 0x8232, 0xC936, + 0x4338, 0x8232, 0xF838, + 0x4339, 0x8232, 0xF839, + 0x433A, 0x8232, 0xF930, + 0x433B, 0x8232, 0xF931, + 0x433C, 0x8232, 0xF932, + 0x433D, 0x8232, 0xF933, + 0x433E, 0x8232, 0xF934, + 0x433F, 0x8232, 0xF935, + 0x4340, 0x8232, 0xF936, + 0x4341, 0x8232, 0xF937, + 0x4342, 0x8232, 0xF938, + 0x4343, 0x8232, 0xF939, + 0x4344, 0x8232, 0xFA30, + 0x4345, 0x8232, 0xFA31, + 0x4346, 0x8232, 0xFA32, + 0x4347, 0x8232, 0xFA33, + 0x4348, 0x8232, 0xFA34, + 0x4349, 0x8232, 0xFA35, + 0x434A, 0x8232, 0xFA36, + 0x434B, 0x8232, 0xFA37, + 0x434C, 0x8232, 0xFA38, + 0x434D, 0x8232, 0xFA39, + 0x434E, 0x8232, 0xFB30, + 0x434F, 0x8232, 0xFB31, + 0x4350, 0x8232, 0xFB32, + 0x4351, 0x8232, 0xFB33, + 0x4352, 0x8232, 0xFB34, + 0x4353, 0x8232, 0xFB35, + 0x4354, 0x8232, 0xFB36, + 0x4355, 0x8232, 0xFB37, + 0x4356, 0x8232, 0xFB38, + 0x4357, 0x8232, 0xFB39, + 0x4358, 0x8232, 0xFC30, + 0x4359, 0x8232, 0xFC31, + 0x435A, 0x8232, 0xFC32, + 0x435B, 0x8232, 0xFC33, + 0x435C, 0x8232, 0xFC34, + 0x435D, 0x8232, 0xFC35, + 0x435E, 0x8232, 0xFC36, + 0x435F, 0x8232, 0xFC37, + 0x4360, 0x8232, 0xFC38, + 0x4361, 0x8232, 0xFC39, + 0x4362, 0x8232, 0xFD30, + 0x4363, 0x8232, 0xFD31, + 0x4364, 0x8232, 0xFD32, + 0x4365, 0x8232, 0xFD33, + 0x4366, 0x8232, 0xFD34, + 0x4367, 0x8232, 0xFD35, + 0x4368, 0x8232, 0xFD36, + 0x4369, 0x8232, 0xFD37, + 0x436A, 0x8232, 0xFD38, + 0x436B, 0x8232, 0xFD39, + 0x436C, 0x8232, 0xFE30, + 0x436D, 0x8232, 0xFE31, + 0x436E, 0x8232, 0xFE32, + 0x436F, 0x8232, 0xFE33, + 0x4370, 0x8232, 0xFE34, + 0x4371, 0x8232, 0xFE35, + 0x4372, 0x8232, 0xFE36, + 0x4373, 0x8232, 0xFE37, + 0x4374, 0x8232, 0xFE38, + 0x4375, 0x8232, 0xFE39, + 0x4376, 0x8233, 0x8130, + 0x4377, 0x8233, 0x8131, + 0x4378, 0x8233, 0x8132, + 0x4379, 0x8233, 0x8133, + 0x437A, 0x8233, 0x8134, + 0x437B, 0x8233, 0x8135, + 0x437C, 0x8233, 0x8136, + 0x437D, 0x8233, 0x8137, + 0x437E, 0x8233, 0x8138, + 0x437F, 0x8233, 0x8139, + 0x4380, 0x8233, 0x8230, + 0x4381, 0x8233, 0x8231, + 0x4382, 0x8233, 0x8232, + 0x4383, 0x8233, 0x8233, + 0x4384, 0x8233, 0x8234, + 0x4385, 0x8233, 0x8235, + 0x4386, 0x8233, 0x8236, + 0x4387, 0x8233, 0x8237, + 0x4388, 0x8233, 0x8238, + 0x4389, 0x8233, 0x8239, + 0x438A, 0x8233, 0x8330, + 0x438B, 0x8233, 0x8331, + 0x438C, 0x8233, 0x8332, + 0x438D, 0x8233, 0x8333, + 0x438E, 0x8233, 0x8334, + 0x438F, 0x8233, 0x8335, + 0x4390, 0x8233, 0x8336, + 0x4391, 0x8233, 0x8337, + 0x4392, 0x8233, 0x8338, + 0x4393, 0x8233, 0x8339, + 0x4394, 0x8233, 0x8430, + 0x4395, 0x8233, 0x8431, + 0x4396, 0x8233, 0x8432, + 0x4397, 0x8233, 0x8433, + 0x4398, 0x8233, 0x8434, + 0x4399, 0x8233, 0x8435, + 0x439A, 0x8233, 0x8436, + 0x439B, 0x8233, 0x8437, + 0x439C, 0x8233, 0x8438, + 0x439D, 0x8233, 0x8439, + 0x439E, 0x8233, 0x8530, + 0x439F, 0x8233, 0x8531, + 0x43A0, 0x8233, 0x8532, + 0x43A1, 0x8233, 0x8533, + 0x43A2, 0x8233, 0x8534, + 0x43A3, 0x8233, 0x8535, + 0x43A4, 0x8233, 0x8536, + 0x43A5, 0x8233, 0x8537, + 0x43A6, 0x8233, 0x8538, + 0x43A7, 0x8233, 0x8539, + 0x43A8, 0x8233, 0x8630, + 0x43A9, 0x8233, 0x8631, + 0x43AA, 0x8233, 0x8632, + 0x43AB, 0x8233, 0x8633, + 0x43AD, 0x8233, 0x8634, + 0x43AE, 0x8233, 0x8635, + 0x43AF, 0x8233, 0x8636, + 0x43B0, 0x8233, 0x8637, + 0x43B2, 0x8233, 0x8638, + 0x43B3, 0x8233, 0x8639, + 0x43B4, 0x8233, 0x8730, + 0x43B5, 0x8233, 0x8731, + 0x43B6, 0x8233, 0x8732, + 0x43B7, 0x8233, 0x8733, + 0x43B8, 0x8233, 0x8734, + 0x43B9, 0x8233, 0x8735, + 0x43BA, 0x8233, 0x8736, + 0x43BB, 0x8233, 0x8737, + 0x43BC, 0x8233, 0x8738, + 0x43BD, 0x8233, 0x8739, + 0x43BE, 0x8233, 0x8830, + 0x43BF, 0x8233, 0x8831, + 0x43C0, 0x8233, 0x8832, + 0x43C1, 0x8233, 0x8833, + 0x43C2, 0x8233, 0x8834, + 0x43C3, 0x8233, 0x8835, + 0x43C4, 0x8233, 0x8836, + 0x43C5, 0x8233, 0x8837, + 0x43C6, 0x8233, 0x8838, + 0x43C7, 0x8233, 0x8839, + 0x43C8, 0x8233, 0x8930, + 0x43C9, 0x8233, 0x8931, + 0x43CA, 0x8233, 0x8932, + 0x43CB, 0x8233, 0x8933, + 0x43CC, 0x8233, 0x8934, + 0x43CD, 0x8233, 0x8935, + 0x43CE, 0x8233, 0x8936, + 0x43CF, 0x8233, 0x8937, + 0x43D0, 0x8233, 0x8938, + 0x43D1, 0x8233, 0x8939, + 0x43D2, 0x8233, 0x8A30, + 0x43D3, 0x8233, 0x8A31, + 0x43D4, 0x8233, 0x8A32, + 0x43D5, 0x8233, 0x8A33, + 0x43D6, 0x8233, 0x8A34, + 0x43D7, 0x8233, 0x8A35, + 0x43D8, 0x8233, 0x8A36, + 0x43D9, 0x8233, 0x8A37, + 0x43DA, 0x8233, 0x8A38, + 0x43DB, 0x8233, 0x8A39, + 0x43DC, 0x8233, 0x8B30, + 0x43DE, 0x8233, 0x8B31, + 0x43DF, 0x8233, 0x8B32, + 0x43E0, 0x8233, 0x8B33, + 0x43E1, 0x8233, 0x8B34, + 0x43E2, 0x8233, 0x8B35, + 0x43E3, 0x8233, 0x8B36, + 0x43E4, 0x8233, 0x8B37, + 0x43E5, 0x8233, 0x8B38, + 0x43E6, 0x8233, 0x8B39, + 0x43E7, 0x8233, 0x8C30, + 0x43E8, 0x8233, 0x8C31, + 0x43E9, 0x8233, 0x8C32, + 0x43EA, 0x8233, 0x8C33, + 0x43EB, 0x8233, 0x8C34, + 0x43EC, 0x8233, 0x8C35, + 0x43ED, 0x8233, 0x8C36, + 0x43EE, 0x8233, 0x8C37, + 0x43EF, 0x8233, 0x8C38, + 0x43F0, 0x8233, 0x8C39, + 0x43F1, 0x8233, 0x8D30, + 0x43F2, 0x8233, 0x8D31, + 0x43F3, 0x8233, 0x8D32, + 0x43F4, 0x8233, 0x8D33, + 0x43F5, 0x8233, 0x8D34, + 0x43F6, 0x8233, 0x8D35, + 0x43F7, 0x8233, 0x8D36, + 0x43F8, 0x8233, 0x8D37, + 0x43F9, 0x8233, 0x8D38, + 0x43FA, 0x8233, 0x8D39, + 0x43FB, 0x8233, 0x8E30, + 0x43FC, 0x8233, 0x8E31, + 0x43FD, 0x8233, 0x8E32, + 0x43FE, 0x8233, 0x8E33, + 0x43FF, 0x8233, 0x8E34, + 0x4400, 0x8233, 0x8E35, + 0x4401, 0x8233, 0x8E36, + 0x4402, 0x8233, 0x8E37, + 0x4403, 0x8233, 0x8E38, + 0x4404, 0x8233, 0x8E39, + 0x4405, 0x8233, 0x8F30, + 0x4406, 0x8233, 0x8F31, + 0x4407, 0x8233, 0x8F32, + 0x4408, 0x8233, 0x8F33, + 0x4409, 0x8233, 0x8F34, + 0x440A, 0x8233, 0x8F35, + 0x440B, 0x8233, 0x8F36, + 0x440C, 0x8233, 0x8F37, + 0x440D, 0x8233, 0x8F38, + 0x440E, 0x8233, 0x8F39, + 0x440F, 0x8233, 0x9030, + 0x4410, 0x8233, 0x9031, + 0x4411, 0x8233, 0x9032, + 0x4412, 0x8233, 0x9033, + 0x4413, 0x8233, 0x9034, + 0x4414, 0x8233, 0x9035, + 0x4415, 0x8233, 0x9036, + 0x4416, 0x8233, 0x9037, + 0x4417, 0x8233, 0x9038, + 0x4418, 0x8233, 0x9039, + 0x4419, 0x8233, 0x9130, + 0x441A, 0x8233, 0x9131, + 0x441B, 0x8233, 0x9132, + 0x441C, 0x8233, 0x9133, + 0x441D, 0x8233, 0x9134, + 0x441E, 0x8233, 0x9135, + 0x441F, 0x8233, 0x9136, + 0x4420, 0x8233, 0x9137, + 0x4421, 0x8233, 0x9138, + 0x4422, 0x8233, 0x9139, + 0x4423, 0x8233, 0x9230, + 0x4424, 0x8233, 0x9231, + 0x4425, 0x8233, 0x9232, + 0x4426, 0x8233, 0x9233, + 0x4427, 0x8233, 0x9234, + 0x4428, 0x8233, 0x9235, + 0x4429, 0x8233, 0x9236, + 0x442A, 0x8233, 0x9237, + 0x442B, 0x8233, 0x9238, + 0x442C, 0x8233, 0x9239, + 0x442D, 0x8233, 0x9330, + 0x442E, 0x8233, 0x9331, + 0x442F, 0x8233, 0x9332, + 0x4430, 0x8233, 0x9333, + 0x4431, 0x8233, 0x9334, + 0x4432, 0x8233, 0x9335, + 0x4433, 0x8233, 0x9336, + 0x4434, 0x8233, 0x9337, + 0x4435, 0x8233, 0x9338, + 0x4436, 0x8233, 0x9339, + 0x4437, 0x8233, 0x9430, + 0x4438, 0x8233, 0x9431, + 0x4439, 0x8233, 0x9432, + 0x443A, 0x8233, 0x9433, + 0x443B, 0x8233, 0x9434, + 0x443C, 0x8233, 0x9435, + 0x443D, 0x8233, 0x9436, + 0x443E, 0x8233, 0x9437, + 0x443F, 0x8233, 0x9438, + 0x4440, 0x8233, 0x9439, + 0x4441, 0x8233, 0x9530, + 0x4442, 0x8233, 0x9531, + 0x4443, 0x8233, 0x9532, + 0x4444, 0x8233, 0x9533, + 0x4445, 0x8233, 0x9534, + 0x4446, 0x8233, 0x9535, + 0x4447, 0x8233, 0x9536, + 0x4448, 0x8233, 0x9537, + 0x4449, 0x8233, 0x9538, + 0x444A, 0x8233, 0x9539, + 0x444B, 0x8233, 0x9630, + 0x444C, 0x8233, 0x9631, + 0x444D, 0x8233, 0x9632, + 0x444E, 0x8233, 0x9633, + 0x444F, 0x8233, 0x9634, + 0x4450, 0x8233, 0x9635, + 0x4451, 0x8233, 0x9636, + 0x4452, 0x8233, 0x9637, + 0x4453, 0x8233, 0x9638, + 0x4454, 0x8233, 0x9639, + 0x4455, 0x8233, 0x9730, + 0x4456, 0x8233, 0x9731, + 0x4457, 0x8233, 0x9732, + 0x4458, 0x8233, 0x9733, + 0x4459, 0x8233, 0x9734, + 0x445A, 0x8233, 0x9735, + 0x445B, 0x8233, 0x9736, + 0x445C, 0x8233, 0x9737, + 0x445D, 0x8233, 0x9738, + 0x445E, 0x8233, 0x9739, + 0x445F, 0x8233, 0x9830, + 0x4460, 0x8233, 0x9831, + 0x4461, 0x8233, 0x9832, + 0x4462, 0x8233, 0x9833, + 0x4463, 0x8233, 0x9834, + 0x4464, 0x8233, 0x9835, + 0x4465, 0x8233, 0x9836, + 0x4466, 0x8233, 0x9837, + 0x4467, 0x8233, 0x9838, + 0x4468, 0x8233, 0x9839, + 0x4469, 0x8233, 0x9930, + 0x446A, 0x8233, 0x9931, + 0x446B, 0x8233, 0x9932, + 0x446C, 0x8233, 0x9933, + 0x446D, 0x8233, 0x9934, + 0x446E, 0x8233, 0x9935, + 0x446F, 0x8233, 0x9936, + 0x4470, 0x8233, 0x9937, + 0x4471, 0x8233, 0x9938, + 0x4472, 0x8233, 0x9939, + 0x4473, 0x8233, 0x9A30, + 0x4474, 0x8233, 0x9A31, + 0x4475, 0x8233, 0x9A32, + 0x4476, 0x8233, 0x9A33, + 0x4477, 0x8233, 0x9A34, + 0x4478, 0x8233, 0x9A35, + 0x4479, 0x8233, 0x9A36, + 0x447A, 0x8233, 0x9A37, + 0x447B, 0x8233, 0x9A38, + 0x447C, 0x8233, 0x9A39, + 0x447D, 0x8233, 0x9B30, + 0x447E, 0x8233, 0x9B31, + 0x447F, 0x8233, 0x9B32, + 0x4480, 0x8233, 0x9B33, + 0x4481, 0x8233, 0x9B34, + 0x4482, 0x8233, 0x9B35, + 0x4483, 0x8233, 0x9B36, + 0x4484, 0x8233, 0x9B37, + 0x4485, 0x8233, 0x9B38, + 0x4486, 0x8233, 0x9B39, + 0x4487, 0x8233, 0x9C30, + 0x4488, 0x8233, 0x9C31, + 0x4489, 0x8233, 0x9C32, + 0x448A, 0x8233, 0x9C33, + 0x448B, 0x8233, 0x9C34, + 0x448C, 0x8233, 0x9C35, + 0x448D, 0x8233, 0x9C36, + 0x448E, 0x8233, 0x9C37, + 0x448F, 0x8233, 0x9C38, + 0x4490, 0x8233, 0x9C39, + 0x4491, 0x8233, 0x9D30, + 0x4492, 0x8233, 0x9D31, + 0x4493, 0x8233, 0x9D32, + 0x4494, 0x8233, 0x9D33, + 0x4495, 0x8233, 0x9D34, + 0x4496, 0x8233, 0x9D35, + 0x4497, 0x8233, 0x9D36, + 0x4498, 0x8233, 0x9D37, + 0x4499, 0x8233, 0x9D38, + 0x449A, 0x8233, 0x9D39, + 0x449B, 0x8233, 0x9E30, + 0x449C, 0x8233, 0x9E31, + 0x449D, 0x8233, 0x9E32, + 0x449E, 0x8233, 0x9E33, + 0x449F, 0x8233, 0x9E34, + 0x44A0, 0x8233, 0x9E35, + 0x44A1, 0x8233, 0x9E36, + 0x44A2, 0x8233, 0x9E37, + 0x44A3, 0x8233, 0x9E38, + 0x44A4, 0x8233, 0x9E39, + 0x44A5, 0x8233, 0x9F30, + 0x44A6, 0x8233, 0x9F31, + 0x44A7, 0x8233, 0x9F32, + 0x44A8, 0x8233, 0x9F33, + 0x44A9, 0x8233, 0x9F34, + 0x44AA, 0x8233, 0x9F35, + 0x44AB, 0x8233, 0x9F36, + 0x44AC, 0x8233, 0x9F37, + 0x44AD, 0x8233, 0x9F38, + 0x44AE, 0x8233, 0x9F39, + 0x44AF, 0x8233, 0xA030, + 0x44B0, 0x8233, 0xA031, + 0x44B1, 0x8233, 0xA032, + 0x44B2, 0x8233, 0xA033, + 0x44B3, 0x8233, 0xA034, + 0x44B4, 0x8233, 0xA035, + 0x44B5, 0x8233, 0xA036, + 0x44B6, 0x8233, 0xA037, + 0x44B7, 0x8233, 0xA038, + 0x44B8, 0x8233, 0xA039, + 0x44B9, 0x8233, 0xA130, + 0x44BA, 0x8233, 0xA131, + 0x44BB, 0x8233, 0xA132, + 0x44BC, 0x8233, 0xA133, + 0x44BD, 0x8233, 0xA134, + 0x44BE, 0x8233, 0xA135, + 0x44BF, 0x8233, 0xA136, + 0x44C0, 0x8233, 0xA137, + 0x44C1, 0x8233, 0xA138, + 0x44C2, 0x8233, 0xA139, + 0x44C3, 0x8233, 0xA230, + 0x44C4, 0x8233, 0xA231, + 0x44C5, 0x8233, 0xA232, + 0x44C6, 0x8233, 0xA233, + 0x44C7, 0x8233, 0xA234, + 0x44C8, 0x8233, 0xA235, + 0x44C9, 0x8233, 0xA236, + 0x44CA, 0x8233, 0xA237, + 0x44CB, 0x8233, 0xA238, + 0x44CC, 0x8233, 0xA239, + 0x44CD, 0x8233, 0xA330, + 0x44CE, 0x8233, 0xA331, + 0x44CF, 0x8233, 0xA332, + 0x44D0, 0x8233, 0xA333, + 0x44D1, 0x8233, 0xA334, + 0x44D2, 0x8233, 0xA335, + 0x44D3, 0x8233, 0xA336, + 0x44D4, 0x8233, 0xA337, + 0x44D5, 0x8233, 0xA338, + 0x464D, 0x8233, 0xC932, + 0x464E, 0x8233, 0xC933, + 0x464F, 0x8233, 0xC934, + 0x4650, 0x8233, 0xC935, + 0x4651, 0x8233, 0xC936, + 0x4652, 0x8233, 0xC937, + 0x4653, 0x8233, 0xC938, + 0x4654, 0x8233, 0xC939, + 0x4655, 0x8233, 0xCA30, + 0x4656, 0x8233, 0xCA31, + 0x4657, 0x8233, 0xCA32, + 0x4658, 0x8233, 0xCA33, + 0x4659, 0x8233, 0xCA34, + 0x465A, 0x8233, 0xCA35, + 0x465B, 0x8233, 0xCA36, + 0x465C, 0x8233, 0xCA37, + 0x465D, 0x8233, 0xCA38, + 0x465E, 0x8233, 0xCA39, + 0x465F, 0x8233, 0xCB30, + 0x4660, 0x8233, 0xCB31, + 0x4662, 0x8233, 0xCB32, + 0x4663, 0x8233, 0xCB33, + 0x4664, 0x8233, 0xCB34, + 0x4665, 0x8233, 0xCB35, + 0x4666, 0x8233, 0xCB36, + 0x4667, 0x8233, 0xCB37, + 0x4668, 0x8233, 0xCB38, + 0x4669, 0x8233, 0xCB39, + 0x466A, 0x8233, 0xCC30, + 0x466B, 0x8233, 0xCC31, + 0x466C, 0x8233, 0xCC32, + 0x466D, 0x8233, 0xCC33, + 0x466E, 0x8233, 0xCC34, + 0x466F, 0x8233, 0xCC35, + 0x4670, 0x8233, 0xCC36, + 0x4671, 0x8233, 0xCC37, + 0x4672, 0x8233, 0xCC38, + 0x4673, 0x8233, 0xCC39, + 0x4674, 0x8233, 0xCD30, + 0x4675, 0x8233, 0xCD31, + 0x4676, 0x8233, 0xCD32, + 0x4677, 0x8233, 0xCD33, + 0x4678, 0x8233, 0xCD34, + 0x4679, 0x8233, 0xCD35, + 0x467A, 0x8233, 0xCD36, + 0x467B, 0x8233, 0xCD37, + 0x467C, 0x8233, 0xCD38, + 0x467D, 0x8233, 0xCD39, + 0x467E, 0x8233, 0xCE30, + 0x467F, 0x8233, 0xCE31, + 0x4680, 0x8233, 0xCE32, + 0x4681, 0x8233, 0xCE33, + 0x4682, 0x8233, 0xCE34, + 0x4683, 0x8233, 0xCE35, + 0x4684, 0x8233, 0xCE36, + 0x4685, 0x8233, 0xCE37, + 0x4686, 0x8233, 0xCE38, + 0x4687, 0x8233, 0xCE39, + 0x4688, 0x8233, 0xCF30, + 0x4689, 0x8233, 0xCF31, + 0x468A, 0x8233, 0xCF32, + 0x468B, 0x8233, 0xCF33, + 0x468C, 0x8233, 0xCF34, + 0x468D, 0x8233, 0xCF35, + 0x468E, 0x8233, 0xCF36, + 0x468F, 0x8233, 0xCF37, + 0x4690, 0x8233, 0xCF38, + 0x4691, 0x8233, 0xCF39, + 0x4692, 0x8233, 0xD030, + 0x4693, 0x8233, 0xD031, + 0x4694, 0x8233, 0xD032, + 0x4695, 0x8233, 0xD033, + 0x4696, 0x8233, 0xD034, + 0x4697, 0x8233, 0xD035, + 0x4698, 0x8233, 0xD036, + 0x4699, 0x8233, 0xD037, + 0x469A, 0x8233, 0xD038, + 0x469B, 0x8233, 0xD039, + 0x469C, 0x8233, 0xD130, + 0x469D, 0x8233, 0xD131, + 0x469E, 0x8233, 0xD132, + 0x469F, 0x8233, 0xD133, + 0x46A0, 0x8233, 0xD134, + 0x46A1, 0x8233, 0xD135, + 0x46A2, 0x8233, 0xD136, + 0x46A3, 0x8233, 0xD137, + 0x46A4, 0x8233, 0xD138, + 0x46A5, 0x8233, 0xD139, + 0x46A6, 0x8233, 0xD230, + 0x46A7, 0x8233, 0xD231, + 0x46A8, 0x8233, 0xD232, + 0x46A9, 0x8233, 0xD233, + 0x46AA, 0x8233, 0xD234, + 0x46AB, 0x8233, 0xD235, + 0x46AC, 0x8233, 0xD236, + 0x46AD, 0x8233, 0xD237, + 0x46AE, 0x8233, 0xD238, + 0x46AF, 0x8233, 0xD239, + 0x46B0, 0x8233, 0xD330, + 0x46B1, 0x8233, 0xD331, + 0x46B2, 0x8233, 0xD332, + 0x46B3, 0x8233, 0xD333, + 0x46B4, 0x8233, 0xD334, + 0x46B5, 0x8233, 0xD335, + 0x46B6, 0x8233, 0xD336, + 0x46B7, 0x8233, 0xD337, + 0x46B8, 0x8233, 0xD338, + 0x46B9, 0x8233, 0xD339, + 0x46BA, 0x8233, 0xD430, + 0x46BB, 0x8233, 0xD431, + 0x46BC, 0x8233, 0xD432, + 0x46BD, 0x8233, 0xD433, + 0x46BE, 0x8233, 0xD434, + 0x46BF, 0x8233, 0xD435, + 0x46C0, 0x8233, 0xD436, + 0x46C1, 0x8233, 0xD437, + 0x46C2, 0x8233, 0xD438, + 0x46C3, 0x8233, 0xD439, + 0x46C4, 0x8233, 0xD530, + 0x46C5, 0x8233, 0xD531, + 0x46C6, 0x8233, 0xD532, + 0x46C7, 0x8233, 0xD533, + 0x46C8, 0x8233, 0xD534, + 0x46C9, 0x8233, 0xD535, + 0x46CA, 0x8233, 0xD536, + 0x46CB, 0x8233, 0xD537, + 0x46CC, 0x8233, 0xD538, + 0x46CD, 0x8233, 0xD539, + 0x46CE, 0x8233, 0xD630, + 0x46CF, 0x8233, 0xD631, + 0x46D0, 0x8233, 0xD632, + 0x46D1, 0x8233, 0xD633, + 0x46D2, 0x8233, 0xD634, + 0x46D3, 0x8233, 0xD635, + 0x46D4, 0x8233, 0xD636, + 0x46D5, 0x8233, 0xD637, + 0x46D6, 0x8233, 0xD638, + 0x46D7, 0x8233, 0xD639, + 0x46D8, 0x8233, 0xD730, + 0x46D9, 0x8233, 0xD731, + 0x46DA, 0x8233, 0xD732, + 0x46DB, 0x8233, 0xD733, + 0x46DC, 0x8233, 0xD734, + 0x46DD, 0x8233, 0xD735, + 0x46DE, 0x8233, 0xD736, + 0x46DF, 0x8233, 0xD737, + 0x46E0, 0x8233, 0xD738, + 0x46E1, 0x8233, 0xD739, + 0x46E2, 0x8233, 0xD830, + 0x46E3, 0x8233, 0xD831, + 0x46E4, 0x8233, 0xD832, + 0x46E5, 0x8233, 0xD833, + 0x46E6, 0x8233, 0xD834, + 0x46E7, 0x8233, 0xD835, + 0x46E8, 0x8233, 0xD836, + 0x46E9, 0x8233, 0xD837, + 0x46EA, 0x8233, 0xD838, + 0x46EB, 0x8233, 0xD839, + 0x46EC, 0x8233, 0xD930, + 0x46ED, 0x8233, 0xD931, + 0x46EE, 0x8233, 0xD932, + 0x46EF, 0x8233, 0xD933, + 0x46F0, 0x8233, 0xD934, + 0x46F1, 0x8233, 0xD935, + 0x46F2, 0x8233, 0xD936, + 0x46F3, 0x8233, 0xD937, + 0x46F4, 0x8233, 0xD938, + 0x46F5, 0x8233, 0xD939, + 0x46F6, 0x8233, 0xDA30, + 0x46F7, 0x8233, 0xDA31, + 0x46F8, 0x8233, 0xDA32, + 0x46F9, 0x8233, 0xDA33, + 0x46FA, 0x8233, 0xDA34, + 0x46FB, 0x8233, 0xDA35, + 0x46FC, 0x8233, 0xDA36, + 0x46FD, 0x8233, 0xDA37, + 0x46FE, 0x8233, 0xDA38, + 0x46FF, 0x8233, 0xDA39, + 0x4700, 0x8233, 0xDB30, + 0x4701, 0x8233, 0xDB31, + 0x4702, 0x8233, 0xDB32, + 0x4703, 0x8233, 0xDB33, + 0x4704, 0x8233, 0xDB34, + 0x4705, 0x8233, 0xDB35, + 0x4706, 0x8233, 0xDB36, + 0x4707, 0x8233, 0xDB37, + 0x4708, 0x8233, 0xDB38, + 0x4709, 0x8233, 0xDB39, + 0x470A, 0x8233, 0xDC30, + 0x470B, 0x8233, 0xDC31, + 0x470C, 0x8233, 0xDC32, + 0x470D, 0x8233, 0xDC33, + 0x470E, 0x8233, 0xDC34, + 0x470F, 0x8233, 0xDC35, + 0x4710, 0x8233, 0xDC36, + 0x4711, 0x8233, 0xDC37, + 0x4712, 0x8233, 0xDC38, + 0x4713, 0x8233, 0xDC39, + 0x4714, 0x8233, 0xDD30, + 0x4715, 0x8233, 0xDD31, + 0x4716, 0x8233, 0xDD32, + 0x4717, 0x8233, 0xDD33, + 0x4718, 0x8233, 0xDD34, + 0x4719, 0x8233, 0xDD35, + 0x471A, 0x8233, 0xDD36, + 0x471B, 0x8233, 0xDD37, + 0x471C, 0x8233, 0xDD38, + 0x471D, 0x8233, 0xDD39, + 0x471E, 0x8233, 0xDE30, + 0x471F, 0x8233, 0xDE31, + 0x4720, 0x8233, 0xDE32, + 0x4721, 0x8233, 0xDE33, + 0x4722, 0x8233, 0xDE34, + 0x4724, 0x8233, 0xDE35, + 0x4725, 0x8233, 0xDE36, + 0x4726, 0x8233, 0xDE37, + 0x4727, 0x8233, 0xDE38, + 0x4728, 0x8233, 0xDE39, + 0x472A, 0x8233, 0xDF30, + 0x472B, 0x8233, 0xDF31, + 0x472C, 0x8233, 0xDF32, + 0x472D, 0x8233, 0xDF33, + 0x472E, 0x8233, 0xDF34, + 0x472F, 0x8233, 0xDF35, + 0x4730, 0x8233, 0xDF36, + 0x4731, 0x8233, 0xDF37, + 0x4732, 0x8233, 0xDF38, + 0x4733, 0x8233, 0xDF39, + 0x4734, 0x8233, 0xE030, + 0x4735, 0x8233, 0xE031, + 0x4736, 0x8233, 0xE032, + 0x4737, 0x8233, 0xE033, + 0x4738, 0x8233, 0xE034, + 0x4739, 0x8233, 0xE035, + 0x473A, 0x8233, 0xE036, + 0x473B, 0x8233, 0xE037, + 0x473C, 0x8233, 0xE038, + 0x473D, 0x8233, 0xE039, + 0x473E, 0x8233, 0xE130, + 0x473F, 0x8233, 0xE131, + 0x4740, 0x8233, 0xE132, + 0x4741, 0x8233, 0xE133, + 0x4742, 0x8233, 0xE134, + 0x4743, 0x8233, 0xE135, + 0x4744, 0x8233, 0xE136, + 0x4745, 0x8233, 0xE137, + 0x4746, 0x8233, 0xE138, + 0x4747, 0x8233, 0xE139, + 0x4748, 0x8233, 0xE230, + 0x4749, 0x8233, 0xE231, + 0x474A, 0x8233, 0xE232, + 0x474B, 0x8233, 0xE233, + 0x474C, 0x8233, 0xE234, + 0x474D, 0x8233, 0xE235, + 0x474E, 0x8233, 0xE236, + 0x474F, 0x8233, 0xE237, + 0x4750, 0x8233, 0xE238, + 0x4751, 0x8233, 0xE239, + 0x4752, 0x8233, 0xE330, + 0x4753, 0x8233, 0xE331, + 0x4754, 0x8233, 0xE332, + 0x4755, 0x8233, 0xE333, + 0x4756, 0x8233, 0xE334, + 0x4757, 0x8233, 0xE335, + 0x4758, 0x8233, 0xE336, + 0x4759, 0x8233, 0xE337, + 0x475A, 0x8233, 0xE338, + 0x475B, 0x8233, 0xE339, + 0x475C, 0x8233, 0xE430, + 0x475D, 0x8233, 0xE431, + 0x475E, 0x8233, 0xE432, + 0x475F, 0x8233, 0xE433, + 0x4760, 0x8233, 0xE434, + 0x4761, 0x8233, 0xE435, + 0x4762, 0x8233, 0xE436, + 0x4763, 0x8233, 0xE437, + 0x4764, 0x8233, 0xE438, + 0x4765, 0x8233, 0xE439, + 0x4766, 0x8233, 0xE530, + 0x4767, 0x8233, 0xE531, + 0x4768, 0x8233, 0xE532, + 0x4769, 0x8233, 0xE533, + 0x476A, 0x8233, 0xE534, + 0x476B, 0x8233, 0xE535, + 0x476C, 0x8233, 0xE536, + 0x476D, 0x8233, 0xE537, + 0x476E, 0x8233, 0xE538, + 0x476F, 0x8233, 0xE539, + 0x4770, 0x8233, 0xE630, + 0x4771, 0x8233, 0xE631, + 0x4772, 0x8233, 0xE632, + 0x4773, 0x8233, 0xE633, + 0x4774, 0x8233, 0xE634, + 0x4775, 0x8233, 0xE635, + 0x4776, 0x8233, 0xE636, + 0x4777, 0x8233, 0xE637, + 0x4778, 0x8233, 0xE638, + 0x4779, 0x8233, 0xE639, + 0x477A, 0x8233, 0xE730, + 0x477B, 0x8233, 0xE731, + 0x477D, 0x8233, 0xE732, + 0x477E, 0x8233, 0xE733, + 0x477F, 0x8233, 0xE734, + 0x4780, 0x8233, 0xE735, + 0x4781, 0x8233, 0xE736, + 0x4782, 0x8233, 0xE737, + 0x4783, 0x8233, 0xE738, + 0x4784, 0x8233, 0xE739, + 0x4785, 0x8233, 0xE830, + 0x4786, 0x8233, 0xE831, + 0x4787, 0x8233, 0xE832, + 0x4788, 0x8233, 0xE833, + 0x4789, 0x8233, 0xE834, + 0x478A, 0x8233, 0xE835, + 0x478B, 0x8233, 0xE836, + 0x478C, 0x8233, 0xE837, + 0x4948, 0x8234, 0x9639, + 0x4949, 0x8234, 0x9730, + 0x494A, 0x8234, 0x9731, + 0x494B, 0x8234, 0x9732, + 0x494C, 0x8234, 0x9733, + 0x494D, 0x8234, 0x9734, + 0x494E, 0x8234, 0x9735, + 0x494F, 0x8234, 0x9736, + 0x4950, 0x8234, 0x9737, + 0x4951, 0x8234, 0x9738, + 0x4952, 0x8234, 0x9739, + 0x4953, 0x8234, 0x9830, + 0x4954, 0x8234, 0x9831, + 0x4955, 0x8234, 0x9832, + 0x4956, 0x8234, 0x9833, + 0x4957, 0x8234, 0x9834, + 0x4958, 0x8234, 0x9835, + 0x4959, 0x8234, 0x9836, + 0x495A, 0x8234, 0x9837, + 0x495B, 0x8234, 0x9838, + 0x495C, 0x8234, 0x9839, + 0x495D, 0x8234, 0x9930, + 0x495E, 0x8234, 0x9931, + 0x495F, 0x8234, 0x9932, + 0x4960, 0x8234, 0x9933, + 0x4961, 0x8234, 0x9934, + 0x4962, 0x8234, 0x9935, + 0x4963, 0x8234, 0x9936, + 0x4964, 0x8234, 0x9937, + 0x4965, 0x8234, 0x9938, + 0x4966, 0x8234, 0x9939, + 0x4967, 0x8234, 0x9A30, + 0x4968, 0x8234, 0x9A31, + 0x4969, 0x8234, 0x9A32, + 0x496A, 0x8234, 0x9A33, + 0x496B, 0x8234, 0x9A34, + 0x496C, 0x8234, 0x9A35, + 0x496D, 0x8234, 0x9A36, + 0x496E, 0x8234, 0x9A37, + 0x496F, 0x8234, 0x9A38, + 0x4970, 0x8234, 0x9A39, + 0x4971, 0x8234, 0x9B30, + 0x4972, 0x8234, 0x9B31, + 0x4973, 0x8234, 0x9B32, + 0x4974, 0x8234, 0x9B33, + 0x4975, 0x8234, 0x9B34, + 0x4976, 0x8234, 0x9B35, + 0x4977, 0x8234, 0x9B36, + 0x4978, 0x8234, 0x9B37, + 0x4979, 0x8234, 0x9B38, + 0x497B, 0x8234, 0x9B39, + 0x497C, 0x8234, 0x9C30, + 0x497E, 0x8234, 0x9C31, + 0x497F, 0x8234, 0x9C32, + 0x4980, 0x8234, 0x9C33, + 0x4981, 0x8234, 0x9C34, + 0x4984, 0x8234, 0x9C35, + 0x4987, 0x8234, 0x9C36, + 0x4988, 0x8234, 0x9C37, + 0x4989, 0x8234, 0x9C38, + 0x498A, 0x8234, 0x9C39, + 0x498B, 0x8234, 0x9D30, + 0x498C, 0x8234, 0x9D31, + 0x498D, 0x8234, 0x9D32, + 0x498E, 0x8234, 0x9D33, + 0x498F, 0x8234, 0x9D34, + 0x4990, 0x8234, 0x9D35, + 0x4991, 0x8234, 0x9D36, + 0x4992, 0x8234, 0x9D37, + 0x4993, 0x8234, 0x9D38, + 0x4994, 0x8234, 0x9D39, + 0x4995, 0x8234, 0x9E30, + 0x4996, 0x8234, 0x9E31, + 0x4997, 0x8234, 0x9E32, + 0x4998, 0x8234, 0x9E33, + 0x4999, 0x8234, 0x9E34, + 0x499A, 0x8234, 0x9E35, + 0x499C, 0x8234, 0x9E36, + 0x499D, 0x8234, 0x9E37, + 0x499E, 0x8234, 0x9E38, + 0x49A0, 0x8234, 0x9E39, + 0x49A1, 0x8234, 0x9F30, + 0x49A2, 0x8234, 0x9F31, + 0x49A3, 0x8234, 0x9F32, + 0x49A4, 0x8234, 0x9F33, + 0x49A5, 0x8234, 0x9F34, + 0x49A6, 0x8234, 0x9F35, + 0x49A7, 0x8234, 0x9F36, + 0x49A8, 0x8234, 0x9F37, + 0x49A9, 0x8234, 0x9F38, + 0x49AA, 0x8234, 0x9F39, + 0x49AB, 0x8234, 0xA030, + 0x49AC, 0x8234, 0xA031, + 0x49AD, 0x8234, 0xA032, + 0x49AE, 0x8234, 0xA033, + 0x49AF, 0x8234, 0xA034, + 0x49B0, 0x8234, 0xA035, + 0x49B1, 0x8234, 0xA036, + 0x49B2, 0x8234, 0xA037, + 0x49B3, 0x8234, 0xA038, + 0x49B4, 0x8234, 0xA039, + 0x49B5, 0x8234, 0xA130, + 0x4C78, 0x8234, 0xE734, + 0x4C79, 0x8234, 0xE735, + 0x4C7A, 0x8234, 0xE736, + 0x4C7B, 0x8234, 0xE737, + 0x4C7C, 0x8234, 0xE738, + 0x4C7D, 0x8234, 0xE739, + 0x4C7E, 0x8234, 0xE830, + 0x4C7F, 0x8234, 0xE831, + 0x4C80, 0x8234, 0xE832, + 0x4C81, 0x8234, 0xE833, + 0x4C82, 0x8234, 0xE834, + 0x4C83, 0x8234, 0xE835, + 0x4C84, 0x8234, 0xE836, + 0x4C85, 0x8234, 0xE837, + 0x4C86, 0x8234, 0xE838, + 0x4C87, 0x8234, 0xE839, + 0x4C88, 0x8234, 0xE930, + 0x4C89, 0x8234, 0xE931, + 0x4C8A, 0x8234, 0xE932, + 0x4C8B, 0x8234, 0xE933, + 0x4C8C, 0x8234, 0xE934, + 0x4C8D, 0x8234, 0xE935, + 0x4C8E, 0x8234, 0xE936, + 0x4C8F, 0x8234, 0xE937, + 0x4C90, 0x8234, 0xE938, + 0x4C91, 0x8234, 0xE939, + 0x4C92, 0x8234, 0xEA30, + 0x4C93, 0x8234, 0xEA31, + 0x4C94, 0x8234, 0xEA32, + 0x4C95, 0x8234, 0xEA33, + 0x4C96, 0x8234, 0xEA34, + 0x4C97, 0x8234, 0xEA35, + 0x4C98, 0x8234, 0xEA36, + 0x4C99, 0x8234, 0xEA37, + 0x4C9A, 0x8234, 0xEA38, + 0x4C9B, 0x8234, 0xEA39, + 0x4C9C, 0x8234, 0xEB30, + 0x4C9D, 0x8234, 0xEB31, + 0x4C9E, 0x8234, 0xEB32, + 0x4CA4, 0x8234, 0xEB33, + 0x4CA5, 0x8234, 0xEB34, + 0x4CA6, 0x8234, 0xEB35, + 0x4CA7, 0x8234, 0xEB36, + 0x4CA8, 0x8234, 0xEB37, + 0x4CA9, 0x8234, 0xEB38, + 0x4CAA, 0x8234, 0xEB39, + 0x4CAB, 0x8234, 0xEC30, + 0x4CAC, 0x8234, 0xEC31, + 0x4CAD, 0x8234, 0xEC32, + 0x4CAE, 0x8234, 0xEC33, + 0x4CAF, 0x8234, 0xEC34, + 0x4CB0, 0x8234, 0xEC35, + 0x4CB1, 0x8234, 0xEC36, + 0x4CB2, 0x8234, 0xEC37, + 0x4CB3, 0x8234, 0xEC38, + 0x4CB4, 0x8234, 0xEC39, + 0x4CB5, 0x8234, 0xED30, + 0x4CB6, 0x8234, 0xED31, + 0x4CB7, 0x8234, 0xED32, + 0x4CB8, 0x8234, 0xED33, + 0x4CB9, 0x8234, 0xED34, + 0x4CBA, 0x8234, 0xED35, + 0x4CBB, 0x8234, 0xED36, + 0x4CBC, 0x8234, 0xED37, + 0x4CBD, 0x8234, 0xED38, + 0x4CBE, 0x8234, 0xED39, + 0x4CBF, 0x8234, 0xEE30, + 0x4CC0, 0x8234, 0xEE31, + 0x4CC1, 0x8234, 0xEE32, + 0x4CC2, 0x8234, 0xEE33, + 0x4CC3, 0x8234, 0xEE34, + 0x4CC4, 0x8234, 0xEE35, + 0x4CC5, 0x8234, 0xEE36, + 0x4CC6, 0x8234, 0xEE37, + 0x4CC7, 0x8234, 0xEE38, + 0x4CC8, 0x8234, 0xEE39, + 0x4CC9, 0x8234, 0xEF30, + 0x4CCA, 0x8234, 0xEF31, + 0x4CCB, 0x8234, 0xEF32, + 0x4CCC, 0x8234, 0xEF33, + 0x4CCD, 0x8234, 0xEF34, + 0x4CCE, 0x8234, 0xEF35, + 0x4CCF, 0x8234, 0xEF36, + 0x4CD0, 0x8234, 0xEF37, + 0x4CD1, 0x8234, 0xEF38, + 0x4CD2, 0x8234, 0xEF39, + 0x4CD3, 0x8234, 0xF030, + 0x4CD4, 0x8234, 0xF031, + 0x4CD5, 0x8234, 0xF032, + 0x4CD6, 0x8234, 0xF033, + 0x4CD7, 0x8234, 0xF034, + 0x4CD8, 0x8234, 0xF035, + 0x4CD9, 0x8234, 0xF036, + 0x4CDA, 0x8234, 0xF037, + 0x4CDB, 0x8234, 0xF038, + 0x4CDC, 0x8234, 0xF039, + 0x4CDD, 0x8234, 0xF130, + 0x4CDE, 0x8234, 0xF131, + 0x4CDF, 0x8234, 0xF132, + 0x4CE0, 0x8234, 0xF133, + 0x4CE1, 0x8234, 0xF134, + 0x4CE2, 0x8234, 0xF135, + 0x4CE3, 0x8234, 0xF136, + 0x4CE4, 0x8234, 0xF137, + 0x4CE5, 0x8234, 0xF138, + 0x4CE6, 0x8234, 0xF139, + 0x4CE7, 0x8234, 0xF230, + 0x4CE8, 0x8234, 0xF231, + 0x4CE9, 0x8234, 0xF232, + 0x4CEA, 0x8234, 0xF233, + 0x4CEB, 0x8234, 0xF234, + 0x4CEC, 0x8234, 0xF235, + 0x4CED, 0x8234, 0xF236, + 0x4CEE, 0x8234, 0xF237, + 0x4CEF, 0x8234, 0xF238, + 0x4CF0, 0x8234, 0xF239, + 0x4CF1, 0x8234, 0xF330, + 0x4CF2, 0x8234, 0xF331, + 0x4CF3, 0x8234, 0xF332, + 0x4CF4, 0x8234, 0xF333, + 0x4CF5, 0x8234, 0xF334, + 0x4CF6, 0x8234, 0xF335, + 0x4CF7, 0x8234, 0xF336, + 0x4CF8, 0x8234, 0xF337, + 0x4CF9, 0x8234, 0xF338, + 0x4CFA, 0x8234, 0xF339, + 0x4CFB, 0x8234, 0xF430, + 0x4CFC, 0x8234, 0xF431, + 0x4CFD, 0x8234, 0xF432, + 0x4CFE, 0x8234, 0xF433, + 0x4CFF, 0x8234, 0xF434, + 0x4D00, 0x8234, 0xF435, + 0x4D01, 0x8234, 0xF436, + 0x4D02, 0x8234, 0xF437, + 0x4D03, 0x8234, 0xF438, + 0x4D04, 0x8234, 0xF439, + 0x4D05, 0x8234, 0xF530, + 0x4D06, 0x8234, 0xF531, + 0x4D07, 0x8234, 0xF532, + 0x4D08, 0x8234, 0xF533, + 0x4D09, 0x8234, 0xF534, + 0x4D0A, 0x8234, 0xF535, + 0x4D0B, 0x8234, 0xF536, + 0x4D0C, 0x8234, 0xF537, + 0x4D0D, 0x8234, 0xF538, + 0x4D0E, 0x8234, 0xF539, + 0x4D0F, 0x8234, 0xF630, + 0x4D10, 0x8234, 0xF631, + 0x4D11, 0x8234, 0xF632, + 0x4D12, 0x8234, 0xF633, + 0x4D1A, 0x8234, 0xF634, + 0x4D1B, 0x8234, 0xF635, + 0x4D1C, 0x8234, 0xF636, + 0x4D1D, 0x8234, 0xF637, + 0x4D1E, 0x8234, 0xF638, + 0x4D1F, 0x8234, 0xF639, + 0x4D20, 0x8234, 0xF730, + 0x4D21, 0x8234, 0xF731, + 0x4D22, 0x8234, 0xF732, + 0x4D23, 0x8234, 0xF733, + 0x4D24, 0x8234, 0xF734, + 0x4D25, 0x8234, 0xF735, + 0x4D26, 0x8234, 0xF736, + 0x4D27, 0x8234, 0xF737, + 0x4D28, 0x8234, 0xF738, + 0x4D29, 0x8234, 0xF739, + 0x4D2A, 0x8234, 0xF830, + 0x4D2B, 0x8234, 0xF831, + 0x4D2C, 0x8234, 0xF832, + 0x4D2D, 0x8234, 0xF833, + 0x4D2E, 0x8234, 0xF834, + 0x4D2F, 0x8234, 0xF835, + 0x4D30, 0x8234, 0xF836, + 0x4D31, 0x8234, 0xF837, + 0x4D32, 0x8234, 0xF838, + 0x4D33, 0x8234, 0xF839, + 0x4D34, 0x8234, 0xF930, + 0x4D35, 0x8234, 0xF931, + 0x4D36, 0x8234, 0xF932, + 0x4D37, 0x8234, 0xF933, + 0x4D38, 0x8234, 0xF934, + 0x4D39, 0x8234, 0xF935, + 0x4D3A, 0x8234, 0xF936, + 0x4D3B, 0x8234, 0xF937, + 0x4D3C, 0x8234, 0xF938, + 0x4D3D, 0x8234, 0xF939, + 0x4D3E, 0x8234, 0xFA30, + 0x4D3F, 0x8234, 0xFA31, + 0x4D40, 0x8234, 0xFA32, + 0x4D41, 0x8234, 0xFA33, + 0x4D42, 0x8234, 0xFA34, + 0x4D43, 0x8234, 0xFA35, + 0x4D44, 0x8234, 0xFA36, + 0x4D45, 0x8234, 0xFA37, + 0x4D46, 0x8234, 0xFA38, + 0x4D47, 0x8234, 0xFA39, + 0x4D48, 0x8234, 0xFB30, + 0x4D49, 0x8234, 0xFB31, + 0x4D4A, 0x8234, 0xFB32, + 0x4D4B, 0x8234, 0xFB33, + 0x4D4C, 0x8234, 0xFB34, + 0x4D4D, 0x8234, 0xFB35, + 0x4D4E, 0x8234, 0xFB36, + 0x4D4F, 0x8234, 0xFB37, + 0x4D50, 0x8234, 0xFB38, + 0x4D51, 0x8234, 0xFB39, + 0x4D52, 0x8234, 0xFC30, + 0x4D53, 0x8234, 0xFC31, + 0x4D54, 0x8234, 0xFC32, + 0x4D55, 0x8234, 0xFC33, + 0x4D56, 0x8234, 0xFC34, + 0x4D57, 0x8234, 0xFC35, + 0x4D58, 0x8234, 0xFC36, + 0x4D59, 0x8234, 0xFC37, + 0x4D5A, 0x8234, 0xFC38, + 0x4D5B, 0x8234, 0xFC39, + 0x4D5C, 0x8234, 0xFD30, + 0x4D5D, 0x8234, 0xFD31, + 0x4D5E, 0x8234, 0xFD32, + 0x4D5F, 0x8234, 0xFD33, + 0x4D60, 0x8234, 0xFD34, + 0x4D61, 0x8234, 0xFD35, + 0x4D62, 0x8234, 0xFD36, + 0x4D63, 0x8234, 0xFD37, + 0x4D64, 0x8234, 0xFD38, + 0x4D65, 0x8234, 0xFD39, + 0x4D66, 0x8234, 0xFE30, + 0x4D67, 0x8234, 0xFE31, + 0x4D68, 0x8234, 0xFE32, + 0x4D69, 0x8234, 0xFE33, + 0x4D6A, 0x8234, 0xFE34, + 0x4D6B, 0x8234, 0xFE35, + 0x4D6C, 0x8234, 0xFE36, + 0x4D6D, 0x8234, 0xFE37, + 0x4D6E, 0x8234, 0xFE38, + 0x4D6F, 0x8234, 0xFE39, + 0x4D70, 0x8235, 0x8130, + 0x4D71, 0x8235, 0x8131, + 0x4D72, 0x8235, 0x8132, + 0x4D73, 0x8235, 0x8133, + 0x4D74, 0x8235, 0x8134, + 0x4D75, 0x8235, 0x8135, + 0x4D76, 0x8235, 0x8136, + 0x4D77, 0x8235, 0x8137, + 0x4D78, 0x8235, 0x8138, + 0x4D79, 0x8235, 0x8139, + 0x4D7A, 0x8235, 0x8230, + 0x4D7B, 0x8235, 0x8231, + 0x4D7C, 0x8235, 0x8232, + 0x4D7D, 0x8235, 0x8233, + 0x4D7E, 0x8235, 0x8234, + 0x4D7F, 0x8235, 0x8235, + 0x4D80, 0x8235, 0x8236, + 0x4D81, 0x8235, 0x8237, + 0x4D82, 0x8235, 0x8238, + 0x4D83, 0x8235, 0x8239, + 0x4D84, 0x8235, 0x8330, + 0x4D85, 0x8235, 0x8331, + 0x4D86, 0x8235, 0x8332, + 0x4D87, 0x8235, 0x8333, + 0x4D88, 0x8235, 0x8334, + 0x4D89, 0x8235, 0x8335, + 0x4D8A, 0x8235, 0x8336, + 0x4D8B, 0x8235, 0x8337, + 0x4D8C, 0x8235, 0x8338, + 0x4D8D, 0x8235, 0x8339, + 0x4D8E, 0x8235, 0x8430, + 0x4D8F, 0x8235, 0x8431, + 0x4D90, 0x8235, 0x8432, + 0x4D91, 0x8235, 0x8433, + 0x4D92, 0x8235, 0x8434, + 0x4D93, 0x8235, 0x8435, + 0x4D94, 0x8235, 0x8436, + 0x4D95, 0x8235, 0x8437, + 0x4D96, 0x8235, 0x8438, + 0x4D97, 0x8235, 0x8439, + 0x4D98, 0x8235, 0x8530, + 0x4D99, 0x8235, 0x8531, + 0x4D9A, 0x8235, 0x8532, + 0x4D9B, 0x8235, 0x8533, + 0x4D9C, 0x8235, 0x8534, + 0x4D9D, 0x8235, 0x8535, + 0x4D9E, 0x8235, 0x8536, + 0x4D9F, 0x8235, 0x8537, + 0x4DA0, 0x8235, 0x8538, + 0x4DA1, 0x8235, 0x8539, + 0x4DA2, 0x8235, 0x8630, + 0x4DA3, 0x8235, 0x8631, + 0x4DA4, 0x8235, 0x8632, + 0x4DA5, 0x8235, 0x8633, + 0x4DA6, 0x8235, 0x8634, + 0x4DA7, 0x8235, 0x8635, + 0x4DA8, 0x8235, 0x8636, + 0x4DA9, 0x8235, 0x8637, + 0x4DAA, 0x8235, 0x8638, + 0x4DAB, 0x8235, 0x8639, + 0x4DAC, 0x8235, 0x8730, + 0x4DAD, 0x8235, 0x8731, + 0x4DAF, 0x8235, 0x8732, + 0x4DB0, 0x8235, 0x8733, + 0x4DB1, 0x8235, 0x8734, + 0x4DB2, 0x8235, 0x8735, + 0x4DB3, 0x8235, 0x8736, + 0x4DB4, 0x8235, 0x8737, + 0x4DB5, 0x8235, 0x8738, + 0x4DB6, 0x8235, 0x8739, + 0x4DB7, 0x8235, 0x8830, + 0x4DB8, 0x8235, 0x8831, + 0x4DB9, 0x8235, 0x8832, + 0x4DBA, 0x8235, 0x8833, + 0x4DBB, 0x8235, 0x8834, + 0x4DBC, 0x8235, 0x8835, + 0x4DBD, 0x8235, 0x8836, + 0x4DBE, 0x8235, 0x8837, + 0x4DBF, 0x8235, 0x8838, + 0x4DC0, 0x8235, 0x8839, + 0x4DC1, 0x8235, 0x8930, + 0x4DC2, 0x8235, 0x8931, + 0x4DC3, 0x8235, 0x8932, + 0x4DC4, 0x8235, 0x8933, + 0x4DC5, 0x8235, 0x8934, + 0x4DC6, 0x8235, 0x8935, + 0x4DC7, 0x8235, 0x8936, + 0x4DC8, 0x8235, 0x8937, + 0x4DC9, 0x8235, 0x8938, + 0x4DCA, 0x8235, 0x8939, + 0x4DCB, 0x8235, 0x8A30, + 0x4DCC, 0x8235, 0x8A31, + 0x4DCD, 0x8235, 0x8A32, + 0x4DCE, 0x8235, 0x8A33, + 0x4DCF, 0x8235, 0x8A34, + 0x4DD0, 0x8235, 0x8A35, + 0x4DD1, 0x8235, 0x8A36, + 0x4DD2, 0x8235, 0x8A37, + 0x4DD3, 0x8235, 0x8A38, + 0x4DD4, 0x8235, 0x8A39, + 0x4DD5, 0x8235, 0x8B30, + 0x4DD6, 0x8235, 0x8B31, + 0x4DD7, 0x8235, 0x8B32, + 0x4DD8, 0x8235, 0x8B33, + 0x4DD9, 0x8235, 0x8B34, + 0x4DDA, 0x8235, 0x8B35, + 0x4DDB, 0x8235, 0x8B36, + 0x4DDC, 0x8235, 0x8B37, + 0x4DDD, 0x8235, 0x8B38, + 0x4DDE, 0x8235, 0x8B39, + 0x4DDF, 0x8235, 0x8C30, + 0x4DE0, 0x8235, 0x8C31, + 0x4DE1, 0x8235, 0x8C32, + 0x4DE2, 0x8235, 0x8C33, + 0x4DE3, 0x8235, 0x8C34, + 0x4DE4, 0x8235, 0x8C35, + 0x4DE5, 0x8235, 0x8C36, + 0x4DE6, 0x8235, 0x8C37, + 0x4DE7, 0x8235, 0x8C38, + 0x4DE8, 0x8235, 0x8C39, + 0x4DE9, 0x8235, 0x8D30, + 0x4DEA, 0x8235, 0x8D31, + 0x4DEB, 0x8235, 0x8D32, + 0x4DEC, 0x8235, 0x8D33, + 0x4DED, 0x8235, 0x8D34, + 0x4DEE, 0x8235, 0x8D35, + 0x4DEF, 0x8235, 0x8D36, + 0x4DF0, 0x8235, 0x8D37, + 0x4DF1, 0x8235, 0x8D38, + 0x4DF2, 0x8235, 0x8D39, + 0x4DF3, 0x8235, 0x8E30, + 0x4DF4, 0x8235, 0x8E31, + 0x4DF5, 0x8235, 0x8E32, + 0x4DF6, 0x8235, 0x8E33, + 0x4DF7, 0x8235, 0x8E34, + 0x4DF8, 0x8235, 0x8E35, + 0x4DF9, 0x8235, 0x8E36, + 0x4DFA, 0x8235, 0x8E37, + 0x4DFB, 0x8235, 0x8E38, + 0x4DFC, 0x8235, 0x8E39, + 0x4DFD, 0x8235, 0x8F30, + 0x4DFE, 0x8235, 0x8F31, + 0x4DFF, 0x8235, 0x8F32, + 0xE76C, 0x8336, 0xC739, + 0xE7C8, 0x8336, 0xC830, + 0xE7E7, 0x8336, 0xC831, + 0xE7E8, 0x8336, 0xC832, + 0xE7E9, 0x8336, 0xC833, + 0xE7EA, 0x8336, 0xC834, + 0xE7EB, 0x8336, 0xC835, + 0xE7EC, 0x8336, 0xC836, + 0xE7ED, 0x8336, 0xC837, + 0xE7EE, 0x8336, 0xC838, + 0xE7EF, 0x8336, 0xC839, + 0xE7F0, 0x8336, 0xC930, + 0xE7F1, 0x8336, 0xC931, + 0xE7F2, 0x8336, 0xC932, + 0xE7F3, 0x8336, 0xC933, + 0xE815, 0x8336, 0xC934, + 0xE819, 0x8336, 0xC935, + 0xE81A, 0x8336, 0xC936, + 0xE81B, 0x8336, 0xC937, + 0xE81C, 0x8336, 0xC938, + 0xE81D, 0x8336, 0xC939, + 0xE81F, 0x8336, 0xCA30, + 0xE820, 0x8336, 0xCA31, + 0xE821, 0x8336, 0xCA32, + 0xE822, 0x8336, 0xCA33, + 0xE823, 0x8336, 0xCA34, + 0xE824, 0x8336, 0xCA35, + 0xE825, 0x8336, 0xCA36, + 0xE827, 0x8336, 0xCA37, + 0xE828, 0x8336, 0xCA38, + 0xE829, 0x8336, 0xCA39, + 0xE82A, 0x8336, 0xCB30, + 0xE82D, 0x8336, 0xCB31, + 0xE82E, 0x8336, 0xCB32, + 0xE82F, 0x8336, 0xCB33, + 0xE830, 0x8336, 0xCB34, + 0xE833, 0x8336, 0xCB35, + 0xE834, 0x8336, 0xCB36, + 0xE835, 0x8336, 0xCB37, + 0xE836, 0x8336, 0xCB38, + 0xE837, 0x8336, 0xCB39, + 0xE838, 0x8336, 0xCC30, + 0xE839, 0x8336, 0xCC31, + 0xE83A, 0x8336, 0xCC32, + 0xE83C, 0x8336, 0xCC33, + 0xE83D, 0x8336, 0xCC34, + 0xE83E, 0x8336, 0xCC35, + 0xE83F, 0x8336, 0xCC36, + 0xE840, 0x8336, 0xCC37, + 0xE841, 0x8336, 0xCC38, + 0xE842, 0x8336, 0xCC39, + 0xE844, 0x8336, 0xCD30, + 0xE845, 0x8336, 0xCD31, + 0xE846, 0x8336, 0xCD32, + 0xE847, 0x8336, 0xCD33, + 0xE848, 0x8336, 0xCD34, + 0xE849, 0x8336, 0xCD35, + 0xE84A, 0x8336, 0xCD36, + 0xE84B, 0x8336, 0xCD37, + 0xE84C, 0x8336, 0xCD38, + 0xE84D, 0x8336, 0xCD39, + 0xE84E, 0x8336, 0xCE30, + 0xE84F, 0x8336, 0xCE31, + 0xE850, 0x8336, 0xCE32, + 0xE851, 0x8336, 0xCE33, + 0xE852, 0x8336, 0xCE34, + 0xE853, 0x8336, 0xCE35, + 0xE856, 0x8336, 0xCE36, + 0xE857, 0x8336, 0xCE37, + 0xE858, 0x8336, 0xCE38, + 0xE859, 0x8336, 0xCE39, + 0xE85A, 0x8336, 0xCF30, + 0xE85B, 0x8336, 0xCF31, + 0xE85C, 0x8336, 0xCF32, + 0xE85D, 0x8336, 0xCF33, + 0xE85E, 0x8336, 0xCF34, + 0xE85F, 0x8336, 0xCF35, + 0xE860, 0x8336, 0xCF36, + 0xE861, 0x8336, 0xCF37, + 0xE862, 0x8336, 0xCF38, + 0xE863, 0x8336, 0xCF39, + 0xF92D, 0x8430, 0x8535, + 0xF92E, 0x8430, 0x8536, + 0xF92F, 0x8430, 0x8537, + 0xF930, 0x8430, 0x8538, + 0xF931, 0x8430, 0x8539, + 0xF932, 0x8430, 0x8630, + 0xF933, 0x8430, 0x8631, + 0xF934, 0x8430, 0x8632, + 0xF935, 0x8430, 0x8633, + 0xF936, 0x8430, 0x8634, + 0xF937, 0x8430, 0x8635, + 0xF938, 0x8430, 0x8636, + 0xF939, 0x8430, 0x8637, + 0xF93A, 0x8430, 0x8638, + 0xF93B, 0x8430, 0x8639, + 0xF93C, 0x8430, 0x8730, + 0xF93D, 0x8430, 0x8731, + 0xF93E, 0x8430, 0x8732, + 0xF93F, 0x8430, 0x8733, + 0xF940, 0x8430, 0x8734, + 0xF941, 0x8430, 0x8735, + 0xF942, 0x8430, 0x8736, + 0xF943, 0x8430, 0x8737, + 0xF944, 0x8430, 0x8738, + 0xF945, 0x8430, 0x8739, + 0xF946, 0x8430, 0x8830, + 0xF947, 0x8430, 0x8831, + 0xF948, 0x8430, 0x8832, + 0xF949, 0x8430, 0x8833, + 0xF94A, 0x8430, 0x8834, + 0xF94B, 0x8430, 0x8835, + 0xF94C, 0x8430, 0x8836, + 0xF94D, 0x8430, 0x8837, + 0xF94E, 0x8430, 0x8838, + 0xF94F, 0x8430, 0x8839, + 0xF950, 0x8430, 0x8930, + 0xF951, 0x8430, 0x8931, + 0xF952, 0x8430, 0x8932, + 0xF953, 0x8430, 0x8933, + 0xF954, 0x8430, 0x8934, + 0xF955, 0x8430, 0x8935, + 0xF956, 0x8430, 0x8936, + 0xF957, 0x8430, 0x8937, + 0xF958, 0x8430, 0x8938, + 0xF959, 0x8430, 0x8939, + 0xF95A, 0x8430, 0x8A30, + 0xF95B, 0x8430, 0x8A31, + 0xF95C, 0x8430, 0x8A32, + 0xF95D, 0x8430, 0x8A33, + 0xF95E, 0x8430, 0x8A34, + 0xF95F, 0x8430, 0x8A35, + 0xF960, 0x8430, 0x8A36, + 0xF961, 0x8430, 0x8A37, + 0xF962, 0x8430, 0x8A38, + 0xF963, 0x8430, 0x8A39, + 0xF964, 0x8430, 0x8B30, + 0xF965, 0x8430, 0x8B31, + 0xF966, 0x8430, 0x8B32, + 0xF967, 0x8430, 0x8B33, + 0xF968, 0x8430, 0x8B34, + 0xF969, 0x8430, 0x8B35, + 0xF96A, 0x8430, 0x8B36, + 0xF96B, 0x8430, 0x8B37, + 0xF96C, 0x8430, 0x8B38, + 0xF96D, 0x8430, 0x8B39, + 0xF96E, 0x8430, 0x8C30, + 0xF96F, 0x8430, 0x8C31, + 0xF970, 0x8430, 0x8C32, + 0xF971, 0x8430, 0x8C33, + 0xF972, 0x8430, 0x8C34, + 0xF973, 0x8430, 0x8C35, + 0xF974, 0x8430, 0x8C36, + 0xF975, 0x8430, 0x8C37, + 0xF976, 0x8430, 0x8C38, + 0xF977, 0x8430, 0x8C39, + 0xF978, 0x8430, 0x8D30, + 0xF97A, 0x8430, 0x8D31, + 0xF97B, 0x8430, 0x8D32, + 0xF97C, 0x8430, 0x8D33, + 0xF97D, 0x8430, 0x8D34, + 0xF97E, 0x8430, 0x8D35, + 0xF97F, 0x8430, 0x8D36, + 0xF980, 0x8430, 0x8D37, + 0xF981, 0x8430, 0x8D38, + 0xF982, 0x8430, 0x8D39, + 0xF983, 0x8430, 0x8E30, + 0xF984, 0x8430, 0x8E31, + 0xF985, 0x8430, 0x8E32, + 0xF986, 0x8430, 0x8E33, + 0xF987, 0x8430, 0x8E34, + 0xF988, 0x8430, 0x8E35, + 0xF989, 0x8430, 0x8E36, + 0xF98A, 0x8430, 0x8E37, + 0xF98B, 0x8430, 0x8E38, + 0xF98C, 0x8430, 0x8E39, + 0xF98D, 0x8430, 0x8F30, + 0xF98E, 0x8430, 0x8F31, + 0xF98F, 0x8430, 0x8F32, + 0xF990, 0x8430, 0x8F33, + 0xF991, 0x8430, 0x8F34, + 0xF992, 0x8430, 0x8F35, + 0xF993, 0x8430, 0x8F36, + 0xF994, 0x8430, 0x8F37, + 0xF996, 0x8430, 0x8F38, + 0xF997, 0x8430, 0x8F39, + 0xF998, 0x8430, 0x9030, + 0xF999, 0x8430, 0x9031, + 0xF99A, 0x8430, 0x9032, + 0xF99B, 0x8430, 0x9033, + 0xF99C, 0x8430, 0x9034, + 0xF99D, 0x8430, 0x9035, + 0xF99E, 0x8430, 0x9036, + 0xF99F, 0x8430, 0x9037, + 0xF9A0, 0x8430, 0x9038, + 0xF9A1, 0x8430, 0x9039, + 0xF9A2, 0x8430, 0x9130, + 0xF9A3, 0x8430, 0x9131, + 0xF9A4, 0x8430, 0x9132, + 0xF9A5, 0x8430, 0x9133, + 0xF9A6, 0x8430, 0x9134, + 0xF9A7, 0x8430, 0x9135, + 0xF9A8, 0x8430, 0x9136, + 0xF9A9, 0x8430, 0x9137, + 0xF9AA, 0x8430, 0x9138, + 0xF9AB, 0x8430, 0x9139, + 0xF9AC, 0x8430, 0x9230, + 0xF9AD, 0x8430, 0x9231, + 0xF9AE, 0x8430, 0x9232, + 0xF9AF, 0x8430, 0x9233, + 0xF9B0, 0x8430, 0x9234, + 0xF9B1, 0x8430, 0x9235, + 0xF9B2, 0x8430, 0x9236, + 0xF9B3, 0x8430, 0x9237, + 0xF9B4, 0x8430, 0x9238, + 0xF9B5, 0x8430, 0x9239, + 0xF9B6, 0x8430, 0x9330, + 0xF9B7, 0x8430, 0x9331, + 0xF9B8, 0x8430, 0x9332, + 0xF9B9, 0x8430, 0x9333, + 0xF9BA, 0x8430, 0x9334, + 0xF9BB, 0x8430, 0x9335, + 0xF9BC, 0x8430, 0x9336, + 0xF9BD, 0x8430, 0x9337, + 0xF9BE, 0x8430, 0x9338, + 0xF9BF, 0x8430, 0x9339, + 0xF9C0, 0x8430, 0x9430, + 0xF9C1, 0x8430, 0x9431, + 0xF9C2, 0x8430, 0x9432, + 0xF9C3, 0x8430, 0x9433, + 0xF9C4, 0x8430, 0x9434, + 0xF9C5, 0x8430, 0x9435, + 0xF9C6, 0x8430, 0x9436, + 0xF9C7, 0x8430, 0x9437, + 0xF9C8, 0x8430, 0x9438, + 0xF9C9, 0x8430, 0x9439, + 0xF9CA, 0x8430, 0x9530, + 0xF9CB, 0x8430, 0x9531, + 0xF9CC, 0x8430, 0x9532, + 0xF9CD, 0x8430, 0x9533, + 0xF9CE, 0x8430, 0x9534, + 0xF9CF, 0x8430, 0x9535, + 0xF9D0, 0x8430, 0x9536, + 0xF9D1, 0x8430, 0x9537, + 0xF9D2, 0x8430, 0x9538, + 0xF9D3, 0x8430, 0x9539, + 0xF9D4, 0x8430, 0x9630, + 0xF9D5, 0x8430, 0x9631, + 0xF9D6, 0x8430, 0x9632, + 0xF9D7, 0x8430, 0x9633, + 0xF9D8, 0x8430, 0x9634, + 0xF9D9, 0x8430, 0x9635, + 0xF9DA, 0x8430, 0x9636, + 0xF9DB, 0x8430, 0x9637, + 0xF9DC, 0x8430, 0x9638, + 0xF9DD, 0x8430, 0x9639, + 0xF9DE, 0x8430, 0x9730, + 0xF9DF, 0x8430, 0x9731, + 0xF9E0, 0x8430, 0x9732, + 0xF9E1, 0x8430, 0x9733, + 0xF9E2, 0x8430, 0x9734, + 0xF9E3, 0x8430, 0x9735, + 0xF9E4, 0x8430, 0x9736, + 0xF9E5, 0x8430, 0x9737, + 0xF9E6, 0x8430, 0x9738, + 0xF9E8, 0x8430, 0x9739, + 0xF9E9, 0x8430, 0x9830, + 0xF9EA, 0x8430, 0x9831, + 0xF9EB, 0x8430, 0x9832, + 0xF9EC, 0x8430, 0x9833, + 0xF9ED, 0x8430, 0x9834, + 0xF9EE, 0x8430, 0x9835, + 0xF9EF, 0x8430, 0x9836, + 0xF9F0, 0x8430, 0x9837, + 0xF9F2, 0x8430, 0x9838, + 0xF9F3, 0x8430, 0x9839, + 0xF9F4, 0x8430, 0x9930, + 0xF9F5, 0x8430, 0x9931, + 0xF9F6, 0x8430, 0x9932, + 0xF9F7, 0x8430, 0x9933, + 0xF9F8, 0x8430, 0x9934, + 0xF9F9, 0x8430, 0x9935, + 0xF9FA, 0x8430, 0x9936, + 0xF9FB, 0x8430, 0x9937, + 0xF9FC, 0x8430, 0x9938, + 0xF9FD, 0x8430, 0x9939, + 0xF9FE, 0x8430, 0x9A30, + 0xF9FF, 0x8430, 0x9A31, + 0xFA00, 0x8430, 0x9A32, + 0xFA01, 0x8430, 0x9A33, + 0xFA02, 0x8430, 0x9A34, + 0xFA03, 0x8430, 0x9A35, + 0xFA04, 0x8430, 0x9A36, + 0xFA05, 0x8430, 0x9A37, + 0xFA06, 0x8430, 0x9A38, + 0xFA07, 0x8430, 0x9A39, + 0xFA08, 0x8430, 0x9B30, + 0xFA09, 0x8430, 0x9B31, + 0xFA0A, 0x8430, 0x9B32, + 0xFA0B, 0x8430, 0x9B33, + 0xFA10, 0x8430, 0x9B34, + 0xFA12, 0x8430, 0x9B35, + 0xFA15, 0x8430, 0x9B36, + 0xFA16, 0x8430, 0x9B37, + 0xFA17, 0x8430, 0x9B38, + 0xFA19, 0x8430, 0x9B39, + 0xFA1A, 0x8430, 0x9C30, + 0xFA1B, 0x8430, 0x9C31, + 0xFA1C, 0x8430, 0x9C32, + 0xFA1D, 0x8430, 0x9C33, + 0xFA1E, 0x8430, 0x9C34, + 0xFA22, 0x8430, 0x9C35, + 0xFA25, 0x8430, 0x9C36, + 0xFA26, 0x8430, 0x9C37, + 0xFE32, 0x8431, 0x8538, + 0xFE45, 0x8431, 0x8539, + 0xFE46, 0x8431, 0x8630, + 0xFE47, 0x8431, 0x8631, + 0xFE48, 0x8431, 0x8632, + 0xFE53, 0x8431, 0x8633, + 0xFE58, 0x8431, 0x8634, + 0xFE67, 0x8431, 0x8635, + 0xFE6C, 0x8431, 0x8636, + 0xFE6D, 0x8431, 0x8637, + 0xFE6E, 0x8431, 0x8638, + 0xFE6F, 0x8431, 0x8639, + 0xFE70, 0x8431, 0x8730, + 0xFE71, 0x8431, 0x8731, + 0xFE72, 0x8431, 0x8732, + 0xFE73, 0x8431, 0x8733, + 0xFE74, 0x8431, 0x8734, + 0xFE75, 0x8431, 0x8735, + 0xFE76, 0x8431, 0x8736, + 0xFE77, 0x8431, 0x8737, + 0xFE78, 0x8431, 0x8738, + 0xFE79, 0x8431, 0x8739, + 0xFE7A, 0x8431, 0x8830, + 0xFE7B, 0x8431, 0x8831, + 0xFE7C, 0x8431, 0x8832, + 0xFE7D, 0x8431, 0x8833, + 0xFE7E, 0x8431, 0x8834, + 0xFE7F, 0x8431, 0x8835, + 0xFE80, 0x8431, 0x8836, + 0xFE81, 0x8431, 0x8837, + 0xFE82, 0x8431, 0x8838, + 0xFE83, 0x8431, 0x8839, + 0xFE84, 0x8431, 0x8930, + 0xFE85, 0x8431, 0x8931, + 0xFE86, 0x8431, 0x8932, + 0xFE87, 0x8431, 0x8933, + 0xFE88, 0x8431, 0x8934, + 0xFE89, 0x8431, 0x8935, + 0xFE8A, 0x8431, 0x8936, + 0xFE8B, 0x8431, 0x8937, + 0xFE8C, 0x8431, 0x8938, + 0xFE8D, 0x8431, 0x8939, + 0xFE8E, 0x8431, 0x8A30, + 0xFE8F, 0x8431, 0x8A31, + 0xFE90, 0x8431, 0x8A32, + 0xFE91, 0x8431, 0x8A33, + 0xFE92, 0x8431, 0x8A34, + 0xFE93, 0x8431, 0x8A35, + 0xFE94, 0x8431, 0x8A36, + 0xFE95, 0x8431, 0x8A37, + 0xFE96, 0x8431, 0x8A38, + 0xFE97, 0x8431, 0x8A39, + 0xFE98, 0x8431, 0x8B30, + 0xFE99, 0x8431, 0x8B31, + 0xFE9A, 0x8431, 0x8B32, + 0xFE9B, 0x8431, 0x8B33, + 0xFE9C, 0x8431, 0x8B34, + 0xFE9D, 0x8431, 0x8B35, + 0xFE9E, 0x8431, 0x8B36, + 0xFE9F, 0x8431, 0x8B37, + 0xFEA0, 0x8431, 0x8B38, + 0xFEA1, 0x8431, 0x8B39, + 0xFEA2, 0x8431, 0x8C30, + 0xFEA3, 0x8431, 0x8C31, + 0xFEA4, 0x8431, 0x8C32, + 0xFEA5, 0x8431, 0x8C33, + 0xFEA6, 0x8431, 0x8C34, + 0xFEA7, 0x8431, 0x8C35, + 0xFEA8, 0x8431, 0x8C36, + 0xFEA9, 0x8431, 0x8C37, + 0xFEAA, 0x8431, 0x8C38, + 0xFEAB, 0x8431, 0x8C39, + 0xFEAC, 0x8431, 0x8D30, + 0xFEAD, 0x8431, 0x8D31, + 0xFEAE, 0x8431, 0x8D32, + 0xFEAF, 0x8431, 0x8D33, + 0xFEB0, 0x8431, 0x8D34, + 0xFEB1, 0x8431, 0x8D35, + 0xFEB2, 0x8431, 0x8D36, + 0xFEB3, 0x8431, 0x8D37, + 0xFEB4, 0x8431, 0x8D38, + 0xFEB5, 0x8431, 0x8D39, + 0xFEB6, 0x8431, 0x8E30, + 0xFEB7, 0x8431, 0x8E31, + 0xFEB8, 0x8431, 0x8E32, + 0xFEB9, 0x8431, 0x8E33, + 0xFEBA, 0x8431, 0x8E34, + 0xFEBB, 0x8431, 0x8E35, + 0xFEBC, 0x8431, 0x8E36, + 0xFEBD, 0x8431, 0x8E37, + 0xFEBE, 0x8431, 0x8E38, + 0xFEBF, 0x8431, 0x8E39, + 0xFEC0, 0x8431, 0x8F30, + 0xFEC1, 0x8431, 0x8F31, + 0xFEC2, 0x8431, 0x8F32, + 0xFEC3, 0x8431, 0x8F33, + 0xFEC4, 0x8431, 0x8F34, + 0xFEC5, 0x8431, 0x8F35, + 0xFEC6, 0x8431, 0x8F36, + 0xFEC7, 0x8431, 0x8F37, + 0xFEC8, 0x8431, 0x8F38, + 0xFEC9, 0x8431, 0x8F39, + 0xFECA, 0x8431, 0x9030, + 0xFECB, 0x8431, 0x9031, + 0xFECC, 0x8431, 0x9032, + 0xFECD, 0x8431, 0x9033, + 0xFECE, 0x8431, 0x9034, + 0xFECF, 0x8431, 0x9035, + 0xFED0, 0x8431, 0x9036, + 0xFED1, 0x8431, 0x9037, + 0xFED2, 0x8431, 0x9038, + 0xFED3, 0x8431, 0x9039, + 0xFED4, 0x8431, 0x9130, + 0xFED5, 0x8431, 0x9131, + 0xFED6, 0x8431, 0x9132, + 0xFED7, 0x8431, 0x9133, + 0xFED8, 0x8431, 0x9134, + 0xFED9, 0x8431, 0x9135, + 0xFEDA, 0x8431, 0x9136, + 0xFEDB, 0x8431, 0x9137, + 0xFEDC, 0x8431, 0x9138, + 0xFEDD, 0x8431, 0x9139, + 0xFEDE, 0x8431, 0x9230, + 0xFEDF, 0x8431, 0x9231, + 0xFEE0, 0x8431, 0x9232, + 0xFEE1, 0x8431, 0x9233, + 0xFEE2, 0x8431, 0x9234, + 0xFEE3, 0x8431, 0x9235, + 0xFEE4, 0x8431, 0x9236, + 0xFEE5, 0x8431, 0x9237, + 0xFEE6, 0x8431, 0x9238, + 0xFEE7, 0x8431, 0x9239, + 0xFEE8, 0x8431, 0x9330, + 0xFEE9, 0x8431, 0x9331, + 0xFEEA, 0x8431, 0x9332, + 0xFEEB, 0x8431, 0x9333, + 0xFEEC, 0x8431, 0x9334, + 0xFEED, 0x8431, 0x9335, + 0xFEEE, 0x8431, 0x9336, + 0xFEEF, 0x8431, 0x9337, + 0xFEF0, 0x8431, 0x9338, + 0xFEF1, 0x8431, 0x9339, + 0xFEF2, 0x8431, 0x9430, + 0xFEF3, 0x8431, 0x9431, + 0xFEF4, 0x8431, 0x9432, + 0xFEF5, 0x8431, 0x9433, + 0xFEF6, 0x8431, 0x9434, + 0xFEF7, 0x8431, 0x9435, + 0xFEF8, 0x8431, 0x9436, + 0xFEF9, 0x8431, 0x9437, + 0xFEFA, 0x8431, 0x9438, + 0xFEFB, 0x8431, 0x9439, + 0xFEFC, 0x8431, 0x9530, + 0xFEFD, 0x8431, 0x9531, + 0xFEFE, 0x8431, 0x9532, + 0xFEFF, 0x8431, 0x9533, + 0xFF00, 0x8431, 0x9534, + 0xFF5F, 0x8431, 0x9535, + 0xFF60, 0x8431, 0x9536, + 0xFF61, 0x8431, 0x9537, + 0xFF62, 0x8431, 0x9538, + 0xFF63, 0x8431, 0x9539, + 0xFF64, 0x8431, 0x9630, + 0xFF65, 0x8431, 0x9631, + 0xFF66, 0x8431, 0x9632, + 0xFF67, 0x8431, 0x9633, + 0xFF68, 0x8431, 0x9634, + 0xFF69, 0x8431, 0x9635, + 0xFF6A, 0x8431, 0x9636, + 0xFF6B, 0x8431, 0x9637, + 0xFF6C, 0x8431, 0x9638, + 0xFF6D, 0x8431, 0x9639, + 0xFF6E, 0x8431, 0x9730, + 0xFF6F, 0x8431, 0x9731, + 0xFF70, 0x8431, 0x9732, + 0xFF71, 0x8431, 0x9733, + 0xFF72, 0x8431, 0x9734, + 0xFF73, 0x8431, 0x9735, + 0xFF74, 0x8431, 0x9736, + 0xFF75, 0x8431, 0x9737, + 0xFF76, 0x8431, 0x9738, + 0xFF77, 0x8431, 0x9739, + 0xFF78, 0x8431, 0x9830, + 0xFF79, 0x8431, 0x9831, + 0xFF7A, 0x8431, 0x9832, + 0xFF7B, 0x8431, 0x9833, + 0xFF7C, 0x8431, 0x9834, + 0xFF7D, 0x8431, 0x9835, + 0xFF7E, 0x8431, 0x9836, + 0xFF7F, 0x8431, 0x9837, + 0xFF80, 0x8431, 0x9838, + 0xFF81, 0x8431, 0x9839, + 0xFF82, 0x8431, 0x9930, + 0xFF83, 0x8431, 0x9931, + 0xFF84, 0x8431, 0x9932, + 0xFF85, 0x8431, 0x9933, + 0xFF86, 0x8431, 0x9934, + 0xFF87, 0x8431, 0x9935, + 0xFF88, 0x8431, 0x9936, + 0xFF89, 0x8431, 0x9937, + 0xFF8A, 0x8431, 0x9938, + 0xFF8B, 0x8431, 0x9939, + 0xFF8C, 0x8431, 0x9A30, + 0xFF8D, 0x8431, 0x9A31, + 0xFF8E, 0x8431, 0x9A32, + 0xFF8F, 0x8431, 0x9A33, + 0xFF90, 0x8431, 0x9A34, + 0xFF91, 0x8431, 0x9A35, + 0xFF92, 0x8431, 0x9A36, + 0xFF93, 0x8431, 0x9A37, + 0xFF94, 0x8431, 0x9A38, + 0xFF95, 0x8431, 0x9A39, + 0xFF96, 0x8431, 0x9B30, + 0xFF97, 0x8431, 0x9B31, + 0xFF98, 0x8431, 0x9B32, + 0xFF99, 0x8431, 0x9B33, + 0xFF9A, 0x8431, 0x9B34, + 0xFF9B, 0x8431, 0x9B35, + 0xFF9C, 0x8431, 0x9B36, + 0xFF9D, 0x8431, 0x9B37, + 0xFF9E, 0x8431, 0x9B38, + 0xFF9F, 0x8431, 0x9B39, + 0xFFA0, 0x8431, 0x9C30, + 0xFFA1, 0x8431, 0x9C31, + 0xFFA2, 0x8431, 0x9C32, + 0xFFA3, 0x8431, 0x9C33, + 0xFFA4, 0x8431, 0x9C34, + 0xFFA5, 0x8431, 0x9C35, + 0xFFA6, 0x8431, 0x9C36, + 0xFFA7, 0x8431, 0x9C37, + 0xFFA8, 0x8431, 0x9C38, + 0xFFA9, 0x8431, 0x9C39, + 0xFFAA, 0x8431, 0x9D30, + 0xFFAB, 0x8431, 0x9D31, + 0xFFAC, 0x8431, 0x9D32, + 0xFFAD, 0x8431, 0x9D33, + 0xFFAE, 0x8431, 0x9D34, + 0xFFAF, 0x8431, 0x9D35, + 0xFFB0, 0x8431, 0x9D36, + 0xFFB1, 0x8431, 0x9D37, + 0xFFB2, 0x8431, 0x9D38, + 0xFFB3, 0x8431, 0x9D39, + 0xFFB4, 0x8431, 0x9E30, + 0xFFB5, 0x8431, 0x9E31, + 0xFFB6, 0x8431, 0x9E32, + 0xFFB7, 0x8431, 0x9E33, + 0xFFB8, 0x8431, 0x9E34, + 0xFFB9, 0x8431, 0x9E35, + 0xFFBA, 0x8431, 0x9E36, + 0xFFBB, 0x8431, 0x9E37, + 0xFFBC, 0x8431, 0x9E38, + 0xFFBD, 0x8431, 0x9E39, + 0xFFBE, 0x8431, 0x9F30, + 0xFFBF, 0x8431, 0x9F31, + 0xFFC0, 0x8431, 0x9F32, + 0xFFC1, 0x8431, 0x9F33, + 0xFFC2, 0x8431, 0x9F34, + 0xFFC3, 0x8431, 0x9F35, + 0xFFC4, 0x8431, 0x9F36, + 0xFFC5, 0x8431, 0x9F37, + 0xFFC6, 0x8431, 0x9F38, + 0xFFC7, 0x8431, 0x9F39, + 0xFFC8, 0x8431, 0xA030, + 0xFFC9, 0x8431, 0xA031, + 0xFFCA, 0x8431, 0xA032, + 0xFFCB, 0x8431, 0xA033, + 0xFFCC, 0x8431, 0xA034, + 0xFFCD, 0x8431, 0xA035, + 0xFFCE, 0x8431, 0xA036, + 0xFFCF, 0x8431, 0xA037, + 0xFFD0, 0x8431, 0xA038, + 0xFFD1, 0x8431, 0xA039, + 0xFFD2, 0x8431, 0xA130, + 0xFFD3, 0x8431, 0xA131, + 0xFFD4, 0x8431, 0xA132, + 0xFFD5, 0x8431, 0xA133, + 0xFFD6, 0x8431, 0xA134, + 0xFFD7, 0x8431, 0xA135, + 0xFFD8, 0x8431, 0xA136, + 0xFFD9, 0x8431, 0xA137, + 0xFFDA, 0x8431, 0xA138, + 0xFFDB, 0x8431, 0xA139, + 0xFFDC, 0x8431, 0xA230, + 0xFFDD, 0x8431, 0xA231, + 0xFFDE, 0x8431, 0xA232, + 0xFFDF, 0x8431, 0xA233 +}; \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/gb2312.h b/3rdparty/zint-2.6.1/backend/gb2312.h new file mode 100644 index 0000000..56cc4b2 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/gb2312.h @@ -0,0 +1,7478 @@ +/* gb2312.h - Unicode to GB 2312-1980 lookup table + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +static const unsigned short int gb2312_lookup[] = { + 0x00A4, 0xA1E8, + 0x00A7, 0xA1EC, + 0x00A8, 0xA1A7, + 0x00B0, 0xA1E3, + 0x00B1, 0xA1C0, + 0x00B7, 0xA1A4, + 0x00D7, 0xA1C1, + 0x00E0, 0xA8A4, + 0x00E1, 0xA8A2, + 0x00E8, 0xA8A8, + 0x00E9, 0xA8A6, + 0x00EA, 0xA8BA, + 0x00EC, 0xA8AC, + 0x00ED, 0xA8AA, + 0x00F2, 0xA8B0, + 0x00F3, 0xA8AE, + 0x00F7, 0xA1C2, + 0x00F9, 0xA8B4, + 0x00FA, 0xA8B2, + 0x00FC, 0xA8B9, + 0x0101, 0xA8A1, + 0x0113, 0xA8A5, + 0x011B, 0xA8A7, + 0x012B, 0xA8A9, + 0x014D, 0xA8AD, + 0x016B, 0xA8B1, + 0x01CE, 0xA8A3, + 0x01D0, 0xA8AB, + 0x01D2, 0xA8AF, + 0x01D4, 0xA8B3, + 0x01D6, 0xA8B5, + 0x01D8, 0xA8B6, + 0x01DA, 0xA8B7, + 0x01DC, 0xA8B8, + 0x02C7, 0xA1A6, + 0x02C9, 0xA1A5, + 0x0391, 0xA6A1, + 0x0392, 0xA6A2, + 0x0393, 0xA6A3, + 0x0394, 0xA6A4, + 0x0395, 0xA6A5, + 0x0396, 0xA6A6, + 0x0397, 0xA6A7, + 0x0398, 0xA6A8, + 0x0399, 0xA6A9, + 0x039A, 0xA6AA, + 0x039B, 0xA6AB, + 0x039C, 0xA6AC, + 0x039D, 0xA6AD, + 0x039E, 0xA6AE, + 0x039F, 0xA6AF, + 0x03A0, 0xA6B0, + 0x03A1, 0xA6B1, + 0x03A3, 0xA6B2, + 0x03A4, 0xA6B3, + 0x03A5, 0xA6B4, + 0x03A6, 0xA6B5, + 0x03A7, 0xA6B6, + 0x03A8, 0xA6B7, + 0x03A9, 0xA6B8, + 0x03B1, 0xA6C1, + 0x03B2, 0xA6C2, + 0x03B3, 0xA6C3, + 0x03B4, 0xA6C4, + 0x03B5, 0xA6C5, + 0x03B6, 0xA6C6, + 0x03B7, 0xA6C7, + 0x03B8, 0xA6C8, + 0x03B9, 0xA6C9, + 0x03BA, 0xA6CA, + 0x03BB, 0xA6CB, + 0x03BC, 0xA6CC, + 0x03BD, 0xA6CD, + 0x03BE, 0xA6CE, + 0x03BF, 0xA6CF, + 0x03C0, 0xA6D0, + 0x03C1, 0xA6D1, + 0x03C3, 0xA6D2, + 0x03C4, 0xA6D3, + 0x03C5, 0xA6D4, + 0x03C6, 0xA6D5, + 0x03C7, 0xA6D6, + 0x03C8, 0xA6D7, + 0x03C9, 0xA6D8, + 0x0401, 0xA7A7, + 0x0410, 0xA7A1, + 0x0411, 0xA7A2, + 0x0412, 0xA7A3, + 0x0413, 0xA7A4, + 0x0414, 0xA7A5, + 0x0415, 0xA7A6, + 0x0416, 0xA7A8, + 0x0417, 0xA7A9, + 0x0418, 0xA7AA, + 0x0419, 0xA7AB, + 0x041A, 0xA7AC, + 0x041B, 0xA7AD, + 0x041C, 0xA7AE, + 0x041D, 0xA7AF, + 0x041E, 0xA7B0, + 0x041F, 0xA7B1, + 0x0420, 0xA7B2, + 0x0421, 0xA7B3, + 0x0422, 0xA7B4, + 0x0423, 0xA7B5, + 0x0424, 0xA7B6, + 0x0425, 0xA7B7, + 0x0426, 0xA7B8, + 0x0427, 0xA7B9, + 0x0428, 0xA7BA, + 0x0429, 0xA7BB, + 0x042A, 0xA7BC, + 0x042B, 0xA7BD, + 0x042C, 0xA7BE, + 0x042D, 0xA7BF, + 0x042E, 0xA7C0, + 0x042F, 0xA7C1, + 0x0430, 0xA7D1, + 0x0431, 0xA7D2, + 0x0432, 0xA7D3, + 0x0433, 0xA7D4, + 0x0434, 0xA7D5, + 0x0435, 0xA7D6, + 0x0436, 0xA7D8, + 0x0437, 0xA7D9, + 0x0438, 0xA7DA, + 0x0439, 0xA7DB, + 0x043A, 0xA7DC, + 0x043B, 0xA7DD, + 0x043C, 0xA7DE, + 0x043D, 0xA7DF, + 0x043E, 0xA7E0, + 0x043F, 0xA7E1, + 0x0440, 0xA7E2, + 0x0441, 0xA7E3, + 0x0442, 0xA7E4, + 0x0443, 0xA7E5, + 0x0444, 0xA7E6, + 0x0445, 0xA7E7, + 0x0446, 0xA7E8, + 0x0447, 0xA7E9, + 0x0448, 0xA7EA, + 0x0449, 0xA7EB, + 0x044A, 0xA7EC, + 0x044B, 0xA7ED, + 0x044C, 0xA7EE, + 0x044D, 0xA7EF, + 0x044E, 0xA7F0, + 0x044F, 0xA7F1, + 0x0451, 0xA7D7, + 0x2014, 0xA1AA, + 0x2016, 0xA1AC, + 0x2018, 0xA1AE, + 0x2019, 0xA1AF, + 0x201C, 0xA1B0, + 0x201D, 0xA1B1, + 0x2026, 0xA1AD, + 0x2030, 0xA1EB, + 0x2032, 0xA1E4, + 0x2033, 0xA1E5, + 0x203B, 0xA1F9, + 0x2103, 0xA1E6, + 0x2116, 0xA1ED, + 0x2160, 0xA2F1, + 0x2161, 0xA2F2, + 0x2162, 0xA2F3, + 0x2163, 0xA2F4, + 0x2164, 0xA2F5, + 0x2165, 0xA2F6, + 0x2166, 0xA2F7, + 0x2167, 0xA2F8, + 0x2168, 0xA2F9, + 0x2169, 0xA2FA, + 0x216A, 0xA2FB, + 0x216B, 0xA2FC, + 0x2190, 0xA1FB, + 0x2191, 0xA1FC, + 0x2192, 0xA1FA, + 0x2193, 0xA1FD, + 0x2208, 0xA1CA, + 0x220F, 0xA1C7, + 0x2211, 0xA1C6, + 0x221A, 0xA1CC, + 0x221D, 0xA1D8, + 0x221E, 0xA1DE, + 0x2220, 0xA1CF, + 0x2225, 0xA1CE, + 0x2227, 0xA1C4, + 0x2228, 0xA1C5, + 0x2229, 0xA1C9, + 0x222A, 0xA1C8, + 0x222B, 0xA1D2, + 0x222E, 0xA1D3, + 0x2234, 0xA1E0, + 0x2235, 0xA1DF, + 0x2236, 0xA1C3, + 0x2237, 0xA1CB, + 0x223D, 0xA1D7, + 0x2248, 0xA1D6, + 0x224C, 0xA1D5, + 0x2260, 0xA1D9, + 0x2261, 0xA1D4, + 0x2264, 0xA1DC, + 0x2265, 0xA1DD, + 0x226E, 0xA1DA, + 0x226F, 0xA1DB, + 0x2299, 0xA1D1, + 0x22A5, 0xA1CD, + 0x2312, 0xA1D0, + 0x2460, 0xA2D9, + 0x2461, 0xA2DA, + 0x2462, 0xA2DB, + 0x2463, 0xA2DC, + 0x2464, 0xA2DD, + 0x2465, 0xA2DE, + 0x2466, 0xA2DF, + 0x2467, 0xA2E0, + 0x2468, 0xA2E1, + 0x2469, 0xA2E2, + 0x2474, 0xA2C5, + 0x2475, 0xA2C6, + 0x2476, 0xA2C7, + 0x2477, 0xA2C8, + 0x2478, 0xA2C9, + 0x2479, 0xA2CA, + 0x247A, 0xA2CB, + 0x247B, 0xA2CC, + 0x247C, 0xA2CD, + 0x247D, 0xA2CE, + 0x247E, 0xA2CF, + 0x247F, 0xA2D0, + 0x2480, 0xA2D1, + 0x2481, 0xA2D2, + 0x2482, 0xA2D3, + 0x2483, 0xA2D4, + 0x2484, 0xA2D5, + 0x2485, 0xA2D6, + 0x2486, 0xA2D7, + 0x2487, 0xA2D8, + 0x2488, 0xA2B1, + 0x2489, 0xA2B2, + 0x248A, 0xA2B3, + 0x248B, 0xA2B4, + 0x248C, 0xA2B5, + 0x248D, 0xA2B6, + 0x248E, 0xA2B7, + 0x248F, 0xA2B8, + 0x2490, 0xA2B9, + 0x2491, 0xA2BA, + 0x2492, 0xA2BB, + 0x2493, 0xA2BC, + 0x2494, 0xA2BD, + 0x2495, 0xA2BE, + 0x2496, 0xA2BF, + 0x2497, 0xA2C0, + 0x2498, 0xA2C1, + 0x2499, 0xA2C2, + 0x249A, 0xA2C3, + 0x249B, 0xA2C4, + 0x2500, 0xA9A4, + 0x2501, 0xA9A5, + 0x2502, 0xA9A6, + 0x2503, 0xA9A7, + 0x2504, 0xA9A8, + 0x2505, 0xA9A9, + 0x2506, 0xA9AA, + 0x2507, 0xA9AB, + 0x2508, 0xA9AC, + 0x2509, 0xA9AD, + 0x250A, 0xA9AE, + 0x250B, 0xA9AF, + 0x250C, 0xA9B0, + 0x250D, 0xA9B1, + 0x250E, 0xA9B2, + 0x250F, 0xA9B3, + 0x2510, 0xA9B4, + 0x2511, 0xA9B5, + 0x2512, 0xA9B6, + 0x2513, 0xA9B7, + 0x2514, 0xA9B8, + 0x2515, 0xA9B9, + 0x2516, 0xA9BA, + 0x2517, 0xA9BB, + 0x2518, 0xA9BC, + 0x2519, 0xA9BD, + 0x251A, 0xA9BE, + 0x251B, 0xA9BF, + 0x251C, 0xA9C0, + 0x251D, 0xA9C1, + 0x251E, 0xA9C2, + 0x251F, 0xA9C3, + 0x2520, 0xA9C4, + 0x2521, 0xA9C5, + 0x2522, 0xA9C6, + 0x2523, 0xA9C7, + 0x2524, 0xA9C8, + 0x2525, 0xA9C9, + 0x2526, 0xA9CA, + 0x2527, 0xA9CB, + 0x2528, 0xA9CC, + 0x2529, 0xA9CD, + 0x252A, 0xA9CE, + 0x252B, 0xA9CF, + 0x252C, 0xA9D0, + 0x252D, 0xA9D1, + 0x252E, 0xA9D2, + 0x252F, 0xA9D3, + 0x2530, 0xA9D4, + 0x2531, 0xA9D5, + 0x2532, 0xA9D6, + 0x2533, 0xA9D7, + 0x2534, 0xA9D8, + 0x2535, 0xA9D9, + 0x2536, 0xA9DA, + 0x2537, 0xA9DB, + 0x2538, 0xA9DC, + 0x2539, 0xA9DD, + 0x253A, 0xA9DE, + 0x253B, 0xA9DF, + 0x253C, 0xA9E0, + 0x253D, 0xA9E1, + 0x253E, 0xA9E2, + 0x253F, 0xA9E3, + 0x2540, 0xA9E4, + 0x2541, 0xA9E5, + 0x2542, 0xA9E6, + 0x2543, 0xA9E7, + 0x2544, 0xA9E8, + 0x2545, 0xA9E9, + 0x2546, 0xA9EA, + 0x2547, 0xA9EB, + 0x2548, 0xA9EC, + 0x2549, 0xA9ED, + 0x254A, 0xA9EE, + 0x254B, 0xA9EF, + 0x25A0, 0xA1F6, + 0x25A1, 0xA1F5, + 0x25B2, 0xA1F8, + 0x25B3, 0xA1F7, + 0x25C6, 0xA1F4, + 0x25C7, 0xA1F3, + 0x25CB, 0xA1F0, + 0x25CE, 0xA1F2, + 0x25CF, 0xA1F1, + 0x2605, 0xA1EF, + 0x2606, 0xA1EE, + 0x2640, 0xA1E2, + 0x2642, 0xA1E1, + 0x3000, 0xA1A1, + 0x3001, 0xA1A2, + 0x3002, 0xA1A3, + 0x3003, 0xA1A8, + 0x3005, 0xA1A9, + 0x3008, 0xA1B4, + 0x3009, 0xA1B5, + 0x300A, 0xA1B6, + 0x300B, 0xA1B7, + 0x300C, 0xA1B8, + 0x300D, 0xA1B9, + 0x300E, 0xA1BA, + 0x300F, 0xA1BB, + 0x3010, 0xA1BE, + 0x3011, 0xA1BF, + 0x3013, 0xA1FE, + 0x3014, 0xA1B2, + 0x3015, 0xA1B3, + 0x3016, 0xA1BC, + 0x3017, 0xA1BD, + 0x3041, 0xA4A1, + 0x3042, 0xA4A2, + 0x3043, 0xA4A3, + 0x3044, 0xA4A4, + 0x3045, 0xA4A5, + 0x3046, 0xA4A6, + 0x3047, 0xA4A7, + 0x3048, 0xA4A8, + 0x3049, 0xA4A9, + 0x304A, 0xA4AA, + 0x304B, 0xA4AB, + 0x304C, 0xA4AC, + 0x304D, 0xA4AD, + 0x304E, 0xA4AE, + 0x304F, 0xA4AF, + 0x3050, 0xA4B0, + 0x3051, 0xA4B1, + 0x3052, 0xA4B2, + 0x3053, 0xA4B3, + 0x3054, 0xA4B4, + 0x3055, 0xA4B5, + 0x3056, 0xA4B6, + 0x3057, 0xA4B7, + 0x3058, 0xA4B8, + 0x3059, 0xA4B9, + 0x305A, 0xA4BA, + 0x305B, 0xA4BB, + 0x305C, 0xA4BC, + 0x305D, 0xA4BD, + 0x305E, 0xA4BE, + 0x305F, 0xA4BF, + 0x3060, 0xA4C0, + 0x3061, 0xA4C1, + 0x3062, 0xA4C2, + 0x3063, 0xA4C3, + 0x3064, 0xA4C4, + 0x3065, 0xA4C5, + 0x3066, 0xA4C6, + 0x3067, 0xA4C7, + 0x3068, 0xA4C8, + 0x3069, 0xA4C9, + 0x306A, 0xA4CA, + 0x306B, 0xA4CB, + 0x306C, 0xA4CC, + 0x306D, 0xA4CD, + 0x306E, 0xA4CE, + 0x306F, 0xA4CF, + 0x3070, 0xA4D0, + 0x3071, 0xA4D1, + 0x3072, 0xA4D2, + 0x3073, 0xA4D3, + 0x3074, 0xA4D4, + 0x3075, 0xA4D5, + 0x3076, 0xA4D6, + 0x3077, 0xA4D7, + 0x3078, 0xA4D8, + 0x3079, 0xA4D9, + 0x307A, 0xA4DA, + 0x307B, 0xA4DB, + 0x307C, 0xA4DC, + 0x307D, 0xA4DD, + 0x307E, 0xA4DE, + 0x307F, 0xA4DF, + 0x3080, 0xA4E0, + 0x3081, 0xA4E1, + 0x3082, 0xA4E2, + 0x3083, 0xA4E3, + 0x3084, 0xA4E4, + 0x3085, 0xA4E5, + 0x3086, 0xA4E6, + 0x3087, 0xA4E7, + 0x3088, 0xA4E8, + 0x3089, 0xA4E9, + 0x308A, 0xA4EA, + 0x308B, 0xA4EB, + 0x308C, 0xA4EC, + 0x308D, 0xA4ED, + 0x308E, 0xA4EE, + 0x308F, 0xA4EF, + 0x3090, 0xA4F0, + 0x3091, 0xA4F1, + 0x3092, 0xA4F2, + 0x3093, 0xA4F3, + 0x30A1, 0xA5A1, + 0x30A2, 0xA5A2, + 0x30A3, 0xA5A3, + 0x30A4, 0xA5A4, + 0x30A5, 0xA5A5, + 0x30A6, 0xA5A6, + 0x30A7, 0xA5A7, + 0x30A8, 0xA5A8, + 0x30A9, 0xA5A9, + 0x30AA, 0xA5AA, + 0x30AB, 0xA5AB, + 0x30AC, 0xA5AC, + 0x30AD, 0xA5AD, + 0x30AE, 0xA5AE, + 0x30AF, 0xA5AF, + 0x30B0, 0xA5B0, + 0x30B1, 0xA5B1, + 0x30B2, 0xA5B2, + 0x30B3, 0xA5B3, + 0x30B4, 0xA5B4, + 0x30B5, 0xA5B5, + 0x30B6, 0xA5B6, + 0x30B7, 0xA5B7, + 0x30B8, 0xA5B8, + 0x30B9, 0xA5B9, + 0x30BA, 0xA5BA, + 0x30BB, 0xA5BB, + 0x30BC, 0xA5BC, + 0x30BD, 0xA5BD, + 0x30BE, 0xA5BE, + 0x30BF, 0xA5BF, + 0x30C0, 0xA5C0, + 0x30C1, 0xA5C1, + 0x30C2, 0xA5C2, + 0x30C3, 0xA5C3, + 0x30C4, 0xA5C4, + 0x30C5, 0xA5C5, + 0x30C6, 0xA5C6, + 0x30C7, 0xA5C7, + 0x30C8, 0xA5C8, + 0x30C9, 0xA5C9, + 0x30CA, 0xA5CA, + 0x30CB, 0xA5CB, + 0x30CC, 0xA5CC, + 0x30CD, 0xA5CD, + 0x30CE, 0xA5CE, + 0x30CF, 0xA5CF, + 0x30D0, 0xA5D0, + 0x30D1, 0xA5D1, + 0x30D2, 0xA5D2, + 0x30D3, 0xA5D3, + 0x30D4, 0xA5D4, + 0x30D5, 0xA5D5, + 0x30D6, 0xA5D6, + 0x30D7, 0xA5D7, + 0x30D8, 0xA5D8, + 0x30D9, 0xA5D9, + 0x30DA, 0xA5DA, + 0x30DB, 0xA5DB, + 0x30DC, 0xA5DC, + 0x30DD, 0xA5DD, + 0x30DE, 0xA5DE, + 0x30DF, 0xA5DF, + 0x30E0, 0xA5E0, + 0x30E1, 0xA5E1, + 0x30E2, 0xA5E2, + 0x30E3, 0xA5E3, + 0x30E4, 0xA5E4, + 0x30E5, 0xA5E5, + 0x30E6, 0xA5E6, + 0x30E7, 0xA5E7, + 0x30E8, 0xA5E8, + 0x30E9, 0xA5E9, + 0x30EA, 0xA5EA, + 0x30EB, 0xA5EB, + 0x30EC, 0xA5EC, + 0x30ED, 0xA5ED, + 0x30EE, 0xA5EE, + 0x30EF, 0xA5EF, + 0x30F0, 0xA5F0, + 0x30F1, 0xA5F1, + 0x30F2, 0xA5F2, + 0x30F3, 0xA5F3, + 0x30F4, 0xA5F4, + 0x30F5, 0xA5F5, + 0x30F6, 0xA5F6, + 0x3105, 0xA8C5, + 0x3106, 0xA8C6, + 0x3107, 0xA8C7, + 0x3108, 0xA8C8, + 0x3109, 0xA8C9, + 0x310A, 0xA8CA, + 0x310B, 0xA8CB, + 0x310C, 0xA8CC, + 0x310D, 0xA8CD, + 0x310E, 0xA8CE, + 0x310F, 0xA8CF, + 0x3110, 0xA8D0, + 0x3111, 0xA8D1, + 0x3112, 0xA8D2, + 0x3113, 0xA8D3, + 0x3114, 0xA8D4, + 0x3115, 0xA8D5, + 0x3116, 0xA8D6, + 0x3117, 0xA8D7, + 0x3118, 0xA8D8, + 0x3119, 0xA8D9, + 0x311A, 0xA8DA, + 0x311B, 0xA8DB, + 0x311C, 0xA8DC, + 0x311D, 0xA8DD, + 0x311E, 0xA8DE, + 0x311F, 0xA8DF, + 0x3120, 0xA8E0, + 0x3121, 0xA8E1, + 0x3122, 0xA8E2, + 0x3123, 0xA8E3, + 0x3124, 0xA8E4, + 0x3125, 0xA8E5, + 0x3126, 0xA8E6, + 0x3127, 0xA8E7, + 0x3128, 0xA8E8, + 0x3129, 0xA8E9, + 0x3220, 0xA2E5, + 0x3221, 0xA2E6, + 0x3222, 0xA2E7, + 0x3223, 0xA2E8, + 0x3224, 0xA2E9, + 0x3225, 0xA2EA, + 0x3226, 0xA2EB, + 0x3227, 0xA2EC, + 0x3228, 0xA2ED, + 0x3229, 0xA2EE, + 0x4E00, 0xD2BB, + 0x4E01, 0xB6A1, + 0x4E03, 0xC6DF, + 0x4E07, 0xCDF2, + 0x4E08, 0xD5C9, + 0x4E09, 0xC8FD, + 0x4E0A, 0xC9CF, + 0x4E0B, 0xCFC2, + 0x4E0C, 0xD8A2, + 0x4E0D, 0xB2BB, + 0x4E0E, 0xD3EB, + 0x4E10, 0xD8A4, + 0x4E11, 0xB3F3, + 0x4E13, 0xD7A8, + 0x4E14, 0xC7D2, + 0x4E15, 0xD8A7, + 0x4E16, 0xCAC0, + 0x4E18, 0xC7F0, + 0x4E19, 0xB1FB, + 0x4E1A, 0xD2B5, + 0x4E1B, 0xB4D4, + 0x4E1C, 0xB6AB, + 0x4E1D, 0xCBBF, + 0x4E1E, 0xD8A9, + 0x4E22, 0xB6AA, + 0x4E24, 0xC1BD, + 0x4E25, 0xD1CF, + 0x4E27, 0xC9A5, + 0x4E28, 0xD8AD, + 0x4E2A, 0xB8F6, + 0x4E2B, 0xD1BE, + 0x4E2C, 0xE3DC, + 0x4E2D, 0xD6D0, + 0x4E30, 0xB7E1, + 0x4E32, 0xB4AE, + 0x4E34, 0xC1D9, + 0x4E36, 0xD8BC, + 0x4E38, 0xCDE8, + 0x4E39, 0xB5A4, + 0x4E3A, 0xCEAA, + 0x4E3B, 0xD6F7, + 0x4E3D, 0xC0F6, + 0x4E3E, 0xBED9, + 0x4E3F, 0xD8AF, + 0x4E43, 0xC4CB, + 0x4E45, 0xBEC3, + 0x4E47, 0xD8B1, + 0x4E48, 0xC3B4, + 0x4E49, 0xD2E5, + 0x4E4B, 0xD6AE, + 0x4E4C, 0xCEDA, + 0x4E4D, 0xD5A7, + 0x4E4E, 0xBAF5, + 0x4E4F, 0xB7A6, + 0x4E50, 0xC0D6, + 0x4E52, 0xC6B9, + 0x4E53, 0xC5D2, + 0x4E54, 0xC7C7, + 0x4E56, 0xB9D4, + 0x4E58, 0xB3CB, + 0x4E59, 0xD2D2, + 0x4E5C, 0xD8BF, + 0x4E5D, 0xBEC5, + 0x4E5E, 0xC6F2, + 0x4E5F, 0xD2B2, + 0x4E60, 0xCFB0, + 0x4E61, 0xCFE7, + 0x4E66, 0xCAE9, + 0x4E69, 0xD8C0, + 0x4E70, 0xC2F2, + 0x4E71, 0xC2D2, + 0x4E73, 0xC8E9, + 0x4E7E, 0xC7AC, + 0x4E86, 0xC1CB, + 0x4E88, 0xD3E8, + 0x4E89, 0xD5F9, + 0x4E8B, 0xCAC2, + 0x4E8C, 0xB6FE, + 0x4E8D, 0xD8A1, + 0x4E8E, 0xD3DA, + 0x4E8F, 0xBFF7, + 0x4E91, 0xD4C6, + 0x4E92, 0xBBA5, + 0x4E93, 0xD8C1, + 0x4E94, 0xCEE5, + 0x4E95, 0xBEAE, + 0x4E98, 0xD8A8, + 0x4E9A, 0xD1C7, + 0x4E9B, 0xD0A9, + 0x4E9F, 0xD8BD, + 0x4EA0, 0xD9EF, + 0x4EA1, 0xCDF6, + 0x4EA2, 0xBFBA, + 0x4EA4, 0xBDBB, + 0x4EA5, 0xBAA5, + 0x4EA6, 0xD2E0, + 0x4EA7, 0xB2FA, + 0x4EA8, 0xBAE0, + 0x4EA9, 0xC4B6, + 0x4EAB, 0xCFED, + 0x4EAC, 0xBEA9, + 0x4EAD, 0xCDA4, + 0x4EAE, 0xC1C1, + 0x4EB2, 0xC7D7, + 0x4EB3, 0xD9F1, + 0x4EB5, 0xD9F4, + 0x4EBA, 0xC8CB, + 0x4EBB, 0xD8E9, + 0x4EBF, 0xD2DA, + 0x4EC0, 0xCAB2, + 0x4EC1, 0xC8CA, + 0x4EC2, 0xD8EC, + 0x4EC3, 0xD8EA, + 0x4EC4, 0xD8C6, + 0x4EC5, 0xBDF6, + 0x4EC6, 0xC6CD, + 0x4EC7, 0xB3F0, + 0x4EC9, 0xD8EB, + 0x4ECA, 0xBDF1, + 0x4ECB, 0xBDE9, + 0x4ECD, 0xC8D4, + 0x4ECE, 0xB4D3, + 0x4ED1, 0xC2D8, + 0x4ED3, 0xB2D6, + 0x4ED4, 0xD7D0, + 0x4ED5, 0xCACB, + 0x4ED6, 0xCBFB, + 0x4ED7, 0xD5CC, + 0x4ED8, 0xB8B6, + 0x4ED9, 0xCFC9, + 0x4EDD, 0xD9DA, + 0x4EDE, 0xD8F0, + 0x4EDF, 0xC7AA, + 0x4EE1, 0xD8EE, + 0x4EE3, 0xB4FA, + 0x4EE4, 0xC1EE, + 0x4EE5, 0xD2D4, + 0x4EE8, 0xD8ED, + 0x4EEA, 0xD2C7, + 0x4EEB, 0xD8EF, + 0x4EEC, 0xC3C7, + 0x4EF0, 0xD1F6, + 0x4EF2, 0xD6D9, + 0x4EF3, 0xD8F2, + 0x4EF5, 0xD8F5, + 0x4EF6, 0xBCFE, + 0x4EF7, 0xBCDB, + 0x4EFB, 0xC8CE, + 0x4EFD, 0xB7DD, + 0x4EFF, 0xB7C2, + 0x4F01, 0xC6F3, + 0x4F09, 0xD8F8, + 0x4F0A, 0xD2C1, + 0x4F0D, 0xCEE9, + 0x4F0E, 0xBCBF, + 0x4F0F, 0xB7FC, + 0x4F10, 0xB7A5, + 0x4F11, 0xD0DD, + 0x4F17, 0xD6DA, + 0x4F18, 0xD3C5, + 0x4F19, 0xBBEF, + 0x4F1A, 0xBBE1, + 0x4F1B, 0xD8F1, + 0x4F1E, 0xC9A1, + 0x4F1F, 0xCEB0, + 0x4F20, 0xB4AB, + 0x4F22, 0xD8F3, + 0x4F24, 0xC9CB, + 0x4F25, 0xD8F6, + 0x4F26, 0xC2D7, + 0x4F27, 0xD8F7, + 0x4F2A, 0xCEB1, + 0x4F2B, 0xD8F9, + 0x4F2F, 0xB2AE, + 0x4F30, 0xB9C0, + 0x4F32, 0xD9A3, + 0x4F34, 0xB0E9, + 0x4F36, 0xC1E6, + 0x4F38, 0xC9EC, + 0x4F3A, 0xCBC5, + 0x4F3C, 0xCBC6, + 0x4F3D, 0xD9A4, + 0x4F43, 0xB5E8, + 0x4F46, 0xB5AB, + 0x4F4D, 0xCEBB, + 0x4F4E, 0xB5CD, + 0x4F4F, 0xD7A1, + 0x4F50, 0xD7F4, + 0x4F51, 0xD3D3, + 0x4F53, 0xCCE5, + 0x4F55, 0xBACE, + 0x4F57, 0xD9A2, + 0x4F58, 0xD9DC, + 0x4F59, 0xD3E0, + 0x4F5A, 0xD8FD, + 0x4F5B, 0xB7F0, + 0x4F5C, 0xD7F7, + 0x4F5D, 0xD8FE, + 0x4F5E, 0xD8FA, + 0x4F5F, 0xD9A1, + 0x4F60, 0xC4E3, + 0x4F63, 0xD3B6, + 0x4F64, 0xD8F4, + 0x4F65, 0xD9DD, + 0x4F67, 0xD8FB, + 0x4F69, 0xC5E5, + 0x4F6C, 0xC0D0, + 0x4F6F, 0xD1F0, + 0x4F70, 0xB0DB, + 0x4F73, 0xBCD1, + 0x4F74, 0xD9A6, + 0x4F76, 0xD9A5, + 0x4F7B, 0xD9AC, + 0x4F7C, 0xD9AE, + 0x4F7E, 0xD9AB, + 0x4F7F, 0xCAB9, + 0x4F83, 0xD9A9, + 0x4F84, 0xD6B6, + 0x4F88, 0xB3DE, + 0x4F89, 0xD9A8, + 0x4F8B, 0xC0FD, + 0x4F8D, 0xCACC, + 0x4F8F, 0xD9AA, + 0x4F91, 0xD9A7, + 0x4F94, 0xD9B0, + 0x4F97, 0xB6B1, + 0x4F9B, 0xB9A9, + 0x4F9D, 0xD2C0, + 0x4FA0, 0xCFC0, + 0x4FA3, 0xC2C2, + 0x4FA5, 0xBDC4, + 0x4FA6, 0xD5EC, + 0x4FA7, 0xB2E0, + 0x4FA8, 0xC7C8, + 0x4FA9, 0xBFEB, + 0x4FAA, 0xD9AD, + 0x4FAC, 0xD9AF, + 0x4FAE, 0xCEEA, + 0x4FAF, 0xBAEE, + 0x4FB5, 0xC7D6, + 0x4FBF, 0xB1E3, + 0x4FC3, 0xB4D9, + 0x4FC4, 0xB6ED, + 0x4FC5, 0xD9B4, + 0x4FCA, 0xBFA1, + 0x4FCE, 0xD9DE, + 0x4FCF, 0xC7CE, + 0x4FD0, 0xC0FE, + 0x4FD1, 0xD9B8, + 0x4FD7, 0xCBD7, + 0x4FD8, 0xB7FD, + 0x4FDA, 0xD9B5, + 0x4FDC, 0xD9B7, + 0x4FDD, 0xB1A3, + 0x4FDE, 0xD3E1, + 0x4FDF, 0xD9B9, + 0x4FE1, 0xD0C5, + 0x4FE3, 0xD9B6, + 0x4FE6, 0xD9B1, + 0x4FE8, 0xD9B2, + 0x4FE9, 0xC1A9, + 0x4FEA, 0xD9B3, + 0x4FED, 0xBCF3, + 0x4FEE, 0xD0DE, + 0x4FEF, 0xB8A9, + 0x4FF1, 0xBEE3, + 0x4FF3, 0xD9BD, + 0x4FF8, 0xD9BA, + 0x4FFA, 0xB0B3, + 0x4FFE, 0xD9C2, + 0x500C, 0xD9C4, + 0x500D, 0xB1B6, + 0x500F, 0xD9BF, + 0x5012, 0xB5B9, + 0x5014, 0xBEF3, + 0x5018, 0xCCC8, + 0x5019, 0xBAF2, + 0x501A, 0xD2D0, + 0x501C, 0xD9C3, + 0x501F, 0xBDE8, + 0x5021, 0xB3AB, + 0x5025, 0xD9C5, + 0x5026, 0xBEEB, + 0x5028, 0xD9C6, + 0x5029, 0xD9BB, + 0x502A, 0xC4DF, + 0x502C, 0xD9BE, + 0x502D, 0xD9C1, + 0x502E, 0xD9C0, + 0x503A, 0xD5AE, + 0x503C, 0xD6B5, + 0x503E, 0xC7E3, + 0x5043, 0xD9C8, + 0x5047, 0xBCD9, + 0x5048, 0xD9CA, + 0x504C, 0xD9BC, + 0x504E, 0xD9CB, + 0x504F, 0xC6AB, + 0x5055, 0xD9C9, + 0x505A, 0xD7F6, + 0x505C, 0xCDA3, + 0x5065, 0xBDA1, + 0x506C, 0xD9CC, + 0x5076, 0xC5BC, + 0x5077, 0xCDB5, + 0x507B, 0xD9CD, + 0x507E, 0xD9C7, + 0x507F, 0xB3A5, + 0x5080, 0xBFFE, + 0x5085, 0xB8B5, + 0x5088, 0xC0FC, + 0x508D, 0xB0F8, + 0x50A3, 0xB4F6, + 0x50A5, 0xD9CE, + 0x50A7, 0xD9CF, + 0x50A8, 0xB4A2, + 0x50A9, 0xD9D0, + 0x50AC, 0xB4DF, + 0x50B2, 0xB0C1, + 0x50BA, 0xD9D1, + 0x50BB, 0xC9B5, + 0x50CF, 0xCFF1, + 0x50D6, 0xD9D2, + 0x50DA, 0xC1C5, + 0x50E6, 0xD9D6, + 0x50E7, 0xC9AE, + 0x50EC, 0xD9D5, + 0x50ED, 0xD9D4, + 0x50EE, 0xD9D7, + 0x50F3, 0xCBDB, + 0x50F5, 0xBDA9, + 0x50FB, 0xC6A7, + 0x5106, 0xD9D3, + 0x5107, 0xD9D8, + 0x510B, 0xD9D9, + 0x5112, 0xC8E5, + 0x5121, 0xC0DC, + 0x513F, 0xB6F9, + 0x5140, 0xD8A3, + 0x5141, 0xD4CA, + 0x5143, 0xD4AA, + 0x5144, 0xD0D6, + 0x5145, 0xB3E4, + 0x5146, 0xD5D7, + 0x5148, 0xCFC8, + 0x5149, 0xB9E2, + 0x514B, 0xBFCB, + 0x514D, 0xC3E2, + 0x5151, 0xB6D2, + 0x5154, 0xCDC3, + 0x5155, 0xD9EE, + 0x5156, 0xD9F0, + 0x515A, 0xB5B3, + 0x515C, 0xB6B5, + 0x5162, 0xBEA4, + 0x5165, 0xC8EB, + 0x5168, 0xC8AB, + 0x516B, 0xB0CB, + 0x516C, 0xB9AB, + 0x516D, 0xC1F9, + 0x516E, 0xD9E2, + 0x5170, 0xC0BC, + 0x5171, 0xB9B2, + 0x5173, 0xB9D8, + 0x5174, 0xD0CB, + 0x5175, 0xB1F8, + 0x5176, 0xC6E4, + 0x5177, 0xBEDF, + 0x5178, 0xB5E4, + 0x5179, 0xD7C8, + 0x517B, 0xD1F8, + 0x517C, 0xBCE6, + 0x517D, 0xCADE, + 0x5180, 0xBCBD, + 0x5181, 0xD9E6, + 0x5182, 0xD8E7, + 0x5185, 0xC4DA, + 0x5188, 0xB8D4, + 0x5189, 0xC8BD, + 0x518C, 0xB2E1, + 0x518D, 0xD4D9, + 0x5192, 0xC3B0, + 0x5195, 0xC3E1, + 0x5196, 0xDAA2, + 0x5197, 0xC8DF, + 0x5199, 0xD0B4, + 0x519B, 0xBEFC, + 0x519C, 0xC5A9, + 0x51A0, 0xB9DA, + 0x51A2, 0xDAA3, + 0x51A4, 0xD4A9, + 0x51A5, 0xDAA4, + 0x51AB, 0xD9FB, + 0x51AC, 0xB6AC, + 0x51AF, 0xB7EB, + 0x51B0, 0xB1F9, + 0x51B1, 0xD9FC, + 0x51B2, 0xB3E5, + 0x51B3, 0xBEF6, + 0x51B5, 0xBFF6, + 0x51B6, 0xD2B1, + 0x51B7, 0xC0E4, + 0x51BB, 0xB6B3, + 0x51BC, 0xD9FE, + 0x51BD, 0xD9FD, + 0x51C0, 0xBEBB, + 0x51C4, 0xC6E0, + 0x51C6, 0xD7BC, + 0x51C7, 0xDAA1, + 0x51C9, 0xC1B9, + 0x51CB, 0xB5F2, + 0x51CC, 0xC1E8, + 0x51CF, 0xBCF5, + 0x51D1, 0xB4D5, + 0x51DB, 0xC1DD, + 0x51DD, 0xC4FD, + 0x51E0, 0xBCB8, + 0x51E1, 0xB7B2, + 0x51E4, 0xB7EF, + 0x51EB, 0xD9EC, + 0x51ED, 0xC6BE, + 0x51EF, 0xBFAD, + 0x51F0, 0xBBCB, + 0x51F3, 0xB5CA, + 0x51F5, 0xDBC9, + 0x51F6, 0xD0D7, + 0x51F8, 0xCDB9, + 0x51F9, 0xB0BC, + 0x51FA, 0xB3F6, + 0x51FB, 0xBBF7, + 0x51FC, 0xDBCA, + 0x51FD, 0xBAAF, + 0x51FF, 0xD4E4, + 0x5200, 0xB5B6, + 0x5201, 0xB5F3, + 0x5202, 0xD8D6, + 0x5203, 0xC8D0, + 0x5206, 0xB7D6, + 0x5207, 0xC7D0, + 0x5208, 0xD8D7, + 0x520A, 0xBFAF, + 0x520D, 0xDBBB, + 0x520E, 0xD8D8, + 0x5211, 0xD0CC, + 0x5212, 0xBBAE, + 0x5216, 0xEBBE, + 0x5217, 0xC1D0, + 0x5218, 0xC1F5, + 0x5219, 0xD4F2, + 0x521A, 0xB8D5, + 0x521B, 0xB4B4, + 0x521D, 0xB3F5, + 0x5220, 0xC9BE, + 0x5224, 0xC5D0, + 0x5228, 0xC5D9, + 0x5229, 0xC0FB, + 0x522B, 0xB1F0, + 0x522D, 0xD8D9, + 0x522E, 0xB9CE, + 0x5230, 0xB5BD, + 0x5233, 0xD8DA, + 0x5236, 0xD6C6, + 0x5237, 0xCBA2, + 0x5238, 0xC8AF, + 0x5239, 0xC9B2, + 0x523A, 0xB4CC, + 0x523B, 0xBFCC, + 0x523D, 0xB9F4, + 0x523F, 0xD8DB, + 0x5240, 0xD8DC, + 0x5241, 0xB6E7, + 0x5242, 0xBCC1, + 0x5243, 0xCCEA, + 0x524A, 0xCFF7, + 0x524C, 0xD8DD, + 0x524D, 0xC7B0, + 0x5250, 0xB9D0, + 0x5251, 0xBDA3, + 0x5254, 0xCCDE, + 0x5256, 0xC6CA, + 0x525C, 0xD8E0, + 0x525E, 0xD8DE, + 0x5261, 0xD8DF, + 0x5265, 0xB0FE, + 0x5267, 0xBEE7, + 0x5269, 0xCAA3, + 0x526A, 0xBCF4, + 0x526F, 0xB8B1, + 0x5272, 0xB8EE, + 0x527D, 0xD8E2, + 0x527F, 0xBDCB, + 0x5281, 0xD8E4, + 0x5282, 0xD8E3, + 0x5288, 0xC5FC, + 0x5290, 0xD8E5, + 0x5293, 0xD8E6, + 0x529B, 0xC1A6, + 0x529D, 0xC8B0, + 0x529E, 0xB0EC, + 0x529F, 0xB9A6, + 0x52A0, 0xBCD3, + 0x52A1, 0xCEF1, + 0x52A2, 0xDBBD, + 0x52A3, 0xC1D3, + 0x52A8, 0xB6AF, + 0x52A9, 0xD6FA, + 0x52AA, 0xC5AC, + 0x52AB, 0xBDD9, + 0x52AC, 0xDBBE, + 0x52AD, 0xDBBF, + 0x52B1, 0xC0F8, + 0x52B2, 0xBEA2, + 0x52B3, 0xC0CD, + 0x52BE, 0xDBC0, + 0x52BF, 0xCAC6, + 0x52C3, 0xB2AA, + 0x52C7, 0xD3C2, + 0x52C9, 0xC3E3, + 0x52CB, 0xD1AB, + 0x52D0, 0xDBC2, + 0x52D2, 0xC0D5, + 0x52D6, 0xDBC3, + 0x52D8, 0xBFB1, + 0x52DF, 0xC4BC, + 0x52E4, 0xC7DA, + 0x52F0, 0xDBC4, + 0x52F9, 0xD9E8, + 0x52FA, 0xC9D7, + 0x52FE, 0xB9B4, + 0x52FF, 0xCEF0, + 0x5300, 0xD4C8, + 0x5305, 0xB0FC, + 0x5306, 0xB4D2, + 0x5308, 0xD0D9, + 0x530D, 0xD9E9, + 0x530F, 0xDECB, + 0x5310, 0xD9EB, + 0x5315, 0xD8B0, + 0x5316, 0xBBAF, + 0x5317, 0xB1B1, + 0x5319, 0xB3D7, + 0x531A, 0xD8CE, + 0x531D, 0xD4D1, + 0x5320, 0xBDB3, + 0x5321, 0xBFEF, + 0x5323, 0xCFBB, + 0x5326, 0xD8D0, + 0x532A, 0xB7CB, + 0x532E, 0xD8D1, + 0x5339, 0xC6A5, + 0x533A, 0xC7F8, + 0x533B, 0xD2BD, + 0x533E, 0xD8D2, + 0x533F, 0xC4E4, + 0x5341, 0xCAAE, + 0x5343, 0xC7A7, + 0x5345, 0xD8A6, + 0x5347, 0xC9FD, + 0x5348, 0xCEE7, + 0x5349, 0xBBDC, + 0x534A, 0xB0EB, + 0x534E, 0xBBAA, + 0x534F, 0xD0AD, + 0x5351, 0xB1B0, + 0x5352, 0xD7E4, + 0x5353, 0xD7BF, + 0x5355, 0xB5A5, + 0x5356, 0xC2F4, + 0x5357, 0xC4CF, + 0x535A, 0xB2A9, + 0x535C, 0xB2B7, + 0x535E, 0xB1E5, + 0x535F, 0xDFB2, + 0x5360, 0xD5BC, + 0x5361, 0xBFA8, + 0x5362, 0xC2AC, + 0x5363, 0xD8D5, + 0x5364, 0xC2B1, + 0x5366, 0xD8D4, + 0x5367, 0xCED4, + 0x5369, 0xDAE0, + 0x536B, 0xCEC0, + 0x536E, 0xD8B4, + 0x536F, 0xC3AE, + 0x5370, 0xD3A1, + 0x5371, 0xCEA3, + 0x5373, 0xBCB4, + 0x5374, 0xC8B4, + 0x5375, 0xC2D1, + 0x5377, 0xBEED, + 0x5378, 0xD0B6, + 0x537A, 0xDAE1, + 0x537F, 0xC7E4, + 0x5382, 0xB3A7, + 0x5384, 0xB6F2, + 0x5385, 0xCCFC, + 0x5386, 0xC0FA, + 0x5389, 0xC0F7, + 0x538B, 0xD1B9, + 0x538C, 0xD1E1, + 0x538D, 0xD8C7, + 0x5395, 0xB2DE, + 0x5398, 0xC0E5, + 0x539A, 0xBAF1, + 0x539D, 0xD8C8, + 0x539F, 0xD4AD, + 0x53A2, 0xCFE1, + 0x53A3, 0xD8C9, + 0x53A5, 0xD8CA, + 0x53A6, 0xCFC3, + 0x53A8, 0xB3F8, + 0x53A9, 0xBEC7, + 0x53AE, 0xD8CB, + 0x53B6, 0xDBCC, + 0x53BB, 0xC8A5, + 0x53BF, 0xCFD8, + 0x53C1, 0xC8FE, + 0x53C2, 0xB2CE, + 0x53C8, 0xD3D6, + 0x53C9, 0xB2E6, + 0x53CA, 0xBCB0, + 0x53CB, 0xD3D1, + 0x53CC, 0xCBAB, + 0x53CD, 0xB7B4, + 0x53D1, 0xB7A2, + 0x53D4, 0xCAE5, + 0x53D6, 0xC8A1, + 0x53D7, 0xCADC, + 0x53D8, 0xB1E4, + 0x53D9, 0xD0F0, + 0x53DB, 0xC5D1, + 0x53DF, 0xDBC5, + 0x53E0, 0xB5FE, + 0x53E3, 0xBFDA, + 0x53E4, 0xB9C5, + 0x53E5, 0xBEE4, + 0x53E6, 0xC1ED, + 0x53E8, 0xDFB6, + 0x53E9, 0xDFB5, + 0x53EA, 0xD6BB, + 0x53EB, 0xBDD0, + 0x53EC, 0xD5D9, + 0x53ED, 0xB0C8, + 0x53EE, 0xB6A3, + 0x53EF, 0xBFC9, + 0x53F0, 0xCCA8, + 0x53F1, 0xDFB3, + 0x53F2, 0xCAB7, + 0x53F3, 0xD3D2, + 0x53F5, 0xD8CF, + 0x53F6, 0xD2B6, + 0x53F7, 0xBAC5, + 0x53F8, 0xCBBE, + 0x53F9, 0xCCBE, + 0x53FB, 0xDFB7, + 0x53FC, 0xB5F0, + 0x53FD, 0xDFB4, + 0x5401, 0xD3F5, + 0x5403, 0xB3D4, + 0x5404, 0xB8F7, + 0x5406, 0xDFBA, + 0x5408, 0xBACF, + 0x5409, 0xBCAA, + 0x540A, 0xB5F5, + 0x540C, 0xCDAC, + 0x540D, 0xC3FB, + 0x540E, 0xBAF3, + 0x540F, 0xC0F4, + 0x5410, 0xCDC2, + 0x5411, 0xCFF2, + 0x5412, 0xDFB8, + 0x5413, 0xCFC5, + 0x5415, 0xC2C0, + 0x5416, 0xDFB9, + 0x5417, 0xC2F0, + 0x541B, 0xBEFD, + 0x541D, 0xC1DF, + 0x541E, 0xCDCC, + 0x541F, 0xD2F7, + 0x5420, 0xB7CD, + 0x5421, 0xDFC1, + 0x5423, 0xDFC4, + 0x5426, 0xB7F1, + 0x5427, 0xB0C9, + 0x5428, 0xB6D6, + 0x5429, 0xB7D4, + 0x542B, 0xBAAC, + 0x542C, 0xCCFD, + 0x542D, 0xBFD4, + 0x542E, 0xCBB1, + 0x542F, 0xC6F4, + 0x5431, 0xD6A8, + 0x5432, 0xDFC5, + 0x5434, 0xCEE2, + 0x5435, 0xB3B3, + 0x5438, 0xCEFC, + 0x5439, 0xB4B5, + 0x543B, 0xCEC7, + 0x543C, 0xBAF0, + 0x543E, 0xCEE1, + 0x5440, 0xD1BD, + 0x5443, 0xDFC0, + 0x5446, 0xB4F4, + 0x5448, 0xB3CA, + 0x544A, 0xB8E6, + 0x544B, 0xDFBB, + 0x5450, 0xC4C5, + 0x5452, 0xDFBC, + 0x5453, 0xDFBD, + 0x5454, 0xDFBE, + 0x5455, 0xC5BB, + 0x5456, 0xDFBF, + 0x5457, 0xDFC2, + 0x5458, 0xD4B1, + 0x5459, 0xDFC3, + 0x545B, 0xC7BA, + 0x545C, 0xCED8, + 0x5462, 0xC4D8, + 0x5464, 0xDFCA, + 0x5466, 0xDFCF, + 0x5468, 0xD6DC, + 0x5471, 0xDFC9, + 0x5472, 0xDFDA, + 0x5473, 0xCEB6, + 0x5475, 0xBAC7, + 0x5476, 0xDFCE, + 0x5477, 0xDFC8, + 0x5478, 0xC5DE, + 0x547B, 0xC9EB, + 0x547C, 0xBAF4, + 0x547D, 0xC3FC, + 0x5480, 0xBED7, + 0x5482, 0xDFC6, + 0x5484, 0xDFCD, + 0x5486, 0xC5D8, + 0x548B, 0xD5A6, + 0x548C, 0xBACD, + 0x548E, 0xBECC, + 0x548F, 0xD3BD, + 0x5490, 0xB8C0, + 0x5492, 0xD6E4, + 0x5494, 0xDFC7, + 0x5495, 0xB9BE, + 0x5496, 0xBFA7, + 0x5499, 0xC1FC, + 0x549A, 0xDFCB, + 0x549B, 0xDFCC, + 0x549D, 0xDFD0, + 0x54A3, 0xDFDB, + 0x54A4, 0xDFE5, + 0x54A6, 0xDFD7, + 0x54A7, 0xDFD6, + 0x54A8, 0xD7C9, + 0x54A9, 0xDFE3, + 0x54AA, 0xDFE4, + 0x54AB, 0xE5EB, + 0x54AC, 0xD2A7, + 0x54AD, 0xDFD2, + 0x54AF, 0xBFA9, + 0x54B1, 0xD4DB, + 0x54B3, 0xBFC8, + 0x54B4, 0xDFD4, + 0x54B8, 0xCFCC, + 0x54BB, 0xDFDD, + 0x54BD, 0xD1CA, + 0x54BF, 0xDFDE, + 0x54C0, 0xB0A7, + 0x54C1, 0xC6B7, + 0x54C2, 0xDFD3, + 0x54C4, 0xBAE5, + 0x54C6, 0xB6DF, + 0x54C7, 0xCDDB, + 0x54C8, 0xB9FE, + 0x54C9, 0xD4D5, + 0x54CC, 0xDFDF, + 0x54CD, 0xCFEC, + 0x54CE, 0xB0A5, + 0x54CF, 0xDFE7, + 0x54D0, 0xDFD1, + 0x54D1, 0xD1C6, + 0x54D2, 0xDFD5, + 0x54D3, 0xDFD8, + 0x54D4, 0xDFD9, + 0x54D5, 0xDFDC, + 0x54D7, 0xBBA9, + 0x54D9, 0xDFE0, + 0x54DA, 0xDFE1, + 0x54DC, 0xDFE2, + 0x54DD, 0xDFE6, + 0x54DE, 0xDFE8, + 0x54DF, 0xD3B4, + 0x54E5, 0xB8E7, + 0x54E6, 0xC5B6, + 0x54E7, 0xDFEA, + 0x54E8, 0xC9DA, + 0x54E9, 0xC1A8, + 0x54EA, 0xC4C4, + 0x54ED, 0xBFDE, + 0x54EE, 0xCFF8, + 0x54F2, 0xD5DC, + 0x54F3, 0xDFEE, + 0x54FA, 0xB2B8, + 0x54FC, 0xBADF, + 0x54FD, 0xDFEC, + 0x54FF, 0xDBC1, + 0x5501, 0xD1E4, + 0x5506, 0xCBF4, + 0x5507, 0xB4BD, + 0x5509, 0xB0A6, + 0x550F, 0xDFF1, + 0x5510, 0xCCC6, + 0x5511, 0xDFF2, + 0x5514, 0xDFED, + 0x551B, 0xDFE9, + 0x5520, 0xDFEB, + 0x5522, 0xDFEF, + 0x5523, 0xDFF0, + 0x5524, 0xBBBD, + 0x5527, 0xDFF3, + 0x552A, 0xDFF4, + 0x552C, 0xBBA3, + 0x552E, 0xCADB, + 0x552F, 0xCEA8, + 0x5530, 0xE0A7, + 0x5531, 0xB3AA, + 0x5533, 0xE0A6, + 0x5537, 0xE0A1, + 0x553C, 0xDFFE, + 0x553E, 0xCDD9, + 0x553F, 0xDFFC, + 0x5541, 0xDFFA, + 0x5543, 0xBFD0, + 0x5544, 0xD7C4, + 0x5546, 0xC9CC, + 0x5549, 0xDFF8, + 0x554A, 0xB0A1, + 0x5550, 0xDFFD, + 0x5555, 0xDFFB, + 0x5556, 0xE0A2, + 0x555C, 0xE0A8, + 0x5561, 0xB7C8, + 0x5564, 0xC6A1, + 0x5565, 0xC9B6, + 0x5566, 0xC0B2, + 0x5567, 0xDFF5, + 0x556A, 0xC5BE, + 0x556C, 0xD8C4, + 0x556D, 0xDFF9, + 0x556E, 0xC4F6, + 0x5575, 0xE0A3, + 0x5576, 0xE0A4, + 0x5577, 0xE0A5, + 0x5578, 0xD0A5, + 0x557B, 0xE0B4, + 0x557C, 0xCCE4, + 0x557E, 0xE0B1, + 0x5580, 0xBFA6, + 0x5581, 0xE0AF, + 0x5582, 0xCEB9, + 0x5583, 0xE0AB, + 0x5584, 0xC9C6, + 0x5587, 0xC0AE, + 0x5588, 0xE0AE, + 0x5589, 0xBAED, + 0x558A, 0xBAB0, + 0x558B, 0xE0A9, + 0x558F, 0xDFF6, + 0x5591, 0xE0B3, + 0x5594, 0xE0B8, + 0x5598, 0xB4AD, + 0x5599, 0xE0B9, + 0x559C, 0xCFB2, + 0x559D, 0xBAC8, + 0x559F, 0xE0B0, + 0x55A7, 0xD0FA, + 0x55B1, 0xE0AC, + 0x55B3, 0xD4FB, + 0x55B5, 0xDFF7, + 0x55B7, 0xC5E7, + 0x55B9, 0xE0AD, + 0x55BB, 0xD3F7, + 0x55BD, 0xE0B6, + 0x55BE, 0xE0B7, + 0x55C4, 0xE0C4, + 0x55C5, 0xD0E1, + 0x55C9, 0xE0BC, + 0x55CC, 0xE0C9, + 0x55CD, 0xE0CA, + 0x55D1, 0xE0BE, + 0x55D2, 0xE0AA, + 0x55D3, 0xC9A4, + 0x55D4, 0xE0C1, + 0x55D6, 0xE0B2, + 0x55DC, 0xCAC8, + 0x55DD, 0xE0C3, + 0x55DF, 0xE0B5, + 0x55E1, 0xCECB, + 0x55E3, 0xCBC3, + 0x55E4, 0xE0CD, + 0x55E5, 0xE0C6, + 0x55E6, 0xE0C2, + 0x55E8, 0xE0CB, + 0x55EA, 0xE0BA, + 0x55EB, 0xE0BF, + 0x55EC, 0xE0C0, + 0x55EF, 0xE0C5, + 0x55F2, 0xE0C7, + 0x55F3, 0xE0C8, + 0x55F5, 0xE0CC, + 0x55F7, 0xE0BB, + 0x55FD, 0xCBD4, + 0x55FE, 0xE0D5, + 0x5600, 0xE0D6, + 0x5601, 0xE0D2, + 0x5608, 0xE0D0, + 0x5609, 0xBCCE, + 0x560C, 0xE0D1, + 0x560E, 0xB8C2, + 0x560F, 0xD8C5, + 0x5618, 0xD0EA, + 0x561B, 0xC2EF, + 0x561E, 0xE0CF, + 0x561F, 0xE0BD, + 0x5623, 0xE0D4, + 0x5624, 0xE0D3, + 0x5627, 0xE0D7, + 0x562C, 0xE0DC, + 0x562D, 0xE0D8, + 0x5631, 0xD6F6, + 0x5632, 0xB3B0, + 0x5634, 0xD7EC, + 0x5636, 0xCBBB, + 0x5639, 0xE0DA, + 0x563B, 0xCEFB, + 0x563F, 0xBAD9, + 0x564C, 0xE0E1, + 0x564D, 0xE0DD, + 0x564E, 0xD2AD, + 0x5654, 0xE0E2, + 0x5657, 0xE0DB, + 0x5658, 0xE0D9, + 0x5659, 0xE0DF, + 0x565C, 0xE0E0, + 0x5662, 0xE0DE, + 0x5664, 0xE0E4, + 0x5668, 0xC6F7, + 0x5669, 0xD8AC, + 0x566A, 0xD4EB, + 0x566B, 0xE0E6, + 0x566C, 0xCAC9, + 0x5671, 0xE0E5, + 0x5676, 0xB8C1, + 0x567B, 0xE0E7, + 0x567C, 0xE0E8, + 0x5685, 0xE0E9, + 0x5686, 0xE0E3, + 0x568E, 0xBABF, + 0x568F, 0xCCE7, + 0x5693, 0xE0EA, + 0x56A3, 0xCFF9, + 0x56AF, 0xE0EB, + 0x56B7, 0xC8C2, + 0x56BC, 0xBDC0, + 0x56CA, 0xC4D2, + 0x56D4, 0xE0EC, + 0x56D7, 0xE0ED, + 0x56DA, 0xC7F4, + 0x56DB, 0xCBC4, + 0x56DD, 0xE0EE, + 0x56DE, 0xBBD8, + 0x56DF, 0xD8B6, + 0x56E0, 0xD2F2, + 0x56E1, 0xE0EF, + 0x56E2, 0xCDC5, + 0x56E4, 0xB6DA, + 0x56EB, 0xE0F1, + 0x56ED, 0xD4B0, + 0x56F0, 0xC0A7, + 0x56F1, 0xB4D1, + 0x56F4, 0xCEA7, + 0x56F5, 0xE0F0, + 0x56F9, 0xE0F2, + 0x56FA, 0xB9CC, + 0x56FD, 0xB9FA, + 0x56FE, 0xCDBC, + 0x56FF, 0xE0F3, + 0x5703, 0xC6D4, + 0x5704, 0xE0F4, + 0x5706, 0xD4B2, + 0x5708, 0xC8A6, + 0x5709, 0xE0F6, + 0x570A, 0xE0F5, + 0x571C, 0xE0F7, + 0x571F, 0xCDC1, + 0x5723, 0xCAA5, + 0x5728, 0xD4DA, + 0x5729, 0xDBD7, + 0x572A, 0xDBD9, + 0x572C, 0xDBD8, + 0x572D, 0xB9E7, + 0x572E, 0xDBDC, + 0x572F, 0xDBDD, + 0x5730, 0xB5D8, + 0x5733, 0xDBDA, + 0x5739, 0xDBDB, + 0x573A, 0xB3A1, + 0x573B, 0xDBDF, + 0x573E, 0xBBF8, + 0x5740, 0xD6B7, + 0x5742, 0xDBE0, + 0x5747, 0xBEF9, + 0x574A, 0xB7BB, + 0x574C, 0xDBD0, + 0x574D, 0xCCAE, + 0x574E, 0xBFB2, + 0x574F, 0xBBB5, + 0x5750, 0xD7F8, + 0x5751, 0xBFD3, + 0x5757, 0xBFE9, + 0x575A, 0xBCE1, + 0x575B, 0xCCB3, + 0x575C, 0xDBDE, + 0x575D, 0xB0D3, + 0x575E, 0xCEEB, + 0x575F, 0xB7D8, + 0x5760, 0xD7B9, + 0x5761, 0xC6C2, + 0x5764, 0xC0A4, + 0x5766, 0xCCB9, + 0x5768, 0xDBE7, + 0x5769, 0xDBE1, + 0x576A, 0xC6BA, + 0x576B, 0xDBE3, + 0x576D, 0xDBE8, + 0x576F, 0xC5F7, + 0x5773, 0xDBEA, + 0x5776, 0xDBE9, + 0x5777, 0xBFC0, + 0x577B, 0xDBE6, + 0x577C, 0xDBE5, + 0x5782, 0xB4B9, + 0x5783, 0xC0AC, + 0x5784, 0xC2A2, + 0x5785, 0xDBE2, + 0x5786, 0xDBE4, + 0x578B, 0xD0CD, + 0x578C, 0xDBED, + 0x5792, 0xC0DD, + 0x5793, 0xDBF2, + 0x579B, 0xB6E2, + 0x57A0, 0xDBF3, + 0x57A1, 0xDBD2, + 0x57A2, 0xB9B8, + 0x57A3, 0xD4AB, + 0x57A4, 0xDBEC, + 0x57A6, 0xBFD1, + 0x57A7, 0xDBF0, + 0x57A9, 0xDBD1, + 0x57AB, 0xB5E6, + 0x57AD, 0xDBEB, + 0x57AE, 0xBFE5, + 0x57B2, 0xDBEE, + 0x57B4, 0xDBF1, + 0x57B8, 0xDBF9, + 0x57C2, 0xB9A1, + 0x57C3, 0xB0A3, + 0x57CB, 0xC2F1, + 0x57CE, 0xB3C7, + 0x57CF, 0xDBEF, + 0x57D2, 0xDBF8, + 0x57D4, 0xC6D2, + 0x57D5, 0xDBF4, + 0x57D8, 0xDBF5, + 0x57D9, 0xDBF7, + 0x57DA, 0xDBF6, + 0x57DD, 0xDBFE, + 0x57DF, 0xD3F2, + 0x57E0, 0xB2BA, + 0x57E4, 0xDBFD, + 0x57ED, 0xDCA4, + 0x57EF, 0xDBFB, + 0x57F4, 0xDBFA, + 0x57F8, 0xDBFC, + 0x57F9, 0xC5E0, + 0x57FA, 0xBBF9, + 0x57FD, 0xDCA3, + 0x5800, 0xDCA5, + 0x5802, 0xCCC3, + 0x5806, 0xB6D1, + 0x5807, 0xDDC0, + 0x580B, 0xDCA1, + 0x580D, 0xDCA2, + 0x5811, 0xC7B5, + 0x5815, 0xB6E9, + 0x5819, 0xDCA7, + 0x581E, 0xDCA6, + 0x5820, 0xDCA9, + 0x5821, 0xB1A4, + 0x5824, 0xB5CC, + 0x582A, 0xBFB0, + 0x5830, 0xD1DF, + 0x5835, 0xB6C2, + 0x5844, 0xDCA8, + 0x584C, 0xCBFA, + 0x584D, 0xEBF3, + 0x5851, 0xCBDC, + 0x5854, 0xCBFE, + 0x5858, 0xCCC1, + 0x585E, 0xC8FB, + 0x5865, 0xDCAA, + 0x586B, 0xCCEE, + 0x586C, 0xDCAB, + 0x587E, 0xDBD3, + 0x5880, 0xDCAF, + 0x5881, 0xDCAC, + 0x5883, 0xBEB3, + 0x5885, 0xCAFB, + 0x5889, 0xDCAD, + 0x5892, 0xC9CA, + 0x5893, 0xC4B9, + 0x5899, 0xC7BD, + 0x589A, 0xDCAE, + 0x589E, 0xD4F6, + 0x589F, 0xD0E6, + 0x58A8, 0xC4AB, + 0x58A9, 0xB6D5, + 0x58BC, 0xDBD4, + 0x58C1, 0xB1DA, + 0x58C5, 0xDBD5, + 0x58D1, 0xDBD6, + 0x58D5, 0xBABE, + 0x58E4, 0xC8C0, + 0x58EB, 0xCABF, + 0x58EC, 0xC8C9, + 0x58EE, 0xD7B3, + 0x58F0, 0xC9F9, + 0x58F3, 0xBFC7, + 0x58F6, 0xBAF8, + 0x58F9, 0xD2BC, + 0x5902, 0xE2BA, + 0x5904, 0xB4A6, + 0x5907, 0xB1B8, + 0x590D, 0xB8B4, + 0x590F, 0xCFC4, + 0x5914, 0xD9E7, + 0x5915, 0xCFA6, + 0x5916, 0xCDE2, + 0x5919, 0xD9ED, + 0x591A, 0xB6E0, + 0x591C, 0xD2B9, + 0x591F, 0xB9BB, + 0x5924, 0xE2B9, + 0x5925, 0xE2B7, + 0x5927, 0xB4F3, + 0x5929, 0xCCEC, + 0x592A, 0xCCAB, + 0x592B, 0xB7F2, + 0x592D, 0xD8B2, + 0x592E, 0xD1EB, + 0x592F, 0xBABB, + 0x5931, 0xCAA7, + 0x5934, 0xCDB7, + 0x5937, 0xD2C4, + 0x5938, 0xBFE4, + 0x5939, 0xBCD0, + 0x593A, 0xB6E1, + 0x593C, 0xDEC5, + 0x5941, 0xDEC6, + 0x5942, 0xDBBC, + 0x5944, 0xD1D9, + 0x5947, 0xC6E6, + 0x5948, 0xC4CE, + 0x5949, 0xB7EE, + 0x594B, 0xB7DC, + 0x594E, 0xBFFC, + 0x594F, 0xD7E0, + 0x5951, 0xC6F5, + 0x5954, 0xB1BC, + 0x5955, 0xDEC8, + 0x5956, 0xBDB1, + 0x5957, 0xCCD7, + 0x5958, 0xDECA, + 0x595A, 0xDEC9, + 0x5960, 0xB5EC, + 0x5962, 0xC9DD, + 0x5965, 0xB0C2, + 0x5973, 0xC5AE, + 0x5974, 0xC5AB, + 0x5976, 0xC4CC, + 0x5978, 0xBCE9, + 0x5979, 0xCBFD, + 0x597D, 0xBAC3, + 0x5981, 0xE5F9, + 0x5982, 0xC8E7, + 0x5983, 0xE5FA, + 0x5984, 0xCDFD, + 0x5986, 0xD7B1, + 0x5987, 0xB8BE, + 0x5988, 0xC2E8, + 0x598A, 0xC8D1, + 0x598D, 0xE5FB, + 0x5992, 0xB6CA, + 0x5993, 0xBCCB, + 0x5996, 0xD1FD, + 0x5997, 0xE6A1, + 0x5999, 0xC3EE, + 0x599E, 0xE6A4, + 0x59A3, 0xE5FE, + 0x59A4, 0xE6A5, + 0x59A5, 0xCDD7, + 0x59A8, 0xB7C1, + 0x59A9, 0xE5FC, + 0x59AA, 0xE5FD, + 0x59AB, 0xE6A3, + 0x59AE, 0xC4DD, + 0x59AF, 0xE6A8, + 0x59B2, 0xE6A7, + 0x59B9, 0xC3C3, + 0x59BB, 0xC6DE, + 0x59BE, 0xE6AA, + 0x59C6, 0xC4B7, + 0x59CA, 0xE6A2, + 0x59CB, 0xCABC, + 0x59D0, 0xBDE3, + 0x59D1, 0xB9C3, + 0x59D2, 0xE6A6, + 0x59D3, 0xD0D5, + 0x59D4, 0xCEAF, + 0x59D7, 0xE6A9, + 0x59D8, 0xE6B0, + 0x59DA, 0xD2A6, + 0x59DC, 0xBDAA, + 0x59DD, 0xE6AD, + 0x59E3, 0xE6AF, + 0x59E5, 0xC0D1, + 0x59E8, 0xD2CC, + 0x59EC, 0xBCA7, + 0x59F9, 0xE6B1, + 0x59FB, 0xD2F6, + 0x59FF, 0xD7CB, + 0x5A01, 0xCDFE, + 0x5A03, 0xCDDE, + 0x5A04, 0xC2A6, + 0x5A05, 0xE6AB, + 0x5A06, 0xE6AC, + 0x5A07, 0xBDBF, + 0x5A08, 0xE6AE, + 0x5A09, 0xE6B3, + 0x5A0C, 0xE6B2, + 0x5A11, 0xE6B6, + 0x5A13, 0xE6B8, + 0x5A18, 0xC4EF, + 0x5A1C, 0xC4C8, + 0x5A1F, 0xBEEA, + 0x5A20, 0xC9EF, + 0x5A23, 0xE6B7, + 0x5A25, 0xB6F0, + 0x5A29, 0xC3E4, + 0x5A31, 0xD3E9, + 0x5A32, 0xE6B4, + 0x5A34, 0xE6B5, + 0x5A36, 0xC8A2, + 0x5A3C, 0xE6BD, + 0x5A40, 0xE6B9, + 0x5A46, 0xC6C5, + 0x5A49, 0xCDF1, + 0x5A4A, 0xE6BB, + 0x5A55, 0xE6BC, + 0x5A5A, 0xBBE9, + 0x5A62, 0xE6BE, + 0x5A67, 0xE6BA, + 0x5A6A, 0xC0B7, + 0x5A74, 0xD3A4, + 0x5A75, 0xE6BF, + 0x5A76, 0xC9F4, + 0x5A77, 0xE6C3, + 0x5A7A, 0xE6C4, + 0x5A7F, 0xD0F6, + 0x5A92, 0xC3BD, + 0x5A9A, 0xC3C4, + 0x5A9B, 0xE6C2, + 0x5AAA, 0xE6C1, + 0x5AB2, 0xE6C7, + 0x5AB3, 0xCFB1, + 0x5AB5, 0xEBF4, + 0x5AB8, 0xE6CA, + 0x5ABE, 0xE6C5, + 0x5AC1, 0xBCDE, + 0x5AC2, 0xC9A9, + 0x5AC9, 0xBCB5, + 0x5ACC, 0xCFD3, + 0x5AD2, 0xE6C8, + 0x5AD4, 0xE6C9, + 0x5AD6, 0xE6CE, + 0x5AD8, 0xE6D0, + 0x5ADC, 0xE6D1, + 0x5AE0, 0xE6CB, + 0x5AE1, 0xB5D5, + 0x5AE3, 0xE6CC, + 0x5AE6, 0xE6CF, + 0x5AE9, 0xC4DB, + 0x5AEB, 0xE6C6, + 0x5AF1, 0xE6CD, + 0x5B09, 0xE6D2, + 0x5B16, 0xE6D4, + 0x5B17, 0xE6D3, + 0x5B32, 0xE6D5, + 0x5B34, 0xD9F8, + 0x5B37, 0xE6D6, + 0x5B40, 0xE6D7, + 0x5B50, 0xD7D3, + 0x5B51, 0xE6DD, + 0x5B53, 0xE6DE, + 0x5B54, 0xBFD7, + 0x5B55, 0xD4D0, + 0x5B57, 0xD7D6, + 0x5B58, 0xB4E6, + 0x5B59, 0xCBEF, + 0x5B5A, 0xE6DA, + 0x5B5B, 0xD8C3, + 0x5B5C, 0xD7CE, + 0x5B5D, 0xD0A2, + 0x5B5F, 0xC3CF, + 0x5B62, 0xE6DF, + 0x5B63, 0xBCBE, + 0x5B64, 0xB9C2, + 0x5B65, 0xE6DB, + 0x5B66, 0xD1A7, + 0x5B69, 0xBAA2, + 0x5B6A, 0xC2CF, + 0x5B6C, 0xD8AB, + 0x5B70, 0xCAEB, + 0x5B71, 0xE5EE, + 0x5B73, 0xE6DC, + 0x5B75, 0xB7F5, + 0x5B7A, 0xC8E6, + 0x5B7D, 0xC4F5, + 0x5B80, 0xE5B2, + 0x5B81, 0xC4FE, + 0x5B83, 0xCBFC, + 0x5B84, 0xE5B3, + 0x5B85, 0xD5AC, + 0x5B87, 0xD3EE, + 0x5B88, 0xCAD8, + 0x5B89, 0xB0B2, + 0x5B8B, 0xCBCE, + 0x5B8C, 0xCDEA, + 0x5B8F, 0xBAEA, + 0x5B93, 0xE5B5, + 0x5B95, 0xE5B4, + 0x5B97, 0xD7DA, + 0x5B98, 0xB9D9, + 0x5B99, 0xD6E6, + 0x5B9A, 0xB6A8, + 0x5B9B, 0xCDF0, + 0x5B9C, 0xD2CB, + 0x5B9D, 0xB1A6, + 0x5B9E, 0xCAB5, + 0x5BA0, 0xB3E8, + 0x5BA1, 0xC9F3, + 0x5BA2, 0xBFCD, + 0x5BA3, 0xD0FB, + 0x5BA4, 0xCAD2, + 0x5BA5, 0xE5B6, + 0x5BA6, 0xBBC2, + 0x5BAA, 0xCFDC, + 0x5BAB, 0xB9AC, + 0x5BB0, 0xD4D7, + 0x5BB3, 0xBAA6, + 0x5BB4, 0xD1E7, + 0x5BB5, 0xCFFC, + 0x5BB6, 0xBCD2, + 0x5BB8, 0xE5B7, + 0x5BB9, 0xC8DD, + 0x5BBD, 0xBFED, + 0x5BBE, 0xB1F6, + 0x5BBF, 0xCBDE, + 0x5BC2, 0xBCC5, + 0x5BC4, 0xBCC4, + 0x5BC5, 0xD2FA, + 0x5BC6, 0xC3DC, + 0x5BC7, 0xBFDC, + 0x5BCC, 0xB8BB, + 0x5BD0, 0xC3C2, + 0x5BD2, 0xBAAE, + 0x5BD3, 0xD4A2, + 0x5BDD, 0xC7DE, + 0x5BDE, 0xC4AF, + 0x5BDF, 0xB2EC, + 0x5BE1, 0xB9D1, + 0x5BE4, 0xE5BB, + 0x5BE5, 0xC1C8, + 0x5BE8, 0xD5AF, + 0x5BEE, 0xE5BC, + 0x5BF0, 0xE5BE, + 0x5BF8, 0xB4E7, + 0x5BF9, 0xB6D4, + 0x5BFA, 0xCBC2, + 0x5BFB, 0xD1B0, + 0x5BFC, 0xB5BC, + 0x5BFF, 0xCAD9, + 0x5C01, 0xB7E2, + 0x5C04, 0xC9E4, + 0x5C06, 0xBDAB, + 0x5C09, 0xCEBE, + 0x5C0A, 0xD7F0, + 0x5C0F, 0xD0A1, + 0x5C11, 0xC9D9, + 0x5C14, 0xB6FB, + 0x5C15, 0xE6D8, + 0x5C16, 0xBCE2, + 0x5C18, 0xB3BE, + 0x5C1A, 0xC9D0, + 0x5C1C, 0xE6D9, + 0x5C1D, 0xB3A2, + 0x5C22, 0xDECC, + 0x5C24, 0xD3C8, + 0x5C25, 0xDECD, + 0x5C27, 0xD2A2, + 0x5C2C, 0xDECE, + 0x5C31, 0xBECD, + 0x5C34, 0xDECF, + 0x5C38, 0xCAAC, + 0x5C39, 0xD2FC, + 0x5C3A, 0xB3DF, + 0x5C3B, 0xE5EA, + 0x5C3C, 0xC4E1, + 0x5C3D, 0xBEA1, + 0x5C3E, 0xCEB2, + 0x5C3F, 0xC4F2, + 0x5C40, 0xBED6, + 0x5C41, 0xC6A8, + 0x5C42, 0xB2E3, + 0x5C45, 0xBED3, + 0x5C48, 0xC7FC, + 0x5C49, 0xCCEB, + 0x5C4A, 0xBDEC, + 0x5C4B, 0xCEDD, + 0x5C4E, 0xCABA, + 0x5C4F, 0xC6C1, + 0x5C50, 0xE5EC, + 0x5C51, 0xD0BC, + 0x5C55, 0xD5B9, + 0x5C59, 0xE5ED, + 0x5C5E, 0xCAF4, + 0x5C60, 0xCDC0, + 0x5C61, 0xC2C5, + 0x5C63, 0xE5EF, + 0x5C65, 0xC2C4, + 0x5C66, 0xE5F0, + 0x5C6E, 0xE5F8, + 0x5C6F, 0xCDCD, + 0x5C71, 0xC9BD, + 0x5C79, 0xD2D9, + 0x5C7A, 0xE1A8, + 0x5C7F, 0xD3EC, + 0x5C81, 0xCBEA, + 0x5C82, 0xC6F1, + 0x5C88, 0xE1AC, + 0x5C8C, 0xE1A7, + 0x5C8D, 0xE1A9, + 0x5C90, 0xE1AA, + 0x5C91, 0xE1AF, + 0x5C94, 0xB2ED, + 0x5C96, 0xE1AB, + 0x5C97, 0xB8DA, + 0x5C98, 0xE1AD, + 0x5C99, 0xE1AE, + 0x5C9A, 0xE1B0, + 0x5C9B, 0xB5BA, + 0x5C9C, 0xE1B1, + 0x5CA2, 0xE1B3, + 0x5CA3, 0xE1B8, + 0x5CA9, 0xD1D2, + 0x5CAB, 0xE1B6, + 0x5CAC, 0xE1B5, + 0x5CAD, 0xC1EB, + 0x5CB1, 0xE1B7, + 0x5CB3, 0xD4C0, + 0x5CB5, 0xE1B2, + 0x5CB7, 0xE1BA, + 0x5CB8, 0xB0B6, + 0x5CBD, 0xE1B4, + 0x5CBF, 0xBFF9, + 0x5CC1, 0xE1B9, + 0x5CC4, 0xE1BB, + 0x5CCB, 0xE1BE, + 0x5CD2, 0xE1BC, + 0x5CD9, 0xD6C5, + 0x5CE1, 0xCFBF, + 0x5CE4, 0xE1BD, + 0x5CE5, 0xE1BF, + 0x5CE6, 0xC2CD, + 0x5CE8, 0xB6EB, + 0x5CEA, 0xD3F8, + 0x5CED, 0xC7CD, + 0x5CF0, 0xB7E5, + 0x5CFB, 0xBEFE, + 0x5D02, 0xE1C0, + 0x5D03, 0xE1C1, + 0x5D06, 0xE1C7, + 0x5D07, 0xB3E7, + 0x5D0E, 0xC6E9, + 0x5D14, 0xB4DE, + 0x5D16, 0xD1C2, + 0x5D1B, 0xE1C8, + 0x5D1E, 0xE1C6, + 0x5D24, 0xE1C5, + 0x5D26, 0xE1C3, + 0x5D27, 0xE1C2, + 0x5D29, 0xB1C0, + 0x5D2D, 0xD5B8, + 0x5D2E, 0xE1C4, + 0x5D34, 0xE1CB, + 0x5D3D, 0xE1CC, + 0x5D3E, 0xE1CA, + 0x5D47, 0xEFFA, + 0x5D4A, 0xE1D3, + 0x5D4B, 0xE1D2, + 0x5D4C, 0xC7B6, + 0x5D58, 0xE1C9, + 0x5D5B, 0xE1CE, + 0x5D5D, 0xE1D0, + 0x5D69, 0xE1D4, + 0x5D6B, 0xE1D1, + 0x5D6C, 0xE1CD, + 0x5D6F, 0xE1CF, + 0x5D74, 0xE1D5, + 0x5D82, 0xE1D6, + 0x5D99, 0xE1D7, + 0x5D9D, 0xE1D8, + 0x5DB7, 0xE1DA, + 0x5DC5, 0xE1DB, + 0x5DCD, 0xCEA1, + 0x5DDB, 0xE7DD, + 0x5DDD, 0xB4A8, + 0x5DDE, 0xD6DD, + 0x5DE1, 0xD1B2, + 0x5DE2, 0xB3B2, + 0x5DE5, 0xB9A4, + 0x5DE6, 0xD7F3, + 0x5DE7, 0xC7C9, + 0x5DE8, 0xBEDE, + 0x5DE9, 0xB9AE, + 0x5DEB, 0xCED7, + 0x5DEE, 0xB2EE, + 0x5DEF, 0xDBCF, + 0x5DF1, 0xBCBA, + 0x5DF2, 0xD2D1, + 0x5DF3, 0xCBC8, + 0x5DF4, 0xB0CD, + 0x5DF7, 0xCFEF, + 0x5DFD, 0xD9E3, + 0x5DFE, 0xBDED, + 0x5E01, 0xB1D2, + 0x5E02, 0xCAD0, + 0x5E03, 0xB2BC, + 0x5E05, 0xCBA7, + 0x5E06, 0xB7AB, + 0x5E08, 0xCAA6, + 0x5E0C, 0xCFA3, + 0x5E0F, 0xE0F8, + 0x5E10, 0xD5CA, + 0x5E11, 0xE0FB, + 0x5E14, 0xE0FA, + 0x5E15, 0xC5C1, + 0x5E16, 0xCCFB, + 0x5E18, 0xC1B1, + 0x5E19, 0xE0F9, + 0x5E1A, 0xD6E3, + 0x5E1B, 0xB2AF, + 0x5E1C, 0xD6C4, + 0x5E1D, 0xB5DB, + 0x5E26, 0xB4F8, + 0x5E27, 0xD6A1, + 0x5E2D, 0xCFAF, + 0x5E2E, 0xB0EF, + 0x5E31, 0xE0FC, + 0x5E37, 0xE1A1, + 0x5E38, 0xB3A3, + 0x5E3B, 0xE0FD, + 0x5E3C, 0xE0FE, + 0x5E3D, 0xC3B1, + 0x5E42, 0xC3DD, + 0x5E44, 0xE1A2, + 0x5E45, 0xB7F9, + 0x5E4C, 0xBBCF, + 0x5E54, 0xE1A3, + 0x5E55, 0xC4BB, + 0x5E5B, 0xE1A4, + 0x5E5E, 0xE1A5, + 0x5E61, 0xE1A6, + 0x5E62, 0xB4B1, + 0x5E72, 0xB8C9, + 0x5E73, 0xC6BD, + 0x5E74, 0xC4EA, + 0x5E76, 0xB2A2, + 0x5E78, 0xD0D2, + 0x5E7A, 0xE7DB, + 0x5E7B, 0xBBC3, + 0x5E7C, 0xD3D7, + 0x5E7D, 0xD3C4, + 0x5E7F, 0xB9E3, + 0x5E80, 0xE2CF, + 0x5E84, 0xD7AF, + 0x5E86, 0xC7EC, + 0x5E87, 0xB1D3, + 0x5E8A, 0xB4B2, + 0x5E8B, 0xE2D1, + 0x5E8F, 0xD0F2, + 0x5E90, 0xC2AE, + 0x5E91, 0xE2D0, + 0x5E93, 0xBFE2, + 0x5E94, 0xD3A6, + 0x5E95, 0xB5D7, + 0x5E96, 0xE2D2, + 0x5E97, 0xB5EA, + 0x5E99, 0xC3ED, + 0x5E9A, 0xB8FD, + 0x5E9C, 0xB8AE, + 0x5E9E, 0xC5D3, + 0x5E9F, 0xB7CF, + 0x5EA0, 0xE2D4, + 0x5EA5, 0xE2D3, + 0x5EA6, 0xB6C8, + 0x5EA7, 0xD7F9, + 0x5EAD, 0xCDA5, + 0x5EB3, 0xE2D8, + 0x5EB5, 0xE2D6, + 0x5EB6, 0xCAFC, + 0x5EB7, 0xBFB5, + 0x5EB8, 0xD3B9, + 0x5EB9, 0xE2D5, + 0x5EBE, 0xE2D7, + 0x5EC9, 0xC1AE, + 0x5ECA, 0xC0C8, + 0x5ED1, 0xE2DB, + 0x5ED2, 0xE2DA, + 0x5ED3, 0xC0AA, + 0x5ED6, 0xC1CE, + 0x5EDB, 0xE2DC, + 0x5EE8, 0xE2DD, + 0x5EEA, 0xE2DE, + 0x5EF4, 0xDBC8, + 0x5EF6, 0xD1D3, + 0x5EF7, 0xCDA2, + 0x5EFA, 0xBDA8, + 0x5EFE, 0xDEC3, + 0x5EFF, 0xD8A5, + 0x5F00, 0xBFAA, + 0x5F01, 0xDBCD, + 0x5F02, 0xD2EC, + 0x5F03, 0xC6FA, + 0x5F04, 0xC5AA, + 0x5F08, 0xDEC4, + 0x5F0A, 0xB1D7, + 0x5F0B, 0xDFAE, + 0x5F0F, 0xCABD, + 0x5F11, 0xDFB1, + 0x5F13, 0xB9AD, + 0x5F15, 0xD2FD, + 0x5F17, 0xB8A5, + 0x5F18, 0xBAEB, + 0x5F1B, 0xB3DA, + 0x5F1F, 0xB5DC, + 0x5F20, 0xD5C5, + 0x5F25, 0xC3D6, + 0x5F26, 0xCFD2, + 0x5F27, 0xBBA1, + 0x5F29, 0xE5F3, + 0x5F2A, 0xE5F2, + 0x5F2D, 0xE5F4, + 0x5F2F, 0xCDE4, + 0x5F31, 0xC8F5, + 0x5F39, 0xB5AF, + 0x5F3A, 0xC7BF, + 0x5F3C, 0xE5F6, + 0x5F40, 0xECB0, + 0x5F50, 0xE5E6, + 0x5F52, 0xB9E9, + 0x5F53, 0xB5B1, + 0x5F55, 0xC2BC, + 0x5F56, 0xE5E8, + 0x5F57, 0xE5E7, + 0x5F58, 0xE5E9, + 0x5F5D, 0xD2CD, + 0x5F61, 0xE1EA, + 0x5F62, 0xD0CE, + 0x5F64, 0xCDAE, + 0x5F66, 0xD1E5, + 0x5F69, 0xB2CA, + 0x5F6A, 0xB1EB, + 0x5F6C, 0xB1F2, + 0x5F6D, 0xC5ED, + 0x5F70, 0xD5C3, + 0x5F71, 0xD3B0, + 0x5F73, 0xE1DC, + 0x5F77, 0xE1DD, + 0x5F79, 0xD2DB, + 0x5F7B, 0xB3B9, + 0x5F7C, 0xB1CB, + 0x5F80, 0xCDF9, + 0x5F81, 0xD5F7, + 0x5F82, 0xE1DE, + 0x5F84, 0xBEB6, + 0x5F85, 0xB4FD, + 0x5F87, 0xE1DF, + 0x5F88, 0xBADC, + 0x5F89, 0xE1E0, + 0x5F8A, 0xBBB2, + 0x5F8B, 0xC2C9, + 0x5F8C, 0xE1E1, + 0x5F90, 0xD0EC, + 0x5F92, 0xCDBD, + 0x5F95, 0xE1E2, + 0x5F97, 0xB5C3, + 0x5F98, 0xC5C7, + 0x5F99, 0xE1E3, + 0x5F9C, 0xE1E4, + 0x5FA1, 0xD3F9, + 0x5FA8, 0xE1E5, + 0x5FAA, 0xD1AD, + 0x5FAD, 0xE1E6, + 0x5FAE, 0xCEA2, + 0x5FB5, 0xE1E7, + 0x5FB7, 0xB5C2, + 0x5FBC, 0xE1E8, + 0x5FBD, 0xBBD5, + 0x5FC3, 0xD0C4, + 0x5FC4, 0xE2E0, + 0x5FC5, 0xB1D8, + 0x5FC6, 0xD2E4, + 0x5FC9, 0xE2E1, + 0x5FCC, 0xBCC9, + 0x5FCD, 0xC8CC, + 0x5FCF, 0xE2E3, + 0x5FD0, 0xECFE, + 0x5FD1, 0xECFD, + 0x5FD2, 0xDFAF, + 0x5FD6, 0xE2E2, + 0x5FD7, 0xD6BE, + 0x5FD8, 0xCDFC, + 0x5FD9, 0xC3A6, + 0x5FDD, 0xE3C3, + 0x5FE0, 0xD6D2, + 0x5FE1, 0xE2E7, + 0x5FE4, 0xE2E8, + 0x5FE7, 0xD3C7, + 0x5FEA, 0xE2EC, + 0x5FEB, 0xBFEC, + 0x5FED, 0xE2ED, + 0x5FEE, 0xE2E5, + 0x5FF1, 0xB3C0, + 0x5FF5, 0xC4EE, + 0x5FF8, 0xE2EE, + 0x5FFB, 0xD0C3, + 0x5FFD, 0xBAF6, + 0x5FFE, 0xE2E9, + 0x5FFF, 0xB7DE, + 0x6000, 0xBBB3, + 0x6001, 0xCCAC, + 0x6002, 0xCBCB, + 0x6003, 0xE2E4, + 0x6004, 0xE2E6, + 0x6005, 0xE2EA, + 0x6006, 0xE2EB, + 0x600A, 0xE2F7, + 0x600D, 0xE2F4, + 0x600E, 0xD4F5, + 0x600F, 0xE2F3, + 0x6012, 0xC5AD, + 0x6014, 0xD5FA, + 0x6015, 0xC5C2, + 0x6016, 0xB2C0, + 0x6019, 0xE2EF, + 0x601B, 0xE2F2, + 0x601C, 0xC1AF, + 0x601D, 0xCBBC, + 0x6020, 0xB5A1, + 0x6021, 0xE2F9, + 0x6025, 0xBCB1, + 0x6026, 0xE2F1, + 0x6027, 0xD0D4, + 0x6028, 0xD4B9, + 0x6029, 0xE2F5, + 0x602A, 0xB9D6, + 0x602B, 0xE2F6, + 0x602F, 0xC7D3, + 0x6035, 0xE2F0, + 0x603B, 0xD7DC, + 0x603C, 0xEDA1, + 0x603F, 0xE2F8, + 0x6041, 0xEDA5, + 0x6042, 0xE2FE, + 0x6043, 0xCAD1, + 0x604B, 0xC1B5, + 0x604D, 0xBBD0, + 0x6050, 0xBFD6, + 0x6052, 0xBAE3, + 0x6055, 0xCBA1, + 0x6059, 0xEDA6, + 0x605A, 0xEDA3, + 0x605D, 0xEDA2, + 0x6062, 0xBBD6, + 0x6063, 0xEDA7, + 0x6064, 0xD0F4, + 0x6067, 0xEDA4, + 0x6068, 0xBADE, + 0x6069, 0xB6F7, + 0x606A, 0xE3A1, + 0x606B, 0xB6B2, + 0x606C, 0xCCF1, + 0x606D, 0xB9A7, + 0x606F, 0xCFA2, + 0x6070, 0xC7A1, + 0x6073, 0xBFD2, + 0x6076, 0xB6F1, + 0x6078, 0xE2FA, + 0x6079, 0xE2FB, + 0x607A, 0xE2FD, + 0x607B, 0xE2FC, + 0x607C, 0xC4D5, + 0x607D, 0xE3A2, + 0x607F, 0xD3C1, + 0x6083, 0xE3A7, + 0x6084, 0xC7C4, + 0x6089, 0xCFA4, + 0x608C, 0xE3A9, + 0x608D, 0xBAB7, + 0x6092, 0xE3A8, + 0x6094, 0xBBDA, + 0x6096, 0xE3A3, + 0x609A, 0xE3A4, + 0x609B, 0xE3AA, + 0x609D, 0xE3A6, + 0x609F, 0xCEF2, + 0x60A0, 0xD3C6, + 0x60A3, 0xBBBC, + 0x60A6, 0xD4C3, + 0x60A8, 0xC4FA, + 0x60AB, 0xEDA8, + 0x60AC, 0xD0FC, + 0x60AD, 0xE3A5, + 0x60AF, 0xC3F5, + 0x60B1, 0xE3AD, + 0x60B2, 0xB1AF, + 0x60B4, 0xE3B2, + 0x60B8, 0xBCC2, + 0x60BB, 0xE3AC, + 0x60BC, 0xB5BF, + 0x60C5, 0xC7E9, + 0x60C6, 0xE3B0, + 0x60CA, 0xBEAA, + 0x60CB, 0xCDEF, + 0x60D1, 0xBBF3, + 0x60D5, 0xCCE8, + 0x60D8, 0xE3AF, + 0x60DA, 0xE3B1, + 0x60DC, 0xCFA7, + 0x60DD, 0xE3AE, + 0x60DF, 0xCEA9, + 0x60E0, 0xBBDD, + 0x60E6, 0xB5EB, + 0x60E7, 0xBEE5, + 0x60E8, 0xB2D2, + 0x60E9, 0xB3CD, + 0x60EB, 0xB1B9, + 0x60EC, 0xE3AB, + 0x60ED, 0xB2D1, + 0x60EE, 0xB5AC, + 0x60EF, 0xB9DF, + 0x60F0, 0xB6E8, + 0x60F3, 0xCFEB, + 0x60F4, 0xE3B7, + 0x60F6, 0xBBCC, + 0x60F9, 0xC8C7, + 0x60FA, 0xD0CA, + 0x6100, 0xE3B8, + 0x6101, 0xB3EE, + 0x6106, 0xEDA9, + 0x6108, 0xD3FA, + 0x6109, 0xD3E4, + 0x610D, 0xEDAA, + 0x610E, 0xE3B9, + 0x610F, 0xD2E2, + 0x6115, 0xE3B5, + 0x611A, 0xD3DE, + 0x611F, 0xB8D0, + 0x6120, 0xE3B3, + 0x6123, 0xE3B6, + 0x6124, 0xB7DF, + 0x6126, 0xE3B4, + 0x6127, 0xC0A2, + 0x612B, 0xE3BA, + 0x613F, 0xD4B8, + 0x6148, 0xB4C8, + 0x614A, 0xE3BB, + 0x614C, 0xBBC5, + 0x614E, 0xC9F7, + 0x6151, 0xC9E5, + 0x6155, 0xC4BD, + 0x615D, 0xEDAB, + 0x6162, 0xC2FD, + 0x6167, 0xBBDB, + 0x6168, 0xBFAE, + 0x6170, 0xCEBF, + 0x6175, 0xE3BC, + 0x6177, 0xBFB6, + 0x618B, 0xB1EF, + 0x618E, 0xD4F7, + 0x6194, 0xE3BE, + 0x619D, 0xEDAD, + 0x61A7, 0xE3BF, + 0x61A8, 0xBAA9, + 0x61A9, 0xEDAC, + 0x61AC, 0xE3BD, + 0x61B7, 0xE3C0, + 0x61BE, 0xBAB6, + 0x61C2, 0xB6AE, + 0x61C8, 0xD0B8, + 0x61CA, 0xB0C3, + 0x61CB, 0xEDAE, + 0x61D1, 0xEDAF, + 0x61D2, 0xC0C1, + 0x61D4, 0xE3C1, + 0x61E6, 0xC5B3, + 0x61F5, 0xE3C2, + 0x61FF, 0xDCB2, + 0x6206, 0xEDB0, + 0x6208, 0xB8EA, + 0x620A, 0xCEEC, + 0x620B, 0xEAA7, + 0x620C, 0xD0E7, + 0x620D, 0xCAF9, + 0x620E, 0xC8D6, + 0x620F, 0xCFB7, + 0x6210, 0xB3C9, + 0x6211, 0xCED2, + 0x6212, 0xBDE4, + 0x6215, 0xE3DE, + 0x6216, 0xBBF2, + 0x6217, 0xEAA8, + 0x6218, 0xD5BD, + 0x621A, 0xC6DD, + 0x621B, 0xEAA9, + 0x621F, 0xEAAA, + 0x6221, 0xEAAC, + 0x6222, 0xEAAB, + 0x6224, 0xEAAE, + 0x6225, 0xEAAD, + 0x622A, 0xBDD8, + 0x622C, 0xEAAF, + 0x622E, 0xC2BE, + 0x6233, 0xB4C1, + 0x6234, 0xB4F7, + 0x6237, 0xBBA7, + 0x623D, 0xECE6, + 0x623E, 0xECE5, + 0x623F, 0xB7BF, + 0x6240, 0xCBF9, + 0x6241, 0xB1E2, + 0x6243, 0xECE7, + 0x6247, 0xC9C8, + 0x6248, 0xECE8, + 0x6249, 0xECE9, + 0x624B, 0xCAD6, + 0x624C, 0xDED0, + 0x624D, 0xB2C5, + 0x624E, 0xD4FA, + 0x6251, 0xC6CB, + 0x6252, 0xB0C7, + 0x6253, 0xB4F2, + 0x6254, 0xC8D3, + 0x6258, 0xCDD0, + 0x625B, 0xBFB8, + 0x6263, 0xBFDB, + 0x6266, 0xC7A4, + 0x6267, 0xD6B4, + 0x6269, 0xC0A9, + 0x626A, 0xDED1, + 0x626B, 0xC9A8, + 0x626C, 0xD1EF, + 0x626D, 0xC5A4, + 0x626E, 0xB0E7, + 0x626F, 0xB3B6, + 0x6270, 0xC8C5, + 0x6273, 0xB0E2, + 0x6276, 0xB7F6, + 0x6279, 0xC5FA, + 0x627C, 0xB6F3, + 0x627E, 0xD5D2, + 0x627F, 0xB3D0, + 0x6280, 0xBCBC, + 0x6284, 0xB3AD, + 0x6289, 0xBEF1, + 0x628A, 0xB0D1, + 0x6291, 0xD2D6, + 0x6292, 0xCAE3, + 0x6293, 0xD7A5, + 0x6295, 0xCDB6, + 0x6296, 0xB6B6, + 0x6297, 0xBFB9, + 0x6298, 0xD5DB, + 0x629A, 0xB8A7, + 0x629B, 0xC5D7, + 0x629F, 0xDED2, + 0x62A0, 0xBFD9, + 0x62A1, 0xC2D5, + 0x62A2, 0xC7C0, + 0x62A4, 0xBBA4, + 0x62A5, 0xB1A8, + 0x62A8, 0xC5EA, + 0x62AB, 0xC5FB, + 0x62AC, 0xCCA7, + 0x62B1, 0xB1A7, + 0x62B5, 0xB5D6, + 0x62B9, 0xC4A8, + 0x62BB, 0xDED3, + 0x62BC, 0xD1BA, + 0x62BD, 0xB3E9, + 0x62BF, 0xC3F2, + 0x62C2, 0xB7F7, + 0x62C4, 0xD6F4, + 0x62C5, 0xB5A3, + 0x62C6, 0xB2F0, + 0x62C7, 0xC4B4, + 0x62C8, 0xC4E9, + 0x62C9, 0xC0AD, + 0x62CA, 0xDED4, + 0x62CC, 0xB0E8, + 0x62CD, 0xC5C4, + 0x62CE, 0xC1E0, + 0x62D0, 0xB9D5, + 0x62D2, 0xBEDC, + 0x62D3, 0xCDD8, + 0x62D4, 0xB0CE, + 0x62D6, 0xCDCF, + 0x62D7, 0xDED6, + 0x62D8, 0xBED0, + 0x62D9, 0xD7BE, + 0x62DA, 0xDED5, + 0x62DB, 0xD5D0, + 0x62DC, 0xB0DD, + 0x62DF, 0xC4E2, + 0x62E2, 0xC2A3, + 0x62E3, 0xBCF0, + 0x62E5, 0xD3B5, + 0x62E6, 0xC0B9, + 0x62E7, 0xC5A1, + 0x62E8, 0xB2A6, + 0x62E9, 0xD4F1, + 0x62EC, 0xC0A8, + 0x62ED, 0xCAC3, + 0x62EE, 0xDED7, + 0x62EF, 0xD5FC, + 0x62F1, 0xB9B0, + 0x62F3, 0xC8AD, + 0x62F4, 0xCBA9, + 0x62F6, 0xDED9, + 0x62F7, 0xBFBD, + 0x62FC, 0xC6B4, + 0x62FD, 0xD7A7, + 0x62FE, 0xCAB0, + 0x62FF, 0xC4C3, + 0x6301, 0xB3D6, + 0x6302, 0xB9D2, + 0x6307, 0xD6B8, + 0x6308, 0xEAFC, + 0x6309, 0xB0B4, + 0x630E, 0xBFE6, + 0x6311, 0xCCF4, + 0x6316, 0xCDDA, + 0x631A, 0xD6BF, + 0x631B, 0xC2CE, + 0x631D, 0xCECE, + 0x631E, 0xCCA2, + 0x631F, 0xD0AE, + 0x6320, 0xC4D3, + 0x6321, 0xB5B2, + 0x6322, 0xDED8, + 0x6323, 0xD5F5, + 0x6324, 0xBCB7, + 0x6325, 0xBBD3, + 0x6328, 0xB0A4, + 0x632A, 0xC5B2, + 0x632B, 0xB4EC, + 0x632F, 0xD5F1, + 0x6332, 0xEAFD, + 0x6339, 0xDEDA, + 0x633A, 0xCDA6, + 0x633D, 0xCDEC, + 0x6342, 0xCEE6, + 0x6343, 0xDEDC, + 0x6345, 0xCDB1, + 0x6346, 0xC0A6, + 0x6349, 0xD7BD, + 0x634B, 0xDEDB, + 0x634C, 0xB0C6, + 0x634D, 0xBAB4, + 0x634E, 0xC9D3, + 0x634F, 0xC4F3, + 0x6350, 0xBEE8, + 0x6355, 0xB2B6, + 0x635E, 0xC0CC, + 0x635F, 0xCBF0, + 0x6361, 0xBCF1, + 0x6362, 0xBBBB, + 0x6363, 0xB5B7, + 0x6367, 0xC5F5, + 0x6369, 0xDEE6, + 0x636D, 0xDEE3, + 0x636E, 0xBEDD, + 0x6371, 0xDEDF, + 0x6376, 0xB4B7, + 0x6377, 0xBDDD, + 0x637A, 0xDEE0, + 0x637B, 0xC4ED, + 0x6380, 0xCFC6, + 0x6382, 0xB5E0, + 0x6387, 0xB6DE, + 0x6388, 0xCADA, + 0x6389, 0xB5F4, + 0x638A, 0xDEE5, + 0x638C, 0xD5C6, + 0x638E, 0xDEE1, + 0x638F, 0xCCCD, + 0x6390, 0xC6FE, + 0x6392, 0xC5C5, + 0x6396, 0xD2B4, + 0x6398, 0xBEF2, + 0x63A0, 0xC2D3, + 0x63A2, 0xCCBD, + 0x63A3, 0xB3B8, + 0x63A5, 0xBDD3, + 0x63A7, 0xBFD8, + 0x63A8, 0xCDC6, + 0x63A9, 0xD1DA, + 0x63AA, 0xB4EB, + 0x63AC, 0xDEE4, + 0x63AD, 0xDEDD, + 0x63AE, 0xDEE7, + 0x63B0, 0xEAFE, + 0x63B3, 0xC2B0, + 0x63B4, 0xDEE2, + 0x63B7, 0xD6C0, + 0x63B8, 0xB5A7, + 0x63BA, 0xB2F4, + 0x63BC, 0xDEE8, + 0x63BE, 0xDEF2, + 0x63C4, 0xDEED, + 0x63C6, 0xDEF1, + 0x63C9, 0xC8E0, + 0x63CD, 0xD7E1, + 0x63CE, 0xDEEF, + 0x63CF, 0xC3E8, + 0x63D0, 0xCCE1, + 0x63D2, 0xB2E5, + 0x63D6, 0xD2BE, + 0x63DE, 0xDEEE, + 0x63E0, 0xDEEB, + 0x63E1, 0xCED5, + 0x63E3, 0xB4A7, + 0x63E9, 0xBFAB, + 0x63EA, 0xBEBE, + 0x63ED, 0xBDD2, + 0x63F2, 0xDEE9, + 0x63F4, 0xD4AE, + 0x63F6, 0xDEDE, + 0x63F8, 0xDEEA, + 0x63FD, 0xC0BF, + 0x63FF, 0xDEEC, + 0x6400, 0xB2F3, + 0x6401, 0xB8E9, + 0x6402, 0xC2A7, + 0x6405, 0xBDC1, + 0x640B, 0xDEF5, + 0x640C, 0xDEF8, + 0x640F, 0xB2AB, + 0x6410, 0xB4A4, + 0x6413, 0xB4EA, + 0x6414, 0xC9A6, + 0x641B, 0xDEF6, + 0x641C, 0xCBD1, + 0x641E, 0xB8E3, + 0x6420, 0xDEF7, + 0x6421, 0xDEFA, + 0x6426, 0xDEF9, + 0x642A, 0xCCC2, + 0x642C, 0xB0E1, + 0x642D, 0xB4EE, + 0x6434, 0xE5BA, + 0x643A, 0xD0AF, + 0x643D, 0xB2EB, + 0x643F, 0xEBA1, + 0x6441, 0xDEF4, + 0x6444, 0xC9E3, + 0x6445, 0xDEF3, + 0x6446, 0xB0DA, + 0x6447, 0xD2A1, + 0x6448, 0xB1F7, + 0x644A, 0xCCAF, + 0x6452, 0xDEF0, + 0x6454, 0xCBA4, + 0x6458, 0xD5AA, + 0x645E, 0xDEFB, + 0x6467, 0xB4DD, + 0x6469, 0xC4A6, + 0x646D, 0xDEFD, + 0x6478, 0xC3FE, + 0x6479, 0xC4A1, + 0x647A, 0xDFA1, + 0x6482, 0xC1CC, + 0x6484, 0xDEFC, + 0x6485, 0xBEEF, + 0x6487, 0xC6B2, + 0x6491, 0xB3C5, + 0x6492, 0xC8F6, + 0x6495, 0xCBBA, + 0x6496, 0xDEFE, + 0x6499, 0xDFA4, + 0x649E, 0xD7B2, + 0x64A4, 0xB3B7, + 0x64A9, 0xC1C3, + 0x64AC, 0xC7CB, + 0x64AD, 0xB2A5, + 0x64AE, 0xB4E9, + 0x64B0, 0xD7AB, + 0x64B5, 0xC4EC, + 0x64B7, 0xDFA2, + 0x64B8, 0xDFA3, + 0x64BA, 0xDFA5, + 0x64BC, 0xBAB3, + 0x64C0, 0xDFA6, + 0x64C2, 0xC0DE, + 0x64C5, 0xC9C3, + 0x64CD, 0xB2D9, + 0x64CE, 0xC7E6, + 0x64D0, 0xDFA7, + 0x64D2, 0xC7DC, + 0x64D7, 0xDFA8, + 0x64D8, 0xEBA2, + 0x64DE, 0xCBD3, + 0x64E2, 0xDFAA, + 0x64E4, 0xDFA9, + 0x64E6, 0xB2C1, + 0x6500, 0xC5CA, + 0x6509, 0xDFAB, + 0x6512, 0xD4DC, + 0x6518, 0xC8C1, + 0x6525, 0xDFAC, + 0x652B, 0xBEF0, + 0x652E, 0xDFAD, + 0x652F, 0xD6A7, + 0x6534, 0xEAB7, + 0x6535, 0xEBB6, + 0x6536, 0xCAD5, + 0x6538, 0xD8FC, + 0x6539, 0xB8C4, + 0x653B, 0xB9A5, + 0x653E, 0xB7C5, + 0x653F, 0xD5FE, + 0x6545, 0xB9CA, + 0x6548, 0xD0A7, + 0x6549, 0xF4CD, + 0x654C, 0xB5D0, + 0x654F, 0xC3F4, + 0x6551, 0xBEC8, + 0x6555, 0xEBB7, + 0x6556, 0xB0BD, + 0x6559, 0xBDCC, + 0x655B, 0xC1B2, + 0x655D, 0xB1D6, + 0x655E, 0xB3A8, + 0x6562, 0xB8D2, + 0x6563, 0xC9A2, + 0x6566, 0xB6D8, + 0x656B, 0xEBB8, + 0x656C, 0xBEB4, + 0x6570, 0xCAFD, + 0x6572, 0xC7C3, + 0x6574, 0xD5FB, + 0x6577, 0xB7F3, + 0x6587, 0xCEC4, + 0x658B, 0xD5AB, + 0x658C, 0xB1F3, + 0x6590, 0xECB3, + 0x6591, 0xB0DF, + 0x6593, 0xECB5, + 0x6597, 0xB6B7, + 0x6599, 0xC1CF, + 0x659B, 0xF5FA, + 0x659C, 0xD0B1, + 0x659F, 0xD5E5, + 0x65A1, 0xCED3, + 0x65A4, 0xBDEF, + 0x65A5, 0xB3E2, + 0x65A7, 0xB8AB, + 0x65A9, 0xD5B6, + 0x65AB, 0xEDBD, + 0x65AD, 0xB6CF, + 0x65AF, 0xCBB9, + 0x65B0, 0xD0C2, + 0x65B9, 0xB7BD, + 0x65BC, 0xECB6, + 0x65BD, 0xCAA9, + 0x65C1, 0xC5D4, + 0x65C3, 0xECB9, + 0x65C4, 0xECB8, + 0x65C5, 0xC2C3, + 0x65C6, 0xECB7, + 0x65CB, 0xD0FD, + 0x65CC, 0xECBA, + 0x65CE, 0xECBB, + 0x65CF, 0xD7E5, + 0x65D2, 0xECBC, + 0x65D6, 0xECBD, + 0x65D7, 0xC6EC, + 0x65E0, 0xCEDE, + 0x65E2, 0xBCC8, + 0x65E5, 0xC8D5, + 0x65E6, 0xB5A9, + 0x65E7, 0xBEC9, + 0x65E8, 0xD6BC, + 0x65E9, 0xD4E7, + 0x65EC, 0xD1AE, + 0x65ED, 0xD0F1, + 0x65EE, 0xEAB8, + 0x65EF, 0xEAB9, + 0x65F0, 0xEABA, + 0x65F1, 0xBAB5, + 0x65F6, 0xCAB1, + 0x65F7, 0xBFF5, + 0x65FA, 0xCDFA, + 0x6600, 0xEAC0, + 0x6602, 0xB0BA, + 0x6603, 0xEABE, + 0x6606, 0xC0A5, + 0x660A, 0xEABB, + 0x660C, 0xB2FD, + 0x660E, 0xC3F7, + 0x660F, 0xBBE8, + 0x6613, 0xD2D7, + 0x6614, 0xCEF4, + 0x6615, 0xEABF, + 0x6619, 0xEABC, + 0x661D, 0xEAC3, + 0x661F, 0xD0C7, + 0x6620, 0xD3B3, + 0x6625, 0xB4BA, + 0x6627, 0xC3C1, + 0x6628, 0xD7F2, + 0x662D, 0xD5D1, + 0x662F, 0xCAC7, + 0x6631, 0xEAC5, + 0x6634, 0xEAC4, + 0x6635, 0xEAC7, + 0x6636, 0xEAC6, + 0x663C, 0xD6E7, + 0x663E, 0xCFD4, + 0x6641, 0xEACB, + 0x6643, 0xBBCE, + 0x664B, 0xBDFA, + 0x664C, 0xC9CE, + 0x664F, 0xEACC, + 0x6652, 0xC9B9, + 0x6653, 0xCFFE, + 0x6654, 0xEACA, + 0x6655, 0xD4CE, + 0x6656, 0xEACD, + 0x6657, 0xEACF, + 0x665A, 0xCDED, + 0x665F, 0xEAC9, + 0x6661, 0xEACE, + 0x6664, 0xCEEE, + 0x6666, 0xBBDE, + 0x6668, 0xB3BF, + 0x666E, 0xC6D5, + 0x666F, 0xBEB0, + 0x6670, 0xCEFA, + 0x6674, 0xC7E7, + 0x6676, 0xBEA7, + 0x6677, 0xEAD0, + 0x667A, 0xD6C7, + 0x667E, 0xC1C0, + 0x6682, 0xD4DD, + 0x6684, 0xEAD1, + 0x6687, 0xCFBE, + 0x668C, 0xEAD2, + 0x6691, 0xCAEE, + 0x6696, 0xC5AF, + 0x6697, 0xB0B5, + 0x669D, 0xEAD4, + 0x66A7, 0xEAD3, + 0x66A8, 0xF4DF, + 0x66AE, 0xC4BA, + 0x66B4, 0xB1A9, + 0x66B9, 0xE5DF, + 0x66BE, 0xEAD5, + 0x66D9, 0xCAEF, + 0x66DB, 0xEAD6, + 0x66DC, 0xEAD7, + 0x66DD, 0xC6D8, + 0x66E6, 0xEAD8, + 0x66E9, 0xEAD9, + 0x66F0, 0xD4BB, + 0x66F2, 0xC7FA, + 0x66F3, 0xD2B7, + 0x66F4, 0xB8FC, + 0x66F7, 0xEAC2, + 0x66F9, 0xB2DC, + 0x66FC, 0xC2FC, + 0x66FE, 0xD4F8, + 0x66FF, 0xCCE6, + 0x6700, 0xD7EE, + 0x6708, 0xD4C2, + 0x6709, 0xD3D0, + 0x670A, 0xEBC3, + 0x670B, 0xC5F3, + 0x670D, 0xB7FE, + 0x6710, 0xEBD4, + 0x6714, 0xCBB7, + 0x6715, 0xEBDE, + 0x6717, 0xC0CA, + 0x671B, 0xCDFB, + 0x671D, 0xB3AF, + 0x671F, 0xC6DA, + 0x6726, 0xEBFC, + 0x6728, 0xC4BE, + 0x672A, 0xCEB4, + 0x672B, 0xC4A9, + 0x672C, 0xB1BE, + 0x672D, 0xD4FD, + 0x672F, 0xCAF5, + 0x6731, 0xD6EC, + 0x6734, 0xC6D3, + 0x6735, 0xB6E4, + 0x673A, 0xBBFA, + 0x673D, 0xD0E0, + 0x6740, 0xC9B1, + 0x6742, 0xD4D3, + 0x6743, 0xC8A8, + 0x6746, 0xB8CB, + 0x6748, 0xE8BE, + 0x6749, 0xC9BC, + 0x674C, 0xE8BB, + 0x674E, 0xC0EE, + 0x674F, 0xD0D3, + 0x6750, 0xB2C4, + 0x6751, 0xB4E5, + 0x6753, 0xE8BC, + 0x6756, 0xD5C8, + 0x675C, 0xB6C5, + 0x675E, 0xE8BD, + 0x675F, 0xCAF8, + 0x6760, 0xB8DC, + 0x6761, 0xCCF5, + 0x6765, 0xC0B4, + 0x6768, 0xD1EE, + 0x6769, 0xE8BF, + 0x676A, 0xE8C2, + 0x676D, 0xBABC, + 0x676F, 0xB1AD, + 0x6770, 0xBDDC, + 0x6772, 0xEABD, + 0x6773, 0xE8C3, + 0x6775, 0xE8C6, + 0x6777, 0xE8CB, + 0x677C, 0xE8CC, + 0x677E, 0xCBC9, + 0x677F, 0xB0E5, + 0x6781, 0xBCAB, + 0x6784, 0xB9B9, + 0x6787, 0xE8C1, + 0x6789, 0xCDF7, + 0x678B, 0xE8CA, + 0x6790, 0xCEF6, + 0x6795, 0xD5ED, + 0x6797, 0xC1D6, + 0x6798, 0xE8C4, + 0x679A, 0xC3B6, + 0x679C, 0xB9FB, + 0x679D, 0xD6A6, + 0x679E, 0xE8C8, + 0x67A2, 0xCAE0, + 0x67A3, 0xD4E6, + 0x67A5, 0xE8C0, + 0x67A7, 0xE8C5, + 0x67A8, 0xE8C7, + 0x67AA, 0xC7B9, + 0x67AB, 0xB7E3, + 0x67AD, 0xE8C9, + 0x67AF, 0xBFDD, + 0x67B0, 0xE8D2, + 0x67B3, 0xE8D7, + 0x67B5, 0xE8D5, + 0x67B6, 0xBCDC, + 0x67B7, 0xBCCF, + 0x67B8, 0xE8DB, + 0x67C1, 0xE8DE, + 0x67C3, 0xE8DA, + 0x67C4, 0xB1FA, + 0x67CF, 0xB0D8, + 0x67D0, 0xC4B3, + 0x67D1, 0xB8CC, + 0x67D2, 0xC6E2, + 0x67D3, 0xC8BE, + 0x67D4, 0xC8E1, + 0x67D8, 0xE8CF, + 0x67D9, 0xE8D4, + 0x67DA, 0xE8D6, + 0x67DC, 0xB9F1, + 0x67DD, 0xE8D8, + 0x67DE, 0xD7F5, + 0x67E0, 0xC4FB, + 0x67E2, 0xE8DC, + 0x67E5, 0xB2E9, + 0x67E9, 0xE8D1, + 0x67EC, 0xBCED, + 0x67EF, 0xBFC2, + 0x67F0, 0xE8CD, + 0x67F1, 0xD6F9, + 0x67F3, 0xC1F8, + 0x67F4, 0xB2F1, + 0x67FD, 0xE8DF, + 0x67FF, 0xCAC1, + 0x6800, 0xE8D9, + 0x6805, 0xD5A4, + 0x6807, 0xB1EA, + 0x6808, 0xD5BB, + 0x6809, 0xE8CE, + 0x680A, 0xE8D0, + 0x680B, 0xB6B0, + 0x680C, 0xE8D3, + 0x680E, 0xE8DD, + 0x680F, 0xC0B8, + 0x6811, 0xCAF7, + 0x6813, 0xCBA8, + 0x6816, 0xC6DC, + 0x6817, 0xC0F5, + 0x681D, 0xE8E9, + 0x6821, 0xD0A3, + 0x6829, 0xE8F2, + 0x682A, 0xD6EA, + 0x6832, 0xE8E0, + 0x6833, 0xE8E1, + 0x6837, 0xD1F9, + 0x6838, 0xBACB, + 0x6839, 0xB8F9, + 0x683C, 0xB8F1, + 0x683D, 0xD4D4, + 0x683E, 0xE8EF, + 0x6840, 0xE8EE, + 0x6841, 0xE8EC, + 0x6842, 0xB9F0, + 0x6843, 0xCCD2, + 0x6844, 0xE8E6, + 0x6845, 0xCEA6, + 0x6846, 0xBFF2, + 0x6848, 0xB0B8, + 0x6849, 0xE8F1, + 0x684A, 0xE8F0, + 0x684C, 0xD7C0, + 0x684E, 0xE8E4, + 0x6850, 0xCDA9, + 0x6851, 0xC9A3, + 0x6853, 0xBBB8, + 0x6854, 0xBDDB, + 0x6855, 0xE8EA, + 0x6860, 0xE8E2, + 0x6861, 0xE8E3, + 0x6862, 0xE8E5, + 0x6863, 0xB5B5, + 0x6864, 0xE8E7, + 0x6865, 0xC7C5, + 0x6866, 0xE8EB, + 0x6867, 0xE8ED, + 0x6868, 0xBDB0, + 0x6869, 0xD7AE, + 0x686B, 0xE8F8, + 0x6874, 0xE8F5, + 0x6876, 0xCDB0, + 0x6877, 0xE8F6, + 0x6881, 0xC1BA, + 0x6883, 0xE8E8, + 0x6885, 0xC3B7, + 0x6886, 0xB0F0, + 0x688F, 0xE8F4, + 0x6893, 0xE8F7, + 0x6897, 0xB9A3, + 0x68A2, 0xC9D2, + 0x68A6, 0xC3CE, + 0x68A7, 0xCEE0, + 0x68A8, 0xC0E6, + 0x68AD, 0xCBF3, + 0x68AF, 0xCCDD, + 0x68B0, 0xD0B5, + 0x68B3, 0xCAE1, + 0x68B5, 0xE8F3, + 0x68C0, 0xBCEC, + 0x68C2, 0xE8F9, + 0x68C9, 0xC3DE, + 0x68CB, 0xC6E5, + 0x68CD, 0xB9F7, + 0x68D2, 0xB0F4, + 0x68D5, 0xD7D8, + 0x68D8, 0xBCAC, + 0x68DA, 0xC5EF, + 0x68E0, 0xCCC4, + 0x68E3, 0xE9A6, + 0x68EE, 0xC9AD, + 0x68F0, 0xE9A2, + 0x68F1, 0xC0E2, + 0x68F5, 0xBFC3, + 0x68F9, 0xE8FE, + 0x68FA, 0xB9D7, + 0x68FC, 0xE8FB, + 0x6901, 0xE9A4, + 0x6905, 0xD2CE, + 0x690B, 0xE9A3, + 0x690D, 0xD6B2, + 0x690E, 0xD7B5, + 0x6910, 0xE9A7, + 0x6912, 0xBDB7, + 0x691F, 0xE8FC, + 0x6920, 0xE8FD, + 0x6924, 0xE9A1, + 0x692D, 0xCDD6, + 0x6930, 0xD2AC, + 0x6934, 0xE9B2, + 0x6939, 0xE9A9, + 0x693D, 0xB4AA, + 0x693F, 0xB4BB, + 0x6942, 0xE9AB, + 0x6954, 0xD0A8, + 0x6957, 0xE9A5, + 0x695A, 0xB3FE, + 0x695D, 0xE9AC, + 0x695E, 0xC0E3, + 0x6960, 0xE9AA, + 0x6963, 0xE9B9, + 0x6966, 0xE9B8, + 0x696B, 0xE9AE, + 0x696E, 0xE8FA, + 0x6971, 0xE9A8, + 0x6977, 0xBFAC, + 0x6978, 0xE9B1, + 0x6979, 0xE9BA, + 0x697C, 0xC2A5, + 0x6980, 0xE9AF, + 0x6982, 0xB8C5, + 0x6984, 0xE9AD, + 0x6986, 0xD3DC, + 0x6987, 0xE9B4, + 0x6988, 0xE9B5, + 0x6989, 0xE9B7, + 0x698D, 0xE9C7, + 0x6994, 0xC0C6, + 0x6995, 0xE9C5, + 0x6998, 0xE9B0, + 0x699B, 0xE9BB, + 0x699C, 0xB0F1, + 0x69A7, 0xE9BC, + 0x69A8, 0xD5A5, + 0x69AB, 0xE9BE, + 0x69AD, 0xE9BF, + 0x69B1, 0xE9C1, + 0x69B4, 0xC1F1, + 0x69B7, 0xC8B6, + 0x69BB, 0xE9BD, + 0x69C1, 0xE9C2, + 0x69CA, 0xE9C3, + 0x69CC, 0xE9B3, + 0x69CE, 0xE9B6, + 0x69D0, 0xBBB1, + 0x69D4, 0xE9C0, + 0x69DB, 0xBCF7, + 0x69DF, 0xE9C4, + 0x69E0, 0xE9C6, + 0x69ED, 0xE9CA, + 0x69F2, 0xE9CE, + 0x69FD, 0xB2DB, + 0x69FF, 0xE9C8, + 0x6A0A, 0xB7AE, + 0x6A17, 0xE9CB, + 0x6A18, 0xE9CC, + 0x6A1F, 0xD5C1, + 0x6A21, 0xC4A3, + 0x6A28, 0xE9D8, + 0x6A2A, 0xBAE1, + 0x6A2F, 0xE9C9, + 0x6A31, 0xD3A3, + 0x6A35, 0xE9D4, + 0x6A3D, 0xE9D7, + 0x6A3E, 0xE9D0, + 0x6A44, 0xE9CF, + 0x6A47, 0xC7C1, + 0x6A50, 0xE9D2, + 0x6A58, 0xE9D9, + 0x6A59, 0xB3C8, + 0x6A5B, 0xE9D3, + 0x6A61, 0xCFF0, + 0x6A65, 0xE9CD, + 0x6A71, 0xB3F7, + 0x6A79, 0xE9D6, + 0x6A7C, 0xE9DA, + 0x6A80, 0xCCB4, + 0x6A84, 0xCFAD, + 0x6A8E, 0xE9D5, + 0x6A90, 0xE9DC, + 0x6A91, 0xE9DB, + 0x6A97, 0xE9DE, + 0x6AA0, 0xE9D1, + 0x6AA9, 0xE9DD, + 0x6AAB, 0xE9DF, + 0x6AAC, 0xC3CA, + 0x6B20, 0xC7B7, + 0x6B21, 0xB4CE, + 0x6B22, 0xBBB6, + 0x6B23, 0xD0C0, + 0x6B24, 0xECA3, + 0x6B27, 0xC5B7, + 0x6B32, 0xD3FB, + 0x6B37, 0xECA4, + 0x6B39, 0xECA5, + 0x6B3A, 0xC6DB, + 0x6B3E, 0xBFEE, + 0x6B43, 0xECA6, + 0x6B46, 0xECA7, + 0x6B47, 0xD0AA, + 0x6B49, 0xC7B8, + 0x6B4C, 0xB8E8, + 0x6B59, 0xECA8, + 0x6B62, 0xD6B9, + 0x6B63, 0xD5FD, + 0x6B64, 0xB4CB, + 0x6B65, 0xB2BD, + 0x6B66, 0xCEE4, + 0x6B67, 0xC6E7, + 0x6B6A, 0xCDE1, + 0x6B79, 0xB4F5, + 0x6B7B, 0xCBC0, + 0x6B7C, 0xBCDF, + 0x6B81, 0xE9E2, + 0x6B82, 0xE9E3, + 0x6B83, 0xD1EA, + 0x6B84, 0xE9E5, + 0x6B86, 0xB4F9, + 0x6B87, 0xE9E4, + 0x6B89, 0xD1B3, + 0x6B8A, 0xCAE2, + 0x6B8B, 0xB2D0, + 0x6B8D, 0xE9E8, + 0x6B92, 0xE9E6, + 0x6B93, 0xE9E7, + 0x6B96, 0xD6B3, + 0x6B9A, 0xE9E9, + 0x6B9B, 0xE9EA, + 0x6BA1, 0xE9EB, + 0x6BAA, 0xE9EC, + 0x6BB3, 0xECAF, + 0x6BB4, 0xC5B9, + 0x6BB5, 0xB6CE, + 0x6BB7, 0xD2F3, + 0x6BBF, 0xB5EE, + 0x6BC1, 0xBBD9, + 0x6BC2, 0xECB1, + 0x6BC5, 0xD2E3, + 0x6BCB, 0xCEE3, + 0x6BCD, 0xC4B8, + 0x6BCF, 0xC3BF, + 0x6BD2, 0xB6BE, + 0x6BD3, 0xD8B9, + 0x6BD4, 0xB1C8, + 0x6BD5, 0xB1CF, + 0x6BD6, 0xB1D1, + 0x6BD7, 0xC5FE, + 0x6BD9, 0xB1D0, + 0x6BDB, 0xC3AB, + 0x6BE1, 0xD5B1, + 0x6BEA, 0xEBA4, + 0x6BEB, 0xBAC1, + 0x6BEF, 0xCCBA, + 0x6BF3, 0xEBA5, + 0x6BF5, 0xEBA7, + 0x6BF9, 0xEBA8, + 0x6BFD, 0xEBA6, + 0x6C05, 0xEBA9, + 0x6C06, 0xEBAB, + 0x6C07, 0xEBAA, + 0x6C0D, 0xEBAC, + 0x6C0F, 0xCACF, + 0x6C10, 0xD8B5, + 0x6C11, 0xC3F1, + 0x6C13, 0xC3A5, + 0x6C14, 0xC6F8, + 0x6C15, 0xEBAD, + 0x6C16, 0xC4CA, + 0x6C18, 0xEBAE, + 0x6C19, 0xEBAF, + 0x6C1A, 0xEBB0, + 0x6C1B, 0xB7D5, + 0x6C1F, 0xB7FA, + 0x6C21, 0xEBB1, + 0x6C22, 0xC7E2, + 0x6C24, 0xEBB3, + 0x6C26, 0xBAA4, + 0x6C27, 0xD1F5, + 0x6C28, 0xB0B1, + 0x6C29, 0xEBB2, + 0x6C2A, 0xEBB4, + 0x6C2E, 0xB5AA, + 0x6C2F, 0xC2C8, + 0x6C30, 0xC7E8, + 0x6C32, 0xEBB5, + 0x6C34, 0xCBAE, + 0x6C35, 0xE3DF, + 0x6C38, 0xD3C0, + 0x6C3D, 0xD9DB, + 0x6C40, 0xCDA1, + 0x6C41, 0xD6AD, + 0x6C42, 0xC7F3, + 0x6C46, 0xD9E0, + 0x6C47, 0xBBE3, + 0x6C49, 0xBABA, + 0x6C4A, 0xE3E2, + 0x6C50, 0xCFAB, + 0x6C54, 0xE3E0, + 0x6C55, 0xC9C7, + 0x6C57, 0xBAB9, + 0x6C5B, 0xD1B4, + 0x6C5C, 0xE3E1, + 0x6C5D, 0xC8EA, + 0x6C5E, 0xB9AF, + 0x6C5F, 0xBDAD, + 0x6C60, 0xB3D8, + 0x6C61, 0xCEDB, + 0x6C64, 0xCCC0, + 0x6C68, 0xE3E8, + 0x6C69, 0xE3E9, + 0x6C6A, 0xCDF4, + 0x6C70, 0xCCAD, + 0x6C72, 0xBCB3, + 0x6C74, 0xE3EA, + 0x6C76, 0xE3EB, + 0x6C79, 0xD0DA, + 0x6C7D, 0xC6FB, + 0x6C7E, 0xB7DA, + 0x6C81, 0xC7DF, + 0x6C82, 0xD2CA, + 0x6C83, 0xCED6, + 0x6C85, 0xE3E4, + 0x6C86, 0xE3EC, + 0x6C88, 0xC9F2, + 0x6C89, 0xB3C1, + 0x6C8C, 0xE3E7, + 0x6C8F, 0xC6E3, + 0x6C90, 0xE3E5, + 0x6C93, 0xEDB3, + 0x6C94, 0xE3E6, + 0x6C99, 0xC9B3, + 0x6C9B, 0xC5E6, + 0x6C9F, 0xB9B5, + 0x6CA1, 0xC3BB, + 0x6CA3, 0xE3E3, + 0x6CA4, 0xC5BD, + 0x6CA5, 0xC1A4, + 0x6CA6, 0xC2D9, + 0x6CA7, 0xB2D7, + 0x6CA9, 0xE3ED, + 0x6CAA, 0xBBA6, + 0x6CAB, 0xC4AD, + 0x6CAD, 0xE3F0, + 0x6CAE, 0xBEDA, + 0x6CB1, 0xE3FB, + 0x6CB2, 0xE3F5, + 0x6CB3, 0xBAD3, + 0x6CB8, 0xB7D0, + 0x6CB9, 0xD3CD, + 0x6CBB, 0xD6CE, + 0x6CBC, 0xD5D3, + 0x6CBD, 0xB9C1, + 0x6CBE, 0xD5B4, + 0x6CBF, 0xD1D8, + 0x6CC4, 0xD0B9, + 0x6CC5, 0xC7F6, + 0x6CC9, 0xC8AA, + 0x6CCA, 0xB2B4, + 0x6CCC, 0xC3DA, + 0x6CD0, 0xE3EE, + 0x6CD3, 0xE3FC, + 0x6CD4, 0xE3EF, + 0x6CD5, 0xB7A8, + 0x6CD6, 0xE3F7, + 0x6CD7, 0xE3F4, + 0x6CDB, 0xB7BA, + 0x6CDE, 0xC5A2, + 0x6CE0, 0xE3F6, + 0x6CE1, 0xC5DD, + 0x6CE2, 0xB2A8, + 0x6CE3, 0xC6FC, + 0x6CE5, 0xC4E0, + 0x6CE8, 0xD7A2, + 0x6CEA, 0xC0E1, + 0x6CEB, 0xE3F9, + 0x6CEE, 0xE3FA, + 0x6CEF, 0xE3FD, + 0x6CF0, 0xCCA9, + 0x6CF1, 0xE3F3, + 0x6CF3, 0xD3BE, + 0x6CF5, 0xB1C3, + 0x6CF6, 0xEDB4, + 0x6CF7, 0xE3F1, + 0x6CF8, 0xE3F2, + 0x6CFA, 0xE3F8, + 0x6CFB, 0xD0BA, + 0x6CFC, 0xC6C3, + 0x6CFD, 0xD4F3, + 0x6CFE, 0xE3FE, + 0x6D01, 0xBDE0, + 0x6D04, 0xE4A7, + 0x6D07, 0xE4A6, + 0x6D0B, 0xD1F3, + 0x6D0C, 0xE4A3, + 0x6D0E, 0xE4A9, + 0x6D12, 0xC8F7, + 0x6D17, 0xCFB4, + 0x6D19, 0xE4A8, + 0x6D1A, 0xE4AE, + 0x6D1B, 0xC2E5, + 0x6D1E, 0xB6B4, + 0x6D25, 0xBDF2, + 0x6D27, 0xE4A2, + 0x6D2A, 0xBAE9, + 0x6D2B, 0xE4AA, + 0x6D2E, 0xE4AC, + 0x6D31, 0xB6FD, + 0x6D32, 0xD6DE, + 0x6D33, 0xE4B2, + 0x6D35, 0xE4AD, + 0x6D39, 0xE4A1, + 0x6D3B, 0xBBEE, + 0x6D3C, 0xCDDD, + 0x6D3D, 0xC7A2, + 0x6D3E, 0xC5C9, + 0x6D41, 0xC1F7, + 0x6D43, 0xE4A4, + 0x6D45, 0xC7B3, + 0x6D46, 0xBDAC, + 0x6D47, 0xBDBD, + 0x6D48, 0xE4A5, + 0x6D4A, 0xD7C7, + 0x6D4B, 0xB2E2, + 0x6D4D, 0xE4AB, + 0x6D4E, 0xBCC3, + 0x6D4F, 0xE4AF, + 0x6D51, 0xBBEB, + 0x6D52, 0xE4B0, + 0x6D53, 0xC5A8, + 0x6D54, 0xE4B1, + 0x6D59, 0xD5E3, + 0x6D5A, 0xBFA3, + 0x6D5C, 0xE4BA, + 0x6D5E, 0xE4B7, + 0x6D60, 0xE4BB, + 0x6D63, 0xE4BD, + 0x6D66, 0xC6D6, + 0x6D69, 0xBAC6, + 0x6D6A, 0xC0CB, + 0x6D6E, 0xB8A1, + 0x6D6F, 0xE4B4, + 0x6D74, 0xD4A1, + 0x6D77, 0xBAA3, + 0x6D78, 0xBDFE, + 0x6D7C, 0xE4BC, + 0x6D82, 0xCDBF, + 0x6D85, 0xC4F9, + 0x6D88, 0xCFFB, + 0x6D89, 0xC9E6, + 0x6D8C, 0xD3BF, + 0x6D8E, 0xCFD1, + 0x6D91, 0xE4B3, + 0x6D93, 0xE4B8, + 0x6D94, 0xE4B9, + 0x6D95, 0xCCE9, + 0x6D9B, 0xCCCE, + 0x6D9D, 0xC0D4, + 0x6D9E, 0xE4B5, + 0x6D9F, 0xC1B0, + 0x6DA0, 0xE4B6, + 0x6DA1, 0xCED0, + 0x6DA3, 0xBBC1, + 0x6DA4, 0xB5D3, + 0x6DA6, 0xC8F3, + 0x6DA7, 0xBDA7, + 0x6DA8, 0xD5C7, + 0x6DA9, 0xC9AC, + 0x6DAA, 0xB8A2, + 0x6DAB, 0xE4CA, + 0x6DAE, 0xE4CC, + 0x6DAF, 0xD1C4, + 0x6DB2, 0xD2BA, + 0x6DB5, 0xBAAD, + 0x6DB8, 0xBAD4, + 0x6DBF, 0xE4C3, + 0x6DC0, 0xB5ED, + 0x6DC4, 0xD7CD, + 0x6DC5, 0xE4C0, + 0x6DC6, 0xCFFD, + 0x6DC7, 0xE4BF, + 0x6DCB, 0xC1DC, + 0x6DCC, 0xCCCA, + 0x6DD1, 0xCAE7, + 0x6DD6, 0xC4D7, + 0x6DD8, 0xCCD4, + 0x6DD9, 0xE4C8, + 0x6DDD, 0xE4C7, + 0x6DDE, 0xE4C1, + 0x6DE0, 0xE4C4, + 0x6DE1, 0xB5AD, + 0x6DE4, 0xD3D9, + 0x6DE6, 0xE4C6, + 0x6DEB, 0xD2F9, + 0x6DEC, 0xB4E3, + 0x6DEE, 0xBBB4, + 0x6DF1, 0xC9EE, + 0x6DF3, 0xB4BE, + 0x6DF7, 0xBBEC, + 0x6DF9, 0xD1CD, + 0x6DFB, 0xCCED, + 0x6DFC, 0xEDB5, + 0x6E05, 0xC7E5, + 0x6E0A, 0xD4A8, + 0x6E0C, 0xE4CB, + 0x6E0D, 0xD7D5, + 0x6E0E, 0xE4C2, + 0x6E10, 0xBDA5, + 0x6E11, 0xE4C5, + 0x6E14, 0xD3E6, + 0x6E16, 0xE4C9, + 0x6E17, 0xC9F8, + 0x6E1A, 0xE4BE, + 0x6E1D, 0xD3E5, + 0x6E20, 0xC7FE, + 0x6E21, 0xB6C9, + 0x6E23, 0xD4FC, + 0x6E24, 0xB2B3, + 0x6E25, 0xE4D7, + 0x6E29, 0xCEC2, + 0x6E2B, 0xE4CD, + 0x6E2D, 0xCEBC, + 0x6E2F, 0xB8DB, + 0x6E32, 0xE4D6, + 0x6E34, 0xBFCA, + 0x6E38, 0xD3CE, + 0x6E3A, 0xC3EC, + 0x6E43, 0xC5C8, + 0x6E44, 0xE4D8, + 0x6E4D, 0xCDC4, + 0x6E4E, 0xE4CF, + 0x6E53, 0xE4D4, + 0x6E54, 0xE4D5, + 0x6E56, 0xBAFE, + 0x6E58, 0xCFE6, + 0x6E5B, 0xD5BF, + 0x6E5F, 0xE4D2, + 0x6E6B, 0xE4D0, + 0x6E6E, 0xE4CE, + 0x6E7E, 0xCDE5, + 0x6E7F, 0xCAAA, + 0x6E83, 0xC0A3, + 0x6E85, 0xBDA6, + 0x6E86, 0xE4D3, + 0x6E89, 0xB8C8, + 0x6E8F, 0xE4E7, + 0x6E90, 0xD4B4, + 0x6E98, 0xE4DB, + 0x6E9C, 0xC1EF, + 0x6E9F, 0xE4E9, + 0x6EA2, 0xD2E7, + 0x6EA5, 0xE4DF, + 0x6EA7, 0xE4E0, + 0x6EAA, 0xCFAA, + 0x6EAF, 0xCBDD, + 0x6EB1, 0xE4DA, + 0x6EB2, 0xE4D1, + 0x6EB4, 0xE4E5, + 0x6EB6, 0xC8DC, + 0x6EB7, 0xE4E3, + 0x6EBA, 0xC4E7, + 0x6EBB, 0xE4E2, + 0x6EBD, 0xE4E1, + 0x6EC1, 0xB3FC, + 0x6EC2, 0xE4E8, + 0x6EC7, 0xB5E1, + 0x6ECB, 0xD7CC, + 0x6ECF, 0xE4E6, + 0x6ED1, 0xBBAC, + 0x6ED3, 0xD7D2, + 0x6ED4, 0xCCCF, + 0x6ED5, 0xEBF8, + 0x6ED7, 0xE4E4, + 0x6EDA, 0xB9F6, + 0x6EDE, 0xD6CD, + 0x6EDF, 0xE4D9, + 0x6EE0, 0xE4DC, + 0x6EE1, 0xC2FA, + 0x6EE2, 0xE4DE, + 0x6EE4, 0xC2CB, + 0x6EE5, 0xC0C4, + 0x6EE6, 0xC2D0, + 0x6EE8, 0xB1F5, + 0x6EE9, 0xCCB2, + 0x6EF4, 0xB5CE, + 0x6EF9, 0xE4EF, + 0x6F02, 0xC6AF, + 0x6F06, 0xC6E1, + 0x6F09, 0xE4F5, + 0x6F0F, 0xC2A9, + 0x6F13, 0xC0EC, + 0x6F14, 0xD1DD, + 0x6F15, 0xE4EE, + 0x6F20, 0xC4AE, + 0x6F24, 0xE4ED, + 0x6F29, 0xE4F6, + 0x6F2A, 0xE4F4, + 0x6F2B, 0xC2FE, + 0x6F2D, 0xE4DD, + 0x6F2F, 0xE4F0, + 0x6F31, 0xCAFE, + 0x6F33, 0xD5C4, + 0x6F36, 0xE4F1, + 0x6F3E, 0xD1FA, + 0x6F46, 0xE4EB, + 0x6F47, 0xE4EC, + 0x6F4B, 0xE4F2, + 0x6F4D, 0xCEAB, + 0x6F58, 0xC5CB, + 0x6F5C, 0xC7B1, + 0x6F5E, 0xC2BA, + 0x6F62, 0xE4EA, + 0x6F66, 0xC1CA, + 0x6F6D, 0xCCB6, + 0x6F6E, 0xB3B1, + 0x6F72, 0xE4FB, + 0x6F74, 0xE4F3, + 0x6F78, 0xE4FA, + 0x6F7A, 0xE4FD, + 0x6F7C, 0xE4FC, + 0x6F84, 0xB3CE, + 0x6F88, 0xB3BA, + 0x6F89, 0xE4F7, + 0x6F8C, 0xE4F9, + 0x6F8D, 0xE4F8, + 0x6F8E, 0xC5EC, + 0x6F9C, 0xC0BD, + 0x6FA1, 0xD4E8, + 0x6FA7, 0xE5A2, + 0x6FB3, 0xB0C4, + 0x6FB6, 0xE5A4, + 0x6FB9, 0xE5A3, + 0x6FC0, 0xBCA4, + 0x6FC2, 0xE5A5, + 0x6FC9, 0xE5A1, + 0x6FD1, 0xE4FE, + 0x6FD2, 0xB1F4, + 0x6FDE, 0xE5A8, + 0x6FE0, 0xE5A9, + 0x6FE1, 0xE5A6, + 0x6FEE, 0xE5A7, + 0x6FEF, 0xE5AA, + 0x7011, 0xC6D9, + 0x701A, 0xE5AB, + 0x701B, 0xE5AD, + 0x7023, 0xE5AC, + 0x7035, 0xE5AF, + 0x7039, 0xE5AE, + 0x704C, 0xB9E0, + 0x704F, 0xE5B0, + 0x705E, 0xE5B1, + 0x706B, 0xBBF0, + 0x706C, 0xECE1, + 0x706D, 0xC3F0, + 0x706F, 0xB5C6, + 0x7070, 0xBBD2, + 0x7075, 0xC1E9, + 0x7076, 0xD4EE, + 0x7078, 0xBEC4, + 0x707C, 0xD7C6, + 0x707E, 0xD4D6, + 0x707F, 0xB2D3, + 0x7080, 0xECBE, + 0x7085, 0xEAC1, + 0x7089, 0xC2AF, + 0x708A, 0xB4B6, + 0x708E, 0xD1D7, + 0x7092, 0xB3B4, + 0x7094, 0xC8B2, + 0x7095, 0xBFBB, + 0x7096, 0xECC0, + 0x7099, 0xD6CB, + 0x709C, 0xECBF, + 0x709D, 0xECC1, + 0x70AB, 0xECC5, + 0x70AC, 0xBEE6, + 0x70AD, 0xCCBF, + 0x70AE, 0xC5DA, + 0x70AF, 0xBEBC, + 0x70B1, 0xECC6, + 0x70B3, 0xB1FE, + 0x70B7, 0xECC4, + 0x70B8, 0xD5A8, + 0x70B9, 0xB5E3, + 0x70BB, 0xECC2, + 0x70BC, 0xC1B6, + 0x70BD, 0xB3E3, + 0x70C0, 0xECC3, + 0x70C1, 0xCBB8, + 0x70C2, 0xC0C3, + 0x70C3, 0xCCFE, + 0x70C8, 0xC1D2, + 0x70CA, 0xECC8, + 0x70D8, 0xBAE6, + 0x70D9, 0xC0D3, + 0x70DB, 0xD6F2, + 0x70DF, 0xD1CC, + 0x70E4, 0xBFBE, + 0x70E6, 0xB7B3, + 0x70E7, 0xC9D5, + 0x70E8, 0xECC7, + 0x70E9, 0xBBE2, + 0x70EB, 0xCCCC, + 0x70EC, 0xBDFD, + 0x70ED, 0xC8C8, + 0x70EF, 0xCFA9, + 0x70F7, 0xCDE9, + 0x70F9, 0xC5EB, + 0x70FD, 0xB7E9, + 0x7109, 0xD1C9, + 0x710A, 0xBAB8, + 0x7110, 0xECC9, + 0x7113, 0xECCA, + 0x7115, 0xBBC0, + 0x7116, 0xECCB, + 0x7118, 0xECE2, + 0x7119, 0xB1BA, + 0x711A, 0xB7D9, + 0x7126, 0xBDB9, + 0x712F, 0xECCC, + 0x7130, 0xD1E6, + 0x7131, 0xECCD, + 0x7136, 0xC8BB, + 0x7145, 0xECD1, + 0x714A, 0xECD3, + 0x714C, 0xBBCD, + 0x714E, 0xBCE5, + 0x715C, 0xECCF, + 0x715E, 0xC9B7, + 0x7164, 0xC3BA, + 0x7166, 0xECE3, + 0x7167, 0xD5D5, + 0x7168, 0xECD0, + 0x716E, 0xD6F3, + 0x7172, 0xECD2, + 0x7173, 0xECCE, + 0x7178, 0xECD4, + 0x717A, 0xECD5, + 0x717D, 0xC9BF, + 0x7184, 0xCFA8, + 0x718A, 0xD0DC, + 0x718F, 0xD1AC, + 0x7194, 0xC8DB, + 0x7198, 0xECD6, + 0x7199, 0xCEF5, + 0x719F, 0xCAEC, + 0x71A0, 0xECDA, + 0x71A8, 0xECD9, + 0x71AC, 0xB0BE, + 0x71B3, 0xECD7, + 0x71B5, 0xECD8, + 0x71B9, 0xECE4, + 0x71C3, 0xC8BC, + 0x71CE, 0xC1C7, + 0x71D4, 0xECDC, + 0x71D5, 0xD1E0, + 0x71E0, 0xECDB, + 0x71E5, 0xD4EF, + 0x71E7, 0xECDD, + 0x71EE, 0xDBC6, + 0x71F9, 0xECDE, + 0x7206, 0xB1AC, + 0x721D, 0xECDF, + 0x7228, 0xECE0, + 0x722A, 0xD7A6, + 0x722C, 0xC5C0, + 0x7230, 0xEBBC, + 0x7231, 0xB0AE, + 0x7235, 0xBEF4, + 0x7236, 0xB8B8, + 0x7237, 0xD2AF, + 0x7238, 0xB0D6, + 0x7239, 0xB5F9, + 0x723B, 0xD8B3, + 0x723D, 0xCBAC, + 0x723F, 0xE3DD, + 0x7247, 0xC6AC, + 0x7248, 0xB0E6, + 0x724C, 0xC5C6, + 0x724D, 0xEBB9, + 0x7252, 0xEBBA, + 0x7256, 0xEBBB, + 0x7259, 0xD1C0, + 0x725B, 0xC5A3, + 0x725D, 0xEAF2, + 0x725F, 0xC4B2, + 0x7261, 0xC4B5, + 0x7262, 0xC0CE, + 0x7266, 0xEAF3, + 0x7267, 0xC4C1, + 0x7269, 0xCEEF, + 0x726E, 0xEAF0, + 0x726F, 0xEAF4, + 0x7272, 0xC9FC, + 0x7275, 0xC7A3, + 0x7279, 0xCCD8, + 0x727A, 0xCEFE, + 0x727E, 0xEAF5, + 0x727F, 0xEAF6, + 0x7280, 0xCFAC, + 0x7281, 0xC0E7, + 0x7284, 0xEAF7, + 0x728A, 0xB6BF, + 0x728B, 0xEAF8, + 0x728D, 0xEAF9, + 0x728F, 0xEAFA, + 0x7292, 0xEAFB, + 0x729F, 0xEAF1, + 0x72AC, 0xC8AE, + 0x72AD, 0xE1EB, + 0x72AF, 0xB7B8, + 0x72B0, 0xE1EC, + 0x72B4, 0xE1ED, + 0x72B6, 0xD7B4, + 0x72B7, 0xE1EE, + 0x72B8, 0xE1EF, + 0x72B9, 0xD3CC, + 0x72C1, 0xE1F1, + 0x72C2, 0xBFF1, + 0x72C3, 0xE1F0, + 0x72C4, 0xB5D2, + 0x72C8, 0xB1B7, + 0x72CD, 0xE1F3, + 0x72CE, 0xE1F2, + 0x72D0, 0xBAFC, + 0x72D2, 0xE1F4, + 0x72D7, 0xB9B7, + 0x72D9, 0xBED1, + 0x72DE, 0xC4FC, + 0x72E0, 0xBADD, + 0x72E1, 0xBDC6, + 0x72E8, 0xE1F5, + 0x72E9, 0xE1F7, + 0x72EC, 0xB6C0, + 0x72ED, 0xCFC1, + 0x72EE, 0xCAA8, + 0x72EF, 0xE1F6, + 0x72F0, 0xD5F8, + 0x72F1, 0xD3FC, + 0x72F2, 0xE1F8, + 0x72F3, 0xE1FC, + 0x72F4, 0xE1F9, + 0x72F7, 0xE1FA, + 0x72F8, 0xC0EA, + 0x72FA, 0xE1FE, + 0x72FB, 0xE2A1, + 0x72FC, 0xC0C7, + 0x7301, 0xE1FB, + 0x7303, 0xE1FD, + 0x730A, 0xE2A5, + 0x730E, 0xC1D4, + 0x7313, 0xE2A3, + 0x7315, 0xE2A8, + 0x7316, 0xB2FE, + 0x7317, 0xE2A2, + 0x731B, 0xC3CD, + 0x731C, 0xB2C2, + 0x731D, 0xE2A7, + 0x731E, 0xE2A6, + 0x7321, 0xE2A4, + 0x7322, 0xE2A9, + 0x7325, 0xE2AB, + 0x7329, 0xD0C9, + 0x732A, 0xD6ED, + 0x732B, 0xC3A8, + 0x732C, 0xE2AC, + 0x732E, 0xCFD7, + 0x7331, 0xE2AE, + 0x7334, 0xBAEF, + 0x7337, 0xE9E0, + 0x7338, 0xE2AD, + 0x7339, 0xE2AA, + 0x733E, 0xBBAB, + 0x733F, 0xD4B3, + 0x734D, 0xE2B0, + 0x7350, 0xE2AF, + 0x7352, 0xE9E1, + 0x7357, 0xE2B1, + 0x7360, 0xE2B2, + 0x736C, 0xE2B3, + 0x736D, 0xCCA1, + 0x736F, 0xE2B4, + 0x737E, 0xE2B5, + 0x7384, 0xD0FE, + 0x7387, 0xC2CA, + 0x7389, 0xD3F1, + 0x738B, 0xCDF5, + 0x738E, 0xE7E0, + 0x7391, 0xE7E1, + 0x7396, 0xBEC1, + 0x739B, 0xC2EA, + 0x739F, 0xE7E4, + 0x73A2, 0xE7E3, + 0x73A9, 0xCDE6, + 0x73AB, 0xC3B5, + 0x73AE, 0xE7E2, + 0x73AF, 0xBBB7, + 0x73B0, 0xCFD6, + 0x73B2, 0xC1E1, + 0x73B3, 0xE7E9, + 0x73B7, 0xE7E8, + 0x73BA, 0xE7F4, + 0x73BB, 0xB2A3, + 0x73C0, 0xE7EA, + 0x73C2, 0xE7E6, + 0x73C8, 0xE7EC, + 0x73C9, 0xE7EB, + 0x73CA, 0xC9BA, + 0x73CD, 0xD5E4, + 0x73CF, 0xE7E5, + 0x73D0, 0xB7A9, + 0x73D1, 0xE7E7, + 0x73D9, 0xE7EE, + 0x73DE, 0xE7F3, + 0x73E0, 0xD6E9, + 0x73E5, 0xE7ED, + 0x73E7, 0xE7F2, + 0x73E9, 0xE7F1, + 0x73ED, 0xB0E0, + 0x73F2, 0xE7F5, + 0x7403, 0xC7F2, + 0x7405, 0xC0C5, + 0x7406, 0xC0ED, + 0x7409, 0xC1F0, + 0x740A, 0xE7F0, + 0x740F, 0xE7F6, + 0x7410, 0xCBF6, + 0x741A, 0xE8A2, + 0x741B, 0xE8A1, + 0x7422, 0xD7C1, + 0x7425, 0xE7FA, + 0x7426, 0xE7F9, + 0x7428, 0xE7FB, + 0x742A, 0xE7F7, + 0x742C, 0xE7FE, + 0x742E, 0xE7FD, + 0x7430, 0xE7FC, + 0x7433, 0xC1D5, + 0x7434, 0xC7D9, + 0x7435, 0xC5FD, + 0x7436, 0xC5C3, + 0x743C, 0xC7ED, + 0x7441, 0xE8A3, + 0x7455, 0xE8A6, + 0x7457, 0xE8A5, + 0x7459, 0xE8A7, + 0x745A, 0xBAF7, + 0x745B, 0xE7F8, + 0x745C, 0xE8A4, + 0x745E, 0xC8F0, + 0x745F, 0xC9AA, + 0x746D, 0xE8A9, + 0x7470, 0xB9E5, + 0x7476, 0xD1FE, + 0x7477, 0xE8A8, + 0x747E, 0xE8AA, + 0x7480, 0xE8AD, + 0x7481, 0xE8AE, + 0x7483, 0xC1A7, + 0x7487, 0xE8AF, + 0x748B, 0xE8B0, + 0x748E, 0xE8AC, + 0x7490, 0xE8B4, + 0x749C, 0xE8AB, + 0x749E, 0xE8B1, + 0x74A7, 0xE8B5, + 0x74A8, 0xE8B2, + 0x74A9, 0xE8B3, + 0x74BA, 0xE8B7, + 0x74D2, 0xE8B6, + 0x74DC, 0xB9CF, + 0x74DE, 0xF0AC, + 0x74E0, 0xF0AD, + 0x74E2, 0xC6B0, + 0x74E3, 0xB0EA, + 0x74E4, 0xC8BF, + 0x74E6, 0xCDDF, + 0x74EE, 0xCECD, + 0x74EF, 0xEAB1, + 0x74F4, 0xEAB2, + 0x74F6, 0xC6BF, + 0x74F7, 0xB4C9, + 0x74FF, 0xEAB3, + 0x7504, 0xD5E7, + 0x750D, 0xDDF9, + 0x750F, 0xEAB4, + 0x7511, 0xEAB5, + 0x7513, 0xEAB6, + 0x7518, 0xB8CA, + 0x7519, 0xDFB0, + 0x751A, 0xC9F5, + 0x751C, 0xCCF0, + 0x751F, 0xC9FA, + 0x7525, 0xC9FB, + 0x7528, 0xD3C3, + 0x7529, 0xCBA6, + 0x752B, 0xB8A6, + 0x752C, 0xF0AE, + 0x752D, 0xB1C2, + 0x752F, 0xE5B8, + 0x7530, 0xCCEF, + 0x7531, 0xD3C9, + 0x7532, 0xBCD7, + 0x7533, 0xC9EA, + 0x7535, 0xB5E7, + 0x7537, 0xC4D0, + 0x7538, 0xB5E9, + 0x753A, 0xEEAE, + 0x753B, 0xBBAD, + 0x753E, 0xE7DE, + 0x7540, 0xEEAF, + 0x7545, 0xB3A9, + 0x7548, 0xEEB2, + 0x754B, 0xEEB1, + 0x754C, 0xBDE7, + 0x754E, 0xEEB0, + 0x754F, 0xCEB7, + 0x7554, 0xC5CF, + 0x7559, 0xC1F4, + 0x755A, 0xDBCE, + 0x755B, 0xEEB3, + 0x755C, 0xD0F3, + 0x7565, 0xC2D4, + 0x7566, 0xC6E8, + 0x756A, 0xB7AC, + 0x7572, 0xEEB4, + 0x7574, 0xB3EB, + 0x7578, 0xBBFB, + 0x7579, 0xEEB5, + 0x757F, 0xE7DC, + 0x7583, 0xEEB6, + 0x7586, 0xBDAE, + 0x758B, 0xF1E2, + 0x758F, 0xCAE8, + 0x7591, 0xD2C9, + 0x7592, 0xF0DA, + 0x7594, 0xF0DB, + 0x7596, 0xF0DC, + 0x7597, 0xC1C6, + 0x7599, 0xB8ED, + 0x759A, 0xBECE, + 0x759D, 0xF0DE, + 0x759F, 0xC5B1, + 0x75A0, 0xF0DD, + 0x75A1, 0xD1F1, + 0x75A3, 0xF0E0, + 0x75A4, 0xB0CC, + 0x75A5, 0xBDEA, + 0x75AB, 0xD2DF, + 0x75AC, 0xF0DF, + 0x75AE, 0xB4AF, + 0x75AF, 0xB7E8, + 0x75B0, 0xF0E6, + 0x75B1, 0xF0E5, + 0x75B2, 0xC6A3, + 0x75B3, 0xF0E1, + 0x75B4, 0xF0E2, + 0x75B5, 0xB4C3, + 0x75B8, 0xF0E3, + 0x75B9, 0xD5EE, + 0x75BC, 0xCCDB, + 0x75BD, 0xBED2, + 0x75BE, 0xBCB2, + 0x75C2, 0xF0E8, + 0x75C3, 0xF0E7, + 0x75C4, 0xF0E4, + 0x75C5, 0xB2A1, + 0x75C7, 0xD6A2, + 0x75C8, 0xD3B8, + 0x75C9, 0xBEB7, + 0x75CA, 0xC8AC, + 0x75CD, 0xF0EA, + 0x75D2, 0xD1F7, + 0x75D4, 0xD6CC, + 0x75D5, 0xBADB, + 0x75D6, 0xF0E9, + 0x75D8, 0xB6BB, + 0x75DB, 0xCDB4, + 0x75DE, 0xC6A6, + 0x75E2, 0xC1A1, + 0x75E3, 0xF0EB, + 0x75E4, 0xF0EE, + 0x75E6, 0xF0ED, + 0x75E7, 0xF0F0, + 0x75E8, 0xF0EC, + 0x75EA, 0xBBBE, + 0x75EB, 0xF0EF, + 0x75F0, 0xCCB5, + 0x75F1, 0xF0F2, + 0x75F4, 0xB3D5, + 0x75F9, 0xB1D4, + 0x75FC, 0xF0F3, + 0x75FF, 0xF0F4, + 0x7600, 0xF0F6, + 0x7601, 0xB4E1, + 0x7603, 0xF0F1, + 0x7605, 0xF0F7, + 0x760A, 0xF0FA, + 0x760C, 0xF0F8, + 0x7610, 0xF0F5, + 0x7615, 0xF0FD, + 0x7617, 0xF0F9, + 0x7618, 0xF0FC, + 0x7619, 0xF0FE, + 0x761B, 0xF1A1, + 0x761F, 0xCEC1, + 0x7620, 0xF1A4, + 0x7622, 0xF1A3, + 0x7624, 0xC1F6, + 0x7625, 0xF0FB, + 0x7626, 0xCADD, + 0x7629, 0xB4F1, + 0x762A, 0xB1F1, + 0x762B, 0xCCB1, + 0x762D, 0xF1A6, + 0x7630, 0xF1A7, + 0x7633, 0xF1AC, + 0x7634, 0xD5CE, + 0x7635, 0xF1A9, + 0x7638, 0xC8B3, + 0x763C, 0xF1A2, + 0x763E, 0xF1AB, + 0x763F, 0xF1A8, + 0x7640, 0xF1A5, + 0x7643, 0xF1AA, + 0x764C, 0xB0A9, + 0x764D, 0xF1AD, + 0x7654, 0xF1AF, + 0x7656, 0xF1B1, + 0x765C, 0xF1B0, + 0x765E, 0xF1AE, + 0x7663, 0xD1A2, + 0x766B, 0xF1B2, + 0x766F, 0xF1B3, + 0x7678, 0xB9EF, + 0x767B, 0xB5C7, + 0x767D, 0xB0D7, + 0x767E, 0xB0D9, + 0x7682, 0xD4ED, + 0x7684, 0xB5C4, + 0x7686, 0xBDD4, + 0x7687, 0xBBCA, + 0x7688, 0xF0A7, + 0x768B, 0xB8DE, + 0x768E, 0xF0A8, + 0x7691, 0xB0A8, + 0x7693, 0xF0A9, + 0x7696, 0xCDEE, + 0x7699, 0xF0AA, + 0x76A4, 0xF0AB, + 0x76AE, 0xC6A4, + 0x76B1, 0xD6E5, + 0x76B2, 0xF1E4, + 0x76B4, 0xF1E5, + 0x76BF, 0xC3F3, + 0x76C2, 0xD3DB, + 0x76C5, 0xD6D1, + 0x76C6, 0xC5E8, + 0x76C8, 0xD3AF, + 0x76CA, 0xD2E6, + 0x76CD, 0xEEC1, + 0x76CE, 0xB0BB, + 0x76CF, 0xD5B5, + 0x76D0, 0xD1CE, + 0x76D1, 0xBCE0, + 0x76D2, 0xBAD0, + 0x76D4, 0xBFF8, + 0x76D6, 0xB8C7, + 0x76D7, 0xB5C1, + 0x76D8, 0xC5CC, + 0x76DB, 0xCAA2, + 0x76DF, 0xC3CB, + 0x76E5, 0xEEC2, + 0x76EE, 0xC4BF, + 0x76EF, 0xB6A2, + 0x76F1, 0xEDEC, + 0x76F2, 0xC3A4, + 0x76F4, 0xD6B1, + 0x76F8, 0xCFE0, + 0x76F9, 0xEDEF, + 0x76FC, 0xC5CE, + 0x76FE, 0xB6DC, + 0x7701, 0xCAA1, + 0x7704, 0xEDED, + 0x7707, 0xEDF0, + 0x7708, 0xEDF1, + 0x7709, 0xC3BC, + 0x770B, 0xBFB4, + 0x770D, 0xEDEE, + 0x7719, 0xEDF4, + 0x771A, 0xEDF2, + 0x771F, 0xD5E6, + 0x7720, 0xC3DF, + 0x7722, 0xEDF3, + 0x7726, 0xEDF6, + 0x7728, 0xD5A3, + 0x7729, 0xD1A3, + 0x772D, 0xEDF5, + 0x772F, 0xC3D0, + 0x7735, 0xEDF7, + 0x7736, 0xBFF4, + 0x7737, 0xBEEC, + 0x7738, 0xEDF8, + 0x773A, 0xCCF7, + 0x773C, 0xD1DB, + 0x7740, 0xD7C5, + 0x7741, 0xD5F6, + 0x7743, 0xEDFC, + 0x7747, 0xEDFB, + 0x7750, 0xEDF9, + 0x7751, 0xEDFA, + 0x775A, 0xEDFD, + 0x775B, 0xBEA6, + 0x7761, 0xCBAF, + 0x7762, 0xEEA1, + 0x7763, 0xB6BD, + 0x7765, 0xEEA2, + 0x7766, 0xC4C0, + 0x7768, 0xEDFE, + 0x776B, 0xBDDE, + 0x776C, 0xB2C7, + 0x7779, 0xB6C3, + 0x777D, 0xEEA5, + 0x777E, 0xD8BA, + 0x777F, 0xEEA3, + 0x7780, 0xEEA6, + 0x7784, 0xC3E9, + 0x7785, 0xB3F2, + 0x778C, 0xEEA7, + 0x778D, 0xEEA4, + 0x778E, 0xCFB9, + 0x7791, 0xEEA8, + 0x7792, 0xC2F7, + 0x779F, 0xEEA9, + 0x77A0, 0xEEAA, + 0x77A2, 0xDEAB, + 0x77A5, 0xC6B3, + 0x77A7, 0xC7C6, + 0x77A9, 0xD6F5, + 0x77AA, 0xB5C9, + 0x77AC, 0xCBB2, + 0x77B0, 0xEEAB, + 0x77B3, 0xCDAB, + 0x77B5, 0xEEAC, + 0x77BB, 0xD5B0, + 0x77BD, 0xEEAD, + 0x77BF, 0xF6C4, + 0x77CD, 0xDBC7, + 0x77D7, 0xB4A3, + 0x77DB, 0xC3AC, + 0x77DC, 0xF1E6, + 0x77E2, 0xCAB8, + 0x77E3, 0xD2D3, + 0x77E5, 0xD6AA, + 0x77E7, 0xEFF2, + 0x77E9, 0xBED8, + 0x77EB, 0xBDC3, + 0x77EC, 0xEFF3, + 0x77ED, 0xB6CC, + 0x77EE, 0xB0AB, + 0x77F3, 0xCAAF, + 0x77F6, 0xEDB6, + 0x77F8, 0xEDB7, + 0x77FD, 0xCEF9, + 0x77FE, 0xB7AF, + 0x77FF, 0xBFF3, + 0x7800, 0xEDB8, + 0x7801, 0xC2EB, + 0x7802, 0xC9B0, + 0x7809, 0xEDB9, + 0x780C, 0xC6F6, + 0x780D, 0xBFB3, + 0x7811, 0xEDBC, + 0x7812, 0xC5F8, + 0x7814, 0xD1D0, + 0x7816, 0xD7A9, + 0x7817, 0xEDBA, + 0x7818, 0xEDBB, + 0x781A, 0xD1E2, + 0x781C, 0xEDBF, + 0x781D, 0xEDC0, + 0x781F, 0xEDC4, + 0x7823, 0xEDC8, + 0x7825, 0xEDC6, + 0x7826, 0xEDCE, + 0x7827, 0xD5E8, + 0x7829, 0xEDC9, + 0x782C, 0xEDC7, + 0x782D, 0xEDBE, + 0x7830, 0xC5E9, + 0x7834, 0xC6C6, + 0x7837, 0xC9E9, + 0x7838, 0xD4D2, + 0x7839, 0xEDC1, + 0x783A, 0xEDC2, + 0x783B, 0xEDC3, + 0x783C, 0xEDC5, + 0x783E, 0xC0F9, + 0x7840, 0xB4A1, + 0x7845, 0xB9E8, + 0x7847, 0xEDD0, + 0x784C, 0xEDD1, + 0x784E, 0xEDCA, + 0x7850, 0xEDCF, + 0x7852, 0xCEF8, + 0x7855, 0xCBB6, + 0x7856, 0xEDCC, + 0x7857, 0xEDCD, + 0x785D, 0xCFF5, + 0x786A, 0xEDD2, + 0x786B, 0xC1F2, + 0x786C, 0xD3B2, + 0x786D, 0xEDCB, + 0x786E, 0xC8B7, + 0x7877, 0xBCEF, + 0x787C, 0xC5F0, + 0x7887, 0xEDD6, + 0x7889, 0xB5EF, + 0x788C, 0xC2B5, + 0x788D, 0xB0AD, + 0x788E, 0xCBE9, + 0x7891, 0xB1AE, + 0x7893, 0xEDD4, + 0x7897, 0xCDEB, + 0x7898, 0xB5E2, + 0x789A, 0xEDD5, + 0x789B, 0xEDD3, + 0x789C, 0xEDD7, + 0x789F, 0xB5FA, + 0x78A1, 0xEDD8, + 0x78A3, 0xEDD9, + 0x78A5, 0xEDDC, + 0x78A7, 0xB1CC, + 0x78B0, 0xC5F6, + 0x78B1, 0xBCEE, + 0x78B2, 0xEDDA, + 0x78B3, 0xCCBC, + 0x78B4, 0xB2EA, + 0x78B9, 0xEDDB, + 0x78BE, 0xC4EB, + 0x78C1, 0xB4C5, + 0x78C5, 0xB0F5, + 0x78C9, 0xEDDF, + 0x78CA, 0xC0DA, + 0x78CB, 0xB4E8, + 0x78D0, 0xC5CD, + 0x78D4, 0xEDDD, + 0x78D5, 0xBFC4, + 0x78D9, 0xEDDE, + 0x78E8, 0xC4A5, + 0x78EC, 0xEDE0, + 0x78F2, 0xEDE1, + 0x78F4, 0xEDE3, + 0x78F7, 0xC1D7, + 0x78FA, 0xBBC7, + 0x7901, 0xBDB8, + 0x7905, 0xEDE2, + 0x7913, 0xEDE4, + 0x791E, 0xEDE6, + 0x7924, 0xEDE5, + 0x7934, 0xEDE7, + 0x793A, 0xCABE, + 0x793B, 0xECEA, + 0x793C, 0xC0F1, + 0x793E, 0xC9E7, + 0x7940, 0xECEB, + 0x7941, 0xC6EE, + 0x7946, 0xECEC, + 0x7948, 0xC6ED, + 0x7949, 0xECED, + 0x7953, 0xECF0, + 0x7956, 0xD7E6, + 0x7957, 0xECF3, + 0x795A, 0xECF1, + 0x795B, 0xECEE, + 0x795C, 0xECEF, + 0x795D, 0xD7A3, + 0x795E, 0xC9F1, + 0x795F, 0xCBEE, + 0x7960, 0xECF4, + 0x7962, 0xECF2, + 0x7965, 0xCFE9, + 0x7967, 0xECF6, + 0x7968, 0xC6B1, + 0x796D, 0xBCC0, + 0x796F, 0xECF5, + 0x7977, 0xB5BB, + 0x7978, 0xBBF6, + 0x797A, 0xECF7, + 0x7980, 0xD9F7, + 0x7981, 0xBDFB, + 0x7984, 0xC2BB, + 0x7985, 0xECF8, + 0x798A, 0xECF9, + 0x798F, 0xB8A3, + 0x799A, 0xECFA, + 0x79A7, 0xECFB, + 0x79B3, 0xECFC, + 0x79B9, 0xD3ED, + 0x79BA, 0xD8AE, + 0x79BB, 0xC0EB, + 0x79BD, 0xC7DD, + 0x79BE, 0xBACC, + 0x79C0, 0xD0E3, + 0x79C1, 0xCBBD, + 0x79C3, 0xCDBA, + 0x79C6, 0xB8D1, + 0x79C9, 0xB1FC, + 0x79CB, 0xC7EF, + 0x79CD, 0xD6D6, + 0x79D1, 0xBFC6, + 0x79D2, 0xC3EB, + 0x79D5, 0xEFF5, + 0x79D8, 0xC3D8, + 0x79DF, 0xD7E2, + 0x79E3, 0xEFF7, + 0x79E4, 0xB3D3, + 0x79E6, 0xC7D8, + 0x79E7, 0xD1ED, + 0x79E9, 0xD6C8, + 0x79EB, 0xEFF8, + 0x79ED, 0xEFF6, + 0x79EF, 0xBBFD, + 0x79F0, 0xB3C6, + 0x79F8, 0xBDD5, + 0x79FB, 0xD2C6, + 0x79FD, 0xBBE0, + 0x7A00, 0xCFA1, + 0x7A02, 0xEFFC, + 0x7A03, 0xEFFB, + 0x7A06, 0xEFF9, + 0x7A0B, 0xB3CC, + 0x7A0D, 0xC9D4, + 0x7A0E, 0xCBB0, + 0x7A14, 0xEFFE, + 0x7A17, 0xB0DE, + 0x7A1A, 0xD6C9, + 0x7A1E, 0xEFFD, + 0x7A20, 0xB3ED, + 0x7A23, 0xF6D5, + 0x7A33, 0xCEC8, + 0x7A37, 0xF0A2, + 0x7A39, 0xF0A1, + 0x7A3B, 0xB5BE, + 0x7A3C, 0xBCDA, + 0x7A3D, 0xBBFC, + 0x7A3F, 0xB8E5, + 0x7A46, 0xC4C2, + 0x7A51, 0xF0A3, + 0x7A57, 0xCBEB, + 0x7A70, 0xF0A6, + 0x7A74, 0xD1A8, + 0x7A76, 0xBEBF, + 0x7A77, 0xC7EE, + 0x7A78, 0xF1B6, + 0x7A79, 0xF1B7, + 0x7A7A, 0xBFD5, + 0x7A7F, 0xB4A9, + 0x7A80, 0xF1B8, + 0x7A81, 0xCDBB, + 0x7A83, 0xC7D4, + 0x7A84, 0xD5AD, + 0x7A86, 0xF1B9, + 0x7A88, 0xF1BA, + 0x7A8D, 0xC7CF, + 0x7A91, 0xD2A4, + 0x7A92, 0xD6CF, + 0x7A95, 0xF1BB, + 0x7A96, 0xBDD1, + 0x7A97, 0xB4B0, + 0x7A98, 0xBEBD, + 0x7A9C, 0xB4DC, + 0x7A9D, 0xCED1, + 0x7A9F, 0xBFDF, + 0x7AA0, 0xF1BD, + 0x7AA5, 0xBFFA, + 0x7AA6, 0xF1BC, + 0x7AA8, 0xF1BF, + 0x7AAC, 0xF1BE, + 0x7AAD, 0xF1C0, + 0x7AB3, 0xF1C1, + 0x7ABF, 0xC1FE, + 0x7ACB, 0xC1A2, + 0x7AD6, 0xCAFA, + 0x7AD9, 0xD5BE, + 0x7ADE, 0xBEBA, + 0x7ADF, 0xBEB9, + 0x7AE0, 0xD5C2, + 0x7AE3, 0xBFA2, + 0x7AE5, 0xCDAF, + 0x7AE6, 0xF1B5, + 0x7AED, 0xBDDF, + 0x7AEF, 0xB6CB, + 0x7AF9, 0xD6F1, + 0x7AFA, 0xF3C3, + 0x7AFD, 0xF3C4, + 0x7AFF, 0xB8CD, + 0x7B03, 0xF3C6, + 0x7B04, 0xF3C7, + 0x7B06, 0xB0CA, + 0x7B08, 0xF3C5, + 0x7B0A, 0xF3C9, + 0x7B0B, 0xCBF1, + 0x7B0F, 0xF3CB, + 0x7B11, 0xD0A6, + 0x7B14, 0xB1CA, + 0x7B15, 0xF3C8, + 0x7B19, 0xF3CF, + 0x7B1B, 0xB5D1, + 0x7B1E, 0xF3D7, + 0x7B20, 0xF3D2, + 0x7B24, 0xF3D4, + 0x7B25, 0xF3D3, + 0x7B26, 0xB7FB, + 0x7B28, 0xB1BF, + 0x7B2A, 0xF3CE, + 0x7B2B, 0xF3CA, + 0x7B2C, 0xB5DA, + 0x7B2E, 0xF3D0, + 0x7B31, 0xF3D1, + 0x7B33, 0xF3D5, + 0x7B38, 0xF3CD, + 0x7B3A, 0xBCE3, + 0x7B3C, 0xC1FD, + 0x7B3E, 0xF3D6, + 0x7B45, 0xF3DA, + 0x7B47, 0xF3CC, + 0x7B49, 0xB5C8, + 0x7B4B, 0xBDEE, + 0x7B4C, 0xF3DC, + 0x7B4F, 0xB7A4, + 0x7B50, 0xBFF0, + 0x7B51, 0xD6FE, + 0x7B52, 0xCDB2, + 0x7B54, 0xB4F0, + 0x7B56, 0xB2DF, + 0x7B58, 0xF3D8, + 0x7B5A, 0xF3D9, + 0x7B5B, 0xC9B8, + 0x7B5D, 0xF3DD, + 0x7B60, 0xF3DE, + 0x7B62, 0xF3E1, + 0x7B6E, 0xF3DF, + 0x7B71, 0xF3E3, + 0x7B72, 0xF3E2, + 0x7B75, 0xF3DB, + 0x7B77, 0xBFEA, + 0x7B79, 0xB3EF, + 0x7B7B, 0xF3E0, + 0x7B7E, 0xC7A9, + 0x7B80, 0xBCF2, + 0x7B85, 0xF3EB, + 0x7B8D, 0xB9BF, + 0x7B90, 0xF3E4, + 0x7B94, 0xB2AD, + 0x7B95, 0xBBFE, + 0x7B97, 0xCBE3, + 0x7B9C, 0xF3ED, + 0x7B9D, 0xF3E9, + 0x7BA1, 0xB9DC, + 0x7BA2, 0xF3EE, + 0x7BA6, 0xF3E5, + 0x7BA7, 0xF3E6, + 0x7BA8, 0xF3EA, + 0x7BA9, 0xC2E1, + 0x7BAA, 0xF3EC, + 0x7BAB, 0xF3EF, + 0x7BAC, 0xF3E8, + 0x7BAD, 0xBCFD, + 0x7BB1, 0xCFE4, + 0x7BB4, 0xF3F0, + 0x7BB8, 0xF3E7, + 0x7BC1, 0xF3F2, + 0x7BC6, 0xD7AD, + 0x7BC7, 0xC6AA, + 0x7BCC, 0xF3F3, + 0x7BD1, 0xF3F1, + 0x7BD3, 0xC2A8, + 0x7BD9, 0xB8DD, + 0x7BDA, 0xF3F5, + 0x7BDD, 0xF3F4, + 0x7BE1, 0xB4DB, + 0x7BE5, 0xF3F6, + 0x7BE6, 0xF3F7, + 0x7BEA, 0xF3F8, + 0x7BEE, 0xC0BA, + 0x7BF1, 0xC0E9, + 0x7BF7, 0xC5F1, + 0x7BFC, 0xF3FB, + 0x7BFE, 0xF3FA, + 0x7C07, 0xB4D8, + 0x7C0B, 0xF3FE, + 0x7C0C, 0xF3F9, + 0x7C0F, 0xF3FC, + 0x7C16, 0xF3FD, + 0x7C1F, 0xF4A1, + 0x7C26, 0xF4A3, + 0x7C27, 0xBBC9, + 0x7C2A, 0xF4A2, + 0x7C38, 0xF4A4, + 0x7C3F, 0xB2BE, + 0x7C40, 0xF4A6, + 0x7C41, 0xF4A5, + 0x7C4D, 0xBCAE, + 0x7C73, 0xC3D7, + 0x7C74, 0xD9E1, + 0x7C7B, 0xC0E0, + 0x7C7C, 0xF4CC, + 0x7C7D, 0xD7D1, + 0x7C89, 0xB7DB, + 0x7C91, 0xF4CE, + 0x7C92, 0xC1A3, + 0x7C95, 0xC6C9, + 0x7C97, 0xB4D6, + 0x7C98, 0xD5B3, + 0x7C9C, 0xF4D0, + 0x7C9D, 0xF4CF, + 0x7C9E, 0xF4D1, + 0x7C9F, 0xCBDA, + 0x7CA2, 0xF4D2, + 0x7CA4, 0xD4C1, + 0x7CA5, 0xD6E0, + 0x7CAA, 0xB7E0, + 0x7CAE, 0xC1B8, + 0x7CB1, 0xC1BB, + 0x7CB2, 0xF4D3, + 0x7CB3, 0xBEAC, + 0x7CB9, 0xB4E2, + 0x7CBC, 0xF4D4, + 0x7CBD, 0xF4D5, + 0x7CBE, 0xBEAB, + 0x7CC1, 0xF4D6, + 0x7CC5, 0xF4DB, + 0x7CC7, 0xF4D7, + 0x7CC8, 0xF4DA, + 0x7CCA, 0xBAFD, + 0x7CCC, 0xF4D8, + 0x7CCD, 0xF4D9, + 0x7CD5, 0xB8E2, + 0x7CD6, 0xCCC7, + 0x7CD7, 0xF4DC, + 0x7CD9, 0xB2DA, + 0x7CDC, 0xC3D3, + 0x7CDF, 0xD4E3, + 0x7CE0, 0xBFB7, + 0x7CE8, 0xF4DD, + 0x7CEF, 0xC5B4, + 0x7CF8, 0xF4E9, + 0x7CFB, 0xCFB5, + 0x7D0A, 0xCEC9, + 0x7D20, 0xCBD8, + 0x7D22, 0xCBF7, + 0x7D27, 0xBDF4, + 0x7D2B, 0xD7CF, + 0x7D2F, 0xC0DB, + 0x7D6E, 0xD0F5, + 0x7D77, 0xF4EA, + 0x7DA6, 0xF4EB, + 0x7DAE, 0xF4EC, + 0x7E3B, 0xF7E3, + 0x7E41, 0xB7B1, + 0x7E47, 0xF4ED, + 0x7E82, 0xD7EB, + 0x7E9B, 0xF4EE, + 0x7E9F, 0xE6F9, + 0x7EA0, 0xBEC0, + 0x7EA1, 0xE6FA, + 0x7EA2, 0xBAEC, + 0x7EA3, 0xE6FB, + 0x7EA4, 0xCFCB, + 0x7EA5, 0xE6FC, + 0x7EA6, 0xD4BC, + 0x7EA7, 0xBCB6, + 0x7EA8, 0xE6FD, + 0x7EA9, 0xE6FE, + 0x7EAA, 0xBCCD, + 0x7EAB, 0xC8D2, + 0x7EAC, 0xCEB3, + 0x7EAD, 0xE7A1, + 0x7EAF, 0xB4BF, + 0x7EB0, 0xE7A2, + 0x7EB1, 0xC9B4, + 0x7EB2, 0xB8D9, + 0x7EB3, 0xC4C9, + 0x7EB5, 0xD7DD, + 0x7EB6, 0xC2DA, + 0x7EB7, 0xB7D7, + 0x7EB8, 0xD6BD, + 0x7EB9, 0xCEC6, + 0x7EBA, 0xB7C4, + 0x7EBD, 0xC5A6, + 0x7EBE, 0xE7A3, + 0x7EBF, 0xCFDF, + 0x7EC0, 0xE7A4, + 0x7EC1, 0xE7A5, + 0x7EC2, 0xE7A6, + 0x7EC3, 0xC1B7, + 0x7EC4, 0xD7E9, + 0x7EC5, 0xC9F0, + 0x7EC6, 0xCFB8, + 0x7EC7, 0xD6AF, + 0x7EC8, 0xD6D5, + 0x7EC9, 0xE7A7, + 0x7ECA, 0xB0ED, + 0x7ECB, 0xE7A8, + 0x7ECC, 0xE7A9, + 0x7ECD, 0xC9DC, + 0x7ECE, 0xD2EF, + 0x7ECF, 0xBEAD, + 0x7ED0, 0xE7AA, + 0x7ED1, 0xB0F3, + 0x7ED2, 0xC8DE, + 0x7ED3, 0xBDE1, + 0x7ED4, 0xE7AB, + 0x7ED5, 0xC8C6, + 0x7ED7, 0xE7AC, + 0x7ED8, 0xBBE6, + 0x7ED9, 0xB8F8, + 0x7EDA, 0xD1A4, + 0x7EDB, 0xE7AD, + 0x7EDC, 0xC2E7, + 0x7EDD, 0xBEF8, + 0x7EDE, 0xBDCA, + 0x7EDF, 0xCDB3, + 0x7EE0, 0xE7AE, + 0x7EE1, 0xE7AF, + 0x7EE2, 0xBEEE, + 0x7EE3, 0xD0E5, + 0x7EE5, 0xCBE7, + 0x7EE6, 0xCCD0, + 0x7EE7, 0xBCCC, + 0x7EE8, 0xE7B0, + 0x7EE9, 0xBCA8, + 0x7EEA, 0xD0F7, + 0x7EEB, 0xE7B1, + 0x7EED, 0xD0F8, + 0x7EEE, 0xE7B2, + 0x7EEF, 0xE7B3, + 0x7EF0, 0xB4C2, + 0x7EF1, 0xE7B4, + 0x7EF2, 0xE7B5, + 0x7EF3, 0xC9FE, + 0x7EF4, 0xCEAC, + 0x7EF5, 0xC3E0, + 0x7EF6, 0xE7B7, + 0x7EF7, 0xB1C1, + 0x7EF8, 0xB3F1, + 0x7EFA, 0xE7B8, + 0x7EFB, 0xE7B9, + 0x7EFC, 0xD7DB, + 0x7EFD, 0xD5C0, + 0x7EFE, 0xE7BA, + 0x7EFF, 0xC2CC, + 0x7F00, 0xD7BA, + 0x7F01, 0xE7BB, + 0x7F02, 0xE7BC, + 0x7F03, 0xE7BD, + 0x7F04, 0xBCEA, + 0x7F05, 0xC3E5, + 0x7F06, 0xC0C2, + 0x7F07, 0xE7BE, + 0x7F08, 0xE7BF, + 0x7F09, 0xBCA9, + 0x7F0B, 0xE7C0, + 0x7F0C, 0xE7C1, + 0x7F0D, 0xE7B6, + 0x7F0E, 0xB6D0, + 0x7F0F, 0xE7C2, + 0x7F11, 0xE7C3, + 0x7F12, 0xE7C4, + 0x7F13, 0xBBBA, + 0x7F14, 0xB5DE, + 0x7F15, 0xC2C6, + 0x7F16, 0xB1E0, + 0x7F17, 0xE7C5, + 0x7F18, 0xD4B5, + 0x7F19, 0xE7C6, + 0x7F1A, 0xB8BF, + 0x7F1B, 0xE7C8, + 0x7F1C, 0xE7C7, + 0x7F1D, 0xB7EC, + 0x7F1F, 0xE7C9, + 0x7F20, 0xB2F8, + 0x7F21, 0xE7CA, + 0x7F22, 0xE7CB, + 0x7F23, 0xE7CC, + 0x7F24, 0xE7CD, + 0x7F25, 0xE7CE, + 0x7F26, 0xE7CF, + 0x7F27, 0xE7D0, + 0x7F28, 0xD3A7, + 0x7F29, 0xCBF5, + 0x7F2A, 0xE7D1, + 0x7F2B, 0xE7D2, + 0x7F2C, 0xE7D3, + 0x7F2D, 0xE7D4, + 0x7F2E, 0xC9C9, + 0x7F2F, 0xE7D5, + 0x7F30, 0xE7D6, + 0x7F31, 0xE7D7, + 0x7F32, 0xE7D8, + 0x7F33, 0xE7D9, + 0x7F34, 0xBDC9, + 0x7F35, 0xE7DA, + 0x7F36, 0xF3BE, + 0x7F38, 0xB8D7, + 0x7F3A, 0xC8B1, + 0x7F42, 0xF3BF, + 0x7F44, 0xF3C0, + 0x7F45, 0xF3C1, + 0x7F50, 0xB9DE, + 0x7F51, 0xCDF8, + 0x7F54, 0xD8E8, + 0x7F55, 0xBAB1, + 0x7F57, 0xC2DE, + 0x7F58, 0xEEB7, + 0x7F5A, 0xB7A3, + 0x7F5F, 0xEEB9, + 0x7F61, 0xEEB8, + 0x7F62, 0xB0D5, + 0x7F68, 0xEEBB, + 0x7F69, 0xD5D6, + 0x7F6A, 0xD7EF, + 0x7F6E, 0xD6C3, + 0x7F71, 0xEEBD, + 0x7F72, 0xCAF0, + 0x7F74, 0xEEBC, + 0x7F79, 0xEEBE, + 0x7F7E, 0xEEC0, + 0x7F81, 0xEEBF, + 0x7F8A, 0xD1F2, + 0x7F8C, 0xC7BC, + 0x7F8E, 0xC3C0, + 0x7F94, 0xB8E1, + 0x7F9A, 0xC1E7, + 0x7F9D, 0xF4C6, + 0x7F9E, 0xD0DF, + 0x7F9F, 0xF4C7, + 0x7FA1, 0xCFDB, + 0x7FA4, 0xC8BA, + 0x7FA7, 0xF4C8, + 0x7FAF, 0xF4C9, + 0x7FB0, 0xF4CA, + 0x7FB2, 0xF4CB, + 0x7FB8, 0xD9FA, + 0x7FB9, 0xB8FE, + 0x7FBC, 0xE5F1, + 0x7FBD, 0xD3F0, + 0x7FBF, 0xF4E0, + 0x7FC1, 0xCECC, + 0x7FC5, 0xB3E1, + 0x7FCA, 0xF1B4, + 0x7FCC, 0xD2EE, + 0x7FCE, 0xF4E1, + 0x7FD4, 0xCFE8, + 0x7FD5, 0xF4E2, + 0x7FD8, 0xC7CC, + 0x7FDF, 0xB5D4, + 0x7FE0, 0xB4E4, + 0x7FE1, 0xF4E4, + 0x7FE5, 0xF4E3, + 0x7FE6, 0xF4E5, + 0x7FE9, 0xF4E6, + 0x7FEE, 0xF4E7, + 0x7FF0, 0xBAB2, + 0x7FF1, 0xB0BF, + 0x7FF3, 0xF4E8, + 0x7FFB, 0xB7AD, + 0x7FFC, 0xD2ED, + 0x8000, 0xD2AB, + 0x8001, 0xC0CF, + 0x8003, 0xBFBC, + 0x8004, 0xEBA3, + 0x8005, 0xD5DF, + 0x8006, 0xEAC8, + 0x800B, 0xF1F3, + 0x800C, 0xB6F8, + 0x800D, 0xCBA3, + 0x8010, 0xC4CD, + 0x8012, 0xF1E7, + 0x8014, 0xF1E8, + 0x8015, 0xB8FB, + 0x8016, 0xF1E9, + 0x8017, 0xBAC4, + 0x8018, 0xD4C5, + 0x8019, 0xB0D2, + 0x801C, 0xF1EA, + 0x8020, 0xF1EB, + 0x8022, 0xF1EC, + 0x8025, 0xF1ED, + 0x8026, 0xF1EE, + 0x8027, 0xF1EF, + 0x8028, 0xF1F1, + 0x8029, 0xF1F0, + 0x802A, 0xC5D5, + 0x8031, 0xF1F2, + 0x8033, 0xB6FA, + 0x8035, 0xF1F4, + 0x8036, 0xD2AE, + 0x8037, 0xDEC7, + 0x8038, 0xCBCA, + 0x803B, 0xB3DC, + 0x803D, 0xB5A2, + 0x803F, 0xB9A2, + 0x8042, 0xC4F4, + 0x8043, 0xF1F5, + 0x8046, 0xF1F6, + 0x804A, 0xC1C4, + 0x804B, 0xC1FB, + 0x804C, 0xD6B0, + 0x804D, 0xF1F7, + 0x8052, 0xF1F8, + 0x8054, 0xC1AA, + 0x8058, 0xC6B8, + 0x805A, 0xBEDB, + 0x8069, 0xF1F9, + 0x806A, 0xB4CF, + 0x8071, 0xF1FA, + 0x807F, 0xEDB2, + 0x8080, 0xEDB1, + 0x8083, 0xCBE0, + 0x8084, 0xD2DE, + 0x8086, 0xCBC1, + 0x8087, 0xD5D8, + 0x8089, 0xC8E2, + 0x808B, 0xC0DF, + 0x808C, 0xBCA1, + 0x8093, 0xEBC1, + 0x8096, 0xD0A4, + 0x8098, 0xD6E2, + 0x809A, 0xB6C7, + 0x809B, 0xB8D8, + 0x809C, 0xEBC0, + 0x809D, 0xB8CE, + 0x809F, 0xEBBF, + 0x80A0, 0xB3A6, + 0x80A1, 0xB9C9, + 0x80A2, 0xD6AB, + 0x80A4, 0xB7F4, + 0x80A5, 0xB7CA, + 0x80A9, 0xBCE7, + 0x80AA, 0xB7BE, + 0x80AB, 0xEBC6, + 0x80AD, 0xEBC7, + 0x80AE, 0xB0B9, + 0x80AF, 0xBFCF, + 0x80B1, 0xEBC5, + 0x80B2, 0xD3FD, + 0x80B4, 0xEBC8, + 0x80B7, 0xEBC9, + 0x80BA, 0xB7CE, + 0x80BC, 0xEBC2, + 0x80BD, 0xEBC4, + 0x80BE, 0xC9F6, + 0x80BF, 0xD6D7, + 0x80C0, 0xD5CD, + 0x80C1, 0xD0B2, + 0x80C2, 0xEBCF, + 0x80C3, 0xCEB8, + 0x80C4, 0xEBD0, + 0x80C6, 0xB5A8, + 0x80CC, 0xB1B3, + 0x80CD, 0xEBD2, + 0x80CE, 0xCCA5, + 0x80D6, 0xC5D6, + 0x80D7, 0xEBD3, + 0x80D9, 0xEBD1, + 0x80DA, 0xC5DF, + 0x80DB, 0xEBCE, + 0x80DC, 0xCAA4, + 0x80DD, 0xEBD5, + 0x80DE, 0xB0FB, + 0x80E1, 0xBAFA, + 0x80E4, 0xD8B7, + 0x80E5, 0xF1E3, + 0x80E7, 0xEBCA, + 0x80E8, 0xEBCB, + 0x80E9, 0xEBCC, + 0x80EA, 0xEBCD, + 0x80EB, 0xEBD6, + 0x80EC, 0xE6C0, + 0x80ED, 0xEBD9, + 0x80EF, 0xBFE8, + 0x80F0, 0xD2C8, + 0x80F1, 0xEBD7, + 0x80F2, 0xEBDC, + 0x80F3, 0xB8EC, + 0x80F4, 0xEBD8, + 0x80F6, 0xBDBA, + 0x80F8, 0xD0D8, + 0x80FA, 0xB0B7, + 0x80FC, 0xEBDD, + 0x80FD, 0xC4DC, + 0x8102, 0xD6AC, + 0x8106, 0xB4E0, + 0x8109, 0xC2F6, + 0x810A, 0xBCB9, + 0x810D, 0xEBDA, + 0x810E, 0xEBDB, + 0x810F, 0xD4E0, + 0x8110, 0xC6EA, + 0x8111, 0xC4D4, + 0x8112, 0xEBDF, + 0x8113, 0xC5A7, + 0x8114, 0xD9F5, + 0x8116, 0xB2B1, + 0x8118, 0xEBE4, + 0x811A, 0xBDC5, + 0x811E, 0xEBE2, + 0x812C, 0xEBE3, + 0x812F, 0xB8AC, + 0x8131, 0xCDD1, + 0x8132, 0xEBE5, + 0x8136, 0xEBE1, + 0x8138, 0xC1B3, + 0x813E, 0xC6A2, + 0x8146, 0xCCF3, + 0x8148, 0xEBE6, + 0x814A, 0xC0B0, + 0x814B, 0xD2B8, + 0x814C, 0xEBE7, + 0x8150, 0xB8AF, + 0x8151, 0xB8AD, + 0x8153, 0xEBE8, + 0x8154, 0xC7BB, + 0x8155, 0xCDF3, + 0x8159, 0xEBEA, + 0x815A, 0xEBEB, + 0x8160, 0xEBED, + 0x8165, 0xD0C8, + 0x8167, 0xEBF2, + 0x8169, 0xEBEE, + 0x816D, 0xEBF1, + 0x816E, 0xC8F9, + 0x8170, 0xD1FC, + 0x8171, 0xEBEC, + 0x8174, 0xEBE9, + 0x8179, 0xB8B9, + 0x817A, 0xCFD9, + 0x817B, 0xC4E5, + 0x817C, 0xEBEF, + 0x817D, 0xEBF0, + 0x817E, 0xCCDA, + 0x817F, 0xCDC8, + 0x8180, 0xB0F2, + 0x8182, 0xEBF6, + 0x8188, 0xEBF5, + 0x818A, 0xB2B2, + 0x818F, 0xB8E0, + 0x8191, 0xEBF7, + 0x8198, 0xB1EC, + 0x819B, 0xCCC5, + 0x819C, 0xC4A4, + 0x819D, 0xCFA5, + 0x81A3, 0xEBF9, + 0x81A6, 0xECA2, + 0x81A8, 0xC5F2, + 0x81AA, 0xEBFA, + 0x81B3, 0xC9C5, + 0x81BA, 0xE2DF, + 0x81BB, 0xEBFE, + 0x81C0, 0xCDCE, + 0x81C1, 0xECA1, + 0x81C2, 0xB1DB, + 0x81C3, 0xD3B7, + 0x81C6, 0xD2DC, + 0x81CA, 0xEBFD, + 0x81CC, 0xEBFB, + 0x81E3, 0xB3BC, + 0x81E7, 0xEAB0, + 0x81EA, 0xD7D4, + 0x81EC, 0xF4AB, + 0x81ED, 0xB3F4, + 0x81F3, 0xD6C1, + 0x81F4, 0xD6C2, + 0x81FB, 0xD5E9, + 0x81FC, 0xBECA, + 0x81FE, 0xF4A7, + 0x8200, 0xD2A8, + 0x8201, 0xF4A8, + 0x8202, 0xF4A9, + 0x8204, 0xF4AA, + 0x8205, 0xBECB, + 0x8206, 0xD3DF, + 0x820C, 0xC9E0, + 0x820D, 0xC9E1, + 0x8210, 0xF3C2, + 0x8212, 0xCAE6, + 0x8214, 0xCCF2, + 0x821B, 0xE2B6, + 0x821C, 0xCBB4, + 0x821E, 0xCEE8, + 0x821F, 0xD6DB, + 0x8221, 0xF4AD, + 0x8222, 0xF4AE, + 0x8223, 0xF4AF, + 0x8228, 0xF4B2, + 0x822A, 0xBABD, + 0x822B, 0xF4B3, + 0x822C, 0xB0E3, + 0x822D, 0xF4B0, + 0x822F, 0xF4B1, + 0x8230, 0xBDA2, + 0x8231, 0xB2D5, + 0x8233, 0xF4B6, + 0x8234, 0xF4B7, + 0x8235, 0xB6E6, + 0x8236, 0xB2B0, + 0x8237, 0xCFCF, + 0x8238, 0xF4B4, + 0x8239, 0xB4AC, + 0x823B, 0xF4B5, + 0x823E, 0xF4B8, + 0x8244, 0xF4B9, + 0x8247, 0xCDA7, + 0x8249, 0xF4BA, + 0x824B, 0xF4BB, + 0x824F, 0xF4BC, + 0x8258, 0xCBD2, + 0x825A, 0xF4BD, + 0x825F, 0xF4BE, + 0x8268, 0xF4BF, + 0x826E, 0xF4DE, + 0x826F, 0xC1BC, + 0x8270, 0xBCE8, + 0x8272, 0xC9AB, + 0x8273, 0xD1DE, + 0x8274, 0xE5F5, + 0x8279, 0xDCB3, + 0x827A, 0xD2D5, + 0x827D, 0xDCB4, + 0x827E, 0xB0AC, + 0x827F, 0xDCB5, + 0x8282, 0xBDDA, + 0x8284, 0xDCB9, + 0x8288, 0xD8C2, + 0x828A, 0xDCB7, + 0x828B, 0xD3F3, + 0x828D, 0xC9D6, + 0x828E, 0xDCBA, + 0x828F, 0xDCB6, + 0x8291, 0xDCBB, + 0x8292, 0xC3A2, + 0x8297, 0xDCBC, + 0x8298, 0xDCC5, + 0x8299, 0xDCBD, + 0x829C, 0xCEDF, + 0x829D, 0xD6A5, + 0x829F, 0xDCCF, + 0x82A1, 0xDCCD, + 0x82A4, 0xDCD2, + 0x82A5, 0xBDE6, + 0x82A6, 0xC2AB, + 0x82A8, 0xDCB8, + 0x82A9, 0xDCCB, + 0x82AA, 0xDCCE, + 0x82AB, 0xDCBE, + 0x82AC, 0xB7D2, + 0x82AD, 0xB0C5, + 0x82AE, 0xDCC7, + 0x82AF, 0xD0BE, + 0x82B0, 0xDCC1, + 0x82B1, 0xBBA8, + 0x82B3, 0xB7BC, + 0x82B4, 0xDCCC, + 0x82B7, 0xDCC6, + 0x82B8, 0xDCBF, + 0x82B9, 0xC7DB, + 0x82BD, 0xD1BF, + 0x82BE, 0xDCC0, + 0x82C1, 0xDCCA, + 0x82C4, 0xDCD0, + 0x82C7, 0xCEAD, + 0x82C8, 0xDCC2, + 0x82CA, 0xDCC3, + 0x82CB, 0xDCC8, + 0x82CC, 0xDCC9, + 0x82CD, 0xB2D4, + 0x82CE, 0xDCD1, + 0x82CF, 0xCBD5, + 0x82D1, 0xD4B7, + 0x82D2, 0xDCDB, + 0x82D3, 0xDCDF, + 0x82D4, 0xCCA6, + 0x82D5, 0xDCE6, + 0x82D7, 0xC3E7, + 0x82D8, 0xDCDC, + 0x82DB, 0xBFC1, + 0x82DC, 0xDCD9, + 0x82DE, 0xB0FA, + 0x82DF, 0xB9B6, + 0x82E0, 0xDCE5, + 0x82E1, 0xDCD3, + 0x82E3, 0xDCC4, + 0x82E4, 0xDCD6, + 0x82E5, 0xC8F4, + 0x82E6, 0xBFE0, + 0x82EB, 0xC9BB, + 0x82EF, 0xB1BD, + 0x82F1, 0xD3A2, + 0x82F4, 0xDCDA, + 0x82F7, 0xDCD5, + 0x82F9, 0xC6BB, + 0x82FB, 0xDCDE, + 0x8301, 0xD7C2, + 0x8302, 0xC3AF, + 0x8303, 0xB7B6, + 0x8304, 0xC7D1, + 0x8305, 0xC3A9, + 0x8306, 0xDCE2, + 0x8307, 0xDCD8, + 0x8308, 0xDCEB, + 0x8309, 0xDCD4, + 0x830C, 0xDCDD, + 0x830E, 0xBEA5, + 0x830F, 0xDCD7, + 0x8311, 0xDCE0, + 0x8314, 0xDCE3, + 0x8315, 0xDCE4, + 0x8317, 0xDCF8, + 0x831A, 0xDCE1, + 0x831B, 0xDDA2, + 0x831C, 0xDCE7, + 0x8327, 0xBCEB, + 0x8328, 0xB4C4, + 0x832B, 0xC3A3, + 0x832C, 0xB2E7, + 0x832D, 0xDCFA, + 0x832F, 0xDCF2, + 0x8331, 0xDCEF, + 0x8333, 0xDCFC, + 0x8334, 0xDCEE, + 0x8335, 0xD2F0, + 0x8336, 0xB2E8, + 0x8338, 0xC8D7, + 0x8339, 0xC8E3, + 0x833A, 0xDCFB, + 0x833C, 0xDCED, + 0x8340, 0xDCF7, + 0x8343, 0xDCF5, + 0x8346, 0xBEA3, + 0x8347, 0xDCF4, + 0x8349, 0xB2DD, + 0x834F, 0xDCF3, + 0x8350, 0xBCF6, + 0x8351, 0xDCE8, + 0x8352, 0xBBC4, + 0x8354, 0xC0F3, + 0x835A, 0xBCD4, + 0x835B, 0xDCE9, + 0x835C, 0xDCEA, + 0x835E, 0xDCF1, + 0x835F, 0xDCF6, + 0x8360, 0xDCF9, + 0x8361, 0xB5B4, + 0x8363, 0xC8D9, + 0x8364, 0xBBE7, + 0x8365, 0xDCFE, + 0x8366, 0xDCFD, + 0x8367, 0xD3AB, + 0x8368, 0xDDA1, + 0x8369, 0xDDA3, + 0x836A, 0xDDA5, + 0x836B, 0xD2F1, + 0x836C, 0xDDA4, + 0x836D, 0xDDA6, + 0x836E, 0xDDA7, + 0x836F, 0xD2A9, + 0x8377, 0xBAC9, + 0x8378, 0xDDA9, + 0x837B, 0xDDB6, + 0x837C, 0xDDB1, + 0x837D, 0xDDB4, + 0x8385, 0xDDB0, + 0x8386, 0xC6CE, + 0x8389, 0xC0F2, + 0x838E, 0xC9AF, + 0x8392, 0xDCEC, + 0x8393, 0xDDAE, + 0x8398, 0xDDB7, + 0x839B, 0xDCF0, + 0x839C, 0xDDAF, + 0x839E, 0xDDB8, + 0x83A0, 0xDDAC, + 0x83A8, 0xDDB9, + 0x83A9, 0xDDB3, + 0x83AA, 0xDDAD, + 0x83AB, 0xC4AA, + 0x83B0, 0xDDA8, + 0x83B1, 0xC0B3, + 0x83B2, 0xC1AB, + 0x83B3, 0xDDAA, + 0x83B4, 0xDDAB, + 0x83B6, 0xDDB2, + 0x83B7, 0xBBF1, + 0x83B8, 0xDDB5, + 0x83B9, 0xD3A8, + 0x83BA, 0xDDBA, + 0x83BC, 0xDDBB, + 0x83BD, 0xC3A7, + 0x83C0, 0xDDD2, + 0x83C1, 0xDDBC, + 0x83C5, 0xDDD1, + 0x83C7, 0xB9BD, + 0x83CA, 0xBED5, + 0x83CC, 0xBEFA, + 0x83CF, 0xBACA, + 0x83D4, 0xDDCA, + 0x83D6, 0xDDC5, + 0x83D8, 0xDDBF, + 0x83DC, 0xB2CB, + 0x83DD, 0xDDC3, + 0x83DF, 0xDDCB, + 0x83E0, 0xB2A4, + 0x83E1, 0xDDD5, + 0x83E5, 0xDDBE, + 0x83E9, 0xC6D0, + 0x83EA, 0xDDD0, + 0x83F0, 0xDDD4, + 0x83F1, 0xC1E2, + 0x83F2, 0xB7C6, + 0x83F8, 0xDDCE, + 0x83F9, 0xDDCF, + 0x83FD, 0xDDC4, + 0x8401, 0xDDBD, + 0x8403, 0xDDCD, + 0x8404, 0xCCD1, + 0x8406, 0xDDC9, + 0x840B, 0xDDC2, + 0x840C, 0xC3C8, + 0x840D, 0xC6BC, + 0x840E, 0xCEAE, + 0x840F, 0xDDCC, + 0x8411, 0xDDC8, + 0x8418, 0xDDC1, + 0x841C, 0xDDC6, + 0x841D, 0xC2DC, + 0x8424, 0xD3A9, + 0x8425, 0xD3AA, + 0x8426, 0xDDD3, + 0x8427, 0xCFF4, + 0x8428, 0xC8F8, + 0x8431, 0xDDE6, + 0x8438, 0xDDC7, + 0x843C, 0xDDE0, + 0x843D, 0xC2E4, + 0x8446, 0xDDE1, + 0x8451, 0xDDD7, + 0x8457, 0xD6F8, + 0x8459, 0xDDD9, + 0x845A, 0xDDD8, + 0x845B, 0xB8F0, + 0x845C, 0xDDD6, + 0x8461, 0xC6CF, + 0x8463, 0xB6AD, + 0x8469, 0xDDE2, + 0x846B, 0xBAF9, + 0x846C, 0xD4E1, + 0x846D, 0xDDE7, + 0x8471, 0xB4D0, + 0x8473, 0xDDDA, + 0x8475, 0xBFFB, + 0x8476, 0xDDE3, + 0x8478, 0xDDDF, + 0x847A, 0xDDDD, + 0x8482, 0xB5D9, + 0x8487, 0xDDDB, + 0x8488, 0xDDDC, + 0x8489, 0xDDDE, + 0x848B, 0xBDAF, + 0x848C, 0xDDE4, + 0x848E, 0xDDE5, + 0x8497, 0xDDF5, + 0x8499, 0xC3C9, + 0x849C, 0xCBE2, + 0x84A1, 0xDDF2, + 0x84AF, 0xD8E1, + 0x84B2, 0xC6D1, + 0x84B4, 0xDDF4, + 0x84B8, 0xD5F4, + 0x84B9, 0xDDF3, + 0x84BA, 0xDDF0, + 0x84BD, 0xDDEC, + 0x84BF, 0xDDEF, + 0x84C1, 0xDDE8, + 0x84C4, 0xD0EE, + 0x84C9, 0xC8D8, + 0x84CA, 0xDDEE, + 0x84CD, 0xDDE9, + 0x84D0, 0xDDEA, + 0x84D1, 0xCBF2, + 0x84D3, 0xDDED, + 0x84D6, 0xB1CD, + 0x84DD, 0xC0B6, + 0x84DF, 0xBCBB, + 0x84E0, 0xDDF1, + 0x84E3, 0xDDF7, + 0x84E5, 0xDDF6, + 0x84E6, 0xDDEB, + 0x84EC, 0xC5EE, + 0x84F0, 0xDDFB, + 0x84FC, 0xDEA4, + 0x84FF, 0xDEA3, + 0x850C, 0xDDF8, + 0x8511, 0xC3EF, + 0x8513, 0xC2FB, + 0x8517, 0xD5E1, + 0x851A, 0xCEB5, + 0x851F, 0xDDFD, + 0x8521, 0xB2CC, + 0x852B, 0xC4E8, + 0x852C, 0xCADF, + 0x8537, 0xC7BE, + 0x8538, 0xDDFA, + 0x8539, 0xDDFC, + 0x853A, 0xDDFE, + 0x853B, 0xDEA2, + 0x853C, 0xB0AA, + 0x853D, 0xB1CE, + 0x8543, 0xDEAC, + 0x8548, 0xDEA6, + 0x8549, 0xBDB6, + 0x854A, 0xC8EF, + 0x8556, 0xDEA1, + 0x8559, 0xDEA5, + 0x855E, 0xDEA9, + 0x8564, 0xDEA8, + 0x8568, 0xDEA7, + 0x8572, 0xDEAD, + 0x8574, 0xD4CC, + 0x8579, 0xDEB3, + 0x857A, 0xDEAA, + 0x857B, 0xDEAE, + 0x857E, 0xC0D9, + 0x8584, 0xB1A1, + 0x8585, 0xDEB6, + 0x8587, 0xDEB1, + 0x858F, 0xDEB2, + 0x859B, 0xD1A6, + 0x859C, 0xDEB5, + 0x85A4, 0xDEAF, + 0x85A8, 0xDEB0, + 0x85AA, 0xD0BD, + 0x85AE, 0xDEB4, + 0x85AF, 0xCAED, + 0x85B0, 0xDEB9, + 0x85B7, 0xDEB8, + 0x85B9, 0xDEB7, + 0x85C1, 0xDEBB, + 0x85C9, 0xBDE5, + 0x85CF, 0xB2D8, + 0x85D0, 0xC3EA, + 0x85D3, 0xDEBA, + 0x85D5, 0xC5BA, + 0x85DC, 0xDEBC, + 0x85E4, 0xCCD9, + 0x85E9, 0xB7AA, + 0x85FB, 0xD4E5, + 0x85FF, 0xDEBD, + 0x8605, 0xDEBF, + 0x8611, 0xC4A2, + 0x8616, 0xDEC1, + 0x8627, 0xDEBE, + 0x8629, 0xDEC0, + 0x8638, 0xD5BA, + 0x863C, 0xDEC2, + 0x864D, 0xF2AE, + 0x864E, 0xBBA2, + 0x864F, 0xC2B2, + 0x8650, 0xC5B0, + 0x8651, 0xC2C7, + 0x8654, 0xF2AF, + 0x865A, 0xD0E9, + 0x865E, 0xD3DD, + 0x8662, 0xEBBD, + 0x866B, 0xB3E6, + 0x866C, 0xF2B0, + 0x866E, 0xF2B1, + 0x8671, 0xCAAD, + 0x8679, 0xBAE7, + 0x867A, 0xF2B3, + 0x867B, 0xF2B5, + 0x867C, 0xF2B4, + 0x867D, 0xCBE4, + 0x867E, 0xCFBA, + 0x867F, 0xF2B2, + 0x8680, 0xCAB4, + 0x8681, 0xD2CF, + 0x8682, 0xC2EC, + 0x868A, 0xCEC3, + 0x868B, 0xF2B8, + 0x868C, 0xB0F6, + 0x868D, 0xF2B7, + 0x8693, 0xF2BE, + 0x8695, 0xB2CF, + 0x869C, 0xD1C1, + 0x869D, 0xF2BA, + 0x86A3, 0xF2BC, + 0x86A4, 0xD4E9, + 0x86A7, 0xF2BB, + 0x86A8, 0xF2B6, + 0x86A9, 0xF2BF, + 0x86AA, 0xF2BD, + 0x86AC, 0xF2B9, + 0x86AF, 0xF2C7, + 0x86B0, 0xF2C4, + 0x86B1, 0xF2C6, + 0x86B4, 0xF2CA, + 0x86B5, 0xF2C2, + 0x86B6, 0xF2C0, + 0x86BA, 0xF2C5, + 0x86C0, 0xD6FB, + 0x86C4, 0xF2C1, + 0x86C6, 0xC7F9, + 0x86C7, 0xC9DF, + 0x86C9, 0xF2C8, + 0x86CA, 0xB9C6, + 0x86CB, 0xB5B0, + 0x86CE, 0xF2C3, + 0x86CF, 0xF2C9, + 0x86D0, 0xF2D0, + 0x86D1, 0xF2D6, + 0x86D4, 0xBBD7, + 0x86D8, 0xF2D5, + 0x86D9, 0xCDDC, + 0x86DB, 0xD6EB, + 0x86DE, 0xF2D2, + 0x86DF, 0xF2D4, + 0x86E4, 0xB8F2, + 0x86E9, 0xF2CB, + 0x86ED, 0xF2CE, + 0x86EE, 0xC2F9, + 0x86F0, 0xD5DD, + 0x86F1, 0xF2CC, + 0x86F2, 0xF2CD, + 0x86F3, 0xF2CF, + 0x86F4, 0xF2D3, + 0x86F8, 0xF2D9, + 0x86F9, 0xD3BC, + 0x86FE, 0xB6EA, + 0x8700, 0xCAF1, + 0x8702, 0xB7E4, + 0x8703, 0xF2D7, + 0x8707, 0xF2D8, + 0x8708, 0xF2DA, + 0x8709, 0xF2DD, + 0x870A, 0xF2DB, + 0x870D, 0xF2DC, + 0x8712, 0xD1D1, + 0x8713, 0xF2D1, + 0x8715, 0xCDC9, + 0x8717, 0xCECF, + 0x8718, 0xD6A9, + 0x871A, 0xF2E3, + 0x871C, 0xC3DB, + 0x871E, 0xF2E0, + 0x8721, 0xC0AF, + 0x8722, 0xF2EC, + 0x8723, 0xF2DE, + 0x8725, 0xF2E1, + 0x8729, 0xF2E8, + 0x872E, 0xF2E2, + 0x8731, 0xF2E7, + 0x8734, 0xF2E6, + 0x8737, 0xF2E9, + 0x873B, 0xF2DF, + 0x873E, 0xF2E4, + 0x873F, 0xF2EA, + 0x8747, 0xD3AC, + 0x8748, 0xF2E5, + 0x8749, 0xB2F5, + 0x874C, 0xF2F2, + 0x874E, 0xD0AB, + 0x8753, 0xF2F5, + 0x8757, 0xBBC8, + 0x8759, 0xF2F9, + 0x8760, 0xF2F0, + 0x8763, 0xF2F6, + 0x8764, 0xF2F8, + 0x8765, 0xF2FA, + 0x876E, 0xF2F3, + 0x8770, 0xF2F1, + 0x8774, 0xBAFB, + 0x8776, 0xB5FB, + 0x877B, 0xF2EF, + 0x877C, 0xF2F7, + 0x877D, 0xF2ED, + 0x877E, 0xF2EE, + 0x8782, 0xF2EB, + 0x8783, 0xF3A6, + 0x8785, 0xF3A3, + 0x8788, 0xF3A2, + 0x878B, 0xF2F4, + 0x878D, 0xC8DA, + 0x8793, 0xF2FB, + 0x8797, 0xF3A5, + 0x879F, 0xC3F8, + 0x87A8, 0xF2FD, + 0x87AB, 0xF3A7, + 0x87AC, 0xF3A9, + 0x87AD, 0xF3A4, + 0x87AF, 0xF2FC, + 0x87B3, 0xF3AB, + 0x87B5, 0xF3AA, + 0x87BA, 0xC2DD, + 0x87BD, 0xF3AE, + 0x87C0, 0xF3B0, + 0x87C6, 0xF3A1, + 0x87CA, 0xF3B1, + 0x87CB, 0xF3AC, + 0x87D1, 0xF3AF, + 0x87D2, 0xF2FE, + 0x87D3, 0xF3AD, + 0x87DB, 0xF3B2, + 0x87E0, 0xF3B4, + 0x87E5, 0xF3A8, + 0x87EA, 0xF3B3, + 0x87EE, 0xF3B5, + 0x87F9, 0xD0B7, + 0x87FE, 0xF3B8, + 0x8803, 0xD9F9, + 0x880A, 0xF3B9, + 0x8813, 0xF3B7, + 0x8815, 0xC8E4, + 0x8816, 0xF3B6, + 0x881B, 0xF3BA, + 0x8821, 0xF3BB, + 0x8822, 0xB4C0, + 0x8832, 0xEEC3, + 0x8839, 0xF3BC, + 0x883C, 0xF3BD, + 0x8840, 0xD1AA, + 0x8844, 0xF4AC, + 0x8845, 0xD0C6, + 0x884C, 0xD0D0, + 0x884D, 0xD1DC, + 0x8854, 0xCFCE, + 0x8857, 0xBDD6, + 0x8859, 0xD1C3, + 0x8861, 0xBAE2, + 0x8862, 0xE1E9, + 0x8863, 0xD2C2, + 0x8864, 0xF1C2, + 0x8865, 0xB2B9, + 0x8868, 0xB1ED, + 0x8869, 0xF1C3, + 0x886B, 0xC9C0, + 0x886C, 0xB3C4, + 0x886E, 0xD9F2, + 0x8870, 0xCBA5, + 0x8872, 0xF1C4, + 0x8877, 0xD6D4, + 0x887D, 0xF1C5, + 0x887E, 0xF4C0, + 0x887F, 0xF1C6, + 0x8881, 0xD4AC, + 0x8882, 0xF1C7, + 0x8884, 0xB0C0, + 0x8885, 0xF4C1, + 0x8888, 0xF4C2, + 0x888B, 0xB4FC, + 0x888D, 0xC5DB, + 0x8892, 0xCCBB, + 0x8896, 0xD0E4, + 0x889C, 0xCDE0, + 0x88A2, 0xF1C8, + 0x88A4, 0xD9F3, + 0x88AB, 0xB1BB, + 0x88AD, 0xCFAE, + 0x88B1, 0xB8A4, + 0x88B7, 0xF1CA, + 0x88BC, 0xF1CB, + 0x88C1, 0xB2C3, + 0x88C2, 0xC1D1, + 0x88C5, 0xD7B0, + 0x88C6, 0xF1C9, + 0x88C9, 0xF1CC, + 0x88CE, 0xF1CE, + 0x88D2, 0xD9F6, + 0x88D4, 0xD2E1, + 0x88D5, 0xD4A3, + 0x88D8, 0xF4C3, + 0x88D9, 0xC8B9, + 0x88DF, 0xF4C4, + 0x88E2, 0xF1CD, + 0x88E3, 0xF1CF, + 0x88E4, 0xBFE3, + 0x88E5, 0xF1D0, + 0x88E8, 0xF1D4, + 0x88F0, 0xF1D6, + 0x88F1, 0xF1D1, + 0x88F3, 0xC9D1, + 0x88F4, 0xC5E1, + 0x88F8, 0xC2E3, + 0x88F9, 0xB9FC, + 0x88FC, 0xF1D3, + 0x88FE, 0xF1D5, + 0x8902, 0xB9D3, + 0x890A, 0xF1DB, + 0x8910, 0xBAD6, + 0x8912, 0xB0FD, + 0x8913, 0xF1D9, + 0x8919, 0xF1D8, + 0x891A, 0xF1D2, + 0x891B, 0xF1DA, + 0x8921, 0xF1D7, + 0x8925, 0xC8EC, + 0x892A, 0xCDCA, + 0x892B, 0xF1DD, + 0x8930, 0xE5BD, + 0x8934, 0xF1DC, + 0x8936, 0xF1DE, + 0x8941, 0xF1DF, + 0x8944, 0xCFE5, + 0x895E, 0xF4C5, + 0x895F, 0xBDF3, + 0x8966, 0xF1E0, + 0x897B, 0xF1E1, + 0x897F, 0xCEF7, + 0x8981, 0xD2AA, + 0x8983, 0xF1FB, + 0x8986, 0xB8B2, + 0x89C1, 0xBCFB, + 0x89C2, 0xB9DB, + 0x89C4, 0xB9E6, + 0x89C5, 0xC3D9, + 0x89C6, 0xCAD3, + 0x89C7, 0xEAE8, + 0x89C8, 0xC0C0, + 0x89C9, 0xBEF5, + 0x89CA, 0xEAE9, + 0x89CB, 0xEAEA, + 0x89CC, 0xEAEB, + 0x89CE, 0xEAEC, + 0x89CF, 0xEAED, + 0x89D0, 0xEAEE, + 0x89D1, 0xEAEF, + 0x89D2, 0xBDC7, + 0x89D6, 0xF5FB, + 0x89DA, 0xF5FD, + 0x89DC, 0xF5FE, + 0x89DE, 0xF5FC, + 0x89E3, 0xBDE2, + 0x89E5, 0xF6A1, + 0x89E6, 0xB4A5, + 0x89EB, 0xF6A2, + 0x89EF, 0xF6A3, + 0x89F3, 0xECB2, + 0x8A00, 0xD1D4, + 0x8A07, 0xD9EA, + 0x8A3E, 0xF6A4, + 0x8A48, 0xEEBA, + 0x8A79, 0xD5B2, + 0x8A89, 0xD3FE, + 0x8A8A, 0xCCDC, + 0x8A93, 0xCAC4, + 0x8B07, 0xE5C0, + 0x8B26, 0xF6A5, + 0x8B66, 0xBEAF, + 0x8B6C, 0xC6A9, + 0x8BA0, 0xDAA5, + 0x8BA1, 0xBCC6, + 0x8BA2, 0xB6A9, + 0x8BA3, 0xB8BC, + 0x8BA4, 0xC8CF, + 0x8BA5, 0xBCA5, + 0x8BA6, 0xDAA6, + 0x8BA7, 0xDAA7, + 0x8BA8, 0xCCD6, + 0x8BA9, 0xC8C3, + 0x8BAA, 0xDAA8, + 0x8BAB, 0xC6FD, + 0x8BAD, 0xD1B5, + 0x8BAE, 0xD2E9, + 0x8BAF, 0xD1B6, + 0x8BB0, 0xBCC7, + 0x8BB2, 0xBDB2, + 0x8BB3, 0xBBE4, + 0x8BB4, 0xDAA9, + 0x8BB5, 0xDAAA, + 0x8BB6, 0xD1C8, + 0x8BB7, 0xDAAB, + 0x8BB8, 0xD0ED, + 0x8BB9, 0xB6EF, + 0x8BBA, 0xC2DB, + 0x8BBC, 0xCBCF, + 0x8BBD, 0xB7ED, + 0x8BBE, 0xC9E8, + 0x8BBF, 0xB7C3, + 0x8BC0, 0xBEF7, + 0x8BC1, 0xD6A4, + 0x8BC2, 0xDAAC, + 0x8BC3, 0xDAAD, + 0x8BC4, 0xC6C0, + 0x8BC5, 0xD7E7, + 0x8BC6, 0xCAB6, + 0x8BC8, 0xD5A9, + 0x8BC9, 0xCBDF, + 0x8BCA, 0xD5EF, + 0x8BCB, 0xDAAE, + 0x8BCC, 0xD6DF, + 0x8BCD, 0xB4CA, + 0x8BCE, 0xDAB0, + 0x8BCF, 0xDAAF, + 0x8BD1, 0xD2EB, + 0x8BD2, 0xDAB1, + 0x8BD3, 0xDAB2, + 0x8BD4, 0xDAB3, + 0x8BD5, 0xCAD4, + 0x8BD6, 0xDAB4, + 0x8BD7, 0xCAAB, + 0x8BD8, 0xDAB5, + 0x8BD9, 0xDAB6, + 0x8BDA, 0xB3CF, + 0x8BDB, 0xD6EF, + 0x8BDC, 0xDAB7, + 0x8BDD, 0xBBB0, + 0x8BDE, 0xB5AE, + 0x8BDF, 0xDAB8, + 0x8BE0, 0xDAB9, + 0x8BE1, 0xB9EE, + 0x8BE2, 0xD1AF, + 0x8BE3, 0xD2E8, + 0x8BE4, 0xDABA, + 0x8BE5, 0xB8C3, + 0x8BE6, 0xCFEA, + 0x8BE7, 0xB2EF, + 0x8BE8, 0xDABB, + 0x8BE9, 0xDABC, + 0x8BEB, 0xBDEB, + 0x8BEC, 0xCEDC, + 0x8BED, 0xD3EF, + 0x8BEE, 0xDABD, + 0x8BEF, 0xCEF3, + 0x8BF0, 0xDABE, + 0x8BF1, 0xD3D5, + 0x8BF2, 0xBBE5, + 0x8BF3, 0xDABF, + 0x8BF4, 0xCBB5, + 0x8BF5, 0xCBD0, + 0x8BF6, 0xDAC0, + 0x8BF7, 0xC7EB, + 0x8BF8, 0xD6EE, + 0x8BF9, 0xDAC1, + 0x8BFA, 0xC5B5, + 0x8BFB, 0xB6C1, + 0x8BFC, 0xDAC2, + 0x8BFD, 0xB7CC, + 0x8BFE, 0xBFCE, + 0x8BFF, 0xDAC3, + 0x8C00, 0xDAC4, + 0x8C01, 0xCBAD, + 0x8C02, 0xDAC5, + 0x8C03, 0xB5F7, + 0x8C04, 0xDAC6, + 0x8C05, 0xC1C2, + 0x8C06, 0xD7BB, + 0x8C07, 0xDAC7, + 0x8C08, 0xCCB8, + 0x8C0A, 0xD2EA, + 0x8C0B, 0xC4B1, + 0x8C0C, 0xDAC8, + 0x8C0D, 0xB5FD, + 0x8C0E, 0xBBD1, + 0x8C0F, 0xDAC9, + 0x8C10, 0xD0B3, + 0x8C11, 0xDACA, + 0x8C12, 0xDACB, + 0x8C13, 0xCEBD, + 0x8C14, 0xDACC, + 0x8C15, 0xDACD, + 0x8C16, 0xDACE, + 0x8C17, 0xB2F7, + 0x8C18, 0xDAD1, + 0x8C19, 0xDACF, + 0x8C1A, 0xD1E8, + 0x8C1B, 0xDAD0, + 0x8C1C, 0xC3D5, + 0x8C1D, 0xDAD2, + 0x8C1F, 0xDAD3, + 0x8C20, 0xDAD4, + 0x8C21, 0xDAD5, + 0x8C22, 0xD0BB, + 0x8C23, 0xD2A5, + 0x8C24, 0xB0F9, + 0x8C25, 0xDAD6, + 0x8C26, 0xC7AB, + 0x8C27, 0xDAD7, + 0x8C28, 0xBDF7, + 0x8C29, 0xC3A1, + 0x8C2A, 0xDAD8, + 0x8C2B, 0xDAD9, + 0x8C2C, 0xC3FD, + 0x8C2D, 0xCCB7, + 0x8C2E, 0xDADA, + 0x8C2F, 0xDADB, + 0x8C30, 0xC0BE, + 0x8C31, 0xC6D7, + 0x8C32, 0xDADC, + 0x8C33, 0xDADD, + 0x8C34, 0xC7B4, + 0x8C35, 0xDADE, + 0x8C36, 0xDADF, + 0x8C37, 0xB9C8, + 0x8C41, 0xBBED, + 0x8C46, 0xB6B9, + 0x8C47, 0xF4F8, + 0x8C49, 0xF4F9, + 0x8C4C, 0xCDE3, + 0x8C55, 0xF5B9, + 0x8C5A, 0xEBE0, + 0x8C61, 0xCFF3, + 0x8C62, 0xBBBF, + 0x8C6A, 0xBAC0, + 0x8C6B, 0xD4A5, + 0x8C73, 0xE1D9, + 0x8C78, 0xF5F4, + 0x8C79, 0xB1AA, + 0x8C7A, 0xB2F2, + 0x8C82, 0xF5F5, + 0x8C85, 0xF5F7, + 0x8C89, 0xBAD1, + 0x8C8A, 0xF5F6, + 0x8C8C, 0xC3B2, + 0x8C94, 0xF5F9, + 0x8C98, 0xF5F8, + 0x8D1D, 0xB1B4, + 0x8D1E, 0xD5EA, + 0x8D1F, 0xB8BA, + 0x8D21, 0xB9B1, + 0x8D22, 0xB2C6, + 0x8D23, 0xD4F0, + 0x8D24, 0xCFCD, + 0x8D25, 0xB0DC, + 0x8D26, 0xD5CB, + 0x8D27, 0xBBF5, + 0x8D28, 0xD6CA, + 0x8D29, 0xB7B7, + 0x8D2A, 0xCCB0, + 0x8D2B, 0xC6B6, + 0x8D2C, 0xB1E1, + 0x8D2D, 0xB9BA, + 0x8D2E, 0xD6FC, + 0x8D2F, 0xB9E1, + 0x8D30, 0xB7A1, + 0x8D31, 0xBCFA, + 0x8D32, 0xEADA, + 0x8D33, 0xEADB, + 0x8D34, 0xCCF9, + 0x8D35, 0xB9F3, + 0x8D36, 0xEADC, + 0x8D37, 0xB4FB, + 0x8D38, 0xC3B3, + 0x8D39, 0xB7D1, + 0x8D3A, 0xBAD8, + 0x8D3B, 0xEADD, + 0x8D3C, 0xD4F4, + 0x8D3D, 0xEADE, + 0x8D3E, 0xBCD6, + 0x8D3F, 0xBBDF, + 0x8D40, 0xEADF, + 0x8D41, 0xC1DE, + 0x8D42, 0xC2B8, + 0x8D43, 0xD4DF, + 0x8D44, 0xD7CA, + 0x8D45, 0xEAE0, + 0x8D46, 0xEAE1, + 0x8D47, 0xEAE4, + 0x8D48, 0xEAE2, + 0x8D49, 0xEAE3, + 0x8D4A, 0xC9DE, + 0x8D4B, 0xB8B3, + 0x8D4C, 0xB6C4, + 0x8D4D, 0xEAE5, + 0x8D4E, 0xCAEA, + 0x8D4F, 0xC9CD, + 0x8D50, 0xB4CD, + 0x8D53, 0xE2D9, + 0x8D54, 0xC5E2, + 0x8D55, 0xEAE6, + 0x8D56, 0xC0B5, + 0x8D58, 0xD7B8, + 0x8D59, 0xEAE7, + 0x8D5A, 0xD7AC, + 0x8D5B, 0xC8FC, + 0x8D5C, 0xD8D3, + 0x8D5D, 0xD8CD, + 0x8D5E, 0xD4DE, + 0x8D60, 0xD4F9, + 0x8D61, 0xC9C4, + 0x8D62, 0xD3AE, + 0x8D63, 0xB8D3, + 0x8D64, 0xB3E0, + 0x8D66, 0xC9E2, + 0x8D67, 0xF4F6, + 0x8D6B, 0xBAD5, + 0x8D6D, 0xF4F7, + 0x8D70, 0xD7DF, + 0x8D73, 0xF4F1, + 0x8D74, 0xB8B0, + 0x8D75, 0xD5D4, + 0x8D76, 0xB8CF, + 0x8D77, 0xC6F0, + 0x8D81, 0xB3C3, + 0x8D84, 0xF4F2, + 0x8D85, 0xB3AC, + 0x8D8A, 0xD4BD, + 0x8D8B, 0xC7F7, + 0x8D91, 0xF4F4, + 0x8D94, 0xF4F3, + 0x8D9F, 0xCCCB, + 0x8DA3, 0xC8A4, + 0x8DB1, 0xF4F5, + 0x8DB3, 0xD7E3, + 0x8DB4, 0xC5BF, + 0x8DB5, 0xF5C0, + 0x8DB8, 0xF5BB, + 0x8DBA, 0xF5C3, + 0x8DBC, 0xF5C2, + 0x8DBE, 0xD6BA, + 0x8DBF, 0xF5C1, + 0x8DC3, 0xD4BE, + 0x8DC4, 0xF5C4, + 0x8DC6, 0xF5CC, + 0x8DCB, 0xB0CF, + 0x8DCC, 0xB5F8, + 0x8DCE, 0xF5C9, + 0x8DCF, 0xF5CA, + 0x8DD1, 0xC5DC, + 0x8DD6, 0xF5C5, + 0x8DD7, 0xF5C6, + 0x8DDA, 0xF5C7, + 0x8DDB, 0xF5CB, + 0x8DDD, 0xBEE0, + 0x8DDE, 0xF5C8, + 0x8DDF, 0xB8FA, + 0x8DE3, 0xF5D0, + 0x8DE4, 0xF5D3, + 0x8DE8, 0xBFE7, + 0x8DEA, 0xB9F2, + 0x8DEB, 0xF5BC, + 0x8DEC, 0xF5CD, + 0x8DEF, 0xC2B7, + 0x8DF3, 0xCCF8, + 0x8DF5, 0xBCF9, + 0x8DF7, 0xF5CE, + 0x8DF8, 0xF5CF, + 0x8DF9, 0xF5D1, + 0x8DFA, 0xB6E5, + 0x8DFB, 0xF5D2, + 0x8DFD, 0xF5D5, + 0x8E05, 0xF5BD, + 0x8E09, 0xF5D4, + 0x8E0A, 0xD3BB, + 0x8E0C, 0xB3EC, + 0x8E0F, 0xCCA4, + 0x8E14, 0xF5D6, + 0x8E1D, 0xF5D7, + 0x8E1E, 0xBEE1, + 0x8E1F, 0xF5D8, + 0x8E22, 0xCCDF, + 0x8E23, 0xF5DB, + 0x8E29, 0xB2C8, + 0x8E2A, 0xD7D9, + 0x8E2C, 0xF5D9, + 0x8E2E, 0xF5DA, + 0x8E2F, 0xF5DC, + 0x8E31, 0xF5E2, + 0x8E35, 0xF5E0, + 0x8E39, 0xF5DF, + 0x8E3A, 0xF5DD, + 0x8E3D, 0xF5E1, + 0x8E40, 0xF5DE, + 0x8E41, 0xF5E4, + 0x8E42, 0xF5E5, + 0x8E44, 0xCCE3, + 0x8E47, 0xE5BF, + 0x8E48, 0xB5B8, + 0x8E49, 0xF5E3, + 0x8E4A, 0xF5E8, + 0x8E4B, 0xCCA3, + 0x8E51, 0xF5E6, + 0x8E52, 0xF5E7, + 0x8E59, 0xF5BE, + 0x8E66, 0xB1C4, + 0x8E69, 0xF5BF, + 0x8E6C, 0xB5C5, + 0x8E6D, 0xB2E4, + 0x8E6F, 0xF5EC, + 0x8E70, 0xF5E9, + 0x8E72, 0xB6D7, + 0x8E74, 0xF5ED, + 0x8E76, 0xF5EA, + 0x8E7C, 0xF5EB, + 0x8E7F, 0xB4DA, + 0x8E81, 0xD4EA, + 0x8E85, 0xF5EE, + 0x8E87, 0xB3F9, + 0x8E8F, 0xF5EF, + 0x8E90, 0xF5F1, + 0x8E94, 0xF5F0, + 0x8E9C, 0xF5F2, + 0x8E9E, 0xF5F3, + 0x8EAB, 0xC9ED, + 0x8EAC, 0xB9AA, + 0x8EAF, 0xC7FB, + 0x8EB2, 0xB6E3, + 0x8EBA, 0xCCC9, + 0x8ECE, 0xEAA6, + 0x8F66, 0xB3B5, + 0x8F67, 0xD4FE, + 0x8F68, 0xB9EC, + 0x8F69, 0xD0F9, + 0x8F6B, 0xE9ED, + 0x8F6C, 0xD7AA, + 0x8F6D, 0xE9EE, + 0x8F6E, 0xC2D6, + 0x8F6F, 0xC8ED, + 0x8F70, 0xBAE4, + 0x8F71, 0xE9EF, + 0x8F72, 0xE9F0, + 0x8F73, 0xE9F1, + 0x8F74, 0xD6E1, + 0x8F75, 0xE9F2, + 0x8F76, 0xE9F3, + 0x8F77, 0xE9F5, + 0x8F78, 0xE9F4, + 0x8F79, 0xE9F6, + 0x8F7A, 0xE9F7, + 0x8F7B, 0xC7E1, + 0x8F7C, 0xE9F8, + 0x8F7D, 0xD4D8, + 0x8F7E, 0xE9F9, + 0x8F7F, 0xBDCE, + 0x8F81, 0xE9FA, + 0x8F82, 0xE9FB, + 0x8F83, 0xBDCF, + 0x8F84, 0xE9FC, + 0x8F85, 0xB8A8, + 0x8F86, 0xC1BE, + 0x8F87, 0xE9FD, + 0x8F88, 0xB1B2, + 0x8F89, 0xBBD4, + 0x8F8A, 0xB9F5, + 0x8F8B, 0xE9FE, + 0x8F8D, 0xEAA1, + 0x8F8E, 0xEAA2, + 0x8F8F, 0xEAA3, + 0x8F90, 0xB7F8, + 0x8F91, 0xBCAD, + 0x8F93, 0xCAE4, + 0x8F94, 0xE0CE, + 0x8F95, 0xD4AF, + 0x8F96, 0xCFBD, + 0x8F97, 0xD5B7, + 0x8F98, 0xEAA4, + 0x8F99, 0xD5DE, + 0x8F9A, 0xEAA5, + 0x8F9B, 0xD0C1, + 0x8F9C, 0xB9BC, + 0x8F9E, 0xB4C7, + 0x8F9F, 0xB1D9, + 0x8FA3, 0xC0B1, + 0x8FA8, 0xB1E6, + 0x8FA9, 0xB1E7, + 0x8FAB, 0xB1E8, + 0x8FB0, 0xB3BD, + 0x8FB1, 0xC8E8, + 0x8FB6, 0xE5C1, + 0x8FB9, 0xB1DF, + 0x8FBD, 0xC1C9, + 0x8FBE, 0xB4EF, + 0x8FC1, 0xC7A8, + 0x8FC2, 0xD3D8, + 0x8FC4, 0xC6F9, + 0x8FC5, 0xD1B8, + 0x8FC7, 0xB9FD, + 0x8FC8, 0xC2F5, + 0x8FCE, 0xD3AD, + 0x8FD0, 0xD4CB, + 0x8FD1, 0xBDFC, + 0x8FD3, 0xE5C2, + 0x8FD4, 0xB7B5, + 0x8FD5, 0xE5C3, + 0x8FD8, 0xBBB9, + 0x8FD9, 0xD5E2, + 0x8FDB, 0xBDF8, + 0x8FDC, 0xD4B6, + 0x8FDD, 0xCEA5, + 0x8FDE, 0xC1AC, + 0x8FDF, 0xB3D9, + 0x8FE2, 0xCCF6, + 0x8FE4, 0xE5C6, + 0x8FE5, 0xE5C4, + 0x8FE6, 0xE5C8, + 0x8FE8, 0xE5CA, + 0x8FE9, 0xE5C7, + 0x8FEA, 0xB5CF, + 0x8FEB, 0xC6C8, + 0x8FED, 0xB5FC, + 0x8FEE, 0xE5C5, + 0x8FF0, 0xCAF6, + 0x8FF3, 0xE5C9, + 0x8FF7, 0xC3D4, + 0x8FF8, 0xB1C5, + 0x8FF9, 0xBCA3, + 0x8FFD, 0xD7B7, + 0x9000, 0xCDCB, + 0x9001, 0xCBCD, + 0x9002, 0xCACA, + 0x9003, 0xCCD3, + 0x9004, 0xE5CC, + 0x9005, 0xE5CB, + 0x9006, 0xC4E6, + 0x9009, 0xD1A1, + 0x900A, 0xD1B7, + 0x900B, 0xE5CD, + 0x900D, 0xE5D0, + 0x900F, 0xCDB8, + 0x9010, 0xD6F0, + 0x9011, 0xE5CF, + 0x9012, 0xB5DD, + 0x9014, 0xCDBE, + 0x9016, 0xE5D1, + 0x9017, 0xB6BA, + 0x901A, 0xCDA8, + 0x901B, 0xB9E4, + 0x901D, 0xCAC5, + 0x901E, 0xB3D1, + 0x901F, 0xCBD9, + 0x9020, 0xD4EC, + 0x9021, 0xE5D2, + 0x9022, 0xB7EA, + 0x9026, 0xE5CE, + 0x902D, 0xE5D5, + 0x902E, 0xB4FE, + 0x902F, 0xE5D6, + 0x9035, 0xE5D3, + 0x9036, 0xE5D4, + 0x9038, 0xD2DD, + 0x903B, 0xC2DF, + 0x903C, 0xB1C6, + 0x903E, 0xD3E2, + 0x9041, 0xB6DD, + 0x9042, 0xCBEC, + 0x9044, 0xE5D7, + 0x9047, 0xD3F6, + 0x904D, 0xB1E9, + 0x904F, 0xB6F4, + 0x9050, 0xE5DA, + 0x9051, 0xE5D8, + 0x9052, 0xE5D9, + 0x9053, 0xB5C0, + 0x9057, 0xD2C5, + 0x9058, 0xE5DC, + 0x905B, 0xE5DE, + 0x9062, 0xE5DD, + 0x9063, 0xC7B2, + 0x9065, 0xD2A3, + 0x9068, 0xE5DB, + 0x906D, 0xD4E2, + 0x906E, 0xD5DA, + 0x9074, 0xE5E0, + 0x9075, 0xD7F1, + 0x907D, 0xE5E1, + 0x907F, 0xB1DC, + 0x9080, 0xD1FB, + 0x9082, 0xE5E2, + 0x9083, 0xE5E4, + 0x9088, 0xE5E3, + 0x908B, 0xE5E5, + 0x9091, 0xD2D8, + 0x9093, 0xB5CB, + 0x9095, 0xE7DF, + 0x9097, 0xDAF5, + 0x9099, 0xDAF8, + 0x909B, 0xDAF6, + 0x909D, 0xDAF7, + 0x90A1, 0xDAFA, + 0x90A2, 0xD0CF, + 0x90A3, 0xC4C7, + 0x90A6, 0xB0EE, + 0x90AA, 0xD0B0, + 0x90AC, 0xDAF9, + 0x90AE, 0xD3CA, + 0x90AF, 0xBAAA, + 0x90B0, 0xDBA2, + 0x90B1, 0xC7F1, + 0x90B3, 0xDAFC, + 0x90B4, 0xDAFB, + 0x90B5, 0xC9DB, + 0x90B6, 0xDAFD, + 0x90B8, 0xDBA1, + 0x90B9, 0xD7DE, + 0x90BA, 0xDAFE, + 0x90BB, 0xC1DA, + 0x90BE, 0xDBA5, + 0x90C1, 0xD3F4, + 0x90C4, 0xDBA7, + 0x90C5, 0xDBA4, + 0x90C7, 0xDBA8, + 0x90CA, 0xBDBC, + 0x90CE, 0xC0C9, + 0x90CF, 0xDBA3, + 0x90D0, 0xDBA6, + 0x90D1, 0xD6A3, + 0x90D3, 0xDBA9, + 0x90D7, 0xDBAD, + 0x90DB, 0xDBAE, + 0x90DC, 0xDBAC, + 0x90DD, 0xBAC2, + 0x90E1, 0xBFA4, + 0x90E2, 0xDBAB, + 0x90E6, 0xDBAA, + 0x90E7, 0xD4C7, + 0x90E8, 0xB2BF, + 0x90EB, 0xDBAF, + 0x90ED, 0xB9F9, + 0x90EF, 0xDBB0, + 0x90F4, 0xB3BB, + 0x90F8, 0xB5A6, + 0x90FD, 0xB6BC, + 0x90FE, 0xDBB1, + 0x9102, 0xB6F5, + 0x9104, 0xDBB2, + 0x9119, 0xB1C9, + 0x911E, 0xDBB4, + 0x9122, 0xDBB3, + 0x9123, 0xDBB5, + 0x912F, 0xDBB7, + 0x9131, 0xDBB6, + 0x9139, 0xDBB8, + 0x9143, 0xDBB9, + 0x9146, 0xDBBA, + 0x9149, 0xD3CF, + 0x914A, 0xF4FA, + 0x914B, 0xC7F5, + 0x914C, 0xD7C3, + 0x914D, 0xC5E4, + 0x914E, 0xF4FC, + 0x914F, 0xF4FD, + 0x9150, 0xF4FB, + 0x9152, 0xBEC6, + 0x9157, 0xD0EF, + 0x915A, 0xB7D3, + 0x915D, 0xD4CD, + 0x915E, 0xCCAA, + 0x9161, 0xF5A2, + 0x9162, 0xF5A1, + 0x9163, 0xBAA8, + 0x9164, 0xF4FE, + 0x9165, 0xCBD6, + 0x9169, 0xF5A4, + 0x916A, 0xC0D2, + 0x916C, 0xB3EA, + 0x916E, 0xCDAA, + 0x916F, 0xF5A5, + 0x9170, 0xF5A3, + 0x9171, 0xBDB4, + 0x9172, 0xF5A8, + 0x9174, 0xF5A9, + 0x9175, 0xBDCD, + 0x9176, 0xC3B8, + 0x9177, 0xBFE1, + 0x9178, 0xCBE1, + 0x9179, 0xF5AA, + 0x917D, 0xF5A6, + 0x917E, 0xF5A7, + 0x917F, 0xC4F0, + 0x9185, 0xF5AC, + 0x9187, 0xB4BC, + 0x9189, 0xD7ED, + 0x918B, 0xB4D7, + 0x918C, 0xF5AB, + 0x918D, 0xF5AE, + 0x9190, 0xF5AD, + 0x9191, 0xF5AF, + 0x9192, 0xD0D1, + 0x919A, 0xC3D1, + 0x919B, 0xC8A9, + 0x91A2, 0xF5B0, + 0x91A3, 0xF5B1, + 0x91AA, 0xF5B2, + 0x91AD, 0xF5B3, + 0x91AE, 0xF5B4, + 0x91AF, 0xF5B5, + 0x91B4, 0xF5B7, + 0x91B5, 0xF5B6, + 0x91BA, 0xF5B8, + 0x91C7, 0xB2C9, + 0x91C9, 0xD3D4, + 0x91CA, 0xCACD, + 0x91CC, 0xC0EF, + 0x91CD, 0xD6D8, + 0x91CE, 0xD2B0, + 0x91CF, 0xC1BF, + 0x91D1, 0xBDF0, + 0x91DC, 0xB8AA, + 0x9274, 0xBCF8, + 0x928E, 0xF6C6, + 0x92AE, 0xF6C7, + 0x92C8, 0xF6C8, + 0x933E, 0xF6C9, + 0x936A, 0xF6CA, + 0x938F, 0xF6CC, + 0x93CA, 0xF6CB, + 0x93D6, 0xF7E9, + 0x943E, 0xF6CD, + 0x946B, 0xF6CE, + 0x9485, 0xEEC4, + 0x9486, 0xEEC5, + 0x9487, 0xEEC6, + 0x9488, 0xD5EB, + 0x9489, 0xB6A4, + 0x948A, 0xEEC8, + 0x948B, 0xEEC7, + 0x948C, 0xEEC9, + 0x948D, 0xEECA, + 0x948E, 0xC7A5, + 0x948F, 0xEECB, + 0x9490, 0xEECC, + 0x9492, 0xB7B0, + 0x9493, 0xB5F6, + 0x9494, 0xEECD, + 0x9495, 0xEECF, + 0x9497, 0xEECE, + 0x9499, 0xB8C6, + 0x949A, 0xEED0, + 0x949B, 0xEED1, + 0x949C, 0xEED2, + 0x949D, 0xB6DB, + 0x949E, 0xB3AE, + 0x949F, 0xD6D3, + 0x94A0, 0xC4C6, + 0x94A1, 0xB1B5, + 0x94A2, 0xB8D6, + 0x94A3, 0xEED3, + 0x94A4, 0xEED4, + 0x94A5, 0xD4BF, + 0x94A6, 0xC7D5, + 0x94A7, 0xBEFB, + 0x94A8, 0xCED9, + 0x94A9, 0xB9B3, + 0x94AA, 0xEED6, + 0x94AB, 0xEED5, + 0x94AC, 0xEED8, + 0x94AD, 0xEED7, + 0x94AE, 0xC5A5, + 0x94AF, 0xEED9, + 0x94B0, 0xEEDA, + 0x94B1, 0xC7AE, + 0x94B2, 0xEEDB, + 0x94B3, 0xC7AF, + 0x94B4, 0xEEDC, + 0x94B5, 0xB2A7, + 0x94B6, 0xEEDD, + 0x94B7, 0xEEDE, + 0x94B8, 0xEEDF, + 0x94B9, 0xEEE0, + 0x94BA, 0xEEE1, + 0x94BB, 0xD7EA, + 0x94BC, 0xEEE2, + 0x94BD, 0xEEE3, + 0x94BE, 0xBCD8, + 0x94BF, 0xEEE4, + 0x94C0, 0xD3CB, + 0x94C1, 0xCCFA, + 0x94C2, 0xB2AC, + 0x94C3, 0xC1E5, + 0x94C4, 0xEEE5, + 0x94C5, 0xC7A6, + 0x94C6, 0xC3AD, + 0x94C8, 0xEEE6, + 0x94C9, 0xEEE7, + 0x94CA, 0xEEE8, + 0x94CB, 0xEEE9, + 0x94CC, 0xEEEA, + 0x94CD, 0xEEEB, + 0x94CE, 0xEEEC, + 0x94D0, 0xEEED, + 0x94D1, 0xEEEE, + 0x94D2, 0xEEEF, + 0x94D5, 0xEEF0, + 0x94D6, 0xEEF1, + 0x94D7, 0xEEF2, + 0x94D8, 0xEEF4, + 0x94D9, 0xEEF3, + 0x94DB, 0xEEF5, + 0x94DC, 0xCDAD, + 0x94DD, 0xC2C1, + 0x94DE, 0xEEF6, + 0x94DF, 0xEEF7, + 0x94E0, 0xEEF8, + 0x94E1, 0xD5A1, + 0x94E2, 0xEEF9, + 0x94E3, 0xCFB3, + 0x94E4, 0xEEFA, + 0x94E5, 0xEEFB, + 0x94E7, 0xEEFC, + 0x94E8, 0xEEFD, + 0x94E9, 0xEFA1, + 0x94EA, 0xEEFE, + 0x94EB, 0xEFA2, + 0x94EC, 0xB8F5, + 0x94ED, 0xC3FA, + 0x94EE, 0xEFA3, + 0x94EF, 0xEFA4, + 0x94F0, 0xBDC2, + 0x94F1, 0xD2BF, + 0x94F2, 0xB2F9, + 0x94F3, 0xEFA5, + 0x94F4, 0xEFA6, + 0x94F5, 0xEFA7, + 0x94F6, 0xD2F8, + 0x94F7, 0xEFA8, + 0x94F8, 0xD6FD, + 0x94F9, 0xEFA9, + 0x94FA, 0xC6CC, + 0x94FC, 0xEFAA, + 0x94FD, 0xEFAB, + 0x94FE, 0xC1B4, + 0x94FF, 0xEFAC, + 0x9500, 0xCFFA, + 0x9501, 0xCBF8, + 0x9502, 0xEFAE, + 0x9503, 0xEFAD, + 0x9504, 0xB3FA, + 0x9505, 0xB9F8, + 0x9506, 0xEFAF, + 0x9507, 0xEFB0, + 0x9508, 0xD0E2, + 0x9509, 0xEFB1, + 0x950A, 0xEFB2, + 0x950B, 0xB7E6, + 0x950C, 0xD0BF, + 0x950D, 0xEFB3, + 0x950E, 0xEFB4, + 0x950F, 0xEFB5, + 0x9510, 0xC8F1, + 0x9511, 0xCCE0, + 0x9512, 0xEFB6, + 0x9513, 0xEFB7, + 0x9514, 0xEFB8, + 0x9515, 0xEFB9, + 0x9516, 0xEFBA, + 0x9517, 0xD5E0, + 0x9518, 0xEFBB, + 0x9519, 0xB4ED, + 0x951A, 0xC3AA, + 0x951B, 0xEFBC, + 0x951D, 0xEFBD, + 0x951E, 0xEFBE, + 0x951F, 0xEFBF, + 0x9521, 0xCEFD, + 0x9522, 0xEFC0, + 0x9523, 0xC2E0, + 0x9524, 0xB4B8, + 0x9525, 0xD7B6, + 0x9526, 0xBDF5, + 0x9528, 0xCFC7, + 0x9529, 0xEFC3, + 0x952A, 0xEFC1, + 0x952B, 0xEFC2, + 0x952C, 0xEFC4, + 0x952D, 0xB6A7, + 0x952E, 0xBCFC, + 0x952F, 0xBEE2, + 0x9530, 0xC3CC, + 0x9531, 0xEFC5, + 0x9532, 0xEFC6, + 0x9534, 0xEFC7, + 0x9535, 0xEFCF, + 0x9536, 0xEFC8, + 0x9537, 0xEFC9, + 0x9538, 0xEFCA, + 0x9539, 0xC7C2, + 0x953A, 0xEFF1, + 0x953B, 0xB6CD, + 0x953C, 0xEFCB, + 0x953E, 0xEFCC, + 0x953F, 0xEFCD, + 0x9540, 0xB6C6, + 0x9541, 0xC3BE, + 0x9542, 0xEFCE, + 0x9544, 0xEFD0, + 0x9545, 0xEFD1, + 0x9546, 0xEFD2, + 0x9547, 0xD5F2, + 0x9549, 0xEFD3, + 0x954A, 0xC4F7, + 0x954C, 0xEFD4, + 0x954D, 0xC4F8, + 0x954E, 0xEFD5, + 0x954F, 0xEFD6, + 0x9550, 0xB8E4, + 0x9551, 0xB0F7, + 0x9552, 0xEFD7, + 0x9553, 0xEFD8, + 0x9554, 0xEFD9, + 0x9556, 0xEFDA, + 0x9557, 0xEFDB, + 0x9558, 0xEFDC, + 0x9559, 0xEFDD, + 0x955B, 0xEFDE, + 0x955C, 0xBEB5, + 0x955D, 0xEFE1, + 0x955E, 0xEFDF, + 0x955F, 0xEFE0, + 0x9561, 0xEFE2, + 0x9562, 0xEFE3, + 0x9563, 0xC1CD, + 0x9564, 0xEFE4, + 0x9565, 0xEFE5, + 0x9566, 0xEFE6, + 0x9567, 0xEFE7, + 0x9568, 0xEFE8, + 0x9569, 0xEFE9, + 0x956A, 0xEFEA, + 0x956B, 0xEFEB, + 0x956C, 0xEFEC, + 0x956D, 0xC0D8, + 0x956F, 0xEFED, + 0x9570, 0xC1AD, + 0x9571, 0xEFEE, + 0x9572, 0xEFEF, + 0x9573, 0xEFF0, + 0x9576, 0xCFE2, + 0x957F, 0xB3A4, + 0x95E8, 0xC3C5, + 0x95E9, 0xE3C5, + 0x95EA, 0xC9C1, + 0x95EB, 0xE3C6, + 0x95ED, 0xB1D5, + 0x95EE, 0xCECA, + 0x95EF, 0xB4B3, + 0x95F0, 0xC8F2, + 0x95F1, 0xE3C7, + 0x95F2, 0xCFD0, + 0x95F3, 0xE3C8, + 0x95F4, 0xBCE4, + 0x95F5, 0xE3C9, + 0x95F6, 0xE3CA, + 0x95F7, 0xC3C6, + 0x95F8, 0xD5A2, + 0x95F9, 0xC4D6, + 0x95FA, 0xB9EB, + 0x95FB, 0xCEC5, + 0x95FC, 0xE3CB, + 0x95FD, 0xC3F6, + 0x95FE, 0xE3CC, + 0x9600, 0xB7A7, + 0x9601, 0xB8F3, + 0x9602, 0xBAD2, + 0x9603, 0xE3CD, + 0x9604, 0xE3CE, + 0x9605, 0xD4C4, + 0x9606, 0xE3CF, + 0x9608, 0xE3D0, + 0x9609, 0xD1CB, + 0x960A, 0xE3D1, + 0x960B, 0xE3D2, + 0x960C, 0xE3D3, + 0x960D, 0xE3D4, + 0x960E, 0xD1D6, + 0x960F, 0xE3D5, + 0x9610, 0xB2FB, + 0x9611, 0xC0BB, + 0x9612, 0xE3D6, + 0x9614, 0xC0AB, + 0x9615, 0xE3D7, + 0x9616, 0xE3D8, + 0x9617, 0xE3D9, + 0x9619, 0xE3DA, + 0x961A, 0xE3DB, + 0x961C, 0xB8B7, + 0x961D, 0xDAE2, + 0x961F, 0xB6D3, + 0x9621, 0xDAE4, + 0x9622, 0xDAE3, + 0x962A, 0xDAE6, + 0x962E, 0xC8EE, + 0x9631, 0xDAE5, + 0x9632, 0xB7C0, + 0x9633, 0xD1F4, + 0x9634, 0xD2F5, + 0x9635, 0xD5F3, + 0x9636, 0xBDD7, + 0x963B, 0xD7E8, + 0x963C, 0xDAE8, + 0x963D, 0xDAE7, + 0x963F, 0xB0A2, + 0x9640, 0xCDD3, + 0x9642, 0xDAE9, + 0x9644, 0xB8BD, + 0x9645, 0xBCCA, + 0x9646, 0xC2BD, + 0x9647, 0xC2A4, + 0x9648, 0xB3C2, + 0x9649, 0xDAEA, + 0x964B, 0xC2AA, + 0x964C, 0xC4B0, + 0x964D, 0xBDB5, + 0x9650, 0xCFDE, + 0x9654, 0xDAEB, + 0x9655, 0xC9C2, + 0x965B, 0xB1DD, + 0x965F, 0xDAEC, + 0x9661, 0xB6B8, + 0x9662, 0xD4BA, + 0x9664, 0xB3FD, + 0x9667, 0xDAED, + 0x9668, 0xD4C9, + 0x9669, 0xCFD5, + 0x966A, 0xC5E3, + 0x966C, 0xDAEE, + 0x9672, 0xDAEF, + 0x9674, 0xDAF0, + 0x9675, 0xC1EA, + 0x9676, 0xCCD5, + 0x9677, 0xCFDD, + 0x9685, 0xD3E7, + 0x9686, 0xC2A1, + 0x9688, 0xDAF1, + 0x968B, 0xCBE5, + 0x968D, 0xDAF2, + 0x968F, 0xCBE6, + 0x9690, 0xD2FE, + 0x9694, 0xB8F4, + 0x9697, 0xDAF3, + 0x9698, 0xB0AF, + 0x9699, 0xCFB6, + 0x969C, 0xD5CF, + 0x96A7, 0xCBED, + 0x96B0, 0xDAF4, + 0x96B3, 0xE3C4, + 0x96B6, 0xC1A5, + 0x96B9, 0xF6BF, + 0x96BC, 0xF6C0, + 0x96BD, 0xF6C1, + 0x96BE, 0xC4D1, + 0x96C0, 0xC8B8, + 0x96C1, 0xD1E3, + 0x96C4, 0xD0DB, + 0x96C5, 0xD1C5, + 0x96C6, 0xBCAF, + 0x96C7, 0xB9CD, + 0x96C9, 0xEFF4, + 0x96CC, 0xB4C6, + 0x96CD, 0xD3BA, + 0x96CE, 0xF6C2, + 0x96CF, 0xB3FB, + 0x96D2, 0xF6C3, + 0x96D5, 0xB5F1, + 0x96E0, 0xF6C5, + 0x96E8, 0xD3EA, + 0x96E9, 0xF6A7, + 0x96EA, 0xD1A9, + 0x96EF, 0xF6A9, + 0x96F3, 0xF6A8, + 0x96F6, 0xC1E3, + 0x96F7, 0xC0D7, + 0x96F9, 0xB1A2, + 0x96FE, 0xCEED, + 0x9700, 0xD0E8, + 0x9701, 0xF6AB, + 0x9704, 0xCFF6, + 0x9706, 0xF6AA, + 0x9707, 0xD5F0, + 0x9708, 0xF6AC, + 0x9709, 0xC3B9, + 0x970D, 0xBBF4, + 0x970E, 0xF6AE, + 0x970F, 0xF6AD, + 0x9713, 0xC4DE, + 0x9716, 0xC1D8, + 0x971C, 0xCBAA, + 0x971E, 0xCFBC, + 0x972A, 0xF6AF, + 0x972D, 0xF6B0, + 0x9730, 0xF6B1, + 0x9732, 0xC2B6, + 0x9738, 0xB0D4, + 0x9739, 0xC5F9, + 0x973E, 0xF6B2, + 0x9752, 0xC7E0, + 0x9753, 0xF6A6, + 0x9756, 0xBEB8, + 0x9759, 0xBEB2, + 0x975B, 0xB5E5, + 0x975E, 0xB7C7, + 0x9760, 0xBFBF, + 0x9761, 0xC3D2, + 0x9762, 0xC3E6, + 0x9765, 0xD8CC, + 0x9769, 0xB8EF, + 0x9773, 0xBDF9, + 0x9774, 0xD1A5, + 0x9776, 0xB0D0, + 0x977C, 0xF7B0, + 0x9785, 0xF7B1, + 0x978B, 0xD0AC, + 0x978D, 0xB0B0, + 0x9791, 0xF7B2, + 0x9792, 0xF7B3, + 0x9794, 0xF7B4, + 0x9798, 0xC7CA, + 0x97A0, 0xBECF, + 0x97A3, 0xF7B7, + 0x97AB, 0xF7B6, + 0x97AD, 0xB1DE, + 0x97AF, 0xF7B5, + 0x97B2, 0xF7B8, + 0x97B4, 0xF7B9, + 0x97E6, 0xCEA4, + 0x97E7, 0xC8CD, + 0x97E9, 0xBAAB, + 0x97EA, 0xE8B8, + 0x97EB, 0xE8B9, + 0x97EC, 0xE8BA, + 0x97ED, 0xBEC2, + 0x97F3, 0xD2F4, + 0x97F5, 0xD4CF, + 0x97F6, 0xC9D8, + 0x9875, 0xD2B3, + 0x9876, 0xB6A5, + 0x9877, 0xC7EA, + 0x9878, 0xF1FC, + 0x9879, 0xCFEE, + 0x987A, 0xCBB3, + 0x987B, 0xD0EB, + 0x987C, 0xE7EF, + 0x987D, 0xCDE7, + 0x987E, 0xB9CB, + 0x987F, 0xB6D9, + 0x9880, 0xF1FD, + 0x9881, 0xB0E4, + 0x9882, 0xCBCC, + 0x9883, 0xF1FE, + 0x9884, 0xD4A4, + 0x9885, 0xC2AD, + 0x9886, 0xC1EC, + 0x9887, 0xC6C4, + 0x9888, 0xBEB1, + 0x9889, 0xF2A1, + 0x988A, 0xBCD5, + 0x988C, 0xF2A2, + 0x988D, 0xF2A3, + 0x988F, 0xF2A4, + 0x9890, 0xD2C3, + 0x9891, 0xC6B5, + 0x9893, 0xCDC7, + 0x9894, 0xF2A5, + 0x9896, 0xD3B1, + 0x9897, 0xBFC5, + 0x9898, 0xCCE2, + 0x989A, 0xF2A6, + 0x989B, 0xF2A7, + 0x989C, 0xD1D5, + 0x989D, 0xB6EE, + 0x989E, 0xF2A8, + 0x989F, 0xF2A9, + 0x98A0, 0xB5DF, + 0x98A1, 0xF2AA, + 0x98A2, 0xF2AB, + 0x98A4, 0xB2FC, + 0x98A5, 0xF2AC, + 0x98A6, 0xF2AD, + 0x98A7, 0xC8A7, + 0x98CE, 0xB7E7, + 0x98D1, 0xECA9, + 0x98D2, 0xECAA, + 0x98D3, 0xECAB, + 0x98D5, 0xECAC, + 0x98D8, 0xC6AE, + 0x98D9, 0xECAD, + 0x98DA, 0xECAE, + 0x98DE, 0xB7C9, + 0x98DF, 0xCAB3, + 0x98E7, 0xE2B8, + 0x98E8, 0xF7CF, + 0x990D, 0xF7D0, + 0x9910, 0xB2CD, + 0x992E, 0xF7D1, + 0x9954, 0xF7D3, + 0x9955, 0xF7D2, + 0x9963, 0xE2BB, + 0x9965, 0xBCA2, + 0x9967, 0xE2BC, + 0x9968, 0xE2BD, + 0x9969, 0xE2BE, + 0x996A, 0xE2BF, + 0x996B, 0xE2C0, + 0x996C, 0xE2C1, + 0x996D, 0xB7B9, + 0x996E, 0xD2FB, + 0x996F, 0xBDA4, + 0x9970, 0xCACE, + 0x9971, 0xB1A5, + 0x9972, 0xCBC7, + 0x9974, 0xE2C2, + 0x9975, 0xB6FC, + 0x9976, 0xC8C4, + 0x9977, 0xE2C3, + 0x997A, 0xBDC8, + 0x997C, 0xB1FD, + 0x997D, 0xE2C4, + 0x997F, 0xB6F6, + 0x9980, 0xE2C5, + 0x9981, 0xC4D9, + 0x9984, 0xE2C6, + 0x9985, 0xCFDA, + 0x9986, 0xB9DD, + 0x9987, 0xE2C7, + 0x9988, 0xC0A1, + 0x998A, 0xE2C8, + 0x998B, 0xB2F6, + 0x998D, 0xE2C9, + 0x998F, 0xC1F3, + 0x9990, 0xE2CA, + 0x9991, 0xE2CB, + 0x9992, 0xC2F8, + 0x9993, 0xE2CC, + 0x9994, 0xE2CD, + 0x9995, 0xE2CE, + 0x9996, 0xCAD7, + 0x9997, 0xD8B8, + 0x9998, 0xD9E5, + 0x9999, 0xCFE3, + 0x99A5, 0xF0A5, + 0x99A8, 0xDCB0, + 0x9A6C, 0xC2ED, + 0x9A6D, 0xD4A6, + 0x9A6E, 0xCDD4, + 0x9A6F, 0xD1B1, + 0x9A70, 0xB3DB, + 0x9A71, 0xC7FD, + 0x9A73, 0xB2B5, + 0x9A74, 0xC2BF, + 0x9A75, 0xE6E0, + 0x9A76, 0xCABB, + 0x9A77, 0xE6E1, + 0x9A78, 0xE6E2, + 0x9A79, 0xBED4, + 0x9A7A, 0xE6E3, + 0x9A7B, 0xD7A4, + 0x9A7C, 0xCDD5, + 0x9A7D, 0xE6E5, + 0x9A7E, 0xBCDD, + 0x9A7F, 0xE6E4, + 0x9A80, 0xE6E6, + 0x9A81, 0xE6E7, + 0x9A82, 0xC2EE, + 0x9A84, 0xBDBE, + 0x9A85, 0xE6E8, + 0x9A86, 0xC2E6, + 0x9A87, 0xBAA7, + 0x9A88, 0xE6E9, + 0x9A8A, 0xE6EA, + 0x9A8B, 0xB3D2, + 0x9A8C, 0xD1E9, + 0x9A8F, 0xBFA5, + 0x9A90, 0xE6EB, + 0x9A91, 0xC6EF, + 0x9A92, 0xE6EC, + 0x9A93, 0xE6ED, + 0x9A96, 0xE6EE, + 0x9A97, 0xC6AD, + 0x9A98, 0xE6EF, + 0x9A9A, 0xC9A7, + 0x9A9B, 0xE6F0, + 0x9A9C, 0xE6F1, + 0x9A9D, 0xE6F2, + 0x9A9E, 0xE5B9, + 0x9A9F, 0xE6F3, + 0x9AA0, 0xE6F4, + 0x9AA1, 0xC2E2, + 0x9AA2, 0xE6F5, + 0x9AA3, 0xE6F6, + 0x9AA4, 0xD6E8, + 0x9AA5, 0xE6F7, + 0x9AA7, 0xE6F8, + 0x9AA8, 0xB9C7, + 0x9AB0, 0xF7BB, + 0x9AB1, 0xF7BA, + 0x9AB6, 0xF7BE, + 0x9AB7, 0xF7BC, + 0x9AB8, 0xBAA1, + 0x9ABA, 0xF7BF, + 0x9ABC, 0xF7C0, + 0x9AC0, 0xF7C2, + 0x9AC1, 0xF7C1, + 0x9AC2, 0xF7C4, + 0x9AC5, 0xF7C3, + 0x9ACB, 0xF7C5, + 0x9ACC, 0xF7C6, + 0x9AD1, 0xF7C7, + 0x9AD3, 0xCBE8, + 0x9AD8, 0xB8DF, + 0x9ADF, 0xF7D4, + 0x9AE1, 0xF7D5, + 0x9AE6, 0xF7D6, + 0x9AEB, 0xF7D8, + 0x9AED, 0xF7DA, + 0x9AEF, 0xF7D7, + 0x9AF9, 0xF7DB, + 0x9AFB, 0xF7D9, + 0x9B03, 0xD7D7, + 0x9B08, 0xF7DC, + 0x9B0F, 0xF7DD, + 0x9B13, 0xF7DE, + 0x9B1F, 0xF7DF, + 0x9B23, 0xF7E0, + 0x9B2F, 0xDBCB, + 0x9B32, 0xD8AA, + 0x9B3B, 0xE5F7, + 0x9B3C, 0xB9ED, + 0x9B41, 0xBFFD, + 0x9B42, 0xBBEA, + 0x9B43, 0xF7C9, + 0x9B44, 0xC6C7, + 0x9B45, 0xF7C8, + 0x9B47, 0xF7CA, + 0x9B48, 0xF7CC, + 0x9B49, 0xF7CB, + 0x9B4D, 0xF7CD, + 0x9B4F, 0xCEBA, + 0x9B51, 0xF7CE, + 0x9B54, 0xC4A7, + 0x9C7C, 0xD3E3, + 0x9C7F, 0xF6CF, + 0x9C81, 0xC2B3, + 0x9C82, 0xF6D0, + 0x9C85, 0xF6D1, + 0x9C86, 0xF6D2, + 0x9C87, 0xF6D3, + 0x9C88, 0xF6D4, + 0x9C8B, 0xF6D6, + 0x9C8D, 0xB1AB, + 0x9C8E, 0xF6D7, + 0x9C90, 0xF6D8, + 0x9C91, 0xF6D9, + 0x9C92, 0xF6DA, + 0x9C94, 0xF6DB, + 0x9C95, 0xF6DC, + 0x9C9A, 0xF6DD, + 0x9C9B, 0xF6DE, + 0x9C9C, 0xCFCA, + 0x9C9E, 0xF6DF, + 0x9C9F, 0xF6E0, + 0x9CA0, 0xF6E1, + 0x9CA1, 0xF6E2, + 0x9CA2, 0xF6E3, + 0x9CA3, 0xF6E4, + 0x9CA4, 0xC0F0, + 0x9CA5, 0xF6E5, + 0x9CA6, 0xF6E6, + 0x9CA7, 0xF6E7, + 0x9CA8, 0xF6E8, + 0x9CA9, 0xF6E9, + 0x9CAB, 0xF6EA, + 0x9CAD, 0xF6EB, + 0x9CAE, 0xF6EC, + 0x9CB0, 0xF6ED, + 0x9CB1, 0xF6EE, + 0x9CB2, 0xF6EF, + 0x9CB3, 0xF6F0, + 0x9CB4, 0xF6F1, + 0x9CB5, 0xF6F2, + 0x9CB6, 0xF6F3, + 0x9CB7, 0xF6F4, + 0x9CB8, 0xBEA8, + 0x9CBA, 0xF6F5, + 0x9CBB, 0xF6F6, + 0x9CBC, 0xF6F7, + 0x9CBD, 0xF6F8, + 0x9CC3, 0xC8FA, + 0x9CC4, 0xF6F9, + 0x9CC5, 0xF6FA, + 0x9CC6, 0xF6FB, + 0x9CC7, 0xF6FC, + 0x9CCA, 0xF6FD, + 0x9CCB, 0xF6FE, + 0x9CCC, 0xF7A1, + 0x9CCD, 0xF7A2, + 0x9CCE, 0xF7A3, + 0x9CCF, 0xF7A4, + 0x9CD0, 0xF7A5, + 0x9CD3, 0xF7A6, + 0x9CD4, 0xF7A7, + 0x9CD5, 0xF7A8, + 0x9CD6, 0xB1EE, + 0x9CD7, 0xF7A9, + 0x9CD8, 0xF7AA, + 0x9CD9, 0xF7AB, + 0x9CDC, 0xF7AC, + 0x9CDD, 0xF7AD, + 0x9CDE, 0xC1DB, + 0x9CDF, 0xF7AE, + 0x9CE2, 0xF7AF, + 0x9E1F, 0xC4F1, + 0x9E20, 0xF0AF, + 0x9E21, 0xBCA6, + 0x9E22, 0xF0B0, + 0x9E23, 0xC3F9, + 0x9E25, 0xC5B8, + 0x9E26, 0xD1BB, + 0x9E28, 0xF0B1, + 0x9E29, 0xF0B2, + 0x9E2A, 0xF0B3, + 0x9E2B, 0xF0B4, + 0x9E2C, 0xF0B5, + 0x9E2D, 0xD1BC, + 0x9E2F, 0xD1EC, + 0x9E31, 0xF0B7, + 0x9E32, 0xF0B6, + 0x9E33, 0xD4A7, + 0x9E35, 0xCDD2, + 0x9E36, 0xF0B8, + 0x9E37, 0xF0BA, + 0x9E38, 0xF0B9, + 0x9E39, 0xF0BB, + 0x9E3A, 0xF0BC, + 0x9E3D, 0xB8EB, + 0x9E3E, 0xF0BD, + 0x9E3F, 0xBAE8, + 0x9E41, 0xF0BE, + 0x9E42, 0xF0BF, + 0x9E43, 0xBEE9, + 0x9E44, 0xF0C0, + 0x9E45, 0xB6EC, + 0x9E46, 0xF0C1, + 0x9E47, 0xF0C2, + 0x9E48, 0xF0C3, + 0x9E49, 0xF0C4, + 0x9E4A, 0xC8B5, + 0x9E4B, 0xF0C5, + 0x9E4C, 0xF0C6, + 0x9E4E, 0xF0C7, + 0x9E4F, 0xC5F4, + 0x9E51, 0xF0C8, + 0x9E55, 0xF0C9, + 0x9E57, 0xF0CA, + 0x9E58, 0xF7BD, + 0x9E5A, 0xF0CB, + 0x9E5B, 0xF0CC, + 0x9E5C, 0xF0CD, + 0x9E5E, 0xF0CE, + 0x9E63, 0xF0CF, + 0x9E64, 0xBAD7, + 0x9E66, 0xF0D0, + 0x9E67, 0xF0D1, + 0x9E68, 0xF0D2, + 0x9E69, 0xF0D3, + 0x9E6A, 0xF0D4, + 0x9E6B, 0xF0D5, + 0x9E6C, 0xF0D6, + 0x9E6D, 0xF0D8, + 0x9E70, 0xD3A5, + 0x9E71, 0xF0D7, + 0x9E73, 0xF0D9, + 0x9E7E, 0xF5BA, + 0x9E7F, 0xC2B9, + 0x9E82, 0xF7E4, + 0x9E87, 0xF7E5, + 0x9E88, 0xF7E6, + 0x9E8B, 0xF7E7, + 0x9E92, 0xF7E8, + 0x9E93, 0xC2B4, + 0x9E9D, 0xF7EA, + 0x9E9F, 0xF7EB, + 0x9EA6, 0xC2F3, + 0x9EB4, 0xF4F0, + 0x9EB8, 0xF4EF, + 0x9EBB, 0xC2E9, + 0x9EBD, 0xF7E1, + 0x9EBE, 0xF7E2, + 0x9EC4, 0xBBC6, + 0x9EC9, 0xD9E4, + 0x9ECD, 0xCAF2, + 0x9ECE, 0xC0E8, + 0x9ECF, 0xF0A4, + 0x9ED1, 0xBADA, + 0x9ED4, 0xC7AD, + 0x9ED8, 0xC4AC, + 0x9EDB, 0xF7EC, + 0x9EDC, 0xF7ED, + 0x9EDD, 0xF7EE, + 0x9EDF, 0xF7F0, + 0x9EE0, 0xF7EF, + 0x9EE2, 0xF7F1, + 0x9EE5, 0xF7F4, + 0x9EE7, 0xF7F3, + 0x9EE9, 0xF7F2, + 0x9EEA, 0xF7F5, + 0x9EEF, 0xF7F6, + 0x9EF9, 0xEDE9, + 0x9EFB, 0xEDEA, + 0x9EFC, 0xEDEB, + 0x9EFE, 0xF6BC, + 0x9F0B, 0xF6BD, + 0x9F0D, 0xF6BE, + 0x9F0E, 0xB6A6, + 0x9F10, 0xD8BE, + 0x9F13, 0xB9C4, + 0x9F17, 0xD8BB, + 0x9F19, 0xDCB1, + 0x9F20, 0xCAF3, + 0x9F22, 0xF7F7, + 0x9F2C, 0xF7F8, + 0x9F2F, 0xF7F9, + 0x9F37, 0xF7FB, + 0x9F39, 0xF7FA, + 0x9F3B, 0xB1C7, + 0x9F3D, 0xF7FC, + 0x9F3E, 0xF7FD, + 0x9F44, 0xF7FE, + 0x9F50, 0xC6EB, + 0x9F51, 0xECB4, + 0x9F7F, 0xB3DD, + 0x9F80, 0xF6B3, + 0x9F83, 0xF6B4, + 0x9F84, 0xC1E4, + 0x9F85, 0xF6B5, + 0x9F86, 0xF6B6, + 0x9F87, 0xF6B7, + 0x9F88, 0xF6B8, + 0x9F89, 0xF6B9, + 0x9F8A, 0xF6BA, + 0x9F8B, 0xC8A3, + 0x9F8C, 0xF6BB, + 0x9F99, 0xC1FA, + 0x9F9A, 0xB9A8, + 0x9F9B, 0xEDE8, + 0x9F9F, 0xB9EA, + 0x9FA0, 0xD9DF, + 0xFF01, 0xA3A1, + 0xFF02, 0xA3A2, + 0xFF03, 0xA3A3, + 0xFF04, 0xA1E7, + 0xFF05, 0xA3A5, + 0xFF06, 0xA3A6, + 0xFF07, 0xA3A7, + 0xFF08, 0xA3A8, + 0xFF09, 0xA3A9, + 0xFF0A, 0xA3AA, + 0xFF0B, 0xA3AB, + 0xFF0C, 0xA3AC, + 0xFF0D, 0xA3AD, + 0xFF0E, 0xA3AE, + 0xFF0F, 0xA3AF, + 0xFF10, 0xA3B0, + 0xFF11, 0xA3B1, + 0xFF12, 0xA3B2, + 0xFF13, 0xA3B3, + 0xFF14, 0xA3B4, + 0xFF15, 0xA3B5, + 0xFF16, 0xA3B6, + 0xFF17, 0xA3B7, + 0xFF18, 0xA3B8, + 0xFF19, 0xA3B9, + 0xFF1A, 0xA3BA, + 0xFF1B, 0xA3BB, + 0xFF1C, 0xA3BC, + 0xFF1D, 0xA3BD, + 0xFF1E, 0xA3BE, + 0xFF1F, 0xA3BF, + 0xFF20, 0xA3C0, + 0xFF21, 0xA3C1, + 0xFF22, 0xA3C2, + 0xFF23, 0xA3C3, + 0xFF24, 0xA3C4, + 0xFF25, 0xA3C5, + 0xFF26, 0xA3C6, + 0xFF27, 0xA3C7, + 0xFF28, 0xA3C8, + 0xFF29, 0xA3C9, + 0xFF2A, 0xA3CA, + 0xFF2B, 0xA3CB, + 0xFF2C, 0xA3CC, + 0xFF2D, 0xA3CD, + 0xFF2E, 0xA3CE, + 0xFF2F, 0xA3CF, + 0xFF30, 0xA3D0, + 0xFF31, 0xA3D1, + 0xFF32, 0xA3D2, + 0xFF33, 0xA3D3, + 0xFF34, 0xA3D4, + 0xFF35, 0xA3D5, + 0xFF36, 0xA3D6, + 0xFF37, 0xA3D7, + 0xFF38, 0xA3D8, + 0xFF39, 0xA3D9, + 0xFF3A, 0xA3DA, + 0xFF3B, 0xA3DB, + 0xFF3C, 0xA3DC, + 0xFF3D, 0xA3DD, + 0xFF3E, 0xA3DE, + 0xFF3F, 0xA3DF, + 0xFF40, 0xA3E0, + 0xFF41, 0xA3E1, + 0xFF42, 0xA3E2, + 0xFF43, 0xA3E3, + 0xFF44, 0xA3E4, + 0xFF45, 0xA3E5, + 0xFF46, 0xA3E6, + 0xFF47, 0xA3E7, + 0xFF48, 0xA3E8, + 0xFF49, 0xA3E9, + 0xFF4A, 0xA3EA, + 0xFF4B, 0xA3EB, + 0xFF4C, 0xA3EC, + 0xFF4D, 0xA3ED, + 0xFF4E, 0xA3EE, + 0xFF4F, 0xA3EF, + 0xFF50, 0xA3F0, + 0xFF51, 0xA3F1, + 0xFF52, 0xA3F2, + 0xFF53, 0xA3F3, + 0xFF54, 0xA3F4, + 0xFF55, 0xA3F5, + 0xFF56, 0xA3F6, + 0xFF57, 0xA3F7, + 0xFF58, 0xA3F8, + 0xFF59, 0xA3F9, + 0xFF5A, 0xA3FA, + 0xFF5B, 0xA3FB, + 0xFF5C, 0xA3FC, + 0xFF5D, 0xA3FD, + 0xFF5E, 0xA1AB, + 0xFFE0, 0xA1E9, + 0xFFE1, 0xA1EA, + 0xFFE3, 0xA3FE, + 0xFFE5, 0xA3A4 +}; diff --git a/3rdparty/zint-2.6.1/backend/gif.c b/3rdparty/zint-2.6.1/backend/gif.c new file mode 100644 index 0000000..99aabf9 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/gif.c @@ -0,0 +1,402 @@ +/* gif.c - Handles output to gif file */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include "common.h" +#include +#ifdef _MSC_VER +#include +#include +#include +#endif + +#define SSET "0123456789ABCDEF" + +/* Index of transparent color, -1 for no transparent color + * This might be set into a variable if transparency is activated as an option + */ +#define TRANSPARENT_INDEX (-1) + +/* Used bit depth, may be changed for bigger pallet in future */ +#define DESTINATION_IMAGE_BITS 1 +#include + +typedef struct s_statestruct { + unsigned char * pOut; + unsigned char *pIn; + unsigned int InLen; + unsigned int OutLength; + unsigned int OutPosCur; + unsigned int OutByteCountPos; + unsigned short ClearCode; + unsigned short FreeCode; + char fByteCountByteSet; + unsigned char OutBitsFree; + unsigned short NodeAxon[4096]; + unsigned short NodeNext[4096]; + unsigned char NodePix[4096]; +} statestruct; + +static char BufferNextByte(statestruct *pState) { + (pState->OutPosCur)++; + /* Check if this position is a byte count position + * fg_f_bytecountbyte_set indicates, if byte count position bytes should be + * inserted in general. + * If this is true, and the distance to the last byte count position is 256 + * (e.g. 255 bytes in between), a byte count byte is inserted, and the value + * of the last one is set to 255. + * */ + if (pState->fByteCountByteSet && (pState->OutByteCountPos + 256 == pState->OutPosCur)) { + (pState->pOut)[pState->OutByteCountPos] = 255; + pState->OutByteCountPos = pState->OutPosCur; + (pState->OutPosCur)++; + } + if (pState->OutPosCur >= pState->OutLength) + return 1; + (pState->pOut)[pState->OutPosCur] = 0x00; + return 0; +} + +static char AddCodeToBuffer(statestruct *pState, unsigned short CodeIn, unsigned char CodeBits) { + /* Check, if we may fill up the current byte completely */ + if (CodeBits >= pState->OutBitsFree) { + (pState->pOut)[pState->OutPosCur] |= (unsigned char) + (CodeIn << (8 - pState->OutBitsFree)); + if (BufferNextByte(pState)) + return -1; + CodeIn = (unsigned short) (CodeIn >> pState->OutBitsFree); + CodeBits -= pState->OutBitsFree; + pState->OutBitsFree = 8; + /* Write a full byte if there are at least 8 code bits left */ + if (CodeBits >= pState->OutBitsFree) { + (pState->pOut)[pState->OutPosCur] = (unsigned char) CodeIn; + if (BufferNextByte(pState)) + return -1; + CodeIn = (unsigned short) (CodeIn >> 8); + CodeBits -= 8; + } + } + /* The remaining bits of CodeIn fit in the current byte. */ + if (CodeBits > 0) { + (pState->pOut)[pState->OutPosCur] |= (unsigned char) + (CodeIn << (8 - pState->OutBitsFree)); + pState->OutBitsFree -= CodeBits; + } + return 0; +} + +static void FlushStringTable(statestruct *pState) { + unsigned short Pos; + for (Pos = 0; Pos < pState->ClearCode; Pos++) { + (pState->NodeAxon)[Pos] = 0; + } +} + +unsigned short FindPixelOutlet(statestruct *pState, unsigned short HeadNode, unsigned char Byte) { + unsigned short Outlet; + + Outlet = (pState->NodeAxon)[HeadNode]; + while (Outlet) { + if ((pState->NodePix)[Outlet] == Byte) + return Outlet; + Outlet = (pState->NodeNext)[Outlet]; + } + return 0; +} + +static char NextCode(statestruct *pState, unsigned char * pPixelValueCur, unsigned char CodeBits) { + unsigned short UpNode; + unsigned short DownNode; + /* start with the root node for last pixel chain */ + UpNode = *pPixelValueCur; + if ((pState->InLen) == 0) + return AddCodeToBuffer(pState, UpNode, CodeBits); + + *pPixelValueCur = (*(pState->pIn)) - '0'; + (pState->pIn)++; + (pState->InLen)--; + /* Follow the string table and the data stream to the end of the longest string that has a code */ + while (0 != (DownNode = FindPixelOutlet(pState, UpNode, *pPixelValueCur))) { + UpNode = DownNode; + if ((pState->InLen) == 0) + return AddCodeToBuffer(pState, UpNode, CodeBits); + + *pPixelValueCur = (*(pState->pIn)) - '0'; + (pState->pIn)++; + (pState->InLen)--; + } + /* Submit 'UpNode' which is the code of the longest string */ + if (AddCodeToBuffer(pState, UpNode, CodeBits)) + return -1; + /* ... and extend the string by appending 'PixelValueCur' */ + /* Create a successor node for 'PixelValueCur' whose code is 'freecode' */ + (pState->NodePix)[pState->FreeCode] = *pPixelValueCur; + (pState->NodeAxon)[pState->FreeCode] = (pState->NodeNext)[pState->FreeCode] = 0; + /* ...and link it to the end of the chain emanating from fg_axon[UpNode]. */ + DownNode = (pState->NodeAxon)[UpNode]; + if (!DownNode) { + (pState->NodeAxon)[UpNode] = pState->FreeCode; + } else { + while ((pState->NodeNext)[DownNode]) { + DownNode = (pState->NodeNext)[DownNode]; + } + (pState->NodeNext)[DownNode] = pState->FreeCode; + } + return 1; +} + +int gif_lzw(unsigned char *pOut, int OutLength, unsigned char *pIn, int InLen) { + unsigned char PixelValueCur; + unsigned char CodeBits; + unsigned short Pos; + statestruct State; + + State.pIn = pIn; + State.InLen = InLen; + State.pOut = pOut; + State.OutLength = OutLength; + // > Get first data byte + if (State.InLen == 0) + return 0; + + PixelValueCur = (unsigned char) ((*(State.pIn)) - '0'); + (State.pIn)++; + (State.InLen)--; + CodeBits = 3; + State.ClearCode = 4; + State.FreeCode = 6; + State.OutBitsFree = 8; + State.OutPosCur = -1; + State.fByteCountByteSet = 0; + + if (BufferNextByte(&State)) + return 0; + + for (Pos = 0; Pos < State.ClearCode; Pos++) + State.NodePix[Pos] = (unsigned char) Pos; + + FlushStringTable(&State); + + /* Write what the GIF specification calls the "code size". */ + (State.pOut)[State.OutPosCur] = 2; + /* Reserve first bytecount byte */ + if (BufferNextByte(&State)) + return 0; + State.OutByteCountPos = State.OutPosCur; + if (BufferNextByte(&State)) + return 0; + State.fByteCountByteSet = 1; + /* Submit one 'ClearCode' as the first code */ + if (AddCodeToBuffer(&State, State.ClearCode, CodeBits)) + return 0; + + for (;;) { + char Res; + /* generate and save the next code, which may consist of multiple input pixels. */ + Res = NextCode(&State, &PixelValueCur, CodeBits); + if (Res < 0) + return 0; + //* Check for end of data stream */ + if (!Res) { + /* submit 'eoi' as the last item of the code stream */ + if (AddCodeToBuffer(&State, (unsigned short) (State.ClearCode + 1), CodeBits)) + return 0; + State.fByteCountByteSet = 0; + if (State.OutBitsFree < 8) { + if (BufferNextByte(&State)) + return 0; + } + // > Update last bytecount byte; + if (State.OutByteCountPos < State.OutPosCur) { + (State.pOut)[State.OutByteCountPos] = (unsigned char) (State.OutPosCur - State.OutByteCountPos - 1); + } + State.OutPosCur++; + return State.OutPosCur; + } + /* Check for currently last code */ + if (State.FreeCode == (1U << CodeBits)) + CodeBits++; + State.FreeCode++; + /* Check for full stringtable */ + if (State.FreeCode == 0xfff) { + FlushStringTable(&State); + if (AddCodeToBuffer(&State, State.ClearCode, CodeBits)) + return 0; + + CodeBits = (unsigned char) (1 + 2); + State.FreeCode = (unsigned short) (State.ClearCode + 2); + } + } +} + +int gif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) { + char outbuf[10]; + FILE *gif_file; + unsigned short usTemp; + int byte_out; +#ifdef _MSC_VER + char * lzwoutbuf; +#endif + +#ifndef _MSC_VER + char lzwoutbuf[symbol->bitmap_height * symbol->bitmap_width]; +#else + lzwoutbuf = (char *) _alloca((symbol->bitmap_height * symbol->bitmap_width) * sizeof (char)); +#endif /* _MSC_VER */ + + /* Open output file in binary mode */ + if ((symbol->output_options & BARCODE_STDOUT) != 0) { +#ifdef _MSC_VER + if (-1 == _setmode(_fileno(stdout), _O_BINARY)) { + strcpy(symbol->errtxt, "610: Can't open output file"); + return ZINT_ERROR_FILE_ACCESS; + } +#endif + gif_file = stdout; + } else { + if (!(gif_file = fopen(symbol->outfile, "wb"))) { + strcpy(symbol->errtxt, "611: Can't open output file"); + return ZINT_ERROR_FILE_ACCESS; + } + } + /*ImageWidth = 2; + ImageHeight = 2; + rotated_bitmap[0] = 1; + rotated_bitmap[1] = 1; + rotated_bitmap[2] = 0; + rotated_bitmap[3] = 0; + */ + + /* GIF signature (6) */ + memcpy(outbuf, "GIF87a", 6); + if (TRANSPARENT_INDEX != -1) + outbuf[4] = '9'; + fwrite(outbuf, 6, 1, gif_file); + /* Screen Descriptor (7) */ + /* Screen Width */ + usTemp = (unsigned short) symbol->bitmap_width; + outbuf[0] = (unsigned char) (0xff & usTemp); + outbuf[1] = (unsigned char) ((0xff00 & usTemp) / 0x100); + /* Screen Height */ + usTemp = (unsigned short) symbol->bitmap_height; + outbuf[2] = (unsigned char) (0xff & usTemp); + outbuf[3] = (unsigned char) ((0xff00 & usTemp) / 0x100); + /* write ImageBits-1 to the three least significant bits of byte 5 of + * the Screen Descriptor + */ + outbuf[4] = (unsigned char) (0xf0 | (0x7 & (DESTINATION_IMAGE_BITS - 1))); + /* Background color = colortable index 0 */ + outbuf[5] = 0x00; + /* Byte 7 must be 0x00 */ + outbuf[6] = 0x00; + fwrite(outbuf, 7, 1, gif_file); + /* Global Color Table (6) */ + /* RGB 0 color */ + outbuf[0] = (unsigned char) (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + outbuf[1] = (unsigned char) (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + outbuf[2] = (unsigned char) (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + /* RGB 1 color */ + outbuf[3] = (unsigned char) (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + outbuf[4] = (unsigned char) (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + outbuf[5] = (unsigned char) (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + fwrite(outbuf, 6, 1, gif_file); + + /* Graphic control extension (8) */ + /* A graphic control extension block is used for overlay gifs. + * This is necessary to define a transparent color. + */ + if (TRANSPARENT_INDEX != -1) { + /* Extension Introducer = '!' */ + outbuf[0] = '\x21'; + /* Graphic Control Label */ + outbuf[1] = '\xf9'; + /* Block Size */ + outbuf[2] = 4; + /* Packet fields: + * 3 Reserved + * 3 Disposal Method: 0 No Action, 1 No Dispose, 2: Background, 3: Prev. + * 1 User Input Flag: 0: no user input, 1: user input + * 1 Transparent Color Flag: 0: No Transparency, 1: Transparency index + */ + outbuf[3] = 1; + /* Delay Time */ + outbuf[4] = 0; + outbuf[5] = 0; + /* Transparent Color Index */ + outbuf[6] = (unsigned char) TRANSPARENT_INDEX; + /* Block Terminator */ + outbuf[7] = 0; + fwrite(outbuf, 8, 1, gif_file); + } + /* Image Descriptor */ + /* Image separator character = ',' */ + outbuf[0] = 0x2c; + /* "Image Left" */ + outbuf[1] = 0x00; + outbuf[2] = 0x00; + /* "Image Top" */ + outbuf[3] = 0x00; + outbuf[4] = 0x00; + /* Image Width (low byte first) */ + outbuf[5] = (unsigned char) (0xff & symbol->bitmap_width); + outbuf[6] = (unsigned char) ((0xff00 & symbol->bitmap_width) / 0x100); + /* Image Height */ + outbuf[7] = (unsigned char) (0xff & symbol->bitmap_height); + outbuf[8] = (unsigned char) ((0xff00 & symbol->bitmap_height) / 0x100); + + /* Byte 10 contains the interlaced flag and + * information on the local color table. + * There is no local color table if its most significant bit is reset. + */ + outbuf[9] = (unsigned char) (0 | (0x7 & (DESTINATION_IMAGE_BITS - 1))); + fwrite(outbuf, 10, 1, gif_file); + + /* call lzw encoding */ + byte_out = gif_lzw( + (unsigned char *) lzwoutbuf, + symbol->bitmap_height * symbol->bitmap_width, + (unsigned char *) pixelbuf, + symbol->bitmap_height * symbol->bitmap_width); + if (byte_out <= 0) { + fclose(gif_file); + return ZINT_ERROR_MEMORY; + } + fwrite(lzwoutbuf, byte_out, 1, gif_file); + + /* GIF terminator */ + fputc('\x3b', gif_file); + fclose(gif_file); + + return 0; +} \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/gridmtx.c b/3rdparty/zint-2.6.1/backend/gridmtx.c new file mode 100644 index 0000000..b77a05b --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/gridmtx.c @@ -0,0 +1,1208 @@ +/* gridmtx.c - Grid Matrix + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* This file impliments Grid Matrix as specified in + AIM Global Document Number AIMD014 Rev. 1.63 Revised 9 Dec 2008 */ + +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include "reedsol.h" +#include "gridmtx.h" +#include "gb2312.h" + +int number_lat(int gbdata[], const size_t length, const size_t position) { + /* Attempt to calculate the 'cost' of using numeric mode from a given position in number of bits */ + /* Also ensures that numeric mode is not selected when it cannot be used: for example in + a string which has "2.2.0" (cannot have more than one non-numeric character for each + block of three numeric characters) */ + size_t sp; + int numb = 0, nonum = 0, done; + int tally = 0; + + sp = position; + + do { + done = 0; + + if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { + numb++; + done = 1; + } + switch (gbdata[sp]) { + case ' ': + case '+': + case '-': + case '.': + case ',': + nonum++; + done = 1; + } + if ((sp + 1) < length) { + if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { + nonum++; + done = 1; + sp++; + } + } + + if (done == 0) { + tally += 80; + } else { + if (numb == 3) { + if (nonum == 0) { + tally += 10; + } + if (nonum == 1) { + tally += 20; + } + if (nonum > 1) { + tally += 80; + } + numb = 0; + nonum = 0; + } + } + + sp++; + } while ((sp < length) && (sp <= (position + 8))); + + if (numb == 0) { + tally += 80; + } + + if (numb > 1) { + if (nonum == 0) { + tally += 10; + } + if (nonum == 1) { + tally += 20; + } + if (nonum > 1) { + tally += 80; + } + } + + return tally; +} + +static int seek_forward(int gbdata[], const size_t length, const size_t position, int current_mode) { + /* In complete contrast to the method recommended in Annex D of the ANSI standard this + code uses a look-ahead test in the same manner as Data Matrix. This decision was made + because the "official" algorithm does not provide clear methods for dealing with all + possible combinations of input data */ + + int number_count, byte_count, mixed_count, upper_count, lower_count, chinese_count; + int best_mode, done; + size_t sp; + int best_count, last = -1; + int debug = 0; + + if (gbdata[position] > 0xff) { + return GM_CHINESE; + } + + switch (current_mode) { + case GM_CHINESE: + number_count = 13; + byte_count = 13; + mixed_count = 13; + upper_count = 13; + lower_count = 13; + chinese_count = 0; + break; + case GM_NUMBER: + number_count = 0; + byte_count = 10; + mixed_count = 10; + upper_count = 10; + lower_count = 10; + chinese_count = 10; + break; + case GM_LOWER: + number_count = 5; + byte_count = 7; + mixed_count = 7; + upper_count = 5; + lower_count = 0; + chinese_count = 5; + break; + case GM_UPPER: + number_count = 5; + byte_count = 7; + mixed_count = 7; + upper_count = 0; + lower_count = 5; + chinese_count = 5; + break; + case GM_MIXED: + number_count = 10; + byte_count = 10; + mixed_count = 0; + upper_count = 10; + lower_count = 10; + chinese_count = 10; + break; + case GM_BYTE: + number_count = 4; + byte_count = 0; + mixed_count = 4; + upper_count = 4; + lower_count = 4; + chinese_count = 4; + break; + default: /* Start of symbol */ + number_count = 4; + byte_count = 4; + mixed_count = 4; + upper_count = 4; + lower_count = 4; + chinese_count = 4; + } + + for (sp = position; (sp < length) && (sp <= (position + 8)); sp++) { + + done = 0; + + if (gbdata[sp] >= 0xff) { + byte_count += 17; + mixed_count += 23; + upper_count += 18; + lower_count += 18; + chinese_count += 13; + done = 1; + } + + if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { + byte_count += 8; + mixed_count += 6; + upper_count += 10; + lower_count += 5; + chinese_count += 13; + done = 1; + } + + if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { + byte_count += 8; + mixed_count += 6; + upper_count += 5; + lower_count += 10; + chinese_count += 13; + done = 1; + } + + if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { + byte_count += 8; + mixed_count += 6; + upper_count += 8; + lower_count += 8; + chinese_count += 13; + done = 1; + } + + if (gbdata[sp] == ' ') { + byte_count += 8; + mixed_count += 6; + upper_count += 5; + lower_count += 5; + chinese_count += 13; + done = 1; + } + + if (done == 0) { + /* Control character */ + byte_count += 8; + mixed_count += 16; + upper_count += 13; + lower_count += 13; + chinese_count += 13; + } + + if (gbdata[sp] >= 0x7f) { + mixed_count += 20; + upper_count += 20; + lower_count += 20; + } + } + + /* Adjust for */ + for (sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) { + if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { + chinese_count -= 13; + } + } + + /* Adjust for double digits */ + for (sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) { + if (sp != last) { + if (((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) { + chinese_count -= 13; + last = (int)(sp + 1); + } + } + } + + /* Numeric mode is more complex */ + number_count += number_lat(gbdata, length, position); + + if (debug) { + printf("C %d / B %d / M %d / U %d / L %d / N %d\n", chinese_count, byte_count, mixed_count, upper_count, lower_count, number_count); + } + + best_count = chinese_count; + best_mode = GM_CHINESE; + + if (byte_count <= best_count) { + best_count = byte_count; + best_mode = GM_BYTE; + } + + if (mixed_count <= best_count) { + best_count = mixed_count; + best_mode = GM_MIXED; + } + + if (upper_count <= best_count) { + best_count = upper_count; + best_mode = GM_UPPER; + } + + if (lower_count <= best_count) { + best_count = lower_count; + best_mode = GM_LOWER; + } + + if (number_count <= best_count) { + best_count = number_count; + best_mode = GM_NUMBER; + } + + return best_mode; +} + +/* Add the length indicator for byte encoded blocks */ +static void add_byte_count(char binary[], const size_t byte_count_posn, const int byte_count) { + int p; + + for (p = 0; p < 8; p++) { + if (byte_count & (0x100 >> p)) { + binary[byte_count_posn + p] = '0'; + } else { + binary[byte_count_posn + p] = '1'; + } + } +} + +/* Add a control character to the data stream */ +void add_shift_char(char binary[], int shifty) { + int i, debug = 0; + int glyph = 0; + + for (i = 0; i < 64; i++) { + if (shift_set[i] == shifty) { + glyph = i; + } + } + + if (debug) { + printf("SHIFT [%d] ", glyph); + } + + bin_append(glyph, 6, binary); +} + +static int gm_encode(int gbdata[], const size_t length, char binary[],const int reader,const int eci, int debug) { + /* Create a binary stream representation of the input data. + 7 sets are defined - Chinese characters, Numerals, Lower case letters, Upper case letters, + Mixed numerals and latters, Control characters and 8-bit binary data */ + int sp, current_mode, next_mode, last_mode, glyph = 0; + int c1, c2, done; + int p = 0, ppos; + int numbuf[3], punt = 0; + size_t number_pad_posn, byte_count_posn = 0; + int byte_count = 0; + int shift; + + strcpy(binary, ""); + + sp = 0; + current_mode = 0; + last_mode = 0; + number_pad_posn = 0; + + if (reader) { + bin_append(10, 4, binary); /* FNC3 - Reader Initialisation */ + } + + if (eci != 3) { + /* ECI assignment according to Table 8 */ + bin_append(12, 4, binary); /* ECI */ + if (eci <= 1023) { + bin_append(eci, 11, binary); + } + if ((eci >= 1024) && (eci <= 32767)) { + strcat(binary, "10"); + bin_append(eci, 15, binary); + } + if (eci >= 32768) { + strcat(binary, "11"); + bin_append(eci, 20, binary); + } + } + + do { + next_mode = seek_forward(gbdata, length, sp, current_mode); + + if (next_mode != current_mode) { + switch (current_mode) { + case 0: + switch (next_mode) { + case GM_CHINESE: bin_append(1, 4, binary); + break; + case GM_NUMBER: bin_append(2, 4, binary); + break; + case GM_LOWER: bin_append(3, 4, binary); + break; + case GM_UPPER: bin_append(4, 4, binary); + break; + case GM_MIXED: bin_append(5, 4, binary); + break; + case GM_BYTE: bin_append(6, 4, binary); + break; + } + break; + case GM_CHINESE: + switch (next_mode) { + case GM_NUMBER: bin_append(8161, 13, binary); + break; + case GM_LOWER: bin_append(8162, 13, binary); + break; + case GM_UPPER: bin_append(8163, 13, binary); + break; + case GM_MIXED: bin_append(8164, 13, binary); + break; + case GM_BYTE: bin_append(8165, 13, binary); + break; + } + break; + case GM_NUMBER: + /* add numeric block padding value */ + switch (p) { + case 1: binary[number_pad_posn] = '1'; + binary[number_pad_posn + 1] = '0'; + break; // 2 pad digits + case 2: binary[number_pad_posn] = '0'; + binary[number_pad_posn + 1] = '1'; + break; // 1 pad digits + case 3: binary[number_pad_posn] = '0'; + binary[number_pad_posn + 1] = '0'; + break; // 0 pad digits + } + switch (next_mode) { + case GM_CHINESE: bin_append(1019, 10, binary); + break; + case GM_LOWER: bin_append(1020, 10, binary); + break; + case GM_UPPER: bin_append(1021, 10, binary); + break; + case GM_MIXED: bin_append(1022, 10, binary); + break; + case GM_BYTE: bin_append(1023, 10, binary); + break; + } + break; + case GM_LOWER: + case GM_UPPER: + switch (next_mode) { + case GM_CHINESE: bin_append(28, 5, binary); + break; + case GM_NUMBER: bin_append(29, 5, binary); + break; + case GM_LOWER: + case GM_UPPER: bin_append(30, 5, binary); + break; + case GM_MIXED: bin_append(124, 7, binary); + break; + case GM_BYTE: bin_append(126, 7, binary); + break; + } + break; + case GM_MIXED: + switch (next_mode) { + case GM_CHINESE: bin_append(1009, 10, binary); + break; + case GM_NUMBER: bin_append(1010, 10, binary); + break; + case GM_LOWER: bin_append(1011, 10, binary); + break; + case GM_UPPER: bin_append(1012, 10, binary); + break; + case GM_BYTE: bin_append(1015, 10, binary); + break; + } + break; + case GM_BYTE: + /* add byte block length indicator */ + add_byte_count(binary, byte_count_posn, byte_count); + byte_count = 0; + switch (next_mode) { + case GM_CHINESE: bin_append(1, 4, binary); + break; + case GM_NUMBER: bin_append(2, 4, binary); + break; + case GM_LOWER: bin_append(3, 4, binary); + break; + case GM_UPPER: bin_append(4, 4, binary); + break; + case GM_MIXED: bin_append(5, 4, binary); + break; + } + break; + } + if (debug) { + switch (next_mode) { + case GM_CHINESE: printf("CHIN "); + break; + case GM_NUMBER: printf("NUMB "); + break; + case GM_LOWER: printf("LOWR "); + break; + case GM_UPPER: printf("UPPR "); + break; + case GM_MIXED: printf("MIXD "); + break; + case GM_BYTE: printf("BYTE "); + break; + } + } + } + last_mode = current_mode; + current_mode = next_mode; + + switch (current_mode) { + case GM_CHINESE: + done = 0; + if (gbdata[sp] > 0xff) { + /* GB2312 character */ + c1 = (gbdata[sp] & 0xff00) >> 8; + c2 = gbdata[sp] & 0xff; + + if ((c1 >= 0xa0) && (c1 <= 0xa9)) { + glyph = (0x60 * (c1 - 0xa1)) + (c2 - 0xa0); + } + if ((c1 >= 0xb0) && (c1 <= 0xf7)) { + glyph = (0x60 * (c1 - 0xb0 + 9)) + (c2 - 0xa0); + } + done = 1; + } + if (!(done)) { + if (sp != (length - 1)) { + if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { + /* End of Line */ + glyph = 7776; + sp++; + } + done = 1; + } + } + if (!(done)) { + if (sp != (length - 1)) { + if (((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && + ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) { + /* Two digits */ + glyph = 8033 + (10 * (gbdata[sp] - '0')) + (gbdata[sp + 1] - '0'); + sp++; + } + } + } + if (!(done)) { + /* Byte value */ + glyph = 7777 + gbdata[sp]; + } + + if (debug) { + printf("[%d] ", glyph); + } + + bin_append(glyph, 13, binary); + sp++; + break; + + case GM_NUMBER: + if (last_mode != current_mode) { + /* Reserve a space for numeric digit padding value (2 bits) */ + number_pad_posn = strlen(binary); + strcat(binary, "XX"); + } + p = 0; + ppos = -1; + + /* Numeric compression can also include certain combinations of + non-numeric character */ + + numbuf[0] = '0'; + numbuf[1] = '0'; + numbuf[2] = '0'; + do { + if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { + numbuf[p] = gbdata[sp]; + sp++; + p++; + } + switch (gbdata[sp]) { + case ' ': + case '+': + case '-': + case '.': + case ',': + punt = gbdata[sp]; + sp++; + ppos = p; + break; + } + if (sp < (length - 1)) { + if ((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { + /* */ + punt = gbdata[sp]; + sp += 2; + ppos = p; + } + } + } while ((p < 3) && (sp < length)); + + if (ppos != -1) { + switch (punt) { + case ' ': glyph = 0; + break; + case '+': glyph = 3; + break; + case '-': glyph = 6; + break; + case '.': glyph = 9; + break; + case ',': glyph = 12; + break; + case 0x13: glyph = 15; + break; + } + glyph += ppos; + glyph += 1000; + + if (debug) { + printf("[%d] ", glyph); + } + + bin_append(glyph, 10, binary); + } + + glyph = (100 * (numbuf[0] - '0')) + (10 * (numbuf[1] - '0')) + (numbuf[2] - '0'); + if (debug) { + printf("[%d] ", glyph); + } + + bin_append(glyph, 10, binary); + break; + + case GM_BYTE: + if (last_mode != current_mode) { + /* Reserve space for byte block length indicator (9 bits) */ + byte_count_posn = strlen(binary); + strcat(binary, "LLLLLLLLL"); + } + if (byte_count == 512) { + /* Maximum byte block size is 512 bytes. If longer is needed then start a new block */ + add_byte_count(binary, byte_count_posn, byte_count); + bin_append(7, 4, binary); + byte_count_posn = strlen(binary); + strcat(binary, "LLLLLLLLL"); + byte_count = 0; + } + + glyph = gbdata[sp]; + if (debug) { + printf("[%d] ", glyph); + } + bin_append(glyph, 8, binary); + sp++; + byte_count++; + break; + + case GM_MIXED: + shift = 1; + if ((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { + shift = 0; + } + if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { + shift = 0; + } + if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { + shift = 0; + } + if (gbdata[sp] == ' ') { + shift = 0; + } + + if (shift == 0) { + /* Mixed Mode character */ + glyph = posn(EUROPIUM, gbdata[sp]); + if (debug) { + printf("[%d] ", glyph); + } + + bin_append(glyph, 6, binary); + } else { + /* Shift Mode character */ + bin_append(1014, 10, binary); /* shift indicator */ + add_shift_char(binary, gbdata[sp]); + } + + sp++; + break; + + case GM_UPPER: + shift = 1; + if ((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { + shift = 0; + } + if (gbdata[sp] == ' ') { + shift = 0; + } + + if (shift == 0) { + /* Upper Case character */ + glyph = posn("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", gbdata[sp]); + if (debug) { + printf("[%d] ", glyph); + } + + bin_append(glyph, 5, binary); + } else { + /* Shift Mode character */ + bin_append(125, 7, binary); /* shift indicator */ + add_shift_char(binary, gbdata[sp]); + } + + sp++; + break; + + case GM_LOWER: + shift = 1; + if ((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { + shift = 0; + } + if (gbdata[sp] == ' ') { + shift = 0; + } + + if (shift == 0) { + /* Lower Case character */ + glyph = posn("abcdefghijklmnopqrstuvwxyz ", gbdata[sp]); + if (debug) { + printf("[%d] ", glyph); + } + + bin_append(glyph, 5, binary); + } else { + /* Shift Mode character */ + bin_append(125, 7, binary); /* shift indicator */ + add_shift_char(binary, gbdata[sp]); + } + + sp++; + break; + } + if (strlen(binary) > 9191) { + return ZINT_ERROR_TOO_LONG; + } + + } while (sp < length); + + if (current_mode == GM_NUMBER) { + /* add numeric block padding value */ + switch (p) { + case 1: binary[number_pad_posn] = '1'; + binary[number_pad_posn + 1] = '0'; + break; // 2 pad digits + case 2: binary[number_pad_posn] = '0'; + binary[number_pad_posn + 1] = '1'; + break; // 1 pad digit + case 3: binary[number_pad_posn] = '0'; + binary[number_pad_posn + 1] = '0'; + break; // 0 pad digits + } + } + + if (current_mode == GM_BYTE) { + /* Add byte block length indicator */ + add_byte_count(binary, byte_count_posn, byte_count); + } + + /* Add "end of data" character */ + switch (current_mode) { + case GM_CHINESE: bin_append(8160, 13, binary); + break; + case GM_NUMBER: bin_append(1018, 10, binary); + break; + case GM_LOWER: + case GM_UPPER: bin_append(27, 5, binary); + break; + case GM_MIXED: bin_append(1008, 10, binary); + break; + case GM_BYTE: bin_append(0, 4, binary); + break; + } + + /* Add padding bits if required */ + p = 7 - (strlen(binary) % 7); + if (p == 7) { + p = 0; + } + bin_append(0, p, binary); + + if (strlen(binary) > 9191) { + return ZINT_ERROR_TOO_LONG; + } + return 0; +} + +static void gm_add_ecc(const char binary[], const size_t data_posn, const int layers, const int ecc_level, int word[]) { + int data_cw, i, j, wp, p; + int n1, b1, n2, b2, e1, b3, e2; + int block_size, data_size, ecc_size; + int data[1320], block[130]; + unsigned char data_block[115], ecc_block[70]; + + data_cw = gm_data_codewords[((layers - 1) * 5) + (ecc_level - 1)]; + + for (i = 0; i < 1320; i++) { + data[i] = 0; + } + + /* Convert from binary sream to 7-bit codewords */ + for (i = 0; i < data_posn; i++) { + for (p = 0; p < 7; p++) { + if (binary[i * 7 + p] == '1') { + data[i] += (0x40 >> p); + } + } + } + + /* Add padding codewords */ + data[data_posn] = 0x00; + for (i = (int) (data_posn + 1); i < data_cw; i++) { + if (i & 1) { + data[i] = 0x7e; + } else { + data[i] = 0x00; + } + } + + /* Get block sizes */ + n1 = gm_n1[(layers - 1)]; + b1 = gm_b1[(layers - 1)]; + n2 = n1 - 1; + b2 = gm_b2[(layers - 1)]; + e1 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4)]; + b3 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 1]; + e2 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 2]; + + /* Split the data into blocks */ + wp = 0; + for (i = 0; i < (b1 + b2); i++) { + if (i < b1) { + block_size = n1; + } else { + block_size = n2; + } + if (i < b3) { + ecc_size = e1; + } else { + ecc_size = e2; + } + data_size = block_size - ecc_size; + + /* printf("block %d/%d: data %d / ecc %d\n", i + 1, (b1 + b2), data_size, ecc_size);*/ + + for (j = 0; j < data_size; j++) { + data_block[j] = data[wp]; + wp++; + } + + /* Calculate ECC data for this block */ + rs_init_gf(0x89); + rs_init_code(ecc_size, 1); + rs_encode(data_size, data_block, ecc_block); + rs_free(); + + /* Correct error correction data but in reverse order */ + for (j = 0; j < data_size; j++) { + block[j] = data_block[j]; + } + for (j = 0; j < ecc_size; j++) { + block[(j + data_size)] = ecc_block[ecc_size - j - 1]; + } + + for (j = 0; j < n2; j++) { + word[((b1 + b2) * j) + i] = block[j]; + } + if (block_size == n1) { + word[((b1 + b2) * (n1 - 1)) + i] = block[(n1 - 1)]; + } + } +} + +void place_macromodule(char grid[], int x, int y, int word1, int word2, int size) { + int i, j; + + i = (x * 6) + 1; + j = (y * 6) + 1; + + if (word2 & 0x40) { + grid[(j * size) + i + 2] = '1'; + } + if (word2 & 0x20) { + grid[(j * size) + i + 3] = '1'; + } + if (word2 & 0x10) { + grid[((j + 1) * size) + i] = '1'; + } + if (word2 & 0x08) { + grid[((j + 1) * size) + i + 1] = '1'; + } + if (word2 & 0x04) { + grid[((j + 1) * size) + i + 2] = '1'; + } + if (word2 & 0x02) { + grid[((j + 1) * size) + i + 3] = '1'; + } + if (word2 & 0x01) { + grid[((j + 2) * size) + i] = '1'; + } + if (word1 & 0x40) { + grid[((j + 2) * size) + i + 1] = '1'; + } + if (word1 & 0x20) { + grid[((j + 2) * size) + i + 2] = '1'; + } + if (word1 & 0x10) { + grid[((j + 2) * size) + i + 3] = '1'; + } + if (word1 & 0x08) { + grid[((j + 3) * size) + i] = '1'; + } + if (word1 & 0x04) { + grid[((j + 3) * size) + i + 1] = '1'; + } + if (word1 & 0x02) { + grid[((j + 3) * size) + i + 2] = '1'; + } + if (word1 & 0x01) { + grid[((j + 3) * size) + i + 3] = '1'; + } +} + +void place_data_in_grid(int word[], char grid[], int modules, int size) { + int x, y, macromodule, offset; + + offset = 13 - ((modules - 1) / 2); + for (y = 0; y < modules; y++) { + for (x = 0; x < modules; x++) { + macromodule = gm_macro_matrix[((y + offset) * 27) + (x + offset)]; + place_macromodule(grid, x, y, word[macromodule * 2], word[(macromodule * 2) + 1], size); + } + } +} + +/* Place the layer ID into each macromodule */ +void place_layer_id(char* grid, int size, int layers, int modules, int ecc_level) { + int i, j, layer, start, stop; + +#ifndef _MSC_VER + int layerid[layers + 1]; + int id[modules * modules]; +#else + int* layerid = (int *) _alloca((layers + 1) * sizeof (int)); + int* id = (int *) _alloca((modules * modules) * sizeof (int)); +#endif + + /* Calculate Layer IDs */ + for (i = 0; i <= layers; i++) { + if (ecc_level == 1) { + layerid[i] = 3 - (i % 4); + } else { + layerid[i] = (i + 5 - ecc_level) % 4; + } + } + + for (i = 0; i < modules; i++) { + for (j = 0; j < modules; j++) { + id[(i * modules) + j] = 0; + } + } + + /* Calculate which value goes in each macromodule */ + start = modules / 2; + stop = modules / 2; + for (layer = 0; layer <= layers; layer++) { + for (i = start; i <= stop; i++) { + id[(start * modules) + i] = layerid[layer]; + id[(i * modules) + start] = layerid[layer]; + id[((modules - start - 1) * modules) + i] = layerid[layer]; + id[(i * modules) + (modules - start - 1)] = layerid[layer]; + } + start--; + stop++; + } + + /* Place the data in the grid */ + for (i = 0; i < modules; i++) { + for (j = 0; j < modules; j++) { + if (id[(i * modules) + j] & 0x02) { + grid[(((i * 6) + 1) * size) + (j * 6) + 1] = '1'; + } + if (id[(i * modules) + j] & 0x01) { + grid[(((i * 6) + 1) * size) + (j * 6) + 2] = '1'; + } + } + } +} + +int grid_matrix(struct zint_symbol *symbol, const unsigned char source[], size_t length) { + int size, modules, dark, error_number; + int auto_layers, min_layers, layers, auto_ecc_level, min_ecc_level, ecc_level; + int x, y, i, j, glyph; + char binary[9300]; + int data_cw, input_latch = 0; + int word[1460], data_max, reader = 0; + +#ifndef _MSC_VER + int utfdata[length + 1]; + int gbdata[length + 1]; +#else + char* grid; + int* utfdata = (int *) _alloca((length + 1) * sizeof (int)); + int* gbdata = (int *) _alloca((length + 1) * sizeof (int)); +#endif + + for (i = 0; i < 1460; i++) { + word[i] = 0; + } + + if ((symbol->input_mode == DATA_MODE) || (symbol->eci != 3)) { + for (i = 0; i < length; i++) { + gbdata[i] = (int) source[i]; + } + } else { + /* Convert Unicode input to GB-2312 */ + error_number = utf8toutf16(symbol, source, utfdata, &length); + if (error_number != 0) { + return error_number; + } + + for (i = 0; i < length; i++) { + if (utfdata[i] <= 0xff) { + gbdata[i] = utfdata[i]; + } else { + j = 0; + glyph = 0; + do { + if (gb2312_lookup[j * 2] == utfdata[i]) { + glyph = gb2312_lookup[(j * 2) + 1]; + } + j++; + } while ((j < 7445) && (glyph == 0)); + if (glyph == 0) { + strcpy(symbol->errtxt, "530: Invalid character in input data"); + return ZINT_ERROR_INVALID_DATA; + } + gbdata[i] = glyph; + } + } + } + + if (symbol->output_options & READER_INIT) reader = 1; + + if (symbol->eci > 811799) { + strcpy(symbol->errtxt, "533: Invalid ECI"); + return ZINT_ERROR_INVALID_OPTION; + } + + error_number = gm_encode(gbdata, length, binary, reader, symbol->eci, symbol->debug); + if (error_number != 0) { + strcpy(symbol->errtxt, "531: Input data too long"); + return error_number; + } + + /* Determine the size of the symbol */ + data_cw = (int)strlen(binary) / 7; + + auto_layers = 13; + for (i = 12; i > 0; i--) { + if (gm_recommend_cw[(i - 1)] >= data_cw) { + auto_layers = i; + } + } + min_layers = 13; + for (i = 12; i > 0; i--) { + if (gm_max_cw[(i - 1)] >= data_cw) { + min_layers = i; + } + } + layers = auto_layers; + auto_ecc_level = 3; + if (layers == 1) { + auto_ecc_level = 5; + } + if ((layers == 2) || (layers == 3)) { + auto_ecc_level = 4; + } + min_ecc_level = 1; + if (layers == 1) { + min_ecc_level = 4; + } + if ((layers == 2) || (layers == 3)) { + min_ecc_level = 2; + } + ecc_level = auto_ecc_level; + + if ((symbol->option_2 >= 1) && (symbol->option_2 <= 13)) { + input_latch = 1; + if (symbol->option_2 > min_layers) { + layers = symbol->option_2; + } else { + strcpy(symbol->errtxt, "534: Input data too long for selected symbol size"); + return ZINT_ERROR_TOO_LONG; + } + } + + if (input_latch == 1) { + auto_ecc_level = 3; + if (layers == 1) { + auto_ecc_level = 5; + } + if ((layers == 2) || (layers == 3)) { + auto_ecc_level = 4; + } + ecc_level = auto_ecc_level; + if (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) { + layers++; + } + } + + if (input_latch == 0) { + if ((symbol->option_1 >= 1) && (symbol->option_1 <= 5)) { + if (symbol->option_1 > min_ecc_level) { + ecc_level = symbol->option_1; + } else { + ecc_level = min_ecc_level; + } + } + if (data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) { + do { + layers++; + } while ((data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) && (layers <= 13)); + } + } + + data_max = 1313; + switch (ecc_level) { + case 2: data_max = 1167; + break; + case 3: data_max = 1021; + break; + case 4: data_max = 875; + break; + case 5: data_max = 729; + break; + } + + if (data_cw > data_max) { + strcpy(symbol->errtxt, "532: Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + + gm_add_ecc(binary, data_cw, layers, ecc_level, word); + size = 6 + (layers * 12); + modules = 1 + (layers * 2); + +#ifndef _MSC_VER + char grid[size * size]; +#else + grid = (char *) _alloca((size * size) * sizeof (char)); +#endif + + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + grid[(y * size) + x] = '0'; + } + } + + place_data_in_grid(word, grid, modules, size); + place_layer_id(grid, size, layers, modules, ecc_level); + + /* Add macromodule frames */ + for (x = 0; x < modules; x++) { + dark = 1 - (x & 1); + for (y = 0; y < modules; y++) { + if (dark == 1) { + for (i = 0; i < 5; i++) { + grid[((y * 6) * size) + (x * 6) + i] = '1'; + grid[(((y * 6) + 5) * size) + (x * 6) + i] = '1'; + grid[(((y * 6) + i) * size) + (x * 6)] = '1'; + grid[(((y * 6) + i) * size) + (x * 6) + 5] = '1'; + } + grid[(((y * 6) + 5) * size) + (x * 6) + 5] = '1'; + dark = 0; + } else { + dark = 1; + } + } + } + + /* Copy values to symbol */ + symbol->width = size; + symbol->rows = size; + + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if (grid[(y * size) + x] == '1') { + set_module(symbol, y, x); + } + } + symbol->row_height[x] = 1; + } + + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/gridmtx.h b/3rdparty/zint-2.6.1/backend/gridmtx.h new file mode 100644 index 0000000..5153488 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/gridmtx.h @@ -0,0 +1,184 @@ +/* gridmtx.h - definitions for Grid Matrix + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#define GM_NUMBER 1 +#define GM_LOWER 2 +#define GM_UPPER 3 +#define GM_MIXED 4 +#define GM_CONTROL 5 +#define GM_BYTE 6 +#define GM_CHINESE 7 + +#define EUROPIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz " + +static const char shift_set[] = { + /* From Table 7 - Encoding of control characters */ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* NULL -> SI */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* DLE -> US */ + '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', + ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~' +}; + +static const unsigned short int gm_recommend_cw[] = { + 9, 30, 59, 114, 170, 237, 315, 405, 506, 618, 741, 875, 1021 +}; + +static const unsigned short int gm_max_cw[] = { + 11, 40, 79, 146, 218, 305, 405, 521, 650, 794, 953, 1125, 1313 +}; + +static const unsigned short int gm_data_codewords[] = { + 0, 15, 13, 11, 9, + 45, 40, 35, 30, 25, + 89, 79, 69, 59, 49, + 146, 130, 114, 98, 81, + 218, 194, 170, 146, 121, + 305, 271, 237, 203, 169, + 405, 360, 315, 270, 225, + 521, 463, 405, 347, 289, + 650, 578, 506, 434, 361, + 794, 706, 618, 530, 441, + 953, 847, 741, 635, 529, + 1125, 1000, 875, 750, 625, + 1313, 1167, 1021, 875, 729 +}; + +static const char gm_n1[] = { + 18, 50, 98, 81, 121, 113, 113, 116, 121, 126, 118, 125, 122 +}; + +static const char gm_b1[] = { + 1, 1, 1, 2, 2, 2, 2, 3, 2, 7, 5, 10, 6 +}; + +static const char gm_b2[] = { + 0, 0, 0, 0, 0, 1, 2, 2, 4, 0, 4, 0, 6 +}; + +/* Values from table A.1 */ +static const char gm_ebeb[] = { + /* E1 B3 E2 B4 */ + 0, 0, 0, 0, // version 1 + 3, 1, 0, 0, + 5, 1, 0, 0, + 7, 1, 0, 0, + 9, 1, 0, 0, + 5, 1, 0, 0, // version 2 + 10, 1, 0, 0, + 15, 1, 0, 0, + 20, 1, 0, 0, + 25, 1, 0, 0, + 9, 1, 0, 0, // version 3 + 19, 1, 0, 0, + 29, 1, 0, 0, + 39, 1, 0, 0, + 49, 1, 0, 0, + 8, 2, 0, 0, // version 4 + 16, 2, 0, 0, + 24, 2, 0, 0, + 32, 2, 0, 0, + 41, 1, 40, 1, + 12, 2, 0, 0, // version 5 + 24, 2, 0, 0, + 36, 2, 0, 0, + 48, 2, 0, 0, + 61, 1, 60, 1, + 11, 3, 0, 0, // version 6 + 23, 1, 22, 2, + 34, 2, 33, 1, + 45, 3, 0, 0, + 57, 1, 56, 2, + 12, 1, 11, 3, // version 7 + 23, 2, 22, 2, + 34, 3, 33, 1, + 45, 4, 0, 0, + 57, 1, 56, 3, + 12, 2, 11, 3, // version 8 + 23, 5, 0, 0, + 35, 3, 34, 2, + 47, 1, 46, 4, + 58, 4, 57, 1, + 12, 6, 0, 0, // version 9 + 24, 6, 0, 0, + 36, 6, 0, 0, + 48, 6, 0, 0, + 61, 1, 60, 5, + 13, 4, 12, 3, // version 10 + 26, 1, 25, 6, + 38, 5, 37, 2, + 51, 2, 50, 5, + 63, 7, 0, 0, + 12, 6, 11, 3, // version 11 + 24, 4, 23, 5, + 36, 2, 35, 7, + 47, 9, 0, 0, + 59, 7, 58, 2, + 13, 5, 12, 5, // version 12 + 25, 10, 0, 0, + 38, 5, 37, 5, + 50, 10, 0, 0, + 63, 5, 62, 5, + 13, 1, 12, 11, //version 13 + 25, 3, 24, 9, + 37, 5, 36, 7, + 49, 7, 48, 5, + 61, 9, 60, 3 +}; + +static const unsigned short int gm_macro_matrix[] = { + 728, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, + 727, 624, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 651, + 726, 623, 528, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 553, 652, + 725, 622, 527, 440, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 463, 554, 653, + 724, 621, 526, 439, 360, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 381, 464, 555, 654, + 723, 620, 525, 438, 359, 288, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 307, 382, 465, 556, 655, + 722, 619, 524, 437, 358, 287, 224, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 241, 308, 383, 466, 557, 656, + 721, 618, 523, 436, 357, 286, 223, 168, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 183, 242, 309, 384, 467, 558, 657, + 720, 617, 522, 435, 356, 285, 222, 167, 120, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 133, 184, 243, 310, 385, 468, 559, 658, + 719, 616, 521, 434, 355, 284, 221, 166, 119, 80, 49, 50, 51, 52, 53, 54, 55, 56, 91, 134, 185, 244, 311, 386, 469, 560, 659, + 718, 615, 520, 433, 354, 283, 220, 165, 118, 79, 48, 25, 26, 27, 28, 29, 30, 57, 92, 135, 186, 245, 312, 387, 470, 561, 660, + 717, 614, 519, 432, 353, 282, 219, 164, 117, 78, 47, 24, 9, 10, 11, 12, 31, 58, 93, 136, 187, 246, 313, 388, 471, 562, 661, + 716, 613, 518, 431, 352, 281, 218, 163, 116, 77, 46, 23, 8, 1, 2, 13, 32, 59, 94, 137, 188, 247, 314, 389, 472, 563, 662, + 715, 612, 517, 430, 351, 280, 217, 162, 115, 76, 45, 22, 7, 0, 3, 14, 33, 60, 95, 138, 189, 248, 315, 390, 473, 564, 663, + 714, 611, 516, 429, 350, 279, 216, 161, 114, 75, 44, 21, 6, 5, 4, 15, 34, 61, 96, 139, 190, 249, 316, 391, 474, 565, 664, + 713, 610, 515, 428, 349, 278, 215, 160, 113, 74, 43, 20, 19, 18, 17, 16, 35, 62, 97, 140, 191, 250, 317, 392, 475, 566, 665, + 712, 609, 514, 427, 348, 277, 214, 159, 112, 73, 42, 41, 40, 39, 38, 37, 36, 63, 98, 141, 192, 251, 318, 393, 476, 567, 666, + 711, 608, 513, 426, 347, 276, 213, 158, 111, 72, 71, 70, 69, 68, 67, 66, 65, 64, 99, 142, 193, 252, 319, 394, 477, 568, 667, + 710, 607, 512, 425, 346, 275, 212, 157, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 143, 194, 253, 320, 395, 478, 569, 668, + 709, 606, 511, 424, 345, 274, 211, 156, 155, 154, 153, 152, 151, 150, 149, 148, 147, 146, 145, 144, 195, 254, 321, 396, 479, 570, 669, + 708, 605, 510, 423, 344, 273, 210, 209, 208, 207, 206, 205, 204, 203, 202, 201, 200, 199, 198, 197, 196, 255, 322, 397, 480, 571, 670, + 707, 604, 509, 422, 343, 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, 257, 256, 323, 398, 481, 572, 671, + 706, 603, 508, 421, 342, 341, 340, 339, 338, 337, 336, 335, 334, 333, 332, 331, 330, 329, 328, 327, 326, 325, 324, 399, 482, 573, 672, + 705, 602, 507, 420, 419, 418, 417, 416, 415, 414, 413, 412, 411, 410, 409, 408, 407, 406, 405, 404, 403, 402, 401, 400, 483, 574, 673, + 704, 601, 506, 505, 504, 503, 502, 501, 500, 499, 498, 497, 496, 495, 494, 493, 492, 491, 490, 489, 488, 487, 486, 485, 484, 575, 674, + 703, 600, 599, 598, 597, 596, 595, 594, 593, 592, 591, 590, 589, 588, 587, 586, 585, 584, 583, 582, 581, 580, 579, 578, 577, 576, 675, + 702, 701, 700, 699, 698, 697, 696, 695, 694, 693, 692, 691, 690, 689, 688, 687, 686, 685, 684, 683, 682, 681, 680, 679, 678, 677, 676, +}; diff --git a/3rdparty/zint-2.6.1/backend/gs1.c b/3rdparty/zint-2.6.1/backend/gs1.c new file mode 100644 index 0000000..547fba4 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/gs1.c @@ -0,0 +1,358 @@ +/* gs1.c - Verifies GS1 data */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include "gs1.h" + +/* This code does some checks on the integrity of GS1 data. It is not intended + to be bulletproof, nor does it report very accurately what problem was found + or where, but should prevent some of the more common encoding errors */ + +void itostr(char ai_string[], int ai_value) { + int thou, hund, ten, unit; + char temp[2]; + + strcpy(ai_string, "("); + thou = ai_value / 1000; + hund = (ai_value - (1000 * thou)) / 100; + ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10; + unit = ai_value - ((1000 * thou) + (100 * hund) + (10 * ten)); + + temp[1] = '\0'; + if (ai_value >= 1000) { + temp[0] = itoc(thou); + strcat(ai_string, temp); + } + if (ai_value >= 100) { + temp[0] = itoc(hund); + strcat(ai_string, temp); + } + temp[0] = itoc(ten); + strcat(ai_string, temp); + temp[0] = itoc(unit); + strcat(ai_string, temp); + strcat(ai_string, ")"); +} + +int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]) { + int i, j, last_ai, ai_latch; + char ai_string[6]; + int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length; + int ai_value[100], ai_location[100], ai_count, data_location[100], data_length[100]; + int error_latch; + + /* Detect extended ASCII characters */ + for (i = 0; i < src_len; i++) { + if (source[i] >= 128) { + strcpy(symbol->errtxt, "250: Extended ASCII characters are not supported by GS1"); + return ZINT_ERROR_INVALID_DATA; + } + if (source[i] < 32) { + strcpy(symbol->errtxt, "251: Control characters are not supported by GS1 "); + return ZINT_ERROR_INVALID_DATA; + } + } + + if (source[0] != '[') { + strcpy(symbol->errtxt, "252: Data does not start with an AI"); + return ZINT_ERROR_INVALID_DATA; + } + + /* Check the position of the brackets */ + bracket_level = 0; + max_bracket_level = 0; + ai_length = 0; + max_ai_length = 0; + min_ai_length = 5; + j = 0; + ai_latch = 0; + for (i = 0; i < src_len; i++) { + ai_length += j; + if (((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) { + ai_latch = 1; + } + if (source[i] == '[') { + bracket_level++; + j = 1; + } + if (source[i] == ']') { + bracket_level--; + if (ai_length < min_ai_length) { + min_ai_length = ai_length; + } + j = 0; + ai_length = 0; + } + if (bracket_level > max_bracket_level) { + max_bracket_level = bracket_level; + } + if (ai_length > max_ai_length) { + max_ai_length = ai_length; + } + } + min_ai_length--; + + if (bracket_level != 0) { + /* Not all brackets are closed */ + strcpy(symbol->errtxt, "253: Malformed AI in input data (brackets don\'t match)"); + return ZINT_ERROR_INVALID_DATA; + } + + if (max_bracket_level > 1) { + /* Nested brackets */ + strcpy(symbol->errtxt, "254: Found nested brackets in input data"); + return ZINT_ERROR_INVALID_DATA; + } + + if (max_ai_length > 4) { + /* AI is too long */ + strcpy(symbol->errtxt, "255: Invalid AI in input data (AI too long)"); + return ZINT_ERROR_INVALID_DATA; + } + + if (min_ai_length <= 1) { + /* AI is too short */ + strcpy(symbol->errtxt, "256: Invalid AI in input data (AI too short)"); + return ZINT_ERROR_INVALID_DATA; + } + + if (ai_latch == 1) { + /* Non-numeric data in AI */ + strcpy(symbol->errtxt, "257: Invalid AI in input data (non-numeric characters in AI)"); + return ZINT_ERROR_INVALID_DATA; + } + + ai_count = 0; + for (i = 1; i < src_len; i++) { + if (source[i - 1] == '[') { + ai_location[ai_count] = i; + j = 0; + do { + ai_string[j] = source[i + j]; + j++; + } while (ai_string[j - 1] != ']'); + ai_string[j - 1] = '\0'; + ai_value[ai_count] = atoi(ai_string); + ai_count++; + } + } + + for (i = 0; i < ai_count; i++) { + data_location[i] = ai_location[i] + 3; + if (ai_value[i] >= 100) { + data_location[i]++; + } + if (ai_value[i] >= 1000) { + data_location[i]++; + } + data_length[i] = 0; + do { + data_length[i]++; + } while ((source[data_location[i] + data_length[i] - 1] != '[') && (data_location[i] + data_length[i] <= src_len)); + data_length[i]--; + } + + for (i = 0; i < ai_count; i++) { + if (data_length[i] == 0) { + /* No data for given AI */ + strcpy(symbol->errtxt, "258: Empty data field in input data"); + return ZINT_ERROR_INVALID_DATA; + } + } + + error_latch = 0; + strcpy(ai_string, ""); + for (i = 0; i < ai_count; i++) { + switch (ai_value[i]) { + case 0: if (data_length[i] != 18) { + error_latch = 1; + } + break; + case 1: + case 2: + case 3: if (data_length[i] != 14) { + error_latch = 1; + } + break; + case 4: if (data_length[i] != 16) { + error_latch = 1; + } + break; + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: if (data_length[i] != 6) { + error_latch = 1; + } + break; + case 20: if (data_length[i] != 2) { + error_latch = 1; + } + break; + case 23: + case 24: + case 25: + case 39: + case 40: + case 41: + case 42: + case 70: + case 80: + case 81: error_latch = 2; + break; + } + if ( + ((ai_value[i] >= 100) && (ai_value[i] <= 179)) + || ((ai_value[i] >= 1000) && (ai_value[i] <= 1799)) + || ((ai_value[i] >= 200) && (ai_value[i] <= 229)) + || ((ai_value[i] >= 2000) && (ai_value[i] <= 2299)) + || ((ai_value[i] >= 300) && (ai_value[i] <= 309)) + || ((ai_value[i] >= 3000) && (ai_value[i] <= 3099)) + || ((ai_value[i] >= 31) && (ai_value[i] <= 36)) + || ((ai_value[i] >= 310) && (ai_value[i] <= 369)) + ) { + error_latch = 2; + } + if ((ai_value[i] >= 3100) && (ai_value[i] <= 3699)) { + if (data_length[i] != 6) { + error_latch = 1; + } + } + if ( + ((ai_value[i] >= 370) && (ai_value[i] <= 379)) + || ((ai_value[i] >= 3700) && (ai_value[i] <= 3799)) + ) { + error_latch = 2; + } + if ((ai_value[i] >= 410) && (ai_value[i] <= 415)) { + if (data_length[i] != 13) { + error_latch = 1; + } + } + if ( + ((ai_value[i] >= 4100) && (ai_value[i] <= 4199)) + || ((ai_value[i] >= 700) && (ai_value[i] <= 703)) + || ((ai_value[i] >= 800) && (ai_value[i] <= 810)) + || ((ai_value[i] >= 900) && (ai_value[i] <= 999)) + || ((ai_value[i] >= 9000) && (ai_value[i] <= 9999)) + ) { + error_latch = 2; + } + if ((error_latch < 4) && (error_latch > 0)) { + /* error has just been detected: capture AI */ + itostr(ai_string, ai_value[i]); + error_latch += 4; + } + } + + if (error_latch == 5) { + strcpy(symbol->errtxt, "259: Invalid data length for AI "); + strcat(symbol->errtxt, ai_string); + return ZINT_ERROR_INVALID_DATA; + } + + if (error_latch == 6) { + strcpy(symbol->errtxt, "260: Invalid AI value"); + strcat(symbol->errtxt, ai_string); + return ZINT_ERROR_INVALID_DATA; + } + + /* Resolve AI data - put resulting string in 'reduced' */ + j = 0; + last_ai = 0; + ai_latch = 1; + for (i = 0; i < src_len; i++) { + if ((source[i] != '[') && (source[i] != ']')) { + reduced[j++] = source[i]; + } + if (source[i] == '[') { + /* Start of an AI string */ + if (ai_latch == 0) { + reduced[j++] = '['; + } + ai_string[0] = source[i + 1]; + ai_string[1] = source[i + 2]; + ai_string[2] = '\0'; + last_ai = atoi(ai_string); + ai_latch = 0; + /* The following values from "GS-1 General Specification version 8.0 issue 2, May 2008" + figure 5.4.8.2.1 - 1 "Element Strings with Pre-Defined Length Using Application Identifiers" */ + if ( + ((last_ai >= 0) && (last_ai <= 4)) + || ((last_ai >= 11) && (last_ai <= 20)) + || (last_ai == 23) /* legacy support - see 5.3.8.2.2 */ + || ((last_ai >= 31) && (last_ai <= 36)) + || (last_ai == 41) + ) { + ai_latch = 1; + } + } + /* The ']' character is simply dropped from the input */ + } + reduced[j] = '\0'; + + /* the character '[' in the reduced string refers to the FNC1 character */ + return 0; +} + +int ugs1_verify(struct zint_symbol *symbol, const unsigned char source[], const unsigned int src_len, unsigned char reduced[]) { + /* Only to keep the compiler happy */ +#ifndef _MSC_VER + char temp[src_len + 5]; +#else + char* temp = (char*) _alloca(src_len + 5); +#endif + int error_number; + + error_number = gs1_verify(symbol, source, src_len, temp); + if (error_number != 0) { + return error_number; + } + + if (strlen(temp) < src_len + 5) { + ustrcpy(reduced, (unsigned char*) temp); + return 0; + } + strcpy(symbol->errtxt, "261: ugs1_verify overflow"); + return ZINT_ERROR_INVALID_DATA; +} diff --git a/3rdparty/zint-2.6.1/backend/gs1.h b/3rdparty/zint-2.6.1/backend/gs1.h new file mode 100644 index 0000000..0dba084 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/gs1.h @@ -0,0 +1,46 @@ +/* gs1.h - Verifies GS1 data */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ +#ifndef __GS1_H +#define __GS1_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + extern int gs1_verify(struct zint_symbol *symbol, const unsigned char source[], const size_t src_len, char reduced[]); + extern int ugs1_verify(struct zint_symbol *symbol, const unsigned char source[], const unsigned int src_len, unsigned char reduced[]); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __GS1_H */ \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/hanxin.c b/3rdparty/zint-2.6.1/backend/hanxin.c new file mode 100644 index 0000000..2b99650 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/hanxin.c @@ -0,0 +1,1576 @@ +/* hanxin.c - Han Xin Code + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* This code attempts to implement Han Xin Code according to AIMD-015:2010 (Rev 0.8) */ + +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include "reedsol.h" +#include "hanxin.h" +#include "gb2312.h" +#include "gb18030.h" +#include "assert.h" + +/* Find which submode to use for a text character */ +int getsubmode(char input) { + int submode = 2; + + if ((input >= '0') && (input <= '9')) { + submode = 1; + } + + if ((input >= 'A') && (input <= 'Z')) { + submode = 1; + } + + if ((input >= 'a') && (input <= 'z')) { + submode = 1; + } + + return submode; +} + +/* Calculate the approximate length of the binary string */ +static int calculate_binlength(char mode[], int source[], const size_t length, int eci) { + size_t i; + char lastmode = 't'; + int est_binlen = 0; + int submode = 1; + + if (eci != 3) { + est_binlen += 12; + } + + i = 0; + do { + switch (mode[i]) { + case 'n': + if (lastmode != 'n') { + est_binlen += 14; + lastmode = 'n'; + } + est_binlen += 4; + break; + case 't': + if (lastmode != 't') { + est_binlen += 10; + lastmode = 't'; + submode = 1; + } + if (getsubmode((char) source[i]) != submode) { + est_binlen += 6; + submode = getsubmode((char) source[i]); + } + est_binlen += 6; + break; + case 'b': + if (lastmode != 'b') { + est_binlen += 17; + lastmode = 'b'; + } + est_binlen += 8; + break; + case '1': + if (lastmode != '1') { + est_binlen += 16; + lastmode = '1'; + } + est_binlen += 12; + break; + case '2': + if (lastmode != '2') { + est_binlen += 16; + lastmode = '2'; + } + est_binlen += 12; + break; + case 'd': + if (lastmode != 'd') { + est_binlen += 16; + lastmode = 'd'; + } + est_binlen += 15; + break; + case 'f': + if (lastmode != 'f') { + est_binlen += 4; + lastmode = 'f'; + } + est_binlen += 21; + i++; + break; + } + i++; + } while (i < length); + + return est_binlen; +} + +int isRegion1(int glyph) { + int first_byte, second_byte; + int valid = 0; + + first_byte = (glyph & 0xff00) >> 8; + second_byte = glyph & 0xff; + + if ((first_byte >= 0xb0) && (first_byte <= 0xd7)) { + if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) { + valid = 1; + } + } + + if ((first_byte >= 0xa1) && (first_byte <= 0xa3)) { + if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) { + valid = 1; + } + } + + if ((glyph >= 0xa8a1) && (glyph <= 0xa8c0)) { + valid = 1; + } + + return valid; +} + +int isRegion2(int glyph) { + int first_byte, second_byte; + int valid = 0; + + first_byte = (glyph & 0xff00) >> 8; + second_byte = glyph & 0xff; + + if ((first_byte >= 0xd8) && (first_byte <= 0xf7)) { + if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) { + valid = 1; + } + } + + return valid; +} + +int isDoubleByte(int glyph) { + int first_byte, second_byte; + int valid = 0; + + first_byte = (glyph & 0xff00) >> 8; + second_byte = glyph & 0xff; + + if ((first_byte >= 0x81) && (first_byte <= 0xfe)) { + if ((second_byte >= 0x40) && (second_byte <= 0x7e)) { + valid = 1; + } + + if ((second_byte >= 0x80) && (second_byte <= 0xfe)) { + valid = 1; + } + } + + return valid; +} + +int isFourByte(int glyph, int glyph2) { + int first_byte, second_byte; + int third_byte, fourth_byte; + int valid = 0; + + first_byte = (glyph & 0xff00) >> 8; + second_byte = glyph & 0xff; + third_byte = (glyph2 & 0xff00) >> 8; + fourth_byte = glyph2 & 0xff; + + if ((first_byte >= 0x81) && (first_byte <= 0xfe)) { + if ((second_byte >= 0x30) && (second_byte <= 0x39)) { + if ((third_byte >= 0x81) && (third_byte <= 0xfe)) { + if ((fourth_byte >= 0x30) && (fourth_byte <= 0x39)) { + valid = 1; + } + } + } + } + + return valid; +} + +/* Calculate mode switching */ +static void hx_define_mode(char mode[], int source[], const size_t length) { + size_t i; + char lastmode = 't'; + int done; + + i = 0; + do { + done = 0; + + if (isRegion1(source[i])) { + mode[i] = '1'; + done = 1; + i++; + } + + if ((done == 0) && (isRegion2(source[i]))) { + mode[i] = '2'; + done = 1; + i++; + } + + if ((done == 0) && (isDoubleByte(source[i]))) { + mode[i] = 'd'; + done = 1; + i++; + } + + if ((done == 0) && (i < length - 1)) { + if (isFourByte(source[i], source[i + 1])) { + mode[i] = 'f'; + mode[i + 1] = 'f'; + done = 1; + i += 2; + } + } + + if (done == 0) { + if ((source[i] >= '0') && (source[i] <= '9')) { + mode[i] = 'n'; + if (lastmode != 'n') { + lastmode = 'n'; + } + } else { + if ((source[i] <= 127) && ((source[i] <= 27) || (source[i] >= 32))) { + mode[i] = 't'; + if (lastmode != 't') { + lastmode = 't'; + } + } else { + mode[i] = 'b'; + if (lastmode != 'b') { + lastmode = 'b'; + } + } + } + i++; + } + } while (i < length); + mode[length] = '\0'; +} + +/* Convert Text 1 sub-mode character to encoding value, as given in table 3 */ +int lookup_text1(char input) { + int encoding_value = 0; + + if ((input >= '0') && (input <= '9')) { + encoding_value = input - '0'; + } + + if ((input >= 'A') && (input <= 'Z')) { + encoding_value = input - 'A' + 10; + } + + if ((input >= 'a') && (input <= 'z')) { + encoding_value = input - 'a' + 36; + } + + return encoding_value; +} + +/* Convert Text 2 sub-mode character to encoding value, as given in table 4 */ +int lookup_text2(char input) { + int encoding_value = 0; + + if ((input >= 0) && (input <= 27)) { + encoding_value = input; + } + + if ((input >= ' ') && (input <= '/')) { + encoding_value = input - ' ' + 28; + } + + if ((input >= '[') && (input <= 96)) { + encoding_value = input - '[' + 51; + } + + if ((input >= '{') && (input <= 127)) { + encoding_value = input - '{' + 57; + } + + return encoding_value; +} + +/* Convert input data to binary stream */ +static void calculate_binary(char binary[], char mode[], int source[], const size_t length, const int eci, int debug) { + int block_length; + int position = 0; + int i, count, encoding_value; + int first_byte, second_byte; + int third_byte, fourth_byte; + int glyph; + int submode; + + if (eci != 3) { + /* Encoding ECI assignment number, according to Table 5 */ + bin_append(8, 4, binary); // ECI + if (eci <= 127) { + bin_append(eci, 8, binary); + } + if ((eci >= 128) && (eci <= 16383)) { + strcat(binary, "10"); + bin_append(eci, 14, binary); + } + if (eci >= 16384) { + strcat(binary, "110"); + bin_append(eci, 21, binary); + } + } + + do { + block_length = 0; + do { + block_length++; + } while (mode[position + block_length] == mode[position]); + + switch (mode[position]) { + case 'n': + /* Numeric mode */ + /* Mode indicator */ + bin_append(1, 4, binary); + + if (debug) { + printf("Numeric\n"); + } + + i = 0; + + while (i < block_length) { + int first = 0, second = 0, third = 0; + + first = posn(NEON, (char) source[position + i]); + count = 1; + encoding_value = first; + + if (i + 1 < block_length && mode[position + i + 1] == 'n') { + second = posn(NEON, (char) source[position + i + 1]); + count = 2; + encoding_value = (encoding_value * 10) + second; + + if (i + 2 < block_length && mode[position + i + 2] == 'n') { + third = posn(NEON, (char) source[position + i + 2]); + count = 3; + encoding_value = (encoding_value * 10) + third; + } + } + + bin_append(encoding_value, 10, binary); + + if (debug) { + printf("0x%4x (%d)", encoding_value, encoding_value); + } + + i += count; + } + + /* Mode terminator depends on number of characters in last group (Table 2) */ + switch (count) { + case 1: + bin_append(1021, 10, binary); + break; + case 2: + bin_append(1022, 10, binary); + break; + case 3: + bin_append(1023, 10, binary); + break; + } + + if (debug) { + printf(" (TERM %d)\n", count); + } + + break; + case 't': + /* Text mode */ + if (position != 0) { + /* Mode indicator */ + bin_append(2, 4, binary); + + if (debug) { + printf("Text\n"); + } + } + + submode = 1; + + i = 0; + + while (i < block_length) { + + if (getsubmode((char) source[i + position]) != submode) { + /* Change submode */ + bin_append(62, 6, binary); + submode = getsubmode((char) source[i + position]); + if (debug) { + printf("SWITCH "); + } + } + + if (submode == 1) { + encoding_value = lookup_text1((char) source[i + position]); + } else { + encoding_value = lookup_text2((char) source[i + position]); + } + + bin_append(encoding_value, 6, binary); + + if (debug) { + printf("%c (%d) ", (char) source[i], encoding_value); + } + i++; + } + + /* Terminator */ + bin_append(63, 6, binary); + + if (debug) { + printf("\n"); + } + break; + case 'b': + /* Binary Mode */ + /* Mode indicator */ + bin_append(3, 4, binary); + + /* Count indicator */ + bin_append(block_length, 13, binary); + + if (debug) { + printf("Binary (length %d)\n", block_length); + } + + i = 0; + + while (i < block_length) { + + /* 8-bit bytes with no conversion */ + bin_append(source[i + position], 8, binary); + + if (debug) { + printf("%d ", source[i + position]); + } + + i++; + } + + if (debug) { + printf("\n"); + } + break; + case '1': + /* Region 1 encoding */ + /* Mode indicator */ + bin_append(4, 4, binary); + + if (debug) { + printf("Region 1\n"); + } + + i = 0; + + while (i < block_length) { + first_byte = (source[i + position] & 0xff00) >> 8; + second_byte = source[i + position] & 0xff; + + /* Subset 1 */ + glyph = (0x5e * (first_byte - 0xb0)) + (second_byte - 0xa1); + + /* Subset 2 */ + if ((first_byte >= 0xa1) && (first_byte <= 0xa3)) { + if ((second_byte >= 0xa1) && (second_byte <= 0xfe)) { + glyph = (0x5e * first_byte - 0xa1) + (second_byte - 0xa1) + 0xeb0; + } + } + + /* Subset 3 */ + if ((source[i + position] >= 0xa8a1) && (source[i + position] <= 0xa8c0)) { + glyph = (second_byte - 0xa1) + 0xfca; + } + + if (debug) { + printf("%d ", glyph); + } + + bin_append(glyph, 12, binary); + i++; + } + + /* Terminator */ + bin_append(4095, 12, binary); + + if (debug) { + printf("\n"); + } + + break; + case '2': + /* Region 2 encoding */ + /* Mode indicator */ + bin_append(5, 4, binary); + + if (debug) { + printf("Region 2\n"); + } + + i = 0; + + while (i < block_length) { + first_byte = (source[i + position] & 0xff00) >> 8; + second_byte = source[i + position] & 0xff; + + glyph = (0x5e * (first_byte - 0xd8)) + (second_byte - 0xa1); + + if (debug) { + printf("%d ", glyph); + } + + bin_append(glyph, 12, binary); + i++; + } + + /* Terminator */ + bin_append(4095, 12, binary); + + if (debug) { + printf("\n"); + } + break; + case 'd': + /* Double byte encoding */ + /* Mode indicator */ + bin_append(6, 4, binary); + + if (debug) { + printf("Double byte\n"); + } + + i = 0; + + while (i < block_length) { + first_byte = (source[i + position] & 0xff00) >> 8; + second_byte = source[i + position] & 0xff; + + if (second_byte <= 0x7e) { + glyph = (0xbe * (first_byte - 0x81)) + (second_byte - 0x40); + } else { + glyph = (0xbe * (first_byte - 0x81)) + (second_byte - 0x41); + } + + if (debug) { + printf("%d ", glyph); + } + + bin_append(glyph, 15, binary); + i++; + } + + /* Terminator */ + bin_append(32767, 15, binary); + /* Terminator sequence of length 12 is a mistake + - confirmed by Wang Yi */ + + if (debug) { + printf("\n"); + } + break; + case 'f': + /* Four-byte encoding */ + if (debug) { + printf("Four byte\n"); + } + + i = 0; + + while (i < block_length) { + + /* Mode indicator */ + bin_append(7, 4, binary); + + first_byte = (source[i + position] & 0xff00) >> 8; + second_byte = source[i + position] & 0xff; + third_byte = (source[i + position + 1] & 0xff00) >> 8; + fourth_byte = source[i + position + 1] & 0xff; + + glyph = (0x3138 * (first_byte - 0x81)) + (0x04ec * (second_byte - 0x30)) + + (0x0a * (third_byte - 0x81)) + (fourth_byte - 0x30); + + if (debug) { + printf("%d ", glyph); + } + + bin_append(glyph, 15, binary); + i += 2; + } + + /* No terminator */ + + if (debug) { + printf("\n"); + } + break; + + } + + position += block_length; + + } while (position < length); +} + +/* Finder pattern for top left of symbol */ +void hx_place_finder_top_left(unsigned char* grid, int size) { + int xp, yp; + int x = 0, y = 0; + char finder[] = {0x7F, 0x40, 0x5F, 0x50, 0x57, 0x57, 0x57}; + + for (xp = 0; xp < 7; xp++) { + for (yp = 0; yp < 7; yp++) { + if (finder[yp] & 0x40 >> xp) { + grid[((yp + y) * size) + (xp + x)] = 0x11; + } else { + grid[((yp + y) * size) + (xp + x)] = 0x10; + } + } + } +} + +/* Finder pattern for top right and bottom left of symbol */ +void hx_place_finder(unsigned char* grid, int size, int x, int y) { + int xp, yp; + char finder[] = {0x7F, 0x01, 0x7D, 0x05, 0x75, 0x75, 0x75}; + + for (xp = 0; xp < 7; xp++) { + for (yp = 0; yp < 7; yp++) { + if (finder[yp] & 0x40 >> xp) { + grid[((yp + y) * size) + (xp + x)] = 0x11; + } else { + grid[((yp + y) * size) + (xp + x)] = 0x10; + } + } + } +} + +/* Finder pattern for bottom right of symbol */ +void hx_place_finder_bottom_right(unsigned char* grid, int size) { + int xp, yp; + int x = size - 7, y = size - 7; + char finder[] = {0x75, 0x75, 0x75, 0x05, 0x7D, 0x01, 0x7F}; + + for (xp = 0; xp < 7; xp++) { + for (yp = 0; yp < 7; yp++) { + if (finder[yp] & 0x40 >> xp) { + grid[((yp + y) * size) + (xp + x)] = 0x11; + } else { + grid[((yp + y) * size) + (xp + x)] = 0x10; + } + } + } +} + +/* Avoid plotting outside symbol or over finder patterns */ +void hx_safe_plot(unsigned char *grid, int size, int x, int y, int value) { + if ((x >= 0) && (x < size)) { + if ((y >= 0) && (y < size)) { + if (grid[(y * size) + x] == 0) { + grid[(y * size) + x] = value; + } + } + } +} + +/* Plot an alignment pattern around top and right of a module */ +void hx_plot_alignment(unsigned char *grid, int size, int x, int y, int w, int h) { + int i; + hx_safe_plot(grid, size, x, y, 0x11); + hx_safe_plot(grid, size, x - 1, y + 1, 0x10); + + for (i = 1; i <= w; i++) { + /* Top */ + hx_safe_plot(grid, size, x - i, y, 0x11); + hx_safe_plot(grid, size, x - i - 1, y + 1, 0x10); + } + + for (i = 1; i < h; i++) { + /* Right */ + hx_safe_plot(grid, size, x, y + i, 0x11); + hx_safe_plot(grid, size, x - 1, y + i + 1, 0x10); + } +} + +/* Plot assistant alignment patterns */ +void hx_plot_assistant(unsigned char *grid, int size, int x, int y) { + hx_safe_plot(grid, size, x - 1, y - 1, 0x10); + hx_safe_plot(grid, size, x, y - 1, 0x10); + hx_safe_plot(grid, size, x + 1, y - 1, 0x10); + hx_safe_plot(grid, size, x - 1, y, 0x10); + hx_safe_plot(grid, size, x, y, 0x11); + hx_safe_plot(grid, size, x + 1, y, 0x10); + hx_safe_plot(grid, size, x - 1, y + 1, 0x10); + hx_safe_plot(grid, size, x, y + 1, 0x10); + hx_safe_plot(grid, size, x + 1, y + 1, 0x10); +} + +/* Put static elements in the grid */ +void hx_setup_grid(unsigned char* grid, int size, int version) { + int i, j; + + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + grid[(i * size) + j] = 0; + } + } + + /* Add finder patterns */ + hx_place_finder_top_left(grid, size); + hx_place_finder(grid, size, 0, size - 7); + hx_place_finder(grid, size, size - 7, 0); + hx_place_finder_bottom_right(grid, size); + + /* Add finder pattern separator region */ + for (i = 0; i < 8; i++) { + /* Top left */ + grid[(7 * size) + i] = 0x10; + grid[(i * size) + 7] = 0x10; + + /* Top right */ + grid[(7 * size) + (size - i - 1)] = 0x10; + grid[((size - i - 1) * size) + 7] = 0x10; + + /* Bottom left */ + grid[(i * size) + (size - 8)] = 0x10; + grid[((size - 8) * size) + i] = 0x10; + + /* Bottom right */ + grid[((size - 8) * size) + (size - i - 1)] = 0x10; + grid[((size - i - 1) * size) + (size - 8)] = 0x10; + } + + /* Reserve function information region */ + for (i = 0; i < 9; i++) { + /* Top left */ + grid[(8 * size) + i] = 0x10; + grid[(i * size) + 8] = 0x10; + + /* Top right */ + grid[(8 * size) + (size - i - 1)] = 0x10; + grid[((size - i - 1) * size) + 8] = 0x10; + + /* Bottom left */ + grid[(i * size) + (size - 9)] = 0x10; + grid[((size - 9) * size) + i] = 0x10; + + /* Bottom right */ + grid[((size - 9) * size) + (size - i - 1)] = 0x10; + grid[((size - i - 1) * size) + (size - 9)] = 0x10; + } + + if (version > 3) { + int k = hx_module_k[version - 1]; + int r = hx_module_r[version - 1]; + int m = hx_module_m[version - 1]; + int x, y, row_switch, column_switch; + int module_height, module_width; + int mod_x, mod_y; + + /* Add assistant alignment patterns to left and right */ + y = 0; + mod_y = 0; + do { + if (mod_y < m) { + module_height = k; + } else { + module_height = r - 1; + } + + if ((mod_y % 2) == 0) { + if ((m % 2) == 1) { + hx_plot_assistant(grid, size, 0, y); + } + } else { + if ((m % 2) == 0) { + hx_plot_assistant(grid, size, 0, y); + } + hx_plot_assistant(grid, size, size - 1, y); + } + + mod_y++; + y += module_height; + } while (y < size); + + /* Add assistant alignment patterns to top and bottom */ + x = (size - 1); + mod_x = 0; + do { + if (mod_x < m) { + module_width = k; + } else { + module_width = r - 1; + } + + if ((mod_x % 2) == 0) { + if ((m % 2) == 1) { + hx_plot_assistant(grid, size, x, (size - 1)); + } + } else { + if ((m % 2) == 0) { + hx_plot_assistant(grid, size, x, (size - 1)); + } + hx_plot_assistant(grid, size, x, 0); + } + + mod_x++; + x -= module_width; + } while (x >= 0); + + /* Add alignment pattern */ + column_switch = 1; + y = 0; + mod_y = 0; + do { + if (mod_y < m) { + module_height = k; + } else { + module_height = r - 1; + } + + if (column_switch == 1) { + row_switch = 1; + column_switch = 0; + } else { + row_switch = 0; + column_switch = 1; + } + + x = (size - 1); + mod_x = 0; + do { + if (mod_x < m) { + module_width = k; + } else { + module_width = r - 1; + } + + if (row_switch == 1) { + if (!(y == 0 && x == (size - 1))) { + hx_plot_alignment(grid, size, x, y, module_width, module_height); + } + row_switch = 0; + } else { + row_switch = 1; + } + mod_x++; + x -= module_width; + } while (x >= 0); + + mod_y++; + y += module_height; + } while (y < size); + } +} + +/* Calculate error correction codes */ +void hx_add_ecc(unsigned char fullstream[], unsigned char datastream[], int version, int ecc_level) { + unsigned char data_block[180]; + unsigned char ecc_block[36]; + int i, j, block; + int batch_size, data_length, ecc_length; + int input_position = -1; + int output_position = -1; + int table_d1_pos = ((version - 1) * 36) + ((ecc_level - 1) * 9); + + for (i = 0; i < 3; i++) { + batch_size = hx_table_d1[table_d1_pos + (3 * i)]; + data_length = hx_table_d1[table_d1_pos + (3 * i) + 1]; + ecc_length = hx_table_d1[table_d1_pos + (3 * i) + 2]; + + for (block = 0; block < batch_size; block++) { + for (j = 0; j < data_length; j++) { + input_position++; + output_position++; + data_block[j] = datastream[input_position]; + fullstream[output_position] = datastream[input_position]; + } + + rs_init_gf(0x163); // x^8 + x^6 + x^5 + x + 1 = 0 + rs_init_code(ecc_length, 1); + rs_encode(data_length, data_block, ecc_block); + rs_free(); + + for (j = 0; j < ecc_length; j++) { + output_position++; + fullstream[output_position] = ecc_block[ecc_length - j - 1]; + } + } + } +} + +/* Rearrange data in batches of 13 codewords (section 5.8.2) */ +void make_picket_fence(unsigned char fullstream[], unsigned char picket_fence[], int streamsize) { + int i, start; + int output_position = 0; + + for (start = 0; start < 13; start++) { + for (i = start; i < streamsize; i += 13) { + if (i < streamsize) { + picket_fence[output_position] = fullstream[i]; + output_position++; + } + } + } +} + +/* Evaluate a bitmask according to table 9 */ +int hx_evaluate(unsigned char *eval, int size, int pattern) { + int x, y, block, weight; + int result = 0; + char state; + int p; + int a, b, afterCount, beforeCount; +#ifndef _MSC_VER + char local[size * size]; +#else + char* local = (char *) _alloca((size * size) * sizeof (char)); +#endif + + /* all four bitmask variants have been encoded in the 4 bits of the bytes + * that make up the grid array. select them for evaluation according to the + * desired pattern.*/ + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if ((eval[(y * size) + x] & (0x01 << pattern)) != 0) { + local[(y * size) + x] = '1'; + } else { + local[(y * size) + x] = '0'; + } + } + } + + /* Test 1: 1:1:1:1:3 or 3:1:1:1:1 ratio pattern in row/column */ + /* Vertical */ + for (x = 0; x < size; x++) { + for (y = 0; y < (size - 7); y++) { + p = 0; + for (weight = 0; weight < 7; weight++) { + if (local[((y + weight) * size) + x] == '1') { + p += (0x40 >> weight); + } + } + if ((p == 0x57) || (p == 0x75)) { + /* Pattern found, check before and after */ + beforeCount = 0; + for (b = (y - 3); b < y; b++) { + if (b < 0) { + beforeCount++; + } else { + if (local[(b * size) + x] == '0') { + beforeCount++; + } else { + beforeCount = 0; + } + } + } + + afterCount = 0; + for (a = (y + 7); a <= (y + 9); a++) { + if (a >= size) { + afterCount++; + } else { + if (local[(a * size) + x] == '0') { + afterCount++; + } else { + afterCount = 0; + } + } + } + + if ((beforeCount == 3) || (afterCount == 3)) { + /* Pattern is preceeded or followed by light area + 3 modules wide */ + result += 50; + } + } + } + } + + /* Horizontal */ + for (y = 0; y < size; y++) { + for (x = 0; x < (size - 7); x++) { + p = 0; + for (weight = 0; weight < 7; weight++) { + if (local[(y * size) + x + weight] == '1') { + p += (0x40 >> weight); + } + } + if ((p == 0x57) || (p == 0x75)) { + /* Pattern found, check before and after */ + beforeCount = 0; + for (b = (x - 3); b < x; b++) { + if (b < 0) { + beforeCount++; + } else { + if (local[(y * size) + b] == '0') { + beforeCount++; + } else { + beforeCount = 0; + } + } + } + + afterCount = 0; + for (a = (x + 7); a <= (x + 9); a++) { + if (a >= size) { + afterCount++; + } else { + if (local[(y * size) + a] == '0') { + afterCount++; + } else { + afterCount = 0; + } + } + } + + if ((beforeCount == 3) || (afterCount == 3)) { + /* Pattern is preceeded or followed by light area + 3 modules wide */ + result += 50; + } + } + } + } + + /* Test 2: Adjacent modules in row/column in same colour */ + /* In AIMD-15 section 5.8.3.2 it is stated... “In Table 9 below, i refers to the row + * position of the module.” - however i being the length of the run of the + * same colour (i.e. "block" below) in the same fashion as ISO/IEC 18004 + * makes more sense. -- Confirmed by Wang Yi */ + + /* Vertical */ + for (x = 0; x < size; x++) { + state = local[x]; + block = 0; + for (y = 0; y < size; y++) { + if (local[(y * size) + x] == state) { + block++; + } else { + if (block > 3) { + result += (3 + block) * 4; + } + block = 0; + state = local[(y * size) + x]; + } + } + if (block > 3) { + result += (3 + block) * 4; + } + } + + /* Horizontal */ + for (y = 0; y < size; y++) { + state = local[y * size]; + block = 0; + for (x = 0; x < size; x++) { + if (local[(y * size) + x] == state) { + block++; + } else { + if (block > 3) { + result += (3 + block) * 4; + } + block = 0; + state = local[(y * size) + x]; + } + } + if (block > 3) { + result += (3 + block) * 4; + } + } + + return result; +} + +/* Apply the four possible bitmasks for evaluation */ +int hx_apply_bitmask(unsigned char *grid, int size) { + int x, y; + int i, j; + int pattern, penalty[4]; + int best_pattern, best_val; + int bit; + unsigned char p; + +#ifndef _MSC_VER + unsigned char mask[size * size]; + unsigned char eval[size * size]; +#else + unsigned char* mask = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); + unsigned char* eval = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); +#endif + + /* Perform data masking */ + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + mask[(y * size) + x] = 0x00; + j = x + 1; + i = y + 1; + + if (!(grid[(y * size) + x] & 0xf0)) { + if ((i + j) % 2 == 0) { + mask[(y * size) + x] += 0x02; + } + if ((((i + j) % 3) + (j % 3)) % 2 == 0) { + mask[(y * size) + x] += 0x04; + } + if (((i % j) + (j % i) + (i % 3) + (j % 3)) % 2 == 0) { + mask[(y * size) + x] += 0x08; + } + } + } + } + + // apply data masks to grid, result in eval + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if (grid[(y * size) + x] & 0x01) { + p = 0xff; + } else { + p = 0x00; + } + + eval[(y * size) + x] = mask[(y * size) + x] ^ p; + } + } + + /* Evaluate result */ + for (pattern = 0; pattern < 4; pattern++) { + penalty[pattern] = hx_evaluate(eval, size, pattern); + } + + best_pattern = 0; + best_val = penalty[0]; + for (pattern = 1; pattern < 4; pattern++) { + if (penalty[pattern] < best_val) { + best_pattern = pattern; + best_val = penalty[pattern]; + } + } + + /* Apply mask */ + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + bit = 0; + switch (best_pattern) { + case 0: if (mask[(y * size) + x] & 0x01) { + bit = 1; + } + break; + case 1: if (mask[(y * size) + x] & 0x02) { + bit = 1; + } + break; + case 2: if (mask[(y * size) + x] & 0x04) { + bit = 1; + } + break; + case 3: if (mask[(y * size) + x] & 0x08) { + bit = 1; + } + break; + } + if (bit == 1) { + if (grid[(y * size) + x] & 0x01) { + grid[(y * size) + x] = 0x00; + } else { + grid[(y * size) + x] = 0x01; + } + } + } + } + + return best_pattern; +} + +/* Han Xin Code - main */ +int han_xin(struct zint_symbol *symbol, const unsigned char source[], size_t length) { + int est_binlen; + int ecc_level = symbol->option_1; + int i, j, version, posn = 0; + int data_codewords = 0, size; + int codewords; + int bitmask; + int error_number; + int bin_len; + int done; + char function_information[36]; + unsigned char fi_cw[3] = {0, 0, 0}; + unsigned char fi_ecc[4]; + +#ifndef _MSC_VER + int utfdata[length + 1]; + int gbdata[(length + 1) * 2]; + char mode[length + 1]; +#else + int* utfdata = (int *) _alloca((length + 1) * sizeof (int)); + int* gbdata = (int *) _alloca(((length + 1) * 2) * sizeof (int)); + char* mode = (char *) _alloca((length + 1) * sizeof (char)); + char* binary; + unsigned char *datastream; + unsigned char *fullstream; + unsigned char *picket_fence; + unsigned char *grid; +#endif + + if ((symbol->input_mode == DATA_MODE) || (symbol->eci != 3)) { + for (i = 0; i < length; i++) { + gbdata[i] = (int) source[i]; + } + } else { + /* Convert Unicode input to GB-18030 */ + error_number = utf8toutf16(symbol, source, utfdata, &length); + if (error_number != 0) { + return error_number; + } + + posn = 0; + for (i = 0; i < length; i++) { + done = 0; + gbdata[posn] = 0; + + /* Single byte characters in range U+0000 -> U+007F */ + if (utfdata[i] <= 0x7f) { + gbdata[posn] = utfdata[i]; + posn++; + done = 1; + } + + /* Two bytes characters in GB-2312 */ + if (done == 0) { + j = 0; + do { + if (gb2312_lookup[j * 2] == utfdata[i]) { + gbdata[posn] = gb2312_lookup[(j * 2) + 1]; + posn++; + done = 1; + } + j++; + } while ((j < 7445) && (done == 0)); + } + + /* Two byte characters in GB-18030 */ + if (done == 0) { + j = 0; + do { + if (gb18030_twobyte_lookup[j * 2] == utfdata[i]) { + gbdata[posn] = gb18030_twobyte_lookup[(j * 2) + 1]; + posn++; + done = 1; + } + j++; + } while ((j < 16495) && (done == 0)); + } + + /* Four byte characters in range U+0080 -> U+FFFF */ + if (done == 0) { + j = 0; + do { + if (gb18030_fourbyte_lookup[j * 3] == utfdata[i]) { + gbdata[posn] = gb18030_fourbyte_lookup[(j * 3) + 1]; + gbdata[posn + 1] = gb18030_fourbyte_lookup[(j * 3) + 2]; + posn += 2; + done = 1; + } + j++; + } while ((j < 6793) && (done == 0)); + } + + /* Supplementary planes U+10000 -> U+1FFFF */ + if (done == 0) { + if (utfdata[i] >= 0x10000 && utfdata[i] < 0x110000) { + /* algorithm from libiconv-1.15\lib\gb18030.h */ + int j, r3, r2, r1, r0; + + j = utfdata[i] - 0x10000; + r3 = (j % 10) + 0x30; j = j / 10; + r2 = (j % 126) + 0x81; j = j / 126; + r1 = (j % 10) + 0x30; j = j / 10; + r0 = j + 0x90; + gbdata[posn] = (r0 << 8) + r1; + gbdata[posn + 1] = (r2 << 8) + r3; + posn += 2; + done = 1; + } + } + + /* Character not found */ + if (done == 0) { + strcpy(symbol->errtxt, "540: Unknown character in input data"); + return ZINT_ERROR_INVALID_DATA; + } + } + length = posn; + } + + hx_define_mode(mode, gbdata, length); + + est_binlen = calculate_binlength(mode, gbdata, length, symbol->eci); + +#ifndef _MSC_VER + char binary[est_binlen + 10]; +#else + binary = (char *) _alloca((est_binlen + 10) * sizeof (char)); +#endif + memset(binary, 0, (est_binlen + 1) * sizeof (char)); + + if ((ecc_level <= 0) || (ecc_level >= 5)) { + ecc_level = 1; + } + + calculate_binary(binary, mode, gbdata, length, symbol->eci, symbol->debug); + bin_len = strlen(binary); + codewords = bin_len / 8; + if (bin_len % 8 != 0) { + codewords++; + } + + version = 85; + for (i = 84; i > 0; i--) { + switch (ecc_level) { + case 1: + if (hx_data_codewords_L1[i - 1] > codewords) { + version = i; + data_codewords = hx_data_codewords_L1[i - 1]; + } + break; + case 2: + if (hx_data_codewords_L2[i - 1] > codewords) { + version = i; + data_codewords = hx_data_codewords_L2[i - 1]; + } + break; + case 3: + if (hx_data_codewords_L3[i - 1] > codewords) { + version = i; + data_codewords = hx_data_codewords_L3[i - 1]; + } + break; + case 4: + if (hx_data_codewords_L4[i - 1] > codewords) { + version = i; + data_codewords = hx_data_codewords_L4[i - 1]; + } + break; + default: + assert(0); + break; + } + } + + if (version == 85) { + strcpy(symbol->errtxt, "541: Input too long for selected error correction level"); + return ZINT_ERROR_TOO_LONG; + } + + if ((symbol->option_2 < 0) || (symbol->option_2 > 84)) { + symbol->option_2 = 0; + } + + if (symbol->option_2 > version) { + version = symbol->option_2; + } + + if ((symbol->option_2 != 0) && (symbol->option_2 < version)) { + strcpy(symbol->errtxt, "542: Input too long for selected symbol size"); + return ZINT_ERROR_TOO_LONG; + } + + /* If there is spare capacity, increase the level of ECC */ + + if ((ecc_level == 1) && (codewords < hx_data_codewords_L2[version - 1])) { + ecc_level = 2; + data_codewords = hx_data_codewords_L2[version - 1]; + } + + if ((ecc_level == 2) && (codewords < hx_data_codewords_L3[version - 1])) { + ecc_level = 3; + data_codewords = hx_data_codewords_L3[version - 1]; + } + + if ((ecc_level == 3) && (codewords < hx_data_codewords_L4[version - 1])) { + ecc_level = 4; + data_codewords = hx_data_codewords_L4[version - 1]; + } + + //printf("Version %d, ECC %d\n", version, ecc_level); + + size = (version * 2) + 21; + +#ifndef _MSC_VER + unsigned char datastream[data_codewords]; + unsigned char fullstream[hx_total_codewords[version - 1]]; + unsigned char picket_fence[hx_total_codewords[version - 1]]; + unsigned char grid[size * size]; +#else + datastream = (unsigned char *) _alloca((data_codewords) * sizeof (unsigned char)); + fullstream = (unsigned char *) _alloca((hx_total_codewords[version - 1]) * sizeof (unsigned char)); + picket_fence = (unsigned char *) _alloca((hx_total_codewords[version - 1]) * sizeof (unsigned char)); + grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); +#endif + + for (i = 0; i < data_codewords; i++) { + datastream[i] = 0; + } + + for (i = 0; i < bin_len; i++) { + if (binary[i] == '1') { + datastream[i / 8] += 0x80 >> (i % 8); + } + } + + hx_setup_grid(grid, size, version); + + hx_add_ecc(fullstream, datastream, version, ecc_level); + + make_picket_fence(fullstream, picket_fence, hx_total_codewords[version - 1]); + + /* Populate grid */ + j = 0; + for (i = 0; i < (size * size); i++) { + if (grid[i] == 0x00) { + if (j < (hx_total_codewords[version - 1] * 8)) { + if (picket_fence[(j / 8)] & (0x80 >> (j % 8))) { + grid[i] = 0x01; + } + j++; + } + } + } + + bitmask = hx_apply_bitmask(grid, size); + + /* Form function information string */ + for (i = 0; i < 34; i++) { + if (i % 2) { + function_information[i] = '1'; + } else { + function_information[i] = '0'; + } + } + function_information[34] = '\0'; + + for (i = 0; i < 8; i++) { + if ((version + 20) & (0x80 >> i)) { + function_information[i] = '1'; + } else { + function_information[i] = '0'; + } + } + + for (i = 0; i < 2; i++) { + if ((ecc_level - 1) & (0x02 >> i)) { + function_information[i + 8] = '1'; + } else { + function_information[i + 8] = '0'; + } + } + + for (i = 0; i < 2; i++) { + if (bitmask & (0x02 >> i)) { + function_information[i + 10] = '1'; + } else { + function_information[i + 10] = '0'; + } + } + + + + for (i = 0; i < 3; i++) { + for (j = 0; j < 4; j++) { + if (function_information[(i * 4) + j] == '1') { + fi_cw[i] += (0x08 >> j); + } + } + } + + rs_init_gf(0x13); + rs_init_code(4, 1); + rs_encode(3, fi_cw, fi_ecc); + rs_free(); + + for (i = 0; i < 4; i++) { + for (j = 0; j < 4; j++) { + if (fi_ecc[3 - i] & (0x08 >> j)) { + function_information[(i * 4) + j + 12] = '1'; + } else { + function_information[(i * 4) + j + 12] = '0'; + } + } + } + + /* Add function information to symbol */ + for (i = 0; i < 9; i++) { + if (function_information[i] == '1') { + grid[(8 * size) + i] = 0x01; + grid[((size - 8 - 1) * size) + (size - i - 1)] = 0x01; + } + if (function_information[i + 8] == '1') { + grid[((8 - i) * size) + 8] = 0x01; + grid[((size - 8 - 1 + i) * size) + (size - 8 - 1)] = 0x01; + } + if (function_information[i + 17] == '1') { + grid[(i * size) + (size - 1 - 8)] = 0x01; + grid[((size - 1 - i) * size) + 8] = 0x01; + } + if (function_information[i + 25] == '1') { + grid[(8 * size) + (size - 1 - 8 + i)] = 0x01; + grid[((size - 1 - 8) * size) + (8 - i)] = 0x01; + } + } + + symbol->width = size; + symbol->rows = size; + + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + if (grid[(i * size) + j] & 0x01) { + set_module(symbol, i, j); + } + } + symbol->row_height[i] = 1; + } + + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/hanxin.h b/3rdparty/zint-2.6.1/backend/hanxin.h new file mode 100644 index 0000000..1ad4685 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/hanxin.h @@ -0,0 +1,460 @@ +/* hanxin.h - definitions for Han Xin code + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + Copyright (C) 2016 Zoe Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* Data from table B1: Data capacity of Han Xin Code */ +static const unsigned short int hx_total_codewords[] = { + 25, 37, 50, 54, 69, 84, 100, 117, 136, 155, 161, 181, 203, 225, 249, + 273, 299, 325, 353, 381, 411, 422, 453, 485, 518, 552, 587, 623, 660, + 698, 737, 754, 794, 836, 878, 922, 966, 1011, 1058, 1105, 1126, 1175, + 1224, 1275, 1327, 1380, 1434, 1489, 1513, 1569, 1628, 1686, 1745, 1805, + 1867, 1929, 1992, 2021, 2086, 2151, 2218, 2286, 2355, 2425, 2496, 2528, + 2600, 2673, 2749, 2824, 2900, 2977, 3056, 3135, 3171, 3252, 3334, 3416, + 3500, 3585, 3671, 3758, 3798, 3886 +}; + +static const unsigned short int hx_data_codewords_L1[] = { + 21, 31, 42, 46, 57, 70, 84, 99, 114, 131, 135, 153, 171, 189, 209, 229, + 251, 273, 297, 321, 345, 354, 381, 407, 436, 464, 493, 523, 554, 586, 619, + 634, 666, 702, 738, 774, 812, 849, 888, 929, 946, 987, 1028, 1071, 1115, + 1160, 1204, 1251, 1271, 1317, 1368, 1416, 1465, 1517, 1569, 1621, 1674, + 1697, 1752, 1807, 1864, 1920, 1979, 2037, 2096, 2124, 2184, 2245, 2309, + 2372, 2436, 2501, 2568, 2633, 2663, 2732, 2800, 2870, 2940, 3011, + 3083, 3156, 3190, 3264 +}; + +static const unsigned short int hx_data_codewords_L2[] = { + 17, 25, 34, 38, 49, 58, 70, 81, 96, 109, 113, 127, 143, 157, 175, 191, 209, + 227, 247, 267, 287, 296, 317, 339, 362, 386, 411, 437, 462, 488, 515, 528, + 556, 586, 614, 646, 676, 707, 740, 773, 788, 823, 856, 893, 929, 966, 1004, + 1043, 1059, 1099, 1140, 1180, 1221, 1263, 1307, 1351, 1394, 1415, 1460, + 1505, 1552, 1600, 1649, 1697, 1748, 1770, 1820, 1871, 1925, 1976, 2030, + 2083, 2140, 2195, 2219, 2276, 2334, 2392, 2450, 2509, 2569, 2630, 2658, + 2720 +}; + +static const unsigned short int hx_data_codewords_L3[] = { + 13, 19, 26, 30, 37, 46, 54, 63, 74, 83, 87, 97, 109, 121, 135, 147, 161, + 175, 191, 205, 221, 228, 245, 261, 280, 298, 317, 337, 358, 376, 397, 408, + 428, 452, 474, 498, 522, 545, 572, 597, 608, 635, 660, 689, 717, 746, 774, + 805, 817, 847, 880, 910, 943, 975, 1009, 1041, 1076, 1091, 1126, 1161, 1198, + 1234, 1271, 1309, 1348, 1366, 1404, 1443, 1485, 1524, 1566, 1607, 1650, 1693, + 1713, 1756, 1800, 1844, 1890, 1935, 1983, 2030, 2050, 2098 +}; + +static const unsigned short int hx_data_codewords_L4[] = { + 9, 15, 20, 22, 27, 34, 40, 47, 54, 61, 65, 73, 81, 89, 99, 109, 119, 129, + 141, 153, 165, 168, 181, 195, 208, 220, 235, 251, 264, 280, 295, 302, 318, + 334, 352, 368, 386, 405, 424, 441, 450, 469, 490, 509, 531, 552, 574, 595, 605, + 627, 652, 674, 697, 721, 747, 771, 796, 809, 834, 861, 892, 914, 941, 969, 998, + 1012, 1040, 1069, 1099, 1130, 1160, 1191, 1222, 1253, 1269, 1300, 1334, + 1366, 1400, 1433, 1469, 1504, 1520, 1554 +}; + +/* Value 'k' from Annex A */ +static const char hx_module_k[] = { + 0, 0, 0, 14, 16, 16, 17, 18, 19, 20, + 14, 15, 16, 16, 17, 17, 18, 19, 20, 20, + 21, 16, 17, 17, 18, 18, 19, 19, 20, 20, + 21, 17, 17, 18, 18, 19, 19, 19, 20, 20, + 17, 17, 18, 18, 18, 19, 19, 19, 17, 17, + 18, 18, 18, 18, 19, 19, 19, 17, 17, 18, + 18, 18, 18, 19, 19, 17, 17, 17, 18, 18, + 18, 18, 19, 19, 17, 17, 17, 18, 18, 18, + 18, 18, 17, 17 +}; + +/* Value 'r' from Annex A */ +static const char hx_module_r[] = { + 0, 0, 0, 15, 15, 17, 18, 19, 20, 21, + 15, 15, 15, 17, 17, 19, 19, 19, 19, 21, + 21, 17, 16, 18, 17, 19, 18, 20, 19, 21, + 20, 17, 19, 17, 19, 17, 19, 21, 19, 21, + 18, 20, 17, 19, 21, 18, 20, 22, 17, 19, + 15, 17, 19, 21, 17, 19, 21, 18, 20, 15, + 17, 19, 21, 16, 18, 17, 19, 21, 15, 17, + 19, 21, 15, 17, 18, 20, 22, 15, 17, 19, + 21, 23, 17, 19 +}; + +/* Value of 'm' from Annex A */ +static const char hx_module_m[] = { + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, + 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9, 10, 10 +}; + +/* Error correction block sizes from Table D1 */ +static const unsigned short int hx_table_d1[] = { + /* #blocks, k, 2t, #blocks, k, 2t, #blocks, k, 2t */ + 1, 21, 4, 0, 0, 0, 0, 0, 0, // version 1 + 1, 17, 8, 0, 0, 0, 0, 0, 0, + 1, 13, 12, 0, 0, 0, 0, 0, 0, + 1, 9, 16, 0, 0, 0, 0, 0, 0, + 1, 31, 6, 0, 0, 0, 0, 0, 0, // version 2 + 1, 25, 12, 0, 0, 0, 0, 0, 0, + 1, 19, 18, 0, 0, 0, 0, 0, 0, + 1, 15, 22, 0, 0, 0, 0, 0, 0, + 1, 42, 8, 0, 0, 0, 0, 0, 0, // version 3 + 1, 34, 16, 0, 0, 0, 0, 0, 0, + 1, 26, 24, 0, 0, 0, 0, 0, 0, + 1, 20, 30, 0, 0, 0, 0, 0, 0, + 1, 46, 8, 0, 0, 0, 0, 0, 0, // version 4 + 1, 38, 16, 0, 0, 0, 0, 0, 0, + 1, 30, 24, 0, 0, 0, 0, 0, 0, + 1, 22, 32, 0, 0, 0, 0, 0, 0, + 1, 57, 12, 0, 0, 0, 0, 0, 0, // version 5 + 1, 49, 20, 0, 0, 0, 0, 0, 0, + 1, 37, 32, 0, 0, 0, 0, 0, 0, + 1, 14, 20, 1, 13, 22, 0, 0, 0, + 1, 70, 14, 0, 0, 0, 0, 0, 0, // version 6 + 1, 58, 26, 0, 0, 0, 0, 0, 0, + 1, 24, 20, 1, 22, 18, 0, 0, 0, + 1, 16, 24, 1, 18, 26, 0, 0, 0, + 1, 84, 16, 0, 0, 0, 0, 0, 0, // version 7 + 1, 70, 30, 0, 0, 0, 0, 0, 0, + 1, 26, 22, 1, 28, 24, 0, 0, 0, + 2, 14, 20, 1, 12, 20, 0, 0, 0, + 1, 99, 18, 0, 0, 0, 0, 0, 0, // version 8 + 1, 40, 18, 1, 41, 18, 0, 0, 0, + 1, 31, 26, 1, 32, 28, 0, 0, 0, + 2, 16, 24, 1, 15, 22, 0, 0, 0, + 1, 114, 22, 0, 0, 0, 0, 0, 0, // version 9 + 2, 48, 20, 0, 0, 0, 0, 0, 0, + 2, 24, 20, 1, 26, 22, 0, 0, 0, + 2, 18, 28, 1, 18, 26, 0, 0, 0, + 1, 131, 24, 0, 0, 0, 0, 0, 0, // version 10 + 1, 52, 22, 1, 57, 24, 0, 0, 0, + 2, 27, 24, 1, 29, 24, 0, 0, 0, + 2, 21, 32, 1, 19, 30, 0, 0, 0, + 1, 135, 26, 0, 0, 0, 0, 0, 0, // version 11 + 1, 56, 24, 1, 57, 24, 0, 0, 0, + 2, 28, 24, 1, 31, 26, 0, 0, 0, + 2, 22, 32, 1, 21, 32, 0, 0, 0, + 1, 153, 28, 0, 0, 0, 0, 0, 0, // version 12 + 1, 62, 26, 1, 65, 28, 0, 0, 0, + 2, 32, 28, 1, 33, 28, 0, 0, 0, + 3, 17, 26, 1, 22, 30, 0, 0, 0, + 1, 86, 16, 1, 85, 16, 0, 0, 0, // version 13 + 1, 71, 30, 1, 72, 30, 0, 0, 0, + 2, 37, 32, 1, 35, 30, 0, 0, 0, + 3, 20, 30, 1, 21, 32, 0, 0, 0, + 1, 94, 18, 1, 95, 18, 0, 0, 0, // version 14 + 2, 51, 22, 1, 55, 24, 0, 0, 0, + 3, 30, 26, 1, 31, 26, 0, 0, 0, + 4, 18, 28, 1, 17, 24, 0, 0, 0, + 1, 104, 20, 1, 105, 20, 0, 0, 0, // version 15 + 2, 57, 24, 1, 61, 26, 0, 0, 0, + 3, 33, 28, 1, 36, 30, 0, 0, 0, + 4, 20, 30, 1, 19, 30, 0, 0, 0, + 1, 115, 22, 1, 114, 22, 0, 0, 0, // version 16 + 2, 65, 28, 1, 61, 26, 0, 0, 0, + 3, 38, 32, 1, 33, 30, 0, 0, 0, + 5, 19, 28, 1, 14, 24, 0, 0, 0, + 1, 126, 24, 1, 125, 24, 0, 0, 0, // version 17 + 2, 70, 30, 1, 69, 30, 0, 0, 0, + 4, 33, 28, 1, 29, 26, 0, 0, 0, + 5, 20, 30, 1, 19, 30, 0, 0, 0, + 1, 136, 26, 1, 137, 26, 0, 0, 0, //version 18 + 3, 56, 24, 1, 59, 26, 0, 0, 0, + 5, 35, 30, 0, 0, 0, 0, 0, 0, + 6, 18, 28, 1, 21, 28, 0, 0, 0, + 1, 148, 28, 1, 149, 28, 0, 0, 0, // version 19 + 3, 61, 26, 1, 64, 28, 0, 0, 0, + 7, 24, 20, 1, 23, 22, 0, 0, 0, + 6, 20, 30, 1, 21, 32, 0, 0, 0, + 3, 107, 20, 0, 0, 0, 0, 0, 0, // version 20 + 3, 65, 28, 1, 72, 30, 0, 0, 0, + 7, 26, 22, 1, 23, 22, 0, 0, 0, + 7, 19, 28, 1, 20, 32, 0, 0, 0, + 3, 115, 22, 0, 0, 0, 0, 0, 0, // version 21 + 4, 56, 24, 1, 63, 28, 0, 0, 0, + 7, 28, 24, 1, 25, 22, 0, 0, 0, + 8, 18, 28, 1, 21, 22, 0, 0, 0, + 2, 116, 22, 1, 122, 24, 0, 0, 0, // version 22 + 4, 56, 24, 1, 72, 30, 0, 0, 0, + 7, 28, 24, 1, 32, 26, 0, 0, 0, + 8, 18, 28, 1, 24, 30, 0, 0, 0, + 3, 127, 24, 0, 0, 0, 0, 0, 0, // version 23 + 5, 51, 22, 1, 62, 26, 0, 0, 0, + 7, 30, 26, 1, 35, 26, 0, 0, 0, + 8, 20, 30, 1, 21, 32, 0, 0, 0, + 2, 135, 26, 1, 137, 26, 0, 0, 0, // version 24 + 5, 56, 24, 1, 59, 26, 0, 0, 0, + 7, 33, 28, 1, 30, 28, 0, 0, 0, + 11, 16, 24, 1, 19, 26, 0, 0, 0, + 3, 105, 20, 1, 121, 22, 0, 0, 0, // version 25 + 5, 61, 26, 1, 57, 26, 0, 0, 0, + 9, 28, 24, 1, 28, 22, 0, 0, 0, + 10, 19, 28, 1, 18, 30, 0, 0, 0, + 2, 157, 30, 1, 150, 28, 0, 0, 0, // version 26 + 5, 65, 28, 1, 61, 26, 0, 0, 0, + 8, 33, 28, 1, 34, 30, 0, 0, 0, + 10, 19, 28, 2, 15, 26, 0, 0, 0, + 3, 126, 24, 1, 115, 22, 0, 0, 0, // version 27 + 7, 51, 22, 1, 54, 22, 0, 0, 0, + 8, 35, 30, 1, 37, 30, 0, 0, 0, + 15, 15, 22, 1, 10, 22, 0, 0, 0, + 4, 105, 20, 1, 103, 20, 0, 0, 0, // version 28 + 7, 56, 24, 1, 45, 18, 0, 0, 0, + 10, 31, 26, 1, 27, 26, 0, 0, 0, + 10, 17, 26, 3, 20, 28, 1, 21, 28, + 3, 139, 26, 1, 137, 28, 0, 0, 0, // version 29 + 6, 66, 28, 1, 66, 30, 0, 0, 0, + 9, 36, 30, 1, 34, 32, 0, 0, 0, + 13, 19, 28, 1, 17, 32, 0, 0, 0, + 6, 84, 16, 1, 82, 16, 0, 0, 0, // version 30 + 6, 70, 30, 1, 68, 30, 0, 0, 0, + 7, 35, 30, 3, 33, 28, 1, 32, 28, + 13, 20, 30, 1, 20, 28, 0, 0, 0, + 5, 105, 20, 1, 94, 18, 0, 0, 0, // version 31 + 6, 74, 32, 1, 71, 30, 0, 0, 0, + 11, 33, 28, 1, 34, 32, 0, 0, 0, + 13, 19, 28, 3, 16, 26, 0, 0, 0, + 4, 127, 24, 1, 126, 24, 0, 0, 0, // version 32 + 7, 66, 28, 1, 66, 30, 0, 0, 0, + 12, 30, 24, 1, 24, 28, 1, 24, 30, + 15, 19, 28, 1, 17, 32, 0, 0, 0, + 7, 84, 16, 1, 78, 16, 0, 0, 0, // version 33 + 7, 70, 30, 1, 66, 28, 0, 0, 0, + 12, 33, 28, 1, 32, 30, 0, 0, 0, + 14, 21, 32, 1, 24, 28, 0, 0, 0, + 5, 117, 22, 1, 117, 24, 0, 0, 0, // version 34 + 8, 66, 28, 1, 58, 26, 0, 0, 0, + 11, 38, 32, 1, 34, 32, 0, 0, 0, + 15, 20, 30, 2, 17, 26, 0, 0, 0, + 4, 148, 28, 1, 146, 28, 0, 0, 0, // version 35 + 8, 68, 30, 1, 70, 24, 0, 0, 0, + 10, 36, 32, 3, 38, 28, 0, 0, 0, + 16, 19, 28, 3, 16, 26, 0, 0, 0, + 4, 126, 24, 2, 135, 26, 0, 0, 0, // version 36 + 8, 70, 28, 2, 43, 26, 0, 0, 0, + 13, 32, 28, 2, 41, 30, 0, 0, 0, + 17, 19, 28, 3, 15, 26, 0, 0, 0, + 5, 136, 26, 1, 132, 24, 0, 0, 0, // version 37 + 5, 67, 30, 4, 68, 28, 1, 69, 28, + 14, 35, 30, 1, 32, 24, 0, 0, 0, + 18, 18, 26, 3, 16, 28, 1, 14, 28, + 3, 142, 26, 3, 141, 28, 0, 0, 0, // version 38 + 8, 70, 30, 1, 73, 32, 1, 74, 32, + 12, 34, 30, 3, 34, 26, 1, 35, 28, + 18, 21, 32, 1, 27, 30, 0, 0, 0, + 5, 116, 22, 2, 103, 20, 1, 102, 20, // version 39 + 9, 74, 32, 1, 74, 30, 0, 0, 0, + 14, 34, 28, 2, 32, 32, 1, 32, 30, + 19, 21, 32, 1, 25, 26, 0, 0, 0, + 7, 116, 22, 1, 117, 22, 0, 0, 0, // version 40 + 11, 65, 28, 1, 58, 24, 0, 0, 0, + 15, 38, 32, 1, 27, 28, 0, 0, 0, + 20, 20, 30, 1, 20, 32, 1, 21, 32, + 6, 136, 26, 1, 130, 24, 0, 0, 0, // version 41 + 11, 66, 28, 1, 62, 30, 0, 0, 0, + 14, 34, 28, 3, 34, 32, 1, 30, 30, + 18, 20, 30, 3, 20, 28, 2, 15, 26, + 5, 105, 20, 2, 115, 22, 2, 116, 22, // version 42 + 10, 75, 32, 1, 73, 32, 0, 0, 0, + 16, 38, 32, 1, 27, 28, 0, 0, 0, + 22, 19, 28, 2, 16, 30, 1, 19, 30, + 6, 147, 28, 1, 146, 28, 0, 0, 0, // version 43 + 11, 66, 28, 2, 65, 30, 0, 0, 0, + 18, 33, 28, 2, 33, 30, 0, 0, 0, + 22, 21, 32, 1, 28, 30, 0, 0, 0, + 6, 116, 22, 3, 125, 24, 0, 0, 0, // version 44 + 11, 75, 32, 1, 68, 30, 0, 0, 0, + 13, 35, 28, 6, 34, 32, 1, 30, 30, + 23, 21, 32, 1, 26, 30, 0, 0, 0, + 7, 105, 20, 4, 95, 18, 0, 0, 0, // version 45 + 12, 67, 28, 1, 63, 30, 1, 62, 32, + 21, 31, 26, 2, 33, 32, 0, 0, 0, + 23, 21, 32, 2, 24, 30, 0, 0, 0, + 10, 116, 22, 0, 0, 0, 0, 0, 0, // version 46 + 12, 74, 32, 1, 78, 30, 0, 0, 0, + 18, 37, 32, 1, 39, 30, 1, 41, 28, + 25, 21, 32, 1, 27, 28, 0, 0, 0, + 5, 126, 24, 4, 115, 22, 1, 114, 22, // version 47 + 12, 67, 28, 2, 66, 32, 1, 68, 30, + 21, 35, 30, 1, 39, 30, 0, 0, 0, + 26, 21, 32, 1, 28, 28, 0, 0, 0, + 9, 126, 24, 1, 117, 22, 0, 0, 0, // version 48 + 13, 75, 32, 1, 68, 30, 0, 0, 0, + 20, 35, 30, 3, 35, 28, 0, 0, 0, + 27, 21, 32, 1, 28, 30, 0, 0, 0, + 9, 126, 24, 1, 137, 26, 0, 0, 0, // version 49 + 13, 71, 30, 2, 68, 32, 0, 0, 0, + 20, 37, 32, 1, 39, 28, 1, 38, 28, + 24, 20, 32, 5, 25, 28, 0, 0, 0, + 8, 147, 28, 1, 141, 28, 0, 0, 0, // version 50 + 10, 73, 32, 4, 74, 30, 1, 73, 30, + 16, 36, 32, 6, 39, 30, 1, 37, 30, + 27, 21, 32, 3, 20, 26, 0, 0, 0, + 9, 137, 26, 1, 135, 26, 0, 0, 0, // version 51 + 12, 70, 30, 4, 75, 32, 0, 0, 0, + 24, 35, 30, 1, 40, 28, 0, 0, 0, + 23, 20, 32, 8, 24, 30, 0, 0, 0, + 14, 95, 18, 1, 86, 18, 0, 0, 0, // version 52 + 13, 73, 32, 3, 77, 30, 0, 0, 0, + 24, 35, 30, 2, 35, 28, 0, 0, 0, + 26, 21, 32, 5, 21, 30, 1, 23, 30, + 9, 147, 28, 1, 142, 28, 0, 0, 0, // version 53 + 10, 73, 30, 6, 70, 32, 1, 71, 32, + 25, 35, 30, 2, 34, 26, 0, 0, 0, + 29, 21, 32, 4, 22, 30, 0, 0, 0, + 11, 126, 24, 1, 131, 24, 0, 0, 0, // version 54 + 16, 74, 32, 1, 79, 30, 0, 0, 0, + 25, 38, 32, 1, 25, 30, 0, 0, 0, + 33, 21, 32, 1, 28, 28, 0, 0, 0, + 14, 105, 20, 1, 99, 18, 0, 0, 0, // version 55 + 19, 65, 28, 1, 72, 28, 0, 0, 0, + 24, 37, 32, 2, 40, 30, 1, 41, 30, + 31, 21, 32, 4, 24, 32, 0, 0, 0, + 10, 147, 28, 1, 151, 28, 0, 0, 0, // version 56 + 15, 71, 30, 3, 71, 32, 1, 73, 32, + 24, 37, 32, 3, 38, 30, 1, 39, 30, + 36, 19, 30, 3, 29, 26, 0, 0, 0, + 15, 105, 20, 1, 99, 18, 0, 0, 0, // version 57 + 19, 70, 30, 1, 64, 28, 0, 0, 0, + 27, 38, 32, 2, 25, 26, 0, 0, 0, + 38, 20, 30, 2, 18, 28, 0, 0, 0, + 14, 105, 20, 1, 113, 22, 1, 114, 22, // version 58 + 17, 67, 30, 3, 92, 32, 0, 0, 0, + 30, 35, 30, 1, 41, 30, 0, 0, 0, + 36, 21, 32, 1, 26, 30, 1, 27, 30, + 11, 146, 28, 1, 146, 26, 0, 0, 0, // version 59 + 20, 70, 30, 1, 60, 26, 0, 0, 0, + 29, 38, 32, 1, 24, 32, 0, 0, 0, + 40, 20, 30, 2, 17, 26, 0, 0, 0, + 3, 137, 26, 1, 136, 26, 10, 126, 24, // version 60 + 22, 65, 28, 1, 75, 30, 0, 0, 0, + 30, 37, 32, 1, 51, 30, 0, 0, 0, + 42, 20, 30, 1, 21, 30, 0, 0, 0, + 12, 126, 24, 2, 118, 22, 1, 116, 22, // version 61 + 19, 74, 32, 1, 74, 30, 1, 72, 28, + 30, 38, 32, 2, 29, 30, 0, 0, 0, + 39, 20, 32, 2, 37, 26, 1, 38, 26, + 12, 126, 24, 3, 136, 26, 0, 0, 0, // version 62 + 21, 70, 30, 2, 65, 28, 0, 0, 0, + 34, 35, 30, 1, 44, 32, 0, 0, 0, + 42, 20, 30, 2, 19, 28, 2, 18, 28, + 12, 126, 24, 3, 117, 22, 1, 116, 22, // version 63 + 25, 61, 26, 2, 62, 28, 0, 0, 0, + 34, 35, 30, 1, 40, 32, 1, 41, 32, + 45, 20, 30, 1, 20, 32, 1, 21, 32, + 15, 105, 20, 2, 115, 22, 2, 116, 22, // version 64 + 25, 65, 28, 1, 72, 28, 0, 0, 0, + 18, 35, 30, 17, 37, 32, 1, 50, 32, + 42, 20, 30, 6, 19, 28, 1, 15, 28, + 19, 105, 20, 1, 101, 20, 0, 0, 0, // version 65 + 33, 51, 22, 1, 65, 22, 0, 0, 0, + 40, 33, 28, 1, 28, 28, 0, 0, 0, + 49, 20, 30, 1, 18, 28, 0, 0, 0, + 18, 105, 20, 2, 117, 22, 0, 0, 0, // version 66 + 26, 65, 28, 1, 80, 30, 0, 0, 0, + 35, 35, 30, 3, 35, 28, 1, 36, 28, + 52, 18, 28, 2, 38, 30, 0, 0, 0, + 26, 84, 16, 0, 0, 0, 0, 0, 0, // version 67 + 26, 70, 30, 0, 0, 0, 0, 0, 0, + 45, 31, 26, 1, 9, 26, 0, 0, 0, + 52, 20, 30, 0, 0, 0, 0, 0, 0, + 16, 126, 24, 1, 114, 22, 1, 115, 22, // version 68 + 23, 70, 30, 3, 65, 28, 1, 66, 28, + 40, 35, 30, 1, 43, 30, 0, 0, 0, + 46, 20, 30, 7, 19, 28, 1, 16, 28, + 19, 116, 22, 1, 105, 22, 0, 0, 0, // version 69 + 20, 70, 30, 7, 66, 28, 1, 63, 28, + 40, 35, 30, 1, 42, 32, 1, 43, 32, + 54, 20, 30, 1, 19, 30, 0, 0, 0, + 17, 126, 24, 2, 115, 22, 0, 0, 0, // version 70 + 24, 70, 30, 4, 74, 32, 0, 0, 0, + 48, 31, 26, 2, 18, 26, 0, 0, 0, + 54, 19, 28, 6, 15, 26, 1, 14, 26, + 29, 84, 16, 0, 0, 0, 0, 0, 0, // version 71 + 29, 70, 30, 0, 0, 0, 0, 0, 0, + 6, 34, 30, 3, 36, 30, 38, 33, 28, + 58, 20, 30, 0, 0, 0, 0, 0, 0, + 16, 147, 28, 1, 149, 28, 0, 0, 0, // version 72 + 31, 66, 28, 1, 37, 26, 0, 0, 0, + 48, 33, 28, 1, 23, 26, 0, 0, 0, + 53, 20, 30, 6, 19, 28, 1, 17, 28, + 20, 115, 22, 2, 134, 24, 0, 0, 0, // verdion 73 + 29, 66, 28, 2, 56, 26, 2, 57, 26, + 45, 36, 30, 2, 15, 28, 0, 0, 0, + 59, 20, 30, 2, 21, 32, 0, 0, 0, + 17, 147, 28, 1, 134, 26, 0, 0, 0, // version 74 + 26, 70, 30, 5, 75, 32, 0, 0, 0, + 47, 35, 30, 1, 48, 32, 0, 0, 0, + 64, 18, 28, 2, 33, 30, 1, 35, 30, + 22, 115, 22, 1, 133, 24, 0, 0, 0, // version 75 + 33, 65, 28, 1, 74, 28, 0, 0, 0, + 43, 36, 30, 5, 27, 28, 1, 30, 28, + 57, 20, 30, 5, 21, 32, 1, 24, 32, + 18, 136, 26, 2, 142, 26, 0, 0, 0, // version 76 + 33, 66, 28, 2, 49, 26, 0, 0, 0, + 48, 35, 30, 2, 38, 28, 0, 0, 0, + 64, 20, 30, 1, 20, 32, 0, 0, 0, + 19, 126, 24, 2, 135, 26, 1, 136, 26, // version 77 + 32, 66, 28, 2, 55, 26, 2, 56, 26, + 49, 36, 30, 2, 18, 32, 0, 0, 0, + 65, 18, 28, 5, 27, 30, 1, 29, 30, + 20, 137, 26, 1, 130, 26, 0, 0, 0, // version 78 + 30, 75, 32, 2, 71, 32, 0, 0, 0, + 46, 35, 30, 6, 39, 32, 0, 0, 0, + 3, 12, 30, 70, 19, 28, 0, 0, 0, + 20, 147, 28, 0, 0, 0, 0, 0, 0, // version 79 + 35, 70, 30, 0, 0, 0, 0, 0, 0, + 49, 35, 30, 5, 35, 28, 0, 0, 0, + 70, 20, 30, 0, 0, 0, 0, 0, 0, + 21, 136, 26, 1, 155, 28, 0, 0, 0, // version 80 + 34, 70, 30, 1, 64, 28, 1, 65, 28, + 54, 35, 30, 1, 45, 30, 0, 0, 0, + 68, 20, 30, 3, 18, 28, 1, 19, 28, + 19, 126, 24, 5, 115, 22, 1, 114, 22, // version 81 + 33, 70, 30, 3, 65, 28, 1, 64, 28, + 52, 35, 30, 3, 41, 32, 1, 40, 32, + 67, 20, 30, 5, 21, 32, 1, 24, 32, + 2, 150, 28, 21, 136, 26, 0, 0, 0, // version 82 + 32, 70, 30, 6, 65, 28, 0, 0, 0, + 52, 38, 32, 2, 27, 32, 0, 0, 0, + 73, 20, 30, 2, 22, 32, 0, 0, 0, + 21, 126, 24, 4, 136, 26, 0, 0, 0, // version 83 + 30, 74, 32, 6, 73, 30, 0, 0, 0, + 54, 35, 30, 4, 40, 32, 0, 0, 0, + 75, 20, 30, 1, 20, 28, 0, 0, 0, + 30, 105, 20, 1, 114, 22, 0, 0, 0, // version 84 + 3, 45, 22, 55, 47, 20, 0, 0, 0, + 2, 26, 26, 62, 33, 28, 0, 0, 0, + 79, 18, 28, 4, 33, 30, 0, 0, 0 +}; \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/imail.c b/3rdparty/zint-2.6.1/backend/imail.c new file mode 100644 index 0000000..5489282 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/imail.c @@ -0,0 +1,605 @@ +/* imail.c - Handles Intelligent Mail (aka OneCode) for USPS */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* The function "USPS_MSB_Math_CRC11GenerateFrameCheckSequence" + is Copyright (C) 2006 United States Postal Service */ + +#include +#include +#include +#include "common.h" +#include "large.h" + +#define SODIUM "0123456789-" + +/* The following lookup tables were generated using the code in Appendix C */ + +static const unsigned short AppxD_I[1287] = { + /* Appendix D Table 1 - 5 of 13 characters */ + 0x001F, 0x1F00, 0x002F, 0x1E80, 0x0037, 0x1D80, 0x003B, 0x1B80, 0x003D, 0x1780, + 0x003E, 0x0F80, 0x004F, 0x1E40, 0x0057, 0x1D40, 0x005B, 0x1B40, 0x005D, 0x1740, + 0x005E, 0x0F40, 0x0067, 0x1CC0, 0x006B, 0x1AC0, 0x006D, 0x16C0, 0x006E, 0x0EC0, + 0x0073, 0x19C0, 0x0075, 0x15C0, 0x0076, 0x0DC0, 0x0079, 0x13C0, 0x007A, 0x0BC0, + 0x007C, 0x07C0, 0x008F, 0x1E20, 0x0097, 0x1D20, 0x009B, 0x1B20, 0x009D, 0x1720, + 0x009E, 0x0F20, 0x00A7, 0x1CA0, 0x00AB, 0x1AA0, 0x00AD, 0x16A0, 0x00AE, 0x0EA0, + 0x00B3, 0x19A0, 0x00B5, 0x15A0, 0x00B6, 0x0DA0, 0x00B9, 0x13A0, 0x00BA, 0x0BA0, + 0x00BC, 0x07A0, 0x00C7, 0x1C60, 0x00CB, 0x1A60, 0x00CD, 0x1660, 0x00CE, 0x0E60, + 0x00D3, 0x1960, 0x00D5, 0x1560, 0x00D6, 0x0D60, 0x00D9, 0x1360, 0x00DA, 0x0B60, + 0x00DC, 0x0760, 0x00E3, 0x18E0, 0x00E5, 0x14E0, 0x00E6, 0x0CE0, 0x00E9, 0x12E0, + 0x00EA, 0x0AE0, 0x00EC, 0x06E0, 0x00F1, 0x11E0, 0x00F2, 0x09E0, 0x00F4, 0x05E0, + 0x00F8, 0x03E0, 0x010F, 0x1E10, 0x0117, 0x1D10, 0x011B, 0x1B10, 0x011D, 0x1710, + 0x011E, 0x0F10, 0x0127, 0x1C90, 0x012B, 0x1A90, 0x012D, 0x1690, 0x012E, 0x0E90, + 0x0133, 0x1990, 0x0135, 0x1590, 0x0136, 0x0D90, 0x0139, 0x1390, 0x013A, 0x0B90, + 0x013C, 0x0790, 0x0147, 0x1C50, 0x014B, 0x1A50, 0x014D, 0x1650, 0x014E, 0x0E50, + 0x0153, 0x1950, 0x0155, 0x1550, 0x0156, 0x0D50, 0x0159, 0x1350, 0x015A, 0x0B50, + 0x015C, 0x0750, 0x0163, 0x18D0, 0x0165, 0x14D0, 0x0166, 0x0CD0, 0x0169, 0x12D0, + 0x016A, 0x0AD0, 0x016C, 0x06D0, 0x0171, 0x11D0, 0x0172, 0x09D0, 0x0174, 0x05D0, + 0x0178, 0x03D0, 0x0187, 0x1C30, 0x018B, 0x1A30, 0x018D, 0x1630, 0x018E, 0x0E30, + 0x0193, 0x1930, 0x0195, 0x1530, 0x0196, 0x0D30, 0x0199, 0x1330, 0x019A, 0x0B30, + 0x019C, 0x0730, 0x01A3, 0x18B0, 0x01A5, 0x14B0, 0x01A6, 0x0CB0, 0x01A9, 0x12B0, + 0x01AA, 0x0AB0, 0x01AC, 0x06B0, 0x01B1, 0x11B0, 0x01B2, 0x09B0, 0x01B4, 0x05B0, + 0x01B8, 0x03B0, 0x01C3, 0x1870, 0x01C5, 0x1470, 0x01C6, 0x0C70, 0x01C9, 0x1270, + 0x01CA, 0x0A70, 0x01CC, 0x0670, 0x01D1, 0x1170, 0x01D2, 0x0970, 0x01D4, 0x0570, + 0x01D8, 0x0370, 0x01E1, 0x10F0, 0x01E2, 0x08F0, 0x01E4, 0x04F0, 0x01E8, 0x02F0, + 0x020F, 0x1E08, 0x0217, 0x1D08, 0x021B, 0x1B08, 0x021D, 0x1708, 0x021E, 0x0F08, + 0x0227, 0x1C88, 0x022B, 0x1A88, 0x022D, 0x1688, 0x022E, 0x0E88, 0x0233, 0x1988, + 0x0235, 0x1588, 0x0236, 0x0D88, 0x0239, 0x1388, 0x023A, 0x0B88, 0x023C, 0x0788, + 0x0247, 0x1C48, 0x024B, 0x1A48, 0x024D, 0x1648, 0x024E, 0x0E48, 0x0253, 0x1948, + 0x0255, 0x1548, 0x0256, 0x0D48, 0x0259, 0x1348, 0x025A, 0x0B48, 0x025C, 0x0748, + 0x0263, 0x18C8, 0x0265, 0x14C8, 0x0266, 0x0CC8, 0x0269, 0x12C8, 0x026A, 0x0AC8, + 0x026C, 0x06C8, 0x0271, 0x11C8, 0x0272, 0x09C8, 0x0274, 0x05C8, 0x0278, 0x03C8, + 0x0287, 0x1C28, 0x028B, 0x1A28, 0x028D, 0x1628, 0x028E, 0x0E28, 0x0293, 0x1928, + 0x0295, 0x1528, 0x0296, 0x0D28, 0x0299, 0x1328, 0x029A, 0x0B28, 0x029C, 0x0728, + 0x02A3, 0x18A8, 0x02A5, 0x14A8, 0x02A6, 0x0CA8, 0x02A9, 0x12A8, 0x02AA, 0x0AA8, + 0x02AC, 0x06A8, 0x02B1, 0x11A8, 0x02B2, 0x09A8, 0x02B4, 0x05A8, 0x02B8, 0x03A8, + 0x02C3, 0x1868, 0x02C5, 0x1468, 0x02C6, 0x0C68, 0x02C9, 0x1268, 0x02CA, 0x0A68, + 0x02CC, 0x0668, 0x02D1, 0x1168, 0x02D2, 0x0968, 0x02D4, 0x0568, 0x02D8, 0x0368, + 0x02E1, 0x10E8, 0x02E2, 0x08E8, 0x02E4, 0x04E8, 0x0307, 0x1C18, 0x030B, 0x1A18, + 0x030D, 0x1618, 0x030E, 0x0E18, 0x0313, 0x1918, 0x0315, 0x1518, 0x0316, 0x0D18, + 0x0319, 0x1318, 0x031A, 0x0B18, 0x031C, 0x0718, 0x0323, 0x1898, 0x0325, 0x1498, + 0x0326, 0x0C98, 0x0329, 0x1298, 0x032A, 0x0A98, 0x032C, 0x0698, 0x0331, 0x1198, + 0x0332, 0x0998, 0x0334, 0x0598, 0x0338, 0x0398, 0x0343, 0x1858, 0x0345, 0x1458, + 0x0346, 0x0C58, 0x0349, 0x1258, 0x034A, 0x0A58, 0x034C, 0x0658, 0x0351, 0x1158, + 0x0352, 0x0958, 0x0354, 0x0558, 0x0361, 0x10D8, 0x0362, 0x08D8, 0x0364, 0x04D8, + 0x0383, 0x1838, 0x0385, 0x1438, 0x0386, 0x0C38, 0x0389, 0x1238, 0x038A, 0x0A38, + 0x038C, 0x0638, 0x0391, 0x1138, 0x0392, 0x0938, 0x0394, 0x0538, 0x03A1, 0x10B8, + 0x03A2, 0x08B8, 0x03A4, 0x04B8, 0x03C1, 0x1078, 0x03C2, 0x0878, 0x03C4, 0x0478, + 0x040F, 0x1E04, 0x0417, 0x1D04, 0x041B, 0x1B04, 0x041D, 0x1704, 0x041E, 0x0F04, + 0x0427, 0x1C84, 0x042B, 0x1A84, 0x042D, 0x1684, 0x042E, 0x0E84, 0x0433, 0x1984, + 0x0435, 0x1584, 0x0436, 0x0D84, 0x0439, 0x1384, 0x043A, 0x0B84, 0x043C, 0x0784, + 0x0447, 0x1C44, 0x044B, 0x1A44, 0x044D, 0x1644, 0x044E, 0x0E44, 0x0453, 0x1944, + 0x0455, 0x1544, 0x0456, 0x0D44, 0x0459, 0x1344, 0x045A, 0x0B44, 0x045C, 0x0744, + 0x0463, 0x18C4, 0x0465, 0x14C4, 0x0466, 0x0CC4, 0x0469, 0x12C4, 0x046A, 0x0AC4, + 0x046C, 0x06C4, 0x0471, 0x11C4, 0x0472, 0x09C4, 0x0474, 0x05C4, 0x0487, 0x1C24, + 0x048B, 0x1A24, 0x048D, 0x1624, 0x048E, 0x0E24, 0x0493, 0x1924, 0x0495, 0x1524, + 0x0496, 0x0D24, 0x0499, 0x1324, 0x049A, 0x0B24, 0x049C, 0x0724, 0x04A3, 0x18A4, + 0x04A5, 0x14A4, 0x04A6, 0x0CA4, 0x04A9, 0x12A4, 0x04AA, 0x0AA4, 0x04AC, 0x06A4, + 0x04B1, 0x11A4, 0x04B2, 0x09A4, 0x04B4, 0x05A4, 0x04C3, 0x1864, 0x04C5, 0x1464, + 0x04C6, 0x0C64, 0x04C9, 0x1264, 0x04CA, 0x0A64, 0x04CC, 0x0664, 0x04D1, 0x1164, + 0x04D2, 0x0964, 0x04D4, 0x0564, 0x04E1, 0x10E4, 0x04E2, 0x08E4, 0x0507, 0x1C14, + 0x050B, 0x1A14, 0x050D, 0x1614, 0x050E, 0x0E14, 0x0513, 0x1914, 0x0515, 0x1514, + 0x0516, 0x0D14, 0x0519, 0x1314, 0x051A, 0x0B14, 0x051C, 0x0714, 0x0523, 0x1894, + 0x0525, 0x1494, 0x0526, 0x0C94, 0x0529, 0x1294, 0x052A, 0x0A94, 0x052C, 0x0694, + 0x0531, 0x1194, 0x0532, 0x0994, 0x0534, 0x0594, 0x0543, 0x1854, 0x0545, 0x1454, + 0x0546, 0x0C54, 0x0549, 0x1254, 0x054A, 0x0A54, 0x054C, 0x0654, 0x0551, 0x1154, + 0x0552, 0x0954, 0x0561, 0x10D4, 0x0562, 0x08D4, 0x0583, 0x1834, 0x0585, 0x1434, + 0x0586, 0x0C34, 0x0589, 0x1234, 0x058A, 0x0A34, 0x058C, 0x0634, 0x0591, 0x1134, + 0x0592, 0x0934, 0x05A1, 0x10B4, 0x05A2, 0x08B4, 0x05C1, 0x1074, 0x05C2, 0x0874, + 0x0607, 0x1C0C, 0x060B, 0x1A0C, 0x060D, 0x160C, 0x060E, 0x0E0C, 0x0613, 0x190C, + 0x0615, 0x150C, 0x0616, 0x0D0C, 0x0619, 0x130C, 0x061A, 0x0B0C, 0x061C, 0x070C, + 0x0623, 0x188C, 0x0625, 0x148C, 0x0626, 0x0C8C, 0x0629, 0x128C, 0x062A, 0x0A8C, + 0x062C, 0x068C, 0x0631, 0x118C, 0x0632, 0x098C, 0x0643, 0x184C, 0x0645, 0x144C, + 0x0646, 0x0C4C, 0x0649, 0x124C, 0x064A, 0x0A4C, 0x0651, 0x114C, 0x0652, 0x094C, + 0x0661, 0x10CC, 0x0662, 0x08CC, 0x0683, 0x182C, 0x0685, 0x142C, 0x0686, 0x0C2C, + 0x0689, 0x122C, 0x068A, 0x0A2C, 0x0691, 0x112C, 0x0692, 0x092C, 0x06A1, 0x10AC, + 0x06A2, 0x08AC, 0x06C1, 0x106C, 0x06C2, 0x086C, 0x0703, 0x181C, 0x0705, 0x141C, + 0x0706, 0x0C1C, 0x0709, 0x121C, 0x070A, 0x0A1C, 0x0711, 0x111C, 0x0712, 0x091C, + 0x0721, 0x109C, 0x0722, 0x089C, 0x0741, 0x105C, 0x0742, 0x085C, 0x0781, 0x103C, + 0x0782, 0x083C, 0x080F, 0x1E02, 0x0817, 0x1D02, 0x081B, 0x1B02, 0x081D, 0x1702, + 0x081E, 0x0F02, 0x0827, 0x1C82, 0x082B, 0x1A82, 0x082D, 0x1682, 0x082E, 0x0E82, + 0x0833, 0x1982, 0x0835, 0x1582, 0x0836, 0x0D82, 0x0839, 0x1382, 0x083A, 0x0B82, + 0x0847, 0x1C42, 0x084B, 0x1A42, 0x084D, 0x1642, 0x084E, 0x0E42, 0x0853, 0x1942, + 0x0855, 0x1542, 0x0856, 0x0D42, 0x0859, 0x1342, 0x085A, 0x0B42, 0x0863, 0x18C2, + 0x0865, 0x14C2, 0x0866, 0x0CC2, 0x0869, 0x12C2, 0x086A, 0x0AC2, 0x0871, 0x11C2, + 0x0872, 0x09C2, 0x0887, 0x1C22, 0x088B, 0x1A22, 0x088D, 0x1622, 0x088E, 0x0E22, + 0x0893, 0x1922, 0x0895, 0x1522, 0x0896, 0x0D22, 0x0899, 0x1322, 0x089A, 0x0B22, + 0x08A3, 0x18A2, 0x08A5, 0x14A2, 0x08A6, 0x0CA2, 0x08A9, 0x12A2, 0x08AA, 0x0AA2, + 0x08B1, 0x11A2, 0x08B2, 0x09A2, 0x08C3, 0x1862, 0x08C5, 0x1462, 0x08C6, 0x0C62, + 0x08C9, 0x1262, 0x08CA, 0x0A62, 0x08D1, 0x1162, 0x08D2, 0x0962, 0x08E1, 0x10E2, + 0x0907, 0x1C12, 0x090B, 0x1A12, 0x090D, 0x1612, 0x090E, 0x0E12, 0x0913, 0x1912, + 0x0915, 0x1512, 0x0916, 0x0D12, 0x0919, 0x1312, 0x091A, 0x0B12, 0x0923, 0x1892, + 0x0925, 0x1492, 0x0926, 0x0C92, 0x0929, 0x1292, 0x092A, 0x0A92, 0x0931, 0x1192, + 0x0932, 0x0992, 0x0943, 0x1852, 0x0945, 0x1452, 0x0946, 0x0C52, 0x0949, 0x1252, + 0x094A, 0x0A52, 0x0951, 0x1152, 0x0961, 0x10D2, 0x0983, 0x1832, 0x0985, 0x1432, + 0x0986, 0x0C32, 0x0989, 0x1232, 0x098A, 0x0A32, 0x0991, 0x1132, 0x09A1, 0x10B2, + 0x09C1, 0x1072, 0x0A07, 0x1C0A, 0x0A0B, 0x1A0A, 0x0A0D, 0x160A, 0x0A0E, 0x0E0A, + 0x0A13, 0x190A, 0x0A15, 0x150A, 0x0A16, 0x0D0A, 0x0A19, 0x130A, 0x0A1A, 0x0B0A, + 0x0A23, 0x188A, 0x0A25, 0x148A, 0x0A26, 0x0C8A, 0x0A29, 0x128A, 0x0A2A, 0x0A8A, + 0x0A31, 0x118A, 0x0A43, 0x184A, 0x0A45, 0x144A, 0x0A46, 0x0C4A, 0x0A49, 0x124A, + 0x0A51, 0x114A, 0x0A61, 0x10CA, 0x0A83, 0x182A, 0x0A85, 0x142A, 0x0A86, 0x0C2A, + 0x0A89, 0x122A, 0x0A91, 0x112A, 0x0AA1, 0x10AA, 0x0AC1, 0x106A, 0x0B03, 0x181A, + 0x0B05, 0x141A, 0x0B06, 0x0C1A, 0x0B09, 0x121A, 0x0B11, 0x111A, 0x0B21, 0x109A, + 0x0B41, 0x105A, 0x0B81, 0x103A, 0x0C07, 0x1C06, 0x0C0B, 0x1A06, 0x0C0D, 0x1606, + 0x0C0E, 0x0E06, 0x0C13, 0x1906, 0x0C15, 0x1506, 0x0C16, 0x0D06, 0x0C19, 0x1306, + 0x0C23, 0x1886, 0x0C25, 0x1486, 0x0C26, 0x0C86, 0x0C29, 0x1286, 0x0C31, 0x1186, + 0x0C43, 0x1846, 0x0C45, 0x1446, 0x0C49, 0x1246, 0x0C51, 0x1146, 0x0C61, 0x10C6, + 0x0C83, 0x1826, 0x0C85, 0x1426, 0x0C89, 0x1226, 0x0C91, 0x1126, 0x0CA1, 0x10A6, + 0x0CC1, 0x1066, 0x0D03, 0x1816, 0x0D05, 0x1416, 0x0D09, 0x1216, 0x0D11, 0x1116, + 0x0D21, 0x1096, 0x0D41, 0x1056, 0x0D81, 0x1036, 0x0E03, 0x180E, 0x0E05, 0x140E, + 0x0E09, 0x120E, 0x0E11, 0x110E, 0x0E21, 0x108E, 0x0E41, 0x104E, 0x0E81, 0x102E, + 0x0F01, 0x101E, 0x100F, 0x1E01, 0x1017, 0x1D01, 0x101B, 0x1B01, 0x101D, 0x1701, + 0x1027, 0x1C81, 0x102B, 0x1A81, 0x102D, 0x1681, 0x1033, 0x1981, 0x1035, 0x1581, + 0x1039, 0x1381, 0x1047, 0x1C41, 0x104B, 0x1A41, 0x104D, 0x1641, 0x1053, 0x1941, + 0x1055, 0x1541, 0x1059, 0x1341, 0x1063, 0x18C1, 0x1065, 0x14C1, 0x1069, 0x12C1, + 0x1071, 0x11C1, 0x1087, 0x1C21, 0x108B, 0x1A21, 0x108D, 0x1621, 0x1093, 0x1921, + 0x1095, 0x1521, 0x1099, 0x1321, 0x10A3, 0x18A1, 0x10A5, 0x14A1, 0x10A9, 0x12A1, + 0x10B1, 0x11A1, 0x10C3, 0x1861, 0x10C5, 0x1461, 0x10C9, 0x1261, 0x10D1, 0x1161, + 0x1107, 0x1C11, 0x110B, 0x1A11, 0x110D, 0x1611, 0x1113, 0x1911, 0x1115, 0x1511, + 0x1119, 0x1311, 0x1123, 0x1891, 0x1125, 0x1491, 0x1129, 0x1291, 0x1131, 0x1191, + 0x1143, 0x1851, 0x1145, 0x1451, 0x1149, 0x1251, 0x1183, 0x1831, 0x1185, 0x1431, + 0x1189, 0x1231, 0x1207, 0x1C09, 0x120B, 0x1A09, 0x120D, 0x1609, 0x1213, 0x1909, + 0x1215, 0x1509, 0x1219, 0x1309, 0x1223, 0x1889, 0x1225, 0x1489, 0x1229, 0x1289, + 0x1243, 0x1849, 0x1245, 0x1449, 0x1283, 0x1829, 0x1285, 0x1429, 0x1303, 0x1819, + 0x1305, 0x1419, 0x1407, 0x1C05, 0x140B, 0x1A05, 0x140D, 0x1605, 0x1413, 0x1905, + 0x1415, 0x1505, 0x1423, 0x1885, 0x1425, 0x1485, 0x1443, 0x1845, 0x1483, 0x1825, + 0x1503, 0x1815, 0x1603, 0x180D, 0x1807, 0x1C03, 0x180B, 0x1A03, 0x1813, 0x1903, + 0x1823, 0x1883, 0x1843, 0x1445, 0x1249, 0x1151, 0x10E1, 0x0C46, 0x0A4A, 0x0952, + 0x08E2, 0x064C, 0x0554, 0x04E4, 0x0358, 0x02E8, 0x01F0 +}; + +static const unsigned short AppxD_II[78] = { + /* Appendix D Table II - 2 of 13 characters */ + 0x0003, 0x1800, 0x0005, 0x1400, 0x0006, 0x0C00, 0x0009, 0x1200, 0x000A, 0x0A00, + 0x000C, 0x0600, 0x0011, 0x1100, 0x0012, 0x0900, 0x0014, 0x0500, 0x0018, 0x0300, + 0x0021, 0x1080, 0x0022, 0x0880, 0x0024, 0x0480, 0x0028, 0x0280, 0x0030, 0x0180, + 0x0041, 0x1040, 0x0042, 0x0840, 0x0044, 0x0440, 0x0048, 0x0240, 0x0050, 0x0140, + 0x0060, 0x00C0, 0x0081, 0x1020, 0x0082, 0x0820, 0x0084, 0x0420, 0x0088, 0x0220, + 0x0090, 0x0120, 0x0101, 0x1010, 0x0102, 0x0810, 0x0104, 0x0410, 0x0108, 0x0210, + 0x0201, 0x1008, 0x0202, 0x0808, 0x0204, 0x0408, 0x0401, 0x1004, 0x0402, 0x0804, + 0x0801, 0x1002, 0x1001, 0x0802, 0x0404, 0x0208, 0x0110, 0x00A0 +}; + +static const unsigned short int AppxD_IV[130] = { + /* Appendix D Table IV - Bar-to-Character Mapping (reverse lookup) */ + 67, 6, 78, 16, 86, 95, 34, 40, 45, 113, 117, 121, 62, 87, 18, 104, 41, 76, 57, 119, 115, 72, 97, + 2, 127, 26, 105, 35, 122, 52, 114, 7, 24, 82, 68, 63, 94, 44, 77, 112, 70, 100, 39, 30, 107, + 15, 125, 85, 10, 65, 54, 88, 20, 106, 46, 66, 8, 116, 29, 61, 99, 80, 90, 37, 123, 51, 25, 84, + 129, 56, 4, 109, 96, 28, 36, 47, 11, 71, 33, 102, 21, 9, 17, 49, 124, 79, 64, 91, 42, 69, 53, + 60, 14, 1, 27, 103, 126, 75, 89, 50, 120, 19, 32, 110, 92, 111, 130, 59, 31, 12, 81, 43, 55, + 5, 74, 22, 101, 128, 58, 118, 48, 108, 38, 98, 93, 23, 83, 13, 73, 3 +}; + +/*************************************************************************** + ** USPS_MSB_Math_CRC11GenerateFrameCheckSequence + ** + ** Inputs: + ** ByteAttayPtr is the address of a 13 byte array holding 102 bytes which + ** are right justified - ie: the leftmost 2 bits of the first byte do not + ** hold data and must be set to zero. + ** + ** Outputs: + ** return unsigned short - 11 bit Frame Check Sequence (right justified) + ***************************************************************************/ +extern unsigned short USPS_MSB_Math_CRC11GenerateFrameCheckSequence(unsigned char *ByteArrayPtr) { + unsigned short GeneratorPolynomial = 0x0F35; + unsigned short FrameCheckSequence = 0x07FF; + unsigned short Data; + int ByteIndex, Bit; + + /* Do most significant byte skipping the 2 most significant bits */ + Data = *ByteArrayPtr << 5; + ByteArrayPtr++; + for (Bit = 2; Bit < 8; Bit++) { + if ((FrameCheckSequence ^ Data) & 0x400) + FrameCheckSequence = (FrameCheckSequence << 1) ^ GeneratorPolynomial; + else + FrameCheckSequence = (FrameCheckSequence << 1); + FrameCheckSequence &= 0x7FF; + Data <<= 1; + } + /* Do rest of the bytes */ + for (ByteIndex = 1; ByteIndex < 13; ByteIndex++) { + Data = *ByteArrayPtr << 3; + ByteArrayPtr++; + for (Bit = 0; Bit < 8; Bit++) { + if ((FrameCheckSequence ^ Data) & 0x0400) { + FrameCheckSequence = (FrameCheckSequence << 1) ^ GeneratorPolynomial; + } else { + FrameCheckSequence = (FrameCheckSequence << 1); + } + FrameCheckSequence &= 0x7FF; + Data <<= 1; + } + } + return FrameCheckSequence; +} + +int imail(struct zint_symbol *symbol, unsigned char source[], int length) { + char data_pattern[200]; + int error_number; + int i, j, read; + char zip[35], tracker[35], zip_adder[11], temp[2]; + short int accum[112], x_reg[112], y_reg[112]; + unsigned char byte_array[13]; + unsigned short usps_crc; + int codeword[10]; + unsigned short characters[10]; + short int bar_map[130]; + + error_number = 0; + + if (length > 32) { + strcpy(symbol->errtxt, "450: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(SODIUM, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "451: Invalid characters in data"); + return error_number; + } + + strcpy(zip, ""); + strcpy(tracker, ""); + + /* separate the tracking code from the routing code */ + + read = 0; + j = 0; + for (i = 0; i < length; i++) { + if (source[i] == '-') { + tracker[read] = '\0'; + j = 1; + read = 0; + } else { + if (j == 0) { + /* reading tracker */ + tracker[read] = source[i]; + read++; + } else { + /* reading zip code */ + zip[read] = source[i]; + read++; + } + } + } + if (j == 0) { + tracker[read] = '\0'; + } else { + zip[read] = '\0'; + } + + if (strlen(tracker) != 20) { + strcpy(symbol->errtxt, "452: Invalid length tracking code"); + return ZINT_ERROR_INVALID_DATA; + } + if (strlen(zip) > 11) { + strcpy(symbol->errtxt, "453: Invalid ZIP code"); + return ZINT_ERROR_INVALID_DATA; + } + + /* *** Step 1 - Conversion of Data Fields into Binary Data *** */ + + /* Routing code first */ + + for (i = 0; i < 112; i++) { + accum[i] = 0; + } + + for (read = 0; read < strlen(zip); read++) { + + for (i = 0; i < 112; i++) { + x_reg[i] = accum[i]; + } + + for (i = 0; i < 9; i++) { + binary_add(accum, x_reg); + } + + for (i = 0; i < 112; i++) { + x_reg[i] = 0; + } + + for (i = 0; i < 4; i++) { + if (ctoi(zip[read]) & (0x01 << i)) x_reg[i] = 1; + } + + binary_add(accum, x_reg); + } + + /* add weight to routing code */ + + for (i = 0; i < 112; i++) { + x_reg[i] = accum[i]; + } + + if (strlen(zip) > 9) { + strcpy(zip_adder, "1000100001"); + } else { + if (strlen(zip) > 5) { + strcpy(zip_adder, "100001"); + } else { + if (strlen(zip) > 0) { + strcpy(zip_adder, "1"); + } else { + strcpy(zip_adder, "0"); + } + } + } + + for (i = 0; i < 112; i++) { + accum[i] = 0; + } + + for (read = 0; read < strlen(zip_adder); read++) { + + for (i = 0; i < 112; i++) { + y_reg[i] = accum[i]; + } + + for (i = 0; i < 9; i++) { + binary_add(accum, y_reg); + } + + for (i = 0; i < 112; i++) { + y_reg[i] = 0; + } + + for (i = 0; i < 4; i++) { + if (ctoi(zip_adder[read]) & (0x01 << i)) y_reg[i] = 1; + } + + binary_add(accum, y_reg); + } + + binary_add(accum, x_reg); + + /* tracking code */ + + /* multiply by 10 */ + for (i = 0; i < 112; i++) { + y_reg[i] = accum[i]; + } + + for (i = 0; i < 9; i++) { + binary_add(accum, y_reg); + } + + for (i = 0; i < 112; i++) { + y_reg[i] = 0; + } + + /* add first digit of tracker */ + for (i = 0; i < 4; i++) { + if (ctoi(tracker[0]) & (0x01 << i)) y_reg[i] = 1; + } + + binary_add(accum, y_reg); + + /* multiply by 5 */ + for (i = 0; i < 112; i++) { + y_reg[i] = accum[i]; + } + + for (i = 0; i < 4; i++) { + binary_add(accum, y_reg); + } + + for (i = 0; i < 112; i++) { + y_reg[i] = 0; + } + + /* add second digit */ + for (i = 0; i < 4; i++) { + if (ctoi(tracker[1]) & (0x01 << i)) y_reg[i] = 1; + } + + binary_add(accum, y_reg); + + /* and then the rest */ + + for (read = 2; read < strlen(tracker); read++) { + + for (i = 0; i < 112; i++) { + y_reg[i] = accum[i]; + } + + for (i = 0; i < 9; i++) { + binary_add(accum, y_reg); + } + + for (i = 0; i < 112; i++) { + y_reg[i] = 0; + } + + for (i = 0; i < 4; i++) { + if (ctoi(tracker[read]) & (0x01 << i)) y_reg[i] = 1; + } + + binary_add(accum, y_reg); + } + + /* *** Step 2 - Generation of 11-bit CRC on Binary Data *** */ + + accum[103] = 0; + accum[102] = 0; + + memset(byte_array, 0, 13); + for (j = 0; j < 13; j++) { + i = 96 - (8 * j); + byte_array[j] = 0; + byte_array[j] += accum[i]; + byte_array[j] += 2 * accum[i + 1]; + byte_array[j] += 4 * accum[i + 2]; + byte_array[j] += 8 * accum[i + 3]; + byte_array[j] += 16 * accum[i + 4]; + byte_array[j] += 32 * accum[i + 5]; + byte_array[j] += 64 * accum[i + 6]; + byte_array[j] += 128 * accum[i + 7]; + } + + usps_crc = USPS_MSB_Math_CRC11GenerateFrameCheckSequence(byte_array); + + /* *** Step 3 - Conversion from Binary Data to Codewords *** */ + + /* start with codeword J which is base 636 */ + for (i = 0; i < 112; i++) { + x_reg[i] = 0; + y_reg[i] = 0; + } + + x_reg[101] = 1; + x_reg[98] = 1; + x_reg[97] = 1; + x_reg[96] = 1; + x_reg[95] = 1; + x_reg[94] = 1; + + for (i = 92; i >= 0; i--) { + y_reg[i] = islarger(accum, x_reg); + if (y_reg[i] == 1) { + binary_subtract(accum, x_reg); + } + shiftdown(x_reg); + } + + codeword[9] = (accum[9] * 512) + (accum[8] * 256) + (accum[7] * 128) + (accum[6] * 64) + + (accum[5] * 32) + (accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) + + (accum[1] * 2) + accum[0]; + + /* then codewords I to B with base 1365 */ + + for (j = 8; j > 0; j--) { + for (i = 0; i < 112; i++) { + accum[i] = y_reg[i]; + y_reg[i] = 0; + x_reg[i] = 0; + } + x_reg[101] = 1; + x_reg[99] = 1; + x_reg[97] = 1; + x_reg[95] = 1; + x_reg[93] = 1; + x_reg[91] = 1; + for (i = 91; i >= 0; i--) { + y_reg[i] = islarger(accum, x_reg); + if (y_reg[i] == 1) { + binary_subtract(accum, x_reg); + } + shiftdown(x_reg); + } + + codeword[j] = (accum[10] * 1024) + (accum[9] * 512) + (accum[8] * 256) + + (accum[7] * 128) + (accum[6] * 64) + (accum[5] * 32) + + (accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) + + (accum[1] * 2) + accum[0]; + } + + codeword[0] = (y_reg[10] * 1024) + (y_reg[9] * 512) + (y_reg[8] * 256) + + (y_reg[7] * 128) + (y_reg[6] * 64) + (y_reg[5] * 32) + + (y_reg[4] * 16) + (y_reg[3] * 8) + (y_reg[2] * 4) + + (y_reg[1] * 2) + y_reg[0]; + + for (i = 0; i < 8; i++) { + if (codeword[i] == 1365) { + codeword[i] = 0; + codeword[i + 1]++; + } + } + + /* *** Step 4 - Inserting Additional Information into Codewords *** */ + + codeword[9] = codeword[9] * 2; + + if (usps_crc >= 1024) { + codeword[0] += 659; + } + + /* *** Step 5 - Conversion from Codewords to Characters *** */ + + for (i = 0; i < 10; i++) { + if (codeword[i] < 1287) { + characters[i] = AppxD_I[codeword[i]]; + } else { + characters[i] = AppxD_II[codeword[i] - 1287]; + } + } + + for (i = 0; i < 10; i++) { + if (usps_crc & (1 << i)) { + characters[i] = 0x1FFF - characters[i]; + } + } + + /* *** Step 6 - Conversion from Characters to the Intelligent Mail Barcode *** */ + for (i = 0; i < 10; i++) { + for (j = 0; j < 13; j++) { + if (characters[i] & (1 << j)) { + bar_map[AppxD_IV[(13 * i) + j] - 1] = 1; + } else { + bar_map[AppxD_IV[(13 * i) + j] - 1] = 0; + } + } + } + + strcpy(data_pattern, ""); + temp[1] = '\0'; + for (i = 0; i < 65; i++) { + j = 0; + if (bar_map[i] == 0) + j += 1; + if (bar_map[i + 65] == 0) + j += 2; + temp[0] = itoc(j); + strcat(data_pattern, temp); + } + + /* Translate 4-state data pattern to symbol */ + read = 0; + for (i = 0; i < strlen(data_pattern); i++) { + if ((data_pattern[i] == '1') || (data_pattern[i] == '0')) { + set_module(symbol, 0, read); + } + set_module(symbol, 1, read); + if ((data_pattern[i] == '2') || (data_pattern[i] == '0')) { + set_module(symbol, 2, read); + } + read += 2; + } + + symbol->row_height[0] = 3; + symbol->row_height[1] = 2; + symbol->row_height[2] = 3; + + symbol->rows = 3; + symbol->width = read - 1; + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/large.c b/3rdparty/zint-2.6.1/backend/large.c new file mode 100644 index 0000000..dda4d5f --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/large.c @@ -0,0 +1,191 @@ +/* large.c - Handles binary manipulation of large numbers */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include "common.h" +#include "large.h" + +void binary_add(short int accumulator[], short int input_buffer[]) { /* Binary addition */ + int i, carry, done; + carry = 0; + + for (i = 0; i < 112; i++) { + done = 0; + if (((input_buffer[i] == 0) && (accumulator[i] == 0)) + && ((carry == 0) && (done == 0))) { + accumulator[i] = 0; + carry = 0; + done = 1; + } + if (((input_buffer[i] == 0) && (accumulator[i] == 0)) + && ((carry == 1) && (done == 0))) { + accumulator[i] = 1; + carry = 0; + done = 1; + } + if (((input_buffer[i] == 0) && (accumulator[i] == 1)) + && ((carry == 0) && (done == 0))) { + accumulator[i] = 1; + carry = 0; + done = 1; + } + if (((input_buffer[i] == 0) && (accumulator[i] == 1)) + && ((carry == 1) && (done == 0))) { + accumulator[i] = 0; + carry = 1; + done = 1; + } + if (((input_buffer[i] == 1) && (accumulator[i] == 0)) + && ((carry == 0) && (done == 0))) { + accumulator[i] = 1; + carry = 0; + done = 1; + } + if (((input_buffer[i] == 1) && (accumulator[i] == 0)) + && ((carry == 1) && (done == 0))) { + accumulator[i] = 0; + carry = 1; + done = 1; + } + if (((input_buffer[i] == 1) && (accumulator[i] == 1)) + && ((carry == 0) && (done == 0))) { + accumulator[i] = 0; + carry = 1; + done = 1; + } + if (((input_buffer[i] == 1) && (accumulator[i] == 1)) + && ((carry == 1) && (done == 0))) { + accumulator[i] = 1; + carry = 1; + done = 1; + } + } +} + +void binary_subtract(short int accumulator[], short int input_buffer[]) { + /* 2's compliment subtraction */ + /* take input_buffer from accumulator and put answer in accumulator */ + int i; + short int sub_buffer[112]; + + for (i = 0; i < 112; i++) { + if (input_buffer[i] == 0) { + sub_buffer[i] = 1; + } else { + sub_buffer[i] = 0; + } + } + binary_add(accumulator, sub_buffer); + + sub_buffer[0] = 1; + + for (i = 1; i < 112; i++) { + sub_buffer[i] = 0; + } + binary_add(accumulator, sub_buffer); +} + +void shiftdown(short int buffer[]) { + int i; + + buffer[102] = 0; + buffer[103] = 0; + + for (i = 0; i < 102; i++) { + buffer[i] = buffer[i + 1]; + } +} + +void shiftup(short int buffer[]) { + int i; + + for (i = 102; i > 0; i--) { + buffer[i] = buffer[i - 1]; + } + + buffer[0] = 0; +} + +short int islarger(short int accum[], short int reg[]) { + /* Returns 1 if accum[] is larger than reg[], else 0 */ + int i, latch, larger; + latch = 0; + i = 103; + larger = 0; + + + do { + if ((accum[i] == 1) && (reg[i] == 0)) { + latch = 1; + larger = 1; + } + if ((accum[i] == 0) && (reg[i] == 1)) { + latch = 1; + } + i--; + } while ((latch == 0) && (i >= -1)); + + return larger; +} + +void binary_load(short int reg[], char data[], const size_t src_len) { + size_t read; + int i; + short int temp[112] = {0}; + + for (i = 0; i < 112; i++) { + reg[i] = 0; + } + + for (read = 0; read < src_len; read++) { + + for (i = 0; i < 112; i++) { + temp[i] = reg[i]; + } + + for (i = 0; i < 9; i++) { + binary_add(reg, temp); + } + + for (i = 0; i < 112; i++) { + temp[i] = 0; + } + + for (i = 0; i < 4; i++) { + if (ctoi(data[read]) & (0x01 << i)) temp[i] = 1; + } + + binary_add(reg, temp); + } +} + diff --git a/3rdparty/zint-2.6.1/backend/large.h b/3rdparty/zint-2.6.1/backend/large.h new file mode 100644 index 0000000..c8b6e14 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/large.h @@ -0,0 +1,50 @@ +/* large.h - Handles binary manipulation of large numbers */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. +*/ +#ifndef __LARGE_H +#define __LARGE_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern void binary_load(short int reg[], char data[], const size_t src_len); +extern void binary_add(short int accumulator[], short int input_buffer[]); +extern void binary_subtract(short int accumulator[], short int input_buffer[]); +extern void shiftdown(short int buffer[]); +extern void shiftup(short int buffer[]); +extern short int islarger(short int accum[], short int reg[]); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __LARGE_H */ diff --git a/3rdparty/zint-2.6.1/backend/library.c b/3rdparty/zint-2.6.1/backend/library.c new file mode 100644 index 0000000..9c2eb6e --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/library.c @@ -0,0 +1,1312 @@ +/* library.c - external functions of libzint + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include "gs1.h" + +#define TECHNETIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%" + +struct zint_symbol *ZBarcode_Create() { + struct zint_symbol *symbol; + + symbol = (struct zint_symbol*) malloc(sizeof (*symbol)); + if (!symbol) return NULL; + + memset(symbol, 0, sizeof (*symbol)); + symbol->symbology = BARCODE_CODE128; + symbol->height = 50; + symbol->whitespace_width = 0; + symbol->border_width = 0; + symbol->output_options = 0; + symbol->rows = 0; + symbol->width = 0; + strcpy(symbol->fgcolour, "000000"); + strcpy(symbol->bgcolour, "ffffff"); + strcpy(symbol->outfile, ""); + symbol->scale = 1.0; + symbol->option_1 = -1; + symbol->option_2 = 0; + symbol->option_3 = 928; // PDF_MAX + symbol->show_hrt = 1; // Show human readable text + symbol->input_mode = DATA_MODE; + strcpy(symbol->primary, ""); + memset(&(symbol->encoded_data[0][0]), 0, sizeof (symbol->encoded_data)); + memset(&(symbol->row_height[0]), 0, sizeof (symbol->row_height)); + symbol->bitmap = NULL; + symbol->bitmap_width = 0; + symbol->bitmap_height = 0; + symbol->eci = 3; + symbol->dot_size = 4.0 / 5.0; + symbol->debug = 0; + return symbol; +} + +void ZBarcode_Clear(struct zint_symbol *symbol) { + int i, j; + + for (i = 0; i < symbol->rows; i++) { + for (j = 0; j < symbol->width; j++) { + unset_module(symbol, i, j); + } + } + symbol->rows = 0; + symbol->width = 0; + memset(symbol->text, 0, sizeof(symbol->text)); + symbol->errtxt[0] = '\0'; + if (symbol->bitmap != NULL) { + free(symbol->bitmap); + symbol->bitmap = NULL; + } + symbol->bitmap_width = 0; + symbol->bitmap_height = 0; +} + +void ZBarcode_Delete(struct zint_symbol *symbol) { + if (symbol->bitmap != NULL) + free(symbol->bitmap); + + // If there is a rendered version, ensure its memory is released + if (symbol->rendered != NULL) { + struct zint_render_line *line, *l; + struct zint_render_string *string, *s; + struct zint_render_ring *ring, *r; + struct zint_render_hexagon *hexagon, *h; + + // Free lines + line = symbol->rendered->lines; + while (line) { + l = line; + line = line->next; + free(l); + } + // Free Strings + string = symbol->rendered->strings; + while (string) { + s = string; + string = string->next; + free(s->text); + free(s); + } + + // Free Rings + ring = symbol->rendered->rings; + while (ring) { + r = ring; + ring = ring->next; + free(r); + } + + // Free Hexagons + hexagon = symbol->rendered->hexagons; + while (hexagon) { + h = hexagon; + hexagon = hexagon->next; + free(h); + } + + // Free Render + free(symbol->rendered); + } + free(symbol); +} + +extern int get_best_eci(unsigned char source[], size_t length); /* Calculate suitable ECI mode */ +extern int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */ + + +extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN system barcodes */ +extern int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Code 3 from 9 (or Code 39) */ +extern int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmazentral Nummer (PZN) */ +extern int ec39(struct zint_symbol *symbol, unsigned char source[], int length); /* Extended Code 3 from 9 (or Code 39+) */ +extern int codabar(struct zint_symbol *symbol, unsigned char source[], int length); /* Codabar - a simple substitution cipher */ +extern int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Standard (& Matrix) */ +extern int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Industrial */ +extern int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 IATA */ +extern int interleaved_two_of_five(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Code 2 of 5 Interleaved */ +extern int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Data Logic */ +extern int itf14(struct zint_symbol *symbol, unsigned char source[], int length); /* ITF-14 */ +extern int dpleit(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Leitcode */ +extern int dpident(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Identcode */ +extern int c93(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 93 - a re-working of Code 39+, generates 2 check digits */ +extern int code_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Code 128 and NVE-18 */ +extern int ean_128(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* EAN-128 (GS1-128) */ +extern int code_11(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 11 */ +extern int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length); /* MSI Plessey */ +extern int telepen(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Telepen ASCII */ +extern int telepen_num(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Telepen Numeric */ +extern int plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Plessey Code */ +extern int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode One Track */ +extern int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length); /* Flattermarken */ +extern int fim(struct zint_symbol *symbol, unsigned char source[], int length); /* Facing Identification Mark */ +extern int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode Two Track */ +extern int post_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* Postnet */ +extern int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* PLANET */ +extern int imail(struct zint_symbol *symbol, unsigned char source[], int length); /* Intelligent Mail (aka USPS OneCode) */ +extern int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* RM4SCC */ +extern int australia_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Australia Post 4-state */ +extern int code16k(struct zint_symbol *symbol, unsigned char source[],const size_t length); /* Code 16k */ +extern int pdf417enc(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* PDF417 */ +extern int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length); /* Micro PDF417 */ +extern int maxicode(struct zint_symbol *symbol, unsigned char source[], int length); /* Maxicode */ +extern int rss14(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS-14 */ +extern int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Limited */ +extern int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Expanded */ +extern int composite(struct zint_symbol *symbol, unsigned char source[], int length); /* Composite Symbology */ +extern int kix_code(struct zint_symbol *symbol, unsigned char source[], int length); /* TNT KIX Code */ +extern int aztec(struct zint_symbol *symbol, unsigned char source[], const size_t length); /* Aztec Code */ +extern int code32(struct zint_symbol *symbol, unsigned char source[], int length); /* Italian Pharmacode */ +extern int daft_code(struct zint_symbol *symbol, unsigned char source[], int length); /* DAFT Code */ +extern int ean_14(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN-14 */ +extern int nve_18(struct zint_symbol *symbol, unsigned char source[], int length); /* NVE-18 */ +extern int microqr(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Micro QR Code */ +extern int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length); /* Aztec Runes */ +extern int korea_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Korea Post */ +extern int japan_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Japanese Post */ +extern int code_49(struct zint_symbol *symbol, unsigned char source[], const int length); /* Code 49 */ +extern int channel_code(struct zint_symbol *symbol, unsigned char source[], int length); /* Channel Code */ +extern int code_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Code One */ +extern int grid_matrix(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Grid Matrix */ +extern int han_xin(struct zint_symbol * symbol, const unsigned char source[], size_t length); /* Han Xin */ +extern int dotcode(struct zint_symbol * symbol, const unsigned char source[], int length); /* DotCode */ +extern int codablock(struct zint_symbol * symbol, const unsigned char source[], const size_t length); /* Codablock */ +extern int upnqr(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* UPNQR */ +extern int qr_code(struct zint_symbol *symbol, const unsigned char source[], size_t length); /* Data Matrix (IEC16022) */ +extern int dmatrix(struct zint_symbol *symbol, const unsigned char source[], const size_t in_length); /* QR Code */ + +extern int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_type); /* Plot to PNG/BMP/PCX */ +extern int render_plot(struct zint_symbol *symbol, float width, float height); /* Plot to gLabels */ +extern int ps_plot(struct zint_symbol *symbol); /* Plot to EPS */ +extern int svg_plot(struct zint_symbol *symbol); /* Plot to SVG */ +extern int emf_plot(struct zint_symbol *symbol); /* Plot to Metafile */ + +void error_tag(char error_string[], int error_number) { + char error_buffer[100]; + + if (error_number != 0) { + strcpy(error_buffer, error_string); + + if (error_number > 4) { + strcpy(error_string, "Error "); + } else { + strcpy(error_string, "Warning "); + } + + strcat(error_string, error_buffer); + } +} + +/* Output a hexadecimal representation of the rendered symbol */ +int dump_plot(struct zint_symbol *symbol) { + FILE *f; + int i, r; + int byt; + char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', + '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + int space = 0; + + if (symbol->output_options & BARCODE_STDOUT) { + f = stdout; + } else { + f = fopen(symbol->outfile, "w"); + if (!f) { + strcpy(symbol->errtxt, "201: Could not open output file"); + return ZINT_ERROR_FILE_ACCESS; + } + } + + for (r = 0; r < symbol->rows; r++) { + byt = 0; + for (i = 0; i < symbol->width; i++) { + byt = byt << 1; + if (module_is_set(symbol, r, i)) { + byt += 1; + } + if (((i + 1) % 4) == 0) { + fputc(hex[byt], f); + space++; + byt = 0; + } + if (space == 2) { + fputc(' ', f); + space = 0; + } + } + + if ((symbol->width % 4) != 0) { + byt = byt << (4 - (symbol->width % 4)); + fputc(hex[byt], f); + } + fputs("\n", f); + space = 0; + } + + if (symbol->output_options & BARCODE_STDOUT) { + fflush(f); + } else { + fclose(f); + } + + return 0; +} + +/* Process health industry bar code data */ +static int hibc(struct zint_symbol *symbol, unsigned char source[], size_t length) { + size_t i; + int counter, error_number; + char to_process[113], temp[2], check_digit; + + /* without "+" and check: max 110 characters in HIBC 2.6 */ + if (length > 110) { + strcpy(symbol->errtxt, "202: Data too long for HIBC LIC"); + return ZINT_ERROR_TOO_LONG; + } + to_upper(source); + error_number = is_sane(TECHNETIUM, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "203: Invalid characters in data"); + return error_number; + } + + strcpy(to_process, "+"); + counter = 41; + for (i = 0; i < length; i++) { + counter += posn(TECHNETIUM, source[i]); + } + counter = counter % 43; + + if (counter < 10) { + check_digit = itoc(counter); + } else { + if (counter < 36) { + check_digit = (counter - 10) + 'A'; + } else { + switch (counter) { + case 36: check_digit = '-'; + break; + case 37: check_digit = '.'; + break; + case 38: check_digit = ' '; + break; + case 39: check_digit = '$'; + break; + case 40: check_digit = '/'; + break; + case 41: check_digit = '+'; + break; + case 42: check_digit = '%'; + break; + default: check_digit = ' '; + break; /* Keep compiler happy */ + } + } + } + + temp[0] = check_digit; + temp[1] = '\0'; + + strcat(to_process, (char *) source); + strcat(to_process, temp); + length = strlen(to_process); + + switch (symbol->symbology) { + case BARCODE_HIBC_128: + error_number = code_128(symbol, (unsigned char *) to_process, length); + ustrcpy(symbol->text, (unsigned char*) "*"); + strcat((char*) symbol->text, to_process); + strcat((char*) symbol->text, "*"); + break; + case BARCODE_HIBC_39: + symbol->option_2 = 0; + error_number = c39(symbol, (unsigned char *) to_process, length); + ustrcpy(symbol->text, (unsigned char*) "*"); + strcat((char*) symbol->text, to_process); + strcat((char*) symbol->text, "*"); + break; + case BARCODE_HIBC_DM: + error_number = dmatrix(symbol, (unsigned char *) to_process, length); + break; + case BARCODE_HIBC_QR: + error_number = qr_code(symbol, (unsigned char *) to_process, length); + break; + case BARCODE_HIBC_PDF: + error_number = pdf417enc(symbol, (unsigned char *) to_process, length); + break; + case BARCODE_HIBC_MICPDF: + error_number = micro_pdf417(symbol, (unsigned char *) to_process, length); + break; + case BARCODE_HIBC_AZTEC: + error_number = aztec(symbol, (unsigned char *) to_process, length); + break; + case BARCODE_HIBC_BLOCKF: + error_number = codablock(symbol, (unsigned char *) to_process, length); + break; + } + + return error_number; +} + +static void check_row_heights(struct zint_symbol *symbol) { + /* Check that rows with undefined heights are never less than 5x */ + int large_bar_count = 0; + int i; + int preset_height = 0; + int large_bar_height = 0; + + for (i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if (symbol->row_height[i] == 0) { + large_bar_count++; + } + } + + if (large_bar_count == 0) { + symbol->height = preset_height; + } else { + large_bar_height = (symbol->height - preset_height) / large_bar_count; + } + + if (large_bar_height < 5) { + for (i = 0; i < symbol->rows; i++) { + if (symbol->row_height[i] == 0) { + symbol->row_height[i] = 5; + preset_height += 5; + } + } + symbol->height = preset_height; + } +} + +static int gs1_compliant(const int symbology) { + /* Returns 1 if symbology supports GS1 data */ + + int result = 0; + + switch (symbology) { + case BARCODE_EAN128: + case BARCODE_RSS_EXP: + case BARCODE_RSS_EXPSTACK: + case BARCODE_EANX_CC: + case BARCODE_EAN128_CC: + case BARCODE_RSS14_CC: + case BARCODE_RSS_LTD_CC: + case BARCODE_RSS_EXP_CC: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + case BARCODE_RSS14STACK_CC: + case BARCODE_RSS14_OMNI_CC: + case BARCODE_RSS_EXPSTACK_CC: + case BARCODE_CODE16K: + case BARCODE_AZTEC: + case BARCODE_DATAMATRIX: + case BARCODE_CODEONE: + case BARCODE_CODE49: + case BARCODE_QRCODE: + case BARCODE_DOTCODE: + result = 1; + break; + } + + return result; +} + +static int is_matrix(const int symbology) { + /* Returns 1 if symbology is a matrix design */ + + int result = 0; + + switch (symbology) { + case BARCODE_QRCODE: + case BARCODE_DATAMATRIX: + case BARCODE_MICROQR: + case BARCODE_HIBC_DM: + case BARCODE_AZTEC: + case BARCODE_HIBC_QR: + case BARCODE_HIBC_AZTEC: + case BARCODE_AZRUNE: + case BARCODE_CODEONE: + case BARCODE_GRIDMATRIX: + case BARCODE_HANXIN: + case BARCODE_DOTCODE: + case BARCODE_UPNQR: + result = 1; + break; + } + + return result; +} + +static int supports_eci(const int symbology) { + /* Returns 1 if symbology can encode the ECI character */ + + int result = 0; + + switch (symbology) { + case BARCODE_AZTEC: + case BARCODE_DATAMATRIX: + case BARCODE_MAXICODE: + case BARCODE_MICROPDF417: + case BARCODE_PDF417: + case BARCODE_PDF417TRUNC: + case BARCODE_QRCODE: + case BARCODE_DOTCODE: + case BARCODE_GRIDMATRIX: + case BARCODE_HANXIN: + result = 1; + break; + } + + return result; +} + +int ZBarcode_ValidID(int symbol_id) { + /* Checks whether a symbology is supported */ + + int result = 0; + + switch (symbol_id) { + case BARCODE_CODE11: + case BARCODE_C25MATRIX: + case BARCODE_C25INTER: + case BARCODE_C25IATA: + case BARCODE_C25LOGIC: + case BARCODE_C25IND: + case BARCODE_CODE39: + case BARCODE_EXCODE39: + case BARCODE_EANX: + case BARCODE_EANX_CHK: + case BARCODE_EAN128: + case BARCODE_CODABAR: + case BARCODE_CODE128: + case BARCODE_DPLEIT: + case BARCODE_DPIDENT: + case BARCODE_CODE16K: + case BARCODE_CODE49: + case BARCODE_CODE93: + case BARCODE_FLAT: + case BARCODE_RSS14: + case BARCODE_RSS_LTD: + case BARCODE_RSS_EXP: + case BARCODE_TELEPEN: + case BARCODE_UPCA: + case BARCODE_UPCA_CHK: + case BARCODE_UPCE: + case BARCODE_UPCE_CHK: + case BARCODE_POSTNET: + case BARCODE_MSI_PLESSEY: + case BARCODE_FIM: + case BARCODE_LOGMARS: + case BARCODE_PHARMA: + case BARCODE_PZN: + case BARCODE_PHARMA_TWO: + case BARCODE_PDF417: + case BARCODE_PDF417TRUNC: + case BARCODE_MAXICODE: + case BARCODE_QRCODE: + case BARCODE_CODE128B: + case BARCODE_AUSPOST: + case BARCODE_AUSREPLY: + case BARCODE_AUSROUTE: + case BARCODE_AUSREDIRECT: + case BARCODE_ISBNX: + case BARCODE_RM4SCC: + case BARCODE_DATAMATRIX: + case BARCODE_EAN14: + case BARCODE_NVE18: + case BARCODE_JAPANPOST: + case BARCODE_KOREAPOST: + case BARCODE_RSS14STACK: + case BARCODE_RSS14STACK_OMNI: + case BARCODE_RSS_EXPSTACK: + case BARCODE_PLANET: + case BARCODE_MICROPDF417: + case BARCODE_ONECODE: + case BARCODE_PLESSEY: + case BARCODE_TELEPEN_NUM: + case BARCODE_ITF14: + case BARCODE_KIX: + case BARCODE_AZTEC: + case BARCODE_DAFT: + case BARCODE_MICROQR: + case BARCODE_HIBC_128: + case BARCODE_HIBC_39: + case BARCODE_HIBC_DM: + case BARCODE_HIBC_QR: + case BARCODE_HIBC_PDF: + case BARCODE_HIBC_MICPDF: + case BARCODE_HIBC_AZTEC: + case BARCODE_HIBC_BLOCKF: + case BARCODE_AZRUNE: + case BARCODE_CODE32: + case BARCODE_EANX_CC: + case BARCODE_EAN128_CC: + case BARCODE_RSS14_CC: + case BARCODE_RSS_LTD_CC: + case BARCODE_RSS_EXP_CC: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + case BARCODE_RSS14STACK_CC: + case BARCODE_RSS14_OMNI_CC: + case BARCODE_RSS_EXPSTACK_CC: + case BARCODE_CHANNEL: + case BARCODE_CODEONE: + case BARCODE_GRIDMATRIX: + case BARCODE_HANXIN: + case BARCODE_DOTCODE: + case BARCODE_CODABLOCKF: + case BARCODE_UPNQR: + result = 1; + break; + } + + return result; +} + +static int extended_charset(struct zint_symbol *symbol, const unsigned char *source, const int length) { + int error_number = 0; + + /* These are the "elite" standards which can support multiple character sets */ + switch (symbol->symbology) { + case BARCODE_QRCODE: error_number = qr_code(symbol, source, length); + break; + case BARCODE_MICROQR: error_number = microqr(symbol, source, length); + break; + case BARCODE_GRIDMATRIX: error_number = grid_matrix(symbol, source, length); + break; + case BARCODE_HANXIN: error_number = han_xin(symbol, source, length); + break; + case BARCODE_UPNQR: error_number = upnqr(symbol, source, length); + break; + } + + return error_number; +} + +static int reduced_charset(struct zint_symbol *symbol, const unsigned char *source, size_t in_length) { + /* These are the "norm" standards which only support Latin-1 at most */ + int error_number = 0; + +#ifndef _MSC_VER + unsigned char preprocessed[in_length + 1]; +#else + unsigned char* preprocessed = (unsigned char*) _alloca(in_length + 1); +#endif + + if (symbol->symbology == BARCODE_CODE16K) { + symbol->whitespace_width = 16; + symbol->border_width = 2; + if (!(symbol->output_options & BARCODE_BIND)) { + symbol->output_options += BARCODE_BIND; + } + } + else + if (symbol->symbology == BARCODE_ITF14) { + symbol->whitespace_width = 20; + symbol->border_width = 8; + if (!(symbol->output_options & BARCODE_BOX)) { + symbol->output_options += BARCODE_BOX; + } + } + + switch (symbol->input_mode) { + case DATA_MODE: + case GS1_MODE: + memcpy(preprocessed, source, in_length); + preprocessed[in_length] = '\0'; + break; + case UNICODE_MODE: + error_number = utf_to_eci(symbol->eci, source, preprocessed, &in_length); + if (error_number != 0) { + strcpy(symbol->errtxt, "204: Invalid characters in input data"); + return error_number; + } + break; + } + + switch (symbol->symbology) { + case BARCODE_C25MATRIX: error_number = matrix_two_of_five(symbol, preprocessed, in_length); + break; + case BARCODE_C25IND: error_number = industrial_two_of_five(symbol, preprocessed, in_length); + break; + case BARCODE_C25INTER: error_number = interleaved_two_of_five(symbol, preprocessed, in_length); + break; + case BARCODE_C25IATA: error_number = iata_two_of_five(symbol, preprocessed, in_length); + break; + case BARCODE_C25LOGIC: error_number = logic_two_of_five(symbol, preprocessed, in_length); + break; + case BARCODE_DPLEIT: error_number = dpleit(symbol, preprocessed, in_length); + break; + case BARCODE_DPIDENT: error_number = dpident(symbol, preprocessed, in_length); + break; + case BARCODE_UPCA: + case BARCODE_UPCA_CHK: + case BARCODE_UPCE: + case BARCODE_UPCE_CHK: + case BARCODE_EANX: + case BARCODE_EANX_CHK: + error_number = eanx(symbol, preprocessed, in_length); + break; + case BARCODE_EAN128: error_number = ean_128(symbol, preprocessed, in_length); + break; + case BARCODE_CODE39: error_number = c39(symbol, preprocessed, in_length); + break; + case BARCODE_PZN: error_number = pharmazentral(symbol, preprocessed, in_length); + break; + case BARCODE_EXCODE39: error_number = ec39(symbol, preprocessed, in_length); + break; + case BARCODE_CODABAR: error_number = codabar(symbol, preprocessed, in_length); + break; + case BARCODE_CODE93: error_number = c93(symbol, preprocessed, in_length); + break; + case BARCODE_LOGMARS: error_number = c39(symbol, preprocessed, in_length); + break; + case BARCODE_CODE128: + case BARCODE_CODE128B: + error_number = code_128(symbol, preprocessed, in_length); + break; + case BARCODE_NVE18: error_number = nve_18(symbol, preprocessed, in_length); + break; + case BARCODE_CODE11: error_number = code_11(symbol, preprocessed, in_length); + break; + case BARCODE_MSI_PLESSEY: error_number = msi_handle(symbol, preprocessed, in_length); + break; + case BARCODE_TELEPEN: error_number = telepen(symbol, preprocessed, in_length); + break; + case BARCODE_TELEPEN_NUM: error_number = telepen_num(symbol, preprocessed, in_length); + break; + case BARCODE_PHARMA: error_number = pharma_one(symbol, preprocessed, in_length); + break; + case BARCODE_PLESSEY: error_number = plessey(symbol, preprocessed, in_length); + break; + case BARCODE_ITF14: error_number = itf14(symbol, preprocessed, in_length); + break; + case BARCODE_FLAT: error_number = flattermarken(symbol, preprocessed, in_length); + break; + case BARCODE_FIM: error_number = fim(symbol, preprocessed, in_length); + break; + case BARCODE_POSTNET: error_number = post_plot(symbol, preprocessed, in_length); + break; + case BARCODE_PLANET: error_number = planet_plot(symbol, preprocessed, in_length); + break; + case BARCODE_RM4SCC: error_number = royal_plot(symbol, preprocessed, in_length); + break; + case BARCODE_AUSPOST: + case BARCODE_AUSREPLY: + case BARCODE_AUSROUTE: + case BARCODE_AUSREDIRECT: + error_number = australia_post(symbol, preprocessed, in_length); + break; + case BARCODE_CODE16K: error_number = code16k(symbol, preprocessed, in_length); + break; + case BARCODE_PHARMA_TWO: error_number = pharma_two(symbol, preprocessed, in_length); + break; + case BARCODE_ONECODE: error_number = imail(symbol, preprocessed, in_length); + break; + case BARCODE_ISBNX: error_number = eanx(symbol, preprocessed, in_length); + break; + case BARCODE_RSS14: + case BARCODE_RSS14STACK: + case BARCODE_RSS14STACK_OMNI: + error_number = rss14(symbol, preprocessed, in_length); + break; + case BARCODE_RSS_LTD: error_number = rsslimited(symbol, preprocessed, in_length); + break; + case BARCODE_RSS_EXP: + case BARCODE_RSS_EXPSTACK: + error_number = rssexpanded(symbol, preprocessed, in_length); + break; + case BARCODE_EANX_CC: + case BARCODE_EAN128_CC: + case BARCODE_RSS14_CC: + case BARCODE_RSS_LTD_CC: + case BARCODE_RSS_EXP_CC: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + case BARCODE_RSS14STACK_CC: + case BARCODE_RSS14_OMNI_CC: + case BARCODE_RSS_EXPSTACK_CC: + error_number = composite(symbol, preprocessed, in_length); + break; + case BARCODE_KIX: error_number = kix_code(symbol, preprocessed, in_length); + break; + case BARCODE_CODE32: error_number = code32(symbol, preprocessed, in_length); + break; + case BARCODE_DAFT: error_number = daft_code(symbol, preprocessed, in_length); + break; + case BARCODE_EAN14: + error_number = ean_14(symbol, preprocessed, in_length); + break; + case BARCODE_AZRUNE: error_number = aztec_runes(symbol, preprocessed, in_length); + break; + case BARCODE_KOREAPOST: error_number = korea_post(symbol, preprocessed, in_length); + break; + case BARCODE_HIBC_128: + case BARCODE_HIBC_39: + case BARCODE_HIBC_DM: + case BARCODE_HIBC_QR: + case BARCODE_HIBC_PDF: + case BARCODE_HIBC_MICPDF: + case BARCODE_HIBC_AZTEC: + case BARCODE_HIBC_BLOCKF: + error_number = hibc(symbol, preprocessed, in_length); + break; + case BARCODE_JAPANPOST: error_number = japan_post(symbol, preprocessed, in_length); + break; + case BARCODE_CODE49: error_number = code_49(symbol, preprocessed, in_length); + break; + case BARCODE_CHANNEL: error_number = channel_code(symbol, preprocessed, in_length); + break; + case BARCODE_CODEONE: error_number = code_one(symbol, preprocessed, in_length); + break; + case BARCODE_DATAMATRIX: error_number = dmatrix(symbol, preprocessed, in_length); + break; + case BARCODE_PDF417: + case BARCODE_PDF417TRUNC: + error_number = pdf417enc(symbol, preprocessed, in_length); + break; + case BARCODE_MICROPDF417: error_number = micro_pdf417(symbol, preprocessed, in_length); + break; + case BARCODE_MAXICODE: error_number = maxicode(symbol, preprocessed, in_length); + break; + case BARCODE_AZTEC: error_number = aztec(symbol, preprocessed, in_length); + break; + case BARCODE_DOTCODE: error_number = dotcode(symbol, preprocessed, in_length); + break; + case BARCODE_CODABLOCKF: error_number = codablock(symbol, preprocessed, in_length); + break; + } + + return error_number; +} + +int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *source,int in_length) { + int error_number, error_buffer, i; +#ifdef _MSC_VER + unsigned char* local_source; +#endif + error_number = 0; + + if (in_length == 0) { + in_length = (int)ustrlen(source); + } + if (in_length == 0) { + strcpy(symbol->errtxt, "205: No input data"); + error_tag(symbol->errtxt, ZINT_ERROR_INVALID_DATA); + return ZINT_ERROR_INVALID_DATA; + } + + if (strcmp(symbol->outfile, "") == 0) { +#ifdef NO_PNG + strcpy(symbol->outfile, "out.gif"); +#else + strcpy(symbol->outfile, "out.png"); +#endif + } +#ifndef _MSC_VER + unsigned char local_source[in_length + 1]; +#else + local_source = (unsigned char*) _alloca(in_length + 1); +#endif + + /* First check the symbology field */ + if (symbol->symbology < 1) { + strcpy(symbol->errtxt, "206: Symbology out of range, using Code 128"); + symbol->symbology = BARCODE_CODE128; + error_number = ZINT_WARN_INVALID_OPTION; + } + + /* symbol->symbologys 1 to 86 are defined by tbarcode */ + if (symbol->symbology == 5) { + symbol->symbology = BARCODE_C25MATRIX; + } + if ((symbol->symbology >= 10) && (symbol->symbology <= 12)) { + symbol->symbology = BARCODE_EANX; + } + if (symbol->symbology == 15) { + symbol->symbology = BARCODE_EANX; + } + if (symbol->symbology == 17) { + symbol->symbology = BARCODE_UPCA; + } + if (symbol->symbology == 19) { + strcpy(symbol->errtxt, "207: Codabar 18 not supported, using Codabar"); + symbol->symbology = BARCODE_CODABAR; + error_number = ZINT_WARN_INVALID_OPTION; + } + if (symbol->symbology == 26) { + symbol->symbology = BARCODE_UPCA; + } + if (symbol->symbology == 27) { + strcpy(symbol->errtxt, "208: UPCD1 not supported"); + error_number = ZINT_ERROR_INVALID_OPTION; + } + if (symbol->symbology == 33) { + symbol->symbology = BARCODE_EAN128; + } + if (symbol->symbology == 36) { + symbol->symbology = BARCODE_UPCA; + } + if (symbol->symbology == 38) { + symbol->symbology = BARCODE_UPCE; + } + if ((symbol->symbology >= 41) && (symbol->symbology <= 45)) { + symbol->symbology = BARCODE_POSTNET; + } + if (symbol->symbology == 46) { + symbol->symbology = BARCODE_PLESSEY; + } + if (symbol->symbology == 48) { + symbol->symbology = BARCODE_NVE18; + } + if (symbol->symbology == 54) { + strcpy(symbol->errtxt, "210: General Parcel Code not supported, using Code 128"); + symbol->symbology = BARCODE_CODE128; + error_number = ZINT_WARN_INVALID_OPTION; + } + if ((symbol->symbology == 59) || (symbol->symbology == 61)) { + symbol->symbology = BARCODE_CODE128; + } + if (symbol->symbology == 62) { + symbol->symbology = BARCODE_CODE93; + } + if ((symbol->symbology == 64) || (symbol->symbology == 65)) { + symbol->symbology = BARCODE_AUSPOST; + } + if (symbol->symbology == 73) { + strcpy(symbol->errtxt, "211: Symbology out of range, using Code 128"); + symbol->symbology = BARCODE_CODE128; + error_number = ZINT_WARN_INVALID_OPTION; + } + if (symbol->symbology == 78) { + symbol->symbology = BARCODE_RSS14; + } + if (symbol->symbology == 83) { + symbol->symbology = BARCODE_PLANET; + } + if (symbol->symbology == 88) { + symbol->symbology = BARCODE_EAN128; + } + if (symbol->symbology == 91) { + strcpy(symbol->errtxt, "212: Symbology out of range, using Code 128"); + symbol->symbology = BARCODE_CODE128; + error_number = ZINT_WARN_INVALID_OPTION; + } + if ((symbol->symbology >= 94) && (symbol->symbology <= 96)) { + strcpy(symbol->errtxt, "213: Symbology out of range, using Code 128"); + symbol->symbology = BARCODE_CODE128; + error_number = ZINT_WARN_INVALID_OPTION; + } + if (symbol->symbology == 100) { + symbol->symbology = BARCODE_HIBC_128; + } + if (symbol->symbology == 101) { + symbol->symbology = BARCODE_HIBC_39; + } + if (symbol->symbology == 103) { + symbol->symbology = BARCODE_HIBC_DM; + } + if (symbol->symbology == 105) { + symbol->symbology = BARCODE_HIBC_QR; + } + if (symbol->symbology == 107) { + symbol->symbology = BARCODE_HIBC_PDF; + } + if (symbol->symbology == 109) { + symbol->symbology = BARCODE_HIBC_MICPDF; + } + if (symbol->symbology == 111) { + symbol->symbology = BARCODE_HIBC_BLOCKF; + } + if ((symbol->symbology == 113) || (symbol->symbology == 114)) { + strcpy(symbol->errtxt, "214: Symbology out of range, using Code 128"); + symbol->symbology = BARCODE_CODE128; + error_number = ZINT_WARN_INVALID_OPTION; + } + if (symbol->symbology == 115) { + symbol->symbology = BARCODE_DOTCODE; + } + if ((symbol->symbology >= 117) && (symbol->symbology <= 127)) { + strcpy(symbol->errtxt, "215: Symbology out of range, using Code 128"); + symbol->symbology = BARCODE_CODE128; + error_number = ZINT_WARN_INVALID_OPTION; + } + /* Everything from 128 up is Zint-specific */ + if (symbol->symbology >= 144) { + strcpy(symbol->errtxt, "216: Symbology out of range, using Code 128"); + symbol->symbology = BARCODE_CODE128; + error_number = ZINT_WARN_INVALID_OPTION; + } + + if (error_number > 4) { + error_tag(symbol->errtxt, error_number); + return error_number; + } else { + error_buffer = error_number; + } + + if ((!(supports_eci(symbol->symbology))) && (symbol->eci != 3)) { + strcpy(symbol->errtxt, "217: Symbology does not support ECI switching"); + error_number = ZINT_ERROR_INVALID_OPTION; + } + + if ((symbol->eci < 3) || (symbol->eci > 999999)) { + strcpy(symbol->errtxt, "218: Invalid ECI mode"); + error_number = ZINT_ERROR_INVALID_OPTION; + } + + if ((symbol->input_mode < 0) || (symbol->input_mode > 2)) { + symbol->input_mode = DATA_MODE; + } + + if ((symbol->eci != 3) && (symbol->eci != 26)) { + symbol->input_mode = DATA_MODE; + } + + if (symbol->input_mode == GS1_MODE) { + for (i = 0; i < in_length; i++) { + if (source[i] == '\0') { + strcpy(symbol->errtxt, "219: NULL characters not permitted in GS1 mode"); + return ZINT_ERROR_INVALID_DATA; + } + } + if (gs1_compliant(symbol->symbology) == 1) { + error_number = ugs1_verify(symbol, source, in_length, local_source); + if (error_number != 0) { + return error_number; + } + in_length =(int)ustrlen(local_source); + } else { + strcpy(symbol->errtxt, "220: Selected symbology does not support GS1 mode"); + return ZINT_ERROR_INVALID_OPTION; + } + } else { + memcpy(local_source, source, in_length); + local_source[in_length] = '\0'; + } + + if ((symbol->dot_size < 0.01) || (symbol->dot_size > 20.0)) { + strcpy(symbol->errtxt, "221: Invalid dot size"); + return ZINT_ERROR_INVALID_OPTION; + } + + switch (symbol->symbology) { + case BARCODE_QRCODE: + case BARCODE_MICROQR: + case BARCODE_GRIDMATRIX: + case BARCODE_HANXIN: + case BARCODE_UPNQR: + error_number = extended_charset(symbol, local_source, in_length); + break; + default: + error_number = reduced_charset(symbol, local_source, in_length); + break; + } + + if ((error_number == ZINT_ERROR_INVALID_DATA) && (supports_eci(symbol->symbology) + && (symbol->input_mode == UNICODE_MODE))) { + /* Try another ECI mode */ + symbol->eci = get_best_eci(local_source, in_length); + + error_number = ZINT_WARN_USES_ECI; + strcpy(symbol->errtxt, "222: Encoded data includes ECI codes"); + //printf("Data will encode with ECI %d\n", symbol->eci); + + switch (symbol->symbology) { + case BARCODE_QRCODE: + case BARCODE_MICROQR: + case BARCODE_GRIDMATRIX: + case BARCODE_HANXIN: + error_number = utf_to_eci(symbol->eci, source, local_source, (size_t*)&in_length); + error_number = extended_charset(symbol, local_source, in_length); + break; + default: + error_number = reduced_charset(symbol, local_source, in_length); + break; + } + + } + + if (error_number == 0) { + if ((symbol->symbology == BARCODE_CODE128) || (symbol->symbology == BARCODE_CODE128B)) { + for (i = 0; i < in_length; i++) { + if (local_source[i] == '\0') { + symbol->text[i] = ' '; + } else { + symbol->text[i] = local_source[i]; + } + } + } + error_number = error_buffer; + } + error_tag(symbol->errtxt, error_number); + + if (error_number <= 5) { + check_row_heights(symbol); + } + + return error_number; +} + +int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle) { + int error_number; + char output[4]; + + switch (rotate_angle) { + case 0: + case 90: + case 180: + case 270: + break; + default: + strcpy(symbol->errtxt, "223: Invalid rotation angle"); + return ZINT_ERROR_INVALID_OPTION; + } + + if (symbol->output_options & BARCODE_DOTTY_MODE) { + if (!(is_matrix(symbol->symbology))) { + strcpy(symbol->errtxt, "224: Selected symbology cannot be rendered as dots"); + return ZINT_ERROR_INVALID_OPTION; + } + } + + if (strlen(symbol->outfile) > 3) { + output[0] = symbol->outfile[strlen(symbol->outfile) - 3]; + output[1] = symbol->outfile[strlen(symbol->outfile) - 2]; + output[2] = symbol->outfile[strlen(symbol->outfile) - 1]; + output[3] = '\0'; + to_upper((unsigned char*) output); + + if (!(strcmp(output, "PNG"))) { + if (symbol->scale < 1.0) { + symbol->text[0] = '\0'; + } + error_number = plot_raster(symbol, rotate_angle, OUT_PNG_FILE); + } else + if (!(strcmp(output, "BMP"))) { + if (symbol->scale < 1.0) { + symbol->text[0] = '\0'; + } + error_number = plot_raster(symbol, rotate_angle, OUT_BMP_FILE); + } else + if (!(strcmp(output, "PCX"))) { + if (symbol->scale < 1.0) { + symbol->text[0] = '\0'; + } + error_number = plot_raster(symbol, rotate_angle, OUT_PCX_FILE); + } else + if (!(strcmp(output, "GIF"))) { + if (symbol->scale < 1.0) { + symbol->text[0] = '\0'; + } + error_number = plot_raster(symbol, rotate_angle, OUT_GIF_FILE); + } else + if (!(strcmp(output, "TIF"))) { + if (symbol->scale < 1.0) { + symbol->text[0] = '\0'; + } + error_number = plot_raster(symbol, rotate_angle, OUT_TIF_FILE); + } else + if (!(strcmp(output, "TXT"))) { + error_number = dump_plot(symbol); + } else + if (!(strcmp(output, "EPS"))) { + error_number = ps_plot(symbol); + } else + if (!(strcmp(output, "SVG"))) { + error_number = svg_plot(symbol); + } else + if (!(strcmp(output, "EMF"))) { + error_number = emf_plot(symbol); + } else { + strcpy(symbol->errtxt, "225: Unknown output format"); + error_tag(symbol->errtxt, ZINT_ERROR_INVALID_OPTION); + return ZINT_ERROR_INVALID_OPTION; + } + } else { + strcpy(symbol->errtxt, "226: Unknown output format"); + error_tag(symbol->errtxt, ZINT_ERROR_INVALID_OPTION); + return ZINT_ERROR_INVALID_OPTION; + } + + if (error_number == ZINT_ERROR_INVALID_OPTION) { + /* If libpng is not installed */ + strcpy(symbol->errtxt, "227: Unknown output format"); + } + + error_tag(symbol->errtxt, error_number); + return error_number; +} + +int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle) { + int error_number; + + switch (rotate_angle) { + case 0: + case 90: + case 180: + case 270: + break; + default: + strcpy(symbol->errtxt, "228: Invalid rotation angle"); + return ZINT_ERROR_INVALID_OPTION; + } + + error_number = plot_raster(symbol, rotate_angle, OUT_BUFFER); + error_tag(symbol->errtxt, error_number); + return error_number; +} + +int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) { + int error_number; + + error_number = ZBarcode_Encode(symbol, input, length); + if (error_number != 0) { + return error_number; + } + + error_number = ZBarcode_Print(symbol, rotate_angle); + return error_number; +} + +int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) { + int error_number; + + error_number = ZBarcode_Encode(symbol, input, length); + if (error_number != 0) { + return error_number; + } + + error_number = ZBarcode_Buffer(symbol, rotate_angle); + return error_number; +} + +int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) { + FILE *file; + unsigned char *buffer; + unsigned long fileLen; + unsigned int nRead = 0, n = 0; + int ret; + + if (!strcmp(filename, "-")) { + file = stdin; + fileLen = 7100; + } else { + file = fopen(filename, "rb"); + if (!file) { + strcpy(symbol->errtxt, "229: Unable to read input file"); + return ZINT_ERROR_INVALID_DATA; + } + + /* Get file length */ + fseek(file, 0, SEEK_END); + fileLen = ftell(file); + fseek(file, 0, SEEK_SET); + + if (fileLen > 7100) { + /* The largest amount of data that can be encoded is 7089 numeric digits in QR Code */ + strcpy(symbol->errtxt, "230: Input file too long"); + fclose(file); + return ZINT_ERROR_INVALID_DATA; + } + } + + /* Allocate memory */ + buffer = (unsigned char *) malloc(fileLen * sizeof (unsigned char)); + if (!buffer) { + strcpy(symbol->errtxt, "231: Internal memory error"); + if (strcmp(filename, "-")) + fclose(file); + return ZINT_ERROR_MEMORY; + } + + /* Read file contents into buffer */ + + do { + n = fread(buffer + nRead, 1, fileLen - nRead, file); + if (ferror(file)) { + strcpy(symbol->errtxt, strerror(errno)); + return ZINT_ERROR_INVALID_DATA; + } + nRead += n; + } while (!feof(file) && (0 < n) && (nRead < fileLen)); + + fclose(file); + ret = ZBarcode_Encode(symbol, buffer, nRead); + free(buffer); + return ret; +} + +int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle) { + int error_number; + + error_number = ZBarcode_Encode_File(symbol, filename); + if (error_number != 0) { + return error_number; + } + + return ZBarcode_Print(symbol, rotate_angle); +} + +int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle) { + int error_number; + + error_number = ZBarcode_Encode_File(symbol, filename); + if (error_number != 0) { + return error_number; + } + + return ZBarcode_Buffer(symbol, rotate_angle); +} + +/* + * Rendering support, initially added by Sam Lown. + * + * Converts encoded data into an intermediate format to be interpreted + * in other applications using this library. + * + * If the width and height are not set to zero, the barcode will be resized to those + * dimensions. The symbol->scale and symbol->height values are totally ignored in this case. + * + */ +int ZBarcode_Render(struct zint_symbol *symbol, const float width, const float height) { + // Send the request to the render_plot method + return render_plot(symbol, width, height); +} + +int ZBarcode_Version() { + return (ZINT_VERSION_MAJOR * 10000) + (ZINT_VERSION_MINOR * 100) + ZINT_VERSION_RELEASE; +} diff --git a/3rdparty/zint-2.6.1/backend/libzint.rc b/3rdparty/zint-2.6.1/backend/libzint.rc new file mode 100644 index 0000000..8e3b780 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/libzint.rc @@ -0,0 +1,42 @@ +#define WIN32_LEAN_AND_MEAN +#include +#include + +#ifdef GCC_WINDRES +VS_VERSION_INFO VERSIONINFO +#else +VS_VERSION_INFO VERSIONINFO +#endif + FILEVERSION 2,6,0,0 + PRODUCTVERSION 2,6,0,0 + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0 +#endif + FILEOS VOS_NT_WINDOWS32 + FILETYPE VFT_DLL + FILESUBTYPE VFT2_UNKNOWN +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + //language ID = U.S. English, char set = Windows, Multilingual + BEGIN + VALUE "FileDescription", "libzint barcode library\0" + VALUE "FileVersion", "2.6.0.0\0" + VALUE "InternalName", "zint.dll\0" + VALUE "LegalCopyright", "Copyright 2017 Robin Stuart & BogDan Vatra\0" + VALUE "OriginalFilename", "zint.dll\0" + VALUE "ProductName", "libzint\0" + VALUE "ProductVersion", "2.6.0.0\0" + VALUE "License", "BSD License version 3\0" + VALUE "WWW", "http://www.sourceforge.net/projects/zint" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0409, 1250 + END +END diff --git a/3rdparty/zint-2.6.1/backend/maxicode.c b/3rdparty/zint-2.6.1/backend/maxicode.c new file mode 100644 index 0000000..a012367 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/maxicode.c @@ -0,0 +1,733 @@ +/* maxicode.c - Handles Maxicode */ + +/* + libzint - the open source barcode library + Copyright (C) 2010-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* Includes corrections thanks to Monica Swanson @ Source Technologies */ + +#include "common.h" +#include "maxicode.h" +#include "reedsol.h" +#include +#include + +int maxi_codeword[144]; + +/* Handles error correction of primary message */ +void maxi_do_primary_check() { + unsigned char data[15]; + unsigned char results[15]; + int j; + int datalen = 10; + int ecclen = 10; + + rs_init_gf(0x43); + rs_init_code(ecclen, 1); + + for (j = 0; j < datalen; j += 1) + data[j] = maxi_codeword[j]; + + rs_encode(datalen, data, results); + + for (j = 0; j < ecclen; j += 1) + maxi_codeword[ datalen + j] = results[ecclen - 1 - j]; + rs_free(); +} + +/* Handles error correction of odd characters in secondary */ +void maxi_do_secondary_chk_odd(int ecclen) { + unsigned char data[100]; + unsigned char results[30]; + int j; + int datalen = 68; + + rs_init_gf(0x43); + rs_init_code(ecclen, 1); + + if (ecclen == 20) + datalen = 84; + + for (j = 0; j < datalen; j += 1) + if (j & 1) // odd + data[(j - 1) / 2] = maxi_codeword[j + 20]; + + rs_encode(datalen / 2, data, results); + + for (j = 0; j < (ecclen); j += 1) + maxi_codeword[ datalen + (2 * j) + 1 + 20 ] = results[ecclen - 1 - j]; + rs_free(); +} + +/* Handles error correction of even characters in secondary */ +void maxi_do_secondary_chk_even(int ecclen) { + unsigned char data[100]; + unsigned char results[30]; + int j; + int datalen = 68; + + if (ecclen == 20) + datalen = 84; + + rs_init_gf(0x43); + rs_init_code(ecclen, 1); + + for (j = 0; j < datalen + 1; j += 1) + if (!(j & 1)) // even + data[j / 2] = maxi_codeword[j + 20]; + + rs_encode(datalen / 2, data, results); + + for (j = 0; j < (ecclen); j += 1) + maxi_codeword[ datalen + (2 * j) + 20] = results[ecclen - 1 - j]; + rs_free(); +} + +/* Moves everything up so that a shift or latch can be inserted */ +void maxi_bump(int set[], int character[], int bump_posn) { + int i; + + for (i = 143; i > bump_posn; i--) { + set[i] = set[i - 1]; + character[i] = character[i - 1]; + } +} + +/* Format text according to Appendix A */ +int maxi_text_process(int mode, unsigned char source[], int length, int eci) { + /* This code doesn't make use of [Lock in C], [Lock in D] + and [Lock in E] and so is not always the most efficient at + compressing data, but should suffice for most applications */ + + int set[144], character[144], i, j, done, count, current_set; + + if (length > 138) { + return ZINT_ERROR_TOO_LONG; + } + + for (i = 0; i < 144; i++) { + set[i] = -1; + character[i] = 0; + } + + for (i = 0; i < length; i++) { + /* Look up characters in table from Appendix A - this gives + value and code set for most characters */ + set[i] = maxiCodeSet[source[i]]; + character[i] = maxiSymbolChar[source[i]]; + } + + /* If a character can be represented in more than one code set, + pick which version to use */ + if (set[0] == 0) { + if (character[0] == 13) { + character[0] = 0; + } + set[0] = 1; + } + + for (i = 1; i < length; i++) { + if (set[i] == 0) { + done = 0; + /* Special character */ + if (character[i] == 13) { + /* Carriage Return */ + if (set[i - 1] == 5) { + character[i] = 13; + set[i] = 5; + } else { + if ((i != length - 1) && (set[i + 1] == 5)) { + character[i] = 13; + set[i] = 5; + } else { + character[i] = 0; + set[i] = 1; + } + } + done = 1; + } + + if ((character[i] == 28) && (done == 0)) { + /* FS */ + if (set[i - 1] == 5) { + character[i] = 32; + set[i] = 5; + } else { + set[i] = set[i - 1]; + } + done = 1; + } + + if ((character[i] == 29) && (done == 0)) { + /* GS */ + if (set[i - 1] == 5) { + character[i] = 33; + set[i] = 5; + } else { + set[i] = set[i - 1]; + } + done = 1; + } + + if ((character[i] == 30) && (done == 0)) { + /* RS */ + if (set[i - 1] == 5) { + character[i] = 34; + set[i] = 5; + } else { + set[i] = set[i - 1]; + } + done = 1; + } + + if ((character[i] == 32) && (done == 0)) { + /* Space */ + if (set[i - 1] == 1) { + character[i] = 32; + set[i] = 1; + } + if (set[i - 1] == 2) { + character[i] = 47; + set[i] = 2; + } + if (set[i - 1] >= 3) { + if (i != length - 1) { + if (set[i + 1] == 1) { + character[i] = 32; + set[i] = 1; + } + if (set[i + 1] == 2) { + character[i] = 47; + set[i] = 2; + } + if (set[i + 1] >= 3) { + character[i] = 59; + set[i] = set[i - 1]; + } + } else { + character[i] = 59; + set[i] = set[i - 1]; + } + } + done = 1; + } + + if ((character[i] == 44) && (done == 0)) { + /* Comma */ + if (set[i - 1] == 2) { + character[i] = 48; + set[i] = 2; + } else { + if ((i != length - 1) && (set[i + 1] == 2)) { + character[i] = 48; + set[i] = 2; + } else { + set[i] = 1; + } + } + done = 1; + } + + if ((character[i] == 46) && (done == 0)) { + /* Full Stop */ + if (set[i - 1] == 2) { + character[i] = 49; + set[i] = 2; + } else { + if ((i != length - 1) && (set[i + 1] == 2)) { + character[i] = 49; + set[i] = 2; + } else { + set[i] = 1; + } + } + done = 1; + } + + if ((character[i] == 47) && (done == 0)) { + /* Slash */ + if (set[i - 1] == 2) { + character[i] = 50; + set[i] = 2; + } else { + if ((i != length - 1) && (set[i + 1] == 2)) { + character[i] = 50; + set[i] = 2; + } else { + set[i] = 1; + } + } + done = 1; + } + + if ((character[i] == 58) && (done == 0)) { + /* Colon */ + if (set[i - 1] == 2) { + character[i] = 51; + set[i] = 2; + } else { + if ((i != length - 1) && (set[i + 1] == 2)) { + character[i] = 51; + set[i] = 2; + } else { + set[i] = 1; + } + } + done = 1; + } + } + } + + for (i = length; i < 144; i++) { + /* Add the padding */ + if (set[length - 1] == 2) { + set[i] = 2; + } else { + set[i] = 1; + } + character[i] = 33; + } + + /* Find candidates for number compression */ + if ((mode == 2) || (mode == 3)) { + j = 0; + } else { + j = 9; + } + /* Number compression not allowed in primary message */ + count = 0; + for (i = j; i < 143; i++) { + if ((set[i] == 1) && ((character[i] >= 48) && (character[i] <= 57))) { + /* Character is a number */ + count++; + } else { + count = 0; + } + if (count == 9) { + /* Nine digits in a row can be compressed */ + set[i] = 6; + set[i - 1] = 6; + set[i - 2] = 6; + set[i - 3] = 6; + set[i - 4] = 6; + set[i - 5] = 6; + set[i - 6] = 6; + set[i - 7] = 6; + set[i - 8] = 6; + count = 0; + } + } + + /* Add shift and latch characters */ + current_set = 1; + i = 0; + do { + + if ((set[i] != current_set) && (set[i] != 6)) { + switch (set[i]) { + case 1: + if (set[i + 1] == 1) { + if (set[i + 2] == 1) { + if (set[i + 3] == 1) { + /* Latch A */ + maxi_bump(set, character, i); + character[i] = 63; + current_set = 1; + length++; + } else { + /* 3 Shift A */ + maxi_bump(set, character, i); + character[i] = 57; + length++; + i += 2; + } + } else { + /* 2 Shift A */ + maxi_bump(set, character, i); + character[i] = 56; + length++; + i++; + } + } else { + /* Shift A */ + maxi_bump(set, character, i); + character[i] = 59; + length++; + } + break; + case 2: + if (set[i + 1] == 2) { + /* Latch B */ + maxi_bump(set, character, i); + character[i] = 63; + current_set = 2; + length++; + } else { + /* Shift B */ + maxi_bump(set, character, i); + character[i] = 59; + length++; + } + break; + case 3: + /* Shift C */ + maxi_bump(set, character, i); + character[i] = 60; + length++; + break; + case 4: + /* Shift D */ + maxi_bump(set, character, i); + character[i] = 61; + length++; + break; + case 5: + /* Shift E */ + maxi_bump(set, character, i); + character[i] = 62; + length++; + break; + } + i++; + } + i++; + } while (i < 144); + + /* Number compression has not been forgotten! - It's handled below */ + i = 0; + do { + if (set[i] == 6) { + /* Number compression */ + char substring[11]; + int value; + + for (j = 0; j < 9; j++) { + substring[j] = character[i + j]; + } + substring[9] = '\0'; + value = atoi(substring); + + character[i] = 31; /* NS */ + character[i + 1] = (value & 0x3f000000) >> 24; + character[i + 2] = (value & 0xfc0000) >> 18; + character[i + 3] = (value & 0x3f000) >> 12; + character[i + 4] = (value & 0xfc0) >> 6; + character[i + 5] = (value & 0x3f); + + i += 6; + for (j = i; j < 140; j++) { + set[j] = set[j + 3]; + character[j] = character[j + 3]; + } + length -= 3; + } else { + i++; + } + } while (i <= 143); + + /* Insert ECI at the beginning of message if needed */ + /* Encode ECI assignment numbers according to table 3 */ + if (eci != 3) { + maxi_bump(set, character, 0); + character[0] = 27; // ECI + if (eci <= 31) { + maxi_bump(set, character, 1); + character[1] = eci; + length += 2; + } + if ((eci >= 32) && (eci <= 1023)) { + maxi_bump(set, character, 1); + maxi_bump(set, character, 1); + character[1] = 0x20 + ((eci >> 6) & 0x0F); + character[2] = eci & 0x3F; + length += 3; + } + if ((eci >= 1024) && (eci <= 32767)) { + maxi_bump(set, character, 1); + maxi_bump(set, character, 1); + maxi_bump(set, character, 1); + character[1] = 0x30 + ((eci >> 12) & 0x03); + character[2] = (eci >> 6) & 0x3F; + character[3] = eci & 0x3F; + length += 4; + } + if (eci >= 32768) { + maxi_bump(set, character, 1); + maxi_bump(set, character, 1); + maxi_bump(set, character, 1); + maxi_bump(set, character, 1); + character[1] = 0x38 + ((eci >> 18) & 0x02); + character[2] = (eci >> 12) & 0x3F; + character[3] = (eci >> 6) & 0x3F; + character[4] = eci & 0x3F; + length += 5; + } + } + + if (((mode == 2) || (mode == 3)) && (length > 84)) { + return ZINT_ERROR_TOO_LONG; + } + + if (((mode == 4) || (mode == 6)) && (length > 93)) { + return ZINT_ERROR_TOO_LONG; + } + + if ((mode == 5) && (length > 77)) { + return ZINT_ERROR_TOO_LONG; + } + + + /* Copy the encoded text into the codeword array */ + if ((mode == 2) || (mode == 3)) { + for (i = 0; i < 84; i++) { /* secondary only */ + maxi_codeword[i + 20] = character[i]; + } + } + + if ((mode == 4) || (mode == 6)) { + for (i = 0; i < 9; i++) { /* primary */ + maxi_codeword[i + 1] = character[i]; + } + for (i = 0; i < 84; i++) { /* secondary */ + maxi_codeword[i + 20] = character[i + 9]; + } + } + + if (mode == 5) { + for (i = 0; i < 9; i++) { /* primary */ + maxi_codeword[i + 1] = character[i]; + } + for (i = 0; i < 68; i++) { /* secondary */ + maxi_codeword[i + 20] = character[i + 9]; + } + } + + return 0; +} + +/* Format structured primary for Mode 2 */ +void maxi_do_primary_2(char postcode[], int country, int service) { + size_t postcode_length; + int postcode_num, i; + + for (i = 0; i < 10; i++) { + if ((postcode[i] < '0') || (postcode[i] > '9')) { + postcode[i] = '\0'; + } + } + + postcode_length = strlen(postcode); + postcode_num = atoi(postcode); + + maxi_codeword[0] = ((postcode_num & 0x03) << 4) | 2; + maxi_codeword[1] = ((postcode_num & 0xfc) >> 2); + maxi_codeword[2] = ((postcode_num & 0x3f00) >> 8); + maxi_codeword[3] = ((postcode_num & 0xfc000) >> 14); + maxi_codeword[4] = ((postcode_num & 0x3f00000) >> 20); + maxi_codeword[5] = ((postcode_num & 0x3c000000) >> 26) | ((postcode_length & 0x3) << 4); + maxi_codeword[6] = ((postcode_length & 0x3c) >> 2) | ((country & 0x3) << 4); + maxi_codeword[7] = (country & 0xfc) >> 2; + maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2); + maxi_codeword[9] = ((service & 0x3f0) >> 4); +} + +/* Format structured primary for Mode 3 */ +void maxi_do_primary_3(char postcode[], int country, int service) { + int i, h; + + h = strlen(postcode); + to_upper((unsigned char*) postcode); + for (i = 0; i < h; i++) { + if ((postcode[i] >= 'A') && (postcode[i] <= 'Z')) { + /* (Capital) letters shifted to Code Set A values */ + postcode[i] -= 64; + } + if (((postcode[i] == 27) || (postcode[i] == 31)) || ((postcode[i] == 33) || (postcode[i] >= 59))) { + /* Not a valid postcode character */ + postcode[i] = ' '; + } + /* Input characters lower than 27 (NUL - SUB) in postcode are + interpreted as capital letters in Code Set A (e.g. LF becomes 'J') */ + } + + maxi_codeword[0] = ((postcode[5] & 0x03) << 4) | 3; + maxi_codeword[1] = ((postcode[4] & 0x03) << 4) | ((postcode[5] & 0x3c) >> 2); + maxi_codeword[2] = ((postcode[3] & 0x03) << 4) | ((postcode[4] & 0x3c) >> 2); + maxi_codeword[3] = ((postcode[2] & 0x03) << 4) | ((postcode[3] & 0x3c) >> 2); + maxi_codeword[4] = ((postcode[1] & 0x03) << 4) | ((postcode[2] & 0x3c) >> 2); + maxi_codeword[5] = ((postcode[0] & 0x03) << 4) | ((postcode[1] & 0x3c) >> 2); + maxi_codeword[6] = ((postcode[0] & 0x3c) >> 2) | ((country & 0x3) << 4); + maxi_codeword[7] = (country & 0xfc) >> 2; + maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2); + maxi_codeword[9] = ((service & 0x3f0) >> 4); +} + +int maxicode(struct zint_symbol *symbol, unsigned char local_source[], int length) { + int i, j, block, bit, mode, countrycode = 0, service = 0, lp = 0; + int bit_pattern[7], internal_error = 0, eclen; + char postcode[12], countrystr[4], servicestr[4]; + + mode = symbol->option_1; + strcpy(postcode, ""); + strcpy(countrystr, ""); + strcpy(servicestr, ""); + + memset(maxi_codeword, 0, sizeof (maxi_codeword)); + + if (mode == -1) { /* If mode is unspecified */ + lp = strlen(symbol->primary); + if (lp == 0) { + mode = 4; + } else { + mode = 2; + for (i = 0; i < 10 && i < lp; i++) { + if ((symbol->primary[i] < 48) || (symbol->primary[i] > 57)) { + mode = 3; + break; + } + } + } + } + + if ((mode < 2) || (mode > 6)) { /* Only codes 2 to 6 supported */ + strcpy(symbol->errtxt, "550: Invalid Maxicode Mode"); + return ZINT_ERROR_INVALID_OPTION; + } + + if ((mode == 2) || (mode == 3)) { /* Modes 2 and 3 need data in symbol->primary */ + if (lp == 0) { /* Mode set manually means lp doesn't get set */ + lp = strlen(symbol->primary); + } + if (lp != 15) { + strcpy(symbol->errtxt, "551: Invalid Primary String"); + return ZINT_ERROR_INVALID_DATA; + } + + for (i = 9; i < 15; i++) { /* check that country code and service are numeric */ + if ((symbol->primary[i] < '0') || (symbol->primary[i] > '9')) { + strcpy(symbol->errtxt, "552: Invalid Primary String"); + return ZINT_ERROR_INVALID_DATA; + } + } + + memcpy(postcode, symbol->primary, 9); + postcode[9] = '\0'; + + if (mode == 2) { + for (i = 0; i < 10; i++) { + if (postcode[i] == ' ') { + postcode[i] = '\0'; + } + } + } else if (mode == 3) { + postcode[6] = '\0'; + } + + countrystr[0] = symbol->primary[9]; + countrystr[1] = symbol->primary[10]; + countrystr[2] = symbol->primary[11]; + countrystr[3] = '\0'; + + servicestr[0] = symbol->primary[12]; + servicestr[1] = symbol->primary[13]; + servicestr[2] = symbol->primary[14]; + servicestr[3] = '\0'; + + countrycode = atoi(countrystr); + service = atoi(servicestr); + + if (mode == 2) { + maxi_do_primary_2(postcode, countrycode, service); + } + if (mode == 3) { + maxi_do_primary_3(postcode, countrycode, service); + } + } else { + maxi_codeword[0] = mode; + } + + i = maxi_text_process(mode, local_source, length, symbol->eci); + if (i == ZINT_ERROR_TOO_LONG) { + strcpy(symbol->errtxt, "553: Input data too long"); + return i; + } + + /* All the data is sorted - now do error correction */ + maxi_do_primary_check(); /* always EEC */ + + if (mode == 5) + eclen = 56; // 68 data codewords , 56 error corrections + else + eclen = 40; // 84 data codewords, 40 error corrections + + maxi_do_secondary_chk_even(eclen / 2); // do error correction of even + maxi_do_secondary_chk_odd(eclen / 2); // do error correction of odd + + /* Copy data into symbol grid */ + for (i = 0; i < 33; i++) { + for (j = 0; j < 30; j++) { + block = (MaxiGrid[(i * 30) + j] + 5) / 6; + bit = (MaxiGrid[(i * 30) + j] + 5) % 6; + + if (block != 0) { + + bit_pattern[0] = (maxi_codeword[block - 1] & 0x20) >> 5; + bit_pattern[1] = (maxi_codeword[block - 1] & 0x10) >> 4; + bit_pattern[2] = (maxi_codeword[block - 1] & 0x8) >> 3; + bit_pattern[3] = (maxi_codeword[block - 1] & 0x4) >> 2; + bit_pattern[4] = (maxi_codeword[block - 1] & 0x2) >> 1; + bit_pattern[5] = (maxi_codeword[block - 1] & 0x1); + + if (bit_pattern[bit] != 0) { + set_module(symbol, i, j); + } + } + } + } + + /* Add orientation markings */ + set_module(symbol, 0, 28); // Top right filler + set_module(symbol, 0, 29); + set_module(symbol, 9, 10); // Top left marker + set_module(symbol, 9, 11); + set_module(symbol, 10, 11); + set_module(symbol, 15, 7); // Left hand marker + set_module(symbol, 16, 8); + set_module(symbol, 16, 20); // Right hand marker + set_module(symbol, 17, 20); + set_module(symbol, 22, 10); // Bottom left marker + set_module(symbol, 23, 10); + set_module(symbol, 22, 17); // Bottom right marker + set_module(symbol, 23, 17); + + symbol->width = 30; + symbol->rows = 33; + + return internal_error; +} diff --git a/3rdparty/zint-2.6.1/backend/maxicode.h b/3rdparty/zint-2.6.1/backend/maxicode.h new file mode 100644 index 0000000..2d22459 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/maxicode.h @@ -0,0 +1,104 @@ +/* maxicode.h - Handles Maxicode */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +static const unsigned short int MaxiGrid[] = { + /* ISO/IEC 16023 Figure 5 - MaxiCode Module Sequence */ /* 30 x 33 data grid */ + 122, 121, 128, 127, 134, 133, 140, 139, 146, 145, 152, 151, 158, 157, 164, 163, 170, 169, 176, 175, 182, 181, 188, 187, 194, 193, 200, 199, 0, 0, + 124, 123, 130, 129, 136, 135, 142, 141, 148, 147, 154, 153, 160, 159, 166, 165, 172, 171, 178, 177, 184, 183, 190, 189, 196, 195, 202, 201, 817, 0, + 126, 125, 132, 131, 138, 137, 144, 143, 150, 149, 156, 155, 162, 161, 168, 167, 174, 173, 180, 179, 186, 185, 192, 191, 198, 197, 204, 203, 819, 818, + 284, 283, 278, 277, 272, 271, 266, 265, 260, 259, 254, 253, 248, 247, 242, 241, 236, 235, 230, 229, 224, 223, 218, 217, 212, 211, 206, 205, 820, 0, + 286, 285, 280, 279, 274, 273, 268, 267, 262, 261, 256, 255, 250, 249, 244, 243, 238, 237, 232, 231, 226, 225, 220, 219, 214, 213, 208, 207, 822, 821, + 288, 287, 282, 281, 276, 275, 270, 269, 264, 263, 258, 257, 252, 251, 246, 245, 240, 239, 234, 233, 228, 227, 222, 221, 216, 215, 210, 209, 823, 0, + 290, 289, 296, 295, 302, 301, 308, 307, 314, 313, 320, 319, 326, 325, 332, 331, 338, 337, 344, 343, 350, 349, 356, 355, 362, 361, 368, 367, 825, 824, + 292, 291, 298, 297, 304, 303, 310, 309, 316, 315, 322, 321, 328, 327, 334, 333, 340, 339, 346, 345, 352, 351, 358, 357, 364, 363, 370, 369, 826, 0, + 294, 293, 300, 299, 306, 305, 312, 311, 318, 317, 324, 323, 330, 329, 336, 335, 342, 341, 348, 347, 354, 353, 360, 359, 366, 365, 372, 371, 828, 827, + 410, 409, 404, 403, 398, 397, 392, 391, 80, 79, 0, 0, 14, 13, 38, 37, 3, 0, 45, 44, 110, 109, 386, 385, 380, 379, 374, 373, 829, 0, + 412, 411, 406, 405, 400, 399, 394, 393, 82, 81, 41, 0, 16, 15, 40, 39, 4, 0, 0, 46, 112, 111, 388, 387, 382, 381, 376, 375, 831, 830, + 414, 413, 408, 407, 402, 401, 396, 395, 84, 83, 42, 0, 0, 0, 0, 0, 6, 5, 48, 47, 114, 113, 390, 389, 384, 383, 378, 377, 832, 0, + 416, 415, 422, 421, 428, 427, 104, 103, 56, 55, 17, 0, 0, 0, 0, 0, 0, 0, 21, 20, 86, 85, 434, 433, 440, 439, 446, 445, 834, 833, + 418, 417, 424, 423, 430, 429, 106, 105, 58, 57, 0, 0, 0, 0, 0, 0, 0, 0, 23, 22, 88, 87, 436, 435, 442, 441, 448, 447, 835, 0, + 420, 419, 426, 425, 432, 431, 108, 107, 60, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 90, 89, 438, 437, 444, 443, 450, 449, 837, 836, + 482, 481, 476, 475, 470, 469, 49, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 54, 53, 464, 463, 458, 457, 452, 451, 838, 0, + 484, 483, 478, 477, 472, 471, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 465, 460, 459, 454, 453, 840, 839, + 486, 485, 480, 479, 474, 473, 52, 51, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 43, 468, 467, 462, 461, 456, 455, 841, 0, + 488, 487, 494, 493, 500, 499, 98, 97, 62, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 92, 91, 506, 505, 512, 511, 518, 517, 843, 842, + 490, 489, 496, 495, 502, 501, 100, 99, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 29, 28, 94, 93, 508, 507, 514, 513, 520, 519, 844, 0, + 492, 491, 498, 497, 504, 503, 102, 101, 66, 65, 18, 0, 0, 0, 0, 0, 0, 0, 19, 30, 96, 95, 510, 509, 516, 515, 522, 521, 846, 845, + 560, 559, 554, 553, 548, 547, 542, 541, 74, 73, 33, 0, 0, 0, 0, 0, 0, 11, 68, 67, 116, 115, 536, 535, 530, 529, 524, 523, 847, 0, + 562, 561, 556, 555, 550, 549, 544, 543, 76, 75, 0, 0, 8, 7, 36, 35, 12, 0, 70, 69, 118, 117, 538, 537, 532, 531, 526, 525, 849, 848, + 564, 563, 558, 557, 552, 551, 546, 545, 78, 77, 0, 34, 10, 9, 26, 25, 0, 0, 72, 71, 120, 119, 540, 539, 534, 533, 528, 527, 850, 0, + 566, 565, 572, 571, 578, 577, 584, 583, 590, 589, 596, 595, 602, 601, 608, 607, 614, 613, 620, 619, 626, 625, 632, 631, 638, 637, 644, 643, 852, 851, + 568, 567, 574, 573, 580, 579, 586, 585, 592, 591, 598, 597, 604, 603, 610, 609, 616, 615, 622, 621, 628, 627, 634, 633, 640, 639, 646, 645, 853, 0, + 570, 569, 576, 575, 582, 581, 588, 587, 594, 593, 600, 599, 606, 605, 612, 611, 618, 617, 624, 623, 630, 629, 636, 635, 642, 641, 648, 647, 855, 854, + 728, 727, 722, 721, 716, 715, 710, 709, 704, 703, 698, 697, 692, 691, 686, 685, 680, 679, 674, 673, 668, 667, 662, 661, 656, 655, 650, 649, 856, 0, + 730, 729, 724, 723, 718, 717, 712, 711, 706, 705, 700, 699, 694, 693, 688, 687, 682, 681, 676, 675, 670, 669, 664, 663, 658, 657, 652, 651, 858, 857, + 732, 731, 726, 725, 720, 719, 714, 713, 708, 707, 702, 701, 696, 695, 690, 689, 684, 683, 678, 677, 672, 671, 666, 665, 660, 659, 654, 653, 859, 0, + 734, 733, 740, 739, 746, 745, 752, 751, 758, 757, 764, 763, 770, 769, 776, 775, 782, 781, 788, 787, 794, 793, 800, 799, 806, 805, 812, 811, 861, 860, + 736, 735, 742, 741, 748, 747, 754, 753, 760, 759, 766, 765, 772, 771, 778, 777, 784, 783, 790, 789, 796, 795, 802, 801, 808, 807, 814, 813, 862, 0, + 738, 737, 744, 743, 750, 749, 756, 755, 762, 761, 768, 767, 774, 773, 780, 779, 786, 785, 792, 791, 798, 797, 804, 803, 810, 809, 816, 815, 864, 863 +}; + +static const char maxiCodeSet[256] = { + /* from Appendix A - ASCII character to Code Set (e.g. 2 = Set B) */ + /* set 0 refers to special characters that fit into more than one set (e.g. GS) */ + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 0, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, + 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 5, 5, 5, 5, 5, 5, 4, 5, 3, 4, 3, 5, 5, 4, 4, 3, 3, 3, + 4, 3, 5, 4, 4, 3, 3, 4, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 +}; + +static const char maxiSymbolChar[256] = { + /* from Appendix A - ASCII character to symbol value */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 30, 28, 29, 30, 35, 32, 53, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 37, + 38, 39, 40, 41, 52, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 42, 43, 44, 45, 46, 0, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 32, 54, 34, 35, 36, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 36, + 37, 37, 38, 39, 40, 41, 42, 43, 38, 44, 37, 39, 38, 45, 46, 40, 41, 39, 40, 41, + 42, 42, 47, 43, 44, 43, 44, 45, 45, 46, 47, 46, 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 32, + 33, 34, 35, 36, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 32, 33, 34, 35, 36 +}; + diff --git a/3rdparty/zint-2.6.1/backend/medical.c b/3rdparty/zint-2.6.1/backend/medical.c new file mode 100644 index 0000000..94bd72a --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/medical.c @@ -0,0 +1,306 @@ +/* medical.c - Handles 1 track and 2 track pharmacode and Codabar */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include "common.h" + +extern int c39(struct zint_symbol *symbol, unsigned char source[], const size_t length); +/* Codabar table checked against EN 798:1995 */ + +#define CALCIUM "0123456789-$:/.+ABCD" + +static const char *CodaTable[20] = { + "11111221", "11112211", "11121121", "22111111", "11211211", "21111211", + "12111121", "12112111", "12211111", "21121111", "11122111", "11221111", "21112121", "21211121", + "21212111", "11212121", "11221211", "12121121", "11121221", "11122211" +}; + +int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length) { + /* "Pharmacode can represent only a single integer from 3 to 131070. Unlike other + commonly used one-dimensional barcode schemes, pharmacode does not store the data in a + form corresponding to the human-readable digits; the number is encoded in binary, rather + than decimal. Pharmacode is read from right to left: with n as the bar position starting + at 0 on the right, each narrow bar adds 2n to the value and each wide bar adds 2(2^n). + The minimum barcode is 2 bars and the maximum 16, so the smallest number that could + be encoded is 3 (2 narrow bars) and the biggest is 131070 (16 wide bars)." + - http://en.wikipedia.org/wiki/Pharmacode */ + + /* This code uses the One Track Pharamacode calculating algorithm as recommended by + the specification at http://www.laetus.com/laetus.php?request=file&id=69 */ + + unsigned long int tester; + int counter, error_number, h; + char inter[18] = {0}; /* 131070 -> 17 bits */ + char dest[64]; /* 17 * 2 + 1 */ + + if (length > 6) { + strcpy(symbol->errtxt, "350: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "351: Invalid characters in data"); + return error_number; + } + + tester = atoi((char*) source); + + if ((tester < 3) || (tester > 131070)) { + strcpy(symbol->errtxt, "352: Data out of range"); + return ZINT_ERROR_INVALID_DATA; + } + + do { + if (!(tester & 1)) { + strcat(inter, "W"); + tester = (tester - 2) / 2; + } else { + strcat(inter, "N"); + tester = (tester - 1) / 2; + } + } while (tester != 0); + + h = strlen(inter) - 1; + *dest = '\0'; + for (counter = h; counter >= 0; counter--) { + if (inter[counter] == 'W') { + strcat(dest, "32"); + } else { + strcat(dest, "12"); + } + } + + expand(symbol, dest); + + return error_number; +} + +int pharma_two_calc(struct zint_symbol *symbol, unsigned char source[], char dest[]) { + /* This code uses the Two Track Pharamacode defined in the document at + http://www.laetus.com/laetus.php?request=file&id=69 and using a modified + algorithm from the One Track system. This standard accepts integet values + from 4 to 64570080. */ + + unsigned long int tester; + int counter, h; + char inter[17]; + int error_number; + + tester = atoi((char*) source); + + if ((tester < 4) || (tester > 64570080)) { + strcpy(symbol->errtxt, "353: Data out of range"); + return ZINT_ERROR_INVALID_DATA; + } + error_number = 0; + strcpy(inter, ""); + do { + switch (tester % 3) { + case 0: + strcat(inter, "3"); + tester = (tester - 3) / 3; + break; + case 1: + strcat(inter, "1"); + tester = (tester - 1) / 3; + break; + case 2: + strcat(inter, "2"); + tester = (tester - 2) / 3; + break; + } + } while (tester != 0); + + h = strlen(inter) - 1; + for (counter = h; counter >= 0; counter--) { + dest[h - counter] = inter[counter]; + } + dest[h + 1] = '\0'; + + return error_number; +} + +int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length) { + /* Draws the patterns for two track pharmacode */ + char height_pattern[200]; + unsigned int loopey, h; + int writer; + int error_number = 0; + strcpy(height_pattern, ""); + + if (length > 8) { + strcpy(symbol->errtxt, "354: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "355: Invalid characters in data"); + return error_number; + } + error_number = pharma_two_calc(symbol, source, height_pattern); + if (error_number != 0) { + return error_number; + } + + writer = 0; + h = strlen(height_pattern); + for (loopey = 0; loopey < h; loopey++) { + if ((height_pattern[loopey] == '2') || (height_pattern[loopey] == '3')) { + set_module(symbol, 0, writer); + } + if ((height_pattern[loopey] == '1') || (height_pattern[loopey] == '3')) { + set_module(symbol, 1, writer); + } + writer += 2; + } + symbol->rows = 2; + symbol->width = writer - 1; + + + return error_number; +} + +/* The Codabar system consisting of simple substitution */ +int codabar(struct zint_symbol *symbol, unsigned char source[], int length) { + + int i, error_number; + char dest[512]; + + strcpy(dest, ""); + + if (length > 60) { /* No stack smashing please */ + strcpy(symbol->errtxt, "356: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + to_upper(source); + error_number = is_sane(CALCIUM, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "357: Invalid characters in data"); + return error_number; + } + /* Codabar must begin and end with the characters A, B, C or D */ + if ((source[0] != 'A') && (source[0] != 'B') && (source[0] != 'C') + && (source[0] != 'D')) { + strcpy(symbol->errtxt, "358: Invalid characters in data"); + return ZINT_ERROR_INVALID_DATA; + } + + if ((source[length - 1] != 'A') && (source[length - 1] != 'B') && + (source[length - 1] != 'C') && (source[length - 1] != 'D')) { + strcpy(symbol->errtxt, "359: Invalid characters in data"); + return ZINT_ERROR_INVALID_DATA; + } + + for (i = 0; i < length; i++) { + lookup(CALCIUM, CodaTable, source[i], dest); + } + + expand(symbol, dest); + ustrcpy(symbol->text, source); + return error_number; +} + +/* Italian Pharmacode */ +int code32(struct zint_symbol *symbol, unsigned char source[], int length) { + int i, zeroes, error_number, checksum, checkpart, checkdigit; + char localstr[10], risultante[7]; + long int pharmacode, remainder, devisor; + int codeword[6]; + char tabella[34]; + + /* Validate the input */ + if (length > 8) { + strcpy(symbol->errtxt, "360: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "361: Invalid characters in data"); + return error_number; + } + + /* Add leading zeros as required */ + zeroes = 8 - length; + memset(localstr, '0', zeroes); + strcpy(localstr + zeroes, (char*) source); + + /* Calculate the check digit */ + checksum = 0; + checkpart = 0; + for (i = 0; i < 4; i++) { + checkpart = ctoi(localstr[i * 2]); + checksum += checkpart; + checkpart = 2 * (ctoi(localstr[(i * 2) + 1])); + if (checkpart >= 10) { + checksum += (checkpart - 10) + 1; + } else { + checksum += checkpart; + } + } + + /* Add check digit to data string */ + checkdigit = checksum % 10; + localstr[8] = itoc(checkdigit); + localstr[9] = '\0'; + + /* Convert string into an integer value */ + pharmacode = atoi(localstr); + + /* Convert from decimal to base-32 */ + devisor = 33554432; + for (i = 5; i >= 0; i--) { + codeword[i] = pharmacode / devisor; + remainder = pharmacode % devisor; + pharmacode = remainder; + devisor /= 32; + } + + /* Look up values in 'Tabella di conversione' */ + strcpy(tabella, "0123456789BCDFGHJKLMNPQRSTUVWXYZ"); + for (i = 5; i >= 0; i--) { + risultante[5 - i] = tabella[codeword[i]]; + } + risultante[6] = '\0'; + /* Plot the barcode using Code 39 */ + error_number = c39(symbol, (unsigned char*) risultante, strlen(risultante)); + if (error_number != 0) { + return error_number; + } + + /* Override the normal text output with the Pharmacode number */ + strcpy((char*) symbol->text, "A"); + strcat((char*) symbol->text, (char*) localstr); + + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/ms_stdint.h b/3rdparty/zint-2.6.1/backend/ms_stdint.h new file mode 100644 index 0000000..76987ab --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/ms_stdint.h @@ -0,0 +1,234 @@ +// ISO C9x compliant stdint.h for Microsoft Visual Studio +// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 +// +// Copyright (c) 2006-2008 Alexander Chemeris +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. The name of the author may be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; +// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +/////////////////////////////////////////////////////////////////////////////// + +/* @(#) $Id: ms_stdint.h,v 1.1 2009/09/19 08:16:21 hooper114 Exp $ */ + +#ifndef _MSC_VER // [ +#error "Use this header only with Microsoft Visual C++ compilers!" +#endif // _MSC_VER ] + +#ifndef _MSC_STDINT_H_ // [ +#define _MSC_STDINT_H_ + +#if _MSC_VER > 1000 +#pragma once +#endif + +#include + +// For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}' +// or compiler give many errors like this: +// error C2733: second C linkage of overloaded function 'wmemchr' not allowed +#if (_MSC_VER < 1300) && defined(__cplusplus) + extern "C++" { +#endif +# include +#if (_MSC_VER < 1300) && defined(__cplusplus) + } +#endif + +// Define _W64 macros to mark types changing their size, like intptr_t. +#ifndef _W64 +# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 +# define _W64 __w64 +# else +# define _W64 +# endif +#endif + + +// 7.18.1 Integer types + +// 7.18.1.1 Exact-width integer types +typedef __int8 int8_t; +typedef __int16 int16_t; +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int8 uint8_t; +typedef unsigned __int16 uint16_t; +typedef unsigned __int32 uint32_t; +typedef unsigned __int64 uint64_t; + +// 7.18.1.2 Minimum-width integer types +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +typedef int64_t int_least64_t; +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +typedef uint64_t uint_least64_t; + +// 7.18.1.3 Fastest minimum-width integer types +typedef int8_t int_fast8_t; +typedef int16_t int_fast16_t; +typedef int32_t int_fast32_t; +typedef int64_t int_fast64_t; +typedef uint8_t uint_fast8_t; +typedef uint16_t uint_fast16_t; +typedef uint32_t uint_fast32_t; +typedef uint64_t uint_fast64_t; + +// 7.18.1.4 Integer types capable of holding object pointers +#ifdef _WIN64 // [ + typedef __int64 intptr_t; + typedef unsigned __int64 uintptr_t; +#else // _WIN64 ][ + typedef _W64 int intptr_t; + typedef _W64 unsigned int uintptr_t; +#endif // _WIN64 ] + +// 7.18.1.5 Greatest-width integer types +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; + + +// 7.18.2 Limits of specified-width integer types + +#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 + +// 7.18.2.1 Limits of exact-width integer types +#define INT8_MIN ((int8_t)_I8_MIN) +#define INT8_MAX _I8_MAX +#define INT16_MIN ((int16_t)_I16_MIN) +#define INT16_MAX _I16_MAX +#define INT32_MIN ((int32_t)_I32_MIN) +#define INT32_MAX _I32_MAX +#define INT64_MIN ((int64_t)_I64_MIN) +#define INT64_MAX _I64_MAX +#define UINT8_MAX _UI8_MAX +#define UINT16_MAX _UI16_MAX +#define UINT32_MAX _UI32_MAX +#define UINT64_MAX _UI64_MAX + +// 7.18.2.2 Limits of minimum-width integer types +#define INT_LEAST8_MIN INT8_MIN +#define INT_LEAST8_MAX INT8_MAX +#define INT_LEAST16_MIN INT16_MIN +#define INT_LEAST16_MAX INT16_MAX +#define INT_LEAST32_MIN INT32_MIN +#define INT_LEAST32_MAX INT32_MAX +#define INT_LEAST64_MIN INT64_MIN +#define INT_LEAST64_MAX INT64_MAX +#define UINT_LEAST8_MAX UINT8_MAX +#define UINT_LEAST16_MAX UINT16_MAX +#define UINT_LEAST32_MAX UINT32_MAX +#define UINT_LEAST64_MAX UINT64_MAX + +// 7.18.2.3 Limits of fastest minimum-width integer types +#define INT_FAST8_MIN INT8_MIN +#define INT_FAST8_MAX INT8_MAX +#define INT_FAST16_MIN INT16_MIN +#define INT_FAST16_MAX INT16_MAX +#define INT_FAST32_MIN INT32_MIN +#define INT_FAST32_MAX INT32_MAX +#define INT_FAST64_MIN INT64_MIN +#define INT_FAST64_MAX INT64_MAX +#define UINT_FAST8_MAX UINT8_MAX +#define UINT_FAST16_MAX UINT16_MAX +#define UINT_FAST32_MAX UINT32_MAX +#define UINT_FAST64_MAX UINT64_MAX + +// 7.18.2.4 Limits of integer types capable of holding object pointers +#ifdef _WIN64 // [ +# define INTPTR_MIN INT64_MIN +# define INTPTR_MAX INT64_MAX +# define UINTPTR_MAX UINT64_MAX +#else // _WIN64 ][ +# define INTPTR_MIN INT32_MIN +# define INTPTR_MAX INT32_MAX +# define UINTPTR_MAX UINT32_MAX +#endif // _WIN64 ] + +// 7.18.2.5 Limits of greatest-width integer types +#define INTMAX_MIN INT64_MIN +#define INTMAX_MAX INT64_MAX +#define UINTMAX_MAX UINT64_MAX + +// 7.18.3 Limits of other integer types + +#ifdef _WIN64 // [ +# define PTRDIFF_MIN _I64_MIN +# define PTRDIFF_MAX _I64_MAX +#else // _WIN64 ][ +# define PTRDIFF_MIN _I32_MIN +# define PTRDIFF_MAX _I32_MAX +#endif // _WIN64 ] + +#define SIG_ATOMIC_MIN INT_MIN +#define SIG_ATOMIC_MAX INT_MAX + +#ifndef SIZE_MAX // [ +# ifdef _WIN64 // [ +# define SIZE_MAX _UI64_MAX +# else // _WIN64 ][ +# define SIZE_MAX _UI32_MAX +# endif // _WIN64 ] +#endif // SIZE_MAX ] + +// WCHAR_MIN and WCHAR_MAX are also defined in +#ifndef WCHAR_MIN // [ +# define WCHAR_MIN 0 +#endif // WCHAR_MIN ] +#ifndef WCHAR_MAX // [ +# define WCHAR_MAX _UI16_MAX +#endif // WCHAR_MAX ] + +#define WINT_MIN 0 +#define WINT_MAX _UI16_MAX + +#endif // __STDC_LIMIT_MACROS ] + + +// 7.18.4 Limits of other integer types + +#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 + +// 7.18.4.1 Macros for minimum-width integer constants + +#define INT8_C(val) val##i8 +#define INT16_C(val) val##i16 +#define INT32_C(val) val##i32 +#define INT64_C(val) val##i64 + +#define UINT8_C(val) val##ui8 +#define UINT16_C(val) val##ui16 +#define UINT32_C(val) val##ui32 +#define UINT64_C(val) val##ui64 + +// 7.18.4.2 Macros for greatest-width integer constants +#define INTMAX_C INT64_C +#define UINTMAX_C UINT64_C + +#endif // __STDC_CONSTANT_MACROS ] + + +#endif // _MSC_STDINT_H_ ] diff --git a/3rdparty/zint-2.6.1/backend/pcx.c b/3rdparty/zint-2.6.1/backend/pcx.c new file mode 100644 index 0000000..0a77ffa --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/pcx.c @@ -0,0 +1,172 @@ +/* pcx.c - Handles output to ZSoft PCX file */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include "common.h" +#include "pcx.h" /* PCX header structure */ +#include +#ifdef _MSC_VER +#include +#include +#include +#endif + +#define SSET "0123456789ABCDEF" + +int pcx_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) { + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + int row, column, i, colour; + int run_count; + FILE *pcx_file; + pcx_header_t header; +#ifdef _MSC_VER + unsigned char* rle_row; +#endif + +#ifndef _MSC_VER + unsigned char rle_row[symbol->bitmap_width]; +#else + rle_row = (unsigned char *) _alloca((symbol->bitmap_width * 6) * sizeof (unsigned char)); +#endif /* _MSC_VER */ + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + + header.manufacturer = 10; // ZSoft + header.version = 5; // Version 3.0 + header.encoding = 1; // Run length encoding + header.bits_per_pixel = 8; + header.window_xmin = 0; + header.window_ymin = 0; + header.window_xmax = symbol->bitmap_width - 1; + header.window_ymax = symbol->bitmap_height - 1; + header.horiz_dpi = 300; + header.vert_dpi = 300; + + for (i = 0; i < 48; i++) { + header.colourmap[i] = 0x00; + } + + header.reserved = 0; + header.number_of_planes = 3; + + if (symbol->bitmap_width % 2) { + header.bytes_per_line = symbol->bitmap_width + 1; + } else { + header.bytes_per_line = symbol->bitmap_width; + } + + header.palette_info = 1; // Colour + header.horiz_screen_size = 0; + header.vert_screen_size = 0; + + for (i = 0; i < 54; i++) { + header.filler[i] = 0x00; + } + + /* Open output file in binary mode */ + if (symbol->output_options & BARCODE_STDOUT) { +#ifdef _MSC_VER + if (-1 == _setmode(_fileno(stdout), _O_BINARY)) { + strcpy(symbol->errtxt, "620: Can't open output file"); + return ZINT_ERROR_FILE_ACCESS; + } +#endif + pcx_file = stdout; + } else { + if (!(pcx_file = fopen(symbol->outfile, "wb"))) { + strcpy(symbol->errtxt, "621: Can't open output file"); + return ZINT_ERROR_FILE_ACCESS; + } + } + + fwrite(&header, sizeof (pcx_header_t), 1, pcx_file); + + for (row = 0; row < symbol->bitmap_height; row++) { + for (colour = 0; colour < 3; colour++) { + for (column = 0; column < symbol->bitmap_width; column++) { + switch (colour) { + case 0: + if (pixelbuf[(row * symbol->bitmap_width) + column] == '1') { + rle_row[column] = fgred; + } else { + rle_row[column] = bgred; + } + break; + case 1: + if (pixelbuf[(row * symbol->bitmap_width) + column] == '1') { + rle_row[column] = fggrn; + } else { + rle_row[column] = bggrn; + } + break; + case 2: + if (pixelbuf[(row * symbol->bitmap_width) + column] == '1') { + rle_row[column] = fgblu; + } else { + rle_row[column] = bgblu; + } + break; + } + } + + run_count = 1; + for (column = 1; column < symbol->bitmap_width; column++) { + if ((rle_row[column - 1] == rle_row[column]) && (run_count < 63)) { + run_count++; + } else { + run_count += 0xc0; + fputc(run_count, pcx_file); + fputc(rle_row[column - 1], pcx_file); + run_count = 1; + } + } + + if (run_count > 1) { + run_count += 0xc0; + fputc(run_count, pcx_file); + fputc(rle_row[column - 1], pcx_file); + } + } + } + + fclose(pcx_file); + + return 0; +} \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/pcx.h b/3rdparty/zint-2.6.1/backend/pcx.h new file mode 100644 index 0000000..4497cc2 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/pcx.h @@ -0,0 +1,76 @@ +/* pcx.h - header structure for ZSoft PCX files + + libzint - the open source barcode library + Copyright (C) 2016-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#ifndef PCX_H +#define PCX_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#include +#include "stdint_msvc.h" +#else +#include +#endif + +#pragma pack (1) + + typedef struct pcx_header { + uint8_t manufacturer; + uint8_t version; + uint8_t encoding; + uint8_t bits_per_pixel; + uint16_t window_xmin; + uint16_t window_ymin; + uint16_t window_xmax; + uint16_t window_ymax; + uint16_t horiz_dpi; + uint16_t vert_dpi; + uint8_t colourmap[48]; + uint8_t reserved; + uint8_t number_of_planes; + uint16_t bytes_per_line; + uint16_t palette_info; + uint16_t horiz_screen_size; + uint16_t vert_screen_size; + uint8_t filler[54]; + } pcx_header_t; + +#pragma pack () + +#ifdef __cplusplus +} +#endif + +#endif /* PCX_H */ + diff --git a/3rdparty/zint-2.6.1/backend/pdf417.c b/3rdparty/zint-2.6.1/backend/pdf417.c new file mode 100644 index 0000000..ca64578 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/pdf417.c @@ -0,0 +1,1296 @@ +/* pdf417.c - Handles PDF417 stacked symbology */ + +/* Zint - A barcode generating program using libpng + Copyright (C) 2008-2017 Robin Stuart + Portions Copyright (C) 2004 Grandzebu + Bug Fixes thanks to KL Chin + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* This code is adapted from "Code barre PDF 417 / PDF 417 barcode" v2.5.0 + which is Copyright (C) 2004 (Grandzebu). + The original code can be downloaded from http://grandzebu.net/index.php */ + +/* NOTE: symbol->option_1 is used to specify the security level (i.e. control the + number of check codewords) + + symbol->option_2 is used to adjust the width of the resulting symbol (i.e. the + number of codeword columns not including row start and end data) */ + +#include +#include +#include +#include +#ifndef _MSC_VER +#include +#else +#include +#include "ms_stdint.h" +#endif +#include "pdf417.h" +#include "common.h" +#include "large.h" + +/* + Three figure numbers in comments give the location of command equivalents in the + original Visual Basic source code file pdf417.frm + this code retains some original (French) procedure and variable names to ease conversion */ + +/* text mode processing tables */ + +static const char asciix[95] = { + 7, 8, 8, 4, 12, 4, 4, 8, 8, 8, 12, 4, 12, 12, 12, 12, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 12, 8, 8, 4, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 8, 8, 8, 4, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 8, 8, 8, 8 +}; + +static const char asciiy[95] = { + 26, 10, 20, 15, 18, 21, 10, 28, 23, 24, 22, 20, 13, 16, 17, 19, 0, 1, 2, 3, + 4, 5, 6, 7, 8, 9, 14, 0, 1, 23, 2, 25, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 4, 5, 6, 24, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 21, 27, 9 +}; + +/* Automatic sizing table */ + +static const char MicroAutosize[56] = { + 4, 6, 7, 8, 10, 12, 13, 14, 16, 18, 19, 20, 24, 29, 30, 33, 34, 37, 39, 46, 54, 58, 70, 72, 82, 90, 108, 126, + 1, 14, 2, 7, 3, 25, 8, 16, 5, 17, 9, 6, 10, 11, 28, 12, 19, 13, 29, 20, 30, 21, 22, 31, 23, 32, 33, 34 +}; + +int liste[2][1000]; /* global */ + +/* 866 */ + +int quelmode(char codeascii) { + int mode = BYT; + if ((codeascii == '\t') || (codeascii == '\n') || (codeascii == '\r') || ((codeascii >= ' ') && (codeascii <= '~'))) { + mode = TEX; + } else if ((codeascii >= '0') && (codeascii <= '9')) { + mode = NUM; + } + /* 876 */ + + return mode; +} + +/* 844 */ +void regroupe(int *indexliste) { + int i, j; + + /* bring together same type blocks */ + if (*(indexliste) > 1) { + i = 1; + while (i < *(indexliste)) { + if (liste[1][i - 1] == liste[1][i]) { + /* bring together */ + liste[0][i - 1] = liste[0][i - 1] + liste[0][i]; + j = i + 1; + + /* decreace the list */ + while (j < *(indexliste)) { + liste[0][j - 1] = liste[0][j]; + liste[1][j - 1] = liste[1][j]; + j++; + } + *(indexliste) = *(indexliste) - 1; + i--; + } + i++; + } + } + /* 865 */ +} + +/* 478 */ +void pdfsmooth(int *indexliste) { + int i, crnt, last, next, length; + + for (i = 0; i < *(indexliste); i++) { + crnt = liste[1][i]; + length = liste[0][i]; + if (i != 0) { + last = liste[1][i - 1]; + } else { + last = FALSE; + } + if (i != *(indexliste) - 1) { + next = liste[1][i + 1]; + } else { + next = FALSE; + } + + if (crnt == NUM) { + if (i == 0) { + /* first block */ + if (*(indexliste) > 1) { + /* and there are others */ + if ((next == TEX) && (length < 8)) { + liste[1][i] = TEX; + } + if ((next == BYT) && (length == 1)) { + liste[1][i] = BYT; + } + } + } else { + if (i == *(indexliste) - 1) { + /* last block */ + if ((last == TEX) && (length < 7)) { + liste[1][i] = TEX; + } + if ((last == BYT) && (length == 1)) { + liste[1][i] = BYT; + } + } else { + /* not first or last block */ + if (((last == BYT) && (next == BYT)) && (length < 4)) { + liste[1][i] = BYT; + } + if (((last == BYT) && (next == TEX)) && (length < 4)) { + liste[1][i] = TEX; + } + if (((last == TEX) && (next == BYT)) && (length < 5)) { + liste[1][i] = TEX; + } + if (((last == TEX) && (next == TEX)) && (length < 8)) { + liste[1][i] = TEX; + } + } + } + } + } + regroupe(indexliste); + /* 520 */ + for (i = 0; i < *(indexliste); i++) { + crnt = liste[1][i]; + length = liste[0][i]; + if (i != 0) { + last = liste[1][i - 1]; + } else { + last = FALSE; + } + if (i != *(indexliste) - 1) { + next = liste[1][i + 1]; + } else { + next = FALSE; + } + + if ((crnt == TEX) && (i > 0)) { + /* not the first */ + if (i == *(indexliste) - 1) { + /* the last one */ + if ((last == BYT) && (length == 1)) { + liste[1][i] = BYT; + } + } else { + /* not the last one */ + if (((last == BYT) && (next == BYT)) && (length < 5)) { + liste[1][i] = BYT; + } + if ((((last == BYT) && (next != BYT)) || ((last != BYT) + && (next == BYT))) && (length < 3)) { + liste[1][i] = BYT; + } + } + } + } + /* 540 */ + regroupe(indexliste); +} + +/* 547 */ +void textprocess(int *chainemc, int *mclength, char chaine[], int start, int length, int block) { + int j, indexlistet, curtable, listet[2][5000], chainet[5000], wnet; + char codeascii; + + codeascii = 0; + wnet = 0; + + for (j = 0; j < 1000; j++) { + listet[0][j] = 0; + } + /* listet will contain the table numbers and the value of each characters */ + for (indexlistet = 0; indexlistet < length; indexlistet++) { + codeascii = chaine[start + indexlistet]; + switch (codeascii) { + case '\t': listet[0][indexlistet] = 12; + listet[1][indexlistet] = 12; + break; + case '\n': listet[0][indexlistet] = 8; + listet[1][indexlistet] = 15; + break; + case 13: listet[0][indexlistet] = 12; + listet[1][indexlistet] = 11; + break; + default: listet[0][indexlistet] = asciix[codeascii - 32]; + listet[1][indexlistet] = asciiy[codeascii - 32]; + break; + } + } + + /* 570 */ + curtable = 1; /* default table */ + for (j = 0; j < length; j++) { + if (listet[0][j] & curtable) { + /* The character is in the current table */ + chainet[wnet] = listet[1][j]; + wnet++; + } else { + /* Obliged to change table */ + int flag = FALSE; /* True if we change table for only one character */ + if (j == (length - 1)) { + flag = TRUE; + } else { + if (!(listet[0][j] & listet[0][j + 1])) { + flag = TRUE; + } + } + + if (flag) { + /* we change only one character - look for temporary switch */ + if ((listet[0][j] & 1) && (curtable == 2)) { /* T_UPP */ + chainet[wnet] = 27; + chainet[wnet + 1] = listet[1][j]; + wnet += 2; + } + if (listet[0][j] & 8) { /* T_PUN */ + chainet[wnet] = 29; + chainet[wnet + 1] = listet[1][j]; + wnet += 2; + } + if (!(((listet[0][j] & 1) && (curtable == 2)) || (listet[0][j] & 8))) { + /* No temporary switch available */ + flag = FALSE; + } + } + + /* 599 */ + if (!(flag)) { + int newtable; + + if (j == (length - 1)) { + newtable = listet[0][j]; + } else { + if (!(listet[0][j] & listet[0][j + 1])) { + newtable = listet[0][j]; + } else { + newtable = listet[0][j] & listet[0][j + 1]; + } + } + + /* Maintain the first if several tables are possible */ + switch (newtable) { + case 3: + case 5: + case 7: + case 9: + case 11: + case 13: + case 15: + newtable = 1; + break; + case 6: + case 10: + case 14: + newtable = 2; + break; + case 12: + newtable = 4; + break; + } + + /* 619 - select the switch */ + switch (curtable) { + case 1: + switch (newtable) { + case 2: chainet[wnet] = 27; + wnet++; + break; + case 4: chainet[wnet] = 28; + wnet++; + break; + case 8: chainet[wnet] = 28; + wnet++; + chainet[wnet] = 25; + wnet++; + break; + } + break; + case 2: + switch (newtable) { + case 1: chainet[wnet] = 28; + wnet++; + chainet[wnet] = 28; + wnet++; + break; + case 4: chainet[wnet] = 28; + wnet++; + break; + case 8: chainet[wnet] = 28; + wnet++; + chainet[wnet] = 25; + wnet++; + break; + } + break; + case 4: + switch (newtable) { + case 1: chainet[wnet] = 28; + wnet++; + break; + case 2: chainet[wnet] = 27; + wnet++; + break; + case 8: chainet[wnet] = 25; + wnet++; + break; + } + break; + case 8: + switch (newtable) { + case 1: chainet[wnet] = 29; + wnet++; + break; + case 2: chainet[wnet] = 29; + wnet++; + chainet[wnet] = 27; + wnet++; + break; + case 4: chainet[wnet] = 29; + wnet++; + chainet[wnet] = 28; + wnet++; + break; + } + break; + } + curtable = newtable; + /* 659 - at last we add the character */ + chainet[wnet] = listet[1][j]; + wnet++; + } + } + } + + /* 663 */ + if (wnet & 1) { + chainet[wnet] = 29; + wnet++; + } + /* Now translate the string chainet into codewords */ + chainemc[*(mclength)] = 900; + *(mclength) = *(mclength) + 1; + + for (j = 0; j < wnet; j += 2) { + int cw_number; + + cw_number = (30 * chainet[j]) + chainet[j + 1]; + chainemc[*(mclength)] = cw_number; + *(mclength) = *(mclength) + 1; + + } +} + +/* 671 */ +void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block) { + int debug = 0; + int len = 0; + unsigned int chunkLen = 0; +#if defined(_MSC_VER) && _MSC_VER == 1200 + uint64_t mantisa = 0; + uint64_t total = 0; +#else + uint64_t mantisa = 0ULL; + uint64_t total = 0ULL; +#endif + + if (debug) printf("\nEntering byte mode at position %d\n", start); + + if (length == 1) { + chainemc[(*mclength)++] = 913; + chainemc[(*mclength)++] = chaine[start]; + if (debug) { + printf("913 %d\n", chainemc[*mclength - 1]); + } + } else { + /* select the switch for multiple of 6 bytes */ + if (length % 6 == 0) { + chainemc[(*mclength)++] = 924; + if (debug) printf("924 "); + } else { + chainemc[(*mclength)++] = 901; + if (debug) printf("901 "); + } + + while (len < length) { + chunkLen = length - len; + if (6 <= chunkLen) /* Take groups of 6 */ { + chunkLen = 6; + len += chunkLen; +#if defined(_MSC_VER) && _MSC_VER == 1200 + total = 0; +#else + total = 0ULL; +#endif + + while (chunkLen--) { + mantisa = chaine[start++]; +#if defined(_MSC_VER) && _MSC_VER == 1200 + total |= mantisa << (uint64_t) (chunkLen * 8); +#else + total |= mantisa << (uint64_t) (chunkLen * 8ULL); +#endif + } + + chunkLen = 5; + + while (chunkLen--) { +#if defined(_MSC_VER) && _MSC_VER == 1200 + chainemc[*mclength + chunkLen] = (int) (total % 900); + total /= 900; +#else + chainemc[*mclength + chunkLen] = (int) (total % 900ULL); + total /= 900ULL; +#endif + } + *mclength += 5; + } else /* If it remain a group of less than 6 bytes */ { + len += chunkLen; + while (chunkLen--) { + chainemc[(*mclength)++] = chaine[start++]; + } + } + } + } +} + +/* 712 */ +void numbprocess(int *chainemc, int *mclength, char chaine[], int start, int length, int block) { + int j, loop, longueur, dummy[100], dumlength, diviseur, nombre; + char chainemod[50], chainemult[100], temp; + + strcpy(chainemod, ""); + for (loop = 0; loop <= 50; loop++) { + dummy[loop] = 0; + } + + chainemc[*(mclength)] = 902; + *(mclength) = *(mclength) + 1; + + j = 0; + while (j < length) { + dumlength = 0; + strcpy(chainemod, ""); + longueur = length - j; + if (longueur > 44) { + longueur = 44; + } + strcat(chainemod, "1"); + for (loop = 1; loop <= longueur; loop++) { + chainemod[loop] = chaine[start + loop + j - 1]; + } + chainemod[longueur + 1] = '\0'; + do { + diviseur = 900; + + /* 877 - gosub Modulo */ + strcpy(chainemult, ""); + nombre = 0; + while (strlen(chainemod) != 0) { + nombre *= 10; + nombre += ctoi(chainemod[0]); + for (loop = 0; loop < strlen(chainemod); loop++) { + chainemod[loop] = chainemod[loop + 1]; + } + if (nombre < diviseur) { + if (strlen(chainemult) != 0) { + strcat(chainemult, "0"); + } + } else { + temp = (nombre / diviseur) + '0'; + chainemult[strlen(chainemult) + 1] = '\0'; + chainemult[strlen(chainemult)] = temp; + } + nombre = nombre % diviseur; + } + diviseur = nombre; + /* return to 723 */ + + for (loop = dumlength; loop > 0; loop--) { + dummy[loop] = dummy[loop - 1]; + } + dummy[0] = diviseur; + dumlength++; + strcpy(chainemod, chainemult); + } while (strlen(chainemult) != 0); + for (loop = 0; loop < dumlength; loop++) { + chainemc[*(mclength)] = dummy[loop]; + *(mclength) = *(mclength) + 1; + } + j += longueur; + } +} + +/* 366 */ +static int pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length) { + int i, k, j, indexchaine, indexliste, mode, longueur, loop, mccorrection[520], offset; + int total, chainemc[2700], mclength, c1, c2, c3, dummy[35]; + char pattern[580]; + int debug = symbol->debug; + + /* 456 */ + indexliste = 0; + indexchaine = 0; + + mode = quelmode(chaine[indexchaine]); + + for (i = 0; i < 1000; i++) { + liste[0][i] = 0; + } + + /* 463 */ + do { + liste[1][indexliste] = mode; + while ((liste[1][indexliste] == mode) && (indexchaine < length)) { + liste[0][indexliste]++; + indexchaine++; + mode = quelmode(chaine[indexchaine]); + } + indexliste++; + } while (indexchaine < length); + + /* 474 */ + pdfsmooth(&indexliste); + + if (debug) { + printf("Initial block pattern:\n"); + for (i = 0; i < indexliste; i++) { + printf("Len: %d Type: ", liste[0][i]); + switch (liste[1][i]) { + case TEX: printf("Text\n"); + break; + case BYT: printf("Byte\n"); + break; + case NUM: printf("Number\n"); + break; + default: printf("ERROR\n"); + break; + } + } + } + + /* 541 - now compress the data */ + indexchaine = 0; + mclength = 0; + + if (symbol->output_options & READER_INIT) { + chainemc[mclength] = 921; /* Reader Initialisation */ + mclength++; + } + + if (symbol->eci != 3) { + /* Encoding ECI assignment number, according to Table 8 */ + if (symbol->eci <= 899) { + chainemc[mclength] = 927; /* ECI */ + mclength++; + chainemc[mclength] = symbol->eci; + mclength++; + } + if ((symbol->eci >= 900) && (symbol->eci <= 810899)) { + chainemc[mclength] = 926; /* ECI */ + mclength++; + chainemc[mclength] = (symbol->eci / 900) - 1; + mclength++; + chainemc[mclength] = symbol->eci % 900; + mclength++; + } + if (symbol->eci >= 810900) { + chainemc[mclength] = 925; /* ECI */ + mclength++; + chainemc[mclength] = symbol->eci - 810900; + mclength++; + } + } + + if (symbol->eci > 811799) { + strcpy(symbol->errtxt, "472: Invalid ECI"); + return ZINT_ERROR_INVALID_OPTION; + } + + for (i = 0; i < indexliste; i++) { + switch (liste[1][i]) { + case TEX: /* 547 - text mode */ + textprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], i); + break; + case BYT: /* 670 - octet stream mode */ + byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i); + break; + case NUM: /* 712 - numeric mode */ + numbprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], i); + break; + } + indexchaine = indexchaine + liste[0][i]; + } + + if (debug) { + printf("\nCompressed data stream:\n"); + for (i = 0; i < mclength; i++) { + printf("%d ", chainemc[i]); + } + printf("\n\n"); + } + + /* 752 - Now take care of the number of CWs per row */ + if (symbol->option_1 < 0) { + symbol->option_1 = 6; + if (mclength <= 863) { + symbol->option_1 = 5; + } + if (mclength <= 320) { + symbol->option_1 = 4; + } + if (mclength <= 160) { + symbol->option_1 = 3; + } + if (mclength <= 40) { + symbol->option_1 = 2; + } + } + k = 1; + for (loop = 1; loop <= (symbol->option_1 + 1); loop++) { + k *= 2; + } + longueur = mclength; + if (symbol->option_2 > 30) { + symbol->option_2 = 30; + } + if (symbol->option_2 < 1) { + symbol->option_2 =(int)(0.5 + sqrt((longueur + k) / 3.0)); + } + if (((longueur + k) / symbol->option_2) > 90) { + /* stop the symbol from becoming too high */ + symbol->option_2 = symbol->option_2 + 1; + } + + if (longueur + k > 928) { + /* Enforce maximum codeword limit */ + return 2; + } + + if (((longueur + k) / symbol->option_2) > 90) { + return 4; + } + + /* 781 - Padding calculation */ + longueur = mclength + 1 + k; + i = 0; + if ((longueur / symbol->option_2) < 3) { + i = (symbol->option_2 * 3) - longueur; /* A bar code must have at least three rows */ + } else { + if ((longueur % symbol->option_2) > 0) { + i = symbol->option_2 - (longueur % symbol->option_2); + } + } + /* We add the padding */ + while (i > 0) { + chainemc[mclength] = 900; + mclength++; + i--; + } + /* we add the length descriptor */ + for (i = mclength; i > 0; i--) { + chainemc[i] = chainemc[i - 1]; + } + chainemc[0] = mclength + 1; + mclength++; + + /* 796 - we now take care of the Reed Solomon codes */ + switch (symbol->option_1) { + case 1: offset = 2; + break; + case 2: offset = 6; + break; + case 3: offset = 14; + break; + case 4: offset = 30; + break; + case 5: offset = 62; + break; + case 6: offset = 126; + break; + case 7: offset = 254; + break; + case 8: offset = 510; + break; + default: offset = 0; + break; + } + + longueur = mclength; + for (loop = 0; loop < 520; loop++) { + mccorrection[loop] = 0; + } + total = 0; + for (i = 0; i < longueur; i++) { + total = (chainemc[i] + mccorrection[k - 1]) % 929; + for (j = k - 1; j > 0; j--) { + mccorrection[j] = (mccorrection[j - 1] + 929 - (total * coefrs[offset + j]) % 929) % 929; + } + mccorrection[0] = (929 - (total * coefrs[offset + j]) % 929) % 929; + } + + /* we add these codes to the string */ + for (i = k - 1; i >= 0; i--) { + chainemc[mclength++] = mccorrection[i] ? 929 - mccorrection[i] : 0; + } + + /* 818 - The CW string is finished */ + c1 = (mclength / symbol->option_2 - 1) / 3; + c2 = symbol->option_1 * 3 + (mclength / symbol->option_2 - 1) % 3; + c3 = symbol->option_2 - 1; + + /* we now encode each row */ + for (i = 0; i <= (mclength / symbol->option_2) - 1; i++) { + for (j = 0; j < symbol->option_2; j++) { + dummy[j + 1] = chainemc[i * symbol->option_2 + j]; + } + k = (i / 3) * 30; + switch (i % 3) { + case 0: + dummy[0] = k + c1; + dummy[symbol->option_2 + 1] = k + c3; + offset = 0; /* cluster(0) */ + break; + case 1: + dummy[0] = k + c2; + dummy[symbol->option_2 + 1] = k + c1; + offset = 929; /* cluster(3) */ + break; + case 2: + dummy[0] = k + c3; + dummy[symbol->option_2 + 1] = k + c2; + offset = 1858; /* cluster(6) */ + break; + } + strcpy(pattern, ""); + bin_append(0x1FEA8, 17, pattern); /* Row start */ + + for (j = 0; j <= symbol->option_2; j++) { + bin_append(pdf_bitpattern[offset + dummy[j]], 16, pattern); + strcat(pattern, "0"); + } + + if (symbol->symbology != BARCODE_PDF417TRUNC) { + bin_append(pdf_bitpattern[offset + dummy[j]], 16, pattern); + strcat(pattern, "0"); + bin_append(0x3FA29, 18, pattern); /* Row Stop */ + } + + for (loop = 0; loop < strlen(pattern); loop++) { + if (pattern[loop] == '1') { + set_module(symbol, i, loop); + } + } + + symbol->row_height[i] = 3; + + } + symbol->rows = (mclength / symbol->option_2); + symbol->width =(int)strlen(pattern); + + /* 843 */ + return 0; +} + +/* 345 */ +int pdf417enc(struct zint_symbol *symbol, unsigned char source[], const size_t length) { + int codeerr, error_number; + + error_number = 0; + + if ((symbol->option_1 < -1) || (symbol->option_1 > 8)) { + strcpy(symbol->errtxt, "460: Security value out of range"); + symbol->option_1 = -1; + error_number = ZINT_WARN_INVALID_OPTION; + } + if ((symbol->option_2 < 0) || (symbol->option_2 > 30)) { + strcpy(symbol->errtxt, "461: Number of columns out of range"); + symbol->option_2 = 0; + error_number = ZINT_WARN_INVALID_OPTION; + } + + /* 349 */ + codeerr = pdf417(symbol, source, length); + + /* 352 */ + if (codeerr != 0) { + switch (codeerr) { + case 1: + strcpy(symbol->errtxt, "462: No such file or file unreadable"); + error_number = ZINT_ERROR_INVALID_OPTION; + break; + case 2: + strcpy(symbol->errtxt, "463: Input string too long"); + error_number = ZINT_ERROR_TOO_LONG; + break; + case 3: + strcpy(symbol->errtxt, "464: Number of codewords per row too small"); + error_number = ZINT_WARN_INVALID_OPTION; + break; + case 4: + strcpy(symbol->errtxt, "465: Data too long for specified number of columns"); + error_number = ZINT_ERROR_TOO_LONG; + break; + case ZINT_ERROR_INVALID_OPTION: + error_number = codeerr; + break; + default: + strcpy(symbol->errtxt, "466: Something strange happened"); + error_number = ZINT_ERROR_ENCODING_PROBLEM; + break; + } + } + + /* 364 */ + return error_number; +} + +/* like PDF417 only much smaller! */ +int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], const size_t length) { + int i, k, j, indexchaine, indexliste, mode, longueur, mccorrection[50], offset; + int total, chainemc[2700], mclength, dummy[5], codeerr; + char pattern[580]; + int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster; + int LeftRAP, CentreRAP, RightRAP, Cluster, loop; + int debug = 0; + + /* Encoding starts out the same as PDF417, so use the same code */ + codeerr = 0; + + /* 456 */ + indexliste = 0; + indexchaine = 0; + + mode = quelmode(chaine[indexchaine]); + + for (i = 0; i < 1000; i++) { + liste[0][i] = 0; + } + + /* 463 */ + do { + liste[1][indexliste] = mode; + while ((liste[1][indexliste] == mode) && (indexchaine < length)) { + liste[0][indexliste]++; + indexchaine++; + mode = quelmode(chaine[indexchaine]); + } + indexliste++; + } while (indexchaine < length); + + /* 474 */ + pdfsmooth(&indexliste); + + if (debug) { + printf("Initial mapping:\n"); + for (i = 0; i < indexliste; i++) { + printf("len: %d type: ", liste[0][i]); + switch (liste[1][i]) { + case TEX: printf("TEXT\n"); + break; + case BYT: printf("BYTE\n"); + break; + case NUM: printf("NUMBER\n"); + break; + default: printf("*ERROR*\n"); + break; + } + } + } + + /* 541 - now compress the data */ + indexchaine = 0; + mclength = 0; + + if (symbol->output_options & READER_INIT) { + chainemc[mclength] = 921; /* Reader Initialisation */ + mclength++; + } + + if (symbol->eci > 811799) { + strcpy(symbol->errtxt, "473: Invalid ECI"); + return ZINT_ERROR_INVALID_OPTION; + } + + if (symbol->eci != 3) { + /* Encoding ECI assignment number, according to Table 8 */ + if (symbol->eci <= 899) { + chainemc[mclength] = 927; /* ECI */ + mclength++; + chainemc[mclength] = symbol->eci; + mclength++; + } + if ((symbol->eci >= 900) && (symbol->eci <= 810899)) { + chainemc[mclength] = 926; /* ECI */ + mclength++; + chainemc[mclength] = (symbol->eci / 900) - 1; + mclength++; + chainemc[mclength] = symbol->eci % 900; + mclength++; + } + if (symbol->eci >= 810900) { + chainemc[mclength] = 925; /* ECI */ + mclength++; + chainemc[mclength] = symbol->eci - 810900; + mclength++; + } + } + + for (i = 0; i < indexliste; i++) { + switch (liste[1][i]) { + case TEX: /* 547 - text mode */ + textprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], i); + break; + case BYT: /* 670 - octet stream mode */ + byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i); + break; + case NUM: /* 712 - numeric mode */ + numbprocess(chainemc, &mclength, (char*) chaine, indexchaine, liste[0][i], i); + break; + } + indexchaine = indexchaine + liste[0][i]; + } + + /* This is where it all changes! */ + + if (mclength > 126) { + strcpy(symbol->errtxt, "467: Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + if (symbol->option_2 > 4) { + strcpy(symbol->errtxt, "468: Specified width out of range"); + symbol->option_2 = 0; + codeerr = ZINT_WARN_INVALID_OPTION; + } + + if (debug) { + printf("\nEncoded Data Stream:\n"); + for (i = 0; i < mclength; i++) { + printf("0x%02X ", chainemc[i]); + } + printf("\n"); + } + + /* Now figure out which variant of the symbol to use and load values accordingly */ + + variant = 0; + + if ((symbol->option_2 == 1) && (mclength > 20)) { + /* the user specified 1 column but the data doesn't fit - go to automatic */ + symbol->option_2 = 0; + strcpy(symbol->errtxt, "469: Specified symbol size too small for data"); + codeerr = ZINT_WARN_INVALID_OPTION; + } + + if ((symbol->option_2 == 2) && (mclength > 37)) { + /* the user specified 2 columns but the data doesn't fit - go to automatic */ + symbol->option_2 = 0; + strcpy(symbol->errtxt, "470: Specified symbol size too small for data"); + codeerr = ZINT_WARN_INVALID_OPTION; + } + + if ((symbol->option_2 == 3) && (mclength > 82)) { + /* the user specified 3 columns but the data doesn't fit - go to automatic */ + symbol->option_2 = 0; + strcpy(symbol->errtxt, "471: Specified symbol size too small for data"); + codeerr = ZINT_WARN_INVALID_OPTION; + } + + if (symbol->option_2 == 1) { + /* the user specified 1 column and the data does fit */ + variant = 6; + if (mclength <= 16) { + variant = 5; + } + if (mclength <= 12) { + variant = 4; + } + if (mclength <= 10) { + variant = 3; + } + if (mclength <= 7) { + variant = 2; + } + if (mclength <= 4) { + variant = 1; + } + } + + if (symbol->option_2 == 2) { + /* the user specified 2 columns and the data does fit */ + variant = 13; + if (mclength <= 33) { + variant = 12; + } + if (mclength <= 29) { + variant = 11; + } + if (mclength <= 24) { + variant = 10; + } + if (mclength <= 19) { + variant = 9; + } + if (mclength <= 13) { + variant = 8; + } + if (mclength <= 8) { + variant = 7; + } + } + + if (symbol->option_2 == 3) { + /* the user specified 3 columns and the data does fit */ + variant = 23; + if (mclength <= 70) { + variant = 22; + } + if (mclength <= 58) { + variant = 21; + } + if (mclength <= 46) { + variant = 20; + } + if (mclength <= 34) { + variant = 19; + } + if (mclength <= 24) { + variant = 18; + } + if (mclength <= 18) { + variant = 17; + } + if (mclength <= 14) { + variant = 16; + } + if (mclength <= 10) { + variant = 15; + } + if (mclength <= 6) { + variant = 14; + } + } + + if (symbol->option_2 == 4) { + /* the user specified 4 columns and the data does fit */ + variant = 34; + if (mclength <= 108) { + variant = 33; + } + if (mclength <= 90) { + variant = 32; + } + if (mclength <= 72) { + variant = 31; + } + if (mclength <= 54) { + variant = 30; + } + if (mclength <= 39) { + variant = 29; + } + if (mclength <= 30) { + variant = 28; + } + if (mclength <= 24) { + variant = 27; + } + if (mclength <= 18) { + variant = 26; + } + if (mclength <= 12) { + variant = 25; + } + if (mclength <= 8) { + variant = 24; + } + } + + if (variant == 0) { + /* Zint can choose automatically from all available variations */ + for (i = 27; i >= 0; i--) { + + if (MicroAutosize[i] >= mclength) { + variant = MicroAutosize[i + 28]; + } + } + } + + /* Now we have the variant we can load the data */ + variant--; + symbol->option_2 = MicroVariants[variant]; /* columns */ + symbol->rows = MicroVariants[variant + 34]; /* rows */ + k = MicroVariants[variant + 68]; /* number of EC CWs */ + longueur = (symbol->option_2 * symbol->rows) - k; /* number of non-EC CWs */ + i = longueur - mclength; /* amount of padding required */ + offset = MicroVariants[variant + 102]; /* coefficient offset */ + + if (debug) { + printf("\nChoose symbol size:\n"); + printf("%d columns x %d rows\n", symbol->option_2, symbol->rows); + printf("%d data codewords (including %d pads), %d ecc codewords\n", longueur, i, k); + printf("\n"); + } + + /* We add the padding */ + while (i > 0) { + chainemc[mclength] = 900; + mclength++; + i--; + } + + /* Reed-Solomon error correction */ + longueur = mclength; + for (loop = 0; loop < 50; loop++) { + mccorrection[loop] = 0; + } + total = 0; + for (i = 0; i < longueur; i++) { + total = (chainemc[i] + mccorrection[k - 1]) % 929; + for (j = k - 1; j >= 0; j--) { + if (j == 0) { + mccorrection[j] = (929 - (total * Microcoeffs[offset + j]) % 929) % 929; + } else { + mccorrection[j] = (mccorrection[j - 1] + 929 - (total * Microcoeffs[offset + j]) % 929) % 929; + } + } + } + + for (j = 0; j < k; j++) { + if (mccorrection[j] != 0) { + mccorrection[j] = 929 - mccorrection[j]; + } + } + /* we add these codes to the string */ + for (i = k - 1; i >= 0; i--) { + chainemc[mclength] = mccorrection[i]; + mclength++; + } + + if (debug) { + printf("Encoded Data Stream with ECC:\n"); + for (i = 0; i < mclength; i++) { + printf("0x%02X ", chainemc[i]); + } + printf("\n"); + } + + /* Now get the RAP (Row Address Pattern) start values */ + LeftRAPStart = RAPTable[variant]; + CentreRAPStart = RAPTable[variant + 34]; + RightRAPStart = RAPTable[variant + 68]; + StartCluster = RAPTable[variant + 102] / 3; + + /* That's all values loaded, get on with the encoding */ + + LeftRAP = LeftRAPStart; + CentreRAP = CentreRAPStart; + RightRAP = RightRAPStart; + Cluster = StartCluster; + /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ + + if (debug) printf("\nInternal row representation:\n"); + for (i = 0; i < symbol->rows; i++) { + if (debug) printf("row %d: ", i); + strcpy(pattern, ""); + offset = 929 * Cluster; + for (j = 0; j < 5; j++) { + dummy[j] = 0; + } + for (j = 0; j < symbol->option_2; j++) { + dummy[j + 1] = chainemc[i * symbol->option_2 + j]; + if (debug) printf("[%d] ", dummy[j + 1]); + } + + /* Copy the data into codebarre */ + bin_append(rap_side[LeftRAP - 1], 10, pattern); + bin_append(pdf_bitpattern[offset + dummy[1]], 16, pattern); + strcat(pattern, "0"); + if (symbol->option_2 == 3) { + bin_append(rap_centre[CentreRAP - 1], 10, pattern); + } + if (symbol->option_2 >= 2) { + bin_append(pdf_bitpattern[offset + dummy[2]], 16, pattern); + strcat(pattern, "0"); + } + if (symbol->option_2 == 4) { + bin_append(rap_centre[CentreRAP - 1], 10, pattern); + } + if (symbol->option_2 >= 3) { + bin_append(pdf_bitpattern[offset + dummy[3]], 16, pattern); + strcat(pattern, "0"); + } + if (symbol->option_2 == 4) { + bin_append(pdf_bitpattern[offset + dummy[4]], 16, pattern); + strcat(pattern, "0"); + } + bin_append(rap_side[RightRAP - 1], 10, pattern); + strcat(pattern, "1"); /* stop */ + if (debug) printf("%s\n", pattern); + + /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ + for (loop = 0; loop < strlen(pattern); loop++) { + if (pattern[loop] == '1') { + set_module(symbol, i, loop); + } + } + symbol->row_height[i] = 2; + symbol->width = strlen(pattern); + + /* Set up RAPs and Cluster for next row */ + LeftRAP++; + CentreRAP++; + RightRAP++; + Cluster++; + + if (LeftRAP == 53) { + LeftRAP = 1; + } + if (CentreRAP == 53) { + CentreRAP = 1; + } + if (RightRAP == 53) { + RightRAP = 1; + } + if (Cluster == 3) { + Cluster = 0; + } + } + + return codeerr; +} diff --git a/3rdparty/zint-2.6.1/backend/pdf417.h b/3rdparty/zint-2.6.1/backend/pdf417.h new file mode 100644 index 0000000..2c2f551 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/pdf417.h @@ -0,0 +1,514 @@ +/* pdf417.h - PDF417 tables and coefficients */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + Portions Copyright (C) 2004 Grandzebu + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* this file contains the character table, the pre-calculated coefficients and the + codeword patterns taken from lines 416 to 454 of pdf417.frm */ + +#define TRUE 1 +#define FALSE 0 +#define TEX 900 +#define BYT 901 +#define NUM 902 + +/* PDF417 error correction coefficients from Grand Zebu */ +static const unsigned short int coefrs[1022] = { + /* k = 2 */ + 27, 917, + + /* k = 4 */ + 522, 568, 723, 809, + + /* k = 8 */ + 237, 308, 436, 284, 646, 653, 428, 379, + + /* k = 16 */ + 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65, + + /* k = 32 */ + 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517, + 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410, + + /* k = 64 */ + 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877, 381, 612, + 723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511, 400, 672, 762, 283, 184, + 440, 35, 519, 31, 460, 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502, + 648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, 623, 264, 543, + + /* k = 128 */ + 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749, 415, + 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908, 490, 704, + 516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569, + 193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, 463, 646, 776, + 171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507, 48, 228, 821, 808, 898, + 784, 663, 627, 378, 382, 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616, + 157, 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, 587, 804, 34, + 211, 330, 539, 297, 827, 865, 37, 517, 834, 315, 550, 86, 801, 4, 108, 539, + + /* k = 256 */ + 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138, 720, + 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280, 828, 757, + 710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137, + 439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, 549, 209, 884, + 315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684, 461, 334, 376, 849, 521, + 307, 291, 803, 712, 19, 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470, + 637, 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, 538, 906, 90, + 2, 290, 743, 199, 655, 903, 329, 49, 802, 580, 355, 588, 188, 462, 10, 134, + 628, 320, 479, 130, 739, 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234, + 722, 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, 60, 732, 621, + 895, 544, 261, 852, 655, 309, 697, 755, 756, 60, 231, 773, 434, 421, 726, 528, + 503, 118, 49, 795, 32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550, + 73, 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, 791, 893, 754, + 605, 383, 228, 749, 760, 213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532, + 609, 829, 189, 20, 167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, + 404, 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497, 10, + + /* k = 512 */ + 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350, 492, + 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193, 352, 781, + 846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534, + 539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, 916, 552, 41, + 542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761, 107, 784, 860, 658, 741, + 290, 204, 681, 407, 855, 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142, + 808, 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, 192, 516, 258, + 240, 518, 794, 395, 768, 848, 51, 610, 384, 168, 190, 826, 328, 596, 786, 303, + 570, 381, 415, 641, 156, 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402, + 40, 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, 92, 358, 785, + 288, 357, 850, 836, 827, 736, 707, 94, 8, 494, 114, 521, 2, 499, 851, 543, + 152, 729, 771, 95, 248, 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, + 669, 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578, + 37, 124, 298, 332, 552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911, + 283, 711, 472, 420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, + 842, 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672, 729, + 624, 59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365, 181, 772, + 677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777, + 618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247, 184, 45, + 787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519, 644, 905, + 789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341, + 242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, 665, 397, 808, + 851, 309, 473, 795, 378, 31, 647, 915, 459, 806, 590, 731, 425, 216, 548, 249, + 321, 881, 699, 535, 673, 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791, + 660, 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, 336, 286, 437, + 375, 273, 610, 296, 183, 923, 116, 667, 751, 353, 62, 366, 691, 379, 687, 842, + 37, 357, 720, 742, 330, 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316, + 342, 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, 610, 46, 656, + 447, 171, 616, 464, 190, 531, 297, 321, 762, 752, 533, 175, 134, 14, 381, 433, + 717, 45, 111, 20, 596, 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, + 407, 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647, + 63, 310, 863, 251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263 +}; + +static const unsigned short int pdf_bitpattern[2787] = { + 0xEAE0, 0xF578, 0xFABE, 0xEA70, 0xF53C, 0xFA9F, 0xD460, 0xEA38, 0xD430, 0xA820, + 0xD418, 0xA810, 0xD6E0, 0xEB78, 0xF5BE, 0xD670, 0xEB3C, 0xF59F, 0xAC60, 0xD638, + 0xAC30, 0xAEE0, 0xD778, 0xEBBE, 0xAE70, 0xD73C, 0xEB9F, 0xAE38, 0xD71E, 0xAF78, + 0xD7BE, 0xAF3C, 0xD79F, 0xAFBE, 0xFAFD, 0xE970, 0xF4BC, 0xFA5F, 0xD260, 0xE938, + 0xF49E, 0xD230, 0xE91C, 0xA420, 0xD218, 0xE90E, 0xA410, 0xD20C, 0xA408, 0xD370, + 0xE9BC, 0xF4DF, 0xA660, 0xD338, 0xE99E, 0xA630, 0xD31C, 0xE98F, 0xA618, 0xD30E, + 0xA770, 0xD3BC, 0xE9DF, 0xA738, 0xD39E, 0xA71C, 0xD38F, 0xA7BC, 0xD3DF, 0xA79E, + 0xA78F, 0xD160, 0xE8B8, 0xF45E, 0xD130, 0xE89C, 0xF44F, 0xA220, 0xD118, 0xE88E, + 0xA210, 0xD10C, 0xA208, 0xA204, 0xA360, 0xD1B8, 0xE8DE, 0xA330, 0xD19C, 0xE8CF, + 0xA318, 0xD18E, 0xA30C, 0xA306, 0xA3B8, 0xD1DE, 0xA39C, 0xD1CF, 0xA38E, 0xA3DE, + 0xD0B0, 0xE85C, 0xF42F, 0xA120, 0xD098, 0xE84E, 0xA110, 0xD08C, 0xE847, 0xA108, + 0xD086, 0xA104, 0xD083, 0xA1B0, 0xD0DC, 0xE86F, 0xA198, 0xD0CE, 0xA18C, 0xD0C7, + 0xA186, 0xA183, 0xD0EF, 0xA1C7, 0xA0A0, 0xD058, 0xE82E, 0xA090, 0xD04C, 0xE827, + 0xA088, 0xD046, 0xA084, 0xD043, 0xA082, 0xA0D8, 0xA0CC, 0xA0C6, 0xA050, 0xE817, + 0xD026, 0xD023, 0xA041, 0xE570, 0xF2BC, 0xF95F, 0xCA60, 0xE538, 0xF29E, 0xCA30, + 0xE51C, 0xF28F, 0x9420, 0xCA18, 0x9410, 0xCB70, 0xE5BC, 0xF2DF, 0x9660, 0xCB38, + 0xE59E, 0x9630, 0xCB1C, 0x9618, 0x960C, 0x9770, 0xCBBC, 0xE5DF, 0x9738, 0xCB9E, + 0x971C, 0x970E, 0x97BC, 0xCBDF, 0x979E, 0x97DF, 0xED60, 0xF6B8, 0xFB5E, 0xED30, + 0xF69C, 0xFB4F, 0xDA20, 0xED18, 0xF68E, 0xDA10, 0xED0C, 0xF687, 0xDA08, 0xED06, + 0xC960, 0xE4B8, 0xF25E, 0xDB60, 0xC930, 0xE49C, 0xF24F, 0xDB30, 0xED9C, 0xF6CF, + 0xB620, 0x9210, 0xC90C, 0xE487, 0xB610, 0xDB0C, 0xB608, 0x9360, 0xC9B8, 0xE4DE, + 0xB760, 0x9330, 0xC99C, 0xE4CF, 0xB730, 0xDB9C, 0xEDCF, 0xB718, 0x930C, 0xB70C, + 0x93B8, 0xC9DE, 0xB7B8, 0x939C, 0xC9CF, 0xB79C, 0xDBCF, 0xB78E, 0x93DE, 0xB7DE, + 0x93CF, 0xB7CF, 0xECB0, 0xF65C, 0xFB2F, 0xD920, 0xEC98, 0xF64E, 0xD910, 0xEC8C, + 0xF647, 0xD908, 0xEC86, 0xD904, 0xD902, 0xC8B0, 0xE45C, 0xF22F, 0xD9B0, 0xC898, + 0xE44E, 0xB320, 0x9110, 0xECCE, 0xE447, 0xB310, 0x9108, 0xC886, 0xB308, 0xD986, + 0xC883, 0x9102, 0x91B0, 0xC8DC, 0xE46F, 0xB3B0, 0x9198, 0xC8CE, 0xB398, 0xD9CE, + 0xC8C7, 0xB38C, 0x9186, 0x9183, 0x91DC, 0xC8EF, 0xB3DC, 0x91CE, 0xB3CE, 0x91C7, + 0xB3C7, 0xB3EF, 0xD8A0, 0xEC58, 0xF62E, 0xD890, 0xEC4C, 0xF627, 0xD888, 0xEC46, + 0xD884, 0xEC43, 0xD882, 0xD881, 0x90A0, 0xC858, 0xE42E, 0xB1A0, 0x9090, 0xC84C, + 0xE427, 0xB190, 0xD8CC, 0xEC67, 0xB188, 0x9084, 0xC843, 0xB184, 0xD8C3, 0xB182, + 0x90D8, 0xC86E, 0xB1D8, 0x90CC, 0xC867, 0xB1CC, 0xD8E7, 0xB1C6, 0x90C3, 0xB1C3, + 0xB1EE, 0xB1E7, 0xD850, 0xEC2C, 0xF617, 0xD848, 0xEC26, 0xD844, 0xEC23, 0xD842, + 0xD841, 0x9050, 0xC82C, 0xE417, 0xB0D0, 0x9048, 0xC826, 0xB0C8, 0xD866, 0xC823, + 0xB0C4, 0x9042, 0xB0C2, 0x9041, 0x906C, 0xB0EC, 0xB0E6, 0xB0E3, 0xEC16, 0xEC13, + 0xD821, 0xC816, 0x9024, 0xB064, 0xB062, 0xB061, 0xC560, 0xE2B8, 0xF15E, 0xC530, + 0xE29C, 0x8A20, 0xC518, 0xE28E, 0x8A10, 0xC50C, 0x8A08, 0x8A04, 0x8B60, 0xC5B8, + 0xE2DE, 0x8B30, 0xC59C, 0xE2CF, 0x8B18, 0xC58E, 0x8B0C, 0x8B06, 0x8BB8, 0xC5DE, + 0x8B9C, 0xC5CF, 0x8B8E, 0x8BDE, 0x8BCF, 0xE6B0, 0xF35C, 0xF9AF, 0xCD20, 0xE698, + 0xF34E, 0xCD10, 0xE68C, 0xF347, 0xCD08, 0xE686, 0xCD04, 0xE683, 0xC4B0, 0xE25C, + 0xF12F, 0xCDB0, 0xC498, 0xE24E, 0x9B20, 0x8910, 0xE6CE, 0xE247, 0x9B10, 0xCD8C, + 0xC486, 0x9B08, 0x8904, 0x9B04, 0x89B0, 0xC4DC, 0xE26F, 0x9BB0, 0x8998, 0xE6EF, + 0x9B98, 0xCDCE, 0xC4C7, 0x9B8C, 0x8986, 0x9B86, 0x89DC, 0xC4EF, 0x9BDC, 0x89CE, + 0x9BCE, 0x89C7, 0x89EF, 0x9BEF, 0xEEA0, 0xF758, 0xFBAE, 0xEE90, 0xF74C, 0xFBA7, + 0xEE88, 0xF746, 0xEE84, 0xF743, 0xEE82, 0xCCA0, 0xE658, 0xF32E, 0xDDA0, 0xCC90, + 0xF76E, 0xF327, 0xDD90, 0xEECC, 0xF767, 0xDD88, 0xCC84, 0xE643, 0xDD84, 0xEEC3, + 0xCC81, 0x88A0, 0xC458, 0xE22E, 0x99A0, 0x8890, 0xC44C, 0xE227, 0xBBA0, 0x9990, + 0xCCCC, 0xE667, 0xBB90, 0xDDCC, 0xEEE7, 0xC443, 0xBB88, 0x9984, 0xCCC3, 0xBB84, + 0x8881, 0x88D8, 0xC46E, 0x99D8, 0x88CC, 0xC467, 0xBBD8, 0x99CC, 0xCCE7, 0xBBCC, + 0xDDE7, 0x88C3, 0x99C3, 0x88EE, 0x99EE, 0x88E7, 0xBBEE, 0x99E7, 0xEE50, 0xF72C, + 0xFB97, 0xEE48, 0xF726, 0xEE44, 0xF723, 0xEE42, 0xEE41, 0xCC50, 0xE62C, 0xF317, + 0xDCD0, 0xCC48, 0xF737, 0xDCC8, 0xEE66, 0xE623, 0xDCC4, 0xCC42, 0xDCC2, 0xCC41, + 0xDCC1, 0x8850, 0xC42C, 0xE217, 0x98D0, 0x8848, 0xC426, 0xB9D0, 0x98C8, 0xCC66, + 0xC423, 0xB9C8, 0xDCE6, 0x8842, 0xB9C4, 0x98C2, 0x8841, 0x98C1, 0x886C, 0xC437, + 0x98EC, 0x8866, 0xB9EC, 0x98E6, 0x8863, 0xB9E6, 0x98E3, 0x8877, 0xB9F7, 0xEE28, + 0xF716, 0xEE24, 0xF713, 0xEE22, 0xEE21, 0xCC28, 0xE616, 0xDC68, 0xCC24, 0xE613, + 0xDC64, 0xEE33, 0xDC62, 0xCC21, 0xDC61, 0x8828, 0xC416, 0x9868, 0x8824, 0xC413, + 0xB8E8, 0x9864, 0xCC33, 0xB8E4, 0xDC73, 0x8821, 0xB8E2, 0x9861, 0xB8E1, 0x9876, + 0xB8F6, 0xB8F3, 0xF70B, 0xEE11, 0xE60B, 0xCC12, 0xCC11, 0x8814, 0x9834, 0xB874, + 0x8811, 0x9831, 0xC2B0, 0x8520, 0xC298, 0x8510, 0xC28C, 0xE147, 0x8508, 0xC286, + 0x8504, 0xC283, 0x85B0, 0xC2DC, 0xE16F, 0x8598, 0xC2CE, 0x858C, 0xC2C7, 0x8586, + 0x8583, 0x85DC, 0xC2EF, 0x85CE, 0x85C7, 0x85EF, 0xC6A0, 0xE358, 0xF1AE, 0xC690, + 0xE34C, 0xC688, 0xE346, 0xC684, 0xE343, 0xC682, 0x84A0, 0xC258, 0xE12E, 0x8DA0, + 0x8490, 0xE36E, 0xE127, 0x8D90, 0xC6CC, 0xE367, 0x8D88, 0x8484, 0xC243, 0x8D84, + 0xC6C3, 0x8481, 0x84D8, 0xC26E, 0x8DD8, 0x84CC, 0xC267, 0x8DCC, 0xC6E7, 0x8DC6, + 0x84C3, 0x84EE, 0x8DEE, 0x84E7, 0x8DE7, 0xE750, 0xF3AC, 0xF9D7, 0xE748, 0xF3A6, + 0xE744, 0xF3A3, 0xE742, 0xE741, 0xC650, 0xE32C, 0xCED0, 0xC648, 0xE326, 0xCEC8, + 0xE766, 0xE323, 0xCEC4, 0xC642, 0xCEC2, 0xC641, 0xCEC1, 0x8450, 0xC22C, 0x8CD0, + 0x8448, 0xE337, 0x9DD0, 0x8CC8, 0xC666, 0xC223, 0x9DC8, 0xCEE6, 0x8442, 0x9DC4, + 0x8CC2, 0x8441, 0x8CC1, 0x846C, 0xC237, 0x8CEC, 0x8466, 0x9DEC, 0x8CE6, 0x8463, + 0x9DE6, 0x8CE3, 0x8477, 0x8CF7, 0x9DF7, 0xF7A8, 0xFBD6, 0xF7A4, 0xFBD3, 0xF7A2, + 0xF7A1, 0xE728, 0xF396, 0xEF68, 0xF7B6, 0xF393, 0xEF64, 0xF7B3, 0xEF62, 0xE721, + 0xEF61, 0xC628, 0xE316, 0xCE68, 0xC624, 0xE313, 0xDEE8, 0xCE64, 0xE733, 0xDEE4, + 0xEF73, 0xC621, 0xDEE2, 0xCE61, 0xDEE1, 0x8428, 0xC216, 0x8C68, 0x8424, 0xC213, + 0x9CE8, 0x8C64, 0xC633, 0xBDE8, 0x9CE4, 0xCE73, 0x8421, 0xBDE4, 0xDEF3, 0x8C61, + 0xBDE2, 0x8436, 0x8C76, 0x8433, 0x9CF6, 0x8C73, 0xBDF6, 0x9CF3, 0xBDF3, 0xF794, + 0xFBCB, 0xF792, 0xF791, 0xE714, 0xF38B, 0xEF34, 0xF79B, 0xEF32, 0xE711, 0xEF31, + 0xC614, 0xE30B, 0xCE34, 0xC612, 0xDE74, 0xCE32, 0xC611, 0xDE72, 0xCE31, 0xDE71, + 0x8414, 0xC20B, 0x8C34, 0xC61B, 0x9C74, 0x8C32, 0x8411, 0xBCF4, 0x9C72, 0x8C31, + 0xBCF2, 0x9C71, 0xBCF1, 0x8C3B, 0xBCFB, 0xF789, 0xEF1A, 0xEF19, 0xCE1A, 0xDE3A, + 0xDE39, 0x8C1A, 0x9C3A, 0xBC7A, 0xBC79, 0x82A0, 0x8290, 0xC14C, 0x8288, 0x8284, + 0x8282, 0x82D8, 0x82CC, 0x82C6, 0x82C3, 0x82EE, 0x82E7, 0xC350, 0xC348, 0xE1A6, + 0xC344, 0xE1A3, 0xC342, 0xC341, 0x8250, 0xC12C, 0x86D0, 0xC36C, 0xC126, 0x86C8, + 0xC366, 0x86C4, 0xC363, 0x86C2, 0x8241, 0x86C1, 0x826C, 0xC137, 0x86EC, 0xC377, + 0x86E6, 0x8263, 0x86E3, 0x8277, 0x86F7, 0xE3A8, 0xE3A4, 0xE3A2, 0xE3A1, 0xC328, + 0xC768, 0xE3B6, 0xE193, 0xC764, 0xE3B3, 0xC762, 0xC321, 0xC761, 0x8228, 0x8668, + 0x8224, 0xC113, 0x8EE8, 0x8664, 0x8222, 0x8EE4, 0x8662, 0x8221, 0x8EE2, 0x8661, + 0x8236, 0x8676, 0x8233, 0x8EF6, 0x8673, 0x8EF3, 0xF3D4, 0xF3D2, 0xF3D1, 0xE394, + 0xE7B4, 0xF3DB, 0xE7B2, 0xE391, 0xE7B1, 0xC314, 0xE18B, 0xC734, 0xE39B, 0xCF74, + 0xC732, 0xC311, 0xCF72, 0xC731, 0xCF71, 0x8214, 0xC10B, 0x8634, 0xC31B, 0x8E74, + 0x8632, 0x8211, 0x9EF4, 0x8E72, 0x8631, 0x9EF2, 0x8E71, 0x821B, 0x863B, 0x8E7B, + 0x9EFB, 0xFBEA, 0xFBE9, 0xF3CA, 0xF7DA, 0xF3C9, 0xF7D9, 0xE38A, 0xE79A, 0xE389, + 0xEFBA, 0xE799, 0xEFB9, 0xC30A, 0xC71A, 0xC309, 0xCF3A, 0xC719, 0xDF7A, 0xFAB0, + 0xFD5C, 0xF520, 0xFA98, 0xFD4E, 0xF510, 0xFA8C, 0xFD47, 0xF508, 0xFA86, 0xF504, + 0xFA83, 0xF502, 0xF5B0, 0xFADC, 0xFD6F, 0xEB20, 0xF598, 0xFACE, 0xEB10, 0xF58C, + 0xFAC7, 0xEB08, 0xF586, 0xEB04, 0xF583, 0xEB02, 0xEBB0, 0xF5DC, 0xFAEF, 0xD720, + 0xEB98, 0xF5CE, 0xD710, 0xEB8C, 0xF5C7, 0xD708, 0xEB86, 0xD704, 0xEB83, 0xD702, + 0xD7B0, 0xEBDC, 0xF5EF, 0xAF20, 0xD798, 0xEBCE, 0xAF10, 0xD78C, 0xEBC7, 0xAF08, + 0xD786, 0xAF04, 0xD783, 0xAFB0, 0xD7DC, 0xEBEF, 0xAF98, 0xD7CE, 0xAF8C, 0xD7C7, + 0xAF86, 0xAFDC, 0xD7EF, 0xAFCE, 0xAFC7, 0xF4A0, 0xFA58, 0xFD2E, 0xF490, 0xFA4C, + 0xFD27, 0xF488, 0xFA46, 0xF484, 0xFA43, 0xF482, 0xF481, 0xE9A0, 0xF4D8, 0xFA6E, + 0xE990, 0xF4CC, 0xFA67, 0xE988, 0xF4C6, 0xE984, 0xF4C3, 0xE982, 0xE981, 0xD3A0, + 0xE9D8, 0xF4EE, 0xD390, 0xE9CC, 0xF4E7, 0xD388, 0xE9C6, 0xD384, 0xE9C3, 0xD382, + 0xD381, 0xA7A0, 0xD3D8, 0xE9EE, 0xA790, 0xD3CC, 0xE9E7, 0xA788, 0xD3C6, 0xA784, + 0xD3C3, 0xA782, 0xA7D8, 0xD3EE, 0xA7CC, 0xD3E7, 0xA7C6, 0xA7C3, 0xA7EE, 0xA7E7, + 0xF450, 0xFA2C, 0xFD17, 0xF448, 0xFA26, 0xF444, 0xFA23, 0xF442, 0xF441, 0xE8D0, + 0xF46C, 0xFA37, 0xE8C8, 0xF466, 0xE8C4, 0xF463, 0xE8C2, 0xE8C1, 0xD1D0, 0xE8EC, + 0xF477, 0xD1C8, 0xE8E6, 0xD1C4, 0xE8E3, 0xD1C2, 0xD1C1, 0xA3D0, 0xD1EC, 0xE8F7, + 0xA3C8, 0xD1E6, 0xA3C4, 0xD1E3, 0xA3C2, 0xA3C1, 0xA3EC, 0xD1F7, 0xA3E6, 0xA3E3, + 0xA3F7, 0xF428, 0xFA16, 0xF424, 0xFA13, 0xF422, 0xF421, 0xE868, 0xF436, 0xE864, + 0xF433, 0xE862, 0xE861, 0xD0E8, 0xE876, 0xD0E4, 0xE873, 0xD0E2, 0xD0E1, 0xA1E8, + 0xD0F6, 0xA1E4, 0xD0F3, 0xA1E2, 0xA1E1, 0xA1F6, 0xA1F3, 0xF414, 0xFA0B, 0xF412, + 0xF411, 0xE834, 0xF41B, 0xE832, 0xE831, 0xD074, 0xE83B, 0xD072, 0xD071, 0xA0F4, + 0xD07B, 0xA0F2, 0xA0F1, 0xF40A, 0xF409, 0xE81A, 0xE819, 0xD03A, 0xD039, 0xF2A0, + 0xF958, 0xFCAE, 0xF290, 0xF94C, 0xFCA7, 0xF288, 0xF946, 0xF284, 0xF943, 0xF282, + 0xF281, 0xE5A0, 0xF2D8, 0xF96E, 0xE590, 0xF2CC, 0xF967, 0xE588, 0xF2C6, 0xE584, + 0xF2C3, 0xE582, 0xE581, 0xCBA0, 0xE5D8, 0xF2EE, 0xCB90, 0xE5CC, 0xF2E7, 0xCB88, + 0xE5C6, 0xCB84, 0xE5C3, 0xCB82, 0xCB81, 0x97A0, 0xCBD8, 0xE5EE, 0x9790, 0xCBCC, + 0xE5E7, 0x9788, 0xCBC6, 0x9784, 0xCBC3, 0x9782, 0x97D8, 0xCBEE, 0x97CC, 0xCBE7, + 0x97C6, 0x97C3, 0x97EE, 0x97E7, 0xFB50, 0xFDAC, 0xB5F8, 0xFB48, 0xFDA6, 0xB4FC, + 0xFB44, 0xFDA3, 0xB47E, 0xFB42, 0xFB41, 0xF250, 0xF92C, 0xFC97, 0xF6D0, 0xF248, + 0xFDB7, 0xF6C8, 0xFB66, 0xF923, 0xF6C4, 0xF242, 0xF6C2, 0xF241, 0xF6C1, 0xE4D0, + 0xF26C, 0xF937, 0xEDD0, 0xE4C8, 0xF266, 0xEDC8, 0xF6E6, 0xF263, 0xEDC4, 0xE4C2, + 0xEDC2, 0xE4C1, 0xEDC1, 0xC9D0, 0xE4EC, 0xF277, 0xDBD0, 0xC9C8, 0xE4E6, 0xDBC8, + 0xEDE6, 0xE4E3, 0xDBC4, 0xC9C2, 0xDBC2, 0xC9C1, 0xDBC1, 0x93D0, 0xC9EC, 0xE4F7, + 0xB7D0, 0x93C8, 0xC9E6, 0xB7C8, 0xDBE6, 0xC9E3, 0xB7C4, 0x93C2, 0xB7C2, 0x93C1, + 0x93EC, 0xC9F7, 0xB7EC, 0x93E6, 0xB7E6, 0x93E3, 0xB7E3, 0x93F7, 0xFB28, 0xFD96, + 0xB2FC, 0xFB24, 0xFD93, 0xB27E, 0xFB22, 0xB23F, 0xFB21, 0xF228, 0xF916, 0xF668, + 0xF224, 0xF913, 0xF664, 0xFB33, 0xF662, 0xF221, 0xF661, 0xE468, 0xF236, 0xECE8, + 0xE464, 0xF233, 0xECE4, 0xF673, 0xECE2, 0xE461, 0xECE1, 0xC8E8, 0xE476, 0xD9E8, + 0xC8E4, 0xE473, 0xD9E4, 0xECF3, 0xD9E2, 0xC8E1, 0xD9E1, 0x91E8, 0xC8F6, 0xB3E8, + 0x91E4, 0xC8F3, 0xB3E4, 0xD9F3, 0xB3E2, 0x91E1, 0xB3E1, 0x91F6, 0xB3F6, 0x91F3, + 0xB3F3, 0xFB14, 0xFD8B, 0xB17E, 0xFB12, 0xB13F, 0xFB11, 0xF214, 0xF90B, 0xF634, + 0xFB1B, 0xF632, 0xF211, 0xF631, 0xE434, 0xF21B, 0xEC74, 0xE432, 0xEC72, 0xE431, + 0xEC71, 0xC874, 0xE43B, 0xD8F4, 0xEC7B, 0xD8F2, 0xC871, 0xD8F1, 0x90F4, 0xC87B, + 0xB1F4, 0x90F2, 0xB1F2, 0x90F1, 0xB1F1, 0x90FB, 0xB1FB, 0xFB0A, 0xB0BF, 0xFB09, + 0xF20A, 0xF61A, 0xF209, 0xF619, 0xE41A, 0xEC3A, 0xE419, 0xEC39, 0xC83A, 0xD87A, + 0xC839, 0xD879, 0x907A, 0xB0FA, 0x9079, 0xB0F9, 0xFB05, 0xF205, 0xF60D, 0xE40D, + 0xEC1D, 0xC81D, 0xD83D, 0xF150, 0xF8AC, 0xFC57, 0xF148, 0xF8A6, 0xF144, 0xF8A3, + 0xF142, 0xF141, 0xE2D0, 0xF16C, 0xF8B7, 0xE2C8, 0xF166, 0xE2C4, 0xF163, 0xE2C2, + 0xE2C1, 0xC5D0, 0xE2EC, 0xF177, 0xC5C8, 0xE2E6, 0xC5C4, 0xE2E3, 0xC5C2, 0xC5C1, + 0x8BD0, 0xC5EC, 0xE2F7, 0x8BC8, 0xC5E6, 0x8BC4, 0xC5E3, 0x8BC2, 0x8BC1, 0x8BEC, + 0xC5F7, 0x8BE6, 0x8BE3, 0x8BF7, 0xF9A8, 0xFCD6, 0x9AFC, 0xF9A4, 0xFCD3, 0x9A7E, + 0xF9A2, 0x9A3F, 0xF9A1, 0xF128, 0xF896, 0xF368, 0xF124, 0xF893, 0xF364, 0xF9B3, + 0xF362, 0xF121, 0xF361, 0xE268, 0xF136, 0xE6E8, 0xE264, 0xF133, 0xE6E4, 0xF373, + 0xE6E2, 0xE261, 0xE6E1, 0xC4E8, 0xE276, 0xCDE8, 0xC4E4, 0xE273, 0xCDE4, 0xE6F3, + 0xCDE2, 0xC4E1, 0xCDE1, 0x89E8, 0xC4F6, 0x9BE8, 0x89E4, 0xC4F3, 0x9BE4, 0xCDF3, + 0x9BE2, 0x89E1, 0x9BE1, 0x89F6, 0x9BF6, 0x89F3, 0x9BF3, 0xFDD4, 0xBAF8, 0xDD7E, + 0xFDD2, 0xBA7C, 0xDD3F, 0xFDD1, 0xBA3E, 0xBA1F, 0xF994, 0xFCCB, 0x997E, 0xFBB4, + 0xFDDB, 0xBB7E, 0x993F, 0xFBB2, 0xF991, 0xBB3F, 0xFBB1, 0xF114, 0xF88B, 0xF334, + 0xF112, 0xF774, 0xFBBB, 0xF111, 0xF772, 0xF331, 0xF771, 0xE234, 0xF11B, 0xE674, + 0xE232, 0xEEF4, 0xE672, 0xE231, 0xEEF2, 0xE671, 0xEEF1, 0xC474, 0xE23B, 0xCCF4, + 0xC472, 0xDDF4, 0xCCF2, 0xC471, 0xDDF2, 0xCCF1, 0xDDF1, 0x88F4, 0xC47B, 0x99F4, + 0x88F2, 0xBBF4, 0x99F2, 0x88F1, 0xBBF2, 0x99F1, 0xBBF1, 0x88FB, 0x99FB, 0xFDCA, + 0xB97C, 0xDCBF, 0xFDC9, 0xB93E, 0xB91F, 0xF98A, 0x98BF, 0xFB9A, 0xF989, 0xB9BF, + 0xFB99, 0xF10A, 0xF31A, 0xF109, 0xF73A, 0xF319, 0xF739, 0xE21A, 0xE63A, 0xE219, + 0xEE7A, 0xE639, 0xEE79, 0xC43A, 0xCC7A, 0xC439, 0xDCFA, 0xCC79, 0xDCF9, 0x887A, + 0x98FA, 0x8879, 0xB9FA, 0x98F9, 0xB9F9, 0xFDC5, 0xB8BE, 0xB89F, 0xF985, 0xFB8D, + 0xF105, 0xF30D, 0xF71D, 0xE20D, 0xE61D, 0xEE3D, 0xC41D, 0xCC3D, 0xDC7D, 0x883D, + 0x987D, 0xB8FD, 0xB85F, 0xF0A8, 0xF856, 0xF0A4, 0xF853, 0xF0A2, 0xF0A1, 0xE168, + 0xF0B6, 0xE164, 0xF0B3, 0xE162, 0xE161, 0xC2E8, 0xE176, 0xC2E4, 0xE173, 0xC2E2, + 0xC2E1, 0x85E8, 0xC2F6, 0x85E4, 0xC2F3, 0x85E2, 0x85E1, 0x85F6, 0x85F3, 0xF8D4, + 0xFC6B, 0x8D7E, 0xF8D2, 0x8D3F, 0xF8D1, 0xF094, 0xF84B, 0xF1B4, 0xF092, 0xF1B2, + 0xF091, 0xF1B1, 0xE134, 0xF09B, 0xE374, 0xE132, 0xE372, 0xE131, 0xE371, 0xC274, + 0xE13B, 0xC6F4, 0xC272, 0xC6F2, 0xC271, 0xC6F1, 0x84F4, 0xC27B, 0x8DF4, 0x84F2, + 0x8DF2, 0x84F1, 0x8DF1, 0x84FB, 0x8DFB, 0xFCEA, 0x9D7C, 0xCEBF, 0xFCE9, 0x9D3E, + 0x9D1F, 0xF8CA, 0x8CBF, 0xF9DA, 0xF8C9, 0x9DBF, 0xF9D9, 0xF08A, 0xF19A, 0xF089, + 0xF3BA, 0xF199, 0xF3B9, 0xE11A, 0xE33A, 0xE119, 0xE77A, 0xE339, 0xE779, 0xC23A, + 0xC67A, 0xC239, 0xCEFA, 0xC679, 0xCEF9, 0x847A, 0x8CFA, 0x8479, 0x9DFA, 0x8CF9, + 0x9DF9, 0xBD78, 0xDEBE, 0xBD3C, 0xDE9F, 0xBD1E, 0xBD0F, 0xFCE5, 0x9CBE, 0xFDED, + 0xBDBE, 0x9C9F, 0xBD9F, 0xF8C5, 0xF9CD, 0xFBDD, 0xF085, 0xF18D, 0xF39D, 0xF7BD, + 0xE10D, 0xE31D, 0xE73D, 0xEF7D, 0xC21D, 0xC63D, 0xCE7D, 0xDEFD, 0x843D, 0x8C7D, + 0x9CFD, 0xBCBC, 0xDE5F, 0xBC9E, 0xBC8F, 0x9C5F, 0xBCDF, 0xBC5E, 0xBC4F, 0xBC2F, + 0xF054, 0xF052, 0xF051, 0xE0B4, 0xF05B, 0xE0B2, 0xE0B1, 0xC174, 0xE0BB, 0xC172, + 0xC171, 0x82F4, 0xC17B, 0x82F2, 0x82F1, 0x82FB, 0xF86A, 0x86BF, 0xF869, 0xF04A, + 0xF0DA, 0xF049, 0xF0D9, 0xE09A, 0xE1BA, 0xE099, 0xE1B9, 0xC13A, 0xC37A, 0xC139, + 0xC379, 0x827A, 0x86FA, 0x8279, 0x86F9, 0xFC75, 0x8EBE, 0x8E9F, 0xF865, 0xF8ED, + 0xF045, 0xF0CD, 0xF1DD, 0xE08D, 0xE19D, 0xE3BD, 0xC11D, 0xC33D, 0xC77D, 0x823D, + 0x867D, 0x8EFD, 0x9EBC, 0xCF5F, 0x9E9E, 0x9E8F, 0x8E5F, 0x9EDF, 0xBEB8, 0xDF5E, + 0xBE9C, 0xDF4F, 0xBE8E, 0xBE87, 0x9E5E, 0xBEDE, 0x9E4F, 0xBECF, 0xBE5C, 0xDF2F, + 0xBE4E, 0xBE47, 0x9E2F, 0xBE6F, 0xBE2E, 0xBE27, 0xBE17, 0xE05A, 0xE059, 0xC0BA, + 0xC0B9, 0x817A, 0x8179, 0xF06D, 0xE04D, 0xE0DD, 0xC09D, 0xC1BD, 0x813D, 0x837D, + 0x875F, 0x8F5E, 0x8F4F, 0x9F5C, 0xCFAF, 0x9F4E, 0x9F47, 0x8F2F, 0x9F6F, 0xBF58, + 0xDFAE, 0xBF4C, 0xDFA7, 0xBF46, 0xBF43, 0x9F2E, 0xBF6E, 0x9F27, 0xBF67, 0xBF2C, + 0xDF97, 0xBF26, 0xBF23, 0x9F17, 0xBF37, 0xBF16, 0xBF13, 0x87AF, 0x8FAE, 0x8FA7, + 0x9FAC, 0xCFD7, 0x9FA6, 0x9FA3, 0x8F97, 0x9FB7, 0x9F96, 0x9F93, 0xD5F0, 0xEAFC, + 0xA9E0, 0xD4F8, 0xEA7E, 0xA8F0, 0xD47C, 0xEA3F, 0xA878, 0xD43E, 0xA83C, 0xFD68, + 0xADF0, 0xD6FC, 0xFD64, 0xACF8, 0xD67E, 0xFD62, 0xAC7C, 0xD63F, 0xFD61, 0xAC3E, + 0xFAE8, 0xFD76, 0xAEFC, 0xFAE4, 0xFD73, 0xAE7E, 0xFAE2, 0xAE3F, 0xFAE1, 0xF5E8, + 0xFAF6, 0xF5E4, 0xFAF3, 0xF5E2, 0xF5E1, 0xEBE8, 0xF5F6, 0xEBE4, 0xF5F3, 0xEBE2, + 0xEBE1, 0xD7E8, 0xEBF6, 0xD7E4, 0xEBF3, 0xD7E2, 0xA5E0, 0xD2F8, 0xE97E, 0xA4F0, + 0xD27C, 0xE93F, 0xA478, 0xD23E, 0xA43C, 0xD21F, 0xA41E, 0xFD34, 0xA6F8, 0xD37E, + 0xFD32, 0xA67C, 0xD33F, 0xFD31, 0xA63E, 0xA61F, 0xFA74, 0xFD3B, 0xA77E, 0xFA72, + 0xA73F, 0xFA71, 0xF4F4, 0xFA7B, 0xF4F2, 0xF4F1, 0xE9F4, 0xF4FB, 0xE9F2, 0xE9F1, + 0xD3F4, 0xE9FB, 0xD3F2, 0xD3F1, 0xA2F0, 0xD17C, 0xE8BF, 0xA278, 0xD13E, 0xA23C, + 0xD11F, 0xA21E, 0xA20F, 0xFD1A, 0xA37C, 0xD1BF, 0xFD19, 0xA33E, 0xA31F, 0xFA3A, + 0xA3BF, 0xFA39, 0xF47A, 0xF479, 0xE8FA, 0xE8F9, 0xD1FA, 0xD1F9, 0xA178, 0xD0BE, + 0xA13C, 0xD09F, 0xA11E, 0xA10F, 0xFD0D, 0xA1BE, 0xA19F, 0xFA1D, 0xF43D, 0xE87D, + 0xA0BC, 0xD05F, 0xA09E, 0xA08F, 0xA0DF, 0xA05E, 0xA04F, 0x95E0, 0xCAF8, 0xE57E, + 0x94F0, 0xCA7C, 0xE53F, 0x9478, 0xCA3E, 0x943C, 0xCA1F, 0x941E, 0xFCB4, 0x96F8, + 0xCB7E, 0xFCB2, 0x967C, 0xCB3F, 0xFCB1, 0x963E, 0x961F, 0xF974, 0xFCBB, 0x977E, + 0xF972, 0x973F, 0xF971, 0xF2F4, 0xF97B, 0xF2F2, 0xF2F1, 0xE5F4, 0xF2FB, 0xE5F2, + 0xE5F1, 0xCBF4, 0xE5FB, 0xCBF2, 0xCBF1, 0xDAF0, 0xED7C, 0xF6BF, 0xB4E0, 0xDA78, + 0xED3E, 0xB470, 0xDA3C, 0xED1F, 0xB438, 0xDA1E, 0xB41C, 0xDA0F, 0xB40E, 0x92F0, + 0xC97C, 0xE4BF, 0xB6F0, 0x9278, 0xC93E, 0xB678, 0xDB3E, 0xC91F, 0xB63C, 0x921E, + 0xB61E, 0x920F, 0xB60F, 0xFC9A, 0x937C, 0xC9BF, 0xFDBA, 0xFC99, 0xB77C, 0x933E, + 0xFDB9, 0xB73E, 0x931F, 0xB71F, 0xF93A, 0x93BF, 0xFB7A, 0xF939, 0xB7BF, 0xFB79, + 0xF27A, 0xF6FA, 0xF279, 0xF6F9, 0xE4FA, 0xEDFA, 0xE4F9, 0xEDF9, 0xC9FA, 0xC9F9, + 0xB2E0, 0xD978, 0xECBE, 0xB270, 0xD93C, 0xEC9F, 0xB238, 0xD91E, 0xB21C, 0xD90F, + 0xB20E, 0xB207, 0x9178, 0xC8BE, 0xB378, 0x913C, 0xC89F, 0xB33C, 0xD99F, 0xB31E, + 0x910F, 0xB30F, 0xFC8D, 0x91BE, 0xFD9D, 0xB3BE, 0x919F, 0xB39F, 0xF91D, 0xFB3D, + 0xF23D, 0xF67D, 0xE47D, 0xECFD, 0xC8FD, 0xB170, 0xD8BC, 0xEC5F, 0xB138, 0xD89E, + 0xB11C, 0xD88F, 0xB10E, 0xB107, 0x90BC, 0xC85F, 0xB1BC, 0x909E, 0xB19E, 0x908F, + 0xB18F, 0x90DF, 0xB1DF, 0xB0B8, 0xD85E, 0xB09C, 0xD84F, 0xB08E, 0xB087, 0x905E, + 0xB0DE, 0x904F, 0xB0CF, 0xB05C, 0xD82F, 0xB04E, 0xB047, 0x902F, 0xB06F, 0xB02E, + 0xB027, 0x8AF0, 0xC57C, 0xE2BF, 0x8A78, 0xC53E, 0x8A3C, 0xC51F, 0x8A1E, 0x8A0F, + 0xFC5A, 0x8B7C, 0xC5BF, 0xFC59, 0x8B3E, 0x8B1F, 0xF8BA, 0x8BBF, 0xF8B9, 0xF17A, + 0xF179, 0xE2FA, 0xE2F9, 0xC5FA, 0xC5F9, 0x9AE0, 0xCD78, 0xE6BE, 0x9A70, 0xCD3C, + 0xE69F, 0x9A38, 0xCD1E, 0x9A1C, 0xCD0F, 0x9A0E, 0x9A07, 0x8978, 0xC4BE, 0x9B78, + 0x893C, 0xC49F, 0x9B3C, 0xCD9F, 0x9B1E, 0x890F, 0x9B0F, 0xFC4D, 0x89BE, 0xFCDD, + 0x9BBE, 0x899F, 0x9B9F, 0xF89D, 0xF9BD, 0xF13D, 0xF37D, 0xE27D, 0xE6FD, 0xC4FD, + 0xDD70, 0xEEBC, 0xF75F, 0xBA60, 0xDD38, 0xEE9E, 0xBA30, 0xDD1C, 0xEE8F, 0xBA18, + 0xDD0E, 0xBA0C, 0xDD07, 0xBA06, 0x9970, 0xCCBC, 0xE65F, 0xBB70, 0x9938, 0xCC9E, + 0xBB38, 0xDD9E, 0xCC8F, 0xBB1C, 0x990E, 0xBB0E, 0x9907, 0xBB07, 0x88BC, 0xC45F, + 0x99BC, 0x889E, 0xBBBC, 0x999E, 0x888F, 0xBB9E, 0x998F, 0xBB8F, 0x88DF, 0x99DF, + 0xBBDF, 0xB960, 0xDCB8, 0xEE5E, 0xB930, 0xDC9C, 0xEE4F, 0xB918, 0xDC8E, 0xB90C, + 0xDC87, 0xB906, 0xB903, 0x98B8, 0xCC5E, 0xB9B8, 0x989C, 0xCC4F, 0xB99C, 0xDCCF, + 0xB98E, 0x9887, 0xB987, 0x885E, 0x98DE, 0x884F, 0xB9DE, 0x98CF, 0xB9CF, 0xB8B0, + 0xDC5C, 0xEE2F, 0xB898, 0xDC4E, 0xB88C, 0xDC47, 0xB886, 0xB883, 0x985C, 0xCC2F, + 0xB8DC, 0x984E, 0xB8CE, 0x9847, 0xB8C7, 0x882F, 0x986F, 0xB8EF, 0xB858, 0xDC2E, + 0xB84C, 0xDC27, 0xB846, 0xB843, 0x982E, 0xB86E, 0x9827, 0xB867, 0xB82C, 0xDC17, + 0xB826, 0xB823, 0x9817, 0xB837, 0xB816, 0xB813, 0x8578, 0xC2BE, 0x853C, 0xC29F, + 0x851E, 0x850F, 0x85BE, 0x859F, 0xF85D, 0xF0BD, 0xE17D, 0xC2FD, 0x8D70, 0xC6BC, + 0xE35F, 0x8D38, 0xC69E, 0x8D1C, 0xC68F, 0x8D0E, 0x8D07, 0x84BC, 0xC25F, 0x8DBC, + 0x849E, 0x8D9E, 0x848F, 0x8D8F, 0x84DF, 0x8DDF, 0x9D60, 0xCEB8, 0xE75E, 0x9D30, + 0xCE9C, 0xE74F, 0x9D18, 0xCE8E, 0x9D0C, 0xCE87, 0x9D06, 0x9D03, 0x8CB8, 0xC65E, + 0x9DB8, 0x8C9C, 0xC64F, 0x9D9C, 0x8C8E, 0x9D8E, 0x8C87, 0x9D87, 0x845E, 0x8CDE, + 0x844F, 0x9DDE, 0x8CCF, 0x9DCF, 0xDEB0, 0xEF5C, 0xF7AF, 0xBD20, 0xDE98, 0xEF4E, + 0xBD10, 0xDE8C, 0xEF47, 0xBD08, 0xDE86, 0xBD04, 0xDE83, 0xBD02, 0x9CB0, 0xCE5C, + 0xE72F, 0xBDB0, 0x9C98, 0xCE4E, 0xBD98, 0xDECE, 0xCE47, 0xBD8C, 0x9C86, 0xBD86, + 0x9C83, 0xBD83, 0x8C5C, 0xC62F, 0x9CDC, 0x8C4E, 0xBDDC, 0x9CCE, 0x8C47, 0xBDCE, + 0x9CC7, 0xBDC7, 0x842F, 0x8C6F, 0x9CEF, 0xBDEF, 0xBCA0, 0xDE58, 0xEF2E, 0xBC90, + 0xDE4C, 0xEF27, 0xBC88, 0xDE46, 0xBC84, 0xDE43, 0xBC82, 0xBC81, 0x9C58, 0xCE2E, + 0xBCD8, 0x9C4C, 0xCE27, 0xBCCC, 0xDE67, 0xBCC6, 0x9C43, 0xBCC3, 0x8C2E, 0x9C6E, + 0x8C27, 0xBCEE, 0x9C67, 0xBCE7, 0xBC50, 0xDE2C, 0xEF17, 0xBC48, 0xDE26, 0xBC44, + 0xDE23, 0xBC42, 0xBC41, 0x9C2C, 0xCE17, 0xBC6C, 0x9C26, 0xBC66, 0x9C23, 0xBC63, + 0x8C17, 0x9C37, 0xBC77, 0xBC28, 0xDE16, 0xBC24, 0xDE13, 0xBC22, 0xBC21, 0x9C16, + 0xBC36, 0x9C13, 0xBC33, 0xBC14, 0xDE0B, 0xBC12, 0xBC11, 0x9C0B, 0xBC1B, 0x82BC, + 0xC15F, 0x829E, 0x828F, 0x82DF, 0x86B8, 0xC35E, 0x869C, 0xC34F, 0x868E, 0x8687, + 0x825E, 0x86DE, 0x824F, 0x86CF, 0x8EB0, 0xC75C, 0xE3AF, 0x8E98, 0xC74E, 0x8E8C, + 0xC747, 0x8E86, 0x8E83, 0x865C, 0xC32F, 0x8EDC, 0x864E, 0x8ECE, 0x8647, 0x8EC7, + 0x822F, 0x866F, 0x8EEF, 0x9EA0, 0xCF58, 0xE7AE, 0x9E90, 0xCF4C, 0xE7A7, 0x9E88, + 0xCF46, 0x9E84, 0xCF43, 0x9E82, 0x9E81, 0x8E58, 0xC72E, 0x9ED8, 0x8E4C, 0xC727, + 0x9ECC, 0xCF67, 0x9EC6, 0x8E43, 0x9EC3, 0x862E, 0x8E6E, 0x8627, 0x9EEE, 0x8E67, + 0x9EE7, 0xDF50, 0xEFAC, 0xF7D7, 0xDF48, 0xEFA6, 0xDF44, 0xEFA3, 0xDF42, 0xDF41, + 0x9E50, 0xCF2C, 0xE797, 0xBED0, 0x9E48, 0xCF26, 0xBEC8, 0xDF66, 0xCF23, 0xBEC4, + 0x9E42, 0xBEC2, 0x9E41, 0xBEC1, 0x8E2C, 0xC717, 0x9E6C, 0x8E26, 0xBEEC, 0x9E66, + 0x8E23, 0xBEE6, 0x9E63, 0xBEE3, 0x8617, 0x8E37, 0x9E77, 0xBEF7, 0xDF28, 0xEF96, + 0xDF24, 0xEF93, 0xDF22, 0xDF21, 0x9E28, 0xCF16, 0xBE68, 0x9E24, 0xCF13, 0xBE64, + 0xDF33, 0xBE62, 0x9E21, 0xBE61, 0x8E16, 0x9E36, 0x8E13, 0xBE76, 0x9E33, 0xBE73, + 0xDF14, 0xEF8B, 0xDF12, 0xDF11, 0x9E14, 0xCF0B, 0xBE34, 0x9E12, 0xBE32, 0x9E11, + 0xBE31, 0x8E0B, 0x9E1B, 0xBE3B, 0xDF0A, 0xDF09, 0x9E0A, 0xBE1A, 0x9E09, 0xBE19, + 0x815E, 0x814F, 0x835C, 0xC1AF, 0x834E, 0x8347, 0x812F, 0x836F, 0x8758, 0xC3AE, + 0x874C, 0xC3A7, 0x8746, 0x8743, 0x832E, 0x876E, 0x8327, 0x8767, 0x8F50, 0xC7AC, + 0xE3D7, 0x8F48, 0xC7A6, 0x8F44, 0xC7A3, 0x8F42, 0x8F41, 0x872C, 0xC397, 0x8F6C, + 0xC7B7, 0x8F66, 0x8723, 0x8F63, 0x8317, 0x8737, 0x8F77, 0xCFA8, 0xE7D6, 0xCFA4, + 0xE7D3, 0xCFA2, 0xCFA1, 0x8F28, 0xC796, 0x9F68, 0xCFB6, 0xC793, 0x9F64, 0x8F22, + 0x9F62, 0x8F21, 0x9F61, 0x8716, 0x8F36, 0x8713, 0x9F76, 0x8F33, 0x9F73, 0xEFD4, + 0xF7EB, 0xEFD2, 0xEFD1, 0xCF94, 0xE7CB, 0xDFB4, 0xCF92, 0xDFB2, 0xCF91, 0xDFB1, + 0x8F14, 0xC78B, 0x9F34, 0x8F12, 0xBF74, 0x9F32, 0x8F11, 0xBF72, 0x9F31, 0xBF71, + 0x870B, 0x8F1B, 0x9F3B, 0xBF7B, 0xEFCA, 0xEFC9, 0xCF8A, 0xDF9A, 0xCF89, 0xDF99, + 0x8F0A, 0x9F1A, 0x8F09, 0xBF3A, 0x9F19, 0xBF39, 0xEFC5, 0xCF85, 0xDF8D, 0x8F05, + 0x9F0D, 0xBF1D, 0x81AE, 0x81A7, 0x83AC, 0xC1D7, 0x83A6, 0x83A3, 0x8197, 0x83B7, + 0x87A8, 0xC3D6, 0x87A4, 0xC3D3, 0x87A2, 0x87A1, 0x8396, 0x87B6, 0x8393, 0x87B3, + 0xC7D4, 0xE3EB, 0xC7D2, 0xC7D1, 0x8794, 0xC3CB, 0x8FB4, 0xC7DB, 0x8FB2, 0x8791, + 0x8FB1, 0x838B, 0x879B, 0x8FBB, 0xE7EA, 0xE7E9, 0xC7CA, 0xCFDA, 0xC7C9, 0xCFD9, + 0x878A, 0x8F9A, 0x8789, 0x9FBA, 0x8F99, 0x9FB9, 0xE7E5, 0xC7C5, 0xCFCD, 0x8785, + 0x8F8D, 0x9F9D, 0x81D6, 0x81D3, 0x83D4, 0xC1EB, 0x83D2, 0x83D1, 0x81CB, 0x83DB, + 0xC3EA, 0xC3E9, 0x83CA, 0x87DA, 0x83C9, 0x87D9, 0xE3F5 +}; + +/* MicroPDF417 coefficients from ISO/IEC 24728:2006 Annex F */ +static const unsigned short int Microcoeffs[344] = { + /* k = 7 */ + 76, 925, 537, 597, 784, 691, 437, + + /* k = 8 */ + 237, 308, 436, 284, 646, 653, 428, 379, + + /* k = 9 */ + 567, 527, 622, 257, 289, 362, 501, 441, 205, + + /* k = 10 */ + 377, 457, 64, 244, 826, 841, 818, 691, 266, 612, + + /* k = 11 */ + 462, 45, 565, 708, 825, 213, 15, 68, 327, 602, 904, + + /* k = 12 */ + 597, 864, 757, 201, 646, 684, 347, 127, 388, 7, 69, 851, + + /* k = 13 */ + 764, 713, 342, 384, 606, 583, 322, 592, 678, 204, 184, 394, 692, + + /* k = 14 */ + 669, 677, 154, 187, 241, 286, 274, 354, 478, 915, 691, 833, 105, 215, + + /* k = 15 */ + 460, 829, 476, 109, 904, 664, 230, 5, 80, 74, 550, 575, 147, 868, 642, + + /* k = 16 */ + 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65, + + /* k = 18 */ + 279, 577, 315, 624, 37, 855, 275, 739, 120, 297, 312, 202, 560, 321, 233, 756, + 760, 573, + + /* k = 21 */ + 108, 519, 781, 534, 129, 425, 681, 553, 422, 716, 763, 693, 624, 610, 310, 691, + 347, 165, 193, 259, 568, + + /* k = 26 */ + 443, 284, 887, 544, 788, 93, 477, 760, 331, 608, 269, 121, 159, 830, 446, 893, + 699, 245, 441, 454, 325, 858, 131, 847, 764, 169, + + /* k = 32 */ + 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517, + 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410, + + /* k = 38 */ + 234, 228, 438, 848, 133, 703, 529, 721, 788, 322, 280, 159, 738, 586, 388, 684, + 445, 680, 245, 595, 614, 233, 812, 32, 284, 658, 745, 229, 95, 689, 920, 771, + 554, 289, 231, 125, 117, 518, + + /* k = 44 */ + 476, 36, 659, 848, 678, 64, 764, 840, 157, 915, 470, 876, 109, 25, 632, 405, + 417, 436, 714, 60, 376, 97, 413, 706, 446, 21, 3, 773, 569, 267, 272, 213, + 31, 560, 231, 758, 103, 271, 572, 436, 339, 730, 82, 285, + + /* k = 50 */ + 923, 797, 576, 875, 156, 706, 63, 81, 257, 874, 411, 416, 778, 50, 205, 303, + 188, 535, 909, 155, 637, 230, 534, 96, 575, 102, 264, 233, 919, 593, 865, 26, + 579, 623, 766, 146, 10, 739, 246, 127, 71, 244, 211, 477, 920, 876, 427, 820, + 718, 435 +}; + +/* rows, columns, error codewords, k-offset of valid MicroPDF417 sizes from ISO/IEC 24728:2006 */ +static const unsigned short int MicroVariants[170] ={ + 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 11, 14, 17, 20, 24, 28, 8, 11, 14, 17, 20, 23, 26, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44, 4, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44, + 7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 11, 13, 15, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50, 8, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50, + 0, 0, 0, 7, 7, 7, 7, 15, 15, 24, 34, 57, 84, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294, 7, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294 +}; +/* rows, columns, error codewords, k-offset */ + +/* following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24728:2006 tables 10, 11 and 12 */ +static const char RAPTable[136] ={ + 1, 8, 36, 19, 9, 25, 1, 1, 8, 36, 19, 9, 27, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1, 47, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25, 19, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25, + 9, 8, 36, 19, 17, 33, 1, 9, 8, 36, 19, 17, 35, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49, 43, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49, + 0, 3, 6, 0, 6, 0, 0, 0, 3, 6, 0, 6, 6, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0, 3, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0 +}; + +/* Left and Right Row Address Pattern from Table 2 */ +static const unsigned short int rap_side[52] = { + 0x322, 0x3A2, 0x3B2, 0x332, 0x372, 0x37A, 0x33A, 0x3BA, 0x39A, 0x3DA, + 0x3CA, 0x38A, 0x30A, 0x31A, 0x312, 0x392, 0x3D2, 0x3D6, 0x3D4, 0x394, + 0x3B4, 0x3A4, 0x3A6, 0x3AE, 0x3AC, 0x3A8, 0x328, 0x32C, 0x32E, 0x326, + 0x336, 0x3B6, 0x396, 0x316, 0x314, 0x334, 0x374, 0x364, 0x366, 0x36E, + 0x36C, 0x368, 0x348, 0x358, 0x35C, 0x35E, 0x34E, 0x34C, 0x344, 0x346, + 0x342, 0x362 +}; + +/* Centre Row Address Pattern from Table 2 */ +static const unsigned short int rap_centre[52] = { + 0x2CE, 0x24E, 0x26E, 0x22E, 0x226, 0x236, 0x216, 0x212, 0x21A, 0x23A, + 0x232, 0x222, 0x262, 0x272, 0x27A, 0x2FA, 0x2F2, 0x2F6, 0x276, 0x274, + 0x264, 0x266, 0x246, 0x242, 0x2C2, 0x2E2, 0x2E6, 0x2E4, 0x2EC, 0x26C, + 0x22C, 0x228, 0x268, 0x2E8, 0x2C8, 0x2CC, 0x2C4, 0x2C6, 0x286, 0x28E, + 0x28C, 0x29C, 0x298, 0x2B8, 0x2B0, 0x290, 0x2D0, 0x250, 0x258, 0x25C, + 0x2DC, 0x2DE +}; + +void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block); \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/plessey.c b/3rdparty/zint-2.6.1/backend/plessey.c new file mode 100644 index 0000000..1154845 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/plessey.c @@ -0,0 +1,492 @@ +/* plessey.c - Handles Plessey and MSI Plessey */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include "common.h" + + +#define SSET "0123456789ABCDEF" +static const char *PlessTable[16] = { + "13131313", "31131313", "13311313", "31311313", "13133113", "31133113", + "13313113", "31313113", "13131331", "31131331", "13311331", "31311331", "13133131", + "31133131", "13313131", "31313131" +}; + +static const char *MSITable[10] = { + "12121212", "12121221", "12122112", "12122121", "12211212", "12211221", + "12212112", "12212121", "21121212", "21121221" +}; + +/* Not MSI/Plessey but the older Plessey standard */ +int plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length) { + + unsigned int i, check; + unsigned char *checkptr; + static const char grid[9] = {1, 1, 1, 1, 0, 1, 0, 0, 1}; + char dest[1024]; /* 8 + 65 * 8 + 8 * 2 + 9 + 1 ~ 1024 */ + int error_number; + + if (length > 65) { + strcpy(symbol->errtxt, "370: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(SSET, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "371: Invalid characters in data"); + return error_number; + } + checkptr = (unsigned char *) calloc(1, length * 4 + 8); + + /* Start character */ + strcpy(dest, "31311331"); + + /* Data area */ + for (i = 0; i < length; i++) { + check = posn(SSET, source[i]); + lookup(SSET, PlessTable, source[i], dest); + checkptr[4 * i] = check & 1; + checkptr[4 * i + 1] = (check >> 1) & 1; + checkptr[4 * i + 2] = (check >> 2) & 1; + checkptr[4 * i + 3] = (check >> 3) & 1; + } + + /* CRC check digit code adapted from code by Leonid A. Broukhis + used in GNU Barcode */ + + for (i = 0; i < (4 * length); i++) { + int j; + if (checkptr[i]) + for (j = 0; j < 9; j++) + checkptr[i + j] ^= grid[j]; + } + + for (i = 0; i < 8; i++) { + switch (checkptr[length * 4 + i]) { + case 0: strcat(dest, "13"); + break; + case 1: strcat(dest, "31"); + break; + } + } + + /* Stop character */ + strcat(dest, "331311313"); + + expand(symbol, dest); + ustrcpy(symbol->text, source); + free(checkptr); + return error_number; +} + +/* Plain MSI Plessey - does not calculate any check character */ +int msi_plessey(struct zint_symbol *symbol, unsigned char source[], const size_t length) { + + size_t i; + char dest[512]; /* 2 + 55 * 8 + 3 + 1 ~ 512 */ + + if (length > 55) { + strcpy(symbol->errtxt, "372: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* start character */ + strcpy(dest, "21"); + + for (i = 0; i < length; i++) { + lookup(NEON, MSITable, source[i], dest); + } + + /* Stop character */ + strcat(dest, "121"); + + expand(symbol, dest); + ustrcpy(symbol->text, source); + return 0; +} + +/* MSI Plessey with Modulo 10 check digit - algorithm from Barcode Island + * http://www.barcodeisland.com/ */ +int msi_plessey_mod10(struct zint_symbol *symbol, unsigned char source[], int length) { + + + unsigned long i, wright, dau, pedwar, pump, n; + char un[200], tri[32]; + int error_number, h; + char dest[1000]; + + error_number = 0; + + if (length > 18) { + strcpy(symbol->errtxt, "373: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* start character */ + strcpy(dest, "21"); + + /* draw data section */ + for (i = 0; i < length; i++) { + lookup(NEON, MSITable, source[i], dest); + } + + /* calculate check digit */ + wright = 0; + n = !(length & 1); + for (i = n; i < length; i += 2) { + un[wright++] = source[i]; + } + un[wright] = '\0'; + + dau = strtoul(un, NULL, 10); + dau *= 2; + + sprintf(tri, "%ld", dau); + + pedwar = 0; + h = strlen(tri); + for (i = 0; i < h; i++) { + pedwar += ctoi(tri[i]); + } + + n = length & 1; + for (i = n; i < length; i += 2) { + pedwar += ctoi(source[i]); + } + + pump = (10 - pedwar % 10); + if (pump == 10) { + pump = 0; + } + + /* draw check digit */ + lookup(NEON, MSITable, itoc(pump), dest); + + /* Stop character */ + strcat(dest, "121"); + expand(symbol, dest); + + ustrcpy(symbol->text, source); + symbol->text[length] = itoc(pump); + symbol->text[length + 1] = '\0'; + return error_number; +} + +/* MSI Plessey with two Modulo 10 check digits - algorithm from + * Barcode Island http://www.barcodeisland.com/ */ +int msi_plessey_mod1010(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) { + + + unsigned long i, n, wright, dau, pedwar, pump, chwech; + char un[16], tri[32]; + int error_number, h; + char dest[1000]; + + error_number = 0; + + if (src_len > 18) { + /* No Entry Stack Smashers! limit because of str->number conversion*/ + strcpy(symbol->errtxt, "374: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* start character */ + strcpy(dest, "21"); + + /* draw data section */ + for (i = 0; i < src_len; i++) { + lookup(NEON, MSITable, source[i], dest); + } + + /* calculate first check digit */ + wright = 0; + + n = !(src_len & 1); + for (i = n; i < src_len; i += 2) { + un[wright++] = source[i]; + } + un[wright] = '\0'; + + dau = strtoul(un, NULL, 10); + dau *= 2; + + sprintf(tri, "%ld", dau); + + pedwar = 0; + h = strlen(tri); + for (i = 0; i < h; i++) { + pedwar += ctoi(tri[i]); + } + + n = src_len & 1; + for (i = n; i < src_len; i += 2) { + pedwar += ctoi(source[i]); + } + + pump = 10 - pedwar % 10; + if (pump == 10) { + pump = 0; + } + + /* calculate second check digit */ + wright = 0; + n = src_len & 1; + for (i = n; i < src_len; i += 2) { + un[wright++] = source[i]; + } + un[wright++] = itoc(pump); + un[wright] = '\0'; + + dau = strtoul(un, NULL, 10); + dau *= 2; + + sprintf(tri, "%ld", dau); + + pedwar = 0; + h = strlen(tri); + for (i = 0; i < h; i++) { + pedwar += ctoi(tri[i]); + } + + + i = !(src_len & 1); + for (; i < src_len; i += 2) { + pedwar += ctoi(source[i]); + } + + chwech = 10 - pedwar % 10; + if (chwech == 10) { + chwech = 0; + } + + /* Draw check digits */ + lookup(NEON, MSITable, itoc(pump), dest); + lookup(NEON, MSITable, itoc(chwech), dest); + + /* Stop character */ + strcat(dest, "121"); + + expand(symbol, dest); + + ustrcpy(symbol->text, source); + symbol->text[src_len] = itoc(pump); + symbol->text[src_len + 1] = itoc(chwech); + symbol->text[src_len + 2] = '\0'; + + return error_number; +} + +/* Calculate a Modulo 11 check digit using the system discussed on Wikipedia - + see http://en.wikipedia.org/wiki/Talk:MSI_Barcode */ +int msi_plessey_mod11(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) { + /* uses the IBM weight system */ + int i, weight, x, check; + int error_number; + char dest[1000]; + + error_number = 0; + + if (src_len > 55) { + strcpy(symbol->errtxt, "375: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* start character */ + strcpy(dest, "21"); + + /* draw data section */ + for (i = 0; i < src_len; i++) { + lookup(NEON, MSITable, source[i], dest); + } + + /* calculate check digit */ + x = 0; + weight = 2; + for (i = src_len - 1; i >= 0; i--) { + x += weight * ctoi(source[i]); + weight++; + if (weight > 7) { + weight = 2; + } + } + + check = (11 - (x % 11)) % 11; + if (check == 10) { + lookup(NEON, MSITable, '1', dest); + lookup(NEON, MSITable, '0', dest); + } else { + lookup(NEON, MSITable, itoc(check), dest); + } + + /* stop character */ + strcat(dest, "121"); + + expand(symbol, dest); + + ustrcpy(symbol->text, source); + if (check == 10) { + strcat((char*) symbol->text, "10"); + } else { + symbol->text[src_len] = itoc(check); + symbol->text[src_len + 1] = '\0'; + } + + return error_number; +} + +/* Combining the Barcode Island and Wikipedia code + * Verified against http://www.bokai.com/BarcodeJSP/applet/BarcodeSampleApplet.htm */ +int msi_plessey_mod1110(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) { + /* Weighted using the IBM system */ + unsigned long i, weight, x, check, wright, dau, pedwar, pump; + size_t h; + long si; + char un[16], tri[16]; + int error_number; + char dest[1000]; + unsigned char temp[32]; + unsigned int temp_len; + + error_number = 0; + + if (src_len > 18) { + strcpy(symbol->errtxt, "376: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* start character */ + strcpy(dest, "21"); + + /* draw data section */ + for (i = 0; i < src_len; i++) { + lookup(NEON, MSITable, source[i], dest); + } + + /* calculate first (mod 11) digit */ + x = 0; + weight = 2; + for (si = src_len - 1; si >= 0; si--) { + x += weight * ctoi(source[si]); + weight++; + if (weight > 7) { + weight = 2; + } + } + + check = (11 - (x % 11)) % 11; + ustrcpy(temp, source); + temp_len = src_len; + if (check == 10) { + lookup(NEON, MSITable, '1', dest); + lookup(NEON, MSITable, '0', dest); + strcat((char*) temp, "10"); + temp_len += 2; + } else { + lookup(NEON, MSITable, itoc(check), dest); + temp[temp_len++] = itoc(check); + temp[temp_len] = '\0'; + } + + /* calculate second (mod 10) check digit */ + wright = 0; + i = !(temp_len & 1); + for (; i < temp_len; i += 2) { + un[wright++] = temp[i]; + } + un[wright] = '\0'; + + dau = strtoul(un, NULL, 10); + dau *= 2; + + sprintf(tri, "%ld", dau); + + pedwar = 0; + h = strlen(tri); + for (i = 0; i < h; i++) { + pedwar += ctoi(tri[i]); + } + + i = temp_len & 1; + for (; i < temp_len; i += 2) { + pedwar += ctoi(temp[i]); + } + + pump = 10 - pedwar % 10; + if (pump == 10) { + pump = 0; + } + + /* draw check digit */ + lookup(NEON, MSITable, itoc(pump), dest); + + /* stop character */ + strcat(dest, "121"); + expand(symbol, dest); + + temp[temp_len++] = itoc(pump); + temp[temp_len] = '\0'; + + + ustrcpy(symbol->text, temp); + return error_number; +} + +int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length) { + int error_number; + + error_number = is_sane(NEON, source, length); + if (error_number != 0) { + strcpy(symbol->errtxt, "377: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + + + if ((symbol->option_2 < 0) || (symbol->option_2 > 4)) { + symbol->option_2 = 0; + } + + switch (symbol->option_2) { + case 0: error_number = msi_plessey(symbol, source, length); + break; + case 1: error_number = msi_plessey_mod10(symbol, source, length); + break; + case 2: error_number = msi_plessey_mod1010(symbol, source, length); + break; + case 3: error_number = msi_plessey_mod11(symbol, source, length); + break; + case 4: error_number = msi_plessey_mod1110(symbol, source, length); + break; + } + + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/png.c b/3rdparty/zint-2.6.1/backend/png.c new file mode 100644 index 0000000..a726d51 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/png.c @@ -0,0 +1,191 @@ +/* png.c - Handles output to PNG file */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#ifdef _MSC_VER +#include +#include +#include +#endif +#include +#include +#include "common.h" + +#ifndef NO_PNG +#include +#include +#include + +#define SSET "0123456789ABCDEF" + +struct mainprog_info_type { + long width; + long height; + FILE *outfile; + jmp_buf jmpbuf; +}; + +static void writepng_error_handler(png_structp png_ptr, png_const_charp msg) { + struct mainprog_info_type *graphic; + + fprintf(stderr, "writepng libpng error: %s (F30)\n", msg); + fflush(stderr); + + graphic = (struct mainprog_info_type*) png_get_error_ptr(png_ptr); + if (graphic == NULL) { + /* we are completely hosed now */ + fprintf(stderr, + "writepng severe error: jmpbuf not recoverable; terminating. (F31)\n"); + fflush(stderr); + return; + } + longjmp(graphic->jmpbuf, 1); +} + +int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) { + struct mainprog_info_type wpng_info; + struct mainprog_info_type *graphic; + png_structp png_ptr; + png_infop info_ptr; + unsigned char *image_data; + int i, row, column; + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + +#ifndef _MSC_VER + unsigned char outdata[symbol->bitmap_width * 3]; +#else + unsigned char* outdata = (unsigned char*) _alloca(symbol->bitmap_width * 3); +#endif + + graphic = &wpng_info; + + graphic->width = symbol->bitmap_width; + graphic->height = symbol->bitmap_height; + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + /* Open output file in binary mode */ + if (symbol->output_options & BARCODE_STDOUT) { +#ifdef _MSC_VER + if (-1 == _setmode(_fileno(stdout), _O_BINARY)) { + strcpy(symbol->errtxt, "631: Can't open output file"); + return ZINT_ERROR_FILE_ACCESS; + } +#endif + graphic->outfile = stdout; + } else { + if (!(graphic->outfile = fopen(symbol->outfile, "wb"))) { + strcpy(symbol->errtxt, "632: Can't open output file"); + return ZINT_ERROR_FILE_ACCESS; + } + } + + /* Set up error handling routine as proc() above */ + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, graphic, writepng_error_handler, NULL); + if (!png_ptr) { + strcpy(symbol->errtxt, "633: Out of memory"); + return ZINT_ERROR_MEMORY; + } + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) { + png_destroy_write_struct(&png_ptr, NULL); + strcpy(symbol->errtxt, "634: Out of memory"); + return ZINT_ERROR_MEMORY; + } + + /* catch jumping here */ + if (setjmp(graphic->jmpbuf)) { + png_destroy_write_struct(&png_ptr, &info_ptr); + strcpy(symbol->errtxt, "635: libpng error occurred"); + return ZINT_ERROR_MEMORY; + } + + /* open output file with libpng */ + png_init_io(png_ptr, graphic->outfile); + + /* set compression */ + png_set_compression_level(png_ptr, 9); + + /* set Header block */ + png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height, + 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + + /* write all chunks up to (but not including) first IDAT */ + png_write_info(png_ptr, info_ptr); + + /* set up the transformations: for now, just pack low-bit-depth pixels + into bytes (one, two or four pixels per byte) */ + png_set_packing(png_ptr); + + /* Pixel Plotting */ + for (row = 0; row < symbol->bitmap_height; row++) { + for (column = 0; column < symbol->bitmap_width; column++) { + i = column * 3; + switch (*(pixelbuf + (symbol->bitmap_width * row) + column)) { + case '1': + outdata[i] = fgred; + outdata[i + 1] = fggrn; + outdata[i + 2] = fgblu; + break; + default: + outdata[i] = bgred; + outdata[i + 1] = bggrn; + outdata[i + 2] = bgblu; + break; + + } + } + /* write row contents to file */ + image_data = outdata; + png_write_row(png_ptr, image_data); + } + + /* End the file */ + png_write_end(png_ptr, NULL); + + /* make sure we have disengaged */ + if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr); + if (symbol->output_options & BARCODE_STDOUT) { + fflush(wpng_info.outfile); + } else { + fclose(wpng_info.outfile); + } + return 0; +} +#endif /* NO_PNG */ diff --git a/3rdparty/zint-2.6.1/backend/postal.c b/3rdparty/zint-2.6.1/backend/postal.c new file mode 100644 index 0000000..1a8844b --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/postal.c @@ -0,0 +1,621 @@ +/* postal.c - Handles PostNet, PLANET, FIM. RM4SCC and Flattermarken */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + Including bug fixes by Bryan Hatton + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" + +#define DAFTSET "DAFT" +#define KRSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" +#define KASUTSET "1234567890-abcdefgh" +#define CHKASUTSET "0123456789-abcdefgh" +#define SHKASUTSET "1234567890-ABCDEFGHIJKLMNOPQRSTUVWXYZ" + +/* PostNet number encoding table - In this table L is long as S is short */ +static const char *PNTable[10] = { + "LLSSS", "SSSLL", "SSLSL", "SSLLS", "SLSSL", "SLSLS", "SLLSS", "LSSSL", + "LSSLS", "LSLSS" +}; + +static const char *PLTable[10] = { + "SSLLL", "LLLSS", "LLSLS", "LLSSL", "LSLLS", "LSLSL", "LSSLL", "SLLLS", + "SLLSL", "SLSLL" +}; + +static const char *RoyalValues[36] = { + "11", "12", "13", "14", "15", "10", "21", "22", "23", "24", "25", + "20", "31", "32", "33", "34", "35", "30", "41", "42", "43", "44", "45", "40", "51", "52", + "53", "54", "55", "50", "01", "02", "03", "04", "05", "00" +}; + +/* 0 = Full, 1 = Ascender, 2 = Descender, 3 = Tracker */ +static const char *RoyalTable[36] = { + "3300", "3210", "3201", "2310", "2301", "2211", "3120", "3030", "3021", + "2130", "2121", "2031", "3102", "3012", "3003", "2112", "2103", "2013", "1320", "1230", + "1221", "0330", "0321", "0231", "1302", "1212", "1203", "0312", "0303", "0213", "1122", + "1032", "1023", "0132", "0123", "0033" +}; + +static const char *FlatTable[10] = { + "0504", "18", "0117", "0216", "0315", "0414", "0513", "0612", "0711", "0810" +}; + +static const char *KoreaTable[10] = { + "1313150613", "0713131313", "0417131313", "1506131313", + "0413171313", "17171313", "1315061313", "0413131713", "17131713", "13171713" +}; + +static const char *JapanTable[19] = { + "114", "132", "312", "123", "141", "321", "213", "231", "411", "144", + "414", "324", "342", "234", "432", "243", "423", "441", "111" +}; + +/* Handles the PostNet system used for Zip codes in the US */ +int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) { + unsigned int i, sum, check_digit; + int error_number; + + error_number = 0; + + if (length > 38) { + strcpy(symbol->errtxt, "480: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "481: Invalid characters in data"); + return error_number; + } + sum = 0; + + /* start character */ + strcpy(dest, "L"); + + for (i = 0; i < length; i++) { + lookup(NEON, PNTable, source[i], dest); + sum += ctoi(source[i]); + } + + check_digit = (10 - (sum % 10)) % 10; + strcat(dest, PNTable[check_digit]); + + /* stop character */ + strcat(dest, "L"); + + return error_number; +} + +/* Puts PostNet barcodes into the pattern matrix */ +int post_plot(struct zint_symbol *symbol, unsigned char source[], int length) { + char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 + 1 ~ 256 */ + unsigned int loopey, h; + int writer; + int error_number; + + error_number = 0; + + error_number = postnet(symbol, source, height_pattern, length); + if (error_number != 0) { + return error_number; + } + + writer = 0; + h = strlen(height_pattern); + for (loopey = 0; loopey < h; loopey++) { + if (height_pattern[loopey] == 'L') { + set_module(symbol, 0, writer); + } + set_module(symbol, 1, writer); + writer += 3; + } + symbol->row_height[0] = 6; + symbol->row_height[1] = 6; + symbol->rows = 2; + symbol->width = writer - 1; + + return error_number; +} + +/* Handles the PLANET system used for item tracking in the US */ +int planet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) { + unsigned int i, sum, check_digit; + int error_number; + + error_number = 0; + + if (length > 38) { + strcpy(symbol->errtxt, "482: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "483: Invalid characters in data"); + return error_number; + } + sum = 0; + + /* start character */ + strcpy(dest, "L"); + + for (i = 0; i < length; i++) { + lookup(NEON, PLTable, source[i], dest); + sum += ctoi(source[i]); + } + + check_digit = (10 - (sum % 10)) % 10; + strcat(dest, PLTable[check_digit]); + + /* stop character */ + strcat(dest, "L"); + + return error_number; +} + +/* Puts PLANET barcodes into the pattern matrix */ +int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length) { + char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 + 1 ~ 256 */ + unsigned int loopey, h; + int writer; + int error_number; + + error_number = 0; + + error_number = planet(symbol, source, height_pattern, length); + if (error_number != 0) { + return error_number; + } + + writer = 0; + h = strlen(height_pattern); + for (loopey = 0; loopey < h; loopey++) { + if (height_pattern[loopey] == 'L') { + set_module(symbol, 0, writer); + } + set_module(symbol, 1, writer); + writer += 3; + } + symbol->row_height[0] = 6; + symbol->row_height[1] = 6; + symbol->rows = 2; + symbol->width = writer - 1; + return error_number; +} + +/* Korean Postal Authority */ +int korea_post(struct zint_symbol *symbol, unsigned char source[], int length) { + int total, loop, check, zeroes, error_number; + char localstr[8], dest[80]; + + error_number = 0; + if (length > 6) { + strcpy(symbol->errtxt, "484: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "485: Invalid characters in data"); + return error_number; + } + zeroes = 6 - length; + memset(localstr, '0', zeroes); + strcpy(localstr + zeroes, (char *) source); + + total = 0; + for (loop = 0; loop < 6; loop++) { + total += ctoi(localstr[loop]); + } + check = 10 - (total % 10); + if (check == 10) { + check = 0; + } + localstr[6] = itoc(check); + localstr[7] = '\0'; + *dest = '\0'; + for (loop = 5; loop >= 0; loop--) { + lookup(NEON, KoreaTable, localstr[loop], dest); + } + lookup(NEON, KoreaTable, localstr[6], dest); + expand(symbol, dest); + ustrcpy(symbol->text, (unsigned char*) localstr); + return error_number; +} + +/* The simplest barcode symbology ever! Supported by MS Word, so here it is! + glyphs from http://en.wikipedia.org/wiki/Facing_Identification_Mark */ +int fim(struct zint_symbol *symbol, unsigned char source[], int length) { + + + char dest[16] = {0}; + + if (length > 1) { + strcpy(symbol->errtxt, "486: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + switch ((char) source[0]) { + case 'a': + case 'A': + strcpy(dest, "111515111"); + break; + case 'b': + case 'B': + strcpy(dest, "13111311131"); + break; + case 'c': + case 'C': + strcpy(dest, "11131313111"); + break; + case 'd': + case 'D': + strcpy(dest, "1111131311111"); + break; + default: + strcpy(symbol->errtxt, "487: Invalid characters in data"); + return ZINT_ERROR_INVALID_DATA; + break; + } + + expand(symbol, dest); + return 0; +} + +/* Handles the 4 State barcodes used in the UK by Royal Mail */ +char rm4scc(char source[], unsigned char dest[], int length) { + unsigned int i; + int top, bottom, row, column, check_digit; + char values[3], set_copy[] = KRSET; + + top = 0; + bottom = 0; + + /* start character */ + strcpy((char*) dest, "1"); + + for (i = 0; i < length; i++) { + lookup(KRSET, RoyalTable, source[i], (char*) dest); + strcpy(values, RoyalValues[posn(KRSET, source[i])]); + top += ctoi(values[0]); + bottom += ctoi(values[1]); + } + + /* Calculate the check digit */ + row = (top % 6) - 1; + column = (bottom % 6) - 1; + if (row == -1) { + row = 5; + } + if (column == -1) { + column = 5; + } + check_digit = (6 * row) + column; + strcat((char*) dest, RoyalTable[check_digit]); + + /* stop character */ + strcat((char*) dest, "0"); + + return set_copy[check_digit]; +} + +/* Puts RM4SCC into the data matrix */ +int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length) { + char height_pattern[210]; + unsigned int loopey, h; + int writer; + int error_number; + strcpy(height_pattern, ""); + + error_number = 0; + + if (length > 50) { + strcpy(symbol->errtxt, "488: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + to_upper(source); + error_number = is_sane(KRSET, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "489: Invalid characters in data"); + return error_number; + } + /*check = */rm4scc((char*) source, (unsigned char*) height_pattern, length); + + writer = 0; + h = strlen(height_pattern); + for (loopey = 0; loopey < h; loopey++) { + if ((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0')) { + set_module(symbol, 0, writer); + } + set_module(symbol, 1, writer); + if ((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0')) { + set_module(symbol, 2, writer); + } + writer += 2; + } + + symbol->row_height[0] = 3; + symbol->row_height[1] = 2; + symbol->row_height[2] = 3; + symbol->rows = 3; + symbol->width = writer - 1; + + return error_number; +} + +/* Handles Dutch Post TNT KIX symbols + The same as RM4SCC but without check digit + Specification at http://www.tntpost.nl/zakelijk/klantenservice/downloads/kIX_code/download.aspx */ +int kix_code(struct zint_symbol *symbol, unsigned char source[], int length) { + char height_pattern[75], localstr[20]; + unsigned int loopey; + int writer, i, h; + int error_number; /* zeroes; */ + strcpy(height_pattern, ""); + + error_number = 0; + + if (length > 18) { + strcpy(symbol->errtxt, "490: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + to_upper(source); + error_number = is_sane(KRSET, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "491: Invalid characters in data"); + return error_number; + } + + strcpy(localstr, (char *) source); + + /* Encode data */ + for (i = 0; i < length; i++) { + lookup(KRSET, RoyalTable, localstr[i], height_pattern); + } + + writer = 0; + h = strlen(height_pattern); + for (loopey = 0; loopey < h; loopey++) { + if ((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0')) { + set_module(symbol, 0, writer); + } + set_module(symbol, 1, writer); + if ((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0')) { + set_module(symbol, 2, writer); + } + writer += 2; + } + + symbol->row_height[0] = 3; + symbol->row_height[1] = 2; + symbol->row_height[2] = 3; + symbol->rows = 3; + symbol->width = writer - 1; + + return error_number; +} + +/* Handles DAFT Code symbols */ +int daft_code(struct zint_symbol *symbol, unsigned char source[], int length) { + char height_pattern[100]; + unsigned int loopey, h; + int writer, i, error_number; + strcpy(height_pattern, ""); + + error_number = 0; + if (length > 50) { + strcpy(symbol->errtxt, "492: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + to_upper((unsigned char*) source); + error_number = is_sane(DAFTSET, (unsigned char*) source, length); + + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "493: Invalid characters in data"); + return error_number; + } + + for (i = 0; i < length; i++) { + if (source[i] == 'D') { + strcat(height_pattern, "2"); + } + if (source[i] == 'A') { + strcat(height_pattern, "1"); + } + if (source[i] == 'F') { + strcat(height_pattern, "0"); + } + if (source[i] == 'T') { + strcat(height_pattern, "3"); + } + } + + writer = 0; + h = strlen(height_pattern); + for (loopey = 0; loopey < h; loopey++) { + if ((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0')) { + set_module(symbol, 0, writer); + } + set_module(symbol, 1, writer); + if ((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0')) { + set_module(symbol, 2, writer); + } + writer += 2; + } + + symbol->row_height[0] = 3; + symbol->row_height[1] = 2; + symbol->row_height[2] = 3; + symbol->rows = 3; + symbol->width = writer - 1; + + return error_number; +} + +/* Flattermarken - Not really a barcode symbology! */ +int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length) { + int loop, error_number; + char dest[512]; /* 90 * 4 + 1 ~ */ + + error_number = 0; + + if (length > 90) { + strcpy(symbol->errtxt, "494: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "495: Invalid characters in data"); + return error_number; + } + *dest = '\0'; + for (loop = 0; loop < length; loop++) { + lookup(NEON, FlatTable, source[loop], dest); + } + + expand(symbol, dest); + return error_number; +} + +/* Japanese Postal Code (Kasutama Barcode) */ +int japan_post(struct zint_symbol *symbol, unsigned char source[], int length) { + int error_number, h; + char pattern[69]; + int writer, loopey, inter_posn, i, sum, check; + char check_char; + char inter[23]; + +#ifndef _MSC_VER + char local_source[length + 1]; +#else + char* local_source = (char*) _alloca(length + 1); +#endif + + if (length > 20) { + strcpy(symbol->errtxt, "496: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + inter_posn = 0; + error_number = 0; + + strcpy(local_source, (char*) source); + for (i = 0; i < length; i++) { + local_source[i] = source[i]; + } + to_upper((unsigned char*) local_source); + error_number = is_sane(SHKASUTSET, (unsigned char*) local_source, length); + + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "497: Invalid characters in data"); + return error_number; + } + memset(inter, 'd', 20); /* Pad character CC4 */ + inter[20] = '\0'; + + i = 0; + inter_posn = 0; + do { + if (((local_source[i] >= '0') && (local_source[i] <= '9')) || (local_source[i] == '-')) { + inter[inter_posn] = local_source[i]; + inter_posn++; + } else { + if ((local_source[i] >= 'A') && (local_source[i] <= 'J')) { + inter[inter_posn] = 'a'; + inter[inter_posn + 1] = local_source[i] - 'A' + '0'; + inter_posn += 2; + } + if ((local_source[i] >= 'K') && (local_source[i] <= 'T')) { + inter[inter_posn] = 'b'; + inter[inter_posn + 1] = local_source[i] - 'K' + '0'; + inter_posn += 2; + } + if ((local_source[i] >= 'U') && (local_source[i] <= 'Z')) { + inter[inter_posn] = 'c'; + inter[inter_posn + 1] = local_source[i] - 'U' + '0'; + inter_posn += 2; + } + } + i++; + } while ((i < length) && (inter_posn < 20)); + inter[20] = '\0'; + + strcpy(pattern, "13"); /* Start */ + + sum = 0; + for (i = 0; i < 20; i++) { + strcat(pattern, JapanTable[posn(KASUTSET, inter[i])]); + sum += posn(CHKASUTSET, inter[i]); + } + + /* Calculate check digit */ + check = 19 - (sum % 19); + if (check == 19) { + check = 0; + } + if (check <= 9) { + check_char = check + '0'; + } + if (check == 10) { + check_char = '-'; + } + if (check >= 11) { + check_char = (check - 11) + 'a'; + } + strcat(pattern, JapanTable[posn(KASUTSET, check_char)]); + + strcat(pattern, "31"); /* Stop */ + + /* Resolve pattern to 4-state symbols */ + writer = 0; + h = strlen(pattern); + for (loopey = 0; loopey < h; loopey++) { + if ((pattern[loopey] == '2') || (pattern[loopey] == '1')) { + set_module(symbol, 0, writer); + } + set_module(symbol, 1, writer); + if ((pattern[loopey] == '3') || (pattern[loopey] == '1')) { + set_module(symbol, 2, writer); + } + writer += 2; + } + + symbol->row_height[0] = 3; + symbol->row_height[1] = 2; + symbol->row_height[2] = 3; + symbol->rows = 3; + symbol->width = writer - 1; + + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/ps.c b/3rdparty/zint-2.6.1/backend/ps.c new file mode 100644 index 0000000..60b05a4 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/ps.c @@ -0,0 +1,974 @@ +/* ps.c - Post Script output */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include "common.h" + +#define SSET "0123456789ABCDEF" + +int ps_plot(struct zint_symbol *symbol) { + int i, block_width, latch, r, this_row; + float textpos, large_bar_height, preset_height, row_height, row_posn; + FILE *feps; + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper; + float cyan_ink, magenta_ink, yellow_ink, black_ink; + float cyan_paper, magenta_paper, yellow_paper, black_paper; + int error_number = 0; + int textoffset, xoffset, yoffset, textdone, main_width; + char textpart[10], addon[6]; + int large_bar_count, comp_offset; + float addon_text_posn; + float scaler = symbol->scale; + float default_text_posn; + const char *locale = NULL; +#ifndef _MSC_VER + unsigned char local_text[ustrlen(symbol->text) + 1]; +#else + unsigned char* local_text = (unsigned char*) malloc(ustrlen(symbol->text) + 1); +#endif + + row_height = 0; + textdone = 0; + main_width = symbol->width; + strcpy(addon, ""); + comp_offset = 0; + addon_text_posn = 0.0; + + if (symbol->show_hrt != 0) { + /* Copy text from symbol */ + ustrcpy(local_text, symbol->text); + } else { + /* No text needed */ + switch (symbol->symbology) { + case BARCODE_EANX: + case BARCODE_EANX_CC: + case BARCODE_ISBNX: + case BARCODE_UPCA: + case BARCODE_UPCE: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + /* For these symbols use dummy text to ensure formatting is done + * properly even if no text is required */ + for (i = 0; i < ustrlen(symbol->text); i++) { + if (symbol->text[i] == '+') { + local_text[i] = '+'; + } else { + local_text[i] = ' '; + } + local_text[ustrlen(symbol->text)] = '\0'; + } + break; + default: + /* For everything else, just remove the text */ + local_text[0] = '\0'; + break; + } + } + + if (symbol->output_options & BARCODE_STDOUT) { + feps = stdout; + } else { + feps = fopen(symbol->outfile, "w"); + } + if (feps == NULL) { + strcpy(symbol->errtxt, "645: Could not open output file"); +#ifdef _MSC_VER + free(local_text); +#endif + return ZINT_ERROR_FILE_ACCESS; + } + + /* sort out colour options */ + to_upper((unsigned char*) symbol->fgcolour); + to_upper((unsigned char*) symbol->bgcolour); + + if (strlen(symbol->fgcolour) != 6) { + strcpy(symbol->errtxt, "646: Malformed foreground colour target"); + fclose(feps); +#ifdef _MSC_VER + free(local_text); +#endif + return ZINT_ERROR_INVALID_OPTION; + } + if (strlen(symbol->bgcolour) != 6) { + strcpy(symbol->errtxt, "647: Malformed background colour target"); + fclose(feps); +#ifdef _MSC_VER + free(local_text); +#endif + return ZINT_ERROR_INVALID_OPTION; + } + error_number = is_sane(SSET, (unsigned char*) symbol->fgcolour, strlen(symbol->fgcolour)); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "648: Malformed foreground colour target"); + fclose(feps); +#ifdef _MSC_VER + free(local_text); +#endif + return ZINT_ERROR_INVALID_OPTION; + } + error_number = is_sane(SSET, (unsigned char*) symbol->bgcolour, strlen(symbol->bgcolour)); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "649: Malformed background colour target"); + fclose(feps); +#ifdef _MSC_VER + free(local_text); +#endif + return ZINT_ERROR_INVALID_OPTION; + } + locale = setlocale(LC_ALL, "C"); + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + red_ink = fgred / 256.0; + green_ink = fggrn / 256.0; + blue_ink = fgblu / 256.0; + red_paper = bgred / 256.0; + green_paper = bggrn / 256.0; + blue_paper = bgblu / 256.0; + + /* Convert RGB to CMYK */ + if (red_ink > green_ink) { + if (blue_ink > red_ink) { + black_ink = 1 - blue_ink; + } else { + black_ink = 1 - red_ink; + } + } else { + if (blue_ink > red_ink) { + black_ink = 1 - blue_ink; + } else { + black_ink = 1 - green_ink; + } + } + if (black_ink < 1.0) { + cyan_ink = (1 - red_ink - black_ink) / (1 - black_ink); + magenta_ink = (1 - green_ink - black_ink) / (1 - black_ink); + yellow_ink = (1 - blue_ink - black_ink) / (1 - black_ink); + } else { + cyan_ink = 0.0; + magenta_ink = 0.0; + yellow_ink = 0.0; + } + + if (red_paper > green_paper) { + if (blue_paper > red_paper) { + black_paper = 1 - blue_paper; + } else { + black_paper = 1 - red_paper; + } + } else { + if (blue_paper > red_paper) { + black_paper = 1 - blue_paper; + } else { + black_paper = 1 - green_paper; + } + } + if (black_paper < 1.0) { + cyan_paper = (1 - red_paper - black_paper) / (1 - black_paper); + magenta_paper = (1 - green_paper - black_paper) / (1 - black_paper); + yellow_paper = (1 - blue_paper - black_paper) / (1 - black_paper); + } else { + cyan_paper = 0.0; + magenta_paper = 0.0; + yellow_paper = 0.0; + } + + if (symbol->height == 0) { + symbol->height = 50; + } + + large_bar_count = 0; + preset_height = 0.0; + for (i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if (symbol->row_height[i] == 0) { + large_bar_count++; + } + } + large_bar_height = (symbol->height - preset_height) / large_bar_count; + + if (large_bar_count == 0) { + symbol->height = preset_height; + } + + while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { + comp_offset++; + } + + /* Certain symbols need whitespace otherwise characters get chopped off the sides */ + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) + || (symbol->symbology == BARCODE_ISBNX)) { + switch (ustrlen(local_text)) { + case 13: /* EAN 13 */ + case 16: + case 19: + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + main_width = 96 + comp_offset; + break; + default: + main_width = 68 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 96 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 51 + comp_offset; + } + } + + latch = 0; + r = 0; + /* Isolate add-on text */ + if (is_extendable(symbol->symbology)) { + for (i = 0; i < ustrlen(local_text); i++) { + if (latch == 1) { + addon[r] = local_text[i]; + r++; + } + if (local_text[i] == '+') { + latch = 1; + } + } + } + addon[r] = '\0'; + + if (ustrlen(local_text) != 0) { + textoffset = 9; + } else { + textoffset = 0; + } + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + + /* Start writing the header */ + fprintf(feps, "%%!PS-Adobe-3.0 EPSF-3.0\n"); + fprintf(feps, "%%%%Creator: Zint %d.%d.%d\n", ZINT_VERSION_MAJOR, ZINT_VERSION_MINOR, ZINT_VERSION_RELEASE); + if ((ustrlen(local_text) != 0) && (symbol->show_hrt != 0)) { + fprintf(feps, "%%%%Title: %s\n", local_text); + } else { + fprintf(feps, "%%%%Title: Zint Generated Symbol\n"); + } + fprintf(feps, "%%%%Pages: 0\n"); + if (symbol->symbology != BARCODE_MAXICODE) { + fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", (int) ceil((symbol->width + xoffset + xoffset) * scaler), (int) ceil((symbol->height + textoffset + yoffset + yoffset) * scaler)); + } else { + fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", (int) ceil((74.0F + xoffset + xoffset) * scaler), (int) ceil((72.0F + yoffset + yoffset) * scaler)); + } + fprintf(feps, "%%%%EndComments\n"); + + /* Definitions */ + fprintf(feps, "/TL { setlinewidth moveto lineto stroke } bind def\n"); + fprintf(feps, "/TC { moveto 0 360 arc 360 0 arcn fill } bind def\n"); + fprintf(feps, "/TD { newpath 0 360 arc fill } bind def\n"); + fprintf(feps, "/TH { 0 setlinewidth moveto lineto lineto lineto lineto lineto closepath fill } bind def\n"); + fprintf(feps, "/TB { 2 copy } bind def\n"); + fprintf(feps, "/TR { newpath 4 1 roll exch moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath fill } bind def\n"); + fprintf(feps, "/TE { pop pop } bind def\n"); + + fprintf(feps, "newpath\n"); + + /* Now the actual representation */ + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_paper, green_paper, blue_paper); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_paper, magenta_paper, yellow_paper, black_paper); + } + fprintf(feps, "%.2f 0.00 TB 0.00 %.2f TR\n", (symbol->height + textoffset + yoffset + yoffset) * scaler, (symbol->width + xoffset + xoffset) * scaler); + + if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + default_text_posn = 0.5 * scaler; + } else { + default_text_posn = (symbol->border_width + 0.5) * scaler; + } + + if (symbol->symbology == BARCODE_MAXICODE) { + /* Maxicode uses hexagons */ + float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my; + + + textoffset = 0.0; + if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + 72.0 + symbol->border_width) * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler); + } + if ((symbol->output_options & BARCODE_BOX) != 0) { + /* side bars */ + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, (74.0 + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler); + } + + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 10.85 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 8.97 * scaler, (44.73 + xoffset) * scaler, (35.60 + yoffset) * scaler); + fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 7.10 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 5.22 * scaler, (40.98 + xoffset) * scaler, (35.60 + yoffset) * scaler); + fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 3.31 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 1.43 * scaler, (37.19 + xoffset) * scaler, (35.60 + yoffset) * scaler); + for (r = 0; r < symbol->rows; r++) { + for (i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, r, i)) { + /* Dump a hexagon */ + my = ((symbol->rows - r - 1)) * 2.135 + 1.43; + ay = my + 1.0 + yoffset; + by = my + 0.5 + yoffset; + cy = my - 0.5 + yoffset; + dy = my - 1.0 + yoffset; + ey = my - 0.5 + yoffset; + fy = my + 0.5 + yoffset; + + mx = 2.46 * i + 1.23 + (r & 1 ? 1.23 : 0); + + ax = mx + xoffset; + bx = mx + 0.86 + xoffset; + cx = mx + 0.86 + xoffset; + dx = mx + xoffset; + ex = mx - 0.86 + xoffset; + fx = mx - 0.86 + xoffset; + fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TH\n", ax * scaler, ay * scaler, bx * scaler, by * scaler, cx * scaler, cy * scaler, dx * scaler, dy * scaler, ex * scaler, ey * scaler, fx * scaler, fy * scaler); + } + } + } + } + + if (symbol->symbology != BARCODE_MAXICODE) { + /* everything else uses rectangles (or squares) */ + /* Works from the bottom of the symbol up */ + + int addon_latch = 0; + + for (r = 0; r < symbol->rows; r++) { + this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */ + if (symbol->row_height[this_row] == 0) { + row_height = large_bar_height; + } else { + row_height = symbol->row_height[this_row]; + } + row_posn = 0; + for (i = 0; i < r; i++) { + if (symbol->row_height[symbol->rows - i - 1] == 0) { + row_posn += large_bar_height; + } else { + row_posn += symbol->row_height[symbol->rows - i - 1]; + } + } + row_posn += (textoffset + yoffset); + + if ((symbol->output_options & BARCODE_DOTTY_MODE) != 0) { + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + + /* Use dots instead of squares */ + for (i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, this_row, i)) { + fprintf(feps, "%.2f %.2f %.2f TD\n", ((i + xoffset) * scaler) + (scaler / 2.0), (row_posn * scaler) + (scaler / 2.0), (symbol->dot_size / 2.0) * scaler); + } + } + } else { + /* Normal mode, with rectangles */ + + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + + fprintf(feps, "%.2f %.2f ", row_height * scaler, row_posn * scaler); + i = 0; + if (module_is_set(symbol, this_row, 0)) { + latch = 1; + } else { + latch = 0; + } + + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); + if ((addon_latch == 0) && (r == 0) && (i > main_width)) { + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "%.2f %.2f ", (row_height - 5.0) * scaler, (row_posn - 5.0) * scaler); + addon_text_posn = row_posn + row_height - 8.0; + addon_latch = 1; + } + if (latch == 1) { + /* a bar */ + fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset) * scaler, block_width * scaler); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + + } while (i < symbol->width); + } + } + } + /* That's done the actual data area, everything else is human-friendly */ + + xoffset += comp_offset; + + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || + (symbol->symbology == BARCODE_ISBNX)) { + /* guard bar extensions and text formatting for EAN8 and EAN13 */ + switch (ustrlen(local_text)) { + case 8: /* EAN-8 */ + case 11: + case 14: + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (32 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (34 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (64 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (66 + xoffset) * scaler, 1 * scaler); + for (i = 0; i < 4; i++) { + textpart[i] = local_text[i]; + } + textpart[4] = '\0'; + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 17; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for (i = 0; i < 4; i++) { + textpart[i] = local_text[i + 4]; + } + textpart[4] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 50; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textdone = 1; + switch (strlen(addon)) { + case 2: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 86; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + case 5: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 100; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + } + + break; + case 13: /* EAN 13 */ + case 16: + case 19: + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (92 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (94 + xoffset) * scaler, 1 * scaler); + textpart[0] = local_text[0]; + textpart[1] = '\0'; + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = -7; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for (i = 0; i < 6; i++) { + textpart[i] = local_text[i + 1]; + } + textpart[6] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 24; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for (i = 0; i < 6; i++) { + textpart[i] = local_text[i + 7]; + } + textpart[6] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 71; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textdone = 1; + switch (strlen(addon)) { + case 2: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 114; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + case 5: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 128; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + } + break; + + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + /* guard bar extensions and text formatting for UPCA */ + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); + latch = 1; + + i = 0 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if (latch == 1) { + /* a bar */ + fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 11 + comp_offset); + fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler); + latch = 1; + i = 85 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if (latch == 1) { + /* a bar */ + fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 96 + comp_offset); + textpart[0] = local_text[0]; + textpart[1] = '\0'; + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = -5; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for (i = 0; i < 5; i++) { + textpart[i] = local_text[i + 1]; + } + textpart[5] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 27; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for (i = 0; i < 5; i++) { + textpart[i] = local_text[i + 6]; + } + textpart[6] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 68; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textpart[0] = local_text[11]; + textpart[1] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = 100; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textdone = 1; + switch (strlen(addon)) { + case 2: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 116; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + case 5: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 130; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + } + + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + /* guard bar extensions and text formatting for UPCE */ + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler); + fprintf(feps, "TB %.2f %.2f TR\n", (50 + xoffset) * scaler, 1 * scaler); + textpart[0] = local_text[0]; + textpart[1] = '\0'; + fprintf(feps, "TE\n"); + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = -5; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + for (i = 0; i < 6; i++) { + textpart[i] = local_text[i + 1]; + } + textpart[6] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = 24; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textpart[0] = local_text[7]; + textpart[1] = '\0'; + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = 55; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", textpart); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", textpart); + fprintf(feps, "setmatrix\n"); + textdone = 1; + switch (strlen(addon)) { + case 2: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 70; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + case 5: + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); + textpos = xoffset + 84; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); + fprintf(feps, " (%s) stringwidth\n", addon); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", addon); + fprintf(feps, "setmatrix\n"); + break; + } + + } + + xoffset -= comp_offset; + + switch (symbol->symbology) { + case BARCODE_MAXICODE: + /* Do nothing! (It's already been done) */ + break; + default: + if (symbol->output_options & BARCODE_BIND) { + if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { + /* row binding */ + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + if (symbol->symbology != BARCODE_CODABLOCKF) { + for (r = 1; r < symbol->rows; r++) { + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", 2.0 * scaler, ((r * row_height) + textoffset + yoffset - 1) * scaler, xoffset * scaler, symbol->width * scaler); + } + } else { + for (r = 1; r < symbol->rows; r++) { + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", 2.0 * scaler, ((r * row_height) + textoffset + yoffset - 1) * scaler, (xoffset + 11) * scaler, (symbol->width - 25) * scaler); + } + } + } + } + if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + if (symbol->symbology != BARCODE_CODABLOCKF) { + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + symbol->height + symbol->border_width) * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler); + } else { + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, xoffset * scaler, symbol->width * scaler); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + symbol->height + symbol->border_width) * scaler, xoffset * scaler, symbol->width * scaler); + } + } + if (symbol->output_options & BARCODE_BOX) { + /* side bars */ + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler); + fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, (symbol->width + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler); + } + break; + } + + /* Put the human readable text at the bottom */ + if ((textdone == 0) && (ustrlen(local_text))) { + fprintf(feps, "TE\n"); + if ((symbol->output_options & CMYK_COLOUR) == 0) { + fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); + } else { + fprintf(feps, "%.2f %.2f %.2f %.2f setcmykcolor\n", cyan_ink, magenta_ink, yellow_ink, black_ink); + } + fprintf(feps, "matrix currentmatrix\n"); + fprintf(feps, "/Helvetica findfont\n"); + fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); + textpos = symbol->width / 2.0; + fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); + fprintf(feps, " (%s) stringwidth\n", local_text); + fprintf(feps, "pop\n"); + fprintf(feps, "-2 div 0 rmoveto\n"); + fprintf(feps, " (%s) show\n", local_text); + fprintf(feps, "setmatrix\n"); + } + fprintf(feps, "\nshowpage\n"); + + if (symbol->output_options & BARCODE_STDOUT) { + fflush(feps); + } else { + fclose(feps); + } + + if (locale) + setlocale(LC_ALL, locale); + +#ifdef _MSC_VER + free(local_text); +#endif + + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/qr.c b/3rdparty/zint-2.6.1/backend/qr.c new file mode 100644 index 0000000..b6aabc4 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/qr.c @@ -0,0 +1,2983 @@ +/* qr.c Handles QR Code */ + +/* + libzint - the open source barcode library + Copyright (C) 2009 -2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include +#include "sjis.h" +#include "qr.h" +#include "reedsol.h" +#include /* abs */ +#include + +extern int utf_to_eci(const int eci, const unsigned char source[], unsigned char dest[], size_t *length); /* Convert Unicode to other encodings */ + +/* Returns true if input glyph is in the Alphanumeric set */ +static int in_alpha(const int glyph) { + int retval = 0; + char cglyph = (char) glyph; + + if ((cglyph >= '0') && (cglyph <= '9')) { + retval = 1; + } + if ((cglyph >= 'A') && (cglyph <= 'Z')) { + retval = 1; + } + switch (cglyph) { + case ' ': + case '$': + case '%': + case '*': + case '+': + case '-': + case '.': + case '/': + case ':': + retval = 1; + break; + } + + return retval; +} + +static void define_mode(char mode[],const int jisdata[], const size_t length,const int gs1) { + /* Values placed into mode[] are: K = Kanji, B = Binary, A = Alphanumeric, N = Numeric */ + size_t i; + int mlen, j; + + for (i = 0; i < length; i++) { + if (jisdata[i] > 0xff) { + mode[i] = 'K'; + } else { + mode[i] = 'B'; + if (in_alpha(jisdata[i])) { + mode[i] = 'A'; + } + if (gs1 && (jisdata[i] == '[')) { + mode[i] = 'A'; + } + if ((jisdata[i] >= '0') && (jisdata[i] <= '9')) { + mode[i] = 'N'; + } + } + } + + /* If less than 6 numeric digits together then don't use numeric mode */ + for (i = 0; i < length; i++) { + if (mode[i] == 'N') { + if (((i != 0) && (mode[i - 1] != 'N')) || (i == 0)) { + mlen = 0; + while (((mlen + i) < length) && (mode[mlen + i] == 'N')) { + mlen++; + }; + if (mlen < 6) { + for (j = 0; j < mlen; j++) { + mode[i + j] = 'A'; + } + } + } + } + } + + /* If less than 4 alphanumeric characters together then don't use alphanumeric mode */ + for (i = 0; i < length; i++) { + if (mode[i] == 'A') { + if (((i != 0) && (mode[i - 1] != 'A')) || (i == 0)) { + mlen = 0; + while (((mlen + i) < length) && (mode[mlen + i] == 'A')) { + mlen++; + }; + if (mlen < 6) { + for (j = 0; j < mlen; j++) { + mode[i + j] = 'B'; + } + } + } + } + } +} + +/* Choose from three numbers based on version */ +static int tribus(const int version,const int a,const int b,const int c) { + int RetVal; + + RetVal = c; + + if (version < 10) { + RetVal = a; + } + + if ((version >= 10) && (version <= 26)) { + RetVal = b; + } + + return RetVal; +} + +/* Convert input data to a binary stream and add padding */ +static void qr_binary(int datastream[], const int version, const int target_binlen, const char mode[], const int jisdata[], const size_t length, const int gs1, const int eci, const int est_binlen,const int debug) { + int position = 0; + int short_data_block_length, i; + char data_block, padbits; + int current_binlen, current_bytes; + int toggle, percent; + +#ifndef _MSC_VER + char binary[est_binlen + 12]; +#else + char* binary = (char *) _alloca(est_binlen + 12); +#endif + strcpy(binary, ""); + + if (gs1) { + strcat(binary, "0101"); /* FNC1 */ + } + + if (eci != 3) { + strcat(binary, "0111"); /* ECI (Table 4) */ + if (eci <= 127) { + bin_append(eci, 8, binary); /* 000000 to 000127 */ + } else if (eci <= 16383) { + bin_append(0x8000 + eci, 16, binary); /* 000000 to 016383 */ + } else { + bin_append(0xC00000 + eci, 24, binary); /* 000000 to 999999 */ + } + } + + if (debug) { + for (i = 0; i < length; i++) { + printf("%c", mode[i]); + } + printf("\n"); + } + + percent = 0; + + do { + data_block = mode[position]; + short_data_block_length = 0; + do { + short_data_block_length++; + } while (((short_data_block_length + position) < length) + && (mode[position + short_data_block_length] == data_block)); + + switch (data_block) { + case 'K': + /* Kanji mode */ + /* Mode indicator */ + strcat(binary, "1000"); + + /* Character count indicator */ + bin_append(short_data_block_length, tribus(version, 8, 10, 12), binary); + + if (debug) { + printf("Kanji block (length %d)\n\t", short_data_block_length); + } + + /* Character representation */ + for (i = 0; i < short_data_block_length; i++) { + int jis = jisdata[position + i]; + int prod; + + if (jis >= 0x8140 && jis <= 0x9ffc) + jis -= 0x8140; + + else if (jis >= 0xe040 && jis <= 0xebbf) + jis -= 0xc140; + + prod = ((jis >> 8) * 0xc0) + (jis & 0xff); + + bin_append(prod, 13, binary); + + if (debug) { + printf("0x%4X ", prod); + } + } + + if (debug) { + printf("\n"); + } + + break; + case 'B': + /* Byte mode */ + /* Mode indicator */ + strcat(binary, "0100"); + + /* Character count indicator */ + bin_append(short_data_block_length, tribus(version, 8, 16, 16), binary); + + if (debug) { + printf("Byte block (length %d)\n\t", short_data_block_length); + } + + /* Character representation */ + for (i = 0; i < short_data_block_length; i++) { + int byte = jisdata[position + i]; + + if (gs1 && (byte == '[')) { + byte = 0x1d; /* FNC1 */ + } + + bin_append(byte, 8, binary); + + if (debug) { + printf("0x%2X(%d) ", byte, byte); + } + } + + if (debug) { + printf("\n"); + } + + break; + case 'A': + /* Alphanumeric mode */ + /* Mode indicator */ + strcat(binary, "0010"); + + /* Character count indicator */ + bin_append(short_data_block_length, tribus(version, 9, 11, 13), binary); + + if (debug) { + printf("Alpha block (length %d)\n\t", short_data_block_length); + } + + /* Character representation */ + i = 0; + while (i < short_data_block_length) { + int count; + int first = 0, second = 0, prod; + + if (percent == 0) { + if (gs1 && (jisdata[position + i] == '%')) { + first = posn(RHODIUM, '%'); + second = posn(RHODIUM, '%'); + count = 2; + prod = (first * 45) + second; + i++; + } else { + if (gs1 && (jisdata[position + i] == '[')) { + first = posn(RHODIUM, '%'); /* FNC1 */ + } else { + first = posn(RHODIUM, (char) jisdata[position + i]); + } + count = 1; + i++; + prod = first; + + if (i < short_data_block_length && mode[position + i] == 'A') { + if (gs1 && (jisdata[position + i] == '%')) { + second = posn(RHODIUM, '%'); + count = 2; + prod = (first * 45) + second; + percent = 1; + } else { + if (gs1 && (jisdata[position + i] == '[')) { + second = posn(RHODIUM, '%'); /* FNC1 */ + } else { + second = posn(RHODIUM, (char) jisdata[position + i]); + } + count = 2; + i++; + prod = (first * 45) + second; + } + } + } + } else { + first = posn(RHODIUM, '%'); + count = 1; + i++; + prod = first; + percent = 0; + + if (i < short_data_block_length && mode[position + i] == 'A') { + if (gs1 && (jisdata[position + i] == '%')) { + second = posn(RHODIUM, '%'); + count = 2; + prod = (first * 45) + second; + percent = 1; + } else { + if (gs1 && (jisdata[position + i] == '[')) { + second = posn(RHODIUM, '%'); /* FNC1 */ + } else { + second = posn(RHODIUM, (char) jisdata[position + i]); + } + count = 2; + i++; + prod = (first * 45) + second; + } + } + } + + bin_append(prod, 1 + (5 * count), binary); + + if (debug) { + printf("0x%4X ", prod); + } + }; + + if (debug) { + printf("\n"); + } + + break; + case 'N': + /* Numeric mode */ + /* Mode indicator */ + strcat(binary, "0001"); + + /* Character count indicator */ + bin_append(short_data_block_length, tribus(version, 10, 12, 14), binary); + + if (debug) { + printf("Number block (length %d)\n\t", short_data_block_length); + } + + /* Character representation */ + i = 0; + while (i < short_data_block_length) { + int count; + int first = 0, second = 0, third = 0, prod; + + first = posn(NEON, (char) jisdata[position + i]); + count = 1; + prod = first; + + if (i + 1 < short_data_block_length && mode[position + i + 1] == 'N') { + second = posn(NEON, (char) jisdata[position + i + 1]); + count = 2; + prod = (prod * 10) + second; + + if (i + 2 < short_data_block_length && mode[position + i + 2] == 'N') { + third = posn(NEON, (char) jisdata[position + i + 2]); + count = 3; + prod = (prod * 10) + third; + } + } + + bin_append(prod, 1 + (3 * count), binary); + + if (debug) { + printf("0x%4X (%d)", prod, prod); + } + + i += count; + }; + + if (debug) { + printf("\n"); + } + + break; + } + + position += short_data_block_length; + } while (position < length); + + /* Terminator */ + strcat(binary, "0000"); + + current_binlen = (int)strlen(binary); + padbits = 8 - (current_binlen % 8); + if (padbits == 8) { + padbits = 0; + } + current_bytes = (current_binlen + padbits) / 8; + + /* Padding bits */ + for (i = 0; i < padbits; i++) { + strcat(binary, "0"); + } + + /* Put data into 8-bit codewords */ + for (i = 0; i < current_bytes; i++) { + int p; + datastream[i] = 0x00; + for (p = 0; p < 8; p++) { + if (binary[i * 8 + p] == '1') { + datastream[i] += (0x80 >> p); + } + } + } + + /* Add pad codewords */ + toggle = 0; + for (i = current_bytes; i < target_binlen; i++) { + if (toggle == 0) { + datastream[i] = 0xec; + toggle = 1; + } else { + datastream[i] = 0x11; + toggle = 0; + } + } + + if (debug) { + printf("Resulting codewords:\n\t"); + for (i = 0; i < target_binlen; i++) { + printf("0x%2X ", datastream[i]); + } + printf("\n"); + } +} + +/* Split data into blocks, add error correction and then interleave the blocks and error correction data */ +static void add_ecc(int fullstream[],const int datastream[],const int version,const int data_cw,const int blocks) { + int ecc_cw = qr_total_codewords[version - 1] - data_cw; + int short_data_block_length = data_cw / blocks; + int qty_long_blocks = data_cw % blocks; + int qty_short_blocks = blocks - qty_long_blocks; + int ecc_block_length = ecc_cw / blocks; + int i, j, length_this_block, posn, debug = 0; + + +#ifndef _MSC_VER + unsigned char data_block[short_data_block_length + 2]; + unsigned char ecc_block[ecc_block_length + 2]; + int interleaved_data[data_cw + 2]; + int interleaved_ecc[ecc_cw + 2]; +#else + unsigned char* data_block = (unsigned char *) _alloca(short_data_block_length + 2); + unsigned char* ecc_block = (unsigned char *) _alloca(ecc_block_length + 2); + int* interleaved_data = (int *) _alloca((data_cw + 2) * sizeof (int)); + int* interleaved_ecc = (int *) _alloca((ecc_cw + 2) * sizeof (int)); +#endif + + posn = 0; + + for (i = 0; i < blocks; i++) { + if (i < qty_short_blocks) { + length_this_block = short_data_block_length; + } else { + length_this_block = short_data_block_length + 1; + } + + for (j = 0; j < ecc_block_length; j++) { + ecc_block[j] = 0; + } + + for (j = 0; j < length_this_block; j++) { + data_block[j] = (unsigned char) datastream[posn + j]; + } + + rs_init_gf(0x11d); + rs_init_code(ecc_block_length, 0); + rs_encode(length_this_block, data_block, ecc_block); + rs_free(); + + if (debug) { + printf("Block %d: ", i + 1); + for (j = 0; j < length_this_block; j++) { + printf("%2X ", data_block[j]); + } + if (i < qty_short_blocks) { + printf(" "); + } + printf(" // "); + for (j = 0; j < ecc_block_length; j++) { + printf("%2X ", ecc_block[ecc_block_length - j - 1]); + } + printf("\n"); + } + + for (j = 0; j < short_data_block_length; j++) { + interleaved_data[(j * blocks) + i] = (int) data_block[j]; + } + + if (i >= qty_short_blocks) { + interleaved_data[(short_data_block_length * blocks) + (i - qty_short_blocks)] = (int) data_block[short_data_block_length]; + } + + for (j = 0; j < ecc_block_length; j++) { + interleaved_ecc[(j * blocks) + i] = (int) ecc_block[ecc_block_length - j - 1]; + } + + posn += length_this_block; + } + + for (j = 0; j < data_cw; j++) { + fullstream[j] = interleaved_data[j]; + } + for (j = 0; j < ecc_cw; j++) { + fullstream[j + data_cw] = interleaved_ecc[j]; + } + + if (debug) { + printf("\nData Stream: \n"); + for (j = 0; j < (data_cw + ecc_cw); j++) { + printf("%2X ", fullstream[j]); + } + printf("\n"); + } +} + +static void place_finder(unsigned char grid[],const int size,const int x,const int y) { + int xp, yp; + char finder[] = {0x7F, 0x41, 0x5D, 0x5D, 0x5D, 0x41, 0x7F}; + + for (xp = 0; xp < 7; xp++) { + for (yp = 0; yp < 7; yp++) { + if (finder[yp] & 0x40 >> xp) { + grid[((yp + y) * size) + (xp + x)] = 0x11; + } else { + grid[((yp + y) * size) + (xp + x)] = 0x10; + } + } + } +} + +static void place_align(unsigned char grid[],const int size,int x,int y) { + int xp, yp; + char alignment[] = {0x1F, 0x11, 0x15, 0x11, 0x1F}; + + x -= 2; + y -= 2; /* Input values represent centre of pattern */ + + for (xp = 0; xp < 5; xp++) { + for (yp = 0; yp < 5; yp++) { + if (alignment[yp] & 0x10 >> xp) { + grid[((yp + y) * size) + (xp + x)] = 0x11; + } else { + grid[((yp + y) * size) + (xp + x)] = 0x10; + } + } + } +} + +static void setup_grid(unsigned char* grid,const int size,const int version) { + int i, toggle = 1; + int loopsize, x, y, xcoord, ycoord; + + /* Add timing patterns */ + for (i = 0; i < size; i++) { + if (toggle == 1) { + grid[(6 * size) + i] = 0x21; + grid[(i * size) + 6] = 0x21; + toggle = 0; + } else { + grid[(6 * size) + i] = 0x20; + grid[(i * size) + 6] = 0x20; + toggle = 1; + } + } + + /* Add finder patterns */ + place_finder(grid, size, 0, 0); + place_finder(grid, size, 0, size - 7); + place_finder(grid, size, size - 7, 0); + + /* Add separators */ + for (i = 0; i < 7; i++) { + grid[(7 * size) + i] = 0x10; + grid[(i * size) + 7] = 0x10; + grid[(7 * size) + (size - 1 - i)] = 0x10; + grid[(i * size) + (size - 8)] = 0x10; + grid[((size - 8) * size) + i] = 0x10; + grid[((size - 1 - i) * size) + 7] = 0x10; + } + grid[(7 * size) + 7] = 0x10; + grid[(7 * size) + (size - 8)] = 0x10; + grid[((size - 8) * size) + 7] = 0x10; + + /* Add alignment patterns */ + if (version != 1) { + /* Version 1 does not have alignment patterns */ + + loopsize = qr_align_loopsize[version - 1]; + for (x = 0; x < loopsize; x++) { + for (y = 0; y < loopsize; y++) { + xcoord = qr_table_e1[((version - 2) * 7) + x]; + ycoord = qr_table_e1[((version - 2) * 7) + y]; + + if (!(grid[(ycoord * size) + xcoord] & 0x10)) { + place_align(grid, size, xcoord, ycoord); + } + } + } + } + + /* Reserve space for format information */ + for (i = 0; i < 8; i++) { + grid[(8 * size) + i] += 0x20; + grid[(i * size) + 8] += 0x20; + grid[(8 * size) + (size - 1 - i)] = 0x20; + grid[((size - 1 - i) * size) + 8] = 0x20; + } + grid[(8 * size) + 8] += 20; + grid[((size - 1 - 7) * size) + 8] = 0x21; /* Dark Module from Figure 25 */ + + /* Reserve space for version information */ + if (version >= 7) { + for (i = 0; i < 6; i++) { + grid[((size - 9) * size) + i] = 0x20; + grid[((size - 10) * size) + i] = 0x20; + grid[((size - 11) * size) + i] = 0x20; + grid[(i * size) + (size - 9)] = 0x20; + grid[(i * size) + (size - 10)] = 0x20; + grid[(i * size) + (size - 11)] = 0x20; + } + } +} + +static int cwbit(const int* datastream,const int i) { + int resultant = 0; + + if (datastream[(i / 8)] & (0x80 >> (i % 8))) { + resultant = 1; + } + + return resultant; +} + +static void populate_grid(unsigned char* grid,const int size,const int* datastream,const int cw) { + int direction = 1; /* up */ + int row = 0; /* right hand side */ + + int i, n, x, y; + + n = cw * 8; + y = size - 1; + i = 0; + do { + x = (size - 2) - (row * 2); + if (x < 6) + x--; /* skip over vertical timing pattern */ + + if (!(grid[(y * size) + (x + 1)] & 0xf0)) { + if (cwbit(datastream, i)) { + grid[(y * size) + (x + 1)] = 0x01; + } else { + grid[(y * size) + (x + 1)] = 0x00; + } + i++; + } + + if (i < n) { + if (!(grid[(y * size) + x] & 0xf0)) { + if (cwbit(datastream, i)) { + grid[(y * size) + x] = 0x01; + } else { + grid[(y * size) + x] = 0x00; + } + i++; + } + } + + if (direction) { + y--; + } else { + y++; + } + if (y == -1) { + /* reached the top */ + row++; + y = 0; + direction = 0; + } + if (y == size) { + /* reached the bottom */ + row++; + y = size - 1; + direction = 1; + } + } while (i < n); +} + +#ifdef ZINTLOG + +int append_log(char log) { + FILE *file; + + file = fopen("zintlog.txt", "a+"); + fprintf(file, "%c", log); + fclose(file); + return 0; +} + +int write_log(char log[]) { + FILE *file; + + file = fopen("zintlog.txt", "a+"); + fprintf(file, log); /*writes*/ + fprintf(file, "\r\n"); /*writes*/ + fclose(file); + return 0; +} +#endif + +static int evaluate(unsigned char *eval,const int size,const int pattern) { + int x, y, block, weight; + int result = 0; + char state; + int p; + int dark_mods; + int percentage, k; + int a, b, afterCount, beforeCount; +#ifdef ZINTLOG + int result_b = 0; + char str[15]; +#endif + +#ifndef _MSC_VER + char local[size * size]; +#else + char* local = (char *) _alloca((size * size) * sizeof (char)); +#endif + + +#ifdef ZINTLOG + write_log(""); + sprintf(str, "%d", pattern); + write_log(str); +#endif + + /* all eight bitmask variants have been encoded in the 8 bits of the bytes + * that make up the grid array. select them for evaluation according to the + * desired pattern.*/ + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if ((eval[(y * size) + x] & (0x01 << pattern)) != 0) { + local[(y * size) + x] = '1'; + } else { + local[(y * size) + x] = '0'; + } + } + } + +#ifdef ZINTLOG + //bitmask output + for (y = 0; y < size; y++) { + strcpy(str, ""); + for (x = 0; x < size; x++) { + state = local[(y * size) + x]; + append_log(state); + } + write_log(""); + } + write_log(""); +#endif + + /* Test 1: Adjacent modules in row/column in same colour */ + /* Vertical */ + for (x = 0; x < size; x++) { + state = local[x]; + block = 0; + for (y = 0; y < size; y++) { + if (local[(y * size) + x] == state) { + block++; + } else { + if (block > 5) { + result += (3 + (block - 5)); + } + block = 0; + state = local[(y * size) + x]; + } + } + if (block > 5) { + result += (3 + (block - 5)); + } + } + + /* Horizontal */ + for (y = 0; y < size; y++) { + state = local[y * size]; + block = 0; + for (x = 0; x < size; x++) { + if (local[(y * size) + x] == state) { + block++; + } else { + if (block > 5) { + result += (3 + (block - 5)); + } + block = 0; + state = local[(y * size) + x]; + } + } + if (block > 5) { + result += (3 + (block - 5)); + } + } + +#ifdef ZINTLOG + /* output Test 1 */ + sprintf(str, "%d", result); + result_b = result; + write_log(str); +#endif + + /* Test 2: Block of modules in same color */ + for (x = 0; x < size - 1; x++) { + for (y = 0; y < size - 1; y++) { + if (((local[(y * size) + x] == local[((y + 1) * size) + x]) && + (local[(y * size) + x] == local[(y * size) + (x + 1)])) && + (local[(y * size) + x] == local[((y + 1) * size) + (x + 1)])) { + result += 3; + } + } + } + +#ifdef ZINTLOG + /* output Test 2 */ + sprintf(str, "%d", result - result_b); + result_b = result; + write_log(str); +#endif + + /* Test 3: 1:1:3:1:1 ratio pattern in row/column */ + /* Vertical */ + for (x = 0; x < size; x++) { + for (y = 0; y < (size - 7); y++) { + p = 0; + for (weight = 0; weight < 7; weight++) { + if (local[((y + weight) * size) + x] == '1') { + p += (0x40 >> weight); + } + } + if (p == 0x5d) { + /* Pattern found, check before and after */ + beforeCount = 0; + for (b = (y - 4); b < y; b++) { + if (b < 0) { + beforeCount++; + } else { + if (local[(b * size) + x] == '0') { + beforeCount++; + } else { + beforeCount = 0; + } + } + } + + afterCount = 0; + for (a = (y + 7); a <= (y + 10); a++) { + if (a >= size) { + afterCount++; + } else { + if (local[(a * size) + x] == '0') { + afterCount++; + } else { + afterCount = 0; + } + } + } + + if ((beforeCount == 4) || (afterCount == 4)) { + /* Pattern is preceeded or followed by light area + 4 modules wide */ + result += 40; + } + } + } + } + + /* Horizontal */ + for (y = 0; y < size; y++) { + for (x = 0; x < (size - 7); x++) { + p = 0; + for (weight = 0; weight < 7; weight++) { + if (local[(y * size) + x + weight] == '1') { + p += (0x40 >> weight); + } + } + if (p == 0x5d) { + /* Pattern found, check before and after */ + beforeCount = 0; + for (b = (x - 4); b < x; b++) { + if (b < 0) { + beforeCount++; + } else { + if (local[(y * size) + b] == '0') { + beforeCount++; + } else { + beforeCount = 0; + } + } + } + + afterCount = 0; + for (a = (x + 7); a <= (x + 10); a++) { + if (a >= size) { + afterCount++; + } else { + if (local[(y * size) + a] == '0') { + afterCount++; + } else { + afterCount = 0; + } + } + } + + if ((beforeCount == 4) || (afterCount == 4)) { + /* Pattern is preceeded or followed by light area + 4 modules wide */ + result += 40; + } + } + } + } + +#ifdef ZINTLOG + /* output Test 3 */ + sprintf(str, "%d", result - result_b); + result_b = result; + write_log(str); +#endif + + /* Test 4: Proportion of dark modules in entire symbol */ + dark_mods = 0; + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if (local[(y * size) + x] == '1') { + dark_mods++; + } + } + } + percentage = 100 * (dark_mods / (size * size)); + if (percentage <= 50) { + k = ((100 - percentage) - 50) / 5; + } else { + k = (percentage - 50) / 5; + } + + result += 10 * k; + +#ifdef ZINTLOG + /* output Test 4+summary */ + sprintf(str, "%d", result - result_b); + write_log(str); + write_log("=========="); + sprintf(str, "%d", result); + write_log(str); +#endif + + return result; +} + +static void add_format_info_eval(unsigned char *eval,const int size,const int ecc_level,const int pattern) { + /* Add format information to grid */ + + int format = pattern; + unsigned int seq; + int i; + + switch (ecc_level) { + case LEVEL_L: format += 0x08; + break; + case LEVEL_Q: format += 0x18; + break; + case LEVEL_H: format += 0x10; + break; + } + + seq = qr_annex_c[format]; + + for (i = 0; i < 6; i++) { + eval[(i * size) + 8] = (seq >> i) & 0x01 ? (0x01 >> pattern) : 0x00; + } + + for (i = 0; i < 8; i++) { + eval[(8 * size) + (size - i - 1)] = (seq >> i) & 0x01 ? (0x01 >> pattern) : 0x00; + } + + for (i = 0; i < 6; i++) { + eval[(8 * size) + (5 - i)] = (seq >> (i + 9)) & 0x01 ? (0x01 >> pattern) : 0x00; + } + + for (i = 0; i < 7; i++) { + eval[(((size - 7) + i) * size) + 8] = (seq >> (i + 8)) & 0x01 ? (0x01 >> pattern) : 0x00; + } + + eval[(7 * size) + 8] = (seq >> 6) & 0x01 ? (0x01 >> pattern) : 0x00; + eval[(8 * size) + 8] = (seq >> 7) & 0x01 ? (0x01 >> pattern) : 0x00; + eval[(8 * size) + 7] = (seq >> 8) & 0x01 ? (0x01 >> pattern) : 0x00; +} + +static int apply_bitmask(unsigned char *grid,const int size,const int ecc_level) { + int x, y; + unsigned char p; + int pattern, penalty[8]; + int best_val, best_pattern; + +#ifndef _MSC_VER + unsigned char mask[size * size]; + unsigned char eval[size * size]; +#else + unsigned char* mask = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); + unsigned char* eval = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); +#endif + + /* Perform data masking */ + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + mask[(y * size) + x] = 0x00; + + // all eight bitmask variants are encoded in the 8 bits of the bytes that make up the mask array. + if (!(grid[(y * size) + x] & 0xf0)) { // exclude areas not to be masked. + if (((y + x) & 1) == 0) { + mask[(y * size) + x] += 0x01; + } + if ((y & 1) == 0) { + mask[(y * size) + x] += 0x02; + } + if ((x % 3) == 0) { + mask[(y * size) + x] += 0x04; + } + if (((y + x) % 3) == 0) { + mask[(y * size) + x] += 0x08; + } + if ((((y / 2) + (x / 3)) & 1) == 0) { + mask[(y * size) + x] += 0x10; + } + if ((((y * x) & 1) + ((y * x) % 3)) == 0) { + mask[(y * size) + x] += 0x20; + } + if (((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) { + mask[(y * size) + x] += 0x40; + } + if (((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) { + mask[(y * size) + x] += 0x80; + } + } + } + } + + // apply data masks to grid, result in eval + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if (grid[(y * size) + x] & 0x01) { + p = 0xff; + } else { + p = 0x00; + } + + eval[(y * size) + x] = mask[(y * size) + x] ^ p; + } + } + + + /* Evaluate result */ + for (pattern = 0; pattern < 8; pattern++) { + + add_format_info_eval(eval, size, ecc_level, pattern); + + penalty[pattern] = evaluate(eval, size, pattern); + } + + best_pattern = 0; + best_val = penalty[0]; + for (pattern = 1; pattern < 8; pattern++) { + if (penalty[pattern] < best_val) { + best_pattern = pattern; + best_val = penalty[pattern]; + } + } + +#ifdef ZINTLOG + char str[15]; + sprintf(str, "%d", best_val); + write_log("choosed pattern:"); + write_log(str); +#endif + + /* Apply mask */ + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if (mask[(y * size) + x] & (0x01 << best_pattern)) { + if (grid[(y * size) + x] & 0x01) { + grid[(y * size) + x] = 0x00; + } else { + grid[(y * size) + x] = 0x01; + } + } + } + } + + return best_pattern; +} + +/* Add format information to grid */ +static void add_format_info(unsigned char *grid,const int size,const int ecc_level,const int pattern) { + int format = pattern; + unsigned int seq; + int i; + + switch (ecc_level) { + case LEVEL_L: format += 0x08; + break; + case LEVEL_Q: format += 0x18; + break; + case LEVEL_H: format += 0x10; + break; + } + + seq = qr_annex_c[format]; + + for (i = 0; i < 6; i++) { + grid[(i * size) + 8] += (seq >> i) & 0x01; + } + + for (i = 0; i < 8; i++) { + grid[(8 * size) + (size - i - 1)] += (seq >> i) & 0x01; + } + + for (i = 0; i < 6; i++) { + grid[(8 * size) + (5 - i)] += (seq >> (i + 9)) & 0x01; + } + + for (i = 0; i < 7; i++) { + grid[(((size - 7) + i) * size) + 8] += (seq >> (i + 8)) & 0x01; + } + + grid[(7 * size) + 8] += (seq >> 6) & 0x01; + grid[(8 * size) + 8] += (seq >> 7) & 0x01; + grid[(8 * size) + 7] += (seq >> 8) & 0x01; +} + +/* Add version information */ +static void add_version_info(unsigned char *grid,const int size,const int version) { + int i; + + long int version_data = qr_annex_d[version - 7]; + for (i = 0; i < 6; i++) { + grid[((size - 11) * size) + i] += (version_data >> (i * 3)) & 0x41; + grid[((size - 10) * size) + i] += (version_data >> ((i * 3) + 1)) & 0x41; + grid[((size - 9) * size) + i] += (version_data >> ((i * 3) + 2)) & 0x41; + grid[(i * size) + (size - 11)] += (version_data >> (i * 3)) & 0x41; + grid[(i * size) + (size - 10)] += (version_data >> ((i * 3) + 1)) & 0x41; + grid[(i * size) + (size - 9)] += (version_data >> ((i * 3) + 2)) & 0x41; + } +} + +/* Implements a custom optimisation algorithm, more efficient than that + given in Annex J. */ +static void applyOptimisation(const int version,char inputMode[], const size_t inputLength) { + + + int blockCount = 0, block; + int i, j; + char currentMode = ' '; // Null + int *blockLength; + char *blockMode; + + for (i = 0; i < inputLength; i++) { + if (inputMode[i] != currentMode) { + currentMode = inputMode[i]; + blockCount++; + } + } + + blockLength = (int*) malloc(sizeof (int)*blockCount); + assert(blockLength); + if (!blockLength) return; + blockMode = (char*) malloc(sizeof (char)*blockCount); + assert(blockMode); + if (!blockMode) { + free(blockLength); + return; + } + + j = -1; + currentMode = ' '; // Null + for (i = 0; i < inputLength; i++) { + if (inputMode[i] != currentMode) { + j++; + blockLength[j] = 1; + blockMode[j] = inputMode[i]; + currentMode = inputMode[i]; + } else { + blockLength[j]++; + } + } + + if (blockCount > 1) { + // Search forward + for (i = 0; i <= (blockCount - 2); i++) { + if (blockMode[i] == 'B') { + switch (blockMode[i + 1]) { + case 'K': + if (blockLength[i + 1] < tribus(version, 4, 5, 6)) { + blockMode[i + 1] = 'B'; + } + break; + case 'A': + if (blockLength[i + 1] < tribus(version, 7, 8, 9)) { + blockMode[i + 1] = 'B'; + } + break; + case 'N': + if (blockLength[i + 1] < tribus(version, 3, 4, 5)) { + blockMode[i + 1] = 'B'; + } + break; + } + } + + if ((blockMode[i] == 'A') + && (blockMode[i + 1] == 'N')) { + if (blockLength[i + 1] < tribus(version, 6, 8, 10)) { + blockMode[i + 1] = 'A'; + } + } + } + + // Search backward + for (i = blockCount - 1; i > 0; i--) { + if (blockMode[i] == 'B') { + switch (blockMode[i - 1]) { + case 'K': + if (blockLength[i - 1] < tribus(version, 4, 5, 6)) { + blockMode[i - 1] = 'B'; + } + break; + case 'A': + if (blockLength[i - 1] < tribus(version, 7, 8, 9)) { + blockMode[i - 1] = 'B'; + } + break; + case 'N': + if (blockLength[i - 1] < tribus(version, 3, 4, 5)) { + blockMode[i - 1] = 'B'; + } + break; + } + } + + if ((blockMode[i] == 'A') + && (blockMode[i - 1] == 'N')) { + if (blockLength[i - 1] < tribus(version, 6, 8, 10)) { + blockMode[i - 1] = 'A'; + } + } + } + } + + j = 0; + for (block = 0; block < blockCount; block++) { + currentMode = blockMode[block]; + for (i = 0; i < blockLength[block]; i++) { + inputMode[j] = currentMode; + j++; + } + } + + free(blockLength); + free(blockMode); +} + +static size_t blockLength(const size_t start,const char inputMode[],const size_t inputLength) { + /* Find the length of the block starting from 'start' */ + size_t i; + int count; + char mode = inputMode[start]; + + count = 0; + i = start; + + do { + count++; + } while (((i + count) < inputLength) && (inputMode[i + count] == mode)); + + return count; +} + +static int getBinaryLength(const int version,char inputMode[],const int inputData[],const size_t inputLength,const int gs1,const int eci) { + /* Calculate the actual bitlength of the proposed binary string */ + size_t i; + char currentMode; + int j; + int count = 0; + + applyOptimisation(version, inputMode, inputLength); + + currentMode = ' '; // Null + + if (gs1 == 1) { + count += 4; + } + + if (eci != 3) { + count += 12; + } + + for (i = 0; i < inputLength; i++) { + if (inputMode[i] != currentMode) { + count += 4; + switch (inputMode[i]) { + case 'K': + count += tribus(version, 8, 10, 12); + count += (blockLength(i, inputMode, inputLength) * 13); + break; + case 'B': + count += tribus(version, 8, 16, 16); + for (j = i; j < (i + blockLength(i, inputMode, inputLength)); j++) { + if (inputData[j] > 0xff) { + count += 16; + } else { + count += 8; + } + } + break; + case 'A': + count += tribus(version, 9, 11, 13); + switch (blockLength(i, inputMode, inputLength) % 2) { + case 0: + count += (blockLength(i, inputMode, inputLength) / 2) * 11; + break; + case 1: + count += ((blockLength(i, inputMode, inputLength) - 1) / 2) * 11; + count += 6; + break; + } + break; + case 'N': + count += tribus(version, 10, 12, 14); + switch (blockLength(i, inputMode, inputLength) % 3) { + case 0: + count += (blockLength(i, inputMode, inputLength) / 3) * 10; + break; + case 1: + count += ((blockLength(i, inputMode, inputLength) - 1) / 3) * 10; + count += 4; + break; + case 2: + count += ((blockLength(i, inputMode, inputLength) - 2) / 3) * 10; + count += 7; + break; + } + break; + } + currentMode = inputMode[i]; + } + } + + return count; +} + +int qr_code(struct zint_symbol *symbol, const unsigned char source[], size_t length) { + int i, j, est_binlen; + int error_number,glyph; + int ecc_level, autosize, version, max_cw, target_binlen, blocks, size; + int bitmask, gs1; + int canShrink; + +#ifndef _MSC_VER + int utfdata[length + 1]; + int jisdata[length + 1]; + char mode[length + 1]; +#else + int* datastream; + int* fullstream; + unsigned char* grid; + int* utfdata = (int *) _alloca((length + 1) * sizeof (int)); + int* jisdata = (int *) _alloca((length + 1) * sizeof (int)); + char* mode = (char *) _alloca(length + 1); +#endif + + gs1 = (symbol->input_mode == GS1_MODE); + + if ((symbol->input_mode == DATA_MODE) || (symbol->eci != 3)) { + for (i = 0; i < length; i++) { + jisdata[i] = (int) source[i]; + } + } else { + /* Convert Unicode input to Shift-JIS */ + error_number = utf8toutf16(symbol, source, utfdata, &length); + if (error_number != 0) { + return error_number; + } + + for (i = 0; i < length; i++) { + if (utfdata[i] <= 0xff) { + jisdata[i] = utfdata[i]; + } else { + j = 0; + glyph = 0; + do { + if (sjis_lookup[j * 2] == utfdata[i]) { + glyph = sjis_lookup[(j * 2) + 1]; + } + j++; + } while ((j < 6843) && (glyph == 0)); + if (glyph == 0) { + strcpy(symbol->errtxt, "560: Invalid character in input data"); + return ZINT_ERROR_INVALID_DATA; + } + jisdata[i] = glyph; + } + } + } + + define_mode(mode, jisdata, length, gs1); + est_binlen = getBinaryLength(40, mode, jisdata, length, gs1, symbol->eci); + + ecc_level = LEVEL_L; + max_cw = 2956; + if ((symbol->option_1 >= 1) && (symbol->option_1 <= 4)) { + switch (symbol->option_1) { + case 1: ecc_level = LEVEL_L; + max_cw = 2956; + break; + case 2: ecc_level = LEVEL_M; + max_cw = 2334; + break; + case 3: ecc_level = LEVEL_Q; + max_cw = 1666; + break; + case 4: ecc_level = LEVEL_H; + max_cw = 1276; + break; + } + } + + if (est_binlen > (8 * max_cw)) { + strcpy(symbol->errtxt, "561: Input too long for selected error correction level"); + return ZINT_ERROR_TOO_LONG; + } + + autosize = 40; + for (i = 39; i >= 0; i--) { + switch (ecc_level) { + case LEVEL_L: + if ((8 * qr_data_codewords_L[i]) >= est_binlen) { + autosize = i + 1; + } + break; + case LEVEL_M: + if ((8 * qr_data_codewords_M[i]) >= est_binlen) { + autosize = i + 1; + } + break; + case LEVEL_Q: + if ((8 * qr_data_codewords_Q[i]) >= est_binlen) { + autosize = i + 1; + } + break; + case LEVEL_H: + if ((8 * qr_data_codewords_H[i]) >= est_binlen) { + autosize = i + 1; + } + break; + } + } + + // Now see if the optimised binary will fit in a smaller symbol. + canShrink = 1; + + do { + if (autosize == 1) { + canShrink = 0; + } else { + est_binlen = getBinaryLength(autosize - 1, mode, jisdata, length, gs1, symbol->eci); + + switch (ecc_level) { + case LEVEL_L: + if ((8 * qr_data_codewords_L[autosize - 2]) < est_binlen) { + canShrink = 0; + } + break; + case LEVEL_M: + if ((8 * qr_data_codewords_M[autosize - 2]) < est_binlen) { + canShrink = 0; + } + break; + case LEVEL_Q: + if ((8 * qr_data_codewords_Q[autosize - 2]) < est_binlen) { + canShrink = 0; + } + break; + case LEVEL_H: + if ((8 * qr_data_codewords_H[autosize - 2]) < est_binlen) { + canShrink = 0; + } + break; + } + + if (canShrink == 1) { + // Optimisation worked - data will fit in a smaller symbol + autosize--; + } else { + // Data did not fit in the smaller symbol, revert to original size + est_binlen = getBinaryLength(autosize, mode, jisdata, length, gs1, symbol->eci); + } + } + } while (canShrink == 1); + + version = autosize; + + if ((symbol->option_2 >= 1) && (symbol->option_2 <= 40)) { + /* If the user has selected a larger symbol than the smallest available, + then use the size the user has selected, and re-optimise for this + symbol size. + */ + if (symbol->option_2 > version) { + version = symbol->option_2; + est_binlen = getBinaryLength(symbol->option_2, mode, jisdata, length, gs1, symbol->eci); + } + + if (symbol->option_2 < version) { + strcpy(symbol->errtxt, "569: Input too long for selected symbol size"); + return ZINT_ERROR_TOO_LONG; + } + } + + /* Ensure maxium error correction capacity */ + if (est_binlen <= qr_data_codewords_M[version - 1]) { + ecc_level = LEVEL_M; + } + if (est_binlen <= qr_data_codewords_Q[version - 1]) { + ecc_level = LEVEL_Q; + } + if (est_binlen <= qr_data_codewords_H[version - 1]) { + ecc_level = LEVEL_H; + } + + target_binlen = qr_data_codewords_L[version - 1]; + blocks = qr_blocks_L[version - 1]; + switch (ecc_level) { + case LEVEL_M: target_binlen = qr_data_codewords_M[version - 1]; + blocks = qr_blocks_M[version - 1]; + break; + case LEVEL_Q: target_binlen = qr_data_codewords_Q[version - 1]; + blocks = qr_blocks_Q[version - 1]; + break; + case LEVEL_H: target_binlen = qr_data_codewords_H[version - 1]; + blocks = qr_blocks_H[version - 1]; + break; + } + +#ifndef _MSC_VER + int datastream[target_binlen + 1]; + int fullstream[qr_total_codewords[version - 1] + 1]; +#else + datastream = (int *) _alloca((target_binlen + 1) * sizeof (int)); + fullstream = (int *) _alloca((qr_total_codewords[version - 1] + 1) * sizeof (int)); +#endif + + qr_binary(datastream, version, target_binlen, mode, jisdata, length, gs1, symbol->eci, est_binlen, symbol->debug); + add_ecc(fullstream, datastream, version, target_binlen, blocks); + + size = qr_sizes[version - 1]; +#ifndef _MSC_VER + unsigned char grid[size * size]; +#else + grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); +#endif + + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + grid[(i * size) + j] = 0; + } + } + + setup_grid(grid, size, version); + populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]); + + if (version >= 7) { + add_version_info(grid, size, version); + } + + bitmask = apply_bitmask(grid, size, ecc_level); + + add_format_info(grid, size, ecc_level, bitmask); + + + + symbol->width = size; + symbol->rows = size; + + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + if (grid[(i * size) + j] & 0x01) { + set_module(symbol, i, j); + } + } + symbol->row_height[i] = 1; + } + + return 0; +} + +/* NOTE: From this point forward concerns Micro QR Code only */ + +static int micro_qr_intermediate(char binary[], const int jisdata[], const char mode[], const size_t length, int *kanji_used, int *alphanum_used, int *byte_used,const int debug) { + /* Convert input data to an "intermediate stage" where data is binary encoded but + control information is not */ + int position = 0; + int short_data_block_length, i; + char data_block; + char buffer[2]; + + strcpy(binary, ""); + + if (debug) { + for (i = 0; i < length; i++) { + printf("%c", mode[i]); + } + printf("\n"); + } + + do { + if (strlen(binary) > 128) { + return ZINT_ERROR_TOO_LONG; + } + + data_block = mode[position]; + short_data_block_length = 0; + do { + short_data_block_length++; + } while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block)); + + switch (data_block) { + case 'K': + /* Kanji mode */ + /* Mode indicator */ + strcat(binary, "K"); + *kanji_used = 1; + + /* Character count indicator */ + buffer[0] = short_data_block_length; + buffer[1] = '\0'; + strcat(binary, buffer); + + if (debug) { + printf("Kanji block (length %d)\n\t", short_data_block_length); + } + + /* Character representation */ + for (i = 0; i < short_data_block_length; i++) { + int jis = jisdata[position + i]; + int prod; + + if (jis >= 0x8140 && jis <= 0x9ffc) + jis -= 0x8140; + + else if (jis >= 0xe040 && jis <= 0xebbf) + jis -= 0xc140; + + prod = ((jis >> 8) * 0xc0) + (jis & 0xff); + + bin_append(prod, 13, binary); + + if (debug) { + printf("0x%4X ", prod); + } + + if (strlen(binary) > 128) { + return ZINT_ERROR_TOO_LONG; + } + } + + if (debug) { + printf("\n"); + } + + break; + case 'B': + /* Byte mode */ + /* Mode indicator */ + strcat(binary, "B"); + *byte_used = 1; + + /* Character count indicator */ + buffer[0] = short_data_block_length; + buffer[1] = '\0'; + strcat(binary, buffer); + + if (debug) { + printf("Byte block (length %d)\n\t", short_data_block_length); + } + + /* Character representation */ + for (i = 0; i < short_data_block_length; i++) { + int byte = jisdata[position + i]; + + bin_append(byte, 8, binary); + + if (debug) { + printf("0x%4X ", byte); + } + + if (strlen(binary) > 128) { + return ZINT_ERROR_TOO_LONG; + } + } + + if (debug) { + printf("\n"); + } + + break; + case 'A': + /* Alphanumeric mode */ + /* Mode indicator */ + strcat(binary, "A"); + *alphanum_used = 1; + + /* Character count indicator */ + buffer[0] = short_data_block_length; + buffer[1] = '\0'; + strcat(binary, buffer); + + if (debug) { + printf("Alpha block (length %d)\n\t", short_data_block_length); + } + + /* Character representation */ + i = 0; + while (i < short_data_block_length) { + int count; + int first = 0, second = 0, prod; + + first = posn(RHODIUM, (char) jisdata[position + i]); + count = 1; + prod = first; + + if (i + 1 < short_data_block_length && mode[position + i + 1] == 'A') { + second = posn(RHODIUM, (char) jisdata[position + i + 1]); + count = 2; + prod = (first * 45) + second; + } + + bin_append(prod, 1 + (5 * count), binary); + + if (debug) { + printf("0x%4X ", prod); + } + + if (strlen(binary) > 128) { + return ZINT_ERROR_TOO_LONG; + } + + i += 2; + }; + + if (debug) { + printf("\n"); + } + + break; + case 'N': + /* Numeric mode */ + /* Mode indicator */ + strcat(binary, "N"); + + /* Character count indicator */ + buffer[0] = short_data_block_length; + buffer[1] = '\0'; + strcat(binary, buffer); + + if (debug) { + printf("Number block (length %d)\n\t", short_data_block_length); + } + + /* Character representation */ + i = 0; + while (i < short_data_block_length) { + int count; + int first = 0, second = 0, third = 0, prod; + + first = posn(NEON, (char) jisdata[position + i]); + count = 1; + prod = first; + + if (i + 1 < short_data_block_length && mode[position + i + 1] == 'N') { + second = posn(NEON, (char) jisdata[position + i + 1]); + count = 2; + prod = (prod * 10) + second; + } + + if (i + 2 < short_data_block_length && mode[position + i + 2] == 'N') { + third = posn(NEON, (char) jisdata[position + i + 2]); + count = 3; + prod = (prod * 10) + third; + } + + bin_append(prod, 1 + (3 * count), binary); + + if (debug) { + printf("0x%4X (%d)", prod, prod); + } + + if (strlen(binary) > 128) { + return ZINT_ERROR_TOO_LONG; + } + + i += 3; + }; + + if (debug) { + printf("\n"); + } + + break; + } + + position += short_data_block_length; + } while (position < length - 1); + + return 0; +} + +static void get_bitlength(int count[],const char stream[]) { + size_t length; + int i; + + length = strlen(stream); + + for (i = 0; i < 4; i++) { + count[i] = 0; + } + + i = 0; + do { + if ((stream[i] == '0') || (stream[i] == '1')) { + count[0]++; + count[1]++; + count[2]++; + count[3]++; + i++; + } else { + switch (stream[i]) { + case 'K': + count[2] += 5; + count[3] += 7; + i += 2; + break; + case 'B': + count[2] += 6; + count[3] += 8; + i += 2; + break; + case 'A': + count[1] += 4; + count[2] += 6; + count[3] += 8; + i += 2; + break; + case 'N': + count[0] += 3; + count[1] += 5; + count[2] += 7; + count[3] += 9; + i += 2; + break; + } + } + } while (i < length); +} + +static void microqr_expand_binary(const char binary_stream[], char full_stream[],const int version) { + int i; + size_t length; + + length = strlen(binary_stream); + + i = 0; + do { + switch (binary_stream[i]) { + case '1': strcat(full_stream, "1"); + i++; + break; + case '0': strcat(full_stream, "0"); + i++; + break; + case 'N': + /* Numeric Mode */ + /* Mode indicator */ + switch (version) { + case 1: strcat(full_stream, "0"); + break; + case 2: strcat(full_stream, "00"); + break; + case 3: strcat(full_stream, "000"); + break; + } + + /* Character count indicator */ + bin_append(binary_stream[i + 1], 3 + version, full_stream); /* version = 0..3 */ + + i += 2; + break; + case 'A': + /* Alphanumeric Mode */ + /* Mode indicator */ + switch (version) { + case 1: strcat(full_stream, "1"); + break; + case 2: strcat(full_stream, "01"); + break; + case 3: strcat(full_stream, "001"); + break; + } + + /* Character count indicator */ + bin_append(binary_stream[i + 1], 2 + version, full_stream); /* version = 1..3 */ + + i += 2; + break; + case 'B': + /* Byte Mode */ + /* Mode indicator */ + switch (version) { + case 2: strcat(full_stream, "10"); + break; + case 3: strcat(full_stream, "010"); + break; + } + + /* Character count indicator */ + bin_append(binary_stream[i + 1], 2 + version, full_stream); /* version = 2..3 */ + + i += 2; + break; + case 'K': + /* Kanji Mode */ + /* Mode indicator */ + switch (version) { + case 2: strcat(full_stream, "11"); + break; + case 3: strcat(full_stream, "011"); + break; + } + + /* Character count indicator */ + bin_append(binary_stream[i + 1], 1 + version, full_stream); /* version = 2..3 */ + + i += 2; + break; + } + + } while (i < length); +} + +static void micro_qr_m1(char binary_data[]) { + int i, j, latch; + int bits_total, bits_left, remainder; + int data_codewords, ecc_codewords; + unsigned char data_blocks[4], ecc_blocks[3]; + + bits_total = 20; + latch = 0; + + /* Add terminator */ + bits_left = bits_total - (int)strlen(binary_data); + if (bits_left <= 3) { + for (i = 0; i < bits_left; i++) { + strcat(binary_data, "0"); + } + latch = 1; + } else { + strcat(binary_data, "000"); + } + + if (latch == 0) { + /* Manage last (4-bit) block */ + bits_left = bits_total - (int)strlen(binary_data); + if (bits_left <= 4) { + for (i = 0; i < bits_left; i++) { + strcat(binary_data, "0"); + } + latch = 1; + } + } + + if (latch == 0) { + /* Complete current byte */ + remainder = 8 - (strlen(binary_data) % 8); + if (remainder == 8) { + remainder = 0; + } + for (i = 0; i < remainder; i++) { + strcat(binary_data, "0"); + } + + /* Add padding */ + bits_left = bits_total - (int)strlen(binary_data); + if (bits_left > 4) { + remainder = (bits_left - 4) / 8; + for (i = 0; i < remainder; i++) { + strcat(binary_data, i & 1 ? "00010001" : "11101100"); + } + } + bin_append(0, 4, binary_data); + } + + data_codewords = 3; + ecc_codewords = 2; + + /* Copy data into codewords */ + for (i = 0; i < (data_codewords - 1); i++) { + data_blocks[i] = 0; + for (j = 0; j < 8; j++) { + if (binary_data[(i * 8) + j] == '1') { + data_blocks[i] += 0x80 >> j; + } + } + } + data_blocks[2] = 0; + for (j = 0; j < 4; j++) { + if (binary_data[16 + j] == '1') { + data_blocks[2] += 0x80 >> j; + } + } + + /* Calculate Reed-Solomon error codewords */ + rs_init_gf(0x11d); + rs_init_code(ecc_codewords, 0); + rs_encode(data_codewords, data_blocks, ecc_blocks); + rs_free(); + + /* Add Reed-Solomon codewords to binary data */ + for (i = 0; i < ecc_codewords; i++) { + bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data); + } +} + +static void micro_qr_m2(char binary_data[],const int ecc_mode) { + int i, j, latch; + int bits_total=0, bits_left, remainder; + int data_codewords=0, ecc_codewords=0; + unsigned char data_blocks[6], ecc_blocks[7]; + + latch = 0; + + if (ecc_mode == LEVEL_L) { + bits_total = 40; + } + else if (ecc_mode == LEVEL_M) { + bits_total = 32; + } + else assert(0); + + /* Add terminator */ + bits_left = bits_total - (int)strlen(binary_data); + if (bits_left <= 5) { + for (i = 0; i < bits_left; i++) { + strcat(binary_data, "0"); + } + latch = 1; + } else { + bin_append(0, 5, binary_data); + } + + if (latch == 0) { + /* Complete current byte */ + remainder = 8 - (strlen(binary_data) % 8); + if (remainder == 8) { + remainder = 0; + } + for (i = 0; i < remainder; i++) { + strcat(binary_data, "0"); + } + + /* Add padding */ + bits_left = bits_total - (int)strlen(binary_data); + remainder = bits_left / 8; + for (i = 0; i < remainder; i++) { + strcat(binary_data, i & 1 ? "00010001" : "11101100"); + } + } + + if (ecc_mode == LEVEL_L) { + data_codewords = 5; + ecc_codewords = 5; + } + else if (ecc_mode == LEVEL_M) { + data_codewords = 4; + ecc_codewords = 6; + } + else assert(0); + + /* Copy data into codewords */ + for (i = 0; i < data_codewords; i++) { + data_blocks[i] = 0; + + for (j = 0; j < 8; j++) { + if (binary_data[(i * 8) + j] == '1') { + data_blocks[i] += 0x80 >> j; + } + } + } + + /* Calculate Reed-Solomon error codewords */ + rs_init_gf(0x11d); + rs_init_code(ecc_codewords, 0); + rs_encode(data_codewords, data_blocks, ecc_blocks); + rs_free(); + + /* Add Reed-Solomon codewords to binary data */ + for (i = 0; i < ecc_codewords; i++) { + bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data); + } + + return; +} + +static void micro_qr_m3(char binary_data[],const int ecc_mode) { + int i, j, latch; + int bits_total=0, bits_left, remainder; + int data_codewords=0, ecc_codewords=0; + unsigned char data_blocks[12], ecc_blocks[9]; + + latch = 0; + + if (ecc_mode == LEVEL_L) { + bits_total = 84; + } + else if (ecc_mode == LEVEL_M) { + bits_total = 68; + } + else assert(0); + + /* Add terminator */ + bits_left = bits_total - (int)strlen(binary_data); + if (bits_left <= 7) { + for (i = 0; i < bits_left; i++) { + strcat(binary_data, "0"); + } + latch = 1; + } else { + bin_append(0, 7, binary_data); + } + + if (latch == 0) { + /* Manage last (4-bit) block */ + bits_left = bits_total - (int)strlen(binary_data); + if (bits_left <= 4) { + for (i = 0; i < bits_left; i++) { + strcat(binary_data, "0"); + } + latch = 1; + } + } + + if (latch == 0) { + /* Complete current byte */ + remainder = 8 - (strlen(binary_data) % 8); + if (remainder == 8) { + remainder = 0; + } + for (i = 0; i < remainder; i++) { + strcat(binary_data, "0"); + } + + /* Add padding */ + bits_left = bits_total - (int)strlen(binary_data); + if (bits_left > 4) { + remainder = (bits_left - 4) / 8; + for (i = 0; i < remainder; i++) { + strcat(binary_data, i & 1 ? "00010001" : "11101100"); + } + } + bin_append(0, 4, binary_data); + } + + if (ecc_mode == LEVEL_L) { + data_codewords = 11; + ecc_codewords = 6; + } + else if (ecc_mode == LEVEL_M) { + data_codewords = 9; + ecc_codewords = 8; + } + else assert(0); + + /* Copy data into codewords */ + for (i = 0; i < (data_codewords - 1); i++) { + data_blocks[i] = 0; + + for (j = 0; j < 8; j++) { + if (binary_data[(i * 8) + j] == '1') { + data_blocks[i] += 0x80 >> j; + } + } + } + + if (ecc_mode == LEVEL_L) { + data_blocks[10] = 0; + for (j = 0; j < 4; j++) { + if (binary_data[80 + j] == '1') { + data_blocks[10] += 0x80 >> j; + } + } + } + + if (ecc_mode == LEVEL_M) { + data_blocks[8] = 0; + for (j = 0; j < 4; j++) { + if (binary_data[64 + j] == '1') { + data_blocks[8] += 0x80 >> j; + } + } + } + + /* Calculate Reed-Solomon error codewords */ + rs_init_gf(0x11d); + rs_init_code(ecc_codewords, 0); + rs_encode(data_codewords, data_blocks, ecc_blocks); + rs_free(); + + /* Add Reed-Solomon codewords to binary data */ + for (i = 0; i < ecc_codewords; i++) { + bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data); + } + + return; +} + +static void micro_qr_m4(char binary_data[],const int ecc_mode) { + int i, j, latch; + int bits_total=0, bits_left, remainder; + int data_codewords=0, ecc_codewords=0; + unsigned char data_blocks[17], ecc_blocks[15]; + + latch = 0; + + if (ecc_mode == LEVEL_L) { + bits_total = 128; + } + else if (ecc_mode == LEVEL_M) { + bits_total = 112; + } + else if (ecc_mode == LEVEL_Q) { + bits_total = 80; + } + else assert(0); + + /* Add terminator */ + bits_left = bits_total - (int)strlen(binary_data); + if (bits_left <= 9) { + for (i = 0; i < bits_left; i++) { + strcat(binary_data, "0"); + } + latch = 1; + } else { + bin_append(0, 9, binary_data); + } + + if (latch == 0) { + /* Complete current byte */ + remainder = 8 - (strlen(binary_data) % 8); + if (remainder == 8) { + remainder = 0; + } + for (i = 0; i < remainder; i++) { + strcat(binary_data, "0"); + } + + /* Add padding */ + bits_left = bits_total - (int)strlen(binary_data); + remainder = bits_left / 8; + for (i = 0; i < remainder; i++) { + strcat(binary_data, i & 1 ? "00010001" : "11101100"); + } + } + + if (ecc_mode == LEVEL_L) { + data_codewords = 16; + ecc_codewords = 8; + } + else if (ecc_mode == LEVEL_M) { + data_codewords = 14; + ecc_codewords = 10; + } + else if (ecc_mode == LEVEL_Q) { + data_codewords = 10; + ecc_codewords = 14; + } + else assert(0); + + /* Copy data into codewords */ + for (i = 0; i < data_codewords; i++) { + data_blocks[i] = 0; + + for (j = 0; j < 8; j++) { + if (binary_data[(i * 8) + j] == '1') { + data_blocks[i] += 0x80 >> j; + } + } + } + + /* Calculate Reed-Solomon error codewords */ + rs_init_gf(0x11d); + rs_init_code(ecc_codewords, 0); + rs_encode(data_codewords, data_blocks, ecc_blocks); + rs_free(); + + /* Add Reed-Solomon codewords to binary data */ + for (i = 0; i < ecc_codewords; i++) { + bin_append(ecc_blocks[ecc_codewords - i - 1], 8, binary_data); + } +} + +static void micro_setup_grid(unsigned char* grid,const int size) { + int i, toggle = 1; + + /* Add timing patterns */ + for (i = 0; i < size; i++) { + if (toggle == 1) { + grid[i] = 0x21; + grid[(i * size)] = 0x21; + toggle = 0; + } else { + grid[i] = 0x20; + grid[(i * size)] = 0x20; + toggle = 1; + } + } + + /* Add finder patterns */ + place_finder(grid, size, 0, 0); + + /* Add separators */ + for (i = 0; i < 7; i++) { + grid[(7 * size) + i] = 0x10; + grid[(i * size) + 7] = 0x10; + } + grid[(7 * size) + 7] = 0x10; + + + /* Reserve space for format information */ + for (i = 0; i < 8; i++) { + grid[(8 * size) + i] += 0x20; + grid[(i * size) + 8] += 0x20; + } + grid[(8 * size) + 8] += 20; +} + +static void micro_populate_grid(unsigned char* grid,const int size,const char full_stream[]) { + int direction = 1; /* up */ + int row = 0; /* right hand side */ + size_t n; + int i,x, y; + + n = strlen(full_stream); + y = size - 1; + i = 0; + do { + x = (size - 2) - (row * 2); + + if (!(grid[(y * size) + (x + 1)] & 0xf0)) { + if (full_stream[i] == '1') { + grid[(y * size) + (x + 1)] = 0x01; + } else { + grid[(y * size) + (x + 1)] = 0x00; + } + i++; + } + + if (i < n) { + if (!(grid[(y * size) + x] & 0xf0)) { + if (full_stream[i] == '1') { + grid[(y * size) + x] = 0x01; + } else { + grid[(y * size) + x] = 0x00; + } + i++; + } + } + + if (direction) { + y--; + } else { + y++; + } + if (y == 0) { + /* reached the top */ + row++; + y = 1; + direction = 0; + } + if (y == size) { + /* reached the bottom */ + row++; + y = size - 1; + direction = 1; + } + } while (i < n); +} + +static int micro_evaluate(const unsigned char *grid,const int size,const int pattern) { + int sum1, sum2, i, filter = 0, retval; + + switch (pattern) { + case 0: filter = 0x01; + break; + case 1: filter = 0x02; + break; + case 2: filter = 0x04; + break; + case 3: filter = 0x08; + break; + } + + sum1 = 0; + sum2 = 0; + for (i = 1; i < size; i++) { + if (grid[(i * size) + size - 1] & filter) { + sum1++; + } + if (grid[((size - 1) * size) + i] & filter) { + sum2++; + } + } + + if (sum1 <= sum2) { + retval = (sum1 * 16) + sum2; + } else { + retval = (sum2 * 16) + sum1; + } + + return retval; +} + +static int micro_apply_bitmask(unsigned char *grid,const int size) { + int x, y; + unsigned char p; + int pattern, value[8]; + int best_val, best_pattern; + +#ifndef _MSC_VER + unsigned char mask[size * size]; + unsigned char eval[size * size]; +#else + unsigned char* mask = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); + unsigned char* eval = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); +#endif + + /* Perform data masking */ + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + mask[(y * size) + x] = 0x00; + + if (!(grid[(y * size) + x] & 0xf0)) { + if ((y & 1) == 0) { + mask[(y * size) + x] += 0x01; + } + + if ((((y / 2) + (x / 3)) & 1) == 0) { + mask[(y * size) + x] += 0x02; + } + + if (((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) { + mask[(y * size) + x] += 0x04; + } + + if (((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) { + mask[(y * size) + x] += 0x08; + } + } + } + } + + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if (grid[(y * size) + x] & 0x01) { + p = 0xff; + } else { + p = 0x00; + } + + eval[(y * size) + x] = mask[(y * size) + x] ^ p; + } + } + + + /* Evaluate result */ + for (pattern = 0; pattern < 8; pattern++) { + value[pattern] = micro_evaluate(eval, size, pattern); + } + + best_pattern = 0; + best_val = value[0]; + for (pattern = 1; pattern < 4; pattern++) { + if (value[pattern] > best_val) { + best_pattern = pattern; + best_val = value[pattern]; + } + } + + /* Apply mask */ + for (x = 0; x < size; x++) { + for (y = 0; y < size; y++) { + if (mask[(y * size) + x] & (0x01 << best_pattern)) { + if (grid[(y * size) + x] & 0x01) { + grid[(y * size) + x] = 0x00; + } else { + grid[(y * size) + x] = 0x01; + } + } + } + } + + return best_pattern; +} + +int microqr(struct zint_symbol *symbol, const unsigned char source[], size_t length) { + size_t i; + int j,size; + char binary_stream[200]; + char full_stream[200]; + int utfdata[40],glyph; + + int jisdata[40]; + char mode[40]; + int error_number, kanji_used = 0, alphanum_used = 0, byte_used = 0; + int version_valid[4]; + int binary_count[4]; + int ecc_level, autoversion, version; + int n_count, a_count, bitmask, format, format_full; +#ifdef _MSC_VER + unsigned char* grid; +#endif + + if (length > 35) { + strcpy(symbol->errtxt, "562: Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + + for (i = 0; i < 4; i++) { + version_valid[i] = 1; + } + + if (symbol->input_mode == DATA_MODE) { + for (i = 0; i < length; i++) { + jisdata[i] = (int) source[i]; + } + } else { + /* Convert Unicode input to Shift-JIS */ + error_number = utf8toutf16(symbol, source, utfdata, &length); + if (error_number != 0) { + return error_number; + } + + for (i = 0; i < length; i++) { + if (utfdata[i] <= 0xff) { + jisdata[i] = utfdata[i]; + } else { + j = 0; + glyph = 0; + do { + if (sjis_lookup[j * 2] == utfdata[i]) { + glyph = sjis_lookup[(j * 2) + 1]; + } + j++; + } while ((j < 6843) && (glyph == 0)); + if (glyph == 0) { + strcpy(symbol->errtxt, "563: Invalid character in input data"); + return ZINT_ERROR_INVALID_DATA; + } + jisdata[i] = glyph; + } + } + } + + define_mode(mode, jisdata, length, 0); + + n_count = 0; + a_count = 0; + for (i = 0; i < length; i++) { + if ((jisdata[i] >= '0') && (jisdata[i] <= '9')) { + n_count++; + } + if (in_alpha(jisdata[i])) { + a_count++; + } + } + + if (a_count == length) { + /* All data can be encoded in Alphanumeric mode */ + for (i = 0; i < length; i++) { + mode[i] = 'A'; + } + } + + if (n_count == length) { + /* All data can be encoded in Numeric mode */ + for (i = 0; i < length; i++) { + mode[i] = 'N'; + } + } + + error_number = micro_qr_intermediate(binary_stream, jisdata, mode, length, &kanji_used, &alphanum_used, &byte_used, symbol->debug); + if (error_number != 0) { + strcpy(symbol->errtxt, "564: Input data too long"); + return error_number; + } + + get_bitlength(binary_count, binary_stream); + + /* Eliminate possivle versions depending on type of content */ + if (byte_used) { + version_valid[0] = 0; + version_valid[1] = 0; + } + + if (alphanum_used) { + version_valid[0] = 0; + } + + if (kanji_used) { + version_valid[0] = 0; + version_valid[1] = 0; + } + + /* Eliminate possible versions depending on length of binary data */ + if (binary_count[0] > 20) { + version_valid[0] = 0; + } + if (binary_count[1] > 40) { + version_valid[1] = 0; + } + if (binary_count[2] > 84) { + version_valid[2] = 0; + } + if (binary_count[3] > 128) { + strcpy(symbol->errtxt, "565: Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* Eliminate possible versions depending on error correction level specified */ + ecc_level = LEVEL_L; + if ((symbol->option_1 >= 1) && (symbol->option_2 <= 4)) { + ecc_level = symbol->option_1; + } + + if (ecc_level == LEVEL_H) { + strcpy(symbol->errtxt, "566: Error correction level H not available"); + return ZINT_ERROR_INVALID_OPTION; + } + + if (ecc_level == LEVEL_Q) { + version_valid[0] = 0; + version_valid[1] = 0; + version_valid[2] = 0; + if (binary_count[3] > 80) { + strcpy(symbol->errtxt, "567: Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + } + + if (ecc_level == LEVEL_M) { + version_valid[0] = 0; + if (binary_count[1] > 32) { + version_valid[1] = 0; + } + if (binary_count[2] > 68) { + version_valid[2] = 0; + } + if (binary_count[3] > 112) { + strcpy(symbol->errtxt, "568: Input data too long"); + return ZINT_ERROR_TOO_LONG; + } + } + + autoversion = 3; + if (version_valid[2]) { + autoversion = 2; + } + if (version_valid[1]) { + autoversion = 1; + } + if (version_valid[0]) { + autoversion = 0; + } + + version = autoversion; + /* Get version from user */ + if ((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) { + if (symbol->option_2 >= autoversion) { + version = symbol->option_2; + } else { + strcpy(symbol->errtxt, "570: Input too long for selected symbol size"); + return ZINT_ERROR_TOO_LONG; + } + } + + /* If there is enough unused space then increase the error correction level */ + if (version == 3) { + if (binary_count[3] <= 112) { + ecc_level = LEVEL_M; + } + if (binary_count[3] <= 80) { + ecc_level = LEVEL_Q; + } + } + + if (version == 2) { + if (binary_count[2] <= 68) { + ecc_level = LEVEL_M; + } + } + + if (version == 1) { + if (binary_count[1] <= 32) { + ecc_level = LEVEL_M; + } + } + + strcpy(full_stream, ""); + microqr_expand_binary(binary_stream, full_stream, version); + + switch (version) { + case 0: micro_qr_m1(full_stream); + break; + case 1: micro_qr_m2(full_stream, ecc_level); + break; + case 2: micro_qr_m3(full_stream, ecc_level); + break; + case 3: micro_qr_m4(full_stream, ecc_level); + break; + } + + size = micro_qr_sizes[version]; +#ifndef _MSC_VER + unsigned char grid[size * size]; +#else + grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); +#endif + + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + grid[(i * size) + j] = 0; + } + } + + micro_setup_grid(grid, size); + micro_populate_grid(grid, size, full_stream); + bitmask = micro_apply_bitmask(grid, size); + + /* Add format data */ + format = 0; + switch (version) { + case 1: switch (ecc_level) { + case 1: format = 1; + break; + case 2: format = 2; + break; + } + break; + case 2: switch (ecc_level) { + case 1: format = 3; + break; + case 2: format = 4; + break; + } + break; + case 3: switch (ecc_level) { + case 1: format = 5; + break; + case 2: format = 6; + break; + case 3: format = 7; + break; + } + break; + } + + format_full = qr_annex_c1[(format << 2) + bitmask]; + + if (format_full & 0x4000) { + grid[(8 * size) + 1] += 0x01; + } + if (format_full & 0x2000) { + grid[(8 * size) + 2] += 0x01; + } + if (format_full & 0x1000) { + grid[(8 * size) + 3] += 0x01; + } + if (format_full & 0x800) { + grid[(8 * size) + 4] += 0x01; + } + if (format_full & 0x400) { + grid[(8 * size) + 5] += 0x01; + } + if (format_full & 0x200) { + grid[(8 * size) + 6] += 0x01; + } + if (format_full & 0x100) { + grid[(8 * size) + 7] += 0x01; + } + if (format_full & 0x80) { + grid[(8 * size) + 8] += 0x01; + } + if (format_full & 0x40) { + grid[(7 * size) + 8] += 0x01; + } + if (format_full & 0x20) { + grid[(6 * size) + 8] += 0x01; + } + if (format_full & 0x10) { + grid[(5 * size) + 8] += 0x01; + } + if (format_full & 0x08) { + grid[(4 * size) + 8] += 0x01; + } + if (format_full & 0x04) { + grid[(3 * size) + 8] += 0x01; + } + if (format_full & 0x02) { + grid[(2 * size) + 8] += 0x01; + } + if (format_full & 0x01) { + grid[(1 * size) + 8] += 0x01; + } + + symbol->width = size; + symbol->rows = size; + + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + if (grid[(i * size) + j] & 0x01) { + set_module(symbol, i, j); + } + } + symbol->row_height[i] = 1; + } + + return 0; +} + +/* For UPNQR the symbol size and error correction capacity is fixed */ +int upnqr(struct zint_symbol *symbol, const unsigned char source[], size_t length) { + int i, j, est_binlen; + int ecc_level, version, target_binlen, blocks, size; + int bitmask, error_number; + +#ifndef _MSC_VER + int jisdata[length + 1]; + char mode[length + 1]; +#else + int* datastream; + int* fullstream; + unsigned char* grid; + int* jisdata = (int *) _alloca((length + 1) * sizeof (int)); + char* mode = (char *) _alloca(length + 1); +#endif + +#ifndef _MSC_VER + unsigned char preprocessed[length + 1]; +#else + unsigned char* preprocessed = (unsigned char*) _alloca(length + 1); +#endif + + switch(symbol->input_mode) { + case DATA_MODE: + /* Input is already in ISO-8859-2 format */ + for (i = 0; i < length; i++) { + jisdata[i] = (int) source[i]; + mode[i] = 'B'; + } + break; + case GS1_MODE: + strcpy(symbol->errtxt, "571: UPNQR does not support GS-1 encoding"); + return ZINT_ERROR_INVALID_OPTION; + break; + case UNICODE_MODE: + error_number = utf_to_eci(4, source, preprocessed, &length); + if (error_number != 0) { + strcpy(symbol->errtxt, "572: Invalid characters in input data"); + return error_number; + } + for (i = 0; i < length; i++) { + jisdata[i] = (int) preprocessed[i]; + mode[i] = 'B'; + } + break; + } + + symbol->eci = 4; + est_binlen = getBinaryLength(15, mode, jisdata, length, 0, symbol->eci); + + ecc_level = LEVEL_M; + + if (est_binlen > 3320) { + strcpy(symbol->errtxt, "573: Input too long for selected symbol"); + return ZINT_ERROR_TOO_LONG; + } + + version = 15; // 77 x 77 + + target_binlen = qr_data_codewords_M[version - 1]; + blocks = qr_blocks_M[version - 1]; + +#ifndef _MSC_VER + int datastream[target_binlen + 1]; + int fullstream[qr_total_codewords[version - 1] + 1]; +#else + datastream = (int *) _alloca((target_binlen + 1) * sizeof (int)); + fullstream = (int *) _alloca((qr_total_codewords[version - 1] + 1) * sizeof (int)); +#endif + + qr_binary(datastream, version, target_binlen, mode, jisdata, length, 0, symbol->eci, est_binlen, symbol->debug); + add_ecc(fullstream, datastream, version, target_binlen, blocks); + + size = qr_sizes[version - 1]; +#ifndef _MSC_VER + unsigned char grid[size * size]; +#else + grid = (unsigned char *) _alloca((size * size) * sizeof (unsigned char)); +#endif + + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + grid[(i * size) + j] = 0; + } + } + + setup_grid(grid, size, version); + populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]); + + add_version_info(grid, size, version); + + bitmask = apply_bitmask(grid, size, ecc_level); + + add_format_info(grid, size, ecc_level, bitmask); + + symbol->width = size; + symbol->rows = size; + + for (i = 0; i < size; i++) { + for (j = 0; j < size; j++) { + if (grid[(i * size) + j] & 0x01) { + set_module(symbol, i, j); + } + } + symbol->row_height[i] = 1; + } + + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/qr.h b/3rdparty/zint-2.6.1/backend/qr.h new file mode 100644 index 0000000..c5a23c9 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/qr.h @@ -0,0 +1,167 @@ +/* qr.h Data for QR Code */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + Copyright (C) 2006 Kentaro Fukuchi + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#define LEVEL_L 1 +#define LEVEL_M 2 +#define LEVEL_Q 3 +#define LEVEL_H 4 + +#define RHODIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:" + +/* From ISO/IEC 18004:2006 Table 7 */ +static const unsigned short int qr_data_codewords_L[] = { + 19, 34, 55, 80, 108, 136, 156, 194, 232, 274, 324, 370, 428, 461, 523, 589, 647, + 721, 795, 861, 932, 1006, 1094, 1174, 1276, 1370, 1468, 1531, 1631, + 1735, 1843, 1955, 2071, 2191, 2306, 2434, 2566, 2702, 2812, 2956 +}; + +static const unsigned short int qr_data_codewords_M[] = { + 16, 28, 44, 64, 86, 108, 124, 154, 182, 216, 254, 290, 334, 365, 415, 453, 507, + 563, 627, 669, 714, 782, 860, 914, 1000, 1062, 1128, 1193, 1267, + 1373, 1455, 1541, 1631, 1725, 1812, 1914, 1992, 2102, 2216, 2334 +}; + +static const unsigned short int qr_data_codewords_Q[] = { + 13, 22, 34, 48, 62, 76, 88, 110, 132, 154, 180, 206, 244, 261, 295, 325, 367, + 397, 445, 485, 512, 568, 614, 664, 718, 754, 808, 871, 911, + 985, 1033, 1115, 1171, 1231, 1286, 1354, 1426, 1502, 1582, 1666 +}; + +static const unsigned short int qr_data_codewords_H[] = { + 9, 16, 26, 36, 46, 60, 66, 86, 100, 122, 140, 158, 180, 197, 223, 253, 283, + 313, 341, 385, 406, 442, 464, 514, 538, 596, 628, 661, 701, + 745, 793, 845, 901, 961, 986, 1054, 1096, 1142, 1222, 1276 +}; + +static const unsigned short int qr_total_codewords[] = { + 26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815, + 901, 991, 1085, 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, + 2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706 +}; + +static const char qr_blocks_L[] = { + 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, + 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25 +}; + +static const char qr_blocks_M[] = { + 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, + 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49 +}; + +static const char qr_blocks_Q[] = { + 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, + 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68 +}; + +static const char qr_blocks_H[] = { + 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, + 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81 +}; + +static const unsigned short int qr_sizes[] = { + 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, + 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177 +}; + +static const char micro_qr_sizes[] = { + 11, 13, 15, 17 +}; + +static const char qr_align_loopsize[] = { + 0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7 +}; + +static const unsigned short int qr_table_e1[] = { + 6, 18, 0, 0, 0, 0, 0, + 6, 22, 0, 0, 0, 0, 0, + 6, 26, 0, 0, 0, 0, 0, + 6, 30, 0, 0, 0, 0, 0, + 6, 34, 0, 0, 0, 0, 0, + 6, 22, 38, 0, 0, 0, 0, + 6, 24, 42, 0, 0, 0, 0, + 6, 26, 46, 0, 0, 0, 0, + 6, 28, 50, 0, 0, 0, 0, + 6, 30, 54, 0, 0, 0, 0, + 6, 32, 58, 0, 0, 0, 0, + 6, 34, 62, 0, 0, 0, 0, + 6, 26, 46, 66, 0, 0, 0, + 6, 26, 48, 70, 0, 0, 0, + 6, 26, 50, 74, 0, 0, 0, + 6, 30, 54, 78, 0, 0, 0, + 6, 30, 56, 82, 0, 0, 0, + 6, 30, 58, 86, 0, 0, 0, + 6, 34, 62, 90, 0, 0, 0, + 6, 28, 50, 72, 94, 0, 0, + 6, 26, 50, 74, 98, 0, 0, + 6, 30, 54, 78, 102, 0, 0, + 6, 28, 54, 80, 106, 0, 0, + 6, 32, 58, 84, 110, 0, 0, + 6, 30, 58, 86, 114, 0, 0, + 6, 34, 62, 90, 118, 0, 0, + 6, 26, 50, 74, 98, 122, 0, + 6, 30, 54, 78, 102, 126, 0, + 6, 26, 52, 78, 104, 130, 0, + 6, 30, 56, 82, 108, 134, 0, + 6, 34, 60, 86, 112, 138, 0, + 6, 30, 58, 86, 114, 142, 0, + 6, 34, 62, 90, 118, 146, 0, + 6, 30, 54, 78, 102, 126, 150, + 6, 24, 50, 76, 102, 128, 154, + 6, 28, 54, 80, 106, 132, 158, + 6, 32, 58, 84, 110, 136, 162, + 6, 26, 54, 82, 110, 138, 166, + 6, 30, 58, 86, 114, 142, 170 +}; + +static const unsigned int qr_annex_c[] = { + /* Format information bit sequences */ + 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, 0x77c4, 0x72f3, 0x7daa, 0x789d, + 0x662f, 0x6318, 0x6c41, 0x6976, 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b, + 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed +}; + +static const unsigned int qr_annex_d[] = { + /* Version information bit sequences */ + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78, + 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab, + 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, + 0x2542e, 0x26a64, 0x27541, 0x28c69 +}; + +static const unsigned int qr_annex_c1[] = { + /* Micro QR Code format information */ + 0x4445, 0x4172, 0x4e2b, 0x4b1c, 0x55ae, 0x5099, 0x5fc0, 0x5af7, 0x6793, 0x62a4, 0x6dfd, 0x68ca, 0x7678, 0x734f, + 0x7c16, 0x7921, 0x06de, 0x03e9, 0x0cb0, 0x0987, 0x1735, 0x1202, 0x1d5b, 0x186c, 0x2508, 0x203f, 0x2f66, 0x2a51, 0x34e3, + 0x31d4, 0x3e8d, 0x3bba +}; diff --git a/3rdparty/zint-2.6.1/backend/raster.c b/3rdparty/zint-2.6.1/backend/raster.c new file mode 100644 index 0000000..08bf9a7 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/raster.c @@ -0,0 +1,1138 @@ +/* raster.c - Handles output to raster files */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#ifdef _MSC_VER +#include +#include +#endif +#include +#include +#include "common.h" + +#ifdef _MSC_VER +#include +#endif /* _MSC_VER */ + +#include "font.h" /* Font for human readable text */ + +#define SSET "0123456789ABCDEF" + +#ifndef NO_PNG +extern int png_pixel_plot(struct zint_symbol *symbol, char *pixelbuf); +#endif /* NO_PNG */ +extern int bmp_pixel_plot(struct zint_symbol *symbol, char *pixelbuf); +extern int pcx_pixel_plot(struct zint_symbol *symbol, char *pixelbuf); +extern int gif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf); +extern int tif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf); + +void buffer_plot(struct zint_symbol *symbol, char *pixelbuf) { + /* Place pixelbuffer into symbol */ + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + int row, column, i; + + symbol->bitmap = (char *) malloc(symbol->bitmap_width * symbol->bitmap_height * 3); + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + for (row = 0; row < symbol->bitmap_height; row++) { + for (column = 0; column < symbol->bitmap_width; column++) { + i = ((row * symbol->bitmap_width) + column) * 3; + switch (*(pixelbuf + (symbol->bitmap_width * row) + column)) { + case '1': + symbol->bitmap[i] = fgred; + symbol->bitmap[i + 1] = fggrn; + symbol->bitmap[i + 2] = fgblu; + break; + default: + symbol->bitmap[i] = bgred; + symbol->bitmap[i + 1] = bggrn; + symbol->bitmap[i + 2] = bgblu; + break; + + } + } + } +} + +int save_raster_image_to_file(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle, int image_type) { + int error_number; + int row, column; + + char *rotated_pixbuf; + + if (!(rotated_pixbuf = (char *) malloc(image_width * image_height))) { + strcpy(symbol->errtxt, "650: Insufficient memory for pixel buffer"); + return ZINT_ERROR_ENCODING_PROBLEM; + } + + switch (rotate_angle) { + case 0: + case 180: + symbol->bitmap_width = image_width; + symbol->bitmap_height = image_height; + break; + case 90: + case 270: + symbol->bitmap_width = image_height; + symbol->bitmap_height = image_width; + break; + } + + /* sort out colour options */ + to_upper((unsigned char*) symbol->fgcolour); + to_upper((unsigned char*) symbol->bgcolour); + + if (strlen(symbol->fgcolour) != 6) { + strcpy(symbol->errtxt, "651: Malformed foreground colour target"); + free(rotated_pixbuf); + return ZINT_ERROR_INVALID_OPTION; + } + if (strlen(symbol->bgcolour) != 6) { + strcpy(symbol->errtxt, "652: Malformed background colour target"); + free(rotated_pixbuf); + return ZINT_ERROR_INVALID_OPTION; + } + error_number = is_sane(SSET, (unsigned char*) symbol->fgcolour, strlen(symbol->fgcolour)); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "653: Malformed foreground colour target"); + free(rotated_pixbuf); + return ZINT_ERROR_INVALID_OPTION; + } + error_number = is_sane(SSET, (unsigned char*) symbol->bgcolour, strlen(symbol->fgcolour)); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "654: Malformed background colour target"); + free(rotated_pixbuf); + return ZINT_ERROR_INVALID_OPTION; + } + + /* Rotate image before plotting */ + switch (rotate_angle) { + case 0: /* Plot the right way up */ + for (row = 0; row < image_height; row++) { + for (column = 0; column < image_width; column++) { + rotated_pixbuf[(row * image_width) + column] = + pixelbuf[(image_width * row) + column]; + } + } + break; + case 90: /* Plot 90 degrees clockwise */ + for (row = 0; row < image_width; row++) { + for (column = 0; column < image_height; column++) { + rotated_pixbuf[(row * image_height) + column] = + *(pixelbuf + (image_width * (image_height - column - 1)) + row); + } + } + break; + case 180: /* Plot upside down */ + for (row = 0; row < image_height; row++) { + for (column = 0; column < image_width; column++) { + rotated_pixbuf[(row * image_width) + column] = + *(pixelbuf + (image_width * (image_height - row - 1)) + (image_width - column - 1)); + } + } + break; + case 270: /* Plot 90 degrees anti-clockwise */ + for (row = 0; row < image_width; row++) { + for (column = 0; column < image_height; column++) { + rotated_pixbuf[(row * image_height) + column] = + *(pixelbuf + (image_width * column) + (image_width - row - 1)); + } + } + break; + } + + switch (image_type) { + case OUT_BUFFER: + buffer_plot(symbol, rotated_pixbuf); + error_number = 0; + break; + case OUT_PNG_FILE: +#ifndef NO_PNG + error_number = png_pixel_plot(symbol, rotated_pixbuf); +#else + free(rotated_pixbuf); + return ZINT_ERROR_INVALID_OPTION; +#endif + break; + case OUT_PCX_FILE: + error_number = pcx_pixel_plot(symbol, rotated_pixbuf); + break; + case OUT_GIF_FILE: + error_number = gif_pixel_plot(symbol, rotated_pixbuf); + break; + case OUT_TIF_FILE: + error_number = tif_pixel_plot(symbol, rotated_pixbuf); + break; + default: + error_number = bmp_pixel_plot(symbol, rotated_pixbuf); + break; + } + + free(rotated_pixbuf); + return error_number; +} + +void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height) { + /* Draw a rectangle */ + int i, j, png_ypos; + + png_ypos = image_height - ypos - ylen; + /* This fudge is needed because EPS measures height from the bottom up but + PNG measures y position from the top down */ + + for (i = (xpos); i < (xpos + xlen); i++) { + for (j = (png_ypos); j < (png_ypos + ylen); j++) { + *(pixelbuf + (image_width * j) + i) = '1'; + } + } +} + +void draw_circle(char *pixelbuf, int image_width, int image_height, int x0, int y0, float radius, char fill) { + int x, y; + int radius_i = (int) radius; + + for (y = -radius_i; y <= radius_i; y++) { + for (x = -radius_i; x <= radius_i; x++) { + if ((x * x) + (y * y) <= (radius_i * radius_i)) { + if ((y + y0 >= 0) && (y + y0 < image_height) + && (x + x0 >= 0) && (x + x0 < image_width)) { + *(pixelbuf + ((y + y0) * image_width) + (x + x0)) = fill; + } + } + } + } +} + +void draw_bullseye(char *pixelbuf, int image_width, int image_height, int xoffset, int yoffset, int scaler) { + /* Central bullseye in Maxicode symbols */ + draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(4.571 * scaler) + 1, '1'); + draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(3.779 * scaler) + 1, '0'); + draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(2.988 * scaler) + 1, '1'); + draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(2.196 * scaler) + 1, '0'); + draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(1.394 * scaler) + 1, '1'); + draw_circle(pixelbuf, image_width, image_height, (int)(14.5 * scaler) + xoffset, (int)(15 * scaler) + yoffset, (int)(0.602 * scaler) + 1, '0'); + +} + +void draw_hexagon(char *pixelbuf, int image_width, char *scaled_hexagon, int hexagon_size, int xposn, int yposn) { + /* Put a hexagon into the pixel buffer */ + int i, j; + + for (i = 0; i < hexagon_size; i++) { + for (j = 0; j < hexagon_size; j++) { + if (scaled_hexagon[(i * hexagon_size) + j] == '1') { + *(pixelbuf + (image_width * i) + (image_width * yposn) + xposn + j) = '1'; + } + } + } +} + +void draw_letter(char *pixelbuf, unsigned char letter, int xposn, int yposn, int textflags, int image_width, int image_height) { + /* Put a letter into a position */ + int skip, x, y, glyph_no, max_x, max_y; + + skip = 0; + + if (letter < 33) { + skip = 1; + } + + if ((letter > 127) && (letter < 161)) { + skip = 1; + } + + if (xposn < 0 || yposn < 0) { + skip = 1; + } + + if (skip == 0) { + if (letter > 128) { + glyph_no = letter - 66; + } else { + glyph_no = letter - 33; + } + + + switch (textflags) { + case 1: // small font 5x9 + max_x = 5; + max_y = 9; + + if (xposn + max_x >= image_width) { + max_x = image_width - xposn - 1; + } + + if (yposn + max_y >= image_height) { + max_y = image_height - yposn - 1; + } + + for (y = 0; y < max_y; y++) { + for (x = 0; x < max_x; x++) { + if (small_font[(glyph_no * 9) + y] & (0x10 >> x)) { + *(pixelbuf + (y * image_width) + (yposn * image_width) + xposn + x) = '1'; + } + } + } + break; + + case 2: // bold font -> twice the regular font + { + char * linePtr; + max_x = 7; + max_y = 14; + + if (xposn + max_x + 1 >= image_width) { + max_x = image_width - xposn - 2; + } + + if (yposn + max_y >= image_height) { + max_y = image_height - yposn - 1; + } + + linePtr = pixelbuf + (yposn * image_width) + xposn + 1; + for (y = 0; y < max_y; y++) { + char * pixelPtr = linePtr; + int extra_dot = 0; + for (x = 0; x < 7; x++) { + if (ascii_font[(glyph_no * 14) + y] & (0x40 >> x)) { + *pixelPtr = '1'; + extra_dot = 1; + } else { + if (extra_dot) { + *pixelPtr = '1'; + } + + extra_dot = 0; + } + + ++pixelPtr; + } + + if (extra_dot) { + *pixelPtr = '1'; + } + + linePtr += image_width; + } + } + break; + + default: // regular font 7x15 + max_x = 7; + max_y = 14; + + if (xposn + max_x >= image_width) { + max_x = image_width - xposn - 1; + } + + if (yposn + max_y >= image_height) { + max_y = image_height - yposn - 1; + } + + for (y = 0; y < max_y; y++) { + for (x = 0; x < 7; x++) { + if (ascii_font[(glyph_no * 14) + y] & (0x40 >> x)) { + *(pixelbuf + (y * image_width) + (yposn * image_width) + xposn + x) = '1'; + } + } + } + break; + } + } +} + +/* Plot a string into the pixel buffer */ +void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, int textflags, int image_width, int image_height) { + int i, string_length, string_left_hand, letter_width = 7; + + switch (textflags) { + case 1: // small font 5x9 + letter_width = 5; + break; + + case 2: // bold font -> width of the regular font + 1 extra dot + 1 extra space + letter_width = 9; + break; + + default: // regular font 7x15 + letter_width = 7; + break; + } + + string_length = strlen(input_string); + string_left_hand = xposn - ((letter_width * string_length) / 2); + + for (i = 0; i < string_length; i++) { + draw_letter(pixbuf, input_string[i], string_left_hand + (i * letter_width), yposn, textflags, image_width, image_height); + } + +} + +void plot_hexline(char *scaled_hexagon, int hexagon_size, float start_x, float start_y, float end_x, float end_y) { + /* Draw a straight line from start to end */ + int i; + float inc_x, inc_y; + float this_x, this_y; + + inc_x = (end_x - start_x) / hexagon_size; + inc_y = (end_y - start_y) / hexagon_size; + + for (i = 0; i < hexagon_size; i++) { + this_x = start_x + ((float)i * inc_x); + this_y = start_y + ((float)i * inc_y); + if (((this_x >= 0) && (this_x < hexagon_size)) && ((this_y >= 0) && (this_y < hexagon_size))) { + scaled_hexagon[(hexagon_size * (int)this_y) + (int)this_x] = '1'; + } + } +} + +void plot_hexagon(char *scaled_hexagon, int hexagon_size) { + /* Create a hexagon shape and fill it */ + int line, i; + char ink; + + float x_offset[6]; + float y_offset[6]; + float start_x, start_y; + float end_x, end_y; + + x_offset[0] = 0.0; + x_offset[1] = 0.86; + x_offset[2] = 0.86; + x_offset[3] = 0.0; + x_offset[4] = -0.86; + x_offset[5] = -0.86; + + y_offset[0] = 1.0; + y_offset[1] = 0.5; + y_offset[2] = -0.5; + y_offset[3] = -1.0; + y_offset[4] = -0.5; + y_offset[5] = 0.5; + + /* Plot hexagon outline */ + for (line = 0; line < 5; line++) { + start_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[line]); + start_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[line]); + end_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[line + 1]); + end_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[line + 1]); + plot_hexline(scaled_hexagon, hexagon_size, start_x, start_y, end_x, end_y); + } + start_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[line]); + start_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[line]); + end_x = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * x_offset[0]); + end_y = ((float)hexagon_size / 2.0) + (((float)hexagon_size / 2.0) * y_offset[0]); + plot_hexline(scaled_hexagon, hexagon_size, start_x, start_y, end_x, end_y); + + /* Fill hexagon */ + for (line = 0; line < hexagon_size; line++) { + ink = '0'; + for (i = 0; i < hexagon_size; i++) { + if (scaled_hexagon[(hexagon_size * line) + i] == '1') { + if (i < (hexagon_size / 2)) { + ink = '1'; + } else { + ink = '0'; + } + } + + if (ink == '1') { + scaled_hexagon[(hexagon_size * line) + i] = ink; + } + } + } +} + +int plot_raster_maxicode(struct zint_symbol *symbol, int rotate_angle, int data_type) { + /* Plot a MaxiCode symbol with hexagons and bullseye */ + int i, row, column, xposn, yposn; + int image_height, image_width; + char *pixelbuf; + int error_number; + int xoffset, yoffset; + float scaler = symbol->scale; + char *scaled_hexagon; + int hexagon_size; + + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + image_width = (300 + (2 * xoffset * 2)) * scaler; + image_height = (300 + (2 * yoffset * 2)) * scaler; + + if (!(pixelbuf = (char *) malloc(image_width * image_height))) { + strcpy(symbol->errtxt, "655: Insufficient memory for pixel buffer"); + return ZINT_ERROR_ENCODING_PROBLEM; + } else { + for (i = 0; i < (image_width * image_height); i++) { + *(pixelbuf + i) = '0'; + } + } + + hexagon_size = (int)scaler * 10; + + if (!(scaled_hexagon = (char *) malloc(hexagon_size * hexagon_size))) { + strcpy(symbol->errtxt, "656: Insufficient memory for pixel buffer"); + free(scaled_hexagon); + free(pixelbuf); + return ZINT_ERROR_ENCODING_PROBLEM; + } else { + for (i = 0; i < (hexagon_size * hexagon_size); i++) { + *(scaled_hexagon + i) = '0'; + } + } + + plot_hexagon(scaled_hexagon, hexagon_size); + + draw_bullseye(pixelbuf, image_width, image_height, (2 * xoffset), (2 * yoffset), scaler * 10); + + for (row = 0; row < symbol->rows; row++) { + yposn = row * 9; + for (column = 0; column < symbol->width; column++) { + xposn = column * 10; + if (module_is_set(symbol, row, column)) { + if (row & 1) { + /* Odd (reduced) row */ + xposn += 5; + draw_hexagon(pixelbuf, image_width, scaled_hexagon, hexagon_size, (xposn + (2 * xoffset)) * scaler, (yposn + (2 * yoffset)) * scaler); + } else { + /* Even (full) row */ + draw_hexagon(pixelbuf, image_width, scaled_hexagon, hexagon_size, (xposn + (2 * xoffset)) * scaler, (yposn + (2 * yoffset)) * scaler); + } + } + } + } + + if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { + /* boundary bars */ + draw_bar(pixelbuf, 0, image_width, 0, symbol->border_width * 2, image_width, image_height); + draw_bar(pixelbuf, 0, image_width, 300 + (symbol->border_width * 2), symbol->border_width * 2, image_width, image_height); + } + + if (symbol->output_options & BARCODE_BOX) { + /* side bars */ + draw_bar(pixelbuf, 0, symbol->border_width * 2, 0, image_height, image_width, image_height); + draw_bar(pixelbuf, 300 + ((symbol->border_width + symbol->whitespace_width + symbol->whitespace_width) * 2), symbol->border_width * 2, 0, image_height, image_width, image_height); + } + + error_number = save_raster_image_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type); + free(scaled_hexagon); + free(pixelbuf); + return error_number; +} + +/* Convert UTF-8 to Latin1 Codepage for the interpretation line */ +void to_latin1(unsigned char source[], unsigned char preprocessed[]) { + int j, i, input_length; + + input_length = ustrlen(source); + + j = 0; + i = 0; + while (i < input_length) { + switch (source[i]) { + case 0xC2: + /* UTF-8 C2xxh */ + /* Character range: C280h (latin: 80h) to C2BFh (latin: BFh) */ + i++; + preprocessed[j] = source[i]; + j++; + break; + case 0xC3: + /* UTF-8 C3xx */ + /* Character range: C380h (latin: C0h) to C3BFh (latin: FFh) */ + i++; + preprocessed[j] = source[i] + 64; + j++; + break; + default: + /* Process ASCII (< 80h), all other unicode points are ignored */ + if (source[i] < 128) { + preprocessed[j] = source[i]; + j++; + } + break; + } + i++; + } + preprocessed[j] = '\0'; + + return; +} + +int plot_raster_dotty(struct zint_symbol *symbol, int rotate_angle, int data_type) { + float scaler = 2 * symbol->scale; + char *scaled_pixelbuf; + int r, i; + int scale_width, scale_height; + int error_number = 0; + int xoffset, yoffset, image_width, image_height; + + symbol->height = symbol->rows; // This is true because only 2d matrix symbols are processed here + + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + image_width = symbol->width + xoffset + xoffset; + image_height = symbol->height + yoffset + yoffset; + + if (scaler < 2.0) { + scaler = 2.0; + } + scale_width = (image_width * scaler) + 1; + scale_height = (image_height * scaler) + 1; + + /* Apply scale options by creating another pixel buffer */ + if (!(scaled_pixelbuf = (char *) malloc(scale_width * scale_height))) { + strcpy(symbol->errtxt, "657: Insufficient memory for pixel buffer"); + return ZINT_ERROR_ENCODING_PROBLEM; + } else { + for (i = 0; i < (scale_width * scale_height); i++) { + *(scaled_pixelbuf + i) = '0'; + } + } + + /* Plot the body of the symbol to the pixel buffer */ + for (r = 0; r < symbol->rows; r++) { + for (i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, r, i)) { + draw_circle(scaled_pixelbuf, scale_width, scale_height, + (int) ((i + xoffset) * scaler) + (scaler / 2.0), + (int) ((r + yoffset) * scaler) + (scaler / 2.0), + (symbol->dot_size / 2.0) * scaler, + '1'); + } + } + } + + error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle, data_type); + free(scaled_pixelbuf); + + return error_number; +} + +int plot_raster_default(struct zint_symbol *symbol, int rotate_angle, int data_type) { + int textdone, main_width, comp_offset, large_bar_count; + char textpart[10], addon[6]; + float addon_text_posn, preset_height, large_bar_height; + int i, r, textoffset, yoffset, xoffset, latch, image_width, image_height; + char *pixelbuf; + int addon_latch = 0, textflags = 0; + int this_row, block_width, plot_height, plot_yposn, textpos; + float row_height, row_posn; + int error_number; + int default_text_posn; + int next_yposn; + float scaler = symbol->scale; + char *scaled_pixelbuf; + int horiz, vert; + int scale_width, scale_height; +#ifndef _MSC_VER + unsigned char local_text[ustrlen(symbol->text) + 1]; +#else + unsigned char* local_text = (unsigned char*) _alloca(ustrlen(symbol->text) + 1); +#endif + + if (symbol->show_hrt != 0) { + /* Copy text from symbol */ + to_latin1(symbol->text, local_text); + } else { + /* No text needed */ + switch (symbol->symbology) { + case BARCODE_EANX: + case BARCODE_EANX_CC: + case BARCODE_ISBNX: + case BARCODE_UPCA: + case BARCODE_UPCE: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + /* For these symbols use dummy text to ensure formatting is done + * properly even if no text is required */ + for (i = 0; i < ustrlen(symbol->text); i++) { + if (symbol->text[i] == '+') { + local_text[i] = '+'; + } else { + local_text[i] = ' '; + } + local_text[ustrlen(symbol->text)] = '\0'; + } + break; + default: + /* For everything else, just remove the text */ + local_text[0] = '\0'; + break; + } + } + + textdone = 0; + main_width = symbol->width; + strcpy(addon, ""); + comp_offset = 0; + addon_text_posn = 0.0; + row_height = 0; + if (symbol->output_options & SMALL_TEXT) { + textflags = 1; + } else if (symbol->output_options & BOLD_TEXT) { + textflags = 2; + } + + if (symbol->height == 0) { + symbol->height = 50; + } + + large_bar_count = 0; + preset_height = 0.0; + for (i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if (symbol->row_height[i] == 0) { + large_bar_count++; + } + } + + if (large_bar_count == 0) { + symbol->height = preset_height; + large_bar_height = 10; + } else { + large_bar_height = (symbol->height - preset_height) / large_bar_count; + } + + while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { + comp_offset++; + } + + /* Certain symbols need whitespace otherwise characters get chopped off the sides */ + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) + || (symbol->symbology == BARCODE_ISBNX)) { + switch (ustrlen(local_text)) { + case 13: /* EAN 13 */ + case 16: + case 19: + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + main_width = 96 + comp_offset; + break; + default: + main_width = 68 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 96 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 51 + comp_offset; + } + } + + latch = 0; + r = 0; + /* Isolate add-on text */ + if (is_extendable(symbol->symbology)) { + for (i = 0; i < ustrlen(local_text); i++) { + if (latch == 1) { + addon[r] = local_text[i]; + r++; + } + if (symbol->text[i] == '+') { + latch = 1; + } + } + } + addon[r] = '\0'; + + if (ustrlen(local_text) != 0) { + textoffset = 9; + } else { + textoffset = 0; + } + + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + image_width = 2 * (symbol->width + xoffset + xoffset); + image_height = 2 * (symbol->height + textoffset + yoffset + yoffset); + + if (!(pixelbuf = (char *) malloc(image_width * image_height))) { + strcpy(symbol->errtxt, "658: Insufficient memory for pixel buffer"); + return ZINT_ERROR_ENCODING_PROBLEM; + } else { + for (i = 0; i < (image_width * image_height); i++) { + *(pixelbuf + i) = '0'; + } + } + + if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { + default_text_posn = image_height - 17; + } else { + default_text_posn = image_height - 17 - symbol->border_width - symbol->border_width; + } + + row_posn = textoffset + yoffset; + next_yposn = textoffset + yoffset; + row_height = 0; + + /* Plot the body of the symbol to the pixel buffer */ + for (r = 0; r < symbol->rows; r++) { + this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */ + row_posn += row_height; + plot_yposn = next_yposn; + if (symbol->row_height[this_row] == 0) { + row_height = large_bar_height; + } else { + row_height = symbol->row_height[this_row]; + } + next_yposn = (int) (row_posn + row_height); + plot_height = next_yposn - plot_yposn; + + i = 0; + if (module_is_set(symbol, this_row, 0)) { + latch = 1; + } else { + latch = 0; + } + + do { + block_width = 0; + do { + block_width++; + } while ((i + block_width < symbol->width )&& module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); + if ((addon_latch == 0) && (r == 0) && (i > main_width)) { + plot_height = (int) (row_height - 5.0); + plot_yposn = (int) (row_posn - 5.0); + addon_text_posn = row_posn + row_height - 8.0; + addon_latch = 1; + } + if (latch == 1) { + /* a bar */ + draw_bar(pixelbuf, (i + xoffset) * 2, block_width * 2, plot_yposn * 2, plot_height * 2, image_width, image_height); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + + } while (i < symbol->width); + } + + xoffset += comp_offset; + + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || (symbol->symbology == BARCODE_ISBNX)) { + /* guard bar extensions and text formatting for EAN8 and EAN13 */ + switch (ustrlen(local_text)) { + case 8: /* EAN-8 */ + case 11: + case 14: + draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (32 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (34 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (64 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (66 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + for (i = 0; i < 4; i++) { + textpart[i] = local_text[i]; + } + textpart[4] = '\0'; + textpos = 2 * (17 + xoffset); + + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + for (i = 0; i < 4; i++) { + textpart[i] = local_text[i + 4]; + } + textpart[4] = '\0'; + textpos = 2 * (50 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = 2 * (xoffset + 86); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + break; + case 5: + textpos = 2 * (xoffset + 100); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + break; + } + + break; + case 13: /* EAN 13 */ + case 16: + case 19: + draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (92 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (94 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + + textpart[0] = local_text[0]; + textpart[1] = '\0'; + textpos = 2 * (-7 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + for (i = 0; i < 6; i++) { + textpart[i] = local_text[i + 1]; + } + textpart[6] = '\0'; + textpos = 2 * (24 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + for (i = 0; i < 6; i++) { + textpart[i] = local_text[i + 7]; + } + textpart[6] = '\0'; + textpos = 2 * (71 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = 2 * (xoffset + 114); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + break; + case 5: + textpos = 2 * (xoffset + 128); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + break; + } + break; + + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + /* guard bar extensions and text formatting for UPCA */ + latch = 1; + + i = 0 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if (latch == 1) { + /* a bar */ + draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 11 + comp_offset); + draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + latch = 1; + i = 85 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if (latch == 1) { + /* a bar */ + draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 96 + comp_offset); + textpart[0] = local_text[0]; + textpart[1] = '\0'; + textpos = 2 * (-5 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + for (i = 0; i < 5; i++) { + textpart[i] = local_text[i + 1]; + } + textpart[5] = '\0'; + textpos = 2 * (27 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + for (i = 0; i < 5; i++) { + textpart[i] = local_text[i + 6]; + } + textpart[6] = '\0'; + textpos = 2 * (68 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + textpart[0] = local_text[11]; + textpart[1] = '\0'; + textpos = 2 * (100 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = 2 * (xoffset + 116); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + break; + case 5: + textpos = 2 * (xoffset + 130); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + break; + } + + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + /* guard bar extensions and text formatting for UPCE */ + draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + draw_bar(pixelbuf, (50 + xoffset) * 2, 1 * 2, (4 + (int) yoffset) * 2, 5 * 2, image_width, image_height); + + textpart[0] = local_text[0]; + textpart[1] = '\0'; + textpos = 2 * (-5 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + for (i = 0; i < 6; i++) { + textpart[i] = local_text[i + 1]; + } + textpart[6] = '\0'; + textpos = 2 * (24 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + textpart[0] = local_text[7]; + textpart[1] = '\0'; + textpos = 2 * (55 + xoffset); + draw_string(pixelbuf, textpart, textpos, default_text_posn, textflags, image_width, image_height); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = 2 * (xoffset + 70); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + break; + case 5: + textpos = 2 * (xoffset + 84); + draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, textflags, image_width, image_height); + break; + } + + } + + xoffset -= comp_offset; + + /* Put boundary bars or box around symbol */ + if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { + /* boundary bars */ + if (symbol->symbology != BARCODE_CODABLOCKF) { + draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, textoffset * 2, symbol->border_width * 2, image_width, image_height); + draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, (textoffset + symbol->height + symbol->border_width) * 2, symbol->border_width * 2, image_width, image_height); + } else { + draw_bar(pixelbuf, xoffset * 2, symbol->width * 2, textoffset * 2, symbol->border_width * 2, image_width, image_height); + draw_bar(pixelbuf, xoffset * 2, symbol->width * 2, (textoffset + symbol->height + symbol->border_width) * 2, symbol->border_width * 2, image_width, image_height); + } + if ((symbol->output_options & BARCODE_BIND) != 0) { + if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { + /* row binding */ + if (symbol->symbology != BARCODE_CODABLOCKF) { + for (r = 1; r < symbol->rows; r++) { + draw_bar(pixelbuf, xoffset * 2, symbol->width * 2, ((r * row_height) + textoffset + yoffset - 1) * 2, 2 * 2, image_width, image_height); + } + } else { + for (r = 1; r < symbol->rows; r++) { + draw_bar(pixelbuf, (xoffset + 11) * 2 , (symbol->width - 25) * 2, ((r * row_height) + textoffset + yoffset - 1) * 2, 2 * 2, image_width, image_height); + } + } + } + } + } + + if (symbol->output_options & BARCODE_BOX) { + /* side bars */ + draw_bar(pixelbuf, 0, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height); + draw_bar(pixelbuf, (symbol->width + xoffset + xoffset - symbol->border_width) * 2, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height); + } + + /* Put the human readable text at the bottom */ + if ((textdone == 0) && (ustrlen(local_text) != 0)) { + textpos = (image_width / 2); + draw_string(pixelbuf, (char*) local_text, textpos, default_text_posn, textflags, image_width, image_height); + } + + + if (scaler == 0) { + scaler = 0.5; + } + scale_width = image_width * scaler; + scale_height = image_height * scaler; + + /* Apply scale options by creating another pixel buffer */ + if (!(scaled_pixelbuf = (char *) malloc(scale_width * scale_height))) { + free(pixelbuf); + strcpy(symbol->errtxt, "659: Insufficient memory for pixel buffer"); + return ZINT_ERROR_ENCODING_PROBLEM; + } else { + for (i = 0; i < (scale_width * scale_height); i++) { + *(scaled_pixelbuf + i) = '0'; + } + } + + for (vert = 0; vert < scale_height; vert++) { + for (horiz = 0; horiz < scale_width; horiz++) { + *(scaled_pixelbuf + (vert * scale_width) + horiz) = *(pixelbuf + ((int) (vert / scaler) * image_width) + (int) (horiz / scaler)); + } + } + + error_number = save_raster_image_to_file(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle, data_type); + free(scaled_pixelbuf); + free(pixelbuf); + return error_number; +} + +int plot_raster(struct zint_symbol *symbol, int rotate_angle, int file_type) { + int error; + +#ifdef NO_PNG + if (file_type == OUT_PNG_FILE) { + return ZINT_ERROR_INVALID_OPTION; + } +#endif /* NO_PNG */ + + if (symbol->output_options & BARCODE_DOTTY_MODE) { + error = plot_raster_dotty(symbol, rotate_angle, file_type); + } else { + if (symbol->symbology == BARCODE_MAXICODE) { + error = plot_raster_maxicode(symbol, rotate_angle, file_type); + } else { + error = plot_raster_default(symbol, rotate_angle, file_type); + } + } + + return error; +} diff --git a/3rdparty/zint-2.6.1/backend/reedsol.c b/3rdparty/zint-2.6.1/backend/reedsol.c new file mode 100644 index 0000000..affe150 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/reedsol.c @@ -0,0 +1,164 @@ +/** + + This is a simple Reed-Solomon encoder + (C) Cliff Hones 2004 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +// It is not written with high efficiency in mind, so is probably +// not suitable for real-time encoding. The aim was to keep it +// simple, general and clear. +// +// + +// Usage: +// First call rs_init_gf(poly) to set up the Galois Field parameters. +// Then call rs_init_code(size, index) to set the encoding size +// Then call rs_encode(datasize, data, out) to encode the data. +// +// These can be called repeatedly as required - but note that +// rs_init_code must be called following any rs_init_gf call. +// +// If the parameters are fixed, some of the statics below can be +// replaced with constants in the obvious way, and additionally +// malloc/free can be avoided by using static arrays of a suitable +// size. + +#include // only needed for debug (main) +#include // only needed for malloc/free +#include "reedsol.h" +static int logmod; // 2**symsize - 1 +static int rlen; + +static int *logt = NULL, *alog = NULL, *rspoly = NULL; + +// rs_init_gf(poly) initialises the parameters for the Galois Field. +// The symbol size is determined from the highest bit set in poly +// This implementation will support sizes up to 30 bits (though that +// will result in very large log/antilog tables) - bit sizes of +// 8 or 4 are typical +// +// The poly is the bit pattern representing the GF characteristic +// polynomial. e.g. for ECC200 (8-bit symbols) the polynomial is +// a**8 + a**5 + a**3 + a**2 + 1, which translates to 0x12d. + +void rs_init_gf(const int poly) { + int m, b, p, v; + + // Find the top bit, and hence the symbol size + for (b = 1, m = 0; b <= poly; b <<= 1) + m++; + b >>= 1; + m--; + + // Calculate the log/alog tables + logmod = (1 << m) - 1; + logt = (int *) malloc(sizeof (int) * (logmod + 1)); + alog = (int *) malloc(sizeof (int) * logmod); + + for (p = 1, v = 0; v < logmod; v++) { + alog[v] = p; + logt[p] = v; + p <<= 1; + if (p & b) + p ^= poly; + } +} + +// rs_init_code(nsym, index) initialises the Reed-Solomon encoder +// nsym is the number of symbols to be generated (to be appended +// to the input data). index is usually 1 - it is the index of +// the constant in the first term (i) of the RS generator polynomial: +// (x + 2**i)*(x + 2**(i+1))*... [nsym terms] +// For ECC200, index is 1. + +void rs_init_code(const int nsym, int index) { + int i, k; + + rspoly = (int *) malloc(sizeof (int) * (nsym + 1)); + + rlen = nsym; + + rspoly[0] = 1; + for (i = 1; i <= nsym; i++) { + rspoly[i] = 1; + for (k = i - 1; k > 0; k--) { + if (rspoly[k]) + rspoly[k] = alog[(logt[rspoly[k]] + index) % logmod]; + rspoly[k] ^= rspoly[k - 1]; + } + rspoly[0] = alog[(logt[rspoly[0]] + index) % logmod]; + index++; + } +} + +void rs_encode(const size_t len,const unsigned char *data, unsigned char *res) { + int i, k, m; + for (i = 0; i < rlen; i++) + res[i] = 0; + for (i = 0; i < len; i++) { + m = res[rlen - 1] ^ data[i]; + for (k = rlen - 1; k > 0; k--) { + if (m && rspoly[k]) + res[k] = (unsigned char) (res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod]); + else + res[k] = res[k - 1]; + } + if (m && rspoly[0]) + res[0] = (unsigned char) (alog[(logt[m] + logt[rspoly[0]]) % logmod]); + else + res[0] = 0; + } +} + +/* The same as above but for larger bitlengths - Aztec code compatible */ +void rs_encode_long(const int len, const unsigned int *data, unsigned int *res) { + int i, k, m; + for (i = 0; i < rlen; i++) + res[i] = 0; + for (i = 0; i < len; i++) { + m = res[rlen - 1] ^ data[i]; + for (k = rlen - 1; k > 0; k--) { + if (m && rspoly[k]) + res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod]; + else + res[k] = res[k - 1]; + } + if (m && rspoly[0]) + res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod]; + else + res[0] = 0; + } +} + +/* Free memory */ +void rs_free(void) { + free(logt); + free(alog); + free(rspoly); + rspoly = NULL; +} diff --git a/3rdparty/zint-2.6.1/backend/reedsol.h b/3rdparty/zint-2.6.1/backend/reedsol.h new file mode 100644 index 0000000..24e336e --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/reedsol.h @@ -0,0 +1,50 @@ +/* + + This is a simple Reed-Solomon encoder + (C) Cliff Hones 2004 + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + */ + +#ifndef __REEDSOL_H +#define __REEDSOL_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +extern void rs_init_gf(const int poly); +extern void rs_init_code(const int nsym,int index); +extern void rs_encode(const size_t len,const unsigned char *data, unsigned char *res); +extern void rs_encode_long(const int len,const unsigned int *data, unsigned int *res); + extern void rs_free(void); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __REEDSOL_H */ diff --git a/3rdparty/zint-2.6.1/backend/render.c b/3rdparty/zint-2.6.1/backend/render.c new file mode 100644 index 0000000..9f56b2a --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/render.c @@ -0,0 +1,778 @@ +/* + * render.c - Generic Rendered Format + * + * Initiall written by Sam Lown for use in gLabels. Converts encoded + * data into a generic internal structure of lines and characters + * usable in external applications. + */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" + +#define GL_CONST 2.8346 + +struct zint_render_line *render_plot_create_line(float x, float y, float width, float length); +int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line); +struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width); +int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring); +struct zint_render_hexagon *render_plot_create_hexagon(float x, float y); +int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *ring, struct zint_render_hexagon **last_hexagon); + +int render_plot_add_string(struct zint_symbol *symbol, unsigned char *text, float x, float y, float fsize, float width, struct zint_render_string **last_string); + +int render_plot(struct zint_symbol *symbol, const float width, const float height) { + struct zint_render *render; + struct zint_render_line *line, *last_line = NULL; + struct zint_render_string *last_string = NULL; + struct zint_render_ring *ring, *last_ring = NULL; + struct zint_render_hexagon *hexagon, *last_hexagon = NULL; + + int i, r, block_width, latch, this_row; + float textpos, textwidth, large_bar_height, preset_height, row_height, row_posn = 0.0; + // int error_number = 0; + int text_offset, text_height, xoffset, yoffset, textdone, main_symbol_width_x, addon_width_x; + char addon[6], textpart[10]; + int large_bar_count, symbol_lead_in, total_symbol_width_x, total_area_width_x; + float addon_text_posn; + float default_text_posn; + float scaler; + const char *locale = NULL; + int hide_text = 0; + float required_aspect; + float symbol_aspect = 1; + float x_dimension; + int upceanflag = 0; + + // Allocate memory for the rendered version + render = symbol->rendered = (struct zint_render *) malloc(sizeof (struct zint_render)); + if (!symbol->rendered) return ZINT_ERROR_MEMORY; + render->lines = NULL; + render->strings = NULL; + render->rings = NULL; + render->hexagons = NULL; + + locale = setlocale(LC_ALL, "C"); + + row_height = 0; + textdone = 0; + textpos = 0.0; + main_symbol_width_x = symbol->width; + strcpy(addon, ""); + symbol_lead_in = 0; + addon_text_posn = 0.0; + addon_width_x = 0; + + /* + * Determine if there will be any addon texts and text height + */ + latch = 0; + r = 0; + /* Isolate add-on text */ + if (is_extendable(symbol->symbology)) { + for(i = 0; i < (int)ustrlen(symbol->text); i++) { + if (latch == 1) { + addon[r] = symbol->text[i]; + r++; + } + if (symbol->text[i] == '+') { + latch = 1; + } + } + } + addon[r] = '\0'; + + if ((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)) { + hide_text = 1; + text_height = text_offset = 0.0; + } else { + text_height = 9.0; + text_offset = 2.0; + } + + + /* + * Calculate the width of the barcode, especially if there are any extra + * borders or white space to add. + */ + + while (!(module_is_set(symbol, symbol->rows - 1, symbol_lead_in))) { + symbol_lead_in++; + } + + /* Certain symbols need whitespace otherwise characters get chopped off the sides */ + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) + || (symbol->symbology == BARCODE_ISBNX)) { + switch (ustrlen(symbol->text)) { + case 13: /* EAN 13 */ + case 16: + case 19: + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + main_symbol_width_x = 96 + symbol_lead_in; + upceanflag = 13; + break; + case 2: + main_symbol_width_x = 22 + symbol_lead_in; + upceanflag = 2; + break; + case 5: + main_symbol_width_x = 49 + symbol_lead_in; + upceanflag = 5; + break; + default: + main_symbol_width_x = 68 + symbol_lead_in; + upceanflag = 8; + } + switch (ustrlen(symbol->text)) { + case 11: + case 16: + /* EAN-2 add-on */ + addon_width_x = 31; + break; + case 14: + case 19: + /* EAN-5 add-on */ + addon_width_x = 58; + break; + } + } + else if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + upceanflag = 12; + if (symbol->whitespace_width < 10) { + symbol->whitespace_width = 10; + main_symbol_width_x = 96 + symbol_lead_in; + } + switch (ustrlen(symbol->text)) { + case 15: + /* EAN-2 add-on */ + addon_width_x = 31; + break; + case 18: + /* EAN-5 add-on */ + addon_width_x = 58; + break; + } + } + else if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + upceanflag = 6; + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_symbol_width_x = 51 + symbol_lead_in; + } + switch (ustrlen(symbol->text)) { + case 11: + /* EAN-2 add-on */ + addon_width_x = 31; + break; + case 14: + /* EAN-5 add-on */ + addon_width_x = 58; + break; + } + } + + total_symbol_width_x = 0.0 + main_symbol_width_x + addon_width_x; + total_area_width_x = total_symbol_width_x + (2 * (symbol->border_width + symbol->whitespace_width)); + + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + + // Determine if height should be overridden + large_bar_count = 0; + preset_height = 0.0; + for (i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if (symbol->row_height[i] == 0) { + large_bar_count++; + } + } + + if (large_bar_count == 0) { + required_aspect = width / height; + symbol_aspect = (total_symbol_width_x + (2 * xoffset)) / (preset_height + (2 * yoffset) + text_offset + text_height); + symbol->height = (int) preset_height; + if (required_aspect > symbol_aspect) { + /* the area is too wide */ + scaler = height / (preset_height + (2 * yoffset) + text_offset + text_height); + render->width = symbol_aspect * height; + render->height = height; + } else { + /* the area is too high */ + scaler = width / (total_symbol_width_x + (2 * xoffset)); + render->width = width; + render->height = width / symbol_aspect; + } + } else { + scaler = width / (total_symbol_width_x + (2 * xoffset)); + symbol->height = (int) ((height / scaler) - ((2 * yoffset) + text_offset + text_height)); + + render->width = width; + render->height = height; + } + large_bar_height = (symbol->height - preset_height) / large_bar_count; + + if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { + default_text_posn = (symbol->height + text_offset + symbol->border_width + symbol->border_width) * scaler; + } else { + default_text_posn = (symbol->height + text_offset + symbol->border_width) * scaler; + } + + x_dimension = render->width / total_area_width_x; + x_dimension /= GL_CONST; + + /* Set minimum size of symbol */ + /* Barcode must be at least 2mm high by 2mm across */ + if (render->height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST) { + render->height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST; + } + if (render->width < (2.0 * GL_CONST)) { + render->width = (2.0 * GL_CONST); + } + + if (symbol->symbology == BARCODE_CODABAR) { + /* The minimum X-dimension of Codabar is 0.191mm. The minimum bar height is 5mm */ + if (x_dimension < 0.191) { + render->width = 0.191 * GL_CONST * total_area_width_x; + } + if (render->height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST) { + render->height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST; + } + } + else if (symbol->symbology == BARCODE_CODE49) { + /* The minimum X-dimension of Code 49 is 0.191mm */ + if (x_dimension < 0.191) { + render->width = 0.191 * GL_CONST * total_area_width_x; + render->height = render->width / symbol_aspect; + } + } + + if (upceanflag != 0) { + /* The X-dimension of UPC/EAN symbols is fixed at 0.330mm */ + /* NOTE: This code will need adjustment before it correctly deals with composite symbols */ + render->width = 0.330 * GL_CONST * total_area_width_x; + /* The height is also fixed */ + switch (upceanflag) { + case 6: + case 12: + case 13: + /* UPC-A, UPC-E and EAN-13 */ + /* Height of bars should be 22.85mm */ + render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 22.85) * GL_CONST; + break; + case 8: + /* EAN-8 */ + /* Height of bars should be 18.23mm */ + render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 18.23) * GL_CONST; + break; + default: + /* EAN-2 and EAN-5 */ + /* Height of bars should be 21.10mm */ + render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 21.10) * GL_CONST; + } + } + + if (symbol->symbology == BARCODE_ONECODE) { + /* The size of USPS Intelligent Mail barcode is fixed */ + render->width = 0.508 * GL_CONST * total_area_width_x; + render->height = 4.064 * GL_CONST; + } + else if ((symbol->symbology == BARCODE_POSTNET) || (symbol->symbology == BARCODE_PLANET)) { + /* The size of PostNet and PLANET are fized */ + render->width = 0.508 * GL_CONST * total_area_width_x; + render->height = 2.921 * GL_CONST; + } + else if (((symbol->symbology == BARCODE_AUSPOST) || (symbol->symbology == BARCODE_AUSREPLY)) || + ((symbol->symbology == BARCODE_AUSROUTE) || (symbol->symbology == BARCODE_AUSREDIRECT))) { + /* Australia Post use the same sizes as USPS */ + render->width = 0.508 * GL_CONST * total_area_width_x; + render->height = 4.064 * GL_CONST; + } + else if ((symbol->symbology == BARCODE_RM4SCC) || (symbol->symbology == BARCODE_KIX)) { + /* Royal Mail and KIX Code uses 22 bars per inch */ + render->width = 0.577 * GL_CONST * total_area_width_x; + render->height = 5.22 * GL_CONST; + } + + if (symbol->symbology == BARCODE_MAXICODE) { + /* Maxicode is a fixed size */ + scaler = GL_CONST; /* Converts from millimeters to the scale used by glabels */ + render->width = 28.16 * scaler; + render->height = 26.86 * scaler; + + /* Central bullseye pattern */ + ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 0.85 * scaler, 0.67 * scaler); + render_plot_add_ring(symbol, ring, &last_ring); + ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 2.20 * scaler, 0.67 * scaler); + render_plot_add_ring(symbol, ring, &last_ring); + ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 3.54 * scaler, 0.67 * scaler); + render_plot_add_ring(symbol, ring, &last_ring); + + /* Hexagons */ + for (r = 0; r < symbol->rows; r++) { + for (i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, r, i)) { + hexagon = render_plot_create_hexagon(((i * 0.88) + (r & 1 ? 1.76 : 1.32)) * scaler, ((r * 0.76) + 0.76) * scaler); + render_plot_add_hexagon(symbol, hexagon, &last_hexagon); + } + } + } + + } else { + /* everything else uses rectangles (or squares) */ + /* Works from the bottom of the symbol up */ + int addon_latch = 0; + + for (r = 0; r < symbol->rows; r++) { + this_row = r; + if (symbol->row_height[this_row] == 0) { + row_height = large_bar_height; + } else { + row_height = symbol->row_height[this_row]; + } + row_posn = 0; + for (i = 0; i < r; i++) { + if (symbol->row_height[i] == 0) { + row_posn += large_bar_height; + } else { + row_posn += symbol->row_height[i]; + } + } + row_posn += yoffset; + + i = 0; + if (module_is_set(symbol, this_row, 0)) { + latch = 1; + } else { + latch = 0; + } + + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); + if ((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_symbol_width_x)) { + addon_text_posn = row_posn * scaler; + addon_latch = 1; + } + if (latch == 1) { + /* a bar */ + if (addon_latch == 0) { + line = render_plot_create_line((i + xoffset) * scaler, (row_posn) * scaler, block_width * scaler, row_height * scaler); + } else { + line = render_plot_create_line((i + xoffset) * scaler, (row_posn + 10.0) * scaler, block_width * scaler, (row_height - 5.0) * scaler); + } + latch = 0; + + render_plot_add_line(symbol, line, &last_line); + } else { + /* a space */ + latch = 1; + } + i += block_width; + + } while (i < symbol->width); + } + } + /* That's done the actual data area, everything else is human-friendly */ + + + /* Add the text */ + xoffset -= symbol_lead_in; + row_posn = (row_posn + large_bar_height) * scaler; + + if (!hide_text) { + if (upceanflag == 8) { + /* guard bar extensions and text formatting for EAN-8 */ + i = 0; + for (line = symbol->rendered->lines; line != NULL; line = line->next) { + switch (i) { + case 0: + case 1: + case 10: + case 11: + case 20: + case 21: + line->length += (5.0 * scaler); + break; + } + i++; + } + + for (i = 0; i < 4; i++) { + textpart[i] = symbol->text[i]; + } + textpart[4] = '\0'; + textpos = 17; + textwidth = 4.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + for (i = 0; i < 4; i++) { + textpart[i] = symbol->text[i + 4]; + } + textpart[4] = '\0'; + textpos = 50; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = xoffset + 86; + textwidth = 2.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + case 5: + textpos = xoffset + 100; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + } + + } + + if (upceanflag == 13) { + /* guard bar extensions and text formatting for EAN-13 */ + i = 0; + for (line = symbol->rendered->lines; line != NULL; line = line->next) { + switch (i) { + case 0: + case 1: + case 14: + case 15: + case 28: + case 29: + line->length += (5.0 * scaler); + break; + } + i++; + } + + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + textpos = -5; // 7 + textwidth = 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + + for (i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[6] = '\0'; + textpos = 25; + textwidth = 6.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + for (i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 7]; + } + textpart[6] = '\0'; + textpos = 72; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = xoffset + 114; + textwidth = 2.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + case 5: + textpos = xoffset + 128; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + } + } + + if (upceanflag == 12) { + /* guard bar extensions and text formatting for UPCA */ + i = 0; + for (line = symbol->rendered->lines; line != NULL; line = line->next) { + switch (i) { + case 0: + case 1: + case 2: + case 3: + case 14: + case 15: + case 26: + case 27: + case 28: + case 29: + line->length += (5.0 * scaler); + break; + } + i++; + } + + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + textpos = -5; + textwidth = 6.2; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); + for (i = 0; i < 5; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[5] = '\0'; + textpos = 27; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + for (i = 0; i < 5; i++) { + textpart[i] = symbol->text[i + 6]; + } + textpos = 68; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + textpart[0] = symbol->text[11]; + textpart[1] = '\0'; + textpos = 100; + textwidth = 6.2; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = xoffset + 116; + textwidth = 2.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + case 5: + textpos = xoffset + 130; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + } + } + + if (upceanflag == 6) { + /* guard bar extensions and text formatting for UPCE */ + i = 0; + for (line = symbol->rendered->lines; line != NULL; line = line->next) { + switch (i) { + case 0: + case 1: + case 14: + case 15: + case 16: + line->length += (5.0 * scaler); + break; + } + i++; + } + + textpart[0] = symbol->text[0]; + textpart[1] = '\0'; + textpos = -5; + textwidth = 6.2; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); + for (i = 0; i < 6; i++) { + textpart[i] = symbol->text[i + 1]; + } + textpart[6] = '\0'; + textpos = 24; + textwidth = 6.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); + textpart[0] = symbol->text[7]; + textpart[1] = '\0'; + textpos = 55; + textwidth = 6.2; + render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = xoffset + 70; + textwidth = 2.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + case 5: + textpos = xoffset + 84; + textwidth = 5.0 * 8.5; + render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); + break; + } + } + + /* Put normal human readable text at the bottom (and centered) */ + if (textdone == 0) { + // caculate start xoffset to center text + render_plot_add_string(symbol, symbol->text, ((symbol->width / 2.0) + xoffset) * scaler, default_text_posn, 9.0 * scaler, 0.0, &last_string); + } + } + + switch (symbol->symbology) { + case BARCODE_MAXICODE: + /* Do nothing! */ + break; + default: + if ((symbol->output_options & BARCODE_BIND) != 0) { + if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { + /* row binding */ + for (r = 1; r < symbol->rows; r++) { + line = render_plot_create_line(xoffset * scaler, ((r * row_height) + yoffset - 1) * scaler, symbol->width * scaler, 2.0 * scaler); + render_plot_add_line(symbol, line, &last_line); + } + } + } + if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { + line = render_plot_create_line(0, 0, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); + render_plot_add_line(symbol, line, &last_line); + line = render_plot_create_line(0, (symbol->height + symbol->border_width) * scaler, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); + render_plot_add_line(symbol, line, &last_line); + } + if (symbol->output_options & BARCODE_BOX) { + /* side bars */ + line = render_plot_create_line(0, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); + render_plot_add_line(symbol, line, &last_line); + line = render_plot_create_line((symbol->width + xoffset + xoffset - symbol->border_width) * scaler, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); + render_plot_add_line(symbol, line, &last_line); + } + break; + } + + if (locale) + setlocale(LC_ALL, locale); + + return 1; +} + +/* + * Create a new line with its memory allocated ready for adding to the + * rendered structure. + * + * This is much quicker than writing out each line manually (in some cases!) + */ +struct zint_render_line *render_plot_create_line(float x, float y, float width, float length) { + struct zint_render_line *line; + + line = (struct zint_render_line*) malloc(sizeof (struct zint_render_line)); + if (!line) return NULL; + + line->next = NULL; + line->x = x; + line->y = y; + line->width = width; + line->length = length; + + return line; +} + +/* + * Add the line to the current rendering and update the last line's + * next value. + */ +int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line) { + if (!line) return ZINT_ERROR_MEMORY; + if (*last_line) + (*last_line)->next = line; + else + symbol->rendered->lines = line; // first line + + *last_line = line; + return 1; +} + +struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width) { + struct zint_render_ring *ring; + + ring = (struct zint_render_ring *) malloc(sizeof (struct zint_render_ring)); + if (!ring) return NULL; + ring->next = NULL; + ring->x = x; + ring->y = y; + ring->radius = radius; + ring->line_width = line_width; + + return ring; +} + +int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring) { + if (!ring) return ZINT_ERROR_MEMORY; + if (*last_ring) + (*last_ring)->next = ring; + else + symbol->rendered->rings = ring; // first ring + + *last_ring = ring; + return 1; +} + +struct zint_render_hexagon *render_plot_create_hexagon(float x, float y) { + struct zint_render_hexagon *hexagon; + + hexagon = (struct zint_render_hexagon*) malloc(sizeof (struct zint_render_hexagon)); + if (!hexagon) return NULL; + hexagon->next = NULL; + hexagon->x = x; + hexagon->y = y; + + return hexagon; +} + +int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *hexagon, struct zint_render_hexagon **last_hexagon) { + if (!hexagon) return ZINT_ERROR_MEMORY; + if (*last_hexagon) + (*last_hexagon)->next = hexagon; + else + symbol->rendered->hexagons = hexagon; // first hexagon + + *last_hexagon = hexagon; + return 1; +} + +/* + * Add a string structure to the symbol. + * Coordinates assumed to be from top-center. + */ +int render_plot_add_string(struct zint_symbol *symbol, + unsigned char *text, float x, float y, float fsize, float width, + struct zint_render_string **last_string) { + struct zint_render_string *string; + + string = (struct zint_render_string*) malloc(sizeof (struct zint_render_string)); + string->next = NULL; + string->x = x; + string->y = y; + string->width = width; + string->fsize = fsize; + string->length = ustrlen(text); + string->text = (unsigned char*) malloc(sizeof (unsigned char) * (ustrlen(text) + 1)); + ustrcpy(string->text, text); + + if (*last_string) + (*last_string)->next = string; + else + symbol->rendered->strings = string; // First character + *last_string = string; + + return 1; +} diff --git a/3rdparty/zint-2.6.1/backend/rss.c b/3rdparty/zint-2.6.1/backend/rss.c new file mode 100644 index 0000000..c34b615 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/rss.c @@ -0,0 +1,2307 @@ +/* rss.c - Handles Reduced Space Symbology (GS1 DataBar) */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* The functions "combins" and "getRSSwidths" are copyright BSI and are + released with permission under the following terms: + + "Copyright subsists in all BSI publications. BSI also holds the copyright, in the + UK, of the international standardisation bodies. Except as + permitted under the Copyright, Designs and Patents Act 1988 no extract may be + reproduced, stored in a retrieval system or transmitted in any form or by any + means - electronic, photocopying, recording or otherwise - without prior written + permission from BSI. + + "This does not preclude the free use, in the course of implementing the standard, + of necessary details such as symbols, and size, type or grade designations. If these + details are to be used for any other purpose than implementation then the prior + written permission of BSI must be obtained." + + The date of publication for these functions is 30 November 2006 + */ + +/* Includes numerous bugfixes thanks to Pablo Orduña @ the PIRAmIDE project */ + +/* Note: This code reflects the symbol names as used in ISO/IEC 24724:2006. These names + * were updated in ISO/IEC 24724:2011 as follows: + * + * RSS-14 > GS1 DataBar Omnidirectional + * RSS-14 Truncated > GS1 DataBar Truncated + * RSS-14 Stacked > GS1 DataBar Stacked + * RSS-14 Stacked Omnidirectional > GS1 DataBar Stacked Omnidirectional + * RSS Limited > GS1 DataBar Limited + * RSS Expanded > GS1 DataBar Expanded Omnidirectional + * RSS Expanded Stacked > GS1 DataBar Expanded Stacked Omnidirectional + */ + +#include +#include +#include +#ifdef _MSC_VER +#include +#endif +#include "common.h" +#include "large.h" +#include "rss.h" +#include "gs1.h" + +/********************************************************************** + * combins(n,r): returns the number of Combinations of r selected from n: + * Combinations = n! / ((n - r)! * r!) + **********************************************************************/ +int combins(int n, int r) { + int i, j; + int maxDenom, minDenom; + int val; + + if (n - r > r) { + minDenom = r; + maxDenom = n - r; + } else { + minDenom = n - r; + maxDenom = r; + } + val = 1; + j = 1; + for (i = n; i > maxDenom; i--) { + val *= i; + if (j <= minDenom) { + val /= j; + j++; + } + } + for (; j <= minDenom; j++) { + val /= j; + } + return (val); +} + +/********************************************************************** + * getRSSwidths + * routine to generate widths for RSS elements for a given value.# + * + * Calling arguments: + * val = required value + * n = number of modules + * elements = elements in a set (RSS-14 & Expanded = 4; RSS Limited = 7) + * maxWidth = maximum module width of an element + * noNarrow = 0 will skip patterns without a one module wide element + * + * Return: + * static int widths[] = element widths + **********************************************************************/ +void getRSSwidths(int val, int n, int elements, int maxWidth, int noNarrow) { + int bar; + int elmWidth; + int mxwElement; + int subVal, lessVal; + int narrowMask = 0; + for (bar = 0; bar < elements - 1; bar++) { + for (elmWidth = 1, narrowMask |= (1 << bar); + ; + elmWidth++, narrowMask &= ~(1 << bar)) { + /* get all combinations */ + subVal = combins(n - elmWidth - 1, elements - bar - 2); + /* less combinations with no single-module element */ + if ((!noNarrow) && (!narrowMask) && + (n - elmWidth - (elements - bar - 1) >= elements - bar - 1)) { + subVal -= combins(n - elmWidth - (elements - bar), elements - bar - 2); + } + /* less combinations with elements > maxVal */ + if (elements - bar - 1 > 1) { + lessVal = 0; + for (mxwElement = n - elmWidth - (elements - bar - 2); + mxwElement > maxWidth; + mxwElement--) { + lessVal += combins(n - elmWidth - mxwElement - 1, elements - bar - 3); + } + subVal -= lessVal * (elements - 1 - bar); + } else if (n - elmWidth > maxWidth) { + subVal--; + } + val -= subVal; + if (val < 0) break; + } + val += subVal; + n -= elmWidth; + widths[bar] = elmWidth; + } + widths[bar] = n; + return; +} + +/* GS1 DataBar-14 */ +int rss14(struct zint_symbol *symbol, unsigned char source[], int src_len) { + int error_number = 0, i, j, mask; + short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112]; + int data_character[4], data_group[4], v_odd[4], v_even[4]; + int data_widths[8][4], checksum, c_left, c_right, total_widths[46], writer; + char latch, hrt[15], temp[32]; + int check_digit, count, separator_row; + + separator_row = 0; + + if (src_len > 13) { + strcpy(symbol->errtxt, "380: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, src_len); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "381: Invalid characters in data"); + return error_number; + } + + /* make some room for a separator row for composite symbols */ + switch (symbol->symbology) { + case BARCODE_RSS14_CC: + case BARCODE_RSS14STACK_CC: + case BARCODE_RSS14_OMNI_CC: + separator_row = symbol->rows; + symbol->row_height[separator_row] = 1; + symbol->rows += 1; + break; + } + + for (i = 0; i < 112; i++) { + accum[i] = 0; + x_reg[i] = 0; + y_reg[i] = 0; + } + + for (i = 0; i < 4; i++) { + data_character[i] = 0; + data_group[i] = 0; + } + + binary_load(accum, (char*) source, src_len); + strcpy(temp, "10000000000000"); + if (symbol->option_1 == 2) { + /* Add symbol linkage flag */ + binary_load(y_reg, temp, strlen(temp)); + binary_add(accum, y_reg); + for (i = 0; i < 112; i++) { + y_reg[i] = 0; + } + } + + /* Calculate left and right pair values */ + strcpy(temp, "4537077"); + binary_load(x_reg, temp, strlen(temp)); + + for (i = 0; i < 24; i++) { + shiftup(x_reg); + } + + for (i = 24; i >= 0; i--) { + y_reg[i] = islarger(accum, x_reg); + if (y_reg[i] == 1) { + binary_subtract(accum, x_reg); + } + shiftdown(x_reg); + } + + for (i = 0; i < 112; i++) { + left_reg[i] = y_reg[i]; + right_reg[i] = accum[i]; + } + + /* Calculate four data characters */ + strcpy(temp, "1597"); + binary_load(x_reg, temp, strlen(temp)); + for (i = 0; i < 112; i++) { + accum[i] = left_reg[i]; + } + + for (i = 0; i < 24; i++) { + shiftup(x_reg); + } + + for (i = 24; i >= 0; i--) { + y_reg[i] = islarger(accum, x_reg); + if (y_reg[i] == 1) { + binary_subtract(accum, x_reg); + } + shiftdown(x_reg); + } + + data_character[0] = 0; + data_character[1] = 0; + mask = 0x2000; + for (i = 13; i >= 0; i--) { + if (y_reg[i] == 1) { + data_character[0] += mask; + } + if (accum[i] == 1) { + data_character[1] += mask; + } + mask = mask >> 1; + } + strcpy(temp, "1597"); + binary_load(x_reg, temp, strlen(temp)); + for (i = 0; i < 112; i++) { + accum[i] = right_reg[i]; + } + + for (i = 0; i < 24; i++) { + shiftup(x_reg); + } + + for (i = 24; i >= 0; i--) { + y_reg[i] = islarger(accum, x_reg); + if (y_reg[i] == 1) { + binary_subtract(accum, x_reg); + } + shiftdown(x_reg); + } + + data_character[2] = 0; + data_character[3] = 0; + mask = 0x2000; + for (i = 13; i >= 0; i--) { + if (y_reg[i] == 1) { + data_character[2] += mask; + } + if (accum[i] == 1) { + data_character[3] += mask; + } + mask = mask >> 1; + } + + /* Calculate odd and even subset values */ + + if ((data_character[0] >= 0) && (data_character[0] <= 160)) { + data_group[0] = 0; + } + if ((data_character[0] >= 161) && (data_character[0] <= 960)) { + data_group[0] = 1; + } + if ((data_character[0] >= 961) && (data_character[0] <= 2014)) { + data_group[0] = 2; + } + if ((data_character[0] >= 2015) && (data_character[0] <= 2714)) { + data_group[0] = 3; + } + if ((data_character[0] >= 2715) && (data_character[0] <= 2840)) { + data_group[0] = 4; + } + if ((data_character[1] >= 0) && (data_character[1] <= 335)) { + data_group[1] = 5; + } + if ((data_character[1] >= 336) && (data_character[1] <= 1035)) { + data_group[1] = 6; + } + if ((data_character[1] >= 1036) && (data_character[1] <= 1515)) { + data_group[1] = 7; + } + if ((data_character[1] >= 1516) && (data_character[1] <= 1596)) { + data_group[1] = 8; + } + if ((data_character[3] >= 0) && (data_character[3] <= 335)) { + data_group[3] = 5; + } + if ((data_character[3] >= 336) && (data_character[3] <= 1035)) { + data_group[3] = 6; + } + if ((data_character[3] >= 1036) && (data_character[3] <= 1515)) { + data_group[3] = 7; + } + if ((data_character[3] >= 1516) && (data_character[3] <= 1596)) { + data_group[3] = 8; + } + if ((data_character[2] >= 0) && (data_character[2] <= 160)) { + data_group[2] = 0; + } + if ((data_character[2] >= 161) && (data_character[2] <= 960)) { + data_group[2] = 1; + } + if ((data_character[2] >= 961) && (data_character[2] <= 2014)) { + data_group[2] = 2; + } + if ((data_character[2] >= 2015) && (data_character[2] <= 2714)) { + data_group[2] = 3; + } + if ((data_character[2] >= 2715) && (data_character[2] <= 2840)) { + data_group[2] = 4; + } + + v_odd[0] = (data_character[0] - g_sum_table[data_group[0]]) / t_table[data_group[0]]; + v_even[0] = (data_character[0] - g_sum_table[data_group[0]]) % t_table[data_group[0]]; + v_odd[1] = (data_character[1] - g_sum_table[data_group[1]]) % t_table[data_group[1]]; + v_even[1] = (data_character[1] - g_sum_table[data_group[1]]) / t_table[data_group[1]]; + v_odd[3] = (data_character[3] - g_sum_table[data_group[3]]) % t_table[data_group[3]]; + v_even[3] = (data_character[3] - g_sum_table[data_group[3]]) / t_table[data_group[3]]; + v_odd[2] = (data_character[2] - g_sum_table[data_group[2]]) / t_table[data_group[2]]; + v_even[2] = (data_character[2] - g_sum_table[data_group[2]]) % t_table[data_group[2]]; + + + /* Use RSS subset width algorithm */ + for (i = 0; i < 4; i++) { + if ((i == 0) || (i == 2)) { + getRSSwidths(v_odd[i], modules_odd[data_group[i]], 4, widest_odd[data_group[i]], 1); + data_widths[0][i] = widths[0]; + data_widths[2][i] = widths[1]; + data_widths[4][i] = widths[2]; + data_widths[6][i] = widths[3]; + getRSSwidths(v_even[i], modules_even[data_group[i]], 4, widest_even[data_group[i]], 0); + data_widths[1][i] = widths[0]; + data_widths[3][i] = widths[1]; + data_widths[5][i] = widths[2]; + data_widths[7][i] = widths[3]; + } else { + getRSSwidths(v_odd[i], modules_odd[data_group[i]], 4, widest_odd[data_group[i]], 0); + data_widths[0][i] = widths[0]; + data_widths[2][i] = widths[1]; + data_widths[4][i] = widths[2]; + data_widths[6][i] = widths[3]; + getRSSwidths(v_even[i], modules_even[data_group[i]], 4, widest_even[data_group[i]], 1); + data_widths[1][i] = widths[0]; + data_widths[3][i] = widths[1]; + data_widths[5][i] = widths[2]; + data_widths[7][i] = widths[3]; + } + } + + + checksum = 0; + /* Calculate the checksum */ + for (i = 0; i < 8; i++) { + checksum += checksum_weight[i] * data_widths[i][0]; + checksum += checksum_weight[i + 8] * data_widths[i][1]; + checksum += checksum_weight[i + 16] * data_widths[i][2]; + checksum += checksum_weight[i + 24] * data_widths[i][3]; + } + checksum %= 79; + + /* Calculate the two check characters */ + if (checksum >= 8) { + checksum++; + } + if (checksum >= 72) { + checksum++; + } + c_left = checksum / 9; + c_right = checksum % 9; + + /* Put element widths together */ + total_widths[0] = 1; + total_widths[1] = 1; + total_widths[44] = 1; + total_widths[45] = 1; + for (i = 0; i < 8; i++) { + total_widths[i + 2] = data_widths[i][0]; + total_widths[i + 15] = data_widths[7 - i][1]; + total_widths[i + 23] = data_widths[i][3]; + total_widths[i + 36] = data_widths[7 - i][2]; + } + for (i = 0; i < 5; i++) { + total_widths[i + 10] = finder_pattern[i + (5 * c_left)]; + total_widths[i + 31] = finder_pattern[(4 - i) + (5 * c_right)]; + } + + /* Put this data into the symbol */ + if ((symbol->symbology == BARCODE_RSS14) || (symbol->symbology == BARCODE_RSS14_CC)) { + writer = 0; + latch = '0'; + for (i = 0; i < 46; i++) { + for (j = 0; j < total_widths[i]; j++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer); + } + writer++; + } + if (latch == '1') { + latch = '0'; + } else { + latch = '1'; + } + } + if (symbol->width < writer) { + symbol->width = writer; + } + if (symbol->symbology == BARCODE_RSS14_CC) { + /* separator pattern for composite symbol */ + for (i = 4; i < 92; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + set_module(symbol, separator_row, i); + } + } + latch = '1'; + for (i = 16; i < 32; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + if (latch == '1') { + set_module(symbol, separator_row, i); + latch = '0'; + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } + latch = '1'; + for (i = 63; i < 78; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + if (latch == '1') { + set_module(symbol, separator_row, i); + latch = '0'; + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } + } + symbol->rows = symbol->rows + 1; + + count = 0; + check_digit = 0; + + /* Calculate check digit from Annex A and place human readable text */ + ustrcpy(symbol->text, (unsigned char*) "(01)"); + for (i = 0; i < 14; i++) { + hrt[i] = '0'; + } + for (i = 0; i < src_len; i++) { + hrt[12 - i] = source[src_len - i - 1]; + } + hrt[14] = '\0'; + + for (i = 0; i < 13; i++) { + count += ctoi(hrt[i]); + + if (!(i & 1)) { + count += 2 * (ctoi(hrt[i])); + } + } + + check_digit = 10 - (count % 10); + if (check_digit == 10) { + check_digit = 0; + } + hrt[13] = itoc(check_digit); + + strcat((char*) symbol->text, hrt); + + set_minimum_height(symbol, 14); // Minimum height is 14X for truncated symbol + } + + if ((symbol->symbology == BARCODE_RSS14STACK) || (symbol->symbology == BARCODE_RSS14STACK_CC)) { + /* top row */ + writer = 0; + latch = '0'; + for (i = 0; i < 23; i++) { + for (j = 0; j < total_widths[i]; j++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer); + } else { + unset_module(symbol, symbol->rows, writer); + } + writer++; + } + if (latch == '1') { + latch = '0'; + } else { + latch = '1'; + } + } + set_module(symbol, symbol->rows, writer); + unset_module(symbol, symbol->rows, writer + 1); + symbol->row_height[symbol->rows] = 5; + /* bottom row */ + symbol->rows = symbol->rows + 2; + set_module(symbol, symbol->rows, 0); + unset_module(symbol, symbol->rows, 1); + writer = 0; + latch = '1'; + for (i = 23; i < 46; i++) { + for (j = 0; j < total_widths[i]; j++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer + 2); + } else { + unset_module(symbol, symbol->rows, writer + 2); + } + writer++; + } + if (latch == '1') { + latch = '0'; + } else { + latch = '1'; + } + } + symbol->row_height[symbol->rows] = 7; + /* separator pattern */ + for (i = 4; i < 46; i++) { + if (module_is_set(symbol, symbol->rows - 2, i) == module_is_set(symbol, symbol->rows, i)) { + if (!(module_is_set(symbol, symbol->rows - 2, i))) { + set_module(symbol, symbol->rows - 1, i); + } + } else { + if (!(module_is_set(symbol, symbol->rows - 1, i - 1))) { + set_module(symbol, symbol->rows - 1, i); + } + } + } + symbol->row_height[symbol->rows - 1] = 1; + if (symbol->symbology == BARCODE_RSS14STACK_CC) { + /* separator pattern for composite symbol */ + for (i = 4; i < 46; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + set_module(symbol, separator_row, i); + } + } + latch = '1'; + for (i = 16; i < 32; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + if (latch == '1') { + set_module(symbol, separator_row, i); + latch = '0'; + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } + } + symbol->rows = symbol->rows + 1; + if (symbol->width < 50) { + symbol->width = 50; + } + } + + if ((symbol->symbology == BARCODE_RSS14STACK_OMNI) || (symbol->symbology == BARCODE_RSS14_OMNI_CC)) { + /* top row */ + writer = 0; + latch = '0'; + for (i = 0; i < 23; i++) { + for (j = 0; j < total_widths[i]; j++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer); + } else { + unset_module(symbol, symbol->rows, writer); + } + writer++; + } + latch = (latch == '1' ? '0' : '1'); + } + set_module(symbol, symbol->rows, writer); + unset_module(symbol, symbol->rows, writer + 1); + /* bottom row */ + symbol->rows = symbol->rows + 4; + set_module(symbol, symbol->rows, 0); + unset_module(symbol, symbol->rows, 1); + writer = 0; + latch = '1'; + for (i = 23; i < 46; i++) { + for (j = 0; j < total_widths[i]; j++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer + 2); + } else { + unset_module(symbol, symbol->rows, writer + 2); + } + writer++; + } + if (latch == '1') { + latch = '0'; + } else { + latch = '1'; + } + } + /* middle separator */ + for (i = 5; i < 46; i += 2) { + set_module(symbol, symbol->rows - 2, i); + } + symbol->row_height[symbol->rows - 2] = 1; + /* top separator */ + for (i = 4; i < 46; i++) { + if (!(module_is_set(symbol, symbol->rows - 4, i))) { + set_module(symbol, symbol->rows - 3, i); + } + } + latch = '1'; + for (i = 17; i < 33; i++) { + if (!(module_is_set(symbol, symbol->rows - 4, i))) { + if (latch == '1') { + set_module(symbol, symbol->rows - 3, i); + latch = '0'; + } else { + unset_module(symbol, symbol->rows - 3, i); + latch = '1'; + } + } else { + unset_module(symbol, symbol->rows - 3, i); + latch = '1'; + } + } + symbol->row_height[symbol->rows - 3] = 1; + /* bottom separator */ + for (i = 4; i < 46; i++) { + if (!(module_is_set(symbol, symbol->rows, i))) { + set_module(symbol, symbol->rows - 1, i); + } + } + latch = '1'; + for (i = 16; i < 32; i++) { + if (!(module_is_set(symbol, symbol->rows, i))) { + if (latch == '1') { + set_module(symbol, symbol->rows - 1, i); + latch = '0'; + } else { + unset_module(symbol, symbol->rows - 1, i); + latch = '1'; + } + } else { + unset_module(symbol, symbol->rows - 1, i); + latch = '1'; + } + } + symbol->row_height[symbol->rows - 1] = 1; + if (symbol->width < 50) { + symbol->width = 50; + } + if (symbol->symbology == BARCODE_RSS14_OMNI_CC) { + /* separator pattern for composite symbol */ + for (i = 4; i < 46; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + set_module(symbol, separator_row, i); + } + } + latch = '1'; + for (i = 16; i < 32; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + if (latch == '1') { + set_module(symbol, separator_row, i); + latch = '0'; + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } else { + unset_module(symbol, separator_row, i); + latch = '1'; + } + } + } + symbol->rows = symbol->rows + 1; + + set_minimum_height(symbol, 33); + } + + + return error_number; +} + +/* GS1 DataBar Limited */ +int rsslimited(struct zint_symbol *symbol, unsigned char source[], int src_len) { + int error_number = 0, i, mask; + short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112]; + int left_group, right_group, left_odd, left_even, right_odd, right_even; + int left_character, right_character, left_widths[14], right_widths[14]; + int checksum, check_elements[14], total_widths[46], writer, j, check_digit, count; + char latch, hrt[15], temp[32]; + int separator_row; + + separator_row = 0; + + if (src_len > 13) { + strcpy(symbol->errtxt, "382: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + error_number = is_sane(NEON, source, src_len); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "383: Invalid characters in data"); + return error_number; + } + if (src_len == 13) { + if ((source[0] != '0') && (source[0] != '1')) { + strcpy(symbol->errtxt, "384: Input out of range"); + return ZINT_ERROR_INVALID_DATA; + } + } + + /* make some room for a separator row for composite symbols */ + if (symbol->symbology == BARCODE_RSS_LTD_CC) { + separator_row = symbol->rows; + symbol->row_height[separator_row] = 1; + symbol->rows += 1; + } + + for (i = 0; i < 112; i++) { + accum[i] = 0; + x_reg[i] = 0; + y_reg[i] = 0; + } + + binary_load(accum, (char*) source, src_len); + if (symbol->option_1 == 2) { + /* Add symbol linkage flag */ + strcpy(temp, "2015133531096"); + binary_load(y_reg, temp, strlen(temp)); + binary_add(accum, y_reg); + for (i = 0; i < 112; i++) { + y_reg[i] = 0; + } + } + + /* Calculate left and right pair values */ + strcpy(temp, "2013571"); + binary_load(x_reg, temp, strlen(temp)); + + for (i = 0; i < 24; i++) { + shiftup(x_reg); + } + + for (i = 24; i >= 0; i--) { + y_reg[i] = islarger(accum, x_reg); + if (y_reg[i] == 1) { + binary_subtract(accum, x_reg); + } + shiftdown(x_reg); + } + + for (i = 0; i < 112; i++) { + left_reg[i] = y_reg[i]; + right_reg[i] = accum[i]; + } + + left_group = 0; + strcpy(temp, "183063"); + binary_load(accum, temp, strlen(temp)); + if (islarger(left_reg, accum)) { + left_group = 1; + } + strcpy(temp, "820063"); + binary_load(accum, temp, strlen(temp)); + if (islarger(left_reg, accum)) { + left_group = 2; + } + strcpy(temp, "1000775"); + binary_load(accum, temp, strlen(temp)); + if (islarger(left_reg, accum)) { + left_group = 3; + } + strcpy(temp, "1491020"); + binary_load(accum, temp, strlen(temp)); + if (islarger(left_reg, accum)) { + left_group = 4; + } + strcpy(temp, "1979844"); + binary_load(accum, temp, strlen(temp)); + if (islarger(left_reg, accum)) { + left_group = 5; + } + strcpy(temp, "1996938"); + binary_load(accum, temp, strlen(temp)); + if (islarger(left_reg, accum)) { + left_group = 6; + } + right_group = 0; + strcpy(temp, "183063"); + binary_load(accum, temp, strlen(temp)); + if (islarger(right_reg, accum)) { + right_group = 1; + } + strcpy(temp, "820063"); + binary_load(accum, temp, strlen(temp)); + if (islarger(right_reg, accum)) { + right_group = 2; + } + strcpy(temp, "1000775"); + binary_load(accum, temp, strlen(temp)); + if (islarger(right_reg, accum)) { + right_group = 3; + } + strcpy(temp, "1491020"); + binary_load(accum, temp, strlen(temp)); + if (islarger(right_reg, accum)) { + right_group = 4; + } + strcpy(temp, "1979844"); + binary_load(accum, temp, strlen(temp)); + if (islarger(right_reg, accum)) { + right_group = 5; + } + strcpy(temp, "1996938"); + binary_load(accum, temp, strlen(temp)); + if (islarger(right_reg, accum)) { + right_group = 6; + } + + switch (left_group) { + case 1: strcpy(temp, "183064"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(left_reg, accum); + break; + case 2: strcpy(temp, "820064"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(left_reg, accum); + break; + case 3: strcpy(temp, "1000776"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(left_reg, accum); + break; + case 4: strcpy(temp, "1491021"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(left_reg, accum); + break; + case 5: strcpy(temp, "1979845"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(left_reg, accum); + break; + case 6: strcpy(temp, "1996939"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(left_reg, accum); + break; + } + + switch (right_group) { + case 1: strcpy(temp, "183064"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(right_reg, accum); + break; + case 2: strcpy(temp, "820064"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(right_reg, accum); + break; + case 3: strcpy(temp, "1000776"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(right_reg, accum); + break; + case 4: strcpy(temp, "1491021"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(right_reg, accum); + break; + case 5: strcpy(temp, "1979845"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(right_reg, accum); + break; + case 6: strcpy(temp, "1996939"); + binary_load(accum, temp, strlen(temp)); + binary_subtract(right_reg, accum); + break; + } + + left_character = 0; + right_character = 0; + mask = 0x800000; + for (i = 23; i >= 0; i--) { + if (left_reg[i] == 1) { + left_character += mask; + } + if (right_reg[i] == 1) { + right_character += mask; + } + mask = mask >> 1; + } + + left_odd = left_character / t_even_ltd[left_group]; + left_even = left_character % t_even_ltd[left_group]; + right_odd = right_character / t_even_ltd[right_group]; + right_even = right_character % t_even_ltd[right_group]; + + getRSSwidths(left_odd, modules_odd_ltd[left_group], 7, widest_odd_ltd[left_group], 1); + left_widths[0] = widths[0]; + left_widths[2] = widths[1]; + left_widths[4] = widths[2]; + left_widths[6] = widths[3]; + left_widths[8] = widths[4]; + left_widths[10] = widths[5]; + left_widths[12] = widths[6]; + getRSSwidths(left_even, modules_even_ltd[left_group], 7, widest_even_ltd[left_group], 0); + left_widths[1] = widths[0]; + left_widths[3] = widths[1]; + left_widths[5] = widths[2]; + left_widths[7] = widths[3]; + left_widths[9] = widths[4]; + left_widths[11] = widths[5]; + left_widths[13] = widths[6]; + getRSSwidths(right_odd, modules_odd_ltd[right_group], 7, widest_odd_ltd[right_group], 1); + right_widths[0] = widths[0]; + right_widths[2] = widths[1]; + right_widths[4] = widths[2]; + right_widths[6] = widths[3]; + right_widths[8] = widths[4]; + right_widths[10] = widths[5]; + right_widths[12] = widths[6]; + getRSSwidths(right_even, modules_even_ltd[right_group], 7, widest_even_ltd[right_group], 0); + right_widths[1] = widths[0]; + right_widths[3] = widths[1]; + right_widths[5] = widths[2]; + right_widths[7] = widths[3]; + right_widths[9] = widths[4]; + right_widths[11] = widths[5]; + right_widths[13] = widths[6]; + + checksum = 0; + /* Calculate the checksum */ + for (i = 0; i < 14; i++) { + checksum += checksum_weight_ltd[i] * left_widths[i]; + checksum += checksum_weight_ltd[i + 14] * right_widths[i]; + } + checksum %= 89; + + for (i = 0; i < 14; i++) { + check_elements[i] = finder_pattern_ltd[i + (checksum * 14)]; + } + + total_widths[0] = 1; + total_widths[1] = 1; + total_widths[44] = 1; + total_widths[45] = 1; + for (i = 0; i < 14; i++) { + total_widths[i + 2] = left_widths[i]; + total_widths[i + 16] = check_elements[i]; + total_widths[i + 30] = right_widths[i]; + } + + writer = 0; + latch = '0'; + for (i = 0; i < 46; i++) { + for (j = 0; j < total_widths[i]; j++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer); + } else { + unset_module(symbol, symbol->rows, writer); + } + writer++; + } + latch = (latch == '1' ? '0' : '1'); + } + if (symbol->width < writer) { + symbol->width = writer; + } + symbol->rows = symbol->rows + 1; + + /* add separator pattern if composite symbol */ + if (symbol->symbology == BARCODE_RSS_LTD_CC) { + for (i = 4; i < 70; i++) { + if (!(module_is_set(symbol, separator_row + 1, i))) { + set_module(symbol, separator_row, i); + } + } + } + + /* Calculate check digit from Annex A and place human readable text */ + + check_digit = 0; + count = 0; + + ustrcpy(symbol->text, (unsigned char*) "(01)"); + for (i = 0; i < 14; i++) { + hrt[i] = '0'; + } + for (i = 0; i < src_len; i++) { + hrt[12 - i] = source[src_len - i - 1]; + } + + for (i = 0; i < 13; i++) { + count += ctoi(hrt[i]); + + if (!(i & 1)) { + count += 2 * (ctoi(hrt[i])); + } + } + + check_digit = 10 - (count % 10); + if (check_digit == 10) { + check_digit = 0; + } + + hrt[13] = itoc(check_digit); + hrt[14] = '\0'; + + strcat((char*) symbol->text, hrt); + + set_minimum_height(symbol, 10); + + return error_number; +} + +/* Attempts to apply encoding rules from secions 7.2.5.5.1 to 7.2.5.5.3 + * of ISO/IEC 24724:2006 */ +int general_rules(char field[], char type[]) { + + int block[2][200], block_count, i, j, k; + char current, next, last; + + block_count = 0; + + block[0][block_count] = 1; + block[1][block_count] = type[0]; + + for (i = 1; i < strlen(type); i++) { + current = type[i]; + last = type[i - 1]; + + if (current == last) { + block[0][block_count] = block[0][block_count] + 1; + } else { + block_count++; + block[0][block_count] = 1; + block[1][block_count] = type[i]; + } + } + + block_count++; + + for (i = 0; i < block_count; i++) { + current = block[1][i]; + next = (block[1][i + 1] & 0xFF); + + if ((current == ISOIEC) && (i != (block_count - 1))) { + if ((next == ANY_ENC) && (block[0][i + 1] >= 4)) { + block[1][i + 1] = NUMERIC; + } + if ((next == ANY_ENC) && (block[0][i + 1] < 4)) { + block[1][i + 1] = ISOIEC; + } + if ((next == ALPHA_OR_ISO) && (block[0][i + 1] >= 5)) { + block[1][i + 1] = ALPHA; + } + if ((next == ALPHA_OR_ISO) && (block[0][i + 1] < 5)) { + block[1][i + 1] = ISOIEC; + } + } + + if (current == ALPHA_OR_ISO) { + block[1][i] = ALPHA; + current = ALPHA; + } + + if ((current == ALPHA) && (i != (block_count - 1))) { + if ((next == ANY_ENC) && (block[0][i + 1] >= 6)) { + block[1][i + 1] = NUMERIC; + } + if ((next == ANY_ENC) && (block[0][i + 1] < 6)) { + if ((i == block_count - 2) && (block[0][i + 1] >= 4)) { + block[1][i + 1] = NUMERIC; + } else { + block[1][i + 1] = ALPHA; + } + } + } + + if (current == ANY_ENC) { + block[1][i] = NUMERIC; + } + } + + if (block_count > 1) { + i = 1; + while (i < block_count) { + if (block[1][i - 1] == block[1][i]) { + /* bring together */ + block[0][i - 1] = block[0][i - 1] + block[0][i]; + j = i + 1; + + /* decreace the list */ + while (j < block_count) { + block[0][j - 1] = block[0][j]; + block[1][j - 1] = block[1][j]; + j++; + } + block_count--; + i--; + } + i++; + } + } + + for (i = 0; i < block_count - 1; i++) { + if ((block[1][i] == NUMERIC) && (block[0][i] & 1)) { + /* Odd size numeric block */ + block[0][i] = block[0][i] - 1; + block[0][i + 1] = block[0][i + 1] + 1; + } + } + + j = 0; + for (i = 0; i < block_count; i++) { + for (k = 0; k < block[0][i]; k++) { + type[j] = block[1][i]; + j++; + } + } + + if ((block[1][block_count - 1] == NUMERIC) && (block[0][block_count - 1] & 1)) { + /* If the last block is numeric and an odd size, further + processing needs to be done outside this procedure */ + return 1; + } else { + return 0; + } +} + +/* Handles all data encodation from section 7.2.5 of ISO/IEC 24724 */ +int rss_binary_string(struct zint_symbol *symbol, char source[], char binary_string[]) { + int encoding_method, i, j, read_posn, latch, debug = symbol->debug, last_mode = ISOIEC; + int symbol_characters, characters_per_row; +#ifndef _MSC_VER + char general_field[strlen(source) + 1], general_field_type[strlen(source) + 1]; +#else + char* general_field = (char*) _alloca(strlen(source) + 1); + char* general_field_type = (char*) _alloca(strlen(source) + 1); +#endif + int remainder, d1, d2; + char padstring[40]; + + read_posn = 0; + + /* Decide whether a compressed data field is required and if so what + method to use - method 2 = no compressed data field */ + + if ((strlen(source) >= 16) && ((source[0] == '0') && (source[1] == '1'))) { + /* (01) and other AIs */ + encoding_method = 1; + if (debug) printf("Choosing Method 1\n"); + } else { + /* any AIs */ + encoding_method = 2; + if (debug) printf("Choosing Mehod 2\n"); + } + + if (((strlen(source) >= 20) && (encoding_method == 1)) && ((source[2] == '9') && (source[16] == '3'))) { + /* Possibly encoding method > 2 */ + if (debug) printf("Checking for other methods\n"); + + if ((strlen(source) >= 26) && (source[17] == '1')) { + /* Methods 3, 7, 9, 11 and 13 */ + + if (source[18] == '0') { + /* (01) and (310x) */ + char weight_str[7]; + float weight; /* In kilos */ + + for (i = 0; i < 6; i++) { + weight_str[i] = source[20 + i]; + } + weight_str[6] = '\0'; + + if (weight_str[0] == '0') { /* Maximum weight = 99999 */ + + + encoding_method = 7; + + if ((source[19] == '3') && (strlen(source) == 26)) { + /* (01) and (3103) */ + weight = atof(weight_str) / 1000.0; + + if (weight <= 32.767) { + encoding_method = 3; + } + } + + if (strlen(source) == 34) { + if ((source[26] == '1') && (source[27] == '1')) { + /* (01), (310x) and (11) - metric weight and production date */ + encoding_method = 7; + } + + if ((source[26] == '1') && (source[27] == '3')) { + /* (01), (310x) and (13) - metric weight and packaging date */ + encoding_method = 9; + } + + if ((source[26] == '1') && (source[27] == '5')) { + /* (01), (310x) and (15) - metric weight and "best before" date */ + encoding_method = 11; + } + + if ((source[26] == '1') && (source[27] == '7')) { + /* (01), (310x) and (17) - metric weight and expiration date */ + encoding_method = 13; + } + } + } + } + if (debug) printf("Now using method %d\n", encoding_method); + } + + if ((strlen(source) >= 26) && (source[17] == '2')) { + /* Methods 4, 8, 10, 12 and 14 */ + + if (source[18] == '0') { + /* (01) and (320x) */ + char weight_str[7]; + float weight; /* In pounds */ + + for (i = 0; i < 6; i++) { + weight_str[i] = source[20 + i]; + } + weight_str[6] = '\0'; + + if (weight_str[0] == '0') { /* Maximum weight = 99999 */ + + encoding_method = 8; + + if (((source[19] == '2') || (source[19] == '3')) && (strlen(source) == 26)) { + /* (01) and (3202)/(3203) */ + + if (source[19] == '3') { + weight = (float) (atof(weight_str) / 1000.0F); + if (weight <= 22.767) { + encoding_method = 4; + } + } else { + weight = (float) (atof(weight_str) / 100.0F); + if (weight <= 99.99) { + encoding_method = 4; + } + } + + } + + if (strlen(source) == 34) { + if ((source[26] == '1') && (source[27] == '1')) { + /* (01), (320x) and (11) - English weight and production date */ + encoding_method = 8; + } + + if ((source[26] == '1') && (source[27] == '3')) { + /* (01), (320x) and (13) - English weight and packaging date */ + encoding_method = 10; + } + + if ((source[26] == '1') && (source[27] == '5')) { + /* (01), (320x) and (15) - English weight and "best before" date */ + encoding_method = 12; + } + + if ((source[26] == '1') && (source[27] == '7')) { + /* (01), (320x) and (17) - English weight and expiration date */ + encoding_method = 14; + } + } + } + } + if (debug) printf("Now using method %d\n", encoding_method); + + } + + if (source[17] == '9') { + /* Methods 5 and 6 */ + if ((source[18] == '2') && ((source[19] >= '0') && (source[19] <= '3'))) { + /* (01) and (392x) */ + encoding_method = 5; + } + if ((source[18] == '3') && ((source[19] >= '0') && (source[19] <= '3'))) { + /* (01) and (393x) */ + encoding_method = 6; + } + if (debug) printf("Now using method %d\n", encoding_method); + } + } + + switch (encoding_method) { /* Encoding method - Table 10 */ + case 1: strcat(binary_string, "1XX"); + read_posn = 16; + break; + case 2: strcat(binary_string, "00XX"); + read_posn = 0; + break; + case 3: // 0100 + case 4: // 0101 + bin_append(4 + (encoding_method - 3), 4, binary_string); + read_posn = strlen(source); + break; + case 5: strcat(binary_string, "01100XX"); + read_posn = 20; + break; + case 6: strcat(binary_string, "01101XX"); + read_posn = 23; + break; + default: /* modes 7 to 14 */ + bin_append(56 + (encoding_method - 7), 7, binary_string); + read_posn = strlen(source); + break; + } + if (debug) printf("Setting binary = %s\n", binary_string); + + /* Variable length symbol bit field is just given a place holder (XX) + for the time being */ + + /* Verify that the data to be placed in the compressed data field is all + numeric data before carrying out compression */ + for (i = 0; i < read_posn; i++) { + if ((source[i] < '0') || (source[i] > '9')) { + if ((source[i] != '[') && (source[i] != ']')) { + /* Something is wrong */ + strcpy(symbol->errtxt, "385: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + } + } + + /* Now encode the compressed data field */ + + if (debug) printf("Proceeding to encode data\n"); + if (encoding_method == 1) { + /* Encoding method field "1" - general item identification data */ + char group[4]; + + group[0] = source[2]; + group[1] = '\0'; + + bin_append(atoi(group), 4, binary_string); + + for (i = 1; i < 5; i++) { + group[0] = source[(i * 3)]; + group[1] = source[(i * 3) + 1]; + group[2] = source[(i * 3) + 2]; + group[3] = '\0'; + + bin_append(atoi(group), 10, binary_string); + } + } + + if ((encoding_method == 3) || (encoding_method == 4)) { + /* Encoding method field "0100" - variable weight item + (0,001 kilogram icrements) */ + /* Encoding method field "0101" - variable weight item (0,01 or + 0,001 pound increment) */ + char group[4]; + char weight_str[7]; + + for (i = 1; i < 5; i++) { + group[0] = source[(i * 3)]; + group[1] = source[(i * 3) + 1]; + group[2] = source[(i * 3) + 2]; + group[3] = '\0'; + + bin_append(atoi(group), 10, binary_string); + } + + for (i = 0; i < 6; i++) { + weight_str[i] = source[20 + i]; + } + weight_str[6] = '\0'; + + if ((encoding_method == 4) && (source[19] == '3')) { + bin_append(atoi(weight_str) + 10000, 15, binary_string); + } else { + bin_append(atoi(weight_str), 15, binary_string); + } + } + + if ((encoding_method == 5) || (encoding_method == 6)) { + /* Encoding method "01100" - variable measure item and price */ + /* Encoding method "01101" - variable measure item and price with ISO 4217 + Currency Code */ + + char group[4]; + + for (i = 1; i < 5; i++) { + group[0] = source[(i * 3)]; + group[1] = source[(i * 3) + 1]; + group[2] = source[(i * 3) + 2]; + group[3] = '\0'; + + bin_append(atoi(group), 10, binary_string); + } + + bin_append(source[19] - '0', 2, binary_string); + + if (encoding_method == 6) { + char currency_str[5]; + + for (i = 0; i < 3; i++) { + currency_str[i] = source[20 + i]; + } + currency_str[3] = '\0'; + + bin_append(atoi(currency_str), 10, binary_string); + } + } + + if ((encoding_method >= 7) && (encoding_method <= 14)) { + /* Encoding method fields "0111000" through "0111111" - variable + weight item plus date */ + char group[4]; + int group_val; + char weight_str[8]; + char date_str[4]; + + for (i = 1; i < 5; i++) { + group[0] = source[(i * 3)]; + group[1] = source[(i * 3) + 1]; + group[2] = source[(i * 3) + 2]; + group[3] = '\0'; + + bin_append(atoi(group), 10, binary_string); + } + + weight_str[0] = source[19]; + + for (i = 0; i < 5; i++) { + weight_str[i + 1] = source[21 + i]; + } + weight_str[6] = '\0'; + + bin_append(atoi(weight_str), 20, binary_string); + + if (strlen(source) == 34) { + /* Date information is included */ + date_str[0] = source[28]; + date_str[1] = source[29]; + date_str[2] = '\0'; + group_val = atoi(date_str) * 384; + + date_str[0] = source[30]; + date_str[1] = source[31]; + group_val += (atoi(date_str) - 1) * 32; + + date_str[0] = source[32]; + date_str[1] = source[33]; + group_val += atoi(date_str); + } else { + group_val = 38400; + } + + bin_append(group_val, 16, binary_string); + } + + /* The compressed data field has been processed if appropriate - the + rest of the data (if any) goes into a general-purpose data compaction field */ + + j = 0; + for (i = read_posn; i < strlen(source); i++) { + general_field[j] = source[i]; + j++; + } + general_field[j] = '\0'; + if (debug) printf("General field data = %s\n", general_field); + + latch = 0; + for (i = 0; i < strlen(general_field); i++) { + /* Table 13 - ISO/IEC 646 encodation */ + if ((general_field[i] < ' ') || (general_field[i] > 'z')) { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } else { + general_field_type[i] = ISOIEC; + } + + if (general_field[i] == '#') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == '$') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == '@') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == 92) { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == '^') { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + if (general_field[i] == 96) { + general_field_type[i] = INVALID_CHAR; + latch = 1; + } + + /* Table 12 - Alphanumeric encodation */ + if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '*') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == ',') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '-') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '.') { + general_field_type[i] = ALPHA_OR_ISO; + } + if (general_field[i] == '/') { + general_field_type[i] = ALPHA_OR_ISO; + } + + /* Numeric encodation */ + if ((general_field[i] >= '0') && (general_field[i] <= '9')) { + general_field_type[i] = ANY_ENC; + } + if (general_field[i] == '[') { + /* FNC1 can be encoded in any system */ + general_field_type[i] = ANY_ENC; + } + } + + general_field_type[strlen(general_field)] = '\0'; + if (debug) printf("General field type: %s\n", general_field_type); + + if (latch == 1) { + /* Invalid characters in input data */ + strcpy(symbol->errtxt, "386: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + + for (i = 0; i < strlen(general_field); i++) { + if ((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) { + general_field_type[i + 1] = ISOIEC; + } + } + + for (i = 0; i < strlen(general_field); i++) { + if ((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) { + general_field_type[i + 1] = ALPHA_OR_ISO; + } + } + + latch = general_rules(general_field, general_field_type); + if (debug) printf("General field type: %s\n", general_field_type); + + last_mode = NUMERIC; + + /* Set initial mode if not NUMERIC */ + if (general_field_type[0] == ALPHA) { + bin_append(0, 4, binary_string); /* Alphanumeric latch */ + last_mode = ALPHA; + } + if (general_field_type[0] == ISOIEC) { + bin_append(0, 4, binary_string); /* Alphanumeric latch */ + bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */ + last_mode = ISOIEC; + } + + i = 0; + do { + if (debug) printf("Processing character %d ", i); + switch (general_field_type[i]) { + case NUMERIC: + if (debug) printf("as NUMERIC:"); + + if (last_mode != NUMERIC) { + bin_append(0, 3, binary_string); /* Numeric latch */ + if (debug) printf("\n"); + } + + if (debug) printf(" %c%c > ", general_field[i], general_field[i + 1]); + if (general_field[i] != '[') { + d1 = ctoi(general_field[i]); + } else { + d1 = 10; + } + + if (general_field[i + 1] != '[') { + d2 = ctoi(general_field[i + 1]); + } else { + d2 = 10; + } + + bin_append((11 * d1) + d2 + 8, 7, binary_string); + + i += 2; + if (debug) printf("\n"); + last_mode = NUMERIC; + break; + + case ALPHA: + if (debug) printf("as ALPHA\n"); + if (i != 0) { + if (last_mode == NUMERIC) { + bin_append(0, 4, binary_string); /* Alphanumeric latch */ + } + if (last_mode == ISOIEC) { + bin_append(4, 5, binary_string); /* Alphanumeric latch */ + } + } + + if ((general_field[i] >= '0') && (general_field[i] <= '9')) { + bin_append(general_field[i] - 43, 5, binary_string); + } + + if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { + bin_append(general_field[i] - 33, 6, binary_string); + } + + last_mode = ALPHA; + + if (general_field[i] == '[') { + bin_append(15, 5, binary_string); + last_mode = NUMERIC; + } /* FNC1/Numeric latch */ + + if (general_field[i] == '*') bin_append(58, 6, binary_string); /* asterisk */ + if (general_field[i] == ',') bin_append(59, 6, binary_string); /* comma */ + if (general_field[i] == '-') bin_append(60, 6, binary_string); /* minus or hyphen */ + if (general_field[i] == '.') bin_append(61, 6, binary_string); /* period or full stop */ + if (general_field[i] == '/') bin_append(62, 6, binary_string); /* slash or solidus */ + + i++; + break; + + case ISOIEC: + if (debug) printf("as ISOIEC\n"); + if (i != 0) { + if (last_mode == NUMERIC) { + bin_append(0, 4, binary_string); /* Alphanumeric latch */ + bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */ + } + if (last_mode == ALPHA) { + bin_append(4, 5, binary_string); /* ISO/IEC 646 latch */ + } + } + + if ((general_field[i] >= '0') && (general_field[i] <= '9')) { + bin_append(general_field[i] - 43, 5, binary_string); + } + + if ((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { + bin_append(general_field[i] - 1, 7, binary_string); + } + + if ((general_field[i] >= 'a') && (general_field[i] <= 'z')) { + bin_append(general_field[i] - 7, 7, binary_string); + } + last_mode = ISOIEC; + + if (general_field[i] == '[') { + bin_append(15, 5, binary_string); + last_mode = NUMERIC; + } /* FNC1/Numeric latch */ + + if (general_field[i] == '!') bin_append(232, 8, binary_string); /* exclamation mark */ + if (general_field[i] == 34) bin_append(233, 8, binary_string); /* quotation mark */ + if (general_field[i] == 37) bin_append(234, 8, binary_string); /* percent sign */ + if (general_field[i] == '&') bin_append(235, 8, binary_string); /* ampersand */ + if (general_field[i] == 39) bin_append(236, 8, binary_string); /* apostrophe */ + if (general_field[i] == '(') bin_append(237, 8, binary_string); /* left parenthesis */ + if (general_field[i] == ')') bin_append(238, 8, binary_string); /* right parenthesis */ + if (general_field[i] == '*') bin_append(239, 8, binary_string); /* asterisk */ + if (general_field[i] == '+') bin_append(240, 8, binary_string); /* plus sign */ + if (general_field[i] == ',') bin_append(241, 8, binary_string); /* comma */ + if (general_field[i] == '-') bin_append(242, 8, binary_string); /* minus or hyphen */ + if (general_field[i] == '.') bin_append(243, 8, binary_string); /* period or full stop */ + if (general_field[i] == '/') bin_append(244, 8, binary_string); /* slash or solidus */ + if (general_field[i] == ':') bin_append(245, 8, binary_string); /* colon */ + if (general_field[i] == ';') bin_append(246, 8, binary_string); /* semicolon */ + if (general_field[i] == '<') bin_append(247, 8, binary_string); /* less-than sign */ + if (general_field[i] == '=') bin_append(248, 8, binary_string); /* equals sign */ + if (general_field[i] == '>') bin_append(249, 8, binary_string); /* greater-than sign */ + if (general_field[i] == '?') bin_append(250, 8, binary_string); /* question mark */ + if (general_field[i] == '_') bin_append(251, 8, binary_string); /* underline or low line */ + if (general_field[i] == ' ') bin_append(252, 8, binary_string); /* space */ + + i++; + break; + } + } while (i + latch < strlen(general_field)); + if (debug) printf("Resultant binary = %s\n", binary_string); + if (debug) printf("\tLength: %d\n", (int) strlen(binary_string)); + + remainder = 12 - (strlen(binary_string) % 12); + if (remainder == 12) { + remainder = 0; + } + symbol_characters = ((strlen(binary_string) + remainder) / 12) + 1; + + if ((symbol->symbology == BARCODE_RSS_EXPSTACK) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) { + characters_per_row = symbol->option_2 * 2; + + if ((characters_per_row < 2) || (characters_per_row > 20)) { + characters_per_row = 4; + } + + if ((symbol_characters % characters_per_row) == 1) { + symbol_characters++; + } + + if (symbol_characters < 4) { + symbol_characters = 4; + } + } + + if (symbol_characters < 3) { + symbol_characters = 3; + } + + remainder = (12 * (symbol_characters - 1)) - strlen(binary_string); + + if (latch == 1) { + /* There is still one more numeric digit to encode */ + if (debug) printf("Adding extra (odd) numeric digit\n"); + + if (last_mode == NUMERIC) { + if ((remainder >= 4) && (remainder <= 6)) { + bin_append(ctoi(general_field[i]) + 1, 4, binary_string); + } else { + d1 = ctoi(general_field[i]); + d2 = 10; + + bin_append((11 * d1) + d2 + 8, 7, binary_string); + } + } else { + bin_append(general_field[i] - 43, 5, binary_string); + } + + remainder = 12 - (strlen(binary_string) % 12); + if (remainder == 12) { + remainder = 0; + } + symbol_characters = ((strlen(binary_string) + remainder) / 12) + 1; + + if ((symbol->symbology == BARCODE_RSS_EXPSTACK) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) { + characters_per_row = symbol->option_2 * 2; + + if ((characters_per_row < 2) || (characters_per_row > 20)) { + characters_per_row = 4; + } + + if ((symbol_characters % characters_per_row) == 1) { + symbol_characters++; + } + + if (symbol_characters < 4) { + symbol_characters = 4; + } + } + + if (symbol_characters < 3) { + symbol_characters = 3; + } + + remainder = (12 * (symbol_characters - 1)) - strlen(binary_string); + + if (debug) printf("Resultant binary = %s\n", binary_string); + if (debug) printf("\tLength: %d\n", (int) strlen(binary_string)); + } + + if (strlen(binary_string) > 252) { + strcpy(symbol->errtxt, "387: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + + /* Now add padding to binary string (7.2.5.5.4) */ + i = remainder; + if ((strlen(general_field) != 0) && (last_mode == NUMERIC)) { + strcpy(padstring, "0000"); + i -= 4; + } else { + strcpy(padstring, ""); + } + for (; i > 0; i -= 5) { + strcat(padstring, "00100"); + } + + padstring[remainder] = '\0'; + strcat(binary_string, padstring); + + /* Patch variable length symbol bit field */ + d1 = symbol_characters & 1; + + if (symbol_characters <= 14) { + d2 = 0; + } else { + d2 = 1; + } + + if (encoding_method == 1) { + binary_string[2] = d1 ? '1' : '0'; + binary_string[3] = d2 ? '1' : '0'; + } + if (encoding_method == 2) { + binary_string[3] = d1 ? '1' : '0'; + binary_string[4] = d2 ? '1' : '0'; + } + if ((encoding_method == 5) || (encoding_method == 6)) { + binary_string[6] = d1 ? '1' : '0'; + binary_string[7] = d2 ? '1' : '0'; + } + if (debug) printf("Resultant binary = %s\n", binary_string); + if (debug) printf("\tLength: %d\n", (int) strlen(binary_string)); + return 0; +} + +/* GS1 DataBar Expanded */ +int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len) { + int i, j, k, p, data_chars, vs[21], group[21], v_odd[21], v_even[21]; + char substring[21][14], latch; + int char_widths[21][8], checksum, check_widths[8], c_group; + int check_char, c_odd, c_even, elements[235], pattern_width, reader, writer; + int row, elements_in_sub, special_case_row, left_to_right; + int codeblocks, sub_elements[235], stack_rows, current_row, current_block; + int separator_row; +#ifndef _MSC_VER + char reduced[src_len + 1], binary_string[(7 * src_len) + 1]; +#else + char* reduced = (char*) _alloca(src_len + 1); + char* binary_string = (char*) _alloca((7 * src_len) + 1); +#endif + + separator_row = 0; + reader = 0; + + if (symbol->input_mode != GS1_MODE) { + /* GS1 data has not been verified yet */ + i = gs1_verify(symbol, source, src_len, reduced); + if (i != 0) { + return i; + } + } + + if ((symbol->symbology == BARCODE_RSS_EXP_CC) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) { + /* make space for a composite separator pattern */ + separator_row = symbol->rows; + symbol->row_height[separator_row] = 1; + symbol->rows += 1; + } + + strcpy(binary_string, ""); + + if (symbol->option_1 == 2) { + strcat(binary_string, "1"); + } else { + strcat(binary_string, "0"); + } + + i = rss_binary_string(symbol, reduced, binary_string); + if (i != 0) { + return i; + } + + data_chars = strlen(binary_string) / 12; + + for (i = 0; i < data_chars; i++) { + for (j = 0; j < 12; j++) { + substring[i][j] = binary_string[(i * 12) + j]; + } + substring[i][12] = '\0'; + } + + for (i = 0; i < data_chars; i++) { + vs[i] = 0; + for (p = 0; p < 12; p++) { + if (substring[i][p] == '1') { + vs[i] += (0x800 >> p); + } + } + } + + for (i = 0; i < data_chars; i++) { + if (vs[i] <= 347) { + group[i] = 1; + } + if ((vs[i] >= 348) && (vs[i] <= 1387)) { + group[i] = 2; + } + if ((vs[i] >= 1388) && (vs[i] <= 2947)) { + group[i] = 3; + } + if ((vs[i] >= 2948) && (vs[i] <= 3987)) { + group[i] = 4; + } + if (vs[i] >= 3988) { + group[i] = 5; + } + v_odd[i] = (vs[i] - g_sum_exp[group[i] - 1]) / t_even_exp[group[i] - 1]; + v_even[i] = (vs[i] - g_sum_exp[group[i] - 1]) % t_even_exp[group[i] - 1]; + + getRSSwidths(v_odd[i], modules_odd_exp[group[i] - 1], 4, widest_odd_exp[group[i] - 1], 0); + char_widths[i][0] = widths[0]; + char_widths[i][2] = widths[1]; + char_widths[i][4] = widths[2]; + char_widths[i][6] = widths[3]; + getRSSwidths(v_even[i], modules_even_exp[group[i] - 1], 4, widest_even_exp[group[i] - 1], 1); + char_widths[i][1] = widths[0]; + char_widths[i][3] = widths[1]; + char_widths[i][5] = widths[2]; + char_widths[i][7] = widths[3]; + } + + /* 7.2.6 Check character */ + /* The checksum value is equal to the mod 211 residue of the weighted sum of the widths of the + elements in the data characters. */ + checksum = 0; + for (i = 0; i < data_chars; i++) { + row = weight_rows[(((data_chars - 2) / 2) * 21) + i]; + for (j = 0; j < 8; j++) { + checksum += (char_widths[i][j] * checksum_weight_exp[(row * 8) + j]); + + } + } + + check_char = (211 * ((data_chars + 1) - 4)) + (checksum % 211); + + if (check_char <= 347) { + c_group = 1; + } + if ((check_char >= 348) && (check_char <= 1387)) { + c_group = 2; + } + if ((check_char >= 1388) && (check_char <= 2947)) { + c_group = 3; + } + if ((check_char >= 2948) && (check_char <= 3987)) { + c_group = 4; + } + if (check_char >= 3988) { + c_group = 5; + } + + c_odd = (check_char - g_sum_exp[c_group - 1]) / t_even_exp[c_group - 1]; + c_even = (check_char - g_sum_exp[c_group - 1]) % t_even_exp[c_group - 1]; + + getRSSwidths(c_odd, modules_odd_exp[c_group - 1], 4, widest_odd_exp[c_group - 1], 0); + check_widths[0] = widths[0]; + check_widths[2] = widths[1]; + check_widths[4] = widths[2]; + check_widths[6] = widths[3]; + getRSSwidths(c_even, modules_even_exp[c_group - 1], 4, widest_even_exp[c_group - 1], 1); + check_widths[1] = widths[0]; + check_widths[3] = widths[1]; + check_widths[5] = widths[2]; + check_widths[7] = widths[3]; + + /* Initialise element array */ + pattern_width = ((((data_chars + 1) / 2) + ((data_chars + 1) & 1)) * 5) + ((data_chars + 1) * 8) + 4; + for (i = 0; i < pattern_width; i++) { + elements[i] = 0; + } + + /* Put finder patterns in element array */ + for (i = 0; i < (((data_chars + 1) / 2) + ((data_chars + 1) & 1)); i++) { + k = ((((((data_chars + 1) - 2) / 2) + ((data_chars + 1) & 1)) - 1) * 11) + i; + for (j = 0; j < 5; j++) { + elements[(21 * i) + j + 10] = finder_pattern_exp[((finder_sequence[k] - 1) * 5) + j]; + } + } + + /* Put check character in element array */ + for (i = 0; i < 8; i++) { + elements[i + 2] = check_widths[i]; + } + + /* Put forward reading data characters in element array */ + for (i = 1; i < data_chars; i += 2) { + for (j = 0; j < 8; j++) { + elements[(((i - 1) / 2) * 21) + 23 + j] = char_widths[i][j]; + } + } + + /* Put reversed data characters in element array */ + for (i = 0; i < data_chars; i += 2) { + for (j = 0; j < 8; j++) { + elements[((i / 2) * 21) + 15 + j] = char_widths[i][7 - j]; + } + } + + if ((symbol->symbology == BARCODE_RSS_EXP) || (symbol->symbology == BARCODE_RSS_EXP_CC)) { + /* Copy elements into symbol */ + + elements[0] = 1; // left guard + elements[1] = 1; + + elements[pattern_width - 2] = 1; // right guard + elements[pattern_width - 1] = 1; + + writer = 0; + latch = '0'; + for (i = 0; i < pattern_width; i++) { + for (j = 0; j < elements[i]; j++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer); + } else { + unset_module(symbol, symbol->rows, writer); + } + writer++; + } + if (latch == '1') { + latch = '0'; + } else { + latch = '1'; + } + } + if (symbol->width < writer) { + symbol->width = writer; + } + symbol->rows = symbol->rows + 1; + if (symbol->symbology == BARCODE_RSS_EXP_CC) { + for (j = 4; j < (symbol->width - 4); j++) { + if (module_is_set(symbol, separator_row + 1, j)) { + unset_module(symbol, separator_row, j); + } else { + set_module(symbol, separator_row, j); + } + } + /* finder bar adjustment */ + for (j = 0; j < (writer / 49); j++) { + k = (49 * j) + 18; + for (i = 0; i < 15; i++) { + if ((!(module_is_set(symbol, separator_row + 1, i + k - 1))) && + (!(module_is_set(symbol, separator_row + 1, i + k))) && + module_is_set(symbol, separator_row, i + k - 1)) { + unset_module(symbol, separator_row, i + k); + } + } + } + } + + /* Add human readable text */ + for (i = 0; i <= src_len; i++) { + if ((source[i] != '[') && (source[i] != ']')) { + symbol->text[i] = source[i]; + } else { + if (source[i] == '[') { + symbol->text[i] = '('; + } + if (source[i] == ']') { + symbol->text[i] = ')'; + } + } + } + + } else { + /* RSS Expanded Stacked */ + + /* Bug corrected: Character missing for message + * [01]90614141999996[10]1234222222222221 + * Patch by Daniel Frede + */ + codeblocks = (data_chars + 1) / 2 + ((data_chars + 1) % 2); + + + if ((symbol->option_2 < 1) || (symbol->option_2 > 10)) { + symbol->option_2 = 2; + } + if ((symbol->option_1 == 2) && (symbol->option_2 == 1)) { + /* "There shall be a minimum of four symbol characters in the + first row of an RSS Expanded Stacked symbol when it is the linear + component of an EAN.UCC Composite symbol." */ + symbol->option_2 = 2; + } + + stack_rows = codeblocks / symbol->option_2; + if (codeblocks % symbol->option_2 > 0) { + stack_rows++; + } + + current_block = 0; + for (current_row = 1; current_row <= stack_rows; current_row++) { + for (i = 0; i < 235; i++) { + sub_elements[i] = 0; + } + special_case_row = 0; + + /* Row Start */ + sub_elements[0] = 1; // left guard + sub_elements[1] = 1; + elements_in_sub = 2; + + /* Row Data */ + reader = 0; + do { + if (((symbol->option_2 & 1) || (current_row & 1)) || + ((current_row == stack_rows) && (codeblocks != (current_row * symbol->option_2)) && + (((current_row * symbol->option_2) - codeblocks) & 1))) { + /* left to right */ + left_to_right = 1; + i = 2 + (current_block * 21); + for (j = 0; j < 21; j++) { + if ((i + j) < pattern_width) { + sub_elements[j + (reader * 21) + 2] = elements[i + j]; + } + elements_in_sub++; + } + } else { + /* right to left */ + left_to_right = 0; + i = 2 + (((current_row * symbol->option_2) - reader - 1) * 21); + for (j = 0; j < 21; j++) { + if ((i + j) < pattern_width) { + sub_elements[(20 - j) + (reader * 21) + 2] = elements[i + j]; + } + elements_in_sub++; + } + } + reader++; + current_block++; + } while ((reader < symbol->option_2) && (current_block < codeblocks)); + + /* Row Stop */ + sub_elements[elements_in_sub] = 1; // right guard + sub_elements[elements_in_sub + 1] = 1; + elements_in_sub += 2; + + latch = current_row & 1 ? '0' : '1'; + + if ((current_row == stack_rows) && (codeblocks != (current_row * symbol->option_2)) && + ((current_row & 1) == 0) && ((symbol->option_2 & 1) == 0)) { + /* Special case bottom row */ + special_case_row = 1; + sub_elements[0] = 2; + latch = '0'; + } + + writer = 0; + for (i = 0; i < elements_in_sub; i++) { + for (j = 0; j < sub_elements[i]; j++) { + if (latch == '1') { + set_module(symbol, symbol->rows, writer); + } else { + unset_module(symbol, symbol->rows, writer); + } + writer++; + } + if (latch == '1') { + latch = '0'; + } else { + latch = '1'; + } + } + if (symbol->width < writer) { + symbol->width = writer; + } + + if (current_row != 1) { + /* middle separator pattern (above current row) */ + for (j = 5; j < (49 * symbol->option_2); j += 2) { + set_module(symbol, symbol->rows - 2, j); + } + symbol->row_height[symbol->rows - 2] = 1; + /* bottom separator pattern (above current row) */ + for (j = 4; j < (writer - 4); j++) { + if (module_is_set(symbol, symbol->rows, j)) { + unset_module(symbol, symbol->rows - 1, j); + } else { + set_module(symbol, symbol->rows - 1, j); + } + } + symbol->row_height[symbol->rows - 1] = 1; + /* finder bar adjustment */ + for (j = 0; j < reader; j++) { + k = (49 * j) + 18 + special_case_row; + if (left_to_right) { + for (i = 0; i < 15; i++) { + if ((!(module_is_set(symbol, symbol->rows, i + k - 1))) && + (!(module_is_set(symbol, symbol->rows, i + k))) && + module_is_set(symbol, symbol->rows - 1, i + k - 1)) { + unset_module(symbol, symbol->rows - 1, i + k); + } + } + } else { + if ((current_row == stack_rows) && (data_chars % 2 == 0)) { + k -= 18; + } + for (i = 14; i >= 0; i--) { + if ((!(module_is_set(symbol, symbol->rows, i + k + 1))) && + (!(module_is_set(symbol, symbol->rows, i + k))) && + module_is_set(symbol, symbol->rows - 1, i + k + 1)) { + unset_module(symbol, symbol->rows - 1, i + k); + } + } + } + } + } + + if (current_row != stack_rows) { + /* top separator pattern (below current row) */ + for (j = 4; j < (writer - 4); j++) { + if (module_is_set(symbol, symbol->rows, j)) { + unset_module(symbol, symbol->rows + 1, j); + } else { + set_module(symbol, symbol->rows + 1, j); + } + } + symbol->row_height[symbol->rows + 1] = 1; + /* finder bar adjustment */ + for (j = 0; j < reader; j++) { + k = (49 * j) + 18; + if (left_to_right) { + for (i = 0; i < 15; i++) { + if ((!(module_is_set(symbol, symbol->rows, i + k - 1))) && + (!(module_is_set(symbol, symbol->rows, i + k))) && + module_is_set(symbol, symbol->rows + 1, i + k - 1)) { + unset_module(symbol, symbol->rows + 1, i + k); + } + } + } else { + for (i = 14; i >= 0; i--) { + if ((!(module_is_set(symbol, symbol->rows, i + k + 1))) && + (!(module_is_set(symbol, symbol->rows, i + k))) && + module_is_set(symbol, symbol->rows + 1, i + k + 1)) { + unset_module(symbol, symbol->rows + 1, i + k); + } + } + } + } + } + + symbol->rows = symbol->rows + 4; + } + symbol->rows = symbol->rows - 3; + if (symbol->symbology == BARCODE_RSS_EXPSTACK_CC) { + for (j = 4; j < (symbol->width - 4); j++) { + if (module_is_set(symbol, separator_row + 1, j)) { + unset_module(symbol, separator_row, j); + } else { + set_module(symbol, separator_row, j); + } + } + /* finder bar adjustment */ + for (j = 0; j < reader; j++) { + k = (49 * j) + 18; + for (i = 0; i < 15; i++) { + if ((!(module_is_set(symbol, separator_row + 1, i + k - 1))) && + (!(module_is_set(symbol, separator_row + 1, i + k))) && + module_is_set(symbol, separator_row, i + k - 1)) { + unset_module(symbol, separator_row, i + k); + } + } + } + } + + } + + for (i = 0; i < symbol->rows; i++) { + if (symbol->row_height[i] == 0) { + symbol->row_height[i] = 34; + } + } + + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/rss.h b/3rdparty/zint-2.6.1/backend/rss.h new file mode 100644 index 0000000..ae47d99 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/rss.h @@ -0,0 +1,298 @@ +/* rss.h - Data tables for Reduced Space Symbology */ + +/* + libzint - the open source barcode library + Copyright (C) 2007-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#define NUMERIC 110 +#define ALPHA 97 +#define ISOIEC 105 +#define INVALID_CHAR 100 +#define ANY_ENC 120 +#define ALPHA_OR_ISO 121 + +/* RSS-14 Tables */ +static const unsigned short int g_sum_table[9] = { + 0, 161, 961, 2015, 2715, 0, 336, 1036, 1516 +}; + +static const char t_table[9] = { + 1, 10, 34, 70, 126, 4, 20, 48, 81 +}; + +static const char modules_odd[9] = { + 12, 10, 8, 6, 4, 5, 7, 9, 11 +}; + +static const char modules_even[9] = { + 4, 6, 8, 10, 12, 10, 8, 6, 4 +}; + +static const char widest_odd[9] = { + 8, 6, 4, 3, 1, 2, 4, 6, 8 +}; + +static const char widest_even[9] = { + 1, 3, 5, 6, 8, 7, 5, 3, 1 +}; + +static int widths[8]; +static const char finder_pattern[45] = { + 3, 8, 2, 1, 1, + 3, 5, 5, 1, 1, + 3, 3, 7, 1, 1, + 3, 1, 9, 1, 1, + 2, 7, 4, 1, 1, + 2, 5, 6, 1, 1, + 2, 3, 8, 1, 1, + 1, 5, 7, 1, 1, + 1, 3, 9, 1, 1 +}; + +static const char checksum_weight[32] = { + /* Table 5 */ + 1, 3, 9, 27, 2, 6, 18, 54, + 4, 12, 36, 29, 8, 24, 72, 58, + 16, 48, 65, 37, 32, 17, 51, 74, + 64, 34, 23, 69, 49, 68, 46, 59 +}; + +/* RSS Limited Tables */ +static const unsigned short int t_even_ltd[7] = { + 28, 728, 6454, 203, 2408, 1, 16632 +}; + +static const char modules_odd_ltd[7] = { + 17, 13, 9, 15, 11, 19, 7 +}; + +static const char modules_even_ltd[7] = { + 9, 13, 17, 11, 15, 7, 19 +}; + +static const char widest_odd_ltd[7] = { + 6, 5, 3, 5, 4, 8, 1 +}; + +static const char widest_even_ltd[7] = { + 3, 4, 6, 4, 5, 1, 8 +}; + +static const char checksum_weight_ltd[28] = { + /* Table 7 */ + 1, 3, 9, 27, 81, 65, 17, 51, 64, 14, 42, 37, 22, 66, + 20, 60, 2, 6, 18, 54, 73, 41, 34, 13, 39, 28, 84, 74 +}; + +static const char finder_pattern_ltd[1246] = { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 2, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, + 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, + 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, + 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, + 1, 3, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, + 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, + 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, + 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, + 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, + 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, + 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 2, 1, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, + 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, + 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, + 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, + 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, + 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, + 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, + 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, + 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, + 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, + 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, + 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, + 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, + 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, + 2, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1 +}; + +/* RSS Expanded Tables */ +static const unsigned short int g_sum_exp[5] = { + 0, 348, 1388, 2948, 3988 +}; + +static const unsigned short int t_even_exp[5] = { + 4, 20, 52, 104, 204 +}; + +static const char modules_odd_exp[5] = { + 12, 10, 8, 6, 4 +}; + +static const char modules_even_exp[5] = { + 5, 7, 9, 11, 13 +}; + +static const char widest_odd_exp[5] = { + 7, 5, 4, 3, 1 +}; + +static const char widest_even_exp[5] = { + 2, 4, 5, 6, 8 +}; + +static const unsigned short int checksum_weight_exp[184] = { + /* Table 14 */ + 1, 3, 9, 27, 81, 32, 96, 77, + 20, 60, 180, 118, 143, 7, 21, 63, + 189, 145, 13, 39, 117, 140, 209, 205, + 193, 157, 49, 147, 19, 57, 171, 91, + 62, 186, 136, 197, 169, 85, 44, 132, + 185, 133, 188, 142, 4, 12, 36, 108, + 113, 128, 173, 97, 80, 29, 87, 50, + 150, 28, 84, 41, 123, 158, 52, 156, + 46, 138, 203, 187, 139, 206, 196, 166, + 76, 17, 51, 153, 37, 111, 122, 155, + 43, 129, 176, 106, 107, 110, 119, 146, + 16, 48, 144, 10, 30, 90, 59, 177, + 109, 116, 137, 200, 178, 112, 125, 164, + 70, 210, 208, 202, 184, 130, 179, 115, + 134, 191, 151, 31, 93, 68, 204, 190, + 148, 22, 66, 198, 172, 94, 71, 2, + 6, 18, 54, 162, 64, 192, 154, 40, + 120, 149, 25, 75, 14, 42, 126, 167, + 79, 26, 78, 23, 69, 207, 199, 175, + 103, 98, 83, 38, 114, 131, 182, 124, + 161, 61, 183, 127, 170, 88, 53, 159, + 55, 165, 73, 8, 24, 72, 5, 15, + 45, 135, 194, 160, 58, 174, 100, 89 +}; + +static const char finder_pattern_exp[60] = { + /* Table 15 */ + 1, 8, 4, 1, 1, + 1, 1, 4, 8, 1, + 3, 6, 4, 1, 1, + 1, 1, 4, 6, 3, + 3, 4, 6, 1, 1, + 1, 1, 6, 4, 3, + 3, 2, 8, 1, 1, + 1, 1, 8, 2, 3, + 2, 6, 5, 1, 1, + 1, 1, 5, 6, 2, + 2, 2, 9, 1, 1, + 1, 1, 9, 2, 2 +}; + +static const char finder_sequence[198] = { + /* Table 16 */ + 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 6, 3, 8, 0, 0, 0, 0, 0, 0, 0, + 1, 10, 3, 8, 5, 0, 0, 0, 0, 0, 0, + 1, 10, 3, 8, 7, 12, 0, 0, 0, 0, 0, + 1, 10, 3, 8, 9, 12, 11, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 10, 9, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 0, + 1, 2, 3, 4, 5, 8, 7, 10, 9, 12, 11 +}; + +static const char weight_rows[210] = { + 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 6, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 9, 10, 3, 4, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 18, 3, 4, 13, 14, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 18, 3, 4, 13, 14, 11, 12, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 18, 3, 4, 13, 14, 15, 16, 21, 22, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 15, 16, 0, 0, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 19, 20, 21, 22, 0, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 14, 11, 12, 17, 18, 15, 16, 21, 22, 19, 20 +}; diff --git a/3rdparty/zint-2.6.1/backend/sjis.h b/3rdparty/zint-2.6.1/backend/sjis.h new file mode 100644 index 0000000..629d3e1 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/sjis.h @@ -0,0 +1,6886 @@ +/* sjis.h - Unicode to Shift JIS lookup table + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +/* Derived from : +## Shift_JIS (JIS X 0208:1997 Appendix 1) vs Unicode mapping table +## +## Date: 06 Mar 2002 06:01:22 GMT +## License: +## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved. +## Copyright (C) 2001 I'O, All Rights Reserved. +## You can use, modify, distribute this table freely. + */ + +static const unsigned short int sjis_lookup[] = { + 0x005C, 0x815F, // REVERSE SOLIDUS + 0x00A2, 0x8191, // CENT SIGN + 0x00A3, 0x8192, // POUND SIGN + 0x00A7, 0x8198, // SECTION SIGN + 0x00A8, 0x814E, // DIAERESIS + 0x00AC, 0x81CA, // NOT SIGN + 0x00B0, 0x818B, // DEGREE SIGN + 0x00B1, 0x817D, // PLUS-MINUS SIGN + 0x00B4, 0x814C, // ACUTE ACCENT + 0x00B6, 0x81F7, // PILCROW SIGN + 0x00D7, 0x817E, // MULTIPLICATION SIGN + 0x00F7, 0x8180, // DIVISION SIGN + 0x0391, 0x839F, // GREEK CAPITAL LETTER ALPHA + 0x0392, 0x83A0, // GREEK CAPITAL LETTER BETA + 0x0393, 0x83A1, // GREEK CAPITAL LETTER GAMMA + 0x0394, 0x83A2, // GREEK CAPITAL LETTER DELTA + 0x0395, 0x83A3, // GREEK CAPITAL LETTER EPSILON + 0x0396, 0x83A4, // GREEK CAPITAL LETTER ZETA + 0x0397, 0x83A5, // GREEK CAPITAL LETTER ETA + 0x0398, 0x83A6, // GREEK CAPITAL LETTER THETA + 0x0399, 0x83A7, // GREEK CAPITAL LETTER IOTA + 0x039A, 0x83A8, // GREEK CAPITAL LETTER KAPPA + 0x039B, 0x83A9, // GREEK CAPITAL LETTER LAMDA + 0x039C, 0x83AA, // GREEK CAPITAL LETTER MU + 0x039D, 0x83AB, // GREEK CAPITAL LETTER NU + 0x039E, 0x83AC, // GREEK CAPITAL LETTER XI + 0x039F, 0x83AD, // GREEK CAPITAL LETTER OMICRON + 0x03A0, 0x83AE, // GREEK CAPITAL LETTER PI + 0x03A1, 0x83AF, // GREEK CAPITAL LETTER RHO + 0x03A3, 0x83B0, // GREEK CAPITAL LETTER SIGMA + 0x03A4, 0x83B1, // GREEK CAPITAL LETTER TAU + 0x03A5, 0x83B2, // GREEK CAPITAL LETTER UPSILON + 0x03A6, 0x83B3, // GREEK CAPITAL LETTER PHI + 0x03A7, 0x83B4, // GREEK CAPITAL LETTER CHI + 0x03A8, 0x83B5, // GREEK CAPITAL LETTER PSI + 0x03A9, 0x83B6, // GREEK CAPITAL LETTER OMEGA + 0x03B1, 0x83BF, // GREEK SMALL LETTER ALPHA + 0x03B2, 0x83C0, // GREEK SMALL LETTER BETA + 0x03B3, 0x83C1, // GREEK SMALL LETTER GAMMA + 0x03B4, 0x83C2, // GREEK SMALL LETTER DELTA + 0x03B5, 0x83C3, // GREEK SMALL LETTER EPSILON + 0x03B6, 0x83C4, // GREEK SMALL LETTER ZETA + 0x03B7, 0x83C5, // GREEK SMALL LETTER ETA + 0x03B8, 0x83C6, // GREEK SMALL LETTER THETA + 0x03B9, 0x83C7, // GREEK SMALL LETTER IOTA + 0x03BA, 0x83C8, // GREEK SMALL LETTER KAPPA + 0x03BB, 0x83C9, // GREEK SMALL LETTER LAMDA + 0x03BC, 0x83CA, // GREEK SMALL LETTER MU + 0x03BD, 0x83CB, // GREEK SMALL LETTER NU + 0x03BE, 0x83CC, // GREEK SMALL LETTER XI + 0x03BF, 0x83CD, // GREEK SMALL LETTER OMICRON + 0x03C0, 0x83CE, // GREEK SMALL LETTER PI + 0x03C1, 0x83CF, // GREEK SMALL LETTER RHO + 0x03C3, 0x83D0, // GREEK SMALL LETTER SIGMA + 0x03C4, 0x83D1, // GREEK SMALL LETTER TAU + 0x03C5, 0x83D2, // GREEK SMALL LETTER UPSILON + 0x03C6, 0x83D3, // GREEK SMALL LETTER PHI + 0x03C7, 0x83D4, // GREEK SMALL LETTER CHI + 0x03C8, 0x83D5, // GREEK SMALL LETTER PSI + 0x03C9, 0x83D6, // GREEK SMALL LETTER OMEGA + 0x0401, 0x8446, // CYRILLIC CAPITAL LETTER IO + 0x0410, 0x8440, // CYRILLIC CAPITAL LETTER A + 0x0411, 0x8441, // CYRILLIC CAPITAL LETTER BE + 0x0412, 0x8442, // CYRILLIC CAPITAL LETTER VE + 0x0413, 0x8443, // CYRILLIC CAPITAL LETTER GHE + 0x0414, 0x8444, // CYRILLIC CAPITAL LETTER DE + 0x0415, 0x8445, // CYRILLIC CAPITAL LETTER IE + 0x0416, 0x8447, // CYRILLIC CAPITAL LETTER ZHE + 0x0417, 0x8448, // CYRILLIC CAPITAL LETTER ZE + 0x0418, 0x8449, // CYRILLIC CAPITAL LETTER I + 0x0419, 0x844A, // CYRILLIC CAPITAL LETTER SHORT I + 0x041A, 0x844B, // CYRILLIC CAPITAL LETTER KA + 0x041B, 0x844C, // CYRILLIC CAPITAL LETTER EL + 0x041C, 0x844D, // CYRILLIC CAPITAL LETTER EM + 0x041D, 0x844E, // CYRILLIC CAPITAL LETTER EN + 0x041E, 0x844F, // CYRILLIC CAPITAL LETTER O + 0x041F, 0x8450, // CYRILLIC CAPITAL LETTER PE + 0x0420, 0x8451, // CYRILLIC CAPITAL LETTER ER + 0x0421, 0x8452, // CYRILLIC CAPITAL LETTER ES + 0x0422, 0x8453, // CYRILLIC CAPITAL LETTER TE + 0x0423, 0x8454, // CYRILLIC CAPITAL LETTER U + 0x0424, 0x8455, // CYRILLIC CAPITAL LETTER EF + 0x0425, 0x8456, // CYRILLIC CAPITAL LETTER HA + 0x0426, 0x8457, // CYRILLIC CAPITAL LETTER TSE + 0x0427, 0x8458, // CYRILLIC CAPITAL LETTER CHE + 0x0428, 0x8459, // CYRILLIC CAPITAL LETTER SHA + 0x0429, 0x845A, // CYRILLIC CAPITAL LETTER SHCHA + 0x042B, 0x845C, // CYRILLIC CAPITAL LETTER YERU + 0x042C, 0x845D, // CYRILLIC CAPITAL LETTER SOFT SIGN + 0x042D, 0x845E, // CYRILLIC CAPITAL LETTER E + 0x042E, 0x845F, // CYRILLIC CAPITAL LETTER YU + 0x042F, 0x8460, // CYRILLIC CAPITAL LETTER YA + 0x0430, 0x8470, // CYRILLIC SMALL LETTER A + 0x0431, 0x8471, // CYRILLIC SMALL LETTER BE + 0x0432, 0x8472, // CYRILLIC SMALL LETTER VE + 0x0433, 0x8473, // CYRILLIC SMALL LETTER GHE + 0x0434, 0x8474, // CYRILLIC SMALL LETTER DE + 0x0435, 0x8475, // CYRILLIC SMALL LETTER IE + 0x0436, 0x8477, // CYRILLIC SMALL LETTER ZHE + 0x0437, 0x8478, // CYRILLIC SMALL LETTER ZE + 0x0438, 0x8479, // CYRILLIC SMALL LETTER I + 0x0439, 0x847A, // CYRILLIC SMALL LETTER SHORT I + 0x043A, 0x847B, // CYRILLIC SMALL LETTER KA + 0x043B, 0x847C, // CYRILLIC SMALL LETTER EL + 0x043C, 0x847D, // CYRILLIC SMALL LETTER EM + 0x043D, 0x847E, // CYRILLIC SMALL LETTER EN + 0x043E, 0x8480, // CYRILLIC SMALL LETTER O + 0x043F, 0x8481, // CYRILLIC SMALL LETTER PE + 0x0440, 0x8482, // CYRILLIC SMALL LETTER ER + 0x0441, 0x8483, // CYRILLIC SMALL LETTER ES + 0x0442, 0x8484, // CYRILLIC SMALL LETTER TE + 0x0443, 0x8485, // CYRILLIC SMALL LETTER U + 0x0444, 0x8486, // CYRILLIC SMALL LETTER EF + 0x0445, 0x8487, // CYRILLIC SMALL LETTER HA + 0x0446, 0x8488, // CYRILLIC SMALL LETTER TSE + 0x0447, 0x8489, // CYRILLIC SMALL LETTER CHE + 0x0448, 0x848A, // CYRILLIC SMALL LETTER SHA + 0x0449, 0x848B, // CYRILLIC SMALL LETTER SHCHA + 0x044A, 0x848C, // CYRILLIC SMALL LETTER HARD SIGN + 0x044B, 0x848D, // CYRILLIC SMALL LETTER YERU + 0x044C, 0x848E, // CYRILLIC SMALL LETTER SOFT SIGN + 0x044D, 0x848F, // CYRILLIC SMALL LETTER E + 0x044E, 0x8490, // CYRILLIC SMALL LETTER YU + 0x044F, 0x8491, // CYRILLIC SMALL LETTER YA + 0x0451, 0x8476, // CYRILLIC SMALL LETTER IO + 0x2010, 0x815D, // HYPHEN + 0x2014, 0x815C, // EM DASH + 0x2016, 0x8161, // DOUBLE VERTICAL LINE + 0x2018, 0x8165, // LEFT SINGLE QUOTATION MARK + 0x2019, 0x8166, // RIGHT SINGLE QUOTATION MARK + 0x201C, 0x8167, // LEFT DOUBLE QUOTATION MARK + 0x201D, 0x8168, // RIGHT DOUBLE QUOTATION MARK + 0x2020, 0x81F5, // DAGGER + 0x2021, 0x81F6, // DOUBLE DAGGER + 0x2025, 0x8164, // TWO DOT LEADER + 0x2026, 0x8163, // HORIZONTAL ELLIPSIS + 0x2030, 0x81F1, // PER MILLE SIGN + 0x2032, 0x818C, // PRIME + 0x2033, 0x818D, // DOUBLE PRIME + 0x203B, 0x81A6, // REFERENCE MARK + 0x2103, 0x818E, // DEGREE CELSIUS + 0x212B, 0x81F0, // ANGSTROM SIGN + 0x2190, 0x81A9, // LEFTWARDS ARROW + 0x2191, 0x81AA, // UPWARDS ARROW + 0x2192, 0x81A8, // RIGHTWARDS ARROW + 0x2193, 0x81AB, // DOWNWARDS ARROW + 0x21D2, 0x81CB, // RIGHTWARDS DOUBLE ARROW + 0x21D4, 0x81CC, // LEFT RIGHT DOUBLE ARROW + 0x2200, 0x81CD, // FOR ALL + 0x2202, 0x81DD, // PARTIAL DIFFERENTIAL + 0x2203, 0x81CE, // THERE EXISTS + 0x2207, 0x81DE, // NABLA + 0x2208, 0x81B8, // ELEMENT OF + 0x220B, 0x81B9, // CONTAINS AS MEMBER + 0x2212, 0x817C, // MINUS SIGN + 0x221A, 0x81E3, // SQUARE ROOT + 0x221D, 0x81E5, // PROPORTIONAL TO + 0x221E, 0x8187, // INFINITY + 0x2220, 0x81DA, // ANGLE + 0x2227, 0x81C8, // LOGICAL AND + 0x2228, 0x81C9, // LOGICAL OR + 0x2229, 0x81BF, // INTERSECTION + 0x222A, 0x81BE, // UNION + 0x222B, 0x81E7, // INTEGRAL + 0x222C, 0x81E8, // DOUBLE INTEGRAL + 0x2234, 0x8188, // THEREFORE + 0x2235, 0x81E6, // BECAUSE + 0x223D, 0x81E4, // REVERSED TILDE + 0x2252, 0x81E0, // APPROXIMATELY EQUAL TO OR THE IMAGE OF + 0x2260, 0x8182, // NOT EQUAL TO + 0x2261, 0x81DF, // IDENTICAL TO + 0x2266, 0x8185, // LESS-THAN OVER EQUAL TO + 0x2267, 0x8186, // GREATER-THAN OVER EQUAL TO + 0x226A, 0x81E1, // MUCH LESS-THAN + 0x226B, 0x81E2, // MUCH GREATER-THAN + 0x2282, 0x81BC, // SUBSET OF + 0x2283, 0x81BD, // SUPERSET OF + 0x2286, 0x81BA, // SUBSET OF OR EQUAL TO + 0x2287, 0x81BB, // SUPERSET OF OR EQUAL TO + 0x22A5, 0x81DB, // UP TACK + 0x2312, 0x81DC, // ARC + 0x2500, 0x849F, // BOX DRAWINGS LIGHT HORIZONTAL + 0x2501, 0x84AA, // BOX DRAWINGS HEAVY HORIZONTAL + 0x2502, 0x84A0, // BOX DRAWINGS LIGHT VERTICAL + 0x2503, 0x84AB, // BOX DRAWINGS HEAVY VERTICAL + 0x250C, 0x84A1, // BOX DRAWINGS LIGHT DOWN AND RIGHT + 0x250F, 0x84AC, // BOX DRAWINGS HEAVY DOWN AND RIGHT + 0x2510, 0x84A2, // BOX DRAWINGS LIGHT DOWN AND LEFT + 0x2513, 0x84AD, // BOX DRAWINGS HEAVY DOWN AND LEFT + 0x2514, 0x84A4, // BOX DRAWINGS LIGHT UP AND RIGHT + 0x2517, 0x84AF, // BOX DRAWINGS HEAVY UP AND RIGHT + 0x2518, 0x84A3, // BOX DRAWINGS LIGHT UP AND LEFT + 0x251B, 0x84AE, // BOX DRAWINGS HEAVY UP AND LEFT + 0x251C, 0x84A5, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT + 0x251D, 0x84BA, // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY + 0x2520, 0x84B5, // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT + 0x2523, 0x84B0, // BOX DRAWINGS HEAVY VERTICAL AND RIGHT + 0x2524, 0x84A7, // BOX DRAWINGS LIGHT VERTICAL AND LEFT + 0x2525, 0x84BC, // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY + 0x2528, 0x84B7, // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT + 0x252B, 0x84B2, // BOX DRAWINGS HEAVY VERTICAL AND LEFT + 0x252C, 0x84A6, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + 0x252F, 0x84B6, // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY + 0x2530, 0x84BB, // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT + 0x2533, 0x84B1, // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL + 0x2534, 0x84A8, // BOX DRAWINGS LIGHT UP AND HORIZONTAL + 0x2537, 0x84B8, // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY + 0x2538, 0x84BD, // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT + 0x253B, 0x84B3, // BOX DRAWINGS HEAVY UP AND HORIZONTAL + 0x253C, 0x84A9, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + 0x253F, 0x84B9, // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY + 0x2542, 0x84BE, // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT + 0x254B, 0x84B4, // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL + 0x25A0, 0x81A1, // BLACK SQUARE + 0x25A1, 0x81A0, // WHITE SQUARE + 0x25B2, 0x81A3, // BLACK UP-POINTING TRIANGLE + 0x25B3, 0x81A2, // WHITE UP-POINTING TRIANGLE + 0x25BC, 0x81A5, // BLACK DOWN-POINTING TRIANGLE + 0x25BD, 0x81A4, // WHITE DOWN-POINTING TRIANGLE + 0x25C6, 0x819F, // BLACK DIAMOND + 0x25C7, 0x819E, // WHITE DIAMOND + 0x25CB, 0x819B, // WHITE CIRCLE + 0x25CE, 0x819D, // BULLSEYE + 0x25CF, 0x819C, // BLACK CIRCLE + 0x25EF, 0x81FC, // LARGE CIRCLE + 0x2605, 0x819A, // BLACK STAR + 0x2606, 0x8199, // WHITE STAR + 0x2640, 0x818A, // FEMALE SIGN + 0x2642, 0x8189, // MALE SIGN + 0x266A, 0x81F4, // EIGHTH NOTE + 0x266D, 0x81F3, // MUSIC FLAT SIGN + 0x266F, 0x81F2, // MUSIC SHARP SIGN + 0x3000, 0x8140, // IDEOGRAPHIC SPACE + 0x3001, 0x8141, // IDEOGRAPHIC COMMA + 0x3002, 0x8142, // IDEOGRAPHIC FULL STOP + 0x3003, 0x8156, // DITTO MARK + 0x3005, 0x8158, // IDEOGRAPHIC ITERATION MARK + 0x3006, 0x8159, // IDEOGRAPHIC CLOSING MARK + 0x3007, 0x815A, // IDEOGRAPHIC NUMBER ZERO + 0x3008, 0x8171, // LEFT ANGLE BRACKET + 0x3009, 0x8172, // RIGHT ANGLE BRACKET + 0x300A, 0x8173, // LEFT DOUBLE ANGLE BRACKET + 0x300B, 0x8174, // RIGHT DOUBLE ANGLE BRACKET + 0x300C, 0x8175, // LEFT CORNER BRACKET + 0x300D, 0x8176, // RIGHT CORNER BRACKET + 0x300E, 0x8177, // LEFT WHITE CORNER BRACKET + 0x300F, 0x8178, // RIGHT WHITE CORNER BRACKET + 0x3010, 0x8179, // LEFT BLACK LENTICULAR BRACKET + 0x3011, 0x817A, // RIGHT BLACK LENTICULAR BRACKET + 0x3012, 0x81A7, // POSTAL MARK + 0x3013, 0x81AC, // GETA MARK + 0x3014, 0x816B, // LEFT TORTOISE SHELL BRACKET + 0x3015, 0x816C, // RIGHT TORTOISE SHELL BRACKET + 0x301C, 0x8160, // WAVE DASH + 0x3041, 0x829F, // HIRAGANA LETTER SMALL A + 0x3042, 0x82A0, // HIRAGANA LETTER A + 0x3043, 0x82A1, // HIRAGANA LETTER SMALL I + 0x3044, 0x82A2, // HIRAGANA LETTER I + 0x3045, 0x82A3, // HIRAGANA LETTER SMALL U + 0x3046, 0x82A4, // HIRAGANA LETTER U + 0x3047, 0x82A5, // HIRAGANA LETTER SMALL E + 0x3048, 0x82A6, // HIRAGANA LETTER E + 0x3049, 0x82A7, // HIRAGANA LETTER SMALL O + 0x304A, 0x82A8, // HIRAGANA LETTER O + 0x304B, 0x82A9, // HIRAGANA LETTER KA + 0x304C, 0x82AA, // HIRAGANA LETTER GA + 0x304D, 0x82AB, // HIRAGANA LETTER KI + 0x304E, 0x82AC, // HIRAGANA LETTER GI + 0x304F, 0x82AD, // HIRAGANA LETTER KU + 0x3050, 0x82AE, // HIRAGANA LETTER GU + 0x3051, 0x82AF, // HIRAGANA LETTER KE + 0x3052, 0x82B0, // HIRAGANA LETTER GE + 0x3053, 0x82B1, // HIRAGANA LETTER KO + 0x3054, 0x82B2, // HIRAGANA LETTER GO + 0x3055, 0x82B3, // HIRAGANA LETTER SA + 0x3056, 0x82B4, // HIRAGANA LETTER ZA + 0x3057, 0x82B5, // HIRAGANA LETTER SI + 0x3058, 0x82B6, // HIRAGANA LETTER ZI + 0x3059, 0x82B7, // HIRAGANA LETTER SU + 0x305A, 0x82B8, // HIRAGANA LETTER ZU + 0x305B, 0x82B9, // HIRAGANA LETTER SE + 0x305C, 0x82BA, // HIRAGANA LETTER ZE + 0x305D, 0x82BB, // HIRAGANA LETTER SO + 0x305E, 0x82BC, // HIRAGANA LETTER ZO + 0x305F, 0x82BD, // HIRAGANA LETTER TA + 0x3060, 0x82BE, // HIRAGANA LETTER DA + 0x3061, 0x82BF, // HIRAGANA LETTER TI + 0x3062, 0x82C0, // HIRAGANA LETTER DI + 0x3063, 0x82C1, // HIRAGANA LETTER SMALL TU + 0x3064, 0x82C2, // HIRAGANA LETTER TU + 0x3065, 0x82C3, // HIRAGANA LETTER DU + 0x3066, 0x82C4, // HIRAGANA LETTER TE + 0x3067, 0x82C5, // HIRAGANA LETTER DE + 0x3068, 0x82C6, // HIRAGANA LETTER TO + 0x3069, 0x82C7, // HIRAGANA LETTER DO + 0x306A, 0x82C8, // HIRAGANA LETTER NA + 0x306B, 0x82C9, // HIRAGANA LETTER NI + 0x306C, 0x82CA, // HIRAGANA LETTER NU + 0x306D, 0x82CB, // HIRAGANA LETTER NE + 0x306E, 0x82CC, // HIRAGANA LETTER NO + 0x306F, 0x82CD, // HIRAGANA LETTER HA + 0x3070, 0x82CE, // HIRAGANA LETTER BA + 0x3071, 0x82CF, // HIRAGANA LETTER PA + 0x3072, 0x82D0, // HIRAGANA LETTER HI + 0x3073, 0x82D1, // HIRAGANA LETTER BI + 0x3074, 0x82D2, // HIRAGANA LETTER PI + 0x3075, 0x82D3, // HIRAGANA LETTER HU + 0x3076, 0x82D4, // HIRAGANA LETTER BU + 0x3077, 0x82D5, // HIRAGANA LETTER PU + 0x3078, 0x82D6, // HIRAGANA LETTER HE + 0x3079, 0x82D7, // HIRAGANA LETTER BE + 0x307A, 0x82D8, // HIRAGANA LETTER PE + 0x307B, 0x82D9, // HIRAGANA LETTER HO + 0x307C, 0x82DA, // HIRAGANA LETTER BO + 0x307D, 0x82DB, // HIRAGANA LETTER PO + 0x307E, 0x82DC, // HIRAGANA LETTER MA + 0x307F, 0x82DD, // HIRAGANA LETTER MI + 0x3080, 0x82DE, // HIRAGANA LETTER MU + 0x3081, 0x82DF, // HIRAGANA LETTER ME + 0x3082, 0x82E0, // HIRAGANA LETTER MO + 0x3083, 0x82E1, // HIRAGANA LETTER SMALL YA + 0x3084, 0x82E2, // HIRAGANA LETTER YA + 0x3085, 0x82E3, // HIRAGANA LETTER SMALL YU + 0x3086, 0x82E4, // HIRAGANA LETTER YU + 0x3087, 0x82E5, // HIRAGANA LETTER SMALL YO + 0x3088, 0x82E6, // HIRAGANA LETTER YO + 0x3089, 0x82E7, // HIRAGANA LETTER RA + 0x308A, 0x82E8, // HIRAGANA LETTER RI + 0x308B, 0x82E9, // HIRAGANA LETTER RU + 0x308C, 0x82EA, // HIRAGANA LETTER RE + 0x308D, 0x82EB, // HIRAGANA LETTER RO + 0x308E, 0x82EC, // HIRAGANA LETTER SMALL WA + 0x308F, 0x82ED, // HIRAGANA LETTER WA + 0x3090, 0x82EE, // HIRAGANA LETTER WI + 0x3091, 0x82EF, // HIRAGANA LETTER WE + 0x3092, 0x82F0, // HIRAGANA LETTER WO + 0x3093, 0x82F1, // HIRAGANA LETTER N + 0x309B, 0x814A, // KATAKANA-HIRAGANA VOICED SOUND MARK + 0x309C, 0x814B, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + 0x309D, 0x8154, // HIRAGANA ITERATION MARK + 0x309E, 0x8155, // HIRAGANA VOICED ITERATION MARK + 0x30A1, 0x8340, // KATAKANA LETTER SMALL A + 0x30A2, 0x8341, // KATAKANA LETTER A + 0x30A3, 0x8342, // KATAKANA LETTER SMALL I + 0x30A4, 0x8343, // KATAKANA LETTER I + 0x30A5, 0x8344, // KATAKANA LETTER SMALL U + 0x30A6, 0x8345, // KATAKANA LETTER U + 0x30A7, 0x8346, // KATAKANA LETTER SMALL E + 0x30A8, 0x8347, // KATAKANA LETTER E + 0x30A9, 0x8348, // KATAKANA LETTER SMALL O + 0x30AA, 0x8349, // KATAKANA LETTER O + 0x30AB, 0x834A, // KATAKANA LETTER KA + 0x30AC, 0x834B, // KATAKANA LETTER GA + 0x30AD, 0x834C, // KATAKANA LETTER KI + 0x30AE, 0x834D, // KATAKANA LETTER GI + 0x30AF, 0x834E, // KATAKANA LETTER KU + 0x30B0, 0x834F, // KATAKANA LETTER GU + 0x30B1, 0x8350, // KATAKANA LETTER KE + 0x30B2, 0x8351, // KATAKANA LETTER GE + 0x30B3, 0x8352, // KATAKANA LETTER KO + 0x30B4, 0x8353, // KATAKANA LETTER GO + 0x30B5, 0x8354, // KATAKANA LETTER SA + 0x30B6, 0x8355, // KATAKANA LETTER ZA + 0x30B7, 0x8356, // KATAKANA LETTER SI + 0x30B8, 0x8357, // KATAKANA LETTER ZI + 0x30B9, 0x8358, // KATAKANA LETTER SU + 0x30BA, 0x8359, // KATAKANA LETTER ZU + 0x30BB, 0x835A, // KATAKANA LETTER SE + 0x30BD, 0x835C, // KATAKANA LETTER SO + 0x30BE, 0x835D, // KATAKANA LETTER ZO + 0x30BF, 0x835E, // KATAKANA LETTER TA + 0x30C0, 0x835F, // KATAKANA LETTER DA + 0x30C1, 0x8360, // KATAKANA LETTER TI + 0x30C2, 0x8361, // KATAKANA LETTER DI + 0x30C3, 0x8362, // KATAKANA LETTER SMALL TU + 0x30C4, 0x8363, // KATAKANA LETTER TU + 0x30C5, 0x8364, // KATAKANA LETTER DU + 0x30C6, 0x8365, // KATAKANA LETTER TE + 0x30C7, 0x8366, // KATAKANA LETTER DE + 0x30C8, 0x8367, // KATAKANA LETTER TO + 0x30C9, 0x8368, // KATAKANA LETTER DO + 0x30CA, 0x8369, // KATAKANA LETTER NA + 0x30CB, 0x836A, // KATAKANA LETTER NI + 0x30CC, 0x836B, // KATAKANA LETTER NU + 0x30CD, 0x836C, // KATAKANA LETTER NE + 0x30CE, 0x836D, // KATAKANA LETTER NO + 0x30CF, 0x836E, // KATAKANA LETTER HA + 0x30D0, 0x836F, // KATAKANA LETTER BA + 0x30D1, 0x8370, // KATAKANA LETTER PA + 0x30D2, 0x8371, // KATAKANA LETTER HI + 0x30D3, 0x8372, // KATAKANA LETTER BI + 0x30D4, 0x8373, // KATAKANA LETTER PI + 0x30D5, 0x8374, // KATAKANA LETTER HU + 0x30D6, 0x8375, // KATAKANA LETTER BU + 0x30D7, 0x8376, // KATAKANA LETTER PU + 0x30D8, 0x8377, // KATAKANA LETTER HE + 0x30D9, 0x8378, // KATAKANA LETTER BE + 0x30DA, 0x8379, // KATAKANA LETTER PE + 0x30DB, 0x837A, // KATAKANA LETTER HO + 0x30DC, 0x837B, // KATAKANA LETTER BO + 0x30DD, 0x837C, // KATAKANA LETTER PO + 0x30DE, 0x837D, // KATAKANA LETTER MA + 0x30DF, 0x837E, // KATAKANA LETTER MI + 0x30E0, 0x8380, // KATAKANA LETTER MU + 0x30E1, 0x8381, // KATAKANA LETTER ME + 0x30E2, 0x8382, // KATAKANA LETTER MO + 0x30E3, 0x8383, // KATAKANA LETTER SMALL YA + 0x30E4, 0x8384, // KATAKANA LETTER YA + 0x30E5, 0x8385, // KATAKANA LETTER SMALL YU + 0x30E6, 0x8386, // KATAKANA LETTER YU + 0x30E7, 0x8387, // KATAKANA LETTER SMALL YO + 0x30E8, 0x8388, // KATAKANA LETTER YO + 0x30E9, 0x8389, // KATAKANA LETTER RA + 0x30EA, 0x838A, // KATAKANA LETTER RI + 0x30EB, 0x838B, // KATAKANA LETTER RU + 0x30EC, 0x838C, // KATAKANA LETTER RE + 0x30ED, 0x838D, // KATAKANA LETTER RO + 0x30EE, 0x838E, // KATAKANA LETTER SMALL WA + 0x30EF, 0x838F, // KATAKANA LETTER WA + 0x30F0, 0x8390, // KATAKANA LETTER WI + 0x30F1, 0x8391, // KATAKANA LETTER WE + 0x30F2, 0x8392, // KATAKANA LETTER WO + 0x30F3, 0x8393, // KATAKANA LETTER N + 0x30F4, 0x8394, // KATAKANA LETTER VU + 0x30F5, 0x8395, // KATAKANA LETTER SMALL KA + 0x30F6, 0x8396, // KATAKANA LETTER SMALL KE + 0x30FB, 0x8145, // KATAKANA MIDDLE DOT + 0x30FD, 0x8152, // KATAKANA ITERATION MARK + 0x30FE, 0x8153, // KATAKANA VOICED ITERATION MARK + 0x4E00, 0x88EA, // + 0x4E01, 0x929A, // + 0x4E03, 0x8EB5, // + 0x4E07, 0x969C, // + 0x4E08, 0x8FE4, // + 0x4E09, 0x8E4F, // + 0x4E0A, 0x8FE3, // + 0x4E0B, 0x89BA, // + 0x4E0D, 0x9573, // + 0x4E0E, 0x975E, // + 0x4E10, 0x98A0, // + 0x4E11, 0x894E, // + 0x4E14, 0x8A8E, // + 0x4E15, 0x98A1, // + 0x4E16, 0x90A2, // + 0x4E17, 0x99C0, // + 0x4E18, 0x8B75, // + 0x4E19, 0x95B8, // + 0x4E1E, 0x8FE5, // + 0x4E21, 0x97BC, // + 0x4E26, 0x95C0, // + 0x4E2A, 0x98A2, // + 0x4E2D, 0x9286, // + 0x4E31, 0x98A3, // + 0x4E32, 0x8BF8, // + 0x4E36, 0x98A4, // + 0x4E38, 0x8ADB, // + 0x4E39, 0x924F, // + 0x4E3B, 0x8EE5, // + 0x4E3C, 0x98A5, // + 0x4E3F, 0x98A6, // + 0x4E42, 0x98A7, // + 0x4E43, 0x9454, // + 0x4E45, 0x8B76, // + 0x4E4B, 0x9456, // + 0x4E4D, 0x93E1, // + 0x4E4E, 0x8CC1, // + 0x4E4F, 0x9652, // + 0x4E55, 0xE568, // + 0x4E56, 0x98A8, // + 0x4E57, 0x8FE6, // + 0x4E58, 0x98A9, // + 0x4E59, 0x89B3, // + 0x4E5D, 0x8BE3, // + 0x4E5E, 0x8CEE, // + 0x4E5F, 0x96E7, // + 0x4E62, 0x9BA4, // + 0x4E71, 0x9790, // + 0x4E73, 0x93FB, // + 0x4E7E, 0x8AA3, // + 0x4E80, 0x8B54, // + 0x4E82, 0x98AA, // + 0x4E85, 0x98AB, // + 0x4E86, 0x97B9, // + 0x4E88, 0x975C, // + 0x4E89, 0x9188, // + 0x4E8A, 0x98AD, // + 0x4E8B, 0x8E96, // + 0x4E8C, 0x93F1, // + 0x4E8E, 0x98B0, // + 0x4E91, 0x895D, // + 0x4E92, 0x8CDD, // + 0x4E94, 0x8CDC, // + 0x4E95, 0x88E4, // + 0x4E98, 0x986A, // + 0x4E99, 0x9869, // + 0x4E9B, 0x8DB1, // + 0x4E9C, 0x889F, // + 0x4E9E, 0x98B1, // + 0x4E9F, 0x98B2, // + 0x4EA0, 0x98B3, // + 0x4EA1, 0x9653, // + 0x4EA2, 0x98B4, // + 0x4EA4, 0x8CF0, // + 0x4EA5, 0x88E5, // + 0x4EA6, 0x9692, // + 0x4EA8, 0x8B9C, // + 0x4EAB, 0x8B9D, // + 0x4EAC, 0x8B9E, // + 0x4EAD, 0x92E0, // + 0x4EAE, 0x97BA, // + 0x4EB0, 0x98B5, // + 0x4EB3, 0x98B6, // + 0x4EB6, 0x98B7, // + 0x4EBA, 0x906C, // + 0x4EC0, 0x8F59, // + 0x4EC1, 0x906D, // + 0x4EC2, 0x98BC, // + 0x4EC4, 0x98BA, // + 0x4EC6, 0x98BB, // + 0x4EC7, 0x8B77, // + 0x4ECA, 0x8DA1, // + 0x4ECB, 0x89EE, // + 0x4ECD, 0x98B9, // + 0x4ECE, 0x98B8, // + 0x4ECF, 0x95A7, // + 0x4ED4, 0x8E65, // + 0x4ED5, 0x8E64, // + 0x4ED6, 0x91BC, // + 0x4ED7, 0x98BD, // + 0x4ED8, 0x9574, // + 0x4ED9, 0x90E5, // + 0x4EDD, 0x8157, // + 0x4EDE, 0x98BE, // + 0x4EDF, 0x98C0, // + 0x4EE3, 0x91E3, // + 0x4EE4, 0x97DF, // + 0x4EE5, 0x88C8, // + 0x4EED, 0x98BF, // + 0x4EEE, 0x89BC, // + 0x4EF0, 0x8BC2, // + 0x4EF2, 0x9287, // + 0x4EF6, 0x8C8F, // + 0x4EF7, 0x98C1, // + 0x4EFB, 0x9443, // + 0x4F01, 0x8AE9, // + 0x4F09, 0x98C2, // + 0x4F0A, 0x88C9, // + 0x4F0D, 0x8CDE, // + 0x4F0E, 0x8AEA, // + 0x4F0F, 0x959A, // + 0x4F10, 0x94B0, // + 0x4F11, 0x8B78, // + 0x4F1A, 0x89EF, // + 0x4F1C, 0x98E5, // + 0x4F1D, 0x9360, // + 0x4F2F, 0x948C, // + 0x4F30, 0x98C4, // + 0x4F34, 0x94BA, // + 0x4F36, 0x97E0, // + 0x4F38, 0x904C, // + 0x4F3A, 0x8E66, // + 0x4F3C, 0x8E97, // + 0x4F3D, 0x89BE, // + 0x4F43, 0x92CF, // + 0x4F46, 0x9241, // + 0x4F47, 0x98C8, // + 0x4F4D, 0x88CA, // + 0x4F4E, 0x92E1, // + 0x4F4F, 0x8F5A, // + 0x4F50, 0x8DB2, // + 0x4F51, 0x9743, // + 0x4F53, 0x91CC, // + 0x4F55, 0x89BD, // + 0x4F57, 0x98C7, // + 0x4F59, 0x975D, // + 0x4F5A, 0x98C3, // + 0x4F5B, 0x98C5, // + 0x4F5C, 0x8DEC, // + 0x4F5D, 0x98C6, // + 0x4F5E, 0x9B43, // + 0x4F69, 0x98CE, // + 0x4F6F, 0x98D1, // + 0x4F70, 0x98CF, // + 0x4F73, 0x89C0, // + 0x4F75, 0x95B9, // + 0x4F76, 0x98C9, // + 0x4F7B, 0x98CD, // + 0x4F7C, 0x8CF1, // + 0x4F7F, 0x8E67, // + 0x4F83, 0x8AA4, // + 0x4F86, 0x98D2, // + 0x4F88, 0x98CA, // + 0x4F8B, 0x97E1, // + 0x4F8D, 0x8E98, // + 0x4F8F, 0x98CB, // + 0x4F91, 0x98D0, // + 0x4F96, 0x98D3, // + 0x4F98, 0x98CC, // + 0x4F9B, 0x8B9F, // + 0x4F9D, 0x88CB, // + 0x4FA0, 0x8BA0, // + 0x4FA1, 0x89BF, // + 0x4FAB, 0x9B44, // + 0x4FAD, 0x9699, // + 0x4FAE, 0x958E, // + 0x4FAF, 0x8CF2, // + 0x4FB5, 0x904E, // + 0x4FB6, 0x97B5, // + 0x4FBF, 0x95D6, // + 0x4FC2, 0x8C57, // + 0x4FC3, 0x91A3, // + 0x4FC4, 0x89E2, // + 0x4FCA, 0x8F72, // + 0x4FCE, 0x98D7, // + 0x4FD0, 0x98DC, // + 0x4FD1, 0x98DA, // + 0x4FD4, 0x98D5, // + 0x4FD7, 0x91AD, // + 0x4FD8, 0x98D8, // + 0x4FDA, 0x98DB, // + 0x4FDB, 0x98D9, // + 0x4FDD, 0x95DB, // + 0x4FDF, 0x98D6, // + 0x4FE1, 0x904D, // + 0x4FE3, 0x9693, // + 0x4FE4, 0x98DD, // + 0x4FE5, 0x98DE, // + 0x4FEE, 0x8F43, // + 0x4FEF, 0x98EB, // + 0x4FF3, 0x946F, // + 0x4FF5, 0x9555, // + 0x4FF6, 0x98E6, // + 0x4FF8, 0x95EE, // + 0x4FFA, 0x89B4, // + 0x4FFE, 0x98EA, // + 0x5005, 0x98E4, // + 0x5006, 0x98ED, // + 0x5009, 0x9171, // + 0x500B, 0x8CC2, // + 0x500D, 0x947B, // + 0x500F, 0xE0C5, // + 0x5011, 0x98EC, // + 0x5012, 0x937C, // + 0x5014, 0x98E1, // + 0x5016, 0x8CF4, // + 0x5019, 0x8CF3, // + 0x501A, 0x98DF, // + 0x501F, 0x8ED8, // + 0x5021, 0x98E7, // + 0x5023, 0x95ED, // + 0x5024, 0x926C, // + 0x5025, 0x98E3, // + 0x5026, 0x8C91, // + 0x5028, 0x98E0, // + 0x5029, 0x98E8, // + 0x502A, 0x98E2, // + 0x502B, 0x97CF, // + 0x502C, 0x98E9, // + 0x502D, 0x9860, // + 0x5036, 0x8BE4, // + 0x5039, 0x8C90, // + 0x5043, 0x98EE, // + 0x5047, 0x98EF, // + 0x5048, 0x98F3, // + 0x5049, 0x88CC, // + 0x504F, 0x95CE, // + 0x5050, 0x98F2, // + 0x5055, 0x98F1, // + 0x5056, 0x98F5, // + 0x505A, 0x98F4, // + 0x505C, 0x92E2, // + 0x5065, 0x8C92, // + 0x506C, 0x98F6, // + 0x5072, 0x8EC3, // + 0x5074, 0x91A4, // + 0x5075, 0x92E3, // + 0x5076, 0x8BF4, // + 0x5078, 0x98F7, // + 0x507D, 0x8B55, // + 0x5080, 0x98F8, // + 0x5085, 0x98FA, // + 0x508D, 0x9654, // + 0x5091, 0x8C86, // + 0x5098, 0x8E50, // + 0x5099, 0x94F5, // + 0x509A, 0x98F9, // + 0x50AC, 0x8DC3, // + 0x50AD, 0x9762, // + 0x50B2, 0x98FC, // + 0x50B3, 0x9942, // + 0x50B4, 0x98FB, // + 0x50B5, 0x8DC2, // + 0x50B7, 0x8F9D, // + 0x50BE, 0x8C58, // + 0x50C2, 0x9943, // + 0x50C5, 0x8BCD, // + 0x50C9, 0x9940, // + 0x50CA, 0x9941, // + 0x50CD, 0x93AD, // + 0x50CF, 0x919C, // + 0x50D1, 0x8BA1, // + 0x50D5, 0x966C, // + 0x50D6, 0x9944, // + 0x50DA, 0x97BB, // + 0x50DE, 0x9945, // + 0x50E3, 0x9948, // + 0x50E5, 0x9946, // + 0x50E7, 0x916D, // + 0x50ED, 0x9947, // + 0x50EE, 0x9949, // + 0x50F5, 0x994B, // + 0x50F9, 0x994A, // + 0x50FB, 0x95C6, // + 0x5100, 0x8B56, // + 0x5101, 0x994D, // + 0x5102, 0x994E, // + 0x5104, 0x89AD, // + 0x5109, 0x994C, // + 0x5112, 0x8EF2, // + 0x5114, 0x9951, // + 0x5115, 0x9950, // + 0x5116, 0x994F, // + 0x5118, 0x98D4, // + 0x511A, 0x9952, // + 0x511F, 0x8F9E, // + 0x5121, 0x9953, // + 0x512A, 0x9744, // + 0x5132, 0x96D7, // + 0x5137, 0x9955, // + 0x513A, 0x9954, // + 0x513B, 0x9957, // + 0x513C, 0x9956, // + 0x513F, 0x9958, // + 0x5140, 0x9959, // + 0x5141, 0x88F2, // + 0x5143, 0x8CB3, // + 0x5144, 0x8C5A, // + 0x5146, 0x929B, // + 0x5147, 0x8BA2, // + 0x5148, 0x90E6, // + 0x5149, 0x8CF5, // + 0x514B, 0x8D8E, // + 0x514D, 0x96C6, // + 0x514E, 0x9365, // + 0x5150, 0x8E99, // + 0x5152, 0x995A, // + 0x5154, 0x995C, // + 0x515A, 0x937D, // + 0x515C, 0x8A95, // + 0x5162, 0x995D, // + 0x5165, 0x93FC, // + 0x5168, 0x9153, // + 0x5169, 0x995F, // + 0x516A, 0x9960, // + 0x516B, 0x94AA, // + 0x516C, 0x8CF6, // + 0x516D, 0x985A, // + 0x516E, 0x9961, // + 0x5171, 0x8BA4, // + 0x5175, 0x95BA, // + 0x5176, 0x91B4, // + 0x5177, 0x8BEF, // + 0x5178, 0x9354, // + 0x517C, 0x8C93, // + 0x5180, 0x9962, // + 0x5182, 0x9963, // + 0x5185, 0x93E0, // + 0x5186, 0x897E, // + 0x5189, 0x9966, // + 0x518A, 0x8DFB, // + 0x518C, 0x9965, // + 0x518D, 0x8DC4, // + 0x518F, 0x9967, // + 0x5190, 0xE3EC, // + 0x5191, 0x9968, // + 0x5192, 0x9660, // + 0x5193, 0x9969, // + 0x5195, 0x996A, // + 0x5196, 0x996B, // + 0x5197, 0x8FE7, // + 0x5199, 0x8ECA, // + 0x51A0, 0x8AA5, // + 0x51A2, 0x996E, // + 0x51A4, 0x996C, // + 0x51A5, 0x96BB, // + 0x51A6, 0x996D, // + 0x51A8, 0x9579, // + 0x51A9, 0x996F, // + 0x51AA, 0x9970, // + 0x51AB, 0x9971, // + 0x51AC, 0x937E, // + 0x51B0, 0x9975, // + 0x51B1, 0x9973, // + 0x51B2, 0x9974, // + 0x51B3, 0x9972, // + 0x51B4, 0x8DE1, // + 0x51B5, 0x9976, // + 0x51B6, 0x96E8, // + 0x51B7, 0x97E2, // + 0x51BD, 0x9977, // + 0x51C4, 0x90A6, // + 0x51C5, 0x9978, // + 0x51C6, 0x8F79, // + 0x51C9, 0x9979, // + 0x51CB, 0x929C, // + 0x51CC, 0x97BD, // + 0x51CD, 0x9380, // + 0x51D6, 0x99C3, // + 0x51DB, 0x997A, // + 0x51DC, 0xEAA3, // + 0x51DD, 0x8BC3, // + 0x51E0, 0x997B, // + 0x51E1, 0x967D, // + 0x51E6, 0x8F88, // + 0x51E7, 0x91FA, // + 0x51E9, 0x997D, // + 0x51EA, 0x93E2, // + 0x51ED, 0x997E, // + 0x51F0, 0x9980, // + 0x51F1, 0x8A4D, // + 0x51F5, 0x9981, // + 0x51F6, 0x8BA5, // + 0x51F8, 0x93CA, // + 0x51F9, 0x899A, // + 0x51FA, 0x8F6F, // + 0x51FD, 0x949F, // + 0x51FE, 0x9982, // + 0x5200, 0x9381, // + 0x5203, 0x906E, // + 0x5204, 0x9983, // + 0x5206, 0x95AA, // + 0x5207, 0x90D8, // + 0x5208, 0x8AA0, // + 0x520A, 0x8AA7, // + 0x520B, 0x9984, // + 0x520E, 0x9986, // + 0x5211, 0x8C59, // + 0x5214, 0x9985, // + 0x5217, 0x97F1, // + 0x521D, 0x8F89, // + 0x5224, 0x94BB, // + 0x5225, 0x95CA, // + 0x5227, 0x9987, // + 0x5229, 0x9798, // + 0x522A, 0x9988, // + 0x522E, 0x9989, // + 0x5230, 0x939E, // + 0x5233, 0x998A, // + 0x5236, 0x90A7, // + 0x5237, 0x8DFC, // + 0x5238, 0x8C94, // + 0x5239, 0x998B, // + 0x523A, 0x8E68, // + 0x523B, 0x8D8F, // + 0x5243, 0x92E4, // + 0x5244, 0x998D, // + 0x5247, 0x91A5, // + 0x524A, 0x8DED, // + 0x524B, 0x998E, // + 0x524C, 0x998F, // + 0x524D, 0x914F, // + 0x524F, 0x998C, // + 0x5254, 0x9991, // + 0x5256, 0x9655, // + 0x525B, 0x8D84, // + 0x525E, 0x9990, // + 0x5263, 0x8C95, // + 0x5264, 0x8DDC, // + 0x5265, 0x948D, // + 0x5269, 0x9994, // + 0x526A, 0x9992, // + 0x526F, 0x959B, // + 0x5270, 0x8FE8, // + 0x5271, 0x999B, // + 0x5272, 0x8A84, // + 0x5273, 0x9995, // + 0x5274, 0x9993, // + 0x5275, 0x916E, // + 0x527D, 0x9997, // + 0x527F, 0x9996, // + 0x5283, 0x8A63, // + 0x5287, 0x8C80, // + 0x5288, 0x999C, // + 0x5289, 0x97AB, // + 0x528D, 0x9998, // + 0x5291, 0x999D, // + 0x5292, 0x999A, // + 0x5294, 0x9999, // + 0x529B, 0x97CD, // + 0x529F, 0x8CF7, // + 0x52A0, 0x89C1, // + 0x52A3, 0x97F2, // + 0x52A9, 0x8F95, // + 0x52AA, 0x9377, // + 0x52AB, 0x8D85, // + 0x52AC, 0x99A0, // + 0x52AD, 0x99A1, // + 0x52B1, 0x97E3, // + 0x52B4, 0x984A, // + 0x52B5, 0x99A3, // + 0x52B9, 0x8CF8, // + 0x52BC, 0x99A2, // + 0x52BE, 0x8A4E, // + 0x52C1, 0x99A4, // + 0x52C3, 0x9675, // + 0x52C5, 0x92BA, // + 0x52C7, 0x9745, // + 0x52C9, 0x95D7, // + 0x52CD, 0x99A5, // + 0x52D2, 0xE8D3, // + 0x52D5, 0x93AE, // + 0x52D7, 0x99A6, // + 0x52D8, 0x8AA8, // + 0x52D9, 0x96B1, // + 0x52DD, 0x8F9F, // + 0x52DE, 0x99A7, // + 0x52DF, 0x95E5, // + 0x52E0, 0x99AB, // + 0x52E2, 0x90A8, // + 0x52E3, 0x99A8, // + 0x52E4, 0x8BCE, // + 0x52E6, 0x99A9, // + 0x52E7, 0x8AA9, // + 0x52F2, 0x8C4D, // + 0x52F3, 0x99AC, // + 0x52F5, 0x99AD, // + 0x52F8, 0x99AE, // + 0x52F9, 0x99AF, // + 0x52FA, 0x8ED9, // + 0x52FE, 0x8CF9, // + 0x52FF, 0x96DC, // + 0x5301, 0x96E6, // + 0x5302, 0x93F5, // + 0x5305, 0x95EF, // + 0x5306, 0x99B0, // + 0x5308, 0x99B1, // + 0x530D, 0x99B3, // + 0x530F, 0x99B5, // + 0x5310, 0x99B4, // + 0x5315, 0x99B6, // + 0x5316, 0x89BB, // + 0x5317, 0x966B, // + 0x5319, 0x8DFA, // + 0x531A, 0x99B7, // + 0x531D, 0x9178, // + 0x5320, 0x8FA0, // + 0x5321, 0x8BA7, // + 0x5323, 0x99B8, // + 0x532A, 0x94D9, // + 0x532F, 0x99B9, // + 0x5331, 0x99BA, // + 0x5333, 0x99BB, // + 0x5338, 0x99BC, // + 0x5339, 0x9543, // + 0x533A, 0x8BE6, // + 0x533B, 0x88E3, // + 0x533F, 0x93BD, // + 0x5340, 0x99BD, // + 0x5341, 0x8F5C, // + 0x5343, 0x90E7, // + 0x5345, 0x99BF, // + 0x5346, 0x99BE, // + 0x5347, 0x8FA1, // + 0x5348, 0x8CDF, // + 0x5349, 0x99C1, // + 0x534A, 0x94BC, // + 0x534D, 0x99C2, // + 0x5351, 0x94DA, // + 0x5352, 0x91B2, // + 0x5353, 0x91EC, // + 0x5354, 0x8BA6, // + 0x5357, 0x93EC, // + 0x5358, 0x9250, // + 0x535A, 0x948E, // + 0x535C, 0x966D, // + 0x535E, 0x99C4, // + 0x5360, 0x90E8, // + 0x5366, 0x8C54, // + 0x5369, 0x99C5, // + 0x536E, 0x99C6, // + 0x536F, 0x894B, // + 0x5370, 0x88F3, // + 0x5371, 0x8AEB, // + 0x5373, 0x91A6, // + 0x5374, 0x8B70, // + 0x5375, 0x9791, // + 0x5377, 0x99C9, // + 0x5378, 0x89B5, // + 0x537B, 0x99C8, // + 0x537F, 0x8BA8, // + 0x5382, 0x99CA, // + 0x5384, 0x96EF, // + 0x5396, 0x99CB, // + 0x5398, 0x97D0, // + 0x539A, 0x8CFA, // + 0x539F, 0x8CB4, // + 0x53A0, 0x99CC, // + 0x53A5, 0x99CE, // + 0x53A6, 0x99CD, // + 0x53A8, 0x907E, // + 0x53A9, 0x8958, // + 0x53AD, 0x897D, // + 0x53AE, 0x99CF, // + 0x53B0, 0x99D0, // + 0x53B3, 0x8CB5, // + 0x53B6, 0x99D1, // + 0x53BB, 0x8B8E, // + 0x53C2, 0x8E51, // + 0x53C3, 0x99D2, // + 0x53C8, 0x9694, // + 0x53C9, 0x8DB3, // + 0x53CA, 0x8B79, // + 0x53CB, 0x9746, // + 0x53CC, 0x916F, // + 0x53CD, 0x94BD, // + 0x53CE, 0x8EFB, // + 0x53D4, 0x8F66, // + 0x53D6, 0x8EE6, // + 0x53D7, 0x8EF3, // + 0x53D9, 0x8F96, // + 0x53DB, 0x94BE, // + 0x53DF, 0x99D5, // + 0x53E1, 0x8962, // + 0x53E2, 0x9170, // + 0x53E3, 0x8CFB, // + 0x53E4, 0x8CC3, // + 0x53E5, 0x8BE5, // + 0x53E8, 0x99D9, // + 0x53E9, 0x9240, // + 0x53EA, 0x91FC, // + 0x53EB, 0x8BA9, // + 0x53EC, 0x8FA2, // + 0x53ED, 0x99DA, // + 0x53EE, 0x99D8, // + 0x53EF, 0x89C2, // + 0x53F0, 0x91E4, // + 0x53F1, 0x8EB6, // + 0x53F2, 0x8E6A, // + 0x53F3, 0x8945, // + 0x53F6, 0x8A90, // + 0x53F7, 0x8D86, // + 0x53F8, 0x8E69, // + 0x53FA, 0x99DB, // + 0x5401, 0x99DC, // + 0x5403, 0x8B68, // + 0x5404, 0x8A65, // + 0x5408, 0x8D87, // + 0x5409, 0x8B67, // + 0x540A, 0x92DD, // + 0x540B, 0x8944, // + 0x540C, 0x93AF, // + 0x540D, 0x96BC, // + 0x540E, 0x8D40, // + 0x540F, 0x9799, // + 0x5410, 0x9366, // + 0x5411, 0x8CFC, // + 0x541B, 0x8C4E, // + 0x541D, 0x99E5, // + 0x541F, 0x8BE1, // + 0x5420, 0x9669, // + 0x5426, 0x94DB, // + 0x5429, 0x99E4, // + 0x542B, 0x8ADC, // + 0x542C, 0x99DF, // + 0x542D, 0x99E0, // + 0x542E, 0x99E2, // + 0x5436, 0x99E3, // + 0x5438, 0x8B7A, // + 0x5439, 0x9081, // + 0x543B, 0x95AB, // + 0x543C, 0x99E1, // + 0x543D, 0x99DD, // + 0x543E, 0x8CE1, // + 0x5440, 0x99DE, // + 0x5442, 0x9843, // + 0x5446, 0x95F0, // + 0x5448, 0x92E6, // + 0x5449, 0x8CE0, // + 0x544A, 0x8D90, // + 0x544E, 0x99E6, // + 0x5451, 0x93DB, // + 0x545F, 0x99EA, // + 0x5468, 0x8EFC, // + 0x546A, 0x8EF4, // + 0x5470, 0x99ED, // + 0x5471, 0x99EB, // + 0x5473, 0x96A1, // + 0x5475, 0x99E8, // + 0x5476, 0x99F1, // + 0x5477, 0x99EC, // + 0x547B, 0x99EF, // + 0x547C, 0x8CC4, // + 0x547D, 0x96BD, // + 0x5480, 0x99F0, // + 0x5484, 0x99F2, // + 0x5486, 0x99F4, // + 0x548B, 0x8DEE, // + 0x548C, 0x9861, // + 0x548E, 0x99E9, // + 0x548F, 0x99E7, // + 0x5490, 0x99F3, // + 0x5492, 0x99EE, // + 0x54A2, 0x99F6, // + 0x54A4, 0x9A42, // + 0x54A5, 0x99F8, // + 0x54A8, 0x99FC, // + 0x54AB, 0x9A40, // + 0x54AC, 0x99F9, // + 0x54AF, 0x9A5D, // + 0x54B2, 0x8DE7, // + 0x54B3, 0x8A50, // + 0x54B8, 0x99F7, // + 0x54BC, 0x9A44, // + 0x54BD, 0x88F4, // + 0x54BE, 0x9A43, // + 0x54C0, 0x88A3, // + 0x54C1, 0x9569, // + 0x54C2, 0x9A41, // + 0x54C4, 0x99FA, // + 0x54C7, 0x99F5, // + 0x54C8, 0x99FB, // + 0x54C9, 0x8DC6, // + 0x54D8, 0x9A45, // + 0x54E1, 0x88F5, // + 0x54E2, 0x9A4E, // + 0x54E5, 0x9A46, // + 0x54E6, 0x9A47, // + 0x54E8, 0x8FA3, // + 0x54E9, 0x9689, // + 0x54ED, 0x9A4C, // + 0x54EE, 0x9A4B, // + 0x54F2, 0x934E, // + 0x54FA, 0x9A4D, // + 0x54FD, 0x9A4A, // + 0x5504, 0x8953, // + 0x5506, 0x8DB4, // + 0x5507, 0x904F, // + 0x550F, 0x9A48, // + 0x5510, 0x9382, // + 0x5514, 0x9A49, // + 0x5516, 0x88A0, // + 0x552E, 0x9A53, // + 0x552F, 0x9742, // + 0x5531, 0x8FA5, // + 0x5533, 0x9A59, // + 0x5538, 0x9A58, // + 0x5539, 0x9A4F, // + 0x553E, 0x91C1, // + 0x5540, 0x9A50, // + 0x5544, 0x91ED, // + 0x5545, 0x9A55, // + 0x5546, 0x8FA4, // + 0x554C, 0x9A52, // + 0x554F, 0x96E2, // + 0x5556, 0x9A56, // + 0x5557, 0x9A57, // + 0x555C, 0x9A54, // + 0x555D, 0x9A5A, // + 0x5563, 0x9A51, // + 0x557B, 0x9A60, // + 0x557C, 0x9A65, // + 0x557E, 0x9A61, // + 0x5580, 0x9A5C, // + 0x5583, 0x9A66, // + 0x5584, 0x9150, // + 0x5587, 0x9A68, // + 0x5589, 0x8D41, // + 0x558A, 0x9A5E, // + 0x558B, 0x929D, // + 0x5598, 0x9A62, // + 0x559A, 0x8AAB, // + 0x559C, 0x8AEC, // + 0x559D, 0x8A85, // + 0x559E, 0x9A63, // + 0x559F, 0x9A5F, // + 0x55A7, 0x8C96, // + 0x55A8, 0x9A69, // + 0x55A9, 0x9A67, // + 0x55AA, 0x9172, // + 0x55AB, 0x8B69, // + 0x55AC, 0x8BAA, // + 0x55AE, 0x9A64, // + 0x55B0, 0x8BF2, // + 0x55B6, 0x8963, // + 0x55C4, 0x9A6D, // + 0x55C5, 0x9A6B, // + 0x55C7, 0x9AA5, // + 0x55D4, 0x9A70, // + 0x55DA, 0x9A6A, // + 0x55DC, 0x9A6E, // + 0x55DF, 0x9A6C, // + 0x55E3, 0x8E6B, // + 0x55E4, 0x9A6F, // + 0x55F7, 0x9A72, // + 0x55F9, 0x9A77, // + 0x55FD, 0x9A75, // + 0x55FE, 0x9A74, // + 0x5606, 0x9251, // + 0x5609, 0x89C3, // + 0x5614, 0x9A71, // + 0x5616, 0x9A73, // + 0x5617, 0x8FA6, // + 0x5618, 0x8952, // + 0x561B, 0x9A76, // + 0x5629, 0x89DC, // + 0x562F, 0x9A82, // + 0x5631, 0x8FFA, // + 0x5632, 0x9A7D, // + 0x5634, 0x9A7B, // + 0x5636, 0x9A7C, // + 0x5638, 0x9A7E, // + 0x5642, 0x895C, // + 0x564C, 0x9158, // + 0x564E, 0x9A78, // + 0x5650, 0x9A79, // + 0x565B, 0x8A9A, // + 0x5664, 0x9A81, // + 0x5668, 0x8AED, // + 0x566A, 0x9A84, // + 0x566B, 0x9A80, // + 0x566C, 0x9A83, // + 0x5674, 0x95AC, // + 0x5678, 0x93D3, // + 0x567A, 0x94B6, // + 0x5680, 0x9A86, // + 0x5686, 0x9A85, // + 0x5687, 0x8A64, // + 0x568A, 0x9A87, // + 0x568F, 0x9A8A, // + 0x5694, 0x9A89, // + 0x56A0, 0x9A88, // + 0x56A2, 0x9458, // + 0x56A5, 0x9A8B, // + 0x56AE, 0x9A8C, // + 0x56B4, 0x9A8E, // + 0x56B6, 0x9A8D, // + 0x56BC, 0x9A90, // + 0x56C0, 0x9A93, // + 0x56C1, 0x9A91, // + 0x56C2, 0x9A8F, // + 0x56C3, 0x9A92, // + 0x56C8, 0x9A94, // + 0x56CE, 0x9A95, // + 0x56D1, 0x9A96, // + 0x56D3, 0x9A97, // + 0x56D7, 0x9A98, // + 0x56D8, 0x9964, // + 0x56DA, 0x8EFA, // + 0x56DB, 0x8E6C, // + 0x56DE, 0x89F1, // + 0x56E0, 0x88F6, // + 0x56E3, 0x9263, // + 0x56EE, 0x9A99, // + 0x56F0, 0x8DA2, // + 0x56F2, 0x88CD, // + 0x56F3, 0x907D, // + 0x56F9, 0x9A9A, // + 0x56FA, 0x8CC5, // + 0x56FD, 0x8D91, // + 0x56FF, 0x9A9C, // + 0x5700, 0x9A9B, // + 0x5703, 0x95DE, // + 0x5704, 0x9A9D, // + 0x5708, 0x9A9F, // + 0x5709, 0x9A9E, // + 0x570B, 0x9AA0, // + 0x570D, 0x9AA1, // + 0x570F, 0x8C97, // + 0x5712, 0x8980, // + 0x5713, 0x9AA2, // + 0x5716, 0x9AA4, // + 0x5718, 0x9AA3, // + 0x571C, 0x9AA6, // + 0x571F, 0x9379, // + 0x5726, 0x9AA7, // + 0x5727, 0x88B3, // + 0x5728, 0x8DDD, // + 0x572D, 0x8C5C, // + 0x5730, 0x926E, // + 0x5737, 0x9AA8, // + 0x5738, 0x9AA9, // + 0x573B, 0x9AAB, // + 0x5740, 0x9AAC, // + 0x5742, 0x8DE2, // + 0x5747, 0x8BCF, // + 0x574A, 0x9656, // + 0x574E, 0x9AAA, // + 0x574F, 0x9AAD, // + 0x5750, 0x8DBF, // + 0x5751, 0x8D42, // + 0x5761, 0x9AB1, // + 0x5764, 0x8DA3, // + 0x5766, 0x9252, // + 0x5769, 0x9AAE, // + 0x576A, 0x92D8, // + 0x577F, 0x9AB2, // + 0x5782, 0x9082, // + 0x5788, 0x9AB0, // + 0x5789, 0x9AB3, // + 0x578B, 0x8C5E, // + 0x5793, 0x9AB4, // + 0x57A0, 0x9AB5, // + 0x57A2, 0x8D43, // + 0x57A3, 0x8A5F, // + 0x57A4, 0x9AB7, // + 0x57AA, 0x9AB8, // + 0x57B0, 0x9AB9, // + 0x57B3, 0x9AB6, // + 0x57C0, 0x9AAF, // + 0x57C3, 0x9ABA, // + 0x57C6, 0x9ABB, // + 0x57CB, 0x9684, // + 0x57CE, 0x8FE9, // + 0x57D2, 0x9ABD, // + 0x57D3, 0x9ABE, // + 0x57D4, 0x9ABC, // + 0x57D6, 0x9AC0, // + 0x57DC, 0x9457, // + 0x57DF, 0x88E6, // + 0x57E0, 0x9575, // + 0x57E3, 0x9AC1, // + 0x57F4, 0x8FFB, // + 0x57F7, 0x8EB7, // + 0x57F9, 0x947C, // + 0x57FA, 0x8AEE, // + 0x57FC, 0x8DE9, // + 0x5800, 0x9678, // + 0x5802, 0x93B0, // + 0x5805, 0x8C98, // + 0x5806, 0x91CD, // + 0x580A, 0x9ABF, // + 0x580B, 0x9AC2, // + 0x5815, 0x91C2, // + 0x5819, 0x9AC3, // + 0x581D, 0x9AC4, // + 0x5821, 0x9AC6, // + 0x5824, 0x92E7, // + 0x582A, 0x8AAC, // + 0x582F, 0xEA9F, // + 0x5830, 0x8981, // + 0x5831, 0x95F1, // + 0x5834, 0x8FEA, // + 0x5835, 0x9367, // + 0x583A, 0x8DE4, // + 0x583D, 0x9ACC, // + 0x5840, 0x95BB, // + 0x5841, 0x97DB, // + 0x584A, 0x89F2, // + 0x584B, 0x9AC8, // + 0x5851, 0x9159, // + 0x5852, 0x9ACB, // + 0x5854, 0x9383, // + 0x5857, 0x9368, // + 0x5858, 0x9384, // + 0x5859, 0x94B7, // + 0x585A, 0x92CB, // + 0x585E, 0x8DC7, // + 0x5862, 0x9AC7, // + 0x5869, 0x8996, // + 0x586B, 0x9355, // + 0x5870, 0x9AC9, // + 0x5872, 0x9AC5, // + 0x5875, 0x906F, // + 0x5879, 0x9ACD, // + 0x587E, 0x8F6D, // + 0x5883, 0x8BAB, // + 0x5885, 0x9ACE, // + 0x5893, 0x95E6, // + 0x5897, 0x919D, // + 0x589C, 0x92C4, // + 0x589F, 0x9AD0, // + 0x58A8, 0x966E, // + 0x58AB, 0x9AD1, // + 0x58AE, 0x9AD6, // + 0x58B3, 0x95AD, // + 0x58B8, 0x9AD5, // + 0x58B9, 0x9ACF, // + 0x58BA, 0x9AD2, // + 0x58BB, 0x9AD4, // + 0x58BE, 0x8DA4, // + 0x58C1, 0x95C7, // + 0x58C5, 0x9AD7, // + 0x58C7, 0x9264, // + 0x58CA, 0x89F3, // + 0x58CC, 0x8FEB, // + 0x58D1, 0x9AD9, // + 0x58D3, 0x9AD8, // + 0x58D5, 0x8D88, // + 0x58D7, 0x9ADA, // + 0x58D8, 0x9ADC, // + 0x58D9, 0x9ADB, // + 0x58DC, 0x9ADE, // + 0x58DE, 0x9AD3, // + 0x58DF, 0x9AE0, // + 0x58E4, 0x9ADF, // + 0x58E5, 0x9ADD, // + 0x58EB, 0x8E6D, // + 0x58EC, 0x9070, // + 0x58EE, 0x9173, // + 0x58EF, 0x9AE1, // + 0x58F0, 0x90BA, // + 0x58F1, 0x88EB, // + 0x58F2, 0x9484, // + 0x58F7, 0x92D9, // + 0x58F9, 0x9AE3, // + 0x58FA, 0x9AE2, // + 0x58FB, 0x9AE4, // + 0x58FC, 0x9AE5, // + 0x58FD, 0x9AE6, // + 0x5902, 0x9AE7, // + 0x5909, 0x95CF, // + 0x590A, 0x9AE8, // + 0x590F, 0x89C4, // + 0x5910, 0x9AE9, // + 0x5916, 0x8A4F, // + 0x5918, 0x99C7, // + 0x5919, 0x8F67, // + 0x591A, 0x91BD, // + 0x591B, 0x9AEA, // + 0x591C, 0x96E9, // + 0x5922, 0x96B2, // + 0x5925, 0x9AEC, // + 0x5927, 0x91E5, // + 0x5929, 0x9356, // + 0x592A, 0x91BE, // + 0x592B, 0x9576, // + 0x592C, 0x9AED, // + 0x592D, 0x9AEE, // + 0x592E, 0x899B, // + 0x5931, 0x8EB8, // + 0x5932, 0x9AEF, // + 0x5937, 0x88CE, // + 0x5938, 0x9AF0, // + 0x593E, 0x9AF1, // + 0x5944, 0x8982, // + 0x5947, 0x8AEF, // + 0x5948, 0x93DE, // + 0x5949, 0x95F2, // + 0x594E, 0x9AF5, // + 0x594F, 0x9174, // + 0x5950, 0x9AF4, // + 0x5951, 0x8C5F, // + 0x5954, 0x967A, // + 0x5955, 0x9AF3, // + 0x5957, 0x9385, // + 0x5958, 0x9AF7, // + 0x595A, 0x9AF6, // + 0x5960, 0x9AF9, // + 0x5962, 0x9AF8, // + 0x5965, 0x899C, // + 0x5967, 0x9AFA, // + 0x5968, 0x8FA7, // + 0x5969, 0x9AFC, // + 0x596A, 0x9244, // + 0x596C, 0x9AFB, // + 0x596E, 0x95B1, // + 0x5973, 0x8F97, // + 0x5974, 0x937A, // + 0x5978, 0x9B40, // + 0x597D, 0x8D44, // + 0x5981, 0x9B41, // + 0x5982, 0x9440, // + 0x5983, 0x94DC, // + 0x5984, 0x96CF, // + 0x598A, 0x9444, // + 0x598D, 0x9B4A, // + 0x5993, 0x8B57, // + 0x5996, 0x9764, // + 0x5999, 0x96AD, // + 0x599B, 0x9BAA, // + 0x599D, 0x9B42, // + 0x59A3, 0x9B45, // + 0x59A5, 0x91C3, // + 0x59A8, 0x9657, // + 0x59AC, 0x9369, // + 0x59B2, 0x9B46, // + 0x59B9, 0x9685, // + 0x59BB, 0x8DC8, // + 0x59BE, 0x8FA8, // + 0x59C6, 0x9B47, // + 0x59C9, 0x8E6F, // + 0x59CB, 0x8E6E, // + 0x59D0, 0x88B7, // + 0x59D1, 0x8CC6, // + 0x59D3, 0x90A9, // + 0x59D4, 0x88CF, // + 0x59D9, 0x9B4B, // + 0x59DA, 0x9B4C, // + 0x59DC, 0x9B49, // + 0x59E5, 0x8957, // + 0x59E6, 0x8AAD, // + 0x59E8, 0x9B48, // + 0x59EA, 0x96C3, // + 0x59EB, 0x9550, // + 0x59F6, 0x88A6, // + 0x59FB, 0x88F7, // + 0x59FF, 0x8E70, // + 0x5A01, 0x88D0, // + 0x5A03, 0x88A1, // + 0x5A09, 0x9B51, // + 0x5A11, 0x9B4F, // + 0x5A18, 0x96BA, // + 0x5A1A, 0x9B52, // + 0x5A1C, 0x9B50, // + 0x5A1F, 0x9B4E, // + 0x5A20, 0x9050, // + 0x5A25, 0x9B4D, // + 0x5A29, 0x95D8, // + 0x5A2F, 0x8CE2, // + 0x5A35, 0x9B56, // + 0x5A36, 0x9B57, // + 0x5A3C, 0x8FA9, // + 0x5A40, 0x9B53, // + 0x5A41, 0x984B, // + 0x5A46, 0x946B, // + 0x5A49, 0x9B55, // + 0x5A5A, 0x8DA5, // + 0x5A62, 0x9B58, // + 0x5A66, 0x9577, // + 0x5A6A, 0x9B59, // + 0x5A6C, 0x9B54, // + 0x5A7F, 0x96B9, // + 0x5A92, 0x947D, // + 0x5A9A, 0x9B5A, // + 0x5A9B, 0x9551, // + 0x5ABD, 0x9B5F, // + 0x5ABE, 0x9B5C, // + 0x5AC1, 0x89C5, // + 0x5AC2, 0x9B5E, // + 0x5AC9, 0x8EB9, // + 0x5ACB, 0x9B5D, // + 0x5ACC, 0x8C99, // + 0x5AD0, 0x9B6B, // + 0x5AD6, 0x9B64, // + 0x5AD7, 0x9B61, // + 0x5AE1, 0x9284, // + 0x5AE3, 0x9B60, // + 0x5AE6, 0x9B62, // + 0x5AE9, 0x9B63, // + 0x5AFA, 0x9B65, // + 0x5AFB, 0x9B66, // + 0x5B09, 0x8AF0, // + 0x5B0B, 0x9B68, // + 0x5B0C, 0x9B67, // + 0x5B16, 0x9B69, // + 0x5B22, 0x8FEC, // + 0x5B2A, 0x9B6C, // + 0x5B2C, 0x92DA, // + 0x5B30, 0x8964, // + 0x5B32, 0x9B6A, // + 0x5B36, 0x9B6D, // + 0x5B3E, 0x9B6E, // + 0x5B40, 0x9B71, // + 0x5B43, 0x9B6F, // + 0x5B45, 0x9B70, // + 0x5B50, 0x8E71, // + 0x5B51, 0x9B72, // + 0x5B54, 0x8D45, // + 0x5B55, 0x9B73, // + 0x5B57, 0x8E9A, // + 0x5B58, 0x91B6, // + 0x5B5A, 0x9B74, // + 0x5B5B, 0x9B75, // + 0x5B5C, 0x8E79, // + 0x5B5D, 0x8D46, // + 0x5B5F, 0x96D0, // + 0x5B63, 0x8B47, // + 0x5B64, 0x8CC7, // + 0x5B65, 0x9B76, // + 0x5B66, 0x8A77, // + 0x5B69, 0x9B77, // + 0x5B6B, 0x91B7, // + 0x5B70, 0x9B78, // + 0x5B71, 0x9BA1, // + 0x5B73, 0x9B79, // + 0x5B75, 0x9B7A, // + 0x5B78, 0x9B7B, // + 0x5B7A, 0x9B7D, // + 0x5B80, 0x9B7E, // + 0x5B83, 0x9B80, // + 0x5B85, 0x91EE, // + 0x5B87, 0x8946, // + 0x5B88, 0x8EE7, // + 0x5B89, 0x88C0, // + 0x5B8B, 0x9176, // + 0x5B8C, 0x8AAE, // + 0x5B8D, 0x8EB3, // + 0x5B8F, 0x8D47, // + 0x5B95, 0x9386, // + 0x5B97, 0x8F40, // + 0x5B98, 0x8AAF, // + 0x5B99, 0x9288, // + 0x5B9A, 0x92E8, // + 0x5B9B, 0x88B6, // + 0x5B9C, 0x8B58, // + 0x5B9D, 0x95F3, // + 0x5B9F, 0x8EC0, // + 0x5BA2, 0x8B71, // + 0x5BA3, 0x90E9, // + 0x5BA4, 0x8EBA, // + 0x5BA5, 0x9747, // + 0x5BA6, 0x9B81, // + 0x5BAE, 0x8B7B, // + 0x5BB0, 0x8DC9, // + 0x5BB3, 0x8A51, // + 0x5BB4, 0x8983, // + 0x5BB5, 0x8FAA, // + 0x5BB6, 0x89C6, // + 0x5BB8, 0x9B82, // + 0x5BB9, 0x9765, // + 0x5BBF, 0x8F68, // + 0x5BC2, 0x8EE2, // + 0x5BC3, 0x9B83, // + 0x5BC4, 0x8AF1, // + 0x5BC5, 0x93D0, // + 0x5BC6, 0x96A7, // + 0x5BC7, 0x9B84, // + 0x5BC9, 0x9B85, // + 0x5BCC, 0x9578, // + 0x5BD0, 0x9B87, // + 0x5BD2, 0x8AA6, // + 0x5BD3, 0x8BF5, // + 0x5BD4, 0x9B86, // + 0x5BDB, 0x8AB0, // + 0x5BDD, 0x9051, // + 0x5BDE, 0x9B8B, // + 0x5BDF, 0x8E40, // + 0x5BE1, 0x89C7, // + 0x5BE2, 0x9B8A, // + 0x5BE4, 0x9B88, // + 0x5BE5, 0x9B8C, // + 0x5BE6, 0x9B89, // + 0x5BE7, 0x944A, // + 0x5BE8, 0x9ECB, // + 0x5BE9, 0x9052, // + 0x5BEB, 0x9B8D, // + 0x5BEE, 0x97BE, // + 0x5BF0, 0x9B8E, // + 0x5BF3, 0x9B90, // + 0x5BF5, 0x929E, // + 0x5BF6, 0x9B8F, // + 0x5BF8, 0x90A1, // + 0x5BFA, 0x8E9B, // + 0x5BFE, 0x91CE, // + 0x5BFF, 0x8EF5, // + 0x5C01, 0x9595, // + 0x5C02, 0x90EA, // + 0x5C04, 0x8ECB, // + 0x5C05, 0x9B91, // + 0x5C06, 0x8FAB, // + 0x5C07, 0x9B92, // + 0x5C08, 0x9B93, // + 0x5C09, 0x88D1, // + 0x5C0A, 0x91B8, // + 0x5C0B, 0x9071, // + 0x5C0D, 0x9B94, // + 0x5C0E, 0x93B1, // + 0x5C0F, 0x8FAC, // + 0x5C11, 0x8FAD, // + 0x5C13, 0x9B95, // + 0x5C16, 0x90EB, // + 0x5C1A, 0x8FAE, // + 0x5C20, 0x9B96, // + 0x5C22, 0x9B97, // + 0x5C24, 0x96DE, // + 0x5C28, 0x9B98, // + 0x5C2D, 0x8BC4, // + 0x5C31, 0x8F41, // + 0x5C38, 0x9B99, // + 0x5C39, 0x9B9A, // + 0x5C3A, 0x8EDA, // + 0x5C3B, 0x904B, // + 0x5C3C, 0x93F2, // + 0x5C3D, 0x9073, // + 0x5C3E, 0x94F6, // + 0x5C3F, 0x9441, // + 0x5C40, 0x8BC7, // + 0x5C41, 0x9B9B, // + 0x5C45, 0x8B8F, // + 0x5C46, 0x9B9C, // + 0x5C48, 0x8BFC, // + 0x5C4A, 0x93CD, // + 0x5C4B, 0x89AE, // + 0x5C4D, 0x8E72, // + 0x5C4E, 0x9B9D, // + 0x5C4F, 0x9BA0, // + 0x5C50, 0x9B9F, // + 0x5C51, 0x8BFB, // + 0x5C53, 0x9B9E, // + 0x5C55, 0x9357, // + 0x5C5E, 0x91AE, // + 0x5C60, 0x936A, // + 0x5C61, 0x8EC6, // + 0x5C64, 0x9177, // + 0x5C65, 0x979A, // + 0x5C6C, 0x9BA2, // + 0x5C6E, 0x9BA3, // + 0x5C6F, 0x93D4, // + 0x5C71, 0x8E52, // + 0x5C76, 0x9BA5, // + 0x5C79, 0x9BA6, // + 0x5C8C, 0x9BA7, // + 0x5C90, 0x8AF2, // + 0x5C91, 0x9BA8, // + 0x5C94, 0x9BA9, // + 0x5CA1, 0x89AA, // + 0x5CA8, 0x915A, // + 0x5CA9, 0x8AE2, // + 0x5CAB, 0x9BAB, // + 0x5CAC, 0x96A6, // + 0x5CB1, 0x91D0, // + 0x5CB3, 0x8A78, // + 0x5CB6, 0x9BAD, // + 0x5CB7, 0x9BAF, // + 0x5CB8, 0x8ADD, // + 0x5CBB, 0x9BAC, // + 0x5CBC, 0x9BAE, // + 0x5CBE, 0x9BB1, // + 0x5CC5, 0x9BB0, // + 0x5CC7, 0x9BB2, // + 0x5CD9, 0x9BB3, // + 0x5CE0, 0x93BB, // + 0x5CE1, 0x8BAC, // + 0x5CE8, 0x89E3, // + 0x5CE9, 0x9BB4, // + 0x5CEA, 0x9BB9, // + 0x5CED, 0x9BB7, // + 0x5CEF, 0x95F5, // + 0x5CF0, 0x95F4, // + 0x5CF6, 0x9387, // + 0x5CFA, 0x9BB6, // + 0x5CFB, 0x8F73, // + 0x5CFD, 0x9BB5, // + 0x5D07, 0x9092, // + 0x5D0B, 0x9BBA, // + 0x5D0E, 0x8DE8, // + 0x5D11, 0x9BC0, // + 0x5D14, 0x9BC1, // + 0x5D15, 0x9BBB, // + 0x5D16, 0x8A52, // + 0x5D17, 0x9BBC, // + 0x5D18, 0x9BC5, // + 0x5D19, 0x9BC4, // + 0x5D1A, 0x9BC3, // + 0x5D1B, 0x9BBF, // + 0x5D1F, 0x9BBE, // + 0x5D22, 0x9BC2, // + 0x5D29, 0x95F6, // + 0x5D4B, 0x9BC9, // + 0x5D4C, 0x9BC6, // + 0x5D4E, 0x9BC8, // + 0x5D50, 0x9792, // + 0x5D52, 0x9BC7, // + 0x5D5C, 0x9BBD, // + 0x5D69, 0x9093, // + 0x5D6C, 0x9BCA, // + 0x5D6F, 0x8DB5, // + 0x5D73, 0x9BCB, // + 0x5D76, 0x9BCC, // + 0x5D82, 0x9BCF, // + 0x5D84, 0x9BCE, // + 0x5D87, 0x9BCD, // + 0x5D8B, 0x9388, // + 0x5D8C, 0x9BB8, // + 0x5D90, 0x9BD5, // + 0x5D9D, 0x9BD1, // + 0x5DA2, 0x9BD0, // + 0x5DAC, 0x9BD2, // + 0x5DAE, 0x9BD3, // + 0x5DB7, 0x9BD6, // + 0x5DBA, 0x97E4, // + 0x5DBC, 0x9BD7, // + 0x5DBD, 0x9BD4, // + 0x5DC9, 0x9BD8, // + 0x5DCC, 0x8ADE, // + 0x5DCD, 0x9BD9, // + 0x5DD2, 0x9BDB, // + 0x5DD3, 0x9BDA, // + 0x5DD6, 0x9BDC, // + 0x5DDB, 0x9BDD, // + 0x5DDD, 0x90EC, // + 0x5DDE, 0x8F42, // + 0x5DE1, 0x8F84, // + 0x5DE3, 0x9183, // + 0x5DE5, 0x8D48, // + 0x5DE6, 0x8DB6, // + 0x5DE7, 0x8D49, // + 0x5DE8, 0x8B90, // + 0x5DEB, 0x9BDE, // + 0x5DEE, 0x8DB7, // + 0x5DF1, 0x8CC8, // + 0x5DF2, 0x9BDF, // + 0x5DF3, 0x96A4, // + 0x5DF4, 0x9462, // + 0x5DF5, 0x9BE0, // + 0x5DF7, 0x8D4A, // + 0x5DFB, 0x8AAA, // + 0x5DFD, 0x9246, // + 0x5DFE, 0x8BD0, // + 0x5E02, 0x8E73, // + 0x5E03, 0x957A, // + 0x5E06, 0x94BF, // + 0x5E0B, 0x9BE1, // + 0x5E0C, 0x8AF3, // + 0x5E11, 0x9BE4, // + 0x5E16, 0x929F, // + 0x5E19, 0x9BE3, // + 0x5E1A, 0x9BE2, // + 0x5E1B, 0x9BE5, // + 0x5E1D, 0x92E9, // + 0x5E25, 0x9083, // + 0x5E2B, 0x8E74, // + 0x5E2D, 0x90C8, // + 0x5E2F, 0x91D1, // + 0x5E30, 0x8B41, // + 0x5E33, 0x92A0, // + 0x5E36, 0x9BE6, // + 0x5E37, 0x9BE7, // + 0x5E38, 0x8FED, // + 0x5E3D, 0x9658, // + 0x5E40, 0x9BEA, // + 0x5E43, 0x9BE9, // + 0x5E44, 0x9BE8, // + 0x5E45, 0x959D, // + 0x5E47, 0x9BF1, // + 0x5E4C, 0x9679, // + 0x5E4E, 0x9BEB, // + 0x5E54, 0x9BED, // + 0x5E55, 0x968B, // + 0x5E57, 0x9BEC, // + 0x5E5F, 0x9BEE, // + 0x5E61, 0x94A6, // + 0x5E62, 0x9BEF, // + 0x5E63, 0x95BC, // + 0x5E64, 0x9BF0, // + 0x5E72, 0x8AB1, // + 0x5E73, 0x95BD, // + 0x5E74, 0x944E, // + 0x5E75, 0x9BF2, // + 0x5E76, 0x9BF3, // + 0x5E78, 0x8D4B, // + 0x5E79, 0x8AB2, // + 0x5E7A, 0x9BF4, // + 0x5E7B, 0x8CB6, // + 0x5E7C, 0x9763, // + 0x5E7D, 0x9748, // + 0x5E7E, 0x8AF4, // + 0x5E7F, 0x9BF6, // + 0x5E81, 0x92A1, // + 0x5E83, 0x8D4C, // + 0x5E84, 0x8FAF, // + 0x5E87, 0x94DD, // + 0x5E8A, 0x8FB0, // + 0x5E8F, 0x8F98, // + 0x5E95, 0x92EA, // + 0x5E96, 0x95F7, // + 0x5E97, 0x9358, // + 0x5E9A, 0x8D4D, // + 0x5E9C, 0x957B, // + 0x5EA0, 0x9BF7, // + 0x5EA6, 0x9378, // + 0x5EA7, 0x8DC0, // + 0x5EAB, 0x8CC9, // + 0x5EAD, 0x92EB, // + 0x5EB5, 0x88C1, // + 0x5EB6, 0x8F8E, // + 0x5EB7, 0x8D4E, // + 0x5EB8, 0x9766, // + 0x5EC1, 0x9BF8, // + 0x5EC2, 0x9BF9, // + 0x5EC3, 0x9470, // + 0x5EC8, 0x9BFA, // + 0x5EC9, 0x97F5, // + 0x5ECA, 0x984C, // + 0x5ECF, 0x9BFC, // + 0x5ED0, 0x9BFB, // + 0x5ED3, 0x8A66, // + 0x5ED6, 0x9C40, // + 0x5EDA, 0x9C43, // + 0x5EDB, 0x9C44, // + 0x5EDD, 0x9C42, // + 0x5EDF, 0x955F, // + 0x5EE0, 0x8FB1, // + 0x5EE1, 0x9C46, // + 0x5EE2, 0x9C45, // + 0x5EE3, 0x9C41, // + 0x5EE8, 0x9C47, // + 0x5EE9, 0x9C48, // + 0x5EEC, 0x9C49, // + 0x5EF0, 0x9C4C, // + 0x5EF1, 0x9C4A, // + 0x5EF3, 0x9C4B, // + 0x5EF4, 0x9C4D, // + 0x5EF6, 0x8984, // + 0x5EF7, 0x92EC, // + 0x5EF8, 0x9C4E, // + 0x5EFA, 0x8C9A, // + 0x5EFB, 0x89F4, // + 0x5EFC, 0x9455, // + 0x5EFE, 0x9C4F, // + 0x5EFF, 0x93F9, // + 0x5F01, 0x95D9, // + 0x5F03, 0x9C50, // + 0x5F04, 0x984D, // + 0x5F09, 0x9C51, // + 0x5F0A, 0x95BE, // + 0x5F0B, 0x9C54, // + 0x5F0C, 0x989F, // + 0x5F0D, 0x98AF, // + 0x5F0F, 0x8EAE, // + 0x5F10, 0x93F3, // + 0x5F11, 0x9C55, // + 0x5F13, 0x8B7C, // + 0x5F14, 0x92A2, // + 0x5F15, 0x88F8, // + 0x5F16, 0x9C56, // + 0x5F17, 0x95A4, // + 0x5F18, 0x8D4F, // + 0x5F1B, 0x926F, // + 0x5F1F, 0x92ED, // + 0x5F25, 0x96ED, // + 0x5F26, 0x8CB7, // + 0x5F27, 0x8CCA, // + 0x5F29, 0x9C57, // + 0x5F2D, 0x9C58, // + 0x5F2F, 0x9C5E, // + 0x5F31, 0x8EE3, // + 0x5F35, 0x92A3, // + 0x5F37, 0x8BAD, // + 0x5F38, 0x9C59, // + 0x5F3C, 0x954A, // + 0x5F3E, 0x9265, // + 0x5F41, 0x9C5A, // + 0x5F4A, 0x8BAE, // + 0x5F4C, 0x9C5C, // + 0x5F4E, 0x9C5D, // + 0x5F51, 0x9C5F, // + 0x5F53, 0x9396, // + 0x5F56, 0x9C60, // + 0x5F57, 0x9C61, // + 0x5F59, 0x9C62, // + 0x5F5C, 0x9C53, // + 0x5F5D, 0x9C52, // + 0x5F61, 0x9C63, // + 0x5F62, 0x8C60, // + 0x5F66, 0x9546, // + 0x5F69, 0x8DCA, // + 0x5F6A, 0x9556, // + 0x5F6B, 0x92A4, // + 0x5F6C, 0x956A, // + 0x5F6D, 0x9C64, // + 0x5F70, 0x8FB2, // + 0x5F71, 0x8965, // + 0x5F73, 0x9C65, // + 0x5F77, 0x9C66, // + 0x5F79, 0x96F0, // + 0x5F7C, 0x94DE, // + 0x5F7F, 0x9C69, // + 0x5F80, 0x899D, // + 0x5F81, 0x90AA, // + 0x5F82, 0x9C68, // + 0x5F83, 0x9C67, // + 0x5F84, 0x8C61, // + 0x5F85, 0x91D2, // + 0x5F87, 0x9C6D, // + 0x5F88, 0x9C6B, // + 0x5F8A, 0x9C6A, // + 0x5F8B, 0x97A5, // + 0x5F8C, 0x8CE3, // + 0x5F90, 0x8F99, // + 0x5F91, 0x9C6C, // + 0x5F92, 0x936B, // + 0x5F93, 0x8F5D, // + 0x5F97, 0x93BE, // + 0x5F98, 0x9C70, // + 0x5F99, 0x9C6F, // + 0x5F9E, 0x9C6E, // + 0x5FA0, 0x9C71, // + 0x5FA1, 0x8CE4, // + 0x5FA8, 0x9C72, // + 0x5FA9, 0x959C, // + 0x5FAA, 0x8F7A, // + 0x5FAD, 0x9C73, // + 0x5FAE, 0x94F7, // + 0x5FB3, 0x93BF, // + 0x5FB4, 0x92A5, // + 0x5FB9, 0x934F, // + 0x5FBC, 0x9C74, // + 0x5FBD, 0x8B4A, // + 0x5FC3, 0x9053, // + 0x5FC5, 0x954B, // + 0x5FCC, 0x8AF5, // + 0x5FCD, 0x9445, // + 0x5FD6, 0x9C75, // + 0x5FD7, 0x8E75, // + 0x5FD8, 0x9659, // + 0x5FD9, 0x965A, // + 0x5FDC, 0x899E, // + 0x5FDD, 0x9C7A, // + 0x5FE0, 0x9289, // + 0x5FE4, 0x9C77, // + 0x5FEB, 0x89F5, // + 0x5FF0, 0x9CAB, // + 0x5FF1, 0x9C79, // + 0x5FF5, 0x944F, // + 0x5FF8, 0x9C78, // + 0x5FFB, 0x9C76, // + 0x5FFD, 0x8D9A, // + 0x5FFF, 0x9C7C, // + 0x600E, 0x9C83, // + 0x600F, 0x9C89, // + 0x6010, 0x9C81, // + 0x6012, 0x937B, // + 0x6015, 0x9C86, // + 0x6016, 0x957C, // + 0x6019, 0x9C80, // + 0x601B, 0x9C85, // + 0x601C, 0x97E5, // + 0x601D, 0x8E76, // + 0x6020, 0x91D3, // + 0x6021, 0x9C7D, // + 0x6025, 0x8B7D, // + 0x6026, 0x9C88, // + 0x6027, 0x90AB, // + 0x6028, 0x8985, // + 0x6029, 0x9C82, // + 0x602A, 0x89F6, // + 0x602B, 0x9C87, // + 0x602F, 0x8BAF, // + 0x6031, 0x9C84, // + 0x603A, 0x9C8A, // + 0x6041, 0x9C8C, // + 0x6042, 0x9C96, // + 0x6043, 0x9C94, // + 0x6046, 0x9C91, // + 0x604A, 0x9C90, // + 0x604B, 0x97F6, // + 0x604D, 0x9C92, // + 0x6050, 0x8BB0, // + 0x6052, 0x8D50, // + 0x6055, 0x8F9A, // + 0x6059, 0x9C99, // + 0x605A, 0x9C8B, // + 0x605F, 0x9C8F, // + 0x6060, 0x9C7E, // + 0x6062, 0x89F8, // + 0x6063, 0x9C93, // + 0x6064, 0x9C95, // + 0x6065, 0x9270, // + 0x6068, 0x8DA6, // + 0x6069, 0x89B6, // + 0x606A, 0x9C8D, // + 0x606B, 0x9C98, // + 0x606C, 0x9C97, // + 0x606D, 0x8BB1, // + 0x606F, 0x91A7, // + 0x6070, 0x8A86, // + 0x6075, 0x8C62, // + 0x6077, 0x9C8E, // + 0x6081, 0x9C9A, // + 0x6083, 0x9C9D, // + 0x6084, 0x9C9F, // + 0x6089, 0x8EBB, // + 0x608B, 0x9CA5, // + 0x608C, 0x92EE, // + 0x608D, 0x9C9B, // + 0x6092, 0x9CA3, // + 0x6094, 0x89F7, // + 0x6096, 0x9CA1, // + 0x6097, 0x9CA2, // + 0x609A, 0x9C9E, // + 0x609B, 0x9CA0, // + 0x609F, 0x8CE5, // + 0x60A0, 0x9749, // + 0x60A3, 0x8AB3, // + 0x60A6, 0x8978, // + 0x60A7, 0x9CA4, // + 0x60A9, 0x9459, // + 0x60AA, 0x88AB, // + 0x60B2, 0x94DF, // + 0x60B3, 0x9C7B, // + 0x60B4, 0x9CAA, // + 0x60B5, 0x9CAE, // + 0x60B6, 0x96E3, // + 0x60B8, 0x9CA7, // + 0x60BC, 0x9389, // + 0x60BD, 0x9CAC, // + 0x60C5, 0x8FEE, // + 0x60C6, 0x9CAD, // + 0x60C7, 0x93D5, // + 0x60D1, 0x9866, // + 0x60D3, 0x9CA9, // + 0x60D8, 0x9CAF, // + 0x60DA, 0x8D9B, // + 0x60DC, 0x90C9, // + 0x60DF, 0x88D2, // + 0x60E0, 0x9CA8, // + 0x60E1, 0x9CA6, // + 0x60E3, 0x9179, // + 0x60E7, 0x9C9C, // + 0x60E8, 0x8E53, // + 0x60F0, 0x91C4, // + 0x60F1, 0x9CBB, // + 0x60F3, 0x917A, // + 0x60F4, 0x9CB6, // + 0x60F6, 0x9CB3, // + 0x60F7, 0x9CB4, // + 0x60F9, 0x8EE4, // + 0x60FA, 0x9CB7, // + 0x60FB, 0x9CBA, // + 0x6100, 0x9CB5, // + 0x6101, 0x8F44, // + 0x6103, 0x9CB8, // + 0x6106, 0x9CB2, // + 0x6108, 0x96FA, // + 0x6109, 0x96F9, // + 0x610D, 0x9CBC, // + 0x610E, 0x9CBD, // + 0x610F, 0x88D3, // + 0x6115, 0x9CB1, // + 0x611A, 0x8BF0, // + 0x611B, 0x88A4, // + 0x611F, 0x8AB4, // + 0x6121, 0x9CB9, // + 0x6127, 0x9CC1, // + 0x6128, 0x9CC0, // + 0x612C, 0x9CC5, // + 0x6134, 0x9CC6, // + 0x613C, 0x9CC4, // + 0x613D, 0x9CC7, // + 0x613E, 0x9CBF, // + 0x613F, 0x9CC3, // + 0x6142, 0x9CC8, // + 0x6144, 0x9CC9, // + 0x6147, 0x9CBE, // + 0x6148, 0x8E9C, // + 0x614A, 0x9CC2, // + 0x614B, 0x91D4, // + 0x614C, 0x8D51, // + 0x614D, 0x9CB0, // + 0x614E, 0x9054, // + 0x6153, 0x9CD6, // + 0x6155, 0x95E7, // + 0x6158, 0x9CCC, // + 0x6159, 0x9CCD, // + 0x615A, 0x9CCE, // + 0x615D, 0x9CD5, // + 0x615F, 0x9CD4, // + 0x6162, 0x969D, // + 0x6163, 0x8AB5, // + 0x6165, 0x9CD2, // + 0x6167, 0x8C64, // + 0x6168, 0x8A53, // + 0x616B, 0x9CCF, // + 0x616E, 0x97B6, // + 0x616F, 0x9CD1, // + 0x6170, 0x88D4, // + 0x6171, 0x9CD3, // + 0x6173, 0x9CCA, // + 0x6174, 0x9CD0, // + 0x6175, 0x9CD7, // + 0x6176, 0x8C63, // + 0x6177, 0x9CCB, // + 0x617E, 0x977C, // + 0x6182, 0x974A, // + 0x6187, 0x9CDA, // + 0x618A, 0x9CDE, // + 0x618E, 0x919E, // + 0x6190, 0x97F7, // + 0x6191, 0x9CDF, // + 0x6194, 0x9CDC, // + 0x6196, 0x9CD9, // + 0x6199, 0x9CD8, // + 0x619A, 0x9CDD, // + 0x61A4, 0x95AE, // + 0x61A7, 0x93B2, // + 0x61A9, 0x8C65, // + 0x61AB, 0x9CE0, // + 0x61AC, 0x9CDB, // + 0x61AE, 0x9CE1, // + 0x61B2, 0x8C9B, // + 0x61B6, 0x89AF, // + 0x61BA, 0x9CE9, // + 0x61BE, 0x8AB6, // + 0x61C3, 0x9CE7, // + 0x61C6, 0x9CE8, // + 0x61C7, 0x8DA7, // + 0x61C8, 0x9CE6, // + 0x61C9, 0x9CE4, // + 0x61CA, 0x9CE3, // + 0x61CB, 0x9CEA, // + 0x61CC, 0x9CE2, // + 0x61CD, 0x9CEC, // + 0x61D0, 0x89F9, // + 0x61E3, 0x9CEE, // + 0x61E6, 0x9CED, // + 0x61F2, 0x92A6, // + 0x61F4, 0x9CF1, // + 0x61F6, 0x9CEF, // + 0x61F7, 0x9CE5, // + 0x61F8, 0x8C9C, // + 0x61FA, 0x9CF0, // + 0x61FC, 0x9CF4, // + 0x61FD, 0x9CF3, // + 0x61FE, 0x9CF5, // + 0x61FF, 0x9CF2, // + 0x6200, 0x9CF6, // + 0x6208, 0x9CF7, // + 0x6209, 0x9CF8, // + 0x620A, 0x95E8, // + 0x620C, 0x9CFA, // + 0x620D, 0x9CF9, // + 0x620E, 0x8F5E, // + 0x6210, 0x90AC, // + 0x6211, 0x89E4, // + 0x6212, 0x89FA, // + 0x6214, 0x9CFB, // + 0x6216, 0x88BD, // + 0x621A, 0x90CA, // + 0x621B, 0x9CFC, // + 0x621D, 0xE6C1, // + 0x621E, 0x9D40, // + 0x621F, 0x8C81, // + 0x6221, 0x9D41, // + 0x6226, 0x90ED, // + 0x622A, 0x9D42, // + 0x622E, 0x9D43, // + 0x622F, 0x8B59, // + 0x6230, 0x9D44, // + 0x6232, 0x9D45, // + 0x6233, 0x9D46, // + 0x6234, 0x91D5, // + 0x6238, 0x8CCB, // + 0x623B, 0x96DF, // + 0x6240, 0x8F8A, // + 0x6241, 0x9D47, // + 0x6247, 0x90EE, // + 0x6248, 0xE7BB, // + 0x6249, 0x94E0, // + 0x624B, 0x8EE8, // + 0x624D, 0x8DCB, // + 0x624E, 0x9D48, // + 0x6253, 0x91C5, // + 0x6255, 0x95A5, // + 0x6258, 0x91EF, // + 0x625B, 0x9D4B, // + 0x625E, 0x9D49, // + 0x6260, 0x9D4C, // + 0x6263, 0x9D4A, // + 0x6268, 0x9D4D, // + 0x626E, 0x95AF, // + 0x6271, 0x88B5, // + 0x6276, 0x957D, // + 0x6279, 0x94E1, // + 0x627C, 0x9D4E, // + 0x627E, 0x9D51, // + 0x627F, 0x8FB3, // + 0x6280, 0x8B5A, // + 0x6282, 0x9D4F, // + 0x6283, 0x9D56, // + 0x6284, 0x8FB4, // + 0x6289, 0x9D50, // + 0x628A, 0x9463, // + 0x6291, 0x977D, // + 0x6292, 0x9D52, // + 0x6293, 0x9D53, // + 0x6294, 0x9D57, // + 0x6295, 0x938A, // + 0x6296, 0x9D54, // + 0x6297, 0x8D52, // + 0x6298, 0x90DC, // + 0x629B, 0x9D65, // + 0x629C, 0x94B2, // + 0x629E, 0x91F0, // + 0x62AB, 0x94E2, // + 0x62AC, 0x9DAB, // + 0x62B1, 0x95F8, // + 0x62B5, 0x92EF, // + 0x62B9, 0x9695, // + 0x62BB, 0x9D5A, // + 0x62BC, 0x899F, // + 0x62BD, 0x928A, // + 0x62C2, 0x9D63, // + 0x62C5, 0x9253, // + 0x62C6, 0x9D5D, // + 0x62C7, 0x9D64, // + 0x62C8, 0x9D5F, // + 0x62C9, 0x9D66, // + 0x62CA, 0x9D62, // + 0x62CC, 0x9D61, // + 0x62CD, 0x948F, // + 0x62D0, 0x89FB, // + 0x62D1, 0x9D59, // + 0x62D2, 0x8B91, // + 0x62D3, 0x91F1, // + 0x62D4, 0x9D55, // + 0x62D7, 0x9D58, // + 0x62D8, 0x8D53, // + 0x62D9, 0x90D9, // + 0x62DB, 0x8FB5, // + 0x62DC, 0x9D60, // + 0x62DD, 0x9471, // + 0x62E0, 0x8B92, // + 0x62E1, 0x8A67, // + 0x62EC, 0x8A87, // + 0x62ED, 0x9040, // + 0x62EE, 0x9D68, // + 0x62EF, 0x9D6D, // + 0x62F1, 0x9D69, // + 0x62F3, 0x8C9D, // + 0x62F5, 0x9D6E, // + 0x62F6, 0x8E41, // + 0x62F7, 0x8D89, // + 0x62FE, 0x8F45, // + 0x62FF, 0x9D5C, // + 0x6301, 0x8E9D, // + 0x6302, 0x9D6B, // + 0x6307, 0x8E77, // + 0x6308, 0x9D6C, // + 0x6309, 0x88C2, // + 0x630C, 0x9D67, // + 0x6311, 0x92A7, // + 0x6319, 0x8B93, // + 0x631F, 0x8BB2, // + 0x6327, 0x9D6A, // + 0x6328, 0x88A5, // + 0x632B, 0x8DC1, // + 0x632F, 0x9055, // + 0x633A, 0x92F0, // + 0x633D, 0x94D2, // + 0x633E, 0x9D70, // + 0x633F, 0x917D, // + 0x6349, 0x91A8, // + 0x634C, 0x8E4A, // + 0x634D, 0x9D71, // + 0x634F, 0x9D73, // + 0x6350, 0x9D6F, // + 0x6355, 0x95DF, // + 0x6357, 0x92BB, // + 0x635C, 0x917B, // + 0x6367, 0x95F9, // + 0x6368, 0x8ECC, // + 0x6369, 0x9D80, // + 0x636B, 0x9D7E, // + 0x636E, 0x9098, // + 0x6372, 0x8C9E, // + 0x6376, 0x9D78, // + 0x6377, 0x8FB7, // + 0x637A, 0x93E6, // + 0x637B, 0x9450, // + 0x6380, 0x9D76, // + 0x6383, 0x917C, // + 0x6388, 0x8EF6, // + 0x6389, 0x9D7B, // + 0x638C, 0x8FB6, // + 0x638E, 0x9D75, // + 0x638F, 0x9D7A, // + 0x6392, 0x9472, // + 0x6396, 0x9D74, // + 0x6398, 0x8C40, // + 0x639B, 0x8A7C, // + 0x639F, 0x9D7C, // + 0x63A0, 0x97A9, // + 0x63A1, 0x8DCC, // + 0x63A2, 0x9254, // + 0x63A3, 0x9D79, // + 0x63A5, 0x90DA, // + 0x63A7, 0x8D54, // + 0x63A8, 0x9084, // + 0x63A9, 0x8986, // + 0x63AB, 0x9D77, // + 0x63AC, 0x8B64, // + 0x63B2, 0x8C66, // + 0x63B4, 0x92CD, // + 0x63B5, 0x9D7D, // + 0x63BB, 0x917E, // + 0x63BE, 0x9D81, // + 0x63C0, 0x9D83, // + 0x63C3, 0x91B5, // + 0x63C4, 0x9D89, // + 0x63C6, 0x9D84, // + 0x63C9, 0x9D86, // + 0x63CF, 0x9560, // + 0x63D0, 0x92F1, // + 0x63D2, 0x9D87, // + 0x63D6, 0x974B, // + 0x63DA, 0x9767, // + 0x63DB, 0x8AB7, // + 0x63E1, 0x88AC, // + 0x63E3, 0x9D85, // + 0x63E9, 0x9D82, // + 0x63EE, 0x8AF6, // + 0x63F4, 0x8987, // + 0x63F6, 0x9D88, // + 0x63FA, 0x9768, // + 0x6406, 0x9D8C, // + 0x640D, 0x91B9, // + 0x640F, 0x9D93, // + 0x6413, 0x9D8D, // + 0x6416, 0x9D8A, // + 0x6417, 0x9D91, // + 0x641C, 0x9D72, // + 0x6426, 0x9D8E, // + 0x6428, 0x9D92, // + 0x642C, 0x94C0, // + 0x642D, 0x938B, // + 0x6434, 0x9D8B, // + 0x6436, 0x9D8F, // + 0x643A, 0x8C67, // + 0x643E, 0x8DEF, // + 0x6442, 0x90DB, // + 0x644E, 0x9D97, // + 0x6458, 0x9345, // + 0x6467, 0x9D94, // + 0x6469, 0x9680, // + 0x646F, 0x9D95, // + 0x6476, 0x9D96, // + 0x6478, 0x96CC, // + 0x647A, 0x90A0, // + 0x6483, 0x8C82, // + 0x6488, 0x9D9D, // + 0x6492, 0x8E54, // + 0x6493, 0x9D9A, // + 0x6495, 0x9D99, // + 0x649A, 0x9451, // + 0x649E, 0x93B3, // + 0x64A4, 0x9350, // + 0x64A5, 0x9D9B, // + 0x64A9, 0x9D9C, // + 0x64AB, 0x958F, // + 0x64AD, 0x9464, // + 0x64AE, 0x8E42, // + 0x64B0, 0x90EF, // + 0x64B2, 0x966F, // + 0x64B9, 0x8A68, // + 0x64BB, 0x9DA3, // + 0x64BC, 0x9D9E, // + 0x64C1, 0x9769, // + 0x64C2, 0x9DA5, // + 0x64C5, 0x9DA1, // + 0x64C7, 0x9DA2, // + 0x64CD, 0x9180, // + 0x64D2, 0x9DA0, // + 0x64D4, 0x9D5E, // + 0x64D8, 0x9DA4, // + 0x64DA, 0x9D9F, // + 0x64E0, 0x9DA9, // + 0x64E1, 0x9DAA, // + 0x64E2, 0x9346, // + 0x64E3, 0x9DAC, // + 0x64E6, 0x8E43, // + 0x64E7, 0x9DA7, // + 0x64EF, 0x9DAD, // + 0x64F1, 0x9DA6, // + 0x64F2, 0x9DB1, // + 0x64F4, 0x9DB0, // + 0x64F6, 0x9DAF, // + 0x64FA, 0x9DB2, // + 0x64FD, 0x9DB4, // + 0x64FE, 0x8FEF, // + 0x6500, 0x9DB3, // + 0x6505, 0x9DB7, // + 0x6518, 0x9DB5, // + 0x651C, 0x9DB6, // + 0x651D, 0x9D90, // + 0x6523, 0x9DB9, // + 0x6524, 0x9DB8, // + 0x652A, 0x9D98, // + 0x652B, 0x9DBA, // + 0x652C, 0x9DAE, // + 0x652F, 0x8E78, // + 0x6534, 0x9DBB, // + 0x6535, 0x9DBC, // + 0x6536, 0x9DBE, // + 0x6537, 0x9DBD, // + 0x6538, 0x9DBF, // + 0x6539, 0x89FC, // + 0x653B, 0x8D55, // + 0x653E, 0x95FA, // + 0x653F, 0x90AD, // + 0x6545, 0x8CCC, // + 0x6548, 0x9DC1, // + 0x654D, 0x9DC4, // + 0x654F, 0x9571, // + 0x6551, 0x8B7E, // + 0x6555, 0x9DC3, // + 0x6556, 0x9DC2, // + 0x6557, 0x9473, // + 0x6558, 0x9DC5, // + 0x6559, 0x8BB3, // + 0x655D, 0x9DC7, // + 0x655E, 0x9DC6, // + 0x6562, 0x8AB8, // + 0x6563, 0x8E55, // + 0x6566, 0x93D6, // + 0x656C, 0x8C68, // + 0x6570, 0x9094, // + 0x6572, 0x9DC8, // + 0x6574, 0x90AE, // + 0x6575, 0x9347, // + 0x6577, 0x957E, // + 0x6578, 0x9DC9, // + 0x6582, 0x9DCA, // + 0x6583, 0x9DCB, // + 0x6587, 0x95B6, // + 0x6588, 0x9B7C, // + 0x6589, 0x90C4, // + 0x658C, 0x956B, // + 0x658E, 0x8DD6, // + 0x6590, 0x94E3, // + 0x6591, 0x94C1, // + 0x6597, 0x936C, // + 0x6599, 0x97BF, // + 0x659B, 0x9DCD, // + 0x659C, 0x8ECE, // + 0x659F, 0x9DCE, // + 0x65A1, 0x88B4, // + 0x65A4, 0x8BD2, // + 0x65A5, 0x90CB, // + 0x65A7, 0x9580, // + 0x65AB, 0x9DCF, // + 0x65AC, 0x8E61, // + 0x65AD, 0x9266, // + 0x65AF, 0x8E7A, // + 0x65B0, 0x9056, // + 0x65B7, 0x9DD0, // + 0x65B9, 0x95FB, // + 0x65BC, 0x8997, // + 0x65BD, 0x8E7B, // + 0x65C1, 0x9DD3, // + 0x65C3, 0x9DD1, // + 0x65C4, 0x9DD4, // + 0x65C5, 0x97B7, // + 0x65C6, 0x9DD2, // + 0x65CB, 0x90F9, // + 0x65CC, 0x9DD5, // + 0x65CF, 0x91B0, // + 0x65D2, 0x9DD6, // + 0x65D7, 0x8AF8, // + 0x65D9, 0x9DD8, // + 0x65DB, 0x9DD7, // + 0x65E0, 0x9DD9, // + 0x65E1, 0x9DDA, // + 0x65E2, 0x8AF9, // + 0x65E5, 0x93FA, // + 0x65E6, 0x9255, // + 0x65E7, 0x8B8C, // + 0x65E8, 0x8E7C, // + 0x65E9, 0x9181, // + 0x65EC, 0x8F7B, // + 0x65ED, 0x88AE, // + 0x65F1, 0x9DDB, // + 0x65FA, 0x89A0, // + 0x65FB, 0x9DDF, // + 0x6602, 0x8D56, // + 0x6603, 0x9DDE, // + 0x6606, 0x8DA9, // + 0x6607, 0x8FB8, // + 0x660A, 0x9DDD, // + 0x660C, 0x8FB9, // + 0x660E, 0x96BE, // + 0x660F, 0x8DA8, // + 0x6613, 0x88D5, // + 0x6614, 0x90CC, // + 0x661C, 0x9DE4, // + 0x661F, 0x90AF, // + 0x6620, 0x8966, // + 0x6625, 0x8F74, // + 0x6627, 0x9686, // + 0x6628, 0x8DF0, // + 0x662D, 0x8FBA, // + 0x662F, 0x90A5, // + 0x6634, 0x9DE3, // + 0x6635, 0x9DE1, // + 0x6636, 0x9DE2, // + 0x663C, 0x928B, // + 0x663F, 0x9E45, // + 0x6641, 0x9DE8, // + 0x6642, 0x8E9E, // + 0x6643, 0x8D57, // + 0x6644, 0x9DE6, // + 0x6649, 0x9DE7, // + 0x664B, 0x9057, // + 0x664F, 0x9DE5, // + 0x6652, 0x8E4E, // + 0x665D, 0x9DEA, // + 0x665E, 0x9DE9, // + 0x665F, 0x9DEE, // + 0x6662, 0x9DEF, // + 0x6664, 0x9DEB, // + 0x6666, 0x8A41, // + 0x6667, 0x9DEC, // + 0x6668, 0x9DED, // + 0x6669, 0x94D3, // + 0x666E, 0x9581, // + 0x666F, 0x8C69, // + 0x6670, 0x9DF0, // + 0x6674, 0x90B0, // + 0x6676, 0x8FBB, // + 0x667A, 0x9271, // + 0x6681, 0x8BC5, // + 0x6683, 0x9DF1, // + 0x6684, 0x9DF5, // + 0x6687, 0x89C9, // + 0x6688, 0x9DF2, // + 0x6689, 0x9DF4, // + 0x668E, 0x9DF3, // + 0x6691, 0x8F8B, // + 0x6696, 0x9267, // + 0x6697, 0x88C3, // + 0x6698, 0x9DF6, // + 0x669D, 0x9DF7, // + 0x66A2, 0x92A8, // + 0x66A6, 0x97EF, // + 0x66AB, 0x8E62, // + 0x66AE, 0x95E9, // + 0x66B4, 0x965C, // + 0x66B8, 0x9E41, // + 0x66B9, 0x9DF9, // + 0x66BC, 0x9DFC, // + 0x66BE, 0x9DFB, // + 0x66C1, 0x9DF8, // + 0x66C4, 0x9E40, // + 0x66C7, 0x93DC, // + 0x66C9, 0x9DFA, // + 0x66D6, 0x9E42, // + 0x66D9, 0x8F8C, // + 0x66DA, 0x9E43, // + 0x66DC, 0x976A, // + 0x66DD, 0x9498, // + 0x66E0, 0x9E44, // + 0x66E6, 0x9E46, // + 0x66E9, 0x9E47, // + 0x66F0, 0x9E48, // + 0x66F2, 0x8BC8, // + 0x66F3, 0x8967, // + 0x66F4, 0x8D58, // + 0x66F5, 0x9E49, // + 0x66F7, 0x9E4A, // + 0x66F8, 0x8F91, // + 0x66F9, 0x9182, // + 0x66FC, 0x99D6, // + 0x66FD, 0x915D, // + 0x66FE, 0x915C, // + 0x66FF, 0x91D6, // + 0x6700, 0x8DC5, // + 0x6703, 0x98F0, // + 0x6708, 0x8C8E, // + 0x6709, 0x974C, // + 0x670B, 0x95FC, // + 0x670D, 0x959E, // + 0x670F, 0x9E4B, // + 0x6714, 0x8DF1, // + 0x6715, 0x92BD, // + 0x6716, 0x9E4C, // + 0x6717, 0x984E, // + 0x671B, 0x965D, // + 0x671D, 0x92A9, // + 0x671E, 0x9E4D, // + 0x671F, 0x8AFA, // + 0x6726, 0x9E4E, // + 0x6727, 0x9E4F, // + 0x6728, 0x96D8, // + 0x672A, 0x96A2, // + 0x672B, 0x9696, // + 0x672C, 0x967B, // + 0x672D, 0x8E44, // + 0x672E, 0x9E51, // + 0x6731, 0x8EE9, // + 0x6734, 0x9670, // + 0x6736, 0x9E53, // + 0x6737, 0x9E56, // + 0x6738, 0x9E55, // + 0x673A, 0x8AF7, // + 0x673D, 0x8B80, // + 0x673F, 0x9E52, // + 0x6741, 0x9E54, // + 0x6746, 0x9E57, // + 0x6749, 0x9099, // + 0x674E, 0x979B, // + 0x674F, 0x88C7, // + 0x6750, 0x8DDE, // + 0x6751, 0x91BA, // + 0x6753, 0x8EDB, // + 0x6756, 0x8FF1, // + 0x6759, 0x9E5A, // + 0x675C, 0x936D, // + 0x675E, 0x9E58, // + 0x675F, 0x91A9, // + 0x6760, 0x9E59, // + 0x6761, 0x8FF0, // + 0x6762, 0x96DB, // + 0x6764, 0x9E5C, // + 0x6765, 0x9788, // + 0x676A, 0x9E61, // + 0x676D, 0x8D59, // + 0x676F, 0x9474, // + 0x6770, 0x9E5E, // + 0x6771, 0x938C, // + 0x6772, 0x9DDC, // + 0x6773, 0x9DE0, // + 0x6775, 0x8B6E, // + 0x6777, 0x9466, // + 0x677C, 0x9E60, // + 0x677E, 0x8FBC, // + 0x677F, 0x94C2, // + 0x6785, 0x9E66, // + 0x6787, 0x94F8, // + 0x6789, 0x9E5D, // + 0x678B, 0x9E63, // + 0x678C, 0x9E62, // + 0x6790, 0x90CD, // + 0x6795, 0x968D, // + 0x6797, 0x97D1, // + 0x679A, 0x9687, // + 0x679C, 0x89CA, // + 0x679D, 0x8E7D, // + 0x67A0, 0x9867, // + 0x67A1, 0x9E65, // + 0x67A2, 0x9095, // + 0x67A6, 0x9E64, // + 0x67A9, 0x9E5F, // + 0x67AF, 0x8CCD, // + 0x67B3, 0x9E6B, // + 0x67B4, 0x9E69, // + 0x67B6, 0x89CB, // + 0x67B7, 0x9E67, // + 0x67B8, 0x9E6D, // + 0x67B9, 0x9E73, // + 0x67C1, 0x91C6, // + 0x67C4, 0x95BF, // + 0x67C6, 0x9E75, // + 0x67CA, 0x9541, // + 0x67CE, 0x9E74, // + 0x67CF, 0x9490, // + 0x67D0, 0x965E, // + 0x67D1, 0x8AB9, // + 0x67D3, 0x90F5, // + 0x67D4, 0x8F5F, // + 0x67D8, 0x92D1, // + 0x67DA, 0x974D, // + 0x67DD, 0x9E70, // + 0x67DE, 0x9E6F, // + 0x67E2, 0x9E71, // + 0x67E4, 0x9E6E, // + 0x67E7, 0x9E76, // + 0x67E9, 0x9E6C, // + 0x67EC, 0x9E6A, // + 0x67EE, 0x9E72, // + 0x67EF, 0x9E68, // + 0x67F1, 0x928C, // + 0x67F3, 0x96F6, // + 0x67F4, 0x8EC4, // + 0x67F5, 0x8DF2, // + 0x67FB, 0x8DB8, // + 0x67FE, 0x968F, // + 0x67FF, 0x8A60, // + 0x6802, 0x92CC, // + 0x6803, 0x93C8, // + 0x6804, 0x8968, // + 0x6813, 0x90F0, // + 0x6816, 0x90B2, // + 0x6817, 0x8C49, // + 0x681E, 0x9E78, // + 0x6821, 0x8D5A, // + 0x6822, 0x8A9C, // + 0x6829, 0x9E7A, // + 0x682A, 0x8A94, // + 0x682B, 0x9E81, // + 0x6832, 0x9E7D, // + 0x6834, 0x90F1, // + 0x6838, 0x8A6A, // + 0x6839, 0x8DAA, // + 0x683C, 0x8A69, // + 0x683D, 0x8DCD, // + 0x6840, 0x9E7B, // + 0x6841, 0x8C85, // + 0x6842, 0x8C6A, // + 0x6843, 0x938D, // + 0x6846, 0x9E79, // + 0x6848, 0x88C4, // + 0x684D, 0x9E7C, // + 0x684E, 0x9E7E, // + 0x6850, 0x8BCB, // + 0x6851, 0x8C4B, // + 0x6853, 0x8ABA, // + 0x6854, 0x8B6A, // + 0x6859, 0x9E82, // + 0x685C, 0x8DF7, // + 0x685D, 0x9691, // + 0x685F, 0x8E56, // + 0x6863, 0x9E83, // + 0x6867, 0x954F, // + 0x6874, 0x9E8F, // + 0x6876, 0x89B1, // + 0x6877, 0x9E84, // + 0x687E, 0x9E95, // + 0x687F, 0x9E85, // + 0x6881, 0x97C0, // + 0x6883, 0x9E8C, // + 0x6885, 0x947E, // + 0x688D, 0x9E94, // + 0x688F, 0x9E87, // + 0x6893, 0x88B2, // + 0x6894, 0x9E89, // + 0x689B, 0x9E8B, // + 0x689D, 0x9E8A, // + 0x689F, 0x9E86, // + 0x68A0, 0x9E91, // + 0x68A2, 0x8FBD, // + 0x68A6, 0x9AEB, // + 0x68A7, 0x8CE6, // + 0x68A8, 0x979C, // + 0x68AD, 0x9E88, // + 0x68AF, 0x92F2, // + 0x68B0, 0x8A42, // + 0x68B1, 0x8DAB, // + 0x68B3, 0x9E80, // + 0x68B5, 0x9E90, // + 0x68B6, 0x8A81, // + 0x68B9, 0x9E8E, // + 0x68BA, 0x9E92, // + 0x68BC, 0x938E, // + 0x68C4, 0x8AFC, // + 0x68C6, 0x9EB0, // + 0x68C9, 0x96C7, // + 0x68CA, 0x9E97, // + 0x68CB, 0x8AFB, // + 0x68CD, 0x9E9E, // + 0x68D2, 0x965F, // + 0x68D4, 0x9E9F, // + 0x68D5, 0x9EA1, // + 0x68D7, 0x9EA5, // + 0x68D8, 0x9E99, // + 0x68DA, 0x9249, // + 0x68DF, 0x938F, // + 0x68E0, 0x9EA9, // + 0x68E1, 0x9E9C, // + 0x68E3, 0x9EA6, // + 0x68E7, 0x9EA0, // + 0x68EE, 0x9058, // + 0x68EF, 0x9EAA, // + 0x68F2, 0x90B1, // + 0x68F9, 0x9EA8, // + 0x68FA, 0x8ABB, // + 0x6900, 0x986F, // + 0x6901, 0x9E96, // + 0x6904, 0x9EA4, // + 0x6905, 0x88D6, // + 0x6908, 0x9E98, // + 0x690B, 0x96B8, // + 0x690C, 0x9E9D, // + 0x690D, 0x9041, // + 0x690E, 0x92C5, // + 0x690F, 0x9E93, // + 0x6912, 0x9EA3, // + 0x6919, 0x909A, // + 0x691A, 0x9EAD, // + 0x691B, 0x8A91, // + 0x691C, 0x8C9F, // + 0x6921, 0x9EAF, // + 0x6922, 0x9E9A, // + 0x6923, 0x9EAE, // + 0x6925, 0x9EA7, // + 0x6926, 0x9E9B, // + 0x6928, 0x9EAB, // + 0x692A, 0x9EAC, // + 0x6930, 0x9EBD, // + 0x6934, 0x93CC, // + 0x6936, 0x9EA2, // + 0x6939, 0x9EB9, // + 0x693D, 0x9EBB, // + 0x693F, 0x92D6, // + 0x694A, 0x976B, // + 0x6953, 0x9596, // + 0x6954, 0x9EB6, // + 0x6955, 0x91C8, // + 0x6959, 0x9EBC, // + 0x695A, 0x915E, // + 0x695C, 0x9EB3, // + 0x695D, 0x9EC0, // + 0x695E, 0x9EBF, // + 0x6960, 0x93ED, // + 0x6961, 0x9EBE, // + 0x6962, 0x93E8, // + 0x696A, 0x9EC2, // + 0x696B, 0x9EB5, // + 0x696D, 0x8BC6, // + 0x696E, 0x9EB8, // + 0x696F, 0x8F7C, // + 0x6973, 0x9480, // + 0x6974, 0x9EBA, // + 0x6975, 0x8BC9, // + 0x6977, 0x9EB2, // + 0x6978, 0x9EB4, // + 0x6979, 0x9EB1, // + 0x697C, 0x984F, // + 0x697D, 0x8A79, // + 0x697E, 0x9EB7, // + 0x6981, 0x9EC1, // + 0x6982, 0x8A54, // + 0x698A, 0x8DE5, // + 0x698E, 0x897C, // + 0x6991, 0x9ED2, // + 0x6994, 0x9850, // + 0x6995, 0x9ED5, // + 0x699B, 0x9059, // + 0x699C, 0x9ED4, // + 0x69A0, 0x9ED3, // + 0x69A7, 0x9ED0, // + 0x69AE, 0x9EC4, // + 0x69B1, 0x9EE1, // + 0x69B2, 0x9EC3, // + 0x69B4, 0x9ED6, // + 0x69BB, 0x9ECE, // + 0x69BE, 0x9EC9, // + 0x69BF, 0x9EC6, // + 0x69C1, 0x9EC7, // + 0x69C3, 0x9ECF, // + 0x69C7, 0xEAA0, // + 0x69CA, 0x9ECC, // + 0x69CB, 0x8D5C, // + 0x69CC, 0x92C6, // + 0x69CD, 0x9184, // + 0x69CE, 0x9ECA, // + 0x69D0, 0x9EC5, // + 0x69D3, 0x9EC8, // + 0x69D8, 0x976C, // + 0x69D9, 0x968A, // + 0x69DD, 0x9ECD, // + 0x69DE, 0x9ED7, // + 0x69E7, 0x9EDF, // + 0x69E8, 0x9ED8, // + 0x69EB, 0x9EE5, // + 0x69ED, 0x9EE3, // + 0x69F2, 0x9EDE, // + 0x69F9, 0x9EDD, // + 0x69FB, 0x92CE, // + 0x69FD, 0x9185, // + 0x69FF, 0x9EDB, // + 0x6A02, 0x9ED9, // + 0x6A05, 0x9EE0, // + 0x6A0A, 0x9EE6, // + 0x6A0B, 0x94F3, // + 0x6A0C, 0x9EEC, // + 0x6A12, 0x9EE7, // + 0x6A13, 0x9EEA, // + 0x6A14, 0x9EE4, // + 0x6A17, 0x9294, // + 0x6A19, 0x9557, // + 0x6A1B, 0x9EDA, // + 0x6A1E, 0x9EE2, // + 0x6A1F, 0x8FBE, // + 0x6A21, 0x96CD, // + 0x6A22, 0x9EF6, // + 0x6A23, 0x9EE9, // + 0x6A29, 0x8CA0, // + 0x6A2A, 0x89A1, // + 0x6A2B, 0x8A7E, // + 0x6A2E, 0x9ED1, // + 0x6A35, 0x8FBF, // + 0x6A36, 0x9EEE, // + 0x6A38, 0x9EF5, // + 0x6A39, 0x8EF7, // + 0x6A3A, 0x8A92, // + 0x6A3D, 0x924D, // + 0x6A44, 0x9EEB, // + 0x6A47, 0x9EF0, // + 0x6A48, 0x9EF4, // + 0x6A4B, 0x8BB4, // + 0x6A58, 0x8B6B, // + 0x6A59, 0x9EF2, // + 0x6A5F, 0x8B40, // + 0x6A61, 0x93C9, // + 0x6A62, 0x9EF1, // + 0x6A66, 0x9EF3, // + 0x6A72, 0x9EED, // + 0x6A78, 0x9EEF, // + 0x6A7F, 0x8A80, // + 0x6A80, 0x9268, // + 0x6A84, 0x9EFA, // + 0x6A8D, 0x9EF8, // + 0x6A8E, 0x8CE7, // + 0x6A90, 0x9EF7, // + 0x6A97, 0x9F40, // + 0x6A9C, 0x9E77, // + 0x6AA0, 0x9EF9, // + 0x6AA2, 0x9EFB, // + 0x6AA3, 0x9EFC, // + 0x6AAA, 0x9F4B, // + 0x6AAC, 0x9F47, // + 0x6AAE, 0x9E8D, // + 0x6AB3, 0x9F46, // + 0x6AB8, 0x9F45, // + 0x6ABB, 0x9F42, // + 0x6AC1, 0x9EE8, // + 0x6AC2, 0x9F44, // + 0x6AC3, 0x9F43, // + 0x6AD1, 0x9F49, // + 0x6AD3, 0x9845, // + 0x6ADA, 0x9F4C, // + 0x6ADB, 0x8BF9, // + 0x6ADE, 0x9F48, // + 0x6ADF, 0x9F4A, // + 0x6AE8, 0x94A5, // + 0x6AEA, 0x9F4D, // + 0x6AFA, 0x9F51, // + 0x6AFB, 0x9F4E, // + 0x6B04, 0x9793, // + 0x6B05, 0x9F4F, // + 0x6B0A, 0x9EDC, // + 0x6B12, 0x9F52, // + 0x6B16, 0x9F53, // + 0x6B1D, 0x8954, // + 0x6B1F, 0x9F55, // + 0x6B20, 0x8C87, // + 0x6B21, 0x8E9F, // + 0x6B23, 0x8BD3, // + 0x6B27, 0x89A2, // + 0x6B32, 0x977E, // + 0x6B37, 0x9F57, // + 0x6B38, 0x9F56, // + 0x6B39, 0x9F59, // + 0x6B3A, 0x8B5C, // + 0x6B3D, 0x8BD4, // + 0x6B3E, 0x8ABC, // + 0x6B43, 0x9F5C, // + 0x6B49, 0x9F5D, // + 0x6B4C, 0x89CC, // + 0x6B4E, 0x9256, // + 0x6B50, 0x9F5E, // + 0x6B53, 0x8ABD, // + 0x6B54, 0x9F60, // + 0x6B59, 0x9F5F, // + 0x6B5B, 0x9F61, // + 0x6B5F, 0x9F62, // + 0x6B61, 0x9F63, // + 0x6B62, 0x8E7E, // + 0x6B63, 0x90B3, // + 0x6B64, 0x8D9F, // + 0x6B66, 0x9590, // + 0x6B69, 0x95E0, // + 0x6B6A, 0x9863, // + 0x6B6F, 0x8E95, // + 0x6B73, 0x8DCE, // + 0x6B74, 0x97F0, // + 0x6B78, 0x9F64, // + 0x6B79, 0x9F65, // + 0x6B7B, 0x8E80, // + 0x6B7F, 0x9F66, // + 0x6B80, 0x9F67, // + 0x6B83, 0x9F69, // + 0x6B84, 0x9F68, // + 0x6B86, 0x9677, // + 0x6B89, 0x8F7D, // + 0x6B8A, 0x8EEA, // + 0x6B8B, 0x8E63, // + 0x6B8D, 0x9F6A, // + 0x6B95, 0x9F6C, // + 0x6B96, 0x9042, // + 0x6B98, 0x9F6B, // + 0x6B9E, 0x9F6D, // + 0x6BA4, 0x9F6E, // + 0x6BAA, 0x9F6F, // + 0x6BAB, 0x9F70, // + 0x6BAF, 0x9F71, // + 0x6BB1, 0x9F73, // + 0x6BB2, 0x9F72, // + 0x6BB3, 0x9F74, // + 0x6BB4, 0x89A3, // + 0x6BB5, 0x9269, // + 0x6BB7, 0x9F75, // + 0x6BBA, 0x8E45, // + 0x6BBB, 0x8A6B, // + 0x6BBC, 0x9F76, // + 0x6BBF, 0x9361, // + 0x6BC0, 0x9ACA, // + 0x6BC5, 0x8B42, // + 0x6BC6, 0x9F77, // + 0x6BCB, 0x9F78, // + 0x6BCD, 0x95EA, // + 0x6BCE, 0x9688, // + 0x6BD2, 0x93C5, // + 0x6BD3, 0x9F79, // + 0x6BD4, 0x94E4, // + 0x6BD8, 0x94F9, // + 0x6BDB, 0x96D1, // + 0x6BDF, 0x9F7A, // + 0x6BEB, 0x9F7C, // + 0x6BEC, 0x9F7B, // + 0x6BEF, 0x9F7E, // + 0x6BF3, 0x9F7D, // + 0x6C08, 0x9F81, // + 0x6C0F, 0x8E81, // + 0x6C11, 0x96AF, // + 0x6C13, 0x9F82, // + 0x6C14, 0x9F83, // + 0x6C17, 0x8B43, // + 0x6C1B, 0x9F84, // + 0x6C23, 0x9F86, // + 0x6C24, 0x9F85, // + 0x6C34, 0x9085, // + 0x6C37, 0x9558, // + 0x6C38, 0x8969, // + 0x6C3E, 0x94C3, // + 0x6C40, 0x92F3, // + 0x6C41, 0x8F60, // + 0x6C42, 0x8B81, // + 0x6C4E, 0x94C4, // + 0x6C50, 0x8EAC, // + 0x6C55, 0x9F88, // + 0x6C57, 0x8ABE, // + 0x6C5A, 0x8998, // + 0x6C5D, 0x93F0, // + 0x6C5E, 0x9F87, // + 0x6C5F, 0x8D5D, // + 0x6C60, 0x9272, // + 0x6C62, 0x9F89, // + 0x6C68, 0x9F91, // + 0x6C6A, 0x9F8A, // + 0x6C70, 0x91BF, // + 0x6C72, 0x8B82, // + 0x6C73, 0x9F92, // + 0x6C7A, 0x8C88, // + 0x6C7D, 0x8B44, // + 0x6C7E, 0x9F90, // + 0x6C81, 0x9F8E, // + 0x6C82, 0x9F8B, // + 0x6C83, 0x9780, // + 0x6C88, 0x92BE, // + 0x6C8C, 0x93D7, // + 0x6C8D, 0x9F8C, // + 0x6C90, 0x9F94, // + 0x6C92, 0x9F93, // + 0x6C93, 0x8C42, // + 0x6C96, 0x89AB, // + 0x6C99, 0x8DB9, // + 0x6C9A, 0x9F8D, // + 0x6C9B, 0x9F8F, // + 0x6CA1, 0x9676, // + 0x6CA2, 0x91F2, // + 0x6CAB, 0x9697, // + 0x6CAE, 0x9F9C, // + 0x6CB1, 0x9F9D, // + 0x6CB3, 0x89CD, // + 0x6CB8, 0x95A6, // + 0x6CB9, 0x96FB, // + 0x6CBA, 0x9F9F, // + 0x6CBB, 0x8EA1, // + 0x6CBC, 0x8FC0, // + 0x6CBD, 0x9F98, // + 0x6CBE, 0x9F9E, // + 0x6CBF, 0x8988, // + 0x6CC1, 0x8BB5, // + 0x6CC4, 0x9F95, // + 0x6CC5, 0x9F9A, // + 0x6CC9, 0x90F2, // + 0x6CCA, 0x9491, // + 0x6CCC, 0x94E5, // + 0x6CD3, 0x9F97, // + 0x6CD5, 0x9640, // + 0x6CD7, 0x9F99, // + 0x6CD9, 0x9FA2, // + 0x6CDB, 0x9FA0, // + 0x6CDD, 0x9F9B, // + 0x6CE1, 0x9641, // + 0x6CE2, 0x9467, // + 0x6CE3, 0x8B83, // + 0x6CE5, 0x9344, // + 0x6CE8, 0x928D, // + 0x6CEA, 0x9FA3, // + 0x6CEF, 0x9FA1, // + 0x6CF0, 0x91D7, // + 0x6CF1, 0x9F96, // + 0x6CF3, 0x896A, // + 0x6D0B, 0x976D, // + 0x6D0C, 0x9FAE, // + 0x6D12, 0x9FAD, // + 0x6D17, 0x90F4, // + 0x6D19, 0x9FAA, // + 0x6D1B, 0x978C, // + 0x6D1E, 0x93B4, // + 0x6D1F, 0x9FA4, // + 0x6D25, 0x92C3, // + 0x6D29, 0x896B, // + 0x6D2A, 0x8D5E, // + 0x6D2B, 0x9FA7, // + 0x6D32, 0x8F46, // + 0x6D33, 0x9FAC, // + 0x6D35, 0x9FAB, // + 0x6D36, 0x9FA6, // + 0x6D38, 0x9FA9, // + 0x6D3B, 0x8A88, // + 0x6D3D, 0x9FA8, // + 0x6D3E, 0x9468, // + 0x6D41, 0x97AC, // + 0x6D44, 0x8FF2, // + 0x6D45, 0x90F3, // + 0x6D59, 0x9FB4, // + 0x6D5A, 0x9FB2, // + 0x6D5C, 0x956C, // + 0x6D63, 0x9FAF, // + 0x6D64, 0x9FB1, // + 0x6D66, 0x8959, // + 0x6D69, 0x8D5F, // + 0x6D6A, 0x9851, // + 0x6D6C, 0x8A5C, // + 0x6D6E, 0x9582, // + 0x6D74, 0x9781, // + 0x6D77, 0x8A43, // + 0x6D78, 0x905A, // + 0x6D79, 0x9FB3, // + 0x6D85, 0x9FB8, // + 0x6D88, 0x8FC1, // + 0x6D8C, 0x974F, // + 0x6D8E, 0x9FB5, // + 0x6D93, 0x9FB0, // + 0x6D95, 0x9FB6, // + 0x6D99, 0x97DC, // + 0x6D9B, 0x9393, // + 0x6D9C, 0x93C0, // + 0x6DAF, 0x8A55, // + 0x6DB2, 0x8974, // + 0x6DB5, 0x9FBC, // + 0x6DB8, 0x9FBF, // + 0x6DBC, 0x97C1, // + 0x6DC0, 0x9784, // + 0x6DC5, 0x9FC6, // + 0x6DC6, 0x9FC0, // + 0x6DC7, 0x9FBD, // + 0x6DCB, 0x97D2, // + 0x6DCC, 0x9FC3, // + 0x6DD1, 0x8F69, // + 0x6DD2, 0x9FC5, // + 0x6DD5, 0x9FCA, // + 0x6DD8, 0x9391, // + 0x6DD9, 0x9FC8, // + 0x6DDE, 0x9FC2, // + 0x6DE1, 0x9257, // + 0x6DE4, 0x9FC9, // + 0x6DE6, 0x9FBE, // + 0x6DE8, 0x9FC4, // + 0x6DEA, 0x9FCB, // + 0x6DEB, 0x88FA, // + 0x6DEC, 0x9FC1, // + 0x6DEE, 0x9FCC, // + 0x6DF3, 0x8F7E, // + 0x6DF5, 0x95A3, // + 0x6DF7, 0x8DAC, // + 0x6DF9, 0x9FB9, // + 0x6DFA, 0x9FC7, // + 0x6DFB, 0x9359, // + 0x6E05, 0x90B4, // + 0x6E07, 0x8A89, // + 0x6E08, 0x8DCF, // + 0x6E09, 0x8FC2, // + 0x6E0A, 0x9FBB, // + 0x6E0B, 0x8F61, // + 0x6E13, 0x8C6B, // + 0x6E15, 0x9FBA, // + 0x6E19, 0x9FD0, // + 0x6E1A, 0x8F8D, // + 0x6E1B, 0x8CB8, // + 0x6E1D, 0x9FDF, // + 0x6E1F, 0x9FD9, // + 0x6E20, 0x8B94, // + 0x6E21, 0x936E, // + 0x6E23, 0x9FD4, // + 0x6E24, 0x9FDD, // + 0x6E25, 0x88AD, // + 0x6E26, 0x8951, // + 0x6E29, 0x89B7, // + 0x6E2B, 0x9FD6, // + 0x6E2C, 0x91AA, // + 0x6E2D, 0x9FCD, // + 0x6E2E, 0x9FCF, // + 0x6E2F, 0x8D60, // + 0x6E38, 0x9FE0, // + 0x6E3A, 0x9FDB, // + 0x6E3E, 0x9FD3, // + 0x6E43, 0x9FDA, // + 0x6E4A, 0x96A9, // + 0x6E4D, 0x9FD8, // + 0x6E4E, 0x9FDC, // + 0x6E56, 0x8CCE, // + 0x6E58, 0x8FC3, // + 0x6E5B, 0x9258, // + 0x6E5F, 0x9FD2, // + 0x6E67, 0x974E, // + 0x6E6B, 0x9FD5, // + 0x6E6E, 0x9FCE, // + 0x6E6F, 0x9392, // + 0x6E72, 0x9FD1, // + 0x6E76, 0x9FD7, // + 0x6E7E, 0x9870, // + 0x6E7F, 0x8EBC, // + 0x6E80, 0x969E, // + 0x6E82, 0x9FE1, // + 0x6E8C, 0x94AC, // + 0x6E8F, 0x9FED, // + 0x6E90, 0x8CB9, // + 0x6E96, 0x8F80, // + 0x6E98, 0x9FE3, // + 0x6E9C, 0x97AD, // + 0x6E9D, 0x8D61, // + 0x6E9F, 0x9FF0, // + 0x6EA2, 0x88EC, // + 0x6EA5, 0x9FEE, // + 0x6EAA, 0x9FE2, // + 0x6EAF, 0x9FE8, // + 0x6EB2, 0x9FEA, // + 0x6EB6, 0x976E, // + 0x6EB7, 0x9FE5, // + 0x6EBA, 0x934D, // + 0x6EBD, 0x9FE7, // + 0x6EC2, 0x9FEF, // + 0x6EC4, 0x9FE9, // + 0x6EC5, 0x96C5, // + 0x6EC9, 0x9FE4, // + 0x6ECB, 0x8EA0, // + 0x6ECC, 0x9FFC, // + 0x6ED1, 0x8A8A, // + 0x6ED3, 0x9FE6, // + 0x6ED4, 0x9FEB, // + 0x6ED5, 0x9FEC, // + 0x6EDD, 0x91EA, // + 0x6EDE, 0x91D8, // + 0x6EEC, 0x9FF4, // + 0x6EEF, 0x9FFA, // + 0x6EF2, 0x9FF8, // + 0x6EF4, 0x9348, // + 0x6EF7, 0xE042, // + 0x6EF8, 0x9FF5, // + 0x6EFE, 0x9FF6, // + 0x6EFF, 0x9FDE, // + 0x6F01, 0x8B99, // + 0x6F02, 0x9559, // + 0x6F06, 0x8EBD, // + 0x6F09, 0x8D97, // + 0x6F0F, 0x9852, // + 0x6F11, 0x9FF2, // + 0x6F13, 0xE041, // + 0x6F14, 0x8989, // + 0x6F15, 0x9186, // + 0x6F20, 0x9499, // + 0x6F22, 0x8ABF, // + 0x6F23, 0x97F8, // + 0x6F2B, 0x969F, // + 0x6F2C, 0x92D0, // + 0x6F31, 0x9FF9, // + 0x6F32, 0x9FFB, // + 0x6F38, 0x9151, // + 0x6F3E, 0xE040, // + 0x6F3F, 0x9FF7, // + 0x6F41, 0x9FF1, // + 0x6F45, 0x8AC1, // + 0x6F54, 0x8C89, // + 0x6F58, 0xE04E, // + 0x6F5B, 0xE049, // + 0x6F5C, 0x90F6, // + 0x6F5F, 0x8A83, // + 0x6F64, 0x8F81, // + 0x6F66, 0xE052, // + 0x6F6D, 0xE04B, // + 0x6F6E, 0x92AA, // + 0x6F6F, 0xE048, // + 0x6F70, 0x92D7, // + 0x6F74, 0xE06B, // + 0x6F78, 0xE045, // + 0x6F7A, 0xE044, // + 0x6F7C, 0xE04D, // + 0x6F80, 0xE047, // + 0x6F81, 0xE046, // + 0x6F82, 0xE04C, // + 0x6F84, 0x909F, // + 0x6F86, 0xE043, // + 0x6F8E, 0xE04F, // + 0x6F91, 0xE050, // + 0x6F97, 0x8AC0, // + 0x6FA1, 0xE055, // + 0x6FA3, 0xE054, // + 0x6FA4, 0xE056, // + 0x6FAA, 0xE059, // + 0x6FB1, 0x9362, // + 0x6FB3, 0xE053, // + 0x6FB9, 0xE057, // + 0x6FC0, 0x8C83, // + 0x6FC1, 0x91F7, // + 0x6FC2, 0xE051, // + 0x6FC3, 0x945A, // + 0x6FC6, 0xE058, // + 0x6FD4, 0xE05D, // + 0x6FD8, 0xE05E, // + 0x6FDB, 0xE061, // + 0x6FDF, 0xE05A, // + 0x6FE0, 0x8D8A, // + 0x6FE1, 0x9447, // + 0x6FE4, 0x9FB7, // + 0x6FEB, 0x9794, // + 0x6FEC, 0xE05C, // + 0x6FEE, 0xE060, // + 0x6FEF, 0x91F3, // + 0x6FF1, 0xE05F, // + 0x6FF3, 0xE04A, // + 0x6FF6, 0xE889, // + 0x6FFA, 0xE064, // + 0x6FFE, 0xE068, // + 0x7001, 0xE066, // + 0x7009, 0xE062, // + 0x700B, 0xE063, // + 0x700F, 0xE067, // + 0x7011, 0xE065, // + 0x7015, 0x956D, // + 0x7018, 0xE06D, // + 0x701A, 0xE06A, // + 0x701B, 0xE069, // + 0x701D, 0xE06C, // + 0x701E, 0x93D2, // + 0x701F, 0xE06E, // + 0x7026, 0x9295, // + 0x7027, 0x91EB, // + 0x702C, 0x90A3, // + 0x7030, 0xE06F, // + 0x7032, 0xE071, // + 0x703E, 0xE070, // + 0x704C, 0x9FF3, // + 0x7051, 0xE072, // + 0x7058, 0x93E5, // + 0x7063, 0xE073, // + 0x706B, 0x89CE, // + 0x706F, 0x9394, // + 0x7070, 0x8A44, // + 0x7078, 0x8B84, // + 0x707C, 0x8EDC, // + 0x707D, 0x8DD0, // + 0x7089, 0x9846, // + 0x708A, 0x9086, // + 0x708E, 0x898A, // + 0x7092, 0xE075, // + 0x7099, 0xE074, // + 0x70AC, 0xE078, // + 0x70AD, 0x9259, // + 0x70AE, 0xE07B, // + 0x70AF, 0xE076, // + 0x70B3, 0xE07A, // + 0x70B8, 0xE079, // + 0x70B9, 0x935F, // + 0x70BA, 0x88D7, // + 0x70C8, 0x97F3, // + 0x70CB, 0xE07D, // + 0x70CF, 0x8947, // + 0x70D9, 0xE080, // + 0x70DD, 0xE07E, // + 0x70DF, 0xE07C, // + 0x70F1, 0xE077, // + 0x70F9, 0x9642, // + 0x70FD, 0xE082, // + 0x7109, 0xE081, // + 0x7114, 0x898B, // + 0x7119, 0xE084, // + 0x711A, 0x95B0, // + 0x711C, 0xE083, // + 0x7121, 0x96B3, // + 0x7126, 0x8FC5, // + 0x7136, 0x9152, // + 0x713C, 0x8FC4, // + 0x7149, 0x97F9, // + 0x714C, 0xE08A, // + 0x714E, 0x90F7, // + 0x7155, 0xE086, // + 0x7156, 0xE08B, // + 0x7159, 0x898C, // + 0x7162, 0xE089, // + 0x7164, 0x9481, // + 0x7165, 0xE085, // + 0x7166, 0xE088, // + 0x7167, 0x8FC6, // + 0x7169, 0x94CF, // + 0x716C, 0xE08C, // + 0x716E, 0x8ECF, // + 0x717D, 0x90F8, // + 0x7184, 0xE08F, // + 0x7188, 0xE087, // + 0x718A, 0x8C46, // + 0x718F, 0xE08D, // + 0x7194, 0x976F, // + 0x7195, 0xE090, // + 0x7199, 0xEAA4, // + 0x719F, 0x8F6E, // + 0x71A8, 0xE091, // + 0x71AC, 0xE092, // + 0x71B1, 0x944D, // + 0x71B9, 0xE094, // + 0x71BE, 0xE095, // + 0x71C3, 0x9452, // + 0x71C8, 0x9395, // + 0x71C9, 0xE097, // + 0x71CE, 0xE099, // + 0x71D0, 0x97D3, // + 0x71D2, 0xE096, // + 0x71D4, 0xE098, // + 0x71D5, 0x898D, // + 0x71D7, 0xE093, // + 0x71DF, 0x9A7A, // + 0x71E0, 0xE09A, // + 0x71E5, 0x9187, // + 0x71E6, 0x8E57, // + 0x71E7, 0xE09C, // + 0x71EC, 0xE09B, // + 0x71ED, 0x9043, // + 0x71EE, 0x99D7, // + 0x71F5, 0xE09D, // + 0x71F9, 0xE09F, // + 0x71FB, 0xE08E, // + 0x71FC, 0xE09E, // + 0x71FF, 0xE0A0, // + 0x7206, 0x949A, // + 0x720D, 0xE0A1, // + 0x7210, 0xE0A2, // + 0x721B, 0xE0A3, // + 0x7228, 0xE0A4, // + 0x722A, 0x92DC, // + 0x722C, 0xE0A6, // + 0x722D, 0xE0A5, // + 0x7230, 0xE0A7, // + 0x7232, 0xE0A8, // + 0x7235, 0x8EDD, // + 0x7236, 0x9583, // + 0x723A, 0x96EA, // + 0x723B, 0xE0A9, // + 0x723C, 0xE0AA, // + 0x723D, 0x9175, // + 0x723E, 0x8EA2, // + 0x723F, 0xE0AB, // + 0x7240, 0xE0AC, // + 0x7246, 0xE0AD, // + 0x7247, 0x95D0, // + 0x7248, 0x94C5, // + 0x724B, 0xE0AE, // + 0x724C, 0x9476, // + 0x7252, 0x92AB, // + 0x7258, 0xE0AF, // + 0x7259, 0x89E5, // + 0x725B, 0x8B8D, // + 0x725D, 0x96C4, // + 0x725F, 0x96B4, // + 0x7261, 0x89B2, // + 0x7262, 0x9853, // + 0x7267, 0x9671, // + 0x7269, 0x95A8, // + 0x7272, 0x90B5, // + 0x7274, 0xE0B0, // + 0x7279, 0x93C1, // + 0x727D, 0x8CA1, // + 0x727E, 0xE0B1, // + 0x7280, 0x8DD2, // + 0x7281, 0xE0B3, // + 0x7282, 0xE0B2, // + 0x7287, 0xE0B4, // + 0x7292, 0xE0B5, // + 0x7296, 0xE0B6, // + 0x72A0, 0x8B5D, // + 0x72A2, 0xE0B7, // + 0x72A7, 0xE0B8, // + 0x72AC, 0x8CA2, // + 0x72AF, 0x94C6, // + 0x72B2, 0xE0BA, // + 0x72B6, 0x8FF3, // + 0x72B9, 0xE0B9, // + 0x72C2, 0x8BB6, // + 0x72C3, 0xE0BB, // + 0x72C4, 0xE0BD, // + 0x72C6, 0xE0BC, // + 0x72CE, 0xE0BE, // + 0x72D0, 0x8CCF, // + 0x72D2, 0xE0BF, // + 0x72D7, 0x8BE7, // + 0x72D9, 0x915F, // + 0x72DB, 0x8D9D, // + 0x72E0, 0xE0C1, // + 0x72E1, 0xE0C2, // + 0x72E2, 0xE0C0, // + 0x72E9, 0x8EEB, // + 0x72EC, 0x93C6, // + 0x72ED, 0x8BB7, // + 0x72F7, 0xE0C4, // + 0x72F8, 0x924B, // + 0x72F9, 0xE0C3, // + 0x72FC, 0x9854, // + 0x72FD, 0x9482, // + 0x730A, 0xE0C7, // + 0x7316, 0xE0C9, // + 0x7317, 0xE0C6, // + 0x731B, 0x96D2, // + 0x731C, 0xE0C8, // + 0x731D, 0xE0CA, // + 0x731F, 0x97C2, // + 0x7325, 0xE0CE, // + 0x7329, 0xE0CD, // + 0x732A, 0x9296, // + 0x732B, 0x944C, // + 0x732E, 0x8CA3, // + 0x732F, 0xE0CC, // + 0x7334, 0xE0CB, // + 0x7336, 0x9750, // + 0x7337, 0x9751, // + 0x733E, 0xE0CF, // + 0x733F, 0x898E, // + 0x7344, 0x8D96, // + 0x7345, 0x8E82, // + 0x734E, 0xE0D0, // + 0x734F, 0xE0D1, // + 0x7357, 0xE0D3, // + 0x7363, 0x8F62, // + 0x7368, 0xE0D5, // + 0x736A, 0xE0D4, // + 0x7370, 0xE0D6, // + 0x7372, 0x8A6C, // + 0x7375, 0xE0D8, // + 0x7378, 0xE0D7, // + 0x737A, 0xE0DA, // + 0x737B, 0xE0D9, // + 0x7384, 0x8CBA, // + 0x7387, 0x97A6, // + 0x7389, 0x8BCA, // + 0x738B, 0x89A4, // + 0x7396, 0x8BE8, // + 0x73A9, 0x8ADF, // + 0x73B2, 0x97E6, // + 0x73B3, 0xE0DC, // + 0x73BB, 0xE0DE, // + 0x73C0, 0xE0DF, // + 0x73C2, 0x89CF, // + 0x73C8, 0xE0DB, // + 0x73CA, 0x8E58, // + 0x73CD, 0x92BF, // + 0x73CE, 0xE0DD, // + 0x73DE, 0xE0E2, // + 0x73E0, 0x8EEC, // + 0x73E5, 0xE0E0, // + 0x73EA, 0x8C5D, // + 0x73ED, 0x94C7, // + 0x73EE, 0xE0E1, // + 0x73F1, 0xE0FC, // + 0x73F8, 0xE0E7, // + 0x73FE, 0x8CBB, // + 0x7403, 0x8B85, // + 0x7405, 0xE0E4, // + 0x7406, 0x979D, // + 0x7409, 0x97AE, // + 0x7422, 0x91F4, // + 0x7425, 0xE0E6, // + 0x7432, 0xE0E8, // + 0x7433, 0x97D4, // + 0x7434, 0x8BD5, // + 0x7435, 0x94FA, // + 0x7436, 0x9469, // + 0x743A, 0xE0E9, // + 0x743F, 0xE0EB, // + 0x7441, 0xE0EE, // + 0x7455, 0xE0EA, // + 0x7459, 0xE0ED, // + 0x745A, 0x8CE8, // + 0x745B, 0x896C, // + 0x745C, 0xE0EF, // + 0x745E, 0x9090, // + 0x745F, 0xE0EC, // + 0x7460, 0x97DA, // + 0x7463, 0xE0F2, // + 0x7464, 0xEAA2, // + 0x7469, 0xE0F0, // + 0x746A, 0xE0F3, // + 0x746F, 0xE0E5, // + 0x7470, 0xE0F1, // + 0x7473, 0x8DBA, // + 0x7476, 0xE0F4, // + 0x747E, 0xE0F5, // + 0x7483, 0x979E, // + 0x748B, 0xE0F6, // + 0x749E, 0xE0F7, // + 0x74A2, 0xE0E3, // + 0x74A7, 0xE0F8, // + 0x74B0, 0x8AC2, // + 0x74BD, 0x8EA3, // + 0x74CA, 0xE0F9, // + 0x74CF, 0xE0FA, // + 0x74D4, 0xE0FB, // + 0x74DC, 0x895A, // + 0x74E0, 0xE140, // + 0x74E2, 0x955A, // + 0x74E3, 0xE141, // + 0x74E6, 0x8AA2, // + 0x74E7, 0xE142, // + 0x74E9, 0xE143, // + 0x74EE, 0xE144, // + 0x74F0, 0xE146, // + 0x74F1, 0xE147, // + 0x74F2, 0xE145, // + 0x74F6, 0x9572, // + 0x74F7, 0xE149, // + 0x74F8, 0xE148, // + 0x7503, 0xE14B, // + 0x7504, 0xE14A, // + 0x7505, 0xE14C, // + 0x750C, 0xE14D, // + 0x750D, 0xE14F, // + 0x750E, 0xE14E, // + 0x7511, 0x8D99, // + 0x7513, 0xE151, // + 0x7515, 0xE150, // + 0x7518, 0x8AC3, // + 0x751A, 0x9072, // + 0x751E, 0xE152, // + 0x751F, 0x90B6, // + 0x7523, 0x8E59, // + 0x7525, 0x8999, // + 0x7526, 0xE153, // + 0x7528, 0x9770, // + 0x752B, 0x95E1, // + 0x752C, 0xE154, // + 0x7530, 0x9363, // + 0x7531, 0x9752, // + 0x7532, 0x8D62, // + 0x7533, 0x905C, // + 0x7537, 0x926A, // + 0x7538, 0x99B2, // + 0x753A, 0x92AC, // + 0x753B, 0x89E6, // + 0x753C, 0xE155, // + 0x7544, 0xE156, // + 0x7549, 0xE159, // + 0x754A, 0xE158, // + 0x754B, 0x9DC0, // + 0x754C, 0x8A45, // + 0x754D, 0xE157, // + 0x754F, 0x88D8, // + 0x7551, 0x94A8, // + 0x7554, 0x94C8, // + 0x7559, 0x97AF, // + 0x755A, 0xE15C, // + 0x755B, 0xE15A, // + 0x755C, 0x927B, // + 0x755D, 0x90A4, // + 0x7560, 0x94A9, // + 0x7562, 0x954C, // + 0x7564, 0xE15E, // + 0x7565, 0x97AA, // + 0x7566, 0x8C6C, // + 0x7567, 0xE15F, // + 0x7569, 0xE15D, // + 0x756A, 0x94D4, // + 0x756B, 0xE160, // + 0x756D, 0xE161, // + 0x7570, 0x88D9, // + 0x7573, 0x8FF4, // + 0x7574, 0xE166, // + 0x7576, 0xE163, // + 0x7577, 0x93EB, // + 0x7578, 0xE162, // + 0x757F, 0x8B45, // + 0x7582, 0xE169, // + 0x7586, 0xE164, // + 0x7587, 0xE165, // + 0x7589, 0xE168, // + 0x758A, 0xE167, // + 0x758B, 0x9544, // + 0x758E, 0x9161, // + 0x758F, 0x9160, // + 0x7591, 0x8B5E, // + 0x7594, 0xE16A, // + 0x759A, 0xE16B, // + 0x759D, 0xE16C, // + 0x75A3, 0xE16E, // + 0x75A5, 0xE16D, // + 0x75AB, 0x8975, // + 0x75B1, 0xE176, // + 0x75B2, 0x94E6, // + 0x75B3, 0xE170, // + 0x75B5, 0xE172, // + 0x75B8, 0xE174, // + 0x75B9, 0x905D, // + 0x75BC, 0xE175, // + 0x75BD, 0xE173, // + 0x75BE, 0x8EBE, // + 0x75C2, 0xE16F, // + 0x75C3, 0xE171, // + 0x75C5, 0x9561, // + 0x75C7, 0x8FC7, // + 0x75CA, 0xE178, // + 0x75CD, 0xE177, // + 0x75D2, 0xE179, // + 0x75D4, 0x8EA4, // + 0x75D5, 0x8DAD, // + 0x75D8, 0x9397, // + 0x75D9, 0xE17A, // + 0x75DB, 0x92C9, // + 0x75DE, 0xE17C, // + 0x75E2, 0x979F, // + 0x75E3, 0xE17B, // + 0x75E9, 0x9189, // + 0x75F0, 0xE182, // + 0x75F2, 0xE184, // + 0x75F3, 0xE185, // + 0x75F4, 0x9273, // + 0x75FA, 0xE183, // + 0x75FC, 0xE180, // + 0x75FE, 0xE17D, // + 0x75FF, 0xE17E, // + 0x7601, 0xE181, // + 0x7609, 0xE188, // + 0x760B, 0xE186, // + 0x760D, 0xE187, // + 0x761F, 0xE189, // + 0x7620, 0xE18B, // + 0x7621, 0xE18C, // + 0x7622, 0xE18D, // + 0x7624, 0xE18E, // + 0x7627, 0xE18A, // + 0x7630, 0xE190, // + 0x7634, 0xE18F, // + 0x763B, 0xE191, // + 0x7642, 0x97C3, // + 0x7646, 0xE194, // + 0x7647, 0xE192, // + 0x7648, 0xE193, // + 0x764C, 0x8AE0, // + 0x7652, 0x96FC, // + 0x7656, 0x95C8, // + 0x7658, 0xE196, // + 0x765C, 0xE195, // + 0x7661, 0xE197, // + 0x7662, 0xE198, // + 0x7667, 0xE19C, // + 0x7668, 0xE199, // + 0x7669, 0xE19A, // + 0x766A, 0xE19B, // + 0x766C, 0xE19D, // + 0x7670, 0xE19E, // + 0x7672, 0xE19F, // + 0x7676, 0xE1A0, // + 0x7678, 0xE1A1, // + 0x767A, 0x94AD, // + 0x767B, 0x936F, // + 0x767C, 0xE1A2, // + 0x767D, 0x9492, // + 0x767E, 0x9553, // + 0x7680, 0xE1A3, // + 0x7683, 0xE1A4, // + 0x7684, 0x9349, // + 0x7686, 0x8A46, // + 0x7687, 0x8D63, // + 0x7688, 0xE1A5, // + 0x768B, 0xE1A6, // + 0x768E, 0xE1A7, // + 0x7690, 0x8E48, // + 0x7693, 0xE1A9, // + 0x7696, 0xE1A8, // + 0x7699, 0xE1AA, // + 0x769A, 0xE1AB, // + 0x76AE, 0x94E7, // + 0x76B0, 0xE1AC, // + 0x76B4, 0xE1AD, // + 0x76B7, 0xEA89, // + 0x76B8, 0xE1AE, // + 0x76B9, 0xE1AF, // + 0x76BA, 0xE1B0, // + 0x76BF, 0x8E4D, // + 0x76C2, 0xE1B1, // + 0x76C3, 0x9475, // + 0x76C6, 0x967E, // + 0x76C8, 0x896D, // + 0x76CA, 0x8976, // + 0x76CD, 0xE1B2, // + 0x76D2, 0xE1B4, // + 0x76D6, 0xE1B3, // + 0x76D7, 0x9390, // + 0x76DB, 0x90B7, // + 0x76DC, 0x9F58, // + 0x76DE, 0xE1B5, // + 0x76DF, 0x96BF, // + 0x76E1, 0xE1B6, // + 0x76E3, 0x8AC4, // + 0x76E4, 0x94D5, // + 0x76E5, 0xE1B7, // + 0x76E7, 0xE1B8, // + 0x76EA, 0xE1B9, // + 0x76EE, 0x96DA, // + 0x76F2, 0x96D3, // + 0x76F4, 0x92BC, // + 0x76F8, 0x918A, // + 0x76FB, 0xE1BB, // + 0x76FE, 0x8F82, // + 0x7701, 0x8FC8, // + 0x7704, 0xE1BE, // + 0x7707, 0xE1BD, // + 0x7708, 0xE1BC, // + 0x7709, 0x94FB, // + 0x770B, 0x8AC5, // + 0x770C, 0x8CA7, // + 0x771B, 0xE1C4, // + 0x771E, 0xE1C1, // + 0x771F, 0x905E, // + 0x7720, 0x96B0, // + 0x7724, 0xE1C0, // + 0x7725, 0xE1C2, // + 0x7726, 0xE1C3, // + 0x7729, 0xE1BF, // + 0x7737, 0xE1C5, // + 0x7738, 0xE1C6, // + 0x773A, 0x92AD, // + 0x773C, 0x8AE1, // + 0x7740, 0x9285, // + 0x7747, 0xE1C7, // + 0x775A, 0xE1C8, // + 0x775B, 0xE1CB, // + 0x7761, 0x9087, // + 0x7763, 0x93C2, // + 0x7765, 0xE1CC, // + 0x7766, 0x9672, // + 0x7768, 0xE1C9, // + 0x776B, 0xE1CA, // + 0x7779, 0xE1CF, // + 0x777E, 0xE1CE, // + 0x777F, 0xE1CD, // + 0x778B, 0xE1D1, // + 0x778E, 0xE1D0, // + 0x7791, 0xE1D2, // + 0x779E, 0xE1D4, // + 0x77A0, 0xE1D3, // + 0x77A5, 0x95CB, // + 0x77AC, 0x8F75, // + 0x77AD, 0x97C4, // + 0x77B0, 0xE1D5, // + 0x77B3, 0x93B5, // + 0x77B6, 0xE1D6, // + 0x77B9, 0xE1D7, // + 0x77BB, 0xE1DB, // + 0x77BC, 0xE1D9, // + 0x77BD, 0xE1DA, // + 0x77BF, 0xE1D8, // + 0x77C7, 0xE1DC, // + 0x77CD, 0xE1DD, // + 0x77D7, 0xE1DE, // + 0x77DA, 0xE1DF, // + 0x77DB, 0x96B5, // + 0x77DC, 0xE1E0, // + 0x77E2, 0x96EE, // + 0x77E3, 0xE1E1, // + 0x77E5, 0x926D, // + 0x77E7, 0x948A, // + 0x77E9, 0x8BE9, // + 0x77ED, 0x925A, // + 0x77EE, 0xE1E2, // + 0x77EF, 0x8BB8, // + 0x77F3, 0x90CE, // + 0x77FC, 0xE1E3, // + 0x7802, 0x8DBB, // + 0x780C, 0xE1E4, // + 0x7812, 0xE1E5, // + 0x7814, 0x8CA4, // + 0x7815, 0x8DD3, // + 0x7820, 0xE1E7, // + 0x7825, 0x9375, // + 0x7826, 0x8DD4, // + 0x7827, 0x8B6D, // + 0x7832, 0x9643, // + 0x7834, 0x946A, // + 0x783A, 0x9376, // + 0x783F, 0x8D7B, // + 0x7845, 0xE1E9, // + 0x785D, 0x8FC9, // + 0x786B, 0x97B0, // + 0x786C, 0x8D64, // + 0x786F, 0x8CA5, // + 0x7872, 0x94A1, // + 0x7874, 0xE1EB, // + 0x787C, 0xE1ED, // + 0x7881, 0x8CE9, // + 0x7886, 0xE1EC, // + 0x7887, 0x92F4, // + 0x788C, 0xE1EF, // + 0x788D, 0x8A56, // + 0x788E, 0xE1EA, // + 0x7891, 0x94E8, // + 0x7893, 0x894F, // + 0x7895, 0x8DEA, // + 0x7897, 0x9871, // + 0x789A, 0xE1EE, // + 0x78A3, 0xE1F0, // + 0x78A7, 0x95C9, // + 0x78A9, 0x90D7, // + 0x78AA, 0xE1F2, // + 0x78AF, 0xE1F3, // + 0x78B5, 0xE1F1, // + 0x78BA, 0x8A6D, // + 0x78BC, 0xE1F9, // + 0x78BE, 0xE1F8, // + 0x78C1, 0x8EA5, // + 0x78C5, 0xE1FA, // + 0x78C6, 0xE1F5, // + 0x78CA, 0xE1FB, // + 0x78CB, 0xE1F6, // + 0x78D0, 0x94D6, // + 0x78D1, 0xE1F4, // + 0x78D4, 0xE1F7, // + 0x78DA, 0xE241, // + 0x78E7, 0xE240, // + 0x78E8, 0x9681, // + 0x78EC, 0xE1FC, // + 0x78EF, 0x88E9, // + 0x78F4, 0xE243, // + 0x78FD, 0xE242, // + 0x7901, 0x8FCA, // + 0x7907, 0xE244, // + 0x790E, 0x9162, // + 0x7911, 0xE246, // + 0x7912, 0xE245, // + 0x7919, 0xE247, // + 0x7926, 0xE1E6, // + 0x792A, 0xE1E8, // + 0x792B, 0xE249, // + 0x792C, 0xE248, // + 0x793A, 0x8EA6, // + 0x793C, 0x97E7, // + 0x793E, 0x8ED0, // + 0x7940, 0xE24A, // + 0x7941, 0x8C56, // + 0x7947, 0x8B5F, // + 0x7948, 0x8B46, // + 0x7949, 0x8E83, // + 0x7950, 0x9753, // + 0x7953, 0xE250, // + 0x7955, 0xE24F, // + 0x7956, 0x9163, // + 0x7957, 0xE24C, // + 0x795A, 0xE24E, // + 0x795D, 0x8F6A, // + 0x795E, 0x905F, // + 0x795F, 0xE24D, // + 0x7960, 0xE24B, // + 0x7962, 0x9449, // + 0x7965, 0x8FCB, // + 0x796D, 0x8DD5, // + 0x7977, 0x9398, // + 0x797A, 0xE251, // + 0x797F, 0xE252, // + 0x7980, 0xE268, // + 0x7981, 0x8BD6, // + 0x7984, 0x985C, // + 0x7985, 0x9154, // + 0x798A, 0xE253, // + 0x798D, 0x89D0, // + 0x798E, 0x92F5, // + 0x798F, 0x959F, // + 0x799D, 0xE254, // + 0x79A6, 0x8B9A, // + 0x79A7, 0xE255, // + 0x79AA, 0xE257, // + 0x79AE, 0xE258, // + 0x79B0, 0x9448, // + 0x79B3, 0xE259, // + 0x79B9, 0xE25A, // + 0x79BD, 0x8BD7, // + 0x79BE, 0x89D1, // + 0x79BF, 0x93C3, // + 0x79C0, 0x8F47, // + 0x79C1, 0x8E84, // + 0x79C9, 0xE25C, // + 0x79CB, 0x8F48, // + 0x79D1, 0x89C8, // + 0x79D2, 0x9562, // + 0x79D5, 0xE25D, // + 0x79D8, 0x94E9, // + 0x79DF, 0x9164, // + 0x79E1, 0xE260, // + 0x79E3, 0xE261, // + 0x79E4, 0x9489, // + 0x79E6, 0x9060, // + 0x79E7, 0xE25E, // + 0x79E9, 0x9281, // + 0x79EC, 0xE25F, // + 0x79F0, 0x8FCC, // + 0x79FB, 0x88DA, // + 0x7A00, 0x8B48, // + 0x7A08, 0xE262, // + 0x7A0B, 0x92F6, // + 0x7A0D, 0xE263, // + 0x7A0E, 0x90C5, // + 0x7A14, 0x96AB, // + 0x7A17, 0x9542, // + 0x7A18, 0xE264, // + 0x7A19, 0xE265, // + 0x7A1A, 0x9274, // + 0x7A1C, 0x97C5, // + 0x7A1F, 0xE267, // + 0x7A20, 0xE266, // + 0x7A2E, 0x8EED, // + 0x7A31, 0xE269, // + 0x7A32, 0x88EE, // + 0x7A37, 0xE26C, // + 0x7A3B, 0xE26A, // + 0x7A3C, 0x89D2, // + 0x7A3D, 0x8C6D, // + 0x7A3E, 0xE26B, // + 0x7A3F, 0x8D65, // + 0x7A40, 0x8D92, // + 0x7A42, 0x95E4, // + 0x7A43, 0xE26D, // + 0x7A46, 0x9673, // + 0x7A49, 0xE26F, // + 0x7A4D, 0x90CF, // + 0x7A4E, 0x896E, // + 0x7A4F, 0x89B8, // + 0x7A50, 0x88AA, // + 0x7A57, 0xE26E, // + 0x7A61, 0xE270, // + 0x7A62, 0xE271, // + 0x7A63, 0x8FF5, // + 0x7A69, 0xE272, // + 0x7A6B, 0x8A6E, // + 0x7A70, 0xE274, // + 0x7A74, 0x8C8A, // + 0x7A76, 0x8B86, // + 0x7A79, 0xE275, // + 0x7A7A, 0x8BF3, // + 0x7A7D, 0xE276, // + 0x7A7F, 0x90FA, // + 0x7A81, 0x93CB, // + 0x7A83, 0x90DE, // + 0x7A84, 0x8DF3, // + 0x7A88, 0xE277, // + 0x7A92, 0x9282, // + 0x7A93, 0x918B, // + 0x7A95, 0xE279, // + 0x7A96, 0xE27B, // + 0x7A97, 0xE278, // + 0x7A98, 0xE27A, // + 0x7A9F, 0x8C41, // + 0x7AA9, 0xE27C, // + 0x7AAA, 0x8C45, // + 0x7AAE, 0x8B87, // + 0x7AAF, 0x9771, // + 0x7AB0, 0xE27E, // + 0x7AB6, 0xE280, // + 0x7ABA, 0x894D, // + 0x7ABF, 0xE283, // + 0x7AC3, 0x8A96, // + 0x7AC4, 0xE282, // + 0x7AC5, 0xE281, // + 0x7AC7, 0xE285, // + 0x7AC8, 0xE27D, // + 0x7ACA, 0xE286, // + 0x7ACB, 0x97A7, // + 0x7ACD, 0xE287, // + 0x7ACF, 0xE288, // + 0x7AD2, 0x9AF2, // + 0x7AD3, 0xE28A, // + 0x7AD5, 0xE289, // + 0x7AD9, 0xE28B, // + 0x7ADA, 0xE28C, // + 0x7ADC, 0x97B3, // + 0x7ADD, 0xE28D, // + 0x7ADF, 0xE8ED, // + 0x7AE0, 0x8FCD, // + 0x7AE1, 0xE28E, // + 0x7AE2, 0xE28F, // + 0x7AE3, 0x8F76, // + 0x7AE5, 0x93B6, // + 0x7AE6, 0xE290, // + 0x7AEA, 0x9247, // + 0x7AED, 0xE291, // + 0x7AF0, 0xE292, // + 0x7AF6, 0x8BA3, // + 0x7AF8, 0x995E, // + 0x7AF9, 0x927C, // + 0x7AFA, 0x8EB1, // + 0x7AFF, 0x8AC6, // + 0x7B02, 0xE293, // + 0x7B04, 0xE2A0, // + 0x7B06, 0xE296, // + 0x7B08, 0x8B88, // + 0x7B0A, 0xE295, // + 0x7B0B, 0xE2A2, // + 0x7B0F, 0xE294, // + 0x7B11, 0x8FCE, // + 0x7B18, 0xE298, // + 0x7B19, 0xE299, // + 0x7B1B, 0x934A, // + 0x7B1E, 0xE29A, // + 0x7B20, 0x8A7D, // + 0x7B25, 0x9079, // + 0x7B26, 0x9584, // + 0x7B28, 0xE29C, // + 0x7B2C, 0x91E6, // + 0x7B33, 0xE297, // + 0x7B35, 0xE29B, // + 0x7B36, 0xE29D, // + 0x7B39, 0x8DF9, // + 0x7B45, 0xE2A4, // + 0x7B46, 0x954D, // + 0x7B48, 0x94A4, // + 0x7B49, 0x9399, // + 0x7B4B, 0x8BD8, // + 0x7B4C, 0xE2A3, // + 0x7B4D, 0xE2A1, // + 0x7B4F, 0x94B3, // + 0x7B50, 0xE29E, // + 0x7B51, 0x927D, // + 0x7B52, 0x939B, // + 0x7B54, 0x939A, // + 0x7B56, 0x8DF4, // + 0x7B5D, 0xE2B6, // + 0x7B65, 0xE2A6, // + 0x7B67, 0xE2A8, // + 0x7B6C, 0xE2AB, // + 0x7B6E, 0xE2AC, // + 0x7B70, 0xE2A9, // + 0x7B71, 0xE2AA, // + 0x7B74, 0xE2A7, // + 0x7B75, 0xE2A5, // + 0x7B7A, 0xE29F, // + 0x7B86, 0x95CD, // + 0x7B87, 0x89D3, // + 0x7B8B, 0xE2B3, // + 0x7B8D, 0xE2B0, // + 0x7B8F, 0xE2B5, // + 0x7B92, 0xE2B4, // + 0x7B94, 0x9493, // + 0x7B95, 0x96A5, // + 0x7B97, 0x8E5A, // + 0x7B98, 0xE2AE, // + 0x7B99, 0xE2B7, // + 0x7B9A, 0xE2B2, // + 0x7B9C, 0xE2B1, // + 0x7B9D, 0xE2AD, // + 0x7B9F, 0xE2AF, // + 0x7BA1, 0x8AC7, // + 0x7BAA, 0x925C, // + 0x7BAD, 0x90FB, // + 0x7BB1, 0x94A0, // + 0x7BB4, 0xE2BC, // + 0x7BB8, 0x94A2, // + 0x7BC0, 0x90DF, // + 0x7BC1, 0xE2B9, // + 0x7BC4, 0x94CD, // + 0x7BC6, 0xE2BD, // + 0x7BC7, 0x95D1, // + 0x7BC9, 0x927A, // + 0x7BCB, 0xE2B8, // + 0x7BCC, 0xE2BA, // + 0x7BCF, 0xE2BB, // + 0x7BDD, 0xE2BE, // + 0x7BE0, 0x8EC2, // + 0x7BE4, 0x93C4, // + 0x7BE5, 0xE2C3, // + 0x7BE6, 0xE2C2, // + 0x7BE9, 0xE2BF, // + 0x7BED, 0x9855, // + 0x7BF3, 0xE2C8, // + 0x7BF6, 0xE2CC, // + 0x7BF7, 0xE2C9, // + 0x7C00, 0xE2C5, // + 0x7C07, 0xE2C6, // + 0x7C0D, 0xE2CB, // + 0x7C11, 0xE2C0, // + 0x7C12, 0x99D3, // + 0x7C13, 0xE2C7, // + 0x7C14, 0xE2C1, // + 0x7C17, 0xE2CA, // + 0x7C1F, 0xE2D0, // + 0x7C21, 0x8AC8, // + 0x7C23, 0xE2CD, // + 0x7C27, 0xE2CE, // + 0x7C2A, 0xE2CF, // + 0x7C2B, 0xE2D2, // + 0x7C37, 0xE2D1, // + 0x7C38, 0x94F4, // + 0x7C3D, 0xE2D3, // + 0x7C3E, 0x97FA, // + 0x7C3F, 0x95EB, // + 0x7C40, 0xE2D8, // + 0x7C43, 0xE2D5, // + 0x7C4C, 0xE2D4, // + 0x7C4D, 0x90D0, // + 0x7C4F, 0xE2D7, // + 0x7C50, 0xE2D9, // + 0x7C54, 0xE2D6, // + 0x7C56, 0xE2DD, // + 0x7C58, 0xE2DA, // + 0x7C5F, 0xE2DB, // + 0x7C60, 0xE2C4, // + 0x7C64, 0xE2DC, // + 0x7C65, 0xE2DE, // + 0x7C6C, 0xE2DF, // + 0x7C73, 0x95C4, // + 0x7C75, 0xE2E0, // + 0x7C7E, 0x96E0, // + 0x7C81, 0x8BCC, // + 0x7C82, 0x8C48, // + 0x7C83, 0xE2E1, // + 0x7C89, 0x95B2, // + 0x7C8B, 0x9088, // + 0x7C8D, 0x96AE, // + 0x7C90, 0xE2E2, // + 0x7C92, 0x97B1, // + 0x7C95, 0x9494, // + 0x7C97, 0x9165, // + 0x7C98, 0x9453, // + 0x7C9B, 0x8F6C, // + 0x7C9F, 0x88BE, // + 0x7CA1, 0xE2E7, // + 0x7CA2, 0xE2E5, // + 0x7CA4, 0xE2E3, // + 0x7CA5, 0x8A9F, // + 0x7CA7, 0x8FCF, // + 0x7CA8, 0xE2E8, // + 0x7CAB, 0xE2E6, // + 0x7CAD, 0xE2E4, // + 0x7CAE, 0xE2EC, // + 0x7CB1, 0xE2EB, // + 0x7CB2, 0xE2EA, // + 0x7CB3, 0xE2E9, // + 0x7CB9, 0xE2ED, // + 0x7CBD, 0xE2EE, // + 0x7CBE, 0x90B8, // + 0x7CC0, 0xE2EF, // + 0x7CC2, 0xE2F1, // + 0x7CC5, 0xE2F0, // + 0x7CCA, 0x8CD0, // + 0x7CCE, 0x9157, // + 0x7CD2, 0xE2F3, // + 0x7CD6, 0x939C, // + 0x7CD8, 0xE2F2, // + 0x7CDC, 0xE2F4, // + 0x7CDE, 0x95B3, // + 0x7CDF, 0x918C, // + 0x7CE0, 0x8D66, // + 0x7CE2, 0xE2F5, // + 0x7CE7, 0x97C6, // + 0x7CEF, 0xE2F7, // + 0x7CF2, 0xE2F8, // + 0x7CF4, 0xE2F9, // + 0x7CF6, 0xE2FA, // + 0x7CF8, 0x8E85, // + 0x7CFA, 0xE2FB, // + 0x7CFB, 0x8C6E, // + 0x7CFE, 0x8B8A, // + 0x7D00, 0x8B49, // + 0x7D02, 0xE340, // + 0x7D04, 0x96F1, // + 0x7D05, 0x8D67, // + 0x7D06, 0xE2FC, // + 0x7D0A, 0xE343, // + 0x7D0B, 0x96E4, // + 0x7D10, 0x9552, // + 0x7D14, 0x8F83, // + 0x7D15, 0xE342, // + 0x7D17, 0x8ED1, // + 0x7D18, 0x8D68, // + 0x7D19, 0x8E86, // + 0x7D1A, 0x8B89, // + 0x7D1B, 0x95B4, // + 0x7D1C, 0xE341, // + 0x7D20, 0x9166, // + 0x7D21, 0x9661, // + 0x7D22, 0x8DF5, // + 0x7D2B, 0x8E87, // + 0x7D2C, 0x92DB, // + 0x7D2E, 0xE346, // + 0x7D2F, 0x97DD, // + 0x7D30, 0x8DD7, // + 0x7D32, 0xE347, // + 0x7D33, 0x9061, // + 0x7D35, 0xE349, // + 0x7D39, 0x8FD0, // + 0x7D3A, 0x8DAE, // + 0x7D3F, 0xE348, // + 0x7D42, 0x8F49, // + 0x7D43, 0x8CBC, // + 0x7D44, 0x9167, // + 0x7D45, 0xE344, // + 0x7D46, 0xE34A, // + 0x7D4B, 0xE345, // + 0x7D4C, 0x8C6F, // + 0x7D4E, 0xE34D, // + 0x7D4F, 0xE351, // + 0x7D50, 0x8C8B, // + 0x7D56, 0xE34C, // + 0x7D5B, 0xE355, // + 0x7D5E, 0x8D69, // + 0x7D61, 0x978D, // + 0x7D62, 0x88BA, // + 0x7D63, 0xE352, // + 0x7D66, 0x8B8B, // + 0x7D68, 0xE34F, // + 0x7D6E, 0xE350, // + 0x7D71, 0x939D, // + 0x7D72, 0xE34E, // + 0x7D73, 0xE34B, // + 0x7D75, 0x8A47, // + 0x7D76, 0x90E2, // + 0x7D79, 0x8CA6, // + 0x7D7D, 0xE357, // + 0x7D89, 0xE354, // + 0x7D8F, 0xE356, // + 0x7D93, 0xE353, // + 0x7D99, 0x8C70, // + 0x7D9A, 0x91B1, // + 0x7D9B, 0xE358, // + 0x7D9C, 0x918E, // + 0x7D9F, 0xE365, // + 0x7DA2, 0xE361, // + 0x7DAB, 0xE35F, // + 0x7DAC, 0x8EF8, // + 0x7DAD, 0x88DB, // + 0x7DAE, 0xE35A, // + 0x7DAF, 0xE362, // + 0x7DB0, 0xE366, // + 0x7DB1, 0x8D6A, // + 0x7DB2, 0x96D4, // + 0x7DB4, 0x92D4, // + 0x7DB5, 0xE35C, // + 0x7DB8, 0xE364, // + 0x7DBA, 0xE359, // + 0x7DBB, 0x925D, // + 0x7DBD, 0xE35E, // + 0x7DBE, 0x88BB, // + 0x7DBF, 0x96C8, // + 0x7DC7, 0xE35D, // + 0x7DCA, 0x8BD9, // + 0x7DCB, 0x94EA, // + 0x7DCF, 0x918D, // + 0x7DD1, 0x97CE, // + 0x7DD2, 0x8F8F, // + 0x7DD5, 0xE38E, // + 0x7DD8, 0xE367, // + 0x7DDA, 0x90FC, // + 0x7DDC, 0xE363, // + 0x7DDD, 0xE368, // + 0x7DDE, 0xE36A, // + 0x7DE0, 0x92F7, // + 0x7DE1, 0xE36D, // + 0x7DE4, 0xE369, // + 0x7DE8, 0x95D2, // + 0x7DE9, 0x8AC9, // + 0x7DEC, 0x96C9, // + 0x7DEF, 0x88DC, // + 0x7DF2, 0xE36C, // + 0x7DF4, 0x97FB, // + 0x7DFB, 0xE36B, // + 0x7E01, 0x898F, // + 0x7E04, 0x93EA, // + 0x7E05, 0xE36E, // + 0x7E09, 0xE375, // + 0x7E0A, 0xE36F, // + 0x7E0B, 0xE376, // + 0x7E12, 0xE372, // + 0x7E1B, 0x949B, // + 0x7E1E, 0x8EC8, // + 0x7E1F, 0xE374, // + 0x7E21, 0xE371, // + 0x7E22, 0xE377, // + 0x7E23, 0xE370, // + 0x7E26, 0x8F63, // + 0x7E2B, 0x9644, // + 0x7E2E, 0x8F6B, // + 0x7E31, 0xE373, // + 0x7E32, 0xE380, // + 0x7E35, 0xE37B, // + 0x7E37, 0xE37E, // + 0x7E39, 0xE37C, // + 0x7E3A, 0xE381, // + 0x7E3B, 0xE37A, // + 0x7E3D, 0xE360, // + 0x7E3E, 0x90D1, // + 0x7E41, 0x94C9, // + 0x7E43, 0xE37D, // + 0x7E46, 0xE378, // + 0x7E4A, 0x9140, // + 0x7E4B, 0x8C71, // + 0x7E4D, 0x8F4A, // + 0x7E54, 0x9044, // + 0x7E55, 0x9155, // + 0x7E56, 0xE384, // + 0x7E59, 0xE386, // + 0x7E5A, 0xE387, // + 0x7E5D, 0xE383, // + 0x7E5E, 0xE385, // + 0x7E66, 0xE379, // + 0x7E67, 0xE382, // + 0x7E69, 0xE38A, // + 0x7E6A, 0xE389, // + 0x7E6D, 0x969A, // + 0x7E70, 0x8C4A, // + 0x7E79, 0xE388, // + 0x7E7B, 0xE38C, // + 0x7E7C, 0xE38B, // + 0x7E7D, 0xE38F, // + 0x7E7F, 0xE391, // + 0x7E83, 0xE38D, // + 0x7E88, 0xE392, // + 0x7E89, 0xE393, // + 0x7E8C, 0xE394, // + 0x7E8E, 0xE39A, // + 0x7E8F, 0x935A, // + 0x7E90, 0xE396, // + 0x7E92, 0xE395, // + 0x7E93, 0xE397, // + 0x7E94, 0xE398, // + 0x7E96, 0xE399, // + 0x7E9B, 0xE39B, // + 0x7E9C, 0xE39C, // + 0x7F36, 0x8ACA, // + 0x7F38, 0xE39D, // + 0x7F3A, 0xE39E, // + 0x7F45, 0xE39F, // + 0x7F4C, 0xE3A0, // + 0x7F4D, 0xE3A1, // + 0x7F4E, 0xE3A2, // + 0x7F50, 0xE3A3, // + 0x7F51, 0xE3A4, // + 0x7F54, 0xE3A6, // + 0x7F55, 0xE3A5, // + 0x7F58, 0xE3A7, // + 0x7F5F, 0xE3A8, // + 0x7F60, 0xE3A9, // + 0x7F67, 0xE3AC, // + 0x7F68, 0xE3AA, // + 0x7F69, 0xE3AB, // + 0x7F6A, 0x8DDF, // + 0x7F6B, 0x8C72, // + 0x7F6E, 0x9275, // + 0x7F70, 0x94B1, // + 0x7F72, 0x8F90, // + 0x7F75, 0x946C, // + 0x7F77, 0x94EB, // + 0x7F78, 0xE3AD, // + 0x7F79, 0x9CEB, // + 0x7F82, 0xE3AE, // + 0x7F83, 0xE3B0, // + 0x7F85, 0x9785, // + 0x7F86, 0xE3AF, // + 0x7F87, 0xE3B2, // + 0x7F88, 0xE3B1, // + 0x7F8A, 0x9772, // + 0x7F8C, 0xE3B3, // + 0x7F8E, 0x94FC, // + 0x7F94, 0xE3B4, // + 0x7F9A, 0xE3B7, // + 0x7F9D, 0xE3B6, // + 0x7F9E, 0xE3B5, // + 0x7FA3, 0xE3B8, // + 0x7FA4, 0x8C51, // + 0x7FA8, 0x9141, // + 0x7FA9, 0x8B60, // + 0x7FAE, 0xE3BC, // + 0x7FAF, 0xE3B9, // + 0x7FB2, 0xE3BA, // + 0x7FB6, 0xE3BD, // + 0x7FB8, 0xE3BE, // + 0x7FB9, 0xE3BB, // + 0x7FBD, 0x8948, // + 0x7FC1, 0x89A5, // + 0x7FC5, 0xE3C0, // + 0x7FC6, 0xE3C1, // + 0x7FCA, 0xE3C2, // + 0x7FCC, 0x9782, // + 0x7FD2, 0x8F4B, // + 0x7FD4, 0xE3C4, // + 0x7FD5, 0xE3C3, // + 0x7FE0, 0x9089, // + 0x7FE1, 0xE3C5, // + 0x7FE6, 0xE3C6, // + 0x7FE9, 0xE3C7, // + 0x7FEB, 0x8AE3, // + 0x7FF0, 0x8ACB, // + 0x7FF3, 0xE3C8, // + 0x7FF9, 0xE3C9, // + 0x7FFB, 0x967C, // + 0x7FFC, 0x9783, // + 0x8000, 0x9773, // + 0x8001, 0x9856, // + 0x8003, 0x8D6C, // + 0x8004, 0xE3CC, // + 0x8005, 0x8ED2, // + 0x8006, 0xE3CB, // + 0x800B, 0xE3CD, // + 0x800C, 0x8EA7, // + 0x8010, 0x91CF, // + 0x8012, 0xE3CE, // + 0x8015, 0x8D6B, // + 0x8017, 0x96D5, // + 0x8018, 0xE3CF, // + 0x8019, 0xE3D0, // + 0x801C, 0xE3D1, // + 0x8021, 0xE3D2, // + 0x8028, 0xE3D3, // + 0x8033, 0x8EA8, // + 0x8036, 0x96EB, // + 0x803B, 0xE3D5, // + 0x803D, 0x925E, // + 0x803F, 0xE3D4, // + 0x8046, 0xE3D7, // + 0x804A, 0xE3D6, // + 0x8052, 0xE3D8, // + 0x8056, 0x90B9, // + 0x8058, 0xE3D9, // + 0x805A, 0xE3DA, // + 0x805E, 0x95B7, // + 0x805F, 0xE3DB, // + 0x8061, 0x918F, // + 0x8062, 0xE3DC, // + 0x8068, 0xE3DD, // + 0x806F, 0x97FC, // + 0x8070, 0xE3E0, // + 0x8072, 0xE3DF, // + 0x8073, 0xE3DE, // + 0x8074, 0x92AE, // + 0x8076, 0xE3E1, // + 0x8077, 0x9045, // + 0x8079, 0xE3E2, // + 0x807D, 0xE3E3, // + 0x807E, 0x9857, // + 0x807F, 0xE3E4, // + 0x8084, 0xE3E5, // + 0x8085, 0xE3E7, // + 0x8086, 0xE3E6, // + 0x8087, 0x94A3, // + 0x8089, 0x93F7, // + 0x808B, 0x985D, // + 0x808C, 0x94A7, // + 0x8093, 0xE3E9, // + 0x8096, 0x8FD1, // + 0x8098, 0x9549, // + 0x809A, 0xE3EA, // + 0x809B, 0xE3E8, // + 0x809D, 0x8ACC, // + 0x80A1, 0x8CD2, // + 0x80A2, 0x8E88, // + 0x80A5, 0x94EC, // + 0x80A9, 0x8CA8, // + 0x80AA, 0x9662, // + 0x80AC, 0xE3ED, // + 0x80AD, 0xE3EB, // + 0x80AF, 0x8D6D, // + 0x80B1, 0x8D6E, // + 0x80B2, 0x88E7, // + 0x80B4, 0x8DE6, // + 0x80BA, 0x9478, // + 0x80C3, 0x88DD, // + 0x80C4, 0xE3F2, // + 0x80C6, 0x925F, // + 0x80CC, 0x9477, // + 0x80CE, 0x91D9, // + 0x80D6, 0xE3F4, // + 0x80D9, 0xE3F0, // + 0x80DA, 0xE3F3, // + 0x80DB, 0xE3EE, // + 0x80DD, 0xE3F1, // + 0x80DE, 0x9645, // + 0x80E1, 0x8CD3, // + 0x80E4, 0x88FB, // + 0x80E5, 0xE3EF, // + 0x80EF, 0xE3F6, // + 0x80F1, 0xE3F7, // + 0x80F4, 0x93B7, // + 0x80F8, 0x8BB9, // + 0x80FC, 0xE445, // + 0x80FD, 0x945C, // + 0x8102, 0x8E89, // + 0x8105, 0x8BBA, // + 0x8106, 0x90C6, // + 0x8107, 0x9865, // + 0x8108, 0x96AC, // + 0x8109, 0xE3F5, // + 0x810A, 0x90D2, // + 0x811A, 0x8B72, // + 0x811B, 0xE3F8, // + 0x8123, 0xE3FA, // + 0x8129, 0xE3F9, // + 0x812F, 0xE3FB, // + 0x8131, 0x9245, // + 0x8133, 0x945D, // + 0x8139, 0x92AF, // + 0x813E, 0xE442, // + 0x8146, 0xE441, // + 0x814B, 0xE3FC, // + 0x814E, 0x9074, // + 0x8150, 0x9585, // + 0x8151, 0xE444, // + 0x8153, 0xE443, // + 0x8154, 0x8D6F, // + 0x8155, 0x9872, // + 0x815F, 0xE454, // + 0x8165, 0xE448, // + 0x8166, 0xE449, // + 0x816B, 0x8EEE, // + 0x816E, 0xE447, // + 0x8170, 0x8D98, // + 0x8171, 0xE446, // + 0x8174, 0xE44A, // + 0x8178, 0x92B0, // + 0x8179, 0x95A0, // + 0x817A, 0x9142, // + 0x817F, 0x91DA, // + 0x8180, 0xE44E, // + 0x8182, 0xE44F, // + 0x8183, 0xE44B, // + 0x8188, 0xE44C, // + 0x818A, 0xE44D, // + 0x818F, 0x8D70, // + 0x8193, 0xE455, // + 0x8195, 0xE451, // + 0x819A, 0x9586, // + 0x819C, 0x968C, // + 0x819D, 0x9547, // + 0x81A0, 0xE450, // + 0x81A3, 0xE453, // + 0x81A4, 0xE452, // + 0x81A8, 0x9663, // + 0x81A9, 0xE456, // + 0x81B0, 0xE457, // + 0x81B3, 0x9156, // + 0x81B5, 0xE458, // + 0x81B8, 0xE45A, // + 0x81BA, 0xE45E, // + 0x81BE, 0xE459, // + 0x81BF, 0x945E, // + 0x81C0, 0xE45C, // + 0x81C2, 0xE45D, // + 0x81C6, 0x89B0, // + 0x81C8, 0xE464, // + 0x81C9, 0xE45F, // + 0x81CD, 0xE460, // + 0x81D1, 0xE461, // + 0x81D3, 0x919F, // + 0x81D8, 0xE463, // + 0x81D9, 0xE462, // + 0x81DA, 0xE465, // + 0x81DF, 0xE466, // + 0x81E0, 0xE467, // + 0x81E3, 0x9062, // + 0x81E5, 0x89E7, // + 0x81E7, 0xE468, // + 0x81E8, 0x97D5, // + 0x81EA, 0x8EA9, // + 0x81ED, 0x8F4C, // + 0x81F3, 0x8E8A, // + 0x81F4, 0x9276, // + 0x81FA, 0xE469, // + 0x81FB, 0xE46A, // + 0x81FC, 0x8950, // + 0x81FE, 0xE46B, // + 0x8201, 0xE46C, // + 0x8202, 0xE46D, // + 0x8205, 0xE46E, // + 0x8207, 0xE46F, // + 0x8208, 0x8BBB, // + 0x8209, 0x9DA8, // + 0x820A, 0xE470, // + 0x820C, 0x90E3, // + 0x820D, 0xE471, // + 0x820E, 0x8EC9, // + 0x8210, 0xE472, // + 0x8212, 0x98AE, // + 0x8216, 0xE473, // + 0x8217, 0x95DC, // + 0x8218, 0x8ADA, // + 0x821B, 0x9143, // + 0x821C, 0x8F77, // + 0x821E, 0x9591, // + 0x821F, 0x8F4D, // + 0x8229, 0xE474, // + 0x822A, 0x8D71, // + 0x822B, 0xE475, // + 0x822C, 0x94CA, // + 0x822E, 0xE484, // + 0x8233, 0xE477, // + 0x8235, 0x91C7, // + 0x8236, 0x9495, // + 0x8237, 0x8CBD, // + 0x8238, 0xE476, // + 0x8239, 0x9144, // + 0x8240, 0xE478, // + 0x8247, 0x92F8, // + 0x8258, 0xE47A, // + 0x8259, 0xE479, // + 0x825A, 0xE47C, // + 0x825D, 0xE47B, // + 0x825F, 0xE47D, // + 0x8262, 0xE480, // + 0x8264, 0xE47E, // + 0x8266, 0x8ACD, // + 0x8268, 0xE481, // + 0x826A, 0xE482, // + 0x826B, 0xE483, // + 0x826E, 0x8DAF, // + 0x826F, 0x97C7, // + 0x8271, 0xE485, // + 0x8272, 0x9046, // + 0x8276, 0x8990, // + 0x8277, 0xE486, // + 0x8278, 0xE487, // + 0x827E, 0xE488, // + 0x828B, 0x88F0, // + 0x828D, 0xE489, // + 0x8292, 0xE48A, // + 0x8299, 0x9587, // + 0x829D, 0x8EC5, // + 0x829F, 0xE48C, // + 0x82A5, 0x8A48, // + 0x82A6, 0x88B0, // + 0x82AB, 0xE48B, // + 0x82AC, 0xE48E, // + 0x82AD, 0x946D, // + 0x82AF, 0x9063, // + 0x82B1, 0x89D4, // + 0x82B3, 0x9646, // + 0x82B8, 0x8C7C, // + 0x82B9, 0x8BDA, // + 0x82BB, 0xE48D, // + 0x82BD, 0x89E8, // + 0x82C5, 0x8AA1, // + 0x82D1, 0x8991, // + 0x82D2, 0xE492, // + 0x82D3, 0x97E8, // + 0x82D4, 0x91DB, // + 0x82D7, 0x9563, // + 0x82D9, 0xE49E, // + 0x82DB, 0x89D5, // + 0x82DC, 0xE49C, // + 0x82DE, 0xE49A, // + 0x82DF, 0xE491, // + 0x82E1, 0xE48F, // + 0x82E3, 0xE490, // + 0x82E5, 0x8EE1, // + 0x82E6, 0x8BEA, // + 0x82E7, 0x9297, // + 0x82EB, 0x93CF, // + 0x82F1, 0x8970, // + 0x82F3, 0xE494, // + 0x82F4, 0xE493, // + 0x82F9, 0xE499, // + 0x82FA, 0xE495, // + 0x82FB, 0xE498, // + 0x8302, 0x96CE, // + 0x8303, 0xE497, // + 0x8304, 0x89D6, // + 0x8305, 0x8A9D, // + 0x8306, 0xE49B, // + 0x8309, 0xE49D, // + 0x830E, 0x8C73, // + 0x8316, 0xE4A1, // + 0x8317, 0xE4AA, // + 0x8318, 0xE4AB, // + 0x831C, 0x88A9, // + 0x8323, 0xE4B2, // + 0x8328, 0x88EF, // + 0x832B, 0xE4A9, // + 0x832F, 0xE4A8, // + 0x8331, 0xE4A3, // + 0x8332, 0xE4A2, // + 0x8334, 0xE4A0, // + 0x8335, 0xE49F, // + 0x8336, 0x9283, // + 0x8338, 0x91F9, // + 0x8339, 0xE4A5, // + 0x8340, 0xE4A4, // + 0x8345, 0xE4A7, // + 0x8349, 0x9190, // + 0x834A, 0x8C74, // + 0x834F, 0x8960, // + 0x8350, 0xE4A6, // + 0x8352, 0x8D72, // + 0x8358, 0x9191, // + 0x8373, 0xE4B8, // + 0x8375, 0xE4B9, // + 0x8377, 0x89D7, // + 0x837B, 0x89AC, // + 0x837C, 0xE4B6, // + 0x8385, 0xE4AC, // + 0x8387, 0xE4B4, // + 0x8389, 0xE4BB, // + 0x838A, 0xE4B5, // + 0x838E, 0xE4B3, // + 0x8393, 0xE496, // + 0x8396, 0xE4B1, // + 0x839A, 0xE4AD, // + 0x839E, 0x8ACE, // + 0x839F, 0xE4AF, // + 0x83A0, 0xE4BA, // + 0x83A2, 0xE4B0, // + 0x83A8, 0xE4BC, // + 0x83AA, 0xE4AE, // + 0x83AB, 0x949C, // + 0x83B1, 0x9789, // + 0x83B5, 0xE4B7, // + 0x83BD, 0xE4CD, // + 0x83C1, 0xE4C5, // + 0x83C5, 0x909B, // + 0x83CA, 0x8B65, // + 0x83CC, 0x8BDB, // + 0x83CE, 0xE4C0, // + 0x83D3, 0x89D9, // + 0x83D6, 0x8FD2, // + 0x83D8, 0xE4C3, // + 0x83DC, 0x8DD8, // + 0x83DF, 0x9370, // + 0x83E0, 0xE4C8, // + 0x83E9, 0x95EC, // + 0x83EB, 0xE4BF, // + 0x83EF, 0x89D8, // + 0x83F0, 0x8CD4, // + 0x83F1, 0x9548, // + 0x83F2, 0xE4C9, // + 0x83F4, 0xE4BD, // + 0x83F7, 0xE4C6, // + 0x83FB, 0xE4D0, // + 0x83FD, 0xE4C1, // + 0x8403, 0xE4C2, // + 0x8404, 0x93B8, // + 0x8407, 0xE4C7, // + 0x840B, 0xE4C4, // + 0x840C, 0x9647, // + 0x840D, 0xE4CA, // + 0x840E, 0x88DE, // + 0x8413, 0xE4BE, // + 0x8420, 0xE4CC, // + 0x8422, 0xE4CB, // + 0x8429, 0x948B, // + 0x842A, 0xE4D2, // + 0x842C, 0xE4DD, // + 0x8431, 0x8A9E, // + 0x8435, 0xE4E0, // + 0x8438, 0xE4CE, // + 0x843C, 0xE4D3, // + 0x843D, 0x978E, // + 0x8446, 0xE4DC, // + 0x8449, 0x9774, // + 0x844E, 0x97A8, // + 0x8457, 0x9298, // + 0x845B, 0x8A8B, // + 0x8461, 0x9592, // + 0x8462, 0xE4E2, // + 0x8463, 0x939F, // + 0x8466, 0x88AF, // + 0x8469, 0xE4DB, // + 0x846B, 0xE4D7, // + 0x846C, 0x9192, // + 0x846D, 0xE4D1, // + 0x846E, 0xE4D9, // + 0x846F, 0xE4DE, // + 0x8471, 0x944B, // + 0x8475, 0x88A8, // + 0x8477, 0xE4D6, // + 0x8479, 0xE4DF, // + 0x847A, 0x9598, // + 0x8482, 0xE4DA, // + 0x8484, 0xE4D5, // + 0x848B, 0x8FD3, // + 0x8490, 0x8F4E, // + 0x8494, 0x8EAA, // + 0x8499, 0x96D6, // + 0x849C, 0x9566, // + 0x849F, 0xE4E5, // + 0x84A1, 0xE4EE, // + 0x84AD, 0xE4D8, // + 0x84B2, 0x8A97, // + 0x84B8, 0x8FF6, // + 0x84B9, 0xE4E3, // + 0x84BB, 0xE4E8, // + 0x84BC, 0x9193, // + 0x84BF, 0xE4E4, // + 0x84C1, 0xE4EB, // + 0x84C4, 0x927E, // + 0x84C6, 0xE4EC, // + 0x84C9, 0x9775, // + 0x84CA, 0xE4E1, // + 0x84CB, 0x8A57, // + 0x84CD, 0xE4E7, // + 0x84D0, 0xE4EA, // + 0x84D1, 0x96AA, // + 0x84D6, 0xE4ED, // + 0x84D9, 0xE4E6, // + 0x84DA, 0xE4E9, // + 0x84EC, 0x9648, // + 0x84EE, 0x9840, // + 0x84F4, 0xE4F1, // + 0x84FC, 0xE4F8, // + 0x84FF, 0xE4F0, // + 0x8500, 0x8EC1, // + 0x8506, 0xE4CF, // + 0x8511, 0x95CC, // + 0x8513, 0x96A0, // + 0x8514, 0xE4F7, // + 0x8515, 0xE4F6, // + 0x8517, 0xE4F2, // + 0x8518, 0xE4F3, // + 0x851A, 0x8955, // + 0x851F, 0xE4F5, // + 0x8521, 0xE4EF, // + 0x8526, 0x92D3, // + 0x852C, 0xE4F4, // + 0x852D, 0x88FC, // + 0x8535, 0x91A0, // + 0x853D, 0x95C1, // + 0x8540, 0xE4F9, // + 0x8541, 0xE540, // + 0x8543, 0x94D7, // + 0x8548, 0xE4FC, // + 0x8549, 0x8FD4, // + 0x854A, 0x8EC7, // + 0x854B, 0xE542, // + 0x854E, 0x8BBC, // + 0x8555, 0xE543, // + 0x8557, 0x9599, // + 0x8558, 0xE4FB, // + 0x855A, 0xE4D4, // + 0x8563, 0xE4FA, // + 0x8568, 0x986E, // + 0x8569, 0x93A0, // + 0x856A, 0x9593, // + 0x856D, 0xE54A, // + 0x8577, 0xE550, // + 0x857E, 0xE551, // + 0x8580, 0xE544, // + 0x8584, 0x9496, // + 0x8587, 0xE54E, // + 0x8588, 0xE546, // + 0x858A, 0xE548, // + 0x8590, 0xE552, // + 0x8591, 0xE547, // + 0x8594, 0xE54B, // + 0x8597, 0x8992, // + 0x8599, 0x93E3, // + 0x859B, 0xE54C, // + 0x859C, 0xE54F, // + 0x85A4, 0xE545, // + 0x85A6, 0x9145, // + 0x85A8, 0xE549, // + 0x85A9, 0x8E46, // + 0x85AA, 0x9064, // + 0x85AB, 0x8C4F, // + 0x85AC, 0x96F2, // + 0x85AE, 0x96F7, // + 0x85AF, 0x8F92, // + 0x85B9, 0xE556, // + 0x85BA, 0xE554, // + 0x85C1, 0x986D, // + 0x85C9, 0xE553, // + 0x85CD, 0x9795, // + 0x85CF, 0xE555, // + 0x85D0, 0xE557, // + 0x85D5, 0xE558, // + 0x85DD, 0xE559, // + 0x85E4, 0x93A1, // + 0x85E5, 0xE55A, // + 0x85E9, 0x94CB, // + 0x85EA, 0xE54D, // + 0x85F7, 0x8F93, // + 0x85F9, 0xE55C, // + 0x85FA, 0xE561, // + 0x85FB, 0x9194, // + 0x85FE, 0xE560, // + 0x8602, 0xE541, // + 0x8606, 0xE562, // + 0x8607, 0x9168, // + 0x860A, 0xE55D, // + 0x860B, 0xE55F, // + 0x8613, 0xE55E, // + 0x8616, 0x9F50, // + 0x8617, 0x9F41, // + 0x861A, 0xE564, // + 0x8622, 0xE563, // + 0x862D, 0x9796, // + 0x862F, 0xE1BA, // + 0x8630, 0xE565, // + 0x863F, 0xE566, // + 0x864D, 0xE567, // + 0x864E, 0x8CD5, // + 0x8650, 0x8B73, // + 0x8654, 0xE569, // + 0x8655, 0x997C, // + 0x865A, 0x8B95, // + 0x865C, 0x97B8, // + 0x865E, 0x8BF1, // + 0x865F, 0xE56A, // + 0x8667, 0xE56B, // + 0x866B, 0x928E, // + 0x8671, 0xE56C, // + 0x8679, 0x93F8, // + 0x867B, 0x88B8, // + 0x868A, 0x89E1, // + 0x868B, 0xE571, // + 0x868C, 0xE572, // + 0x8693, 0xE56D, // + 0x8695, 0x8E5C, // + 0x86A3, 0xE56E, // + 0x86A4, 0x9461, // + 0x86A9, 0xE56F, // + 0x86AA, 0xE570, // + 0x86AB, 0xE57A, // + 0x86AF, 0xE574, // + 0x86B0, 0xE577, // + 0x86B6, 0xE573, // + 0x86C4, 0xE575, // + 0x86C6, 0xE576, // + 0x86C7, 0x8ED6, // + 0x86C9, 0xE578, // + 0x86CB, 0x9260, // + 0x86CD, 0x8C75, // + 0x86CE, 0x8A61, // + 0x86D4, 0xE57B, // + 0x86D9, 0x8A5E, // + 0x86DB, 0xE581, // + 0x86DE, 0xE57C, // + 0x86DF, 0xE580, // + 0x86E4, 0x94B8, // + 0x86E9, 0xE57D, // + 0x86EC, 0xE57E, // + 0x86ED, 0x9567, // + 0x86EE, 0x94D8, // + 0x86EF, 0xE582, // + 0x86F8, 0x91FB, // + 0x86F9, 0xE58C, // + 0x86FB, 0xE588, // + 0x86FE, 0x89E9, // + 0x8700, 0xE586, // + 0x8702, 0x9649, // + 0x8703, 0xE587, // + 0x8706, 0xE584, // + 0x8708, 0xE585, // + 0x8709, 0xE58A, // + 0x870A, 0xE58D, // + 0x870D, 0xE58B, // + 0x8711, 0xE589, // + 0x8712, 0xE583, // + 0x8718, 0x9277, // + 0x871A, 0xE594, // + 0x871C, 0x96A8, // + 0x8725, 0xE592, // + 0x8729, 0xE593, // + 0x8734, 0xE58E, // + 0x8737, 0xE590, // + 0x873B, 0xE591, // + 0x873F, 0xE58F, // + 0x8749, 0x90E4, // + 0x874B, 0x9858, // + 0x874C, 0xE598, // + 0x874E, 0xE599, // + 0x8753, 0xE59F, // + 0x8755, 0x9049, // + 0x8757, 0xE59B, // + 0x8759, 0xE59E, // + 0x875F, 0xE596, // + 0x8760, 0xE595, // + 0x8763, 0xE5A0, // + 0x8766, 0x89DA, // + 0x8768, 0xE59C, // + 0x876A, 0xE5A1, // + 0x876E, 0xE59D, // + 0x8774, 0xE59A, // + 0x8776, 0x92B1, // + 0x8778, 0xE597, // + 0x877F, 0x9488, // + 0x8782, 0xE5A5, // + 0x878D, 0x975A, // + 0x879F, 0xE5A4, // + 0x87A2, 0xE5A3, // + 0x87AB, 0xE5AC, // + 0x87AF, 0xE5A6, // + 0x87B3, 0xE5AE, // + 0x87BA, 0x9786, // + 0x87BB, 0xE5B1, // + 0x87BD, 0xE5A8, // + 0x87C0, 0xE5A9, // + 0x87C4, 0xE5AD, // + 0x87C6, 0xE5B0, // + 0x87C7, 0xE5AF, // + 0x87CB, 0xE5A7, // + 0x87D0, 0xE5AA, // + 0x87D2, 0xE5BB, // + 0x87E0, 0xE5B4, // + 0x87EF, 0xE5B2, // + 0x87F2, 0xE5B3, // + 0x87F6, 0xE5B8, // + 0x87F7, 0xE5B9, // + 0x87F9, 0x8A49, // + 0x87FB, 0x8B61, // + 0x87FE, 0xE5B7, // + 0x8805, 0xE5A2, // + 0x880D, 0xE5B6, // + 0x880E, 0xE5BA, // + 0x880F, 0xE5B5, // + 0x8811, 0xE5BC, // + 0x8815, 0xE5BE, // + 0x8816, 0xE5BD, // + 0x8821, 0xE5C0, // + 0x8822, 0xE5BF, // + 0x8823, 0xE579, // + 0x8827, 0xE5C4, // + 0x8831, 0xE5C1, // + 0x8836, 0xE5C2, // + 0x8839, 0xE5C3, // + 0x883B, 0xE5C5, // + 0x8840, 0x8C8C, // + 0x8842, 0xE5C7, // + 0x8844, 0xE5C6, // + 0x8846, 0x8F4F, // + 0x884C, 0x8D73, // + 0x884D, 0x9FA5, // + 0x8852, 0xE5C8, // + 0x8853, 0x8F70, // + 0x8857, 0x8A58, // + 0x8859, 0xE5C9, // + 0x885B, 0x8971, // + 0x885D, 0x8FD5, // + 0x885E, 0xE5CA, // + 0x8861, 0x8D74, // + 0x8862, 0xE5CB, // + 0x8863, 0x88DF, // + 0x8868, 0x955C, // + 0x886B, 0xE5CC, // + 0x8870, 0x908A, // + 0x8872, 0xE5D3, // + 0x8875, 0xE5D0, // + 0x8877, 0x928F, // + 0x887D, 0xE5D1, // + 0x887E, 0xE5CE, // + 0x887F, 0x8BDC, // + 0x8881, 0xE5CD, // + 0x8882, 0xE5D4, // + 0x8888, 0x8C55, // + 0x888B, 0x91DC, // + 0x888D, 0xE5DA, // + 0x8892, 0xE5D6, // + 0x8896, 0x91B3, // + 0x8897, 0xE5D5, // + 0x8899, 0xE5D8, // + 0x889E, 0xE5CF, // + 0x88A2, 0xE5D9, // + 0x88A4, 0xE5DB, // + 0x88AB, 0x94ED, // + 0x88AE, 0xE5D7, // + 0x88B0, 0xE5DC, // + 0x88B1, 0xE5DE, // + 0x88B4, 0x8CD1, // + 0x88B5, 0xE5D2, // + 0x88B7, 0x88BF, // + 0x88BF, 0xE5DD, // + 0x88C1, 0x8DD9, // + 0x88C2, 0x97F4, // + 0x88C3, 0xE5DF, // + 0x88C4, 0xE5E0, // + 0x88C5, 0x9195, // + 0x88CF, 0x97A0, // + 0x88D4, 0xE5E1, // + 0x88D5, 0x9754, // + 0x88D8, 0xE5E2, // + 0x88D9, 0xE5E3, // + 0x88DC, 0x95E2, // + 0x88DD, 0xE5E4, // + 0x88DF, 0x8DBE, // + 0x88E1, 0x97A1, // + 0x88E8, 0xE5E9, // + 0x88F2, 0xE5EA, // + 0x88F3, 0x8FD6, // + 0x88F4, 0xE5E8, // + 0x88F8, 0x9787, // + 0x88F9, 0xE5E5, // + 0x88FC, 0xE5E7, // + 0x88FD, 0x90BB, // + 0x88FE, 0x909E, // + 0x8902, 0xE5E6, // + 0x8904, 0xE5EB, // + 0x8907, 0x95A1, // + 0x890A, 0xE5ED, // + 0x890C, 0xE5EC, // + 0x8910, 0x8A8C, // + 0x8912, 0x964A, // + 0x8913, 0xE5EE, // + 0x891D, 0xE5FA, // + 0x891E, 0xE5F0, // + 0x8925, 0xE5F1, // + 0x892A, 0xE5F2, // + 0x892B, 0xE5F3, // + 0x8936, 0xE5F7, // + 0x8938, 0xE5F8, // + 0x893B, 0xE5F6, // + 0x8941, 0xE5F4, // + 0x8943, 0xE5EF, // + 0x8944, 0xE5F5, // + 0x894C, 0xE5F9, // + 0x894D, 0xE8B5, // + 0x8956, 0x89A6, // + 0x895E, 0xE5FC, // + 0x895F, 0x8BDD, // + 0x8960, 0xE5FB, // + 0x8964, 0xE641, // + 0x8966, 0xE640, // + 0x896A, 0xE643, // + 0x896D, 0xE642, // + 0x896F, 0xE644, // + 0x8972, 0x8F50, // + 0x8974, 0xE645, // + 0x8977, 0xE646, // + 0x897E, 0xE647, // + 0x897F, 0x90BC, // + 0x8981, 0x9776, // + 0x8983, 0xE648, // + 0x8986, 0x95A2, // + 0x8987, 0x9465, // + 0x8988, 0xE649, // + 0x898A, 0xE64A, // + 0x898B, 0x8CA9, // + 0x898F, 0x8B4B, // + 0x8993, 0xE64B, // + 0x8996, 0x8E8B, // + 0x8997, 0x9460, // + 0x8998, 0xE64C, // + 0x899A, 0x8A6F, // + 0x89A1, 0xE64D, // + 0x89A6, 0xE64F, // + 0x89A7, 0x9797, // + 0x89A9, 0xE64E, // + 0x89AA, 0x9065, // + 0x89AC, 0xE650, // + 0x89AF, 0xE651, // + 0x89B2, 0xE652, // + 0x89B3, 0x8ACF, // + 0x89BA, 0xE653, // + 0x89BD, 0xE654, // + 0x89BF, 0xE655, // + 0x89C0, 0xE656, // + 0x89D2, 0x8A70, // + 0x89DA, 0xE657, // + 0x89DC, 0xE658, // + 0x89DD, 0xE659, // + 0x89E3, 0x89F0, // + 0x89E6, 0x9047, // + 0x89E7, 0xE65A, // + 0x89F8, 0xE65C, // + 0x8A00, 0x8CBE, // + 0x8A02, 0x92F9, // + 0x8A03, 0xE65D, // + 0x8A08, 0x8C76, // + 0x8A0A, 0x9075, // + 0x8A0C, 0xE660, // + 0x8A0E, 0x93A2, // + 0x8A10, 0xE65F, // + 0x8A13, 0x8C50, // + 0x8A16, 0xE65E, // + 0x8A17, 0x91F5, // + 0x8A18, 0x8B4C, // + 0x8A1B, 0xE661, // + 0x8A1D, 0xE662, // + 0x8A1F, 0x8FD7, // + 0x8A23, 0x8C8D, // + 0x8A25, 0xE663, // + 0x8A2A, 0x964B, // + 0x8A2D, 0x90DD, // + 0x8A31, 0x8B96, // + 0x8A33, 0x96F3, // + 0x8A34, 0x9169, // + 0x8A36, 0xE664, // + 0x8A3A, 0x9066, // + 0x8A3B, 0x9290, // + 0x8A3C, 0x8FD8, // + 0x8A41, 0xE665, // + 0x8A46, 0xE668, // + 0x8A48, 0xE669, // + 0x8A50, 0x8DBC, // + 0x8A51, 0x91C0, // + 0x8A52, 0xE667, // + 0x8A54, 0x8FD9, // + 0x8A55, 0x955D, // + 0x8A5B, 0xE666, // + 0x8A5E, 0x8E8C, // + 0x8A60, 0x8972, // + 0x8A62, 0xE66D, // + 0x8A63, 0x8C77, // + 0x8A66, 0x8E8E, // + 0x8A69, 0x8E8D, // + 0x8A6B, 0x986C, // + 0x8A6C, 0xE66C, // + 0x8A6D, 0xE66B, // + 0x8A6E, 0x9146, // + 0x8A70, 0x8B6C, // + 0x8A71, 0x9862, // + 0x8A72, 0x8A59, // + 0x8A73, 0x8FDA, // + 0x8A7C, 0xE66A, // + 0x8A82, 0xE66F, // + 0x8A84, 0xE670, // + 0x8A85, 0xE66E, // + 0x8A87, 0x8CD6, // + 0x8A89, 0x975F, // + 0x8A8C, 0x8E8F, // + 0x8A8D, 0x9446, // + 0x8A91, 0xE673, // + 0x8A93, 0x90BE, // + 0x8A95, 0x9261, // + 0x8A98, 0x9755, // + 0x8A9A, 0xE676, // + 0x8A9E, 0x8CEA, // + 0x8AA0, 0x90BD, // + 0x8AA1, 0xE672, // + 0x8AA3, 0xE677, // + 0x8AA4, 0x8CEB, // + 0x8AA5, 0xE674, // + 0x8AA6, 0xE675, // + 0x8AA8, 0xE671, // + 0x8AAC, 0x90E0, // + 0x8AAD, 0x93C7, // + 0x8AB0, 0x924E, // + 0x8AB2, 0x89DB, // + 0x8AB9, 0x94EE, // + 0x8ABC, 0x8B62, // + 0x8ABF, 0x92B2, // + 0x8AC2, 0xE67A, // + 0x8AC4, 0xE678, // + 0x8AC7, 0x926B, // + 0x8ACB, 0x90BF, // + 0x8ACC, 0x8AD0, // + 0x8ACD, 0xE679, // + 0x8ACF, 0x907A, // + 0x8AD2, 0x97C8, // + 0x8AD6, 0x985F, // + 0x8ADA, 0xE67B, // + 0x8ADB, 0xE687, // + 0x8ADC, 0x92B3, // + 0x8ADE, 0xE686, // + 0x8AE0, 0xE683, // + 0x8AE1, 0xE68B, // + 0x8AE2, 0xE684, // + 0x8AE4, 0xE680, // + 0x8AE6, 0x92FA, // + 0x8AE7, 0xE67E, // + 0x8AEB, 0xE67C, // + 0x8AED, 0x9740, // + 0x8AEE, 0x8E90, // + 0x8AF1, 0xE681, // + 0x8AF3, 0xE67D, // + 0x8AF7, 0xE685, // + 0x8AF8, 0x8F94, // + 0x8AFA, 0x8CBF, // + 0x8AFE, 0x91F8, // + 0x8B00, 0x9664, // + 0x8B01, 0x8979, // + 0x8B02, 0x88E0, // + 0x8B04, 0x93A3, // + 0x8B07, 0xE689, // + 0x8B0C, 0xE688, // + 0x8B0E, 0x93E4, // + 0x8B10, 0xE68D, // + 0x8B14, 0xE682, // + 0x8B16, 0xE68C, // + 0x8B17, 0xE68E, // + 0x8B19, 0x8CAA, // + 0x8B1A, 0xE68A, // + 0x8B1B, 0x8D75, // + 0x8B1D, 0x8ED3, // + 0x8B20, 0xE68F, // + 0x8B21, 0x9777, // + 0x8B26, 0xE692, // + 0x8B28, 0xE695, // + 0x8B2B, 0xE693, // + 0x8B2C, 0x9554, // + 0x8B33, 0xE690, // + 0x8B39, 0x8BDE, // + 0x8B3E, 0xE694, // + 0x8B41, 0xE696, // + 0x8B49, 0xE69A, // + 0x8B4C, 0xE697, // + 0x8B4E, 0xE699, // + 0x8B4F, 0xE698, // + 0x8B56, 0xE69B, // + 0x8B58, 0x8EAF, // + 0x8B5A, 0xE69D, // + 0x8B5B, 0xE69C, // + 0x8B5C, 0x9588, // + 0x8B5F, 0xE69F, // + 0x8B66, 0x8C78, // + 0x8B6B, 0xE69E, // + 0x8B6C, 0xE6A0, // + 0x8B6F, 0xE6A1, // + 0x8B70, 0x8B63, // + 0x8B71, 0xE3BF, // + 0x8B72, 0x8FF7, // + 0x8B74, 0xE6A2, // + 0x8B77, 0x8CEC, // + 0x8B7D, 0xE6A3, // + 0x8B80, 0xE6A4, // + 0x8B83, 0x8E5D, // + 0x8B8A, 0x9DCC, // + 0x8B8C, 0xE6A5, // + 0x8B8E, 0xE6A6, // + 0x8B90, 0x8F51, // + 0x8B92, 0xE6A7, // + 0x8B93, 0xE6A8, // + 0x8B96, 0xE6A9, // + 0x8B99, 0xE6AA, // + 0x8B9A, 0xE6AB, // + 0x8C37, 0x924A, // + 0x8C3A, 0xE6AC, // + 0x8C3F, 0xE6AE, // + 0x8C41, 0xE6AD, // + 0x8C46, 0x93A4, // + 0x8C48, 0xE6AF, // + 0x8C4A, 0x964C, // + 0x8C4C, 0xE6B0, // + 0x8C4E, 0xE6B1, // + 0x8C50, 0xE6B2, // + 0x8C55, 0xE6B3, // + 0x8C5A, 0x93D8, // + 0x8C61, 0x8FDB, // + 0x8C62, 0xE6B4, // + 0x8C6A, 0x8D8B, // + 0x8C6B, 0x98AC, // + 0x8C6C, 0xE6B5, // + 0x8C78, 0xE6B6, // + 0x8C79, 0x955E, // + 0x8C7A, 0xE6B7, // + 0x8C7C, 0xE6BF, // + 0x8C82, 0xE6B8, // + 0x8C85, 0xE6BA, // + 0x8C89, 0xE6B9, // + 0x8C8A, 0xE6BB, // + 0x8C8C, 0x9665, // + 0x8C8D, 0xE6BC, // + 0x8C8E, 0xE6BD, // + 0x8C94, 0xE6BE, // + 0x8C98, 0xE6C0, // + 0x8C9D, 0x8A4C, // + 0x8C9E, 0x92E5, // + 0x8CA0, 0x9589, // + 0x8CA1, 0x8DE0, // + 0x8CA2, 0x8D76, // + 0x8CA7, 0x956E, // + 0x8CA8, 0x89DD, // + 0x8CA9, 0x94CC, // + 0x8CAA, 0xE6C3, // + 0x8CAB, 0x8AD1, // + 0x8CAC, 0x90D3, // + 0x8CAD, 0xE6C2, // + 0x8CAE, 0xE6C7, // + 0x8CAF, 0x9299, // + 0x8CB0, 0x96E1, // + 0x8CB2, 0xE6C5, // + 0x8CB3, 0xE6C6, // + 0x8CB4, 0x8B4D, // + 0x8CB6, 0xE6C8, // + 0x8CB7, 0x9483, // + 0x8CB8, 0x91DD, // + 0x8CBB, 0x94EF, // + 0x8CBC, 0x935C, // + 0x8CBD, 0xE6C4, // + 0x8CBF, 0x9666, // + 0x8CC0, 0x89EA, // + 0x8CC1, 0xE6CA, // + 0x8CC2, 0x9847, // + 0x8CC3, 0x92C0, // + 0x8CC4, 0x9864, // + 0x8CC7, 0x8E91, // + 0x8CC8, 0xE6C9, // + 0x8CCA, 0x91AF, // + 0x8CCD, 0xE6DA, // + 0x8CCE, 0x9147, // + 0x8CD1, 0x93F6, // + 0x8CD3, 0x956F, // + 0x8CDA, 0xE6CD, // + 0x8CDB, 0x8E5E, // + 0x8CDC, 0x8E92, // + 0x8CDE, 0x8FDC, // + 0x8CE0, 0x9485, // + 0x8CE2, 0x8CAB, // + 0x8CE3, 0xE6CC, // + 0x8CE4, 0xE6CB, // + 0x8CE6, 0x958A, // + 0x8CEA, 0x8EBF, // + 0x8CED, 0x9371, // + 0x8CFA, 0xE6CF, // + 0x8CFB, 0xE6D0, // + 0x8CFC, 0x8D77, // + 0x8CFD, 0xE6CE, // + 0x8D04, 0xE6D1, // + 0x8D05, 0xE6D2, // + 0x8D07, 0xE6D4, // + 0x8D08, 0x91A1, // + 0x8D0A, 0xE6D3, // + 0x8D0B, 0x8AE4, // + 0x8D0D, 0xE6D6, // + 0x8D0F, 0xE6D5, // + 0x8D10, 0xE6D7, // + 0x8D13, 0xE6D9, // + 0x8D14, 0xE6DB, // + 0x8D16, 0xE6DC, // + 0x8D64, 0x90D4, // + 0x8D66, 0x8ECD, // + 0x8D67, 0xE6DD, // + 0x8D6B, 0x8A71, // + 0x8D6D, 0xE6DE, // + 0x8D70, 0x9196, // + 0x8D71, 0xE6DF, // + 0x8D73, 0xE6E0, // + 0x8D74, 0x958B, // + 0x8D77, 0x8B4E, // + 0x8D81, 0xE6E1, // + 0x8D85, 0x92B4, // + 0x8D8A, 0x897A, // + 0x8D99, 0xE6E2, // + 0x8DA3, 0x8EEF, // + 0x8DA8, 0x9096, // + 0x8DB3, 0x91AB, // + 0x8DBA, 0xE6E5, // + 0x8DBE, 0xE6E4, // + 0x8DC2, 0xE6E3, // + 0x8DCB, 0xE6EB, // + 0x8DCC, 0xE6E9, // + 0x8DCF, 0xE6E6, // + 0x8DD6, 0xE6E8, // + 0x8DDA, 0xE6E7, // + 0x8DDB, 0xE6EA, // + 0x8DDD, 0x8B97, // + 0x8DDF, 0xE6EE, // + 0x8DE1, 0x90D5, // + 0x8DE3, 0xE6EF, // + 0x8DE8, 0x8CD7, // + 0x8DEA, 0xE6EC, // + 0x8DEB, 0xE6ED, // + 0x8DEF, 0x9848, // + 0x8DF3, 0x92B5, // + 0x8DF5, 0x9148, // + 0x8DFC, 0xE6F0, // + 0x8DFF, 0xE6F3, // + 0x8E08, 0xE6F1, // + 0x8E09, 0xE6F2, // + 0x8E0A, 0x9778, // + 0x8E0F, 0x93A5, // + 0x8E10, 0xE6F6, // + 0x8E1D, 0xE6F4, // + 0x8E1E, 0xE6F5, // + 0x8E1F, 0xE6F7, // + 0x8E2A, 0xE748, // + 0x8E30, 0xE6FA, // + 0x8E34, 0xE6FB, // + 0x8E35, 0xE6F9, // + 0x8E42, 0xE6F8, // + 0x8E44, 0x92FB, // + 0x8E47, 0xE740, // + 0x8E48, 0xE744, // + 0x8E49, 0xE741, // + 0x8E4A, 0xE6FC, // + 0x8E4C, 0xE742, // + 0x8E50, 0xE743, // + 0x8E55, 0xE74A, // + 0x8E59, 0xE745, // + 0x8E5F, 0x90D6, // + 0x8E60, 0xE747, // + 0x8E63, 0xE749, // + 0x8E64, 0xE746, // + 0x8E72, 0xE74C, // + 0x8E74, 0x8F52, // + 0x8E76, 0xE74B, // + 0x8E7C, 0xE74D, // + 0x8E81, 0xE74E, // + 0x8E84, 0xE751, // + 0x8E85, 0xE750, // + 0x8E87, 0xE74F, // + 0x8E8A, 0xE753, // + 0x8E8B, 0xE752, // + 0x8E8D, 0x96F4, // + 0x8E91, 0xE755, // + 0x8E93, 0xE754, // + 0x8E94, 0xE756, // + 0x8E99, 0xE757, // + 0x8EA1, 0xE759, // + 0x8EAA, 0xE758, // + 0x8EAB, 0x9067, // + 0x8EAC, 0xE75A, // + 0x8EAF, 0x8BEB, // + 0x8EB1, 0xE75D, // + 0x8EBE, 0xE75E, // + 0x8EC5, 0xE75F, // + 0x8EC6, 0xE75C, // + 0x8EC8, 0xE760, // + 0x8ECA, 0x8ED4, // + 0x8ECB, 0xE761, // + 0x8ECC, 0x8B4F, // + 0x8ECD, 0x8C52, // + 0x8ED2, 0x8CAC, // + 0x8EDB, 0xE762, // + 0x8EDF, 0x93EE, // + 0x8EE2, 0x935D, // + 0x8EE3, 0xE763, // + 0x8EEB, 0xE766, // + 0x8EF8, 0x8EB2, // + 0x8EFB, 0xE765, // + 0x8EFC, 0xE764, // + 0x8EFD, 0x8C79, // + 0x8EFE, 0xE767, // + 0x8F03, 0x8A72, // + 0x8F05, 0xE769, // + 0x8F09, 0x8DDA, // + 0x8F0A, 0xE768, // + 0x8F0C, 0xE771, // + 0x8F12, 0xE76B, // + 0x8F13, 0xE76D, // + 0x8F14, 0x95E3, // + 0x8F15, 0xE76A, // + 0x8F19, 0xE76C, // + 0x8F1B, 0xE770, // + 0x8F1C, 0xE76E, // + 0x8F1D, 0x8B50, // + 0x8F1F, 0xE76F, // + 0x8F26, 0xE772, // + 0x8F29, 0x9479, // + 0x8F2A, 0x97D6, // + 0x8F2F, 0x8F53, // + 0x8F33, 0xE773, // + 0x8F38, 0x9741, // + 0x8F39, 0xE775, // + 0x8F3B, 0xE774, // + 0x8F3E, 0xE778, // + 0x8F3F, 0x9760, // + 0x8F42, 0xE777, // + 0x8F44, 0x8A8D, // + 0x8F45, 0xE776, // + 0x8F46, 0xE77B, // + 0x8F49, 0xE77A, // + 0x8F4C, 0xE779, // + 0x8F4D, 0x9351, // + 0x8F4E, 0xE77C, // + 0x8F57, 0xE77D, // + 0x8F5C, 0xE77E, // + 0x8F5F, 0x8D8C, // + 0x8F61, 0x8C44, // + 0x8F62, 0xE780, // + 0x8F63, 0xE781, // + 0x8F64, 0xE782, // + 0x8F9B, 0x9068, // + 0x8F9C, 0xE783, // + 0x8F9E, 0x8EAB, // + 0x8F9F, 0xE784, // + 0x8FA3, 0xE785, // + 0x8FA7, 0x999F, // + 0x8FA8, 0x999E, // + 0x8FAD, 0xE786, // + 0x8FAE, 0xE390, // + 0x8FAF, 0xE787, // + 0x8FB0, 0x9243, // + 0x8FB1, 0x904A, // + 0x8FB2, 0x945F, // + 0x8FB7, 0xE788, // + 0x8FBA, 0x95D3, // + 0x8FBB, 0x92D2, // + 0x8FBC, 0x8D9E, // + 0x8FBF, 0x9248, // + 0x8FC2, 0x8949, // + 0x8FC4, 0x9698, // + 0x8FC5, 0x9076, // + 0x8FCE, 0x8C7D, // + 0x8FD1, 0x8BDF, // + 0x8FD4, 0x95D4, // + 0x8FDA, 0xE789, // + 0x8FE2, 0xE78B, // + 0x8FE5, 0xE78A, // + 0x8FE6, 0x89DE, // + 0x8FE9, 0x93F4, // + 0x8FEA, 0xE78C, // + 0x8FEB, 0x9497, // + 0x8FED, 0x9352, // + 0x8FEF, 0xE78D, // + 0x8FF0, 0x8F71, // + 0x8FF4, 0xE78F, // + 0x8FF7, 0x96C0, // + 0x8FF8, 0xE79E, // + 0x8FF9, 0xE791, // + 0x8FFA, 0xE792, // + 0x8FFD, 0x92C7, // + 0x9000, 0x91DE, // + 0x9001, 0x9197, // + 0x9003, 0x93A6, // + 0x9005, 0xE790, // + 0x9006, 0x8B74, // + 0x900B, 0xE799, // + 0x900D, 0xE796, // + 0x900E, 0xE7A3, // + 0x900F, 0x93A7, // + 0x9010, 0x9280, // + 0x9011, 0xE793, // + 0x9013, 0x92FC, // + 0x9014, 0x9372, // + 0x9015, 0xE794, // + 0x9016, 0xE798, // + 0x9017, 0x9080, // + 0x9019, 0x9487, // + 0x901A, 0x92CA, // + 0x901D, 0x90C0, // + 0x901E, 0xE797, // + 0x901F, 0x91AC, // + 0x9020, 0x91A2, // + 0x9021, 0xE795, // + 0x9022, 0x88A7, // + 0x9023, 0x9841, // + 0x9027, 0xE79A, // + 0x902E, 0x91DF, // + 0x9031, 0x8F54, // + 0x9032, 0x9069, // + 0x9035, 0xE79C, // + 0x9036, 0xE79B, // + 0x9038, 0x88ED, // + 0x9039, 0xE79D, // + 0x903C, 0x954E, // + 0x903E, 0xE7A5, // + 0x9041, 0x93D9, // + 0x9042, 0x908B, // + 0x9045, 0x9278, // + 0x9047, 0x8BF6, // + 0x9049, 0xE7A4, // + 0x904A, 0x9756, // + 0x904B, 0x895E, // + 0x904D, 0x95D5, // + 0x904E, 0x89DF, // + 0x904F, 0xE79F, // + 0x9050, 0xE7A0, // + 0x9051, 0xE7A1, // + 0x9052, 0xE7A2, // + 0x9053, 0x93B9, // + 0x9054, 0x9242, // + 0x9055, 0x88E1, // + 0x9056, 0xE7A6, // + 0x9058, 0xE7A7, // + 0x9059, 0xEAA1, // + 0x905C, 0x91BB, // + 0x905E, 0xE7A8, // + 0x9060, 0x8993, // + 0x9061, 0x916B, // + 0x9063, 0x8CAD, // + 0x9065, 0x9779, // + 0x9068, 0xE7A9, // + 0x9069, 0x934B, // + 0x906D, 0x9198, // + 0x906E, 0x8ED5, // + 0x906F, 0xE7AA, // + 0x9072, 0xE7AD, // + 0x9075, 0x8F85, // + 0x9076, 0xE7AB, // + 0x9077, 0x914A, // + 0x9078, 0x9149, // + 0x907A, 0x88E2, // + 0x907C, 0x97C9, // + 0x907D, 0xE7AF, // + 0x907F, 0x94F0, // + 0x9080, 0xE7B1, // + 0x9081, 0xE7B0, // + 0x9082, 0xE7AE, // + 0x9083, 0xE284, // + 0x9084, 0x8AD2, // + 0x9087, 0xE78E, // + 0x9089, 0xE7B3, // + 0x908A, 0xE7B2, // + 0x908F, 0xE7B4, // + 0x9091, 0x9757, // + 0x90A3, 0x93DF, // + 0x90A6, 0x964D, // + 0x90A8, 0xE7B5, // + 0x90AA, 0x8ED7, // + 0x90AF, 0xE7B6, // + 0x90B1, 0xE7B7, // + 0x90B5, 0xE7B8, // + 0x90B8, 0x9340, // + 0x90C1, 0x88E8, // + 0x90CA, 0x8D78, // + 0x90CE, 0x9859, // + 0x90DB, 0xE7BC, // + 0x90E1, 0x8C53, // + 0x90E2, 0xE7B9, // + 0x90E4, 0xE7BA, // + 0x90E8, 0x9594, // + 0x90ED, 0x8A73, // + 0x90F5, 0x9758, // + 0x90F7, 0x8BBD, // + 0x90FD, 0x9373, // + 0x9102, 0xE7BD, // + 0x9112, 0xE7BE, // + 0x9119, 0xE7BF, // + 0x912D, 0x9341, // + 0x9130, 0xE7C1, // + 0x9132, 0xE7C0, // + 0x9149, 0x93D1, // + 0x914A, 0xE7C2, // + 0x914B, 0x8F55, // + 0x914C, 0x8EDE, // + 0x914D, 0x947A, // + 0x914E, 0x9291, // + 0x9152, 0x8EF0, // + 0x9154, 0x908C, // + 0x9156, 0xE7C3, // + 0x9158, 0xE7C4, // + 0x9162, 0x907C, // + 0x9163, 0xE7C5, // + 0x9165, 0xE7C6, // + 0x9169, 0xE7C7, // + 0x916A, 0x978F, // + 0x916C, 0x8F56, // + 0x9172, 0xE7C9, // + 0x9173, 0xE7C8, // + 0x9175, 0x8D79, // + 0x9177, 0x8D93, // + 0x9178, 0x8E5F, // + 0x9182, 0xE7CC, // + 0x9187, 0x8F86, // + 0x9189, 0xE7CB, // + 0x918B, 0xE7CA, // + 0x918D, 0x91E7, // + 0x9190, 0x8CED, // + 0x9192, 0x90C1, // + 0x9197, 0x94AE, // + 0x919C, 0x8F58, // + 0x91A2, 0xE7CD, // + 0x91A4, 0x8FDD, // + 0x91AA, 0xE7D0, // + 0x91AB, 0xE7CE, // + 0x91AF, 0xE7CF, // + 0x91B4, 0xE7D2, // + 0x91B5, 0xE7D1, // + 0x91B8, 0x8FF8, // + 0x91BA, 0xE7D3, // + 0x91C0, 0xE7D4, // + 0x91C1, 0xE7D5, // + 0x91C6, 0x94CE, // + 0x91C7, 0x8DD1, // + 0x91C8, 0x8EDF, // + 0x91C9, 0xE7D6, // + 0x91CB, 0xE7D7, // + 0x91CC, 0x97A2, // + 0x91CD, 0x8F64, // + 0x91CE, 0x96EC, // + 0x91CF, 0x97CA, // + 0x91D0, 0xE7D8, // + 0x91D1, 0x8BE0, // + 0x91D6, 0xE7D9, // + 0x91D8, 0x9342, // + 0x91DB, 0xE7DC, // + 0x91DC, 0x8A98, // + 0x91DD, 0x906A, // + 0x91DF, 0xE7DA, // + 0x91E1, 0xE7DB, // + 0x91E3, 0x92DE, // + 0x91E6, 0x9674, // + 0x91E7, 0x8BFA, // + 0x91F5, 0xE7DE, // + 0x91F6, 0xE7DF, // + 0x91FC, 0xE7DD, // + 0x91FF, 0xE7E1, // + 0x920D, 0x93DD, // + 0x920E, 0x8A62, // + 0x9211, 0xE7E5, // + 0x9214, 0xE7E2, // + 0x9215, 0xE7E4, // + 0x921E, 0xE7E0, // + 0x9229, 0xE86E, // + 0x922C, 0xE7E3, // + 0x9234, 0x97E9, // + 0x9237, 0x8CD8, // + 0x923F, 0xE7ED, // + 0x9244, 0x9353, // + 0x9245, 0xE7E8, // + 0x9248, 0xE7EB, // + 0x9249, 0xE7E9, // + 0x924B, 0xE7EE, // + 0x9250, 0xE7EF, // + 0x9257, 0xE7E7, // + 0x925A, 0xE7F4, // + 0x925B, 0x8994, // + 0x925E, 0xE7E6, // + 0x9262, 0x94AB, // + 0x9264, 0xE7EA, // + 0x9266, 0x8FDE, // + 0x9271, 0x8D7A, // + 0x927E, 0x9667, // + 0x9280, 0x8BE2, // + 0x9283, 0x8F65, // + 0x9285, 0x93BA, // + 0x9291, 0x914C, // + 0x9293, 0xE7F2, // + 0x9295, 0xE7EC, // + 0x9296, 0xE7F1, // + 0x9298, 0x96C1, // + 0x929A, 0x92B6, // + 0x929B, 0xE7F3, // + 0x929C, 0xE7F0, // + 0x92AD, 0x914B, // + 0x92B7, 0xE7F7, // + 0x92B9, 0xE7F6, // + 0x92CF, 0xE7F5, // + 0x92D2, 0x964E, // + 0x92E4, 0x8F9B, // + 0x92E9, 0xE7F8, // + 0x92EA, 0x95DD, // + 0x92ED, 0x8973, // + 0x92F2, 0x9565, // + 0x92F3, 0x9292, // + 0x92F8, 0x8B98, // + 0x92FA, 0xE7FA, // + 0x92FC, 0x8D7C, // + 0x9306, 0x8E4B, // + 0x930F, 0xE7F9, // + 0x9310, 0x908D, // + 0x9318, 0x908E, // + 0x9319, 0xE840, // + 0x931A, 0xE842, // + 0x9320, 0x8FF9, // + 0x9322, 0xE841, // + 0x9323, 0xE843, // + 0x9326, 0x8BD1, // + 0x9328, 0x9564, // + 0x932B, 0x8EE0, // + 0x932C, 0x9842, // + 0x932E, 0xE7FC, // + 0x932F, 0x8DF6, // + 0x9332, 0x985E, // + 0x9335, 0xE845, // + 0x933A, 0xE844, // + 0x933B, 0xE846, // + 0x9344, 0xE7FB, // + 0x934B, 0x93E7, // + 0x934D, 0x9374, // + 0x9354, 0x92D5, // + 0x9356, 0xE84B, // + 0x935B, 0x9262, // + 0x935C, 0xE847, // + 0x9360, 0xE848, // + 0x936C, 0x8C4C, // + 0x936E, 0xE84A, // + 0x9375, 0x8CAE, // + 0x937C, 0xE849, // + 0x937E, 0x8FDF, // + 0x938C, 0x8A99, // + 0x9394, 0xE84F, // + 0x9396, 0x8DBD, // + 0x9397, 0x9199, // + 0x939A, 0x92C8, // + 0x93A7, 0x8A5A, // + 0x93AC, 0xE84D, // + 0x93AD, 0xE84E, // + 0x93AE, 0x92C1, // + 0x93B0, 0xE84C, // + 0x93B9, 0xE850, // + 0x93C3, 0xE856, // + 0x93C8, 0xE859, // + 0x93D0, 0xE858, // + 0x93D1, 0x934C, // + 0x93D6, 0xE851, // + 0x93D7, 0xE852, // + 0x93D8, 0xE855, // + 0x93DD, 0xE857, // + 0x93E1, 0x8BBE, // + 0x93E4, 0xE85A, // + 0x93E5, 0xE854, // + 0x93E8, 0xE853, // + 0x9403, 0xE85E, // + 0x9407, 0xE85F, // + 0x9410, 0xE860, // + 0x9413, 0xE85D, // + 0x9414, 0xE85C, // + 0x9418, 0x8FE0, // + 0x9419, 0x93A8, // + 0x9421, 0xE864, // + 0x942B, 0xE862, // + 0x9435, 0xE863, // + 0x9436, 0xE861, // + 0x9438, 0x91F6, // + 0x943A, 0xE865, // + 0x9441, 0xE866, // + 0x9444, 0xE868, // + 0x9451, 0x8AD3, // + 0x9452, 0xE867, // + 0x9453, 0x96F8, // + 0x945A, 0xE873, // + 0x945B, 0xE869, // + 0x945E, 0xE86C, // + 0x9460, 0xE86A, // + 0x9462, 0xE86B, // + 0x946A, 0xE86D, // + 0x9470, 0xE86F, // + 0x9475, 0xE870, // + 0x9477, 0xE871, // + 0x947C, 0xE874, // + 0x947D, 0xE872, // + 0x947E, 0xE875, // + 0x947F, 0xE877, // + 0x9481, 0xE876, // + 0x9577, 0x92B7, // + 0x9580, 0x96E5, // + 0x9582, 0xE878, // + 0x9583, 0x914D, // + 0x9587, 0xE879, // + 0x9589, 0x95C2, // + 0x958A, 0xE87A, // + 0x958B, 0x8A4A, // + 0x9591, 0x8AD5, // + 0x9593, 0x8AD4, // + 0x9594, 0xE87B, // + 0x9596, 0xE87C, // + 0x9598, 0xE87D, // + 0x9599, 0xE87E, // + 0x95A0, 0xE880, // + 0x95A2, 0x8AD6, // + 0x95A3, 0x8A74, // + 0x95A4, 0x8D7D, // + 0x95A5, 0x94B4, // + 0x95A7, 0xE882, // + 0x95A8, 0xE881, // + 0x95AD, 0xE883, // + 0x95B2, 0x897B, // + 0x95B9, 0xE886, // + 0x95BB, 0xE885, // + 0x95BC, 0xE884, // + 0x95BE, 0xE887, // + 0x95C3, 0xE88A, // + 0x95C7, 0x88C5, // + 0x95CA, 0xE888, // + 0x95CC, 0xE88C, // + 0x95CD, 0xE88B, // + 0x95D4, 0xE88E, // + 0x95D5, 0xE88D, // + 0x95D6, 0xE88F, // + 0x95D8, 0x93AC, // + 0x95DC, 0xE890, // + 0x95E1, 0xE891, // + 0x95E2, 0xE893, // + 0x95E5, 0xE892, // + 0x961C, 0x958C, // + 0x9621, 0xE894, // + 0x9628, 0xE895, // + 0x962A, 0x8DE3, // + 0x962E, 0xE896, // + 0x962F, 0xE897, // + 0x9632, 0x9668, // + 0x963B, 0x916A, // + 0x963F, 0x88A2, // + 0x9640, 0x91C9, // + 0x9642, 0xE898, // + 0x9644, 0x958D, // + 0x964B, 0xE89B, // + 0x964C, 0xE899, // + 0x964D, 0x8D7E, // + 0x964F, 0xE89A, // + 0x9650, 0x8CC0, // + 0x965B, 0x95C3, // + 0x965C, 0xE89D, // + 0x965D, 0xE89F, // + 0x965E, 0xE89E, // + 0x965F, 0xE8A0, // + 0x9662, 0x8940, // + 0x9663, 0x9077, // + 0x9664, 0x8F9C, // + 0x9665, 0x8AD7, // + 0x9666, 0xE8A1, // + 0x966A, 0x9486, // + 0x966C, 0xE8A3, // + 0x9670, 0x8941, // + 0x9672, 0xE8A2, // + 0x9673, 0x92C2, // + 0x9675, 0x97CB, // + 0x9676, 0x93A9, // + 0x9677, 0xE89C, // + 0x9678, 0x97A4, // + 0x967A, 0x8CAF, // + 0x967D, 0x977A, // + 0x9685, 0x8BF7, // + 0x9686, 0x97B2, // + 0x9688, 0x8C47, // + 0x968A, 0x91E0, // + 0x968B, 0xE440, // + 0x968D, 0xE8A4, // + 0x968E, 0x8A4B, // + 0x968F, 0x908F, // + 0x9694, 0x8A75, // + 0x9695, 0xE8A6, // + 0x9697, 0xE8A7, // + 0x9698, 0xE8A5, // + 0x9699, 0x8C84, // + 0x969B, 0x8DDB, // + 0x969C, 0x8FE1, // + 0x96A0, 0x8942, // + 0x96A3, 0x97D7, // + 0x96A7, 0xE8A9, // + 0x96A8, 0xE7AC, // + 0x96AA, 0xE8A8, // + 0x96B0, 0xE8AC, // + 0x96B1, 0xE8AA, // + 0x96B2, 0xE8AB, // + 0x96B4, 0xE8AD, // + 0x96B6, 0xE8AE, // + 0x96B7, 0x97EA, // + 0x96B8, 0xE8AF, // + 0x96B9, 0xE8B0, // + 0x96BB, 0x90C7, // + 0x96BC, 0x94B9, // + 0x96C0, 0x909D, // + 0x96C1, 0x8AE5, // + 0x96C4, 0x9759, // + 0x96C5, 0x89EB, // + 0x96C6, 0x8F57, // + 0x96C7, 0x8CD9, // + 0x96C9, 0xE8B3, // + 0x96CB, 0xE8B2, // + 0x96CC, 0x8E93, // + 0x96CD, 0xE8B4, // + 0x96CE, 0xE8B1, // + 0x96D1, 0x8E47, // + 0x96D5, 0xE8B8, // + 0x96D6, 0xE5AB, // + 0x96D9, 0x99D4, // + 0x96DB, 0x9097, // + 0x96DC, 0xE8B6, // + 0x96E2, 0x97A3, // + 0x96E3, 0x93EF, // + 0x96E8, 0x894A, // + 0x96EA, 0x90E1, // + 0x96EB, 0x8EB4, // + 0x96F0, 0x95B5, // + 0x96F2, 0x895F, // + 0x96F6, 0x97EB, // + 0x96F7, 0x978B, // + 0x96F9, 0xE8B9, // + 0x96FB, 0x9364, // + 0x9700, 0x8EF9, // + 0x9704, 0xE8BA, // + 0x9706, 0xE8BB, // + 0x9707, 0x906B, // + 0x9708, 0xE8BC, // + 0x970A, 0x97EC, // + 0x970D, 0xE8B7, // + 0x970E, 0xE8BE, // + 0x970F, 0xE8C0, // + 0x9711, 0xE8BF, // + 0x9713, 0xE8BD, // + 0x9716, 0xE8C1, // + 0x9719, 0xE8C2, // + 0x971C, 0x919A, // + 0x971E, 0x89E0, // + 0x9724, 0xE8C3, // + 0x9727, 0x96B6, // + 0x972A, 0xE8C4, // + 0x9730, 0xE8C5, // + 0x9732, 0x9849, // + 0x9738, 0x9E50, // + 0x9739, 0xE8C6, // + 0x973D, 0xE8C7, // + 0x973E, 0xE8C8, // + 0x9742, 0xE8CC, // + 0x9744, 0xE8C9, // + 0x9746, 0xE8CA, // + 0x9748, 0xE8CB, // + 0x9749, 0xE8CD, // + 0x9752, 0x90C2, // + 0x9756, 0x96F5, // + 0x9759, 0x90C3, // + 0x975C, 0xE8CE, // + 0x975E, 0x94F1, // + 0x9760, 0xE8CF, // + 0x9761, 0xEA72, // + 0x9762, 0x96CA, // + 0x9764, 0xE8D0, // + 0x9766, 0xE8D1, // + 0x9768, 0xE8D2, // + 0x9769, 0x8A76, // + 0x976B, 0xE8D4, // + 0x976D, 0x9078, // + 0x9771, 0xE8D5, // + 0x9774, 0x8C43, // + 0x9779, 0xE8D6, // + 0x977A, 0xE8DA, // + 0x977C, 0xE8D8, // + 0x9781, 0xE8D9, // + 0x9784, 0x8A93, // + 0x9785, 0xE8D7, // + 0x9786, 0xE8DB, // + 0x978B, 0xE8DC, // + 0x978D, 0x88C6, // + 0x978F, 0xE8DD, // + 0x9790, 0xE8DE, // + 0x9798, 0x8FE2, // + 0x979C, 0xE8DF, // + 0x97A0, 0x8B66, // + 0x97A3, 0xE8E2, // + 0x97A6, 0xE8E1, // + 0x97A8, 0xE8E0, // + 0x97AB, 0xE691, // + 0x97AD, 0x95DA, // + 0x97B3, 0xE8E3, // + 0x97B4, 0xE8E4, // + 0x97C3, 0xE8E5, // + 0x97C6, 0xE8E6, // + 0x97C8, 0xE8E7, // + 0x97CB, 0xE8E8, // + 0x97D3, 0x8AD8, // + 0x97DC, 0xE8E9, // + 0x97ED, 0xE8EA, // + 0x97EE, 0x9442, // + 0x97F2, 0xE8EC, // + 0x97F3, 0x89B9, // + 0x97F5, 0xE8EF, // + 0x97F6, 0xE8EE, // + 0x97FB, 0x8943, // + 0x97FF, 0x8BBF, // + 0x9801, 0x95C5, // + 0x9802, 0x92B8, // + 0x9803, 0x8DA0, // + 0x9805, 0x8D80, // + 0x9806, 0x8F87, // + 0x9808, 0x907B, // + 0x980C, 0xE8F1, // + 0x980F, 0xE8F0, // + 0x9810, 0x9761, // + 0x9811, 0x8AE6, // + 0x9812, 0x94D0, // + 0x9813, 0x93DA, // + 0x9817, 0x909C, // + 0x9818, 0x97CC, // + 0x981A, 0x8C7A, // + 0x9821, 0xE8F4, // + 0x9824, 0xE8F3, // + 0x982C, 0x966A, // + 0x982D, 0x93AA, // + 0x9834, 0x896F, // + 0x9837, 0xE8F5, // + 0x9838, 0xE8F2, // + 0x983B, 0x9570, // + 0x983C, 0x978A, // + 0x983D, 0xE8F6, // + 0x9846, 0xE8F7, // + 0x984B, 0xE8F9, // + 0x984C, 0x91E8, // + 0x984D, 0x8A7A, // + 0x984E, 0x8A7B, // + 0x984F, 0xE8F8, // + 0x9854, 0x8AE7, // + 0x9855, 0x8CB0, // + 0x9858, 0x8AE8, // + 0x985B, 0x935E, // + 0x985E, 0x97DE, // + 0x9867, 0x8CDA, // + 0x986B, 0xE8FA, // + 0x986F, 0xE8FB, // + 0x9870, 0xE8FC, // + 0x9871, 0xE940, // + 0x9873, 0xE942, // + 0x9874, 0xE941, // + 0x98A8, 0x9597, // + 0x98AA, 0xE943, // + 0x98AF, 0xE944, // + 0x98B1, 0xE945, // + 0x98B6, 0xE946, // + 0x98C3, 0xE948, // + 0x98C4, 0xE947, // + 0x98C6, 0xE949, // + 0x98DB, 0x94F2, // + 0x98DC, 0xE3CA, // + 0x98DF, 0x9048, // + 0x98E2, 0x8B51, // + 0x98E9, 0xE94A, // + 0x98EB, 0xE94B, // + 0x98ED, 0x99AA, // + 0x98EE, 0x9F5A, // + 0x98EF, 0x94D1, // + 0x98F2, 0x88F9, // + 0x98F4, 0x88B9, // + 0x98FC, 0x8E94, // + 0x98FD, 0x964F, // + 0x98FE, 0x8FFC, // + 0x9903, 0xE94C, // + 0x9905, 0x96DD, // + 0x9909, 0xE94D, // + 0x990A, 0x977B, // + 0x990C, 0x8961, // + 0x9910, 0x8E60, // + 0x9912, 0xE94E, // + 0x9913, 0x89EC, // + 0x9914, 0xE94F, // + 0x9918, 0xE950, // + 0x991D, 0xE952, // + 0x991E, 0xE953, // + 0x9920, 0xE955, // + 0x9921, 0xE951, // + 0x9924, 0xE954, // + 0x9928, 0x8AD9, // + 0x992C, 0xE956, // + 0x992E, 0xE957, // + 0x993D, 0xE958, // + 0x993E, 0xE959, // + 0x9942, 0xE95A, // + 0x9945, 0xE95C, // + 0x994B, 0xE95E, // + 0x994C, 0xE961, // + 0x9950, 0xE95D, // + 0x9951, 0xE95F, // + 0x9952, 0xE960, // + 0x9955, 0xE962, // + 0x9957, 0x8BC0, // + 0x9996, 0x8EF1, // + 0x9997, 0xE963, // + 0x9998, 0xE964, // + 0x9999, 0x8D81, // + 0x99A5, 0xE965, // + 0x99A8, 0x8A5D, // + 0x99AC, 0x946E, // + 0x99AD, 0xE966, // + 0x99AE, 0xE967, // + 0x99B3, 0x9279, // + 0x99B4, 0x93E9, // + 0x99BC, 0xE968, // + 0x99C1, 0x949D, // + 0x99C4, 0x91CA, // + 0x99C5, 0x8977, // + 0x99C6, 0x8BEC, // + 0x99C8, 0x8BED, // + 0x99D0, 0x9293, // + 0x99D1, 0xE96D, // + 0x99D2, 0x8BEE, // + 0x99D5, 0x89ED, // + 0x99D8, 0xE96C, // + 0x99DB, 0xE96A, // + 0x99DD, 0xE96B, // + 0x99DF, 0xE969, // + 0x99E2, 0xE977, // + 0x99ED, 0xE96E, // + 0x99EE, 0xE96F, // + 0x99F1, 0xE970, // + 0x99F2, 0xE971, // + 0x99F8, 0xE973, // + 0x99FB, 0xE972, // + 0x99FF, 0x8F78, // + 0x9A01, 0xE974, // + 0x9A05, 0xE976, // + 0x9A0E, 0x8B52, // + 0x9A0F, 0xE975, // + 0x9A12, 0x919B, // + 0x9A13, 0x8CB1, // + 0x9A19, 0xE978, // + 0x9A28, 0x91CB, // + 0x9A2B, 0xE979, // + 0x9A30, 0x93AB, // + 0x9A37, 0xE97A, // + 0x9A3E, 0xE980, // + 0x9A40, 0xE97D, // + 0x9A42, 0xE97C, // + 0x9A43, 0xE97E, // + 0x9A45, 0xE97B, // + 0x9A4D, 0xE982, // + 0x9A55, 0xE981, // + 0x9A57, 0xE984, // + 0x9A5A, 0x8BC1, // + 0x9A5B, 0xE983, // + 0x9A5F, 0xE985, // + 0x9A62, 0xE986, // + 0x9A64, 0xE988, // + 0x9A65, 0xE987, // + 0x9A69, 0xE989, // + 0x9A6A, 0xE98B, // + 0x9A6B, 0xE98A, // + 0x9AA8, 0x8D9C, // + 0x9AAD, 0xE98C, // + 0x9AB0, 0xE98D, // + 0x9ABC, 0xE98E, // + 0x9AC0, 0xE98F, // + 0x9AC4, 0x9091, // + 0x9ACF, 0xE990, // + 0x9AD1, 0xE991, // + 0x9AD3, 0xE992, // + 0x9AD4, 0xE993, // + 0x9AD8, 0x8D82, // + 0x9ADE, 0xE994, // + 0x9ADF, 0xE995, // + 0x9AE2, 0xE996, // + 0x9AE3, 0xE997, // + 0x9AE6, 0xE998, // + 0x9AEA, 0x94AF, // + 0x9AEB, 0xE99A, // + 0x9AED, 0x9545, // + 0x9AEE, 0xE99B, // + 0x9AEF, 0xE999, // + 0x9AF1, 0xE99D, // + 0x9AF4, 0xE99C, // + 0x9AF7, 0xE99E, // + 0x9AFB, 0xE99F, // + 0x9B06, 0xE9A0, // + 0x9B18, 0xE9A1, // + 0x9B1A, 0xE9A2, // + 0x9B1F, 0xE9A3, // + 0x9B22, 0xE9A4, // + 0x9B23, 0xE9A5, // + 0x9B25, 0xE9A6, // + 0x9B27, 0xE9A7, // + 0x9B28, 0xE9A8, // + 0x9B29, 0xE9A9, // + 0x9B2A, 0xE9AA, // + 0x9B2E, 0xE9AB, // + 0x9B2F, 0xE9AC, // + 0x9B31, 0x9F54, // + 0x9B32, 0xE9AD, // + 0x9B3B, 0xE2F6, // + 0x9B3C, 0x8B53, // + 0x9B41, 0x8A40, // + 0x9B42, 0x8DB0, // + 0x9B43, 0xE9AF, // + 0x9B44, 0xE9AE, // + 0x9B45, 0x96A3, // + 0x9B4D, 0xE9B1, // + 0x9B4E, 0xE9B2, // + 0x9B4F, 0xE9B0, // + 0x9B51, 0xE9B3, // + 0x9B54, 0x9682, // + 0x9B58, 0xE9B4, // + 0x9B5A, 0x8B9B, // + 0x9B6F, 0x9844, // + 0x9B74, 0xE9B5, // + 0x9B83, 0xE9B7, // + 0x9B8E, 0x88BC, // + 0x9B91, 0xE9B8, // + 0x9B92, 0x95A9, // + 0x9B93, 0xE9B6, // + 0x9B96, 0xE9B9, // + 0x9B97, 0xE9BA, // + 0x9B9F, 0xE9BB, // + 0x9BA0, 0xE9BC, // + 0x9BA8, 0xE9BD, // + 0x9BAA, 0x968E, // + 0x9BAB, 0x8E4C, // + 0x9BAD, 0x8DF8, // + 0x9BAE, 0x914E, // + 0x9BB4, 0xE9BE, // + 0x9BB9, 0xE9C1, // + 0x9BC0, 0xE9BF, // + 0x9BC6, 0xE9C2, // + 0x9BC9, 0x8CEF, // + 0x9BCA, 0xE9C0, // + 0x9BCF, 0xE9C3, // + 0x9BD1, 0xE9C4, // + 0x9BD2, 0xE9C5, // + 0x9BD4, 0xE9C9, // + 0x9BD6, 0x8E49, // + 0x9BDB, 0x91E2, // + 0x9BE1, 0xE9CA, // + 0x9BE2, 0xE9C7, // + 0x9BE3, 0xE9C6, // + 0x9BE4, 0xE9C8, // + 0x9BE8, 0x8C7E, // + 0x9BF0, 0xE9CE, // + 0x9BF1, 0xE9CD, // + 0x9BF2, 0xE9CC, // + 0x9BF5, 0x88B1, // + 0x9C04, 0xE9D8, // + 0x9C06, 0xE9D4, // + 0x9C08, 0xE9D5, // + 0x9C09, 0xE9D1, // + 0x9C0A, 0xE9D7, // + 0x9C0C, 0xE9D3, // + 0x9C0D, 0x8A82, // + 0x9C10, 0x986B, // + 0x9C12, 0xE9D6, // + 0x9C13, 0xE9D2, // + 0x9C14, 0xE9D0, // + 0x9C15, 0xE9CF, // + 0x9C1B, 0xE9DA, // + 0x9C21, 0xE9DD, // + 0x9C24, 0xE9DC, // + 0x9C25, 0xE9DB, // + 0x9C2D, 0x9568, // + 0x9C2E, 0xE9D9, // + 0x9C2F, 0x88F1, // + 0x9C30, 0xE9DE, // + 0x9C32, 0xE9E0, // + 0x9C39, 0x8A8F, // + 0x9C3A, 0xE9CB, // + 0x9C3B, 0x8956, // + 0x9C3E, 0xE9E2, // + 0x9C46, 0xE9E1, // + 0x9C47, 0xE9DF, // + 0x9C48, 0x924C, // + 0x9C52, 0x9690, // + 0x9C57, 0x97D8, // + 0x9C5A, 0xE9E3, // + 0x9C60, 0xE9E4, // + 0x9C67, 0xE9E5, // + 0x9C76, 0xE9E6, // + 0x9C78, 0xE9E7, // + 0x9CE5, 0x92B9, // + 0x9CE7, 0xE9E8, // + 0x9CE9, 0x94B5, // + 0x9CEB, 0xE9ED, // + 0x9CEC, 0xE9E9, // + 0x9CF0, 0xE9EA, // + 0x9CF3, 0x9650, // + 0x9CF4, 0x96C2, // + 0x9CF6, 0x93CE, // + 0x9D03, 0xE9EE, // + 0x9D06, 0xE9EF, // + 0x9D07, 0x93BC, // + 0x9D08, 0xE9EC, // + 0x9D09, 0xE9EB, // + 0x9D0E, 0x89A8, // + 0x9D12, 0xE9F7, // + 0x9D15, 0xE9F6, // + 0x9D1B, 0x8995, // + 0x9D1F, 0xE9F4, // + 0x9D23, 0xE9F3, // + 0x9D26, 0xE9F1, // + 0x9D28, 0x8A9B, // + 0x9D2A, 0xE9F0, // + 0x9D2B, 0x8EB0, // + 0x9D2C, 0x89A7, // + 0x9D3B, 0x8D83, // + 0x9D3E, 0xE9FA, // + 0x9D3F, 0xE9F9, // + 0x9D41, 0xE9F8, // + 0x9D44, 0xE9F5, // + 0x9D46, 0xE9FB, // + 0x9D48, 0xE9FC, // + 0x9D50, 0xEA44, // + 0x9D51, 0xEA43, // + 0x9D59, 0xEA45, // + 0x9D5C, 0x894C, // + 0x9D5D, 0xEA40, // + 0x9D5E, 0xEA41, // + 0x9D60, 0x8D94, // + 0x9D61, 0x96B7, // + 0x9D64, 0xEA42, // + 0x9D6C, 0x9651, // + 0x9D6F, 0xEA4A, // + 0x9D72, 0xEA46, // + 0x9D7A, 0xEA4B, // + 0x9D87, 0xEA48, // + 0x9D89, 0xEA47, // + 0x9D8F, 0x8C7B, // + 0x9D9A, 0xEA4C, // + 0x9DA4, 0xEA4D, // + 0x9DA9, 0xEA4E, // + 0x9DAB, 0xEA49, // + 0x9DAF, 0xE9F2, // + 0x9DB2, 0xEA4F, // + 0x9DB4, 0x92DF, // + 0x9DB8, 0xEA53, // + 0x9DBA, 0xEA54, // + 0x9DBB, 0xEA52, // + 0x9DC1, 0xEA51, // + 0x9DC2, 0xEA57, // + 0x9DC4, 0xEA50, // + 0x9DC6, 0xEA55, // + 0x9DCF, 0xEA56, // + 0x9DD3, 0xEA59, // + 0x9DD9, 0xEA58, // + 0x9DED, 0xEA5C, // + 0x9DEF, 0xEA5D, // + 0x9DF2, 0x9868, // + 0x9DF8, 0xEA5A, // + 0x9DF9, 0x91E9, // + 0x9DFA, 0x8DEB, // + 0x9DFD, 0xEA5E, // + 0x9E1A, 0xEA5F, // + 0x9E1B, 0xEA60, // + 0x9E1E, 0xEA61, // + 0x9E75, 0xEA62, // + 0x9E78, 0x8CB2, // + 0x9E79, 0xEA63, // + 0x9E7D, 0xEA64, // + 0x9E7F, 0x8EAD, // + 0x9E81, 0xEA65, // + 0x9E88, 0xEA66, // + 0x9E8B, 0xEA67, // + 0x9E8C, 0xEA68, // + 0x9E91, 0xEA6B, // + 0x9E92, 0xEA69, // + 0x9E95, 0xEA6A, // + 0x9E97, 0x97ED, // + 0x9E9D, 0xEA6C, // + 0x9E9F, 0x97D9, // + 0x9EA5, 0xEA6D, // + 0x9EA6, 0x949E, // + 0x9EA9, 0xEA6E, // + 0x9EAA, 0xEA70, // + 0x9EAD, 0xEA71, // + 0x9EB8, 0xEA6F, // + 0x9EB9, 0x8D8D, // + 0x9EBA, 0x96CB, // + 0x9EBB, 0x9683, // + 0x9EBC, 0x9BF5, // + 0x9EBE, 0x9F80, // + 0x9EBF, 0x969B, // + 0x9EC4, 0x89A9, // + 0x9ECC, 0xEA73, // + 0x9ECD, 0x8B6F, // + 0x9ECE, 0xEA74, // + 0x9ECF, 0xEA75, // + 0x9ED0, 0xEA76, // + 0x9ED2, 0x8D95, // + 0x9ED4, 0xEA77, // + 0x9ED8, 0xE0D2, // + 0x9ED9, 0x96D9, // + 0x9EDB, 0x91E1, // + 0x9EDC, 0xEA78, // + 0x9EDD, 0xEA7A, // + 0x9EDE, 0xEA79, // + 0x9EE0, 0xEA7B, // + 0x9EE5, 0xEA7C, // + 0x9EE8, 0xEA7D, // + 0x9EEF, 0xEA7E, // + 0x9EF4, 0xEA80, // + 0x9EF6, 0xEA81, // + 0x9EF7, 0xEA82, // + 0x9EF9, 0xEA83, // + 0x9EFB, 0xEA84, // + 0x9EFC, 0xEA85, // + 0x9EFD, 0xEA86, // + 0x9F07, 0xEA87, // + 0x9F08, 0xEA88, // + 0x9F0E, 0x9343, // + 0x9F13, 0x8CDB, // + 0x9F15, 0xEA8A, // + 0x9F20, 0x916C, // + 0x9F21, 0xEA8B, // + 0x9F2C, 0xEA8C, // + 0x9F3B, 0x9540, // + 0x9F3E, 0xEA8D, // + 0x9F4A, 0xEA8E, // + 0x9F4B, 0xE256, // + 0x9F4E, 0xE6D8, // + 0x9F4F, 0xE8EB, // + 0x9F52, 0xEA8F, // + 0x9F54, 0xEA90, // + 0x9F5F, 0xEA92, // + 0x9F60, 0xEA93, // + 0x9F61, 0xEA94, // + 0x9F62, 0x97EE, // + 0x9F63, 0xEA91, // + 0x9F66, 0xEA95, // + 0x9F67, 0xEA96, // + 0x9F6A, 0xEA98, // + 0x9F6C, 0xEA97, // + 0x9F72, 0xEA9A, // + 0x9F76, 0xEA9B, // + 0x9F77, 0xEA99, // + 0x9F8D, 0x97B4, // + 0x9F95, 0xEA9C, // + 0x9F9C, 0xEA9D, // + 0x9F9D, 0xE273, // + 0x9FA0, 0xEA9E, // + 0xFF01, 0x8149, // FULLWIDTH EXCLAMATION MARK + 0xFF03, 0x8194, // FULLWIDTH NUMBER SIGN + 0xFF04, 0x8190, // FULLWIDTH DOLLAR SIGN + 0xFF05, 0x8193, // FULLWIDTH PERCENT SIGN + 0xFF06, 0x8195, // FULLWIDTH AMPERSAND + 0xFF07, 0x81AD, // FULLWIDTH APOSTROPHE + 0xFF08, 0x8169, // FULLWIDTH LEFT PARENTHESIS + 0xFF09, 0x816A, // FULLWIDTH RIGHT PARENTHESIS + 0xFF0A, 0x8196, // FULLWIDTH ASTERISK + 0xFF0B, 0x817B, // FULLWIDTH PLUS SIGN + 0xFF0C, 0x8143, // FULLWIDTH COMMA + 0xFF0E, 0x8144, // FULLWIDTH FULL STOP + 0xFF0F, 0x815E, // FULLWIDTH SOLIDUS + 0xFF10, 0x824F, // FULLWIDTH DIGIT ZERO + 0xFF11, 0x8250, // FULLWIDTH DIGIT ONE + 0xFF12, 0x8251, // FULLWIDTH DIGIT TWO + 0xFF13, 0x8252, // FULLWIDTH DIGIT THREE + 0xFF14, 0x8253, // FULLWIDTH DIGIT FOUR + 0xFF15, 0x8254, // FULLWIDTH DIGIT FIVE + 0xFF16, 0x8255, // FULLWIDTH DIGIT SIX + 0xFF17, 0x8256, // FULLWIDTH DIGIT SEVEN + 0xFF18, 0x8257, // FULLWIDTH DIGIT EIGHT + 0xFF19, 0x8258, // FULLWIDTH DIGIT NINE + 0xFF1A, 0x8146, // FULLWIDTH COLON + 0xFF1B, 0x8147, // FULLWIDTH SEMICOLON + 0xFF1C, 0x8183, // FULLWIDTH LESS-THAN SIGN + 0xFF1D, 0x8181, // FULLWIDTH EQUALS SIGN + 0xFF1E, 0x8184, // FULLWIDTH GREATER-THAN SIGN + 0xFF1F, 0x8148, // FULLWIDTH QUESTION MARK + 0xFF20, 0x8197, // FULLWIDTH COMMERCIAL AT + 0xFF21, 0x8260, // FULLWIDTH LATIN CAPITAL LETTER A + 0xFF22, 0x8261, // FULLWIDTH LATIN CAPITAL LETTER B + 0xFF23, 0x8262, // FULLWIDTH LATIN CAPITAL LETTER C + 0xFF24, 0x8263, // FULLWIDTH LATIN CAPITAL LETTER D + 0xFF25, 0x8264, // FULLWIDTH LATIN CAPITAL LETTER E + 0xFF26, 0x8265, // FULLWIDTH LATIN CAPITAL LETTER F + 0xFF27, 0x8266, // FULLWIDTH LATIN CAPITAL LETTER G + 0xFF28, 0x8267, // FULLWIDTH LATIN CAPITAL LETTER H + 0xFF29, 0x8268, // FULLWIDTH LATIN CAPITAL LETTER I + 0xFF2A, 0x8269, // FULLWIDTH LATIN CAPITAL LETTER J + 0xFF2B, 0x826A, // FULLWIDTH LATIN CAPITAL LETTER K + 0xFF2C, 0x826B, // FULLWIDTH LATIN CAPITAL LETTER L + 0xFF2D, 0x826C, // FULLWIDTH LATIN CAPITAL LETTER M + 0xFF2E, 0x826D, // FULLWIDTH LATIN CAPITAL LETTER N + 0xFF2F, 0x826E, // FULLWIDTH LATIN CAPITAL LETTER O + 0xFF30, 0x826F, // FULLWIDTH LATIN CAPITAL LETTER P + 0xFF31, 0x8270, // FULLWIDTH LATIN CAPITAL LETTER Q + 0xFF32, 0x8271, // FULLWIDTH LATIN CAPITAL LETTER R + 0xFF33, 0x8272, // FULLWIDTH LATIN CAPITAL LETTER S + 0xFF34, 0x8273, // FULLWIDTH LATIN CAPITAL LETTER T + 0xFF35, 0x8274, // FULLWIDTH LATIN CAPITAL LETTER U + 0xFF36, 0x8275, // FULLWIDTH LATIN CAPITAL LETTER V + 0xFF37, 0x8276, // FULLWIDTH LATIN CAPITAL LETTER W + 0xFF38, 0x8277, // FULLWIDTH LATIN CAPITAL LETTER X + 0xFF39, 0x8278, // FULLWIDTH LATIN CAPITAL LETTER Y + 0xFF3A, 0x8279, // FULLWIDTH LATIN CAPITAL LETTER Z + 0xFF3B, 0x816D, // FULLWIDTH LEFT SQUARE BRACKET + 0xFF3D, 0x816E, // FULLWIDTH RIGHT SQUARE BRACKET + 0xFF3E, 0x814F, // FULLWIDTH CIRCUMFLEX ACCENT + 0xFF3F, 0x8151, // FULLWIDTH LOW LINE + 0xFF40, 0x814D, // FULLWIDTH GRAVE ACCENT + 0xFF41, 0x8281, // FULLWIDTH LATIN SMALL LETTER A + 0xFF42, 0x8282, // FULLWIDTH LATIN SMALL LETTER B + 0xFF43, 0x8283, // FULLWIDTH LATIN SMALL LETTER C + 0xFF44, 0x8284, // FULLWIDTH LATIN SMALL LETTER D + 0xFF45, 0x8285, // FULLWIDTH LATIN SMALL LETTER E + 0xFF46, 0x8286, // FULLWIDTH LATIN SMALL LETTER F + 0xFF47, 0x8287, // FULLWIDTH LATIN SMALL LETTER G + 0xFF48, 0x8288, // FULLWIDTH LATIN SMALL LETTER H + 0xFF49, 0x8289, // FULLWIDTH LATIN SMALL LETTER I + 0xFF4A, 0x828A, // FULLWIDTH LATIN SMALL LETTER J + 0xFF4B, 0x828B, // FULLWIDTH LATIN SMALL LETTER K + 0xFF4C, 0x828C, // FULLWIDTH LATIN SMALL LETTER L + 0xFF4D, 0x828D, // FULLWIDTH LATIN SMALL LETTER M + 0xFF4E, 0x828E, // FULLWIDTH LATIN SMALL LETTER N + 0xFF4F, 0x828F, // FULLWIDTH LATIN SMALL LETTER O + 0xFF50, 0x8290, // FULLWIDTH LATIN SMALL LETTER P + 0xFF51, 0x8291, // FULLWIDTH LATIN SMALL LETTER Q + 0xFF52, 0x8292, // FULLWIDTH LATIN SMALL LETTER R + 0xFF53, 0x8293, // FULLWIDTH LATIN SMALL LETTER S + 0xFF54, 0x8294, // FULLWIDTH LATIN SMALL LETTER T + 0xFF55, 0x8295, // FULLWIDTH LATIN SMALL LETTER U + 0xFF56, 0x8296, // FULLWIDTH LATIN SMALL LETTER V + 0xFF57, 0x8297, // FULLWIDTH LATIN SMALL LETTER W + 0xFF58, 0x8298, // FULLWIDTH LATIN SMALL LETTER X + 0xFF59, 0x8299, // FULLWIDTH LATIN SMALL LETTER Y + 0xFF5A, 0x829A, // FULLWIDTH LATIN SMALL LETTER Z + 0xFF5B, 0x816F, // FULLWIDTH LEFT CURLY BRACKET + 0xFF5C, 0x8162, // FULLWIDTH VERTICAL LINE + 0xFF5D, 0x8170, // FULLWIDTH RIGHT CURLY BRACKET + 0xFFE3, 0x8150, // FULLWIDTH MACRON + 0xFFE5, 0x818F // FULLWIDTH YEN SIGN +}; \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/stdint_msvc.h b/3rdparty/zint-2.6.1/backend/stdint_msvc.h new file mode 100644 index 0000000..f306a4c --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/stdint_msvc.h @@ -0,0 +1,52 @@ +/* stdint_msvc.h - definitions for libzint + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#ifndef STDINT_MSVC_H +#define STDINT_MSVC_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifdef _MSC_VER + +typedef BYTE uint8_t; +typedef WORD uint16_t; +typedef DWORD uint32_t; +typedef INT32 int32_t; + +#endif + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* STDINT_MSVC_H */ diff --git a/3rdparty/zint-2.6.1/backend/svg.c b/3rdparty/zint-2.6.1/backend/svg.c new file mode 100644 index 0000000..04a1ab6 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/svg.c @@ -0,0 +1,679 @@ +/* svg.c - Scalable Vector Graphics */ + +/* + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#ifdef _MSC_VER +#include +#endif + +#include "common.h" + +#define SSET "0123456789ABCDEF" + +int svg_plot(struct zint_symbol *symbol) { + int i, block_width, latch, r, this_row; + float textpos, large_bar_height, preset_height, row_height, row_posn = 0.0; + FILE *fsvg; + int error_number = 0; + int textoffset, xoffset, yoffset, textdone, main_width; + char textpart[10], addon[6]; + int large_bar_count, comp_offset; + float addon_text_posn; + float scaler = symbol->scale; + float default_text_posn; + const char *locale = NULL; +#ifndef _MSC_VER + unsigned char local_text[ustrlen(symbol->text) + 1]; +#else + unsigned char* local_text = (unsigned char*) _alloca(ustrlen(symbol->text) + 1); +#endif + + row_height = 0; + textdone = 0; + main_width = symbol->width; + strcpy(addon, ""); + comp_offset = 0; + addon_text_posn = 0.0; + + if (symbol->show_hrt != 0) { + /* Copy text from symbol */ + ustrcpy(local_text, symbol->text); + } else { + /* No text needed */ + switch (symbol->symbology) { + case BARCODE_EANX: + case BARCODE_EANX_CC: + case BARCODE_ISBNX: + case BARCODE_UPCA: + case BARCODE_UPCE: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + /* For these symbols use dummy text to ensure formatting is done + * properly even if no text is required */ + for (i = 0; i < ustrlen(symbol->text); i++) { + if (symbol->text[i] == '+') { + local_text[i] = '+'; + } else { + local_text[i] = ' '; + } + local_text[ustrlen(symbol->text)] = '\0'; + } + break; + default: + /* For everything else, just remove the text */ + local_text[0] = '\0'; + break; + } + } + + if (symbol->output_options & BARCODE_STDOUT) { + fsvg = stdout; + } else { + fsvg = fopen(symbol->outfile, "w"); + } + if (fsvg == NULL) { + strcpy(symbol->errtxt, "660: Could not open output file"); + return ZINT_ERROR_FILE_ACCESS; + } + + /* sort out colour options */ + to_upper((unsigned char*) symbol->fgcolour); + to_upper((unsigned char*) symbol->bgcolour); + + if (strlen(symbol->fgcolour) != 6) { + strcpy(symbol->errtxt, "661: Malformed foreground colour target"); + fclose(fsvg); + return ZINT_ERROR_INVALID_OPTION; + } + if (strlen(symbol->bgcolour) != 6) { + strcpy(symbol->errtxt, "662: Malformed background colour target"); + fclose(fsvg); + return ZINT_ERROR_INVALID_OPTION; + } + error_number = is_sane(SSET, (unsigned char*) symbol->fgcolour, strlen(symbol->fgcolour)); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "663: Malformed foreground colour target"); + fclose(fsvg); + return ZINT_ERROR_INVALID_OPTION; + } + error_number = is_sane(SSET, (unsigned char*) symbol->bgcolour, strlen(symbol->bgcolour)); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "664: Malformed background colour target"); + fclose(fsvg); + return ZINT_ERROR_INVALID_OPTION; + } + locale = setlocale(LC_ALL, "C"); + + if (symbol->height == 0) { + symbol->height = 50; + } + + large_bar_count = 0; + preset_height = 0.0; + for (i = 0; i < symbol->rows; i++) { + preset_height += symbol->row_height[i]; + if (symbol->row_height[i] == 0) { + large_bar_count++; + } + } + large_bar_height = (symbol->height - preset_height) / large_bar_count; + + if (large_bar_count == 0) { + symbol->height = preset_height; + } + + while (!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { + comp_offset++; + } + + /* Certain symbols need whitespace otherwise characters get chopped off the sides */ + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) + || (symbol->symbology == BARCODE_ISBNX)) { + switch (ustrlen(local_text)) { + case 13: /* EAN 13 */ + case 16: + case 19: + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + } + main_width = 96 + comp_offset; + break; + default: + main_width = 68 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 96 + comp_offset; + } + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + if (symbol->whitespace_width == 0) { + symbol->whitespace_width = 10; + main_width = 51 + comp_offset; + } + } + + latch = 0; + r = 0; + /* Isolate add-on text */ + if (is_extendable(symbol->symbology)) { + for (i = 0; i < ustrlen(local_text); i++) { + if (latch == 1) { + addon[r] = local_text[i]; + r++; + } + if (local_text[i] == '+') { + latch = 1; + } + } + } + addon[r] = '\0'; + + /* Don't include control characters in output text */ + for(i = 0; i < ustrlen(local_text); i++) { + if (local_text[i] < ' ') { + local_text[i] = ' '; + } + } + + if (ustrlen(local_text) != 0) { + textoffset = 9; + } else { + textoffset = 0; + } + xoffset = symbol->border_width + symbol->whitespace_width; + yoffset = symbol->border_width; + + /* Start writing the header */ + fprintf(fsvg, "\n"); + fprintf(fsvg, "\n"); + if (symbol->symbology != BARCODE_MAXICODE) { + fprintf(fsvg, "width + xoffset + xoffset) * scaler), (int) ceil((symbol->height + textoffset + yoffset + yoffset) * scaler)); + } else { + fprintf(fsvg, "\n"); + if ((ustrlen(local_text) != 0) && (symbol->show_hrt != 0)) { + fprintf(fsvg, " %s\n", local_text); + } else { + fprintf(fsvg, " Zint Generated Symbol\n"); + } + fprintf(fsvg, " \n"); + fprintf(fsvg, "\n \n", symbol->fgcolour); + + if (symbol->symbology != BARCODE_MAXICODE) { + fprintf(fsvg, " \n", (int) ceil((symbol->width + xoffset + xoffset) * scaler), (int) ceil((symbol->height + textoffset + yoffset + yoffset) * scaler), symbol->bgcolour); + } else { + fprintf(fsvg, " \n", (int) ceil((74.0F + xoffset + xoffset) * scaler), (int) ceil((72.0F + yoffset + yoffset) * scaler), symbol->bgcolour); + } + + if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { + default_text_posn = (symbol->height + textoffset + symbol->border_width + symbol->border_width) * scaler; + } else { + default_text_posn = (symbol->height + textoffset + symbol->border_width) * scaler; + } + + if (symbol->symbology == BARCODE_MAXICODE) { + /* Maxicode uses hexagons */ + float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my; + + + textoffset = 0.0; + if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { + fprintf(fsvg, " \n", 0.0, 0.0, (74.0 + xoffset + xoffset) * scaler, symbol->border_width * scaler); + fprintf(fsvg, " \n", 0.0, (72.0 + symbol->border_width) * scaler, (74.0 + xoffset + xoffset) * scaler, symbol->border_width * scaler); + } + if (symbol->output_options & BARCODE_BOX) { + /* side bars */ + fprintf(fsvg, " \n", 0.0, 0.0, symbol->border_width * scaler, (72.0 + (2 * symbol->border_width)) * scaler); + fprintf(fsvg, " \n", (74.0 + xoffset + xoffset - symbol->border_width) * scaler, 0.0, symbol->border_width * scaler, (72.0 + (2 * symbol->border_width)) * scaler); + } + fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 10.85 * scaler, symbol->fgcolour); + fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 8.97 * scaler, symbol->bgcolour); + fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 7.10 * scaler, symbol->fgcolour); + fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 5.22 * scaler, symbol->bgcolour); + fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 3.31 * scaler, symbol->fgcolour); + fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 1.43 * scaler, symbol->bgcolour); + for (r = 0; r < symbol->rows; r++) { + for (i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, r, i)) { + /* Dump a hexagon */ + my = r * 2.135 + 1.43; + ay = my + 1.0 + yoffset; + by = my + 0.5 + yoffset; + cy = my - 0.5 + yoffset; + dy = my - 1.0 + yoffset; + ey = my - 0.5 + yoffset; + fy = my + 0.5 + yoffset; + if (r & 1) { + mx = (2.46 * i) + 1.23 + 1.23; + } else { + mx = (2.46 * i) + 1.23; + } + ax = mx + xoffset; + bx = mx + 0.86 + xoffset; + cx = mx + 0.86 + xoffset; + dx = mx + xoffset; + ex = mx - 0.86 + xoffset; + fx = mx - 0.86 + xoffset; + fprintf(fsvg, " \n", ax * scaler, ay * scaler, bx * scaler, by * scaler, cx * scaler, cy * scaler, dx * scaler, dy * scaler, ex * scaler, ey * scaler, fx * scaler, fy * scaler); + } + } + } + } + + if (symbol->symbology != BARCODE_MAXICODE) { + /* everything else uses rectangles (or squares) */ + /* Works from the bottom of the symbol up */ + int addon_latch = 0; + + for (r = 0; r < symbol->rows; r++) { + this_row = r; + if (symbol->row_height[this_row] == 0) { + row_height = large_bar_height; + } else { + row_height = symbol->row_height[this_row]; + } + row_posn = 0; + for (i = 0; i < r; i++) { + if (symbol->row_height[i] == 0) { + row_posn += large_bar_height; + } else { + row_posn += symbol->row_height[i]; + } + } + row_posn += yoffset; + + if (symbol->output_options & BARCODE_DOTTY_MODE) { + /* Use dot mode */ + for (i = 0; i < symbol->width; i++) { + if (module_is_set(symbol, this_row, i)) { + fprintf(fsvg, " \n", ((i + xoffset) * scaler) + (scaler / 2.0), (row_posn * scaler) + (scaler / 2.0), (symbol->dot_size / 2.0) * scaler, symbol->fgcolour); + } + } + } else { + /* Normal mode, with rectangles */ + i = 0; + if (module_is_set(symbol, this_row, 0)) { + latch = 1; + } else { + latch = 0; + } + + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); + if ((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_width)) { + addon_text_posn = (row_posn + 8.0) * scaler; + addon_latch = 1; + } + if (latch == 1) { + /* a bar */ + if (addon_latch == 0) { + fprintf(fsvg, " \n", (i + xoffset) * scaler, row_posn * scaler, block_width * scaler, row_height * scaler); + } else { + fprintf(fsvg, " \n", (i + xoffset) * scaler, (row_posn + 10.0) * scaler, block_width * scaler, (row_height - 5.0) * scaler); + } + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + + } while (i < symbol->width); + } + } + } + /* That's done the actual data area, everything else is human-friendly */ + + xoffset += comp_offset; + row_posn = (row_posn + large_bar_height) * scaler; + + if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || + (symbol->symbology == BARCODE_ISBNX)) { + /* guard bar extensions and text formatting for EAN8 and EAN13 */ + switch (ustrlen(local_text)) { + case 8: /* EAN-8 */ + case 11: + case 14: + fprintf(fsvg, " \n", (0 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (2 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (32 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (34 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (64 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (66 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + for (i = 0; i < 4; i++) { + textpart[i] = local_text[i]; + } + textpart[4] = '\0'; + textpos = 17; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + for (i = 0; i < 4; i++) { + textpart[i] = local_text[i + 4]; + } + textpart[4] = '\0'; + textpos = 50; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = xoffset + 86; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", addon); + fprintf(fsvg, " \n"); + break; + case 5: + textpos = xoffset + 100; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", addon); + fprintf(fsvg, " \n"); + break; + } + + break; + case 13: /* EAN 13 */ + case 16: + case 19: + fprintf(fsvg, " \n", (0 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (2 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (46 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (48 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (92 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (94 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + textpart[0] = local_text[0]; + textpart[1] = '\0'; + textpos = -7; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + for (i = 0; i < 6; i++) { + textpart[i] = local_text[i + 1]; + } + textpart[6] = '\0'; + textpos = 24; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + for (i = 0; i < 6; i++) { + textpart[i] = local_text[i + 7]; + } + textpart[6] = '\0'; + textpos = 71; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = xoffset + 114; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", addon); + fprintf(fsvg, " \n"); + break; + case 5: + textpos = xoffset + 128; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", addon); + fprintf(fsvg, " \n"); + break; + } + break; + + } + } + + if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { + /* guard bar extensions and text formatting for UPCA */ + latch = 1; + + i = 0 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if (latch == 1) { + /* a bar */ + fprintf(fsvg, " \n", (i + xoffset - comp_offset) * scaler, row_posn, block_width * scaler, 5.0 * scaler); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 11 + comp_offset); + fprintf(fsvg, " \n", (46 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (48 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + latch = 1; + i = 85 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); + if (latch == 1) { + /* a bar */ + fprintf(fsvg, " \n", (i + xoffset - comp_offset) * scaler, row_posn, block_width * scaler, 5.0 * scaler); + latch = 0; + } else { + /* a space */ + latch = 1; + } + i += block_width; + } while (i < 96 + comp_offset); + textpart[0] = local_text[0]; + textpart[1] = '\0'; + textpos = -5; + fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + for (i = 0; i < 5; i++) { + textpart[i] = local_text[i + 1]; + } + textpart[5] = '\0'; + textpos = 27; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + for (i = 0; i < 5; i++) { + textpart[i] = local_text[i + 6]; + } + textpart[6] = '\0'; + textpos = 68; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + textpart[0] = local_text[11]; + textpart[1] = '\0'; + textpos = 100; + fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = xoffset + 116; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", addon); + fprintf(fsvg, " \n"); + break; + case 5: + textpos = xoffset + 130; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", addon); + fprintf(fsvg, " \n"); + break; + } + + } + + if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { + /* guard bar extensions and text formatting for UPCE */ + fprintf(fsvg, " \n", (0 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (2 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (46 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (48 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + fprintf(fsvg, " \n", (50 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); + textpart[0] = local_text[0]; + textpart[1] = '\0'; + textpos = -5; + fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + for (i = 0; i < 6; i++) { + textpart[i] = local_text[i + 1]; + } + textpart[6] = '\0'; + textpos = 24; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + textpart[0] = local_text[7]; + textpart[1] = '\0'; + textpos = 55; + fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", textpart); + fprintf(fsvg, " \n"); + textdone = 1; + switch (strlen(addon)) { + case 2: + textpos = xoffset + 70; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", addon); + fprintf(fsvg, " \n"); + break; + case 5: + textpos = xoffset + 84; + fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", addon); + fprintf(fsvg, " \n"); + break; + } + + } + + xoffset -= comp_offset; + + switch (symbol->symbology) { + case BARCODE_MAXICODE: + /* Do nothing! (It's already been done) */ + break; + default: + if (symbol->output_options & BARCODE_BIND) { + if ((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { + /* row binding */ + if (symbol->symbology != BARCODE_CODABLOCKF) { + for (r = 1; r < symbol->rows; r++) { + fprintf(fsvg, " \n", xoffset * scaler, ((r * row_height) + yoffset - 1) * scaler, symbol->width * scaler, 2.0 * scaler); + } + } else { + for (r = 1; r < symbol->rows; r++) { + fprintf(fsvg, " \n", (xoffset + 11) * scaler, ((r * row_height) + yoffset - 1) * scaler, (symbol->width - 25) * scaler, 2.0 * scaler); + } + } + } + } + if ((symbol->output_options & BARCODE_BOX) || (symbol->output_options & BARCODE_BIND)) { + if (symbol->symbology != BARCODE_CODABLOCKF) { + fprintf(fsvg, " \n", 0.0, 0.0, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); + fprintf(fsvg, " \n", 0.0, (symbol->height + symbol->border_width) * scaler, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); + } else { + fprintf(fsvg, " \n", xoffset * scaler, 0.0, symbol->width * scaler, symbol->border_width * scaler); + fprintf(fsvg, " \n", xoffset * scaler, (symbol->height + symbol->border_width) * scaler, symbol->width * scaler, symbol->border_width * scaler); + } + } + if (symbol->output_options & BARCODE_BOX) { + /* side bars */ + fprintf(fsvg, " \n", 0.0, 0.0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); + fprintf(fsvg, " \n", (symbol->width + xoffset + xoffset - symbol->border_width) * scaler, 0.0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); + } + break; + } + + /* Put the human readable text at the bottom */ + if ((textdone == 0) && ustrlen(local_text)) { + textpos = symbol->width / 2.0; + fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); + fprintf(fsvg, " %s\n", local_text); + fprintf(fsvg, " \n"); + } + fprintf(fsvg, " \n"); + fprintf(fsvg, "\n"); + + if (symbol->output_options & BARCODE_STDOUT) { + fflush(fsvg); + } else { + fclose(fsvg); + } + + if (locale) + setlocale(LC_ALL, locale); + + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/telepen.c b/3rdparty/zint-2.6.1/backend/telepen.c new file mode 100644 index 0000000..f82c4d4 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/telepen.c @@ -0,0 +1,167 @@ +/* telepen.c - Handles Telepen and Telepen numeric */ + +/* + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#define SODIUM "0123456789X" + +#include +#include +#include +#include "common.h" + +static char *TeleTable[] = { + "1111111111111111", "1131313111", "33313111", "1111313131", "3111313111", "11333131", "13133131", "111111313111", + "31333111", "1131113131", "33113131", "1111333111", "3111113131", "1113133111", "1311133111", "111111113131", + "3131113111", "11313331", "333331", "111131113111", "31113331", "1133113111", "1313113111", "1111113331", + "31131331", "113111113111", "3311113111", "1111131331", "311111113111", "1113111331", "1311111331", "11111111113111", + "31313311", "1131311131", "33311131", "1111313311", "3111311131", "11333311", "13133311", "111111311131", + "31331131", "1131113311", "33113311", "1111331131", "3111113311", "1113131131", "1311131131", "111111113311", + "3131111131", "1131131311", "33131311", "111131111131", "3111131311", "1133111131", "1313111131", "111111131311", + "3113111311", "113111111131", "3311111131", "111113111311", "311111111131", "111311111311", "131111111311", "11111111111131", + "3131311111", "11313133", "333133", "111131311111", "31113133", "1133311111", "1313311111", "1111113133", + "313333", "113111311111", "3311311111", "11113333", "311111311111", "11131333", "13111333", "11111111311111", + "31311133", "1131331111", "33331111", " 1111311133", "3111331111", "11331133", "13131133", "111111331111", + "3113131111", "1131111133", "33111133", "111113131111", "3111111133", "111311131111", "131111131111", "111111111133", + "31311313", "113131111111", "3331111111", "1111311313", "311131111111", "11331313", "13131313", "11111131111111", + "3133111111", "1131111313", "33111313", "111133111111", "3111111313", "111313111111", "131113111111", "111111111313", + "313111111111", "1131131113", "33131113", "11113111111111", "3111131113", "113311111111", "131311111111", "111111131113", + "3113111113", "11311111111111", "331111111111", "111113111113", "31111111111111", "111311111113", "131111111113" +}; + +int telepen(struct zint_symbol *symbol, unsigned char source[], const size_t src_len) { + unsigned int i, count, check_digit; + int error_number; + char dest[512]; /*14 + 30 * 14 + 14 + 14 + 1 ~ 512 */ + + error_number = 0; + + count = 0; + + if (src_len > 30) { + strcpy(symbol->errtxt, "390: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + /* Start character */ + strcpy(dest, TeleTable['_']); + + for (i = 0; i < src_len; i++) { + if (source[i] > 126) { + /* Cannot encode extended ASCII */ + strcpy(symbol->errtxt, "391: Invalid characters in input data"); + return ZINT_ERROR_INVALID_DATA; + } + strcat(dest, TeleTable[source[i]]); + count += source[i]; + } + + check_digit = 127 - (count % 127); + if (check_digit == 127) { + check_digit = 0; + } + strcat(dest, TeleTable[check_digit]); + + /* Stop character */ + strcat(dest, TeleTable['z']); + + expand(symbol, dest); + for (i = 0; i < src_len; i++) { + if (source[i] == '\0') { + symbol->text[i] = ' '; + } else { + symbol->text[i] = source[i]; + } + } + symbol->text[src_len] = '\0'; + return error_number; +} + +int telepen_num(struct zint_symbol *symbol, unsigned char source[], const size_t src_len) { + unsigned int count, check_digit, glyph; + int error_number; + size_t i,temp_length = src_len; + char dest[1024]; /* 14 + 60 * 14 + 14 + 14 + 1 ~ 1024 */ + unsigned char temp[64]; + + count = 0; + + if (temp_length > 60) { + strcpy(symbol->errtxt, "392: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + ustrcpy(temp, source); + to_upper(temp); + error_number = is_sane(SODIUM, temp, temp_length); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "393: Invalid characters in data"); + return error_number; + } + + /* Add a leading zero if required */ + if (temp_length & 1) { + memmove(temp + 1, temp, temp_length); + temp[0] = '0'; + + temp[++temp_length] = '\0'; + } + + /* Start character */ + strcpy(dest, TeleTable['_']); + + for (i = 0; i < temp_length; i += 2) { + if (temp[i] == 'X') { + strcpy(symbol->errtxt, "394: Invalid position of X in Telepen data"); + return ZINT_ERROR_INVALID_DATA; + } + + if (temp[i + 1] == 'X') { + glyph = ctoi(temp[i]) + 17; + count += glyph; + } else { + glyph = (10 * ctoi(temp[i])) + ctoi(temp[i + 1]); + glyph += 27; + count += glyph; + } + strcat(dest, TeleTable[glyph]); + } + + check_digit = 127 - (count % 127); + if (check_digit == 127) { + check_digit = 0; + } + strcat(dest, TeleTable[check_digit]); + + /* Stop character */ + strcat(dest, TeleTable['z']); + + expand(symbol, dest); + ustrcpy(symbol->text, temp); + return error_number; +} diff --git a/3rdparty/zint-2.6.1/backend/tif.c b/3rdparty/zint-2.6.1/backend/tif.c new file mode 100644 index 0000000..7b9b360 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/tif.c @@ -0,0 +1,289 @@ +/* tif.c - Aldus Tagged Image File Format support */ + +/* + libzint - the open source barcode library + Copyright (C) 2016-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include "common.h" +#include "tif.h" +#ifdef _MSC_VER +#include +#include +#include +#endif + +int tbump_up(int input) { + /* Strings length must be a multiple of 4 bytes */ + if ((input % 2) == 1) { + input++; + } + return input; +} + +int tif_pixel_plot(struct zint_symbol *symbol, char *pixelbuf) { + int fgred, fggrn, fgblu, bgred, bggrn, bgblu; + int i; + int rows_per_strip, strip_count; + int free_memory; + int row, column; + FILE *tif_file; +#ifdef _MSC_VER + uint32_t* strip_offset; + uint32_t* strip_bytes; +#endif + + tiff_header_t header; + tiff_ifd_t ifd; + uint16_t temp; + uint32_t temp32; + + fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); + fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); + fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); + bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); + bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); + bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); + + rows_per_strip = 8192 / (symbol->bitmap_width * 3); + if (rows_per_strip == 0) { + rows_per_strip = 1; + } + + strip_count = symbol->bitmap_height / rows_per_strip; + if ((symbol->bitmap_height % rows_per_strip) != 0) { + strip_count++; + } + +#ifndef _MSC_VER + uint32_t strip_offset[strip_count]; + uint32_t strip_bytes[strip_count]; +#else + strip_offset = (uint32_t*) _alloca(strip_count * sizeof(uint32_t)); + strip_bytes = (uint32_t*) _alloca(strip_count * sizeof(uint32_t)); +#endif + free_memory = 8; + + for(i = 0; i < strip_count; i++) { + strip_offset[i] = free_memory; + if (i != (strip_count - 1)) { + strip_bytes[i] = rows_per_strip * symbol->bitmap_width * 3; + } else { + if ((symbol->bitmap_height % rows_per_strip) != 0) { + strip_bytes[i] = (symbol->bitmap_height % rows_per_strip) * symbol->bitmap_width * 3; + } else { + strip_bytes[i] = rows_per_strip * symbol->bitmap_width * 3; + } + } + free_memory += strip_bytes[i]; + if ((free_memory % 2) == 1) { + free_memory++; + } + } + + if (free_memory > 0xffff0000) { +#ifdef _MSC_VER + free(strip_offset); + free(strip_bytes); +#endif + strcpy(symbol->errtxt, "670: Output file size too big"); + return ZINT_ERROR_MEMORY; + } + + /* Open output file in binary mode */ + if (symbol->output_options & BARCODE_STDOUT) { +#ifdef _MSC_VER + if (-1 == _setmode(_fileno(stdout), _O_BINARY)) { + strcpy(symbol->errtxt, "671: Can't open output file"); + return ZINT_ERROR_FILE_ACCESS; + } +#endif + tif_file = stdout; + } else { + if (!(tif_file = fopen(symbol->outfile, "wb"))) { + strcpy(symbol->errtxt, "672: Can't open output file"); + return ZINT_ERROR_FILE_ACCESS; + } + } + + /* Header */ + header.byte_order = 0x4949; + header.identity = 42; + header.offset = free_memory; + + fwrite(&header, sizeof(tiff_header_t), 1, tif_file); + free_memory += sizeof(tiff_ifd_t); + + /* Pixel data */ + for (row = 0; row < symbol->bitmap_height; row++) { + for (column = 0; column < symbol->bitmap_width; column++) { + if (pixelbuf[(row * symbol->bitmap_width) + column] == '1') { + putc(fgred, tif_file); + putc(fggrn, tif_file); + putc(fgblu, tif_file); + } else { + putc(bgred, tif_file); + putc(bggrn, tif_file); + putc(bgblu, tif_file); + } + } + if (((row + 1) % rows_per_strip) == 0) { + /* End of a strip */ + if ((strip_bytes[0] % 2) == 1) { + /* Add end-of strip pad */ + putc(0, tif_file); + } + } + } + + /* Image File Directory */ + ifd.entries = 14; + ifd.offset = 0; + + ifd.new_subset.tag = 0xfe; + ifd.new_subset.type = 4; + ifd.new_subset.count = 1; + ifd.new_subset.offset = 0; + + ifd.image_width.tag = 0x0100; + ifd.image_width.type = 3; // SHORT + ifd.image_width.count = 1; + ifd.image_width.offset = symbol->bitmap_width; + + ifd.image_length.tag = 0x0101; + ifd.image_length.type = 3; // SHORT + ifd.image_length.count = 1; + ifd.image_length.offset = symbol->bitmap_height; + + ifd.bits_per_sample.tag = 0x0102; + ifd.bits_per_sample.type = 3; // SHORT + ifd.bits_per_sample.count = 3; + ifd.bits_per_sample.offset = free_memory; + free_memory += 6; + + ifd.compression.tag = 0x0103; + ifd.compression.type = 3; + ifd.compression.count = 1; + ifd.compression.offset = 1; // Uncompressed + + ifd.photometric.tag = 0x0106; + ifd.photometric.type = 3; // SHORT + ifd.photometric.count = 1; + ifd.photometric.offset = 2; // RGB Model + + ifd.strip_offsets.tag = 0x0111; + ifd.strip_offsets.type = 4; // LONG + ifd.strip_offsets.count = strip_count; + ifd.strip_offsets.offset = free_memory; + free_memory += strip_count * 4; + + ifd.samples_per_pixel.tag = 0x0115; + ifd.samples_per_pixel.type = 3; + ifd.samples_per_pixel.count = 1; + ifd.samples_per_pixel.offset = 3; + + ifd.rows_per_strip.tag = 0x0116; + ifd.rows_per_strip.type = 4; + ifd.rows_per_strip.count = 1; + ifd.rows_per_strip.offset = rows_per_strip; + + ifd.strip_byte_counts.tag = 0x0117; + ifd.strip_byte_counts.type = 4; + ifd.strip_byte_counts.count = strip_count; + ifd.strip_byte_counts.offset = free_memory; + free_memory += strip_count * 4; + + ifd.x_resolution.tag = 0x011a; + ifd.x_resolution.type = 5; + ifd.x_resolution.count = 1; + ifd.x_resolution.offset = free_memory; + free_memory += 8; + + ifd.y_resolution.tag = 0x011b; + ifd.y_resolution.type = 5; + ifd.y_resolution.count = 1; + ifd.y_resolution.offset = free_memory; + free_memory += 8; + + ifd.planar_config.tag = 0x11c; + ifd.planar_config.type = 3; + ifd.planar_config.count = 1; + ifd.planar_config.offset = 1; + + ifd.resolution_unit.tag = 0x0128; + ifd.resolution_unit.type = 3; + ifd.resolution_unit.count = 1; + ifd.resolution_unit.offset = 2; // Inches + + fwrite(&ifd, sizeof(tiff_ifd_t), 1, tif_file); + + /* Bits per sample */ + temp = 8; + fwrite(&temp, 2, 1, tif_file); // Red Bytes + fwrite(&temp, 2, 1, tif_file); // Green Bytes + fwrite(&temp, 2, 1, tif_file); // Blue Bytes + + /* Strip offsets */ + for(i = 0; i < strip_count; i++) { + fwrite(&strip_offset[i], 4, 1, tif_file); + } + + /* Strip byte lengths */ + for(i = 0; i < strip_count; i++) { + fwrite(&strip_bytes[i], 4, 1, tif_file); + } + + /* X Resolution */ + temp32 = 72; + fwrite(&temp32, 4, 1, tif_file); + temp32 = 1; + fwrite(&temp32, 4, 1, tif_file); + + /* Y Resolution */ + temp32 = 72; + fwrite(&temp32, 4, 1, tif_file); + temp32 = 1; + fwrite(&temp32, 4, 1, tif_file); + + if (symbol->output_options & BARCODE_STDOUT) { + fflush(tif_file); + } else { + fclose(tif_file); + } + +#ifdef _MSC_VER + free(strip_offset); + free(strip_bytes); +#endif + + return 0; +} \ No newline at end of file diff --git a/3rdparty/zint-2.6.1/backend/tif.h b/3rdparty/zint-2.6.1/backend/tif.h new file mode 100644 index 0000000..76f1960 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/tif.h @@ -0,0 +1,87 @@ +/* tif.h - Aldus Tagged Image File Format */ + +/* + libzint - the open source barcode library + Copyright (C) 2016-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ +#ifndef TIF_H +#define TIF_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef _MSC_VER +#include +#include "stdint_msvc.h" +#else +#include +#endif + +#pragma pack(1) + + typedef struct tiff_header { + uint16_t byte_order; + uint16_t identity; + uint32_t offset; + } tiff_header_t; + + typedef struct tiff_tag { + uint16_t tag; + uint16_t type; + uint32_t count; + uint32_t offset; + } tiff_tag_t; + + typedef struct tiff_ifd { + uint16_t entries; + tiff_tag_t new_subset; + tiff_tag_t image_width; + tiff_tag_t image_length; + tiff_tag_t bits_per_sample; + tiff_tag_t compression; + tiff_tag_t photometric; + tiff_tag_t strip_offsets; + tiff_tag_t samples_per_pixel; + tiff_tag_t rows_per_strip; + tiff_tag_t strip_byte_counts; + tiff_tag_t x_resolution; + tiff_tag_t y_resolution; + tiff_tag_t planar_config; + tiff_tag_t resolution_unit; + uint32_t offset; + } tiff_ifd_t; + +#pragma pack() + +#ifdef __cplusplus +} +#endif + +#endif /* TIF_H */ + diff --git a/3rdparty/zint-2.6.1/backend/upcean.c b/3rdparty/zint-2.6.1/backend/upcean.c new file mode 100644 index 0000000..d11343c --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/upcean.c @@ -0,0 +1,936 @@ +/* upcean.c - Handles UPC, EAN and ISBN + + libzint - the open source barcode library + Copyright (C) 2008-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#define SODIUM "0123456789+" +#define EAN2 102 +#define EAN5 105 + +#include +#include +#include +#include "common.h" + +/* UPC and EAN tables checked against EN 797:1996 */ + +static const char *UPCParity0[10] = { + /* Number set for UPC-E symbol (EN Table 4) */ + "BBBAAA", "BBABAA", "BBAABA", "BBAAAB", "BABBAA", "BAABBA", "BAAABB", + "BABABA", "BABAAB", "BAABAB" +}; + +static const char *UPCParity1[10] = { + /* Not covered by BS EN 797:1995 */ + "AAABBB", "AABABB", "AABBAB", "AABBBA", "ABAABB", "ABBAAB", "ABBBAA", + "ABABAB", "ABABBA", "ABBABA" +}; + +static const char *EAN2Parity[4] = { + /* Number sets for 2-digit add-on (EN Table 6) */ + "AA", "AB", "BA", "BB" +}; + +static const char *EAN5Parity[10] = { + /* Number set for 5-digit add-on (EN Table 7) */ + "BBAAA", "BABAA", "BAABA", "BAAAB", "ABBAA", "AABBA", "AAABB", "ABABA", + "ABAAB", "AABAB" +}; + +static const char *EAN13Parity[10] = { + /* Left hand of the EAN-13 symbol (EN Table 3) */ + "AAAAA", "ABABB", "ABBAB", "ABBBA", "BAABB", "BBAAB", "BBBAA", "BABAB", + "BABBA", "BBABA" +}; + +static const char *EANsetA[10] = { + /* Representation set A and C (EN Table 1) */ + "3211", "2221", "2122", "1411", "1132", "1231", "1114", "1312", "1213", "3112" +}; + +static const char *EANsetB[10] = { + /* Representation set B (EN Table 1) */ + "1123", "1222", "2212", "1141", "2311", "1321", "4111", "2131", "3121", "2113" +}; + +/* Calculate the correct check digit for a UPC barcode */ +char upc_check(char source[]) { + unsigned int i, count, check_digit; + + count = 0; + + for (i = 0; i < strlen(source); i++) { + count += ctoi(source[i]); + + if (!(i & 1)) { + count += 2 * (ctoi(source[i])); + } + } + + check_digit = 10 - (count % 10); + if (check_digit == 10) { + check_digit = 0; + } + return itoc(check_digit); +} + +/* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */ +void upca_draw(char source[], char dest[]) { + unsigned int i, half_way; + + half_way = strlen(source) / 2; + + /* start character */ + strcat(dest, "111"); + + for (i = 0; i <= strlen(source); i++) { + if (i == half_way) { + /* middle character - separates manufacturer no. from product no. */ + /* also inverts right hand characters */ + strcat(dest, "11111"); + } + + lookup(NEON, EANsetA, source[i], dest); + } + + /* stop character */ + strcat(dest, "111"); +} + +/* Make a UPC A barcode when we haven't been given the check digit */ +int upca(struct zint_symbol *symbol, unsigned char source[], char dest[]) { + int length; + char gtin[15]; + + strcpy(gtin, (char*) source); + length = strlen(gtin); + + if (length == 11) { + gtin[length] = upc_check(gtin); + gtin[length + 1] = '\0'; + } else { + gtin[length - 1] = '\0'; + if (source[length - 1] != upc_check(gtin)) { + strcpy(symbol->errtxt, "270: Invalid check digit"); + return ZINT_ERROR_INVALID_DATA; + } + gtin[length - 1] = upc_check(gtin); + } + upca_draw(gtin, dest); + ustrcpy(symbol->text, (unsigned char*) gtin); + return 0; +} + +/* UPC E is a zero-compressed version of UPC A */ +int upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) { + unsigned int i, num_system; + char emode, equivalent[12], check_digit, parity[8], temp[8]; + char hrt[9]; + + /* Two number systems can be used - system 0 and system 1 */ + if (symbol->symbology != BARCODE_UPCE_CHK) { + /* No check digit in input data */ + if (ustrlen(source) == 7) { + switch (source[0]) { + case '0': num_system = 0; + break; + case '1': num_system = 1; + break; + default: num_system = 0; + source[0] = '0'; + break; + } + strcpy(temp, (char*) source); + strcpy(hrt, (char*) source); + for (i = 1; i <= 7; i++) { + source[i - 1] = temp[i]; + } + } else { + num_system = 0; + hrt[0] = '0'; + hrt[1] = '\0'; + strcat(hrt, (char*) source); + } + } else { + /* Check digit is included in input data */ + if (ustrlen(source) == 8) { + switch (source[0]) { + case '0': num_system = 0; + break; + case '1': num_system = 1; + break; + default: num_system = 0; + source[0] = '0'; + break; + } + strcpy(temp, (char*) source); + strcpy(hrt, (char*) source); + for (i = 1; i <= 7; i++) { + source[i - 1] = temp[i]; + } + } else { + num_system = 0; + hrt[0] = '0'; + hrt[1] = '\0'; + strcat(hrt, (char*) source); + } + } + + /* Expand the zero-compressed UPCE code to make a UPCA equivalent (EN Table 5) */ + emode = source[5]; + for (i = 0; i < 11; i++) { + equivalent[i] = '0'; + } + if (num_system == 1) { + equivalent[0] = temp[0]; + } + equivalent[1] = source[0]; + equivalent[2] = source[1]; + equivalent[11] = '\0'; + + switch (emode) { + case '0': + case '1': + case '2': + equivalent[3] = emode; + equivalent[8] = source[2]; + equivalent[9] = source[3]; + equivalent[10] = source[4]; + break; + case '3': + equivalent[3] = source[2]; + equivalent[9] = source[3]; + equivalent[10] = source[4]; + if (((source[2] == '0') || (source[2] == '1')) || (source[2] == '2')) { + /* Note 1 - "X3 shall not be equal to 0, 1 or 2" */ + strcpy(symbol->errtxt, "271: Invalid UPC-E data"); + return ZINT_ERROR_INVALID_DATA; + } + break; + case '4': + equivalent[3] = source[2]; + equivalent[4] = source[3]; + equivalent[10] = source[4]; + if (source[3] == '0') { + /* Note 2 - "X4 shall not be equal to 0" */ + strcpy(symbol->errtxt, "272: Invalid UPC-E data"); + return ZINT_ERROR_INVALID_DATA; + } + break; + case '5': + case '6': + case '7': + case '8': + case '9': + equivalent[3] = source[2]; + equivalent[4] = source[3]; + equivalent[5] = source[4]; + equivalent[10] = emode; + if (source[4] == '0') { + /* Note 3 - "X5 shall not be equal to 0" */ + strcpy(symbol->errtxt, "273: Invalid UPC-E data"); + return ZINT_ERROR_INVALID_DATA; + } + break; + } + + /* Get the check digit from the expanded UPCA code */ + + check_digit = upc_check(equivalent); + + /* Use the number system and check digit information to choose a parity scheme */ + if (num_system == 1) { + strcpy(parity, UPCParity1[ctoi(check_digit)]); + } else { + strcpy(parity, UPCParity0[ctoi(check_digit)]); + } + + /* Take all this information and make the barcode pattern */ + + /* start character */ + strcat(dest, "111"); + + for (i = 0; i <= ustrlen(source); i++) { + switch (parity[i]) { + case 'A': lookup(NEON, EANsetA, source[i], dest); + break; + case 'B': lookup(NEON, EANsetB, source[i], dest); + break; + } + } + + /* stop character */ + strcat(dest, "111111"); + + if (symbol->symbology != BARCODE_UPCE_CHK) { + hrt[7] = check_digit; + hrt[8] = '\0'; + } else { + if (hrt[7] != check_digit) { + strcpy(symbol->errtxt, "274: Invalid check digit"); + return ZINT_ERROR_INVALID_DATA; + } + } + ustrcpy(symbol->text, (unsigned char*) hrt); + return 0; +} + +/* EAN-2 and EAN-5 add-on codes */ +void add_on(unsigned char source[], char dest[], int mode) { + char parity[6]; + unsigned int i, code_type; + + /* If an add-on then append with space */ + if (mode != 0) { + strcat(dest, "9"); + } + + /* Start character */ + strcat(dest, "112"); + + /* Determine EAN2 or EAN5 add-on */ + if (ustrlen(source) == 2) { + code_type = EAN2; + } else { + code_type = EAN5; + } + + /* Calculate parity for EAN2 */ + if (code_type == EAN2) { + int code_value, parity_bit; + + code_value = (10 * ctoi(source[0])) + ctoi(source[1]); + parity_bit = code_value % 4; + strcpy(parity, EAN2Parity[parity_bit]); + } + + if (code_type == EAN5) { + int values[6], parity_sum, parity_bit; + + for (i = 0; i < 6; i++) { + values[i] = ctoi(source[i]); + } + + parity_sum = (3 * (values[0] + values[2] + values[4])); + parity_sum += (9 * (values[1] + values[3])); + + parity_bit = parity_sum % 10; + strcpy(parity, EAN5Parity[parity_bit]); + } + + for (i = 0; i < ustrlen(source); i++) { + switch (parity[i]) { + case 'A': lookup(NEON, EANsetA, source[i], dest); + break; + case 'B': lookup(NEON, EANsetB, source[i], dest); + break; + } + + /* Glyph separator */ + if (i != (ustrlen(source) - 1)) { + strcat(dest, "11"); + } + } +} + +/* ************************ EAN-13 ****************** */ + +/* Calculate the correct check digit for a EAN-13 barcode */ +char ean_check(char source[]) { + int i; + unsigned int h, count, check_digit; + + count = 0; + + h = strlen(source); + for (i = h - 1; i >= 0; i--) { + count += ctoi(source[i]); + + if (i & 1) { + count += 2 * ctoi(source[i]); + } + } + check_digit = 10 - (count % 10); + if (check_digit == 10) { + check_digit = 0; + } + return itoc(check_digit); +} + +int ean13(struct zint_symbol *symbol, unsigned char source[], char dest[]) { + unsigned int length, i, half_way; + char parity[6]; + char gtin[15]; + + strcpy(parity, ""); + strcpy(gtin, (char*) source); + + /* Add the appropriate check digit */ + length = strlen(gtin); + + if (length == 12) { + gtin[length] = ean_check(gtin); + gtin[length + 1] = '\0'; + } else { + gtin[length - 1] = '\0'; + if (source[length - 1] != ean_check(gtin)) { + strcpy(symbol->errtxt, "275: Invalid check digit"); + return ZINT_ERROR_INVALID_DATA; + } + gtin[length - 1] = ean_check(gtin); + } + + /* Get parity for first half of the symbol */ + lookup(SODIUM, EAN13Parity, gtin[0], parity); + + /* Now get on with the cipher */ + half_way = 7; + + /* start character */ + strcat(dest, "111"); + length = strlen(gtin); + for (i = 1; i <= length; i++) { + if (i == half_way) { + /* middle character - separates manufacturer no. from product no. */ + /* also inverses right hand characters */ + strcat(dest, "11111"); + } + + if (((i > 1) && (i < 7)) && (parity[i - 2] == 'B')) { + lookup(NEON, EANsetB, gtin[i], dest); + } else { + lookup(NEON, EANsetA, gtin[i], dest); + } + } + + /* stop character */ + strcat(dest, "111"); + + ustrcpy(symbol->text, (unsigned char*) gtin); + return 0; +} + +/* Make an EAN-8 barcode when we haven't been given the check digit */ +int ean8(struct zint_symbol *symbol, unsigned char source[], char dest[]) { + /* EAN-8 is basically the same as UPC-A but with fewer digits */ + int length; + char gtin[10]; + + strcpy(gtin, (char*) source); + length = strlen(gtin); + + if (length == 7) { + gtin[length] = upc_check(gtin); + gtin[length + 1] = '\0'; + } else { + gtin[length - 1] = '\0'; + if (source[length - 1] != upc_check(gtin)) { + strcpy(symbol->errtxt, "276: Invalid check digit"); + return ZINT_ERROR_INVALID_DATA; + } + gtin[length - 1] = upc_check(gtin); + } + upca_draw(gtin, dest); + ustrcpy(symbol->text, (unsigned char*) gtin); + + return 0; +} + +/* For ISBN(13) only */ +char isbn13_check(unsigned char source[]) { + unsigned int i, weight, sum, check, h; + + sum = 0; + weight = 1; + h = ustrlen(source) - 1; + + for (i = 0; i < h; i++) { + sum += ctoi(source[i]) * weight; + if (weight == 1) weight = 3; + else weight = 1; + } + + check = sum % 10; + check = 10 - check; + if (check == 10) check = 0; + return itoc(check); +} + +/* For ISBN(10) and SBN only */ +char isbn_check(unsigned char source[]) { + unsigned int i, weight, sum, check, h; + char check_char; + + sum = 0; + weight = 1; + h = ustrlen(source) - 1; + + for (i = 0; i < h; i++) { + sum += ctoi(source[i]) * weight; + weight++; + } + + check = sum % 11; + check_char = itoc(check); + if (check == 10) { + check_char = 'X'; + } + return check_char; +} + +/* Make an EAN-13 barcode from an SBN or ISBN */ +static int isbn(struct zint_symbol *symbol, unsigned char source[], const size_t src_len, char dest[]) { + int i, error_number; + char check_digit; + + to_upper(source); + error_number = is_sane("0123456789X", source, src_len); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "277: Invalid characters in input"); + return error_number; + } + + /* Input must be 9, 10 or 13 characters */ + if (((src_len < 9) || (src_len > 13)) || ((src_len > 10) && (src_len < 13))) { + strcpy(symbol->errtxt, "278: Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + + if (src_len == 13) /* Using 13 character ISBN */ { + if (!(((source[0] == '9') && (source[1] == '7')) && + ((source[2] == '8') || (source[2] == '9')))) { + strcpy(symbol->errtxt, "279: Invalid ISBN"); + return ZINT_ERROR_INVALID_DATA; + } + + check_digit = isbn13_check(source); + if (source[src_len - 1] != check_digit) { + strcpy(symbol->errtxt, "280: Incorrect ISBN check"); + return ZINT_ERROR_INVALID_CHECK; + } + source[12] = '\0'; + + ean13(symbol, source, dest); + } + + if (src_len == 10) /* Using 10 digit ISBN */ { + check_digit = isbn_check(source); + if (check_digit != source[src_len - 1]) { + strcpy(symbol->errtxt, "281: Incorrect ISBN check"); + return ZINT_ERROR_INVALID_CHECK; + } + for (i = 13; i > 0; i--) { + source[i] = source[i - 3]; + } + source[0] = '9'; + source[1] = '7'; + source[2] = '8'; + source[12] = '\0'; + + ean13(symbol, source, dest); + } + + if (src_len == 9) /* Using 9 digit SBN */ { + /* Add leading zero */ + for (i = 10; i > 0; i--) { + source[i] = source[i - 1]; + } + source[0] = '0'; + + /* Verify check digit */ + check_digit = isbn_check(source); + if (check_digit != source[ustrlen(source) - 1]) { + strcpy(symbol->errtxt, "282: Incorrect SBN check"); + return ZINT_ERROR_INVALID_CHECK; + } + + /* Convert to EAN-13 number */ + for (i = 13; i > 0; i--) { + source[i] = source[i - 3]; + } + source[0] = '9'; + source[1] = '7'; + source[2] = '8'; + source[12] = '\0'; + + ean13(symbol, source, dest); + } + + return 0; +} + +/* Add leading zeroes to EAN and UPC strings */ +void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[]) { + unsigned char first_part[20], second_part[20], zfirst_part[20], zsecond_part[20]; + int with_addon = 0; + int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h; + + h = ustrlen(source); + for (i = 0; i < h; i++) { + if (source[i] == '+') { + with_addon = 1; + } else { + if (with_addon == 0) { + first_len++; + } else { + second_len++; + } + } + } + + ustrcpy(first_part, (unsigned char *) ""); + ustrcpy(second_part, (unsigned char *) ""); + ustrcpy(zfirst_part, (unsigned char *) ""); + ustrcpy(zsecond_part, (unsigned char *) ""); + + /* Split input into two strings */ + for (i = 0; i < first_len; i++) { + first_part[i] = source[i]; + first_part[i + 1] = '\0'; + } + + for (i = 0; i < second_len; i++) { + second_part[i] = source[i + first_len + 1]; + second_part[i + 1] = '\0'; + } + + /* Calculate target lengths */ + if (second_len <= 5) { + zsecond_len = 5; + } + if (second_len <= 2) { + zsecond_len = 2; + } + if (second_len == 0) { + zsecond_len = 0; + } + switch (symbol->symbology) { + case BARCODE_EANX: + case BARCODE_EANX_CC: + if (first_len <= 12) { + zfirst_len = 12; + } + if (first_len <= 7) { + zfirst_len = 7; + } + if (second_len == 0) { + if (first_len <= 5) { + zfirst_len = 5; + } + if (first_len <= 2) { + zfirst_len = 2; + } + } + break; + case BARCODE_EANX_CHK: + if (first_len <= 13) { + zfirst_len = 13; + } + if (first_len <= 8) { + zfirst_len = 8; + } + if (second_len == 0) { + if (first_len <= 5) { + zfirst_len = 5; + } + if (first_len <= 2) { + zfirst_len = 2; + } + } + break; + case BARCODE_UPCA: + case BARCODE_UPCA_CC: + zfirst_len = 11; + break; + case BARCODE_UPCA_CHK: + zfirst_len = 12; + break; + case BARCODE_UPCE: + case BARCODE_UPCE_CC: + if (first_len == 7) { + zfirst_len = 7; + } + if (first_len <= 6) { + zfirst_len = 6; + } + break; + case BARCODE_UPCE_CHK: + if (first_len == 8) { + zfirst_len = 8; + } + if (first_len <= 7) { + zfirst_len = 7; + } + break; + case BARCODE_ISBNX: + if (first_len <= 9) { + zfirst_len = 9; + } + break; + } + + + /* Add leading zeroes */ + for (i = 0; i < (zfirst_len - first_len); i++) { + strcat((char*) zfirst_part, "0"); + } + strcat((char*) zfirst_part, (char*) first_part); + for (i = 0; i < (zsecond_len - second_len); i++) { + strcat((char*) zsecond_part, "0"); + } + strcat((char*) zsecond_part, (char*) second_part); + + /* Copy adjusted data back to local_source */ + strcat((char*) local_source, (char*) zfirst_part); + if (zsecond_len != 0) { + strcat((char*) local_source, "+"); + strcat((char*) local_source, (char*) zsecond_part); + } +} + +/* splits string to parts before and after '+' parts */ +int eanx(struct zint_symbol *symbol, unsigned char source[], int src_len) { + unsigned char first_part[20] = {0}, second_part[20] = {0}, dest[1000] = {0}; + unsigned char local_source[20] = {0}; + unsigned int latch, reader, writer, with_addon; + int error_number, i; + + + with_addon = FALSE; + latch = FALSE; + writer = 0; + + if (src_len > 19) { + strcpy(symbol->errtxt, "283: Input too long"); + return ZINT_ERROR_TOO_LONG; + } + if (symbol->symbology != BARCODE_ISBNX) { + /* ISBN has it's own checking routine */ + error_number = is_sane("0123456789+", source, src_len); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "284: Invalid characters in data"); + return error_number; + } + } else { + error_number = is_sane("0123456789Xx", source, src_len); + if (error_number == ZINT_ERROR_INVALID_DATA) { + strcpy(symbol->errtxt, "285: Invalid characters in input"); + return error_number; + } + } + + /* Add leading zeroes */ + ustrcpy(local_source, (unsigned char *) ""); + if (symbol->symbology == BARCODE_ISBNX) { + to_upper(local_source); + } + + ean_leading_zeroes(symbol, source, local_source); + + for (reader = 0; reader < ustrlen(local_source); reader++) { + if (local_source[reader] == '+') { + with_addon = TRUE; + } + } + + reader = 0; + if (with_addon) { + do { + if (local_source[reader] == '+') { + first_part[writer] = '\0'; + latch = TRUE; + reader++; + writer = 0; + } + + if (latch) { + second_part[writer] = local_source[reader]; + reader++; + writer++; + } else { + first_part[writer] = local_source[reader]; + reader++; + writer++; + } + } while (reader <= ustrlen(local_source)); + } else { + strcpy((char*) first_part, (char*) local_source); + } + + switch (symbol->symbology) { + case BARCODE_EANX: + case BARCODE_EANX_CHK: + switch (ustrlen(first_part)) { + case 2: add_on(first_part, (char*) dest, 0); + ustrcpy(symbol->text, first_part); + break; + case 5: add_on(first_part, (char*) dest, 0); + ustrcpy(symbol->text, first_part); + break; + case 7: + case 8: error_number = ean8(symbol, first_part, (char*) dest); + break; + case 12: + case 13: error_number = ean13(symbol, first_part, (char*) dest); + break; + default: strcpy(symbol->errtxt, "286: Invalid length input"); + return ZINT_ERROR_TOO_LONG; + } + break; + case BARCODE_EANX_CC: + switch (ustrlen(first_part)) { /* Adds vertical separator bars according to ISO/IEC 24723 section 11.4 */ + case 7: set_module(symbol, symbol->rows, 1); + set_module(symbol, symbol->rows, 67); + set_module(symbol, symbol->rows + 1, 0); + set_module(symbol, symbol->rows + 1, 68); + set_module(symbol, symbol->rows + 2, 1); + set_module(symbol, symbol->rows + 1, 67); + symbol->row_height[symbol->rows] = 2; + symbol->row_height[symbol->rows + 1] = 2; + symbol->row_height[symbol->rows + 2] = 2; + symbol->rows += 3; + error_number = ean8(symbol, first_part, (char*) dest); + break; + case 12:set_module(symbol, symbol->rows, 1); + set_module(symbol, symbol->rows, 95); + set_module(symbol, symbol->rows + 1, 0); + set_module(symbol, symbol->rows + 1, 96); + set_module(symbol, symbol->rows + 2, 1); + set_module(symbol, symbol->rows + 2, 95); + symbol->row_height[symbol->rows] = 2; + symbol->row_height[symbol->rows + 1] = 2; + symbol->row_height[symbol->rows + 2] = 2; + symbol->rows += 3; + error_number = ean13(symbol, first_part, (char*) dest); + break; + default: strcpy(symbol->errtxt, "287: Invalid length EAN input"); + return ZINT_ERROR_TOO_LONG; + } + break; + case BARCODE_UPCA: + case BARCODE_UPCA_CHK: + if ((ustrlen(first_part) == 11) || (ustrlen(first_part) == 12)) { + error_number = upca(symbol, first_part, (char*) dest); + } else { + strcpy(symbol->errtxt, "288: Input wrong length (C6I)"); + return ZINT_ERROR_TOO_LONG; + } + break; + case BARCODE_UPCA_CC: + if (ustrlen(first_part) == 11) { + set_module(symbol, symbol->rows, 1); + set_module(symbol, symbol->rows, 95); + set_module(symbol, symbol->rows + 1, 0); + set_module(symbol, symbol->rows + 1, 96); + set_module(symbol, symbol->rows + 2, 1); + set_module(symbol, symbol->rows + 2, 95); + symbol->row_height[symbol->rows] = 2; + symbol->row_height[symbol->rows + 1] = 2; + symbol->row_height[symbol->rows + 2] = 2; + symbol->rows += 3; + error_number = upca(symbol, first_part, (char*) dest); + } else { + strcpy(symbol->errtxt, "289: UPCA input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + break; + case BARCODE_UPCE: + case BARCODE_UPCE_CHK: + if ((ustrlen(first_part) >= 6) && (ustrlen(first_part) <= 8)) { + error_number = upce(symbol, first_part, (char*) dest); + } else { + strcpy(symbol->errtxt, "290: Input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + break; + case BARCODE_UPCE_CC: + if ((ustrlen(first_part) >= 6) && (ustrlen(first_part) <= 7)) { + set_module(symbol, symbol->rows, 1); + set_module(symbol, symbol->rows, 51); + set_module(symbol, symbol->rows + 1, 0); + set_module(symbol, symbol->rows + 1, 52); + set_module(symbol, symbol->rows + 2, 1); + set_module(symbol, symbol->rows + 2, 51); + symbol->row_height[symbol->rows] = 2; + symbol->row_height[symbol->rows + 1] = 2; + symbol->row_height[symbol->rows + 2] = 2; + symbol->rows += 3; + error_number = upce(symbol, first_part, (char*) dest); + } else { + strcpy(symbol->errtxt, "291: UPCE input wrong length"); + return ZINT_ERROR_TOO_LONG; + } + break; + case BARCODE_ISBNX: + error_number = isbn(symbol, first_part, ustrlen(first_part), (char*) dest); + break; + } + + if (error_number > 4) { + return error_number; + } + + switch (ustrlen(second_part)) { + case 0: break; + case 2: + add_on(second_part, (char*) dest, 1); + strcat((char*) symbol->text, "+"); + strcat((char*) symbol->text, (char*) second_part); + break; + case 5: + add_on(second_part, (char*) dest, 1); + strcat((char*) symbol->text, "+"); + strcat((char*) symbol->text, (char*) second_part); + break; + default: + strcpy(symbol->errtxt, "292: Invalid length input"); + return ZINT_ERROR_TOO_LONG; + } + + expand(symbol, (char*) dest); + + switch (symbol->symbology) { + case BARCODE_EANX_CC: + case BARCODE_UPCA_CC: + case BARCODE_UPCE_CC: + /* shift the symbol to the right one space to allow for separator bars */ + for (i = (symbol->width + 1); i >= 1; i--) { + if (module_is_set(symbol, symbol->rows - 1, i - 1)) { + set_module(symbol, symbol->rows - 1, i); + } else { + unset_module(symbol, symbol->rows - 1, i); + } + } + unset_module(symbol, symbol->rows - 1, 0); + symbol->width += 2; + break; + } + + return 0; +} diff --git a/3rdparty/zint-2.6.1/backend/zint.h b/3rdparty/zint-2.6.1/backend/zint.h new file mode 100644 index 0000000..988db7d --- /dev/null +++ b/3rdparty/zint-2.6.1/backend/zint.h @@ -0,0 +1,283 @@ +/* zint.h - definitions for libzint + + libzint - the open source barcode library + Copyright (C) 2009-2017 Robin Stuart + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the project nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + */ + +#ifndef ZINT_H +#define ZINT_H + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + + struct zint_render_line { + float x, y, length, width; + struct zint_render_line *next; /* Pointer to next line */ + }; + + struct zint_render_string { + float x, y, fsize; + float width; /* Suggested string width, may be 0 if none recommended */ + int length; + unsigned char *text; + struct zint_render_string *next; /* Pointer to next character */ + }; + + struct zint_render_ring { + float x, y, radius, line_width; + struct zint_render_ring *next; /* Pointer to next ring */ + }; + + struct zint_render_hexagon { + float x, y; + struct zint_render_hexagon *next; /* Pointer to next hexagon */ + }; + + struct zint_render { + float width, height; + struct zint_render_line *lines; /* Pointer to first line */ + struct zint_render_string *strings; /* Pointer to first string */ + struct zint_render_ring *rings; /* Pointer to first ring */ + struct zint_render_hexagon *hexagons; /* Pointer to first hexagon */ + }; + + struct zint_symbol { + int symbology; + int height; + int whitespace_width; + int border_width; + int output_options; + char fgcolour[10]; + char bgcolour[10]; + char outfile[256]; + float scale; + int option_1; + int option_2; + int option_3; + int show_hrt; + int input_mode; + int eci; + unsigned char text[128]; + int rows; + int width; + char primary[128]; + unsigned char encoded_data[200][143]; + int row_height[200]; /* Largest symbol is 189 x 189 Han Xin */ + char errtxt[100]; + char *bitmap; + int bitmap_width; + int bitmap_height; + unsigned int bitmap_byte_length; + float dot_size; + struct zint_render *rendered; + int debug; + }; + +#define ZINT_VERSION_MAJOR 2 +#define ZINT_VERSION_MINOR 6 +#define ZINT_VERSION_RELEASE 1 + + /* Tbarcode 7 codes */ +#define BARCODE_CODE11 1 +#define BARCODE_C25MATRIX 2 +#define BARCODE_C25INTER 3 +#define BARCODE_C25IATA 4 +#define BARCODE_C25LOGIC 6 +#define BARCODE_C25IND 7 +#define BARCODE_CODE39 8 +#define BARCODE_EXCODE39 9 +#define BARCODE_EANX 13 +#define BARCODE_EANX_CHK 14 +#define BARCODE_EAN128 16 +#define BARCODE_CODABAR 18 +#define BARCODE_CODE128 20 +#define BARCODE_DPLEIT 21 +#define BARCODE_DPIDENT 22 +#define BARCODE_CODE16K 23 +#define BARCODE_CODE49 24 +#define BARCODE_CODE93 25 +#define BARCODE_FLAT 28 +#define BARCODE_RSS14 29 +#define BARCODE_RSS_LTD 30 +#define BARCODE_RSS_EXP 31 +#define BARCODE_TELEPEN 32 +#define BARCODE_UPCA 34 +#define BARCODE_UPCA_CHK 35 +#define BARCODE_UPCE 37 +#define BARCODE_UPCE_CHK 38 +#define BARCODE_POSTNET 40 +#define BARCODE_MSI_PLESSEY 47 +#define BARCODE_FIM 49 +#define BARCODE_LOGMARS 50 +#define BARCODE_PHARMA 51 +#define BARCODE_PZN 52 +#define BARCODE_PHARMA_TWO 53 +#define BARCODE_PDF417 55 +#define BARCODE_PDF417TRUNC 56 +#define BARCODE_MAXICODE 57 +#define BARCODE_QRCODE 58 +#define BARCODE_CODE128B 60 +#define BARCODE_AUSPOST 63 +#define BARCODE_AUSREPLY 66 +#define BARCODE_AUSROUTE 67 +#define BARCODE_AUSREDIRECT 68 +#define BARCODE_ISBNX 69 +#define BARCODE_RM4SCC 70 +#define BARCODE_DATAMATRIX 71 +#define BARCODE_EAN14 72 +#define BARCODE_CODABLOCKF 74 +#define BARCODE_NVE18 75 +#define BARCODE_JAPANPOST 76 +#define BARCODE_KOREAPOST 77 +#define BARCODE_RSS14STACK 79 +#define BARCODE_RSS14STACK_OMNI 80 +#define BARCODE_RSS_EXPSTACK 81 +#define BARCODE_PLANET 82 +#define BARCODE_MICROPDF417 84 +#define BARCODE_ONECODE 85 +#define BARCODE_PLESSEY 86 + + /* Tbarcode 8 codes */ +#define BARCODE_TELEPEN_NUM 87 +#define BARCODE_ITF14 89 +#define BARCODE_KIX 90 +#define BARCODE_AZTEC 92 +#define BARCODE_DAFT 93 +#define BARCODE_MICROQR 97 + + /* Tbarcode 9 codes */ +#define BARCODE_HIBC_128 98 +#define BARCODE_HIBC_39 99 +#define BARCODE_HIBC_DM 102 +#define BARCODE_HIBC_QR 104 +#define BARCODE_HIBC_PDF 106 +#define BARCODE_HIBC_MICPDF 108 +#define BARCODE_HIBC_BLOCKF 110 +#define BARCODE_HIBC_AZTEC 112 + + /* Tbarcode 10 codes */ +#define BARCODE_DOTCODE 115 +#define BARCODE_HANXIN 116 + + /* Zint specific */ +#define BARCODE_AZRUNE 128 +#define BARCODE_CODE32 129 +#define BARCODE_EANX_CC 130 +#define BARCODE_EAN128_CC 131 +#define BARCODE_RSS14_CC 132 +#define BARCODE_RSS_LTD_CC 133 +#define BARCODE_RSS_EXP_CC 134 +#define BARCODE_UPCA_CC 135 +#define BARCODE_UPCE_CC 136 +#define BARCODE_RSS14STACK_CC 137 +#define BARCODE_RSS14_OMNI_CC 138 +#define BARCODE_RSS_EXPSTACK_CC 139 +#define BARCODE_CHANNEL 140 +#define BARCODE_CODEONE 141 +#define BARCODE_GRIDMATRIX 142 +#define BARCODE_UPNQR 143 + +// Output options +#define BARCODE_NO_ASCII 1 +#define BARCODE_BIND 2 +#define BARCODE_BOX 4 +#define BARCODE_STDOUT 8 +#define READER_INIT 16 +#define SMALL_TEXT 32 +#define BOLD_TEXT 64 +#define CMYK_COLOUR 128 +#define BARCODE_DOTTY_MODE 256 + +// Input data types +#define DATA_MODE 0 +#define UNICODE_MODE 1 +#define GS1_MODE 2 +#define KANJI_MODE 3 +#define SJIS_MODE 4 + +// Data Matrix specific options +#define DM_SQUARE 100 +#define DM_DMRE 101 + +// Warning and error conditions +#define ZINT_WARN_INVALID_OPTION 2 +#define ZINT_WARN_USES_ECI 3 +#define ZINT_ERROR_TOO_LONG 5 +#define ZINT_ERROR_INVALID_DATA 6 +#define ZINT_ERROR_INVALID_CHECK 7 +#define ZINT_ERROR_INVALID_OPTION 8 +#define ZINT_ERROR_ENCODING_PROBLEM 9 +#define ZINT_ERROR_FILE_ACCESS 10 +#define ZINT_ERROR_MEMORY 11 + +// Raster file types +#define OUT_BUFFER 0 +#define OUT_PNG_FILE 100 +#define OUT_BMP_FILE 120 +#define OUT_GIF_FILE 140 +#define OUT_PCX_FILE 160 +#define OUT_JPG_FILE 180 +#define OUT_TIF_FILE 200 + +#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_MSC_VER) +#if defined (DLL_EXPORT) || defined(PIC) || defined(_USRDLL) +#define ZINT_EXTERN __declspec(dllexport) +#elif defined(ZINT_DLL) +#define ZINT_EXTERN __declspec(dllimport) +#else +#define ZINT_EXTERN extern +#endif +#else +#define ZINT_EXTERN extern +#endif + + ZINT_EXTERN struct zint_symbol *ZBarcode_Create(void); + ZINT_EXTERN void ZBarcode_Clear(struct zint_symbol *symbol); + ZINT_EXTERN void ZBarcode_Delete(struct zint_symbol *symbol); + + ZINT_EXTERN int ZBarcode_Encode(struct zint_symbol *symbol, const unsigned char *input, int length); + ZINT_EXTERN int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename); + ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle); + ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle); + ZINT_EXTERN int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle); + + ZINT_EXTERN int ZBarcode_Render(struct zint_symbol *symbol, const float width, const float height); + + ZINT_EXTERN int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle); + ZINT_EXTERN int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle); + ZINT_EXTERN int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle); + + ZINT_EXTERN int ZBarcode_ValidID(int symbol_id); + ZINT_EXTERN int ZBarcode_Version(); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* ZINT_H */ diff --git a/3rdparty/zint-2.6.1/backend_qt/CMakeLists.txt b/3rdparty/zint-2.6.1/backend_qt/CMakeLists.txt new file mode 100644 index 0000000..9a34e3b --- /dev/null +++ b/3rdparty/zint-2.6.1/backend_qt/CMakeLists.txt @@ -0,0 +1,21 @@ +# (c) 2008 by BogDan Vatra < bogdan@licentia.eu > + +project(QZint) + +include_directories(BEFORE "${CMAKE_SOURCE_DIR}/backend" ) + +set(QZint_SRCS qzint.cpp) + +add_library(QZint SHARED ${QZint_SRCS}) + +set_target_properties(QZint PROPERTIES SOVERSION "${ZINT_VERSION_MAJOR}.${ZINT_VERSION_MINOR}" + VERSION ${ZINT_VERSION}) + +add_dependencies(QZint zint) + +link_directories( "${CMAKE_BINARY_DIR}/backend" ) + +target_link_libraries(QZint zint Qt5::Widgets Qt5::Gui ) + +install(TARGETS QZint ${INSTALL_TARGETS_DEFAULT_ARGS} ) +install(FILES qzint.h DESTINATION ${INCLUDE_INSTALL_DIR} COMPONENT Devel) diff --git a/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro b/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro new file mode 100644 index 0000000..e0032e9 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro @@ -0,0 +1,120 @@ +DEFINES += NO_PNG +TEMPLATE = lib + +contains(CONFIG, static_build){ + CONFIG += staticlib + DEFINES += HAVE_STATIC_BUILD +} + +!contains(CONFIG, staticlib){ + CONFIG += dll + DEFINES += QZINT_LIBRARY +} + +include(../../../common.pri) + +macx{ + CONFIG -= dll + CONFIG += lib_bundle +} + +unix{ + CONFIG += plugin +} + +#VERSION = 2.4.4 + +INCLUDEPATH += $$PWD/../backend +DEFINES += _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS ZINT_VERSION=\\\"$$VERSION\\\" +contains(CONFIG,release) { + TARGET = QtZint +} else { + TARGET = QtZintd +} + +!contains(DEFINES, NO_PNG) { + SOURCES += $$PWD/../backend/png.c + LIBS += -lpng +} + + +win32-msvc* { + DEFINES += _CRT_SECURE_NO_WARNINGS + #QMAKE_CFLAGS += /TP /wd4018 /wd4244 /wd4305 + #QMAKE_CXXFLAGS += /TP /wd4018 /wd4244 /wd4305 +} + + +INCLUDEPATH += zint zint/backend zint/backend_qt + +HEADERS += $$PWD/../backend/aztec.h \ + $$PWD/../backend/bmp.h \ + $$PWD/../backend/code49.h \ + $$PWD/../backend/common.h \ + $$PWD/../backend/composite.h \ + $$PWD/../backend/dmatrix.h \ + $$PWD/../backend/eci.h \ + $$PWD/../backend/font.h \ + $$PWD/../backend/gridmtx.h \ + $$PWD/../backend/gs1.h \ + $$PWD/../backend/hanxin.h \ + $$PWD/../backend/large.h \ + $$PWD/../backend/maxicode.h \ + $$PWD/../backend/pcx.h \ + $$PWD/../backend/pdf417.h \ + $$PWD/../backend/reedsol.h \ + $$PWD/../backend/rss.h \ + $$PWD/../backend/sjis.h \ + $$PWD/../backend/stdint_msvc.h \ + $$PWD/../backend/zint.h \ + $$PWD/qzint.h + +SOURCES += $$PWD/../backend/2of5.c \ + $$PWD/../backend/auspost.c \ + $$PWD/../backend/aztec.c \ + $$PWD/../backend/bmp.c \ + $$PWD/../backend/codablock.c \ + $$PWD/../backend/code.c \ + $$PWD/../backend/code1.c \ + $$PWD/../backend/code128.c \ + $$PWD/../backend/code16k.c \ + $$PWD/../backend/code49.c \ + $$PWD/../backend/common.c \ + $$PWD/../backend/composite.c \ + $$PWD/../backend/dllversion.c \ + $$PWD/../backend/dmatrix.c \ + $$PWD/../backend/dotcode.c \ + $$PWD/../backend/eci.c \ + $$PWD/../backend/emf.c \ + $$PWD/../backend/gif.c \ + $$PWD/../backend/gridmtx.c \ + $$PWD/../backend/gs1.c \ + $$PWD/../backend/hanxin.c \ + $$PWD/../backend/imail.c \ + $$PWD/../backend/large.c \ + $$PWD/../backend/library.c \ + $$PWD/../backend/maxicode.c \ + $$PWD/../backend/medical.c \ + $$PWD/../backend/pcx.c \ + $$PWD/../backend/pdf417.c \ + $$PWD/../backend/plessey.c \ + $$PWD/../backend/png.c \ + $$PWD/../backend/postal.c \ + $$PWD/../backend/ps.c \ + $$PWD/../backend/qr.c \ + $$PWD/../backend/raster.c \ + $$PWD/../backend/reedsol.c \ + $$PWD/../backend/render.c \ + $$PWD/../backend/rss.c \ + $$PWD/../backend/svg.c \ + $$PWD/../backend/telepen.c \ + $$PWD/../backend/tif.c \ + $$PWD/../backend/upcean.c \ + $$PWD/qzint.cpp + +DESTDIR = $${DEST_LIBS} +#DLLDESTDIR = $${DESTDIR} +unix { + target.path = $${DESTDIR} + INSTALLS = target +} diff --git a/3rdparty/zint-2.6.1/backend_qt/backend_vc8.pro b/3rdparty/zint-2.6.1/backend_qt/backend_vc8.pro new file mode 100644 index 0000000..7a7a12a --- /dev/null +++ b/3rdparty/zint-2.6.1/backend_qt/backend_vc8.pro @@ -0,0 +1,71 @@ +win32 { + TEMPLATE = vclib + CONFIG += staticlib debug-and-release +} + +TARGET = QtZint2 +VERSION = 2.3.0 + +QMAKE_CFLAGS += /TP /wd4018 /wd4244 /wd4305 +QMAKE_CXXFLAGS += /TP /wd4018 /wd4244 /wd4305 + +INCLUDEPATH += ../backend d:\\opt\\include + +DEFINES += _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS ZINT_VERSION=\\\"$$VERSION\\\" include="" + +!contains(DEFINES, NO_PNG) { + SOURCES += ../backend/png.c +} + +HEADERS += ../backend/aztec.h \ + ../backend/code1.h \ + ../backend/code49.h \ + ../backend/common.h \ + ../backend/composite.h \ + ../backend/dmatrix.h \ + ../backend/font.h \ + ../backend/gb2312.h \ + ../backend/gridmtx.h \ + ../backend/gs1.h \ + ../backend/large.h \ + ../backend/maxicode.h \ + ../backend/maxihex.h \ + ../backend/ms_stdint.h \ + ../backend/pdf417.h \ + ../backend/qr.h \ + ../backend/reedsol.h \ + ../backend/rss.h \ + ../backend/sjis.h \ + ../backend/zint.h \ + qzint.h + +SOURCES += ../backend/2of5.c \ + ../backend/auspost.c \ + ../backend/aztec.c \ + ../backend/code.c \ + ../backend/code1.c \ + ../backend/code128.c \ + ../backend/code16k.c \ + ../backend/code49.c \ + ../backend/common.c \ + ../backend/composite.c \ + ../backend/dmatrix.c \ + ../backend/gridmtx.c \ + ../backend/gs1.c \ + ../backend/imail.c \ + ../backend/large.c \ + ../backend/library.c \ + ../backend/maxicode.c \ + ../backend/medical.c \ + ../backend/pdf417.c \ + ../backend/plessey.c \ + ../backend/postal.c \ + ../backend/ps.c \ + ../backend/qr.c \ + ../backend/reedsol.c \ + ../backend/render.c \ + ../backend/rss.c \ + ../backend/svg.c \ + ../backend/telepen.c \ + ../backend/upcean.c \ + qzint.cpp diff --git a/3rdparty/zint-2.6.1/backend_qt/qzint.cpp b/3rdparty/zint-2.6.1/backend_qt/qzint.cpp new file mode 100644 index 0000000..ba5815f --- /dev/null +++ b/3rdparty/zint-2.6.1/backend_qt/qzint.cpp @@ -0,0 +1,692 @@ +/*************************************************************************** + * Copyright (C) 2008 by BogDan Vatra * + * bogdan@licentia.eu * + * Copyright (C) 2010-2017 Robin Stuart * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#include "qzint.h" +#include + +namespace Zint { + + static const qreal maxi_diagonal = 11; + static const qreal maxi_width = 1.73205807568877 * maxi_diagonal / 2; + static const char* fontstyle = "Arial"; + static const int fontPixelSizeSmall = 6; + static const int fontPixelSizeLarge = 8; + + QZint::QZint() { + m_symbol = BARCODE_CODE128; + m_height = 50; + m_border = NO_BORDER; + m_borderWidth = 0; + m_securityLevel = -1; + m_pdf417CodeWords = 928; + m_fgColor = Qt::black; + m_bgColor = Qt::white; + m_zintSymbol = 0; + m_error = 0; + m_input_mode = UNICODE_MODE; + m_scale = 1.0; + m_option_3 = 0; + m_hidetext = 0; + m_dot_size = 4.0 / 5.0; + target_size_horiz = 0; + target_size_vert = 0; + m_width = 0; + m_whitespace = 0; + } + + QZint::~QZint() { + if (m_zintSymbol) + ZBarcode_Delete(m_zintSymbol); + } + + void QZint::encode() { + if (m_zintSymbol) + ZBarcode_Delete(m_zintSymbol); + + m_lastError.clear(); + m_zintSymbol = ZBarcode_Create(); + m_zintSymbol->output_options = m_border; + m_zintSymbol->symbology = m_symbol; + m_zintSymbol->height = m_height; + m_zintSymbol->whitespace_width = m_whitespace; + m_zintSymbol->border_width = m_borderWidth; + m_zintSymbol->option_1 = m_securityLevel; + m_zintSymbol->input_mode = m_input_mode; + m_zintSymbol->option_2 = m_width; + m_zintSymbol->dot_size = m_dot_size; + if (m_hidetext) { + m_zintSymbol->show_hrt = 0; + } else { + m_zintSymbol->show_hrt = 1; + } + if (m_symbol == BARCODE_PDF417) { + m_zintSymbol->option_3 = m_pdf417CodeWords; + } else { + m_zintSymbol->option_3 = m_option_3; + } + QByteArray bstr = m_text.toUtf8(); + QByteArray pstr = m_primaryMessage.left(99).toLatin1(); + strcpy(m_zintSymbol->primary, pstr.data()); + int error = ZBarcode_Encode(m_zintSymbol, (unsigned char*) bstr.data(), bstr.length()); + if (error > ZINT_WARN_INVALID_OPTION) + m_lastError = m_zintSymbol->errtxt; + + if (m_zintSymbol->symbology == BARCODE_MAXICODE) + m_zintSymbol->height = 33; + + switch (m_zintSymbol->output_options) { + case 0: m_border = NO_BORDER; + break; + case 2: m_border = BIND; + break; + case 4: m_border = BOX; + break; + } + m_borderWidth = m_zintSymbol->border_width; + m_whitespace = m_zintSymbol->whitespace_width; + } + + int QZint::symbol() { + return m_symbol; + } + + void QZint::setSymbol(int symbol) { + m_symbol = symbol; + } + + void QZint::setInputMode(int input_mode) { + m_input_mode = input_mode; + } + + QString QZint::text() { + return m_text; + } + + void QZint::setText(const QString & text) { + m_text = text; + } + + void QZint::setTargetSize(int width, int height) { + target_size_horiz = width; + target_size_vert = height; + } + + QString QZint::primaryMessage() { + return m_primaryMessage; + } + + void QZint::setPrimaryMessage(const QString & primaryMessage) { + m_primaryMessage = primaryMessage; + } + + int QZint::height() { + encode(); + return (m_zintSymbol->height + (m_border != NO_BORDER) ? m_borderWidth * 2 : 0)*(m_zintSymbol->symbology == BARCODE_MAXICODE ? (maxi_width + 1) : 1); + } + + void QZint::setHeight(int height) { + m_height = height; + } + + void QZint::setWidth(int width) { + m_width = width; + } + + void QZint::setOption3(int option) { + m_option_3 = option; + } + + int QZint::width() { + encode(); + return (m_zintSymbol->width + (m_border == BOX) ? m_borderWidth * 2 : 0)*(m_zintSymbol->symbology == BARCODE_MAXICODE ? (maxi_width + 1) : 1); + } + + float QZint::scale() { + return m_scale; + } + + void QZint::setScale(float scale) { + m_scale = scale; + } + + void QZint::setDotSize(float dot_size) { + m_dot_size = dot_size; + } + + QColor QZint::fgColor() { + return m_fgColor; + } + + void QZint::setFgColor(const QColor & fgColor) { + m_fgColor = fgColor; + } + + QColor QZint::bgColor() { + return m_bgColor; + } + + void QZint::setBgColor(const QColor & bgColor) { + m_bgColor = bgColor; + } + + QZint::BorderType QZint::borderType() { + return m_border; + } + + void QZint::setBorderType(BorderType border) { + m_border = border; + } + + int QZint::borderWidth() { + return m_borderWidth; + } + + void QZint::setBorderWidth(int boderWidth) { + if (boderWidth < 0 || boderWidth > 16) + boderWidth = 0; + m_borderWidth = boderWidth; + } + + void QZint::setWhitespace(int whitespace) { + m_whitespace = whitespace; + } + + int QZint::pdf417CodeWords() { + return m_pdf417CodeWords; + } + + void QZint::setPdf417CodeWords(int pdf417CodeWords) { + m_pdf417CodeWords = pdf417CodeWords; + } + + int QZint::securityLevel() { + return m_securityLevel; + } + + void QZint::setSecurityLevel(int securityLevel) { + m_securityLevel = securityLevel; + } + + QString QZint::error_message() { + return m_lastError; + } + + int QZint::mode() { + return m_securityLevel; + } + + void QZint::setMode(int securityLevel) { + m_securityLevel = securityLevel; + } + + void QZint::setHideText(bool hide) { + m_hidetext = hide; + } + + bool QZint::save_to_file(QString filename) { + if (m_zintSymbol) + ZBarcode_Delete(m_zintSymbol); + + QString fg_colour_hash = m_fgColor.name(); + QString bg_colour_hash = m_bgColor.name(); + + m_lastError.clear(); + m_zintSymbol = ZBarcode_Create(); + m_zintSymbol->output_options = m_border; + m_zintSymbol->symbology = m_symbol; + m_zintSymbol->height = m_height; + m_zintSymbol->whitespace_width = m_whitespace; + m_zintSymbol->border_width = m_borderWidth; + m_zintSymbol->option_1 = m_securityLevel; + m_zintSymbol->input_mode = m_input_mode; + m_zintSymbol->option_2 = m_width; + m_zintSymbol->dot_size = m_dot_size; + if (m_hidetext) { + m_zintSymbol->show_hrt = 0; + } else { + m_zintSymbol->show_hrt = 1; + } + if (m_symbol == BARCODE_PDF417) { + m_zintSymbol->option_3 = m_pdf417CodeWords; + } else { + m_zintSymbol->option_3 = m_option_3; + } + m_zintSymbol->scale = m_scale; + QByteArray bstr = m_text.toUtf8(); + QByteArray pstr = m_primaryMessage.left(99).toLatin1(); + QByteArray fstr = filename.left(255).toLatin1(); + strcpy(m_zintSymbol->primary, pstr.data()); + strcpy(m_zintSymbol->outfile, fstr.data()); + QByteArray fgcol = fg_colour_hash.right(6).toLatin1(); + QByteArray bgcol = bg_colour_hash.right(6).toLatin1(); + strcpy(m_zintSymbol->fgcolour, fgcol.data()); + strcpy(m_zintSymbol->bgcolour, bgcol.data()); + int error = ZBarcode_Encode_and_Print(m_zintSymbol, (unsigned char*) bstr.data(), bstr.length(), 0); + if (error > ZINT_WARN_INVALID_OPTION) { + m_lastError = m_zintSymbol->errtxt; + } + if (error == 0) { + return true; + } else { + return false; + } + } + + int QZint::module_set(int y_coord, int x_coord) { + int x_char, x_sub, result; + + x_char = x_coord / 7; + x_sub = x_coord % 7; + result = 0; + + if (m_zintSymbol->encoded_data[y_coord][x_char] & (0x01 << x_sub)) { + result = 1; + } + + return result; + } + + void QZint::render(QPainter & painter, const QRectF & paintRect, AspectRatioMode mode) { + bool textdone; + int comp_offset = 0; + int xoffset = m_whitespace; + int j, main_width = 0, addon_text_height = 0; + int yoffset = 0; + + encode(); + + QString caption = QString::fromUtf8((const char *) m_zintSymbol->text, -1); + QFont fontSmall(fontstyle); + fontSmall.setPixelSize(fontPixelSizeSmall); + QFont fontLarge(fontstyle); + fontLarge.setPixelSize(fontPixelSizeLarge); + + if (m_lastError.length()) { + fontLarge.setPointSize(14); + painter.setFont(fontLarge); + painter.drawText(paintRect, Qt::AlignCenter, m_lastError); + return; + } + + painter.save(); + painter.setClipRect(paintRect, Qt::IntersectClip); + + qreal xtr = paintRect.x(); + qreal ytr = paintRect.y(); + + int zrow_height = m_zintSymbol->height; + int zrows = 0; + for (int i = 0; i < m_zintSymbol->rows; i++) { + zrow_height -= m_zintSymbol->row_height[i]; + if (!m_zintSymbol->row_height[i]) + zrows++; + } + if (zrows) { + zrow_height /= zrows; + for (int i = 0; i < m_zintSymbol->rows; i++) + if (!m_zintSymbol->row_height[i]) + m_zintSymbol->row_height[i] = zrow_height; + } else + m_zintSymbol->height -= zrow_height; + + + qreal gwidth = m_zintSymbol->width; + qreal gheight = m_zintSymbol->height; + if (m_zintSymbol->symbology == BARCODE_MAXICODE) { + gwidth = (33.0 * maxi_width); + gheight = (32.0 * maxi_width); + } + + if (m_zintSymbol->output_options & BARCODE_DOTTY_MODE) { + gwidth += 2.0; + gheight += 2.0; + } + + qreal xsf = 1; + qreal ysf = 1; + qreal textoffset = 0; + + gwidth += ((m_border == BOX) ? m_borderWidth * 2 : 0); + gheight += ((m_border != NO_BORDER) ? m_borderWidth * 2 : 0); + if (QString((const char*) m_zintSymbol->text).isEmpty() == false) { + textoffset = 9; + gheight += textoffset; + } else { + textoffset = 0; + } + gwidth += m_zintSymbol->whitespace_width * 2; + + if (paintRect.width() / gwidth < paintRect.height() / gheight) { + ysf = xsf = (qreal) paintRect.width() / gwidth; + ytr += (qreal) (paintRect.height() - gheight * ysf) / 2; + } else { + ysf = xsf = (qreal) paintRect.height() / gheight; + xtr += (qreal) (paintRect.width() - gwidth * xsf) / 2; + } + + painter.setBackground(QBrush(m_bgColor)); + painter.fillRect(paintRect, QBrush(m_bgColor)); + painter.translate(xtr, ytr); + painter.scale(xsf, ysf); + + QPen p; + + p.setColor(m_fgColor); + p.setWidth(m_borderWidth); + painter.setPen(p); + + if (m_zintSymbol->symbology != BARCODE_MAXICODE) { + /* Draw boundary bars or boxes around the symbol */ + switch (m_border) { + case BOX: + painter.fillRect(0, m_borderWidth, m_borderWidth, m_zintSymbol->height, QBrush(m_fgColor)); + painter.fillRect(m_zintSymbol->width + m_zintSymbol->whitespace_width + m_zintSymbol->whitespace_width + m_borderWidth, m_borderWidth, m_borderWidth, m_zintSymbol->height, QBrush(m_fgColor)); + painter.fillRect(0, 0, m_zintSymbol->width + m_zintSymbol->whitespace_width + m_zintSymbol->whitespace_width + m_borderWidth + m_borderWidth, m_borderWidth, QBrush(m_fgColor)); + painter.fillRect(0, m_zintSymbol->height + m_borderWidth, m_zintSymbol->width + m_zintSymbol->whitespace_width + m_zintSymbol->whitespace_width + m_borderWidth + m_borderWidth, m_borderWidth, QBrush(m_fgColor)); + painter.translate(m_borderWidth + m_zintSymbol->whitespace_width, m_borderWidth); + yoffset = m_borderWidth; + break; + case BIND: + if (m_zintSymbol->symbology != BARCODE_CODABLOCKF) { + painter.fillRect(0, 0, m_zintSymbol->width + m_zintSymbol->whitespace_width + m_zintSymbol->whitespace_width, m_borderWidth, QBrush(m_fgColor)); + painter.fillRect(0, m_zintSymbol->height, m_zintSymbol->width + m_zintSymbol->whitespace_width + m_zintSymbol->whitespace_width, m_borderWidth, QBrush(m_fgColor)); + } else { + painter.fillRect(m_zintSymbol->whitespace_width, 0, m_zintSymbol->width, m_borderWidth, QBrush(m_fgColor)); + painter.fillRect(m_zintSymbol->whitespace_width, m_zintSymbol->height, m_zintSymbol->width, m_borderWidth, QBrush(m_fgColor)); + } + painter.translate(m_zintSymbol->whitespace_width, m_borderWidth); + yoffset = m_borderWidth; + break; + + default: + painter.translate(m_zintSymbol->whitespace_width, 0); + break; + } + } + + while (!(module_set(m_zintSymbol->rows - 1, comp_offset))) { + comp_offset++; + } + xoffset = comp_offset; + + /* Set up some values for displaying EAN and UPC symbols correctly */ + main_width = m_zintSymbol->width; + if ((((m_zintSymbol->symbology == BARCODE_EANX) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_EANX_CC)) + || (m_zintSymbol->symbology == BARCODE_ISBNX)) { + switch (caption.size()) { + case 13: /* EAN 13 */ + case 16: + case 19: + if (m_zintSymbol->whitespace_width == 0) { + m_zintSymbol->whitespace_width = 10; + } + main_width = 96 + comp_offset; + break; + default: + main_width = 68 + comp_offset; + break; + } + } + + if (((m_zintSymbol->symbology == BARCODE_UPCA) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_UPCA_CC)) { + if (m_zintSymbol->whitespace_width == 0) { + m_zintSymbol->whitespace_width = 10; + } + main_width = 96 + comp_offset; + } + + if (((m_zintSymbol->symbology == BARCODE_UPCE) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_UPCE_CC)) { + if (m_zintSymbol->whitespace_width == 0) { + m_zintSymbol->whitespace_width = 10; + } + main_width = 51 + comp_offset; + } + + p.setWidth(1); + painter.setPen(p); + + if (m_zintSymbol->symbology == BARCODE_MAXICODE) { + /* Draw Maxicode with hexagons */ + painter.save(); + painter.setRenderHint(QPainter::Antialiasing); + for (int r = 0; r < m_zintSymbol->rows; r++) { + for (int c = 0; c < m_zintSymbol->width; c++) { + if (module_set(r, c)) { + qreal col = (qreal) c * (maxi_width + 1)+(r % 2)*((maxi_width + 1) / 2); + qreal row = (qreal) r * (maxi_width + 1)*0.868; + QPainterPath pt; + pt.moveTo(col + maxi_width / 2, row); + pt.lineTo(col + maxi_width, row + maxi_diagonal / 4); + pt.lineTo(col + maxi_width, row + (maxi_diagonal - maxi_diagonal / 4)); + pt.lineTo(col + maxi_width / 2, row + maxi_diagonal); + pt.lineTo(col, row + (maxi_diagonal - maxi_diagonal / 4)); + pt.lineTo(col, row + maxi_diagonal / 4); + pt.lineTo(col + maxi_width / 2, row); + painter.fillPath(pt, QBrush(m_fgColor)); + } + } + } + p.setWidth(maxi_width); + painter.setPen(p); + const qreal w = maxi_width + 1; + painter.drawEllipse(QPointF(14.5 * w, 16.5 * w * 0.868), w, w); + painter.drawEllipse(QPointF(14.5 * w, 16.5 * w * 0.868), w + w * 1.5, w + w * 1.5); + painter.drawEllipse(QPointF(14.5 * w, 16.5 * w * 0.868), w + w * 3, w + w * 3); + painter.restore(); + } else if (m_zintSymbol->output_options & BARCODE_DOTTY_MODE) { + /* Draw with dots (circles) */ + + p.setColor(m_fgColor); + p.setWidth(0); + painter.setPen(p); + painter.setBrush(QBrush(m_fgColor)); + painter.setRenderHint(QPainter::Antialiasing); + for (int r = 0; r < m_zintSymbol->rows; r++) { + for (int c = 0; c < m_zintSymbol->width; c++) { + if (module_set(r, c)) { + + painter.drawEllipse(QPointF((c + 1.0), (r + 1.0)), m_dot_size / 2.0, m_dot_size / 2.0); + } + } + } + } else { + /* Draw all other symbols with rectangles */ + int y = 0; + for (int row = 0; row < m_zintSymbol->rows; row++) { + for (int i = 0; i < m_zintSymbol->width; i++) { + if (module_set(row, i)) { + int ed = module_set(row, i); + int linewidth = 0; + for (int j = i; j < m_zintSymbol->width; j++, linewidth++) + if (ed != module_set(row, j)) + break; + QColor color; + color = m_fgColor; + + if (!((i > main_width) && (row == m_zintSymbol->rows - 1))) { + painter.fillRect(i, y, linewidth, m_zintSymbol->row_height[row], QBrush(color)); + } else { + painter.fillRect(i, y + 8, linewidth, m_zintSymbol->row_height[row] - 3, QBrush(color)); + addon_text_height = y; + } + } + } + /* Add row binding */ + if (((m_zintSymbol->symbology == BARCODE_CODE16K) + || (m_zintSymbol->symbology == BARCODE_CODE49)) && (row != 0)) { + painter.fillRect(0, y - 1, m_zintSymbol->width, 2, QBrush(m_fgColor)); + } + if ((m_zintSymbol->symbology == BARCODE_CODABLOCKF) && (row != 0)) { + painter.fillRect(11, y - 1, m_zintSymbol->width - 25, 2, QBrush(m_fgColor)); + } + y += m_zintSymbol->row_height[row]; + } + } + + textdone = false; + + if (m_hidetext == false) { + painter.setFont(fontSmall); + if (((m_zintSymbol->symbology == BARCODE_EANX) || (m_zintSymbol->symbology == BARCODE_EANX_CC)) || + (m_zintSymbol->symbology == BARCODE_ISBNX)) { + /* Add bridge and format text for EAN */ + switch (caption.size()) { + case 8: + case 11: + case 14: + painter.fillRect(0 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(2 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(32 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(34 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(64 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(66 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.setFont(fontLarge); + painter.drawText(3 + xoffset, m_zintSymbol->height + yoffset, 29, 9, Qt::AlignCenter, caption.mid(0, 4)); + painter.drawText(35 + xoffset, m_zintSymbol->height + yoffset, 29, 9, Qt::AlignCenter, caption.mid(4, 4)); + if (caption.size() == 11) { + /* EAN-2 */ painter.drawText(76 + xoffset, addon_text_height, 20, 9, Qt::AlignCenter, caption.mid(9, 2)); + }; + if (caption.size() == 14) { + /* EAN-5 */ painter.drawText(76 + xoffset, addon_text_height, 47, 9, Qt::AlignCenter, caption.mid(9, 5)); + }; + painter.setFont(fontSmall); + textdone = true; + break; + case 13: + case 16: + case 19: + painter.fillRect(0 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(2 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(46 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(48 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(92 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(94 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.setFont(fontLarge); + painter.drawText(xoffset - 7, m_zintSymbol->height + yoffset, 7, 9, Qt::AlignCenter, caption.mid(0, 1)); + painter.drawText(3 + xoffset, m_zintSymbol->height + yoffset, 43, 9, Qt::AlignCenter, caption.mid(1, 6)); + painter.drawText(49 + xoffset, m_zintSymbol->height + yoffset, 43, 9, Qt::AlignCenter, caption.mid(7, 6)); + if (caption.size() == 16) { + /* EAN-2 */ painter.drawText(104 + xoffset, addon_text_height, 20, 9, Qt::AlignCenter, caption.mid(14, 2)); + }; + if (caption.size() == 19) { + /* EAN-5 */ painter.drawText(104 + xoffset, addon_text_height, 47, 9, Qt::AlignCenter, caption.mid(14, 5)); + }; + painter.setFont(fontSmall); + textdone = true; + break; + } + if (textdone == false) { + painter.setFont(fontLarge); + painter.drawText(0, m_zintSymbol->height, m_zintSymbol->width, 9, Qt::AlignCenter, caption); + painter.setFont(fontSmall); + textdone = true; + } + } + + if ((m_zintSymbol->symbology == BARCODE_UPCA) || (m_zintSymbol->symbology == BARCODE_UPCA_CC)) { + /* Add bridge and format text for UPC-A */ + int block_width; + bool latch = true; + + j = 0 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_set(m_zintSymbol->rows - 1, j + block_width) == module_set(m_zintSymbol->rows - 1, j)); + if (latch == true) { + /* a bar */ + painter.fillRect(j + xoffset - comp_offset, m_zintSymbol->height, block_width, 5, QBrush(m_fgColor)); + latch = false; + } else { + /* a space */ + latch = true; + } + j += block_width; + } while (j < 11 + comp_offset); + painter.fillRect(46 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(48 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + latch = true; + j = 85 + comp_offset; + do { + block_width = 0; + do { + block_width++; + } while (module_set(m_zintSymbol->rows - 1, j + block_width) == module_set(m_zintSymbol->rows - 1, j)); + if (latch == true) { + /* a bar */ + painter.fillRect(j + xoffset - comp_offset, m_zintSymbol->height, block_width, 5, QBrush(m_fgColor)); + latch = false; + } else { + /* a space */ + latch = true; + } + j += block_width; + } while (j < 96 + comp_offset); + painter.drawText(xoffset - 7, m_zintSymbol->height + yoffset + 2, 7, 7, Qt::AlignCenter, caption.mid(0, 1)); + painter.drawText(96 + xoffset, m_zintSymbol->height + yoffset + 2, 7, 7, Qt::AlignCenter, caption.mid(11, 1)); + painter.setFont(fontLarge); + painter.drawText(11 + xoffset, m_zintSymbol->height + yoffset, 35, 9, Qt::AlignCenter, caption.mid(1, 5)); + painter.drawText(49 + xoffset, m_zintSymbol->height + yoffset, 35, 9, Qt::AlignCenter, caption.mid(6, 5)); + if (caption.size() == 15) { + /* EAN-2 */ painter.drawText(104 + xoffset, addon_text_height, 20, 9, Qt::AlignCenter, caption.mid(13, 2)); + }; + if (caption.size() == 18) { + /* EAN-5 */ painter.drawText(104 + xoffset, addon_text_height, 47, 9, Qt::AlignCenter, caption.mid(13, 5)); + }; + painter.setFont(fontSmall); + textdone = true; + } + + if ((m_zintSymbol->symbology == BARCODE_UPCE) || (m_zintSymbol->symbology == BARCODE_UPCE_CC)) { + /* Add bridge and format text for UPC-E */ + painter.fillRect(0 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(2 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(46 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(48 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.fillRect(50 + xoffset, m_zintSymbol->height, 1, 5, QBrush(m_fgColor)); + painter.drawText(xoffset - 7, m_zintSymbol->height + yoffset + 2, 7, 7, Qt::AlignCenter, caption.mid(0, 1)); + painter.drawText(51 + xoffset, m_zintSymbol->height + yoffset + 2, 7, 7, Qt::AlignCenter, caption.mid(7, 1)); + painter.setFont(fontLarge); + painter.drawText(3 + xoffset, m_zintSymbol->height + yoffset, 43, 9, Qt::AlignCenter, caption.mid(1, 6)); + if (caption.size() == 11) { + /* EAN-2 */ painter.drawText(60 + xoffset, addon_text_height, 20, 9, Qt::AlignCenter, caption.mid(9, 2)); + }; + if (caption.size() == 14) { + /* EAN-2 */ painter.drawText(60 + xoffset, addon_text_height, 47, 9, Qt::AlignCenter, caption.mid(9, 5)); + }; + painter.setFont(fontSmall); + textdone = true; + } + } /* if (m_hidetext == false) */ + + if ((m_hidetext == false) && (textdone == false)) { + /* Add text to any other symbol */ + painter.drawText(0, m_zintSymbol->height + yoffset, m_zintSymbol->width, 7, Qt::AlignCenter, caption); + } + painter.restore(); + } + + const QString & QZint::lastError() { + return m_lastError; + } + + bool QZint::hasErrors() { + return m_lastError.length(); + } + +} diff --git a/3rdparty/zint-2.6.1/backend_qt/qzint.h b/3rdparty/zint-2.6.1/backend_qt/qzint.h new file mode 100644 index 0000000..c319225 --- /dev/null +++ b/3rdparty/zint-2.6.1/backend_qt/qzint.h @@ -0,0 +1,128 @@ +/*************************************************************************** + * Copyright (C) 2008 by BogDan Vatra * + * bogdan@licentia.eu * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + ***************************************************************************/ + +#ifndef BARCODERENDER_H +#define BARCODERENDER_H +#include +#include + +#include "zint.h" + +namespace Zint +{ + +class QZint +{ +private: + +public: + enum BorderType{NO_BORDER=0, BIND=2, BOX=4}; + enum AspectRatioMode{IgnoreAspectRatio=0, KeepAspectRatio=1, CenterBarCode=2}; + +public: + QZint(); + ~QZint(); + + int symbol(); + void setSymbol(int symbol); + + QString text(); + void setText(const QString & text); + + QString primaryMessage(); + void setPrimaryMessage(const QString & primaryMessage); + + void setHeight(int height); + int height(); + + void setWidth(int width); + int width(); + + void setOption3(int option); + + QColor fgColor(); + void setFgColor(const QColor & fgColor); + + QColor bgColor(); + void setBgColor(const QColor & bgColor); + + BorderType borderType(); + void setBorderType(BorderType border); + + int borderWidth(); + void setBorderWidth(int boderWidth); + + int pdf417CodeWords(); + void setPdf417CodeWords(int pdf417CodeWords); + + int securityLevel(); + void setSecurityLevel(int securityLevel); + + float scale(); + void setScale(float scale); + + void setDotSize(float dot_size); + + int mode(); + void setMode(int securityLevel); + + void setInputMode(int input_mode); + + void setWhitespace(int whitespace); + + QString error_message(); + + void render(QPainter & painter, const QRectF & paintRect, AspectRatioMode mode=IgnoreAspectRatio); + + const QString & lastError(); + bool hasErrors(); + + bool save_to_file(QString filename); + + void setHideText(bool hide); + + void setTargetSize(int width, int height); + +private: + void encode(); + int module_set(int y_coord, int x_coord); + +private: + int m_symbol; + QString m_text; + QString m_primaryMessage; + int m_height; + BorderType m_border; + int m_borderWidth; + int m_width; + int m_securityLevel; + int m_pdf417CodeWords; + int m_input_mode; + QColor m_fgColor; + QColor m_bgColor; + QString m_lastError; + int m_error; + int m_whitespace; + zint_symbol * m_zintSymbol; + float m_scale; + int m_option_3; + bool m_hidetext; + float m_dot_size; + int target_size_horiz; + int target_size_vert; +}; +} +#endif diff --git a/3rdparty/zint-2.6.1/backend_qt/readme b/3rdparty/zint-2.6.1/backend_qt/readme new file mode 100644 index 0000000..2ec3a7d --- /dev/null +++ b/3rdparty/zint-2.6.1/backend_qt/readme @@ -0,0 +1,9 @@ +Edit zint-1.6.pro and edit the 'DEFINES' section + NO_PNG -> compile zint without png support + NO_QR -> compile zint without QR support + QR_SYSTEM -> if you have QT installed in your system, zint will be compiled with QT support + QR -> compile zint with QR support static (you must have qrencode in the current folder) + +Edit compile_n_config and set the paths. + +Exec compile_n_config diff --git a/common.pri b/common.pri index 0597b7e..7ac3243 100644 --- a/common.pri +++ b/common.pri @@ -11,7 +11,7 @@ CONFIG += build_translations CONFIG += dialogdesigner } -ZINT_PATH = $$PWD/3rdparty/zint-2.4.4 +ZINT_PATH = $$PWD/3rdparty/zint-2.6.1 contains(CONFIG,zint){ DEFINES += HAVE_ZINT } diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 7d45253..e98a9d1 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -76,8 +76,8 @@ win32 { contains(CONFIG,zint){ message(zint) - INCLUDEPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt4 - DEPENDPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt4 + INCLUDEPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt + DEPENDPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt LIBS += -L$${DEST_LIBS} contains(CONFIG,release) { LIBS += -lQtZint From c183e8f28c2b847078d930705f8a3d2c875cffd5 Mon Sep 17 00:00:00 2001 From: Rodrigo Torres Date: Tue, 5 Sep 2017 18:32:49 -0300 Subject: [PATCH 048/347] Forgot to remove old Zint folder --- 3rdparty/zint-2.4.4/COPYING | 674 -- 3rdparty/zint-2.4.4/backend/2of5.c | 357 - 3rdparty/zint-2.4.4/backend/auspost.c | 246 - 3rdparty/zint-2.4.4/backend/aztec.c | 1352 --- 3rdparty/zint-2.4.4/backend/aztec.h | 291 - 3rdparty/zint-2.4.4/backend/code.c | 537 -- 3rdparty/zint-2.4.4/backend/code1.c | 1515 ---- 3rdparty/zint-2.4.4/backend/code1.h | 61 - 3rdparty/zint-2.4.4/backend/code128.c | 997 --- 3rdparty/zint-2.4.4/backend/code16k.c | 622 -- 3rdparty/zint-2.4.4/backend/code49.c | 315 - 3rdparty/zint-2.4.4/backend/code49.h | 1175 --- 3rdparty/zint-2.4.4/backend/common.c | 374 - 3rdparty/zint-2.4.4/backend/common.h | 70 - 3rdparty/zint-2.4.4/backend/composite.c | 1957 ----- 3rdparty/zint-2.4.4/backend/composite.h | 62 - 3rdparty/zint-2.4.4/backend/dllversion.c | 31 - 3rdparty/zint-2.4.4/backend/dmatrix.c | 910 -- 3rdparty/zint-2.4.4/backend/dmatrix.h | 101 - 3rdparty/zint-2.4.4/backend/font.h | 1691 ---- 3rdparty/zint-2.4.4/backend/gb2312.h | 7467 ----------------- 3rdparty/zint-2.4.4/backend/gridmtx.c | 1090 --- 3rdparty/zint-2.4.4/backend/gridmtx.h | 160 - 3rdparty/zint-2.4.4/backend/gs1.c | 311 - 3rdparty/zint-2.4.4/backend/gs1.h | 35 - 3rdparty/zint-2.4.4/backend/imail.c | 700 -- 3rdparty/zint-2.4.4/backend/large.c | 227 - 3rdparty/zint-2.4.4/backend/large.h | 40 - 3rdparty/zint-2.4.4/backend/library.c | 908 -- 3rdparty/zint-2.4.4/backend/maxicode.c | 709 -- 3rdparty/zint-2.4.4/backend/maxicode.h | 90 - 3rdparty/zint-2.4.4/backend/maxipng.h | 138 - 3rdparty/zint-2.4.4/backend/medical.c | 308 - 3rdparty/zint-2.4.4/backend/ms_stdint.h | 234 - 3rdparty/zint-2.4.4/backend/pdf417.c | 1069 --- 3rdparty/zint-2.4.4/backend/pdf417.h | 438 - 3rdparty/zint-2.4.4/backend/plessey.c | 498 -- 3rdparty/zint-2.4.4/backend/png.c | 1146 --- 3rdparty/zint-2.4.4/backend/postal.c | 594 -- 3rdparty/zint-2.4.4/backend/ps.c | 761 -- 3rdparty/zint-2.4.4/backend/qr.c | 2244 ----- 3rdparty/zint-2.4.4/backend/qr.h | 156 - 3rdparty/zint-2.4.4/backend/reedsol.c | 161 - 3rdparty/zint-2.4.4/backend/reedsol.h | 40 - 3rdparty/zint-2.4.4/backend/render.c | 798 -- 3rdparty/zint-2.4.4/backend/rss.c | 2264 ----- 3rdparty/zint-2.4.4/backend/rss.h | 225 - 3rdparty/zint-2.4.4/backend/sjis.h | 6875 --------------- 3rdparty/zint-2.4.4/backend/svg.c | 614 -- 3rdparty/zint-2.4.4/backend/telepen.c | 157 - 3rdparty/zint-2.4.4/backend/upcean.c | 796 -- 3rdparty/zint-2.4.4/backend/zint.h | 238 - 3rdparty/zint-2.4.4/backend_qt4/Zint.pro | 114 - 3rdparty/zint-2.4.4/backend_qt4/qzint.cpp | 692 -- 3rdparty/zint-2.4.4/backend_qt4/qzint.h | 126 - .../zint-2.4.4/backend_qt4/qzint_global.h | 16 - 56 files changed, 45777 deletions(-) delete mode 100644 3rdparty/zint-2.4.4/COPYING delete mode 100644 3rdparty/zint-2.4.4/backend/2of5.c delete mode 100644 3rdparty/zint-2.4.4/backend/auspost.c delete mode 100644 3rdparty/zint-2.4.4/backend/aztec.c delete mode 100644 3rdparty/zint-2.4.4/backend/aztec.h delete mode 100644 3rdparty/zint-2.4.4/backend/code.c delete mode 100644 3rdparty/zint-2.4.4/backend/code1.c delete mode 100644 3rdparty/zint-2.4.4/backend/code1.h delete mode 100644 3rdparty/zint-2.4.4/backend/code128.c delete mode 100644 3rdparty/zint-2.4.4/backend/code16k.c delete mode 100644 3rdparty/zint-2.4.4/backend/code49.c delete mode 100644 3rdparty/zint-2.4.4/backend/code49.h delete mode 100644 3rdparty/zint-2.4.4/backend/common.c delete mode 100644 3rdparty/zint-2.4.4/backend/common.h delete mode 100644 3rdparty/zint-2.4.4/backend/composite.c delete mode 100644 3rdparty/zint-2.4.4/backend/composite.h delete mode 100644 3rdparty/zint-2.4.4/backend/dllversion.c delete mode 100644 3rdparty/zint-2.4.4/backend/dmatrix.c delete mode 100644 3rdparty/zint-2.4.4/backend/dmatrix.h delete mode 100644 3rdparty/zint-2.4.4/backend/font.h delete mode 100644 3rdparty/zint-2.4.4/backend/gb2312.h delete mode 100644 3rdparty/zint-2.4.4/backend/gridmtx.c delete mode 100644 3rdparty/zint-2.4.4/backend/gridmtx.h delete mode 100644 3rdparty/zint-2.4.4/backend/gs1.c delete mode 100644 3rdparty/zint-2.4.4/backend/gs1.h delete mode 100644 3rdparty/zint-2.4.4/backend/imail.c delete mode 100644 3rdparty/zint-2.4.4/backend/large.c delete mode 100644 3rdparty/zint-2.4.4/backend/large.h delete mode 100644 3rdparty/zint-2.4.4/backend/library.c delete mode 100644 3rdparty/zint-2.4.4/backend/maxicode.c delete mode 100644 3rdparty/zint-2.4.4/backend/maxicode.h delete mode 100644 3rdparty/zint-2.4.4/backend/maxipng.h delete mode 100644 3rdparty/zint-2.4.4/backend/medical.c delete mode 100644 3rdparty/zint-2.4.4/backend/ms_stdint.h delete mode 100644 3rdparty/zint-2.4.4/backend/pdf417.c delete mode 100644 3rdparty/zint-2.4.4/backend/pdf417.h delete mode 100644 3rdparty/zint-2.4.4/backend/plessey.c delete mode 100644 3rdparty/zint-2.4.4/backend/png.c delete mode 100644 3rdparty/zint-2.4.4/backend/postal.c delete mode 100644 3rdparty/zint-2.4.4/backend/ps.c delete mode 100644 3rdparty/zint-2.4.4/backend/qr.c delete mode 100644 3rdparty/zint-2.4.4/backend/qr.h delete mode 100644 3rdparty/zint-2.4.4/backend/reedsol.c delete mode 100644 3rdparty/zint-2.4.4/backend/reedsol.h delete mode 100644 3rdparty/zint-2.4.4/backend/render.c delete mode 100644 3rdparty/zint-2.4.4/backend/rss.c delete mode 100644 3rdparty/zint-2.4.4/backend/rss.h delete mode 100644 3rdparty/zint-2.4.4/backend/sjis.h delete mode 100644 3rdparty/zint-2.4.4/backend/svg.c delete mode 100644 3rdparty/zint-2.4.4/backend/telepen.c delete mode 100644 3rdparty/zint-2.4.4/backend/upcean.c delete mode 100644 3rdparty/zint-2.4.4/backend/zint.h delete mode 100644 3rdparty/zint-2.4.4/backend_qt4/Zint.pro delete mode 100644 3rdparty/zint-2.4.4/backend_qt4/qzint.cpp delete mode 100644 3rdparty/zint-2.4.4/backend_qt4/qzint.h delete mode 100644 3rdparty/zint-2.4.4/backend_qt4/qzint_global.h diff --git a/3rdparty/zint-2.4.4/COPYING b/3rdparty/zint-2.4.4/COPYING deleted file mode 100644 index 94a9ed0..0000000 --- a/3rdparty/zint-2.4.4/COPYING +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/3rdparty/zint-2.4.4/backend/2of5.c b/3rdparty/zint-2.4.4/backend/2of5.c deleted file mode 100644 index aea79ad..0000000 --- a/3rdparty/zint-2.4.4/backend/2of5.c +++ /dev/null @@ -1,357 +0,0 @@ -/* 2of5.c - Handles Code 2 of 5 barcodes */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#include "common.h" -#ifdef _MSC_VER -#include -#endif - -static char *C25MatrixTable[10] = {"113311", "311131", "131131", "331111", "113131", "313111", - "133111", "111331", "311311", "131311"}; - -static char *C25IndustTable[10] = {"1111313111", "3111111131", "1131111131", "3131111111", "1111311131", - "3111311111", "1131311111", "1111113131", "3111113111", "1131113111"}; - -static char *C25InterTable[10] = {"11331", "31113", "13113", "33111", "11313", "31311", "13311", "11133", - "31131", "13131"}; - -static char check_digit(unsigned int count) -{ - return itoc((10 - (count % 10)) % 10); -} - -int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 Standard (Code 2 of 5 Matrix) */ - - int i, error_number; - char dest[512]; /* 6 + 80 * 6 + 6 + 1 ~ 512*/ - - error_number = 0; - - if(length > 80) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - /* start character */ - strcpy(dest, "411111"); - - for(i = 0; i < length; i++) { - lookup(NEON, C25MatrixTable, source[i], dest); - } - - /* Stop character */ - concat (dest, "41111"); - - expand(symbol, dest); - ustrcpy(symbol->text, source); - return error_number; -} - -int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 Industrial */ - - int i, error_number; - char dest[512]; /* 6 + 40 * 10 + 6 + 1 */ - - error_number = 0; - - if(length > 45) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid character in data"); - return error_number; - } - - /* start character */ - strcpy(dest, "313111"); - - for(i = 0; i < length; i++) { - lookup(NEON, C25IndustTable, source[i], dest); - } - - /* Stop character */ - concat (dest, "31113"); - - expand(symbol, dest); - ustrcpy(symbol->text, source); - return error_number; -} - -int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 IATA */ - int i, error_number; - char dest[512]; /* 4 + 45 * 10 + 3 + 1 */ - - error_number = 0; - - if(length > 45) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - /* start */ - strcpy(dest, "1111"); - - for(i = 0; i < length; i++) { - lookup(NEON, C25IndustTable, source[i], dest); - } - - /* stop */ - concat (dest, "311"); - - expand(symbol, dest); - ustrcpy(symbol->text, source); - return error_number; -} - -int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 Data Logic */ - - int i, error_number; - char dest[512]; /* 4 + 80 * 6 + 3 + 1 */ - - error_number = 0; - - if(length > 80) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - /* start character */ - strcpy(dest, "1111"); - - for(i = 0; i < length; i++) { - lookup(NEON, C25MatrixTable, source[i], dest); - } - - /* Stop character */ - concat (dest, "311"); - - expand(symbol, dest); - ustrcpy(symbol->text, source); - return error_number; -} - -int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 2 of 5 Interleaved */ - - int i, j, k, error_number; - char bars[7], spaces[7], mixed[14], dest[1000]; -#ifndef _MSC_VER - unsigned char temp[length + 2]; -#else - unsigned char* temp = (unsigned char *)_alloca((length + 2) * sizeof(unsigned char)); -#endif - - error_number = 0; - - if(length > 89) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if (error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - ustrcpy(temp, (unsigned char *) ""); - /* Input must be an even number of characters for Interlaced 2 of 5 to work: - if an odd number of characters has been entered then add a leading zero */ - if (length & 1) - { - ustrcpy(temp, (unsigned char *) "0"); - length++; - } - uconcat(temp, source); - - /* start character */ - strcpy(dest, "1111"); - - for(i = 0; i < length; i+=2 ) - { - /* look up the bars and the spaces and put them in two strings */ - strcpy(bars, ""); - lookup(NEON, C25InterTable, temp[i], bars); - strcpy(spaces, ""); - lookup(NEON, C25InterTable, temp[i + 1], spaces); - - /* then merge (interlace) the strings together */ - k = 0; - for(j = 0; j <= 4; j++) - { - mixed[k] = bars[j]; k++; - mixed[k] = spaces[j]; k++; - } - mixed[k] = '\0'; - concat (dest, mixed); - } - - /* Stop character */ - concat (dest, "311"); - - expand(symbol, dest); - ustrcpy(symbol->text, temp); - return error_number; - -} - -int itf14(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int i, error_number, zeroes; - unsigned int count; - char localstr[16]; - - error_number = 0; - - count = 0; - - if(length > 13) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid character in data"); - return error_number; - } - - /* Add leading zeros as required */ - zeroes = 13 - length; - for(i = 0; i < zeroes; i++) { - localstr[i] = '0'; - } - strcpy(localstr + zeroes, (char *)source); - - /* Calculate the check digit - the same method used for EAN-13 */ - - for (i = 12; i >= 0; i--) { - count += ctoi(localstr[i]); - - if (!(i & 1)) { - count += 2 * ctoi(localstr[i]); - } - } - localstr[13] = check_digit(count); - localstr[14] = '\0'; - error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr, strlen(localstr)); - ustrcpy(symbol->text, (unsigned char*)localstr); - return error_number; -} - -int dpleit(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Deutshe Post Leitcode */ - int i, error_number; - unsigned int count; - char localstr[16]; - int zeroes; - - error_number = 0; - count = 0; - if(length > 13) { - strcpy(symbol->errtxt, "Input wrong length"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - zeroes = 13 - length; - for(i = 0; i < zeroes; i++) - localstr[i] = '0'; - strcpy(localstr + zeroes, (char *)source); - - for (i = 12; i >= 0; i--) - { - count += 4 * ctoi(localstr[i]); - - if (i & 1) { - count += 5 * ctoi(localstr[i]); - } - } - localstr[13] = check_digit(count); - localstr[14] = '\0'; - error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr, strlen(localstr)); - ustrcpy(symbol->text, (unsigned char*)localstr); - return error_number; -} - -int dpident(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Deutsche Post Identcode */ - int i, error_number, zeroes; - unsigned int count; - char localstr[16]; - - count = 0; - if(length > 11) { - strcpy(symbol->errtxt, "Input wrong length"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - zeroes = 11 - length; - for(i = 0; i < zeroes; i++) - localstr[i] = '0'; - strcpy(localstr + zeroes, (char *)source); - - for (i = 10; i >= 0; i--) - { - count += 4 * ctoi(localstr[i]); - - if (i & 1) { - count += 5 * ctoi(localstr[i]); - } - } - localstr[11] = check_digit(count); - localstr[12] = '\0'; - error_number = interleaved_two_of_five(symbol, (unsigned char *)localstr, strlen(localstr)); - ustrcpy(symbol->text, (unsigned char*)localstr); - return error_number; -} diff --git a/3rdparty/zint-2.4.4/backend/auspost.c b/3rdparty/zint-2.4.4/backend/auspost.c deleted file mode 100644 index 0278109..0000000 --- a/3rdparty/zint-2.4.4/backend/auspost.c +++ /dev/null @@ -1,246 +0,0 @@ -/* auspost.c - Handles Australia Post 4-State Barcode */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#define GDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz #" - -static char *AusNTable[10] = {"00", "01", "02", "10", "11", "12", "20", "21", "22", "30"}; - -static char *AusCTable[64] = {"222", "300", "301", "302", "310", "311", "312", "320", "321", "322", - "000", "001", "002", "010", "011", "012", "020", "021", "022", "100", "101", "102", "110", - "111", "112", "120", "121", "122", "200", "201", "202", "210", "211", "212", "220", "221", - "023", "030", "031", "032", "033", "103", "113", "123", "130", "131", "132", "133", "203", - "213", "223", "230", "231", "232", "233", "303", "313", "323", "330", "331", "332", "333", - "003", "013"}; - -static char *AusBarTable[64] = {"000", "001", "002", "003", "010", "011", "012", "013", "020", "021", - "022", "023", "030", "031", "032", "033", "100", "101", "102", "103", "110", "111", "112", - "113", "120", "121", "122", "123", "130", "131", "132", "133", "200", "201", "202", "203", - "210", "211", "212", "213", "220", "221", "222", "223", "230", "231", "232", "233", "300", - "301", "302", "303", "310", "311", "312", "313", "320", "321", "322", "323", "330", "331", - "332", "333"}; - -#include -#include -#include -#include "common.h" -#include "reedsol.h" - -static char convert_pattern(char data, int shift) -{ - return (data - '0') << shift; -} - -void rs_error(char data_pattern[]) -{ - /* Adds Reed-Solomon error correction to auspost */ - - int reader, triple_writer = 0; - char triple[31], inv_triple[31]; - unsigned char result[5]; - - for(reader = 2; reader < (int)strlen(data_pattern); reader += 3, triple_writer++) - { - triple[triple_writer] = convert_pattern(data_pattern[reader], 4) - + convert_pattern(data_pattern[reader + 1], 2) - + convert_pattern(data_pattern[reader + 2], 0); - } - - for(reader = 0; reader < triple_writer; reader++) - { - inv_triple[reader] = triple[(triple_writer - 1) - reader]; - } - - rs_init_gf(0x43); - rs_init_code(4, 1); - rs_encode(triple_writer, (unsigned char*) inv_triple, result); - - for(reader = 4; reader > 0; reader--) - { - concat(data_pattern, AusBarTable[(int)result[reader - 1]]); - } - rs_free(); -} - -int australia_post(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Handles Australia Posts's 4 State Codes */ - /* Customer Standard Barcode, Barcode 2 or Barcode 3 system determined automatically - (i.e. the FCC doesn't need to be specified by the user) dependent - on the length of the input string */ - - /* The contents of data_pattern conform to the following standard: - 0 = Tracker, Ascender and Descender - 1 = Tracker and Ascender - 2 = Tracker and Descender - 3 = Tracker only */ - int error_number, zeroes; - int writer; - unsigned int loopey, reader, h; - - char data_pattern[200]; - char fcc[3], dpid[10]; - char localstr[30]; - - error_number = 0; - strcpy(localstr, ""); - - /* Do all of the length checking first to avoid stack smashing */ - if(symbol->symbology == BARCODE_AUSPOST) { - /* Format control code (FCC) */ - switch(length) - { - case 8: - strcpy(fcc, "11"); - break; - case 13: - strcpy(fcc, "59"); - break; - case 16: - strcpy(fcc, "59"); - error_number = is_sane(NEON, source, length); - break; - case 18: - strcpy(fcc, "62"); - break; - case 23: - strcpy(fcc, "62"); - error_number = is_sane(NEON, source, length); - break; - default: - strcpy(symbol->errtxt, "Auspost input is wrong length"); - return ERROR_TOO_LONG; - break; - } - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - } else { - if(length > 8) { - strcpy(symbol->errtxt, "Auspost input is too long"); - return ERROR_TOO_LONG; - } - switch(symbol->symbology) { - case BARCODE_AUSREPLY: strcpy(fcc, "45"); break; - case BARCODE_AUSROUTE: strcpy(fcc, "87"); break; - case BARCODE_AUSREDIRECT: strcpy(fcc, "92"); break; - } - - /* Add leading zeros as required */ - zeroes = 8 - length; - memset(localstr, '0', zeroes); - localstr[8] = '\0'; - } - - concat(localstr, (char*)source); - h = strlen(localstr); - error_number = is_sane(GDSET, (unsigned char *)localstr, h); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - /* Verifiy that the first 8 characters are numbers */ - memcpy(dpid, localstr, 8); - dpid[8] = '\0'; - error_number = is_sane(NEON, (unsigned char *)dpid, strlen(dpid)); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in DPID"); - return error_number; - } - - /* Start character */ - strcpy(data_pattern, "13"); - - /* Encode the FCC */ - for(reader = 0; reader < 2; reader++) - { - lookup(NEON, AusNTable, fcc[reader], data_pattern); - } - - /* printf("AUSPOST FCC: %s ", fcc); */ - - /* Delivery Point Identifier (DPID) */ - for(reader = 0; reader < 8; reader++) - { - lookup(NEON, AusNTable, dpid[reader], data_pattern); - } - - /* Customer Information */ - if(h > 8) - { - if((h == 13) || (h == 18)) { - for(reader = 8; reader < h; reader++) { - lookup(GDSET, AusCTable, localstr[reader], data_pattern); - } - } - else if((h == 16) || (h == 23)) { - for(reader = 8; reader < h; reader++) { - lookup(NEON, AusNTable, localstr[reader], data_pattern); - } - } - } - - /* Filler bar */ - h = strlen(data_pattern); - if(h == 22) { - concat(data_pattern, "3"); - } - else if(h == 37) { - concat(data_pattern, "3"); - } - else if(h == 52) { - concat(data_pattern, "3"); - } - - /* Reed Solomon error correction */ - rs_error(data_pattern); - - /* Stop character */ - concat(data_pattern, "13"); - - /* Turn the symbol into a bar pattern ready for plotting */ - writer = 0; - h = strlen(data_pattern); - for(loopey = 0; loopey < h; loopey++) - { - if((data_pattern[loopey] == '1') || (data_pattern[loopey] == '0')) - { - set_module(symbol, 0, writer); - } - set_module(symbol, 1, writer); - if((data_pattern[loopey] == '2') || (data_pattern[loopey] == '0')) - { - set_module(symbol, 2, writer); - } - writer += 2; - } - - symbol->row_height[0] = 3; - symbol->row_height[1] = 2; - symbol->row_height[2] = 3; - - symbol->rows = 3; - symbol->width = writer - 1; - - return error_number; -} - diff --git a/3rdparty/zint-2.4.4/backend/aztec.c b/3rdparty/zint-2.4.4/backend/aztec.c deleted file mode 100644 index a93eba7..0000000 --- a/3rdparty/zint-2.4.4/backend/aztec.c +++ /dev/null @@ -1,1352 +0,0 @@ -/* aztec.c - Handles Aztec 2D Symbols */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" -#include "aztec.h" -#include "reedsol.h" - -void mapshorten(int *charmap, int *typemap, int start, int length) -{ /* Shorten the string by one character */ - - memmove(charmap + start + 1 , charmap + start + 2, (length - 1) * sizeof(int)); - memmove(typemap + start + 1 , typemap + start + 2, (length - 1) * sizeof(int)); -} - -void insert(char binary_string[], int posn, char newbit) -{ /* Insert a character into the middle of a string at position posn */ - int i, end; - - end = strlen(binary_string); - for(i = end; i > posn; i--) { - binary_string[i] = binary_string[i - 1]; - } - binary_string[posn] = newbit; -} - -int aztec_text_process(unsigned char source[], const unsigned int src_len, char binary_string[], int gs1) -{ /* Encode input data into a binary string */ - int i, j, k, bytes; - int curtable, newtable, lasttable, chartype, maplength, blocks, debug; -#ifndef _MSC_VER - int charmap[src_len * 2], typemap[src_len * 2]; - int blockmap[2][src_len]; -#else - int* charmap = (int*)_alloca(src_len * 2 * sizeof(int)); - int* typemap = (int*)_alloca(src_len * 2 * sizeof(int)); - int* blockmap[2]; - blockmap[0] = (int*)_alloca(src_len * sizeof(int)); - blockmap[1] = (int*)_alloca(src_len * sizeof(int)); -#endif - /* Lookup input string in encoding table */ - maplength = 0; - debug = 0; - - for(i = 0; i < (int)src_len; i++) { - if(gs1 && (i == 0)) { - /* Add FNC1 to beginning of GS1 messages */ - charmap[maplength] = 0; - typemap[maplength++] = PUNC; - charmap[maplength] = 400; - typemap[maplength++] = PUNC; - } - if((gs1) && (source[i] == '[')) { - /* FNC1 represented by FLG(0) */ - charmap[maplength] = 0; - typemap[maplength++] = PUNC; - charmap[maplength] = 400; - typemap[maplength++] = PUNC; - } else { - if(source[i] > 127) { - charmap[maplength] = source[i]; - typemap[maplength++] = BINARY; - } else { - charmap[maplength] = AztecSymbolChar[source[i]]; - typemap[maplength++] = AztecCodeSet[source[i]]; - } - } - } - - /* Look for double character encoding possibilities */ - i = 0; - do{ - if(((charmap[i] == 300) && (charmap[i + 1] == 11)) && ((typemap[i] == PUNC) && (typemap[i + 1] == PUNC))) { - /* CR LF combination */ - charmap[i] = 2; - typemap[i] = PUNC; - mapshorten(charmap, typemap, i, maplength); - maplength--; - } - - if(((charmap[i] == 302) && (charmap[i + 1] == 1)) && ((typemap[i] == 24) && (typemap[i + 1] == 23))) { - /* . SP combination */ - charmap[i] = 3; - typemap[i] = PUNC; - mapshorten(charmap, typemap, i, maplength); - maplength--; - } - - if(((charmap[i] == 301) && (charmap[i + 1] == 1)) && ((typemap[i] == 24) && (typemap[i + 1] == 23))) { - /* , SP combination */ - charmap[i] = 4; - typemap[i] = PUNC; - mapshorten(charmap, typemap, i, maplength); - maplength--; - } - - if(((charmap[i] == 21) && (charmap[i + 1] == 1)) && ((typemap[i] == PUNC) && (typemap[i + 1] == 23))) { - /* : SP combination */ - charmap[i] = 5; - typemap[i] = PUNC; - mapshorten(charmap, typemap, i, maplength); - maplength--; - } - - i++; - }while(i < (maplength - 1)); - - /* look for blocks of characters which use the same table */ - blocks = 1; - blockmap[0][0] = typemap[0]; - blockmap[1][0] = 1; - for(i = 1; i < maplength; i++) { - if(typemap[i] == typemap[i - 1]) { - blockmap[1][blocks - 1]++; - } else { - blocks++; - blockmap[0][blocks - 1] = typemap[i]; - blockmap[1][blocks - 1] = 1; - } - } - - if(blockmap[0][0] & 1) { blockmap[0][0] = 1; } - if(blockmap[0][0] & 2) { blockmap[0][0] = 2; } - if(blockmap[0][0] & 4) { blockmap[0][0] = 4; } - if(blockmap[0][0] & 8) { blockmap[0][0] = 8; } - - if(blocks > 1) { - - /* look for adjacent blocks which can use the same table (left to right search) */ - for(i = 1; i < blocks; i++) { - if(blockmap[0][i] & blockmap[0][i - 1]) { - blockmap[0][i] = (blockmap[0][i] & blockmap[0][i - 1]); - } - } - - if(blockmap[0][blocks - 1] & 1) { blockmap[0][blocks - 1] = 1; } - if(blockmap[0][blocks - 1] & 2) { blockmap[0][blocks - 1] = 2; } - if(blockmap[0][blocks - 1] & 4) { blockmap[0][blocks - 1] = 4; } - if(blockmap[0][blocks - 1] & 8) { blockmap[0][blocks - 1] = 8; } - - /* look for adjacent blocks which can use the same table (right to left search) */ - for(i = blocks - 1; i > 0; i--) { - if(blockmap[0][i] & blockmap[0][i + 1]) { - blockmap[0][i] = (blockmap[0][i] & blockmap[0][i + 1]); - } - } - - /* determine the encoding table for characters which do not fit with adjacent blocks */ - for(i = 1; i < blocks; i++) { - if(blockmap[0][i] & 8) { blockmap[0][i] = 8; } - if(blockmap[0][i] & 4) { blockmap[0][i] = 4; } - if(blockmap[0][i] & 2) { blockmap[0][i] = 2; } - if(blockmap[0][i] & 1) { blockmap[0][i] = 1; } - } - - /* Combine blocks of the same type */ - i = 0; - do{ - if(blockmap[0][i] == blockmap[0][i + 1]) { - blockmap[1][i] += blockmap[1][i + 1]; - for(j = i + 1; j < blocks; j++) { - blockmap[0][j] = blockmap[0][j + 1]; - blockmap[1][j] = blockmap[1][j + 1]; - } - blocks--; - } else { - i++; - } - } while (i < blocks); - } - - /* Put the adjusted block data back into typemap */ - j = 0; - for(i = 0; i < blocks; i++) { - if((blockmap[1][i] < 3) && (blockmap[0][i] != 32)) { /* Shift character(s) needed */ - for(k = 0; k < blockmap[1][i]; k++) { - typemap[j + k] = blockmap[0][i] + 64; - } - } else { /* Latch character (or byte mode) needed */ - for(k = 0; k < blockmap[1][i]; k++) { - typemap[j + k] = blockmap[0][i]; - } - } - j += blockmap[1][i]; - } - - /* Don't shift an initial capital letter */ - if(typemap[0] == 65) { typemap[0] = 1; }; - - /* Problem characters (those that appear in different tables with different values) can now be resolved into their tables */ - for(i = 0; i < maplength; i++) { - if((charmap[i] >= 300) && (charmap[i] < 400)) { - curtable = typemap[i]; - if(curtable > 64) { - curtable -= 64; - } - switch(charmap[i]) { - case 300: /* Carriage Return */ - switch(curtable) { - case PUNC: charmap[i] = 1; break; - case MIXED: charmap[i] = 14; break; - } - break; - case 301: /* Comma */ - switch(curtable) { - case PUNC: charmap[i] = 17; break; - case DIGIT: charmap[i] = 12; break; - } - break; - case 302: /* Full Stop */ - switch(curtable) { - case PUNC: charmap[i] = 19; break; - case DIGIT: charmap[i] = 13; break; - } - break; - } - } - } - *binary_string = '\0'; - - curtable = UPPER; /* start with UPPER table */ - lasttable = UPPER; - for(i = 0; i < maplength; i++) { - newtable = curtable; - if((typemap[i] != curtable) && (charmap[i] < 400)) { - /* Change table */ - if(curtable == BINARY) { - /* If ending binary mode the current table is the same as when entering binary mode */ - curtable = lasttable; - newtable = lasttable; - } - if(typemap[i] > 64) { - /* Shift character */ - switch(typemap[i]) { - case (64 + UPPER): /* To UPPER */ - switch(curtable) { - case LOWER: /* US */ - concat(binary_string, hexbit[28]); - if(debug) printf("US "); - break; - case MIXED: /* UL */ - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case PUNC: /* UL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case DIGIT: /* US */ - concat(binary_string, pentbit[15]); - if(debug) printf("US "); - break; - } - break; - case (64 + LOWER): /* To LOWER */ - switch(curtable) { - case UPPER: /* LL */ - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case MIXED: /* LL */ - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case PUNC: /* UL LL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case DIGIT: /* UL LL */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - } - break; - case (64 + MIXED): /* To MIXED */ - switch(curtable) { - case UPPER: /* ML */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case LOWER: /* ML */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case PUNC: /* UL ML */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case DIGIT: /* UL ML */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - } - break; - case (64 + PUNC): /* To PUNC */ - switch(curtable) { - case UPPER: /* PS */ - concat(binary_string, hexbit[0]); - if(debug) printf("PS "); - break; - case LOWER: /* PS */ - concat(binary_string, hexbit[0]); - if(debug) printf("PS "); - break; - case MIXED: /* PS */ - concat(binary_string, hexbit[0]); - if(debug) printf("PS "); - break; - case DIGIT: /* PS */ - concat(binary_string, pentbit[0]); - if(debug) printf("PS "); - break; - } - break; - case (64 + DIGIT): /* To DIGIT */ - switch(curtable) { - case UPPER: /* DL */ - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case LOWER: /* DL */ - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case MIXED: /* UL DL */ - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case PUNC: /* UL DL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - } - break; - } - } else { - /* Latch character */ - switch(typemap[i]) { - case UPPER: /* To UPPER */ - switch(curtable) { - case LOWER: /* ML UL */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case MIXED: /* UL */ - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case PUNC: /* UL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - newtable = UPPER; - break; - case DIGIT: /* UL */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - newtable = UPPER; - break; - } - break; - case LOWER: /* To LOWER */ - switch(curtable) { - case UPPER: /* LL */ - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case MIXED: /* LL */ - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case PUNC: /* UL LL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - case DIGIT: /* UL LL */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[28]); - if(debug) printf("LL "); - newtable = LOWER; - break; - } - break; - case MIXED: /* To MIXED */ - switch(curtable) { - case UPPER: /* ML */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case LOWER: /* ML */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case PUNC: /* UL ML */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - case DIGIT: /* UL ML */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - newtable = MIXED; - break; - } - break; - case PUNC: /* To PUNC */ - switch(curtable) { - case UPPER: /* ML PL */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - concat(binary_string, hexbit[30]); - if(debug) printf("PL "); - newtable = PUNC; - break; - case LOWER: /* ML PL */ - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - concat(binary_string, hexbit[30]); - if(debug) printf("PL "); - newtable = PUNC; - break; - case MIXED: /* PL */ - concat(binary_string, hexbit[30]); - if(debug) printf("PL "); - newtable = PUNC; - break; - case DIGIT: /* UL ML PL */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[29]); - if(debug) printf("ML "); - concat(binary_string, hexbit[30]); - if(debug) printf("PL "); - newtable = PUNC; - break; - } - break; - case DIGIT: /* To DIGIT */ - switch(curtable) { - case UPPER: /* DL */ - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case LOWER: /* DL */ - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case MIXED: /* UL DL */ - concat(binary_string, hexbit[29]); - if(debug) printf("UL "); - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - case PUNC: /* UL DL */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[30]); - if(debug) printf("DL "); - newtable = DIGIT; - break; - } - break; - case BINARY: /* To BINARY */ - lasttable = curtable; - switch(curtable) { - case UPPER: /* BS */ - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - newtable = BINARY; - break; - case LOWER: /* BS */ - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - newtable = BINARY; - break; - case MIXED: /* BS */ - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - newtable = BINARY; - break; - case PUNC: /* UL BS */ - concat(binary_string, hexbit[31]); - if(debug) printf("UL "); - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - newtable = BINARY; - break; - case DIGIT: /* UL BS */ - concat(binary_string, pentbit[14]); - if(debug) printf("UL "); - concat(binary_string, hexbit[31]); - if(debug) printf("BS "); - newtable = BINARY; - break; - } - - bytes = 0; - do{ - bytes++; - }while(typemap[i + (bytes - 1)] == BINARY); - bytes--; - - if(bytes > 2079) { - return ERROR_TOO_LONG; - } - - if(bytes > 31) { /* Put 00000 followed by 11-bit number of bytes less 31 */ - int adjusted; - - adjusted = bytes - 31; - concat(binary_string, "00000"); - if(adjusted & 0x400) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x200) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x100) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x80) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x40) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x20) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x10) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x08) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x04) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x02) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(adjusted & 0x01) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - } else { /* Put 5-bit number of bytes */ - if(bytes & 0x10) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(bytes & 0x08) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(bytes & 0x04) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(bytes & 0x02) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(bytes & 0x01) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - } - if(debug) printf("(%d bytes) ", bytes); - - break; - } - } - } - /* Add data to the binary string */ - curtable = newtable; - chartype = typemap[i]; - if(chartype > 64) { chartype -= 64; } - switch(chartype) { - case UPPER: - case LOWER: - case MIXED: - case PUNC: - if(charmap[i] >= 400) { - concat(binary_string, tribit[charmap[i] - 400]); - if(debug) printf("FLG(%d) ",charmap[i] - 400); - } else { - concat(binary_string, hexbit[charmap[i]]); - if(!((chartype == PUNC) && (charmap[i] == 0))) - if(debug) printf("%d ",charmap[i]); - } - break; - case DIGIT: - concat(binary_string, pentbit[charmap[i]]); - if(debug) printf("%d ",charmap[i]); - break; - case BINARY: - if(charmap[i] & 0x80) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x40) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x20) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x10) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x08) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x04) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x02) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(charmap[i] & 0x01) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(debug) printf("%d ",charmap[i]); - break; - } - - } - - if(debug) printf("\n"); - - if(strlen(binary_string) > 14970) { - return ERROR_TOO_LONG; - } - - return 0; -} - -int aztec(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int x, y, i, j, data_blocks, ecc_blocks, layers, total_bits; - char binary_string[20000], bit_pattern[20045], descriptor[42]; - char adjusted_string[20000]; - unsigned char desc_data[4], desc_ecc[6]; - int err_code, ecc_level, compact, data_length, data_maxsize, codeword_size, adjusted_length; - int remainder, padbits, count, gs1, adjustment_size; - int debug = 0, reader = 0; - int comp_loop = 4; - -#ifndef _MSC_VER - unsigned char local_source[length + 1]; -#else - unsigned int* data_part; - unsigned int* ecc_part; - unsigned char* local_source = (unsigned char*)_alloca(length + 1); -#endif - - memset(binary_string,0,20000); - memset(adjusted_string,0,20000); - - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } - if(symbol->output_options & READER_INIT) { reader = 1; comp_loop = 1; } - if((gs1 == 1) && (reader == 1)) { - strcpy(symbol->errtxt, "Cannot encode in GS1 and Reader Initialisation mode at the same time"); - return ERROR_INVALID_OPTION; - } - - switch(symbol->input_mode) { - case DATA_MODE: - case GS1_MODE: - memcpy(local_source, source, length); - local_source[length] = '\0'; - break; - case UNICODE_MODE: - err_code = latin1_process(symbol, source, local_source, &length); - if(err_code != 0) { return err_code; } - break; - } - - /* Aztec code can't handle NULL characters */ - for(i = 0; i < length; i++) { - if(local_source[i] == '\0') { - strcpy(symbol->errtxt, "Invalid character (NULL) in input data"); - return ERROR_INVALID_DATA1; - } - } - - err_code = aztec_text_process(local_source, length, binary_string, gs1); - - - if(err_code != 0) { - strcpy(symbol->errtxt, "Input too long or too many extended ASCII characters"); - return err_code; - } - - if(!((symbol->option_1 >= -1) && (symbol->option_1 <= 4))) { - strcpy(symbol->errtxt, "Invalid error correction level - using default instead"); - err_code = WARN_INVALID_OPTION; - symbol->option_1 = -1; - } - - ecc_level = symbol->option_1; - - if((ecc_level == -1) || (ecc_level == 0)) { - ecc_level = 2; - } - - data_length = strlen(binary_string); - - layers = 0; /* Keep compiler happy! */ - data_maxsize = 0; /* Keep compiler happy! */ - adjustment_size = 0; - if(symbol->option_2 == 0) { /* The size of the symbol can be determined by Zint */ - do { - /* Decide what size symbol to use - the smallest that fits the data */ - compact = 0; /* 1 = Aztec Compact, 0 = Normal Aztec */ - layers = 0; - - switch(ecc_level) { - /* For each level of error correction work out the smallest symbol which - the data will fit in */ - case 1: for(i = 32; i > 0; i--) { - if((data_length + adjustment_size) < Aztec10DataSizes[i - 1]) { - layers = i; - compact = 0; - data_maxsize = Aztec10DataSizes[i - 1]; - } - } - for(i = comp_loop; i > 0; i--) { - if((data_length + adjustment_size) < AztecCompact10DataSizes[i - 1]) { - layers = i; - compact = 1; - data_maxsize = AztecCompact10DataSizes[i - 1]; - } - } - break; - case 2: for(i = 32; i > 0; i--) { - if((data_length + adjustment_size) < Aztec23DataSizes[i - 1]) { - layers = i; - compact = 0; - data_maxsize = Aztec23DataSizes[i - 1]; - } - } - for(i = comp_loop; i > 0; i--) { - if((data_length + adjustment_size) < AztecCompact23DataSizes[i - 1]) { - layers = i; - compact = 1; - data_maxsize = AztecCompact23DataSizes[i - 1]; - } - } - break; - case 3: for(i = 32; i > 0; i--) { - if((data_length + adjustment_size) < Aztec36DataSizes[i - 1]) { - layers = i; - compact = 0; - data_maxsize = Aztec36DataSizes[i - 1]; - } - } - for(i = comp_loop; i > 0; i--) { - if((data_length + adjustment_size) < AztecCompact36DataSizes[i - 1]) { - layers = i; - compact = 1; - data_maxsize = AztecCompact36DataSizes[i - 1]; - } - } - break; - case 4: for(i = 32; i > 0; i--) { - if((data_length + adjustment_size) < Aztec50DataSizes[i - 1]) { - layers = i; - compact = 0; - data_maxsize = Aztec50DataSizes[i - 1]; - } - } - for(i = comp_loop; i > 0; i--) { - if((data_length + adjustment_size) < AztecCompact50DataSizes[i - 1]) { - layers = i; - compact = 1; - data_maxsize = AztecCompact50DataSizes[i - 1]; - } - } - break; - } - - if(layers == 0) { /* Couldn't find a symbol which fits the data */ - strcpy(symbol->errtxt, "Input too long (too many bits for selected ECC)"); - return ERROR_TOO_LONG; - } - - /* Determine codeword bitlength - Table 3 */ - codeword_size = 6; /* if (layers <= 2) */ - if((layers >= 3) && (layers <= 8)) { codeword_size = 8; } - if((layers >= 9) && (layers <= 22)) { codeword_size = 10; } - if(layers >= 23) { codeword_size = 12; } - - j = 0; i = 0; - do { - if((j + 1) % codeword_size == 0) { - /* Last bit of codeword */ - int t, done = 0; - count = 0; - - /* Discover how many '1's in current codeword */ - for(t = 0; t < (codeword_size - 1); t++) { - if(binary_string[(i - (codeword_size - 1)) + t] == '1') count++; - } - - if(count == (codeword_size - 1)) { - adjusted_string[j] = '0'; - j++; - done = 1; - } - - if(count == 0) { - adjusted_string[j] = '1'; - j++; - done = 1; - } - - if(done == 0) { - adjusted_string[j] = binary_string[i]; - j++; - i++; - } - } - adjusted_string[j] = binary_string[i]; - j++; - i++; - } while (i <= (data_length + 1)); - adjusted_string[j] = '\0'; - adjusted_length = strlen(adjusted_string); - adjustment_size = adjusted_length - data_length; - - /* Add padding */ - remainder = adjusted_length % codeword_size; - - padbits = codeword_size - remainder; - if(padbits == codeword_size) { padbits = 0; } - - for(i = 0; i < padbits; i++) { - concat(adjusted_string, "1"); - } - adjusted_length = strlen(adjusted_string); - - count = 0; - for(i = (adjusted_length - codeword_size); i < adjusted_length; i++) { - if(adjusted_string[i] == '1') { count++; } - } - if(count == codeword_size) { adjusted_string[adjusted_length - 1] = '0'; } - - if(debug) { - printf("Codewords:\n"); - for(i = 0; i < (adjusted_length / codeword_size); i++) { - for(j = 0; j < codeword_size; j++) { - printf("%c", adjusted_string[(i * codeword_size) + j]); - } - printf("\n"); - } - } - - } while(adjusted_length > data_maxsize); - /* This loop will only repeat on the rare occasions when the rule about not having all 1s or all 0s - means that the binary string has had to be lengthened beyond the maximum number of bits that can - be encoded in a symbol of the selected size */ - - } else { /* The size of the symbol has been specified by the user */ - if((reader == 1) && ((symbol->option_2 >= 2) && (symbol->option_2 <= 4))) { - symbol->option_2 = 5; - } - if((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) { - compact = 1; - layers = symbol->option_2; - } - if((symbol->option_2 >= 5) && (symbol->option_2 <= 36)) { - compact = 0; - layers = symbol->option_2 - 4; - } - if((symbol->option_2 < 0) || (symbol->option_2 > 36)) { - strcpy(symbol->errtxt, "Invalid Aztec Code size"); - return ERROR_INVALID_OPTION; - } - - /* Determine codeword bitlength - Table 3 */ - if((layers >= 0) && (layers <= 2)) { codeword_size = 6; } - if((layers >= 3) && (layers <= 8)) { codeword_size = 8; } - if((layers >= 9) && (layers <= 22)) { codeword_size = 10; } - if(layers >= 23) { codeword_size = 12; } - - j = 0; i = 0; - do { - if((j + 1) % codeword_size == 0) { - /* Last bit of codeword */ - int t, done = 0; - count = 0; - - /* Discover how many '1's in current codeword */ - for(t = 0; t < (codeword_size - 1); t++) { - if(binary_string[(i - (codeword_size - 1)) + t] == '1') count++; - } - - if(count == (codeword_size - 1)) { - adjusted_string[j] = '0'; - j++; - done = 1; - } - - if(count == 0) { - adjusted_string[j] = '1'; - j++; - done = 1; - } - - if(done == 0) { - adjusted_string[j] = binary_string[i]; - j++; - i++; - } - } - adjusted_string[j] = binary_string[i]; - j++; - i++; - } while (i <= (data_length + 1)); - adjusted_string[j] = '\0'; - adjusted_length = strlen(adjusted_string); - - remainder = adjusted_length % codeword_size; - - padbits = codeword_size - remainder; - if(padbits == codeword_size) { padbits = 0; } - - for(i = 0; i < padbits; i++) { - concat(adjusted_string, "1"); - } - adjusted_length = strlen(adjusted_string); - - count = 0; - for(i = (adjusted_length - codeword_size); i < adjusted_length; i++) { - if(adjusted_string[i] == '1') { count++; } - } - if(count == codeword_size) { adjusted_string[adjusted_length - 1] = '0'; } - - /* Check if the data actually fits into the selected symbol size */ - if (compact) { - data_maxsize = codeword_size * (AztecCompactSizes[layers - 1] - 3); - } else { - data_maxsize = codeword_size * (AztecSizes[layers - 1] - 3); - } - - if(adjusted_length > data_maxsize) { - strcpy(symbol->errtxt, "Data too long for specified Aztec Code symbol size"); - return ERROR_TOO_LONG; - } - - if(debug) { - printf("Codewords:\n"); - for(i = 0; i < (adjusted_length / codeword_size); i++) { - for(j = 0; j < codeword_size; j++) { - printf("%c", adjusted_string[(i * codeword_size) + j]); - } - printf("\n"); - } - } - - } - - if(reader && (layers > 22)) { - strcpy(symbol->errtxt, "Data too long for reader initialisation symbol"); - return ERROR_TOO_LONG; - } - - data_blocks = adjusted_length / codeword_size; - - if(compact) { - ecc_blocks = AztecCompactSizes[layers - 1] - data_blocks; - } else { - ecc_blocks = AztecSizes[layers - 1] - data_blocks; - } - - if(debug) { - printf("Generating a "); - if(compact) { printf("compact"); } else { printf("full-size"); } - printf(" symbol with %d layers\n", layers); - printf("Requires "); - if(compact) { printf("%d", AztecCompactSizes[layers - 1]); } else { printf("%d", AztecSizes[layers - 1]); } - printf(" codewords of %d-bits\n", codeword_size); - printf(" (%d data words, %d ecc words)\n", data_blocks, ecc_blocks); - } - -#ifndef _MSC_VER - unsigned int data_part[data_blocks + 3], ecc_part[ecc_blocks + 3]; -#else - data_part = (unsigned int*)_alloca((data_blocks + 3) * sizeof(unsigned int)); - ecc_part = (unsigned int*)_alloca((ecc_blocks + 3) * sizeof(unsigned int)); -#endif - /* Copy across data into separate integers */ - memset(data_part,0,(data_blocks + 2)*sizeof(int)); - memset(ecc_part,0,(ecc_blocks + 2)*sizeof(int)); - - /* Split into codewords and calculate reed-colomon error correction codes */ - switch(codeword_size) { - case 6: - for(i = 0; i < data_blocks; i++) { - if(adjusted_string[i * codeword_size] == '1') { data_part[i] += 32; } - if(adjusted_string[(i * codeword_size) + 1] == '1') { data_part[i] += 16; } - if(adjusted_string[(i * codeword_size) + 2] == '1') { data_part[i] += 8; } - if(adjusted_string[(i * codeword_size) + 3] == '1') { data_part[i] += 4; } - if(adjusted_string[(i * codeword_size) + 4] == '1') { data_part[i] += 2; } - if(adjusted_string[(i * codeword_size) + 5] == '1') { data_part[i] += 1; } - } - rs_init_gf(0x43); - rs_init_code(ecc_blocks, 1); - rs_encode_long(data_blocks, data_part, ecc_part); - for(i = (ecc_blocks - 1); i >= 0; i--) { - if(ecc_part[i] & 0x20) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x10) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x08) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x04) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x02) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x01) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - } - rs_free(); - break; - case 8: - for(i = 0; i < data_blocks; i++) { - if(adjusted_string[i * codeword_size] == '1') { data_part[i] += 128; } - if(adjusted_string[(i * codeword_size) + 1] == '1') { data_part[i] += 64; } - if(adjusted_string[(i * codeword_size) + 2] == '1') { data_part[i] += 32; } - if(adjusted_string[(i * codeword_size) + 3] == '1') { data_part[i] += 16; } - if(adjusted_string[(i * codeword_size) + 4] == '1') { data_part[i] += 8; } - if(adjusted_string[(i * codeword_size) + 5] == '1') { data_part[i] += 4; } - if(adjusted_string[(i * codeword_size) + 6] == '1') { data_part[i] += 2; } - if(adjusted_string[(i * codeword_size) + 7] == '1') { data_part[i] += 1; } - } - rs_init_gf(0x12d); - rs_init_code(ecc_blocks, 1); - rs_encode_long(data_blocks, data_part, ecc_part); - for(i = (ecc_blocks - 1); i >= 0; i--) { - if(ecc_part[i] & 0x80) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x40) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x20) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x10) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x08) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x04) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x02) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x01) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - } - rs_free(); - break; - case 10: - for(i = 0; i < data_blocks; i++) { - if(adjusted_string[i * codeword_size] == '1') { data_part[i] += 512; } - if(adjusted_string[(i * codeword_size) + 1] == '1') { data_part[i] += 256; } - if(adjusted_string[(i * codeword_size) + 2] == '1') { data_part[i] += 128; } - if(adjusted_string[(i * codeword_size) + 3] == '1') { data_part[i] += 64; } - if(adjusted_string[(i * codeword_size) + 4] == '1') { data_part[i] += 32; } - if(adjusted_string[(i * codeword_size) + 5] == '1') { data_part[i] += 16; } - if(adjusted_string[(i * codeword_size) + 6] == '1') { data_part[i] += 8; } - if(adjusted_string[(i * codeword_size) + 7] == '1') { data_part[i] += 4; } - if(adjusted_string[(i * codeword_size) + 8] == '1') { data_part[i] += 2; } - if(adjusted_string[(i * codeword_size) + 9] == '1') { data_part[i] += 1; } - } - rs_init_gf(0x409); - rs_init_code(ecc_blocks, 1); - rs_encode_long(data_blocks, data_part, ecc_part); - for(i = (ecc_blocks - 1); i >= 0; i--) { - if(ecc_part[i] & 0x200) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x100) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x80) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x40) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x20) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x10) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x08) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x04) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x02) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x01) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - } - rs_free(); - break; - case 12: - for(i = 0; i < data_blocks; i++) { - if(adjusted_string[i * codeword_size] == '1') { data_part[i] += 2048; } - if(adjusted_string[(i * codeword_size) + 1] == '1') { data_part[i] += 1024; } - if(adjusted_string[(i * codeword_size) + 2] == '1') { data_part[i] += 512; } - if(adjusted_string[(i * codeword_size) + 3] == '1') { data_part[i] += 256; } - if(adjusted_string[(i * codeword_size) + 4] == '1') { data_part[i] += 128; } - if(adjusted_string[(i * codeword_size) + 5] == '1') { data_part[i] += 64; } - if(adjusted_string[(i * codeword_size) + 6] == '1') { data_part[i] += 32; } - if(adjusted_string[(i * codeword_size) + 7] == '1') { data_part[i] += 16; } - if(adjusted_string[(i * codeword_size) + 8] == '1') { data_part[i] += 8; } - if(adjusted_string[(i * codeword_size) + 9] == '1') { data_part[i] += 4; } - if(adjusted_string[(i * codeword_size) + 10] == '1') { data_part[i] += 2; } - if(adjusted_string[(i * codeword_size) + 11] == '1') { data_part[i] += 1; } - } - rs_init_gf(0x1069); - rs_init_code(ecc_blocks, 1); - rs_encode_long(data_blocks, data_part, ecc_part); - for(i = (ecc_blocks - 1); i >= 0; i--) { - if(ecc_part[i] & 0x800) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x400) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x200) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x100) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x80) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x40) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x20) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x10) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x08) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x04) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x02) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - if(ecc_part[i] & 0x01) { concat(adjusted_string, "1"); } else { concat(adjusted_string, "0"); } - } - rs_free(); - break; - } - - /* Invert the data so that actual data is on the outside and reed-solomon on the inside */ - memset(bit_pattern,'0',20045); - - total_bits = (data_blocks + ecc_blocks) * codeword_size; - for(i = 0; i < total_bits; i++) { - bit_pattern[i] = adjusted_string[total_bits - i - 1]; - } - - /* Now add the symbol descriptor */ - memset(desc_data,0,4); - memset(desc_ecc,0,6); - memset(descriptor,0,42); - - if(compact) { - /* The first 2 bits represent the number of layers minus 1 */ - if((layers - 1) & 0x02) { descriptor[0] = '1'; } else { descriptor[0] = '0'; } - if((layers - 1) & 0x01) { descriptor[1] = '1'; } else { descriptor[1] = '0'; } - /* The next 6 bits represent the number of data blocks minus 1 */ - if(reader) { - descriptor[2] = '1'; - } else { - if((data_blocks - 1) & 0x20) { descriptor[2] = '1'; } else { descriptor[2] = '0'; } - } - if((data_blocks - 1) & 0x10) { descriptor[3] = '1'; } else { descriptor[3] = '0'; } - if((data_blocks - 1) & 0x08) { descriptor[4] = '1'; } else { descriptor[4] = '0'; } - if((data_blocks - 1) & 0x04) { descriptor[5] = '1'; } else { descriptor[5] = '0'; } - if((data_blocks - 1) & 0x02) { descriptor[6] = '1'; } else { descriptor[6] = '0'; } - if((data_blocks - 1) & 0x01) { descriptor[7] = '1'; } else { descriptor[7] = '0'; } - descriptor[8] = '\0'; - if(debug) printf("Mode Message = %s\n", descriptor); - } else { - /* The first 5 bits represent the number of layers minus 1 */ - if((layers - 1) & 0x10) { descriptor[0] = '1'; } else { descriptor[0] = '0'; } - if((layers - 1) & 0x08) { descriptor[1] = '1'; } else { descriptor[1] = '0'; } - if((layers - 1) & 0x04) { descriptor[2] = '1'; } else { descriptor[2] = '0'; } - if((layers - 1) & 0x02) { descriptor[3] = '1'; } else { descriptor[3] = '0'; } - if((layers - 1) & 0x01) { descriptor[4] = '1'; } else { descriptor[4] = '0'; } - /* The next 11 bits represent the number of data blocks minus 1 */ - if(reader) { - descriptor[5] = '1'; - } else { - if((data_blocks - 1) & 0x400) { descriptor[5] = '1'; } else { descriptor[5] = '0'; } - } - if((data_blocks - 1) & 0x200) { descriptor[6] = '1'; } else { descriptor[6] = '0'; } - if((data_blocks - 1) & 0x100) { descriptor[7] = '1'; } else { descriptor[7] = '0'; } - if((data_blocks - 1) & 0x80) { descriptor[8] = '1'; } else { descriptor[8] = '0'; } - if((data_blocks - 1) & 0x40) { descriptor[9] = '1'; } else { descriptor[9] = '0'; } - if((data_blocks - 1) & 0x20) { descriptor[10] = '1'; } else { descriptor[10] = '0'; } - if((data_blocks - 1) & 0x10) { descriptor[11] = '1'; } else { descriptor[11] = '0'; } - if((data_blocks - 1) & 0x08) { descriptor[12] = '1'; } else { descriptor[12] = '0'; } - if((data_blocks - 1) & 0x04) { descriptor[13] = '1'; } else { descriptor[13] = '0'; } - if((data_blocks - 1) & 0x02) { descriptor[14] = '1'; } else { descriptor[14] = '0'; } - if((data_blocks - 1) & 0x01) { descriptor[15] = '1'; } else { descriptor[15] = '0'; } - descriptor[16] = '\0'; - if(debug) printf("Mode Message = %s\n", descriptor); - } - - /* Split into 4-bit codewords */ - for(i = 0; i < 4; i++) { - if(descriptor[i * 4] == '1') { desc_data[i] += 8; } - if(descriptor[(i * 4) + 1] == '1') { desc_data[i] += 4; } - if(descriptor[(i * 4) + 2] == '1') { desc_data[i] += 2; } - if(descriptor[(i * 4) + 3] == '1') { desc_data[i] += 1; } - } - - /* Add reed-solomon error correction with Galois field GF(16) and prime modulus - x^4 + x + 1 (section 7.2.3)*/ - - rs_init_gf(0x13); - if(compact) { - rs_init_code(5, 1); - rs_encode(2, desc_data, desc_ecc); - for(i = 0; i < 5; i++) { - if(desc_ecc[4 - i] & 0x08) { descriptor[(i * 4) + 8] = '1'; } else { descriptor[(i * 4) + 8] = '0'; } - if(desc_ecc[4 - i] & 0x04) { descriptor[(i * 4) + 9] = '1'; } else { descriptor[(i * 4) + 9] = '0'; } - if(desc_ecc[4 - i] & 0x02) { descriptor[(i * 4) + 10] = '1'; } else { descriptor[(i * 4) + 10] = '0'; } - if(desc_ecc[4 - i] & 0x01) { descriptor[(i * 4) + 11] = '1'; } else { descriptor[(i * 4) + 11] = '0'; } - } - } else { - rs_init_code(6, 1); - rs_encode(4, desc_data, desc_ecc); - for(i = 0; i < 6; i++) { - if(desc_ecc[5 - i] & 0x08) { descriptor[(i * 4) + 16] = '1'; } else { descriptor[(i * 4) + 16] = '0'; } - if(desc_ecc[5 - i] & 0x04) { descriptor[(i * 4) + 17] = '1'; } else { descriptor[(i * 4) + 17] = '0'; } - if(desc_ecc[5 - i] & 0x02) { descriptor[(i * 4) + 18] = '1'; } else { descriptor[(i * 4) + 18] = '0'; } - if(desc_ecc[5 - i] & 0x01) { descriptor[(i * 4) + 19] = '1'; } else { descriptor[(i * 4) + 19] = '0'; } - } - } - rs_free(); - - /* Merge descriptor with the rest of the symbol */ - for(i = 0; i < 40; i++) { - if(compact) { - bit_pattern[2000 + i - 2] = descriptor[i]; - } else { - bit_pattern[20000 + i - 2] = descriptor[i]; - } - } - - /* Plot all of the data into the symbol in pre-defined spiral pattern */ - if(compact) { - - for(y = AztecCompactOffset[layers - 1]; y < (27 - AztecCompactOffset[layers - 1]); y++) { - for(x = AztecCompactOffset[layers - 1]; x < (27 - AztecCompactOffset[layers - 1]); x++) { - if(CompactAztecMap[(y * 27) + x] == 1) { - set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]); - } - if(CompactAztecMap[(y * 27) + x] >= 2) { - if(bit_pattern[CompactAztecMap[(y * 27) + x] - 2] == '1') { - set_module(symbol, y - AztecCompactOffset[layers - 1], x - AztecCompactOffset[layers - 1]); - } - } - } - symbol->row_height[y - AztecCompactOffset[layers - 1]] = 1; - } - symbol->rows = 27 - (2 * AztecCompactOffset[layers - 1]); - symbol->width = 27 - (2 * AztecCompactOffset[layers - 1]); - } else { - - for(y = AztecOffset[layers - 1]; y < (151 - AztecOffset[layers - 1]); y++) { - for(x = AztecOffset[layers - 1]; x < (151 - AztecOffset[layers - 1]); x++) { - if(AztecMap[(y * 151) + x] == 1) { - set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]); - } - if(AztecMap[(y * 151) + x] >= 2) { - if(bit_pattern[AztecMap[(y * 151) + x] - 2] == '1') { - set_module(symbol, y - AztecOffset[layers - 1], x - AztecOffset[layers - 1]); - } - } - } - symbol->row_height[y - AztecOffset[layers - 1]] = 1; - } - symbol->rows = 151 - (2 * AztecOffset[layers - 1]); - symbol->width = 151 - (2 * AztecOffset[layers - 1]); - } - - return err_code; -} - -int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int input_value, error_number, i, y, x; - char binary_string[28]; - unsigned char data_codewords[3], ecc_codewords[6]; - - error_number = 0; - input_value = 0; - if(length > 3) { - strcpy(symbol->errtxt, "Input too large"); - return ERROR_INVALID_DATA1; - } - error_number = is_sane(NEON, source, length); - if(error_number != 0) { - strcpy(symbol->errtxt, "Invalid characters in input"); - return ERROR_INVALID_DATA1; - } - switch(length) { - case 3: input_value = 100 * ctoi(source[0]); - input_value += 10 * ctoi(source[1]); - input_value += ctoi(source[2]); - break; - case 2: input_value = 10 * ctoi(source[0]); - input_value += ctoi(source[1]); - break; - case 1: input_value = ctoi(source[0]); - break; - } - - if(input_value > 255) { - strcpy(symbol->errtxt, "Input too large"); - return ERROR_INVALID_DATA1; - } - - strcpy(binary_string, ""); - if(input_value & 0x80) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x40) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x20) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x10) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x08) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x04) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x02) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - if(input_value & 0x01) { concat(binary_string, "1"); } else { concat(binary_string, "0"); } - - data_codewords[0] = 0; - data_codewords[1] = 0; - - for(i = 0; i < 2; i++) { - if(binary_string[i * 4] == '1') { data_codewords[i] += 8; } - if(binary_string[(i * 4) + 1] == '1') { data_codewords[i] += 4; } - if(binary_string[(i * 4) + 2] == '1') { data_codewords[i] += 2; } - if(binary_string[(i * 4) + 3] == '1') { data_codewords[i] += 1; } - } - - rs_init_gf(0x13); - rs_init_code(5, 1); - rs_encode(2, data_codewords, ecc_codewords); - rs_free(); - - strcpy(binary_string, ""); - - for(i = 0; i < 5; i++) { - if(ecc_codewords[4 - i] & 0x08) { binary_string[(i * 4) + 8] = '1'; } else { binary_string[(i * 4) + 8] = '0'; } - if(ecc_codewords[4 - i] & 0x04) { binary_string[(i * 4) + 9] = '1'; } else { binary_string[(i * 4) + 9] = '0'; } - if(ecc_codewords[4 - i] & 0x02) { binary_string[(i * 4) + 10] = '1'; } else { binary_string[(i * 4) + 10] = '0'; } - if(ecc_codewords[4 - i] & 0x01) { binary_string[(i * 4) + 11] = '1'; } else { binary_string[(i * 4) + 11] = '0'; } - } - - for(i = 0; i < 28; i += 2) { - if(binary_string[i] == '1') { binary_string[i] = '0'; } else { binary_string[i] = '1'; } - } - - for(y = 8; y < 19; y++) { - for(x = 8; x < 19; x++) { - if(CompactAztecMap[(y * 27) + x] == 1) { - set_module(symbol, y - 8, x - 8); - } - if(CompactAztecMap[(y * 27) + x] >= 2) { - if(binary_string[CompactAztecMap[(y * 27) + x] - 2000] == '1') { - set_module(symbol, y - 8, x - 8); - } - } - } - symbol->row_height[y - 8] = 1; - } - symbol->rows = 11; - symbol->width = 11; - - return 0; -} diff --git a/3rdparty/zint-2.4.4/backend/aztec.h b/3rdparty/zint-2.4.4/backend/aztec.h deleted file mode 100644 index 93e0e27..0000000 --- a/3rdparty/zint-2.4.4/backend/aztec.h +++ /dev/null @@ -1,291 +0,0 @@ -/* aztec.c - Handles Aztec Mesa 2D Symbols */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#define UPPER 1 -#define LOWER 2 -#define MIXED 4 -#define PUNC 8 -#define DIGIT 16 -#define BINARY 32 - -static int AztecMap[] = { /* 151 x 151 data grid */ - 19969,19968,18851,18853,18855,18857,18859,18861,18863,18865,18867,0,18869,18871,18873,18875,18877,18879,18881,18883,18885,18887,18889,18891,18893,18895,18897,0,18899,18901,18903,18905,18907,18909,18911,18913,18915,18917,18919,18921,18923,18925,18927,0,18929,18931,18933,18935,18937,18939,18941,18943,18945,18947,18949,18951,18953,18955,18957,0,18959,18961,18963,18965,18967,18969,18971,18973,18975,18977,18979,18981,18983,18985,18987,0,18989,18991,18993,18995,18997,18999,19001,19003,19005,19007,19009,19011,19013,19015,19017,0,19019,19021,19023,19025,19027,19029,19031,19033,19035,19037,19039,19041,19043,19045,19047,0,19049,19051,19053,19055,19057,19059,19061,19063,19065,19067,19069,19071,19073,19075,19077,0,19079,19081,19083,19085,19087,19089,19091,19093,19095,19097,19099,19101,19103,19105,19107,0,19109,19111,19113,19115,19117,19119,19121,19123,19125,19127,19129, - 19967,19966,18850,18852,18854,18856,18858,18860,18862,18864,18866,1,18868,18870,18872,18874,18876,18878,18880,18882,18884,18886,18888,18890,18892,18894,18896,1,18898,18900,18902,18904,18906,18908,18910,18912,18914,18916,18918,18920,18922,18924,18926,1,18928,18930,18932,18934,18936,18938,18940,18942,18944,18946,18948,18950,18952,18954,18956,1,18958,18960,18962,18964,18966,18968,18970,18972,18974,18976,18978,18980,18982,18984,18986,1,18988,18990,18992,18994,18996,18998,19000,19002,19004,19006,19008,19010,19012,19014,19016,1,19018,19020,19022,19024,19026,19028,19030,19032,19034,19036,19038,19040,19042,19044,19046,1,19048,19050,19052,19054,19056,19058,19060,19062,19064,19066,19068,19070,19072,19074,19076,1,19078,19080,19082,19084,19086,19088,19090,19092,19094,19096,19098,19100,19102,19104,19106,1,19108,19110,19112,19114,19116,19118,19120,19122,19124,19126,19128, - 19965,19964,18849,18848,17763,17765,17767,17769,17771,17773,17775,0,17777,17779,17781,17783,17785,17787,17789,17791,17793,17795,17797,17799,17801,17803,17805,0,17807,17809,17811,17813,17815,17817,17819,17821,17823,17825,17827,17829,17831,17833,17835,0,17837,17839,17841,17843,17845,17847,17849,17851,17853,17855,17857,17859,17861,17863,17865,0,17867,17869,17871,17873,17875,17877,17879,17881,17883,17885,17887,17889,17891,17893,17895,0,17897,17899,17901,17903,17905,17907,17909,17911,17913,17915,17917,17919,17921,17923,17925,0,17927,17929,17931,17933,17935,17937,17939,17941,17943,17945,17947,17949,17951,17953,17955,0,17957,17959,17961,17963,17965,17967,17969,17971,17973,17975,17977,17979,17981,17983,17985,0,17987,17989,17991,17993,17995,17997,17999,18001,18003,18005,18007,18009,18011,18013,18015,0,18017,18019,18021,18023,18025,18027,18029,18031,18033,19130,19131, - 19963,19962,18847,18846,17762,17764,17766,17768,17770,17772,17774,1,17776,17778,17780,17782,17784,17786,17788,17790,17792,17794,17796,17798,17800,17802,17804,1,17806,17808,17810,17812,17814,17816,17818,17820,17822,17824,17826,17828,17830,17832,17834,1,17836,17838,17840,17842,17844,17846,17848,17850,17852,17854,17856,17858,17860,17862,17864,1,17866,17868,17870,17872,17874,17876,17878,17880,17882,17884,17886,17888,17890,17892,17894,1,17896,17898,17900,17902,17904,17906,17908,17910,17912,17914,17916,17918,17920,17922,17924,1,17926,17928,17930,17932,17934,17936,17938,17940,17942,17944,17946,17948,17950,17952,17954,1,17956,17958,17960,17962,17964,17966,17968,17970,17972,17974,17976,17978,17980,17982,17984,1,17986,17988,17990,17992,17994,17996,17998,18000,18002,18004,18006,18008,18010,18012,18014,1,18016,18018,18020,18022,18024,18026,18028,18030,18032,19132,19133, - 19961,19960,18845,18844,17761,17760,16707,16709,16711,16713,16715,0,16717,16719,16721,16723,16725,16727,16729,16731,16733,16735,16737,16739,16741,16743,16745,0,16747,16749,16751,16753,16755,16757,16759,16761,16763,16765,16767,16769,16771,16773,16775,0,16777,16779,16781,16783,16785,16787,16789,16791,16793,16795,16797,16799,16801,16803,16805,0,16807,16809,16811,16813,16815,16817,16819,16821,16823,16825,16827,16829,16831,16833,16835,0,16837,16839,16841,16843,16845,16847,16849,16851,16853,16855,16857,16859,16861,16863,16865,0,16867,16869,16871,16873,16875,16877,16879,16881,16883,16885,16887,16889,16891,16893,16895,0,16897,16899,16901,16903,16905,16907,16909,16911,16913,16915,16917,16919,16921,16923,16925,0,16927,16929,16931,16933,16935,16937,16939,16941,16943,16945,16947,16949,16951,16953,16955,0,16957,16959,16961,16963,16965,16967,16969,18034,18035,19134,19135, - 19959,19958,18843,18842,17759,17758,16706,16708,16710,16712,16714,1,16716,16718,16720,16722,16724,16726,16728,16730,16732,16734,16736,16738,16740,16742,16744,1,16746,16748,16750,16752,16754,16756,16758,16760,16762,16764,16766,16768,16770,16772,16774,1,16776,16778,16780,16782,16784,16786,16788,16790,16792,16794,16796,16798,16800,16802,16804,1,16806,16808,16810,16812,16814,16816,16818,16820,16822,16824,16826,16828,16830,16832,16834,1,16836,16838,16840,16842,16844,16846,16848,16850,16852,16854,16856,16858,16860,16862,16864,1,16866,16868,16870,16872,16874,16876,16878,16880,16882,16884,16886,16888,16890,16892,16894,1,16896,16898,16900,16902,16904,16906,16908,16910,16912,16914,16916,16918,16920,16922,16924,1,16926,16928,16930,16932,16934,16936,16938,16940,16942,16944,16946,16948,16950,16952,16954,1,16956,16958,16960,16962,16964,16966,16968,18036,18037,19136,19137, - 19957,19956,18841,18840,17757,17756,16705,16704,15683,15685,15687,0,15689,15691,15693,15695,15697,15699,15701,15703,15705,15707,15709,15711,15713,15715,15717,0,15719,15721,15723,15725,15727,15729,15731,15733,15735,15737,15739,15741,15743,15745,15747,0,15749,15751,15753,15755,15757,15759,15761,15763,15765,15767,15769,15771,15773,15775,15777,0,15779,15781,15783,15785,15787,15789,15791,15793,15795,15797,15799,15801,15803,15805,15807,0,15809,15811,15813,15815,15817,15819,15821,15823,15825,15827,15829,15831,15833,15835,15837,0,15839,15841,15843,15845,15847,15849,15851,15853,15855,15857,15859,15861,15863,15865,15867,0,15869,15871,15873,15875,15877,15879,15881,15883,15885,15887,15889,15891,15893,15895,15897,0,15899,15901,15903,15905,15907,15909,15911,15913,15915,15917,15919,15921,15923,15925,15927,0,15929,15931,15933,15935,15937,16970,16971,18038,18039,19138,19139, - 19955,19954,18839,18838,17755,17754,16703,16702,15682,15684,15686,1,15688,15690,15692,15694,15696,15698,15700,15702,15704,15706,15708,15710,15712,15714,15716,1,15718,15720,15722,15724,15726,15728,15730,15732,15734,15736,15738,15740,15742,15744,15746,1,15748,15750,15752,15754,15756,15758,15760,15762,15764,15766,15768,15770,15772,15774,15776,1,15778,15780,15782,15784,15786,15788,15790,15792,15794,15796,15798,15800,15802,15804,15806,1,15808,15810,15812,15814,15816,15818,15820,15822,15824,15826,15828,15830,15832,15834,15836,1,15838,15840,15842,15844,15846,15848,15850,15852,15854,15856,15858,15860,15862,15864,15866,1,15868,15870,15872,15874,15876,15878,15880,15882,15884,15886,15888,15890,15892,15894,15896,1,15898,15900,15902,15904,15906,15908,15910,15912,15914,15916,15918,15920,15922,15924,15926,1,15928,15930,15932,15934,15936,16972,16973,18040,18041,19140,19141, - 19953,19952,18837,18836,17753,17752,16701,16700,15681,15680,14691,0,14693,14695,14697,14699,14701,14703,14705,14707,14709,14711,14713,14715,14717,14719,14721,0,14723,14725,14727,14729,14731,14733,14735,14737,14739,14741,14743,14745,14747,14749,14751,0,14753,14755,14757,14759,14761,14763,14765,14767,14769,14771,14773,14775,14777,14779,14781,0,14783,14785,14787,14789,14791,14793,14795,14797,14799,14801,14803,14805,14807,14809,14811,0,14813,14815,14817,14819,14821,14823,14825,14827,14829,14831,14833,14835,14837,14839,14841,0,14843,14845,14847,14849,14851,14853,14855,14857,14859,14861,14863,14865,14867,14869,14871,0,14873,14875,14877,14879,14881,14883,14885,14887,14889,14891,14893,14895,14897,14899,14901,0,14903,14905,14907,14909,14911,14913,14915,14917,14919,14921,14923,14925,14927,14929,14931,0,14933,14935,14937,15938,15939,16974,16975,18042,18043,19142,19143, - 19951,19950,18835,18834,17751,17750,16699,16698,15679,15678,14690,1,14692,14694,14696,14698,14700,14702,14704,14706,14708,14710,14712,14714,14716,14718,14720,1,14722,14724,14726,14728,14730,14732,14734,14736,14738,14740,14742,14744,14746,14748,14750,1,14752,14754,14756,14758,14760,14762,14764,14766,14768,14770,14772,14774,14776,14778,14780,1,14782,14784,14786,14788,14790,14792,14794,14796,14798,14800,14802,14804,14806,14808,14810,1,14812,14814,14816,14818,14820,14822,14824,14826,14828,14830,14832,14834,14836,14838,14840,1,14842,14844,14846,14848,14850,14852,14854,14856,14858,14860,14862,14864,14866,14868,14870,1,14872,14874,14876,14878,14880,14882,14884,14886,14888,14890,14892,14894,14896,14898,14900,1,14902,14904,14906,14908,14910,14912,14914,14916,14918,14920,14922,14924,14926,14928,14930,1,14932,14934,14936,15940,15941,16976,16977,18044,18045,19144,19145, - 19949,19948,18833,18832,17749,17748,16697,16696,15677,15676,14689,0,14688,13731,13733,13735,13737,13739,13741,13743,13745,13747,13749,13751,13753,13755,13757,0,13759,13761,13763,13765,13767,13769,13771,13773,13775,13777,13779,13781,13783,13785,13787,0,13789,13791,13793,13795,13797,13799,13801,13803,13805,13807,13809,13811,13813,13815,13817,0,13819,13821,13823,13825,13827,13829,13831,13833,13835,13837,13839,13841,13843,13845,13847,0,13849,13851,13853,13855,13857,13859,13861,13863,13865,13867,13869,13871,13873,13875,13877,0,13879,13881,13883,13885,13887,13889,13891,13893,13895,13897,13899,13901,13903,13905,13907,0,13909,13911,13913,13915,13917,13919,13921,13923,13925,13927,13929,13931,13933,13935,13937,0,13939,13941,13943,13945,13947,13949,13951,13953,13955,13957,13959,13961,13963,13965,13967,0,13969,14938,14939,15942,15943,16978,16979,18046,18047,19146,19147, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 19947,19946,18831,18830,17747,17746,16695,16694,15675,15674,14687,0,14686,13730,13732,13734,13736,13738,13740,13742,13744,13746,13748,13750,13752,13754,13756,0,13758,13760,13762,13764,13766,13768,13770,13772,13774,13776,13778,13780,13782,13784,13786,0,13788,13790,13792,13794,13796,13798,13800,13802,13804,13806,13808,13810,13812,13814,13816,0,13818,13820,13822,13824,13826,13828,13830,13832,13834,13836,13838,13840,13842,13844,13846,0,13848,13850,13852,13854,13856,13858,13860,13862,13864,13866,13868,13870,13872,13874,13876,0,13878,13880,13882,13884,13886,13888,13890,13892,13894,13896,13898,13900,13902,13904,13906,0,13908,13910,13912,13914,13916,13918,13920,13922,13924,13926,13928,13930,13932,13934,13936,0,13938,13940,13942,13944,13946,13948,13950,13952,13954,13956,13958,13960,13962,13964,13966,0,13968,14940,14941,15944,15945,16980,16981,18048,18049,19148,19149, - 19945,19944,18829,18828,17745,17744,16693,16692,15673,15672,14685,1,14684,13729,13728,12803,12805,12807,12809,12811,12813,12815,12817,12819,12821,12823,12825,1,12827,12829,12831,12833,12835,12837,12839,12841,12843,12845,12847,12849,12851,12853,12855,1,12857,12859,12861,12863,12865,12867,12869,12871,12873,12875,12877,12879,12881,12883,12885,1,12887,12889,12891,12893,12895,12897,12899,12901,12903,12905,12907,12909,12911,12913,12915,1,12917,12919,12921,12923,12925,12927,12929,12931,12933,12935,12937,12939,12941,12943,12945,1,12947,12949,12951,12953,12955,12957,12959,12961,12963,12965,12967,12969,12971,12973,12975,1,12977,12979,12981,12983,12985,12987,12989,12991,12993,12995,12997,12999,13001,13003,13005,1,13007,13009,13011,13013,13015,13017,13019,13021,13023,13025,13027,13029,13031,13033,13970,1,13971,14942,14943,15946,15947,16982,16983,18050,18051,19150,19151, - 19943,19942,18827,18826,17743,17742,16691,16690,15671,15670,14683,0,14682,13727,13726,12802,12804,12806,12808,12810,12812,12814,12816,12818,12820,12822,12824,0,12826,12828,12830,12832,12834,12836,12838,12840,12842,12844,12846,12848,12850,12852,12854,0,12856,12858,12860,12862,12864,12866,12868,12870,12872,12874,12876,12878,12880,12882,12884,0,12886,12888,12890,12892,12894,12896,12898,12900,12902,12904,12906,12908,12910,12912,12914,0,12916,12918,12920,12922,12924,12926,12928,12930,12932,12934,12936,12938,12940,12942,12944,0,12946,12948,12950,12952,12954,12956,12958,12960,12962,12964,12966,12968,12970,12972,12974,0,12976,12978,12980,12982,12984,12986,12988,12990,12992,12994,12996,12998,13000,13002,13004,0,13006,13008,13010,13012,13014,13016,13018,13020,13022,13024,13026,13028,13030,13032,13972,0,13973,14944,14945,15948,15949,16984,16985,18052,18053,19152,19153, - 19941,19940,18825,18824,17741,17740,16689,16688,15669,15668,14681,1,14680,13725,13724,12801,12800,11907,11909,11911,11913,11915,11917,11919,11921,11923,11925,1,11927,11929,11931,11933,11935,11937,11939,11941,11943,11945,11947,11949,11951,11953,11955,1,11957,11959,11961,11963,11965,11967,11969,11971,11973,11975,11977,11979,11981,11983,11985,1,11987,11989,11991,11993,11995,11997,11999,12001,12003,12005,12007,12009,12011,12013,12015,1,12017,12019,12021,12023,12025,12027,12029,12031,12033,12035,12037,12039,12041,12043,12045,1,12047,12049,12051,12053,12055,12057,12059,12061,12063,12065,12067,12069,12071,12073,12075,1,12077,12079,12081,12083,12085,12087,12089,12091,12093,12095,12097,12099,12101,12103,12105,1,12107,12109,12111,12113,12115,12117,12119,12121,12123,12125,12127,12129,13034,13035,13974,1,13975,14946,14947,15950,15951,16986,16987,18054,18055,19154,19155, - 19939,19938,18823,18822,17739,17738,16687,16686,15667,15666,14679,0,14678,13723,13722,12799,12798,11906,11908,11910,11912,11914,11916,11918,11920,11922,11924,0,11926,11928,11930,11932,11934,11936,11938,11940,11942,11944,11946,11948,11950,11952,11954,0,11956,11958,11960,11962,11964,11966,11968,11970,11972,11974,11976,11978,11980,11982,11984,0,11986,11988,11990,11992,11994,11996,11998,12000,12002,12004,12006,12008,12010,12012,12014,0,12016,12018,12020,12022,12024,12026,12028,12030,12032,12034,12036,12038,12040,12042,12044,0,12046,12048,12050,12052,12054,12056,12058,12060,12062,12064,12066,12068,12070,12072,12074,0,12076,12078,12080,12082,12084,12086,12088,12090,12092,12094,12096,12098,12100,12102,12104,0,12106,12108,12110,12112,12114,12116,12118,12120,12122,12124,12126,12128,13036,13037,13976,0,13977,14948,14949,15952,15953,16988,16989,18056,18057,19156,19157, - 19937,19936,18821,18820,17737,17736,16685,16684,15665,15664,14677,1,14676,13721,13720,12797,12796,11905,11904,11043,11045,11047,11049,11051,11053,11055,11057,1,11059,11061,11063,11065,11067,11069,11071,11073,11075,11077,11079,11081,11083,11085,11087,1,11089,11091,11093,11095,11097,11099,11101,11103,11105,11107,11109,11111,11113,11115,11117,1,11119,11121,11123,11125,11127,11129,11131,11133,11135,11137,11139,11141,11143,11145,11147,1,11149,11151,11153,11155,11157,11159,11161,11163,11165,11167,11169,11171,11173,11175,11177,1,11179,11181,11183,11185,11187,11189,11191,11193,11195,11197,11199,11201,11203,11205,11207,1,11209,11211,11213,11215,11217,11219,11221,11223,11225,11227,11229,11231,11233,11235,11237,1,11239,11241,11243,11245,11247,11249,11251,11253,11255,11257,12130,12131,13038,13039,13978,1,13979,14950,14951,15954,15955,16990,16991,18058,18059,19158,19159, - 19935,19934,18819,18818,17735,17734,16683,16682,15663,15662,14675,0,14674,13719,13718,12795,12794,11903,11902,11042,11044,11046,11048,11050,11052,11054,11056,0,11058,11060,11062,11064,11066,11068,11070,11072,11074,11076,11078,11080,11082,11084,11086,0,11088,11090,11092,11094,11096,11098,11100,11102,11104,11106,11108,11110,11112,11114,11116,0,11118,11120,11122,11124,11126,11128,11130,11132,11134,11136,11138,11140,11142,11144,11146,0,11148,11150,11152,11154,11156,11158,11160,11162,11164,11166,11168,11170,11172,11174,11176,0,11178,11180,11182,11184,11186,11188,11190,11192,11194,11196,11198,11200,11202,11204,11206,0,11208,11210,11212,11214,11216,11218,11220,11222,11224,11226,11228,11230,11232,11234,11236,0,11238,11240,11242,11244,11246,11248,11250,11252,11254,11256,12132,12133,13040,13041,13980,0,13981,14952,14953,15956,15957,16992,16993,18060,18061,19160,19161, - 19933,19932,18817,18816,17733,17732,16681,16680,15661,15660,14673,1,14672,13717,13716,12793,12792,11901,11900,11041,11040,10211,10213,10215,10217,10219,10221,1,10223,10225,10227,10229,10231,10233,10235,10237,10239,10241,10243,10245,10247,10249,10251,1,10253,10255,10257,10259,10261,10263,10265,10267,10269,10271,10273,10275,10277,10279,10281,1,10283,10285,10287,10289,10291,10293,10295,10297,10299,10301,10303,10305,10307,10309,10311,1,10313,10315,10317,10319,10321,10323,10325,10327,10329,10331,10333,10335,10337,10339,10341,1,10343,10345,10347,10349,10351,10353,10355,10357,10359,10361,10363,10365,10367,10369,10371,1,10373,10375,10377,10379,10381,10383,10385,10387,10389,10391,10393,10395,10397,10399,10401,1,10403,10405,10407,10409,10411,10413,10415,10417,11258,11259,12134,12135,13042,13043,13982,1,13983,14954,14955,15958,15959,16994,16995,18062,18063,19162,19163, - 19931,19930,18815,18814,17731,17730,16679,16678,15659,15658,14671,0,14670,13715,13714,12791,12790,11899,11898,11039,11038,10210,10212,10214,10216,10218,10220,0,10222,10224,10226,10228,10230,10232,10234,10236,10238,10240,10242,10244,10246,10248,10250,0,10252,10254,10256,10258,10260,10262,10264,10266,10268,10270,10272,10274,10276,10278,10280,0,10282,10284,10286,10288,10290,10292,10294,10296,10298,10300,10302,10304,10306,10308,10310,0,10312,10314,10316,10318,10320,10322,10324,10326,10328,10330,10332,10334,10336,10338,10340,0,10342,10344,10346,10348,10350,10352,10354,10356,10358,10360,10362,10364,10366,10368,10370,0,10372,10374,10376,10378,10380,10382,10384,10386,10388,10390,10392,10394,10396,10398,10400,0,10402,10404,10406,10408,10410,10412,10414,10416,11260,11261,12136,12137,13044,13045,13984,0,13985,14956,14957,15960,15961,16996,16997,18064,18065,19164,19165, - 19929,19928,18813,18812,17729,17728,16677,16676,15657,15656,14669,1,14668,13713,13712,12789,12788,11897,11896,11037,11036,10209,10208,9411,9413,9415,9417,1,9419,9421,9423,9425,9427,9429,9431,9433,9435,9437,9439,9441,9443,9445,9447,1,9449,9451,9453,9455,9457,9459,9461,9463,9465,9467,9469,9471,9473,9475,9477,1,9479,9481,9483,9485,9487,9489,9491,9493,9495,9497,9499,9501,9503,9505,9507,1,9509,9511,9513,9515,9517,9519,9521,9523,9525,9527,9529,9531,9533,9535,9537,1,9539,9541,9543,9545,9547,9549,9551,9553,9555,9557,9559,9561,9563,9565,9567,1,9569,9571,9573,9575,9577,9579,9581,9583,9585,9587,9589,9591,9593,9595,9597,1,9599,9601,9603,9605,9607,9609,10418,10419,11262,11263,12138,12139,13046,13047,13986,1,13987,14958,14959,15962,15963,16998,16999,18066,18067,19166,19167, - 19927,19926,18811,18810,17727,17726,16675,16674,15655,15654,14667,0,14666,13711,13710,12787,12786,11895,11894,11035,11034,10207,10206,9410,9412,9414,9416,0,9418,9420,9422,9424,9426,9428,9430,9432,9434,9436,9438,9440,9442,9444,9446,0,9448,9450,9452,9454,9456,9458,9460,9462,9464,9466,9468,9470,9472,9474,9476,0,9478,9480,9482,9484,9486,9488,9490,9492,9494,9496,9498,9500,9502,9504,9506,0,9508,9510,9512,9514,9516,9518,9520,9522,9524,9526,9528,9530,9532,9534,9536,0,9538,9540,9542,9544,9546,9548,9550,9552,9554,9556,9558,9560,9562,9564,9566,0,9568,9570,9572,9574,9576,9578,9580,9582,9584,9586,9588,9590,9592,9594,9596,0,9598,9600,9602,9604,9606,9608,10420,10421,11264,11265,12140,12141,13048,13049,13988,0,13989,14960,14961,15964,15965,17000,17001,18068,18069,19168,19169, - 19925,19924,18809,18808,17725,17724,16673,16672,15653,15652,14665,1,14664,13709,13708,12785,12784,11893,11892,11033,11032,10205,10204,9409,9408,8643,8645,1,8647,8649,8651,8653,8655,8657,8659,8661,8663,8665,8667,8669,8671,8673,8675,1,8677,8679,8681,8683,8685,8687,8689,8691,8693,8695,8697,8699,8701,8703,8705,1,8707,8709,8711,8713,8715,8717,8719,8721,8723,8725,8727,8729,8731,8733,8735,1,8737,8739,8741,8743,8745,8747,8749,8751,8753,8755,8757,8759,8761,8763,8765,1,8767,8769,8771,8773,8775,8777,8779,8781,8783,8785,8787,8789,8791,8793,8795,1,8797,8799,8801,8803,8805,8807,8809,8811,8813,8815,8817,8819,8821,8823,8825,1,8827,8829,8831,8833,9610,9611,10422,10423,11266,11267,12142,12143,13050,13051,13990,1,13991,14962,14963,15966,15967,17002,17003,18070,18071,19170,19171, - 19923,19922,18807,18806,17723,17722,16671,16670,15651,15650,14663,0,14662,13707,13706,12783,12782,11891,11890,11031,11030,10203,10202,9407,9406,8642,8644,0,8646,8648,8650,8652,8654,8656,8658,8660,8662,8664,8666,8668,8670,8672,8674,0,8676,8678,8680,8682,8684,8686,8688,8690,8692,8694,8696,8698,8700,8702,8704,0,8706,8708,8710,8712,8714,8716,8718,8720,8722,8724,8726,8728,8730,8732,8734,0,8736,8738,8740,8742,8744,8746,8748,8750,8752,8754,8756,8758,8760,8762,8764,0,8766,8768,8770,8772,8774,8776,8778,8780,8782,8784,8786,8788,8790,8792,8794,0,8796,8798,8800,8802,8804,8806,8808,8810,8812,8814,8816,8818,8820,8822,8824,0,8826,8828,8830,8832,9612,9613,10424,10425,11268,11269,12144,12145,13052,13053,13992,0,13993,14964,14965,15968,15969,17004,17005,18072,18073,19172,19173, - 19921,19920,18805,18804,17721,17720,16669,16668,15649,15648,14661,1,14660,13705,13704,12781,12780,11889,11888,11029,11028,10201,10200,9405,9404,8641,8640,1,7907,7909,7911,7913,7915,7917,7919,7921,7923,7925,7927,7929,7931,7933,7935,1,7937,7939,7941,7943,7945,7947,7949,7951,7953,7955,7957,7959,7961,7963,7965,1,7967,7969,7971,7973,7975,7977,7979,7981,7983,7985,7987,7989,7991,7993,7995,1,7997,7999,8001,8003,8005,8007,8009,8011,8013,8015,8017,8019,8021,8023,8025,1,8027,8029,8031,8033,8035,8037,8039,8041,8043,8045,8047,8049,8051,8053,8055,1,8057,8059,8061,8063,8065,8067,8069,8071,8073,8075,8077,8079,8081,8083,8085,1,8087,8089,8834,8835,9614,9615,10426,10427,11270,11271,12146,12147,13054,13055,13994,1,13995,14966,14967,15970,15971,17006,17007,18074,18075,19174,19175, - 19919,19918,18803,18802,17719,17718,16667,16666,15647,15646,14659,0,14658,13703,13702,12779,12778,11887,11886,11027,11026,10199,10198,9403,9402,8639,8638,0,7906,7908,7910,7912,7914,7916,7918,7920,7922,7924,7926,7928,7930,7932,7934,0,7936,7938,7940,7942,7944,7946,7948,7950,7952,7954,7956,7958,7960,7962,7964,0,7966,7968,7970,7972,7974,7976,7978,7980,7982,7984,7986,7988,7990,7992,7994,0,7996,7998,8000,8002,8004,8006,8008,8010,8012,8014,8016,8018,8020,8022,8024,0,8026,8028,8030,8032,8034,8036,8038,8040,8042,8044,8046,8048,8050,8052,8054,0,8056,8058,8060,8062,8064,8066,8068,8070,8072,8074,8076,8078,8080,8082,8084,0,8086,8088,8836,8837,9616,9617,10428,10429,11272,11273,12148,12149,13056,13057,13996,0,13997,14968,14969,15972,15973,17008,17009,18076,18077,19176,19177, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 19917,19916,18801,18800,17717,17716,16665,16664,15645,15644,14657,0,14656,13701,13700,12777,12776,11885,11884,11025,11024,10197,10196,9401,9400,8637,8636,0,7905,7904,7203,7205,7207,7209,7211,7213,7215,7217,7219,7221,7223,7225,7227,0,7229,7231,7233,7235,7237,7239,7241,7243,7245,7247,7249,7251,7253,7255,7257,0,7259,7261,7263,7265,7267,7269,7271,7273,7275,7277,7279,7281,7283,7285,7287,0,7289,7291,7293,7295,7297,7299,7301,7303,7305,7307,7309,7311,7313,7315,7317,0,7319,7321,7323,7325,7327,7329,7331,7333,7335,7337,7339,7341,7343,7345,7347,0,7349,7351,7353,7355,7357,7359,7361,7363,7365,7367,7369,7371,7373,7375,7377,0,8090,8091,8838,8839,9618,9619,10430,10431,11274,11275,12150,12151,13058,13059,13998,0,13999,14970,14971,15974,15975,17010,17011,18078,18079,19178,19179, - 19915,19914,18799,18798,17715,17714,16663,16662,15643,15642,14655,1,14654,13699,13698,12775,12774,11883,11882,11023,11022,10195,10194,9399,9398,8635,8634,1,7903,7902,7202,7204,7206,7208,7210,7212,7214,7216,7218,7220,7222,7224,7226,1,7228,7230,7232,7234,7236,7238,7240,7242,7244,7246,7248,7250,7252,7254,7256,1,7258,7260,7262,7264,7266,7268,7270,7272,7274,7276,7278,7280,7282,7284,7286,1,7288,7290,7292,7294,7296,7298,7300,7302,7304,7306,7308,7310,7312,7314,7316,1,7318,7320,7322,7324,7326,7328,7330,7332,7334,7336,7338,7340,7342,7344,7346,1,7348,7350,7352,7354,7356,7358,7360,7362,7364,7366,7368,7370,7372,7374,7376,1,8092,8093,8840,8841,9620,9621,10432,10433,11276,11277,12152,12153,13060,13061,14000,1,14001,14972,14973,15976,15977,17012,17013,18080,18081,19180,19181, - 19913,19912,18797,18796,17713,17712,16661,16660,15641,15640,14653,0,14652,13697,13696,12773,12772,11881,11880,11021,11020,10193,10192,9397,9396,8633,8632,0,7901,7900,7201,7200,6531,6533,6535,6537,6539,6541,6543,6545,6547,6549,6551,0,6553,6555,6557,6559,6561,6563,6565,6567,6569,6571,6573,6575,6577,6579,6581,0,6583,6585,6587,6589,6591,6593,6595,6597,6599,6601,6603,6605,6607,6609,6611,0,6613,6615,6617,6619,6621,6623,6625,6627,6629,6631,6633,6635,6637,6639,6641,0,6643,6645,6647,6649,6651,6653,6655,6657,6659,6661,6663,6665,6667,6669,6671,0,6673,6675,6677,6679,6681,6683,6685,6687,6689,6691,6693,6695,6697,7378,7379,0,8094,8095,8842,8843,9622,9623,10434,10435,11278,11279,12154,12155,13062,13063,14002,0,14003,14974,14975,15978,15979,17014,17015,18082,18083,19182,19183, - 19911,19910,18795,18794,17711,17710,16659,16658,15639,15638,14651,1,14650,13695,13694,12771,12770,11879,11878,11019,11018,10191,10190,9395,9394,8631,8630,1,7899,7898,7199,7198,6530,6532,6534,6536,6538,6540,6542,6544,6546,6548,6550,1,6552,6554,6556,6558,6560,6562,6564,6566,6568,6570,6572,6574,6576,6578,6580,1,6582,6584,6586,6588,6590,6592,6594,6596,6598,6600,6602,6604,6606,6608,6610,1,6612,6614,6616,6618,6620,6622,6624,6626,6628,6630,6632,6634,6636,6638,6640,1,6642,6644,6646,6648,6650,6652,6654,6656,6658,6660,6662,6664,6666,6668,6670,1,6672,6674,6676,6678,6680,6682,6684,6686,6688,6690,6692,6694,6696,7380,7381,1,8096,8097,8844,8845,9624,9625,10436,10437,11280,11281,12156,12157,13064,13065,14004,1,14005,14976,14977,15980,15981,17016,17017,18084,18085,19184,19185, - 19909,19908,18793,18792,17709,17708,16657,16656,15637,15636,14649,0,14648,13693,13692,12769,12768,11877,11876,11017,11016,10189,10188,9393,9392,8629,8628,0,7897,7896,7197,7196,6529,6528,5891,5893,5895,5897,5899,5901,5903,5905,5907,0,5909,5911,5913,5915,5917,5919,5921,5923,5925,5927,5929,5931,5933,5935,5937,0,5939,5941,5943,5945,5947,5949,5951,5953,5955,5957,5959,5961,5963,5965,5967,0,5969,5971,5973,5975,5977,5979,5981,5983,5985,5987,5989,5991,5993,5995,5997,0,5999,6001,6003,6005,6007,6009,6011,6013,6015,6017,6019,6021,6023,6025,6027,0,6029,6031,6033,6035,6037,6039,6041,6043,6045,6047,6049,6698,6699,7382,7383,0,8098,8099,8846,8847,9626,9627,10438,10439,11282,11283,12158,12159,13066,13067,14006,0,14007,14978,14979,15982,15983,17018,17019,18086,18087,19186,19187, - 19907,19906,18791,18790,17707,17706,16655,16654,15635,15634,14647,1,14646,13691,13690,12767,12766,11875,11874,11015,11014,10187,10186,9391,9390,8627,8626,1,7895,7894,7195,7194,6527,6526,5890,5892,5894,5896,5898,5900,5902,5904,5906,1,5908,5910,5912,5914,5916,5918,5920,5922,5924,5926,5928,5930,5932,5934,5936,1,5938,5940,5942,5944,5946,5948,5950,5952,5954,5956,5958,5960,5962,5964,5966,1,5968,5970,5972,5974,5976,5978,5980,5982,5984,5986,5988,5990,5992,5994,5996,1,5998,6000,6002,6004,6006,6008,6010,6012,6014,6016,6018,6020,6022,6024,6026,1,6028,6030,6032,6034,6036,6038,6040,6042,6044,6046,6048,6700,6701,7384,7385,1,8100,8101,8848,8849,9628,9629,10440,10441,11284,11285,12160,12161,13068,13069,14008,1,14009,14980,14981,15984,15985,17020,17021,18088,18089,19188,19189, - 19905,19904,18789,18788,17705,17704,16653,16652,15633,15632,14645,0,14644,13689,13688,12765,12764,11873,11872,11013,11012,10185,10184,9389,9388,8625,8624,0,7893,7892,7193,7192,6525,6524,5889,5888,5283,5285,5287,5289,5291,5293,5295,0,5297,5299,5301,5303,5305,5307,5309,5311,5313,5315,5317,5319,5321,5323,5325,0,5327,5329,5331,5333,5335,5337,5339,5341,5343,5345,5347,5349,5351,5353,5355,0,5357,5359,5361,5363,5365,5367,5369,5371,5373,5375,5377,5379,5381,5383,5385,0,5387,5389,5391,5393,5395,5397,5399,5401,5403,5405,5407,5409,5411,5413,5415,0,5417,5419,5421,5423,5425,5427,5429,5431,5433,6050,6051,6702,6703,7386,7387,0,8102,8103,8850,8851,9630,9631,10442,10443,11286,11287,12162,12163,13070,13071,14010,0,14011,14982,14983,15986,15987,17022,17023,18090,18091,19190,19191, - 19903,19902,18787,18786,17703,17702,16651,16650,15631,15630,14643,1,14642,13687,13686,12763,12762,11871,11870,11011,11010,10183,10182,9387,9386,8623,8622,1,7891,7890,7191,7190,6523,6522,5887,5886,5282,5284,5286,5288,5290,5292,5294,1,5296,5298,5300,5302,5304,5306,5308,5310,5312,5314,5316,5318,5320,5322,5324,1,5326,5328,5330,5332,5334,5336,5338,5340,5342,5344,5346,5348,5350,5352,5354,1,5356,5358,5360,5362,5364,5366,5368,5370,5372,5374,5376,5378,5380,5382,5384,1,5386,5388,5390,5392,5394,5396,5398,5400,5402,5404,5406,5408,5410,5412,5414,1,5416,5418,5420,5422,5424,5426,5428,5430,5432,6052,6053,6704,6705,7388,7389,1,8104,8105,8852,8853,9632,9633,10444,10445,11288,11289,12164,12165,13072,13073,14012,1,14013,14984,14985,15988,15989,17024,17025,18092,18093,19192,19193, - 19901,19900,18785,18784,17701,17700,16649,16648,15629,15628,14641,0,14640,13685,13684,12761,12760,11869,11868,11009,11008,10181,10180,9385,9384,8621,8620,0,7889,7888,7189,7188,6521,6520,5885,5884,5281,5280,4707,4709,4711,4713,4715,0,4717,4719,4721,4723,4725,4727,4729,4731,4733,4735,4737,4739,4741,4743,4745,0,4747,4749,4751,4753,4755,4757,4759,4761,4763,4765,4767,4769,4771,4773,4775,0,4777,4779,4781,4783,4785,4787,4789,4791,4793,4795,4797,4799,4801,4803,4805,0,4807,4809,4811,4813,4815,4817,4819,4821,4823,4825,4827,4829,4831,4833,4835,0,4837,4839,4841,4843,4845,4847,4849,5434,5435,6054,6055,6706,6707,7390,7391,0,8106,8107,8854,8855,9634,9635,10446,10447,11290,11291,12166,12167,13074,13075,14014,0,14015,14986,14987,15990,15991,17026,17027,18094,18095,19194,19195, - 19899,19898,18783,18782,17699,17698,16647,16646,15627,15626,14639,1,14638,13683,13682,12759,12758,11867,11866,11007,11006,10179,10178,9383,9382,8619,8618,1,7887,7886,7187,7186,6519,6518,5883,5882,5279,5278,4706,4708,4710,4712,4714,1,4716,4718,4720,4722,4724,4726,4728,4730,4732,4734,4736,4738,4740,4742,4744,1,4746,4748,4750,4752,4754,4756,4758,4760,4762,4764,4766,4768,4770,4772,4774,1,4776,4778,4780,4782,4784,4786,4788,4790,4792,4794,4796,4798,4800,4802,4804,1,4806,4808,4810,4812,4814,4816,4818,4820,4822,4824,4826,4828,4830,4832,4834,1,4836,4838,4840,4842,4844,4846,4848,5436,5437,6056,6057,6708,6709,7392,7393,1,8108,8109,8856,8857,9636,9637,10448,10449,11292,11293,12168,12169,13076,13077,14016,1,14017,14988,14989,15992,15993,17028,17029,18096,18097,19196,19197, - 19897,19896,18781,18780,17697,17696,16645,16644,15625,15624,14637,0,14636,13681,13680,12757,12756,11865,11864,11005,11004,10177,10176,9381,9380,8617,8616,0,7885,7884,7185,7184,6517,6516,5881,5880,5277,5276,4705,4704,4163,4165,4167,0,4169,4171,4173,4175,4177,4179,4181,4183,4185,4187,4189,4191,4193,4195,4197,0,4199,4201,4203,4205,4207,4209,4211,4213,4215,4217,4219,4221,4223,4225,4227,0,4229,4231,4233,4235,4237,4239,4241,4243,4245,4247,4249,4251,4253,4255,4257,0,4259,4261,4263,4265,4267,4269,4271,4273,4275,4277,4279,4281,4283,4285,4287,0,4289,4291,4293,4295,4297,4850,4851,5438,5439,6058,6059,6710,6711,7394,7395,0,8110,8111,8858,8859,9638,9639,10450,10451,11294,11295,12170,12171,13078,13079,14018,0,14019,14990,14991,15994,15995,17030,17031,18098,18099,19198,19199, - 19895,19894,18779,18778,17695,17694,16643,16642,15623,15622,14635,1,14634,13679,13678,12755,12754,11863,11862,11003,11002,10175,10174,9379,9378,8615,8614,1,7883,7882,7183,7182,6515,6514,5879,5878,5275,5274,4703,4702,4162,4164,4166,1,4168,4170,4172,4174,4176,4178,4180,4182,4184,4186,4188,4190,4192,4194,4196,1,4198,4200,4202,4204,4206,4208,4210,4212,4214,4216,4218,4220,4222,4224,4226,1,4228,4230,4232,4234,4236,4238,4240,4242,4244,4246,4248,4250,4252,4254,4256,1,4258,4260,4262,4264,4266,4268,4270,4272,4274,4276,4278,4280,4282,4284,4286,1,4288,4290,4292,4294,4296,4852,4853,5440,5441,6060,6061,6712,6713,7396,7397,1,8112,8113,8860,8861,9640,9641,10452,10453,11296,11297,12172,12173,13080,13081,14020,1,14021,14992,14993,15996,15997,17032,17033,18100,18101,19200,19201, - 19893,19892,18777,18776,17693,17692,16641,16640,15621,15620,14633,0,14632,13677,13676,12753,12752,11861,11860,11001,11000,10173,10172,9377,9376,8613,8612,0,7881,7880,7181,7180,6513,6512,5877,5876,5273,5272,4701,4700,4161,4160,3651,0,3653,3655,3657,3659,3661,3663,3665,3667,3669,3671,3673,3675,3677,3679,3681,0,3683,3685,3687,3689,3691,3693,3695,3697,3699,3701,3703,3705,3707,3709,3711,0,3713,3715,3717,3719,3721,3723,3725,3727,3729,3731,3733,3735,3737,3739,3741,0,3743,3745,3747,3749,3751,3753,3755,3757,3759,3761,3763,3765,3767,3769,3771,0,3773,3775,3777,4298,4299,4854,4855,5442,5443,6062,6063,6714,6715,7398,7399,0,8114,8115,8862,8863,9642,9643,10454,10455,11298,11299,12174,12175,13082,13083,14022,0,14023,14994,14995,15998,15999,17034,17035,18102,18103,19202,19203, - 19891,19890,18775,18774,17691,17690,16639,16638,15619,15618,14631,1,14630,13675,13674,12751,12750,11859,11858,10999,10998,10171,10170,9375,9374,8611,8610,1,7879,7878,7179,7178,6511,6510,5875,5874,5271,5270,4699,4698,4159,4158,3650,1,3652,3654,3656,3658,3660,3662,3664,3666,3668,3670,3672,3674,3676,3678,3680,1,3682,3684,3686,3688,3690,3692,3694,3696,3698,3700,3702,3704,3706,3708,3710,1,3712,3714,3716,3718,3720,3722,3724,3726,3728,3730,3732,3734,3736,3738,3740,1,3742,3744,3746,3748,3750,3752,3754,3756,3758,3760,3762,3764,3766,3768,3770,1,3772,3774,3776,4300,4301,4856,4857,5444,5445,6064,6065,6716,6717,7400,7401,1,8116,8117,8864,8865,9644,9645,10456,10457,11300,11301,12176,12177,13084,13085,14024,1,14025,14996,14997,16000,16001,17036,17037,18104,18105,19204,19205, - 19889,19888,18773,18772,17689,17688,16637,16636,15617,15616,14629,0,14628,13673,13672,12749,12748,11857,11856,10997,10996,10169,10168,9373,9372,8609,8608,0,7877,7876,7177,7176,6509,6508,5873,5872,5269,5268,4697,4696,4157,4156,3649,0,3648,3171,3173,3175,3177,3179,3181,3183,3185,3187,3189,3191,3193,3195,3197,0,3199,3201,3203,3205,3207,3209,3211,3213,3215,3217,3219,3221,3223,3225,3227,0,3229,3231,3233,3235,3237,3239,3241,3243,3245,3247,3249,3251,3253,3255,3257,0,3259,3261,3263,3265,3267,3269,3271,3273,3275,3277,3279,3281,3283,3285,3287,0,3289,3778,3779,4302,4303,4858,4859,5446,5447,6066,6067,6718,6719,7402,7403,0,8118,8119,8866,8867,9646,9647,10458,10459,11302,11303,12178,12179,13086,13087,14026,0,14027,14998,14999,16002,16003,17038,17039,18106,18107,19206,19207, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 19887,19886,18771,18770,17687,17686,16635,16634,15615,15614,14627,0,14626,13671,13670,12747,12746,11855,11854,10995,10994,10167,10166,9371,9370,8607,8606,0,7875,7874,7175,7174,6507,6506,5871,5870,5267,5266,4695,4694,4155,4154,3647,0,3646,3170,3172,3174,3176,3178,3180,3182,3184,3186,3188,3190,3192,3194,3196,0,3198,3200,3202,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226,0,3228,3230,3232,3234,3236,3238,3240,3242,3244,3246,3248,3250,3252,3254,3256,0,3258,3260,3262,3264,3266,3268,3270,3272,3274,3276,3278,3280,3282,3284,3286,0,3288,3780,3781,4304,4305,4860,4861,5448,5449,6068,6069,6720,6721,7404,7405,0,8120,8121,8868,8869,9648,9649,10460,10461,11304,11305,12180,12181,13088,13089,14028,0,14029,15000,15001,16004,16005,17040,17041,18108,18109,19208,19209, - 19885,19884,18769,18768,17685,17684,16633,16632,15613,15612,14625,1,14624,13669,13668,12745,12744,11853,11852,10993,10992,10165,10164,9369,9368,8605,8604,1,7873,7872,7173,7172,6505,6504,5869,5868,5265,5264,4693,4692,4153,4152,3645,1,3644,3169,3168,2723,2725,2727,2729,2731,2733,2735,2737,2739,2741,2743,2745,1,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775,1,2777,2779,2781,2783,2785,2787,2789,2791,2793,2795,2797,2799,2801,2803,2805,1,2807,2809,2811,2813,2815,2817,2819,2821,2823,2825,2827,2829,2831,2833,3290,1,3291,3782,3783,4306,4307,4862,4863,5450,5451,6070,6071,6722,6723,7406,7407,1,8122,8123,8870,8871,9650,9651,10462,10463,11306,11307,12182,12183,13090,13091,14030,1,14031,15002,15003,16006,16007,17042,17043,18110,18111,19210,19211, - 19883,19882,18767,18766,17683,17682,16631,16630,15611,15610,14623,0,14622,13667,13666,12743,12742,11851,11850,10991,10990,10163,10162,9367,9366,8603,8602,0,7871,7870,7171,7170,6503,6502,5867,5866,5263,5262,4691,4690,4151,4150,3643,0,3642,3167,3166,2722,2724,2726,2728,2730,2732,2734,2736,2738,2740,2742,2744,0,2746,2748,2750,2752,2754,2756,2758,2760,2762,2764,2766,2768,2770,2772,2774,0,2776,2778,2780,2782,2784,2786,2788,2790,2792,2794,2796,2798,2800,2802,2804,0,2806,2808,2810,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832,3292,0,3293,3784,3785,4308,4309,4864,4865,5452,5453,6072,6073,6724,6725,7408,7409,0,8124,8125,8872,8873,9652,9653,10464,10465,11308,11309,12184,12185,13092,13093,14032,0,14033,15004,15005,16008,16009,17044,17045,18112,18113,19212,19213, - 19881,19880,18765,18764,17681,17680,16629,16628,15609,15608,14621,1,14620,13665,13664,12741,12740,11849,11848,10989,10988,10161,10160,9365,9364,8601,8600,1,7869,7868,7169,7168,6501,6500,5865,5864,5261,5260,4689,4688,4149,4148,3641,1,3640,3165,3164,2721,2720,2307,2309,2311,2313,2315,2317,2319,2321,2323,2325,1,2327,2329,2331,2333,2335,2337,2339,2341,2343,2345,2347,2349,2351,2353,2355,1,2357,2359,2361,2363,2365,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385,1,2387,2389,2391,2393,2395,2397,2399,2401,2403,2405,2407,2409,2834,2835,3294,1,3295,3786,3787,4310,4311,4866,4867,5454,5455,6074,6075,6726,6727,7410,7411,1,8126,8127,8874,8875,9654,9655,10466,10467,11310,11311,12186,12187,13094,13095,14034,1,14035,15006,15007,16010,16011,17046,17047,18114,18115,19214,19215, - 19879,19878,18763,18762,17679,17678,16627,16626,15607,15606,14619,0,14618,13663,13662,12739,12738,11847,11846,10987,10986,10159,10158,9363,9362,8599,8598,0,7867,7866,7167,7166,6499,6498,5863,5862,5259,5258,4687,4686,4147,4146,3639,0,3638,3163,3162,2719,2718,2306,2308,2310,2312,2314,2316,2318,2320,2322,2324,0,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,0,2356,2358,2360,2362,2364,2366,2368,2370,2372,2374,2376,2378,2380,2382,2384,0,2386,2388,2390,2392,2394,2396,2398,2400,2402,2404,2406,2408,2836,2837,3296,0,3297,3788,3789,4312,4313,4868,4869,5456,5457,6076,6077,6728,6729,7412,7413,0,8128,8129,8876,8877,9656,9657,10468,10469,11312,11313,12188,12189,13096,13097,14036,0,14037,15008,15009,16012,16013,17048,17049,18116,18117,19216,19217, - 19877,19876,18761,18760,17677,17676,16625,16624,15605,15604,14617,1,14616,13661,13660,12737,12736,11845,11844,10985,10984,10157,10156,9361,9360,8597,8596,1,7865,7864,7165,7164,6497,6496,5861,5860,5257,5256,4685,4684,4145,4144,3637,1,3636,3161,3160,2717,2716,2305,2304,1923,1925,1927,1929,1931,1933,1935,1937,1,1939,1941,1943,1945,1947,1949,1951,1953,1955,1957,1959,1961,1963,1965,1967,1,1969,1971,1973,1975,1977,1979,1981,1983,1985,1987,1989,1991,1993,1995,1997,1,1999,2001,2003,2005,2007,2009,2011,2013,2015,2017,2410,2411,2838,2839,3298,1,3299,3790,3791,4314,4315,4870,4871,5458,5459,6078,6079,6730,6731,7414,7415,1,8130,8131,8878,8879,9658,9659,10470,10471,11314,11315,12190,12191,13098,13099,14038,1,14039,15010,15011,16014,16015,17050,17051,18118,18119,19218,19219, - 19875,19874,18759,18758,17675,17674,16623,16622,15603,15602,14615,0,14614,13659,13658,12735,12734,11843,11842,10983,10982,10155,10154,9359,9358,8595,8594,0,7863,7862,7163,7162,6495,6494,5859,5858,5255,5254,4683,4682,4143,4142,3635,0,3634,3159,3158,2715,2714,2303,2302,1922,1924,1926,1928,1930,1932,1934,1936,0,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,0,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990,1992,1994,1996,0,1998,2000,2002,2004,2006,2008,2010,2012,2014,2016,2412,2413,2840,2841,3300,0,3301,3792,3793,4316,4317,4872,4873,5460,5461,6080,6081,6732,6733,7416,7417,0,8132,8133,8880,8881,9660,9661,10472,10473,11316,11317,12192,12193,13100,13101,14040,0,14041,15012,15013,16016,16017,17052,17053,18120,18121,19220,19221, - 19873,19872,18757,18756,17673,17672,16621,16620,15601,15600,14613,1,14612,13657,13656,12733,12732,11841,11840,10981,10980,10153,10152,9357,9356,8593,8592,1,7861,7860,7161,7160,6493,6492,5857,5856,5253,5252,4681,4680,4141,4140,3633,1,3632,3157,3156,2713,2712,2301,2300,1921,1920,1571,1573,1575,1577,1579,1581,1,1583,1585,1587,1589,1591,1593,1595,1597,1599,1601,1603,1605,1607,1609,1611,1,1613,1615,1617,1619,1621,1623,1625,1627,1629,1631,1633,1635,1637,1639,1641,1,1643,1645,1647,1649,1651,1653,1655,1657,2018,2019,2414,2415,2842,2843,3302,1,3303,3794,3795,4318,4319,4874,4875,5462,5463,6082,6083,6734,6735,7418,7419,1,8134,8135,8882,8883,9662,9663,10474,10475,11318,11319,12194,12195,13102,13103,14042,1,14043,15014,15015,16018,16019,17054,17055,18122,18123,19222,19223, - 19871,19870,18755,18754,17671,17670,16619,16618,15599,15598,14611,0,14610,13655,13654,12731,12730,11839,11838,10979,10978,10151,10150,9355,9354,8591,8590,0,7859,7858,7159,7158,6491,6490,5855,5854,5251,5250,4679,4678,4139,4138,3631,0,3630,3155,3154,2711,2710,2299,2298,1919,1918,1570,1572,1574,1576,1578,1580,0,1582,1584,1586,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608,1610,0,1612,1614,1616,1618,1620,1622,1624,1626,1628,1630,1632,1634,1636,1638,1640,0,1642,1644,1646,1648,1650,1652,1654,1656,2020,2021,2416,2417,2844,2845,3304,0,3305,3796,3797,4320,4321,4876,4877,5464,5465,6084,6085,6736,6737,7420,7421,0,8136,8137,8884,8885,9664,9665,10476,10477,11320,11321,12196,12197,13104,13105,14044,0,14045,15016,15017,16020,16021,17056,17057,18124,18125,19224,19225, - 19869,19868,18753,18752,17669,17668,16617,16616,15597,15596,14609,1,14608,13653,13652,12729,12728,11837,11836,10977,10976,10149,10148,9353,9352,8589,8588,1,7857,7856,7157,7156,6489,6488,5853,5852,5249,5248,4677,4676,4137,4136,3629,1,3628,3153,3152,2709,2708,2297,2296,1917,1916,1569,1568,1251,1253,1255,1257,1,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1,1319,1321,1323,1325,1327,1329,1658,1659,2022,2023,2418,2419,2846,2847,3306,1,3307,3798,3799,4322,4323,4878,4879,5466,5467,6086,6087,6738,6739,7422,7423,1,8138,8139,8886,8887,9666,9667,10478,10479,11322,11323,12198,12199,13106,13107,14046,1,14047,15018,15019,16022,16023,17058,17059,18126,18127,19226,19227, - 19867,19866,18751,18750,17667,17666,16615,16614,15595,15594,14607,0,14606,13651,13650,12727,12726,11835,11834,10975,10974,10147,10146,9351,9350,8587,8586,0,7855,7854,7155,7154,6487,6486,5851,5850,5247,5246,4675,4674,4135,4134,3627,0,3626,3151,3150,2707,2706,2295,2294,1915,1914,1567,1566,1250,1252,1254,1256,0,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,0,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,0,1318,1320,1322,1324,1326,1328,1660,1661,2024,2025,2420,2421,2848,2849,3308,0,3309,3800,3801,4324,4325,4880,4881,5468,5469,6088,6089,6740,6741,7424,7425,0,8140,8141,8888,8889,9668,9669,10480,10481,11324,11325,12200,12201,13108,13109,14048,0,14049,15020,15021,16024,16025,17060,17061,18128,18129,19228,19229, - 19865,19864,18749,18748,17665,17664,16613,16612,15593,15592,14605,1,14604,13649,13648,12725,12724,11833,11832,10973,10972,10145,10144,9349,9348,8585,8584,1,7853,7852,7153,7152,6485,6484,5849,5848,5245,5244,4673,4672,4133,4132,3625,1,3624,3149,3148,2705,2704,2293,2292,1913,1912,1565,1564,1249,1248,963,965,1,967,969,971,973,975,977,979,981,983,985,987,989,991,993,995,1,997,999,1001,1003,1005,1007,1009,1011,1013,1015,1017,1019,1021,1023,1025,1,1027,1029,1031,1033,1330,1331,1662,1663,2026,2027,2422,2423,2850,2851,3310,1,3311,3802,3803,4326,4327,4882,4883,5470,5471,6090,6091,6742,6743,7426,7427,1,8142,8143,8890,8891,9670,9671,10482,10483,11326,11327,12202,12203,13110,13111,14050,1,14051,15022,15023,16026,16027,17062,17063,18130,18131,19230,19231, - 19863,19862,18747,18746,17663,17662,16611,16610,15591,15590,14603,0,14602,13647,13646,12723,12722,11831,11830,10971,10970,10143,10142,9347,9346,8583,8582,0,7851,7850,7151,7150,6483,6482,5847,5846,5243,5242,4671,4670,4131,4130,3623,0,3622,3147,3146,2703,2702,2291,2290,1911,1910,1563,1562,1247,1246,962,964,0,966,968,970,972,974,976,978,980,982,984,986,988,990,992,994,0,996,998,1000,1002,1004,1006,1008,1010,1012,1014,1016,1018,1020,1022,1024,0,1026,1028,1030,1032,1332,1333,1664,1665,2028,2029,2424,2425,2852,2853,3312,0,3313,3804,3805,4328,4329,4884,4885,5472,5473,6092,6093,6744,6745,7428,7429,0,8144,8145,8892,8893,9672,9673,10484,10485,11328,11329,12204,12205,13112,13113,14052,0,14053,15024,15025,16028,16029,17064,17065,18132,18133,19232,19233, - 19861,19860,18745,18744,17661,17660,16609,16608,15589,15588,14601,1,14600,13645,13644,12721,12720,11829,11828,10969,10968,10141,10140,9345,9344,8581,8580,1,7849,7848,7149,7148,6481,6480,5845,5844,5241,5240,4669,4668,4129,4128,3621,1,3620,3145,3144,2701,2700,2289,2288,1909,1908,1561,1560,1245,1244,961,960,1,707,709,711,713,715,717,719,721,723,725,727,729,731,733,735,1,737,739,741,743,745,747,749,751,753,755,757,759,761,763,765,1,767,769,1034,1035,1334,1335,1666,1667,2030,2031,2426,2427,2854,2855,3314,1,3315,3806,3807,4330,4331,4886,4887,5474,5475,6094,6095,6746,6747,7430,7431,1,8146,8147,8894,8895,9674,9675,10486,10487,11330,11331,12206,12207,13114,13115,14054,1,14055,15026,15027,16030,16031,17066,17067,18134,18135,19234,19235, - 19859,19858,18743,18742,17659,17658,16607,16606,15587,15586,14599,0,14598,13643,13642,12719,12718,11827,11826,10967,10966,10139,10138,9343,9342,8579,8578,0,7847,7846,7147,7146,6479,6478,5843,5842,5239,5238,4667,4666,4127,4126,3619,0,3618,3143,3142,2699,2698,2287,2286,1907,1906,1559,1558,1243,1242,959,958,0,706,708,710,712,714,716,718,720,722,724,726,728,730,732,734,0,736,738,740,742,744,746,748,750,752,754,756,758,760,762,764,0,766,768,1036,1037,1336,1337,1668,1669,2032,2033,2428,2429,2856,2857,3316,0,3317,3808,3809,4332,4333,4888,4889,5476,5477,6096,6097,6748,6749,7432,7433,0,8148,8149,8896,8897,9676,9677,10488,10489,11332,11333,12208,12209,13116,13117,14056,0,14057,15028,15029,16032,16033,17068,17069,18136,18137,19236,19237, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 19857,19856,18741,18740,17657,17656,16605,16604,15585,15584,14597,0,14596,13641,13640,12717,12716,11825,11824,10965,10964,10137,10136,9341,9340,8577,8576,0,7845,7844,7145,7144,6477,6476,5841,5840,5237,5236,4665,4664,4125,4124,3617,0,3616,3141,3140,2697,2696,2285,2284,1905,1904,1557,1556,1241,1240,957,956,0,705,704,483,485,487,489,491,493,495,497,499,501,503,505,507,0,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,0,770,771,1038,1039,1338,1339,1670,1671,2034,2035,2430,2431,2858,2859,3318,0,3319,3810,3811,4334,4335,4890,4891,5478,5479,6098,6099,6750,6751,7434,7435,0,8150,8151,8898,8899,9678,9679,10490,10491,11334,11335,12210,12211,13118,13119,14058,0,14059,15030,15031,16034,16035,17070,17071,18138,18139,19238,19239, - 19855,19854,18739,18738,17655,17654,16603,16602,15583,15582,14595,1,14594,13639,13638,12715,12714,11823,11822,10963,10962,10135,10134,9339,9338,8575,8574,1,7843,7842,7143,7142,6475,6474,5839,5838,5235,5234,4663,4662,4123,4122,3615,1,3614,3139,3138,2695,2694,2283,2282,1903,1902,1555,1554,1239,1238,955,954,1,703,702,482,484,486,488,490,492,494,496,498,500,502,504,506,1,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,1,772,773,1040,1041,1340,1341,1672,1673,2036,2037,2432,2433,2860,2861,3320,1,3321,3812,3813,4336,4337,4892,4893,5480,5481,6100,6101,6752,6753,7436,7437,1,8152,8153,8900,8901,9680,9681,10492,10493,11336,11337,12212,12213,13120,13121,14060,1,14061,15032,15033,16036,16037,17072,17073,18140,18141,19240,19241, - 19853,19852,18737,18736,17653,17652,16601,16600,15581,15580,14593,0,14592,13637,13636,12713,12712,11821,11820,10961,10960,10133,10132,9337,9336,8573,8572,0,7841,7840,7141,7140,6473,6472,5837,5836,5233,5232,4661,4660,4121,4120,3613,0,3612,3137,3136,2693,2692,2281,2280,1901,1900,1553,1552,1237,1236,953,952,0,701,700,481,480,291,293,295,297,299,301,303,305,307,309,311,0,313,315,317,319,321,323,325,327,329,331,333,335,337,538,539,0,774,775,1042,1043,1342,1343,1674,1675,2038,2039,2434,2435,2862,2863,3322,0,3323,3814,3815,4338,4339,4894,4895,5482,5483,6102,6103,6754,6755,7438,7439,0,8154,8155,8902,8903,9682,9683,10494,10495,11338,11339,12214,12215,13122,13123,14062,0,14063,15034,15035,16038,16039,17074,17075,18142,18143,19242,19243, - 19851,19850,18735,18734,17651,17650,16599,16598,15579,15578,14591,1,14590,13635,13634,12711,12710,11819,11818,10959,10958,10131,10130,9335,9334,8571,8570,1,7839,7838,7139,7138,6471,6470,5835,5834,5231,5230,4659,4658,4119,4118,3611,1,3610,3135,3134,2691,2690,2279,2278,1899,1898,1551,1550,1235,1234,951,950,1,699,698,479,478,290,292,294,296,298,300,302,304,306,308,310,1,312,314,316,318,320,322,324,326,328,330,332,334,336,540,541,1,776,777,1044,1045,1344,1345,1676,1677,2040,2041,2436,2437,2864,2865,3324,1,3325,3816,3817,4340,4341,4896,4897,5484,5485,6104,6105,6756,6757,7440,7441,1,8156,8157,8904,8905,9684,9685,10496,10497,11340,11341,12216,12217,13124,13125,14064,1,14065,15036,15037,16040,16041,17076,17077,18144,18145,19244,19245, - 19849,19848,18733,18732,17649,17648,16597,16596,15577,15576,14589,0,14588,13633,13632,12709,12708,11817,11816,10957,10956,10129,10128,9333,9332,8569,8568,0,7837,7836,7137,7136,6469,6468,5833,5832,5229,5228,4657,4656,4117,4116,3609,0,3608,3133,3132,2689,2688,2277,2276,1897,1896,1549,1548,1233,1232,949,948,0,697,696,477,476,289,288,131,133,135,137,139,141,143,145,147,0,149,151,153,155,157,159,161,163,165,167,169,338,339,542,543,0,778,779,1046,1047,1346,1347,1678,1679,2042,2043,2438,2439,2866,2867,3326,0,3327,3818,3819,4342,4343,4898,4899,5486,5487,6106,6107,6758,6759,7442,7443,0,8158,8159,8906,8907,9686,9687,10498,10499,11342,11343,12218,12219,13126,13127,14066,0,14067,15038,15039,16042,16043,17078,17079,18146,18147,19246,19247, - 19847,19846,18731,18730,17647,17646,16595,16594,15575,15574,14587,1,14586,13631,13630,12707,12706,11815,11814,10955,10954,10127,10126,9331,9330,8567,8566,1,7835,7834,7135,7134,6467,6466,5831,5830,5227,5226,4655,4654,4115,4114,3607,1,3606,3131,3130,2687,2686,2275,2274,1895,1894,1547,1546,1231,1230,947,946,1,695,694,475,474,287,286,130,132,134,136,138,140,142,144,146,1,148,150,152,154,156,158,160,162,164,166,168,340,341,544,545,1,780,781,1048,1049,1348,1349,1680,1681,2044,2045,2440,2441,2868,2869,3328,1,3329,3820,3821,4344,4345,4900,4901,5488,5489,6108,6109,6760,6761,7444,7445,1,8160,8161,8908,8909,9688,9689,10500,10501,11344,11345,12220,12221,13128,13129,14068,1,14069,15040,15041,16044,16045,17080,17081,18148,18149,19248,19249, - 19845,19844,18729,18728,17645,17644,16593,16592,15573,15572,14585,0,14584,13629,13628,12705,12704,11813,11812,10953,10952,10125,10124,9329,9328,8565,8564,0,7833,7832,7133,7132,6465,6464,5829,5828,5225,5224,4653,4652,4113,4112,3605,0,3604,3129,3128,2685,2684,2273,2272,1893,1892,1545,1544,1229,1228,945,944,0,693,692,473,472,285,284,129,128,3,5,7,9,11,13,15,0,17,19,21,23,25,27,29,31,33,170,171,342,343,546,547,0,782,783,1050,1051,1350,1351,1682,1683,2046,2047,2442,2443,2870,2871,3330,0,3331,3822,3823,4346,4347,4902,4903,5490,5491,6110,6111,6762,6763,7446,7447,0,8162,8163,8910,8911,9690,9691,10502,10503,11346,11347,12222,12223,13130,13131,14070,0,14071,15042,15043,16046,16047,17082,17083,18150,18151,19250,19251, - 19843,19842,18727,18726,17643,17642,16591,16590,15571,15570,14583,1,14582,13627,13626,12703,12702,11811,11810,10951,10950,10123,10122,9327,9326,8563,8562,1,7831,7830,7131,7130,6463,6462,5827,5826,5223,5222,4651,4650,4111,4110,3603,1,3602,3127,3126,2683,2682,2271,2270,1891,1890,1543,1542,1227,1226,943,942,1,691,690,471,470,283,282,127,126,2,4,6,8,10,12,14,1,16,18,20,22,24,26,28,30,32,172,173,344,345,548,549,1,784,785,1052,1053,1352,1353,1684,1685,2048,2049,2444,2445,2872,2873,3332,1,3333,3824,3825,4348,4349,4904,4905,5492,5493,6112,6113,6764,6765,7448,7449,1,8164,8165,8912,8913,9692,9693,10504,10505,11348,11349,12224,12225,13132,13133,14072,1,14073,15044,15045,16048,16049,17084,17085,18152,18153,19252,19253, - 19841,19840,18725,18724,17641,17640,16589,16588,15569,15568,14581,0,14580,13625,13624,12701,12700,11809,11808,10949,10948,10121,10120,9325,9324,8561,8560,0,7829,7828,7129,7128,6461,6460,5825,5824,5221,5220,4649,4648,4109,4108,3601,0,3600,3125,3124,2681,2680,2269,2268,1889,1888,1541,1540,1225,1224,941,940,0,689,688,469,468,281,280,125,124,1,1,20000,20001,20002,20003,20004,0,20005,20006,20007,20008,20009,0,1,34,35,174,175,346,347,550,551,0,786,787,1054,1055,1354,1355,1686,1687,2050,2051,2446,2447,2874,2875,3334,0,3335,3826,3827,4350,4351,4906,4907,5494,5495,6114,6115,6766,6767,7450,7451,0,8166,8167,8914,8915,9694,9695,10506,10507,11350,11351,12226,12227,13134,13135,14074,0,14075,15046,15047,16050,16051,17086,17087,18154,18155,19254,19255, - 19839,19838,18723,18722,17639,17638,16587,16586,15567,15566,14579,1,14578,13623,13622,12699,12698,11807,11806,10947,10946,10119,10118,9323,9322,8559,8558,1,7827,7826,7127,7126,6459,6458,5823,5822,5219,5218,4647,4646,4107,4106,3599,1,3598,3123,3122,2679,2678,2267,2266,1887,1886,1539,1538,1223,1222,939,938,1,687,686,467,466,279,278,123,122,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,36,37,176,177,348,349,552,553,1,788,789,1056,1057,1356,1357,1688,1689,2052,2053,2448,2449,2876,2877,3336,1,3337,3828,3829,4352,4353,4908,4909,5496,5497,6116,6117,6768,6769,7452,7453,1,8168,8169,8916,8917,9696,9697,10508,10509,11352,11353,12228,12229,13136,13137,14076,1,14077,15048,15049,16052,16053,17088,17089,18156,18157,19256,19257, - 19837,19836,18721,18720,17637,17636,16585,16584,15565,15564,14577,0,14576,13621,13620,12697,12696,11805,11804,10945,10944,10117,10116,9321,9320,8557,8556,0,7825,7824,7125,7124,6457,6456,5821,5820,5217,5216,4645,4644,4105,4104,3597,0,3596,3121,3120,2677,2676,2265,2264,1885,1884,1537,1536,1221,1220,937,936,0,685,684,465,464,277,276,121,120,20039,1,0,0,0,0,0,0,0,0,0,0,0,1,20010,38,39,178,179,350,351,554,555,0,790,791,1058,1059,1358,1359,1690,1691,2054,2055,2450,2451,2878,2879,3338,0,3339,3830,3831,4354,4355,4910,4911,5498,5499,6118,6119,6770,6771,7454,7455,0,8170,8171,8918,8919,9698,9699,10510,10511,11354,11355,12230,12231,13138,13139,14078,0,14079,15050,15051,16054,16055,17090,17091,18158,18159,19258,19259, - 19835,19834,18719,18718,17635,17634,16583,16582,15563,15562,14575,1,14574,13619,13618,12695,12694,11803,11802,10943,10942,10115,10114,9319,9318,8555,8554,1,7823,7822,7123,7122,6455,6454,5819,5818,5215,5214,4643,4642,4103,4102,3595,1,3594,3119,3118,2675,2674,2263,2262,1883,1882,1535,1534,1219,1218,935,934,1,683,682,463,462,275,274,119,118,20038,1,0,1,1,1,1,1,1,1,1,1,0,1,20011,40,41,180,181,352,353,556,557,1,792,793,1060,1061,1360,1361,1692,1693,2056,2057,2452,2453,2880,2881,3340,1,3341,3832,3833,4356,4357,4912,4913,5500,5501,6120,6121,6772,6773,7456,7457,1,8172,8173,8920,8921,9700,9701,10512,10513,11356,11357,12232,12233,13140,13141,14080,1,14081,15052,15053,16056,16057,17092,17093,18160,18161,19260,19261, - 19833,19832,18717,18716,17633,17632,16581,16580,15561,15560,14573,0,14572,13617,13616,12693,12692,11801,11800,10941,10940,10113,10112,9317,9316,8553,8552,0,7821,7820,7121,7120,6453,6452,5817,5816,5213,5212,4641,4640,4101,4100,3593,0,3592,3117,3116,2673,2672,2261,2260,1881,1880,1533,1532,1217,1216,933,932,0,681,680,461,460,273,272,117,116,20037,1,0,1,0,0,0,0,0,0,0,1,0,1,20012,42,43,182,183,354,355,558,559,0,794,795,1062,1063,1362,1363,1694,1695,2058,2059,2454,2455,2882,2883,3342,0,3343,3834,3835,4358,4359,4914,4915,5502,5503,6122,6123,6774,6775,7458,7459,0,8174,8175,8922,8923,9702,9703,10514,10515,11358,11359,12234,12235,13142,13143,14082,0,14083,15054,15055,16058,16059,17094,17095,18162,18163,19262,19263, - 19831,19830,18715,18714,17631,17630,16579,16578,15559,15558,14571,1,14570,13615,13614,12691,12690,11799,11798,10939,10938,10111,10110,9315,9314,8551,8550,1,7819,7818,7119,7118,6451,6450,5815,5814,5211,5210,4639,4638,4099,4098,3591,1,3590,3115,3114,2671,2670,2259,2258,1879,1878,1531,1530,1215,1214,931,930,1,679,678,459,458,271,270,115,114,20036,1,0,1,0,1,1,1,1,1,0,1,0,1,20013,44,45,184,185,356,357,560,561,1,796,797,1064,1065,1364,1365,1696,1697,2060,2061,2456,2457,2884,2885,3344,1,3345,3836,3837,4360,4361,4916,4917,5504,5505,6124,6125,6776,6777,7460,7461,1,8176,8177,8924,8925,9704,9705,10516,10517,11360,11361,12236,12237,13144,13145,14084,1,14085,15056,15057,16060,16061,17096,17097,18164,18165,19264,19265, - 19829,19828,18713,18712,17629,17628,16577,16576,15557,15556,14569,0,14568,13613,13612,12689,12688,11797,11796,10937,10936,10109,10108,9313,9312,8549,8548,0,7817,7816,7117,7116,6449,6448,5813,5812,5209,5208,4637,4636,4097,4096,3589,0,3588,3113,3112,2669,2668,2257,2256,1877,1876,1529,1528,1213,1212,929,928,0,677,676,457,456,269,268,113,112,20035,1,0,1,0,1,0,0,0,1,0,1,0,1,20014,46,47,186,187,358,359,562,563,0,798,799,1066,1067,1366,1367,1698,1699,2062,2063,2458,2459,2886,2887,3346,0,3347,3838,3839,4362,4363,4918,4919,5506,5507,6126,6127,6778,6779,7462,7463,0,8178,8179,8926,8927,9706,9707,10518,10519,11362,11363,12238,12239,13146,13147,14086,0,14087,15058,15059,16062,16063,17098,17099,18166,18167,19266,19267, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 19827,19826,18711,18710,17627,17626,16575,16574,15555,15554,14567,0,14566,13611,13610,12687,12686,11795,11794,10935,10934,10107,10106,9311,9310,8547,8546,0,7815,7814,7115,7114,6447,6446,5811,5810,5207,5206,4635,4634,4095,4094,3587,0,3586,3111,3110,2667,2666,2255,2254,1875,1874,1527,1526,1211,1210,927,926,0,675,674,455,454,267,266,111,110,20034,1,0,1,0,1,0,0,0,1,0,1,0,1,20015,48,49,188,189,360,361,564,565,0,800,801,1068,1069,1368,1369,1700,1701,2064,2065,2460,2461,2888,2889,3348,0,3349,3840,3841,4364,4365,4920,4921,5508,5509,6128,6129,6780,6781,7464,7465,0,8180,8181,8928,8929,9708,9709,10520,10521,11364,11365,12240,12241,13148,13149,14088,0,14089,15060,15061,16064,16065,17100,17101,18168,18169,19268,19269, - 19825,19824,18709,18708,17625,17624,16573,16572,15553,15552,14565,1,14564,13609,13608,12685,12684,11793,11792,10933,10932,10105,10104,9309,9308,8545,8544,1,7813,7812,7113,7112,6445,6444,5809,5808,5205,5204,4633,4632,4093,4092,3585,1,3584,3109,3108,2665,2664,2253,2252,1873,1872,1525,1524,1209,1208,925,924,1,673,672,453,452,265,264,109,108,20033,1,0,1,0,1,1,1,1,1,0,1,0,1,20016,50,51,190,191,362,363,566,567,1,802,803,1070,1071,1370,1371,1702,1703,2066,2067,2462,2463,2890,2891,3350,1,3351,3842,3843,4366,4367,4922,4923,5510,5511,6130,6131,6782,6783,7466,7467,1,8182,8183,8930,8931,9710,9711,10522,10523,11366,11367,12242,12243,13150,13151,14090,1,14091,15062,15063,16066,16067,17102,17103,18170,18171,19270,19271, - 19823,19822,18707,18706,17623,17622,16571,16570,15551,15550,14563,0,14562,13607,13606,12683,12682,11791,11790,10931,10930,10103,10102,9307,9306,8543,8542,0,7811,7810,7111,7110,6443,6442,5807,5806,5203,5202,4631,4630,4091,4090,3583,0,3582,3107,3106,2663,2662,2251,2250,1871,1870,1523,1522,1207,1206,923,922,0,671,670,451,450,263,262,107,106,20032,1,0,1,0,0,0,0,0,0,0,1,0,1,20017,52,53,192,193,364,365,568,569,0,804,805,1072,1073,1372,1373,1704,1705,2068,2069,2464,2465,2892,2893,3352,0,3353,3844,3845,4368,4369,4924,4925,5512,5513,6132,6133,6784,6785,7468,7469,0,8184,8185,8932,8933,9712,9713,10524,10525,11368,11369,12244,12245,13152,13153,14092,0,14093,15064,15065,16068,16069,17104,17105,18172,18173,19272,19273, - 19821,19820,18705,18704,17621,17620,16569,16568,15549,15548,14561,1,14560,13605,13604,12681,12680,11789,11788,10929,10928,10101,10100,9305,9304,8541,8540,1,7809,7808,7109,7108,6441,6440,5805,5804,5201,5200,4629,4628,4089,4088,3581,1,3580,3105,3104,2661,2660,2249,2248,1869,1868,1521,1520,1205,1204,921,920,1,669,668,449,448,261,260,105,104,20031,1,0,1,1,1,1,1,1,1,1,1,0,1,20018,54,55,194,195,366,367,570,571,1,806,807,1074,1075,1374,1375,1706,1707,2070,2071,2466,2467,2894,2895,3354,1,3355,3846,3847,4370,4371,4926,4927,5514,5515,6134,6135,6786,6787,7470,7471,1,8186,8187,8934,8935,9714,9715,10526,10527,11370,11371,12246,12247,13154,13155,14094,1,14095,15066,15067,16070,16071,17106,17107,18174,18175,19274,19275, - 19819,19818,18703,18702,17619,17618,16567,16566,15547,15546,14559,0,14558,13603,13602,12679,12678,11787,11786,10927,10926,10099,10098,9303,9302,8539,8538,0,7807,7806,7107,7106,6439,6438,5803,5802,5199,5198,4627,4626,4087,4086,3579,0,3578,3103,3102,2659,2658,2247,2246,1867,1866,1519,1518,1203,1202,919,918,0,667,666,447,446,259,258,103,102,20030,1,0,0,0,0,0,0,0,0,0,0,0,1,20019,56,57,196,197,368,369,572,573,0,808,809,1076,1077,1376,1377,1708,1709,2072,2073,2468,2469,2896,2897,3356,0,3357,3848,3849,4372,4373,4928,4929,5516,5517,6136,6137,6788,6789,7472,7473,0,8188,8189,8936,8937,9716,9717,10528,10529,11372,11373,12248,12249,13156,13157,14096,0,14097,15068,15069,16072,16073,17108,17109,18176,18177,19276,19277, - 19817,19816,18701,18700,17617,17616,16565,16564,15545,15544,14557,1,14556,13601,13600,12677,12676,11785,11784,10925,10924,10097,10096,9301,9300,8537,8536,1,7805,7804,7105,7104,6437,6436,5801,5800,5197,5196,4625,4624,4085,4084,3577,1,3576,3101,3100,2657,2656,2245,2244,1865,1864,1517,1516,1201,1200,917,916,1,665,664,445,444,257,256,101,100,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,58,59,198,199,370,371,574,575,1,810,811,1078,1079,1378,1379,1710,1711,2074,2075,2470,2471,2898,2899,3358,1,3359,3850,3851,4374,4375,4930,4931,5518,5519,6138,6139,6790,6791,7474,7475,1,8190,8191,8938,8939,9718,9719,10530,10531,11374,11375,12250,12251,13158,13159,14098,1,14099,15070,15071,16074,16075,17110,17111,18178,18179,19278,19279, - 19815,19814,18699,18698,17615,17614,16563,16562,15543,15542,14555,0,14554,13599,13598,12675,12674,11783,11782,10923,10922,10095,10094,9299,9298,8535,8534,0,7803,7802,7103,7102,6435,6434,5799,5798,5195,5194,4623,4622,4083,4082,3575,0,3574,3099,3098,2655,2654,2243,2242,1863,1862,1515,1514,1199,1198,915,914,0,663,662,443,442,255,254,99,98,0,0,20029,20028,20027,20026,20025,0,20024,20023,20022,20021,20020,0,0,60,61,200,201,372,373,576,577,0,812,813,1080,1081,1380,1381,1712,1713,2076,2077,2472,2473,2900,2901,3360,0,3361,3852,3853,4376,4377,4932,4933,5520,5521,6140,6141,6792,6793,7476,7477,0,8192,8193,8940,8941,9720,9721,10532,10533,11376,11377,12252,12253,13160,13161,14100,0,14101,15072,15073,16076,16077,17112,17113,18180,18181,19280,19281, - 19813,19812,18697,18696,17613,17612,16561,16560,15541,15540,14553,1,14552,13597,13596,12673,12672,11781,11780,10921,10920,10093,10092,9297,9296,8533,8532,1,7801,7800,7101,7100,6433,6432,5797,5796,5193,5192,4621,4620,4081,4080,3573,1,3572,3097,3096,2653,2652,2241,2240,1861,1860,1513,1512,1197,1196,913,912,1,661,660,441,440,253,252,96,94,92,90,88,86,84,82,80,1,78,76,74,72,70,68,66,62,63,202,203,374,375,578,579,1,814,815,1082,1083,1382,1383,1714,1715,2078,2079,2474,2475,2902,2903,3362,1,3363,3854,3855,4378,4379,4934,4935,5522,5523,6142,6143,6794,6795,7478,7479,1,8194,8195,8942,8943,9722,9723,10534,10535,11378,11379,12254,12255,13162,13163,14102,1,14103,15074,15075,16078,16079,17114,17115,18182,18183,19282,19283, - 19811,19810,18695,18694,17611,17610,16559,16558,15539,15538,14551,0,14550,13595,13594,12671,12670,11779,11778,10919,10918,10091,10090,9295,9294,8531,8530,0,7799,7798,7099,7098,6431,6430,5795,5794,5191,5190,4619,4618,4079,4078,3571,0,3570,3095,3094,2651,2650,2239,2238,1859,1858,1511,1510,1195,1194,911,910,0,659,658,439,438,251,250,97,95,93,91,89,87,85,83,81,0,79,77,75,73,71,69,67,64,65,204,205,376,377,580,581,0,816,817,1084,1085,1384,1385,1716,1717,2080,2081,2476,2477,2904,2905,3364,0,3365,3856,3857,4380,4381,4936,4937,5524,5525,6144,6145,6796,6797,7480,7481,0,8196,8197,8944,8945,9724,9725,10536,10537,11380,11381,12256,12257,13164,13165,14104,0,14105,15076,15077,16080,16081,17116,17117,18184,18185,19284,19285, - 19809,19808,18693,18692,17609,17608,16557,16556,15537,15536,14549,1,14548,13593,13592,12669,12668,11777,11776,10917,10916,10089,10088,9293,9292,8529,8528,1,7797,7796,7097,7096,6429,6428,5793,5792,5189,5188,4617,4616,4077,4076,3569,1,3568,3093,3092,2649,2648,2237,2236,1857,1856,1509,1508,1193,1192,909,908,1,657,656,437,436,248,246,244,242,240,238,236,234,232,230,228,1,226,224,222,220,218,216,214,212,210,206,207,378,379,582,583,1,818,819,1086,1087,1386,1387,1718,1719,2082,2083,2478,2479,2906,2907,3366,1,3367,3858,3859,4382,4383,4938,4939,5526,5527,6146,6147,6798,6799,7482,7483,1,8198,8199,8946,8947,9726,9727,10538,10539,11382,11383,12258,12259,13166,13167,14106,1,14107,15078,15079,16082,16083,17118,17119,18186,18187,19286,19287, - 19807,19806,18691,18690,17607,17606,16555,16554,15535,15534,14547,0,14546,13591,13590,12667,12666,11775,11774,10915,10914,10087,10086,9291,9290,8527,8526,0,7795,7794,7095,7094,6427,6426,5791,5790,5187,5186,4615,4614,4075,4074,3567,0,3566,3091,3090,2647,2646,2235,2234,1855,1854,1507,1506,1191,1190,907,906,0,655,654,435,434,249,247,245,243,241,239,237,235,233,231,229,0,227,225,223,221,219,217,215,213,211,208,209,380,381,584,585,0,820,821,1088,1089,1388,1389,1720,1721,2084,2085,2480,2481,2908,2909,3368,0,3369,3860,3861,4384,4385,4940,4941,5528,5529,6148,6149,6800,6801,7484,7485,0,8200,8201,8948,8949,9728,9729,10540,10541,11384,11385,12260,12261,13168,13169,14108,0,14109,15080,15081,16084,16085,17120,17121,18188,18189,19288,19289, - 19805,19804,18689,18688,17605,17604,16553,16552,15533,15532,14545,1,14544,13589,13588,12665,12664,11773,11772,10913,10912,10085,10084,9289,9288,8525,8524,1,7793,7792,7093,7092,6425,6424,5789,5788,5185,5184,4613,4612,4073,4072,3565,1,3564,3089,3088,2645,2644,2233,2232,1853,1852,1505,1504,1189,1188,905,904,1,653,652,432,430,428,426,424,422,420,418,416,414,412,410,408,1,406,404,402,400,398,396,394,392,390,388,386,382,383,586,587,1,822,823,1090,1091,1390,1391,1722,1723,2086,2087,2482,2483,2910,2911,3370,1,3371,3862,3863,4386,4387,4942,4943,5530,5531,6150,6151,6802,6803,7486,7487,1,8202,8203,8950,8951,9730,9731,10542,10543,11386,11387,12262,12263,13170,13171,14110,1,14111,15082,15083,16086,16087,17122,17123,18190,18191,19290,19291, - 19803,19802,18687,18686,17603,17602,16551,16550,15531,15530,14543,0,14542,13587,13586,12663,12662,11771,11770,10911,10910,10083,10082,9287,9286,8523,8522,0,7791,7790,7091,7090,6423,6422,5787,5786,5183,5182,4611,4610,4071,4070,3563,0,3562,3087,3086,2643,2642,2231,2230,1851,1850,1503,1502,1187,1186,903,902,0,651,650,433,431,429,427,425,423,421,419,417,415,413,411,409,0,407,405,403,401,399,397,395,393,391,389,387,384,385,588,589,0,824,825,1092,1093,1392,1393,1724,1725,2088,2089,2484,2485,2912,2913,3372,0,3373,3864,3865,4388,4389,4944,4945,5532,5533,6152,6153,6804,6805,7488,7489,0,8204,8205,8952,8953,9732,9733,10544,10545,11388,11389,12264,12265,13172,13173,14112,0,14113,15084,15085,16088,16089,17124,17125,18192,18193,19292,19293, - 19801,19800,18685,18684,17601,17600,16549,16548,15529,15528,14541,1,14540,13585,13584,12661,12660,11769,11768,10909,10908,10081,10080,9285,9284,8521,8520,1,7789,7788,7089,7088,6421,6420,5785,5784,5181,5180,4609,4608,4069,4068,3561,1,3560,3085,3084,2641,2640,2229,2228,1849,1848,1501,1500,1185,1184,901,900,1,648,646,644,642,640,638,636,634,632,630,628,626,624,622,620,1,618,616,614,612,610,608,606,604,602,600,598,596,594,590,591,1,826,827,1094,1095,1394,1395,1726,1727,2090,2091,2486,2487,2914,2915,3374,1,3375,3866,3867,4390,4391,4946,4947,5534,5535,6154,6155,6806,6807,7490,7491,1,8206,8207,8954,8955,9734,9735,10546,10547,11390,11391,12266,12267,13174,13175,14114,1,14115,15086,15087,16090,16091,17126,17127,18194,18195,19294,19295, - 19799,19798,18683,18682,17599,17598,16547,16546,15527,15526,14539,0,14538,13583,13582,12659,12658,11767,11766,10907,10906,10079,10078,9283,9282,8519,8518,0,7787,7786,7087,7086,6419,6418,5783,5782,5179,5178,4607,4606,4067,4066,3559,0,3558,3083,3082,2639,2638,2227,2226,1847,1846,1499,1498,1183,1182,899,898,0,649,647,645,643,641,639,637,635,633,631,629,627,625,623,621,0,619,617,615,613,611,609,607,605,603,601,599,597,595,592,593,0,828,829,1096,1097,1396,1397,1728,1729,2092,2093,2488,2489,2916,2917,3376,0,3377,3868,3869,4392,4393,4948,4949,5536,5537,6156,6157,6808,6809,7492,7493,0,8208,8209,8956,8957,9736,9737,10548,10549,11392,11393,12268,12269,13176,13177,14116,0,14117,15088,15089,16092,16093,17128,17129,18196,18197,19296,19297, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 19797,19796,18681,18680,17597,17596,16545,16544,15525,15524,14537,0,14536,13581,13580,12657,12656,11765,11764,10905,10904,10077,10076,9281,9280,8517,8516,0,7785,7784,7085,7084,6417,6416,5781,5780,5177,5176,4605,4604,4065,4064,3557,0,3556,3081,3080,2637,2636,2225,2224,1845,1844,1497,1496,1181,1180,896,894,0,892,890,888,886,884,882,880,878,876,874,872,870,868,866,864,0,862,860,858,856,854,852,850,848,846,844,842,840,838,836,834,0,830,831,1098,1099,1398,1399,1730,1731,2094,2095,2490,2491,2918,2919,3378,0,3379,3870,3871,4394,4395,4950,4951,5538,5539,6158,6159,6810,6811,7494,7495,0,8210,8211,8958,8959,9738,9739,10550,10551,11394,11395,12270,12271,13178,13179,14118,0,14119,15090,15091,16094,16095,17130,17131,18198,18199,19298,19299, - 19795,19794,18679,18678,17595,17594,16543,16542,15523,15522,14535,1,14534,13579,13578,12655,12654,11763,11762,10903,10902,10075,10074,9279,9278,8515,8514,1,7783,7782,7083,7082,6415,6414,5779,5778,5175,5174,4603,4602,4063,4062,3555,1,3554,3079,3078,2635,2634,2223,2222,1843,1842,1495,1494,1179,1178,897,895,1,893,891,889,887,885,883,881,879,877,875,873,871,869,867,865,1,863,861,859,857,855,853,851,849,847,845,843,841,839,837,835,1,832,833,1100,1101,1400,1401,1732,1733,2096,2097,2492,2493,2920,2921,3380,1,3381,3872,3873,4396,4397,4952,4953,5540,5541,6160,6161,6812,6813,7496,7497,1,8212,8213,8960,8961,9740,9741,10552,10553,11396,11397,12272,12273,13180,13181,14120,1,14121,15092,15093,16096,16097,17132,17133,18200,18201,19300,19301, - 19793,19792,18677,18676,17593,17592,16541,16540,15521,15520,14533,0,14532,13577,13576,12653,12652,11761,11760,10901,10900,10073,10072,9277,9276,8513,8512,0,7781,7780,7081,7080,6413,6412,5777,5776,5173,5172,4601,4600,4061,4060,3553,0,3552,3077,3076,2633,2632,2221,2220,1841,1840,1493,1492,1176,1174,1172,1170,0,1168,1166,1164,1162,1160,1158,1156,1154,1152,1150,1148,1146,1144,1142,1140,0,1138,1136,1134,1132,1130,1128,1126,1124,1122,1120,1118,1116,1114,1112,1110,0,1108,1106,1102,1103,1402,1403,1734,1735,2098,2099,2494,2495,2922,2923,3382,0,3383,3874,3875,4398,4399,4954,4955,5542,5543,6162,6163,6814,6815,7498,7499,0,8214,8215,8962,8963,9742,9743,10554,10555,11398,11399,12274,12275,13182,13183,14122,0,14123,15094,15095,16098,16099,17134,17135,18202,18203,19302,19303, - 19791,19790,18675,18674,17591,17590,16539,16538,15519,15518,14531,1,14530,13575,13574,12651,12650,11759,11758,10899,10898,10071,10070,9275,9274,8511,8510,1,7779,7778,7079,7078,6411,6410,5775,5774,5171,5170,4599,4598,4059,4058,3551,1,3550,3075,3074,2631,2630,2219,2218,1839,1838,1491,1490,1177,1175,1173,1171,1,1169,1167,1165,1163,1161,1159,1157,1155,1153,1151,1149,1147,1145,1143,1141,1,1139,1137,1135,1133,1131,1129,1127,1125,1123,1121,1119,1117,1115,1113,1111,1,1109,1107,1104,1105,1404,1405,1736,1737,2100,2101,2496,2497,2924,2925,3384,1,3385,3876,3877,4400,4401,4956,4957,5544,5545,6164,6165,6816,6817,7500,7501,1,8216,8217,8964,8965,9744,9745,10556,10557,11400,11401,12276,12277,13184,13185,14124,1,14125,15096,15097,16100,16101,17136,17137,18204,18205,19304,19305, - 19789,19788,18673,18672,17589,17588,16537,16536,15517,15516,14529,0,14528,13573,13572,12649,12648,11757,11756,10897,10896,10069,10068,9273,9272,8509,8508,0,7777,7776,7077,7076,6409,6408,5773,5772,5169,5168,4597,4596,4057,4056,3549,0,3548,3073,3072,2629,2628,2217,2216,1837,1836,1488,1486,1484,1482,1480,1478,0,1476,1474,1472,1470,1468,1466,1464,1462,1460,1458,1456,1454,1452,1450,1448,0,1446,1444,1442,1440,1438,1436,1434,1432,1430,1428,1426,1424,1422,1420,1418,0,1416,1414,1412,1410,1406,1407,1738,1739,2102,2103,2498,2499,2926,2927,3386,0,3387,3878,3879,4402,4403,4958,4959,5546,5547,6166,6167,6818,6819,7502,7503,0,8218,8219,8966,8967,9746,9747,10558,10559,11402,11403,12278,12279,13186,13187,14126,0,14127,15098,15099,16102,16103,17138,17139,18206,18207,19306,19307, - 19787,19786,18671,18670,17587,17586,16535,16534,15515,15514,14527,1,14526,13571,13570,12647,12646,11755,11754,10895,10894,10067,10066,9271,9270,8507,8506,1,7775,7774,7075,7074,6407,6406,5771,5770,5167,5166,4595,4594,4055,4054,3547,1,3546,3071,3070,2627,2626,2215,2214,1835,1834,1489,1487,1485,1483,1481,1479,1,1477,1475,1473,1471,1469,1467,1465,1463,1461,1459,1457,1455,1453,1451,1449,1,1447,1445,1443,1441,1439,1437,1435,1433,1431,1429,1427,1425,1423,1421,1419,1,1417,1415,1413,1411,1408,1409,1740,1741,2104,2105,2500,2501,2928,2929,3388,1,3389,3880,3881,4404,4405,4960,4961,5548,5549,6168,6169,6820,6821,7504,7505,1,8220,8221,8968,8969,9748,9749,10560,10561,11404,11405,12280,12281,13188,13189,14128,1,14129,15100,15101,16104,16105,17140,17141,18208,18209,19308,19309, - 19785,19784,18669,18668,17585,17584,16533,16532,15513,15512,14525,0,14524,13569,13568,12645,12644,11753,11752,10893,10892,10065,10064,9269,9268,8505,8504,0,7773,7772,7073,7072,6405,6404,5769,5768,5165,5164,4593,4592,4053,4052,3545,0,3544,3069,3068,2625,2624,2213,2212,1832,1830,1828,1826,1824,1822,1820,1818,0,1816,1814,1812,1810,1808,1806,1804,1802,1800,1798,1796,1794,1792,1790,1788,0,1786,1784,1782,1780,1778,1776,1774,1772,1770,1768,1766,1764,1762,1760,1758,0,1756,1754,1752,1750,1748,1746,1742,1743,2106,2107,2502,2503,2930,2931,3390,0,3391,3882,3883,4406,4407,4962,4963,5550,5551,6170,6171,6822,6823,7506,7507,0,8222,8223,8970,8971,9750,9751,10562,10563,11406,11407,12282,12283,13190,13191,14130,0,14131,15102,15103,16106,16107,17142,17143,18210,18211,19310,19311, - 19783,19782,18667,18666,17583,17582,16531,16530,15511,15510,14523,1,14522,13567,13566,12643,12642,11751,11750,10891,10890,10063,10062,9267,9266,8503,8502,1,7771,7770,7071,7070,6403,6402,5767,5766,5163,5162,4591,4590,4051,4050,3543,1,3542,3067,3066,2623,2622,2211,2210,1833,1831,1829,1827,1825,1823,1821,1819,1,1817,1815,1813,1811,1809,1807,1805,1803,1801,1799,1797,1795,1793,1791,1789,1,1787,1785,1783,1781,1779,1777,1775,1773,1771,1769,1767,1765,1763,1761,1759,1,1757,1755,1753,1751,1749,1747,1744,1745,2108,2109,2504,2505,2932,2933,3392,1,3393,3884,3885,4408,4409,4964,4965,5552,5553,6172,6173,6824,6825,7508,7509,1,8224,8225,8972,8973,9752,9753,10564,10565,11408,11409,12284,12285,13192,13193,14132,1,14133,15104,15105,16108,16109,17144,17145,18212,18213,19312,19313, - 19781,19780,18665,18664,17581,17580,16529,16528,15509,15508,14521,0,14520,13565,13564,12641,12640,11749,11748,10889,10888,10061,10060,9265,9264,8501,8500,0,7769,7768,7069,7068,6401,6400,5765,5764,5161,5160,4589,4588,4049,4048,3541,0,3540,3065,3064,2621,2620,2208,2206,2204,2202,2200,2198,2196,2194,2192,2190,0,2188,2186,2184,2182,2180,2178,2176,2174,2172,2170,2168,2166,2164,2162,2160,0,2158,2156,2154,2152,2150,2148,2146,2144,2142,2140,2138,2136,2134,2132,2130,0,2128,2126,2124,2122,2120,2118,2116,2114,2110,2111,2506,2507,2934,2935,3394,0,3395,3886,3887,4410,4411,4966,4967,5554,5555,6174,6175,6826,6827,7510,7511,0,8226,8227,8974,8975,9754,9755,10566,10567,11410,11411,12286,12287,13194,13195,14134,0,14135,15106,15107,16110,16111,17146,17147,18214,18215,19314,19315, - 19779,19778,18663,18662,17579,17578,16527,16526,15507,15506,14519,1,14518,13563,13562,12639,12638,11747,11746,10887,10886,10059,10058,9263,9262,8499,8498,1,7767,7766,7067,7066,6399,6398,5763,5762,5159,5158,4587,4586,4047,4046,3539,1,3538,3063,3062,2619,2618,2209,2207,2205,2203,2201,2199,2197,2195,2193,2191,1,2189,2187,2185,2183,2181,2179,2177,2175,2173,2171,2169,2167,2165,2163,2161,1,2159,2157,2155,2153,2151,2149,2147,2145,2143,2141,2139,2137,2135,2133,2131,1,2129,2127,2125,2123,2121,2119,2117,2115,2112,2113,2508,2509,2936,2937,3396,1,3397,3888,3889,4412,4413,4968,4969,5556,5557,6176,6177,6828,6829,7512,7513,1,8228,8229,8976,8977,9756,9757,10568,10569,11412,11413,12288,12289,13196,13197,14136,1,14137,15108,15109,16112,16113,17148,17149,18216,18217,19316,19317, - 19777,19776,18661,18660,17577,17576,16525,16524,15505,15504,14517,0,14516,13561,13560,12637,12636,11745,11744,10885,10884,10057,10056,9261,9260,8497,8496,0,7765,7764,7065,7064,6397,6396,5761,5760,5157,5156,4585,4584,4045,4044,3537,0,3536,3061,3060,2616,2614,2612,2610,2608,2606,2604,2602,2600,2598,2596,2594,0,2592,2590,2588,2586,2584,2582,2580,2578,2576,2574,2572,2570,2568,2566,2564,0,2562,2560,2558,2556,2554,2552,2550,2548,2546,2544,2542,2540,2538,2536,2534,0,2532,2530,2528,2526,2524,2522,2520,2518,2516,2514,2510,2511,2938,2939,3398,0,3399,3890,3891,4414,4415,4970,4971,5558,5559,6178,6179,6830,6831,7514,7515,0,8230,8231,8978,8979,9758,9759,10570,10571,11414,11415,12290,12291,13198,13199,14138,0,14139,15110,15111,16114,16115,17150,17151,18218,18219,19318,19319, - 19775,19774,18659,18658,17575,17574,16523,16522,15503,15502,14515,1,14514,13559,13558,12635,12634,11743,11742,10883,10882,10055,10054,9259,9258,8495,8494,1,7763,7762,7063,7062,6395,6394,5759,5758,5155,5154,4583,4582,4043,4042,3535,1,3534,3059,3058,2617,2615,2613,2611,2609,2607,2605,2603,2601,2599,2597,2595,1,2593,2591,2589,2587,2585,2583,2581,2579,2577,2575,2573,2571,2569,2567,2565,1,2563,2561,2559,2557,2555,2553,2551,2549,2547,2545,2543,2541,2539,2537,2535,1,2533,2531,2529,2527,2525,2523,2521,2519,2517,2515,2512,2513,2940,2941,3400,1,3401,3892,3893,4416,4417,4972,4973,5560,5561,6180,6181,6832,6833,7516,7517,1,8232,8233,8980,8981,9760,9761,10572,10573,11416,11417,12292,12293,13200,13201,14140,1,14141,15112,15113,16116,16117,17152,17153,18220,18221,19320,19321, - 19773,19772,18657,18656,17573,17572,16521,16520,15501,15500,14513,0,14512,13557,13556,12633,12632,11741,11740,10881,10880,10053,10052,9257,9256,8493,8492,0,7761,7760,7061,7060,6393,6392,5757,5756,5153,5152,4581,4580,4041,4040,3533,0,3532,3056,3054,3052,3050,3048,3046,3044,3042,3040,3038,3036,3034,3032,3030,0,3028,3026,3024,3022,3020,3018,3016,3014,3012,3010,3008,3006,3004,3002,3000,0,2998,2996,2994,2992,2990,2988,2986,2984,2982,2980,2978,2976,2974,2972,2970,0,2968,2966,2964,2962,2960,2958,2956,2954,2952,2950,2948,2946,2942,2943,3402,0,3403,3894,3895,4418,4419,4974,4975,5562,5563,6182,6183,6834,6835,7518,7519,0,8234,8235,8982,8983,9762,9763,10574,10575,11418,11419,12294,12295,13202,13203,14142,0,14143,15114,15115,16118,16119,17154,17155,18222,18223,19322,19323, - 19771,19770,18655,18654,17571,17570,16519,16518,15499,15498,14511,1,14510,13555,13554,12631,12630,11739,11738,10879,10878,10051,10050,9255,9254,8491,8490,1,7759,7758,7059,7058,6391,6390,5755,5754,5151,5150,4579,4578,4039,4038,3531,1,3530,3057,3055,3053,3051,3049,3047,3045,3043,3041,3039,3037,3035,3033,3031,1,3029,3027,3025,3023,3021,3019,3017,3015,3013,3011,3009,3007,3005,3003,3001,1,2999,2997,2995,2993,2991,2989,2987,2985,2983,2981,2979,2977,2975,2973,2971,1,2969,2967,2965,2963,2961,2959,2957,2955,2953,2951,2949,2947,2944,2945,3404,1,3405,3896,3897,4420,4421,4976,4977,5564,5565,6184,6185,6836,6837,7520,7521,1,8236,8237,8984,8985,9764,9765,10576,10577,11420,11421,12296,12297,13204,13205,14144,1,14145,15116,15117,16120,16121,17156,17157,18224,18225,19324,19325, - 19769,19768,18653,18652,17569,17568,16517,16516,15497,15496,14509,0,14508,13553,13552,12629,12628,11737,11736,10877,10876,10049,10048,9253,9252,8489,8488,0,7757,7756,7057,7056,6389,6388,5753,5752,5149,5148,4577,4576,4037,4036,3528,0,3526,3524,3522,3520,3518,3516,3514,3512,3510,3508,3506,3504,3502,3500,3498,0,3496,3494,3492,3490,3488,3486,3484,3482,3480,3478,3476,3474,3472,3470,3468,0,3466,3464,3462,3460,3458,3456,3454,3452,3450,3448,3446,3444,3442,3440,3438,0,3436,3434,3432,3430,3428,3426,3424,3422,3420,3418,3416,3414,3412,3410,3406,0,3407,3898,3899,4422,4423,4978,4979,5566,5567,6186,6187,6838,6839,7522,7523,0,8238,8239,8986,8987,9766,9767,10578,10579,11422,11423,12298,12299,13206,13207,14146,0,14147,15118,15119,16122,16123,17158,17159,18226,18227,19326,19327, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 19767,19766,18651,18650,17567,17566,16515,16514,15495,15494,14507,0,14506,13551,13550,12627,12626,11735,11734,10875,10874,10047,10046,9251,9250,8487,8486,0,7755,7754,7055,7054,6387,6386,5751,5750,5147,5146,4575,4574,4035,4034,3529,0,3527,3525,3523,3521,3519,3517,3515,3513,3511,3509,3507,3505,3503,3501,3499,0,3497,3495,3493,3491,3489,3487,3485,3483,3481,3479,3477,3475,3473,3471,3469,0,3467,3465,3463,3461,3459,3457,3455,3453,3451,3449,3447,3445,3443,3441,3439,0,3437,3435,3433,3431,3429,3427,3425,3423,3421,3419,3417,3415,3413,3411,3408,0,3409,3900,3901,4424,4425,4980,4981,5568,5569,6188,6189,6840,6841,7524,7525,0,8240,8241,8988,8989,9768,9769,10580,10581,11424,11425,12300,12301,13208,13209,14148,0,14149,15120,15121,16124,16125,17160,17161,18228,18229,19328,19329, - 19765,19764,18649,18648,17565,17564,16513,16512,15493,15492,14505,1,14504,13549,13548,12625,12624,11733,11732,10873,10872,10045,10044,9249,9248,8485,8484,1,7753,7752,7053,7052,6385,6384,5749,5748,5145,5144,4573,4572,4032,4030,4028,1,4026,4024,4022,4020,4018,4016,4014,4012,4010,4008,4006,4004,4002,4000,3998,1,3996,3994,3992,3990,3988,3986,3984,3982,3980,3978,3976,3974,3972,3970,3968,1,3966,3964,3962,3960,3958,3956,3954,3952,3950,3948,3946,3944,3942,3940,3938,1,3936,3934,3932,3930,3928,3926,3924,3922,3920,3918,3916,3914,3912,3910,3908,1,3906,3902,3903,4426,4427,4982,4983,5570,5571,6190,6191,6842,6843,7526,7527,1,8242,8243,8990,8991,9770,9771,10582,10583,11426,11427,12302,12303,13210,13211,14150,1,14151,15122,15123,16126,16127,17162,17163,18230,18231,19330,19331, - 19763,19762,18647,18646,17563,17562,16511,16510,15491,15490,14503,0,14502,13547,13546,12623,12622,11731,11730,10871,10870,10043,10042,9247,9246,8483,8482,0,7751,7750,7051,7050,6383,6382,5747,5746,5143,5142,4571,4570,4033,4031,4029,0,4027,4025,4023,4021,4019,4017,4015,4013,4011,4009,4007,4005,4003,4001,3999,0,3997,3995,3993,3991,3989,3987,3985,3983,3981,3979,3977,3975,3973,3971,3969,0,3967,3965,3963,3961,3959,3957,3955,3953,3951,3949,3947,3945,3943,3941,3939,0,3937,3935,3933,3931,3929,3927,3925,3923,3921,3919,3917,3915,3913,3911,3909,0,3907,3904,3905,4428,4429,4984,4985,5572,5573,6192,6193,6844,6845,7528,7529,0,8244,8245,8992,8993,9772,9773,10584,10585,11428,11429,12304,12305,13212,13213,14152,0,14153,15124,15125,16128,16129,17164,17165,18232,18233,19332,19333, - 19761,19760,18645,18644,17561,17560,16509,16508,15489,15488,14501,1,14500,13545,13544,12621,12620,11729,11728,10869,10868,10041,10040,9245,9244,8481,8480,1,7749,7748,7049,7048,6381,6380,5745,5744,5141,5140,4568,4566,4564,4562,4560,1,4558,4556,4554,4552,4550,4548,4546,4544,4542,4540,4538,4536,4534,4532,4530,1,4528,4526,4524,4522,4520,4518,4516,4514,4512,4510,4508,4506,4504,4502,4500,1,4498,4496,4494,4492,4490,4488,4486,4484,4482,4480,4478,4476,4474,4472,4470,1,4468,4466,4464,4462,4460,4458,4456,4454,4452,4450,4448,4446,4444,4442,4440,1,4438,4436,4434,4430,4431,4986,4987,5574,5575,6194,6195,6846,6847,7530,7531,1,8246,8247,8994,8995,9774,9775,10586,10587,11430,11431,12306,12307,13214,13215,14154,1,14155,15126,15127,16130,16131,17166,17167,18234,18235,19334,19335, - 19759,19758,18643,18642,17559,17558,16507,16506,15487,15486,14499,0,14498,13543,13542,12619,12618,11727,11726,10867,10866,10039,10038,9243,9242,8479,8478,0,7747,7746,7047,7046,6379,6378,5743,5742,5139,5138,4569,4567,4565,4563,4561,0,4559,4557,4555,4553,4551,4549,4547,4545,4543,4541,4539,4537,4535,4533,4531,0,4529,4527,4525,4523,4521,4519,4517,4515,4513,4511,4509,4507,4505,4503,4501,0,4499,4497,4495,4493,4491,4489,4487,4485,4483,4481,4479,4477,4475,4473,4471,0,4469,4467,4465,4463,4461,4459,4457,4455,4453,4451,4449,4447,4445,4443,4441,0,4439,4437,4435,4432,4433,4988,4989,5576,5577,6196,6197,6848,6849,7532,7533,0,8248,8249,8996,8997,9776,9777,10588,10589,11432,11433,12308,12309,13216,13217,14156,0,14157,15128,15129,16132,16133,17168,17169,18236,18237,19336,19337, - 19757,19756,18641,18640,17557,17556,16505,16504,15485,15484,14497,1,14496,13541,13540,12617,12616,11725,11724,10865,10864,10037,10036,9241,9240,8477,8476,1,7745,7744,7045,7044,6377,6376,5741,5740,5136,5134,5132,5130,5128,5126,5124,1,5122,5120,5118,5116,5114,5112,5110,5108,5106,5104,5102,5100,5098,5096,5094,1,5092,5090,5088,5086,5084,5082,5080,5078,5076,5074,5072,5070,5068,5066,5064,1,5062,5060,5058,5056,5054,5052,5050,5048,5046,5044,5042,5040,5038,5036,5034,1,5032,5030,5028,5026,5024,5022,5020,5018,5016,5014,5012,5010,5008,5006,5004,1,5002,5000,4998,4996,4994,4990,4991,5578,5579,6198,6199,6850,6851,7534,7535,1,8250,8251,8998,8999,9778,9779,10590,10591,11434,11435,12310,12311,13218,13219,14158,1,14159,15130,15131,16134,16135,17170,17171,18238,18239,19338,19339, - 19755,19754,18639,18638,17555,17554,16503,16502,15483,15482,14495,0,14494,13539,13538,12615,12614,11723,11722,10863,10862,10035,10034,9239,9238,8475,8474,0,7743,7742,7043,7042,6375,6374,5739,5738,5137,5135,5133,5131,5129,5127,5125,0,5123,5121,5119,5117,5115,5113,5111,5109,5107,5105,5103,5101,5099,5097,5095,0,5093,5091,5089,5087,5085,5083,5081,5079,5077,5075,5073,5071,5069,5067,5065,0,5063,5061,5059,5057,5055,5053,5051,5049,5047,5045,5043,5041,5039,5037,5035,0,5033,5031,5029,5027,5025,5023,5021,5019,5017,5015,5013,5011,5009,5007,5005,0,5003,5001,4999,4997,4995,4992,4993,5580,5581,6200,6201,6852,6853,7536,7537,0,8252,8253,9000,9001,9780,9781,10592,10593,11436,11437,12312,12313,13220,13221,14160,0,14161,15132,15133,16136,16137,17172,17173,18240,18241,19340,19341, - 19753,19752,18637,18636,17553,17552,16501,16500,15481,15480,14493,1,14492,13537,13536,12613,12612,11721,11720,10861,10860,10033,10032,9237,9236,8473,8472,1,7741,7740,7041,7040,6373,6372,5736,5734,5732,5730,5728,5726,5724,5722,5720,1,5718,5716,5714,5712,5710,5708,5706,5704,5702,5700,5698,5696,5694,5692,5690,1,5688,5686,5684,5682,5680,5678,5676,5674,5672,5670,5668,5666,5664,5662,5660,1,5658,5656,5654,5652,5650,5648,5646,5644,5642,5640,5638,5636,5634,5632,5630,1,5628,5626,5624,5622,5620,5618,5616,5614,5612,5610,5608,5606,5604,5602,5600,1,5598,5596,5594,5592,5590,5588,5586,5582,5583,6202,6203,6854,6855,7538,7539,1,8254,8255,9002,9003,9782,9783,10594,10595,11438,11439,12314,12315,13222,13223,14162,1,14163,15134,15135,16138,16139,17174,17175,18242,18243,19342,19343, - 19751,19750,18635,18634,17551,17550,16499,16498,15479,15478,14491,0,14490,13535,13534,12611,12610,11719,11718,10859,10858,10031,10030,9235,9234,8471,8470,0,7739,7738,7039,7038,6371,6370,5737,5735,5733,5731,5729,5727,5725,5723,5721,0,5719,5717,5715,5713,5711,5709,5707,5705,5703,5701,5699,5697,5695,5693,5691,0,5689,5687,5685,5683,5681,5679,5677,5675,5673,5671,5669,5667,5665,5663,5661,0,5659,5657,5655,5653,5651,5649,5647,5645,5643,5641,5639,5637,5635,5633,5631,0,5629,5627,5625,5623,5621,5619,5617,5615,5613,5611,5609,5607,5605,5603,5601,0,5599,5597,5595,5593,5591,5589,5587,5584,5585,6204,6205,6856,6857,7540,7541,0,8256,8257,9004,9005,9784,9785,10596,10597,11440,11441,12316,12317,13224,13225,14164,0,14165,15136,15137,16140,16141,17176,17177,18244,18245,19344,19345, - 19749,19748,18633,18632,17549,17548,16497,16496,15477,15476,14489,1,14488,13533,13532,12609,12608,11717,11716,10857,10856,10029,10028,9233,9232,8469,8468,1,7737,7736,7037,7036,6368,6366,6364,6362,6360,6358,6356,6354,6352,6350,6348,1,6346,6344,6342,6340,6338,6336,6334,6332,6330,6328,6326,6324,6322,6320,6318,1,6316,6314,6312,6310,6308,6306,6304,6302,6300,6298,6296,6294,6292,6290,6288,1,6286,6284,6282,6280,6278,6276,6274,6272,6270,6268,6266,6264,6262,6260,6258,1,6256,6254,6252,6250,6248,6246,6244,6242,6240,6238,6236,6234,6232,6230,6228,1,6226,6224,6222,6220,6218,6216,6214,6212,6210,6206,6207,6858,6859,7542,7543,1,8258,8259,9006,9007,9786,9787,10598,10599,11442,11443,12318,12319,13226,13227,14166,1,14167,15138,15139,16142,16143,17178,17179,18246,18247,19346,19347, - 19747,19746,18631,18630,17547,17546,16495,16494,15475,15474,14487,0,14486,13531,13530,12607,12606,11715,11714,10855,10854,10027,10026,9231,9230,8467,8466,0,7735,7734,7035,7034,6369,6367,6365,6363,6361,6359,6357,6355,6353,6351,6349,0,6347,6345,6343,6341,6339,6337,6335,6333,6331,6329,6327,6325,6323,6321,6319,0,6317,6315,6313,6311,6309,6307,6305,6303,6301,6299,6297,6295,6293,6291,6289,0,6287,6285,6283,6281,6279,6277,6275,6273,6271,6269,6267,6265,6263,6261,6259,0,6257,6255,6253,6251,6249,6247,6245,6243,6241,6239,6237,6235,6233,6231,6229,0,6227,6225,6223,6221,6219,6217,6215,6213,6211,6208,6209,6860,6861,7544,7545,0,8260,8261,9008,9009,9788,9789,10600,10601,11444,11445,12320,12321,13228,13229,14168,0,14169,15140,15141,16144,16145,17180,17181,18248,18249,19348,19349, - 19745,19744,18629,18628,17545,17544,16493,16492,15473,15472,14485,1,14484,13529,13528,12605,12604,11713,11712,10853,10852,10025,10024,9229,9228,8465,8464,1,7733,7732,7032,7030,7028,7026,7024,7022,7020,7018,7016,7014,7012,7010,7008,1,7006,7004,7002,7000,6998,6996,6994,6992,6990,6988,6986,6984,6982,6980,6978,1,6976,6974,6972,6970,6968,6966,6964,6962,6960,6958,6956,6954,6952,6950,6948,1,6946,6944,6942,6940,6938,6936,6934,6932,6930,6928,6926,6924,6922,6920,6918,1,6916,6914,6912,6910,6908,6906,6904,6902,6900,6898,6896,6894,6892,6890,6888,1,6886,6884,6882,6880,6878,6876,6874,6872,6870,6868,6866,6862,6863,7546,7547,1,8262,8263,9010,9011,9790,9791,10602,10603,11446,11447,12322,12323,13230,13231,14170,1,14171,15142,15143,16146,16147,17182,17183,18250,18251,19350,19351, - 19743,19742,18627,18626,17543,17542,16491,16490,15471,15470,14483,0,14482,13527,13526,12603,12602,11711,11710,10851,10850,10023,10022,9227,9226,8463,8462,0,7731,7730,7033,7031,7029,7027,7025,7023,7021,7019,7017,7015,7013,7011,7009,0,7007,7005,7003,7001,6999,6997,6995,6993,6991,6989,6987,6985,6983,6981,6979,0,6977,6975,6973,6971,6969,6967,6965,6963,6961,6959,6957,6955,6953,6951,6949,0,6947,6945,6943,6941,6939,6937,6935,6933,6931,6929,6927,6925,6923,6921,6919,0,6917,6915,6913,6911,6909,6907,6905,6903,6901,6899,6897,6895,6893,6891,6889,0,6887,6885,6883,6881,6879,6877,6875,6873,6871,6869,6867,6864,6865,7548,7549,0,8264,8265,9012,9013,9792,9793,10604,10605,11448,11449,12324,12325,13232,13233,14172,0,14173,15144,15145,16148,16149,17184,17185,18252,18253,19352,19353, - 19741,19740,18625,18624,17541,17540,16489,16488,15469,15468,14481,1,14480,13525,13524,12601,12600,11709,11708,10849,10848,10021,10020,9225,9224,8461,8460,1,7728,7726,7724,7722,7720,7718,7716,7714,7712,7710,7708,7706,7704,7702,7700,1,7698,7696,7694,7692,7690,7688,7686,7684,7682,7680,7678,7676,7674,7672,7670,1,7668,7666,7664,7662,7660,7658,7656,7654,7652,7650,7648,7646,7644,7642,7640,1,7638,7636,7634,7632,7630,7628,7626,7624,7622,7620,7618,7616,7614,7612,7610,1,7608,7606,7604,7602,7600,7598,7596,7594,7592,7590,7588,7586,7584,7582,7580,1,7578,7576,7574,7572,7570,7568,7566,7564,7562,7560,7558,7556,7554,7550,7551,1,8266,8267,9014,9015,9794,9795,10606,10607,11450,11451,12326,12327,13234,13235,14174,1,14175,15146,15147,16150,16151,17186,17187,18254,18255,19354,19355, - 19739,19738,18623,18622,17539,17538,16487,16486,15467,15466,14479,0,14478,13523,13522,12599,12598,11707,11706,10847,10846,10019,10018,9223,9222,8459,8458,0,7729,7727,7725,7723,7721,7719,7717,7715,7713,7711,7709,7707,7705,7703,7701,0,7699,7697,7695,7693,7691,7689,7687,7685,7683,7681,7679,7677,7675,7673,7671,0,7669,7667,7665,7663,7661,7659,7657,7655,7653,7651,7649,7647,7645,7643,7641,0,7639,7637,7635,7633,7631,7629,7627,7625,7623,7621,7619,7617,7615,7613,7611,0,7609,7607,7605,7603,7601,7599,7597,7595,7593,7591,7589,7587,7585,7583,7581,0,7579,7577,7575,7573,7571,7569,7567,7565,7563,7561,7559,7557,7555,7552,7553,0,8268,8269,9016,9017,9796,9797,10608,10609,11452,11453,12328,12329,13236,13237,14176,0,14177,15148,15149,16152,16153,17188,17189,18256,18257,19356,19357, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 19737,19736,18621,18620,17537,17536,16485,16484,15465,15464,14477,0,14476,13521,13520,12597,12596,11705,11704,10845,10844,10017,10016,9221,9220,8456,8454,0,8452,8450,8448,8446,8444,8442,8440,8438,8436,8434,8432,8430,8428,8426,8424,0,8422,8420,8418,8416,8414,8412,8410,8408,8406,8404,8402,8400,8398,8396,8394,0,8392,8390,8388,8386,8384,8382,8380,8378,8376,8374,8372,8370,8368,8366,8364,0,8362,8360,8358,8356,8354,8352,8350,8348,8346,8344,8342,8340,8338,8336,8334,0,8332,8330,8328,8326,8324,8322,8320,8318,8316,8314,8312,8310,8308,8306,8304,0,8302,8300,8298,8296,8294,8292,8290,8288,8286,8284,8282,8280,8278,8276,8274,0,8270,8271,9018,9019,9798,9799,10610,10611,11454,11455,12330,12331,13238,13239,14178,0,14179,15150,15151,16154,16155,17190,17191,18258,18259,19358,19359, - 19735,19734,18619,18618,17535,17534,16483,16482,15463,15462,14475,1,14474,13519,13518,12595,12594,11703,11702,10843,10842,10015,10014,9219,9218,8457,8455,1,8453,8451,8449,8447,8445,8443,8441,8439,8437,8435,8433,8431,8429,8427,8425,1,8423,8421,8419,8417,8415,8413,8411,8409,8407,8405,8403,8401,8399,8397,8395,1,8393,8391,8389,8387,8385,8383,8381,8379,8377,8375,8373,8371,8369,8367,8365,1,8363,8361,8359,8357,8355,8353,8351,8349,8347,8345,8343,8341,8339,8337,8335,1,8333,8331,8329,8327,8325,8323,8321,8319,8317,8315,8313,8311,8309,8307,8305,1,8303,8301,8299,8297,8295,8293,8291,8289,8287,8285,8283,8281,8279,8277,8275,1,8272,8273,9020,9021,9800,9801,10612,10613,11456,11457,12332,12333,13240,13241,14180,1,14181,15152,15153,16156,16157,17192,17193,18260,18261,19360,19361, - 19733,19732,18617,18616,17533,17532,16481,16480,15461,15460,14473,0,14472,13517,13516,12593,12592,11701,11700,10841,10840,10013,10012,9216,9214,9212,9210,0,9208,9206,9204,9202,9200,9198,9196,9194,9192,9190,9188,9186,9184,9182,9180,0,9178,9176,9174,9172,9170,9168,9166,9164,9162,9160,9158,9156,9154,9152,9150,0,9148,9146,9144,9142,9140,9138,9136,9134,9132,9130,9128,9126,9124,9122,9120,0,9118,9116,9114,9112,9110,9108,9106,9104,9102,9100,9098,9096,9094,9092,9090,0,9088,9086,9084,9082,9080,9078,9076,9074,9072,9070,9068,9066,9064,9062,9060,0,9058,9056,9054,9052,9050,9048,9046,9044,9042,9040,9038,9036,9034,9032,9030,0,9028,9026,9022,9023,9802,9803,10614,10615,11458,11459,12334,12335,13242,13243,14182,0,14183,15154,15155,16158,16159,17194,17195,18262,18263,19362,19363, - 19731,19730,18615,18614,17531,17530,16479,16478,15459,15458,14471,1,14470,13515,13514,12591,12590,11699,11698,10839,10838,10011,10010,9217,9215,9213,9211,1,9209,9207,9205,9203,9201,9199,9197,9195,9193,9191,9189,9187,9185,9183,9181,1,9179,9177,9175,9173,9171,9169,9167,9165,9163,9161,9159,9157,9155,9153,9151,1,9149,9147,9145,9143,9141,9139,9137,9135,9133,9131,9129,9127,9125,9123,9121,1,9119,9117,9115,9113,9111,9109,9107,9105,9103,9101,9099,9097,9095,9093,9091,1,9089,9087,9085,9083,9081,9079,9077,9075,9073,9071,9069,9067,9065,9063,9061,1,9059,9057,9055,9053,9051,9049,9047,9045,9043,9041,9039,9037,9035,9033,9031,1,9029,9027,9024,9025,9804,9805,10616,10617,11460,11461,12336,12337,13244,13245,14184,1,14185,15156,15157,16160,16161,17196,17197,18264,18265,19364,19365, - 19729,19728,18613,18612,17529,17528,16477,16476,15457,15456,14469,0,14468,13513,13512,12589,12588,11697,11696,10837,10836,10008,10006,10004,10002,10000,9998,0,9996,9994,9992,9990,9988,9986,9984,9982,9980,9978,9976,9974,9972,9970,9968,0,9966,9964,9962,9960,9958,9956,9954,9952,9950,9948,9946,9944,9942,9940,9938,0,9936,9934,9932,9930,9928,9926,9924,9922,9920,9918,9916,9914,9912,9910,9908,0,9906,9904,9902,9900,9898,9896,9894,9892,9890,9888,9886,9884,9882,9880,9878,0,9876,9874,9872,9870,9868,9866,9864,9862,9860,9858,9856,9854,9852,9850,9848,0,9846,9844,9842,9840,9838,9836,9834,9832,9830,9828,9826,9824,9822,9820,9818,0,9816,9814,9812,9810,9806,9807,10618,10619,11462,11463,12338,12339,13246,13247,14186,0,14187,15158,15159,16162,16163,17198,17199,18266,18267,19366,19367, - 19727,19726,18611,18610,17527,17526,16475,16474,15455,15454,14467,1,14466,13511,13510,12587,12586,11695,11694,10835,10834,10009,10007,10005,10003,10001,9999,1,9997,9995,9993,9991,9989,9987,9985,9983,9981,9979,9977,9975,9973,9971,9969,1,9967,9965,9963,9961,9959,9957,9955,9953,9951,9949,9947,9945,9943,9941,9939,1,9937,9935,9933,9931,9929,9927,9925,9923,9921,9919,9917,9915,9913,9911,9909,1,9907,9905,9903,9901,9899,9897,9895,9893,9891,9889,9887,9885,9883,9881,9879,1,9877,9875,9873,9871,9869,9867,9865,9863,9861,9859,9857,9855,9853,9851,9849,1,9847,9845,9843,9841,9839,9837,9835,9833,9831,9829,9827,9825,9823,9821,9819,1,9817,9815,9813,9811,9808,9809,10620,10621,11464,11465,12340,12341,13248,13249,14188,1,14189,15160,15161,16164,16165,17200,17201,18268,18269,19368,19369, - 19725,19724,18609,18608,17525,17524,16473,16472,15453,15452,14465,0,14464,13509,13508,12585,12584,11693,11692,10832,10830,10828,10826,10824,10822,10820,10818,0,10816,10814,10812,10810,10808,10806,10804,10802,10800,10798,10796,10794,10792,10790,10788,0,10786,10784,10782,10780,10778,10776,10774,10772,10770,10768,10766,10764,10762,10760,10758,0,10756,10754,10752,10750,10748,10746,10744,10742,10740,10738,10736,10734,10732,10730,10728,0,10726,10724,10722,10720,10718,10716,10714,10712,10710,10708,10706,10704,10702,10700,10698,0,10696,10694,10692,10690,10688,10686,10684,10682,10680,10678,10676,10674,10672,10670,10668,0,10666,10664,10662,10660,10658,10656,10654,10652,10650,10648,10646,10644,10642,10640,10638,0,10636,10634,10632,10630,10628,10626,10622,10623,11466,11467,12342,12343,13250,13251,14190,0,14191,15162,15163,16166,16167,17202,17203,18270,18271,19370,19371, - 19723,19722,18607,18606,17523,17522,16471,16470,15451,15450,14463,1,14462,13507,13506,12583,12582,11691,11690,10833,10831,10829,10827,10825,10823,10821,10819,1,10817,10815,10813,10811,10809,10807,10805,10803,10801,10799,10797,10795,10793,10791,10789,1,10787,10785,10783,10781,10779,10777,10775,10773,10771,10769,10767,10765,10763,10761,10759,1,10757,10755,10753,10751,10749,10747,10745,10743,10741,10739,10737,10735,10733,10731,10729,1,10727,10725,10723,10721,10719,10717,10715,10713,10711,10709,10707,10705,10703,10701,10699,1,10697,10695,10693,10691,10689,10687,10685,10683,10681,10679,10677,10675,10673,10671,10669,1,10667,10665,10663,10661,10659,10657,10655,10653,10651,10649,10647,10645,10643,10641,10639,1,10637,10635,10633,10631,10629,10627,10624,10625,11468,11469,12344,12345,13252,13253,14192,1,14193,15164,15165,16168,16169,17204,17205,18272,18273,19372,19373, - 19721,19720,18605,18604,17521,17520,16469,16468,15449,15448,14461,0,14460,13505,13504,12581,12580,11688,11686,11684,11682,11680,11678,11676,11674,11672,11670,0,11668,11666,11664,11662,11660,11658,11656,11654,11652,11650,11648,11646,11644,11642,11640,0,11638,11636,11634,11632,11630,11628,11626,11624,11622,11620,11618,11616,11614,11612,11610,0,11608,11606,11604,11602,11600,11598,11596,11594,11592,11590,11588,11586,11584,11582,11580,0,11578,11576,11574,11572,11570,11568,11566,11564,11562,11560,11558,11556,11554,11552,11550,0,11548,11546,11544,11542,11540,11538,11536,11534,11532,11530,11528,11526,11524,11522,11520,0,11518,11516,11514,11512,11510,11508,11506,11504,11502,11500,11498,11496,11494,11492,11490,0,11488,11486,11484,11482,11480,11478,11476,11474,11470,11471,12346,12347,13254,13255,14194,0,14195,15166,15167,16170,16171,17206,17207,18274,18275,19374,19375, - 19719,19718,18603,18602,17519,17518,16467,16466,15447,15446,14459,1,14458,13503,13502,12579,12578,11689,11687,11685,11683,11681,11679,11677,11675,11673,11671,1,11669,11667,11665,11663,11661,11659,11657,11655,11653,11651,11649,11647,11645,11643,11641,1,11639,11637,11635,11633,11631,11629,11627,11625,11623,11621,11619,11617,11615,11613,11611,1,11609,11607,11605,11603,11601,11599,11597,11595,11593,11591,11589,11587,11585,11583,11581,1,11579,11577,11575,11573,11571,11569,11567,11565,11563,11561,11559,11557,11555,11553,11551,1,11549,11547,11545,11543,11541,11539,11537,11535,11533,11531,11529,11527,11525,11523,11521,1,11519,11517,11515,11513,11511,11509,11507,11505,11503,11501,11499,11497,11495,11493,11491,1,11489,11487,11485,11483,11481,11479,11477,11475,11472,11473,12348,12349,13256,13257,14196,1,14197,15168,15169,16172,16173,17208,17209,18276,18277,19376,19377, - 19717,19716,18601,18600,17517,17516,16465,16464,15445,15444,14457,0,14456,13501,13500,12576,12574,12572,12570,12568,12566,12564,12562,12560,12558,12556,12554,0,12552,12550,12548,12546,12544,12542,12540,12538,12536,12534,12532,12530,12528,12526,12524,0,12522,12520,12518,12516,12514,12512,12510,12508,12506,12504,12502,12500,12498,12496,12494,0,12492,12490,12488,12486,12484,12482,12480,12478,12476,12474,12472,12470,12468,12466,12464,0,12462,12460,12458,12456,12454,12452,12450,12448,12446,12444,12442,12440,12438,12436,12434,0,12432,12430,12428,12426,12424,12422,12420,12418,12416,12414,12412,12410,12408,12406,12404,0,12402,12400,12398,12396,12394,12392,12390,12388,12386,12384,12382,12380,12378,12376,12374,0,12372,12370,12368,12366,12364,12362,12360,12358,12356,12354,12350,12351,13258,13259,14198,0,14199,15170,15171,16174,16175,17210,17211,18278,18279,19378,19379, - 19715,19714,18599,18598,17515,17514,16463,16462,15443,15442,14455,1,14454,13499,13498,12577,12575,12573,12571,12569,12567,12565,12563,12561,12559,12557,12555,1,12553,12551,12549,12547,12545,12543,12541,12539,12537,12535,12533,12531,12529,12527,12525,1,12523,12521,12519,12517,12515,12513,12511,12509,12507,12505,12503,12501,12499,12497,12495,1,12493,12491,12489,12487,12485,12483,12481,12479,12477,12475,12473,12471,12469,12467,12465,1,12463,12461,12459,12457,12455,12453,12451,12449,12447,12445,12443,12441,12439,12437,12435,1,12433,12431,12429,12427,12425,12423,12421,12419,12417,12415,12413,12411,12409,12407,12405,1,12403,12401,12399,12397,12395,12393,12391,12389,12387,12385,12383,12381,12379,12377,12375,1,12373,12371,12369,12367,12365,12363,12361,12359,12357,12355,12352,12353,13260,13261,14200,1,14201,15172,15173,16176,16177,17212,17213,18280,18281,19380,19381, - 19713,19712,18597,18596,17513,17512,16461,16460,15441,15440,14453,0,14452,13496,13494,13492,13490,13488,13486,13484,13482,13480,13478,13476,13474,13472,13470,0,13468,13466,13464,13462,13460,13458,13456,13454,13452,13450,13448,13446,13444,13442,13440,0,13438,13436,13434,13432,13430,13428,13426,13424,13422,13420,13418,13416,13414,13412,13410,0,13408,13406,13404,13402,13400,13398,13396,13394,13392,13390,13388,13386,13384,13382,13380,0,13378,13376,13374,13372,13370,13368,13366,13364,13362,13360,13358,13356,13354,13352,13350,0,13348,13346,13344,13342,13340,13338,13336,13334,13332,13330,13328,13326,13324,13322,13320,0,13318,13316,13314,13312,13310,13308,13306,13304,13302,13300,13298,13296,13294,13292,13290,0,13288,13286,13284,13282,13280,13278,13276,13274,13272,13270,13268,13266,13262,13263,14202,0,14203,15174,15175,16178,16179,17214,17215,18282,18283,19382,19383, - 19711,19710,18595,18594,17511,17510,16459,16458,15439,15438,14451,1,14450,13497,13495,13493,13491,13489,13487,13485,13483,13481,13479,13477,13475,13473,13471,1,13469,13467,13465,13463,13461,13459,13457,13455,13453,13451,13449,13447,13445,13443,13441,1,13439,13437,13435,13433,13431,13429,13427,13425,13423,13421,13419,13417,13415,13413,13411,1,13409,13407,13405,13403,13401,13399,13397,13395,13393,13391,13389,13387,13385,13383,13381,1,13379,13377,13375,13373,13371,13369,13367,13365,13363,13361,13359,13357,13355,13353,13351,1,13349,13347,13345,13343,13341,13339,13337,13335,13333,13331,13329,13327,13325,13323,13321,1,13319,13317,13315,13313,13311,13309,13307,13305,13303,13301,13299,13297,13295,13293,13291,1,13289,13287,13285,13283,13281,13279,13277,13275,13273,13271,13269,13267,13264,13265,14204,1,14205,15176,15177,16180,16181,17216,17217,18284,18285,19384,19385, - 19709,19708,18593,18592,17509,17508,16457,16456,15437,15436,14448,0,14446,14444,14442,14440,14438,14436,14434,14432,14430,14428,14426,14424,14422,14420,14418,0,14416,14414,14412,14410,14408,14406,14404,14402,14400,14398,14396,14394,14392,14390,14388,0,14386,14384,14382,14380,14378,14376,14374,14372,14370,14368,14366,14364,14362,14360,14358,0,14356,14354,14352,14350,14348,14346,14344,14342,14340,14338,14336,14334,14332,14330,14328,0,14326,14324,14322,14320,14318,14316,14314,14312,14310,14308,14306,14304,14302,14300,14298,0,14296,14294,14292,14290,14288,14286,14284,14282,14280,14278,14276,14274,14272,14270,14268,0,14266,14264,14262,14260,14258,14256,14254,14252,14250,14248,14246,14244,14242,14240,14238,0,14236,14234,14232,14230,14228,14226,14224,14222,14220,14218,14216,14214,14212,14210,14206,0,14207,15178,15179,16182,16183,17218,17219,18286,18287,19386,19387, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 19707,19706,18591,18590,17507,17506,16455,16454,15435,15434,14449,0,14447,14445,14443,14441,14439,14437,14435,14433,14431,14429,14427,14425,14423,14421,14419,0,14417,14415,14413,14411,14409,14407,14405,14403,14401,14399,14397,14395,14393,14391,14389,0,14387,14385,14383,14381,14379,14377,14375,14373,14371,14369,14367,14365,14363,14361,14359,0,14357,14355,14353,14351,14349,14347,14345,14343,14341,14339,14337,14335,14333,14331,14329,0,14327,14325,14323,14321,14319,14317,14315,14313,14311,14309,14307,14305,14303,14301,14299,0,14297,14295,14293,14291,14289,14287,14285,14283,14281,14279,14277,14275,14273,14271,14269,0,14267,14265,14263,14261,14259,14257,14255,14253,14251,14249,14247,14245,14243,14241,14239,0,14237,14235,14233,14231,14229,14227,14225,14223,14221,14219,14217,14215,14213,14211,14208,0,14209,15180,15181,16184,16185,17220,17221,18288,18289,19388,19389, - 19705,19704,18589,18588,17505,17504,16453,16452,15432,15430,15428,1,15426,15424,15422,15420,15418,15416,15414,15412,15410,15408,15406,15404,15402,15400,15398,1,15396,15394,15392,15390,15388,15386,15384,15382,15380,15378,15376,15374,15372,15370,15368,1,15366,15364,15362,15360,15358,15356,15354,15352,15350,15348,15346,15344,15342,15340,15338,1,15336,15334,15332,15330,15328,15326,15324,15322,15320,15318,15316,15314,15312,15310,15308,1,15306,15304,15302,15300,15298,15296,15294,15292,15290,15288,15286,15284,15282,15280,15278,1,15276,15274,15272,15270,15268,15266,15264,15262,15260,15258,15256,15254,15252,15250,15248,1,15246,15244,15242,15240,15238,15236,15234,15232,15230,15228,15226,15224,15222,15220,15218,1,15216,15214,15212,15210,15208,15206,15204,15202,15200,15198,15196,15194,15192,15190,15188,1,15186,15182,15183,16186,16187,17222,17223,18290,18291,19390,19391, - 19703,19702,18587,18586,17503,17502,16451,16450,15433,15431,15429,0,15427,15425,15423,15421,15419,15417,15415,15413,15411,15409,15407,15405,15403,15401,15399,0,15397,15395,15393,15391,15389,15387,15385,15383,15381,15379,15377,15375,15373,15371,15369,0,15367,15365,15363,15361,15359,15357,15355,15353,15351,15349,15347,15345,15343,15341,15339,0,15337,15335,15333,15331,15329,15327,15325,15323,15321,15319,15317,15315,15313,15311,15309,0,15307,15305,15303,15301,15299,15297,15295,15293,15291,15289,15287,15285,15283,15281,15279,0,15277,15275,15273,15271,15269,15267,15265,15263,15261,15259,15257,15255,15253,15251,15249,0,15247,15245,15243,15241,15239,15237,15235,15233,15231,15229,15227,15225,15223,15221,15219,0,15217,15215,15213,15211,15209,15207,15205,15203,15201,15199,15197,15195,15193,15191,15189,0,15187,15184,15185,16188,16189,17224,17225,18292,18293,19392,19393, - 19701,19700,18585,18584,17501,17500,16448,16446,16444,16442,16440,1,16438,16436,16434,16432,16430,16428,16426,16424,16422,16420,16418,16416,16414,16412,16410,1,16408,16406,16404,16402,16400,16398,16396,16394,16392,16390,16388,16386,16384,16382,16380,1,16378,16376,16374,16372,16370,16368,16366,16364,16362,16360,16358,16356,16354,16352,16350,1,16348,16346,16344,16342,16340,16338,16336,16334,16332,16330,16328,16326,16324,16322,16320,1,16318,16316,16314,16312,16310,16308,16306,16304,16302,16300,16298,16296,16294,16292,16290,1,16288,16286,16284,16282,16280,16278,16276,16274,16272,16270,16268,16266,16264,16262,16260,1,16258,16256,16254,16252,16250,16248,16246,16244,16242,16240,16238,16236,16234,16232,16230,1,16228,16226,16224,16222,16220,16218,16216,16214,16212,16210,16208,16206,16204,16202,16200,1,16198,16196,16194,16190,16191,17226,17227,18294,18295,19394,19395, - 19699,19698,18583,18582,17499,17498,16449,16447,16445,16443,16441,0,16439,16437,16435,16433,16431,16429,16427,16425,16423,16421,16419,16417,16415,16413,16411,0,16409,16407,16405,16403,16401,16399,16397,16395,16393,16391,16389,16387,16385,16383,16381,0,16379,16377,16375,16373,16371,16369,16367,16365,16363,16361,16359,16357,16355,16353,16351,0,16349,16347,16345,16343,16341,16339,16337,16335,16333,16331,16329,16327,16325,16323,16321,0,16319,16317,16315,16313,16311,16309,16307,16305,16303,16301,16299,16297,16295,16293,16291,0,16289,16287,16285,16283,16281,16279,16277,16275,16273,16271,16269,16267,16265,16263,16261,0,16259,16257,16255,16253,16251,16249,16247,16245,16243,16241,16239,16237,16235,16233,16231,0,16229,16227,16225,16223,16221,16219,16217,16215,16213,16211,16209,16207,16205,16203,16201,0,16199,16197,16195,16192,16193,17228,17229,18296,18297,19396,19397, - 19697,19696,18581,18580,17496,17494,17492,17490,17488,17486,17484,1,17482,17480,17478,17476,17474,17472,17470,17468,17466,17464,17462,17460,17458,17456,17454,1,17452,17450,17448,17446,17444,17442,17440,17438,17436,17434,17432,17430,17428,17426,17424,1,17422,17420,17418,17416,17414,17412,17410,17408,17406,17404,17402,17400,17398,17396,17394,1,17392,17390,17388,17386,17384,17382,17380,17378,17376,17374,17372,17370,17368,17366,17364,1,17362,17360,17358,17356,17354,17352,17350,17348,17346,17344,17342,17340,17338,17336,17334,1,17332,17330,17328,17326,17324,17322,17320,17318,17316,17314,17312,17310,17308,17306,17304,1,17302,17300,17298,17296,17294,17292,17290,17288,17286,17284,17282,17280,17278,17276,17274,1,17272,17270,17268,17266,17264,17262,17260,17258,17256,17254,17252,17250,17248,17246,17244,1,17242,17240,17238,17236,17234,17230,17231,18298,18299,19398,19399, - 19695,19694,18579,18578,17497,17495,17493,17491,17489,17487,17485,0,17483,17481,17479,17477,17475,17473,17471,17469,17467,17465,17463,17461,17459,17457,17455,0,17453,17451,17449,17447,17445,17443,17441,17439,17437,17435,17433,17431,17429,17427,17425,0,17423,17421,17419,17417,17415,17413,17411,17409,17407,17405,17403,17401,17399,17397,17395,0,17393,17391,17389,17387,17385,17383,17381,17379,17377,17375,17373,17371,17369,17367,17365,0,17363,17361,17359,17357,17355,17353,17351,17349,17347,17345,17343,17341,17339,17337,17335,0,17333,17331,17329,17327,17325,17323,17321,17319,17317,17315,17313,17311,17309,17307,17305,0,17303,17301,17299,17297,17295,17293,17291,17289,17287,17285,17283,17281,17279,17277,17275,0,17273,17271,17269,17267,17265,17263,17261,17259,17257,17255,17253,17251,17249,17247,17245,0,17243,17241,17239,17237,17235,17232,17233,18300,18301,19400,19401, - 19693,19692,18576,18574,18572,18570,18568,18566,18564,18562,18560,1,18558,18556,18554,18552,18550,18548,18546,18544,18542,18540,18538,18536,18534,18532,18530,1,18528,18526,18524,18522,18520,18518,18516,18514,18512,18510,18508,18506,18504,18502,18500,1,18498,18496,18494,18492,18490,18488,18486,18484,18482,18480,18478,18476,18474,18472,18470,1,18468,18466,18464,18462,18460,18458,18456,18454,18452,18450,18448,18446,18444,18442,18440,1,18438,18436,18434,18432,18430,18428,18426,18424,18422,18420,18418,18416,18414,18412,18410,1,18408,18406,18404,18402,18400,18398,18396,18394,18392,18390,18388,18386,18384,18382,18380,1,18378,18376,18374,18372,18370,18368,18366,18364,18362,18360,18358,18356,18354,18352,18350,1,18348,18346,18344,18342,18340,18338,18336,18334,18332,18330,18328,18326,18324,18322,18320,1,18318,18316,18314,18312,18310,18308,18306,18302,18303,19402,19403, - 19691,19690,18577,18575,18573,18571,18569,18567,18565,18563,18561,0,18559,18557,18555,18553,18551,18549,18547,18545,18543,18541,18539,18537,18535,18533,18531,0,18529,18527,18525,18523,18521,18519,18517,18515,18513,18511,18509,18507,18505,18503,18501,0,18499,18497,18495,18493,18491,18489,18487,18485,18483,18481,18479,18477,18475,18473,18471,0,18469,18467,18465,18463,18461,18459,18457,18455,18453,18451,18449,18447,18445,18443,18441,0,18439,18437,18435,18433,18431,18429,18427,18425,18423,18421,18419,18417,18415,18413,18411,0,18409,18407,18405,18403,18401,18399,18397,18395,18393,18391,18389,18387,18385,18383,18381,0,18379,18377,18375,18373,18371,18369,18367,18365,18363,18361,18359,18357,18355,18353,18351,0,18349,18347,18345,18343,18341,18339,18337,18335,18333,18331,18329,18327,18325,18323,18321,0,18319,18317,18315,18313,18311,18309,18307,18304,18305,19404,19405, - 19688,19686,19684,19682,19680,19678,19676,19674,19672,19670,19668,1,19666,19664,19662,19660,19658,19656,19654,19652,19650,19648,19646,19644,19642,19640,19638,1,19636,19634,19632,19630,19628,19626,19624,19622,19620,19618,19616,19614,19612,19610,19608,1,19606,19604,19602,19600,19598,19596,19594,19592,19590,19588,19586,19584,19582,19580,19578,1,19576,19574,19572,19570,19568,19566,19564,19562,19560,19558,19556,19554,19552,19550,19548,1,19546,19544,19542,19540,19538,19536,19534,19532,19530,19528,19526,19524,19522,19520,19518,1,19516,19514,19512,19510,19508,19506,19504,19502,19500,19498,19496,19494,19492,19490,19488,1,19486,19484,19482,19480,19478,19476,19474,19472,19470,19468,19466,19464,19462,19460,19458,1,19456,19454,19452,19450,19448,19446,19444,19442,19440,19438,19436,19434,19432,19430,19428,1,19426,19424,19422,19420,19418,19416,19414,19412,19410,19406,19407, - 19689,19687,19685,19683,19681,19679,19677,19675,19673,19671,19669,0,19667,19665,19663,19661,19659,19657,19655,19653,19651,19649,19647,19645,19643,19641,19639,0,19637,19635,19633,19631,19629,19627,19625,19623,19621,19619,19617,19615,19613,19611,19609,0,19607,19605,19603,19601,19599,19597,19595,19593,19591,19589,19587,19585,19583,19581,19579,0,19577,19575,19573,19571,19569,19567,19565,19563,19561,19559,19557,19555,19553,19551,19549,0,19547,19545,19543,19541,19539,19537,19535,19533,19531,19529,19527,19525,19523,19521,19519,0,19517,19515,19513,19511,19509,19507,19505,19503,19501,19499,19497,19495,19493,19491,19489,0,19487,19485,19483,19481,19479,19477,19475,19473,19471,19469,19467,19465,19463,19461,19459,0,19457,19455,19453,19451,19449,19447,19445,19443,19441,19439,19437,19435,19433,19431,19429,0,19427,19425,19423,19421,19419,19417,19415,19413,19411,19408,19409 -}; - -static int CompactAztecMap[] = { /* 27 x 27 data grid */ - 609,608,411,413,415,417,419,421,423,425,427,429,431,433,435,437,439,441,443,445,447,449,451,453,455,457,459, - 607,606,410,412,414,416,418,420,422,424,426,428,430,432,434,436,438,440,442,444,446,448,450,452,454,456,458, - 605,604,409,408,243,245,247,249,251,253,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,460,461, - 603,602,407,406,242,244,246,248,250,252,254,256,258,260,262,264,266,268,270,272,274,276,278,280,282,462,463, - 601,600,405,404,241,240,107,109,111,113,115,117,119,121,123,125,127,129,131,133,135,137,139,284,285,464,465, - 599,598,403,402,239,238,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,286,287,466,467, - 597,596,401,400,237,236,105,104,3,5,7,9,11,13,15,17,19,21,23,25,27,140,141,288,289,468,469, - 595,594,399,398,235,234,103,102,2,4,6,8,10,12,14,16,18,20,22,24,26,142,143,290,291,470,471, - 593,592,397,396,233,232,101,100,1,1,2000,2001,2002,2003,2004,2005,2006,0,1,28,29,144,145,292,293,472,473, - 591,590,395,394,231,230,99,98,1,1,1,1,1,1,1,1,1,1,1,30,31,146,147,294,295,474,475, - 589,588,393,392,229,228,97,96,2027,1,0,0,0,0,0,0,0,1,2007,32,33,148,149,296,297,476,477, - 587,586,391,390,227,226,95,94,2026,1,0,1,1,1,1,1,0,1,2008,34,35,150,151,298,299,478,479, - 585,584,389,388,225,224,93,92,2025,1,0,1,0,0,0,1,0,1,2009,36,37,152,153,300,301,480,481, - 583,582,387,386,223,222,91,90,2024,1,0,1,0,1,0,1,0,1,2010,38,39,154,155,302,303,482,483, - 581,580,385,384,221,220,89,88,2023,1,0,1,0,0,0,1,0,1,2011,40,41,156,157,304,305,484,485, - 579,578,383,382,219,218,87,86,2022,1,0,1,1,1,1,1,0,1,2012,42,43,158,159,306,307,486,487, - 577,576,381,380,217,216,85,84,2021,1,0,0,0,0,0,0,0,1,2013,44,45,160,161,308,309,488,489, - 575,574,379,378,215,214,83,82,0,1,1,1,1,1,1,1,1,1,1,46,47,162,163,310,311,490,491, - 573,572,377,376,213,212,81,80,0,0,2020,2019,2018,2017,2016,2015,2014,0,0,48,49,164,165,312,313,492,493, - 571,570,375,374,211,210,78,76,74,72,70,68,66,64,62,60,58,56,54,50,51,166,167,314,315,494,495, - 569,568,373,372,209,208,79,77,75,73,71,69,67,65,63,61,59,57,55,52,53,168,169,316,317,496,497, - 567,566,371,370,206,204,202,200,198,196,194,192,190,188,186,184,182,180,178,176,174,170,171,318,319,498,499, - 565,564,369,368,207,205,203,201,199,197,195,193,191,189,187,185,183,181,179,177,175,172,173,320,321,500,501, - 563,562,366,364,362,360,358,356,354,352,350,348,346,344,342,340,338,336,334,332,330,328,326,322,323,502,503, - 561,560,367,365,363,361,359,357,355,353,351,349,347,345,343,341,339,337,335,333,331,329,327,324,325,504,505, - 558,556,554,552,550,548,546,544,542,540,538,536,534,532,530,528,526,524,522,520,518,516,514,512,510,506,507, - 559,557,555,553,551,549,547,545,543,541,539,537,535,533,531,529,527,525,523,521,519,517,515,513,511,508,509 -}; - -int AztecCodeSet[128] = { /* From Table 2 */ - 32, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 12, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 4, 4, 4, 4, 4, 23, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 24, 8, 24, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 8, - 8, 8, 8, 8, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 4, 8, 4, 4, 4, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 8, 4, 8, 4, 4 -}; - -int AztecSymbolChar[128] = { /* From Table 2 */ - 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 300, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 15, 16, 17, 18, 19, 1, 6, 7, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 301, 18, 302, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 21, 22, - 23, 24, 25, 26, 20, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 27, 21, 28, 22, 23, 24, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, - 25, 26, 27, 29, 25, 30, 26, 27 -}; - -/* Problem characters are: - 300: Carriage Return (ASCII 13) - 301: Comma (ASCII 44) - 302: Full Stop (ASCII 46) -*/ - -static char *hexbit[32] = {"00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111", "01000", "01001", - "01010", "01011", "01100", "01101", "01110", "01111", "10000", "10001", "10010", "10011", "10100", "10101", - "10110", "10111", "11000", "11001", "11010", "11011", "11100", "11101", "11110", "11111" -}; - -static char *pentbit[16] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", - "1010", "1011", "1100", "1101", "1110", "1111" -}; - -static char *tribit[8] = {"000", "001", "010", "011", "100", "101", "110", "111"}; - -static int AztecSizes[32] = { /* Codewords per symbol */ - 21, 48, 60, 88, 120, 156, 196, 240, 230, 272, 316, 364, 416, 470, 528, 588, 652, 720, 790, - 864, 940, 1020, 920, 992, 1066, 1144, 1224, 1306, 1392, 1480, 1570, 1664 -}; - -static int AztecCompactSizes[4] = { 17, 40, 51, 76 }; - -static int Aztec10DataSizes[32] = { /* Data bits per symbol maximum with 10% error correction */ - 96, 246, 408, 616, 840, 1104, 1392, 1704, 2040, 2420, 2820, 3250, 3720, 4200, 4730, - 5270, 5840, 6450, 7080, 7750, 8430, 9150, 9900, 10680, 11484, 12324, 13188, 14076, - 15000, 15948, 16920, 17940 -}; - -static int Aztec23DataSizes[32] = { /* Data bits per symbol maximum with 23% error correction */ - 84, 204, 352, 520, 720, 944, 1184, 1456, 1750, 2070, 2410, 2780, 3180, 3590, 4040, - 4500, 5000, 5520, 6060, 6630, 7210, 7830, 8472, 9132, 9816, 10536, 11280, 12036, - 12828, 13644, 14472, 15348 -}; - -static int Aztec36DataSizes[32] = { /* Data bits per symbol maximum with 36% error correction */ - 66, 168, 288, 432, 592, 776, 984, 1208, 1450, 1720, 2000, 2300, 2640, 2980, 3350, - 3740, 4150, 4580, 5030, 5500, 5990, 6500, 7032, 7584, 8160, 8760, 9372, 9996, 10656, - 11340, 12024, 12744 -}; - -static int Aztec50DataSizes[32] = { /* Data bits per symbol maximum with 50% error correction */ - 48, 126, 216, 328, 456, 600, 760, 936, 1120, 1330, 1550, 1790, 2050, 2320, 2610, - 2910, 3230, 3570, 3920, 4290, 4670, 5070, 5484, 5916, 6360, 6828, 7308, 7800, 8316, - 8844, 9384, 9948 -}; - -static int AztecCompact10DataSizes [4] = { 78, 198, 336, 520 }; -static int AztecCompact23DataSizes [4] = { 66, 168, 288, 440 }; -static int AztecCompact36DataSizes [4] = { 48, 138, 232, 360 }; -static int AztecCompact50DataSizes [4] = { 36, 102, 176, 280 }; - -static int AztecOffset[32] = { - 66, 64, 62, 60, 57, 55, 53, 51, 49, 47, 45, 42, 40, 38, 36, 34, 32, 30, 28, 25, 23, 21, - 19, 17, 15, 13, 10, 8, 6, 4, 2, 0 -}; - -static int AztecCompactOffset[4] = { 6, 4, 2, 0 }; diff --git a/3rdparty/zint-2.4.4/backend/code.c b/3rdparty/zint-2.4.4/backend/code.c deleted file mode 100644 index 553b972..0000000 --- a/3rdparty/zint-2.4.4/backend/code.c +++ /dev/null @@ -1,537 +0,0 @@ -/* code.c - Handles Code 11, 39, 39+ and 93 */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* In version 0.5 this file was 1,553 lines long! */ - -#include -#include -#include -#include "common.h" - -#define SODIUM "0123456789-" -#define SILVER "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd" - -static char *C11Table[11] = {"111121", "211121", "121121", "221111", "112121", "212111", "122111", - "111221", "211211", "211111", "112111"}; - - -/* Code 39 tables checked against ISO/IEC 16388:2007 */ - -/* Incorporates Table A1 */ - -static char *C39Table[43] = { "1112212111", "2112111121", "1122111121", "2122111111", "1112211121", - "2112211111", "1122211111", "1112112121", "2112112111", "1122112111", "2111121121", - "1121121121", "2121121111", "1111221121", "2111221111", "1121221111", "1111122121", - "2111122111", "1121122111", "1111222111", "2111111221", "1121111221", "2121111211", - "1111211221", "2111211211", "1121211211", "1111112221", "2111112211", "1121112211", - "1111212211", "2211111121", "1221111121", "2221111111", "1211211121", "2211211111", - "1221211111", "1211112121", "2211112111", "1221112111", "1212121111", "1212111211", - "1211121211", "1112121211"}; -/* Code 39 character assignments (Table 1) */ - -static char *EC39Ctrl[128] = {"%U", "$A", "$B", "$C", "$D", "$E", "$F", "$G", "$H", "$I", "$J", "$K", - "$L", "$M", "$N", "$O", "$P", "$Q", "$R", "$S", "$T", "$U", "$V", "$W", "$X", "$Y", "$Z", - "%A", "%B", "%C", "%D", "%E", " ", "/A", "/B", "/C", "/D", "/E", "/F", "/G", "/H", "/I", "/J", - "/K", "/L", "-", ".", "/O", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "/Z", "%F", - "%G", "%H", "%I", "%J", "%V", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", - "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "%K", "%L", "%M", "%N", "%O", - "%W", "+A", "+B", "+C", "+D", "+E", "+F", "+G", "+H", "+I", "+J", "+K", "+L", "+M", "+N", "+O", - "+P", "+Q", "+R", "+S", "+T", "+U", "+V", "+W", "+X", "+Y", "+Z", "%P", "%Q", "%R", "%S", "%T"}; -/* Encoding the full ASCII character set in Code 39 (Table A2) */ - -static char *C93Ctrl[128] = {"bU", "aA", "aB", "aC", "aD", "aE", "aF", "aG", "aH", "aI", "aJ", "aK", - "aL", "aM", "aN", "aO", "aP", "aQ", "aR", "aS", "aT", "aU", "aV", "aW", "aX", "aY", "aZ", - "bA", "bB", "bC", "bD", "bE", " ", "cA", "cB", "cC", "cD", "cE", "cF", "cG", "cH", "cI", "cJ", - "cK", "cL", "cM", "cN", "cO", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "cZ", "bF", - "bG", "bH", "bI", "bJ", "bV", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", - "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "bK", "bL", "bM", "bN", "bO", - "bW", "dA", "dB", "dC", "dD", "dE", "dF", "dG", "dH", "dI", "dJ", "dK", "dL", "dM", "dN", "dO", - "dP", "dQ", "dR", "dS", "dT", "dU", "dV", "dW", "dX", "dY", "dZ", "bP", "bQ", "bR", "bS", "bT"}; - -static char *C93Table[47] = {"131112", "111213", "111312", "111411", "121113", "121212", "121311", - "111114", "131211", "141111", "211113", "211212", "211311", "221112", "221211", "231111", - "112113", "112212", "112311", "122112", "132111", "111123", "111222", "111321", "121122", - "131121", "212112", "212211", "211122", "211221", "221121", "222111", "112122", "112221", - "122121", "123111", "121131", "311112", "311211", "321111", "112131", "113121", "211131", - "121221", "312111", "311121", "122211"}; - -/* Global Variables for Channel Code */ -int S[11], B[11]; -long value; -long target_value; -char pattern[30]; - -/* Function Prototypes */ -void NextS(int Chan, int i, int MaxS, int MaxB); -void NextB(int Chan, int i, int MaxB, int MaxS); - -/* *********************** CODE 11 ******************** */ - -int code_11(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 11 */ - - int i; - int h, c_digit, c_weight, c_count, k_digit, k_weight, k_count; - int weight[128], error_number; - char dest[1024]; /* 6 + 121 * 6 + 2 * 6 + 5 + 1 ~ 1024*/ - char checkstr[3]; - - error_number = 0; - - if(length > 121) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(SODIUM, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - c_weight = 1; - c_count = 0; - k_weight = 1; - k_count = 0; - - /* start character */ - strcpy(dest, "112211"); - - /* Draw main body of barcode */ - for(i = 0; i < length; i++) { - lookup(SODIUM, C11Table, source[i], dest); - if(source[i] == '-') - weight[i] = 10; - else - weight[i] = ctoi(source[i]); - } - - /* Calculate C checksum */ - for(h = length - 1; h >= 0; h--) { - c_count += (c_weight * weight[h]); - c_weight++; - - if(c_weight > 10) { - c_weight = 1; - } - } - c_digit = c_count % 11; - - weight[length] = c_digit; - - /* Calculate K checksum */ - for(h = length; h >= 0; h--) { - k_count += (k_weight * weight[h]); - k_weight++; - - if(k_weight > 9) { - k_weight = 1; - } - } - k_digit = k_count % 11; - - checkstr[0] = itoc(c_digit); - checkstr[1] = itoc(k_digit); - if(checkstr[0] == 'A') { checkstr[0] = '-'; } - if(checkstr[1] == 'A') { checkstr[1] = '-'; } - checkstr[2] = '\0'; - lookup(SODIUM, C11Table, checkstr[0], dest); - lookup(SODIUM, C11Table, checkstr[1], dest); - - /* Stop character */ - concat (dest, "11221"); - - expand(symbol, dest); - - ustrcpy(symbol->text, source); - uconcat(symbol->text, (unsigned char*)checkstr); - return error_number; -} - -int c39(struct zint_symbol *symbol, unsigned char source[], unsigned int length) -{ /* Code 39 */ - unsigned int i; - unsigned int counter = 0; - char check_digit; - int error_number = 0; - char dest[775]; - char localstr[2] = { 0 }; - - if((symbol->option_2 < 0) || (symbol->option_2 > 1)) { - symbol->option_2 = 0; - } - - if((symbol->symbology == BARCODE_LOGMARS) && (length > 59)) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } else if(length > 74) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - to_upper(source); - error_number = is_sane(SILVER , source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - /* Start character */ - strcpy(dest, "1211212111"); - - for(i = 0; i < length; i++) { - lookup(SILVER, C39Table, source[i], dest); - counter += posn(SILVER, source[i]); - } - - if((symbol->symbology == BARCODE_LOGMARS) || (symbol->option_2 == 1)) { - - counter = counter % 43; - if(counter < 10) { - check_digit = itoc(counter); - } else { - if(counter < 36) { - check_digit = (counter - 10) + 'A'; - } else { - switch(counter) { - case 36: check_digit = '-'; break; - case 37: check_digit = '.'; break; - case 38: check_digit = ' '; break; - case 39: check_digit = '$'; break; - case 40: check_digit = '/'; break; - case 41: check_digit = '+'; break; - case 42: check_digit = 37; break; - default: check_digit = ' '; break; /* Keep compiler happy */ - } - } - } - lookup(SILVER, C39Table, check_digit, dest); - - /* Display a space check digit as _, otherwise it looks like an error */ - if(check_digit == ' ') { - check_digit = '_'; - } - - localstr[0] = check_digit; - localstr[1] = '\0'; - } - - /* Stop character */ - concat (dest, "121121211"); - - if((symbol->symbology == BARCODE_LOGMARS) || (symbol->symbology == BARCODE_HIBC_39)) { - /* LOGMARS uses wider 'wide' bars than normal Code 39 */ - counter = strlen(dest); - for(i = 0; i < counter; i++) { - if(dest[i] == '2') { - dest[i] = '3'; - } - } - } - - expand(symbol, dest); - - if(symbol->symbology == BARCODE_CODE39) { - ustrcpy(symbol->text, (unsigned char*)"*"); - uconcat(symbol->text, source); - uconcat(symbol->text, (unsigned char*)localstr); - uconcat(symbol->text, (unsigned char*)"*"); - } else { - ustrcpy(symbol->text, source); - uconcat(symbol->text, (unsigned char*)localstr); - } - return error_number; -} - -int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Pharmazentral Nummer (PZN) */ - - int i, error_number, zeroes; - unsigned int count, check_digit; - char localstr[10]; - - error_number = 0; - - count = 0; - if(length > 6) { - strcpy(symbol->errtxt, "Input wrong length"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - localstr[0] = '-'; - zeroes = 6 - length + 1; - for(i = 1; i < zeroes; i++) - localstr[i] = '0'; - strcpy(localstr + zeroes, (char *)source); - - for (i = 1; i < 7; i++) { - count += (i + 1) * ctoi(localstr[i]); - } - - check_digit = count%11; - if (check_digit == 11) { check_digit = 0; } - localstr[7] = itoc(check_digit); - localstr[8] = '\0'; - if(localstr[7] == 'A') { - strcpy(symbol->errtxt, "Invalid PZN Data"); - return ERROR_INVALID_DATA1; - } - error_number = c39(symbol, (unsigned char *)localstr, strlen(localstr)); - ustrcpy(symbol->text, (unsigned char *)"PZN"); - uconcat(symbol->text, (unsigned char *)localstr); - return error_number; -} - - -/* ************** EXTENDED CODE 39 *************** */ - -int ec39(struct zint_symbol *symbol, unsigned char source[], unsigned int length) -{ /* Extended Code 39 - ISO/IEC 16388:2007 Annex A */ - - unsigned char buffer[150] = { 0 }; - unsigned int i; - int error_number = 0; - - if(length > 74) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* Creates a buffer string and places control characters into it */ - for(i = 0; i < length; i++) { - if(source[i] > 127) { - /* Cannot encode extended ASCII */ - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ERROR_INVALID_DATA1; - } - concat((char*)buffer, EC39Ctrl[source[i]]); - } - - /* Then sends the buffer to the C39 function */ - error_number = c39(symbol, buffer, ustrlen(buffer)); - - for(i = 0; i < length; i++) - symbol->text[i] = source[i] ? source[i] : ' '; - symbol->text[length] = '\0'; - - return error_number; -} - -/* ******************** CODE 93 ******************* */ - -int c93(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Code 93 is an advancement on Code 39 and the definition is a lot tighter */ - - /* SILVER includes the extra characters a, b, c and d to represent Code 93 specific - shift characters 1, 2, 3 and 4 respectively. These characters are never used by - c39() and ec39() */ - - int i; - int h, weight, c, k, values[128], error_number; - char buffer[220]; - char dest[670]; - char set_copy[] = SILVER; - - error_number = 0; - strcpy(buffer, ""); - - if(length > 107) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* Message Content */ - for (i = 0; i < length; i++) { - if (source[i] > 127) { - /* Cannot encode extended ASCII */ - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ERROR_INVALID_DATA1; - } - concat(buffer, C93Ctrl[source[i]]); - symbol->text[i] = source[i] ? source[i] : ' '; - } - - /* Now we can check the true length of the barcode */ - h = strlen(buffer); - if (h > 107) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - for (i = 0; i < h; i++) { - values[i] = posn(SILVER, buffer[i]); - } - - /* Putting the data into dest[] is not done until after check digits are calculated */ - - /* Check digit C */ - c = 0; - weight = 1; - for (i = h - 1; i >= 0; i--) { - c += values[i] * weight; - weight++; - if (weight == 21) - weight = 1; - } - c = c % 47; - values[h] = c; - buffer[h] = set_copy[c]; - - /* Check digit K */ - k = 0; - weight = 1; - for (i = h; i >= 0; i--) { - k += values[i] * weight; - weight++; - if(weight == 16) - weight = 1; - } - k = k % 47; - buffer[++h] = set_copy[k]; - buffer[++h] = '\0'; - - /* Start character */ - strcpy(dest, "111141"); - - for(i = 0; i < h; i++) { - lookup(SILVER, C93Table, buffer[i], dest); - } - - /* Stop character */ - concat(dest, "1111411"); - expand(symbol, dest); - - symbol->text[length] = set_copy[c]; - symbol->text[length + 1] = set_copy[k]; - symbol->text[length + 2] = '\0'; - - return error_number; -} - -/* NextS() and NextB() are from ANSI/AIM BC12-1998 and are Copyright (c) AIM 1997 */ -/* Their are used here on the understanding that they form part of the specification - for Channel Code and therefore their use is permitted under the following terms - set out in that document: - - "It is the intent and understanding of AIM [t]hat the symbology presented in this - specification is entirely in the public domain and free of all use restrictions, - licenses and fees. AIM USA, its memer companies, or individual officers - assume no liability for the use of this document." */ - -void CheckCharacter() { - int i; - char part[3]; - - if(value == target_value) { - /* Target reached - save the generated pattern */ - strcpy(pattern, "11110"); - for(i = 0; i < 11; i++) { - part[0] = itoc(S[i]); - part[1] = itoc(B[i]); - part[2] = '\0'; - concat(pattern, part); - } - } -} - -void NextB(int Chan, int i, int MaxB, int MaxS) { - int b; - - b = (S[i]+B[i-1]+S[i-1]+B[i-2] > 4)? 1:2; - if (i < Chan+2) { - for (; b <= MaxB; b++) { - B[i] = b; - NextS(Chan,i+1,MaxS,MaxB+1-b); - } - } else if (b <= MaxB) { - B[i] = MaxB; - CheckCharacter(); - value++; - } -} - -void NextS(int Chan, int i, int MaxS, int MaxB) { - int s; - - for (s = (i 7) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - if((symbol->option_2 < 3) || (symbol->option_2 > 8)) { channels = 0; } else { channels = symbol->option_2; } - if(channels == 0) { channels = length + 1; } - if(channels == 2) { channels = 3; } - - for(i = 0; i < length; i++) { - target_value *= 10; - target_value += ctoi((char) source[i]); - } - - switch(channels) { - case 3: if(target_value > 26) { range = 1; } break; - case 4: if(target_value > 292) { range = 1; } break; - case 5: if(target_value > 3493) { range = 1; } break; - case 6: if(target_value > 44072) { range = 1; } break; - case 7: if(target_value > 576688) { range = 1; } break; - case 8: if(target_value > 7742862) { range = 1; } break; - } - if(range) { - strcpy(symbol->errtxt, "Value out of range"); - return ERROR_INVALID_DATA1; - } - - for(i = 0; i < 11; i++) { B[i] = 0; S[i] = 0; } - - B[0] = S[1] = B[1] = S[2] = B[2] = 1; - value = 0; - NextS(channels,3,channels,channels); - - zeroes = channels - 1 - length; - memset(hrt, '0', zeroes); - strcpy(hrt + zeroes, (char *)source); - ustrcpy(symbol->text, (unsigned char *)hrt); - - expand(symbol, pattern); - - return error_number; -} diff --git a/3rdparty/zint-2.4.4/backend/code1.c b/3rdparty/zint-2.4.4/backend/code1.c deleted file mode 100644 index 70f32d0..0000000 --- a/3rdparty/zint-2.4.4/backend/code1.c +++ /dev/null @@ -1,1515 +0,0 @@ -/* code1.c - USS Code One */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "common.h" -#include "code1.h" -#include "reedsol.h" -#include "large.h" -#include -#include -#ifdef __APPLE__ -#include -#else -#include -#endif - -void horiz(struct zint_symbol *symbol, int row_no, int full) -{ - int i; - - if(full) { - for(i = 0; i < symbol->width; i++) { - set_module(symbol, row_no, i); - } - } else { - for(i = 1; i < symbol->width - 1; i++) { - set_module(symbol, row_no, i); - } - } -} - -void central_finder(struct zint_symbol *symbol, int start_row, int row_count, int full_rows) -{ - int i; - - for(i = 0; i < row_count; i++) { - if(i < full_rows) { - horiz(symbol, start_row + (i * 2), 1); - } else { - horiz(symbol, start_row + (i * 2), 0); - if(i != row_count - 1) { - set_module(symbol, start_row + (i * 2) + 1, 1); - set_module(symbol, start_row + (i * 2) + 1, symbol->width - 2); - } - } - } -} - -void vert(struct zint_symbol *symbol, int column, int height, int top) -{ - int i; - - if(top) { - for (i = 0; i < height; i++) { - set_module(symbol, i, column); - } - } else { - for (i = 0; i < height; i++) { - set_module(symbol, symbol->rows - i - 1, column); - } - } -} - -void spigot(struct zint_symbol *symbol, int row_no) -{ - int i; - - for(i = symbol->width - 1; i > 0; i--) { - if(module_is_set(symbol, row_no, i - 1)) { - set_module(symbol, row_no, i); - } - } -} - -int isedi(unsigned char input) -{ - int result = 0; - - if(input == 13) { result = 1; } - if(input == '*') { result = 1; } - if(input == '>') { result = 1; } - if(input == ' ') { result = 1; } - if((input >= '0') && (input <= '9')) { result = 1; } - if((input >= 'A') && (input <= 'Z')) { result = 1; } - - return result; -} - -int dq4bi(unsigned char source[], int sourcelen, int position) -{ - int i; - - for(i = position; isedi(source[position + i]) && ((position + i) < sourcelen); i++); - - if((position + i) == sourcelen) { - /* Reached end of input */ - return 0; - } - - if (source[position + i - 1] == 13) { return 1; } - if (source[position + i - 1] == '*') { return 1; } - if (source[position + i - 1] == '>') { return 1; } - - return 0; -} - -int c1_look_ahead_test(unsigned char source[], int sourcelen, int position, int current_mode, int gs1) -{ - float ascii_count, c40_count, text_count, edi_count, byte_count; - char reduced_char; - int done, best_scheme, best_count, sp; - - /* Step J */ - if(current_mode == C1_ASCII) { - ascii_count = 0.0; - c40_count = 1.0; - text_count = 1.0; - edi_count = 1.0; - byte_count = 2.0; - } else { - ascii_count = 1.0; - c40_count = 2.0; - text_count = 2.0; - edi_count = 2.0; - byte_count = 3.0; - } - - switch(current_mode) { - case C1_C40: c40_count = 0.0; break; - case C1_TEXT: text_count = 0.0; break; - case C1_BYTE: byte_count = 0.0; break; - case C1_EDI: edi_count = 0.0; break; - } - - for(sp = position; (sp < sourcelen) && (sp <= (position + 8)); sp++) { - - if(source[sp] <= 127) { reduced_char = source[sp]; } else { reduced_char = source[sp] - 127; } - - /* Step L */ - if((source[sp] >= '0') && (source[sp] <= '9')) { - ascii_count += 0.5; - } else { - ascii_count = froundup(ascii_count); - if(source[sp] > 127) { - ascii_count += 2.0; - } else { - ascii_count += 1.0; - } - } - - /* Step M */ - done = 0; - if(reduced_char == ' ') { c40_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= '0') && (reduced_char <= '9')) { c40_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= 'A') && (reduced_char <= 'Z')) { c40_count += (2.0 / 3.0); done = 1; } - if(source[sp] > 127) { c40_count += (4.0 / 3.0); } - if(done == 0) { c40_count += (4.0 / 3.0); } - - /* Step N */ - done = 0; - if(reduced_char == ' ') { text_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= '0') && (reduced_char <= '9')) { text_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= 'a') && (reduced_char <= 'z')) { text_count += (2.0 / 3.0); done = 1; } - if(source[sp] > 127) { text_count += (4.0 / 3.0); } - if(done == 0) { text_count += (4.0 / 3.0); } - - /* Step O */ - done = 0; - if(source[sp] == 13) { edi_count += (2.0 / 3.0); done = 1; } - if(source[sp] == '*') { edi_count += (2.0 / 3.0); done = 1; } - if(source[sp] == '>') { edi_count += (2.0 / 3.0); done = 1; } - if(source[sp] == ' ') { edi_count += (2.0 / 3.0); done = 1; } - if((source[sp] >= '0') && (source[sp] <= '9')) { edi_count += (2.0 / 3.0); done = 1; } - if((source[sp] >= 'A') && (source[sp] <= 'Z')) { edi_count += (2.0 / 3.0); done = 1; } - if(source[sp] > 127) { - edi_count += (13.0 / 3.0); - } else { - if(done == 0) { - edi_count += (10.0 / 3.0); - } - } - - /* Step P */ - if(gs1 && (source[sp] == '[')) { byte_count += 3.0; } else { byte_count += 1.0; } - - } - - ascii_count = froundup(ascii_count); - c40_count = froundup(c40_count); - text_count = froundup(text_count); - edi_count = froundup(edi_count); - byte_count = froundup(byte_count); - best_scheme = C1_ASCII; - - if(sp == sourcelen) { - /* Step K */ - best_count = edi_count; - - if(text_count <= best_count) { - best_count = text_count; - best_scheme = C1_TEXT; - } - - if(c40_count <= best_count) { - best_count = c40_count; - best_scheme = C1_C40; - } - - if(ascii_count <= best_count) { - best_count = ascii_count; - best_scheme = C1_ASCII; - } - - if(byte_count <= best_count) { - best_count = byte_count; - best_scheme = C1_BYTE; - } - } else { - /* Step Q */ - - if(((edi_count + 1.0 <= ascii_count) && (edi_count + 1.0 <= c40_count)) && - ((edi_count + 1.0 <= byte_count) && (edi_count + 1.0 <= text_count))) { - best_scheme = C1_EDI; - } - - if((c40_count + 1.0 <= ascii_count) && (c40_count + 1.0 <= text_count)) { - - if(c40_count < edi_count) { - best_scheme = C1_C40; - } else { - done = 0; - if(c40_count == edi_count) { - if(dq4bi(source, sourcelen, position)) { - best_scheme = C1_EDI; - } else { - best_scheme = C1_C40; - } - } - } - } - - if(((text_count + 1.0 <= ascii_count) && (text_count + 1.0 <= c40_count)) && - ((text_count + 1.0 <= byte_count) && (text_count + 1.0 <= edi_count))) { - best_scheme = C1_TEXT; - } - - if(((ascii_count + 1.0 <= byte_count) && (ascii_count + 1.0 <= c40_count)) && - ((ascii_count + 1.0 <= text_count) && (ascii_count + 1.0 <= edi_count))) { - best_scheme = C1_ASCII; - } - - if(((byte_count + 1.0 <= ascii_count) && (byte_count + 1.0 <= c40_count)) && - ((byte_count + 1.0 <= text_count) && (byte_count + 1.0 <= edi_count))) { - best_scheme = C1_BYTE; - } - } - - //printf("\n> scores: ASCII %.2f C40 %.2f TEXT %.2f EDI %.2f BYTE %.2f\n", ascii_count, c40_count, text_count, edi_count, byte_count); - - return best_scheme; -} - -int c1_encode(struct zint_symbol *symbol, unsigned char source[], unsigned int target[], int length) -{ - int current_mode, next_mode; - int sp, tp, gs1, i, j, latch; - int c40_buffer[6], c40_p; - int text_buffer[6], text_p; - int edi_buffer[6], edi_p; - char decimal_binary[40]; - int byte_start = 0; - - sp = 0; - tp = 0; - latch = 0; - memset(c40_buffer, 0, 6); - c40_p = 0; - memset(text_buffer, 0, 6); - text_p = 0; - memset(edi_buffer, 0, 6); - edi_p = 0; - strcpy(decimal_binary, ""); - - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } - if(gs1) { target[tp] = 232; tp++; } /* FNC1 */ - - /* Step A */ - current_mode = C1_ASCII; - next_mode = C1_ASCII; - - do { - if(current_mode != next_mode) { - /* Change mode */ - switch(next_mode) { - case C1_C40: target[tp] = 230; tp++; break; - case C1_TEXT: target[tp] = 239; tp++; break; - case C1_EDI: target[tp] = 238; tp++; break; - case C1_BYTE: target[tp] = 231; tp++; break; - } - } - - if((current_mode != C1_BYTE) && (next_mode == C1_BYTE)) { byte_start = tp; } - current_mode = next_mode; - - if(current_mode == C1_ASCII) { /* Step B - ASCII encodation */ - next_mode = C1_ASCII; - - if((length - sp) >= 21) { /* Step B1 */ - j = 0; - - for(i = 0; i < 21; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 21) { - next_mode = C1_DECIMAL; - strcpy(decimal_binary, "1111"); - } - } - - if((next_mode == C1_ASCII) && ((length - sp) >= 13)) { /* Step B2 */ - j = 0; - - for(i = 0; i < 13; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 13) { - latch = 0; - for(i = sp + 13; i < length; i++) { - if(!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { latch = 1; } - } - - if(!(latch)) { - next_mode = C1_DECIMAL; - strcpy(decimal_binary, "1111"); - } - } - } - - if(next_mode == C1_ASCII) { /* Step B3 */ - if(istwodigits(source, sp) && ((sp + 1) != length)) { - target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130; - tp++; - sp += 2; - } else { - if((gs1) && (source[sp] == '[')) { - if((length - sp) >= 15) { /* Step B4 */ - j = 0; - - for(i = 0; i < 15; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 15) { - target[tp] = 236; /* FNC1 and change to Decimal */ - tp++; sp++; - next_mode = C1_DECIMAL; - } - } - - if((length - sp) >= 7) { /* Step B5 */ - j = 0; - - for(i = 0; i < 7; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 7) { - latch = 0; - for(i = sp + 7; i < length; i++) { - if(!((source[sp + i] >= '0') && (source[sp + i] <= '9'))) { latch = 1; } - } - - if(!(latch)) { - target[tp] = 236; /* FNC1 and change to Decimal */ - tp++; sp++; - next_mode = C1_DECIMAL; - } - } - } - } - - if(next_mode == C1_ASCII) { - - /* Step B6 */ - next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); - - if(next_mode == C1_ASCII) { - if(source[sp] > 127) { - /* Step B7 */ - target[tp] = 235; tp++; /* FNC4 */ - target[tp] = (source[sp] - 128) + 1; tp++; sp++; - } else { - /* Step B8 */ - if((gs1) && (source[sp] == '[')) { - target[tp] = 232; tp++; sp++; /* FNC1 */ - } else { - target[tp] = source[sp] + 1; tp++; sp++; - } - } - } - } - } - } - } - - if(current_mode == C1_C40) { /* Step C - C40 encodation */ - int shift_set, value, done = 0, latch = 0; - - next_mode = C1_C40; - if(c40_p == 0) { - if((length - sp) >= 12) { - j = 0; - - for(i = 0; i < 12; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 12) { - next_mode = C1_ASCII; done = 1; - } - } - - if((length - sp) >= 8) { - j = 0; - - for(i = 0; i < 8; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if((length - sp) == 8) { - latch = 1; - } else { - latch = 1; - for(j = sp + 8; j < length; j++) { - if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; } - } - } - - if ((j == 8) && latch) { - next_mode = C1_ASCII; done = 1; - } - } - - if(!(done)) { - next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); - } - } - - if(next_mode != C1_C40) { - target[tp] = 255; tp++; /* Unlatch */ - } else { - if(source[sp] > 127) { - c40_buffer[c40_p] = 1; c40_p++; - c40_buffer[c40_p] = 30; c40_p++; /* Upper Shift */ - shift_set = c40_shift[source[sp] - 128]; - value = c40_value[source[sp] - 128]; - } else { - shift_set = c40_shift[source[sp]]; - value = c40_value[source[sp]]; - } - - if(gs1 && (source[sp] == '[')) { - shift_set = 2; - value = 27; /* FNC1 */ - } - - if(shift_set != 0) { - c40_buffer[c40_p] = shift_set - 1; c40_p++; - } - c40_buffer[c40_p] = value; c40_p++; - - if(c40_p >= 3) { - int iv; - - iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - - c40_buffer[0] = c40_buffer[3]; - c40_buffer[1] = c40_buffer[4]; - c40_buffer[2] = c40_buffer[5]; - c40_buffer[3] = 0; - c40_buffer[4] = 0; - c40_buffer[5] = 0; - c40_p -= 3; - } - sp++; - } - } - - if(current_mode == C1_TEXT) { /* Step D - Text encodation */ - int shift_set, value, done = 0, latch = 0; - - next_mode = C1_TEXT; - if(text_p == 0) { - if((length - sp) >= 12) { - j = 0; - - for(i = 0; i < 12; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 12) { - next_mode = C1_ASCII; done = 1; - } - } - - if((length - sp) >= 8) { - j = 0; - - for(i = 0; i < 8; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if((length - sp) == 8) { - latch = 1; - } else { - latch = 1; - for(j = sp + 8; j < length; j++) { - if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; } - } - } - - if ((j == 8) && latch) { - next_mode = C1_ASCII; done = 1; - } - } - - if(!(done)) { - next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); - } - } - - if(next_mode != C1_TEXT) { - target[tp] = 255; tp++; /* Unlatch */ - } else { - if(source[sp] > 127) { - text_buffer[text_p] = 1; text_p++; - text_buffer[text_p] = 30; text_p++; /* Upper Shift */ - shift_set = text_shift[source[sp] - 128]; - value = text_value[source[sp] - 128]; - } else { - shift_set = text_shift[source[sp]]; - value = text_value[source[sp]]; - } - - if(gs1 && (source[sp] == '[')) { - shift_set = 2; - value = 27; /* FNC1 */ - } - - if(shift_set != 0) { - text_buffer[text_p] = shift_set - 1; text_p++; - } - text_buffer[text_p] = value; text_p++; - - if(text_p >= 3) { - int iv; - - iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - - text_buffer[0] = text_buffer[3]; - text_buffer[1] = text_buffer[4]; - text_buffer[2] = text_buffer[5]; - text_buffer[3] = 0; - text_buffer[4] = 0; - text_buffer[5] = 0; - text_p -= 3; - } - sp++; - } - } - - if(current_mode == C1_EDI) { /* Step E - EDI Encodation */ - int value = 0, done = 0, latch = 0; - - next_mode = C1_EDI; - if(edi_p == 0) { - if((length - sp) >= 12) { - j = 0; - - for(i = 0; i < 12; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if (j == 12) { - next_mode = C1_ASCII; done = 1; - } - } - - if((length - sp) >= 8) { - j = 0; - - for(i = 0; i < 8; i++) { - if((source[sp + i] >= '0') && (source[sp + i] <= '9')) { j++; } - } - - if((length - sp) == 8) { - latch = 1; - } else { - latch = 1; - for(j = sp + 8; j < length; j++) { - if((source[j] <= '0') || (source[j] >= '9')) { latch = 0; } - } - } - - if ((j == 8) && latch) { - next_mode = C1_ASCII; done = 1; - } - } - - if(!((isedi(source[sp]) && isedi(source[sp + 1])) && isedi(source[sp + 2]))) { - next_mode = C1_ASCII; - } - } - - if(next_mode != C1_EDI) { - target[tp] = 255; tp++; /* Unlatch */ - } else { - if(source[sp] == 13) { value = 0; } - if(source[sp] == '*') { value = 1; } - if(source[sp] == '>') { value = 2; } - if(source[sp] == ' ') { value = 3; } - if((source[sp] >= '0') && (source[sp] <= '9')) { value = source[sp] - '0' + 4; } - if((source[sp] >= 'A') && (source[sp] <= 'Z')) { value = source[sp] - 'A' + 14; } - - edi_buffer[edi_p] = value; edi_p++; - - if(edi_p >= 3) { - int iv; - - iv = (1600 * edi_buffer[0]) + (40 * edi_buffer[1]) + (edi_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - - edi_buffer[0] = edi_buffer[3]; - edi_buffer[1] = edi_buffer[4]; - edi_buffer[2] = edi_buffer[5]; - edi_buffer[3] = 0; - edi_buffer[4] = 0; - edi_buffer[5] = 0; - edi_p -= 3; - } - sp++; - } - } - - if(current_mode == C1_DECIMAL) { /* Step F - Decimal encodation */ - int value, decimal_count, data_left; - - next_mode = C1_DECIMAL; - - data_left = length - sp; - decimal_count = 0; - - if(data_left >= 1) { - if((source[sp] >= '0') && (source[sp] <= '9')) { decimal_count = 1; } - } - if(data_left >= 2) { - if((decimal_count == 1) && ((source[sp + 1] >= '0') && (source[sp + 1] <= '9'))) { decimal_count = 2; } - } - if(data_left >= 3) { - if((decimal_count == 2) && ((source[sp + 2] >= '0') && (source[sp + 2] <= '9'))) { decimal_count = 3; } - } - - if(decimal_count != 3) { - int bits_left_in_byte, target_count; - int sub_target; - /* Finish Decimal mode and go back to ASCII */ - - concat(decimal_binary, "111111"); /* Unlatch */ - - target_count = 3; - if(strlen(decimal_binary) <= 16) { target_count = 2; } - if(strlen(decimal_binary) <= 8) { target_count = 1; } - bits_left_in_byte = (8 * target_count) - strlen(decimal_binary); - if(bits_left_in_byte == 8) { bits_left_in_byte = 0; } - - if(bits_left_in_byte == 2) { - concat(decimal_binary, "01"); - } - - if((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) { - if(decimal_count >= 1) { - int sub_value = ctoi(source[sp]) + 1; - - if(sub_value & 0x08) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(sub_value & 0x04) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(sub_value & 0x02) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(sub_value & 0x01) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - sp++; - } else { - concat(decimal_binary, "1111"); - } - } - - if(bits_left_in_byte == 6) { - concat(decimal_binary, "01"); - } - - /* Binary buffer is full - transfer to target */ - if(target_count >= 1) { - sub_target = 0; - if(decimal_binary[0] == '1') { sub_target += 128; } - if(decimal_binary[1] == '1') { sub_target += 64; } - if(decimal_binary[2] == '1') { sub_target += 32; } - if(decimal_binary[3] == '1') { sub_target += 16; } - if(decimal_binary[4] == '1') { sub_target += 8; } - if(decimal_binary[5] == '1') { sub_target += 4; } - if(decimal_binary[6] == '1') { sub_target += 2; } - if(decimal_binary[7] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - if(target_count >= 2) { - sub_target = 0; - if(decimal_binary[8] == '1') { sub_target += 128; } - if(decimal_binary[9] == '1') { sub_target += 64; } - if(decimal_binary[10] == '1') { sub_target += 32; } - if(decimal_binary[11] == '1') { sub_target += 16; } - if(decimal_binary[12] == '1') { sub_target += 8; } - if(decimal_binary[13] == '1') { sub_target += 4; } - if(decimal_binary[14] == '1') { sub_target += 2; } - if(decimal_binary[15] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - if(target_count == 3) { - sub_target = 0; - if(decimal_binary[16] == '1') { sub_target += 128; } - if(decimal_binary[17] == '1') { sub_target += 64; } - if(decimal_binary[18] == '1') { sub_target += 32; } - if(decimal_binary[19] == '1') { sub_target += 16; } - if(decimal_binary[20] == '1') { sub_target += 8; } - if(decimal_binary[21] == '1') { sub_target += 4; } - if(decimal_binary[22] == '1') { sub_target += 2; } - if(decimal_binary[23] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - - next_mode = C1_ASCII; - } else { - /* There are three digits - convert the value to binary */ - value = (100 * ctoi(source[sp])) + (10 * ctoi(source[sp + 1])) + ctoi(source[sp + 2]) + 1; - - if(value & 0x200) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x100) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x80) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x40) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x20) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x10) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x08) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x04) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x02) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - if(value & 0x01) { concat(decimal_binary, "1"); } else { concat(decimal_binary, "0"); } - - sp+= 3; - } - - if(strlen(decimal_binary) >= 24) { - int target1 = 0, target2 = 0, target3 = 0; - char temp_binary[40]; - - /* Binary buffer is full - transfer to target */ - if(decimal_binary[0] == '1') { target1 += 128; } - if(decimal_binary[1] == '1') { target1 += 64; } - if(decimal_binary[2] == '1') { target1 += 32; } - if(decimal_binary[3] == '1') { target1 += 16; } - if(decimal_binary[4] == '1') { target1 += 8; } - if(decimal_binary[5] == '1') { target1 += 4; } - if(decimal_binary[6] == '1') { target1 += 2; } - if(decimal_binary[7] == '1') { target1 += 1; } - if(decimal_binary[8] == '1') { target2 += 128; } - if(decimal_binary[9] == '1') { target2 += 64; } - if(decimal_binary[10] == '1') { target2 += 32; } - if(decimal_binary[11] == '1') { target2 += 16; } - if(decimal_binary[12] == '1') { target2 += 8; } - if(decimal_binary[13] == '1') { target2 += 4; } - if(decimal_binary[14] == '1') { target2 += 2; } - if(decimal_binary[15] == '1') { target2 += 1; } - if(decimal_binary[16] == '1') { target3 += 128; } - if(decimal_binary[17] == '1') { target3 += 64; } - if(decimal_binary[18] == '1') { target3 += 32; } - if(decimal_binary[19] == '1') { target3 += 16; } - if(decimal_binary[20] == '1') { target3 += 8; } - if(decimal_binary[21] == '1') { target3 += 4; } - if(decimal_binary[22] == '1') { target3 += 2; } - if(decimal_binary[23] == '1') { target3 += 1; } - target[tp] = target1; tp++; - target[tp] = target2; tp++; - target[tp] = target3; tp++; - - strcpy(temp_binary, ""); - if(strlen(decimal_binary) > 24) { - for(i = 0; i <= (strlen(decimal_binary) - 24); i++) { - temp_binary[i] = decimal_binary[i + 24]; - } - strcpy(decimal_binary, temp_binary); - } - } - } - - if(current_mode == C1_BYTE) { - next_mode = C1_BYTE; - - if(gs1 && (source[sp] == '[')) { - next_mode = C1_ASCII; - } else { - if(source[sp] <= 127) { - next_mode = c1_look_ahead_test(source, length, sp, current_mode, gs1); - } - } - - if(next_mode != C1_BYTE) { - /* Insert byte field length */ - if((tp - byte_start) <= 249) { - for(i = tp; i >= byte_start; i--) { - target[i + 1] = target[i]; - } - target[byte_start] = (tp - byte_start); - tp++; - } else { - for(i = tp; i >= byte_start; i--) { - target[i + 2] = target[i]; - } - target[byte_start] = 249 + ((tp - byte_start) / 250); - target[byte_start + 1] = ((tp - byte_start) % 250); - tp += 2; - } - } else { - target[tp] = source[sp]; - tp++; - sp++; - } - } - - if(tp > 1480) { - /* Data is too large for symbol */ - strcpy(symbol->errtxt, "Input data too long"); - return 0; - } - } while (sp < length); - - /* Empty buffers */ - if(c40_p == 2) { - int iv; - - c40_buffer[2] = 1; - iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - target[tp] = 255; tp++; /* Unlatch */ - } - if(c40_p == 1) { - int iv; - - c40_buffer[1] = 1; - c40_buffer[2] = 31; /* Pad */ - iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - target[tp] = 255; tp++; /* Unlatch */ - } - if(text_p == 2) { - int iv; - - text_buffer[2] = 1; - iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - target[tp] = 255; tp++; /* Unlatch */ - } - if(text_p == 1) { - int iv; - - text_buffer[1] = 1; - text_buffer[2] = 31; /* Pad */ - iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - target[tp] = 255; tp++; /* Unlatch */ - } - - if(current_mode == C1_DECIMAL) { - int bits_left_in_byte, target_count; - int sub_target; - /* Finish Decimal mode and go back to ASCII */ - - concat(decimal_binary, "111111"); /* Unlatch */ - - target_count = 3; - if(strlen(decimal_binary) <= 16) { target_count = 2; } - if(strlen(decimal_binary) <= 8) { target_count = 1; } - bits_left_in_byte = (8 * target_count) - strlen(decimal_binary); - if(bits_left_in_byte == 8) { bits_left_in_byte = 0; } - - if(bits_left_in_byte == 2) { - concat(decimal_binary, "01"); - } - - if((bits_left_in_byte == 4) || (bits_left_in_byte == 6)) { - concat(decimal_binary, "1111"); - } - - if(bits_left_in_byte == 6) { - concat(decimal_binary, "01"); - } - - /* Binary buffer is full - transfer to target */ - if(target_count >= 1) { - sub_target = 0; - if(decimal_binary[0] == '1') { sub_target += 128; } - if(decimal_binary[1] == '1') { sub_target += 64; } - if(decimal_binary[2] == '1') { sub_target += 32; } - if(decimal_binary[3] == '1') { sub_target += 16; } - if(decimal_binary[4] == '1') { sub_target += 8; } - if(decimal_binary[5] == '1') { sub_target += 4; } - if(decimal_binary[6] == '1') { sub_target += 2; } - if(decimal_binary[7] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - if(target_count >= 2) { - sub_target = 0; - if(decimal_binary[8] == '1') { sub_target += 128; } - if(decimal_binary[9] == '1') { sub_target += 64; } - if(decimal_binary[10] == '1') { sub_target += 32; } - if(decimal_binary[11] == '1') { sub_target += 16; } - if(decimal_binary[12] == '1') { sub_target += 8; } - if(decimal_binary[13] == '1') { sub_target += 4; } - if(decimal_binary[14] == '1') { sub_target += 2; } - if(decimal_binary[15] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - if(target_count == 3) { - sub_target = 0; - if(decimal_binary[16] == '1') { sub_target += 128; } - if(decimal_binary[17] == '1') { sub_target += 64; } - if(decimal_binary[18] == '1') { sub_target += 32; } - if(decimal_binary[19] == '1') { sub_target += 16; } - if(decimal_binary[20] == '1') { sub_target += 8; } - if(decimal_binary[21] == '1') { sub_target += 4; } - if(decimal_binary[22] == '1') { sub_target += 2; } - if(decimal_binary[23] == '1') { sub_target += 1; } - target[tp] = sub_target; tp++; - } - } - - if(current_mode == C1_BYTE) { - /* Insert byte field length */ - if((tp - byte_start) <= 249) { - for(i = tp; i >= byte_start; i--) { - target[i + 1] = target[i]; - } - target[byte_start] = (tp - byte_start); - tp++; - } else { - for(i = tp; i >= byte_start; i--) { - target[i + 2] = target[i]; - } - target[byte_start] = 249 + ((tp - byte_start) / 250); - target[byte_start + 1] = ((tp - byte_start) % 250); - tp += 2; - } - } - - /* Re-check length of data */ - if(tp > 1480) { - /* Data is too large for symbol */ - strcpy(symbol->errtxt, "Input data too long"); - return 0; - } - /* - printf("targets:\n"); - for(i = 0; i < tp; i++) { - printf("[%d]", target[i]); - } - printf("\n"); - */ - return tp; -} - -void block_copy(struct zint_symbol *symbol, char grid[][120], int start_row, int start_col, int height, int width, int row_offset, int col_offset) { - int i, j; - - for(i = start_row; i < (start_row + height); i++) { - for(j = start_col; j < (start_col + width); j++) { - if(grid[i][j] == '1') { - set_module(symbol, i + row_offset, j + col_offset); - } - } - } -} - -int code_one(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int size = 1, i, j, data_blocks; - - char datagrid[136][120]; - int row, col; - int sub_version = 0; - - if((symbol->option_2 < 0) || (symbol->option_2 > 10)) { - strcpy(symbol->errtxt, "Invalid symbol size"); - return ERROR_INVALID_OPTION; - } - - if(symbol->option_2 == 9) { - /* Version S */ - int codewords; - short int elreg[112]; - unsigned int data[15], ecc[15]; - int stream[30]; - int block_width; - - if(length > 18) { - strcpy(symbol->errtxt, "Input data too long"); - return ERROR_TOO_LONG; - } - if(is_sane(NEON, source, length) == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid input data (Version S encodes numeric input only)"); - return ERROR_INVALID_DATA1; - } - - sub_version = 3; codewords = 12; block_width = 6; /* Version S-30 */ - if(length <= 12) { sub_version = 2; codewords = 8; block_width = 4; } /* Version S-20 */ - if(length <= 6) { sub_version = 1; codewords = 4; block_width = 2; } /* Version S-10 */ - - binary_load(elreg, (char *)source, length); - hex_dump(elreg); - - for(i = 0; i < 15; i++) { - data[i] = 0; - ecc[i] = 0; - } - - for(i = 0; i < codewords; i++) { - data[codewords - i - 1] += 1 * elreg[(i * 5)]; - data[codewords - i - 1] += 2 * elreg[(i * 5) + 1]; - data[codewords - i - 1] += 4 * elreg[(i * 5) + 2]; - data[codewords - i - 1] += 8 * elreg[(i * 5) + 3]; - data[codewords - i - 1] += 16 * elreg[(i * 5) + 4]; - } - - rs_init_gf(0x25); - rs_init_code(codewords, 1); - rs_encode_long(codewords, data, ecc); - rs_free(); - - for(i = 0; i < codewords; i++) { - stream[i] = data[i]; - stream[i + codewords] = ecc[codewords - i - 1]; - } - - for(i = 0; i < 136; i++) { - for(j = 0; j < 120; j++) { - datagrid[i][j] = '0'; - } - } - - i = 0; - for(row = 0; row < 2; row++) { - for(col = 0; col < block_width; col++) { - if(stream[i] & 0x10) { datagrid[row * 2][col * 5] = '1'; } - if(stream[i] & 0x08) { datagrid[row * 2][(col * 5) + 1] = '1'; } - if(stream[i] & 0x04) { datagrid[row * 2][(col * 5) + 2] = '1'; } - if(stream[i] & 0x02) { datagrid[(row * 2) + 1][col * 5] = '1'; } - if(stream[i] & 0x01) { datagrid[(row * 2) + 1][(col * 5) + 1] = '1'; } - if(stream[i + 1] & 0x10) { datagrid[row * 2][(col * 5) + 3] = '1'; } - if(stream[i + 1] & 0x08) { datagrid[row * 2][(col * 5) + 4] = '1'; } - if(stream[i + 1] & 0x04) { datagrid[(row * 2) + 1][(col * 5) + 2] = '1'; } - if(stream[i + 1] & 0x02) { datagrid[(row * 2) + 1][(col * 5) + 3] = '1'; } - if(stream[i + 1] & 0x01) { datagrid[(row * 2) + 1][(col * 5) + 4] = '1'; } - i += 2; - } - } - - size = 9; - symbol->rows = 8; - symbol->width = 10 * sub_version + 1; - } - - if(symbol->option_2 == 10) { - /* Version T */ - unsigned int data[40], ecc[25]; - unsigned int stream[65]; - int data_length; - int data_cw, ecc_cw, block_width; - - for(i = 0; i < 40; i++) { data[i] = 0; } - data_length = c1_encode(symbol, source, data, length); - - if(data_length == 0) { - return ERROR_TOO_LONG; - } - - if(data_length > 38) { - strcpy(symbol->errtxt, "Input data too long"); - return ERROR_TOO_LONG; - } - - size = 10; - sub_version = 3; data_cw = 38; ecc_cw = 22; block_width = 12; - if(data_length <= 24) { sub_version = 2; data_cw = 24; ecc_cw = 16; block_width = 8; } - if(data_length <= 10) { sub_version = 1; data_cw = 10; ecc_cw = 10; block_width = 4; } - - for(i = data_length; i < data_cw; i++) { - data[i] = 129; /* Pad */ - } - - /* Calculate error correction data */ - rs_init_gf(0x12d); - rs_init_code(ecc_cw, 1); - rs_encode_long(data_cw, data, ecc); - rs_free(); - - /* "Stream" combines data and error correction data */ - for(i = 0; i < data_cw; i++) { - stream[i] = data[i]; - } - for(i = 0; i < ecc_cw; i++) { - stream[data_cw + i] = ecc[ecc_cw - i - 1]; - } - - for(i = 0; i < 136; i++) { - for(j = 0; j < 120; j++) { - datagrid[i][j] = '0'; - } - } - - i = 0; - for(row = 0; row < 5; row++) { - for(col = 0; col < block_width; col++) { - if(stream[i] & 0x80) { datagrid[row * 2][col * 4] = '1'; } - if(stream[i] & 0x40) { datagrid[row * 2][(col * 4) + 1] = '1'; } - if(stream[i] & 0x20) { datagrid[row * 2][(col * 4) + 2] = '1'; } - if(stream[i] & 0x10) { datagrid[row * 2][(col * 4) + 3] = '1'; } - if(stream[i] & 0x08) { datagrid[(row * 2) + 1][col * 4] = '1'; } - if(stream[i] & 0x04) { datagrid[(row * 2) + 1][(col * 4) + 1] = '1'; } - if(stream[i] & 0x02) { datagrid[(row * 2) + 1][(col * 4) + 2] = '1'; } - if(stream[i] & 0x01) { datagrid[(row * 2) + 1][(col * 4) + 3] = '1'; } - i++; - } - } - - symbol->rows = 16; - symbol->width = (sub_version * 16) + 1; - } - - if((symbol->option_2 != 9) && (symbol->option_2 != 10)) { - /* Version A to H */ - unsigned int data[1500], ecc[600]; - unsigned int sub_data[190], sub_ecc[75]; - unsigned int stream[2100]; - int data_length; - - for(i = 0; i < 1500; i++) { data[i] = 0; } - data_length = c1_encode(symbol, source, data, length); - - if(data_length == 0) { - return ERROR_TOO_LONG; - } - - for(i = 7; i >= 0; i--) { - if(c1_data_length[i] >= data_length) { - size = i + 1; - } - } - - if(symbol->option_2 > size) { - size = symbol->option_2; - } - - for(i = data_length; i < c1_data_length[size - 1]; i++) { - data[i] = 129; /* Pad */ - } - - /* Calculate error correction data */ - data_length = c1_data_length[size - 1]; - for(i = 0; i < 190; i++) { sub_data[i] = 0; } - for(i = 0; i < 75; i++) { sub_ecc[i] = 0; } - - data_blocks = c1_blocks[size - 1]; - - rs_init_gf(0x12d); - rs_init_code(c1_ecc_blocks[size - 1], 0); - for(i = 0; i < data_blocks; i++) { - for(j = 0; j < c1_data_blocks[size - 1]; j++) { - - sub_data[j] = data[j * data_blocks + i]; - } - rs_encode_long(c1_data_blocks[size - 1], sub_data, sub_ecc); - for(j = 0; j < c1_ecc_blocks[size - 1]; j++) { - ecc[c1_ecc_length[size - 1] - (j * data_blocks + i) - 1] = sub_ecc[j]; - } - } - rs_free(); - - /* "Stream" combines data and error correction data */ - for(i = 0; i < data_length; i++) { - stream[i] = data[i]; - } - for(i = 0; i < c1_ecc_length[size - 1]; i++) { - stream[data_length + i] = ecc[i]; - } - - for(i = 0; i < 136; i++) { - for(j = 0; j < 120; j++) { - datagrid[i][j] = '0'; - } - } - - i = 0; - for(row = 0; row < c1_grid_height[size - 1]; row++) { - for(col = 0; col < c1_grid_width[size - 1]; col++) { - if(stream[i] & 0x80) { datagrid[row * 2][col * 4] = '1'; } - if(stream[i] & 0x40) { datagrid[row * 2][(col * 4) + 1] = '1'; } - if(stream[i] & 0x20) { datagrid[row * 2][(col * 4) + 2] = '1'; } - if(stream[i] & 0x10) { datagrid[row * 2][(col * 4) + 3] = '1'; } - if(stream[i] & 0x08) { datagrid[(row * 2) + 1][col * 4] = '1'; } - if(stream[i] & 0x04) { datagrid[(row * 2) + 1][(col * 4) + 1] = '1'; } - if(stream[i] & 0x02) { datagrid[(row * 2) + 1][(col * 4) + 2] = '1'; } - if(stream[i] & 0x01) { datagrid[(row * 2) + 1][(col * 4) + 3] = '1'; } - i++; - } - } - - /* for(i = 0; i < (c1_grid_height[size - 1] * 2); i++) { - for(j = 0; j < (c1_grid_width[size - 1] * 4); j++) { - printf("%c", datagrid[i][j]); - } - printf("\n"); - } */ - - symbol->rows = c1_height[size - 1]; - symbol->width = c1_width[size - 1]; - } - - switch(size) { - case 1: /* Version A */ - central_finder(symbol, 6, 3, 1); - vert(symbol, 4, 6, 1); - vert(symbol, 12, 5, 0); - set_module(symbol, 5, 12); - spigot(symbol, 0); - spigot(symbol, 15); - block_copy(symbol, datagrid, 0, 0, 5, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 5, 12, 0, 2); - block_copy(symbol, datagrid, 5, 0, 5, 12, 6, 0); - block_copy(symbol, datagrid, 5, 12, 5, 4, 6, 2); - break; - case 2: /* Version B */ - central_finder(symbol, 8, 4, 1); - vert(symbol, 4, 8, 1); - vert(symbol, 16, 7, 0); - set_module(symbol, 7, 16); - spigot(symbol, 0); - spigot(symbol, 21); - block_copy(symbol, datagrid, 0, 0, 7, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 7, 16, 0, 2); - block_copy(symbol, datagrid, 7, 0, 7, 16, 8, 0); - block_copy(symbol, datagrid, 7, 16, 7, 4, 8, 2); - break; - case 3: /* Version C */ - central_finder(symbol, 11, 4, 2); - vert(symbol, 4, 11, 1); - vert(symbol, 26, 13, 1); - vert(symbol, 4, 10, 0); - vert(symbol, 26, 10, 0); - spigot(symbol, 0); - spigot(symbol, 27); - block_copy(symbol, datagrid, 0, 0, 10, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 10, 20, 0, 2); - block_copy(symbol, datagrid, 0, 24, 10, 4, 0, 4); - block_copy(symbol, datagrid, 10, 0, 10, 4, 8, 0); - block_copy(symbol, datagrid, 10, 4, 10, 20, 8, 2); - block_copy(symbol, datagrid, 10, 24, 10, 4, 8, 4); - break; - case 4: /* Version D */ - central_finder(symbol, 16, 5, 1); - vert(symbol, 4, 16, 1); - vert(symbol, 20, 16, 1); - vert(symbol, 36, 16, 1); - vert(symbol, 4, 15, 0); - vert(symbol, 20, 15, 0); - vert(symbol, 36, 15, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 27); - spigot(symbol, 39); - block_copy(symbol, datagrid, 0, 0, 15, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 15, 14, 0, 2); - block_copy(symbol, datagrid, 0, 18, 15, 14, 0, 4); - block_copy(symbol, datagrid, 0, 32, 15, 4, 0, 6); - block_copy(symbol, datagrid, 15, 0, 15, 4, 10, 0); - block_copy(symbol, datagrid, 15, 4, 15, 14, 10, 2); - block_copy(symbol, datagrid, 15, 18, 15, 14, 10, 4); - block_copy(symbol, datagrid, 15, 32, 15, 4, 10, 6); - break; - case 5: /* Version E */ - central_finder(symbol, 22, 5, 2); - vert(symbol, 4, 22, 1); - vert(symbol, 26, 24, 1); - vert(symbol, 48, 22, 1); - vert(symbol, 4, 21, 0); - vert(symbol, 26, 21, 0); - vert(symbol, 48, 21, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 39); - spigot(symbol, 51); - block_copy(symbol, datagrid, 0, 0, 21, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 21, 20, 0, 2); - block_copy(symbol, datagrid, 0, 24, 21, 20, 0, 4); - block_copy(symbol, datagrid, 0, 44, 21, 4, 0, 6); - block_copy(symbol, datagrid, 21, 0, 21, 4, 10, 0); - block_copy(symbol, datagrid, 21, 4, 21, 20, 10, 2); - block_copy(symbol, datagrid, 21, 24, 21, 20, 10, 4); - block_copy(symbol, datagrid, 21, 44, 21, 4, 10, 6); - break; - case 6: /* Version F */ - central_finder(symbol, 31, 5, 3); - vert(symbol, 4, 31, 1); - vert(symbol, 26, 35, 1); - vert(symbol, 48, 31, 1); - vert(symbol, 70, 35, 1); - vert(symbol, 4, 30, 0); - vert(symbol, 26, 30, 0); - vert(symbol, 48, 30, 0); - vert(symbol, 70, 30, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 24); - spigot(symbol, 45); - spigot(symbol, 57); - spigot(symbol, 69); - block_copy(symbol, datagrid, 0, 0, 30, 4, 0, 0); - block_copy(symbol, datagrid, 0, 4, 30, 20, 0, 2); - block_copy(symbol, datagrid, 0, 24, 30, 20, 0, 4); - block_copy(symbol, datagrid, 0, 44, 30, 20, 0, 6); - block_copy(symbol, datagrid, 0, 64, 30, 4, 0, 8); - block_copy(symbol, datagrid, 30, 0, 30, 4, 10, 0); - block_copy(symbol, datagrid, 30, 4, 30, 20, 10, 2); - block_copy(symbol, datagrid, 30, 24, 30, 20, 10, 4); - block_copy(symbol, datagrid, 30, 44, 30, 20, 10, 6); - block_copy(symbol, datagrid, 30, 64, 30, 4, 10, 8); - break; - case 7: /* Version G */ - central_finder(symbol, 47, 6, 2); - vert(symbol, 6, 47, 1); - vert(symbol, 27, 49, 1); - vert(symbol, 48, 47, 1); - vert(symbol, 69, 49, 1); - vert(symbol, 90, 47, 1); - vert(symbol, 6, 46, 0); - vert(symbol, 27, 46, 0); - vert(symbol, 48, 46, 0); - vert(symbol, 69, 46, 0); - vert(symbol, 90, 46, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 24); - spigot(symbol, 36); - spigot(symbol, 67); - spigot(symbol, 79); - spigot(symbol, 91); - spigot(symbol, 103); - block_copy(symbol, datagrid, 0, 0, 46, 6, 0, 0); - block_copy(symbol, datagrid, 0, 6, 46, 19, 0, 2); - block_copy(symbol, datagrid, 0, 25, 46, 19, 0, 4); - block_copy(symbol, datagrid, 0, 44, 46, 19, 0, 6); - block_copy(symbol, datagrid, 0, 63, 46, 19, 0, 8); - block_copy(symbol, datagrid, 0, 82, 46, 6, 0, 10); - block_copy(symbol, datagrid, 46, 0, 46, 6, 12, 0); - block_copy(symbol, datagrid, 46, 6, 46, 19, 12, 2); - block_copy(symbol, datagrid, 46, 25, 46, 19, 12, 4); - block_copy(symbol, datagrid, 46, 44, 46, 19, 12, 6); - block_copy(symbol, datagrid, 46, 63, 46, 19, 12, 8); - block_copy(symbol, datagrid, 46, 82, 46, 6, 12, 10); - break; - case 8: /* Version H */ - central_finder(symbol, 69, 6, 3); - vert(symbol, 6, 69, 1); - vert(symbol, 26, 73, 1); - vert(symbol, 46, 69, 1); - vert(symbol, 66, 73, 1); - vert(symbol, 86, 69, 1); - vert(symbol, 106, 73, 1); - vert(symbol, 126, 69, 1); - vert(symbol, 6, 68, 0); - vert(symbol, 26, 68, 0); - vert(symbol, 46, 68, 0); - vert(symbol, 66, 68, 0); - vert(symbol, 86, 68, 0); - vert(symbol, 106, 68, 0); - vert(symbol, 126, 68, 0); - spigot(symbol, 0); - spigot(symbol, 12); - spigot(symbol, 24); - spigot(symbol, 36); - spigot(symbol, 48); - spigot(symbol, 60); - spigot(symbol, 87); - spigot(symbol, 99); - spigot(symbol, 111); - spigot(symbol, 123); - spigot(symbol, 135); - spigot(symbol, 147); - block_copy(symbol, datagrid, 0, 0, 68, 6, 0, 0); - block_copy(symbol, datagrid, 0, 6, 68, 18, 0, 2); - block_copy(symbol, datagrid, 0, 24, 68, 18, 0, 4); - block_copy(symbol, datagrid, 0, 42, 68, 18, 0, 6); - block_copy(symbol, datagrid, 0, 60, 68, 18, 0, 8); - block_copy(symbol, datagrid, 0, 78, 68, 18, 0, 10); - block_copy(symbol, datagrid, 0, 96, 68, 18, 0, 12); - block_copy(symbol, datagrid, 0, 114, 68, 6, 0, 14); - block_copy(symbol, datagrid, 68, 0, 68, 6, 12, 0); - block_copy(symbol, datagrid, 68, 6, 68, 18, 12, 2); - block_copy(symbol, datagrid, 68, 24, 68, 18, 12, 4); - block_copy(symbol, datagrid, 68, 42, 68, 18, 12, 6); - block_copy(symbol, datagrid, 68, 60, 68, 18, 12, 8); - block_copy(symbol, datagrid, 68, 78, 68, 18, 12, 10); - block_copy(symbol, datagrid, 68, 96, 68, 18, 12, 12); - block_copy(symbol, datagrid, 68, 114, 68, 6, 12, 14); - break; - case 9: /* Version S */ - horiz(symbol, 5, 1); - horiz(symbol, 7, 1); - set_module(symbol, 6, 0); - set_module(symbol, 6, symbol->width - 1); - unset_module(symbol, 7, 1); - unset_module(symbol, 7, symbol->width - 2); - switch(sub_version) { - case 1: /* Version S-10 */ - set_module(symbol, 0, 5); - block_copy(symbol, datagrid, 0, 0, 4, 5, 0, 0); - block_copy(symbol, datagrid, 0, 5, 4, 5, 0, 1); - break; - case 2: /* Version S-20 */ - set_module(symbol, 0, 10); - set_module(symbol, 4, 10); - block_copy(symbol, datagrid, 0, 0, 4, 10, 0, 0); - block_copy(symbol, datagrid, 0, 10, 4, 10, 0, 1); - break; - case 3: /* Version S-30 */ - set_module(symbol, 0, 15); - set_module(symbol, 4, 15); - set_module(symbol, 6, 15); - block_copy(symbol, datagrid, 0, 0, 4, 15, 0, 0); - block_copy(symbol, datagrid, 0, 15, 4, 15, 0, 1); - break; - } - break; - case 10: /* Version T */ - horiz(symbol, 11, 1); - horiz(symbol, 13, 1); - horiz(symbol, 15, 1); - set_module(symbol, 12, 0); - set_module(symbol, 12, symbol->width - 1); - set_module(symbol, 14, 0); - set_module(symbol, 14, symbol->width - 1); - unset_module(symbol, 13, 1); - unset_module(symbol, 13, symbol->width - 2); - unset_module(symbol, 15, 1); - unset_module(symbol, 15, symbol->width - 2); - switch(sub_version) { - case 1: /* Version T-16 */ - set_module(symbol, 0, 8); - set_module(symbol, 10, 8); - block_copy(symbol, datagrid, 0, 0, 10, 8, 0, 0); - block_copy(symbol, datagrid, 0, 8, 10, 8, 0, 1); - break; - case 2: /* Version T-32 */ - set_module(symbol, 0, 16); - set_module(symbol, 10, 16); - set_module(symbol, 12, 16); - block_copy(symbol, datagrid, 0, 0, 10, 16, 0, 0); - block_copy(symbol, datagrid, 0, 16, 10, 16, 0, 1); - break; - case 3: /* Verion T-48 */ - set_module(symbol, 0, 24); - set_module(symbol, 10, 24); - set_module(symbol, 12, 24); - set_module(symbol, 14, 24); - block_copy(symbol, datagrid, 0, 0, 10, 24, 0, 0); - block_copy(symbol, datagrid, 0, 24, 10, 24, 0, 1); - break; - } - break; - } - - for(i = 0; i < symbol->rows; i++) { - symbol->row_height[i] = 1; - } - - return 0; -} diff --git a/3rdparty/zint-2.4.4/backend/code1.h b/3rdparty/zint-2.4.4/backend/code1.h deleted file mode 100644 index 532dc77..0000000 --- a/3rdparty/zint-2.4.4/backend/code1.h +++ /dev/null @@ -1,61 +0,0 @@ -/* code1.h - Lookup info for USS Code One */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -static int c40_shift[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; - -static int c40_value[] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,4,5,6,7,8,9,10,11,12,13, - 15,16,17,18,19,20,21,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39, - 22,23,24,25,26,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 }; - -static int text_shift[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3 }; - -static int text_value[] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,4,5,6,7,8,9,10,11,12,13, - 15,16,17,18,19,20,21,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26, - 22,23,24,25,26,0,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,27,28,29,30,31 }; - -static int c1_height[] = { 16, 22, 28, 40, 52, 70, 104, 148 }; -static int c1_width[] = { 18, 22, 32, 42, 54, 76, 98, 134 }; -static int c1_data_length[] = { 10, 19, 44, 91, 182, 370, 732, 1480 }; -static int c1_ecc_length[] = { 10, 16, 26, 44, 70, 140, 280, 560 }; -static int c1_blocks[] = { 1, 1, 1, 1, 1, 2, 4, 8 }; -static int c1_data_blocks[] = { 10, 19, 44, 91, 182, 185, 183, 185 }; -static int c1_ecc_blocks[] = { 10, 16, 26, 44, 70, 70, 70, 70 }; -static int c1_grid_width[] = { 4, 5, 7, 9, 12, 17, 22, 30 }; -static int c1_grid_height[] = { 5, 7, 10, 15, 21, 30, 46, 68 }; - -#define C1_ASCII 1 -#define C1_C40 2 -#define C1_DECIMAL 3 -#define C1_TEXT 4 -#define C1_EDI 5 -#define C1_BYTE 6 \ No newline at end of file diff --git a/3rdparty/zint-2.4.4/backend/code128.c b/3rdparty/zint-2.4.4/backend/code128.c deleted file mode 100644 index fc74c8e..0000000 --- a/3rdparty/zint-2.4.4/backend/code128.c +++ /dev/null @@ -1,997 +0,0 @@ -/* code128.c - Handles Code 128 and derivatives */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - Bugfixes thanks to Christian Sakowski and BogDan Vatra - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" -#include "gs1.h" - -#define TRUE 1 -#define FALSE 0 -#define SHIFTA 90 -#define LATCHA 91 -#define SHIFTB 92 -#define LATCHB 93 -#define SHIFTC 94 -#define LATCHC 95 -#define AORB 96 -#define ABORC 97 - -#define DPDSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ*" - -static int list[2][170]; - -/* Code 128 tables checked against ISO/IEC 15417:2007 */ - -static char *C128Table[107] = {"212222", "222122", "222221", "121223", "121322", "131222", "122213", - "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", - "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", - "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", - "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", - "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", - "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", - "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", - "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", - "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", - "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", - "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", - "2331112"}; -/* Code 128 character encodation - Table 1 */ - -int parunmodd(unsigned char llyth) -{ - int modd; - modd = 0; - - if(llyth <= 31) { modd = SHIFTA; } - else if((llyth >= 48) && (llyth <= 57)) { modd = ABORC; } - else if(llyth <= 95) { modd = AORB; } - else if(llyth <= 127) { modd = SHIFTB; } - else if(llyth <= 159) { modd = SHIFTA; } - else if(llyth <= 223) { modd = AORB; } - else { modd = SHIFTB; } - - return modd; -} - -void grwp(int *indexliste) -{ - int i, j; - - /* bring together same type blocks */ - if(*(indexliste) > 1) { - i = 1; - while(i < *(indexliste)) { - if(list[1][i - 1] == list[1][i]) { - /* bring together */ - list[0][i - 1] = list[0][i - 1] + list[0][i]; - j = i + 1; - - /* decreace the list */ - while(j < *(indexliste)) { - list[0][j - 1] = list[0][j]; - list[1][j - 1] = list[1][j]; - j++; - } - *(indexliste) = *(indexliste) - 1; - i--; - } - i++; - } - } -} - -void dxsmooth(int *indexliste) -{ /* Implements rules from ISO 15417 Annex E */ - int i, current, last, next, length; - - for(i = 0; i < *(indexliste); i++) { - current = list[1][i]; - length = list[0][i]; - if(i != 0) { last = list[1][i - 1]; } else { last = FALSE; } - if(i != *(indexliste) - 1) { next = list[1][i + 1]; } else { next = FALSE; } - - if(i == 0) { /* first block */ - if((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { /* Rule 1a */ list[1][i] = LATCHC; } - if(current == ABORC) { - if(length >= 4) {/* Rule 1b */ list[1][i] = LATCHC; } else { list[1][i] = AORB; current = AORB; } - } - if(current == SHIFTA) { /* Rule 1c */ list[1][i] = LATCHA; } - if((current == AORB) && (next == SHIFTA)) { /* Rule 1c */ list[1][i] = LATCHA; current = LATCHA; } - if(current == AORB) { /* Rule 1d */ list[1][i] = LATCHB; } - } else { - if((current == ABORC) && (length >= 4)) { /* Rule 3 */ list[1][i] = LATCHC; current = LATCHC; } - if(current == ABORC) { list[1][i] = AORB; current = AORB; } - if((current == AORB) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == AORB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } - if((current == AORB) && (next == SHIFTA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == AORB) && (next == SHIFTB)) { list[1][i] = LATCHB; current = LATCHB; } - if(current == AORB) { list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (length > 1)) { /* Rule 4 */ list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (length > 1)) { /* Rule 5 */ list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (last == LATCHC)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (last == LATCHC)) { list[1][i] = LATCHB; current = LATCHB; } - } /* Rule 2 is implimented elsewhere, Rule 6 is implied */ - } - grwp(indexliste); - -} - -void c128_set_a(unsigned char source, char dest[], int values[], int *bar_chars) -{ /* Translate Code 128 Set A characters into barcodes */ - /* This set handles all control characters NULL to US */ - - if(source > 127) { - if(source < 160) { - concat(dest, C128Table[(source - 128) + 64]); - values[(*bar_chars)] = (source - 128) + 64; - } else { - concat(dest, C128Table[(source - 128) - 32]); - values[(*bar_chars)] = (source - 128) - 32; - } - } else { - if(source < 32) { - concat(dest, C128Table[source + 64]); - values[(*bar_chars)] = source + 64; - } else { - concat(dest, C128Table[source - 32]); - values[(*bar_chars)] = source - 32; - } - } - (*bar_chars)++; -} - -void c128_set_b(unsigned char source, char dest[], int values[], int *bar_chars) -{ /* Translate Code 128 Set B characters into barcodes */ - /* This set handles all characters which are not part of long numbers and not control characters */ - - if(source > 127) { - concat(dest, C128Table[source - 32 - 128]); - values[(*bar_chars)] = source - 32 - 128; - } else { - concat(dest, C128Table[source - 32]); - values[(*bar_chars)] = source - 32; - } - (*bar_chars)++; -} - -void c128_set_c(unsigned char source_a, unsigned char source_b, char dest[], int values[], int *bar_chars) -{ /* Translate Code 128 Set C characters into barcodes */ - /* This set handles numbers in a compressed form */ - int weight; - - weight = (10 * ctoi(source_a)) + ctoi(source_b); - concat(dest, C128Table[weight]); - values[(*bar_chars)] = weight; - (*bar_chars)++; -} - -int code_128(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Handle Code 128 and NVE-18 */ - int i, j, k, e_count, values[170] = { 0 }, bar_characters, read, total_sum, nve_check; - int error_number, indexchaine, indexliste, sourcelen, f_state; - char set[170] = { ' ' }, fset[170] = { ' ' }, mode, last_set, last_fset, current_set = ' '; - float glyph_count; - char dest[1000]; - - error_number = 0; - strcpy(dest, ""); - - sourcelen = length; - - j = 0; - e_count = 0; - bar_characters = 0; - nve_check = 0; - f_state = 0; - - if(sourcelen > 160) { - /* This only blocks rediculously long input - the actual length of the - resulting barcode depends on the type of data, so this is trapped later */ - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* Detect extended ASCII characters */ - for(i = 0; i < sourcelen; i++) { - if(source[i] >= 128) - fset[i] = 'f'; - } - fset[i] = '\0'; - - /* Decide when to latch to extended mode - Annex E note 3 */ - j = 0; - for(i = 0; i < sourcelen; i++) { - if(fset[i] == 'f') { - j++; - } else { - j = 0; - } - - if(j >= 5) { - for(k = i; k > (i - 5); k--) { - fset[k] = 'F'; - } - } - - if((j >= 3) && (i == (sourcelen - 1))) { - for(k = i; k > (i - 3); k--) { - fset[k] = 'F'; - } - } - } - - /* Decide if it is worth reverting to 646 encodation for a few characters as described in 4.3.4.2 (d) */ - for(i = 1; i < sourcelen; i++) { - if((fset[i - 1] == 'F') && (fset[i] == ' ')) { - /* Detected a change from 8859-1 to 646 - count how long for */ - for(j = 0; (fset[i + j] == ' ') && ((i + j) < sourcelen); j++); - if((j < 5) || ((j < 3) && ((i + j) == (sourcelen - 1)))) { - /* Uses the same figures recommended by Annex E note 3 */ - /* Change to shifting back rather than latching back */ - for(k = 0; k < j; k++) { - fset[i + k] = 'n'; - } - } - } - } - - /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ - indexliste = 0; - indexchaine = 0; - - mode = parunmodd(source[indexchaine]); - if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { - mode = AORB; - } - - for(i = 0; i < 170; i++) { - list[0][i] = 0; - } - - do { - list[1][indexliste] = mode; - while ((list[1][indexliste] == mode) && (indexchaine < sourcelen)) { - list[0][indexliste]++; - indexchaine++; - mode = parunmodd(source[indexchaine]); - if((symbol->symbology == BARCODE_CODE128B) && (mode == ABORC)) { - mode = AORB; - } - } - indexliste++; - } while (indexchaine < sourcelen); - - dxsmooth(&indexliste); - - /* Resolve odd length LATCHC blocks */ - if((list[1][0] == LATCHC) && (list[0][0] & 1)) { - /* Rule 2 */ - list[0][1]++; - list[0][0]--; - if(indexliste == 1) { - list[0][1] = 1; - list[1][1] = LATCHB; - indexliste = 2; - } - } - if(indexliste > 1) { - for(i = 1; i < indexliste; i++) { - if((list[1][i] == LATCHC) && (list[0][i] & 1)) { - /* Rule 3b */ - list[0][i - 1]++; - list[0][i]--; - } - } - } - - /* Put set data into set[] */ - - read = 0; - for(i = 0; i < indexliste; i++) { - for(j = 0; j < list[0][i]; j++) { - switch(list[1][i]) { - case SHIFTA: set[read] = 'a'; break; - case LATCHA: set[read] = 'A'; break; - case SHIFTB: set[read] = 'b'; break; - case LATCHB: set[read] = 'B'; break; - case LATCHC: set[read] = 'C'; break; - } - read++; - } - } - - /* Adjust for strings which start with shift characters - make them latch instead */ - if(set[0] == 'a') { - i = 0; - do { - set[i] = 'A'; - i++; - } while (set[i] == 'a'); - } - - if(set[0] == 'b') { - i = 0; - do { - set[i] = 'B'; - i++; - } while (set[i] == 'b'); - } - - /* Now we can calculate how long the barcode is going to be - and stop it from - being too long */ - last_set = ' '; - last_fset = ' '; - glyph_count = 0.0; - for(i = 0; i < sourcelen; i++) { - if((set[i] == 'a') || (set[i] == 'b')) { - glyph_count = glyph_count + 1.0; - } - if((fset[i] == 'f') || (fset[i] == 'n')) { - glyph_count = glyph_count + 1.0; - } - if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { - if(set[i] != last_set) { - last_set = set[i]; - glyph_count = glyph_count + 1.0; - } - } - if(i == 0) { - if(fset[i] == 'F') { - last_fset = 'F'; - glyph_count = glyph_count + 2.0; - } - } else { - if((fset[i] == 'F') && (fset[i - 1] != 'F')) { - last_fset = 'F'; - glyph_count = glyph_count + 2.0; - } - if((fset[i] != 'F') && (fset[i - 1] == 'F')) { - last_fset = ' '; - glyph_count = glyph_count + 2.0; - } - } - - if(set[i] == 'C') { - glyph_count = glyph_count + 0.5; - } else { - glyph_count = glyph_count + 1.0; - } - } - if(glyph_count > 80.0) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - - /* So now we know what start character to use - we can get on with it! */ - if(symbol->output_options & READER_INIT) { - /* Reader Initialisation mode */ - switch(set[0]) { - case 'A': /* Start A */ - concat(dest, C128Table[103]); - values[0] = 103; - current_set = 'A'; - concat(dest, C128Table[96]); /* FNC3 */ - values[1] = 96; - bar_characters++; - break; - case 'B': /* Start B */ - concat(dest, C128Table[104]); - values[0] = 104; - current_set = 'B'; - concat(dest, C128Table[96]); /* FNC3 */ - values[1] = 96; - bar_characters++; - break; - case 'C': /* Start C */ - concat(dest, C128Table[104]); /* Start B */ - values[0] = 105; - concat(dest, C128Table[96]); /* FNC3 */ - values[1] = 96; - concat(dest, C128Table[99]); /* Code C */ - values[2] = 99; - bar_characters += 2; - current_set = 'C'; - break; - } - } else { - /* Normal mode */ - switch(set[0]) { - case 'A': /* Start A */ - concat(dest, C128Table[103]); - values[0] = 103; - current_set = 'A'; - break; - case 'B': /* Start B */ - concat(dest, C128Table[104]); - values[0] = 104; - current_set = 'B'; - break; - case 'C': /* Start C */ - concat(dest, C128Table[105]); - values[0] = 105; - current_set = 'C'; - break; - } - } - bar_characters++; - last_set = set[0]; - - if(fset[0] == 'F') { - switch(current_set) { - case 'A': - concat(dest, C128Table[101]); - concat(dest, C128Table[101]); - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - concat(dest, C128Table[100]); - concat(dest, C128Table[100]); - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 1; - } - - /* Encode the data */ - read = 0; - do { - - if((read != 0) && (set[read] != current_set)) - { /* Latch different code set */ - switch(set[read]) - { - case 'A': concat(dest, C128Table[101]); - values[bar_characters] = 101; - bar_characters++; - current_set = 'A'; - break; - case 'B': concat(dest, C128Table[100]); - values[bar_characters] = 100; - bar_characters++; - current_set = 'B'; - break; - case 'C': concat(dest, C128Table[99]); - values[bar_characters] = 99; - bar_characters++; - current_set = 'C'; - break; - } - } - - if(read != 0) { - if((fset[read] == 'F') && (f_state == 0)) { - /* Latch beginning of extended mode */ - switch(current_set) { - case 'A': - concat(dest, C128Table[101]); - concat(dest, C128Table[101]); - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - concat(dest, C128Table[100]); - concat(dest, C128Table[100]); - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 1; - } - if((fset[read] == ' ') && (f_state == 1)) { - /* Latch end of extended mode */ - switch(current_set) { - case 'A': - concat(dest, C128Table[101]); - concat(dest, C128Table[101]); - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - concat(dest, C128Table[100]); - concat(dest, C128Table[100]); - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 0; - } - } - - if((fset[read] == 'f') || (fset[read] == 'n')) { - /* Shift to or from extended mode */ - switch(current_set) { - case 'A': - concat(dest, C128Table[101]); /* FNC 4 */ - values[bar_characters] = 101; - break; - case 'B': - concat(dest, C128Table[100]); /* FNC 4 */ - values[bar_characters] = 100; - break; - } - bar_characters++; - } - - if((set[read] == 'a') || (set[read] == 'b')) { - /* Insert shift character */ - concat(dest, C128Table[98]); - values[bar_characters] = 98; - bar_characters++; - } - - switch(set[read]) - { /* Encode data characters */ - case 'a': - case 'A': c128_set_a(source[read], dest, values, &bar_characters); - read++; - break; - case 'b': - case 'B': c128_set_b(source[read], dest, values, &bar_characters); - read++; - break; - case 'C': c128_set_c(source[read], source[read + 1], dest, values, &bar_characters); - read += 2; - break; - } - - } while (read < sourcelen); - - /* check digit calculation */ - total_sum = 0; - /*for(i = 0; i < bar_characters; i++) { - printf("%d\n", values[i]); - }*/ - - for(i = 0; i < bar_characters; i++) - { - if(i > 0) - { - values[i] *= i; - } - total_sum += values[i]; - } - concat(dest, C128Table[total_sum%103]); - - /* Stop character */ - concat(dest, C128Table[106]); - expand(symbol, dest); - return error_number; -} - -int ean_128(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Handle EAN-128 (Now known as GS1-128) */ - int i, j, e_count, values[170], bar_characters, read, total_sum; - int error_number, indexchaine, indexliste; - char set[170], mode, last_set; - float glyph_count; - char dest[1000]; - int separator_row, linkage_flag, c_count; -#ifndef _MSC_VER - char reduced[length + 1]; -#else - char* reduced = (char*)_alloca(length + 1); -#endif - error_number = 0; - strcpy(dest, ""); - linkage_flag = 0; - - j = 0; - e_count = 0; - bar_characters = 0; - separator_row = 0; - - memset(values, 0, sizeof(values)); - memset(set, ' ', sizeof(set)); - - if(length > 160) { - /* This only blocks rediculously long input - the actual length of the - resulting barcode depends on the type of data, so this is trapped later */ - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - for(i = 0; i < length; i++) { - if(source[i] == '\0') { - /* Null characters not allowed! */ - strcpy(symbol->errtxt, "NULL character in input data"); - return ERROR_INVALID_DATA1; - } - } - - /* if part of a composite symbol make room for the separator pattern */ - if(symbol->symbology == BARCODE_EAN128_CC) { - separator_row = symbol->rows; - symbol->row_height[symbol->rows] = 1; - symbol->rows += 1; - } - - if(symbol->input_mode != GS1_MODE) { - /* GS1 data has not been checked yet */ - error_number = gs1_verify(symbol, source, length, reduced); - if(error_number != 0) { return error_number; } - } - - /* Decide on mode using same system as PDF417 and rules of ISO 15417 Annex E */ - indexliste = 0; - indexchaine = 0; - - mode = parunmodd(reduced[indexchaine]); - if(reduced[indexchaine] == '[') { - mode = ABORC; - } - - for(i = 0; i < 170; i++) { - list[0][i] = 0; - } - - do { - list[1][indexliste] = mode; - while ((list[1][indexliste] == mode) && (indexchaine < strlen(reduced))) { - list[0][indexliste]++; - indexchaine++; - mode = parunmodd(reduced[indexchaine]); - if(reduced[indexchaine] == '[') { mode = ABORC; } - } - indexliste++; - } while (indexchaine < strlen(reduced)); - - dxsmooth(&indexliste); - - /* Put set data into set[] */ - read = 0; - for(i = 0; i < indexliste; i++) { - for(j = 0; j < list[0][i]; j++) { - switch(list[1][i]) { - case SHIFTA: set[read] = 'a'; break; - case LATCHA: set[read] = 'A'; break; - case SHIFTB: set[read] = 'b'; break; - case LATCHB: set[read] = 'B'; break; - case LATCHC: set[read] = 'C'; break; - } - read++; - } - } - - /* Watch out for odd-length Mode C blocks */ - c_count = 0; - for(i = 0; i < read; i++) { - if(set[i] == 'C') { - if(reduced[i] == '[') { - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - c_count = 0; - } else { - c_count++; - } - } else { - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - c_count = 0; - } - } - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - for(i = 1; i < read - 1; i++) { - if((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) { - set[i] = 'B'; - } - } - - /* for(i = 0; i < read; i++) { - printf("char %c mode %c\n", reduced[i], set[i]); - } */ - - /* Now we can calculate how long the barcode is going to be - and stop it from - being too long */ - last_set = ' '; - glyph_count = 0.0; - for(i = 0; i < strlen(reduced); i++) { - if((set[i] == 'a') || (set[i] == 'b')) { - glyph_count = glyph_count + 1.0; - } - if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { - if(set[i] != last_set) { - last_set = set[i]; - glyph_count = glyph_count + 1.0; - } - } - - if((set[i] == 'C') && (reduced[i] != '[')) { - glyph_count = glyph_count + 0.5; - } else { - glyph_count = glyph_count + 1.0; - } - } - if(glyph_count > 80.0) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* So now we know what start character to use - we can get on with it! */ - switch(set[0]) - { - case 'A': /* Start A */ - concat(dest, C128Table[103]); - values[0] = 103; - break; - case 'B': /* Start B */ - concat(dest, C128Table[104]); - values[0] = 104; - break; - case 'C': /* Start C */ - concat(dest, C128Table[105]); - values[0] = 105; - break; - } - bar_characters++; - - concat(dest, C128Table[102]); - values[1] = 102; - bar_characters++; - - /* Encode the data */ - read = 0; - do { - - if((read != 0) && (set[read] != set[read - 1])) - { /* Latch different code set */ - switch(set[read]) - { - case 'A': concat(dest, C128Table[101]); - values[bar_characters] = 101; - bar_characters++; - break; - case 'B': concat(dest, C128Table[100]); - values[bar_characters] = 100; - bar_characters++; - break; - case 'C': concat(dest, C128Table[99]); - values[bar_characters] = 99; - bar_characters++; - break; - } - } - - if((set[read] == 'a') || (set[read] == 'b')) { - /* Insert shift character */ - concat(dest, C128Table[98]); - values[bar_characters] = 98; - bar_characters++; - } - - if(reduced[read] != '[') { - switch(set[read]) - { /* Encode data characters */ - case 'A': - case 'a': - c128_set_a(reduced[read], dest, values, &bar_characters); - read++; - break; - case 'B': - case 'b': - c128_set_b(reduced[read], dest, values, &bar_characters); - read++; - break; - case 'C': - c128_set_c(reduced[read], reduced[read + 1], dest, values, &bar_characters); - read += 2; - break; - } - } else { - concat(dest, C128Table[102]); - values[bar_characters] = 102; - bar_characters++; - read++; - } - } while (read < strlen(reduced)); - - /* "...note that the linkage flag is an extra code set character between - the last data character and the Symbol Check Character" (GS1 Specification) */ - - /* Linkage flags in GS1-128 are determined by ISO/IEC 24723 section 7.4 */ - - switch(symbol->option_1) { - case 1: - case 2: - /* CC-A or CC-B 2D component */ - switch(set[strlen(reduced) - 1]) { - case 'A': linkage_flag = 100; break; - case 'B': linkage_flag = 99; break; - case 'C': linkage_flag = 101; break; - } - break; - case 3: - /* CC-C 2D component */ - switch(set[strlen(reduced) - 1]) { - case 'A': linkage_flag = 99; break; - case 'B': linkage_flag = 101; break; - case 'C': linkage_flag = 100; break; - } - break; - } - - if(linkage_flag != 0) { - concat(dest, C128Table[linkage_flag]); - values[bar_characters] = linkage_flag; - bar_characters++; - } - - /*for(i = 0; i < bar_characters; i++) { - printf("[%d] ", values[i]); - } - printf("\n");*/ - - /* check digit calculation */ - total_sum = 0; - for(i = 0; i < bar_characters; i++) - { - if(i > 0) - { - values[i] *= i; - - } - total_sum += values[i]; - } - concat(dest, C128Table[total_sum%103]); - values[bar_characters] = total_sum % 103; - bar_characters++; - - /* Stop character */ - concat(dest, C128Table[106]); - values[bar_characters] = 106; - bar_characters++; - expand(symbol, dest); - - /* Add the separator pattern for composite symbols */ - if(symbol->symbology == BARCODE_EAN128_CC) { - for(i = 0; i < symbol->width; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - set_module(symbol, separator_row, i); - } - } - } - - for(i = 0; i < length; i++) { - if((source[i] != '[') && (source[i] != ']')) { - symbol->text[i] = source[i]; - } - if(source[i] == '[') { - symbol->text[i] = '('; - } - if(source[i] == ']') { - symbol->text[i] = ')'; - } - } - - return error_number; -} - -int nve_18(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Add check digit if encoding an NVE18 symbol */ - int error_number, zeroes, i, nve_check, total_sum, sourcelen; - unsigned char ean128_equiv[25]; - - memset(ean128_equiv, 0, 25); - sourcelen = length; - - if(sourcelen > 17) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - zeroes = 17 - sourcelen; - strcpy((char *)ean128_equiv, "[00]"); - memset(ean128_equiv + 4, '0', zeroes); - strcpy((char*)ean128_equiv + 4 + zeroes, (char*)source); - - total_sum = 0; - for(i = sourcelen - 1; i >= 0; i--) - { - total_sum += ctoi(source[i]); - - if(!(i & 1)) { - total_sum += 2 * ctoi(source[i]); - } - } - nve_check = 10 - total_sum % 10; - if(nve_check == 10) { nve_check = 0; } - ean128_equiv[21] = itoc(nve_check); - ean128_equiv[22] = '\0'; - - error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); - - return error_number; -} - -int ean_14(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* EAN-14 - A version of EAN-128 */ - int i, count, check_digit; - int error_number, zeroes; - unsigned char ean128_equiv[20]; - - if(length > 13) { - strcpy(symbol->errtxt, "Input wrong length"); - return ERROR_TOO_LONG; - } - - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid character in data"); - return error_number; - } - - zeroes = 13 - length; - strcpy((char*)ean128_equiv, "[01]"); - memset(ean128_equiv + 4, '0', zeroes); - ustrcpy(ean128_equiv + 4 + zeroes, source); - - count = 0; - for (i = length - 1; i >= 0; i--) { - count += ctoi(source[i]); - - if (!(i & 1)) { - count += 2 * ctoi(source[i]); - } - } - check_digit = 10 - (count % 10); - if (check_digit == 10) { check_digit = 0; } - ean128_equiv[17] = itoc(check_digit); - ean128_equiv[18] = '\0'; - - error_number = ean_128(symbol, ean128_equiv, ustrlen(ean128_equiv)); - - return error_number; -} diff --git a/3rdparty/zint-2.4.4/backend/code16k.c b/3rdparty/zint-2.4.4/backend/code16k.c deleted file mode 100644 index 638d786..0000000 --- a/3rdparty/zint-2.4.4/backend/code16k.c +++ /dev/null @@ -1,622 +0,0 @@ -/* code16k.c - Handles Code 16k stacked symbology */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* Updated to comply with BS EN 12323:2005 */ - -/* up to 77 characters or 154 numbers */ - -#include -#include -#include -#include "common.h" - -#define TRUE 1 -#define FALSE 0 -#define SHIFTA 90 -#define LATCHA 91 -#define SHIFTB 92 -#define LATCHB 93 -#define SHIFTC 94 -#define LATCHC 95 -#define AORB 96 -#define ABORC 97 -#define CANDB 98 -#define CANDBB 99 - -static int list[2][170]; - -/* EN 12323 Table 1 - "Code 16K" character encodations */ -static char *C16KTable[107] = {"212222", "222122", "222221", "121223", "121322", "131222", "122213", - "122312", "132212", "221213", "221312", "231212", "112232", "122132", "122231", "113222", - "123122", "123221", "223211", "221132", "221231", "213212", "223112", "312131", "311222", - "321122", "321221", "312212", "322112", "322211", "212123", "212321", "232121", "111323", - "131123", "131321", "112313", "132113", "132311", "211313", "231113", "231311", "112133", - "112331", "132131", "113123", "113321", "133121", "313121", "211331", "231131", "213113", - "213311", "213131", "311123", "311321", "331121", "312113", "312311", "332111", "314111", - "221411", "431111", "111224", "111422", "121124", "121421", "141122", "141221", "112214", - "112412", "122114", "122411", "142112", "142211", "241211", "221114", "413111", "241112", - "134111", "111242", "121142", "121241", "114212", "124112", "124211", "411212", "421112", - "421211", "212141", "214121", "412121", "111143", "111341", "131141", "114113", "114311", - "411113", "411311", "113141", "114131", "311141", "411131", "211412", "211214", "211232", - "211133"}; - -/* EN 12323 Table 3 and Table 4 - Start patterns and stop patterns */ -static char *C16KStartStop[8] = {"3211", "2221", "2122", "1411", "1132", "1231", "1114", "3112"}; - -/* EN 12323 Table 5 - Start and stop values defining row numbers */ -static int C16KStartValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7}; -static int C16KStopValues[16] = {0, 1, 2, 3, 4, 5, 6, 7, 4, 5, 6, 7, 0, 1, 2, 3}; - -void grwp16(int *indexliste) -{ - int i, j; - - /* bring together same type blocks */ - if(*(indexliste) > 1) { - i = 1; - while(i < *(indexliste)) { - if(list[1][i - 1] == list[1][i]) { - /* bring together */ - list[0][i - 1] = list[0][i - 1] + list[0][i]; - j = i + 1; - - /* decreace the list */ - while(j < *(indexliste)) { - list[0][j - 1] = list[0][j]; - list[1][j - 1] = list[1][j]; - j++; - } - *(indexliste) = *(indexliste) - 1; - i--; - } - i++; - } - } -} - -void dxsmooth16(int *indexliste) -{ /* Implements rules from ISO 15417 Annex E */ - int i, current, last, next, length; - - for(i = 0; i < *(indexliste); i++) { - current = list[1][i]; - length = list[0][i]; - if(i != 0) { last = list[1][i - 1]; } else { last = FALSE; } - if(i != *(indexliste) - 1) { next = list[1][i + 1]; } else { next = FALSE; } - - if(i == 0) { /* first block */ - if((*(indexliste) == 1) && ((length == 2) && (current == ABORC))) { /* Rule 1a */ list[1][i] = LATCHC; } - if(current == ABORC) { - if(length >= 4) {/* Rule 1b */ list[1][i] = LATCHC; } else { list[1][i] = AORB; current = AORB; } - } - if(current == SHIFTA) { /* Rule 1c */ list[1][i] = LATCHA; } - if((current == AORB) && (next == SHIFTA)) { /* Rule 1c */ list[1][i] = LATCHA; current = LATCHA; } - if(current == AORB) { /* Rule 1d */ list[1][i] = LATCHB; } - } else { - if((current == ABORC) && (length >= 4)) { /* Rule 3 */ list[1][i] = LATCHC; current = LATCHC; } - if(current == ABORC) { list[1][i] = AORB; current = AORB; } - if((current == AORB) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == AORB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } - if((current == AORB) && (next == SHIFTA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == AORB) && (next == SHIFTB)) { list[1][i] = LATCHB; current = LATCHB; } - if(current == AORB) { list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (length > 1)) { /* Rule 4 */ list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (length > 1)) { /* Rule 5 */ list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (last == LATCHA)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (last == LATCHB)) { list[1][i] = LATCHB; current = LATCHB; } - if((current == SHIFTA) && (last == LATCHC)) { list[1][i] = LATCHA; current = LATCHA; } - if((current == SHIFTB) && (last == LATCHC)) { list[1][i] = LATCHB; current = LATCHB; } - } /* Rule 2 is implimented elsewhere, Rule 6 is implied */ - } - grwp16(indexliste); - -} - -void c16k_set_a(unsigned char source, unsigned int values[], unsigned int *bar_chars) -{ - if(source > 127) { - if(source < 160) { - values[(*bar_chars)] = source + 64 - 128; - } else { - values[(*bar_chars)] = source - 32 - 128; - } - } else { - if(source < 32) { - values[(*bar_chars)] = source + 64; - } else { - values[(*bar_chars)] = source - 32; - } - } - (*bar_chars)++; -} - -void c16k_set_b(unsigned char source, unsigned int values[], unsigned int *bar_chars) -{ - if(source > 127) { - values[(*bar_chars)] = source - 32 - 128; - } else { - values[(*bar_chars)] = source - 32; - } - (*bar_chars)++; -} - -void c16k_set_c(unsigned char source_a, unsigned char source_b, unsigned int values[], unsigned int *bar_chars) -{ - int weight; - - weight = (10 * ctoi(source_a)) + ctoi(source_b); - values[(*bar_chars)] = weight; - (*bar_chars)++; -} - -int code16k(struct zint_symbol *symbol, unsigned char source[], int length) -{ - char width_pattern[100]; - int current_row, rows_needed, flip_flop, looper, first_check, second_check; - int indexliste, indexchaine, pads_needed, f_state; - char set[160] = { ' ' }, fset[160] = { ' ' }, mode, last_set, last_fset, current_set; - unsigned int i, j, k, m, e_count, read, mx_reader, writer; - unsigned int values[160] = { 0 }; - unsigned int bar_characters; - float glyph_count; - int errornum, first_sum, second_sum; - int input_length; - int gs1, c_count; - - errornum = 0; - strcpy(width_pattern, ""); - input_length = length; - - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } - - if(input_length > 157) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - e_count = 0; - bar_characters = 0; - - /* Detect extended ASCII characters */ - for(i = 0; i < input_length; i++) { - if(source[i] >=128) { - fset[i] = 'f'; - } - } - fset[i] = '\0'; - - /* Decide when to latch to extended mode */ - for(i = 0; i < input_length; i++) { - j = 0; - if(fset[i] == 'f') { - do { - j++; - } while(fset[i + j] == 'f'); - if((j >= 5) || ((j >= 3) && ((i + j) == (input_length - 1)))) { - for(k = 0; k <= j; k++) { - fset[i + k] = 'F'; - } - } - } - } - - /* Decide if it is worth reverting to 646 encodation for a few characters */ - if(input_length > 1) { - for(i = 1; i < input_length; i++) { - if((fset[i - 1] == 'F') && (fset[i] == ' ')) { - /* Detected a change from 8859-1 to 646 - count how long for */ - for(j = 0; (fset[i + j] == ' ') && ((i + j) < input_length); j++); - if((j < 5) || ((j < 3) && ((i + j) == (input_length - 1)))) { - /* Change to shifting back rather than latching back */ - for(k = 0; k < j; k++) { - fset[i + k] = 'n'; - } - } - } - } - } - /* Detect mode A, B and C characters */ - indexliste = 0; - indexchaine = 0; - - mode = parunmodd(source[indexchaine]); - if((gs1) && (source[indexchaine] == '[')) { mode = ABORC; } /* FNC1 */ - - for(i = 0; i < 160; i++) { - list[0][i] = 0; - } - - do { - list[1][indexliste] = mode; - while ((list[1][indexliste] == mode) && (indexchaine < input_length)) { - list[0][indexliste]++; - indexchaine++; - mode = parunmodd(source[indexchaine]); - if((gs1) && (source[indexchaine] == '[')) { mode = ABORC; } /* FNC1 */ - } - indexliste++; - } while (indexchaine < input_length); - - dxsmooth16(&indexliste); - - /* Put set data into set[] */ - read = 0; - for(i = 0; i < indexliste; i++) { - for(j = 0; j < list[0][i]; j++) { - switch(list[1][i]) { - case SHIFTA: set[read] = 'a'; break; - case LATCHA: set[read] = 'A'; break; - case SHIFTB: set[read] = 'b'; break; - case LATCHB: set[read] = 'B'; break; - case LATCHC: set[read] = 'C'; break; - } - read++; - } - } - - /* Adjust for strings which start with shift characters - make them latch instead */ - if(set[0] == 'a') { - i = 0; - do { - set[i] = 'A'; - i++; - } while (set[i] == 'a'); - } - - if(set[0] == 'b') { - i = 0; - do { - set[i] = 'B'; - i++; - } while (set[i] == 'b'); - } - - /* Watch out for odd-length Mode C blocks */ - c_count = 0; - for(i = 0; i < read; i++) { - if(set[i] == 'C') { - if(source[i] == '[') { - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - c_count = 0; - } else { - c_count++; - } - } else { - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - c_count = 0; - } - } - if(c_count & 1) { - if((i - c_count) != 0) { - set[i - c_count] = 'B'; - } else { - set[i - 1] = 'B'; - } - } - for(i = 1; i < read - 1; i++) { - if((set[i] == 'C') && ((set[i - 1] == 'B') && (set[i + 1] == 'B'))) { - set[i] = 'B'; - } - } - - /* Make sure the data will fit in the symbol */ - last_set = ' '; - last_fset = ' '; - glyph_count = 0.0; - for(i = 0; i < input_length; i++) { - if((set[i] == 'a') || (set[i] == 'b')) { - glyph_count = glyph_count + 1.0; - } - if((fset[i] == 'f') || (fset[i] == 'n')) { - glyph_count = glyph_count + 1.0; - } - if(((set[i] == 'A') || (set[i] == 'B')) || (set[i] == 'C')) { - if(set[i] != last_set) { - last_set = set[i]; - glyph_count = glyph_count + 1.0; - } - } - if(i == 0) { - if((set[i] == 'B') && (set[1] == 'C')) { - glyph_count = glyph_count - 1.0; - } - if((set[i] == 'B') && (set[1] == 'B')) { - if(set[2] == 'C') { - glyph_count = glyph_count - 1.0; - } - } - if(fset[i] == 'F') { - last_fset = 'F'; - glyph_count = glyph_count + 2.0; - } - } else { - if((fset[i] == 'F') && (fset[i - 1] != 'F')) { - last_fset = 'F'; - glyph_count = glyph_count + 2.0; - } - if((fset[i] != 'F') && (fset[i - 1] == 'F')) { - last_fset = ' '; - glyph_count = glyph_count + 2.0; - } - } - - if((set[i] == 'C') && (!((gs1) && (source[i] == '[')))) { - glyph_count = glyph_count + 0.5; - } else { - glyph_count = glyph_count + 1.0; - } - } - - if((gs1) && (set[0] != 'A')) { - /* FNC1 can be integrated with mode character */ - glyph_count--; - } - - if(glyph_count > 77.0) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* Calculate how tall the symbol will be */ - glyph_count = glyph_count + 2.0; - i = glyph_count; - rows_needed = (i/5); - if(i%5 > 0) { rows_needed++; } - - if(rows_needed == 1) { - rows_needed = 2; - } - - /* start with the mode character - Table 2 */ - m = 0; - switch(set[0]) { - case 'A': m = 0; break; - case 'B': m = 1; break; - case 'C': m = 2; break; - } - - if(symbol->output_options & READER_INIT) { - if(m == 2) { m = 5; } - if(gs1) { - strcpy(symbol->errtxt, "Cannot use both GS1 mode and Reader Initialisation"); - return ERROR_INVALID_OPTION; - } else { - if((set[0] == 'B') && (set[1] == 'C')) { m = 6; } - } - values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */ - values[bar_characters + 1] = 96; /* FNC3 */ - bar_characters += 2; - } else { - if(gs1) { - /* Integrate FNC1 */ - switch(set[0]) { - case 'B': m = 3; break; - case 'C': m = 4; break; - } - } else { - if((set[0] == 'B') && (set[1] == 'C')) { m = 5; } - if(((set[0] == 'B') && (set[1] == 'B')) && (set[2] == 'C')) { m = 6; } - } - values[bar_characters] = (7 * (rows_needed - 2)) + m; /* see 4.3.4.2 */ - bar_characters++; - } - - current_set = set[0]; - f_state = 0; /* f_state remembers if we are in Extended ASCII mode (value 1) or - in ISO/IEC 646 mode (value 0) */ - if(fset[0] == 'F') { - switch(current_set) { - case 'A': - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 1; - } - - read = 0; - - /* Encode the data */ - do { - - if((read != 0) && (set[read] != set[read - 1])) - { /* Latch different code set */ - switch(set[read]) - { - case 'A': - values[bar_characters] = 101; - bar_characters++; - current_set = 'A'; - break; - case 'B': - values[bar_characters] = 100; - bar_characters++; - current_set = 'B'; - break; - case 'C': - if(!((read == 1) && (set[0] == 'B'))) { /* Not Mode C/Shift B */ - if(!((read == 2) && ((set[0] == 'B') && (set[1] == 'B')))) { - /* Not Mode C/Double Shift B */ - values[bar_characters] = 99; - bar_characters++; - } - } - current_set = 'C'; - break; - } - } - /* printf("tp8\n"); */ - if(read != 0) { - if((fset[read] == 'F') && (f_state == 0)) { - /* Latch beginning of extended mode */ - switch(current_set) { - case 'A': - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 1; - } - if((fset[read] == ' ') && (f_state == 1)) { - /* Latch end of extended mode */ - switch(current_set) { - case 'A': - values[bar_characters] = 101; - values[bar_characters + 1] = 101; - break; - case 'B': - values[bar_characters] = 100; - values[bar_characters + 1] = 100; - break; - } - bar_characters += 2; - f_state = 0; - } - } - - if((fset[i] == 'f') || (fset[i] == 'n')) { - /* Shift extended mode */ - switch(current_set) { - case 'A': - values[bar_characters] = 101; /* FNC 4 */ - break; - case 'B': - values[bar_characters] = 100; /* FNC 4 */ - break; - } - bar_characters++; - } - - if((set[i] == 'a') || (set[i] == 'b')) { - /* Insert shift character */ - values[bar_characters] = 98; - bar_characters++; - } - - if(!((gs1) && (source[read] == '['))) { - switch(set[read]) - { /* Encode data characters */ - case 'A': - case 'a': - c16k_set_a(source[read], values, &bar_characters); - read++; - break; - case 'B': - case 'b': - c16k_set_b(source[read], values, &bar_characters); - read++; - break; - case 'C': c16k_set_c(source[read], source[read + 1], values, &bar_characters); - read += 2; - break; - } - } else { - values[bar_characters] = 102; - bar_characters++; - read++; - } - /* printf("tp9 read=%d surrent set=%c\n", read, set[read]); */ - } while (read < ustrlen(source)); - - pads_needed = 5 - ((bar_characters + 2) % 5); - if(pads_needed == 5) { - pads_needed = 0; - } - if((bar_characters + pads_needed) < 8) { - pads_needed += 8 - (bar_characters + pads_needed); - } - for(i = 0; i < pads_needed; i++) { - values[bar_characters] = 106; - bar_characters++; - } - - /* Calculate check digits */ - first_sum = 0; - second_sum = 0; - for(i = 0; i < bar_characters; i++) - { - first_sum += (i+2) * values[i]; - second_sum += (i+1) * values[i]; - } - first_check = first_sum % 107; - second_sum += first_check * (bar_characters + 1); - second_check = second_sum % 107; - values[bar_characters] = first_check; - values[bar_characters + 1] = second_check; - bar_characters += 2; - - for(current_row = 0; current_row < rows_needed; current_row++) { - - strcpy(width_pattern, ""); - concat(width_pattern, C16KStartStop[C16KStartValues[current_row]]); - concat(width_pattern, "1"); - for(i = 0; i < 5; i++) { - concat(width_pattern, C16KTable[values[(current_row * 5) + i]]); - /* printf("[%d] ", values[(current_row * 5) + i]); */ - - } - concat(width_pattern, C16KStartStop[C16KStopValues[current_row]]); - /* printf("\n"); */ - - /* Write the information into the symbol */ - writer = 0; - flip_flop = 1; - for (mx_reader = 0; mx_reader < strlen(width_pattern); mx_reader++) { - for(looper = 0; looper < ctoi(width_pattern[mx_reader]); looper++) { - if(flip_flop == 1) { - set_module(symbol, current_row, writer); - writer++; } - else { - writer++; } - } - if(flip_flop == 0) { flip_flop = 1; } else { flip_flop = 0; } - } - symbol->row_height[current_row] = 10; - } - - symbol->rows = rows_needed; - symbol->width = 70; - return errornum; -} - - diff --git a/3rdparty/zint-2.4.4/backend/code49.c b/3rdparty/zint-2.4.4/backend/code49.c deleted file mode 100644 index c90fe10..0000000 --- a/3rdparty/zint-2.4.4/backend/code49.c +++ /dev/null @@ -1,315 +0,0 @@ -/* code49.c - Handles Code 49 */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#include "common.h" -#include "code49.h" - -#define INSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%!&*" -/* "!" represents Shift 1 and "&" represents Shift 2, "*" represents FNC1 */ - -int code_49(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int i, j, rows, M, x_count, y_count, z_count, posn_val, local_value, h; - char intermediate[170]; - int codewords[170], codeword_count; - int c_grid[8][8]; /* Refers to table 3 */ - int w_grid[8][4]; /* Refets to table 2 */ - int pad_count = 0; - char pattern[40]; - int gs1; - - if(length > 81) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } - - strcpy(intermediate, gs1 ? "*" : ""); /* FNC1 */ - for(i = 0; i < length; i++) { - if(source[i] > 127) { - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ERROR_INVALID_DATA1; - } - if(gs1 && (source[i] == '[')) - concat(intermediate, "*"); /* FNC1 */ - else - concat(intermediate, c49_table7[source[i]]); - } - - codeword_count = 0; - i = 0; - h = strlen(intermediate); - do { - if((intermediate[i] >= '0') && (intermediate[i] <= '9')) { - /* Numeric data */ - for(j = 0; (intermediate[i + j] >= '0') && (intermediate[i + j] <= '9'); j++); - if(j >= 5) { - /* Use Numeric Encodation Method */ - int block_count, c; - int block_remain; - int block_value; - - codewords[codeword_count] = 48; /* Numeric Shift */ - codeword_count++; - - block_count = j / 5; - block_remain = j % 5; - - for(c = 0; c < block_count; c++) { - if((c == block_count - 1) && (block_remain == 2)) { - /* Rule (d) */ - block_value = 100000; - block_value += ctoi(intermediate[i]) * 1000; - block_value += ctoi(intermediate[i + 1]) * 100; - block_value += ctoi(intermediate[i + 2]) * 10; - block_value += ctoi(intermediate[i + 3]); - - codewords[codeword_count] = block_value / (48 * 48); - block_value = block_value - (48 * 48) * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 4; - block_value = ctoi(intermediate[i]) * 100; - block_value += ctoi(intermediate[i + 1]) * 10; - block_value += ctoi(intermediate[i + 2]); - - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 3; - } else { - block_value = ctoi(intermediate[i]) * 10000; - block_value += ctoi(intermediate[i + 1]) * 1000; - block_value += ctoi(intermediate[i + 2]) * 100; - block_value += ctoi(intermediate[i + 3]) * 10; - block_value += ctoi(intermediate[i + 4]); - - codewords[codeword_count] = block_value / (48 * 48); - block_value = block_value - (48 * 48) * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 5; - } - } - - switch(block_remain) { - case 1: - /* Rule (a) */ - codewords[codeword_count] = posn(INSET, intermediate[i]); - codeword_count++; - i++; - break; - case 3: - /* Rule (b) */ - block_value = ctoi(intermediate[i]) * 100; - block_value += ctoi(intermediate[i + 1]) * 10; - block_value += ctoi(intermediate[i + 2]); - - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 3; - break; - case 4: - /* Rule (c) */ - block_value = 100000; - block_value += ctoi(intermediate[i]) * 1000; - block_value += ctoi(intermediate[i + 1]) * 100; - block_value += ctoi(intermediate[i + 2]) * 10; - block_value += ctoi(intermediate[i + 3]); - - codewords[codeword_count] = block_value / (48 * 48); - block_value = block_value - (48 * 48) * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value / 48; - block_value = block_value - 48 * codewords[codeword_count]; - codeword_count++; - codewords[codeword_count] = block_value; - codeword_count++; - i += 4; - break; - } - if(i < h) { - /* There is more to add */ - codewords[codeword_count] = 48; /* Numeric Shift */ - codeword_count++; - } - } else { - codewords[codeword_count] = posn(INSET, intermediate[i]); - codeword_count++; - i++; - } - } else { - codewords[codeword_count] = posn(INSET, intermediate[i]); - codeword_count++; - i++; - } - } while(i < h); - - switch(codewords[0]) { /* Set starting mode value */ - case 48: M = 2; break; - case 43: M = 4; break; - case 44: M = 5; break; - default: M = 0; break; - } - - if(M != 0) { - for(i = 0; i < codeword_count; i++) { - codewords[i] = codewords[i + 1]; - } - codeword_count--; - } - - if(codeword_count > 49) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* Place codewords in code character array (c grid) */ - rows = 0; - do{ - for(i = 0; i < 7; i++) { - if(((rows * 7) + i) < codeword_count) { - c_grid[rows][i] = codewords[(rows * 7) + i]; - } else { - c_grid[rows][i] = 48; /* Pad */ - pad_count++; - } - } - rows++; - } while ((rows * 7) < codeword_count); - - if((((rows <= 6) && (pad_count < 5))) || (rows > 6) || (rows == 1)) { - /* Add a row */ - for(i = 0; i < 7; i++) { - c_grid[rows][i] = 48; /* Pad */ - } - rows++; - } - - /* Add row count and mode character */ - c_grid[rows - 1][6] = (7 * (rows - 2)) + M; - - /* Add row check character */ - for(i = 0; i < rows - 1; i++) { - int row_sum = 0; - - for(j = 0; j < 7; j++) { - row_sum += c_grid[i][j]; - } - c_grid[i][7] = row_sum % 49; - } - - /* Calculate Symbol Check Characters */ - posn_val = 0; - x_count = c_grid[rows - 1][6] * 20; - y_count = c_grid[rows - 1][6] * 16; - z_count = c_grid[rows - 1][6] * 38; - for(i = 0; i < rows - 1; i++) { - for(j = 0; j < 4; j++) { - local_value = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1]; - x_count += c49_x_weight[posn_val] * local_value; - y_count += c49_y_weight[posn_val] * local_value; - z_count += c49_z_weight[posn_val] * local_value; - posn_val++; - } - } - - if(rows > 6) { - /* Add Z Symbol Check */ - c_grid[rows - 1][0] = (z_count % 2401) / 49; - c_grid[rows - 1][1] = (z_count % 2401) % 49; - } - - local_value = (c_grid[rows - 1][0] * 49) + c_grid[rows - 1][1]; - x_count += c49_x_weight[posn_val] * local_value; - y_count += c49_y_weight[posn_val] * local_value; - posn_val++; - - /* Add Y Symbol Check */ - c_grid[rows - 1][2] = (y_count % 2401) / 49; - c_grid[rows - 1][3] = (y_count % 2401) % 49; - - local_value = (c_grid[rows - 1][2] * 49) + c_grid[rows - 1][3]; - x_count += c49_x_weight[posn_val] * local_value; - - /* Add X Symbol Check */ - c_grid[rows - 1][4] = (x_count % 2401) / 49; - c_grid[rows - 1][5] = (x_count % 2401) % 49; - - /* Add last row check character */ - j = 0; - for(i = 0; i < 7; i++) { - j += c_grid[rows - 1][i]; - } - c_grid[rows - 1][7] = j % 49; - - /* Transfer data to symbol character array (w grid) */ - for(i = 0; i < rows; i++) { - for(j = 0; j < 4; j ++) { - w_grid[i][j] = (c_grid[i][2 * j] * 49) + c_grid[i][(2 * j) + 1]; - } - } - - for(i = 0; i < rows; i++) { - strcpy(pattern, "11"); /* Start character */ - for(j = 0; j < 4; j++) { - if(i != (rows - 1)) { - if(c49_table4[i][j] == 'E') { - /* Even Parity */ - concat(pattern, c49_appxe_even[w_grid[i][j]]); - } else { - /* Odd Parity */ - concat(pattern, c49_appxe_odd[w_grid[i][j]]); - } - } else { - /* Last row uses all even parity */ - concat(pattern, c49_appxe_even[w_grid[i][j]]); - } - } - concat(pattern, "4"); /* Stop character */ - - /* Expand into symbol */ - symbol->row_height[i] = 10; - expand(symbol, pattern); - } - - symbol->whitespace_width = 10; - symbol->output_options = BARCODE_BIND; - symbol->border_width = 2; - - return 0; -} diff --git a/3rdparty/zint-2.4.4/backend/code49.h b/3rdparty/zint-2.4.4/backend/code49.h deleted file mode 100644 index 2b27bc1..0000000 --- a/3rdparty/zint-2.4.4/backend/code49.h +++ /dev/null @@ -1,1175 +0,0 @@ -/* code49.h - Code 49 Tables */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* This data set taken from ANSI/AIM-BC6-2000, 4th April 2000 */ - -static char *c49_table7[128] = { - /* Table 7: Code 49 ASCII Chart */ - "! ", "!A", "!B", "!C", "!D", "!E", "!F", "!G", "!H", "!I", "!J", "!K", "!L", - "!M", "!N", "!O", "!P", "!Q", "!R", "!S", "!T", "!U", "!V", "!W", "!X", "!Y", - "!Z", "!1", "!2", "!3", "!4", "!5", " ", "!6", "!7", "!8", "$", "%", "!9", "!0", - "!-", "!.", "!$", "+", "!/", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", - "7", "8", "9", "!+", "&1", "&2", "&3", "&4", "&5", "&6", "A", "B", "C", "D", "E", - "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", - "V", "W", "X", "Y", "Z", "&7", "&8", "&9", "&0", "&-", "&.", "&A", "&B", "&C", - "&D", "&E", "&F", "&G", "&H", "&I", "&J", "&K", "&L", "&M", "&N", "&O", "&P", - "&Q", "&R", "&S", "&T", "&U", "&V", "&W", "&X", "&Y", "&Z", "&$", "&/", "&+", - "&%", "& " -}; - -/* Table 5: Check Character Weighting Values */ -int c49_x_weight[] = { - 1, 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, - 39, 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10 -}; - -int c49_y_weight[] = { - 9, 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39, - 11, 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24 -}; - -int c49_z_weight[] = { - 31, 26, 2, 12, 17, 23, 37, 18, 22, 6, 27, 44, 15, 43, 39, 11, - 13, 5, 41, 33, 36, 8, 4, 32, 3, 19, 40, 25, 29, 10, 24, 30 -}; - -static char *c49_table4[8] = { - /* Table 4: Row Parity Pattern for Code 49 Symbols */ - "OEEO", "EOEO", "OOEE", "EEOO", "OEOE", "EOOE", "OOOO", "EEEE" -}; - -static char *c49_appxe_even[2401] = { - /* Appendix E - Code 49 Encodation Patterns (Even Symbol Character Parity) */ - /* Column 1 */ - "11521132", - "25112131", "14212132", "25121221", "14221222", "12412132", - "23321221", "12421222", "21521221", "15112222", "15121312", - "13312222", "24221311", "13321312", "11512222", "22421311", - "11521312", "25112311", "14212312", "23312311", "12412312", - "21512311", "16121131", "14321131", "12521131", "15212131", - "15221221", "13412131", "13421221", "11612131", "16112221", - "16121311", "14312221", "14321311", "12512221", "12521311", - "15212311", "13412311", "11612311", "11131135", "31131133", - "51131131", "21122134", "41122132", "21131224", "41131222", - "11113135", "31113133", "51113131", "11122225", "31122223", - "51122221", "11131315", "31131313", "51131311", "21113224", - "41113222", "21122314", - /* Column 2 */ - "41122312", "11113315", "31113313", - "51113311", "12131134", "32131132", "21231133", "41231131", - "22122133", "42122131", "11222134", "22131223", "42131221", - "11231224", "31231222", "12113134", "32113132", "12122224", - "32122222", "12131314", "32131312", "21231313", "41231311", - "22113223", "42113221", "11213224", "22122313", "42122311", - "11222314", "31222312", "12113314", "32113312", "21213313", - "41213311", "13131133", "33131131", "22231132", "11331133", - "31331131", "23122132", "12222133", "23131222", "12231223", - "32231221", "21331222", "13113133", "33113131", "13122223", - "33122221", "11313133", "13131313", "33131311", "11322223", - "22231312", "11331313", "31331311", "23113222", "12213223", - /* Column 3 */ - "23122312", "12222313", "32222311", "21322312", "13113313", - "33113311", "22213312", "11313313", "31313311", "14131132", - "23231131", "12331132", "21431131", "24122131", "13222132", - "24131221", "13231222", "11422132", "22331221", "11431222", - "14113132", "14122222", "12313132", "14131312", "12322222", - "23231311", "12331312", "21431311", "24113221", "13213222", - "24122311", "13222312", "11413222", "22322311", "11422312", - "14113312", "23213311", "12313312", "21413311", "15131131", - "13331131", "14222131", "14231221", "12422131", "12431221", - "15113131", "15122221", "13313131", "15131311", "13322221", - "11513131", "13331311", "11522221", "14213221", "14222311", - "12413221", "12422311", "15113311", - /* Column 4 */ - "13313311", "11513311", - "11141134", "31141132", "21132133", "41132131", "21141223", - "41141221", "11123134", "31123132", "11132224", "31132222", - "11141314", "31141312", "21114133", "41114131", "21123223", - "41123221", "21132313", "41132311", "11114224", "31114222", - "11123314", "31123312", "21114313", "41114311", "12141133", - "32141131", "21241132", "22132132", "11232133", "22141222", - "11241223", "31241221", "12123133", "32123131", "12132223", - "32132221", "12141313", "32141311", "21241312", "22114132", - "11214133", "22123222", "11223223", "22132312", "11232313", - "31232311", "12114223", "32114221", "12123313", "32123311", - "21223312", "22114312", "11214313", "31214311", "13141132", - "22241131", - /* Column 5 */ - "11341132", "23132131", "12232132", "23141221", - "12241222", "21341221", "13123132", "13132222", "11323132", - "13141312", "11332222", "22241311", "11341312", "23114131", - "12214132", "23123221", "12223222", "23132311", "12232312", - "21332311", "13114222", "13123312", "11314222", "22223311", - "11323312", "23114311", "12214312", "21314311", "14141131", - "12341131", "13232131", "13241221", "11432131", "14123131", - "14132221", "12323131", "14141311", "12332221", "12341311", - "13214131", "13223221", "11414131", "13232311", "11423221", - "11432311", "14114221", "14123311", "12314221", "12323311", - "13214311", "11414311", "11151133", "31151131", "21142132", - "21151222", "11133133", "31133131", "11142223", - /* Column 6 */ - "31142221", - "11151313", "31151311", "21124132", "21133222", "21142312", - "11115133", "31115131", "11124223", "31124221", "11133313", - "31133311", "21115222", "21124312", "12151132", "21251131", - "22142131", "11242132", "22151221", "11251222", "12133132", - "12142222", "12151312", "21251311", "22124131", "11224132", - "22133221", "11233222", "22142311", "11242312", "12115132", - "12124222", "12133312", "21233311", "22115221", "11215222", - "22124311", "11224312", "13151131", "12242131", "12251221", - "13133131", "13142221", "11333131", "13151311", "11342221", - "12224131", "12233221", "12242311", "13115131", "13124221", - "11315131", "13133311", "11324221", "11333311", "12215221", - "12224311", "11161132", - /* Column 7 */ - "21152131", "21161221", "11143132", - "11152222", "11161312", "21134131", "21143221", "21152311", - "11125132", "11134222", "11143312", "21116131", "21125221", - "21134311", "12161131", "11252131", "12143131", "12152221", - "12161311", "11234131", "11243221", "11252311", "12125131", - "12134221", "12143311", "11216131", "11225221", "11234311", - "11111236", "31111234", "51111232", "21111325", "41111323", - "61111321", "11111416", "31111414", "51111412", "31211143", - "51211141", "12111235", "32111233", "52111231", "21211234", - "41211232", "22111324", "42111322", "11211325", "31211323", - "51211321", "12111415", "32111413", "52111411", "21211414", - "41211412", "12211144", "32211142", "21311143", "41311141", - /* Column 8 */ - "13111234", "33111232", "22211233", "42211231", "11311234", - "31311232", "23111323", "43111321", "12211324", "32211322", - "21311323", "41311321", "13111414", "33111412", "22211413", - "42211411", "11311414", "31311412", "13211143", "33211141", - "22311142", "11411143", "31411141", "14111233", "34111231", - "23211232", "12311233", "32311231", "21411232", "24111322", - "13211323", "33211321", "22311322", "11411323", "31411321", - "14111413", "34111411", "23211412", "12311413", "32311411", - "21411412", "14211142", "23311141", "12411142", "21511141", - "15111232", "24211231", "13311232", "22411231", "11511232", - "25111321", "14211322", "23311321", "12411322", "21511321", - "15111412", "24211411", "13311412", - /* Column 9 */ - "22411411", "11511412", - "15211141", "13411141", "11611141", "16111231", "14311231", - "12511231", "15211321", "13411321", "11611321", "16111411", - "14311411", "12511411", "21121144", "41121142", "11112145", - "31112143", "51112141", "11121235", "31121233", "51121231", - "21112234", "41112232", "21121324", "41121322", "11112325", - "31112323", "51112321", "11121415", "31121413", "51121411", - "21112414", "41112412", "22121143", "42121141", "11221144", - "31221142", "12112144", "32112142", "12121234", "32121232", - "21221233", "41221231", "22112233", "42112231", "11212234", - "22121323", "42121321", "11221324", "31221322", "12112324", - "32112322", "12121414", "32121412", "21221413", "41221411", - "22112413", - /* Column 10 */ - "42112411", "11212414", "31212412", "23121142", - "12221143", "32221141", "21321142", "13112143", "33112141", - "13121233", "33121231", "11312143", "22221232", "11321233", - "31321231", "23112232", "12212233", "23121322", "12221323", - "32221321", "21321322", "13112323", "33112321", "13121413", - "33121411", "11312323", "22221412", "11321413", "31321411", - "23112412", "12212413", "32212411", "21312412", "24121141", - "13221142", "22321141", "11421142", "14112142", "14121232", - "12312142", "23221231", "12321232", "21421231", "24112231", - "13212232", "24121321", "13221322", "11412232", "22321321", - "11421322", "14112322", "14121412", "12312322", "23221411", - "12321412", "21421411", "24112411", "13212412", - /* Column 11 */ - "22312411", - "11412412", "14221141", "12421141", "15112141", "15121231", - "13312141", "13321231", "11512141", "11521231", "14212231", - "14221321", "12412231", "12421321", "15112321", "15121411", - "13312321", "13321411", "11512321", "11521411", "14212411", - "12412411", "21131143", "41131141", "11122144", "31122142", - "11131234", "31131232", "21113143", "41113141", "21122233", - "41122231", "21131323", "41131321", "11113234", "31113232", - "11122324", "31122322", "11131414", "31131412", "21113323", - "41113321", "21122413", "41122411", "11113414", "31113412", - "22131142", "11231143", "31231141", "12122143", "32122141", - "12131233", "32131231", "21231232", "22113142", "11213143", - "22122232", "11222233", - /* Column 12 */ - "22131322", "11231323", "31231321", - "12113233", "32113231", "12122323", "32122321", "12131413", - "32131411", "21231412", "22113322", "11213323", "22122412", - "11222413", "31222411", "12113413", "32113411", "21213412", - "23131141", "12231142", "21331141", "13122142", "13131232", - "11322142", "22231231", "11331232", "23113141", "12213142", - "23122231", "12222232", "23131321", "12231322", "21331321", - "13113232", "13122322", "11313232", "13131412", "11322322", - "22231411", "11331412", "23113321", "12213322", "23122411", - "12222412", "21322411", "13113412", "22213411", "11313412", - "13231141", "11431141", "14122141", "14131231", "12322141", - "12331231", "13213141", "13222231", "11413141", "13231321", - /* Column 13 */ - "11422231", "11431321", "14113231", "14122321", "12313231", - "14131411", "12322321", "12331411", "13213321", "13222411", - "11413321", "11422411", "14113411", "12313411", "21141142", - "11132143", "31132141", "11141233", "31141231", "21123142", - "21132232", "21141322", "11114143", "31114141", "11123233", - "31123231", "11132323", "31132321", "11141413", "31141411", - "21114232", "21123322", "21132412", "11114323", "31114321", - "11123413", "31123411", "22141141", "11241142", "12132142", - "12141232", "21241231", "22123141", "11223142", "22132231", - "11232232", "22141321", "11241322", "12114142", "12123232", - "12132322", "12141412", "21241411", "22114231", "11214232", - "22123321", "11223322", "22132411", - /* Column 14 */ - "11232412", "12114322", - "12123412", "21223411", "12241141", "13132141", "13141231", - "11332141", "11341231", "12223141", "12232231", "12241321", - "13114141", "13123231", "11314141", "13132321", "11323231", - "13141411", "11332321", "11341411", "12214231", "12223321", - "12232411", "13114321", "13123411", "11314321", "11323411", - "21151141", "11142142", "11151232", "21133141", "21142231", - "21151321", "11124142", "11133232", "11142322", "11151412", - "21115141", "21124231", "21133321", "21142411", "11115232", - "11124322", "11133412", "11251141", "12142141", "12151231", - "11233141", "11242231", "11251321", "12124141", "12133231", - "12142321", "12151411", "11215141", "11224231", "11233321", - "11242411", - /* Column 15 */ - "12115231", "12124321", "12133411", "11152141", - "11161231", "11134141", "11143231", "11152321", "11161411", - "11116141", "11125231", "11134321", "11143411", "21111244", - "41111242", "11111335", "31111333", "51111331", "21111424", - "41111422", "11111515", "31111513", "51111511", "21211153", - "41211151", "22111243", "42111241", "11211244", "31211242", - "12111334", "32111332", "21211333", "41211331", "22111423", - "42111421", "11211424", "31211422", "12111514", "32111512", - "21211513", "41211511", "22211152", "11311153", "31311151", - "23111242", "12211243", "32211241", "21311242", "13111333", - "33111331", "22211332", "11311333", "31311331", "23111422", - "12211423", "32211421", "21311422", "13111513", - /* Column 16 */ - "33111511", - "22211512", "11311513", "31311511", "23211151", "12311152", - "21411151", "24111241", "13211242", "22311241", "11411242", - "14111332", "23211331", "12311332", "21411331", "24111421", - "13211422", "22311421", "11411422", "14111512", "23211511", - "12311512", "21411511", "13311151", "11511151", "14211241", - "12411241", "15111331", "13311331", "11511331", "14211421", - "12411421", "15111511", "13311511", "11511511", "31121152", - "21112153", "41112151", "21121243", "41121241", "11112244", - "31112242", "11121334", "31121332", "21112333", "41112331", - "21121423", "41121421", "11112424", "31112422", "11121514", - "31121512", "21112513", "41112511", "12121153", "32121151", - "21221152", "22112152", - /* Column 17 */ - "11212153", "22121242", "11221243", - "31221241", "12112243", "32112241", "12121333", "32121331", - "21221332", "22112332", "11212333", "22121422", "11221423", - "31221421", "12112423", "32112421", "12121513", "32121511", - "21221512", "22112512", "11212513", "31212511", "13121152", - "22221151", "11321152", "23112151", "12212152", "23121241", - "12221242", "21321241", "13112242", "13121332", "11312242", - "22221331", "11321332", "23112331", "12212332", "23121421", - "12221422", "21321421", "13112422", "13121512", "11312422", - "22221511", "11321512", "23112511", "12212512", "21312511", - "14121151", "12321151", "13212151", "13221241", "11412151", - "11421241", "14112241", "14121331", "12312241", "12321331", - /* Column 18 */ - "13212331", "13221421", "11412331", "11421421", "14112421", - "14121511", "12312421", "12321511", "13212511", "11412511", - "11131153", "31131151", "21122152", "21131242", "11113153", - "31113151", "11122243", "31122241", "11131333", "31131331", - "21113242", "21122332", "21131422", "11113333", "31113331", - "11122423", "31122421", "11131513", "31131511", "21113422", - "21122512", "12131152", "21231151", "22122151", "11222152", - "22131241", "11231242", "12113152", "12122242", "12131332", - "21231331", "22113241", "11213242", "22122331", "11222332", - "22131421", "11231422", "12113332", "12122422", "12131512", - "21231511", "22113421", "11213422", "22122511", "11222512", - "13131151", "11331151", "12222151", - /* Column 19 */ - "12231241", "13113151", - "13122241", "11313151", "13131331", "11322241", "11331331", - "12213241", "12222331", "12231421", "13113331", "13122421", - "11313331", "13131511", "11322421", "11331511", "12213421", - "12222511", "11141152", "21132151", "21141241", "11123152", - "11132242", "11141332", "21114151", "21123241", "21132331", - "21141421", "11114242", "11123332", "11132422", "11141512", - "21114331", "21123421", "21132511", "12141151", "11232151", - "11241241", "12123151", "12132241", "12141331", "11214151", - "11223241", "11232331", "11241421", "12114241", "12123331", - "12132421", "12141511", "11214331", "11223421", "11232511", - "11151151", "11133151", "11142241", "11151331", "11115151", - "11124241", - /* Column 20 */ - "11133331", "11142421", "11151511", "11111254", - "31111252", "21111343", "41111341", "11111434", "31111432", - "21111523", "41111521", "11111614", "31111612", "31211161", - "12111253", "32111251", "21211252", "22111342", "11211343", - "31211341", "12111433", "32111431", "21211432", "22111522", - "11211523", "31211521", "12111613", "32111611", "21211612", - "12211162", "21311161", "13111252", "22211251", "11311252", - "23111341", "12211342", "21311341", "13111432", "22211431", - "11311432", "23111521", "12211522", "21311521", "13111612", - "22211611", "11311612", "13211161", "11411161", "14111251", - "12311251", "13211341", "11411341", "14111431", "12311431", - "13211521", "11411521", "14111611", "12311611", - /* Column 21 */ - "21121162", - "11112163", "31112161", "11121253", "31121251", "21112252", - "21121342", "11112343", "31112341", "11121433", "31121431", - "21112432", "21121522", "11112523", "31112521", "11121613", - "31121611", "22121161", "11221162", "12112162", "12121252", - "21221251", "22112251", "11212252", "22121341", "11221342", - "12112342", "12121432", "21221431", "22112431", "11212432", - "22121521", "11221522", "12112522", "12121612", "21221611", - "12221161", "13112161", "13121251", "11312161", "11321251", - "32121115", "52121113", "21221116", "41221114", "61221112", - "22112116", "42112114", "31212115", "51212113", "13121116", - "33121114", "22221115", "42221113", "11321116", "31321114", - "51321112", "23112115", - /* Column 22 */ - "43112113", "12212116", "32212114", - "52212112", "21312115", "41312113", "61312111", "14121115", - "34121113", "23221114", "43221112", "12321115", "32321113", - "52321111", "21421114", "41421112", "24112114", "13212115", - "33212113", "22312114", "42312112", "11412115", "31412113", - "51412111", "15121114", "24221113", "13321114", "33321112", - "22421113", "42421111", "11521114", "31521112", "25112113", - "14212114", "34212112", "23312113", "43312111", "12412114", - "32412112", "21512113", "41512111", "16121113", "25221112", - "14321113", "34321111", "23421112", "12521113", "32521111", - "15212113", "24312112", "13412113", "33412111", "22512112", - "11612113", "31612111", "31131115", "51131113", "21122116", - /* Column 23 */ - "41122114", "61122112", "31113115", "51113113", "12131116", - "32131114", "52131112", "21231115", "41231113", "61231111", - "22122115", "42122113", "11222116", "31222114", "51222112", - "12113116", "32113114", "52113112", "21213115", "41213113", - "61213111", "13131115", "33131113", "22231114", "42231112", - "11331115", "31331113", "51331111", "23122114", "43122112", - "12222115", "32222113", "52222111", "21322114", "41322112", - "13113115", "33113113", "22213114", "42213112", "11313115", - "31313113", "51313111", "14131114", "34131112", "23231113", - "43231111", "12331114", "32331112", "21431113", "41431111", - "24122113", "13222114", "33222112", "22322113", "42322111", - "11422114", "31422112", "14113114", - /* Column 24 */ - "34113112", "23213113", - "43213111", "12313114", "32313112", "21413113", "41413111", - "15131113", "24231112", "13331113", "33331111", "22431112", - "25122112", "14222113", "34222111", "23322112", "12422113", - "32422111", "21522112", "15113113", "24213112", "13313113", - "33313111", "22413112", "11513113", "31513111", "16131112", - "25231111", "14331112", "23431111", "15222112", "24322111", - "13422112", "22522111", "16113112", "25213111", "14313112", - "23413111", "12513112", "21613111", "11141116", "31141114", - "51141112", "21132115", "41132113", "61132111", "11123116", - "31123114", "51123112", "21114115", "41114113", "61114111", - "12141115", "32141113", "52141111", "21241114", "41241112", - "22132114", - /* Column 25 */ - "42132112", "11232115", "31232113", "51232111", - "12123115", "32123113", "52123111", "21223114", "41223112", - "22114114", "42114112", "11214115", "31214113", "51214111", - "13141114", "33141112", "22241113", "42241111", "11341114", - "31341112", "23132113", "43132111", "12232114", "32232112", - "21332113", "41332111", "13123114", "33123112", "22223113", - "42223111", "11323114", "31323112", "23114113", "43114111", - "12214114", "32214112", "21314113", "41314111", "14141113", - "34141111", "23241112", "12341113", "32341111", "24132112", - "13232113", "33232111", "22332112", "11432113", "31432111", - "14123113", "34123111", "23223112", "12323113", "32323111", - "21423112", "24114112", "13214113", "33214111", - /* Column 26 */ - "22314112", - "11414113", "31414111", "15141112", "24241111", "13341112", - "25132111", "14232112", "23332111", "12432112", "15123112", - "24223111", "13323112", "22423111", "11523112", "25114111", - "14214112", "23314111", "12414112", "21514111", "16141111", - "14341111", "15232111", "13432111", "16123111", "14323111", - "12523111", "15214111", "13414111", "11614111", "11151115", - "31151113", "51151111", "21142114", "41142112", "11133115", - "31133113", "51133111", "21124114", "41124112", "11115115", - "31115113", "51115111", "12151114", "32151112", "21251113", - "41251111", "22142113", "42142111", "11242114", "31242112", - "12133114", "32133112", "21233113", "41233111", "22124113", - "42124111", "11224114", - /* Column 27 */ - "31224112", "12115114", "32115112", - "21215113", "41215111", "13151113", "33151111", "22251112", - "23142112", "12242113", "32242111", "21342112", "13133113", - "33133111", "22233112", "11333113", "31333111", "23124112", - "12224113", "32224111", "21324112", "13115113", "33115111", - "22215112", "11315113", "31315111", "14151112", "23251111", - "24142111", "13242112", "22342111", "14133112", "23233111", - "12333112", "21433111", "24124111", "13224112", "22324111", - "11424112", "14115112", "23215111", "12315112", "21415111", - "15151111", "14242111", "15133111", "13333111", "14224111", - "12424111", "15115111", "13315111", "11515111", "11161114", - "31161112", "21152113", "41152111", "11143114", "31143112", - /* Column 28 */ - "21134113", "41134111", "11125114", "31125112", "21116113", - "41116111", "12161113", "32161111", "22152112", "11252113", - "31252111", "12143113", "32143111", "21243112", "22134112", - "11234113", "31234111", "12125113", "32125111", "21225112", - "22116112", "11216113", "31216111", "13161112", "23152111", - "12252112", "13143112", "22243111", "11343112", "23134111", - "12234112", "21334111", "13125112", "22225111", "11325112", - "23116111", "12216112", "21316111", "14161111", "13252111", - "14143111", "12343111", "13234111", "11434111", "14125111", - "12325111", "13216111", "11416111", "31111216", "51111214", - "31211125", "51211123", "32111215", "52111213", "21211216", - "41211214", "61211212", "12211126", - /* Column 29 */ - "32211124", "52211122", - "21311125", "41311123", "61311121", "13111216", "33111214", - "22211215", "42211213", "11311216", "31311214", "51311212", - "13211125", "33211123", "22311124", "42311122", "11411125", - "31411123", "51411121", "14111215", "34111213", "23211214", - "43211212", "12311215", "32311213", "52311211", "21411214", - "41411212", "14211124", "34211122", "23311123", "43311121", - "12411124", "32411122", "21511123", "41511121", "15111214", - "24211213", "13311214", "33311212", "22411213", "42411211", - "11511214", "31511212", "15211123", "24311122", "13411123", - "33411121", "22511122", "11611123", "31611121", "16111213", - "25211212", "14311213", "34311211", "23411212", "12511213", - "32511211", - /* Column 30 */ - "21611212", "21121126", "41121124", "61121122", - "31112125", "51112123", "31121215", "51121213", "21112216", - "41112214", "61112212", "22121125", "42121123", "11221126", - "31221124", "51221122", "12112126", "32112124", "52112122", - "12121216", "32121214", "52121212", "21221215", "41221213", - "61221211", "22112215", "42112213", "11212216", "31212214", - "51212212", "23121124", "43121122", "12221125", "32221123", - "52221121", "21321124", "41321122", "13112125", "33112123", - "13121215", "33121213", "11312125", "22221214", "42221212", - "11321215", "31321213", "51321211", "23112214", "43112212", - "12212215", "32212213", "52212211", "21312214", "41312212", - "24121123", "13221124", "33221122", "22321123", - /* Column 31 */ - "42321121", - "11421124", "31421122", "14112124", "34112122", "14121214", - "34121212", "12312124", "23221213", "43221211", "12321214", - "32321212", "21421213", "41421211", "24112213", "13212214", - "33212212", "22312213", "42312211", "11412214", "31412212", - "25121122", "14221123", "34221121", "23321122", "12421123", - "32421121", "21521122", "15112123", "15121213", "13312123", - "24221212", "13321213", "33321211", "11512123", "22421212", - "11521213", "31521211", "25112212", "14212213", "34212211", - "23312212", "12412213", "32412211", "21512212", "15221122", - "24321121", "13421122", "22521121", "16112122", "16121212", - "14312122", "25221211", "14321212", "12512122", "23421211", - "12521212", "15212212", - /* Column 32 */ - "24312211", "13412212", "22512211", - "11612212", "21131125", "41131123", "61131121", "11122126", - "31122124", "51122122", "11131216", "31131214", "51131212", - "21113125", "41113123", "61113121", "21122215", "41122213", - "61122211", "11113216", "31113214", "51113212", "22131124", - "42131122", "11231125", "31231123", "51231121", "12122125", - "32122123", "52122121", "12131215", "32131213", "52131211", - "21231214", "41231212", "22113124", "42113122", "11213125", - "22122214", "42122212", "11222215", "31222213", "51222211", - "12113215", "32113213", "52113211", "21213214", "41213212", - "23131123", "43131121", "12231124", "32231122", "21331123", - "41331121", "13122124", "33122122", "13131214", "33131212", - /* Column 33 */ - "11322124", "22231213", "42231211", "11331214", "31331212", - "23113123", "43113121", "12213124", "23122213", "43122211", - "12222214", "32222212", "21322213", "41322211", "13113214", - "33113212", "22213213", "42213211", "11313214", "31313212", - "24131122", "13231123", "33231121", "22331122", "11431123", - "31431121", "14122123", "34122121", "14131213", "34131211", - "12322123", "23231212", "12331213", "32331211", "21431212", - "24113122", "13213123", "24122212", "13222213", "33222211", - "11413123", "22322212", "11422213", "31422211", "14113213", - "34113211", "23213212", "12313213", "32313211", "21413212", - "25131121", "14231122", "23331121", "12431122", "15122122", - "15131212", "13322122", "24231211", - /* Column 34 */ - "13331212", "11522122", - "22431211", "25113121", "14213122", "25122211", "14222212", - "12413122", "23322211", "12422212", "21522211", "15113212", - "24213211", "13313212", "22413211", "11513212", "15231121", - "13431121", "16122121", "16131211", "14322121", "14331211", - "12522121", "15213121", "15222211", "13413121", "13422211", - "11613121", "16113211", "14313211", "12513211", "21141124", - "41141122", "11132125", "31132123", "51132121", "11141215", - "31141213", "51141211", "21123124", "41123122", "21132214", - "41132212", "11114125", "31114123", "51114121", "11123215", - "31123213", "51123211", "21114214", "41114212", "22141123", - "42141121", "11241124", "31241122", "12132124", "32132122", - "12141214", - /* Column 35 */ - "32141212", "21241213", "41241211", "22123123", - "42123121", "11223124", "22132213", "42132211", "11232214", - "31232212", "12114124", "32114122", "12123214", "32123212", - "21223213", "41223211", "22114213", "42114211", "11214214", - "31214212", "23141122", "12241123", "32241121", "21341122", - "13132123", "33132121", "13141213", "33141211", "11332123", - "22241212", "11341213", "31341211", "23123122", "12223123", - "23132212", "12232213", "32232211", "21332212", "13114123", - "33114121", "13123213", "33123211", "11314123", "22223212", - "11323213", "31323211", "23114212", "12214213", "32214211", - "21314212", "24141121", "13241122", "22341121", "14132122", - "14141212", "12332122", "23241211", "12341212", - /* Column 36 */ - "24123121", - "13223122", "24132211", "13232212", "11423122", "22332211", - "11432212", "14114122", "14123212", "12314122", "23223211", - "12323212", "21423211", "24114211", "13214212", "22314211", - "11414212", "14241121", "15132121", "15141211", "13332121", - "13341211", "14223121", "14232211", "12423121", "12432211", - "15114121", "15123211", "13314121", "13323211", "11514121", - "11523211", "14214211", "12414211", "21151123", "41151121", - "11142124", "31142122", "11151214", "31151212", "21133123", - "41133121", "21142213", "41142211", "11124124", "31124122", - "11133214", "31133212", "21115123", "41115121", "21124213", - "41124211", "11115214", "31115212", "22151122", "11251123", - "31251121", "12142123", - /* Column 37 */ - "32142121", "12151213", "32151211", - "21251212", "22133122", "11233123", "22142212", "11242213", - "31242211", "12124123", "32124121", "12133213", "32133211", - "21233212", "22115122", "11215123", "22124212", "11224213", - "31224211", "12115213", "32115211", "21215212", "23151121", - "12251122", "13142122", "13151212", "11342122", "22251211", - "23133121", "12233122", "23142211", "12242212", "21342211", - "13124122", "13133212", "11324122", "22233211", "11333212", - "23115121", "12215122", "23124211", "12224212", "21324211", - "13115212", "22215211", "11315212", "13251121", "14142121", - "14151211", "12342121", "13233121", "13242211", "11433121", - "14124121", "14133211", "12324121", "12333211", "13215121", - /* Column 38 */ - "13224211", "11415121", "11424211", "14115211", "12315211", - "21161122", "11152123", "31152121", "11161213", "31161211", - "21143122", "21152212", "11134123", "31134121", "11143213", - "31143211", "21125122", "21134212", "11116123", "31116121", - "11125213", "31125211", "22161121", "12152122", "12161212", - "22143121", "11243122", "22152211", "11252212", "12134122", - "12143212", "21243211", "22125121", "11225122", "22134211", - "11234212", "12116122", "12125212", "21225211", "13152121", - "13161211", "12243121", "12252211", "13134121", "13143211", - "11334121", "11343211", "12225121", "12234211", "13116121", - "13125211", "11316121", "11325211", "21111226", "41111224", - "61111222", "31111315", "51111313", - /* Column 39 */ - "21211135", "41211133", - "61211131", "22111225", "42111223", "11211226", "31211224", - "51211222", "12111316", "32111314", "52111312", "21211315", - "41211313", "61211311", "22211134", "42211132", "11311135", - "31311133", "51311131", "23111224", "43111222", "12211225", - "32211223", "52211221", "21311224", "41311222", "13111315", - "33111313", "22211314", "42211312", "11311315", "31311313", - "51311311", "23211133", "43211131", "12311134", "32311132", - "21411133", "41411131", "24111223", "13211224", "33211222", - "22311223", "42311221", "11411224", "31411222", "14111314", - "34111312", "23211313", "43211311", "12311314", "32311312", - "21411313", "41411311", "24211132", "13311133", "33311131", - "22411132", - /* Column 40 */ - "11511133", "31511131", "25111222", "14211223", - "34211221", "23311222", "12411223", "32411221", "21511222", - "15111313", "24211312", "13311313", "33311311", "22411312", - "11511313", "31511311", "25211131", "14311132", "23411131", - "12511132", "21611131", "15211222", "24311221", "13411222", - "22511221", "11611222", "16111312", "25211311", "14311312", - "23411311", "12511312", "21611311", "31121134", "51121132", - "21112135", "41112133", "61112131", "21121225", "41121223", - "61121221", "11112226", "31112224", "51112222", "11121316", - "31121314", "51121312", "21112315", "41112313", "61112311", - "12121135", "32121133", "52121131", "21221134", "41221132", - "22112134", "42112132", "11212135", "22121224", - /* Column 41 */ - "42121222", - "11221225", "31221223", "51221221", "12112225", "32112223", - "52112221", "12121315", "32121313", "52121311", "21221314", - "41221312", "22112314", "42112312", "11212315", "31212313", - "51212311", "13121134", "33121132", "22221133", "42221131", - "11321134", "31321132", "23112133", "43112131", "12212134", - "23121223", "43121221", "12221224", "32221222", "21321223", - "41321221", "13112224", "33112222", "13121314", "33121312", - "11312224", "22221313", "42221311", "11321314", "31321312", - /* Column 42 */ - "23112313", "43112311", "12212314", "32212312", "21312313", - "41312311", "14121133", "34121131", "23221132", "12321133", - "32321131", "21421132", "24112132", "13212133", "24121222", - "13221223", "33221221", "11412133", "22321222", "11421223", - "31421221", "14112223", "34112221", "14121313", "34121311", - "12312223", "23221312", "12321313", "32321311", "21421312", - "24112312", "13212313", "33212311", "22312312", "11412313", - "31412311", "15121132", "24221131", "13321132", "22421131" -}; - -static char *c49_appxe_odd[2401] = { - /* Appendix E - Code 49 Encodation Patterns (Odd Symbol Character Parity) */ - /* Column 1 */ - "22121116", - "42121114", "31221115", "51221113", "32112115", "52112113", - "21212116", "41212114", "61212112", "23121115", "43121113", - "12221116", "32221114", "52221112", "21321115", "41321113", - "61321111", "13112116", "33112114", "22212115", "42212113", - "11312116", "31312114", "51312112", "24121114", "13221115", - "33221113", "22321114", "42321112", "11421115", "31421113", - "51421111", "14112115", "34112113", "23212114", "43212112", - "12312115", "32312113", "52312111", "21412114", "41412112", - "25121113", "14221114", "34221112", "23321113", "43321111", - "12421114", "32421112", "21521113", "41521111", "15112114", - "24212113", "13312114", "33312112", "22412113", "42412111", - "11512114", "31512112", - /* Column 2 */ - "15221113", "24321112", "13421113", - "33421111", "22521112", "16112113", "25212112", "14312113", - "34312111", "23412112", "12512113", "32512111", "21612112", - "21131116", "41131114", "61131112", "31122115", "51122113", - "21113116", "41113114", "61113112", "22131115", "42131113", - "11231116", "31231114", "51231112", "12122116", "32122114", - "52122112", "21222115", "41222113", "61222111", "22113115", - "42113113", "11213116", "31213114", "51213112", "23131114", - "43131112", "12231115", "32231113", "52231111", "21331114", - "41331112", "13122115", "33122113", "22222114", "42222112", - "11322115", "31322113", "51322111", "23113114", "43113112", - "12213115", "32213113", "52213111", "21313114", "41313112", - /* Column 3 */ - "24131113", "13231114", "33231112", "22331113", "42331111", - "11431114", "31431112", "14122114", "34122112", "23222113", - "43222111", "12322114", "32322112", "21422113", "41422111", - "24113113", "13213114", "33213112", "22313113", "42313111", - "11413114", "31413112", "25131112", "14231113", "34231111", - "23331112", "12431113", "32431111", "15122113", "24222112", - "13322113", "33322111", "22422112", "11522113", "31522111", - "25113112", "14213113", "34213111", "23313112", "12413113", - "32413111", "21513112", "15231112", "24331111", "13431112", - "16122112", "25222111", "14322112", "23422111", "12522112", - "15213112", "24313111", "13413112", "22513111", "11613112", - "21141115", "41141113", "61141111", - /* Column 4 */ - "11132116", "31132114", - "51132112", "21123115", "41123113", "61123111", "11114116", - "31114114", "51114112", "22141114", "42141112", "11241115", - "31241113", "51241111", "12132115", "32132113", "52132111", - "21232114", "41232112", "22123114", "42123112", "11223115", - "31223113", "51223111", "12114115", "32114113", "52114111", - "21214114", "41214112", "23141113", "43141111", "12241114", - "32241112", "21341113", "41341111", "13132114", "33132112", - "22232113", "42232111", "11332114", "31332112", "23123113", - "43123111", "12223114", "32223112", "21323113", "41323111", - "13114114", "33114112", "22214113", "42214111", "11314114", - "31314112", "24141112", "13241113", "33241111", "22341112", - "14132113", - /* Column 5 */ - "34132111", "23232112", "12332113", "32332111", - "21432112", "24123112", "13223113", "33223111", "22323112", - "11423113", "31423111", "14114113", "34114111", "23214112", - "12314113", "32314111", "21414112", "25141111", "14241112", - "23341111", "15132112", "24232111", "13332112", "22432111", - "25123111", "14223112", "23323111", "12423112", "21523111", - "15114112", "24214111", "13314112", "22414111", "11514112", - "15241111", "16132111", "14332111", "15223111", "13423111", - "16114111", "14314111", "12514111", "21151114", "41151112", - "11142115", "31142113", "51142111", "21133114", "41133112", - "11124115", "31124113", "51124111", "21115114", "41115112", - "22151113", "42151111", "11251114", "31251112", - /* Column 6 */ - "12142114", - "32142112", "21242113", "41242111", "22133113", "42133111", - "11233114", "31233112", "12124114", "32124112", "21224113", - "41224111", "22115113", "42115111", "11215114", "31215112", - "23151112", "12251113", "32251111", "13142113", "33142111", - "22242112", "11342113", "31342111", "23133112", "12233113", - "32233111", "21333112", "13124113", "33124111", "22224112", - "11324113", "31324111", "23115112", "12215113", "32215111", - "21315112", "24151111", "13251112", "14142112", "23242111", - "12342112", "24133111", "13233112", "22333111", "11433112", - "14124112", "23224111", "12324112", "21424111", "24115111", - "13215112", "22315111", "11415112", "14251111", "15142111", - "13342111", "14233111", - /* Column 7 */ - "12433111", "15124111", "13324111", - "11524111", "14215111", "12415111", "21161113", "41161111", - "11152114", "31152112", "21143113", "41143111", "11134114", - "31134112", "21125113", "41125111", "11116114", "31116112", - "22161112", "12152113", "32152111", "21252112", "22143112", - "11243113", "31243111", "12134113", "32134111", "21234112", - "22125112", "11225113", "31225111", "12116113", "32116111", - "21216112", "23161111", "13152112", "22252111", "23143111", - "12243112", "21343111", "13134112", "22234111", "11334112", - "23125111", "12225112", "21325111", "13116112", "22216111", - "11316112", "14152111", "13243111", "14134111", "12334111", - "13225111", "11425111", "14116111", "12316111", "41111215", - /* Column 8 */ - "61111213", "21211126", "41211124", "61211122", "22111216", - "42111214", "31211215", "51211213", "22211125", "42211123", - "11311126", "31311124", "51311122", "23111215", "43111213", - "12211216", "32211214", "52211212", "21311215", "41311213", - "61311211", "23211124", "43211122", "12311125", "32311123", - "52311121", "21411124", "41411122", "24111214", "13211215", - "33211213", "22311214", "42311212", "11411215", "31411213", - "51411211", "24211123", "13311124", "33311122", "22411123", - "42411121", "11511124", "31511122", "25111213", "14211214", - "34211212", "23311213", "43311211", "12411214", "32411212", - "21511213", "41511211", "25211122", "14311123", "34311121", - "23411122", "12511123", "32511121", - /* Column 9 */ - "21611122", "15211213", - "24311212", "13411213", "33411211", "22511212", "11611213", - "31611211", "31121125", "51121123", "21112126", "41112124", - "61112122", "21121216", "41121214", "61121212", "31112215", - "51112213", "12121126", "32121124", "52121122", "21221125", - "41221123", "61221121", "22112125", "42112123", "11212126", - "22121215", "42121213", "11221216", "31221214", "51221212", - "12112216", "32112214", "52112212", "21212215", "41212213", - "61212211", "13121125", "33121123", "22221124", "42221122", - "11321125", "31321123", "51321121", "23112124", "43112122", - "12212125", "23121214", "43121212", "12221215", "32221213", - "52221211", "21321214", "41321212", "13112215", "33112213", - "22212214", - /* Column 10 */ - "42212212", "11312215", "31312213", "51312211", - "14121124", "34121122", "23221123", "43221121", "12321124", - "32321122", "21421123", "41421121", "24112123", "13212124", - "24121213", "13221214", "33221212", "11412124", "22321213", - "42321211", "11421214", "31421212", "14112214", "34112212", - "23212213", "43212211", "12312214", "32312212", "21412213", - "41412211", "15121123", "24221122", "13321123", "33321121", - "22421122", "11521123", "31521121", "25112122", "14212123", - "25121212", "14221213", "34221211", "12412123", "23321212", - "12421213", "32421211", "21521212", "15112213", "24212212", - "13312213", "33312211", "22412212", "11512213", "31512211", - "16121122", "25221121", "14321122", "23421121", - /* Column 11 */ - "12521122", - "15212122", "15221212", "13412122", "24321211", "13421212", - "11612122", "22521211", "16112212", "25212211", "14312212", - "23412211", "12512212", "21612211", "11131126", "31131124", - "51131122", "21122125", "41122123", "61122121", "21131215", - "41131213", "61131211", "11113126", "31113124", "51113122", - "11122216", "31122214", "51122212", "21113215", "41113213", - "61113211", "12131125", "32131123", "52131121", "21231124", - "41231122", "22122124", "42122122", "11222125", "22131214", - "42131212", "11231215", "31231213", "51231211", "12113125", - "32113123", "52113121", "12122215", "32122213", "52122211", - "21222214", "41222212", "22113214", "42113212", "11213215", - "31213213", "51213211", - /* Column 12 */ - "13131124", "33131122", "22231123", - "42231121", "11331124", "31331122", "23122123", "43122121", - "12222124", "23131213", "43131211", "12231214", "32231212", - "21331213", "41331211", "13113124", "33113122", "13122214", - "33122212", "11313124", "22222213", "42222211", "11322214", - "31322212", "23113213", "43113211", "12213214", "32213212", - "21313213", "41313211", "14131123", "34131121", "23231122", - "12331123", "32331121", "21431122", "24122122", "13222123", - "24131212", "13231213", "33231211", "11422123", "22331212", - "11431213", "31431211", "14113123", "34113121", "14122213", - "34122211", "12313123", "23222212", "12322213", "32322211", - "21422212", "24113212", "13213213", "33213211", "22313212", - /* Column 13 */ - "11413213", "31413211", "15131122", "24231121", "13331122", - "22431121", "25122121", "14222122", "25131211", "14231212", - "12422122", "23331211", "12431212", "15113122", "15122212", - "13313122", "24222211", "13322212", "11513122", "22422211", - "11522212", "25113211", "14213212", "23313211", "12413212", - "21513211", "16131121", "14331121", "15222121", "15231211", - "13422121", "13431211", "16113121", "16122211", "14313121", - "14322211", "12513121", "12522211", "15213211", "13413211", - "11613211", "11141125", "31141123", "51141121", "21132124", - "41132122", "21141214", "41141212", "11123125", "31123123", - "51123121", "11132215", "31132213", "51132211", "21114124", - "41114122", "21123214", "41123212", - /* Column 14 */ - "11114215", "31114213", - "51114211", "12141124", "32141122", "21241123", "41241121", - "22132123", "42132121", "11232124", "22141213", "42141211", - "11241214", "31241212", "12123124", "32123122", "12132214", - "32132212", "21232213", "41232211", "22114123", "42114121", - "11214124", "22123213", "42123211", "11223214", "31223212", - "12114214", "32114212", "21214213", "41214211", "13141123", - "33141121", "22241122", "11341123", "31341121", "23132122", - "12232123", "23141212", "12241213", "32241211", "21341212", - "13123123", "33123121", "13132213", "33132211", "11323123", - "22232212", "11332213", "31332211", "23114122", "12214123", - "23123212", "12223213", "32223211", "21323212", "13114213", - "33114211", - /* Column 15 */ - "22214212", "11314213", "31314211", "14141122", - "23241121", "12341122", "24132121", "13232122", "24141211", - "13241212", "11432122", "22341211", "14123122", "14132212", - "12323122", "23232211", "12332212", "21432211", "24114121", - "13214122", "24123211", "13223212", "11414122", "22323211", - "11423212", "14114212", "23214211", "12314212", "21414211", - "15141121", "13341121", "14232121", "14241211", "12432121", - "15123121", "15132211", "13323121", "13332211", "11523121", - "14214121", "14223211", "12414121", "12423211", "15114211", - "13314211", "11514211", "11151124", "31151122", "21142123", - "41142121", "21151213", "41151211", "11133124", "31133122", - "11142214", "31142212", "21124123", "41124121", - /* Column 16 */ - "21133213", - "41133211", "11115124", "31115122", "11124214", "31124212", - "21115213", "41115211", "12151123", "32151121", "21251122", - "22142122", "11242123", "22151212", "11251213", "31251211", - "12133123", "32133121", "12142213", "32142211", "21242212", - "22124122", "11224123", "22133212", "11233213", "31233211", - "12115123", "32115121", "12124213", "32124211", "21224212", - "22115212", "11215213", "31215211", "13151122", "22251121", - "23142121", "12242122", "23151211", "12251212", "13133122", - "13142212", "11333122", "22242211", "11342212", "23124121", - "12224122", "23133211", "12233212", "21333211", "13115122", - "13124212", "11315122", "22224211", "11324212", "23115211", - "12215212", "21315211", - /* Column 17 */ - "14151121", "13242121", "13251211", - "14133121", "14142211", "12333121", "12342211", "13224121", - "13233211", "11424121", "11433211", "14115121", "14124211", - "12315121", "12324211", "13215211", "11415211", "11161123", - "31161121", "21152122", "21161212", "11143123", "31143121", - "11152213", "31152211", "21134122", "21143212", "11125123", - "31125121", "11134213", "31134211", "21116122", "21125212", - "12161122", "22152121", "11252122", "22161211", "12143122", - "12152212", "21252211", "22134121", "11234122", "22143211", - "11243212", "12125122", "12134212", "21234211", "22116121", - "11216122", "22125211", "11225212", "13161121", "12252121", - "13143121", "13152211", "11343121", "12234121", "12243211", - /* Column 18 */ - "13125121", "13134211", "11325121", "11334211", "12216121", - "12225211", "31111225", "51111223", "21111316", "41111314", - "61111312", "31211134", "51211132", "12111226", "32111224", - "52111222", "21211225", "41211223", "61211221", "22111315", - "42111313", "11211316", "31211314", "51211312", "12211135", - "32211133", "52211131", "21311134", "41311132", "13111225", - "33111223", "22211224", "42211222", "11311225", "31311223", - "51311221", "23111314", "43111312", "12211315", "32211313", - "52211311", "21311314", "41311312", "13211134", "33211132", - "22311133", "42311131", "11411134", "31411132", "14111224", - "34111222", "23211223", "43211221", "12311224", "32311222", - "21411223", "41411221", "24111313", - /* Column 19 */ - "13211314", "33211312", - "22311313", "42311311", "11411314", "31411312", "14211133", - "34211131", "23311132", "12411133", "32411131", "21511132", - "15111223", "24211222", "13311223", "33311221", "22411222", - "11511223", "31511221", "25111312", "14211313", "34211311", - "23311312", "12411313", "32411311", "21511312", "15211132", - "24311131", "13411132", "22511131", "11611132", "16111222", - "25211221", "14311222", "23411221", "12511222", "21611221", - "15211312", "24311311", "13411312", "22511311", "11611312", - "21121135", "41121133", "61121131", "11112136", "31112134", - "51112132", "11121226", "31121224", "51121222", "21112225", - "41112223", "61112221", "21121315", "41121313", "61121311", - "11112316", - /* Column 20 */ - "31112314", "51112312", "22121134", "42121132", - "11221135", "31221133", "51221131", "12112135", "32112133", - "52112131", "12121225", "32121223", "52121221", "21221224", - "41221222", "22112224", "42112222", "11212225", "22121314", - "42121312", "11221315", "31221313", "51221311", "12112315", - "32112313", "52112311", "21212314", "41212312", "23121133", - "43121131", "12221134", "32221132", "21321133", "41321131", - "13112134", "33112132", "13121224", "33121222", "11312134", - "22221223", "42221221", "11321224", "31321222", "23112223", - "43112221", "12212224", "23121313", "43121311", "12221314", - "32221312", "21321313", "41321311", "13112314", "33112312", - "22212313", "42212311", "11312314", "31312312", - /* Column 21 */ - "24121132", - "13221133", "33221131", "22321132", "11421133", "31421131", - "14112133", "34112131", "14121223", "34121221", "12312133", - "23221222", "12321223", "32321221", "21421222", "24112222", - "13212223", "24121312", "13221313", "33221311", "11412223", - "22321312", "11421313", "31421311", "14112313", "34112311", - "23212312", "12312313", "32312311", "21412312", "25121131", - "14221132", "23321131", "12421132", "21521131", "15112132", - "15121222", "13312132", "24221221", "13321222", "11512132", - "22421221", "11521222", "25112221", "14212222", "25121311", - "14221312", "12412222", "23321311", "12421312", "21521311", - "15112312", "24212311", "13312312", "22412311", "11512312", - "15221131", "13421131", - /* Column 22 */ - "16112131", "16121221", "14312131", - "14321221", "12512131", "12521221", "15212221", "15221311", - "13412221", "13421311", "11612221", "16112311", "14312311", - "12512311", "21131134", "41131132", "11122135", "31122133", - "51122131", "11131225", "31131223", "51131221", "21113134", - "41113132", "21122224", "41122222", "21131314", "41131312", - "11113225", "31113223", "51113221", "11122315", "31122313", - "51122311", "21113314", "41113312", "22131133", "42131131", - "11231134", "31231132", "12122134", "32122132", "12131224", - "32131222", "21231223", "41231221", "22113133", "42113131", - "11213134", "22122223", "42122221", "11222224", "22131313", - "42131311", "11231314", "31231312", "12113224", "32113222", - /* Column 23 */ - "12122314", "32122312", "21222313", "41222311", "22113313", - "42113311", "11213314", "31213312", "23131132", "12231133", - "32231131", "21331132", "13122133", "33122131", "13131223", - "33131221", "11322133", "22231222", "11331223", "31331221", - "23113132", "12213133", "23122222", "12222223", "23131312", - "12231313", "32231311", "21331312", "13113223", "33113221", - "13122313", "33122311", "11313223", "22222312", "11322313", - "31322311", "23113312", "12213313", "32213311", "21313312", - "24131131", "13231132", "22331131", "11431132", "14122132", - "14131222", "12322132", "23231221", "12331222", "21431221", - "24113131", "13213132", "24122221", "13222222", "24131311", - "11413132", "13231312", "11422222", - /* Column 24 */ - "22331311", "11431312", - "14113222", "14122312", "12313222", "23222311", "12322312", - "21422311", "24113311", "13213312", "22313311", "11413312", - "14231131", "12431131", "15122131", "15131221", "13322131", - "13331221", "11522131", "14213131", "14222221", "12413131", - "14231311", "12422221", "12431311", "15113221", "15122311", - "13313221", "13322311", "11513221", "11522311", "14213311", - "12413311", "21141133", "41141131", "11132134", "31132132", - "11141224", "31141222", "21123133", "41123131", "21132223", - "41132221", "21141313", "41141311", "11114134", "31114132", - "11123224", "31123222", "11132314", "31132312", "21114223", - "41114221", "21123313", "41123311", "11114314", "31114312", - "22141132", - /* Column 25 */ - "11241133", "31241131", "12132133", "32132131", - "12141223", "32141221", "21241222", "22123132", "11223133", - "22132222", "11232223", "22141312", "11241313", "31241311", - "12114133", "32114131", "12123223", "32123221", "12132313", - "32132311", "21232312", "22114222", "11214223", "22123312", - "11223313", "31223311", "12114313", "32114311", "21214312", - "23141131", "12241132", "21341131", "13132132", "13141222", - "11332132", "22241221", "11341222", "23123131", "12223132", - "23132221", "12232222", "23141311", "12241312", "21341311", - "13114132", "13123222", "11314132", "13132312", "11323222", - "22232311", "11332312", "23114221", "12214222", "23123311", - "12223312", "21323311", "13114312", "22214311", - /* Column 26 */ - "11314312", - "13241131", "14132131", "14141221", "12332131", "12341221", - "13223131", "13232221", "11423131", "13241311", "11432221", - "14114131", "14123221", "12314131", "14132311", "12323221", - "12332311", "13214221", "13223311", "11414221", "11423311", - "14114311", "12314311", "21151132", "11142133", "31142131", - "11151223", "31151221", "21133132", "21142222", "21151312", - "11124133", "31124131", "11133223", "31133221", "11142313", - "31142311", "21115132", "21124222", "21133312", "11115223", - "31115221", "11124313", "31124311", "22151131", "11251132", - "12142132", "12151222", "21251221", "22133131", "11233132", - "22142221", "11242222", "22151311", "11251312", "12124132", - "12133222", "12142312", - /* Column 27 */ - "21242311", "22115131", "11215132", - "22124221", "11224222", "22133311", "11233312", "12115222", - "12124312", "21224311", "12251131", "13142131", "13151221", - "11342131", "12233131", "12242221", "12251311", "13124131", - "13133221", "11324131", "13142311", "11333221", "11342311", - "12215131", "12224221", "12233311", "13115221", "13124311", - "11315221", "11324311", "21161131", "11152132", "11161222", - "21143131", "21152221", "21161311", "11134132", "11143222", - "11152312", "21125131", "21134221", "21143311", "11116132", - "11125222", "11134312", "12152131", "12161221", "11243131", - "11252221", "12134131", "12143221", "12152311", "11225131", - "11234221", "11243311", "12116131", "12125221", "12134311", - /* Column 28 */ - "21111235", "41111233", "61111231", "11111326", "31111324", - "51111322", "21111415", "41111413", "61111411", "21211144", - "41211142", "22111234", "42111232", "11211235", "31211233", - "51211231", "12111325", "32111323", "52111321", "21211324", - "41211322", "22111414", "42111412", "11211415", "31211413", - "51211411", "22211143", "42211141", "11311144", "31311142", - "23111233", "43111231", "12211234", "32211232", "21311233", - "41311231", "13111324", "33111322", "22211323", "42211321", - "11311324", "31311322", "23111413", "43111411", "12211414", - "32211412", "21311413", "41311411", "23211142", "12311143", - "32311141", "21411142", "24111232", "13211233", "33211231", - "22311232", "11411233", "31411231", - /* Column 29 */ - "14111323", "34111321", - "23211322", "12311323", "32311321", "21411322", "24111412", - "13211413", "33211411", "22311412", "11411413", "31411411", - "24211141", "13311142", "22411141", "11511142", "25111231", - "14211232", "23311231", "12411232", "21511231", "15111322", - "24211321", "13311322", "22411321", "11511322", "25111411", - "14211412", "23311411", "12411412", "21511411", "14311141", - "12511141", "15211231", "13411231", "11611231", "16111321", - "14311321", "12511321", "15211411", "13411411", "11611411", - "31121143", "51121141", "21112144", "41112142", "21121234", - "41121232", "11112235", "31112233", "51112231", "11121325", - "31121323", "51121321", "21112324", "41112322", "21121414", - "41121412", - /* Column 30 */ - "11112415", "31112413", "51112411", "12121144", - "32121142", "21221143", "41221141", "22112143", "42112141", - "11212144", "22121233", "42121231", "11221234", "31221232", - "12112234", "32112232", "12121324", "32121322", "21221323", - "41221321", "22112323", "42112321", "11212324", "22121413", - "42121411", "11221414", "31221412", "12112414", "32112412", - "21212413", "41212411", "13121143", "33121141", "22221142", - "11321143", "31321141", "23112142", "12212143", "23121232", - "12221233", "32221231", "21321232", "13112233", "33112231", - "13121323", "33121321", "11312233", "22221322", "11321323", - "31321321", "23112322", "12212323", "23121412", "12221413", - "32221411", "21321412", "13112413", "33112411", - /* Column 31 */ - "22212412", - "11312413", "31312411", "14121142", "23221141", "12321142", - "21421141", "24112141", "13212142", "24121231", "13221232", - "11412142", "22321231", "11421232", "14112232", "14121322", - "12312232", "23221321", "12321322", "21421321", "24112321", - "13212322", "24121411", "13221412", "11412322", "22321411", - "11421412", "14112412", "23212411", "12312412", "21412411", - "15121141", "13321141", "11521141", "14212141", "14221231", - "12412141", "12421231", "15112231", "15121321", "13312231", - "13321321", "11512231", "11521321", "14212321", "14221411", - "12412321", "12421411", "15112411", "13312411", "11512411", - "11131144", "31131142", "21122143", "41122141", "21131233", - "41131231", "11113144", - /* Column 32 */ - "31113142", "11122234", "31122232", - "11131324", "31131322", "21113233", "41113231", "21122323", - "41122321", "21131413", "41131411", "11113324", "31113322", - "11122414", "31122412", "21113413", "41113411", "12131143", - "32131141", "21231142", "22122142", "11222143", "22131232", - "11231233", "31231231", "12113143", "32113141", "12122233", - "32122231", "12131323", "32131321", "21231322", "22113232", - "11213233", "22122322", "11222323", "22131412", "11231413", - "31231411", "12113323", "32113321", "12122413", "32122411", - "21222412", "22113412", "11213413", "31213411", "13131142", - "22231141", "11331142", "23122141", "12222142", "23131231", - "12231232", "21331231", "13113142", "13122232", "11313142", - /* Column 33 */ - "13131322", "11322232", "22231321", "11331322", "23113231", - "12213232", "23122321", "12222322", "23131411", "12231412", - "21331411", "13113322", "13122412", "11313322", "22222411", - "11322412", "23113411", "12213412", "21313411", "14131141", - "12331141", "13222141", "13231231", "11422141", "11431231", - "14113141", "14122231", "12313141", "14131321", "12322231", - "12331321", "13213231", "13222321", "11413231", "13231411", - "11422321", "11431411", "14113321", "14122411", "12313321", - "12322411", "13213411", "11413411", "11141143", "31141141", - "21132142", "21141232", "11123143", "31123141", "11132233", - "31132231", "11141323", "31141321", "21114142", "21123232", - "21132322", "21141412", "11114233", - /* Column 34 */ - "31114231", "11123323", - "31123321", "11132413", "31132411", "21114322", "21123412", - "12141142", "21241141", "22132141", "11232142", "22141231", - "11241232", "12123142", "12132232", "12141322", "21241321", - "22114141", "11214142", "22123231", "11223232", "22132321", - "11232322", "22141411", "11241412", "12114232", "12123322", - "12132412", "21232411", "22114321", "11214322", "22123411", - "11223412", "13141141", "11341141", "12232141", "12241231", - "13123141", "13132231", "11323141", "13141321", "11332231", - "11341321", "12214141", "12223231", "12232321", "12241411", - "13114231", "13123321", "11314231", "13132411", "11323321", - "11332411", "12214321", "12223411", "11151142", "21142141", - "21151231", - /* Column 35 */ - "11133142", "11142232", "11151322", "21124141", - "21133231", "21142321", "21151411", "11115142", "11124232", - "11133322", "11142412", "21115231", "21124321", "21133411", - "12151141", "11242141", "11251231", "12133141", "12142231", - "12151321", "11224141", "11233231", "11242321", "11251411", - "12115141", "12124231", "12133321", "12142411", "11215231", - "11224321", "11233411", "11161141", "11143141", "11152231", - "11161321", "11125141", "11134231", "11143321", "11152411", - "11111245", "31111243", "51111241", "21111334", "41111332", - "11111425", "31111423", "51111421", "21111514", "41111512", - "31211152", "12111244", "32111242", "21211243", "41211241", - "22111333", "42111331", "11211334", "31211332", - /* Column 36 */ - "12111424", - "32111422", "21211423", "41211421", "22111513", "42111511", - "11211514", "31211512", "12211153", "32211151", "21311152", - "13111243", "33111241", "22211242", "11311243", "31311241", - "23111332", "12211333", "32211331", "21311332", "13111423", - "33111421", "22211422", "11311423", "31311421", "23111512", - "12211513", "32211511", "21311512", "13211152", "22311151", - "11411152", "14111242", "23211241", "12311242", "21411241", - "24111331", "13211332", "22311331", "11411332", "14111422", - "23211421", "12311422", "21411421", "24111511", "13211512", - "22311511", "11411512", "14211151", "12411151", "15111241", - "13311241", "11511241", "14211331", "12411331", "15111421", - "13311421", "11511421", - /* Column 37 */ - "14211511", "12411511", "21121153", - "41121151", "11112154", "31112152", "11121244", "31121242", - "21112243", "41112241", "21121333", "41121331", "11112334", - "31112332", "11121424", "31121422", "21112423", "41112421", - "21121513", "41121511", "11112514", "31112512", "22121152", - "11221153", "31221151", "12112153", "32112151", "12121243", - "32121241", "21221242", "22112242", "11212243", "22121332", - "11221333", "31221331", "12112333", "32112331", "12121423", - "32121421", "21221422", "22112422", "11212423", "22121512", - "11221513", "31221511", "12112513", "32112511", "21212512", - "23121151", "12221152", "21321151", "13112152", "13121242", - "11312152", "22221241", "11321242", "23112241", "12212242", - /* Column 38 */ - "23121331", "12221332", "21321331", "13112332", "13121422", - "11312332", "22221421", "11321422", "23112421", "12212422", - "23121511", "12221512", "21321511", "13112512", "22212511", - "11312512", "13221151", "11421151", "14112151", "14121241", - "12312151", "12321241", "13212241", "13221331", "11412241", - "11421331", "14112331", "14121421", "12312331", "12321421", - "13212421", "13221511", "11412421", "11421511", "14112511", - "12312511", "21131152", "11122153", "31122151", "11131243", - "31131241", "21113152", "21122242", "21131332", "11113243", - "31113241", "11122333", "31122331", "11131423", "31131421", - "21113332", "21122422", "21131512", "11113423", "31113421", - "11122513", "31122511", "22131151", - /* Column 39 */ - "11231152", "12122152", - "12131242", "21231241", "22113151", "11213152", "22122241", - "11222242", "22131331", "11231332", "12113242", "12122332", - "12131422", "21231421", "22113331", "11213332", "22122421", - "11222422", "22131511", "11231512", "12113422", "12122512", - "21222511", "12231151", "13122151", "13131241", "11322151", - "11331241", "12213151", "12222241", "12231331", "13113241", - "13122331", "11313241", "13131421", "11322331", "11331421", - "12213331", "12222421", "12231511", "13113421", "13122511", - "11313421", "11322511", "21141151", "11132152", "11141242", - "21123151", "21132241", "21141331", "11114152", "11123242", - "11132332", "11141422", "21114241", "21123331", "21132421", - "21141511", - /* Column 40 */ - "11114332", "11123422", "11132512", "11241151", - "12132151", "12141241", "11223151", "11232241", "11241331", - "12114151", "12123241", "12132331", "12141421", "11214241", - "11223331", "11232421", "11241511", "12114331", "12123421", - "12132511", "11142151", "11151241", "11124151", "11133241", - "11142331", "11151421", "11115241", "11124331", "11133421", - "11142511", "21111253", "41111251", "11111344", "31111342", - "21111433", "41111431", "11111524", "31111522", "21111613", - "41111611", "21211162", "22111252", "11211253", "31211251", - "12111343", "32111341", "21211342", "22111432", "11211433", - "31211431", "12111523", "32111521", "21211522", "22111612", - "11211613", "31211611", "22211161", "11311162", - /* Column 41 */ - "23111251", - "12211252", "21311251", "13111342", "22211341", "11311342", - "23111431", "12211432", "21311431", "13111522", "22211521", - "11311522", "23111611", "12211612", "21311611", "12311161", - "13211251", "11411251", "14111341", "12311341", "13211431", - "11411431", "14111521", "12311521", "13211611", "11411611", - "31121161", "21112162", "21121252", "11112253", "31112251", - "11121343", "31121341", "21112342", "21121432", "11112433", - "31112431", "11121523", "31121521", "21112522", "21121612", - /* Column 42 */ - "12121162", "21221161", "22112161", "11212162", "22121251", - "11221252", "12112252", "12121342", "21221341", "22112341", - "11212342", "22121431", "11221432", "12112432", "12121522", - "21221521", "22112521", "11212522", "22121611", "11221612", - "13121161", "11321161", "12212161", "12221251", "13112251", - "13121341", "11312251", "11321341", "12212341", "12221431", - "13112431", "13121521", "11312431", "11321521", "12212521", - "12221611", "11131162", "21122161", "21131251", "11113162" -}; diff --git a/3rdparty/zint-2.4.4/backend/common.c b/3rdparty/zint-2.4.4/backend/common.c deleted file mode 100644 index 981902e..0000000 --- a/3rdparty/zint-2.4.4/backend/common.c +++ /dev/null @@ -1,374 +0,0 @@ -/* common.c - Contains functions needed for a number of barcodes */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#include -#include -#include -#include "common.h" - -int ustrlen(unsigned char data[]) { - /* Local replacement for strlen() with unsigned char strings */ - int i; - for (i=0;data[i];i++); - - return i; -} - -void ustrcpy(unsigned char target[], unsigned char source[]) { - /* Local replacement for strcpy() with unsigned char strings */ - int i, len; - - len = ustrlen(source); - for(i = 0; i < len; i++) { - target[i] = source[i]; - } - target[i] = '\0'; -} - -void concat(char dest[], char source[]) -{ /* Concatinates dest[] with the contents of source[], copying /0 as well */ - unsigned int i, j, n; - - j = strlen(dest); - n = strlen(source); - for(i = 0; i <= n; i++) { - dest[i + j] = source[i]; } -} - -void uconcat(unsigned char dest[], unsigned char source[]) -{ /* Concatinates dest[] with the contents of source[], copying /0 as well */ - unsigned int i, j; - - j = ustrlen(dest); - for(i = 0; i <= ustrlen(source); i++) { - dest[i + j] = source[i]; } -} - - -int ctoi(char source) -{ /* Converts a character 0-9 to its equivalent integer value */ - if((source >= '0') && (source <= '9')) - return (source - '0'); - return(source - 'A' + 10); -} - -char itoc(int source) -{ /* Converts an integer value to its hexadecimal character */ - if ((source >= 0) && (source <= 9)) { - return ('0' + source); } - else { - return ('A' + (source - 10)); } -} - -void to_upper(unsigned char source[]) -{ /* Converts lower case characters to upper case in a string source[] */ - unsigned int i, src_len = ustrlen(source); - - for (i = 0; i < src_len; i++) { - if ((source[i] >= 'a') && (source[i] <= 'z')) { - source [i] = (source[i] - 'a') + 'A'; } - } -} - -int is_sane(char test_string[], unsigned char source[], int length) -{ /* Verifies that a string only uses valid characters */ - unsigned int i, j, latch; - unsigned int lt = strlen(test_string); - - for(i = 0; i < length; i++) { - latch = FALSE; - for(j = 0; j < lt; j++) { - if (source[i] == test_string[j]) { - latch = TRUE; - break; - } - } - if (!(latch)) { - return ERROR_INVALID_DATA1; - } - } - - return 0; -} - -int posn(char set_string[], char data) -{ /* Returns the position of data in set_string */ - unsigned int i, n = strlen(set_string); - - for(i = 0; i < n; i++) { - if (data == set_string[i]) { return i; } } - return 0; -} - -void lookup(char set_string[], char *table[], char data, char dest[]) -{ /* Replaces huge switch statements for looking up in tables */ - unsigned int i, n = strlen(set_string); - - for(i = 0; i < n; i++) { - if (data == set_string[i]) { concat(dest, table[i]); } } -} - -int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord) -{ - return (symbol->encoded_data[y_coord][x_coord / 7] >> (x_coord % 7)) & 1; -#if 0 - switch(x_sub) { - case 0: if((symbol->encoded_data[y_coord][x_char] & 0x01) != 0) { result = 1; } break; - case 1: if((symbol->encoded_data[y_coord][x_char] & 0x02) != 0) { result = 1; } break; - case 2: if((symbol->encoded_data[y_coord][x_char] & 0x04) != 0) { result = 1; } break; - case 3: if((symbol->encoded_data[y_coord][x_char] & 0x08) != 0) { result = 1; } break; - case 4: if((symbol->encoded_data[y_coord][x_char] & 0x10) != 0) { result = 1; } break; - case 5: if((symbol->encoded_data[y_coord][x_char] & 0x20) != 0) { result = 1; } break; - case 6: if((symbol->encoded_data[y_coord][x_char] & 0x40) != 0) { result = 1; } break; - } - - return result; -#endif -} - -void set_module(struct zint_symbol *symbol, int y_coord, int x_coord) -{ - symbol->encoded_data[y_coord][x_coord / 7] |= 1 << (x_coord % 7); -#if 0 - int x_char, x_sub; - - - x_char = x_coord / 7; - x_sub = x_coord % 7; - - switch(x_sub) { - case 0: symbol->encoded_data[y_coord][x_char] += 0x01; break; - case 1: symbol->encoded_data[y_coord][x_char] += 0x02; break; - case 2: symbol->encoded_data[y_coord][x_char] += 0x04; break; - case 3: symbol->encoded_data[y_coord][x_char] += 0x08; break; - case 4: symbol->encoded_data[y_coord][x_char] += 0x10; break; - case 5: symbol->encoded_data[y_coord][x_char] += 0x20; break; - case 6: symbol->encoded_data[y_coord][x_char] += 0x40; break; - } /* The last binary digit is reserved for colour barcodes */ -#endif -} - -void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord) -{ - symbol->encoded_data[y_coord][x_coord / 7] &= ~(1 << (x_coord % 7)); -#if 0 - int x_char, x_sub; - - x_char = x_coord / 7; - x_sub = x_coord % 7; - - switch(x_sub) { - case 0: symbol->encoded_data[y_coord][x_char] -= 0x01; break; - case 1: symbol->encoded_data[y_coord][x_char] -= 0x02; break; - case 2: symbol->encoded_data[y_coord][x_char] -= 0x04; break; - case 3: symbol->encoded_data[y_coord][x_char] -= 0x08; break; - case 4: symbol->encoded_data[y_coord][x_char] -= 0x10; break; - case 5: symbol->encoded_data[y_coord][x_char] -= 0x20; break; - case 6: symbol->encoded_data[y_coord][x_char] -= 0x40; break; - } /* The last binary digit is reserved for colour barcodes */ -#endif -} - -void expand(struct zint_symbol *symbol, char data[]) -{ /* Expands from a width pattern to a bit pattern */ - - unsigned int reader, n = strlen(data); - int writer, i; - char latch; - - writer = 0; - latch = '1'; - - for(reader = 0; reader < n; reader++) { - for(i = 0; i < ctoi(data[reader]); i++) { - if(latch == '1') { set_module(symbol, symbol->rows, writer); } - writer++; - } - - latch = (latch == '1' ? '0' : '1'); - } - - if(symbol->symbology != BARCODE_PHARMA) { - if(writer > symbol->width) { - symbol->width = writer; - } - } else { - /* Pharmacode One ends with a space - adjust for this */ - if(writer > symbol->width + 2) { - symbol->width = writer - 2; - } - } - symbol->rows = symbol->rows + 1; -} - -int is_stackable(int symbology) { - /* Indicates which symbologies can have row binding */ - if(symbology < BARCODE_PDF417) { return 1; } - if(symbology == BARCODE_CODE128B) { return 1; } - if(symbology == BARCODE_ISBNX) { return 1; } - if(symbology == BARCODE_EAN14) { return 1; } - if(symbology == BARCODE_NVE18) { return 1; } - if(symbology == BARCODE_KOREAPOST) { return 1; } - if(symbology == BARCODE_PLESSEY) { return 1; } - if(symbology == BARCODE_TELEPEN_NUM) { return 1; } - if(symbology == BARCODE_ITF14) { return 1; } - if(symbology == BARCODE_CODE32) { return 1; } - - return 0; -} - -int is_extendable(int symbology) { - /* Indicates which symbols can have addon */ - if(symbology == BARCODE_EANX) { return 1; } - if(symbology == BARCODE_UPCA) { return 1; } - if(symbology == BARCODE_UPCE) { return 1; } - if(symbology == BARCODE_ISBNX) { return 1; } - if(symbology == BARCODE_UPCA_CC) { return 1; } - if(symbology == BARCODE_UPCE_CC) { return 1; } - if(symbology == BARCODE_EANX_CC) { return 1; } - - return 0; -} - -int roundup(float input) -{ - float remainder; - int integer_part; - - integer_part = (int)input; - remainder = input - integer_part; - - if(remainder > 0.1) { - integer_part++; - } - - return integer_part; -} - -int istwodigits(unsigned char source[], int position) -{ - if((source[position] >= '0') && (source[position] <= '9')) { - if((source[position + 1] >= '0') && (source[position + 1] <= '9')) { - return 1; - } - } - - return 0; -} - -float froundup(float input) -{ - float fraction, output = 0.0; - - fraction = input - (int)input; - if(fraction > 0.01) { output = (input - fraction) + 1.0; } else { output = input; } - - return output; -} - -int latin1_process(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length) -{ - int j, i, next; - - /* Convert Unicode to Latin-1 for those symbologies which only support Latin-1 */ - j = 0; - i = 0; - do { - next = -1; - if(source[i] < 128) { - preprocessed[j] = source[i]; - j++; - next = i + 1; - } else { - if(source[i] == 0xC2) { - preprocessed[j] = source[i + 1]; - j++; - next = i + 2; - } - if(source[i] == 0xC3) { - preprocessed[j] = source[i + 1] + 64; - j++; - next = i + 2; - } - } - if(next == -1) { - strcpy(symbol->errtxt, "error: Invalid character in input string (only Latin-1 characters supported)"); - return ERROR_INVALID_DATA1; - } - i = next; - } while(i < *length); - preprocessed[j] = '\0'; - *length = j; - - return 0; -} - -int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length) -{ - int bpos, jpos, error_number; - int next; - - bpos = 0; - jpos = 0; - error_number = 0; - next = 0; - - do { - if(source[bpos] <= 0x7f) { - /* 1 byte mode (7-bit ASCII) */ - vals[jpos] = source[bpos]; - next = bpos + 1; - jpos++; - } else { - if((source[bpos] >= 0x80) && (source[bpos] <= 0xbf)) { - strcpy(symbol->errtxt, "Corrupt Unicode data"); - return ERROR_INVALID_DATA1; - } - if((source[bpos] >= 0xc0) && (source[bpos] <= 0xc1)) { - strcpy(symbol->errtxt, "Overlong encoding not supported"); - return ERROR_INVALID_DATA1; - } - - if((source[bpos] >= 0xc2) && (source[bpos] <= 0xdf)) { - /* 2 byte mode */ - vals[jpos] = ((source[bpos] & 0x1f) << 6) + (source[bpos + 1] & 0x3f); - next = bpos + 2; - jpos++; - } else - if((source[bpos] >= 0xe0) && (source[bpos] <= 0xef)) { - /* 3 byte mode */ - vals[jpos] = ((source[bpos] & 0x0f) << 12) + ((source[bpos + 1] & 0x3f) << 6) + (source[bpos + 2] & 0x3f); - next = bpos + 3; - jpos ++; - } else - if(source[bpos] >= 0xf0) { - strcpy(symbol->errtxt, "Unicode sequences of more than 3 bytes not supported"); - return ERROR_INVALID_DATA1; - } - } - - bpos = next; - - } while(bpos < *length); - *length = jpos; - - return error_number; -} - diff --git a/3rdparty/zint-2.4.4/backend/common.h b/3rdparty/zint-2.4.4/backend/common.h deleted file mode 100644 index 52bc911..0000000 --- a/3rdparty/zint-2.4.4/backend/common.h +++ /dev/null @@ -1,70 +0,0 @@ -/* common.h - Header for all common functions in common.c */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* Used in some logic */ -#ifndef __COMMON_H -#define __COMMON_H - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -/* The most commonly used set */ -#define NEON "0123456789" - -#include "zint.h" - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -extern int ustrlen(unsigned char source[]); -extern void ustrcpy(unsigned char target[], unsigned char source[]); -extern void concat(char dest[], char source[]); -extern void uconcat(unsigned char dest[], unsigned char source[]); -extern int ctoi(char source); -extern char itoc(int source); -extern void to_upper(unsigned char source[]); -extern int is_sane(char test_string[], unsigned char source[], int length); -extern void lookup(char set_string[], char *table[], char data, char dest[]); -extern int posn(char set_string[], char data); -extern void expand(struct zint_symbol *symbol, char data[]); -extern int is_stackable(int symbology); -extern int is_extendable(int symbology); -extern int roundup(float input); -extern int module_is_set(struct zint_symbol *symbol, int y_coord, int x_coord); -extern void set_module(struct zint_symbol *symbol, int y_coord, int x_coord); -extern void unset_module(struct zint_symbol *symbol, int y_coord, int x_coord); -extern int istwodigits(unsigned char source[], int position); -extern float froundup(float input); -extern int parunmodd(unsigned char llyth); -extern int latin1_process(struct zint_symbol *symbol, unsigned char source[], unsigned char preprocessed[], int *length); -extern int utf8toutf16(struct zint_symbol *symbol, unsigned char source[], int vals[], int *length); -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __COMMON_H */ diff --git a/3rdparty/zint-2.4.4/backend/composite.c b/3rdparty/zint-2.4.4/backend/composite.c deleted file mode 100644 index 5b21d13..0000000 --- a/3rdparty/zint-2.4.4/backend/composite.c +++ /dev/null @@ -1,1957 +0,0 @@ -/* composite.c - Handles UCC.EAN Composite Symbols */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* The functions "getBit", "init928" and "encode928" are copyright BSI and are - released with permission under the following terms: - - "Copyright subsists in all BSI publications. BSI also holds the copyright, in the - UK, of the international standardisation bodies. Except as - permitted under the Copyright, Designs and Patents Act 1988 no extract may be - reproduced, stored in a retrieval system or transmitted in any form or by any - means - electronic, photocopying, recording or otherwise - without prior written - permission from BSI. - - "This does not preclude the free use, in the course of implementing the standard, - of necessary details such as symbols, and size, type or grade designations. If these - details are to be used for any other purpose than implementation then the prior - written permission of BSI must be obtained." - - The date of publication for these functions is 31 May 2006 -*/ - -#include -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" -#include "large.h" -#include "composite.h" -#include "pdf417.h" -#include "gs1.h" - -#define UINT unsigned short - -extern int general_rules(char field[], char type[]); -extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length); -extern int ean_128(struct zint_symbol *symbol, unsigned char source[], int length); -extern int rss14(struct zint_symbol *symbol, unsigned char source[], int length); -extern int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length); -extern int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length); - -static UINT pwr928[69][7]; - -int _min(int first, int second) { - - if(first <= second) - return first; - else - return second; -} - -/* gets bit in bitString at bitPos */ -int getBit(UINT *bitStr, int bitPos) { - return !!(bitStr[bitPos >> 4] & (0x8000 >> (bitPos & 15))); -} - -/* initialize pwr928 encoding table */ -void init928(void) { - int i, j, v; - int cw[7]; - cw[6] = 1L; - for (i = 5; i >= 0; i--) - cw[i] = 0; - - for (i = 0; i < 7; i++) - pwr928[0][i] = cw[i]; - for (j = 1; j < 69; j++) { - for (v = 0, i = 6; i >= 1; i--) { - v = (2 * cw[i]) + (v / 928); - pwr928[j][i] = cw[i] = v % 928; - } - pwr928[j][0] = cw[0] = (2 * cw[0]) + (v / 928); - } - return; -} - -/* converts bit string to base 928 values, codeWords[0] is highest order */ -int encode928(UINT bitString[], UINT codeWords[], int bitLng) { - int i, j, b, bitCnt, cwNdx, cwCnt, cwLng; - for (cwNdx = cwLng = b = 0; b < bitLng; b += 69, cwNdx += 7) { - bitCnt = _min(bitLng-b, 69); - cwLng += cwCnt = bitCnt/10 + 1; - for (i = 0; i < cwCnt; i++) - codeWords[cwNdx+i] = 0; /* init 0 */ - for (i = 0; i < bitCnt; i++) { - if (getBit(bitString, b+bitCnt-i-1)) { - for (j = 0; j < cwCnt; j++) - codeWords[cwNdx+j] += pwr928[i][j+7-cwCnt]; - } - } - for (i = cwCnt-1; i > 0; i--) { - /* add "carries" */ - codeWords[cwNdx+i-1] += codeWords[cwNdx+i]/928L; - codeWords[cwNdx+i] %= 928L; - } - } - return (cwLng); -} - -int cc_a(struct zint_symbol *symbol, char source[], int cc_width) -{ /* CC-A 2D component */ - int i, strpos, segment, bitlen, cwCnt, variant, rows; - int k, offset, j, total, rsCodeWords[8]; - int LeftRAPStart, RightRAPStart, CentreRAPStart, StartCluster; - int LeftRAP, RightRAP, CentreRAP, Cluster, dummy[5]; - int writer, flip, loop; - UINT codeWords[28]; - UINT bitStr[13]; - char codebarre[100], pattern[580]; - char local_source[210]; /* A copy of source but with padding zeroes to make 208 bits */ - - variant=0; - - for(i = 0; i < 13; i++) { bitStr[i] = 0; } - for(i = 0; i < 28; i++) { codeWords[i] = 0; } - - bitlen = strlen(source); - - for(i = 0; i < 208; i++) { local_source[i] = '0'; } - for(i = 0; i < bitlen; i++) { local_source[i] = source[i]; } - local_source[208] = '\0'; - - for(segment = 0; segment < 13; segment++) { - strpos = segment * 16; - if(local_source[strpos] == '1') { bitStr[segment] += 0x8000; } - if(local_source[strpos + 1] == '1') { bitStr[segment] += 0x4000; } - if(local_source[strpos + 2] == '1') { bitStr[segment] += 0x2000; } - if(local_source[strpos + 3] == '1') { bitStr[segment] += 0x1000; } - if(local_source[strpos + 4] == '1') { bitStr[segment] += 0x800; } - if(local_source[strpos + 5] == '1') { bitStr[segment] += 0x400; } - if(local_source[strpos + 6] == '1') { bitStr[segment] += 0x200; } - if(local_source[strpos + 7] == '1') { bitStr[segment] += 0x100; } - if(local_source[strpos + 8] == '1') { bitStr[segment] += 0x80; } - if(local_source[strpos + 9] == '1') { bitStr[segment] += 0x40; } - if(local_source[strpos + 10] == '1') { bitStr[segment] += 0x20; } - if(local_source[strpos + 11] == '1') { bitStr[segment] += 0x10; } - if(local_source[strpos + 12] == '1') { bitStr[segment] += 0x08; } - if(local_source[strpos + 13] == '1') { bitStr[segment] += 0x04; } - if(local_source[strpos + 14] == '1') { bitStr[segment] += 0x02; } - if(local_source[strpos + 15] == '1') { bitStr[segment] += 0x01; } - } - - init928(); - /* encode codeWords from bitStr */ - cwCnt = encode928(bitStr, codeWords, bitlen); - - switch(cc_width) { - case 2: - switch(cwCnt) { - case 6: variant = 0; break; - case 8: variant = 1; break; - case 9: variant = 2; break; - case 11: variant = 3; break; - case 12: variant = 4; break; - case 14: variant = 5; break; - case 17: variant = 6; break; - } - break; - case 3: - switch(cwCnt) { - case 8: variant = 7; break; - case 10: variant = 8; break; - case 12: variant = 9; break; - case 14: variant = 10; break; - case 17: variant = 11; break; - } - break; - case 4: - switch(cwCnt) { - case 8: variant = 12; break; - case 11: variant = 13; break; - case 14: variant = 14; break; - case 17: variant = 15; break; - case 20: variant = 16; break; - } - break; - } - - rows = ccaVariants[variant]; - k = ccaVariants[17 + variant]; - offset = ccaVariants[34 + variant]; - - /* Reed-Solomon error correction */ - - for(i = 0; i < 8; i++) { - rsCodeWords[i] = 0; - } - total = 0; - for(i = 0; i < cwCnt; i++) { - total = (codeWords[i] + rsCodeWords[k - 1]) % 929; - for(j = k - 1; j >= 0; j--) { - if(j == 0) { - rsCodeWords[j] = (929 - (total * ccaCoeffs[offset + j]) % 929) % 929; - } else { - rsCodeWords[j] = (rsCodeWords[j - 1] + 929 - (total * ccaCoeffs[offset + j]) % 929) % 929; - } - } - } - - for(j = 0; j < k; j++) { - if(rsCodeWords[j] != 0) { rsCodeWords[j] = 929 - rsCodeWords[j]; } - } - - for(i = k - 1; i >= 0; i--) { - codeWords[cwCnt] = rsCodeWords[i]; - cwCnt++; - } - - /* Place data into table */ - LeftRAPStart = aRAPTable[variant]; - CentreRAPStart = aRAPTable[variant + 17]; - RightRAPStart = aRAPTable[variant + 34]; - StartCluster = aRAPTable[variant + 51] / 3; - - LeftRAP = LeftRAPStart; - CentreRAP = CentreRAPStart; - RightRAP = RightRAPStart; - Cluster = StartCluster; /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ - - for(i = 0; i < rows; i++) { - strcpy(codebarre, ""); - offset = 929 * Cluster; - for(j = 0; j < 5; j++) { - dummy[j] = 0; - } - for(j = 0; j < cc_width ; j++) { - dummy[j + 1] = codeWords[i * cc_width + j]; - } - /* Copy the data into codebarre */ - concat(codebarre, RAPLR[LeftRAP]); - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[1]]); - concat(codebarre, "1"); - if(cc_width == 3) { - concat(codebarre, RAPC[CentreRAP]); - } - if(cc_width >= 2) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[2]]); - concat(codebarre, "1"); - } - if(cc_width == 4) { - concat(codebarre, RAPC[CentreRAP]); - } - if(cc_width >= 3) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[3]]); - concat(codebarre, "1"); - } - if(cc_width == 4) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[4]]); - concat(codebarre, "1"); - } - concat(codebarre, RAPLR[RightRAP]); - concat(codebarre, "1"); /* stop */ - - /* Now codebarre is a mixture of letters and numbers */ - - writer = 0; - flip = 1; - strcpy(pattern, ""); - for(loop = 0; loop < strlen(codebarre); loop++) { - if((codebarre[loop] >= '0') && (codebarre[loop] <= '9')) { - for(k = 0; k < ctoi(codebarre[loop]); k++) { - if(flip == 0) { - pattern[writer] = '0'; - } else { - pattern[writer] = '1'; - } - writer++; - } - pattern[writer] = '\0'; - if(flip == 0) { - flip = 1; - } else { - flip = 0; - } - } else { - lookup(BRSET, PDFttf, codebarre[loop], pattern); - writer += 5; - } - } - symbol->width = writer; - - /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ - for(loop = 0; loop < strlen(pattern); loop++) { - if(pattern[loop] == '1') { set_module(symbol, i, loop); } - } - symbol->row_height[i] = 2; - symbol->rows++; - - /* Set up RAPs and Cluster for next row */ - LeftRAP++; - CentreRAP++; - RightRAP++; - Cluster++; - - if(LeftRAP == 53) { - LeftRAP = 1; - } - if(CentreRAP == 53) { - CentreRAP = 1; - } - if(RightRAP == 53) { - RightRAP = 1; - } - if(Cluster == 3) { - Cluster = 0; - } - } - - return 0; -} - -int cc_b(struct zint_symbol *symbol, char source[], int cc_width) -{ /* CC-B 2D component */ - int length, i, binloc; -#ifndef _MSC_VER - unsigned char data_string[(strlen(source) / 8) + 3]; -#else - unsigned char* data_string = (unsigned char*)_alloca((strlen(source) / 8) + 3); -#endif - int chainemc[180], mclength; - int k, j, longueur, mccorrection[50], offset; - int total, dummy[5]; - char codebarre[100], pattern[580]; - int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster; - int LeftRAP, CentreRAP, RightRAP, Cluster, writer, flip, loop; - - length = strlen(source) / 8; - - for(i = 0; i < length; i++) { - binloc = i * 8; - - data_string[i] = 0; - if(source[binloc] == '1') { data_string[i] += 0x80; } - if(source[binloc + 1] == '1') { data_string[i] += 0x40; } - if(source[binloc + 2] == '1') { data_string[i] += 0x20; } - if(source[binloc + 3] == '1') { data_string[i] += 0x10; } - if(source[binloc + 4] == '1') { data_string[i] += 0x08; } - if(source[binloc + 5] == '1') { data_string[i] += 0x04; } - if(source[binloc + 6] == '1') { data_string[i] += 0x02; } - if(source[binloc + 7] == '1') { data_string[i] += 0x01; } - } - - - mclength = 0; - - /* "the CC-B component shall have codeword 920 in the first symbol character position" (section 9a) */ - chainemc[mclength] = 920; - mclength++; - - byteprocess(chainemc, &mclength, data_string, 0, length, 0); - - /* Now figure out which variant of the symbol to use and load values accordingly */ - - variant = 0; - - if(cc_width == 2) { - variant = 13; - if(mclength <= 33) { variant = 12; } - if(mclength <= 29) { variant = 11; } - if(mclength <= 24) { variant = 10; } - if(mclength <= 19) { variant = 9; } - if(mclength <= 13) { variant = 8; } - if(mclength <= 8) { variant = 7; } - } - - if(cc_width == 3) { - variant = 23; - if(mclength <= 70) { variant = 22; } - if(mclength <= 58) { variant = 21; } - if(mclength <= 46) { variant = 20; } - if(mclength <= 34) { variant = 19; } - if(mclength <= 24) { variant = 18; } - if(mclength <= 18) { variant = 17; } - if(mclength <= 14) { variant = 16; } - if(mclength <= 10) { variant = 15; } - if(mclength <= 6) { variant = 14; } - } - - if(cc_width == 4) { - variant = 34; - if(mclength <= 108) { variant = 33; } - if(mclength <= 90) { variant = 32; } - if(mclength <= 72) { variant = 31; } - if(mclength <= 54) { variant = 30; } - if(mclength <= 39) { variant = 29; } - if(mclength <= 30) { variant = 28; } - if(mclength <= 24) { variant = 27; } - if(mclength <= 18) { variant = 26; } - if(mclength <= 12) { variant = 25; } - if(mclength <= 8) { variant = 24; } - } - - /* Now we have the variant we can load the data - from here on the same as MicroPDF417 code */ - variant --; - symbol->option_2 = MicroVariants[variant]; /* columns */ - symbol->rows = MicroVariants[variant + 34]; /* rows */ - k = MicroVariants[variant + 68]; /* number of EC CWs */ - longueur = (symbol->option_2 * symbol->rows) - k; /* number of non-EC CWs */ - i = longueur - mclength; /* amount of padding required */ - offset = MicroVariants[variant + 102]; /* coefficient offset */ - - /* We add the padding */ - while (i > 0) { - chainemc[mclength] = 900; - mclength++; - i--; - } - - /* Reed-Solomon error correction */ - longueur = mclength; - for(loop = 0; loop < 50; loop++) { - mccorrection[loop] = 0; - } - total = 0; - for(i = 0; i < longueur; i++) { - total = (chainemc[i] + mccorrection[k - 1]) % 929; - for(j = k - 1; j >= 0; j--) { - if(j == 0) { - mccorrection[j] = (929 - (total * Microcoeffs[offset + j]) % 929) % 929; - } else { - mccorrection[j] = (mccorrection[j - 1] + 929 - (total * Microcoeffs[offset + j]) % 929) % 929; - } - } - } - - for(j = 0; j < k; j++) { - if(mccorrection[j] != 0) { mccorrection[j] = 929 - mccorrection[j]; } - } - /* we add these codes to the string */ - for(i = k - 1; i >= 0; i--) { - chainemc[mclength] = mccorrection[i]; - mclength++; - } - - /* Now get the RAP (Row Address Pattern) start values */ - LeftRAPStart = RAPTable[variant]; - CentreRAPStart = RAPTable[variant + 34]; - RightRAPStart = RAPTable[variant + 68]; - StartCluster = RAPTable[variant + 102] / 3; - - /* That's all values loaded, get on with the encoding */ - - LeftRAP = LeftRAPStart; - CentreRAP = CentreRAPStart; - RightRAP = RightRAPStart; - Cluster = StartCluster; /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ - - for(i = 0; i < symbol->rows; i++) { - strcpy(codebarre, ""); - offset = 929 * Cluster; - for(j = 0; j < 5; j++) { - dummy[j] = 0; - } - for(j = 0; j < symbol->option_2 ; j++) { - dummy[j + 1] = chainemc[i * symbol->option_2 + j]; - } - /* Copy the data into codebarre */ - concat(codebarre, RAPLR[LeftRAP]); - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[1]]); - concat(codebarre, "1"); - if(cc_width == 3) { - concat(codebarre, RAPC[CentreRAP]); - } - if(cc_width >= 2) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[2]]); - concat(codebarre, "1"); - } - if(cc_width == 4) { - concat(codebarre, RAPC[CentreRAP]); - } - if(cc_width >= 3) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[3]]); - concat(codebarre, "1"); - } - if(cc_width == 4) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[4]]); - concat(codebarre, "1"); - } - concat(codebarre, RAPLR[RightRAP]); - concat(codebarre, "1"); /* stop */ - - /* Now codebarre is a mixture of letters and numbers */ - - writer = 0; - flip = 1; - strcpy(pattern, ""); - for(loop = 0; loop < strlen(codebarre); loop++) { - if((codebarre[loop] >= '0') && (codebarre[loop] <= '9')) { - for(k = 0; k < ctoi(codebarre[loop]); k++) { - if(flip == 0) { - pattern[writer] = '0'; - } else { - pattern[writer] = '1'; - } - writer++; - } - pattern[writer] = '\0'; - if(flip == 0) { - flip = 1; - } else { - flip = 0; - } - } else { - lookup(BRSET, PDFttf, codebarre[loop], pattern); - writer += 5; - } - } - symbol->width = writer; - - /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ - for(loop = 0; loop < strlen(pattern); loop++) { - if(pattern[loop] == '1') { set_module(symbol, i, loop); } - } - symbol->row_height[i] = 2; - - /* Set up RAPs and Cluster for next row */ - LeftRAP++; - CentreRAP++; - RightRAP++; - Cluster++; - - if(LeftRAP == 53) { - LeftRAP = 1; - } - if(CentreRAP == 53) { - CentreRAP = 1; - } - if(RightRAP == 53) { - RightRAP = 1; - } - if(Cluster == 3) { - Cluster = 0; - } - } - - return 0; -} - -int cc_c(struct zint_symbol *symbol, char source[], int cc_width, int ecc_level) -{ /* CC-C 2D component - byte compressed PDF417 */ - int length, i, binloc; -#ifndef _MSC_VER - unsigned char data_string[(strlen(source) / 8) + 4]; -#else - unsigned char* data_string = (unsigned char*)_alloca((strlen(source) / 8) + 4); -#endif - int chainemc[1000], mclength, k; - int offset, longueur, loop, total, j, mccorrection[520]; - int c1, c2, c3, dummy[35]; - char codebarre[100], pattern[580]; - - length = strlen(source) / 8; - - for(i = 0; i < length; i++) { - binloc = i * 8; - - data_string[i] = 0; - if(source[binloc] == '1') { data_string[i] += 0x80; } - if(source[binloc + 1] == '1') { data_string[i] += 0x40; } - if(source[binloc + 2] == '1') { data_string[i] += 0x20; } - if(source[binloc + 3] == '1') { data_string[i] += 0x10; } - if(source[binloc + 4] == '1') { data_string[i] += 0x08; } - if(source[binloc + 5] == '1') { data_string[i] += 0x04; } - if(source[binloc + 6] == '1') { data_string[i] += 0x02; } - if(source[binloc + 7] == '1') { data_string[i] += 0x01; } - } - - mclength = 0; - - chainemc[mclength] = 0; /* space for length descriptor */ - mclength++; - chainemc[mclength] = 920; /* CC-C identifier */ - mclength++; - - byteprocess(chainemc, &mclength, data_string, 0, length, 0); - - chainemc[0] = mclength; - - k = 1; - for(i = 1; i <= (ecc_level + 1); i++) - { - k *= 2; - } - - /* 796 - we now take care of the Reed Solomon codes */ - switch(ecc_level) { - case 1: offset = 2; break; - case 2: offset = 6; break; - case 3: offset = 14; break; - case 4: offset = 30; break; - case 5: offset = 62; break; - case 6: offset = 126; break; - case 7: offset = 254; break; - case 8: offset = 510; break; - default: offset = 0; break; - } - - longueur = mclength; - for(loop = 0; loop < 520; loop++) { - mccorrection[loop] = 0; - } - total = 0; - for(i = 0; i < longueur; i++) { - total = (chainemc[i] + mccorrection[k - 1]) % 929; - for(j = k - 1; j >= 0; j--) { - if(j == 0) { - mccorrection[j] = (929 - (total * coefrs[offset + j]) % 929) % 929; - } else { - mccorrection[j] = (mccorrection[j - 1] + 929 - (total * coefrs[offset + j]) % 929) % 929; - } - } - } - - for(j = 0; j < k; j++) { - if(mccorrection[j] != 0) { mccorrection[j] = 929 - mccorrection[j]; } - } - /* we add these codes to the string */ - for(i = k - 1; i >= 0; i--) { - chainemc[mclength] = mccorrection[i]; - mclength++; - } - - /* 818 - The CW string is finished */ - c1 = (mclength / cc_width - 1) / 3; - c2 = ecc_level * 3 + (mclength / cc_width - 1) % 3; - c3 = cc_width - 1; - - /* we now encode each row */ - for(i = 0; i <= (mclength / cc_width) - 1; i++) { - for(j = 0; j < cc_width ; j++) { - dummy[j + 1] = chainemc[i * cc_width + j]; - } - k = (i / 3) * 30; - switch(i % 3) { - /* follows this pattern from US Patent 5,243,655: - Row 0: L0 (row #, # of rows) R0 (row #, # of columns) - Row 1: L1 (row #, security level) R1 (row #, # of rows) - Row 2: L2 (row #, # of columns) R2 (row #, security level) - Row 3: L3 (row #, # of rows) R3 (row #, # of columns) - etc. */ - case 0: - dummy[0] = k + c1; - dummy[cc_width + 1] = k + c3; - break; - case 1: - dummy[0] = k + c2; - dummy[cc_width + 1] = k + c1; - break; - case 2: - dummy[0] = k + c3; - dummy[cc_width + 1] = k + c2; - break; - } - strcpy(codebarre, "+*"); /* Start with a start char and a separator */ - - for(j = 0; j <= cc_width + 1; j++) { - switch(i % 3) { - case 1: offset = 929; /* cluster(3) */ break; - case 2: offset = 1858; /* cluster(6) */ break; - default: offset = 0; /* cluster(0) */ break; - } - concat(codebarre, codagemc[offset + dummy[j]]); - concat(codebarre, "*"); - } - concat(codebarre, "-"); - - strcpy(pattern, ""); - for(loop = 0; loop < strlen(codebarre); loop++) { - lookup(BRSET, PDFttf, codebarre[loop], pattern); - } - for(loop = 0; loop < strlen(pattern); loop++) { - if(pattern[loop] == '1') { set_module(symbol, i, loop); } - } - symbol->row_height[i] = 3; - } - symbol->rows = (mclength / cc_width); - symbol->width = strlen(pattern); - - return 0; -} - -int cc_binary_string(struct zint_symbol *symbol, const char source[], char binary_string[], int cc_mode, int *cc_width, int *ecc, int lin_width) -{ /* Handles all data encodation from section 5 of ISO/IEC 24723 */ - int encoding_method, read_posn, d1, d2, value, alpha_pad; - int i, j, mask, ai_crop, ai_crop_posn, fnc1_latch; - long int group_val; - int ai90_mode, latch, remainder, binary_length; - char date_str[4]; -#ifndef _MSC_VER - char general_field[strlen(source) + 1], general_field_type[strlen(source) + 1]; -#else - char* general_field = (char*)_alloca(strlen(source) + 1); - char* general_field_type = (char*)_alloca(strlen(source) + 1); -#endif - int target_bitsize; - - encoding_method = 1; - read_posn = 0; - ai_crop = 0; - ai_crop_posn = -1; - fnc1_latch = 0; - alpha_pad = 0; - ai90_mode = 0; - *ecc = 0; - value = 0; - target_bitsize = 0; - - if((source[0] == '1') && ((source[1] == '0') || (source[1] == '1') || (source[1] == '7')) && (strlen(source) > 8)) { - /* Source starts (10), (11) or (17) */ - encoding_method = 2; - } - - if((source[0] == '9') && (source[1] == '0')) { - /* Source starts (90) */ - encoding_method = 3; - } - - if(encoding_method == 1) { - concat(binary_string, "0"); - } - - if(encoding_method == 2) { - /* Encoding Method field "10" - date and lot number */ - - concat(binary_string, "10"); - - if(source[1] == '0') { - /* No date data */ - concat(binary_string, "11"); - read_posn = 2; - } else { - /* Production Date (11) or Expiration Date (17) */ - date_str[0] = source[2]; - date_str[1] = source[3]; - date_str[2] = '\0'; - group_val = atoi(date_str) * 384; - - date_str[0] = source[4]; - date_str[1] = source[5]; - group_val += (atoi(date_str) - 1) * 32; - - date_str[0] = source[6]; - date_str[1] = source[7]; - group_val += atoi(date_str); - - mask = 0x8000; - for(j = 0; j < 16; j++) { - if((group_val & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - - if(source[1] == '1') { - /* Production Date AI 11 */ - concat(binary_string, "0"); - } else { - /* Expiration Date AI 17 */ - concat(binary_string, "1"); - } - read_posn = 8; - } - - if((source[read_posn] == '1') && (source[read_posn + 1] == '0')) { - /* Followed by AI 10 - strip this from general field */ - read_posn += 2; - } else { - /* An FNC1 character needs to be inserted in the general field */ - fnc1_latch = 1; - } - } - - if (encoding_method == 3) { - /* Encodation Method field of "11" - AI 90 */ -#ifndef _MSC_VER - char ninety[strlen(source) + 1]; -#else - char* ninety = (char*)_alloca(strlen(source) + 1); -#endif - char numeric_part[4]; - int alpha, alphanum, numeric, test1, test2, test3, next_ai_posn; - int numeric_value, table3_letter, mask; - - /* "This encodation method may be used if an element string with an AI - 90 occurs at the start of the data message, and if the data field - following the two-digit AI 90 starts with an alphanumeric string which - complies with a specific format." (para 5.2.2) */ - - i = 0; - do { - ninety[i] = source[i + 2]; - i++; - } while ((strlen(source) > i + 2) && ('[' != source[i + 2])); - ninety[i] = '\0'; - - /* Find out if the AI 90 data is alphabetic or numeric or both */ - - alpha = 0; - alphanum = 0; - numeric = 0; - - for(i = 0; i < strlen(ninety); i++) { - - if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) { - /* Character is alphabetic */ - alpha += 1; - } - - if ((ninety[i] >= '0') && (ninety[i] <= '9')) { - /* Character is numeric */ - numeric += 1; - } - - switch(ninety[i]) { - case '*': - case ',': - case '-': - case '.': - case '/': alphanum += 1; break; - } - - if (!(((ninety[i] >= '0') && (ninety[i] <= '9')) || ((ninety[i] >= 'A') && (ninety[i] <= 'Z')))) { - if((ninety[i] != '*') && (ninety[i] != ',') && (ninety[i] != '-') && (ninety[i] != '.') && (ninety[i] != '/')) { - /* An Invalid AI 90 character */ - strcpy(symbol->errtxt, "Invalid AI 90 data"); - return ERROR_INVALID_DATA1; - } - } - } - - /* must start with 0, 1, 2 or 3 digits followed by an uppercase character */ - test1 = -1; - for(i = 3; i >= 0; i--) { - if ((ninety[i] >= 'A') && (ninety[i] <= 'Z')) { - test1 = i; - } - } - - test2 = 0; - for(i = 0; i < test1; i++) { - if (!((ninety[i] >= '0') && (ninety[i] <= '9'))) { - test2 = 1; - } - } - - /* leading zeros are not permitted */ - test3 = 0; - if((test1 >= 1) && (ninety[0] == '0')) { test3 = 1; } - - if((test1 != -1) && (test2 != 1) && (test3 == 0)) { - /* Encodation method "11" can be used */ - concat(binary_string, "11"); - - numeric -= test1; - alpha --; - - /* Decide on numeric, alpha or alphanumeric mode */ - /* Alpha mode is a special mode for AI 90 */ - - if(alphanum > 0) { - /* Alphanumeric mode */ - concat(binary_string, "0"); - ai90_mode = 1; - } else { - if(alpha > numeric) { - /* Alphabetic mode */ - concat(binary_string, "11"); - ai90_mode = 2; - } else { - /* Numeric mode */ - concat(binary_string, "10"); - ai90_mode = 3; - } - } - - next_ai_posn = 2 + strlen(ninety); - - if(source[next_ai_posn] == '[') { - /* There are more AIs afterwords */ - if((source[next_ai_posn + 1] == '2') && (source[next_ai_posn + 2] == '1')) { - /* AI 21 follows */ - ai_crop = 1; - ai_crop_posn = next_ai_posn + 1; - } - - if((source[next_ai_posn + 1] == '8') && (source[next_ai_posn + 2] == '0') && (source[next_ai_posn + 3] == '0') && (source[next_ai_posn + 4] == '4')) { - /* AI 8004 follows */ - ai_crop = 2; - ai_crop_posn = next_ai_posn + 1; - } - } - - switch(ai_crop) { - case 0: concat(binary_string, "0"); break; - case 1: concat(binary_string, "10"); break; - case 2: concat(binary_string, "11"); break; - } - - if(test1 == 0) { - strcpy(numeric_part, "0"); - } else { - for(i = 0; i < test1; i++) { - numeric_part[i] = ninety[i]; - } - numeric_part[i] = '\0'; - } - - numeric_value = atoi(numeric_part); - - table3_letter = -1; - if(numeric_value < 31) { - switch(ninety[test1]) { - case 'B': table3_letter = 0; break; - case 'D': table3_letter = 1; break; - case 'H': table3_letter = 2; break; - case 'I': table3_letter = 3; break; - case 'J': table3_letter = 4; break; - case 'K': table3_letter = 5; break; - case 'L': table3_letter = 6; break; - case 'N': table3_letter = 7; break; - case 'P': table3_letter = 8; break; - case 'Q': table3_letter = 9; break; - case 'R': table3_letter = 10; break; - case 'S': table3_letter = 11; break; - case 'T': table3_letter = 12; break; - case 'V': table3_letter = 13; break; - case 'W': table3_letter = 14; break; - case 'Z': table3_letter = 15; break; - } - } - - if(table3_letter != -1) { - /* Encoding can be done according to 5.2.2 c) 2) */ - /* five bit binary string representing value before letter */ - mask = 0x10; - for(j = 0; j < 5; j++) { - if((numeric_value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - - /* followed by four bit representation of letter from Table 3 */ - mask = 0x08; - for(j = 0; j < 4; j++) { - if((table3_letter & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } else { - /* Encoding is done according to 5.2.2 c) 3) */ - concat(binary_string, "11111"); - /* ten bit representation of number */ - mask = 0x200; - for(j = 0; j < 10; j++) { - if((numeric_value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - - /* five bit representation of ASCII character */ - mask = 0x10; - for(j = 0; j < 5; j++) { - if(((ninety[test1] - 65) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - read_posn = test1 + 3; - } else { - /* Use general field encodation instead */ - concat(binary_string, "0"); - read_posn = 0; - } - } - - /* Now encode the rest of the AI 90 data field */ - if(ai90_mode == 2) { - /* Alpha encodation (section 5.2.3) */ - do { - if((source[read_posn] >= '0') && (source[read_posn] <= '9')) { - mask = 0x10; - for(j = 0; j < 5; j++) { - if(((source[read_posn] + 4) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) { - mask = 0x20; - for(j = 0; j < 6; j++) { - if(((source[read_posn] - 65) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if(source[read_posn] == '[') { - concat(binary_string, "11111"); - } - - read_posn++; - } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0')); - alpha_pad = 1; /* This is overwritten if a general field is encoded */ - } - - if(ai90_mode == 1) { - /* Alphanumeric mode */ - do { - if((source[read_posn] >= '0') && (source[read_posn] <= '9')) { - mask = 0x10; - for(j = 0; j < 5; j++) { - if(((source[read_posn] - 43) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((source[read_posn] >= 'A') && (source[read_posn] <= 'Z')) { - mask = 0x20; - for(j = 0; j < 6; j++) { - if(((source[read_posn] - 33) & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - switch(source[read_posn]) { - case '[': concat(binary_string, "01111"); break; - case '*': concat(binary_string, "111010"); break; - case ',': concat(binary_string, "111011"); break; - case '-': concat(binary_string, "111100"); break; - case '.': concat(binary_string, "111101"); break; - case '/': concat(binary_string, "111110"); break; - } - - read_posn++; - } while ((source[read_posn - 1] != '[') && (source[read_posn - 1] != '\0')); - } - - read_posn += (2 * ai_crop); - - /* The compressed data field has been processed if appropriate - the - rest of the data (if any) goes into a general-purpose data compaction field */ - - j = 0; - if(fnc1_latch == 1) { - /* Encodation method "10" has been used but it is not followed by - AI 10, so a FNC1 character needs to be added */ - general_field[j] = '['; - j++; - } - - for(i = read_posn; i < strlen(source); i++) { - general_field[j] = source[i]; - j++; - } - general_field[j] = '\0'; - - if(strlen(general_field) != 0) { alpha_pad = 0; } - - latch = 0; - for(i = 0; i < strlen(general_field); i++) { - /* Table 13 - ISO/IEC 646 encodation */ - if((general_field[i] < ' ') || (general_field[i] > 'z')) { - general_field_type[i] = INVALID_CHAR; latch = 1; - } else { - general_field_type[i] = ISOIEC; - } - - if(general_field[i] == '#') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == '$') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == '@') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == 92) { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == '^') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == 96) { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - - /* Table 12 - Alphanumeric encodation */ - if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '*') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == ',') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '-') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '.') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '/') { - general_field_type[i] = ALPHA_OR_ISO; - } - - /* Numeric encodation */ - if((general_field[i] >= '0') && (general_field[i] <= '9')) { - general_field_type[i] = ANY_ENC; - } - if(general_field[i] == '[') { - /* FNC1 can be encoded in any system */ - general_field_type[i] = ANY_ENC; - } - - } - - general_field_type[strlen(general_field)] = '\0'; - - if(latch == 1) { - /* Invalid characters in input data */ - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ERROR_INVALID_DATA1; - } - - for(i = 0; i < strlen(general_field); i++) { - if((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) { - general_field_type[i + 1] = ISOIEC; - } - } - - for(i = 0; i < strlen(general_field); i++) { - if((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) { - general_field_type[i + 1] = ALPHA_OR_ISO; - } - } - - latch = general_rules(general_field, general_field_type); - - i = 0; - do { - switch(general_field_type[i]) { - case NUMERIC: - - if(i != 0) { - if((general_field_type[i - 1] != NUMERIC) && (general_field[i - 1] != '[')) { - concat(binary_string, "000"); /* Numeric latch */ - } - } - - if(general_field[i] != '[') { - d1 = ctoi(general_field[i]); - } else { - d1 = 10; - } - - if(general_field[i + 1] != '[') { - d2 = ctoi(general_field[i + 1]); - } else { - d2 = 10; - } - - value = (11 * d1) + d2 + 8; - - mask = 0x40; - for(j = 0; j < 7; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - - i += 2; - break; - - case ALPHA: - - if(i != 0) { - if((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) { - concat(binary_string, "0000"); /* Alphanumeric latch */ - } - if(general_field_type[i - 1] == ISOIEC) { - concat(binary_string, "00100"); /* ISO/IEC 646 latch */ - } - } - - if((general_field[i] >= '0') && (general_field[i] <= '9')) { - - value = general_field[i] - 43; - - mask = 0x10; - for(j = 0; j < 5; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - - value = general_field[i] - 33; - - mask = 0x20; - for(j = 0; j < 6; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if(general_field[i] == '[') concat(binary_string, "01111"); /* FNC1/Numeric latch */ - if(general_field[i] == '*') concat(binary_string, "111010"); /* asterisk */ - if(general_field[i] == ',') concat(binary_string, "111011"); /* comma */ - if(general_field[i] == '-') concat(binary_string, "111100"); /* minus or hyphen */ - if(general_field[i] == '.') concat(binary_string, "111101"); /* period or full stop */ - if(general_field[i] == '/') concat(binary_string, "111110"); /* slash or solidus */ - - i++; - break; - - case ISOIEC: - - if(i != 0) { - if((general_field_type[i - 1] == NUMERIC) || (general_field[i - 1] == '[')) { - concat(binary_string, "0000"); /* Alphanumeric latch */ - concat(binary_string, "00100"); /* ISO/IEC 646 latch */ - } - if(general_field_type[i - 1] == ALPHA) { - concat(binary_string, "00100"); /* ISO/IEC 646 latch */ - } - } - - if((general_field[i] >= '0') && (general_field[i] <= '9')) { - - value = general_field[i] - 43; - - mask = 0x10; - for(j = 0; j < 5; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - - value = general_field[i] - 1; - - mask = 0x40; - for(j = 0; j < 7; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if((general_field[i] >= 'a') && (general_field[i] <= 'z')) { - - value = general_field[i] - 7; - - mask = 0x40; - for(j = 0; j < 7; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } - - if(general_field[i] == '[') concat(binary_string, "01111"); /* FNC1/Numeric latch */ - if(general_field[i] == '!') concat(binary_string, "11101000"); /* exclamation mark */ - if(general_field[i] == 34) concat(binary_string, "11101001"); /* quotation mark */ - if(general_field[i] == 37) concat(binary_string, "11101010"); /* percent sign */ - if(general_field[i] == '&') concat(binary_string, "11101011"); /* ampersand */ - if(general_field[i] == 39) concat(binary_string, "11101100"); /* apostrophe */ - if(general_field[i] == '(') concat(binary_string, "11101101"); /* left parenthesis */ - if(general_field[i] == ')') concat(binary_string, "11101110"); /* right parenthesis */ - if(general_field[i] == '*') concat(binary_string, "11101111"); /* asterisk */ - if(general_field[i] == '+') concat(binary_string, "11110000"); /* plus sign */ - if(general_field[i] == ',') concat(binary_string, "11110001"); /* comma */ - if(general_field[i] == '-') concat(binary_string, "11110010"); /* minus or hyphen */ - if(general_field[i] == '.') concat(binary_string, "11110011"); /* period or full stop */ - if(general_field[i] == '/') concat(binary_string, "11110100"); /* slash or solidus */ - if(general_field[i] == ':') concat(binary_string, "11110101"); /* colon */ - if(general_field[i] == ';') concat(binary_string, "11110110"); /* semicolon */ - if(general_field[i] == '<') concat(binary_string, "11110111"); /* less-than sign */ - if(general_field[i] == '=') concat(binary_string, "11111000"); /* equals sign */ - if(general_field[i] == '>') concat(binary_string, "11111001"); /* greater-than sign */ - if(general_field[i] == '?') concat(binary_string, "11111010"); /* question mark */ - if(general_field[i] == '_') concat(binary_string, "11111011"); /* underline or low line */ - if(general_field[i] == ' ') concat(binary_string, "11111100"); /* space */ - - i++; - break; - } - } while (i + latch < strlen(general_field)); - - binary_length = strlen(binary_string); - if(cc_mode == 1) { - /* CC-A 2D component - calculate remaining space */ - switch(*(cc_width)) { - case 2: - if(binary_length > 167) { return ERROR_TOO_LONG; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 118) { target_bitsize = 118; } - if(binary_length <= 108) { target_bitsize = 108; } - if(binary_length <= 88) { target_bitsize = 88; } - if(binary_length <= 78) { target_bitsize = 78; } - if(binary_length <= 59) { target_bitsize = 59; } - break; - case 3: - if(binary_length > 167) { return ERROR_TOO_LONG; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 118) { target_bitsize = 118; } - if(binary_length <= 98) { target_bitsize = 98; } - if(binary_length <= 78) { target_bitsize = 78; } - break; - case 4: - if(binary_length > 197) { return ERROR_TOO_LONG; } - if(binary_length <= 197) { target_bitsize = 197; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 108) { target_bitsize = 108; } - if(binary_length <= 78) { target_bitsize = 78; } - break; - } - } - - if(cc_mode == 2) { - /* CC-B 2D component - calculated from ISO/IEC 24728 Table 1 */ - switch(*(cc_width)) { - case 2: - if(binary_length > 336) { return ERROR_TOO_LONG; } - if(binary_length <= 336) { target_bitsize = 336; } - if(binary_length <= 296) { target_bitsize = 296; } - if(binary_length <= 256) { target_bitsize = 256; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 160) { target_bitsize = 160; } - if(binary_length <= 104) { target_bitsize = 104; } - if(binary_length <= 56) { target_bitsize = 56; } - break; - case 3: - if(binary_length > 768) { return ERROR_TOO_LONG; } - if(binary_length <= 768) { target_bitsize = 768; } - if(binary_length <= 648) { target_bitsize = 648; } - if(binary_length <= 536) { target_bitsize = 536; } - if(binary_length <= 416) { target_bitsize = 416; } - if(binary_length <= 304) { target_bitsize = 304; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 152) { target_bitsize = 152; } - if(binary_length <= 112) { target_bitsize = 112; } - if(binary_length <= 72) { target_bitsize = 72; } - if(binary_length <= 32) { target_bitsize = 32; } - break; - case 4: - if(binary_length > 1184) { return ERROR_TOO_LONG; } - if(binary_length <= 1184) { target_bitsize = 1184; } - if(binary_length <= 1016) { target_bitsize = 1016; } - if(binary_length <= 840) { target_bitsize = 840; } - if(binary_length <= 672) { target_bitsize = 672; } - if(binary_length <= 496) { target_bitsize = 496; } - if(binary_length <= 352) { target_bitsize = 352; } - if(binary_length <= 264) { target_bitsize = 264; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 152) { target_bitsize = 152; } - if(binary_length <= 96) { target_bitsize = 96; } - if(binary_length <= 56) { target_bitsize = 56; } - break; - } - } - - if (cc_mode == 3) { - /* CC-C 2D Component is a bit more complex! */ - int byte_length, codewords_used, ecc_level, ecc_codewords, rows; - int codewords_total, target_codewords, target_bytesize; - - byte_length = binary_length / 8; - if(binary_length % 8 != 0) { byte_length++; } - - codewords_used = (byte_length / 6) * 5; - codewords_used += byte_length % 6; - - ecc_level = 7; - if(codewords_used <= 1280) { ecc_level = 6; } - if(codewords_used <= 640) { ecc_level = 5; } - if(codewords_used <= 320) { ecc_level = 4; } - if(codewords_used <= 160) { ecc_level = 3; } - if(codewords_used <= 40) { ecc_level = 2; } - *(ecc) = ecc_level; - ecc_codewords = 1; - for(i = 1; i <= (ecc_level + 1); i++){ - ecc_codewords *= 2; - } - - codewords_used += ecc_codewords; - codewords_used += 3; - - if(codewords_used > symbol->option_3) { - return ERROR_TOO_LONG; - } - /* *(cc_width) = 0.5 + sqrt((codewords_used) / 3); */ - *(cc_width) = (lin_width - 62) / 17; - if((codewords_used / *(cc_width)) > 90) { - /* stop the symbol from becoming too high */ - *(cc_width) = *(cc_width) + 1; - } - - rows = codewords_used / *(cc_width); - if(codewords_used % *(cc_width) != 0) { - rows++; - } - - codewords_total = *(cc_width) * rows; - - target_codewords = codewords_total - ecc_codewords; - target_codewords -= 3; - - target_bytesize = 6 * (target_codewords / 5); - target_bytesize += target_codewords % 5; - - target_bitsize = 8 * target_bytesize; - } - - remainder = binary_length - target_bitsize; - - if(latch == 1) { - i = 0; - /* There is still one more numeric digit to encode */ - - if((remainder >= 4) && (remainder <= 6)) { - d1 = ctoi(general_field[i]); - d1++; - - mask = 0x08; - for(j = 0; j < 4; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - } else { - d1 = ctoi(general_field[i]); - d2 = 10; - - value = (11 * d1) + d2 + 8; - - mask = 0x40; - for(j = 0; j < 7; j++) { - if((value & mask) == 0x00) { - concat(binary_string, "0"); - } else { - concat(binary_string, "1"); - } - mask = mask >> 1; - } - /* This may push the symbol up to the next size */ - } - } - - if(strlen(binary_string) > 11805) { /* (2361 * 5) */ - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* all the code below is repeated from above - it needs to be calculated again because the - size of the symbol may have changed when adding data in the above sequence */ - - binary_length = strlen(binary_string); - if(cc_mode == 1) { - /* CC-A 2D component - calculate padding required */ - switch(*(cc_width)) { - case 2: - if(binary_length > 167) { return ERROR_TOO_LONG; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 118) { target_bitsize = 118; } - if(binary_length <= 108) { target_bitsize = 108; } - if(binary_length <= 88) { target_bitsize = 88; } - if(binary_length <= 78) { target_bitsize = 78; } - if(binary_length <= 59) { target_bitsize = 59; } - break; - case 3: - if(binary_length > 167) { return ERROR_TOO_LONG; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 118) { target_bitsize = 118; } - if(binary_length <= 98) { target_bitsize = 98; } - if(binary_length <= 78) { target_bitsize = 78; } - break; - case 4: - if(binary_length > 197) { return ERROR_TOO_LONG; } - if(binary_length <= 197) { target_bitsize = 197; } - if(binary_length <= 167) { target_bitsize = 167; } - if(binary_length <= 138) { target_bitsize = 138; } - if(binary_length <= 108) { target_bitsize = 108; } - if(binary_length <= 78) { target_bitsize = 78; } - break; - } - } - - if(cc_mode == 2) { - /* CC-B 2D component */ - switch(*(cc_width)) { - case 2: - if(binary_length > 336) { return ERROR_TOO_LONG; } - if(binary_length <= 336) { target_bitsize = 336; } - if(binary_length <= 296) { target_bitsize = 296; } - if(binary_length <= 256) { target_bitsize = 256; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 160) { target_bitsize = 160; } - if(binary_length <= 104) { target_bitsize = 104; } - if(binary_length <= 56) { target_bitsize = 56; } - break; - case 3: - if(binary_length > 768) { return ERROR_TOO_LONG; } - if(binary_length <= 768) { target_bitsize = 768; } - if(binary_length <= 648) { target_bitsize = 648; } - if(binary_length <= 536) { target_bitsize = 536; } - if(binary_length <= 416) { target_bitsize = 416; } - if(binary_length <= 304) { target_bitsize = 304; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 152) { target_bitsize = 152; } - if(binary_length <= 112) { target_bitsize = 112; } - if(binary_length <= 72) { target_bitsize = 72; } - if(binary_length <= 32) { target_bitsize = 32; } - break; - case 4: - if(binary_length > 1184) { return ERROR_TOO_LONG; } - if(binary_length <= 1184) { target_bitsize = 1184; } - if(binary_length <= 1016) { target_bitsize = 1016; } - if(binary_length <= 840) { target_bitsize = 840; } - if(binary_length <= 672) { target_bitsize = 672; } - if(binary_length <= 496) { target_bitsize = 496; } - if(binary_length <= 352) { target_bitsize = 352; } - if(binary_length <= 264) { target_bitsize = 264; } - if(binary_length <= 208) { target_bitsize = 208; } - if(binary_length <= 152) { target_bitsize = 152; } - if(binary_length <= 96) { target_bitsize = 96; } - if(binary_length <= 56) { target_bitsize = 56; } - break; - } - } - - if (cc_mode == 3) { - /* CC-C 2D Component is a bit more complex! */ - int byte_length, codewords_used, ecc_level, ecc_codewords, rows; - int codewords_total, target_codewords, target_bytesize; - - byte_length = binary_length / 8; - if(binary_length % 8 != 0) { byte_length++; } - - codewords_used = (byte_length / 6) * 5; - codewords_used += byte_length % 6; - - ecc_level = 7; - if(codewords_used <= 1280) { ecc_level = 6; } - if(codewords_used <= 640) { ecc_level = 5; } - if(codewords_used <= 320) { ecc_level = 4; } - if(codewords_used <= 160) { ecc_level = 3; } - if(codewords_used <= 40) { ecc_level = 2; } - *(ecc) = ecc_level; - ecc_codewords = 1; - for(i = 1; i <= (ecc_level + 1); i++){ - ecc_codewords *= 2; - } - - codewords_used += ecc_codewords; - codewords_used += 3; - - if(codewords_used > symbol->option_3) { - return ERROR_TOO_LONG; - } - /* *(cc_width) = 0.5 + sqrt((codewords_used) / 3); */ - *(cc_width) = (lin_width - 62) / 17; - if((codewords_used / *(cc_width)) > 90) { - /* stop the symbol from becoming too high */ - *(cc_width) = *(cc_width) + 1; - } - - rows = codewords_used / *(cc_width); - if(codewords_used % *(cc_width) != 0) { - rows++; - } - - codewords_total = *(cc_width) * rows; - - target_codewords = codewords_total - ecc_codewords; - target_codewords -= 3; - - target_bytesize = 6 * (target_codewords / 5); - target_bytesize += target_codewords % 5; - - target_bitsize = 8 * target_bytesize; - } - - if(binary_length < target_bitsize) { - /* Now add padding to binary string */ - if (alpha_pad == 1) { - concat(binary_string, "11111"); - alpha_pad = 0; - /* Extra FNC1 character required after Alpha encodation (section 5.2.3) */ - } - - if ((strlen(general_field) != 0) && (general_field_type[strlen(general_field) - 1] == NUMERIC)) { - concat(binary_string, "0000"); - } - - while (strlen(binary_string) < target_bitsize) { - concat(binary_string, "00100"); - } - - if(strlen(binary_string) > target_bitsize) { - binary_string[target_bitsize] = '\0'; - } - } - - return 0; -} - -void add_leading_zeroes(struct zint_symbol *symbol) -{ - int with_addon = 0; - int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h, n = 0; - - h = strlen(symbol->primary); - for(i = 0; i < h; i++) { - if(symbol->primary[i] == '+') { - with_addon = 1; - } else { - if(with_addon == 0) { - first_len++; - } else { - second_len++; - } - } - } - - /* Calculate target lengths */ - if(first_len <= 12) { zfirst_len = 12; } - if(first_len <= 7) { zfirst_len = 7; } - if(second_len <= 5) { zsecond_len = 5; } - if(second_len <= 2) { zsecond_len = 2; } - if(second_len == 0) { zsecond_len = 0; } - - /* Add leading zeroes */ - n = zfirst_len - first_len; - if (n > 0) - { - memmove(symbol->primary + n, symbol->primary, h); - memset(symbol->primary, '0', n); - } - n += first_len + 1; - if (zsecond_len) - { - memmove(symbol->primary + n + zsecond_len, symbol->primary + n, second_len); - memset(symbol->primary + n , '0', zsecond_len); - n += zsecond_len + second_len; - } - symbol->primary[n] = '\0'; -} - -int composite(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int error_number, cc_mode, cc_width, ecc_level; - int j, i, k, separator_row; - unsigned int rs = length + 1; - unsigned int bs = 20 * rs; - unsigned int pri_len; -#ifndef _MSC_VER - char reduced[rs]; - char binary_string[bs]; -#else - char* reduced = (char*)_alloca(rs); - char* binary_string = (char*)_alloca(bs); -#endif - struct zint_symbol *linear; - int top_shift, bottom_shift; - - error_number = 0; - separator_row = 0; - pri_len = strlen(symbol->primary); - if(pri_len == 0) { - strcpy(symbol->errtxt, "No primary (linear) message in 2D composite"); - return ERROR_INVALID_OPTION; - } - - if(length > 2990) { - strcpy(symbol->errtxt, "2D component input data too long"); - return ERROR_TOO_LONG; - } - - linear = ZBarcode_Create(); /* Symbol contains the 2D component and Linear contains the rest */ - - error_number = gs1_verify(symbol, source, length, reduced); - if(error_number != 0) { return error_number; } - - cc_mode = symbol->option_1; - - if((cc_mode == 3) && (symbol->symbology != BARCODE_EAN128_CC)) { - /* CC-C can only be used with a GS1-128 linear part */ - strcpy(symbol->errtxt, "Invalid mode (CC-C only valid with GS1-128 linear component)"); - return ERROR_INVALID_OPTION; - } - - linear->symbology = symbol->symbology; - - if(linear->symbology != BARCODE_EAN128_CC) { - /* Set the "component linkage" flag in the linear component */ - linear->option_1 = 2; - } else { - /* GS1-128 needs to know which type of 2D component is used */ - linear->option_1 = cc_mode; - } - - switch(symbol->symbology) { - case BARCODE_EANX_CC: error_number = eanx(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_EAN128_CC: error_number = ean_128(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS14_CC: error_number = rss14(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS_LTD_CC: error_number = rsslimited(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS_EXP_CC: error_number = rssexpanded(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_UPCA_CC: error_number = eanx(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_UPCE_CC: error_number = eanx(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS14STACK_CC: error_number = rss14(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS14_OMNI_CC: error_number = rss14(linear, (unsigned char *)symbol->primary, pri_len); break; - case BARCODE_RSS_EXPSTACK_CC: error_number = rssexpanded(linear, (unsigned char *)symbol->primary, pri_len); break; - } - - if(error_number != 0) { - strcpy(symbol->errtxt, linear->errtxt); - concat(symbol->errtxt, " in linear component"); - return error_number; - } - - switch(symbol->symbology) { - /* Determine width of 2D component according to ISO/IEC 24723 Table 1 */ - case BARCODE_EANX_CC: - switch(pri_len) { - case 7: /* EAN-8 */ - case 10: /* EAN-8 + 2 */ - case 13: /* EAN-8 + 5 */ - cc_width = 3; - break; - case 12: /* EAN-13 */ - case 15: /* EAN-13 + 2 */ - case 18: /* EAN-13 + 5 */ - cc_width = 4; - break; - } - break; - case BARCODE_EAN128_CC: cc_width = 4; break; - case BARCODE_RSS14_CC: cc_width = 4; break; - case BARCODE_RSS_LTD_CC: cc_width = 3; break; - case BARCODE_RSS_EXP_CC: cc_width = 4; break; - case BARCODE_UPCA_CC: cc_width = 4; break; - case BARCODE_UPCE_CC: cc_width = 2; break; - case BARCODE_RSS14STACK_CC: cc_width = 2; break; - case BARCODE_RSS14_OMNI_CC: cc_width = 2; break; - case BARCODE_RSS_EXPSTACK_CC: cc_width = 4; break; - } - - memset(binary_string, 0, bs); - - if(cc_mode < 1 || cc_mode > 3) { cc_mode = 1; } - - if(cc_mode == 1) { - i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear->width); - if (i == ERROR_TOO_LONG) { - cc_mode = 2; - } - } - - if(cc_mode == 2) { /* If the data didn't fit into CC-A it is recalculated for CC-B */ - i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear->width); - if (i == ERROR_TOO_LONG) { - if(symbol->symbology != BARCODE_EAN128_CC) { - return ERROR_TOO_LONG; - } else { - cc_mode = 3; - } - } - } - - if(cc_mode == 3) { /* If the data didn't fit in CC-B (and linear part is GS1-128) it is recalculated - for CC-C */ - i = cc_binary_string(symbol, reduced, binary_string, cc_mode, &cc_width, &ecc_level, linear->width); - if (i == ERROR_TOO_LONG) { - return ERROR_TOO_LONG; - } - } - - switch(cc_mode) { /* Note that ecc_level is only relevant to CC-C */ - case 1: error_number = cc_a(symbol, binary_string, cc_width); break; - case 2: error_number = cc_b(symbol, binary_string, cc_width); break; - case 3: error_number = cc_c(symbol, binary_string, cc_width, ecc_level); break; - } - - if(error_number != 0) { - return ERROR_ENCODING_PROBLEM; - } - - /* Merge the linear component with the 2D component */ - - top_shift = 0; - bottom_shift = 0; - - switch(symbol->symbology) { - /* Determine horizontal alignment (according to section 12.3) */ - case BARCODE_EANX_CC: - switch(pri_len) { - case 7: /* EAN-8 */ - case 10: /* EAN-8 + 2 */ - case 13: /* EAN-8 + 5 */ - bottom_shift = 13; - break; - case 12: /* EAN-13 */ - case 15: /* EAN-13 + 2 */ - case 18: /* EAN-13 + 5 */ - bottom_shift = 2; - break; - } - break; - case BARCODE_EAN128_CC: if(cc_mode == 3) { - bottom_shift = 7; - } - break; - case BARCODE_RSS14_CC: bottom_shift = 4; break; - case BARCODE_RSS_LTD_CC: bottom_shift = 9; break; - case BARCODE_RSS_EXP_CC: k = 1; - while((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) { - /* while((linear->encoded_data[1][k - 1] != '1') && (linear->encoded_data[1][k] != '0')) { */ - k++; - } - top_shift = k; - break; - case BARCODE_UPCA_CC: bottom_shift = 2; break; - case BARCODE_UPCE_CC: bottom_shift = 2; break; - case BARCODE_RSS14STACK_CC: top_shift = 1; break; - case BARCODE_RSS14_OMNI_CC: top_shift = 1; break; - case BARCODE_RSS_EXPSTACK_CC: k = 1; - while((!(module_is_set(linear, 1, k - 1))) && module_is_set(linear, 1, k)) { - /* while((linear->encoded_data[1][k - 1] != '1') && (linear->encoded_data[1][k] != '0')) { */ - k++; - } - top_shift = k; - break; - } - - if(top_shift != 0) { - /* Move the 2d component of the symbol horizontally */ - for(i = 0; i <= symbol->rows; i++) { - for(j = (symbol->width + top_shift); j >= top_shift; j--) { - if(module_is_set(symbol, i, j - top_shift)) { set_module(symbol, i, j); } else { unset_module(symbol, i, j); } - } - for(j = 0; j < top_shift; j++) { - unset_module(symbol, i, j); - } - } - } - - /* Merge linear and 2D components into one structure */ - for(i = 0; i <= linear->rows; i++) { - symbol->row_height[symbol->rows + i] = linear->row_height[i]; - for(j = 0; j <= linear->width; j++) { - if(module_is_set(linear, i, j)) { set_module(symbol, i + symbol->rows, j + bottom_shift); } else { unset_module(symbol, i + symbol->rows, j + bottom_shift); } - } - } - if((linear->width + bottom_shift) > symbol->width) { - symbol->width = linear->width + bottom_shift; - } - if((symbol->width + top_shift) > symbol->width) { - symbol->width += top_shift; - } - symbol->rows += linear->rows; - ustrcpy(symbol->text, (unsigned char *)linear->text); - - ZBarcode_Delete(linear); - - return error_number; -} diff --git a/3rdparty/zint-2.4.4/backend/composite.h b/3rdparty/zint-2.4.4/backend/composite.h deleted file mode 100644 index 30ace7f..0000000 --- a/3rdparty/zint-2.4.4/backend/composite.h +++ /dev/null @@ -1,62 +0,0 @@ -/* composite.c - Tables for UCC.EAN Composite Symbols */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#define NUMERIC 110 -#define ALPHA 97 -#define ISOIEC 105 -#define INVALID_CHAR 100 -#define ANY_ENC 120 -#define ALPHA_OR_ISO 121 - -/* CC-A component coefficients from ISO/IEC 24728:2006 Annex F */ -static int ccaCoeffs[30] = { - /* k = 4 */ - 522, 568, 723, 809, - - /* k = 5 */ - 427, 919, 460, 155, 566, - - /* k = 6 */ - 861, 285, 19, 803, 17, 766, - - /* k = 7 */ - 76, 925, 537, 597, 784, 691, 437, - - /* k = 8 */ - 237, 308, 436, 284, 646, 653, 428, 379 -}; - -/* rows, error codewords, k-offset of valid CC-A sizes from ISO/IEC 24723:2006 Table 9 */ -static int ccaVariants[51] = { - 5, 6, 7, 8, 9, 10, 12, 4, 5, 6, 7, 8, 3, 4, 5, 6, 7, - 4, 4, 5, 5, 6, 6, 7, 4, 5, 6, 7, 7, 4, 5, 6, 7, 8, - 0, 0, 4, 4, 9, 9, 15, 0, 4, 9, 15, 15, 0, 4, 9, 15, 22 -}; - -/* following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24723:2006 tables 10 and 11 */ -static int aRAPTable[68] = { - 39, 1, 32, 8, 14, 43, 20, 11, 1, 5, 15, 21, 40, 43, 46, 34, 29, - 0, 0, 0, 0, 0, 0, 0, 43, 33, 37, 47, 1, 20, 23, 26, 14, 9, - 19, 33, 12, 40, 46, 23, 52, 23, 13, 17, 27, 33, 52, 3, 6, 46, 41, - 6, 0, 3, 3, 3, 0, 3, 3, 0, 3, 6, 6, 0, 0, 0, 0, 3 -}; - -/* Row Address Patterns are as defined in pdf417.h */ diff --git a/3rdparty/zint-2.4.4/backend/dllversion.c b/3rdparty/zint-2.4.4/backend/dllversion.c deleted file mode 100644 index 0500863..0000000 --- a/3rdparty/zint-2.4.4/backend/dllversion.c +++ /dev/null @@ -1,31 +0,0 @@ -/* Sed: http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/programmersguide/versions.asp */ -#if defined (_WIN32) && (defined(_USRDLL) || defined(DLL_EXPORT) || defined(PIC)) -#include -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -__declspec(dllexport) HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi); - -#ifdef __cplusplus -} -#endif - -HRESULT DllGetVersion (DLLVERSIONINFO2* pdvi) -{ - if (!pdvi || (sizeof(*pdvi) != pdvi->info1.cbSize)) - return (E_INVALIDARG); - - pdvi->info1.dwMajorVersion = 2; - pdvi->info1.dwMinorVersion = 2; - pdvi->info1.dwBuildNumber = 1; - pdvi->info1.dwPlatformID = DLLVER_PLATFORM_WINDOWS; - if (sizeof(DLLVERSIONINFO2) == pdvi->info1.cbSize) - pdvi->ullVersion = MAKEDLLVERULL(2, 2, 1, 0); - - return S_OK; -} -#endif /* _WIN32 */ diff --git a/3rdparty/zint-2.4.4/backend/dmatrix.c b/3rdparty/zint-2.4.4/backend/dmatrix.c deleted file mode 100644 index f98e737..0000000 --- a/3rdparty/zint-2.4.4/backend/dmatrix.c +++ /dev/null @@ -1,910 +0,0 @@ -/* dmatrix.c Handles Data Matrix ECC 200 symbols */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - developed from and including some functions from: - IEC16022 bar code generation - Adrian Kennard, Andrews & Arnold Ltd - with help from Cliff Hones on the RS coding - - (c) 2004 Adrian Kennard, Andrews & Arnold Ltd - (c) 2006 Stefan Schmidt - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "reedsol.h" -#include "common.h" -#include "dmatrix.h" - -// Annex M placement alorithm low level -static void ecc200placementbit(int *array, int NR, int NC, int r, int c, int p, char b) -{ - if (r < 0) { - r += NR; - c += 4 - ((NR + 4) % 8); - } - if (c < 0) { - c += NC; - r += 4 - ((NC + 4) % 8); - } - array[r * NC + c] = (p << 3) + b; -} - -static void ecc200placementblock(int *array, int NR, int NC, int r, - int c, int p) -{ - ecc200placementbit(array, NR, NC, r - 2, c - 2, p, 7); - ecc200placementbit(array, NR, NC, r - 2, c - 1, p, 6); - ecc200placementbit(array, NR, NC, r - 1, c - 2, p, 5); - ecc200placementbit(array, NR, NC, r - 1, c - 1, p, 4); - ecc200placementbit(array, NR, NC, r - 1, c - 0, p, 3); - ecc200placementbit(array, NR, NC, r - 0, c - 2, p, 2); - ecc200placementbit(array, NR, NC, r - 0, c - 1, p, 1); - ecc200placementbit(array, NR, NC, r - 0, c - 0, p, 0); -} - -static void ecc200placementcornerA(int *array, int NR, int NC, int p) -{ - ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); - ecc200placementbit(array, NR, NC, NR - 1, 1, p, 6); - ecc200placementbit(array, NR, NC, NR - 1, 2, p, 5); - ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); - ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); - ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); - ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); - ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); -} - -static void ecc200placementcornerB(int *array, int NR, int NC, int p) -{ - ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); - ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); - ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); - ecc200placementbit(array, NR, NC, 0, NC - 4, p, 4); - ecc200placementbit(array, NR, NC, 0, NC - 3, p, 3); - ecc200placementbit(array, NR, NC, 0, NC - 2, p, 2); - ecc200placementbit(array, NR, NC, 0, NC - 1, p, 1); - ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); -} - -static void ecc200placementcornerC(int *array, int NR, int NC, int p) -{ - ecc200placementbit(array, NR, NC, NR - 3, 0, p, 7); - ecc200placementbit(array, NR, NC, NR - 2, 0, p, 6); - ecc200placementbit(array, NR, NC, NR - 1, 0, p, 5); - ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); - ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); - ecc200placementbit(array, NR, NC, 1, NC - 1, p, 2); - ecc200placementbit(array, NR, NC, 2, NC - 1, p, 1); - ecc200placementbit(array, NR, NC, 3, NC - 1, p, 0); -} - -static void ecc200placementcornerD(int *array, int NR, int NC, int p) -{ - ecc200placementbit(array, NR, NC, NR - 1, 0, p, 7); - ecc200placementbit(array, NR, NC, NR - 1, NC - 1, p, 6); - ecc200placementbit(array, NR, NC, 0, NC - 3, p, 5); - ecc200placementbit(array, NR, NC, 0, NC - 2, p, 4); - ecc200placementbit(array, NR, NC, 0, NC - 1, p, 3); - ecc200placementbit(array, NR, NC, 1, NC - 3, p, 2); - ecc200placementbit(array, NR, NC, 1, NC - 2, p, 1); - ecc200placementbit(array, NR, NC, 1, NC - 1, p, 0); -} - -// Annex M placement alorithm main function -static void ecc200placement(int *array, int NR, int NC) -{ - int r, c, p; - // invalidate - for (r = 0; r < NR; r++) - for (c = 0; c < NC; c++) - array[r * NC + c] = 0; - // start - p = 1; - r = 4; - c = 0; - do { - // check corner - if (r == NR && !c) - ecc200placementcornerA(array, NR, NC, p++); - if (r == NR - 2 && !c && NC % 4) - ecc200placementcornerB(array, NR, NC, p++); - if (r == NR - 2 && !c && (NC % 8) == 4) - ecc200placementcornerC(array, NR, NC, p++); - if (r == NR + 4 && c == 2 && !(NC % 8)) - ecc200placementcornerD(array, NR, NC, p++); - // up/right - do { - if (r < NR && c >= 0 && !array[r * NC + c]) - ecc200placementblock(array, NR, NC, r, c, p++); - r -= 2; - c += 2; - } - while (r >= 0 && c < NC); - r++; - c += 3; - // down/left - do { - if (r >= 0 && c < NC && !array[r * NC + c]) - ecc200placementblock(array, NR, NC, r, c, p++); - r += 2; - c -= 2; - } - while (r < NR && c >= 0); - r += 3; - c++; - } - while (r < NR || c < NC); - // unfilled corner - if (!array[NR * NC - 1]) - array[NR * NC - 1] = array[NR * NC - NC - 2] = 1; -} - -// calculate and append ecc code, and if necessary interleave -static void ecc200(unsigned char *binary, int bytes, int datablock, int rsblock, int skew) -{ - int blocks = (bytes + 2) / datablock, b; - int n, p; - rs_init_gf(0x12d); - rs_init_code(rsblock, 1); - for (b = 0; b < blocks; b++) { - unsigned char buf[256], ecc[256]; - p = 0; - for (n = b; n < bytes; n += blocks) - buf[p++] = binary[n]; - rs_encode(p, buf, ecc); - p = rsblock - 1; // comes back reversed - for (n = b; n < rsblock * blocks; n += blocks) { - if (skew) { - /* Rotate ecc data to make 144x144 size symbols acceptable */ - /* See http://groups.google.com/group/postscriptbarcode/msg/5ae8fda7757477da */ - if(b < 8) { - binary[bytes + n + 2] = ecc[p--]; - } else { - binary[bytes + n - 8] = ecc[p--]; - } - } else { - binary[bytes + n] = ecc[p--]; - } - } - } - rs_free(); -} - -int isx12(unsigned char source) -{ - if(source == 13) { return 1; } - if(source == 42) { return 1; } - if(source == 62) { return 1; } - if(source == 32) { return 1; } - if((source >= '0') && (source <= '9')) { return 1; } - if((source >= 'A') && (source <= 'Z')) { return 1; } - - return 0; -} - -void dminsert(char binary_string[], int posn, char newbit) -{ /* Insert a character into the middle of a string at position posn */ - int i, end; - - end = strlen(binary_string); - for(i = end; i > posn; i--) { - binary_string[i] = binary_string[i - 1]; - } - binary_string[posn] = newbit; -} - -void insert_value(unsigned char binary_stream[], int posn, int streamlen, char newbit) -{ - int i; - - for(i = streamlen; i > posn; i--) { - binary_stream[i] = binary_stream[i - 1]; - } - binary_stream[posn] = newbit; -} - -int look_ahead_test(unsigned char source[], int sourcelen, int position, int current_mode, int gs1) -{ - /* A custom version of the 'look ahead test' from Annex P */ - /* This version is deliberately very reluctant to end a data stream with EDIFACT encoding */ - - float ascii_count, c40_count, text_count, x12_count, edf_count, b256_count, best_count; - int sp, done, best_scheme; - char reduced_char; - - /* step (j) */ - if(current_mode == DM_ASCII) { - ascii_count = 0.0; - c40_count = 1.0; - text_count = 1.0; - x12_count = 1.0; - edf_count = 1.0; - b256_count = 1.25; - } else { - ascii_count = 1.0; - c40_count = 2.0; - text_count = 2.0; - x12_count = 2.0; - edf_count = 2.0; - b256_count = 2.25; - } - - switch(current_mode) { - case DM_C40: c40_count = 0.0; break; - case DM_TEXT: text_count = 0.0; break; - case DM_X12: x12_count = 0.0; break; - case DM_EDIFACT: edf_count = 0.0; break; - case DM_BASE256: b256_count = 0.0; break; - } - - for(sp = position; (sp < sourcelen) && (sp <= (position + 8)); sp++) { - - if(source[sp] <= 127) { reduced_char = source[sp]; } else { reduced_char = source[sp] - 127; } - - if((source[sp] >= '0') && (source[sp] <= '9')) { ascii_count += 0.5; } else { ascii_count += 1.0; } - if(source[sp] > 127) { ascii_count += 1.0; } - - done = 0; - if(reduced_char == ' ') { c40_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= '0') && (reduced_char <= '9')) { c40_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= 'A') && (reduced_char <= 'Z')) { c40_count += (2.0 / 3.0); done = 1; } - if(source[sp] > 127) { c40_count += (4.0 / 3.0); } - if(done == 0) { c40_count += (4.0 / 3.0); } - - done = 0; - if(reduced_char == ' ') { text_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= '0') && (reduced_char <= '9')) { text_count += (2.0 / 3.0); done = 1; } - if((reduced_char >= 'a') && (reduced_char <= 'z')) { text_count += (2.0 / 3.0); done = 1; } - if(source[sp] > 127) { text_count += (4.0 / 3.0); } - if(done == 0) { text_count += (4.0 / 3.0); } - - if(isx12(source[sp])) { x12_count += (2.0 / 3.0); } else { x12_count += 4.0; } - - /* step (p) */ - done = 0; - if((source[sp] >= ' ') && (source[sp] <= '^')) { edf_count += (3.0 / 4.0); } else { edf_count += 6.0; } - if(gs1 && (source[sp] == '[')) { edf_count += 6.0; } - if(sp >= (sourcelen - 5)) { edf_count += 6.0; } /* MMmmm fudge! */ - - /* step (q) */ - if(gs1 && (source[sp] == '[')) { b256_count += 4.0; } else { b256_count += 1.0; } - - /* printf("%c lat a%.2f c%.2f t%.2f x%.2f e%.2f b%.2f\n", source[sp], ascii_count, c40_count, text_count, x12_count, edf_count, b256_count); */ - - } - - best_count = ascii_count; - best_scheme = DM_ASCII; - - if(b256_count <= best_count) { - best_count = b256_count; - best_scheme = DM_BASE256; - } - - if(edf_count <= best_count) { - best_count = edf_count; - best_scheme = DM_EDIFACT; - } - - if(text_count <= best_count) { - best_count = text_count; - best_scheme = DM_TEXT; - } - - if(x12_count <= best_count) { - best_count = x12_count; - best_scheme = DM_X12; - } - - if(c40_count <= best_count) { - best_count = c40_count; - best_scheme = DM_C40; - } - - return best_scheme; -} - -int dm200encode(struct zint_symbol *symbol, unsigned char source[], unsigned char target[], int *last_mode, int length) -{ - /* Encodes data using ASCII, C40, Text, X12, EDIFACT or Base 256 modes as appropriate */ - /* Supports encoding FNC1 in supporting systems */ - - int sp, tp, i, gs1; - int current_mode, next_mode; - int inputlen = length; - int c40_buffer[6], c40_p; - int text_buffer[6], text_p; - int x12_buffer[6], x12_p; - int edifact_buffer[8], edifact_p; - int debug = 0; -#ifndef _MSC_VER - char binary[2 * inputlen]; -#else - char* binary = (char*)_alloca(2 * inputlen); -#endif - - sp = 0; - tp = 0; - memset(c40_buffer, 0, 6); - c40_p = 0; - memset(text_buffer, 0, 6); - text_p = 0; - memset(x12_buffer, 0, 6); - x12_p = 0; - memset(edifact_buffer, 0, 8); - edifact_p = 0; - strcpy(binary, ""); - - /* step (a) */ - current_mode = DM_ASCII; - next_mode = DM_ASCII; - - if(symbol->input_mode == GS1_MODE) { gs1 = 1; } else { gs1 = 0; } - - if(gs1) { - target[tp] = 232; tp++; - concat(binary, " "); - if(debug) printf("FN1 "); - } /* FNC1 */ - - if(symbol->output_options & READER_INIT) { - if(gs1) { - strcpy(symbol->errtxt, "Cannot encode in GS1 mode and Reader Initialisation at the same time"); - return ERROR_INVALID_OPTION; - } else { - target[tp] = 234; tp++; /* Reader Programming */ - concat(binary, " "); - if(debug) printf("RP "); - } - } - - while (sp < inputlen) { - - current_mode = next_mode; - - /* step (b) - ASCII encodation */ - if(current_mode == DM_ASCII) { - next_mode = DM_ASCII; - - if(istwodigits(source, sp) && ((sp + 1) != inputlen)) { - target[tp] = (10 * ctoi(source[sp])) + ctoi(source[sp + 1]) + 130; - if(debug) printf("N%d ", target[tp] - 130); - tp++; concat(binary, " "); - sp += 2; - } else { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - - if(next_mode != DM_ASCII) { - switch(next_mode) { - case DM_C40: target[tp] = 230; tp++; concat(binary, " "); - if(debug) printf("C40 "); break; - case DM_TEXT: target[tp] = 239; tp++; concat(binary, " "); - if(debug) printf("TEX "); break; - case DM_X12: target[tp] = 238; tp++; concat(binary, " "); - if(debug) printf("X12 "); break; - case DM_EDIFACT: target[tp] = 240; tp++; concat(binary, " "); - if(debug) printf("EDI "); break; - case DM_BASE256: target[tp] = 231; tp++; concat(binary, " "); - if(debug) printf("BAS "); break; - } - } else { - if(source[sp] > 127) { - target[tp] = 235; /* FNC4 */ - if(debug) printf("FN4 "); - tp++; - target[tp] = (source[sp] - 128) + 1; - if(debug) printf("A%02X ", target[tp] - 1); - tp++; concat(binary, " "); - } else { - if(gs1 && (source[sp] == '[')) { - target[tp] = 232; /* FNC1 */ - if(debug) printf("FN1 "); - } else { - target[tp] = source[sp] + 1; - if(debug) printf("A%02X ", target[tp] - 1); - } - tp++; - concat(binary, " "); - } - sp++; - } - } - - } - - /* step (c) C40 encodation */ - if(current_mode == DM_C40) { - int shift_set, value; - - next_mode = DM_C40; - if(c40_p == 0) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - } - - if(next_mode != DM_C40) { - target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */ - next_mode = DM_ASCII; - if (debug) printf("ASC "); - } else { - if(source[sp] > 127) { - c40_buffer[c40_p] = 1; c40_p++; - c40_buffer[c40_p] = 30; c40_p++; /* Upper Shift */ - shift_set = c40_shift[source[sp] - 128]; - value = c40_value[source[sp] - 128]; - } else { - shift_set = c40_shift[source[sp]]; - value = c40_value[source[sp]]; - } - - if(gs1 && (source[sp] == '[')) { - shift_set = 2; - value = 27; /* FNC1 */ - } - - if(shift_set != 0) { - c40_buffer[c40_p] = shift_set - 1; c40_p++; - } - c40_buffer[c40_p] = value; c40_p++; - - if(c40_p >= 3) { - int iv; - - iv = (1600 * c40_buffer[0]) + (40 * c40_buffer[1]) + (c40_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - concat(binary, " "); - if (debug) printf("[%d %d %d] ", c40_buffer[0], c40_buffer[1], c40_buffer[2]); - - c40_buffer[0] = c40_buffer[3]; - c40_buffer[1] = c40_buffer[4]; - c40_buffer[2] = c40_buffer[5]; - c40_buffer[3] = 0; - c40_buffer[4] = 0; - c40_buffer[5] = 0; - c40_p -= 3; - } - sp++; - } - } - - /* step (d) Text encodation */ - if(current_mode == DM_TEXT) { - int shift_set, value; - - next_mode = DM_TEXT; - if(text_p == 0) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - } - - if(next_mode != DM_TEXT) { - target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */ - next_mode = DM_ASCII; - if (debug) printf("ASC "); - } else { - if(source[sp] > 127) { - text_buffer[text_p] = 1; text_p++; - text_buffer[text_p] = 30; text_p++; /* Upper Shift */ - shift_set = text_shift[source[sp] - 128]; - value = text_value[source[sp] - 128]; - } else { - shift_set = text_shift[source[sp]]; - value = text_value[source[sp]]; - } - - if(gs1 && (source[sp] == '[')) { - shift_set = 2; - value = 27; /* FNC1 */ - } - - if(shift_set != 0) { - text_buffer[text_p] = shift_set - 1; text_p++; - } - text_buffer[text_p] = value; text_p++; - - if(text_p >= 3) { - int iv; - - iv = (1600 * text_buffer[0]) + (40 * text_buffer[1]) + (text_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - concat(binary, " "); - if (debug) printf("[%d %d %d] ", text_buffer[0], text_buffer[1], text_buffer[2]); - - text_buffer[0] = text_buffer[3]; - text_buffer[1] = text_buffer[4]; - text_buffer[2] = text_buffer[5]; - text_buffer[3] = 0; - text_buffer[4] = 0; - text_buffer[5] = 0; - text_p -= 3; - } - sp++; - } - } - - /* step (e) X12 encodation */ - if(current_mode == DM_X12) { - int value = 0; - - next_mode = DM_X12; - if(text_p == 0) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - } - - if(next_mode != DM_X12) { - target[tp] = 254; tp++; concat(binary, " ");/* Unlatch */ - next_mode = DM_ASCII; - if (debug) printf("ASC "); - } else { - if(source[sp] == 13) { value = 0; } - if(source[sp] == '*') { value = 1; } - if(source[sp] == '>') { value = 2; } - if(source[sp] == ' ') { value = 3; } - if((source[sp] >= '0') && (source[sp] <= '9')) { value = (source[sp] - '0') + 4; } - if((source[sp] >= 'A') && (source[sp] <= 'Z')) { value = (source[sp] - 'A') + 14; } - - x12_buffer[x12_p] = value; x12_p++; - - if(x12_p >= 3) { - int iv; - - iv = (1600 * x12_buffer[0]) + (40 * x12_buffer[1]) + (x12_buffer[2]) + 1; - target[tp] = iv / 256; tp++; - target[tp] = iv % 256; tp++; - concat(binary, " "); - if (debug) printf("[%d %d %d] ", x12_buffer[0], x12_buffer[1], x12_buffer[2]); - - x12_buffer[0] = x12_buffer[3]; - x12_buffer[1] = x12_buffer[4]; - x12_buffer[2] = x12_buffer[5]; - x12_buffer[3] = 0; - x12_buffer[4] = 0; - x12_buffer[5] = 0; - x12_p -= 3; - } - sp++; - } - } - - /* step (f) EDIFACT encodation */ - if(current_mode == DM_EDIFACT) { - int value = 0; - - next_mode = DM_EDIFACT; - if(edifact_p == 3) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - } - - if(next_mode != DM_EDIFACT) { - edifact_buffer[edifact_p] = 31; edifact_p++; - next_mode = DM_ASCII; - } else { - if((source[sp] >= '@') && (source[sp] <= '^')) { value = source[sp] - '@'; } - if((source[sp] >= ' ') && (source[sp] <= '?')) { value = source[sp]; } - - edifact_buffer[edifact_p] = value; edifact_p++; - sp++; - } - - if(edifact_p >= 4) { - target[tp] = (edifact_buffer[0] << 2) + ((edifact_buffer[1] & 0x30) >> 4); tp++; - target[tp] = ((edifact_buffer[1] & 0x0f) << 4) + ((edifact_buffer[2] & 0x3c) >> 2); tp++; - target[tp] = ((edifact_buffer[2] & 0x03) << 6) + edifact_buffer[3]; tp++; - concat(binary, " "); - if (debug) printf("[%d %d %d %d] ", edifact_buffer[0], edifact_buffer[1], edifact_buffer[2], edifact_buffer[3]); - - edifact_buffer[0] = edifact_buffer[4]; - edifact_buffer[1] = edifact_buffer[5]; - edifact_buffer[2] = edifact_buffer[6]; - edifact_buffer[3] = edifact_buffer[7]; - edifact_buffer[4] = 0; - edifact_buffer[5] = 0; - edifact_buffer[6] = 0; - edifact_buffer[7] = 0; - edifact_p -= 4; - } - } - - /* step (g) Base 256 encodation */ - if(current_mode == DM_BASE256) { - next_mode = look_ahead_test(source, inputlen, sp, current_mode, gs1); - - if(next_mode == DM_BASE256) { - target[tp] = source[sp]; - if(debug) printf("B%02X ", target[tp]); - tp++; - sp++; - concat(binary, "b"); - } else { - next_mode = DM_ASCII; - if(debug) printf("ASC "); - } - } - - if(tp > 1558) { - return 0; - } - - } /* while */ - - /* Empty buffers */ - if(c40_p == 2) { - target[tp] = 254; tp++; /* unlatch */ - target[tp] = source[inputlen - 2] + 1; tp++; - target[tp] = source[inputlen - 1] + 1; tp++; - concat(binary, " "); - if(debug) printf("ASC A%02X A%02X ", target[tp - 2] - 1, target[tp - 1] - 1); - current_mode = DM_ASCII; - } - if(c40_p == 1) { - target[tp] = 254; tp++; /* unlatch */ - target[tp] = source[inputlen - 1] + 1; tp++; - concat(binary, " "); - if(debug) printf("ASC A%02X ", target[tp - 1] - 1); - current_mode = DM_ASCII; - } - - if(text_p == 2) { - target[tp] = 254; tp++; /* unlatch */ - target[tp] = source[inputlen - 2] + 1; tp++; - target[tp] = source[inputlen - 1] + 1; tp++; - concat(binary, " "); - if(debug) printf("ASC A%02X A%02X ", target[tp - 2] - 1, target[tp - 1] - 1); - current_mode = DM_ASCII; - } - if(text_p == 1) { - target[tp] = 254; tp++; /* unlatch */ - target[tp] = source[inputlen - 1] + 1; tp++; - concat(binary, " "); - if(debug) printf("ASC A%02X ", target[tp - 1] - 1); - current_mode = DM_ASCII; - } - - if(x12_p == 2) { - target[tp] = 254; tp++; /* unlatch */ - target[tp] = source[inputlen - 2] + 1; tp++; - target[tp] = source[inputlen - 1] + 1; tp++; - concat(binary, " "); - if(debug) printf("ASC A%02X A%02X ", target[tp - 2] - 1, target[tp - 1] - 1); - current_mode = DM_ASCII; - } - if(x12_p == 1) { - target[tp] = 254; tp++; /* unlatch */ - target[tp] = source[inputlen - 1] + 1; tp++; - concat(binary, " "); - if(debug) printf("ASC A%02X ", target[tp - 1] - 1); - current_mode = DM_ASCII; - } - - /* Add length and randomising algorithm to b256 */ - i = 0; - while (i < tp) { - if(binary[i] == 'b') { - if((i == 0) || ((i != 0) && (binary[i - 1] != 'b'))) { - /* start of binary data */ - int binary_count; /* length of b256 data */ - - for(binary_count = 0; binary[binary_count + i] == 'b'; binary_count++); - - if(binary_count <= 249) { - dminsert(binary, i, 'b'); - insert_value(target, i, tp, binary_count); tp++; - } else { - dminsert(binary, i, 'b'); - dminsert(binary, i + 1, 'b'); - insert_value(target, i, tp, (binary_count / 250) + 249); tp++; - insert_value(target, i + 1, tp, binary_count % 250); tp++; - } - } - } - i++; - } - - for(i = 0; i < tp; i++) { - if(binary[i] == 'b') { - int prn, temp; - - prn = ((149 * (i + 1)) % 255) + 1; - temp = target[i] + prn; - if (temp <= 255) { target[i] = temp; } else { target[i] = temp - 256; } - } - } - - if(debug) { - printf("\n\n"); - for(i = 0; i < tp; i++){ - printf("%02X ", target[i]); - } - printf("\n"); - } - - *(last_mode) = current_mode; - return tp; -} - -void add_tail(unsigned char target[], int tp, int tail_length, int last_mode) -{ - /* adds unlatch and pad bits */ - int i, prn, temp; - - switch(last_mode) { - case DM_C40: - case DM_TEXT: - case DM_X12: - target[tp] = 254; tp++; /* Unlatch */ - tail_length--; - } - - for(i = tail_length; i > 0; i--) { - if(i == tail_length) { - target[tp] = 129; tp++; /* Pad */ - } else { - prn = ((149 * (tp + 1)) % 253) + 1; - temp = 129 + prn; - if(temp <= 254) { - target[tp] = temp; tp++; - } else { - target[tp] = temp - 254; tp++; - } - } - } -} - -int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int inputlen, i, skew = 0; - unsigned char binary[2200]; - int binlen; - int symbolsize, optionsize, calcsize; - int taillength, error_number = 0; - int H, W, FH, FW, datablock, bytes, rsblock; - int last_mode; - unsigned char *grid = 0; - inputlen = length; - - binlen = dm200encode(symbol, source, binary, &last_mode, length); - - if(binlen == 0) { - strcpy(symbol->errtxt, "Data too long to fit in symbol"); - return ERROR_TOO_LONG; - } - - if((symbol->option_2 >= 1) && (symbol->option_2 <= 30)) { - optionsize = intsymbol[symbol->option_2 - 1]; - } else { - optionsize = -1; - } - - calcsize = 29; - for(i = 29; i > -1; i--) { - if(matrixbytes[i] >= binlen) { - calcsize = i; - } - } - - if(symbol->option_3 == DM_SQUARE) { - /* Force to use square symbol */ - switch(calcsize) { - case 2: - case 4: - case 6: - case 9: - case 11: - case 14: - calcsize++; - } - } - - symbolsize = optionsize; - if(calcsize > optionsize) { - symbolsize = calcsize; - if(optionsize != -1) { - /* flag an error */ - error_number = WARN_INVALID_OPTION; - strcpy(symbol->errtxt, "Data does not fit in selected symbol size"); - } - } - - H = matrixH[symbolsize]; - W = matrixW[symbolsize]; - FH = matrixFH[symbolsize]; - FW = matrixFW[symbolsize]; - bytes = matrixbytes[symbolsize]; - datablock = matrixdatablock[symbolsize]; - rsblock = matrixrsblock[symbolsize]; - - taillength = bytes - binlen; - - if(taillength != 0) { - add_tail(binary, binlen, taillength, last_mode); - } - - // ecc code - if(symbolsize == 29) { skew = 1; } - ecc200(binary, bytes, datablock, rsblock, skew); - { // placement - int x, y, NC, NR, *places; - NC = W - 2 * (W / FW); - NR = H - 2 * (H / FH); - places = (int*)malloc(NC * NR * sizeof(int)); - ecc200placement(places, NR, NC); - grid = (unsigned char*)malloc(W * H); - memset(grid, 0, W * H); - for (y = 0; y < H; y += FH) { - for (x = 0; x < W; x++) - grid[y * W + x] = 1; - for (x = 0; x < W; x += 2) - grid[(y + FH - 1) * W + x] = 1; - } - for (x = 0; x < W; x += FW) { - for (y = 0; y < H; y++) - grid[y * W + x] = 1; - for (y = 0; y < H; y += 2) - grid[y * W + x + FW - 1] = 1; - } - for (y = 0; y < NR; y++) { - for (x = 0; x < NC; x++) { - int v = places[(NR - y - 1) * NC + x]; - //fprintf (stderr, "%4d", v); - if (v == 1 || (v > 7 && (binary[(v >> 3) - 1] & (1 << (v & 7))))) - grid[(1 + y + 2 * (y / (FH - 2))) * W + 1 + x + 2 * (x / (FW - 2))] = 1; - } - //fprintf (stderr, "\n"); - } - for(y = H - 1; y >= 0; y--) { - int x; - for(x = 0; x < W; x++) { - if(grid[W * y + x]) { - set_module(symbol, (H - y) - 1, x); - } - } - symbol->row_height[(H - y) - 1] = 1; - } - free(grid); - free(places); - } - - symbol->rows = H; - symbol->width = W; - - return error_number; -} - -int dmatrix(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int error_number; - - if(symbol->option_1 <= 1) { - /* ECC 200 */ - error_number = data_matrix_200(symbol, source, length); - } else { - /* ECC 000 - 140 */ - strcpy(symbol->errtxt, "Older Data Matrix standards are no longer supported"); - error_number = ERROR_INVALID_OPTION; - } - - return error_number; -} diff --git a/3rdparty/zint-2.4.4/backend/dmatrix.h b/3rdparty/zint-2.4.4/backend/dmatrix.h deleted file mode 100644 index 79d1143..0000000 --- a/3rdparty/zint-2.4.4/backend/dmatrix.h +++ /dev/null @@ -1,101 +0,0 @@ -/* dmatrix.h - Handles Data Matrix ECC 200 */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "common.h" - -#ifndef __IEC16022ECC200_H -#define __IEC16022ECC200_H -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -extern int data_matrix_200(struct zint_symbol *symbol, unsigned char source[], int length); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#define MAXBARCODE 3116 - -#define DM_ASCII 1 -#define DM_C40 2 -#define DM_TEXT 3 -#define DM_X12 4 -#define DM_EDIFACT 5 -#define DM_BASE256 6 - -static int c40_shift[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }; - -static int c40_value[] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,4,5,6,7,8,9,10,11,12,13, - 15,16,17,18,19,20,21,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39, - 22,23,24,25,26,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 }; - -static int text_shift[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 2, 2, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3 }; - -static int text_value[] = { - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31, - 3,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,4,5,6,7,8,9,10,11,12,13, - 15,16,17,18,19,20,21,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26, - 22,23,24,25,26,0,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,27,28,29,30,31 }; - -static int intsymbol[] = { - 0,1,3,5,7,8,10,12,13,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,2,4,6,9,11,14 }; - -static int matrixH[] = { - 10, 12, 8, 14, 8, 16, 12, 18, 20, 12, 22, 16, 24, 26, 16, 32, 36, 40, 44, 48, - 52, 64, 72, 80, 88, 96, 104, 120, 132, 144 }; - -static int matrixW[] = { - 10, 12, 18, 14, 32, 16, 26, 18, 20, 36, 22, 36, 24, 26, 48, 32, 36, 40, 44, - 48, 52, 64, 72, 80, 88, 96, 104, 120, 132, 144 }; - -static int matrixFH[] = { - 10, 12, 8, 14, 8, 16, 12, 18, 20, 12, 22, 16, 24, 26, 16, 16, 18, 20, 22, 24, - 26, 16, 18, 20, 22, 24, 26, 20, 22, 24 }; - -static int matrixFW[] = { - 10, 12, 18, 14, 16, 16, 26, 18, 20, 18, 22, 18, 24, 26, 24, 16, 18, 20, 22, - 24, 26, 16, 18, 20, 22, 24, 26, 20, 22, 24 }; - -static int matrixbytes[] = { - 3, 5, 5, 8, 10, 12, 16, 18, 22, 22, 30, 32, 36, 44, 49, 62, 86, 114, 144, - 174, 204, 280, 368, 456, 576, 696, 816, 1050, 1304, 1558 }; - -static int matrixdatablock[] = { - 3, 5, 5, 8, 10, 12, 16, 18, 22, 22, 30, 32, 36, 44, 49, 62, 86, 114, 144, - 174, 102, 140, 92, 114, 144, 174, 136, 175, 163, 156 }; - -static int matrixrsblock[] = { - 5, 7, 7, 10, 11, 12, 14, 14, 18, 18, 20, 24, 24, 28, 28, 36, 42, 48, 56, 68, - 42, 56, 36, 48, 56, 68, 56, 68, 62, 62 }; - -#endif /* __IEC16022ECC200_H */ diff --git a/3rdparty/zint-2.4.4/backend/font.h b/3rdparty/zint-2.4.4/backend/font.h deleted file mode 100644 index 2c32b5e..0000000 --- a/3rdparty/zint-2.4.4/backend/font.h +++ /dev/null @@ -1,1691 +0,0 @@ -/* font.h - Font for PNG images */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* This file contains the pixel-by-pixel representation of the "Misc Fixed" font - at 10 point size processed by the Gimp */ - -static int ascii_font[9310] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0, - 0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1, - 0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0, - 1,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0, - 0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,1, - 1,1,1,0,0,0,0,0,1,0,0,1,1,1,1,1, - 1,0,0,0,1,1,1,0,0,1,1,1,1,1,1,0, - 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0, - 0,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1, - 1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1, - 1,0,1,1,1,1,1,1,0,0,1,1,1,1,0,0, - 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,0, - 0,1,1,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1, - 0,0,1,1,1,1,0,0,1,1,1,1,1,0,0,0, - 1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1, - 1,1,0,0,1,1,1,1,1,1,1,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,0,0,1,0,0,1,0,0,0,1,0,1,1, - 1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,1, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,0, - 1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0, - 0,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,1,0,0,1,0,0,0,1,0,0, - 1,0,0,1,0,0,1,0,0,0,1,0,0,1,0,0, - 0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0, - 0,0,0,1,1,0,0,1,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,1, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1, - 0,1,0,0,1,0,0,1,0,1,0,1,0,0,1,1, - 0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0, - 1,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,1,0,1,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,1,0,0,0,0,1,0,1,0,0,1,1,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0, - 0,0,0,1,1,0,0,1,1,0,1,1,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1, - 1,1,1,0,1,0,0,1,0,1,0,0,1,1,1,0, - 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1, - 0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 1,0,0,0,0,0,1,0,1,0,0,1,1,1,1,1, - 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0, - 1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,1, - 0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,0, - 0,0,0,0,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,0,0,1,0,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1, - 0,0,0,0,1,0,0,0,0,0,1,1,1,0,1,0, - 1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0, - 0,0,1,1,0,1,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,1,1,0,1,0,0,1,0,1,1,1,0, - 0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0, - 1,1,1,0,1,0,1,0,1,1,1,0,0,0,1,1, - 1,1,0,0,1,1,1,1,1,0,0,1,0,0,0,0, - 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,1, - 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1, - 1,1,0,0,0,1,0,0,1,0,0,1,0,0,0,0, - 1,0,1,0,1,1,1,0,0,0,0,0,1,0,0,0, - 0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, - 0,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1, - 0,0,0,0,1,0,1,1,1,1,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,0, - 0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0, - 1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0, - 0,0,0,1,0,1,1,0,1,0,1,0,1,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,1, - 0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0, - 0,0,1,1,0,0,0,0,0,1,0,1,0,0,0,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0, - 1,0,1,1,1,1,1,0,0,1,0,0,0,1,0,0, - 1,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,1,0,0,0,1, - 0,1,0,0,0,0,1,0,1,1,0,0,0,1,0,1, - 0,0,0,1,1,0,1,1,0,0,0,1,0,1,0,0, - 0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0, - 0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,1,1,1,1,1,0,0,0,0,0, - 0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0, - 1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0, - 0,1,0,0,1,0,0,0,1,1,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1, - 1,1,1,1,1,0,1,0,0,0,1,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,1,1,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,1,0,1, - 0,1,0,0,0,0,1,0,1,1,1,1,1,0,0,1, - 0,0,0,0,1,0,1,1,1,1,1,0,0,0,0,0, - 1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0, - 0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,0,1,0, - 0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,0,1,0,0,1,0,1,0,1,0, - 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1, - 1,1,1,0,0,0,0,1,0,1,0,0,0,1,1,1, - 0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,0, - 0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1, - 1,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,1,0,0,1,0,0,0,1,0,1,0,1,0, - 0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1, - 1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0, - 0,0,1,1,0,0,0,1,0,0,0,0,1,0,0,0, - 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,1,0,0,1,0,1,0,0,1,1,0,0, - 1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1, - 0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,1,1,1,1,1,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0, - 0,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,0,1,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1, - 0,0,1,0,1,0,1,0,0,0,1,0,0,1,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,0, - 0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0, - 0,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0, - 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,1,0,0,1,0,1,0,1,0,1,0,0, - 1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0, - 1,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0, - 0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,1,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0, - 0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0, - 0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,1, - 0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 1,0,0,0,1,1,0,0,0,0,1,0,1,0,1,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,1,0,1,1,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0, - 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,1,0,0,0,1,0,1, - 0,0,0,1,1,0,1,0,0,0,0,0,0,1,0,0, - 0,0,1,0,0,0,1,0,0,1,0,1,0,0,0,1, - 1,0,0,0,0,1,0,0,0,0,1,0,1,0,1,0, - 1,0,0,0,0,1,0,0,1,1,1,0,1,0,0,1, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,1,0,0,0,1,1,1,1,0,0,1,0,0,1,1, - 0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0, - 0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0, - 1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1, - 1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0, - 0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0, - 0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,1,1,1,0,1, - 0,0,0,0,1,0,1,1,1,1,0,0,0,0,1,1, - 1,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1, - 1,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0, - 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1, - 1,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1, - 1,1,0,1,0,0,0,0,1,0,1,0,0,0,0,1, - 0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,0, - 1,1,1,1,0,0,1,0,0,0,0,1,0,0,1,1, - 1,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1, - 0,0,0,0,1,1,0,0,0,0,0,1,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1, - 1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,1,0,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,0,1,0,0,1,1,1,1, - 0,0,0,0,1,0,0,0,0,1,0,1,1,1,0,0, - 1,0,0,0,0,1,0,0,1,1,1,1,1,0,0,1, - 0,0,0,1,0,1,0,0,0,0,1,0,0,1,1,1, - 1,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1, - 0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,0, - 1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1, - 1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0, - 1,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,1, - 1,1,1,1,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0, - 0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0, - 0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1, - 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0 -}; - -static int ascii_ext_font[9310] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0, - 1,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0, - 0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0, - 1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0, - 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0, - 1,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1, - 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0, - 1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0, - 0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,1, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,1,1,1,1,1,0,0,1,0,0,1,0,0,0, - 0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0, - 1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1, - 0,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,1,0,0,0,0,1,1,0,0,0,0,1,1, - 0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0, - 1,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1, - 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0, - 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1, - 0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0, - 0,1,0,1,1,0,0,0,1,0,0,0,1,0,0,1, - 0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0, - 0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1, - 1,0,0,0,0,0,1,1,0,0,0,0,0,1,1,0, - 0,0,0,1,0,1,0,0,0,1,0,0,0,0,1,0, - 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1, - 1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1, - 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1, - 0,0,1,1,1,1,1,0,0,1,0,0,0,1,0,1, - 1,0,0,0,1,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, - 1,0,0,0,1,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0, - 0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0, - 1,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,1, - 0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,1,0,0,1,0,0,1,0,0,1,1, - 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0, - 1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,1,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0, - 0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0, - 1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, - 0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0, - 1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1, - 0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,1,0,0,0,1,0,1,1,1,1,1,0, - 0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1, - 0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0, - 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,1, - 0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 1,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0, - 1,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1, - 0,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0, - 1,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0, - 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1, - 1,1,1,0,0,0,1,1,1,1,0,0,0,0,1,1, - 0,0,0,0,0,1,1,0,0,0,0,0,1,1,0,0, - 0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,1, - 0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0, - 0,1,1,1,1,0,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,1,0,0,0,0,1,0,1,0,1,1,1,0, - 0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1, - 0,0,0,0,0,1,0,0,1,0,0,0,1,1,1,1, - 1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0, - 1,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,1,1,0,1,0,0, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,1,1,1,1,1,0,1,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,1,1,1,1,0,0,1,1, - 0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1, - 0,0,1,1,1,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,1,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,1,0,0,0,0,1,0,1,1,0,0,0,1, - 0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,1, - 1,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0, - 0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0, - 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1, - 1,1,1,0,0,0,0,1,0,1,0,0,0,0,1,0, - 0,1,0,0,0,1,0,1,0,0,0,0,1,0,0,1, - 0,0,0,1,0,0,0,0,1,1,1,1,1,1,0,1, - 1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1, - 1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, - 1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1, - 1,1,1,0,0,1,1,1,1,1,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1, - 0,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0, - 0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0, - 1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1, - 1,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0, - 1,0,0,1,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,1,0,0,0,1,0,1,0,0,0,0,1, - 0,0,1,0,0,0,1,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0, - 0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1, - 1,1,1,1,0,1,0,1,0,0,0,0,0,1,1,1, - 1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0, - 1,1,0,0,0,1,1,0,1,0,0,1,0,0,1,1, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,1, - 0,0,1,0,0,0,1,0,0,1,1,0,0,1,0,0, - 1,1,0,0,1,0,0,1,1,0,0,1,0,0,1,1, - 0,0,1,0,0,1,1,0,0,1,0,0,1,1,0,0, - 1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0, - 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1, - 1,1,1,1,0,1,1,1,1,1,1,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1, - 0,0,1,0,0,1,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0, - 0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,1, - 0,1,0,0,1,0,0,0,1,0,0,1,0,1,0,1, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1, - 0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,0,1,0,0,0,1,1,1,1,1,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,1,1,1,1,1,1,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1, - 0,0,0,1,0,1,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,1,0,0,1,1, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1, - 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,1, - 1,1,0,1,0,0,0,1,0,0,1,0,0,1,1,1, - 0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,1,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,1,0,0,0,1,0, - 1,1,0,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0, - 0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,1,1,0,1, - 0,0,0,1,1,0,1,0,0,0,1,1,0,1,0,0, - 0,1,1,0,1,0,0,0,1,1,0,1,0,0,0,1, - 1,0,1,0,0,1,0,0,1,1,0,0,0,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0, - 0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0, - 1,1,0,0,0,1,0,1,0,0,0,1,1,0,1,0, - 0,0,1,1,0,1,0,0,0,1,1,0,1,0,0,0, - 1,1,0,0,0,1,1,1,0,0,1,1,0,0,0,1, - 0,0,0,1,1,1,0,0,0, - 0,0,1,0,0,0,0,1,1,1,1,0,0,0,0,1, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0, - 0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0, - 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0, - 0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, - 1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,1,0,1,0,0,1,1,1,0,0,0,0,0,0,1, - 0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,1, - 0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0, - 0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0, - 1,0,1,0,0,1,1,1,0,0,1,1,1,1,0,0, - 1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1, - 1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1, - 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1, - 0,0,1,1,1,1,1,0,0,1,1,1,1,0,0,1, - 0,0,0,1,1,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,1,0,0,0,0,0,1, - 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1, - 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1, - 1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0, - 0,1,1,1,1,1,0,0,0,1,1,1,0,1,0,0, - 1,1,1,0,1,0,0,1,1,1,0,1,0,0,1,1, - 1,0,1,0,0,1,1,1,0,1,0,0,1,1,1,0, - 1,0,0,1,1,1,1,1,0,0,1,1,1,1,0,0, - 0,1,1,1,1,0,0,0,1,1,1,1,0,0,0,1, - 1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1, - 1,1,0,0,1,1,1,1,1,0,0,1,1,1,1,1, - 0,0,1,1,1,1,1,0,0,0,1,1,1,0,0,1, - 0,0,0,0,1,0,0,1,1,1,1,0,0,0,1,1, - 1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1, - 0,0,0,1,1,1,1,0,0,0,0,1,1,0,0,0, - 0,1,1,1,1,0,0,0,1,1,1,0,1,0,0,1, - 1,1,0,1,0,0,1,1,1,0,1,0,0,1,1,1, - 0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0, - 0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 0,1,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0, - 0,0,1,1,0,0,0,0,0 -}; - -static int small_font[] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,0,1,0,0,0,1,1,0,0,1,1,1,1,0,0, - 0,1,0,0,1,1,1,1,0,0,1,1,0,0,1,1, - 1,1,0,0,1,1,0,0,0,1,1,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0, - 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,1, - 1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,1, - 1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0, - 1,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1, - 0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0, - 0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0, - 1,1,1,0,1,0,0,1,0,1,0,0,1,0,1,0, - 0,1,0,1,0,0,1,0,0,1,0,1,0,1,1,1, - 1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1, - 0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 1,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0, - 0,0,1,0,1,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0, - 1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0, - 1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0, - 1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0, - 0,1,1,0,0,1,0,0,1,0,0,0,0,1,0,0, - 1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0, - 0,1,0,1,0,0,1,0,1,0,0,1,0,0,1,1, - 0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,0,0,1,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 1,0,1,0,1,0,0,1,0,0,0,0,1,1,1,1, - 0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0, - 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0, - 0,1,0,1,0,0,1,0,0,1,0,1,0,0,0,0, - 1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1, - 0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,1,0,1,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,0,1,0,1,1,1,1,1,1, - 0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0, - 1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0, - 0,0,1,0,0,0,0,0,1,0,0,1,1,0,0,1, - 0,1,0,0,1,1,1,0,0,1,1,1,0,0,0,0, - 1,0,0,0,1,1,0,0,1,0,0,1,0,0,1,1, - 0,0,0,1,1,0,0,0,0,1,0,0,1,1,1,1, - 0,0,0,1,0,0,0,0,0,1,0,1,0,1,1,0, - 1,0,0,1,0,1,1,1,0,0,1,0,0,0,0,1, - 0,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0, - 0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0, - 1,0,1,1,0,0,0,1,0,0,0,0,1,1,1,1, - 0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0, - 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,0, - 0,1,0,0,1,1,0,0,0,1,0,1,0,0,0,1, - 0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,1,1,0,1,1,1,0,0,0,1,1,0,0,0, - 1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,1, - 1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,0, - 1,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0, - 0,1,1,1,0,0,0,1,1,0,0,1,1,1,0,0, - 0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,1, - 1,1,0,0,1,0,0,1,0,0,1,0,1,0,1,0, - 0,1,0,1,0,0,1,0,1,0,0,1,0,1,1,1, - 1,0,0,1,1,0,0,0,0,1,0,0,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0, - 1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,1, - 1,0,1,1,1,1,1,0,0,0,0,0,1,1,1,1, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0, - 0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,1, - 1,1,1,0,0,0,0,1,0,1,0,0,1,0,0,0, - 1,0,0,1,0,0,1,0,0,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,1,0,0,1,0,1,1,0, - 1,1,1,1,0,1,0,0,1,0,1,0,0,0,0,1, - 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0, - 1,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 1,0,1,1,0,0,0,1,0,0,0,0,1,0,0,1, - 0,1,0,1,1,0,1,0,0,1,0,1,1,1,0,0, - 1,0,0,1,0,1,1,1,0,0,0,0,1,0,0,0, - 0,1,0,0,1,0,0,1,0,1,0,0,1,0,1,1, - 1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0, - 0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, - 0,0,1,0,1,0,1,1,0,1,1,1,0,0,1,0, - 0,1,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 1,0,1,1,0,0,0,0,0,1,0,0,1,1,1,1, - 0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,1,0,0,0,0, - 1,0,0,0,1,0,0,1,0,0,1,0,1,0,1,0, - 0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,1, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0, - 0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0, - 0,0,1,1,0,0,1,0,0,0,0,0,1,0,1,0, - 0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0, - 0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1, - 0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,1, - 0,0,0,1,1,0,0,0,0,1,0,0,1,1,1,1, - 0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0, - 1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,1, - 0,1,0,1,1,0,1,0,0,1,0,1,0,0,0,0, - 1,1,0,1,0,1,0,1,0,0,1,0,0,1,0,0, - 0,1,0,0,1,0,0,1,0,0,1,1,0,0,1,1, - 1,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,1,1,0,1,0,0,1,0,1,0,0,0,0,1, - 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,1, - 1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 1,0,1,0,1,0,0,0,0,1,0,0,1,0,0,1, - 0,1,0,0,1,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,0,0,0,0,1,1,0,0, - 1,0,0,0,1,0,0,1,0,0,1,0,1,0,1,1, - 1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,0, - 0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0, - 1,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0, - 1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0, - 0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,1,1,0,1,1,1,1,0,0,1,1,0,0,0, - 0,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1, - 0,0,0,0,1,1,0,0,0,1,1,0,0,0,1,1, - 0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,0,1,1,0,0, - 1,0,0,1,0,1,1,1,0,0,0,1,1,0,0,1, - 1,1,0,0,1,1,1,1,0,1,0,0,0,0,0,1, - 1,1,0,1,0,0,1,0,0,1,1,1,0,0,1,1, - 0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1, - 0,1,0,0,1,0,0,1,1,0,0,1,0,0,0,0, - 0,1,1,0,0,1,0,0,1,0,0,1,1,0,0,0, - 0,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0, - 0,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1, - 1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1, - 0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0, - 0,1,0,1,0,1,1,1,0,0,0,1,1,0,0,0, - 1,1,1,0,0,1,1,0,0,0,1,0,0,0,1,0, - 0,0,0,1,0,0,1,0,0,1,1,1,0,0,1,0, - 1,0,1,0,0,1,0,0,1,1,1,0,1,0,0,1, - 0,1,0,0,1,0,0,1,1,0,0,1,1,1,0,0, - 0,1,1,1,0,1,0,0,0,0,1,1,1,0,0,0, - 0,1,1,0,0,1,1,1,0,0,0,1,0,0,1,1, - 1,1,0,1,0,0,1,0,0,0,1,0,0,1,1,1, - 1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, - 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0 -}; - -static int small_font_extended[] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, - 1,1,0,0,1,0,1,0,0,1,1,1,0,0,1,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,0,1,1,1,1,0,0,0,1,0,0, - 0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0, - 0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, - 0,1,1,0,0,0,0,0,1,0,0,0,1,1,0,0, - 0,1,1,0,0,0,1,1,0,0,0,1,1,0,0,1, - 0,0,1,0,0,1,1,0,0,0,1,1,1,0,0,1, - 1,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1, - 1,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1, - 0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0, - 1,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0, - 1,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0, - 0,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1, - 0,1,0,0,0,0,0,1,1,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0, - 1,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0, - 0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0, - 0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,0, - 0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0, - 1,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1, - 0,0,0,1,1,0,0,0,1,0,1,0,0,0,1,0, - 0,0,0,0,0,0,0,1,0,1,0, - 0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,1, - 0,0,0,1,0,1,0,1,0,0,0,1,0,0,0,1, - 0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0, - 0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0, - 1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1, - 0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0, - 0,1,1,0,0,0,0,0,0,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,0, - 1,1,0,0,0,1,1,0,0,1,0,1,0,0,1,0, - 0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,0,1,1,0,0,0,0, - 0,0,0,1,0,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,0,0,0,0,0,0,1,0,1, - 0,1,1,1,0,0,1,0,0,1,0,0,0,1,0,0, - 0,1,0,0,0,0,1,0,1,0,1,0,1,0,0,0, - 0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1, - 0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0, - 0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0, - 1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0, - 0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,1,1,0,0,1,0,0,0,0, - 1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1, - 1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,1, - 0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, - 0,1,1,1,0,1,0,0,0,0,0,0,0,1,0,0, - 1,1,1,1,1,0,1,0,0,0,0,0,1,0,0,0, - 0,0,0,0,1,0,0,1,0,1,1,0,1,0,0,1, - 1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0, - 0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0, - 0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,1,1,0,1,0, - 0,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1, - 0,0,1,1,1,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,1,1,0,1,0, - 1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,0, - 0,1,0,1,0,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1, - 0,1,0,0,1,0,1,0,1,0,0,0,1,1,1,0, - 0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,0, - 1,1,1,0,0,1,1,1,0,0,1,1,1,0,0,0, - 1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1, - 0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0, - 0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,0, - 1,1,1,0,0,0,1,1,0,0,0,1,1,0,0,0, - 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0, - 0,0,0,0,1,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1, - 0,1,1,1,0,0,1,0,0,1,0, - 0,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0, - 1,0,1,0,0,1,1,1,0,0,0,0,0,0,0,1, - 0,1,0,0,0,0,0,0,1,1,0,0,1,0,0,0, - 0,0,1,0,0,1,0,1,1,1,1,0,0,0,0,0, - 0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,1,1,0,0,0,1,1,0,0,0, - 0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,1, - 1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0, - 0,0,0,1,0,0,1,1,0,0,1,0,1,0,1,1, - 0,1,1,0,1,0,0,1,0,0,0,1,1,1,1,0, - 1,1,1,1,0,1,1,1,1,0,1,1,1,1,0,1, - 1,1,1,0,1,1,1,1,0,1,1,1,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0, - 1,0,1,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1, - 1,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0, - 0,1,1,1,0,0,1,0,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1, - 0,0,0,1,0,1,1,0,1,0,1,1,0,1,0,1, - 1,0,1,0,1,1,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,1,1, - 1,1,0,1,0,1,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,1, - 0,1,0,0,1,0,1,0,0,1,0, - 0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0, - 1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,0, - 1,1,0,0,0,0,0,0,1,0,1,0,1,0,0,0, - 0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0, - 0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,1,0,0,1,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,1, - 0,0,0,1,1,0,0,1,0,1,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,1,0,0,1,0, - 0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,0, - 0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0, - 1,0,1,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,1, - 1,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,0,1,0, - 0,1,0,0,0,0,1,0,0,1,0,1,0,1,1,0, - 1,0,1,1,0,1,0,1,1,0,1,0,1,1,0,1, - 0,1,1,0,1,0,1,1,0,1,0,1,0,0,0,1, - 0,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0, - 0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0, - 0,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0, - 0,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,1, - 0,1,0,0,1,0,0,1,0,1,0, - 0,0,1,0,0,0,1,1,1,0,1,0,1,1,0,1, - 0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0, - 0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,1,1,0,0,0,1,0,1,0,0,0, - 0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0, - 0,0,1,1,1,0,0,0,1,0,0,1,0,0,1,0, - 1,0,0,1,0,1,0,0,1,0,1,0,0,1,0,1, - 0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1, - 1,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1, - 1,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1, - 0,0,1,1,1,0,0,1,1,1,0,1,1,1,0,0, - 1,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0, - 1,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0, - 0,1,0,1,1,1,0,0,0,1,1,0,0,0,1,1, - 0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,0, - 0,1,0,0,0,0,1,0,1,0,0,0,1,0,1,0, - 0,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0, - 1,0,1,0,0,1,0,1,0,0,1,1,1,0,0,0, - 1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,1, - 0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,1, - 0,0,1,1,1,0,0,1,1,1,0,0,1,1,0,0, - 1,0,0,1,0,0,1,1,0,0,0,1,1,0,0,0, - 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,1, - 1,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1, - 1,0,0,1,1,1,0,0,1,1,1,0,0,0,1,0, - 0,1,1,1,0,0,0,0,1,0,0, - 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1, - 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, - 0,1,0,0,0,0,0,1,0,0,0 -}; diff --git a/3rdparty/zint-2.4.4/backend/gb2312.h b/3rdparty/zint-2.4.4/backend/gb2312.h deleted file mode 100644 index eca1c50..0000000 --- a/3rdparty/zint-2.4.4/backend/gb2312.h +++ /dev/null @@ -1,7467 +0,0 @@ -/* gb2312.h - Unicode to GB 2312-1980 lookup table - - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -unsigned long int gb2312_lookup[] = { - 0x00A4, 0xA1E8, - 0x00A7, 0xA1EC, - 0x00A8, 0xA1A7, - 0x00B0, 0xA1E3, - 0x00B1, 0xA1C0, - 0x00B7, 0xA1A4, - 0x00D7, 0xA1C1, - 0x00E0, 0xA8A4, - 0x00E1, 0xA8A2, - 0x00E8, 0xA8A8, - 0x00E9, 0xA8A6, - 0x00EA, 0xA8BA, - 0x00EC, 0xA8AC, - 0x00ED, 0xA8AA, - 0x00F2, 0xA8B0, - 0x00F3, 0xA8AE, - 0x00F7, 0xA1C2, - 0x00F9, 0xA8B4, - 0x00FA, 0xA8B2, - 0x00FC, 0xA8B9, - 0x0101, 0xA8A1, - 0x0113, 0xA8A5, - 0x011B, 0xA8A7, - 0x012B, 0xA8A9, - 0x014D, 0xA8AD, - 0x016B, 0xA8B1, - 0x01CE, 0xA8A3, - 0x01D0, 0xA8AB, - 0x01D2, 0xA8AF, - 0x01D4, 0xA8B3, - 0x01D6, 0xA8B5, - 0x01D8, 0xA8B6, - 0x01DA, 0xA8B7, - 0x01DC, 0xA8B8, - 0x02C7, 0xA1A6, - 0x02C9, 0xA1A5, - 0x0391, 0xA6A1, - 0x0392, 0xA6A2, - 0x0393, 0xA6A3, - 0x0394, 0xA6A4, - 0x0395, 0xA6A5, - 0x0396, 0xA6A6, - 0x0397, 0xA6A7, - 0x0398, 0xA6A8, - 0x0399, 0xA6A9, - 0x039A, 0xA6AA, - 0x039B, 0xA6AB, - 0x039C, 0xA6AC, - 0x039D, 0xA6AD, - 0x039E, 0xA6AE, - 0x039F, 0xA6AF, - 0x03A0, 0xA6B0, - 0x03A1, 0xA6B1, - 0x03A3, 0xA6B2, - 0x03A4, 0xA6B3, - 0x03A5, 0xA6B4, - 0x03A6, 0xA6B5, - 0x03A7, 0xA6B6, - 0x03A8, 0xA6B7, - 0x03A9, 0xA6B8, - 0x03B1, 0xA6C1, - 0x03B2, 0xA6C2, - 0x03B3, 0xA6C3, - 0x03B4, 0xA6C4, - 0x03B5, 0xA6C5, - 0x03B6, 0xA6C6, - 0x03B7, 0xA6C7, - 0x03B8, 0xA6C8, - 0x03B9, 0xA6C9, - 0x03BA, 0xA6CA, - 0x03BB, 0xA6CB, - 0x03BC, 0xA6CC, - 0x03BD, 0xA6CD, - 0x03BE, 0xA6CE, - 0x03BF, 0xA6CF, - 0x03C0, 0xA6D0, - 0x03C1, 0xA6D1, - 0x03C3, 0xA6D2, - 0x03C4, 0xA6D3, - 0x03C5, 0xA6D4, - 0x03C6, 0xA6D5, - 0x03C7, 0xA6D6, - 0x03C8, 0xA6D7, - 0x03C9, 0xA6D8, - 0x0401, 0xA7A7, - 0x0410, 0xA7A1, - 0x0411, 0xA7A2, - 0x0412, 0xA7A3, - 0x0413, 0xA7A4, - 0x0414, 0xA7A5, - 0x0415, 0xA7A6, - 0x0416, 0xA7A8, - 0x0417, 0xA7A9, - 0x0418, 0xA7AA, - 0x0419, 0xA7AB, - 0x041A, 0xA7AC, - 0x041B, 0xA7AD, - 0x041C, 0xA7AE, - 0x041D, 0xA7AF, - 0x041E, 0xA7B0, - 0x041F, 0xA7B1, - 0x0420, 0xA7B2, - 0x0421, 0xA7B3, - 0x0422, 0xA7B4, - 0x0423, 0xA7B5, - 0x0424, 0xA7B6, - 0x0425, 0xA7B7, - 0x0426, 0xA7B8, - 0x0427, 0xA7B9, - 0x0428, 0xA7BA, - 0x0429, 0xA7BB, - 0x042A, 0xA7BC, - 0x042B, 0xA7BD, - 0x042C, 0xA7BE, - 0x042D, 0xA7BF, - 0x042E, 0xA7C0, - 0x042F, 0xA7C1, - 0x0430, 0xA7D1, - 0x0431, 0xA7D2, - 0x0432, 0xA7D3, - 0x0433, 0xA7D4, - 0x0434, 0xA7D5, - 0x0435, 0xA7D6, - 0x0436, 0xA7D8, - 0x0437, 0xA7D9, - 0x0438, 0xA7DA, - 0x0439, 0xA7DB, - 0x043A, 0xA7DC, - 0x043B, 0xA7DD, - 0x043C, 0xA7DE, - 0x043D, 0xA7DF, - 0x043E, 0xA7E0, - 0x043F, 0xA7E1, - 0x0440, 0xA7E2, - 0x0441, 0xA7E3, - 0x0442, 0xA7E4, - 0x0443, 0xA7E5, - 0x0444, 0xA7E6, - 0x0445, 0xA7E7, - 0x0446, 0xA7E8, - 0x0447, 0xA7E9, - 0x0448, 0xA7EA, - 0x0449, 0xA7EB, - 0x044A, 0xA7EC, - 0x044B, 0xA7ED, - 0x044C, 0xA7EE, - 0x044D, 0xA7EF, - 0x044E, 0xA7F0, - 0x044F, 0xA7F1, - 0x0451, 0xA7D7, - 0x2014, 0xA1AA, - 0x2016, 0xA1AC, - 0x2018, 0xA1AE, - 0x2019, 0xA1AF, - 0x201C, 0xA1B0, - 0x201D, 0xA1B1, - 0x2026, 0xA1AD, - 0x2030, 0xA1EB, - 0x2032, 0xA1E4, - 0x2033, 0xA1E5, - 0x203B, 0xA1F9, - 0x2103, 0xA1E6, - 0x2116, 0xA1ED, - 0x2160, 0xA2F1, - 0x2161, 0xA2F2, - 0x2162, 0xA2F3, - 0x2163, 0xA2F4, - 0x2164, 0xA2F5, - 0x2165, 0xA2F6, - 0x2166, 0xA2F7, - 0x2167, 0xA2F8, - 0x2168, 0xA2F9, - 0x2169, 0xA2FA, - 0x216A, 0xA2FB, - 0x216B, 0xA2FC, - 0x2190, 0xA1FB, - 0x2191, 0xA1FC, - 0x2192, 0xA1FA, - 0x2193, 0xA1FD, - 0x2208, 0xA1CA, - 0x220F, 0xA1C7, - 0x2211, 0xA1C6, - 0x221A, 0xA1CC, - 0x221D, 0xA1D8, - 0x221E, 0xA1DE, - 0x2220, 0xA1CF, - 0x2225, 0xA1CE, - 0x2227, 0xA1C4, - 0x2228, 0xA1C5, - 0x2229, 0xA1C9, - 0x222A, 0xA1C8, - 0x222B, 0xA1D2, - 0x222E, 0xA1D3, - 0x2234, 0xA1E0, - 0x2235, 0xA1DF, - 0x2236, 0xA1C3, - 0x2237, 0xA1CB, - 0x223D, 0xA1D7, - 0x2248, 0xA1D6, - 0x224C, 0xA1D5, - 0x2260, 0xA1D9, - 0x2261, 0xA1D4, - 0x2264, 0xA1DC, - 0x2265, 0xA1DD, - 0x226E, 0xA1DA, - 0x226F, 0xA1DB, - 0x2299, 0xA1D1, - 0x22A5, 0xA1CD, - 0x2312, 0xA1D0, - 0x2460, 0xA2D9, - 0x2461, 0xA2DA, - 0x2462, 0xA2DB, - 0x2463, 0xA2DC, - 0x2464, 0xA2DD, - 0x2465, 0xA2DE, - 0x2466, 0xA2DF, - 0x2467, 0xA2E0, - 0x2468, 0xA2E1, - 0x2469, 0xA2E2, - 0x2474, 0xA2C5, - 0x2475, 0xA2C6, - 0x2476, 0xA2C7, - 0x2477, 0xA2C8, - 0x2478, 0xA2C9, - 0x2479, 0xA2CA, - 0x247A, 0xA2CB, - 0x247B, 0xA2CC, - 0x247C, 0xA2CD, - 0x247D, 0xA2CE, - 0x247E, 0xA2CF, - 0x247F, 0xA2D0, - 0x2480, 0xA2D1, - 0x2481, 0xA2D2, - 0x2482, 0xA2D3, - 0x2483, 0xA2D4, - 0x2484, 0xA2D5, - 0x2485, 0xA2D6, - 0x2486, 0xA2D7, - 0x2487, 0xA2D8, - 0x2488, 0xA2B1, - 0x2489, 0xA2B2, - 0x248A, 0xA2B3, - 0x248B, 0xA2B4, - 0x248C, 0xA2B5, - 0x248D, 0xA2B6, - 0x248E, 0xA2B7, - 0x248F, 0xA2B8, - 0x2490, 0xA2B9, - 0x2491, 0xA2BA, - 0x2492, 0xA2BB, - 0x2493, 0xA2BC, - 0x2494, 0xA2BD, - 0x2495, 0xA2BE, - 0x2496, 0xA2BF, - 0x2497, 0xA2C0, - 0x2498, 0xA2C1, - 0x2499, 0xA2C2, - 0x249A, 0xA2C3, - 0x249B, 0xA2C4, - 0x2500, 0xA9A4, - 0x2501, 0xA9A5, - 0x2502, 0xA9A6, - 0x2503, 0xA9A7, - 0x2504, 0xA9A8, - 0x2505, 0xA9A9, - 0x2506, 0xA9AA, - 0x2507, 0xA9AB, - 0x2508, 0xA9AC, - 0x2509, 0xA9AD, - 0x250A, 0xA9AE, - 0x250B, 0xA9AF, - 0x250C, 0xA9B0, - 0x250D, 0xA9B1, - 0x250E, 0xA9B2, - 0x250F, 0xA9B3, - 0x2510, 0xA9B4, - 0x2511, 0xA9B5, - 0x2512, 0xA9B6, - 0x2513, 0xA9B7, - 0x2514, 0xA9B8, - 0x2515, 0xA9B9, - 0x2516, 0xA9BA, - 0x2517, 0xA9BB, - 0x2518, 0xA9BC, - 0x2519, 0xA9BD, - 0x251A, 0xA9BE, - 0x251B, 0xA9BF, - 0x251C, 0xA9C0, - 0x251D, 0xA9C1, - 0x251E, 0xA9C2, - 0x251F, 0xA9C3, - 0x2520, 0xA9C4, - 0x2521, 0xA9C5, - 0x2522, 0xA9C6, - 0x2523, 0xA9C7, - 0x2524, 0xA9C8, - 0x2525, 0xA9C9, - 0x2526, 0xA9CA, - 0x2527, 0xA9CB, - 0x2528, 0xA9CC, - 0x2529, 0xA9CD, - 0x252A, 0xA9CE, - 0x252B, 0xA9CF, - 0x252C, 0xA9D0, - 0x252D, 0xA9D1, - 0x252E, 0xA9D2, - 0x252F, 0xA9D3, - 0x2530, 0xA9D4, - 0x2531, 0xA9D5, - 0x2532, 0xA9D6, - 0x2533, 0xA9D7, - 0x2534, 0xA9D8, - 0x2535, 0xA9D9, - 0x2536, 0xA9DA, - 0x2537, 0xA9DB, - 0x2538, 0xA9DC, - 0x2539, 0xA9DD, - 0x253A, 0xA9DE, - 0x253B, 0xA9DF, - 0x253C, 0xA9E0, - 0x253D, 0xA9E1, - 0x253E, 0xA9E2, - 0x253F, 0xA9E3, - 0x2540, 0xA9E4, - 0x2541, 0xA9E5, - 0x2542, 0xA9E6, - 0x2543, 0xA9E7, - 0x2544, 0xA9E8, - 0x2545, 0xA9E9, - 0x2546, 0xA9EA, - 0x2547, 0xA9EB, - 0x2548, 0xA9EC, - 0x2549, 0xA9ED, - 0x254A, 0xA9EE, - 0x254B, 0xA9EF, - 0x25A0, 0xA1F6, - 0x25A1, 0xA1F5, - 0x25B2, 0xA1F8, - 0x25B3, 0xA1F7, - 0x25C6, 0xA1F4, - 0x25C7, 0xA1F3, - 0x25CB, 0xA1F0, - 0x25CE, 0xA1F2, - 0x25CF, 0xA1F1, - 0x2605, 0xA1EF, - 0x2606, 0xA1EE, - 0x2640, 0xA1E2, - 0x2642, 0xA1E1, - 0x3000, 0xA1A1, - 0x3001, 0xA1A2, - 0x3002, 0xA1A3, - 0x3003, 0xA1A8, - 0x3005, 0xA1A9, - 0x3008, 0xA1B4, - 0x3009, 0xA1B5, - 0x300A, 0xA1B6, - 0x300B, 0xA1B7, - 0x300C, 0xA1B8, - 0x300D, 0xA1B9, - 0x300E, 0xA1BA, - 0x300F, 0xA1BB, - 0x3010, 0xA1BE, - 0x3011, 0xA1BF, - 0x3013, 0xA1FE, - 0x3014, 0xA1B2, - 0x3015, 0xA1B3, - 0x3016, 0xA1BC, - 0x3017, 0xA1BD, - 0x3041, 0xA4A1, - 0x3042, 0xA4A2, - 0x3043, 0xA4A3, - 0x3044, 0xA4A4, - 0x3045, 0xA4A5, - 0x3046, 0xA4A6, - 0x3047, 0xA4A7, - 0x3048, 0xA4A8, - 0x3049, 0xA4A9, - 0x304A, 0xA4AA, - 0x304B, 0xA4AB, - 0x304C, 0xA4AC, - 0x304D, 0xA4AD, - 0x304E, 0xA4AE, - 0x304F, 0xA4AF, - 0x3050, 0xA4B0, - 0x3051, 0xA4B1, - 0x3052, 0xA4B2, - 0x3053, 0xA4B3, - 0x3054, 0xA4B4, - 0x3055, 0xA4B5, - 0x3056, 0xA4B6, - 0x3057, 0xA4B7, - 0x3058, 0xA4B8, - 0x3059, 0xA4B9, - 0x305A, 0xA4BA, - 0x305B, 0xA4BB, - 0x305C, 0xA4BC, - 0x305D, 0xA4BD, - 0x305E, 0xA4BE, - 0x305F, 0xA4BF, - 0x3060, 0xA4C0, - 0x3061, 0xA4C1, - 0x3062, 0xA4C2, - 0x3063, 0xA4C3, - 0x3064, 0xA4C4, - 0x3065, 0xA4C5, - 0x3066, 0xA4C6, - 0x3067, 0xA4C7, - 0x3068, 0xA4C8, - 0x3069, 0xA4C9, - 0x306A, 0xA4CA, - 0x306B, 0xA4CB, - 0x306C, 0xA4CC, - 0x306D, 0xA4CD, - 0x306E, 0xA4CE, - 0x306F, 0xA4CF, - 0x3070, 0xA4D0, - 0x3071, 0xA4D1, - 0x3072, 0xA4D2, - 0x3073, 0xA4D3, - 0x3074, 0xA4D4, - 0x3075, 0xA4D5, - 0x3076, 0xA4D6, - 0x3077, 0xA4D7, - 0x3078, 0xA4D8, - 0x3079, 0xA4D9, - 0x307A, 0xA4DA, - 0x307B, 0xA4DB, - 0x307C, 0xA4DC, - 0x307D, 0xA4DD, - 0x307E, 0xA4DE, - 0x307F, 0xA4DF, - 0x3080, 0xA4E0, - 0x3081, 0xA4E1, - 0x3082, 0xA4E2, - 0x3083, 0xA4E3, - 0x3084, 0xA4E4, - 0x3085, 0xA4E5, - 0x3086, 0xA4E6, - 0x3087, 0xA4E7, - 0x3088, 0xA4E8, - 0x3089, 0xA4E9, - 0x308A, 0xA4EA, - 0x308B, 0xA4EB, - 0x308C, 0xA4EC, - 0x308D, 0xA4ED, - 0x308E, 0xA4EE, - 0x308F, 0xA4EF, - 0x3090, 0xA4F0, - 0x3091, 0xA4F1, - 0x3092, 0xA4F2, - 0x3093, 0xA4F3, - 0x30A1, 0xA5A1, - 0x30A2, 0xA5A2, - 0x30A3, 0xA5A3, - 0x30A4, 0xA5A4, - 0x30A5, 0xA5A5, - 0x30A6, 0xA5A6, - 0x30A7, 0xA5A7, - 0x30A8, 0xA5A8, - 0x30A9, 0xA5A9, - 0x30AA, 0xA5AA, - 0x30AB, 0xA5AB, - 0x30AC, 0xA5AC, - 0x30AD, 0xA5AD, - 0x30AE, 0xA5AE, - 0x30AF, 0xA5AF, - 0x30B0, 0xA5B0, - 0x30B1, 0xA5B1, - 0x30B2, 0xA5B2, - 0x30B3, 0xA5B3, - 0x30B4, 0xA5B4, - 0x30B5, 0xA5B5, - 0x30B6, 0xA5B6, - 0x30B7, 0xA5B7, - 0x30B8, 0xA5B8, - 0x30B9, 0xA5B9, - 0x30BA, 0xA5BA, - 0x30BB, 0xA5BB, - 0x30BC, 0xA5BC, - 0x30BD, 0xA5BD, - 0x30BE, 0xA5BE, - 0x30BF, 0xA5BF, - 0x30C0, 0xA5C0, - 0x30C1, 0xA5C1, - 0x30C2, 0xA5C2, - 0x30C3, 0xA5C3, - 0x30C4, 0xA5C4, - 0x30C5, 0xA5C5, - 0x30C6, 0xA5C6, - 0x30C7, 0xA5C7, - 0x30C8, 0xA5C8, - 0x30C9, 0xA5C9, - 0x30CA, 0xA5CA, - 0x30CB, 0xA5CB, - 0x30CC, 0xA5CC, - 0x30CD, 0xA5CD, - 0x30CE, 0xA5CE, - 0x30CF, 0xA5CF, - 0x30D0, 0xA5D0, - 0x30D1, 0xA5D1, - 0x30D2, 0xA5D2, - 0x30D3, 0xA5D3, - 0x30D4, 0xA5D4, - 0x30D5, 0xA5D5, - 0x30D6, 0xA5D6, - 0x30D7, 0xA5D7, - 0x30D8, 0xA5D8, - 0x30D9, 0xA5D9, - 0x30DA, 0xA5DA, - 0x30DB, 0xA5DB, - 0x30DC, 0xA5DC, - 0x30DD, 0xA5DD, - 0x30DE, 0xA5DE, - 0x30DF, 0xA5DF, - 0x30E0, 0xA5E0, - 0x30E1, 0xA5E1, - 0x30E2, 0xA5E2, - 0x30E3, 0xA5E3, - 0x30E4, 0xA5E4, - 0x30E5, 0xA5E5, - 0x30E6, 0xA5E6, - 0x30E7, 0xA5E7, - 0x30E8, 0xA5E8, - 0x30E9, 0xA5E9, - 0x30EA, 0xA5EA, - 0x30EB, 0xA5EB, - 0x30EC, 0xA5EC, - 0x30ED, 0xA5ED, - 0x30EE, 0xA5EE, - 0x30EF, 0xA5EF, - 0x30F0, 0xA5F0, - 0x30F1, 0xA5F1, - 0x30F2, 0xA5F2, - 0x30F3, 0xA5F3, - 0x30F4, 0xA5F4, - 0x30F5, 0xA5F5, - 0x30F6, 0xA5F6, - 0x3105, 0xA8C5, - 0x3106, 0xA8C6, - 0x3107, 0xA8C7, - 0x3108, 0xA8C8, - 0x3109, 0xA8C9, - 0x310A, 0xA8CA, - 0x310B, 0xA8CB, - 0x310C, 0xA8CC, - 0x310D, 0xA8CD, - 0x310E, 0xA8CE, - 0x310F, 0xA8CF, - 0x3110, 0xA8D0, - 0x3111, 0xA8D1, - 0x3112, 0xA8D2, - 0x3113, 0xA8D3, - 0x3114, 0xA8D4, - 0x3115, 0xA8D5, - 0x3116, 0xA8D6, - 0x3117, 0xA8D7, - 0x3118, 0xA8D8, - 0x3119, 0xA8D9, - 0x311A, 0xA8DA, - 0x311B, 0xA8DB, - 0x311C, 0xA8DC, - 0x311D, 0xA8DD, - 0x311E, 0xA8DE, - 0x311F, 0xA8DF, - 0x3120, 0xA8E0, - 0x3121, 0xA8E1, - 0x3122, 0xA8E2, - 0x3123, 0xA8E3, - 0x3124, 0xA8E4, - 0x3125, 0xA8E5, - 0x3126, 0xA8E6, - 0x3127, 0xA8E7, - 0x3128, 0xA8E8, - 0x3129, 0xA8E9, - 0x3220, 0xA2E5, - 0x3221, 0xA2E6, - 0x3222, 0xA2E7, - 0x3223, 0xA2E8, - 0x3224, 0xA2E9, - 0x3225, 0xA2EA, - 0x3226, 0xA2EB, - 0x3227, 0xA2EC, - 0x3228, 0xA2ED, - 0x3229, 0xA2EE, - 0x4E00, 0xD2BB, - 0x4E01, 0xB6A1, - 0x4E03, 0xC6DF, - 0x4E07, 0xCDF2, - 0x4E08, 0xD5C9, - 0x4E09, 0xC8FD, - 0x4E0A, 0xC9CF, - 0x4E0B, 0xCFC2, - 0x4E0C, 0xD8A2, - 0x4E0D, 0xB2BB, - 0x4E0E, 0xD3EB, - 0x4E10, 0xD8A4, - 0x4E11, 0xB3F3, - 0x4E13, 0xD7A8, - 0x4E14, 0xC7D2, - 0x4E15, 0xD8A7, - 0x4E16, 0xCAC0, - 0x4E18, 0xC7F0, - 0x4E19, 0xB1FB, - 0x4E1A, 0xD2B5, - 0x4E1B, 0xB4D4, - 0x4E1C, 0xB6AB, - 0x4E1D, 0xCBBF, - 0x4E1E, 0xD8A9, - 0x4E22, 0xB6AA, - 0x4E24, 0xC1BD, - 0x4E25, 0xD1CF, - 0x4E27, 0xC9A5, - 0x4E28, 0xD8AD, - 0x4E2A, 0xB8F6, - 0x4E2B, 0xD1BE, - 0x4E2C, 0xE3DC, - 0x4E2D, 0xD6D0, - 0x4E30, 0xB7E1, - 0x4E32, 0xB4AE, - 0x4E34, 0xC1D9, - 0x4E36, 0xD8BC, - 0x4E38, 0xCDE8, - 0x4E39, 0xB5A4, - 0x4E3A, 0xCEAA, - 0x4E3B, 0xD6F7, - 0x4E3D, 0xC0F6, - 0x4E3E, 0xBED9, - 0x4E3F, 0xD8AF, - 0x4E43, 0xC4CB, - 0x4E45, 0xBEC3, - 0x4E47, 0xD8B1, - 0x4E48, 0xC3B4, - 0x4E49, 0xD2E5, - 0x4E4B, 0xD6AE, - 0x4E4C, 0xCEDA, - 0x4E4D, 0xD5A7, - 0x4E4E, 0xBAF5, - 0x4E4F, 0xB7A6, - 0x4E50, 0xC0D6, - 0x4E52, 0xC6B9, - 0x4E53, 0xC5D2, - 0x4E54, 0xC7C7, - 0x4E56, 0xB9D4, - 0x4E58, 0xB3CB, - 0x4E59, 0xD2D2, - 0x4E5C, 0xD8BF, - 0x4E5D, 0xBEC5, - 0x4E5E, 0xC6F2, - 0x4E5F, 0xD2B2, - 0x4E60, 0xCFB0, - 0x4E61, 0xCFE7, - 0x4E66, 0xCAE9, - 0x4E69, 0xD8C0, - 0x4E70, 0xC2F2, - 0x4E71, 0xC2D2, - 0x4E73, 0xC8E9, - 0x4E7E, 0xC7AC, - 0x4E86, 0xC1CB, - 0x4E88, 0xD3E8, - 0x4E89, 0xD5F9, - 0x4E8B, 0xCAC2, - 0x4E8C, 0xB6FE, - 0x4E8D, 0xD8A1, - 0x4E8E, 0xD3DA, - 0x4E8F, 0xBFF7, - 0x4E91, 0xD4C6, - 0x4E92, 0xBBA5, - 0x4E93, 0xD8C1, - 0x4E94, 0xCEE5, - 0x4E95, 0xBEAE, - 0x4E98, 0xD8A8, - 0x4E9A, 0xD1C7, - 0x4E9B, 0xD0A9, - 0x4E9F, 0xD8BD, - 0x4EA0, 0xD9EF, - 0x4EA1, 0xCDF6, - 0x4EA2, 0xBFBA, - 0x4EA4, 0xBDBB, - 0x4EA5, 0xBAA5, - 0x4EA6, 0xD2E0, - 0x4EA7, 0xB2FA, - 0x4EA8, 0xBAE0, - 0x4EA9, 0xC4B6, - 0x4EAB, 0xCFED, - 0x4EAC, 0xBEA9, - 0x4EAD, 0xCDA4, - 0x4EAE, 0xC1C1, - 0x4EB2, 0xC7D7, - 0x4EB3, 0xD9F1, - 0x4EB5, 0xD9F4, - 0x4EBA, 0xC8CB, - 0x4EBB, 0xD8E9, - 0x4EBF, 0xD2DA, - 0x4EC0, 0xCAB2, - 0x4EC1, 0xC8CA, - 0x4EC2, 0xD8EC, - 0x4EC3, 0xD8EA, - 0x4EC4, 0xD8C6, - 0x4EC5, 0xBDF6, - 0x4EC6, 0xC6CD, - 0x4EC7, 0xB3F0, - 0x4EC9, 0xD8EB, - 0x4ECA, 0xBDF1, - 0x4ECB, 0xBDE9, - 0x4ECD, 0xC8D4, - 0x4ECE, 0xB4D3, - 0x4ED1, 0xC2D8, - 0x4ED3, 0xB2D6, - 0x4ED4, 0xD7D0, - 0x4ED5, 0xCACB, - 0x4ED6, 0xCBFB, - 0x4ED7, 0xD5CC, - 0x4ED8, 0xB8B6, - 0x4ED9, 0xCFC9, - 0x4EDD, 0xD9DA, - 0x4EDE, 0xD8F0, - 0x4EDF, 0xC7AA, - 0x4EE1, 0xD8EE, - 0x4EE3, 0xB4FA, - 0x4EE4, 0xC1EE, - 0x4EE5, 0xD2D4, - 0x4EE8, 0xD8ED, - 0x4EEA, 0xD2C7, - 0x4EEB, 0xD8EF, - 0x4EEC, 0xC3C7, - 0x4EF0, 0xD1F6, - 0x4EF2, 0xD6D9, - 0x4EF3, 0xD8F2, - 0x4EF5, 0xD8F5, - 0x4EF6, 0xBCFE, - 0x4EF7, 0xBCDB, - 0x4EFB, 0xC8CE, - 0x4EFD, 0xB7DD, - 0x4EFF, 0xB7C2, - 0x4F01, 0xC6F3, - 0x4F09, 0xD8F8, - 0x4F0A, 0xD2C1, - 0x4F0D, 0xCEE9, - 0x4F0E, 0xBCBF, - 0x4F0F, 0xB7FC, - 0x4F10, 0xB7A5, - 0x4F11, 0xD0DD, - 0x4F17, 0xD6DA, - 0x4F18, 0xD3C5, - 0x4F19, 0xBBEF, - 0x4F1A, 0xBBE1, - 0x4F1B, 0xD8F1, - 0x4F1E, 0xC9A1, - 0x4F1F, 0xCEB0, - 0x4F20, 0xB4AB, - 0x4F22, 0xD8F3, - 0x4F24, 0xC9CB, - 0x4F25, 0xD8F6, - 0x4F26, 0xC2D7, - 0x4F27, 0xD8F7, - 0x4F2A, 0xCEB1, - 0x4F2B, 0xD8F9, - 0x4F2F, 0xB2AE, - 0x4F30, 0xB9C0, - 0x4F32, 0xD9A3, - 0x4F34, 0xB0E9, - 0x4F36, 0xC1E6, - 0x4F38, 0xC9EC, - 0x4F3A, 0xCBC5, - 0x4F3C, 0xCBC6, - 0x4F3D, 0xD9A4, - 0x4F43, 0xB5E8, - 0x4F46, 0xB5AB, - 0x4F4D, 0xCEBB, - 0x4F4E, 0xB5CD, - 0x4F4F, 0xD7A1, - 0x4F50, 0xD7F4, - 0x4F51, 0xD3D3, - 0x4F53, 0xCCE5, - 0x4F55, 0xBACE, - 0x4F57, 0xD9A2, - 0x4F58, 0xD9DC, - 0x4F59, 0xD3E0, - 0x4F5A, 0xD8FD, - 0x4F5B, 0xB7F0, - 0x4F5C, 0xD7F7, - 0x4F5D, 0xD8FE, - 0x4F5E, 0xD8FA, - 0x4F5F, 0xD9A1, - 0x4F60, 0xC4E3, - 0x4F63, 0xD3B6, - 0x4F64, 0xD8F4, - 0x4F65, 0xD9DD, - 0x4F67, 0xD8FB, - 0x4F69, 0xC5E5, - 0x4F6C, 0xC0D0, - 0x4F6F, 0xD1F0, - 0x4F70, 0xB0DB, - 0x4F73, 0xBCD1, - 0x4F74, 0xD9A6, - 0x4F76, 0xD9A5, - 0x4F7B, 0xD9AC, - 0x4F7C, 0xD9AE, - 0x4F7E, 0xD9AB, - 0x4F7F, 0xCAB9, - 0x4F83, 0xD9A9, - 0x4F84, 0xD6B6, - 0x4F88, 0xB3DE, - 0x4F89, 0xD9A8, - 0x4F8B, 0xC0FD, - 0x4F8D, 0xCACC, - 0x4F8F, 0xD9AA, - 0x4F91, 0xD9A7, - 0x4F94, 0xD9B0, - 0x4F97, 0xB6B1, - 0x4F9B, 0xB9A9, - 0x4F9D, 0xD2C0, - 0x4FA0, 0xCFC0, - 0x4FA3, 0xC2C2, - 0x4FA5, 0xBDC4, - 0x4FA6, 0xD5EC, - 0x4FA7, 0xB2E0, - 0x4FA8, 0xC7C8, - 0x4FA9, 0xBFEB, - 0x4FAA, 0xD9AD, - 0x4FAC, 0xD9AF, - 0x4FAE, 0xCEEA, - 0x4FAF, 0xBAEE, - 0x4FB5, 0xC7D6, - 0x4FBF, 0xB1E3, - 0x4FC3, 0xB4D9, - 0x4FC4, 0xB6ED, - 0x4FC5, 0xD9B4, - 0x4FCA, 0xBFA1, - 0x4FCE, 0xD9DE, - 0x4FCF, 0xC7CE, - 0x4FD0, 0xC0FE, - 0x4FD1, 0xD9B8, - 0x4FD7, 0xCBD7, - 0x4FD8, 0xB7FD, - 0x4FDA, 0xD9B5, - 0x4FDC, 0xD9B7, - 0x4FDD, 0xB1A3, - 0x4FDE, 0xD3E1, - 0x4FDF, 0xD9B9, - 0x4FE1, 0xD0C5, - 0x4FE3, 0xD9B6, - 0x4FE6, 0xD9B1, - 0x4FE8, 0xD9B2, - 0x4FE9, 0xC1A9, - 0x4FEA, 0xD9B3, - 0x4FED, 0xBCF3, - 0x4FEE, 0xD0DE, - 0x4FEF, 0xB8A9, - 0x4FF1, 0xBEE3, - 0x4FF3, 0xD9BD, - 0x4FF8, 0xD9BA, - 0x4FFA, 0xB0B3, - 0x4FFE, 0xD9C2, - 0x500C, 0xD9C4, - 0x500D, 0xB1B6, - 0x500F, 0xD9BF, - 0x5012, 0xB5B9, - 0x5014, 0xBEF3, - 0x5018, 0xCCC8, - 0x5019, 0xBAF2, - 0x501A, 0xD2D0, - 0x501C, 0xD9C3, - 0x501F, 0xBDE8, - 0x5021, 0xB3AB, - 0x5025, 0xD9C5, - 0x5026, 0xBEEB, - 0x5028, 0xD9C6, - 0x5029, 0xD9BB, - 0x502A, 0xC4DF, - 0x502C, 0xD9BE, - 0x502D, 0xD9C1, - 0x502E, 0xD9C0, - 0x503A, 0xD5AE, - 0x503C, 0xD6B5, - 0x503E, 0xC7E3, - 0x5043, 0xD9C8, - 0x5047, 0xBCD9, - 0x5048, 0xD9CA, - 0x504C, 0xD9BC, - 0x504E, 0xD9CB, - 0x504F, 0xC6AB, - 0x5055, 0xD9C9, - 0x505A, 0xD7F6, - 0x505C, 0xCDA3, - 0x5065, 0xBDA1, - 0x506C, 0xD9CC, - 0x5076, 0xC5BC, - 0x5077, 0xCDB5, - 0x507B, 0xD9CD, - 0x507E, 0xD9C7, - 0x507F, 0xB3A5, - 0x5080, 0xBFFE, - 0x5085, 0xB8B5, - 0x5088, 0xC0FC, - 0x508D, 0xB0F8, - 0x50A3, 0xB4F6, - 0x50A5, 0xD9CE, - 0x50A7, 0xD9CF, - 0x50A8, 0xB4A2, - 0x50A9, 0xD9D0, - 0x50AC, 0xB4DF, - 0x50B2, 0xB0C1, - 0x50BA, 0xD9D1, - 0x50BB, 0xC9B5, - 0x50CF, 0xCFF1, - 0x50D6, 0xD9D2, - 0x50DA, 0xC1C5, - 0x50E6, 0xD9D6, - 0x50E7, 0xC9AE, - 0x50EC, 0xD9D5, - 0x50ED, 0xD9D4, - 0x50EE, 0xD9D7, - 0x50F3, 0xCBDB, - 0x50F5, 0xBDA9, - 0x50FB, 0xC6A7, - 0x5106, 0xD9D3, - 0x5107, 0xD9D8, - 0x510B, 0xD9D9, - 0x5112, 0xC8E5, - 0x5121, 0xC0DC, - 0x513F, 0xB6F9, - 0x5140, 0xD8A3, - 0x5141, 0xD4CA, - 0x5143, 0xD4AA, - 0x5144, 0xD0D6, - 0x5145, 0xB3E4, - 0x5146, 0xD5D7, - 0x5148, 0xCFC8, - 0x5149, 0xB9E2, - 0x514B, 0xBFCB, - 0x514D, 0xC3E2, - 0x5151, 0xB6D2, - 0x5154, 0xCDC3, - 0x5155, 0xD9EE, - 0x5156, 0xD9F0, - 0x515A, 0xB5B3, - 0x515C, 0xB6B5, - 0x5162, 0xBEA4, - 0x5165, 0xC8EB, - 0x5168, 0xC8AB, - 0x516B, 0xB0CB, - 0x516C, 0xB9AB, - 0x516D, 0xC1F9, - 0x516E, 0xD9E2, - 0x5170, 0xC0BC, - 0x5171, 0xB9B2, - 0x5173, 0xB9D8, - 0x5174, 0xD0CB, - 0x5175, 0xB1F8, - 0x5176, 0xC6E4, - 0x5177, 0xBEDF, - 0x5178, 0xB5E4, - 0x5179, 0xD7C8, - 0x517B, 0xD1F8, - 0x517C, 0xBCE6, - 0x517D, 0xCADE, - 0x5180, 0xBCBD, - 0x5181, 0xD9E6, - 0x5182, 0xD8E7, - 0x5185, 0xC4DA, - 0x5188, 0xB8D4, - 0x5189, 0xC8BD, - 0x518C, 0xB2E1, - 0x518D, 0xD4D9, - 0x5192, 0xC3B0, - 0x5195, 0xC3E1, - 0x5196, 0xDAA2, - 0x5197, 0xC8DF, - 0x5199, 0xD0B4, - 0x519B, 0xBEFC, - 0x519C, 0xC5A9, - 0x51A0, 0xB9DA, - 0x51A2, 0xDAA3, - 0x51A4, 0xD4A9, - 0x51A5, 0xDAA4, - 0x51AB, 0xD9FB, - 0x51AC, 0xB6AC, - 0x51AF, 0xB7EB, - 0x51B0, 0xB1F9, - 0x51B1, 0xD9FC, - 0x51B2, 0xB3E5, - 0x51B3, 0xBEF6, - 0x51B5, 0xBFF6, - 0x51B6, 0xD2B1, - 0x51B7, 0xC0E4, - 0x51BB, 0xB6B3, - 0x51BC, 0xD9FE, - 0x51BD, 0xD9FD, - 0x51C0, 0xBEBB, - 0x51C4, 0xC6E0, - 0x51C6, 0xD7BC, - 0x51C7, 0xDAA1, - 0x51C9, 0xC1B9, - 0x51CB, 0xB5F2, - 0x51CC, 0xC1E8, - 0x51CF, 0xBCF5, - 0x51D1, 0xB4D5, - 0x51DB, 0xC1DD, - 0x51DD, 0xC4FD, - 0x51E0, 0xBCB8, - 0x51E1, 0xB7B2, - 0x51E4, 0xB7EF, - 0x51EB, 0xD9EC, - 0x51ED, 0xC6BE, - 0x51EF, 0xBFAD, - 0x51F0, 0xBBCB, - 0x51F3, 0xB5CA, - 0x51F5, 0xDBC9, - 0x51F6, 0xD0D7, - 0x51F8, 0xCDB9, - 0x51F9, 0xB0BC, - 0x51FA, 0xB3F6, - 0x51FB, 0xBBF7, - 0x51FC, 0xDBCA, - 0x51FD, 0xBAAF, - 0x51FF, 0xD4E4, - 0x5200, 0xB5B6, - 0x5201, 0xB5F3, - 0x5202, 0xD8D6, - 0x5203, 0xC8D0, - 0x5206, 0xB7D6, - 0x5207, 0xC7D0, - 0x5208, 0xD8D7, - 0x520A, 0xBFAF, - 0x520D, 0xDBBB, - 0x520E, 0xD8D8, - 0x5211, 0xD0CC, - 0x5212, 0xBBAE, - 0x5216, 0xEBBE, - 0x5217, 0xC1D0, - 0x5218, 0xC1F5, - 0x5219, 0xD4F2, - 0x521A, 0xB8D5, - 0x521B, 0xB4B4, - 0x521D, 0xB3F5, - 0x5220, 0xC9BE, - 0x5224, 0xC5D0, - 0x5228, 0xC5D9, - 0x5229, 0xC0FB, - 0x522B, 0xB1F0, - 0x522D, 0xD8D9, - 0x522E, 0xB9CE, - 0x5230, 0xB5BD, - 0x5233, 0xD8DA, - 0x5236, 0xD6C6, - 0x5237, 0xCBA2, - 0x5238, 0xC8AF, - 0x5239, 0xC9B2, - 0x523A, 0xB4CC, - 0x523B, 0xBFCC, - 0x523D, 0xB9F4, - 0x523F, 0xD8DB, - 0x5240, 0xD8DC, - 0x5241, 0xB6E7, - 0x5242, 0xBCC1, - 0x5243, 0xCCEA, - 0x524A, 0xCFF7, - 0x524C, 0xD8DD, - 0x524D, 0xC7B0, - 0x5250, 0xB9D0, - 0x5251, 0xBDA3, - 0x5254, 0xCCDE, - 0x5256, 0xC6CA, - 0x525C, 0xD8E0, - 0x525E, 0xD8DE, - 0x5261, 0xD8DF, - 0x5265, 0xB0FE, - 0x5267, 0xBEE7, - 0x5269, 0xCAA3, - 0x526A, 0xBCF4, - 0x526F, 0xB8B1, - 0x5272, 0xB8EE, - 0x527D, 0xD8E2, - 0x527F, 0xBDCB, - 0x5281, 0xD8E4, - 0x5282, 0xD8E3, - 0x5288, 0xC5FC, - 0x5290, 0xD8E5, - 0x5293, 0xD8E6, - 0x529B, 0xC1A6, - 0x529D, 0xC8B0, - 0x529E, 0xB0EC, - 0x529F, 0xB9A6, - 0x52A0, 0xBCD3, - 0x52A1, 0xCEF1, - 0x52A2, 0xDBBD, - 0x52A3, 0xC1D3, - 0x52A8, 0xB6AF, - 0x52A9, 0xD6FA, - 0x52AA, 0xC5AC, - 0x52AB, 0xBDD9, - 0x52AC, 0xDBBE, - 0x52AD, 0xDBBF, - 0x52B1, 0xC0F8, - 0x52B2, 0xBEA2, - 0x52B3, 0xC0CD, - 0x52BE, 0xDBC0, - 0x52BF, 0xCAC6, - 0x52C3, 0xB2AA, - 0x52C7, 0xD3C2, - 0x52C9, 0xC3E3, - 0x52CB, 0xD1AB, - 0x52D0, 0xDBC2, - 0x52D2, 0xC0D5, - 0x52D6, 0xDBC3, - 0x52D8, 0xBFB1, - 0x52DF, 0xC4BC, - 0x52E4, 0xC7DA, - 0x52F0, 0xDBC4, - 0x52F9, 0xD9E8, - 0x52FA, 0xC9D7, - 0x52FE, 0xB9B4, - 0x52FF, 0xCEF0, - 0x5300, 0xD4C8, - 0x5305, 0xB0FC, - 0x5306, 0xB4D2, - 0x5308, 0xD0D9, - 0x530D, 0xD9E9, - 0x530F, 0xDECB, - 0x5310, 0xD9EB, - 0x5315, 0xD8B0, - 0x5316, 0xBBAF, - 0x5317, 0xB1B1, - 0x5319, 0xB3D7, - 0x531A, 0xD8CE, - 0x531D, 0xD4D1, - 0x5320, 0xBDB3, - 0x5321, 0xBFEF, - 0x5323, 0xCFBB, - 0x5326, 0xD8D0, - 0x532A, 0xB7CB, - 0x532E, 0xD8D1, - 0x5339, 0xC6A5, - 0x533A, 0xC7F8, - 0x533B, 0xD2BD, - 0x533E, 0xD8D2, - 0x533F, 0xC4E4, - 0x5341, 0xCAAE, - 0x5343, 0xC7A7, - 0x5345, 0xD8A6, - 0x5347, 0xC9FD, - 0x5348, 0xCEE7, - 0x5349, 0xBBDC, - 0x534A, 0xB0EB, - 0x534E, 0xBBAA, - 0x534F, 0xD0AD, - 0x5351, 0xB1B0, - 0x5352, 0xD7E4, - 0x5353, 0xD7BF, - 0x5355, 0xB5A5, - 0x5356, 0xC2F4, - 0x5357, 0xC4CF, - 0x535A, 0xB2A9, - 0x535C, 0xB2B7, - 0x535E, 0xB1E5, - 0x535F, 0xDFB2, - 0x5360, 0xD5BC, - 0x5361, 0xBFA8, - 0x5362, 0xC2AC, - 0x5363, 0xD8D5, - 0x5364, 0xC2B1, - 0x5366, 0xD8D4, - 0x5367, 0xCED4, - 0x5369, 0xDAE0, - 0x536B, 0xCEC0, - 0x536E, 0xD8B4, - 0x536F, 0xC3AE, - 0x5370, 0xD3A1, - 0x5371, 0xCEA3, - 0x5373, 0xBCB4, - 0x5374, 0xC8B4, - 0x5375, 0xC2D1, - 0x5377, 0xBEED, - 0x5378, 0xD0B6, - 0x537A, 0xDAE1, - 0x537F, 0xC7E4, - 0x5382, 0xB3A7, - 0x5384, 0xB6F2, - 0x5385, 0xCCFC, - 0x5386, 0xC0FA, - 0x5389, 0xC0F7, - 0x538B, 0xD1B9, - 0x538C, 0xD1E1, - 0x538D, 0xD8C7, - 0x5395, 0xB2DE, - 0x5398, 0xC0E5, - 0x539A, 0xBAF1, - 0x539D, 0xD8C8, - 0x539F, 0xD4AD, - 0x53A2, 0xCFE1, - 0x53A3, 0xD8C9, - 0x53A5, 0xD8CA, - 0x53A6, 0xCFC3, - 0x53A8, 0xB3F8, - 0x53A9, 0xBEC7, - 0x53AE, 0xD8CB, - 0x53B6, 0xDBCC, - 0x53BB, 0xC8A5, - 0x53BF, 0xCFD8, - 0x53C1, 0xC8FE, - 0x53C2, 0xB2CE, - 0x53C8, 0xD3D6, - 0x53C9, 0xB2E6, - 0x53CA, 0xBCB0, - 0x53CB, 0xD3D1, - 0x53CC, 0xCBAB, - 0x53CD, 0xB7B4, - 0x53D1, 0xB7A2, - 0x53D4, 0xCAE5, - 0x53D6, 0xC8A1, - 0x53D7, 0xCADC, - 0x53D8, 0xB1E4, - 0x53D9, 0xD0F0, - 0x53DB, 0xC5D1, - 0x53DF, 0xDBC5, - 0x53E0, 0xB5FE, - 0x53E3, 0xBFDA, - 0x53E4, 0xB9C5, - 0x53E5, 0xBEE4, - 0x53E6, 0xC1ED, - 0x53E8, 0xDFB6, - 0x53E9, 0xDFB5, - 0x53EA, 0xD6BB, - 0x53EB, 0xBDD0, - 0x53EC, 0xD5D9, - 0x53ED, 0xB0C8, - 0x53EE, 0xB6A3, - 0x53EF, 0xBFC9, - 0x53F0, 0xCCA8, - 0x53F1, 0xDFB3, - 0x53F2, 0xCAB7, - 0x53F3, 0xD3D2, - 0x53F5, 0xD8CF, - 0x53F6, 0xD2B6, - 0x53F7, 0xBAC5, - 0x53F8, 0xCBBE, - 0x53F9, 0xCCBE, - 0x53FB, 0xDFB7, - 0x53FC, 0xB5F0, - 0x53FD, 0xDFB4, - 0x5401, 0xD3F5, - 0x5403, 0xB3D4, - 0x5404, 0xB8F7, - 0x5406, 0xDFBA, - 0x5408, 0xBACF, - 0x5409, 0xBCAA, - 0x540A, 0xB5F5, - 0x540C, 0xCDAC, - 0x540D, 0xC3FB, - 0x540E, 0xBAF3, - 0x540F, 0xC0F4, - 0x5410, 0xCDC2, - 0x5411, 0xCFF2, - 0x5412, 0xDFB8, - 0x5413, 0xCFC5, - 0x5415, 0xC2C0, - 0x5416, 0xDFB9, - 0x5417, 0xC2F0, - 0x541B, 0xBEFD, - 0x541D, 0xC1DF, - 0x541E, 0xCDCC, - 0x541F, 0xD2F7, - 0x5420, 0xB7CD, - 0x5421, 0xDFC1, - 0x5423, 0xDFC4, - 0x5426, 0xB7F1, - 0x5427, 0xB0C9, - 0x5428, 0xB6D6, - 0x5429, 0xB7D4, - 0x542B, 0xBAAC, - 0x542C, 0xCCFD, - 0x542D, 0xBFD4, - 0x542E, 0xCBB1, - 0x542F, 0xC6F4, - 0x5431, 0xD6A8, - 0x5432, 0xDFC5, - 0x5434, 0xCEE2, - 0x5435, 0xB3B3, - 0x5438, 0xCEFC, - 0x5439, 0xB4B5, - 0x543B, 0xCEC7, - 0x543C, 0xBAF0, - 0x543E, 0xCEE1, - 0x5440, 0xD1BD, - 0x5443, 0xDFC0, - 0x5446, 0xB4F4, - 0x5448, 0xB3CA, - 0x544A, 0xB8E6, - 0x544B, 0xDFBB, - 0x5450, 0xC4C5, - 0x5452, 0xDFBC, - 0x5453, 0xDFBD, - 0x5454, 0xDFBE, - 0x5455, 0xC5BB, - 0x5456, 0xDFBF, - 0x5457, 0xDFC2, - 0x5458, 0xD4B1, - 0x5459, 0xDFC3, - 0x545B, 0xC7BA, - 0x545C, 0xCED8, - 0x5462, 0xC4D8, - 0x5464, 0xDFCA, - 0x5466, 0xDFCF, - 0x5468, 0xD6DC, - 0x5471, 0xDFC9, - 0x5472, 0xDFDA, - 0x5473, 0xCEB6, - 0x5475, 0xBAC7, - 0x5476, 0xDFCE, - 0x5477, 0xDFC8, - 0x5478, 0xC5DE, - 0x547B, 0xC9EB, - 0x547C, 0xBAF4, - 0x547D, 0xC3FC, - 0x5480, 0xBED7, - 0x5482, 0xDFC6, - 0x5484, 0xDFCD, - 0x5486, 0xC5D8, - 0x548B, 0xD5A6, - 0x548C, 0xBACD, - 0x548E, 0xBECC, - 0x548F, 0xD3BD, - 0x5490, 0xB8C0, - 0x5492, 0xD6E4, - 0x5494, 0xDFC7, - 0x5495, 0xB9BE, - 0x5496, 0xBFA7, - 0x5499, 0xC1FC, - 0x549A, 0xDFCB, - 0x549B, 0xDFCC, - 0x549D, 0xDFD0, - 0x54A3, 0xDFDB, - 0x54A4, 0xDFE5, - 0x54A6, 0xDFD7, - 0x54A7, 0xDFD6, - 0x54A8, 0xD7C9, - 0x54A9, 0xDFE3, - 0x54AA, 0xDFE4, - 0x54AB, 0xE5EB, - 0x54AC, 0xD2A7, - 0x54AD, 0xDFD2, - 0x54AF, 0xBFA9, - 0x54B1, 0xD4DB, - 0x54B3, 0xBFC8, - 0x54B4, 0xDFD4, - 0x54B8, 0xCFCC, - 0x54BB, 0xDFDD, - 0x54BD, 0xD1CA, - 0x54BF, 0xDFDE, - 0x54C0, 0xB0A7, - 0x54C1, 0xC6B7, - 0x54C2, 0xDFD3, - 0x54C4, 0xBAE5, - 0x54C6, 0xB6DF, - 0x54C7, 0xCDDB, - 0x54C8, 0xB9FE, - 0x54C9, 0xD4D5, - 0x54CC, 0xDFDF, - 0x54CD, 0xCFEC, - 0x54CE, 0xB0A5, - 0x54CF, 0xDFE7, - 0x54D0, 0xDFD1, - 0x54D1, 0xD1C6, - 0x54D2, 0xDFD5, - 0x54D3, 0xDFD8, - 0x54D4, 0xDFD9, - 0x54D5, 0xDFDC, - 0x54D7, 0xBBA9, - 0x54D9, 0xDFE0, - 0x54DA, 0xDFE1, - 0x54DC, 0xDFE2, - 0x54DD, 0xDFE6, - 0x54DE, 0xDFE8, - 0x54DF, 0xD3B4, - 0x54E5, 0xB8E7, - 0x54E6, 0xC5B6, - 0x54E7, 0xDFEA, - 0x54E8, 0xC9DA, - 0x54E9, 0xC1A8, - 0x54EA, 0xC4C4, - 0x54ED, 0xBFDE, - 0x54EE, 0xCFF8, - 0x54F2, 0xD5DC, - 0x54F3, 0xDFEE, - 0x54FA, 0xB2B8, - 0x54FC, 0xBADF, - 0x54FD, 0xDFEC, - 0x54FF, 0xDBC1, - 0x5501, 0xD1E4, - 0x5506, 0xCBF4, - 0x5507, 0xB4BD, - 0x5509, 0xB0A6, - 0x550F, 0xDFF1, - 0x5510, 0xCCC6, - 0x5511, 0xDFF2, - 0x5514, 0xDFED, - 0x551B, 0xDFE9, - 0x5520, 0xDFEB, - 0x5522, 0xDFEF, - 0x5523, 0xDFF0, - 0x5524, 0xBBBD, - 0x5527, 0xDFF3, - 0x552A, 0xDFF4, - 0x552C, 0xBBA3, - 0x552E, 0xCADB, - 0x552F, 0xCEA8, - 0x5530, 0xE0A7, - 0x5531, 0xB3AA, - 0x5533, 0xE0A6, - 0x5537, 0xE0A1, - 0x553C, 0xDFFE, - 0x553E, 0xCDD9, - 0x553F, 0xDFFC, - 0x5541, 0xDFFA, - 0x5543, 0xBFD0, - 0x5544, 0xD7C4, - 0x5546, 0xC9CC, - 0x5549, 0xDFF8, - 0x554A, 0xB0A1, - 0x5550, 0xDFFD, - 0x5555, 0xDFFB, - 0x5556, 0xE0A2, - 0x555C, 0xE0A8, - 0x5561, 0xB7C8, - 0x5564, 0xC6A1, - 0x5565, 0xC9B6, - 0x5566, 0xC0B2, - 0x5567, 0xDFF5, - 0x556A, 0xC5BE, - 0x556C, 0xD8C4, - 0x556D, 0xDFF9, - 0x556E, 0xC4F6, - 0x5575, 0xE0A3, - 0x5576, 0xE0A4, - 0x5577, 0xE0A5, - 0x5578, 0xD0A5, - 0x557B, 0xE0B4, - 0x557C, 0xCCE4, - 0x557E, 0xE0B1, - 0x5580, 0xBFA6, - 0x5581, 0xE0AF, - 0x5582, 0xCEB9, - 0x5583, 0xE0AB, - 0x5584, 0xC9C6, - 0x5587, 0xC0AE, - 0x5588, 0xE0AE, - 0x5589, 0xBAED, - 0x558A, 0xBAB0, - 0x558B, 0xE0A9, - 0x558F, 0xDFF6, - 0x5591, 0xE0B3, - 0x5594, 0xE0B8, - 0x5598, 0xB4AD, - 0x5599, 0xE0B9, - 0x559C, 0xCFB2, - 0x559D, 0xBAC8, - 0x559F, 0xE0B0, - 0x55A7, 0xD0FA, - 0x55B1, 0xE0AC, - 0x55B3, 0xD4FB, - 0x55B5, 0xDFF7, - 0x55B7, 0xC5E7, - 0x55B9, 0xE0AD, - 0x55BB, 0xD3F7, - 0x55BD, 0xE0B6, - 0x55BE, 0xE0B7, - 0x55C4, 0xE0C4, - 0x55C5, 0xD0E1, - 0x55C9, 0xE0BC, - 0x55CC, 0xE0C9, - 0x55CD, 0xE0CA, - 0x55D1, 0xE0BE, - 0x55D2, 0xE0AA, - 0x55D3, 0xC9A4, - 0x55D4, 0xE0C1, - 0x55D6, 0xE0B2, - 0x55DC, 0xCAC8, - 0x55DD, 0xE0C3, - 0x55DF, 0xE0B5, - 0x55E1, 0xCECB, - 0x55E3, 0xCBC3, - 0x55E4, 0xE0CD, - 0x55E5, 0xE0C6, - 0x55E6, 0xE0C2, - 0x55E8, 0xE0CB, - 0x55EA, 0xE0BA, - 0x55EB, 0xE0BF, - 0x55EC, 0xE0C0, - 0x55EF, 0xE0C5, - 0x55F2, 0xE0C7, - 0x55F3, 0xE0C8, - 0x55F5, 0xE0CC, - 0x55F7, 0xE0BB, - 0x55FD, 0xCBD4, - 0x55FE, 0xE0D5, - 0x5600, 0xE0D6, - 0x5601, 0xE0D2, - 0x5608, 0xE0D0, - 0x5609, 0xBCCE, - 0x560C, 0xE0D1, - 0x560E, 0xB8C2, - 0x560F, 0xD8C5, - 0x5618, 0xD0EA, - 0x561B, 0xC2EF, - 0x561E, 0xE0CF, - 0x561F, 0xE0BD, - 0x5623, 0xE0D4, - 0x5624, 0xE0D3, - 0x5627, 0xE0D7, - 0x562C, 0xE0DC, - 0x562D, 0xE0D8, - 0x5631, 0xD6F6, - 0x5632, 0xB3B0, - 0x5634, 0xD7EC, - 0x5636, 0xCBBB, - 0x5639, 0xE0DA, - 0x563B, 0xCEFB, - 0x563F, 0xBAD9, - 0x564C, 0xE0E1, - 0x564D, 0xE0DD, - 0x564E, 0xD2AD, - 0x5654, 0xE0E2, - 0x5657, 0xE0DB, - 0x5658, 0xE0D9, - 0x5659, 0xE0DF, - 0x565C, 0xE0E0, - 0x5662, 0xE0DE, - 0x5664, 0xE0E4, - 0x5668, 0xC6F7, - 0x5669, 0xD8AC, - 0x566A, 0xD4EB, - 0x566B, 0xE0E6, - 0x566C, 0xCAC9, - 0x5671, 0xE0E5, - 0x5676, 0xB8C1, - 0x567B, 0xE0E7, - 0x567C, 0xE0E8, - 0x5685, 0xE0E9, - 0x5686, 0xE0E3, - 0x568E, 0xBABF, - 0x568F, 0xCCE7, - 0x5693, 0xE0EA, - 0x56A3, 0xCFF9, - 0x56AF, 0xE0EB, - 0x56B7, 0xC8C2, - 0x56BC, 0xBDC0, - 0x56CA, 0xC4D2, - 0x56D4, 0xE0EC, - 0x56D7, 0xE0ED, - 0x56DA, 0xC7F4, - 0x56DB, 0xCBC4, - 0x56DD, 0xE0EE, - 0x56DE, 0xBBD8, - 0x56DF, 0xD8B6, - 0x56E0, 0xD2F2, - 0x56E1, 0xE0EF, - 0x56E2, 0xCDC5, - 0x56E4, 0xB6DA, - 0x56EB, 0xE0F1, - 0x56ED, 0xD4B0, - 0x56F0, 0xC0A7, - 0x56F1, 0xB4D1, - 0x56F4, 0xCEA7, - 0x56F5, 0xE0F0, - 0x56F9, 0xE0F2, - 0x56FA, 0xB9CC, - 0x56FD, 0xB9FA, - 0x56FE, 0xCDBC, - 0x56FF, 0xE0F3, - 0x5703, 0xC6D4, - 0x5704, 0xE0F4, - 0x5706, 0xD4B2, - 0x5708, 0xC8A6, - 0x5709, 0xE0F6, - 0x570A, 0xE0F5, - 0x571C, 0xE0F7, - 0x571F, 0xCDC1, - 0x5723, 0xCAA5, - 0x5728, 0xD4DA, - 0x5729, 0xDBD7, - 0x572A, 0xDBD9, - 0x572C, 0xDBD8, - 0x572D, 0xB9E7, - 0x572E, 0xDBDC, - 0x572F, 0xDBDD, - 0x5730, 0xB5D8, - 0x5733, 0xDBDA, - 0x5739, 0xDBDB, - 0x573A, 0xB3A1, - 0x573B, 0xDBDF, - 0x573E, 0xBBF8, - 0x5740, 0xD6B7, - 0x5742, 0xDBE0, - 0x5747, 0xBEF9, - 0x574A, 0xB7BB, - 0x574C, 0xDBD0, - 0x574D, 0xCCAE, - 0x574E, 0xBFB2, - 0x574F, 0xBBB5, - 0x5750, 0xD7F8, - 0x5751, 0xBFD3, - 0x5757, 0xBFE9, - 0x575A, 0xBCE1, - 0x575B, 0xCCB3, - 0x575C, 0xDBDE, - 0x575D, 0xB0D3, - 0x575E, 0xCEEB, - 0x575F, 0xB7D8, - 0x5760, 0xD7B9, - 0x5761, 0xC6C2, - 0x5764, 0xC0A4, - 0x5766, 0xCCB9, - 0x5768, 0xDBE7, - 0x5769, 0xDBE1, - 0x576A, 0xC6BA, - 0x576B, 0xDBE3, - 0x576D, 0xDBE8, - 0x576F, 0xC5F7, - 0x5773, 0xDBEA, - 0x5776, 0xDBE9, - 0x5777, 0xBFC0, - 0x577B, 0xDBE6, - 0x577C, 0xDBE5, - 0x5782, 0xB4B9, - 0x5783, 0xC0AC, - 0x5784, 0xC2A2, - 0x5785, 0xDBE2, - 0x5786, 0xDBE4, - 0x578B, 0xD0CD, - 0x578C, 0xDBED, - 0x5792, 0xC0DD, - 0x5793, 0xDBF2, - 0x579B, 0xB6E2, - 0x57A0, 0xDBF3, - 0x57A1, 0xDBD2, - 0x57A2, 0xB9B8, - 0x57A3, 0xD4AB, - 0x57A4, 0xDBEC, - 0x57A6, 0xBFD1, - 0x57A7, 0xDBF0, - 0x57A9, 0xDBD1, - 0x57AB, 0xB5E6, - 0x57AD, 0xDBEB, - 0x57AE, 0xBFE5, - 0x57B2, 0xDBEE, - 0x57B4, 0xDBF1, - 0x57B8, 0xDBF9, - 0x57C2, 0xB9A1, - 0x57C3, 0xB0A3, - 0x57CB, 0xC2F1, - 0x57CE, 0xB3C7, - 0x57CF, 0xDBEF, - 0x57D2, 0xDBF8, - 0x57D4, 0xC6D2, - 0x57D5, 0xDBF4, - 0x57D8, 0xDBF5, - 0x57D9, 0xDBF7, - 0x57DA, 0xDBF6, - 0x57DD, 0xDBFE, - 0x57DF, 0xD3F2, - 0x57E0, 0xB2BA, - 0x57E4, 0xDBFD, - 0x57ED, 0xDCA4, - 0x57EF, 0xDBFB, - 0x57F4, 0xDBFA, - 0x57F8, 0xDBFC, - 0x57F9, 0xC5E0, - 0x57FA, 0xBBF9, - 0x57FD, 0xDCA3, - 0x5800, 0xDCA5, - 0x5802, 0xCCC3, - 0x5806, 0xB6D1, - 0x5807, 0xDDC0, - 0x580B, 0xDCA1, - 0x580D, 0xDCA2, - 0x5811, 0xC7B5, - 0x5815, 0xB6E9, - 0x5819, 0xDCA7, - 0x581E, 0xDCA6, - 0x5820, 0xDCA9, - 0x5821, 0xB1A4, - 0x5824, 0xB5CC, - 0x582A, 0xBFB0, - 0x5830, 0xD1DF, - 0x5835, 0xB6C2, - 0x5844, 0xDCA8, - 0x584C, 0xCBFA, - 0x584D, 0xEBF3, - 0x5851, 0xCBDC, - 0x5854, 0xCBFE, - 0x5858, 0xCCC1, - 0x585E, 0xC8FB, - 0x5865, 0xDCAA, - 0x586B, 0xCCEE, - 0x586C, 0xDCAB, - 0x587E, 0xDBD3, - 0x5880, 0xDCAF, - 0x5881, 0xDCAC, - 0x5883, 0xBEB3, - 0x5885, 0xCAFB, - 0x5889, 0xDCAD, - 0x5892, 0xC9CA, - 0x5893, 0xC4B9, - 0x5899, 0xC7BD, - 0x589A, 0xDCAE, - 0x589E, 0xD4F6, - 0x589F, 0xD0E6, - 0x58A8, 0xC4AB, - 0x58A9, 0xB6D5, - 0x58BC, 0xDBD4, - 0x58C1, 0xB1DA, - 0x58C5, 0xDBD5, - 0x58D1, 0xDBD6, - 0x58D5, 0xBABE, - 0x58E4, 0xC8C0, - 0x58EB, 0xCABF, - 0x58EC, 0xC8C9, - 0x58EE, 0xD7B3, - 0x58F0, 0xC9F9, - 0x58F3, 0xBFC7, - 0x58F6, 0xBAF8, - 0x58F9, 0xD2BC, - 0x5902, 0xE2BA, - 0x5904, 0xB4A6, - 0x5907, 0xB1B8, - 0x590D, 0xB8B4, - 0x590F, 0xCFC4, - 0x5914, 0xD9E7, - 0x5915, 0xCFA6, - 0x5916, 0xCDE2, - 0x5919, 0xD9ED, - 0x591A, 0xB6E0, - 0x591C, 0xD2B9, - 0x591F, 0xB9BB, - 0x5924, 0xE2B9, - 0x5925, 0xE2B7, - 0x5927, 0xB4F3, - 0x5929, 0xCCEC, - 0x592A, 0xCCAB, - 0x592B, 0xB7F2, - 0x592D, 0xD8B2, - 0x592E, 0xD1EB, - 0x592F, 0xBABB, - 0x5931, 0xCAA7, - 0x5934, 0xCDB7, - 0x5937, 0xD2C4, - 0x5938, 0xBFE4, - 0x5939, 0xBCD0, - 0x593A, 0xB6E1, - 0x593C, 0xDEC5, - 0x5941, 0xDEC6, - 0x5942, 0xDBBC, - 0x5944, 0xD1D9, - 0x5947, 0xC6E6, - 0x5948, 0xC4CE, - 0x5949, 0xB7EE, - 0x594B, 0xB7DC, - 0x594E, 0xBFFC, - 0x594F, 0xD7E0, - 0x5951, 0xC6F5, - 0x5954, 0xB1BC, - 0x5955, 0xDEC8, - 0x5956, 0xBDB1, - 0x5957, 0xCCD7, - 0x5958, 0xDECA, - 0x595A, 0xDEC9, - 0x5960, 0xB5EC, - 0x5962, 0xC9DD, - 0x5965, 0xB0C2, - 0x5973, 0xC5AE, - 0x5974, 0xC5AB, - 0x5976, 0xC4CC, - 0x5978, 0xBCE9, - 0x5979, 0xCBFD, - 0x597D, 0xBAC3, - 0x5981, 0xE5F9, - 0x5982, 0xC8E7, - 0x5983, 0xE5FA, - 0x5984, 0xCDFD, - 0x5986, 0xD7B1, - 0x5987, 0xB8BE, - 0x5988, 0xC2E8, - 0x598A, 0xC8D1, - 0x598D, 0xE5FB, - 0x5992, 0xB6CA, - 0x5993, 0xBCCB, - 0x5996, 0xD1FD, - 0x5997, 0xE6A1, - 0x5999, 0xC3EE, - 0x599E, 0xE6A4, - 0x59A3, 0xE5FE, - 0x59A4, 0xE6A5, - 0x59A5, 0xCDD7, - 0x59A8, 0xB7C1, - 0x59A9, 0xE5FC, - 0x59AA, 0xE5FD, - 0x59AB, 0xE6A3, - 0x59AE, 0xC4DD, - 0x59AF, 0xE6A8, - 0x59B2, 0xE6A7, - 0x59B9, 0xC3C3, - 0x59BB, 0xC6DE, - 0x59BE, 0xE6AA, - 0x59C6, 0xC4B7, - 0x59CA, 0xE6A2, - 0x59CB, 0xCABC, - 0x59D0, 0xBDE3, - 0x59D1, 0xB9C3, - 0x59D2, 0xE6A6, - 0x59D3, 0xD0D5, - 0x59D4, 0xCEAF, - 0x59D7, 0xE6A9, - 0x59D8, 0xE6B0, - 0x59DA, 0xD2A6, - 0x59DC, 0xBDAA, - 0x59DD, 0xE6AD, - 0x59E3, 0xE6AF, - 0x59E5, 0xC0D1, - 0x59E8, 0xD2CC, - 0x59EC, 0xBCA7, - 0x59F9, 0xE6B1, - 0x59FB, 0xD2F6, - 0x59FF, 0xD7CB, - 0x5A01, 0xCDFE, - 0x5A03, 0xCDDE, - 0x5A04, 0xC2A6, - 0x5A05, 0xE6AB, - 0x5A06, 0xE6AC, - 0x5A07, 0xBDBF, - 0x5A08, 0xE6AE, - 0x5A09, 0xE6B3, - 0x5A0C, 0xE6B2, - 0x5A11, 0xE6B6, - 0x5A13, 0xE6B8, - 0x5A18, 0xC4EF, - 0x5A1C, 0xC4C8, - 0x5A1F, 0xBEEA, - 0x5A20, 0xC9EF, - 0x5A23, 0xE6B7, - 0x5A25, 0xB6F0, - 0x5A29, 0xC3E4, - 0x5A31, 0xD3E9, - 0x5A32, 0xE6B4, - 0x5A34, 0xE6B5, - 0x5A36, 0xC8A2, - 0x5A3C, 0xE6BD, - 0x5A40, 0xE6B9, - 0x5A46, 0xC6C5, - 0x5A49, 0xCDF1, - 0x5A4A, 0xE6BB, - 0x5A55, 0xE6BC, - 0x5A5A, 0xBBE9, - 0x5A62, 0xE6BE, - 0x5A67, 0xE6BA, - 0x5A6A, 0xC0B7, - 0x5A74, 0xD3A4, - 0x5A75, 0xE6BF, - 0x5A76, 0xC9F4, - 0x5A77, 0xE6C3, - 0x5A7A, 0xE6C4, - 0x5A7F, 0xD0F6, - 0x5A92, 0xC3BD, - 0x5A9A, 0xC3C4, - 0x5A9B, 0xE6C2, - 0x5AAA, 0xE6C1, - 0x5AB2, 0xE6C7, - 0x5AB3, 0xCFB1, - 0x5AB5, 0xEBF4, - 0x5AB8, 0xE6CA, - 0x5ABE, 0xE6C5, - 0x5AC1, 0xBCDE, - 0x5AC2, 0xC9A9, - 0x5AC9, 0xBCB5, - 0x5ACC, 0xCFD3, - 0x5AD2, 0xE6C8, - 0x5AD4, 0xE6C9, - 0x5AD6, 0xE6CE, - 0x5AD8, 0xE6D0, - 0x5ADC, 0xE6D1, - 0x5AE0, 0xE6CB, - 0x5AE1, 0xB5D5, - 0x5AE3, 0xE6CC, - 0x5AE6, 0xE6CF, - 0x5AE9, 0xC4DB, - 0x5AEB, 0xE6C6, - 0x5AF1, 0xE6CD, - 0x5B09, 0xE6D2, - 0x5B16, 0xE6D4, - 0x5B17, 0xE6D3, - 0x5B32, 0xE6D5, - 0x5B34, 0xD9F8, - 0x5B37, 0xE6D6, - 0x5B40, 0xE6D7, - 0x5B50, 0xD7D3, - 0x5B51, 0xE6DD, - 0x5B53, 0xE6DE, - 0x5B54, 0xBFD7, - 0x5B55, 0xD4D0, - 0x5B57, 0xD7D6, - 0x5B58, 0xB4E6, - 0x5B59, 0xCBEF, - 0x5B5A, 0xE6DA, - 0x5B5B, 0xD8C3, - 0x5B5C, 0xD7CE, - 0x5B5D, 0xD0A2, - 0x5B5F, 0xC3CF, - 0x5B62, 0xE6DF, - 0x5B63, 0xBCBE, - 0x5B64, 0xB9C2, - 0x5B65, 0xE6DB, - 0x5B66, 0xD1A7, - 0x5B69, 0xBAA2, - 0x5B6A, 0xC2CF, - 0x5B6C, 0xD8AB, - 0x5B70, 0xCAEB, - 0x5B71, 0xE5EE, - 0x5B73, 0xE6DC, - 0x5B75, 0xB7F5, - 0x5B7A, 0xC8E6, - 0x5B7D, 0xC4F5, - 0x5B80, 0xE5B2, - 0x5B81, 0xC4FE, - 0x5B83, 0xCBFC, - 0x5B84, 0xE5B3, - 0x5B85, 0xD5AC, - 0x5B87, 0xD3EE, - 0x5B88, 0xCAD8, - 0x5B89, 0xB0B2, - 0x5B8B, 0xCBCE, - 0x5B8C, 0xCDEA, - 0x5B8F, 0xBAEA, - 0x5B93, 0xE5B5, - 0x5B95, 0xE5B4, - 0x5B97, 0xD7DA, - 0x5B98, 0xB9D9, - 0x5B99, 0xD6E6, - 0x5B9A, 0xB6A8, - 0x5B9B, 0xCDF0, - 0x5B9C, 0xD2CB, - 0x5B9D, 0xB1A6, - 0x5B9E, 0xCAB5, - 0x5BA0, 0xB3E8, - 0x5BA1, 0xC9F3, - 0x5BA2, 0xBFCD, - 0x5BA3, 0xD0FB, - 0x5BA4, 0xCAD2, - 0x5BA5, 0xE5B6, - 0x5BA6, 0xBBC2, - 0x5BAA, 0xCFDC, - 0x5BAB, 0xB9AC, - 0x5BB0, 0xD4D7, - 0x5BB3, 0xBAA6, - 0x5BB4, 0xD1E7, - 0x5BB5, 0xCFFC, - 0x5BB6, 0xBCD2, - 0x5BB8, 0xE5B7, - 0x5BB9, 0xC8DD, - 0x5BBD, 0xBFED, - 0x5BBE, 0xB1F6, - 0x5BBF, 0xCBDE, - 0x5BC2, 0xBCC5, - 0x5BC4, 0xBCC4, - 0x5BC5, 0xD2FA, - 0x5BC6, 0xC3DC, - 0x5BC7, 0xBFDC, - 0x5BCC, 0xB8BB, - 0x5BD0, 0xC3C2, - 0x5BD2, 0xBAAE, - 0x5BD3, 0xD4A2, - 0x5BDD, 0xC7DE, - 0x5BDE, 0xC4AF, - 0x5BDF, 0xB2EC, - 0x5BE1, 0xB9D1, - 0x5BE4, 0xE5BB, - 0x5BE5, 0xC1C8, - 0x5BE8, 0xD5AF, - 0x5BEE, 0xE5BC, - 0x5BF0, 0xE5BE, - 0x5BF8, 0xB4E7, - 0x5BF9, 0xB6D4, - 0x5BFA, 0xCBC2, - 0x5BFB, 0xD1B0, - 0x5BFC, 0xB5BC, - 0x5BFF, 0xCAD9, - 0x5C01, 0xB7E2, - 0x5C04, 0xC9E4, - 0x5C06, 0xBDAB, - 0x5C09, 0xCEBE, - 0x5C0A, 0xD7F0, - 0x5C0F, 0xD0A1, - 0x5C11, 0xC9D9, - 0x5C14, 0xB6FB, - 0x5C15, 0xE6D8, - 0x5C16, 0xBCE2, - 0x5C18, 0xB3BE, - 0x5C1A, 0xC9D0, - 0x5C1C, 0xE6D9, - 0x5C1D, 0xB3A2, - 0x5C22, 0xDECC, - 0x5C24, 0xD3C8, - 0x5C25, 0xDECD, - 0x5C27, 0xD2A2, - 0x5C2C, 0xDECE, - 0x5C31, 0xBECD, - 0x5C34, 0xDECF, - 0x5C38, 0xCAAC, - 0x5C39, 0xD2FC, - 0x5C3A, 0xB3DF, - 0x5C3B, 0xE5EA, - 0x5C3C, 0xC4E1, - 0x5C3D, 0xBEA1, - 0x5C3E, 0xCEB2, - 0x5C3F, 0xC4F2, - 0x5C40, 0xBED6, - 0x5C41, 0xC6A8, - 0x5C42, 0xB2E3, - 0x5C45, 0xBED3, - 0x5C48, 0xC7FC, - 0x5C49, 0xCCEB, - 0x5C4A, 0xBDEC, - 0x5C4B, 0xCEDD, - 0x5C4E, 0xCABA, - 0x5C4F, 0xC6C1, - 0x5C50, 0xE5EC, - 0x5C51, 0xD0BC, - 0x5C55, 0xD5B9, - 0x5C59, 0xE5ED, - 0x5C5E, 0xCAF4, - 0x5C60, 0xCDC0, - 0x5C61, 0xC2C5, - 0x5C63, 0xE5EF, - 0x5C65, 0xC2C4, - 0x5C66, 0xE5F0, - 0x5C6E, 0xE5F8, - 0x5C6F, 0xCDCD, - 0x5C71, 0xC9BD, - 0x5C79, 0xD2D9, - 0x5C7A, 0xE1A8, - 0x5C7F, 0xD3EC, - 0x5C81, 0xCBEA, - 0x5C82, 0xC6F1, - 0x5C88, 0xE1AC, - 0x5C8C, 0xE1A7, - 0x5C8D, 0xE1A9, - 0x5C90, 0xE1AA, - 0x5C91, 0xE1AF, - 0x5C94, 0xB2ED, - 0x5C96, 0xE1AB, - 0x5C97, 0xB8DA, - 0x5C98, 0xE1AD, - 0x5C99, 0xE1AE, - 0x5C9A, 0xE1B0, - 0x5C9B, 0xB5BA, - 0x5C9C, 0xE1B1, - 0x5CA2, 0xE1B3, - 0x5CA3, 0xE1B8, - 0x5CA9, 0xD1D2, - 0x5CAB, 0xE1B6, - 0x5CAC, 0xE1B5, - 0x5CAD, 0xC1EB, - 0x5CB1, 0xE1B7, - 0x5CB3, 0xD4C0, - 0x5CB5, 0xE1B2, - 0x5CB7, 0xE1BA, - 0x5CB8, 0xB0B6, - 0x5CBD, 0xE1B4, - 0x5CBF, 0xBFF9, - 0x5CC1, 0xE1B9, - 0x5CC4, 0xE1BB, - 0x5CCB, 0xE1BE, - 0x5CD2, 0xE1BC, - 0x5CD9, 0xD6C5, - 0x5CE1, 0xCFBF, - 0x5CE4, 0xE1BD, - 0x5CE5, 0xE1BF, - 0x5CE6, 0xC2CD, - 0x5CE8, 0xB6EB, - 0x5CEA, 0xD3F8, - 0x5CED, 0xC7CD, - 0x5CF0, 0xB7E5, - 0x5CFB, 0xBEFE, - 0x5D02, 0xE1C0, - 0x5D03, 0xE1C1, - 0x5D06, 0xE1C7, - 0x5D07, 0xB3E7, - 0x5D0E, 0xC6E9, - 0x5D14, 0xB4DE, - 0x5D16, 0xD1C2, - 0x5D1B, 0xE1C8, - 0x5D1E, 0xE1C6, - 0x5D24, 0xE1C5, - 0x5D26, 0xE1C3, - 0x5D27, 0xE1C2, - 0x5D29, 0xB1C0, - 0x5D2D, 0xD5B8, - 0x5D2E, 0xE1C4, - 0x5D34, 0xE1CB, - 0x5D3D, 0xE1CC, - 0x5D3E, 0xE1CA, - 0x5D47, 0xEFFA, - 0x5D4A, 0xE1D3, - 0x5D4B, 0xE1D2, - 0x5D4C, 0xC7B6, - 0x5D58, 0xE1C9, - 0x5D5B, 0xE1CE, - 0x5D5D, 0xE1D0, - 0x5D69, 0xE1D4, - 0x5D6B, 0xE1D1, - 0x5D6C, 0xE1CD, - 0x5D6F, 0xE1CF, - 0x5D74, 0xE1D5, - 0x5D82, 0xE1D6, - 0x5D99, 0xE1D7, - 0x5D9D, 0xE1D8, - 0x5DB7, 0xE1DA, - 0x5DC5, 0xE1DB, - 0x5DCD, 0xCEA1, - 0x5DDB, 0xE7DD, - 0x5DDD, 0xB4A8, - 0x5DDE, 0xD6DD, - 0x5DE1, 0xD1B2, - 0x5DE2, 0xB3B2, - 0x5DE5, 0xB9A4, - 0x5DE6, 0xD7F3, - 0x5DE7, 0xC7C9, - 0x5DE8, 0xBEDE, - 0x5DE9, 0xB9AE, - 0x5DEB, 0xCED7, - 0x5DEE, 0xB2EE, - 0x5DEF, 0xDBCF, - 0x5DF1, 0xBCBA, - 0x5DF2, 0xD2D1, - 0x5DF3, 0xCBC8, - 0x5DF4, 0xB0CD, - 0x5DF7, 0xCFEF, - 0x5DFD, 0xD9E3, - 0x5DFE, 0xBDED, - 0x5E01, 0xB1D2, - 0x5E02, 0xCAD0, - 0x5E03, 0xB2BC, - 0x5E05, 0xCBA7, - 0x5E06, 0xB7AB, - 0x5E08, 0xCAA6, - 0x5E0C, 0xCFA3, - 0x5E0F, 0xE0F8, - 0x5E10, 0xD5CA, - 0x5E11, 0xE0FB, - 0x5E14, 0xE0FA, - 0x5E15, 0xC5C1, - 0x5E16, 0xCCFB, - 0x5E18, 0xC1B1, - 0x5E19, 0xE0F9, - 0x5E1A, 0xD6E3, - 0x5E1B, 0xB2AF, - 0x5E1C, 0xD6C4, - 0x5E1D, 0xB5DB, - 0x5E26, 0xB4F8, - 0x5E27, 0xD6A1, - 0x5E2D, 0xCFAF, - 0x5E2E, 0xB0EF, - 0x5E31, 0xE0FC, - 0x5E37, 0xE1A1, - 0x5E38, 0xB3A3, - 0x5E3B, 0xE0FD, - 0x5E3C, 0xE0FE, - 0x5E3D, 0xC3B1, - 0x5E42, 0xC3DD, - 0x5E44, 0xE1A2, - 0x5E45, 0xB7F9, - 0x5E4C, 0xBBCF, - 0x5E54, 0xE1A3, - 0x5E55, 0xC4BB, - 0x5E5B, 0xE1A4, - 0x5E5E, 0xE1A5, - 0x5E61, 0xE1A6, - 0x5E62, 0xB4B1, - 0x5E72, 0xB8C9, - 0x5E73, 0xC6BD, - 0x5E74, 0xC4EA, - 0x5E76, 0xB2A2, - 0x5E78, 0xD0D2, - 0x5E7A, 0xE7DB, - 0x5E7B, 0xBBC3, - 0x5E7C, 0xD3D7, - 0x5E7D, 0xD3C4, - 0x5E7F, 0xB9E3, - 0x5E80, 0xE2CF, - 0x5E84, 0xD7AF, - 0x5E86, 0xC7EC, - 0x5E87, 0xB1D3, - 0x5E8A, 0xB4B2, - 0x5E8B, 0xE2D1, - 0x5E8F, 0xD0F2, - 0x5E90, 0xC2AE, - 0x5E91, 0xE2D0, - 0x5E93, 0xBFE2, - 0x5E94, 0xD3A6, - 0x5E95, 0xB5D7, - 0x5E96, 0xE2D2, - 0x5E97, 0xB5EA, - 0x5E99, 0xC3ED, - 0x5E9A, 0xB8FD, - 0x5E9C, 0xB8AE, - 0x5E9E, 0xC5D3, - 0x5E9F, 0xB7CF, - 0x5EA0, 0xE2D4, - 0x5EA5, 0xE2D3, - 0x5EA6, 0xB6C8, - 0x5EA7, 0xD7F9, - 0x5EAD, 0xCDA5, - 0x5EB3, 0xE2D8, - 0x5EB5, 0xE2D6, - 0x5EB6, 0xCAFC, - 0x5EB7, 0xBFB5, - 0x5EB8, 0xD3B9, - 0x5EB9, 0xE2D5, - 0x5EBE, 0xE2D7, - 0x5EC9, 0xC1AE, - 0x5ECA, 0xC0C8, - 0x5ED1, 0xE2DB, - 0x5ED2, 0xE2DA, - 0x5ED3, 0xC0AA, - 0x5ED6, 0xC1CE, - 0x5EDB, 0xE2DC, - 0x5EE8, 0xE2DD, - 0x5EEA, 0xE2DE, - 0x5EF4, 0xDBC8, - 0x5EF6, 0xD1D3, - 0x5EF7, 0xCDA2, - 0x5EFA, 0xBDA8, - 0x5EFE, 0xDEC3, - 0x5EFF, 0xD8A5, - 0x5F00, 0xBFAA, - 0x5F01, 0xDBCD, - 0x5F02, 0xD2EC, - 0x5F03, 0xC6FA, - 0x5F04, 0xC5AA, - 0x5F08, 0xDEC4, - 0x5F0A, 0xB1D7, - 0x5F0B, 0xDFAE, - 0x5F0F, 0xCABD, - 0x5F11, 0xDFB1, - 0x5F13, 0xB9AD, - 0x5F15, 0xD2FD, - 0x5F17, 0xB8A5, - 0x5F18, 0xBAEB, - 0x5F1B, 0xB3DA, - 0x5F1F, 0xB5DC, - 0x5F20, 0xD5C5, - 0x5F25, 0xC3D6, - 0x5F26, 0xCFD2, - 0x5F27, 0xBBA1, - 0x5F29, 0xE5F3, - 0x5F2A, 0xE5F2, - 0x5F2D, 0xE5F4, - 0x5F2F, 0xCDE4, - 0x5F31, 0xC8F5, - 0x5F39, 0xB5AF, - 0x5F3A, 0xC7BF, - 0x5F3C, 0xE5F6, - 0x5F40, 0xECB0, - 0x5F50, 0xE5E6, - 0x5F52, 0xB9E9, - 0x5F53, 0xB5B1, - 0x5F55, 0xC2BC, - 0x5F56, 0xE5E8, - 0x5F57, 0xE5E7, - 0x5F58, 0xE5E9, - 0x5F5D, 0xD2CD, - 0x5F61, 0xE1EA, - 0x5F62, 0xD0CE, - 0x5F64, 0xCDAE, - 0x5F66, 0xD1E5, - 0x5F69, 0xB2CA, - 0x5F6A, 0xB1EB, - 0x5F6C, 0xB1F2, - 0x5F6D, 0xC5ED, - 0x5F70, 0xD5C3, - 0x5F71, 0xD3B0, - 0x5F73, 0xE1DC, - 0x5F77, 0xE1DD, - 0x5F79, 0xD2DB, - 0x5F7B, 0xB3B9, - 0x5F7C, 0xB1CB, - 0x5F80, 0xCDF9, - 0x5F81, 0xD5F7, - 0x5F82, 0xE1DE, - 0x5F84, 0xBEB6, - 0x5F85, 0xB4FD, - 0x5F87, 0xE1DF, - 0x5F88, 0xBADC, - 0x5F89, 0xE1E0, - 0x5F8A, 0xBBB2, - 0x5F8B, 0xC2C9, - 0x5F8C, 0xE1E1, - 0x5F90, 0xD0EC, - 0x5F92, 0xCDBD, - 0x5F95, 0xE1E2, - 0x5F97, 0xB5C3, - 0x5F98, 0xC5C7, - 0x5F99, 0xE1E3, - 0x5F9C, 0xE1E4, - 0x5FA1, 0xD3F9, - 0x5FA8, 0xE1E5, - 0x5FAA, 0xD1AD, - 0x5FAD, 0xE1E6, - 0x5FAE, 0xCEA2, - 0x5FB5, 0xE1E7, - 0x5FB7, 0xB5C2, - 0x5FBC, 0xE1E8, - 0x5FBD, 0xBBD5, - 0x5FC3, 0xD0C4, - 0x5FC4, 0xE2E0, - 0x5FC5, 0xB1D8, - 0x5FC6, 0xD2E4, - 0x5FC9, 0xE2E1, - 0x5FCC, 0xBCC9, - 0x5FCD, 0xC8CC, - 0x5FCF, 0xE2E3, - 0x5FD0, 0xECFE, - 0x5FD1, 0xECFD, - 0x5FD2, 0xDFAF, - 0x5FD6, 0xE2E2, - 0x5FD7, 0xD6BE, - 0x5FD8, 0xCDFC, - 0x5FD9, 0xC3A6, - 0x5FDD, 0xE3C3, - 0x5FE0, 0xD6D2, - 0x5FE1, 0xE2E7, - 0x5FE4, 0xE2E8, - 0x5FE7, 0xD3C7, - 0x5FEA, 0xE2EC, - 0x5FEB, 0xBFEC, - 0x5FED, 0xE2ED, - 0x5FEE, 0xE2E5, - 0x5FF1, 0xB3C0, - 0x5FF5, 0xC4EE, - 0x5FF8, 0xE2EE, - 0x5FFB, 0xD0C3, - 0x5FFD, 0xBAF6, - 0x5FFE, 0xE2E9, - 0x5FFF, 0xB7DE, - 0x6000, 0xBBB3, - 0x6001, 0xCCAC, - 0x6002, 0xCBCB, - 0x6003, 0xE2E4, - 0x6004, 0xE2E6, - 0x6005, 0xE2EA, - 0x6006, 0xE2EB, - 0x600A, 0xE2F7, - 0x600D, 0xE2F4, - 0x600E, 0xD4F5, - 0x600F, 0xE2F3, - 0x6012, 0xC5AD, - 0x6014, 0xD5FA, - 0x6015, 0xC5C2, - 0x6016, 0xB2C0, - 0x6019, 0xE2EF, - 0x601B, 0xE2F2, - 0x601C, 0xC1AF, - 0x601D, 0xCBBC, - 0x6020, 0xB5A1, - 0x6021, 0xE2F9, - 0x6025, 0xBCB1, - 0x6026, 0xE2F1, - 0x6027, 0xD0D4, - 0x6028, 0xD4B9, - 0x6029, 0xE2F5, - 0x602A, 0xB9D6, - 0x602B, 0xE2F6, - 0x602F, 0xC7D3, - 0x6035, 0xE2F0, - 0x603B, 0xD7DC, - 0x603C, 0xEDA1, - 0x603F, 0xE2F8, - 0x6041, 0xEDA5, - 0x6042, 0xE2FE, - 0x6043, 0xCAD1, - 0x604B, 0xC1B5, - 0x604D, 0xBBD0, - 0x6050, 0xBFD6, - 0x6052, 0xBAE3, - 0x6055, 0xCBA1, - 0x6059, 0xEDA6, - 0x605A, 0xEDA3, - 0x605D, 0xEDA2, - 0x6062, 0xBBD6, - 0x6063, 0xEDA7, - 0x6064, 0xD0F4, - 0x6067, 0xEDA4, - 0x6068, 0xBADE, - 0x6069, 0xB6F7, - 0x606A, 0xE3A1, - 0x606B, 0xB6B2, - 0x606C, 0xCCF1, - 0x606D, 0xB9A7, - 0x606F, 0xCFA2, - 0x6070, 0xC7A1, - 0x6073, 0xBFD2, - 0x6076, 0xB6F1, - 0x6078, 0xE2FA, - 0x6079, 0xE2FB, - 0x607A, 0xE2FD, - 0x607B, 0xE2FC, - 0x607C, 0xC4D5, - 0x607D, 0xE3A2, - 0x607F, 0xD3C1, - 0x6083, 0xE3A7, - 0x6084, 0xC7C4, - 0x6089, 0xCFA4, - 0x608C, 0xE3A9, - 0x608D, 0xBAB7, - 0x6092, 0xE3A8, - 0x6094, 0xBBDA, - 0x6096, 0xE3A3, - 0x609A, 0xE3A4, - 0x609B, 0xE3AA, - 0x609D, 0xE3A6, - 0x609F, 0xCEF2, - 0x60A0, 0xD3C6, - 0x60A3, 0xBBBC, - 0x60A6, 0xD4C3, - 0x60A8, 0xC4FA, - 0x60AB, 0xEDA8, - 0x60AC, 0xD0FC, - 0x60AD, 0xE3A5, - 0x60AF, 0xC3F5, - 0x60B1, 0xE3AD, - 0x60B2, 0xB1AF, - 0x60B4, 0xE3B2, - 0x60B8, 0xBCC2, - 0x60BB, 0xE3AC, - 0x60BC, 0xB5BF, - 0x60C5, 0xC7E9, - 0x60C6, 0xE3B0, - 0x60CA, 0xBEAA, - 0x60CB, 0xCDEF, - 0x60D1, 0xBBF3, - 0x60D5, 0xCCE8, - 0x60D8, 0xE3AF, - 0x60DA, 0xE3B1, - 0x60DC, 0xCFA7, - 0x60DD, 0xE3AE, - 0x60DF, 0xCEA9, - 0x60E0, 0xBBDD, - 0x60E6, 0xB5EB, - 0x60E7, 0xBEE5, - 0x60E8, 0xB2D2, - 0x60E9, 0xB3CD, - 0x60EB, 0xB1B9, - 0x60EC, 0xE3AB, - 0x60ED, 0xB2D1, - 0x60EE, 0xB5AC, - 0x60EF, 0xB9DF, - 0x60F0, 0xB6E8, - 0x60F3, 0xCFEB, - 0x60F4, 0xE3B7, - 0x60F6, 0xBBCC, - 0x60F9, 0xC8C7, - 0x60FA, 0xD0CA, - 0x6100, 0xE3B8, - 0x6101, 0xB3EE, - 0x6106, 0xEDA9, - 0x6108, 0xD3FA, - 0x6109, 0xD3E4, - 0x610D, 0xEDAA, - 0x610E, 0xE3B9, - 0x610F, 0xD2E2, - 0x6115, 0xE3B5, - 0x611A, 0xD3DE, - 0x611F, 0xB8D0, - 0x6120, 0xE3B3, - 0x6123, 0xE3B6, - 0x6124, 0xB7DF, - 0x6126, 0xE3B4, - 0x6127, 0xC0A2, - 0x612B, 0xE3BA, - 0x613F, 0xD4B8, - 0x6148, 0xB4C8, - 0x614A, 0xE3BB, - 0x614C, 0xBBC5, - 0x614E, 0xC9F7, - 0x6151, 0xC9E5, - 0x6155, 0xC4BD, - 0x615D, 0xEDAB, - 0x6162, 0xC2FD, - 0x6167, 0xBBDB, - 0x6168, 0xBFAE, - 0x6170, 0xCEBF, - 0x6175, 0xE3BC, - 0x6177, 0xBFB6, - 0x618B, 0xB1EF, - 0x618E, 0xD4F7, - 0x6194, 0xE3BE, - 0x619D, 0xEDAD, - 0x61A7, 0xE3BF, - 0x61A8, 0xBAA9, - 0x61A9, 0xEDAC, - 0x61AC, 0xE3BD, - 0x61B7, 0xE3C0, - 0x61BE, 0xBAB6, - 0x61C2, 0xB6AE, - 0x61C8, 0xD0B8, - 0x61CA, 0xB0C3, - 0x61CB, 0xEDAE, - 0x61D1, 0xEDAF, - 0x61D2, 0xC0C1, - 0x61D4, 0xE3C1, - 0x61E6, 0xC5B3, - 0x61F5, 0xE3C2, - 0x61FF, 0xDCB2, - 0x6206, 0xEDB0, - 0x6208, 0xB8EA, - 0x620A, 0xCEEC, - 0x620B, 0xEAA7, - 0x620C, 0xD0E7, - 0x620D, 0xCAF9, - 0x620E, 0xC8D6, - 0x620F, 0xCFB7, - 0x6210, 0xB3C9, - 0x6211, 0xCED2, - 0x6212, 0xBDE4, - 0x6215, 0xE3DE, - 0x6216, 0xBBF2, - 0x6217, 0xEAA8, - 0x6218, 0xD5BD, - 0x621A, 0xC6DD, - 0x621B, 0xEAA9, - 0x621F, 0xEAAA, - 0x6221, 0xEAAC, - 0x6222, 0xEAAB, - 0x6224, 0xEAAE, - 0x6225, 0xEAAD, - 0x622A, 0xBDD8, - 0x622C, 0xEAAF, - 0x622E, 0xC2BE, - 0x6233, 0xB4C1, - 0x6234, 0xB4F7, - 0x6237, 0xBBA7, - 0x623D, 0xECE6, - 0x623E, 0xECE5, - 0x623F, 0xB7BF, - 0x6240, 0xCBF9, - 0x6241, 0xB1E2, - 0x6243, 0xECE7, - 0x6247, 0xC9C8, - 0x6248, 0xECE8, - 0x6249, 0xECE9, - 0x624B, 0xCAD6, - 0x624C, 0xDED0, - 0x624D, 0xB2C5, - 0x624E, 0xD4FA, - 0x6251, 0xC6CB, - 0x6252, 0xB0C7, - 0x6253, 0xB4F2, - 0x6254, 0xC8D3, - 0x6258, 0xCDD0, - 0x625B, 0xBFB8, - 0x6263, 0xBFDB, - 0x6266, 0xC7A4, - 0x6267, 0xD6B4, - 0x6269, 0xC0A9, - 0x626A, 0xDED1, - 0x626B, 0xC9A8, - 0x626C, 0xD1EF, - 0x626D, 0xC5A4, - 0x626E, 0xB0E7, - 0x626F, 0xB3B6, - 0x6270, 0xC8C5, - 0x6273, 0xB0E2, - 0x6276, 0xB7F6, - 0x6279, 0xC5FA, - 0x627C, 0xB6F3, - 0x627E, 0xD5D2, - 0x627F, 0xB3D0, - 0x6280, 0xBCBC, - 0x6284, 0xB3AD, - 0x6289, 0xBEF1, - 0x628A, 0xB0D1, - 0x6291, 0xD2D6, - 0x6292, 0xCAE3, - 0x6293, 0xD7A5, - 0x6295, 0xCDB6, - 0x6296, 0xB6B6, - 0x6297, 0xBFB9, - 0x6298, 0xD5DB, - 0x629A, 0xB8A7, - 0x629B, 0xC5D7, - 0x629F, 0xDED2, - 0x62A0, 0xBFD9, - 0x62A1, 0xC2D5, - 0x62A2, 0xC7C0, - 0x62A4, 0xBBA4, - 0x62A5, 0xB1A8, - 0x62A8, 0xC5EA, - 0x62AB, 0xC5FB, - 0x62AC, 0xCCA7, - 0x62B1, 0xB1A7, - 0x62B5, 0xB5D6, - 0x62B9, 0xC4A8, - 0x62BB, 0xDED3, - 0x62BC, 0xD1BA, - 0x62BD, 0xB3E9, - 0x62BF, 0xC3F2, - 0x62C2, 0xB7F7, - 0x62C4, 0xD6F4, - 0x62C5, 0xB5A3, - 0x62C6, 0xB2F0, - 0x62C7, 0xC4B4, - 0x62C8, 0xC4E9, - 0x62C9, 0xC0AD, - 0x62CA, 0xDED4, - 0x62CC, 0xB0E8, - 0x62CD, 0xC5C4, - 0x62CE, 0xC1E0, - 0x62D0, 0xB9D5, - 0x62D2, 0xBEDC, - 0x62D3, 0xCDD8, - 0x62D4, 0xB0CE, - 0x62D6, 0xCDCF, - 0x62D7, 0xDED6, - 0x62D8, 0xBED0, - 0x62D9, 0xD7BE, - 0x62DA, 0xDED5, - 0x62DB, 0xD5D0, - 0x62DC, 0xB0DD, - 0x62DF, 0xC4E2, - 0x62E2, 0xC2A3, - 0x62E3, 0xBCF0, - 0x62E5, 0xD3B5, - 0x62E6, 0xC0B9, - 0x62E7, 0xC5A1, - 0x62E8, 0xB2A6, - 0x62E9, 0xD4F1, - 0x62EC, 0xC0A8, - 0x62ED, 0xCAC3, - 0x62EE, 0xDED7, - 0x62EF, 0xD5FC, - 0x62F1, 0xB9B0, - 0x62F3, 0xC8AD, - 0x62F4, 0xCBA9, - 0x62F6, 0xDED9, - 0x62F7, 0xBFBD, - 0x62FC, 0xC6B4, - 0x62FD, 0xD7A7, - 0x62FE, 0xCAB0, - 0x62FF, 0xC4C3, - 0x6301, 0xB3D6, - 0x6302, 0xB9D2, - 0x6307, 0xD6B8, - 0x6308, 0xEAFC, - 0x6309, 0xB0B4, - 0x630E, 0xBFE6, - 0x6311, 0xCCF4, - 0x6316, 0xCDDA, - 0x631A, 0xD6BF, - 0x631B, 0xC2CE, - 0x631D, 0xCECE, - 0x631E, 0xCCA2, - 0x631F, 0xD0AE, - 0x6320, 0xC4D3, - 0x6321, 0xB5B2, - 0x6322, 0xDED8, - 0x6323, 0xD5F5, - 0x6324, 0xBCB7, - 0x6325, 0xBBD3, - 0x6328, 0xB0A4, - 0x632A, 0xC5B2, - 0x632B, 0xB4EC, - 0x632F, 0xD5F1, - 0x6332, 0xEAFD, - 0x6339, 0xDEDA, - 0x633A, 0xCDA6, - 0x633D, 0xCDEC, - 0x6342, 0xCEE6, - 0x6343, 0xDEDC, - 0x6345, 0xCDB1, - 0x6346, 0xC0A6, - 0x6349, 0xD7BD, - 0x634B, 0xDEDB, - 0x634C, 0xB0C6, - 0x634D, 0xBAB4, - 0x634E, 0xC9D3, - 0x634F, 0xC4F3, - 0x6350, 0xBEE8, - 0x6355, 0xB2B6, - 0x635E, 0xC0CC, - 0x635F, 0xCBF0, - 0x6361, 0xBCF1, - 0x6362, 0xBBBB, - 0x6363, 0xB5B7, - 0x6367, 0xC5F5, - 0x6369, 0xDEE6, - 0x636D, 0xDEE3, - 0x636E, 0xBEDD, - 0x6371, 0xDEDF, - 0x6376, 0xB4B7, - 0x6377, 0xBDDD, - 0x637A, 0xDEE0, - 0x637B, 0xC4ED, - 0x6380, 0xCFC6, - 0x6382, 0xB5E0, - 0x6387, 0xB6DE, - 0x6388, 0xCADA, - 0x6389, 0xB5F4, - 0x638A, 0xDEE5, - 0x638C, 0xD5C6, - 0x638E, 0xDEE1, - 0x638F, 0xCCCD, - 0x6390, 0xC6FE, - 0x6392, 0xC5C5, - 0x6396, 0xD2B4, - 0x6398, 0xBEF2, - 0x63A0, 0xC2D3, - 0x63A2, 0xCCBD, - 0x63A3, 0xB3B8, - 0x63A5, 0xBDD3, - 0x63A7, 0xBFD8, - 0x63A8, 0xCDC6, - 0x63A9, 0xD1DA, - 0x63AA, 0xB4EB, - 0x63AC, 0xDEE4, - 0x63AD, 0xDEDD, - 0x63AE, 0xDEE7, - 0x63B0, 0xEAFE, - 0x63B3, 0xC2B0, - 0x63B4, 0xDEE2, - 0x63B7, 0xD6C0, - 0x63B8, 0xB5A7, - 0x63BA, 0xB2F4, - 0x63BC, 0xDEE8, - 0x63BE, 0xDEF2, - 0x63C4, 0xDEED, - 0x63C6, 0xDEF1, - 0x63C9, 0xC8E0, - 0x63CD, 0xD7E1, - 0x63CE, 0xDEEF, - 0x63CF, 0xC3E8, - 0x63D0, 0xCCE1, - 0x63D2, 0xB2E5, - 0x63D6, 0xD2BE, - 0x63DE, 0xDEEE, - 0x63E0, 0xDEEB, - 0x63E1, 0xCED5, - 0x63E3, 0xB4A7, - 0x63E9, 0xBFAB, - 0x63EA, 0xBEBE, - 0x63ED, 0xBDD2, - 0x63F2, 0xDEE9, - 0x63F4, 0xD4AE, - 0x63F6, 0xDEDE, - 0x63F8, 0xDEEA, - 0x63FD, 0xC0BF, - 0x63FF, 0xDEEC, - 0x6400, 0xB2F3, - 0x6401, 0xB8E9, - 0x6402, 0xC2A7, - 0x6405, 0xBDC1, - 0x640B, 0xDEF5, - 0x640C, 0xDEF8, - 0x640F, 0xB2AB, - 0x6410, 0xB4A4, - 0x6413, 0xB4EA, - 0x6414, 0xC9A6, - 0x641B, 0xDEF6, - 0x641C, 0xCBD1, - 0x641E, 0xB8E3, - 0x6420, 0xDEF7, - 0x6421, 0xDEFA, - 0x6426, 0xDEF9, - 0x642A, 0xCCC2, - 0x642C, 0xB0E1, - 0x642D, 0xB4EE, - 0x6434, 0xE5BA, - 0x643A, 0xD0AF, - 0x643D, 0xB2EB, - 0x643F, 0xEBA1, - 0x6441, 0xDEF4, - 0x6444, 0xC9E3, - 0x6445, 0xDEF3, - 0x6446, 0xB0DA, - 0x6447, 0xD2A1, - 0x6448, 0xB1F7, - 0x644A, 0xCCAF, - 0x6452, 0xDEF0, - 0x6454, 0xCBA4, - 0x6458, 0xD5AA, - 0x645E, 0xDEFB, - 0x6467, 0xB4DD, - 0x6469, 0xC4A6, - 0x646D, 0xDEFD, - 0x6478, 0xC3FE, - 0x6479, 0xC4A1, - 0x647A, 0xDFA1, - 0x6482, 0xC1CC, - 0x6484, 0xDEFC, - 0x6485, 0xBEEF, - 0x6487, 0xC6B2, - 0x6491, 0xB3C5, - 0x6492, 0xC8F6, - 0x6495, 0xCBBA, - 0x6496, 0xDEFE, - 0x6499, 0xDFA4, - 0x649E, 0xD7B2, - 0x64A4, 0xB3B7, - 0x64A9, 0xC1C3, - 0x64AC, 0xC7CB, - 0x64AD, 0xB2A5, - 0x64AE, 0xB4E9, - 0x64B0, 0xD7AB, - 0x64B5, 0xC4EC, - 0x64B7, 0xDFA2, - 0x64B8, 0xDFA3, - 0x64BA, 0xDFA5, - 0x64BC, 0xBAB3, - 0x64C0, 0xDFA6, - 0x64C2, 0xC0DE, - 0x64C5, 0xC9C3, - 0x64CD, 0xB2D9, - 0x64CE, 0xC7E6, - 0x64D0, 0xDFA7, - 0x64D2, 0xC7DC, - 0x64D7, 0xDFA8, - 0x64D8, 0xEBA2, - 0x64DE, 0xCBD3, - 0x64E2, 0xDFAA, - 0x64E4, 0xDFA9, - 0x64E6, 0xB2C1, - 0x6500, 0xC5CA, - 0x6509, 0xDFAB, - 0x6512, 0xD4DC, - 0x6518, 0xC8C1, - 0x6525, 0xDFAC, - 0x652B, 0xBEF0, - 0x652E, 0xDFAD, - 0x652F, 0xD6A7, - 0x6534, 0xEAB7, - 0x6535, 0xEBB6, - 0x6536, 0xCAD5, - 0x6538, 0xD8FC, - 0x6539, 0xB8C4, - 0x653B, 0xB9A5, - 0x653E, 0xB7C5, - 0x653F, 0xD5FE, - 0x6545, 0xB9CA, - 0x6548, 0xD0A7, - 0x6549, 0xF4CD, - 0x654C, 0xB5D0, - 0x654F, 0xC3F4, - 0x6551, 0xBEC8, - 0x6555, 0xEBB7, - 0x6556, 0xB0BD, - 0x6559, 0xBDCC, - 0x655B, 0xC1B2, - 0x655D, 0xB1D6, - 0x655E, 0xB3A8, - 0x6562, 0xB8D2, - 0x6563, 0xC9A2, - 0x6566, 0xB6D8, - 0x656B, 0xEBB8, - 0x656C, 0xBEB4, - 0x6570, 0xCAFD, - 0x6572, 0xC7C3, - 0x6574, 0xD5FB, - 0x6577, 0xB7F3, - 0x6587, 0xCEC4, - 0x658B, 0xD5AB, - 0x658C, 0xB1F3, - 0x6590, 0xECB3, - 0x6591, 0xB0DF, - 0x6593, 0xECB5, - 0x6597, 0xB6B7, - 0x6599, 0xC1CF, - 0x659B, 0xF5FA, - 0x659C, 0xD0B1, - 0x659F, 0xD5E5, - 0x65A1, 0xCED3, - 0x65A4, 0xBDEF, - 0x65A5, 0xB3E2, - 0x65A7, 0xB8AB, - 0x65A9, 0xD5B6, - 0x65AB, 0xEDBD, - 0x65AD, 0xB6CF, - 0x65AF, 0xCBB9, - 0x65B0, 0xD0C2, - 0x65B9, 0xB7BD, - 0x65BC, 0xECB6, - 0x65BD, 0xCAA9, - 0x65C1, 0xC5D4, - 0x65C3, 0xECB9, - 0x65C4, 0xECB8, - 0x65C5, 0xC2C3, - 0x65C6, 0xECB7, - 0x65CB, 0xD0FD, - 0x65CC, 0xECBA, - 0x65CE, 0xECBB, - 0x65CF, 0xD7E5, - 0x65D2, 0xECBC, - 0x65D6, 0xECBD, - 0x65D7, 0xC6EC, - 0x65E0, 0xCEDE, - 0x65E2, 0xBCC8, - 0x65E5, 0xC8D5, - 0x65E6, 0xB5A9, - 0x65E7, 0xBEC9, - 0x65E8, 0xD6BC, - 0x65E9, 0xD4E7, - 0x65EC, 0xD1AE, - 0x65ED, 0xD0F1, - 0x65EE, 0xEAB8, - 0x65EF, 0xEAB9, - 0x65F0, 0xEABA, - 0x65F1, 0xBAB5, - 0x65F6, 0xCAB1, - 0x65F7, 0xBFF5, - 0x65FA, 0xCDFA, - 0x6600, 0xEAC0, - 0x6602, 0xB0BA, - 0x6603, 0xEABE, - 0x6606, 0xC0A5, - 0x660A, 0xEABB, - 0x660C, 0xB2FD, - 0x660E, 0xC3F7, - 0x660F, 0xBBE8, - 0x6613, 0xD2D7, - 0x6614, 0xCEF4, - 0x6615, 0xEABF, - 0x6619, 0xEABC, - 0x661D, 0xEAC3, - 0x661F, 0xD0C7, - 0x6620, 0xD3B3, - 0x6625, 0xB4BA, - 0x6627, 0xC3C1, - 0x6628, 0xD7F2, - 0x662D, 0xD5D1, - 0x662F, 0xCAC7, - 0x6631, 0xEAC5, - 0x6634, 0xEAC4, - 0x6635, 0xEAC7, - 0x6636, 0xEAC6, - 0x663C, 0xD6E7, - 0x663E, 0xCFD4, - 0x6641, 0xEACB, - 0x6643, 0xBBCE, - 0x664B, 0xBDFA, - 0x664C, 0xC9CE, - 0x664F, 0xEACC, - 0x6652, 0xC9B9, - 0x6653, 0xCFFE, - 0x6654, 0xEACA, - 0x6655, 0xD4CE, - 0x6656, 0xEACD, - 0x6657, 0xEACF, - 0x665A, 0xCDED, - 0x665F, 0xEAC9, - 0x6661, 0xEACE, - 0x6664, 0xCEEE, - 0x6666, 0xBBDE, - 0x6668, 0xB3BF, - 0x666E, 0xC6D5, - 0x666F, 0xBEB0, - 0x6670, 0xCEFA, - 0x6674, 0xC7E7, - 0x6676, 0xBEA7, - 0x6677, 0xEAD0, - 0x667A, 0xD6C7, - 0x667E, 0xC1C0, - 0x6682, 0xD4DD, - 0x6684, 0xEAD1, - 0x6687, 0xCFBE, - 0x668C, 0xEAD2, - 0x6691, 0xCAEE, - 0x6696, 0xC5AF, - 0x6697, 0xB0B5, - 0x669D, 0xEAD4, - 0x66A7, 0xEAD3, - 0x66A8, 0xF4DF, - 0x66AE, 0xC4BA, - 0x66B4, 0xB1A9, - 0x66B9, 0xE5DF, - 0x66BE, 0xEAD5, - 0x66D9, 0xCAEF, - 0x66DB, 0xEAD6, - 0x66DC, 0xEAD7, - 0x66DD, 0xC6D8, - 0x66E6, 0xEAD8, - 0x66E9, 0xEAD9, - 0x66F0, 0xD4BB, - 0x66F2, 0xC7FA, - 0x66F3, 0xD2B7, - 0x66F4, 0xB8FC, - 0x66F7, 0xEAC2, - 0x66F9, 0xB2DC, - 0x66FC, 0xC2FC, - 0x66FE, 0xD4F8, - 0x66FF, 0xCCE6, - 0x6700, 0xD7EE, - 0x6708, 0xD4C2, - 0x6709, 0xD3D0, - 0x670A, 0xEBC3, - 0x670B, 0xC5F3, - 0x670D, 0xB7FE, - 0x6710, 0xEBD4, - 0x6714, 0xCBB7, - 0x6715, 0xEBDE, - 0x6717, 0xC0CA, - 0x671B, 0xCDFB, - 0x671D, 0xB3AF, - 0x671F, 0xC6DA, - 0x6726, 0xEBFC, - 0x6728, 0xC4BE, - 0x672A, 0xCEB4, - 0x672B, 0xC4A9, - 0x672C, 0xB1BE, - 0x672D, 0xD4FD, - 0x672F, 0xCAF5, - 0x6731, 0xD6EC, - 0x6734, 0xC6D3, - 0x6735, 0xB6E4, - 0x673A, 0xBBFA, - 0x673D, 0xD0E0, - 0x6740, 0xC9B1, - 0x6742, 0xD4D3, - 0x6743, 0xC8A8, - 0x6746, 0xB8CB, - 0x6748, 0xE8BE, - 0x6749, 0xC9BC, - 0x674C, 0xE8BB, - 0x674E, 0xC0EE, - 0x674F, 0xD0D3, - 0x6750, 0xB2C4, - 0x6751, 0xB4E5, - 0x6753, 0xE8BC, - 0x6756, 0xD5C8, - 0x675C, 0xB6C5, - 0x675E, 0xE8BD, - 0x675F, 0xCAF8, - 0x6760, 0xB8DC, - 0x6761, 0xCCF5, - 0x6765, 0xC0B4, - 0x6768, 0xD1EE, - 0x6769, 0xE8BF, - 0x676A, 0xE8C2, - 0x676D, 0xBABC, - 0x676F, 0xB1AD, - 0x6770, 0xBDDC, - 0x6772, 0xEABD, - 0x6773, 0xE8C3, - 0x6775, 0xE8C6, - 0x6777, 0xE8CB, - 0x677C, 0xE8CC, - 0x677E, 0xCBC9, - 0x677F, 0xB0E5, - 0x6781, 0xBCAB, - 0x6784, 0xB9B9, - 0x6787, 0xE8C1, - 0x6789, 0xCDF7, - 0x678B, 0xE8CA, - 0x6790, 0xCEF6, - 0x6795, 0xD5ED, - 0x6797, 0xC1D6, - 0x6798, 0xE8C4, - 0x679A, 0xC3B6, - 0x679C, 0xB9FB, - 0x679D, 0xD6A6, - 0x679E, 0xE8C8, - 0x67A2, 0xCAE0, - 0x67A3, 0xD4E6, - 0x67A5, 0xE8C0, - 0x67A7, 0xE8C5, - 0x67A8, 0xE8C7, - 0x67AA, 0xC7B9, - 0x67AB, 0xB7E3, - 0x67AD, 0xE8C9, - 0x67AF, 0xBFDD, - 0x67B0, 0xE8D2, - 0x67B3, 0xE8D7, - 0x67B5, 0xE8D5, - 0x67B6, 0xBCDC, - 0x67B7, 0xBCCF, - 0x67B8, 0xE8DB, - 0x67C1, 0xE8DE, - 0x67C3, 0xE8DA, - 0x67C4, 0xB1FA, - 0x67CF, 0xB0D8, - 0x67D0, 0xC4B3, - 0x67D1, 0xB8CC, - 0x67D2, 0xC6E2, - 0x67D3, 0xC8BE, - 0x67D4, 0xC8E1, - 0x67D8, 0xE8CF, - 0x67D9, 0xE8D4, - 0x67DA, 0xE8D6, - 0x67DC, 0xB9F1, - 0x67DD, 0xE8D8, - 0x67DE, 0xD7F5, - 0x67E0, 0xC4FB, - 0x67E2, 0xE8DC, - 0x67E5, 0xB2E9, - 0x67E9, 0xE8D1, - 0x67EC, 0xBCED, - 0x67EF, 0xBFC2, - 0x67F0, 0xE8CD, - 0x67F1, 0xD6F9, - 0x67F3, 0xC1F8, - 0x67F4, 0xB2F1, - 0x67FD, 0xE8DF, - 0x67FF, 0xCAC1, - 0x6800, 0xE8D9, - 0x6805, 0xD5A4, - 0x6807, 0xB1EA, - 0x6808, 0xD5BB, - 0x6809, 0xE8CE, - 0x680A, 0xE8D0, - 0x680B, 0xB6B0, - 0x680C, 0xE8D3, - 0x680E, 0xE8DD, - 0x680F, 0xC0B8, - 0x6811, 0xCAF7, - 0x6813, 0xCBA8, - 0x6816, 0xC6DC, - 0x6817, 0xC0F5, - 0x681D, 0xE8E9, - 0x6821, 0xD0A3, - 0x6829, 0xE8F2, - 0x682A, 0xD6EA, - 0x6832, 0xE8E0, - 0x6833, 0xE8E1, - 0x6837, 0xD1F9, - 0x6838, 0xBACB, - 0x6839, 0xB8F9, - 0x683C, 0xB8F1, - 0x683D, 0xD4D4, - 0x683E, 0xE8EF, - 0x6840, 0xE8EE, - 0x6841, 0xE8EC, - 0x6842, 0xB9F0, - 0x6843, 0xCCD2, - 0x6844, 0xE8E6, - 0x6845, 0xCEA6, - 0x6846, 0xBFF2, - 0x6848, 0xB0B8, - 0x6849, 0xE8F1, - 0x684A, 0xE8F0, - 0x684C, 0xD7C0, - 0x684E, 0xE8E4, - 0x6850, 0xCDA9, - 0x6851, 0xC9A3, - 0x6853, 0xBBB8, - 0x6854, 0xBDDB, - 0x6855, 0xE8EA, - 0x6860, 0xE8E2, - 0x6861, 0xE8E3, - 0x6862, 0xE8E5, - 0x6863, 0xB5B5, - 0x6864, 0xE8E7, - 0x6865, 0xC7C5, - 0x6866, 0xE8EB, - 0x6867, 0xE8ED, - 0x6868, 0xBDB0, - 0x6869, 0xD7AE, - 0x686B, 0xE8F8, - 0x6874, 0xE8F5, - 0x6876, 0xCDB0, - 0x6877, 0xE8F6, - 0x6881, 0xC1BA, - 0x6883, 0xE8E8, - 0x6885, 0xC3B7, - 0x6886, 0xB0F0, - 0x688F, 0xE8F4, - 0x6893, 0xE8F7, - 0x6897, 0xB9A3, - 0x68A2, 0xC9D2, - 0x68A6, 0xC3CE, - 0x68A7, 0xCEE0, - 0x68A8, 0xC0E6, - 0x68AD, 0xCBF3, - 0x68AF, 0xCCDD, - 0x68B0, 0xD0B5, - 0x68B3, 0xCAE1, - 0x68B5, 0xE8F3, - 0x68C0, 0xBCEC, - 0x68C2, 0xE8F9, - 0x68C9, 0xC3DE, - 0x68CB, 0xC6E5, - 0x68CD, 0xB9F7, - 0x68D2, 0xB0F4, - 0x68D5, 0xD7D8, - 0x68D8, 0xBCAC, - 0x68DA, 0xC5EF, - 0x68E0, 0xCCC4, - 0x68E3, 0xE9A6, - 0x68EE, 0xC9AD, - 0x68F0, 0xE9A2, - 0x68F1, 0xC0E2, - 0x68F5, 0xBFC3, - 0x68F9, 0xE8FE, - 0x68FA, 0xB9D7, - 0x68FC, 0xE8FB, - 0x6901, 0xE9A4, - 0x6905, 0xD2CE, - 0x690B, 0xE9A3, - 0x690D, 0xD6B2, - 0x690E, 0xD7B5, - 0x6910, 0xE9A7, - 0x6912, 0xBDB7, - 0x691F, 0xE8FC, - 0x6920, 0xE8FD, - 0x6924, 0xE9A1, - 0x692D, 0xCDD6, - 0x6930, 0xD2AC, - 0x6934, 0xE9B2, - 0x6939, 0xE9A9, - 0x693D, 0xB4AA, - 0x693F, 0xB4BB, - 0x6942, 0xE9AB, - 0x6954, 0xD0A8, - 0x6957, 0xE9A5, - 0x695A, 0xB3FE, - 0x695D, 0xE9AC, - 0x695E, 0xC0E3, - 0x6960, 0xE9AA, - 0x6963, 0xE9B9, - 0x6966, 0xE9B8, - 0x696B, 0xE9AE, - 0x696E, 0xE8FA, - 0x6971, 0xE9A8, - 0x6977, 0xBFAC, - 0x6978, 0xE9B1, - 0x6979, 0xE9BA, - 0x697C, 0xC2A5, - 0x6980, 0xE9AF, - 0x6982, 0xB8C5, - 0x6984, 0xE9AD, - 0x6986, 0xD3DC, - 0x6987, 0xE9B4, - 0x6988, 0xE9B5, - 0x6989, 0xE9B7, - 0x698D, 0xE9C7, - 0x6994, 0xC0C6, - 0x6995, 0xE9C5, - 0x6998, 0xE9B0, - 0x699B, 0xE9BB, - 0x699C, 0xB0F1, - 0x69A7, 0xE9BC, - 0x69A8, 0xD5A5, - 0x69AB, 0xE9BE, - 0x69AD, 0xE9BF, - 0x69B1, 0xE9C1, - 0x69B4, 0xC1F1, - 0x69B7, 0xC8B6, - 0x69BB, 0xE9BD, - 0x69C1, 0xE9C2, - 0x69CA, 0xE9C3, - 0x69CC, 0xE9B3, - 0x69CE, 0xE9B6, - 0x69D0, 0xBBB1, - 0x69D4, 0xE9C0, - 0x69DB, 0xBCF7, - 0x69DF, 0xE9C4, - 0x69E0, 0xE9C6, - 0x69ED, 0xE9CA, - 0x69F2, 0xE9CE, - 0x69FD, 0xB2DB, - 0x69FF, 0xE9C8, - 0x6A0A, 0xB7AE, - 0x6A17, 0xE9CB, - 0x6A18, 0xE9CC, - 0x6A1F, 0xD5C1, - 0x6A21, 0xC4A3, - 0x6A28, 0xE9D8, - 0x6A2A, 0xBAE1, - 0x6A2F, 0xE9C9, - 0x6A31, 0xD3A3, - 0x6A35, 0xE9D4, - 0x6A3D, 0xE9D7, - 0x6A3E, 0xE9D0, - 0x6A44, 0xE9CF, - 0x6A47, 0xC7C1, - 0x6A50, 0xE9D2, - 0x6A58, 0xE9D9, - 0x6A59, 0xB3C8, - 0x6A5B, 0xE9D3, - 0x6A61, 0xCFF0, - 0x6A65, 0xE9CD, - 0x6A71, 0xB3F7, - 0x6A79, 0xE9D6, - 0x6A7C, 0xE9DA, - 0x6A80, 0xCCB4, - 0x6A84, 0xCFAD, - 0x6A8E, 0xE9D5, - 0x6A90, 0xE9DC, - 0x6A91, 0xE9DB, - 0x6A97, 0xE9DE, - 0x6AA0, 0xE9D1, - 0x6AA9, 0xE9DD, - 0x6AAB, 0xE9DF, - 0x6AAC, 0xC3CA, - 0x6B20, 0xC7B7, - 0x6B21, 0xB4CE, - 0x6B22, 0xBBB6, - 0x6B23, 0xD0C0, - 0x6B24, 0xECA3, - 0x6B27, 0xC5B7, - 0x6B32, 0xD3FB, - 0x6B37, 0xECA4, - 0x6B39, 0xECA5, - 0x6B3A, 0xC6DB, - 0x6B3E, 0xBFEE, - 0x6B43, 0xECA6, - 0x6B46, 0xECA7, - 0x6B47, 0xD0AA, - 0x6B49, 0xC7B8, - 0x6B4C, 0xB8E8, - 0x6B59, 0xECA8, - 0x6B62, 0xD6B9, - 0x6B63, 0xD5FD, - 0x6B64, 0xB4CB, - 0x6B65, 0xB2BD, - 0x6B66, 0xCEE4, - 0x6B67, 0xC6E7, - 0x6B6A, 0xCDE1, - 0x6B79, 0xB4F5, - 0x6B7B, 0xCBC0, - 0x6B7C, 0xBCDF, - 0x6B81, 0xE9E2, - 0x6B82, 0xE9E3, - 0x6B83, 0xD1EA, - 0x6B84, 0xE9E5, - 0x6B86, 0xB4F9, - 0x6B87, 0xE9E4, - 0x6B89, 0xD1B3, - 0x6B8A, 0xCAE2, - 0x6B8B, 0xB2D0, - 0x6B8D, 0xE9E8, - 0x6B92, 0xE9E6, - 0x6B93, 0xE9E7, - 0x6B96, 0xD6B3, - 0x6B9A, 0xE9E9, - 0x6B9B, 0xE9EA, - 0x6BA1, 0xE9EB, - 0x6BAA, 0xE9EC, - 0x6BB3, 0xECAF, - 0x6BB4, 0xC5B9, - 0x6BB5, 0xB6CE, - 0x6BB7, 0xD2F3, - 0x6BBF, 0xB5EE, - 0x6BC1, 0xBBD9, - 0x6BC2, 0xECB1, - 0x6BC5, 0xD2E3, - 0x6BCB, 0xCEE3, - 0x6BCD, 0xC4B8, - 0x6BCF, 0xC3BF, - 0x6BD2, 0xB6BE, - 0x6BD3, 0xD8B9, - 0x6BD4, 0xB1C8, - 0x6BD5, 0xB1CF, - 0x6BD6, 0xB1D1, - 0x6BD7, 0xC5FE, - 0x6BD9, 0xB1D0, - 0x6BDB, 0xC3AB, - 0x6BE1, 0xD5B1, - 0x6BEA, 0xEBA4, - 0x6BEB, 0xBAC1, - 0x6BEF, 0xCCBA, - 0x6BF3, 0xEBA5, - 0x6BF5, 0xEBA7, - 0x6BF9, 0xEBA8, - 0x6BFD, 0xEBA6, - 0x6C05, 0xEBA9, - 0x6C06, 0xEBAB, - 0x6C07, 0xEBAA, - 0x6C0D, 0xEBAC, - 0x6C0F, 0xCACF, - 0x6C10, 0xD8B5, - 0x6C11, 0xC3F1, - 0x6C13, 0xC3A5, - 0x6C14, 0xC6F8, - 0x6C15, 0xEBAD, - 0x6C16, 0xC4CA, - 0x6C18, 0xEBAE, - 0x6C19, 0xEBAF, - 0x6C1A, 0xEBB0, - 0x6C1B, 0xB7D5, - 0x6C1F, 0xB7FA, - 0x6C21, 0xEBB1, - 0x6C22, 0xC7E2, - 0x6C24, 0xEBB3, - 0x6C26, 0xBAA4, - 0x6C27, 0xD1F5, - 0x6C28, 0xB0B1, - 0x6C29, 0xEBB2, - 0x6C2A, 0xEBB4, - 0x6C2E, 0xB5AA, - 0x6C2F, 0xC2C8, - 0x6C30, 0xC7E8, - 0x6C32, 0xEBB5, - 0x6C34, 0xCBAE, - 0x6C35, 0xE3DF, - 0x6C38, 0xD3C0, - 0x6C3D, 0xD9DB, - 0x6C40, 0xCDA1, - 0x6C41, 0xD6AD, - 0x6C42, 0xC7F3, - 0x6C46, 0xD9E0, - 0x6C47, 0xBBE3, - 0x6C49, 0xBABA, - 0x6C4A, 0xE3E2, - 0x6C50, 0xCFAB, - 0x6C54, 0xE3E0, - 0x6C55, 0xC9C7, - 0x6C57, 0xBAB9, - 0x6C5B, 0xD1B4, - 0x6C5C, 0xE3E1, - 0x6C5D, 0xC8EA, - 0x6C5E, 0xB9AF, - 0x6C5F, 0xBDAD, - 0x6C60, 0xB3D8, - 0x6C61, 0xCEDB, - 0x6C64, 0xCCC0, - 0x6C68, 0xE3E8, - 0x6C69, 0xE3E9, - 0x6C6A, 0xCDF4, - 0x6C70, 0xCCAD, - 0x6C72, 0xBCB3, - 0x6C74, 0xE3EA, - 0x6C76, 0xE3EB, - 0x6C79, 0xD0DA, - 0x6C7D, 0xC6FB, - 0x6C7E, 0xB7DA, - 0x6C81, 0xC7DF, - 0x6C82, 0xD2CA, - 0x6C83, 0xCED6, - 0x6C85, 0xE3E4, - 0x6C86, 0xE3EC, - 0x6C88, 0xC9F2, - 0x6C89, 0xB3C1, - 0x6C8C, 0xE3E7, - 0x6C8F, 0xC6E3, - 0x6C90, 0xE3E5, - 0x6C93, 0xEDB3, - 0x6C94, 0xE3E6, - 0x6C99, 0xC9B3, - 0x6C9B, 0xC5E6, - 0x6C9F, 0xB9B5, - 0x6CA1, 0xC3BB, - 0x6CA3, 0xE3E3, - 0x6CA4, 0xC5BD, - 0x6CA5, 0xC1A4, - 0x6CA6, 0xC2D9, - 0x6CA7, 0xB2D7, - 0x6CA9, 0xE3ED, - 0x6CAA, 0xBBA6, - 0x6CAB, 0xC4AD, - 0x6CAD, 0xE3F0, - 0x6CAE, 0xBEDA, - 0x6CB1, 0xE3FB, - 0x6CB2, 0xE3F5, - 0x6CB3, 0xBAD3, - 0x6CB8, 0xB7D0, - 0x6CB9, 0xD3CD, - 0x6CBB, 0xD6CE, - 0x6CBC, 0xD5D3, - 0x6CBD, 0xB9C1, - 0x6CBE, 0xD5B4, - 0x6CBF, 0xD1D8, - 0x6CC4, 0xD0B9, - 0x6CC5, 0xC7F6, - 0x6CC9, 0xC8AA, - 0x6CCA, 0xB2B4, - 0x6CCC, 0xC3DA, - 0x6CD0, 0xE3EE, - 0x6CD3, 0xE3FC, - 0x6CD4, 0xE3EF, - 0x6CD5, 0xB7A8, - 0x6CD6, 0xE3F7, - 0x6CD7, 0xE3F4, - 0x6CDB, 0xB7BA, - 0x6CDE, 0xC5A2, - 0x6CE0, 0xE3F6, - 0x6CE1, 0xC5DD, - 0x6CE2, 0xB2A8, - 0x6CE3, 0xC6FC, - 0x6CE5, 0xC4E0, - 0x6CE8, 0xD7A2, - 0x6CEA, 0xC0E1, - 0x6CEB, 0xE3F9, - 0x6CEE, 0xE3FA, - 0x6CEF, 0xE3FD, - 0x6CF0, 0xCCA9, - 0x6CF1, 0xE3F3, - 0x6CF3, 0xD3BE, - 0x6CF5, 0xB1C3, - 0x6CF6, 0xEDB4, - 0x6CF7, 0xE3F1, - 0x6CF8, 0xE3F2, - 0x6CFA, 0xE3F8, - 0x6CFB, 0xD0BA, - 0x6CFC, 0xC6C3, - 0x6CFD, 0xD4F3, - 0x6CFE, 0xE3FE, - 0x6D01, 0xBDE0, - 0x6D04, 0xE4A7, - 0x6D07, 0xE4A6, - 0x6D0B, 0xD1F3, - 0x6D0C, 0xE4A3, - 0x6D0E, 0xE4A9, - 0x6D12, 0xC8F7, - 0x6D17, 0xCFB4, - 0x6D19, 0xE4A8, - 0x6D1A, 0xE4AE, - 0x6D1B, 0xC2E5, - 0x6D1E, 0xB6B4, - 0x6D25, 0xBDF2, - 0x6D27, 0xE4A2, - 0x6D2A, 0xBAE9, - 0x6D2B, 0xE4AA, - 0x6D2E, 0xE4AC, - 0x6D31, 0xB6FD, - 0x6D32, 0xD6DE, - 0x6D33, 0xE4B2, - 0x6D35, 0xE4AD, - 0x6D39, 0xE4A1, - 0x6D3B, 0xBBEE, - 0x6D3C, 0xCDDD, - 0x6D3D, 0xC7A2, - 0x6D3E, 0xC5C9, - 0x6D41, 0xC1F7, - 0x6D43, 0xE4A4, - 0x6D45, 0xC7B3, - 0x6D46, 0xBDAC, - 0x6D47, 0xBDBD, - 0x6D48, 0xE4A5, - 0x6D4A, 0xD7C7, - 0x6D4B, 0xB2E2, - 0x6D4D, 0xE4AB, - 0x6D4E, 0xBCC3, - 0x6D4F, 0xE4AF, - 0x6D51, 0xBBEB, - 0x6D52, 0xE4B0, - 0x6D53, 0xC5A8, - 0x6D54, 0xE4B1, - 0x6D59, 0xD5E3, - 0x6D5A, 0xBFA3, - 0x6D5C, 0xE4BA, - 0x6D5E, 0xE4B7, - 0x6D60, 0xE4BB, - 0x6D63, 0xE4BD, - 0x6D66, 0xC6D6, - 0x6D69, 0xBAC6, - 0x6D6A, 0xC0CB, - 0x6D6E, 0xB8A1, - 0x6D6F, 0xE4B4, - 0x6D74, 0xD4A1, - 0x6D77, 0xBAA3, - 0x6D78, 0xBDFE, - 0x6D7C, 0xE4BC, - 0x6D82, 0xCDBF, - 0x6D85, 0xC4F9, - 0x6D88, 0xCFFB, - 0x6D89, 0xC9E6, - 0x6D8C, 0xD3BF, - 0x6D8E, 0xCFD1, - 0x6D91, 0xE4B3, - 0x6D93, 0xE4B8, - 0x6D94, 0xE4B9, - 0x6D95, 0xCCE9, - 0x6D9B, 0xCCCE, - 0x6D9D, 0xC0D4, - 0x6D9E, 0xE4B5, - 0x6D9F, 0xC1B0, - 0x6DA0, 0xE4B6, - 0x6DA1, 0xCED0, - 0x6DA3, 0xBBC1, - 0x6DA4, 0xB5D3, - 0x6DA6, 0xC8F3, - 0x6DA7, 0xBDA7, - 0x6DA8, 0xD5C7, - 0x6DA9, 0xC9AC, - 0x6DAA, 0xB8A2, - 0x6DAB, 0xE4CA, - 0x6DAE, 0xE4CC, - 0x6DAF, 0xD1C4, - 0x6DB2, 0xD2BA, - 0x6DB5, 0xBAAD, - 0x6DB8, 0xBAD4, - 0x6DBF, 0xE4C3, - 0x6DC0, 0xB5ED, - 0x6DC4, 0xD7CD, - 0x6DC5, 0xE4C0, - 0x6DC6, 0xCFFD, - 0x6DC7, 0xE4BF, - 0x6DCB, 0xC1DC, - 0x6DCC, 0xCCCA, - 0x6DD1, 0xCAE7, - 0x6DD6, 0xC4D7, - 0x6DD8, 0xCCD4, - 0x6DD9, 0xE4C8, - 0x6DDD, 0xE4C7, - 0x6DDE, 0xE4C1, - 0x6DE0, 0xE4C4, - 0x6DE1, 0xB5AD, - 0x6DE4, 0xD3D9, - 0x6DE6, 0xE4C6, - 0x6DEB, 0xD2F9, - 0x6DEC, 0xB4E3, - 0x6DEE, 0xBBB4, - 0x6DF1, 0xC9EE, - 0x6DF3, 0xB4BE, - 0x6DF7, 0xBBEC, - 0x6DF9, 0xD1CD, - 0x6DFB, 0xCCED, - 0x6DFC, 0xEDB5, - 0x6E05, 0xC7E5, - 0x6E0A, 0xD4A8, - 0x6E0C, 0xE4CB, - 0x6E0D, 0xD7D5, - 0x6E0E, 0xE4C2, - 0x6E10, 0xBDA5, - 0x6E11, 0xE4C5, - 0x6E14, 0xD3E6, - 0x6E16, 0xE4C9, - 0x6E17, 0xC9F8, - 0x6E1A, 0xE4BE, - 0x6E1D, 0xD3E5, - 0x6E20, 0xC7FE, - 0x6E21, 0xB6C9, - 0x6E23, 0xD4FC, - 0x6E24, 0xB2B3, - 0x6E25, 0xE4D7, - 0x6E29, 0xCEC2, - 0x6E2B, 0xE4CD, - 0x6E2D, 0xCEBC, - 0x6E2F, 0xB8DB, - 0x6E32, 0xE4D6, - 0x6E34, 0xBFCA, - 0x6E38, 0xD3CE, - 0x6E3A, 0xC3EC, - 0x6E43, 0xC5C8, - 0x6E44, 0xE4D8, - 0x6E4D, 0xCDC4, - 0x6E4E, 0xE4CF, - 0x6E53, 0xE4D4, - 0x6E54, 0xE4D5, - 0x6E56, 0xBAFE, - 0x6E58, 0xCFE6, - 0x6E5B, 0xD5BF, - 0x6E5F, 0xE4D2, - 0x6E6B, 0xE4D0, - 0x6E6E, 0xE4CE, - 0x6E7E, 0xCDE5, - 0x6E7F, 0xCAAA, - 0x6E83, 0xC0A3, - 0x6E85, 0xBDA6, - 0x6E86, 0xE4D3, - 0x6E89, 0xB8C8, - 0x6E8F, 0xE4E7, - 0x6E90, 0xD4B4, - 0x6E98, 0xE4DB, - 0x6E9C, 0xC1EF, - 0x6E9F, 0xE4E9, - 0x6EA2, 0xD2E7, - 0x6EA5, 0xE4DF, - 0x6EA7, 0xE4E0, - 0x6EAA, 0xCFAA, - 0x6EAF, 0xCBDD, - 0x6EB1, 0xE4DA, - 0x6EB2, 0xE4D1, - 0x6EB4, 0xE4E5, - 0x6EB6, 0xC8DC, - 0x6EB7, 0xE4E3, - 0x6EBA, 0xC4E7, - 0x6EBB, 0xE4E2, - 0x6EBD, 0xE4E1, - 0x6EC1, 0xB3FC, - 0x6EC2, 0xE4E8, - 0x6EC7, 0xB5E1, - 0x6ECB, 0xD7CC, - 0x6ECF, 0xE4E6, - 0x6ED1, 0xBBAC, - 0x6ED3, 0xD7D2, - 0x6ED4, 0xCCCF, - 0x6ED5, 0xEBF8, - 0x6ED7, 0xE4E4, - 0x6EDA, 0xB9F6, - 0x6EDE, 0xD6CD, - 0x6EDF, 0xE4D9, - 0x6EE0, 0xE4DC, - 0x6EE1, 0xC2FA, - 0x6EE2, 0xE4DE, - 0x6EE4, 0xC2CB, - 0x6EE5, 0xC0C4, - 0x6EE6, 0xC2D0, - 0x6EE8, 0xB1F5, - 0x6EE9, 0xCCB2, - 0x6EF4, 0xB5CE, - 0x6EF9, 0xE4EF, - 0x6F02, 0xC6AF, - 0x6F06, 0xC6E1, - 0x6F09, 0xE4F5, - 0x6F0F, 0xC2A9, - 0x6F13, 0xC0EC, - 0x6F14, 0xD1DD, - 0x6F15, 0xE4EE, - 0x6F20, 0xC4AE, - 0x6F24, 0xE4ED, - 0x6F29, 0xE4F6, - 0x6F2A, 0xE4F4, - 0x6F2B, 0xC2FE, - 0x6F2D, 0xE4DD, - 0x6F2F, 0xE4F0, - 0x6F31, 0xCAFE, - 0x6F33, 0xD5C4, - 0x6F36, 0xE4F1, - 0x6F3E, 0xD1FA, - 0x6F46, 0xE4EB, - 0x6F47, 0xE4EC, - 0x6F4B, 0xE4F2, - 0x6F4D, 0xCEAB, - 0x6F58, 0xC5CB, - 0x6F5C, 0xC7B1, - 0x6F5E, 0xC2BA, - 0x6F62, 0xE4EA, - 0x6F66, 0xC1CA, - 0x6F6D, 0xCCB6, - 0x6F6E, 0xB3B1, - 0x6F72, 0xE4FB, - 0x6F74, 0xE4F3, - 0x6F78, 0xE4FA, - 0x6F7A, 0xE4FD, - 0x6F7C, 0xE4FC, - 0x6F84, 0xB3CE, - 0x6F88, 0xB3BA, - 0x6F89, 0xE4F7, - 0x6F8C, 0xE4F9, - 0x6F8D, 0xE4F8, - 0x6F8E, 0xC5EC, - 0x6F9C, 0xC0BD, - 0x6FA1, 0xD4E8, - 0x6FA7, 0xE5A2, - 0x6FB3, 0xB0C4, - 0x6FB6, 0xE5A4, - 0x6FB9, 0xE5A3, - 0x6FC0, 0xBCA4, - 0x6FC2, 0xE5A5, - 0x6FC9, 0xE5A1, - 0x6FD1, 0xE4FE, - 0x6FD2, 0xB1F4, - 0x6FDE, 0xE5A8, - 0x6FE0, 0xE5A9, - 0x6FE1, 0xE5A6, - 0x6FEE, 0xE5A7, - 0x6FEF, 0xE5AA, - 0x7011, 0xC6D9, - 0x701A, 0xE5AB, - 0x701B, 0xE5AD, - 0x7023, 0xE5AC, - 0x7035, 0xE5AF, - 0x7039, 0xE5AE, - 0x704C, 0xB9E0, - 0x704F, 0xE5B0, - 0x705E, 0xE5B1, - 0x706B, 0xBBF0, - 0x706C, 0xECE1, - 0x706D, 0xC3F0, - 0x706F, 0xB5C6, - 0x7070, 0xBBD2, - 0x7075, 0xC1E9, - 0x7076, 0xD4EE, - 0x7078, 0xBEC4, - 0x707C, 0xD7C6, - 0x707E, 0xD4D6, - 0x707F, 0xB2D3, - 0x7080, 0xECBE, - 0x7085, 0xEAC1, - 0x7089, 0xC2AF, - 0x708A, 0xB4B6, - 0x708E, 0xD1D7, - 0x7092, 0xB3B4, - 0x7094, 0xC8B2, - 0x7095, 0xBFBB, - 0x7096, 0xECC0, - 0x7099, 0xD6CB, - 0x709C, 0xECBF, - 0x709D, 0xECC1, - 0x70AB, 0xECC5, - 0x70AC, 0xBEE6, - 0x70AD, 0xCCBF, - 0x70AE, 0xC5DA, - 0x70AF, 0xBEBC, - 0x70B1, 0xECC6, - 0x70B3, 0xB1FE, - 0x70B7, 0xECC4, - 0x70B8, 0xD5A8, - 0x70B9, 0xB5E3, - 0x70BB, 0xECC2, - 0x70BC, 0xC1B6, - 0x70BD, 0xB3E3, - 0x70C0, 0xECC3, - 0x70C1, 0xCBB8, - 0x70C2, 0xC0C3, - 0x70C3, 0xCCFE, - 0x70C8, 0xC1D2, - 0x70CA, 0xECC8, - 0x70D8, 0xBAE6, - 0x70D9, 0xC0D3, - 0x70DB, 0xD6F2, - 0x70DF, 0xD1CC, - 0x70E4, 0xBFBE, - 0x70E6, 0xB7B3, - 0x70E7, 0xC9D5, - 0x70E8, 0xECC7, - 0x70E9, 0xBBE2, - 0x70EB, 0xCCCC, - 0x70EC, 0xBDFD, - 0x70ED, 0xC8C8, - 0x70EF, 0xCFA9, - 0x70F7, 0xCDE9, - 0x70F9, 0xC5EB, - 0x70FD, 0xB7E9, - 0x7109, 0xD1C9, - 0x710A, 0xBAB8, - 0x7110, 0xECC9, - 0x7113, 0xECCA, - 0x7115, 0xBBC0, - 0x7116, 0xECCB, - 0x7118, 0xECE2, - 0x7119, 0xB1BA, - 0x711A, 0xB7D9, - 0x7126, 0xBDB9, - 0x712F, 0xECCC, - 0x7130, 0xD1E6, - 0x7131, 0xECCD, - 0x7136, 0xC8BB, - 0x7145, 0xECD1, - 0x714A, 0xECD3, - 0x714C, 0xBBCD, - 0x714E, 0xBCE5, - 0x715C, 0xECCF, - 0x715E, 0xC9B7, - 0x7164, 0xC3BA, - 0x7166, 0xECE3, - 0x7167, 0xD5D5, - 0x7168, 0xECD0, - 0x716E, 0xD6F3, - 0x7172, 0xECD2, - 0x7173, 0xECCE, - 0x7178, 0xECD4, - 0x717A, 0xECD5, - 0x717D, 0xC9BF, - 0x7184, 0xCFA8, - 0x718A, 0xD0DC, - 0x718F, 0xD1AC, - 0x7194, 0xC8DB, - 0x7198, 0xECD6, - 0x7199, 0xCEF5, - 0x719F, 0xCAEC, - 0x71A0, 0xECDA, - 0x71A8, 0xECD9, - 0x71AC, 0xB0BE, - 0x71B3, 0xECD7, - 0x71B5, 0xECD8, - 0x71B9, 0xECE4, - 0x71C3, 0xC8BC, - 0x71CE, 0xC1C7, - 0x71D4, 0xECDC, - 0x71D5, 0xD1E0, - 0x71E0, 0xECDB, - 0x71E5, 0xD4EF, - 0x71E7, 0xECDD, - 0x71EE, 0xDBC6, - 0x71F9, 0xECDE, - 0x7206, 0xB1AC, - 0x721D, 0xECDF, - 0x7228, 0xECE0, - 0x722A, 0xD7A6, - 0x722C, 0xC5C0, - 0x7230, 0xEBBC, - 0x7231, 0xB0AE, - 0x7235, 0xBEF4, - 0x7236, 0xB8B8, - 0x7237, 0xD2AF, - 0x7238, 0xB0D6, - 0x7239, 0xB5F9, - 0x723B, 0xD8B3, - 0x723D, 0xCBAC, - 0x723F, 0xE3DD, - 0x7247, 0xC6AC, - 0x7248, 0xB0E6, - 0x724C, 0xC5C6, - 0x724D, 0xEBB9, - 0x7252, 0xEBBA, - 0x7256, 0xEBBB, - 0x7259, 0xD1C0, - 0x725B, 0xC5A3, - 0x725D, 0xEAF2, - 0x725F, 0xC4B2, - 0x7261, 0xC4B5, - 0x7262, 0xC0CE, - 0x7266, 0xEAF3, - 0x7267, 0xC4C1, - 0x7269, 0xCEEF, - 0x726E, 0xEAF0, - 0x726F, 0xEAF4, - 0x7272, 0xC9FC, - 0x7275, 0xC7A3, - 0x7279, 0xCCD8, - 0x727A, 0xCEFE, - 0x727E, 0xEAF5, - 0x727F, 0xEAF6, - 0x7280, 0xCFAC, - 0x7281, 0xC0E7, - 0x7284, 0xEAF7, - 0x728A, 0xB6BF, - 0x728B, 0xEAF8, - 0x728D, 0xEAF9, - 0x728F, 0xEAFA, - 0x7292, 0xEAFB, - 0x729F, 0xEAF1, - 0x72AC, 0xC8AE, - 0x72AD, 0xE1EB, - 0x72AF, 0xB7B8, - 0x72B0, 0xE1EC, - 0x72B4, 0xE1ED, - 0x72B6, 0xD7B4, - 0x72B7, 0xE1EE, - 0x72B8, 0xE1EF, - 0x72B9, 0xD3CC, - 0x72C1, 0xE1F1, - 0x72C2, 0xBFF1, - 0x72C3, 0xE1F0, - 0x72C4, 0xB5D2, - 0x72C8, 0xB1B7, - 0x72CD, 0xE1F3, - 0x72CE, 0xE1F2, - 0x72D0, 0xBAFC, - 0x72D2, 0xE1F4, - 0x72D7, 0xB9B7, - 0x72D9, 0xBED1, - 0x72DE, 0xC4FC, - 0x72E0, 0xBADD, - 0x72E1, 0xBDC6, - 0x72E8, 0xE1F5, - 0x72E9, 0xE1F7, - 0x72EC, 0xB6C0, - 0x72ED, 0xCFC1, - 0x72EE, 0xCAA8, - 0x72EF, 0xE1F6, - 0x72F0, 0xD5F8, - 0x72F1, 0xD3FC, - 0x72F2, 0xE1F8, - 0x72F3, 0xE1FC, - 0x72F4, 0xE1F9, - 0x72F7, 0xE1FA, - 0x72F8, 0xC0EA, - 0x72FA, 0xE1FE, - 0x72FB, 0xE2A1, - 0x72FC, 0xC0C7, - 0x7301, 0xE1FB, - 0x7303, 0xE1FD, - 0x730A, 0xE2A5, - 0x730E, 0xC1D4, - 0x7313, 0xE2A3, - 0x7315, 0xE2A8, - 0x7316, 0xB2FE, - 0x7317, 0xE2A2, - 0x731B, 0xC3CD, - 0x731C, 0xB2C2, - 0x731D, 0xE2A7, - 0x731E, 0xE2A6, - 0x7321, 0xE2A4, - 0x7322, 0xE2A9, - 0x7325, 0xE2AB, - 0x7329, 0xD0C9, - 0x732A, 0xD6ED, - 0x732B, 0xC3A8, - 0x732C, 0xE2AC, - 0x732E, 0xCFD7, - 0x7331, 0xE2AE, - 0x7334, 0xBAEF, - 0x7337, 0xE9E0, - 0x7338, 0xE2AD, - 0x7339, 0xE2AA, - 0x733E, 0xBBAB, - 0x733F, 0xD4B3, - 0x734D, 0xE2B0, - 0x7350, 0xE2AF, - 0x7352, 0xE9E1, - 0x7357, 0xE2B1, - 0x7360, 0xE2B2, - 0x736C, 0xE2B3, - 0x736D, 0xCCA1, - 0x736F, 0xE2B4, - 0x737E, 0xE2B5, - 0x7384, 0xD0FE, - 0x7387, 0xC2CA, - 0x7389, 0xD3F1, - 0x738B, 0xCDF5, - 0x738E, 0xE7E0, - 0x7391, 0xE7E1, - 0x7396, 0xBEC1, - 0x739B, 0xC2EA, - 0x739F, 0xE7E4, - 0x73A2, 0xE7E3, - 0x73A9, 0xCDE6, - 0x73AB, 0xC3B5, - 0x73AE, 0xE7E2, - 0x73AF, 0xBBB7, - 0x73B0, 0xCFD6, - 0x73B2, 0xC1E1, - 0x73B3, 0xE7E9, - 0x73B7, 0xE7E8, - 0x73BA, 0xE7F4, - 0x73BB, 0xB2A3, - 0x73C0, 0xE7EA, - 0x73C2, 0xE7E6, - 0x73C8, 0xE7EC, - 0x73C9, 0xE7EB, - 0x73CA, 0xC9BA, - 0x73CD, 0xD5E4, - 0x73CF, 0xE7E5, - 0x73D0, 0xB7A9, - 0x73D1, 0xE7E7, - 0x73D9, 0xE7EE, - 0x73DE, 0xE7F3, - 0x73E0, 0xD6E9, - 0x73E5, 0xE7ED, - 0x73E7, 0xE7F2, - 0x73E9, 0xE7F1, - 0x73ED, 0xB0E0, - 0x73F2, 0xE7F5, - 0x7403, 0xC7F2, - 0x7405, 0xC0C5, - 0x7406, 0xC0ED, - 0x7409, 0xC1F0, - 0x740A, 0xE7F0, - 0x740F, 0xE7F6, - 0x7410, 0xCBF6, - 0x741A, 0xE8A2, - 0x741B, 0xE8A1, - 0x7422, 0xD7C1, - 0x7425, 0xE7FA, - 0x7426, 0xE7F9, - 0x7428, 0xE7FB, - 0x742A, 0xE7F7, - 0x742C, 0xE7FE, - 0x742E, 0xE7FD, - 0x7430, 0xE7FC, - 0x7433, 0xC1D5, - 0x7434, 0xC7D9, - 0x7435, 0xC5FD, - 0x7436, 0xC5C3, - 0x743C, 0xC7ED, - 0x7441, 0xE8A3, - 0x7455, 0xE8A6, - 0x7457, 0xE8A5, - 0x7459, 0xE8A7, - 0x745A, 0xBAF7, - 0x745B, 0xE7F8, - 0x745C, 0xE8A4, - 0x745E, 0xC8F0, - 0x745F, 0xC9AA, - 0x746D, 0xE8A9, - 0x7470, 0xB9E5, - 0x7476, 0xD1FE, - 0x7477, 0xE8A8, - 0x747E, 0xE8AA, - 0x7480, 0xE8AD, - 0x7481, 0xE8AE, - 0x7483, 0xC1A7, - 0x7487, 0xE8AF, - 0x748B, 0xE8B0, - 0x748E, 0xE8AC, - 0x7490, 0xE8B4, - 0x749C, 0xE8AB, - 0x749E, 0xE8B1, - 0x74A7, 0xE8B5, - 0x74A8, 0xE8B2, - 0x74A9, 0xE8B3, - 0x74BA, 0xE8B7, - 0x74D2, 0xE8B6, - 0x74DC, 0xB9CF, - 0x74DE, 0xF0AC, - 0x74E0, 0xF0AD, - 0x74E2, 0xC6B0, - 0x74E3, 0xB0EA, - 0x74E4, 0xC8BF, - 0x74E6, 0xCDDF, - 0x74EE, 0xCECD, - 0x74EF, 0xEAB1, - 0x74F4, 0xEAB2, - 0x74F6, 0xC6BF, - 0x74F7, 0xB4C9, - 0x74FF, 0xEAB3, - 0x7504, 0xD5E7, - 0x750D, 0xDDF9, - 0x750F, 0xEAB4, - 0x7511, 0xEAB5, - 0x7513, 0xEAB6, - 0x7518, 0xB8CA, - 0x7519, 0xDFB0, - 0x751A, 0xC9F5, - 0x751C, 0xCCF0, - 0x751F, 0xC9FA, - 0x7525, 0xC9FB, - 0x7528, 0xD3C3, - 0x7529, 0xCBA6, - 0x752B, 0xB8A6, - 0x752C, 0xF0AE, - 0x752D, 0xB1C2, - 0x752F, 0xE5B8, - 0x7530, 0xCCEF, - 0x7531, 0xD3C9, - 0x7532, 0xBCD7, - 0x7533, 0xC9EA, - 0x7535, 0xB5E7, - 0x7537, 0xC4D0, - 0x7538, 0xB5E9, - 0x753A, 0xEEAE, - 0x753B, 0xBBAD, - 0x753E, 0xE7DE, - 0x7540, 0xEEAF, - 0x7545, 0xB3A9, - 0x7548, 0xEEB2, - 0x754B, 0xEEB1, - 0x754C, 0xBDE7, - 0x754E, 0xEEB0, - 0x754F, 0xCEB7, - 0x7554, 0xC5CF, - 0x7559, 0xC1F4, - 0x755A, 0xDBCE, - 0x755B, 0xEEB3, - 0x755C, 0xD0F3, - 0x7565, 0xC2D4, - 0x7566, 0xC6E8, - 0x756A, 0xB7AC, - 0x7572, 0xEEB4, - 0x7574, 0xB3EB, - 0x7578, 0xBBFB, - 0x7579, 0xEEB5, - 0x757F, 0xE7DC, - 0x7583, 0xEEB6, - 0x7586, 0xBDAE, - 0x758B, 0xF1E2, - 0x758F, 0xCAE8, - 0x7591, 0xD2C9, - 0x7592, 0xF0DA, - 0x7594, 0xF0DB, - 0x7596, 0xF0DC, - 0x7597, 0xC1C6, - 0x7599, 0xB8ED, - 0x759A, 0xBECE, - 0x759D, 0xF0DE, - 0x759F, 0xC5B1, - 0x75A0, 0xF0DD, - 0x75A1, 0xD1F1, - 0x75A3, 0xF0E0, - 0x75A4, 0xB0CC, - 0x75A5, 0xBDEA, - 0x75AB, 0xD2DF, - 0x75AC, 0xF0DF, - 0x75AE, 0xB4AF, - 0x75AF, 0xB7E8, - 0x75B0, 0xF0E6, - 0x75B1, 0xF0E5, - 0x75B2, 0xC6A3, - 0x75B3, 0xF0E1, - 0x75B4, 0xF0E2, - 0x75B5, 0xB4C3, - 0x75B8, 0xF0E3, - 0x75B9, 0xD5EE, - 0x75BC, 0xCCDB, - 0x75BD, 0xBED2, - 0x75BE, 0xBCB2, - 0x75C2, 0xF0E8, - 0x75C3, 0xF0E7, - 0x75C4, 0xF0E4, - 0x75C5, 0xB2A1, - 0x75C7, 0xD6A2, - 0x75C8, 0xD3B8, - 0x75C9, 0xBEB7, - 0x75CA, 0xC8AC, - 0x75CD, 0xF0EA, - 0x75D2, 0xD1F7, - 0x75D4, 0xD6CC, - 0x75D5, 0xBADB, - 0x75D6, 0xF0E9, - 0x75D8, 0xB6BB, - 0x75DB, 0xCDB4, - 0x75DE, 0xC6A6, - 0x75E2, 0xC1A1, - 0x75E3, 0xF0EB, - 0x75E4, 0xF0EE, - 0x75E6, 0xF0ED, - 0x75E7, 0xF0F0, - 0x75E8, 0xF0EC, - 0x75EA, 0xBBBE, - 0x75EB, 0xF0EF, - 0x75F0, 0xCCB5, - 0x75F1, 0xF0F2, - 0x75F4, 0xB3D5, - 0x75F9, 0xB1D4, - 0x75FC, 0xF0F3, - 0x75FF, 0xF0F4, - 0x7600, 0xF0F6, - 0x7601, 0xB4E1, - 0x7603, 0xF0F1, - 0x7605, 0xF0F7, - 0x760A, 0xF0FA, - 0x760C, 0xF0F8, - 0x7610, 0xF0F5, - 0x7615, 0xF0FD, - 0x7617, 0xF0F9, - 0x7618, 0xF0FC, - 0x7619, 0xF0FE, - 0x761B, 0xF1A1, - 0x761F, 0xCEC1, - 0x7620, 0xF1A4, - 0x7622, 0xF1A3, - 0x7624, 0xC1F6, - 0x7625, 0xF0FB, - 0x7626, 0xCADD, - 0x7629, 0xB4F1, - 0x762A, 0xB1F1, - 0x762B, 0xCCB1, - 0x762D, 0xF1A6, - 0x7630, 0xF1A7, - 0x7633, 0xF1AC, - 0x7634, 0xD5CE, - 0x7635, 0xF1A9, - 0x7638, 0xC8B3, - 0x763C, 0xF1A2, - 0x763E, 0xF1AB, - 0x763F, 0xF1A8, - 0x7640, 0xF1A5, - 0x7643, 0xF1AA, - 0x764C, 0xB0A9, - 0x764D, 0xF1AD, - 0x7654, 0xF1AF, - 0x7656, 0xF1B1, - 0x765C, 0xF1B0, - 0x765E, 0xF1AE, - 0x7663, 0xD1A2, - 0x766B, 0xF1B2, - 0x766F, 0xF1B3, - 0x7678, 0xB9EF, - 0x767B, 0xB5C7, - 0x767D, 0xB0D7, - 0x767E, 0xB0D9, - 0x7682, 0xD4ED, - 0x7684, 0xB5C4, - 0x7686, 0xBDD4, - 0x7687, 0xBBCA, - 0x7688, 0xF0A7, - 0x768B, 0xB8DE, - 0x768E, 0xF0A8, - 0x7691, 0xB0A8, - 0x7693, 0xF0A9, - 0x7696, 0xCDEE, - 0x7699, 0xF0AA, - 0x76A4, 0xF0AB, - 0x76AE, 0xC6A4, - 0x76B1, 0xD6E5, - 0x76B2, 0xF1E4, - 0x76B4, 0xF1E5, - 0x76BF, 0xC3F3, - 0x76C2, 0xD3DB, - 0x76C5, 0xD6D1, - 0x76C6, 0xC5E8, - 0x76C8, 0xD3AF, - 0x76CA, 0xD2E6, - 0x76CD, 0xEEC1, - 0x76CE, 0xB0BB, - 0x76CF, 0xD5B5, - 0x76D0, 0xD1CE, - 0x76D1, 0xBCE0, - 0x76D2, 0xBAD0, - 0x76D4, 0xBFF8, - 0x76D6, 0xB8C7, - 0x76D7, 0xB5C1, - 0x76D8, 0xC5CC, - 0x76DB, 0xCAA2, - 0x76DF, 0xC3CB, - 0x76E5, 0xEEC2, - 0x76EE, 0xC4BF, - 0x76EF, 0xB6A2, - 0x76F1, 0xEDEC, - 0x76F2, 0xC3A4, - 0x76F4, 0xD6B1, - 0x76F8, 0xCFE0, - 0x76F9, 0xEDEF, - 0x76FC, 0xC5CE, - 0x76FE, 0xB6DC, - 0x7701, 0xCAA1, - 0x7704, 0xEDED, - 0x7707, 0xEDF0, - 0x7708, 0xEDF1, - 0x7709, 0xC3BC, - 0x770B, 0xBFB4, - 0x770D, 0xEDEE, - 0x7719, 0xEDF4, - 0x771A, 0xEDF2, - 0x771F, 0xD5E6, - 0x7720, 0xC3DF, - 0x7722, 0xEDF3, - 0x7726, 0xEDF6, - 0x7728, 0xD5A3, - 0x7729, 0xD1A3, - 0x772D, 0xEDF5, - 0x772F, 0xC3D0, - 0x7735, 0xEDF7, - 0x7736, 0xBFF4, - 0x7737, 0xBEEC, - 0x7738, 0xEDF8, - 0x773A, 0xCCF7, - 0x773C, 0xD1DB, - 0x7740, 0xD7C5, - 0x7741, 0xD5F6, - 0x7743, 0xEDFC, - 0x7747, 0xEDFB, - 0x7750, 0xEDF9, - 0x7751, 0xEDFA, - 0x775A, 0xEDFD, - 0x775B, 0xBEA6, - 0x7761, 0xCBAF, - 0x7762, 0xEEA1, - 0x7763, 0xB6BD, - 0x7765, 0xEEA2, - 0x7766, 0xC4C0, - 0x7768, 0xEDFE, - 0x776B, 0xBDDE, - 0x776C, 0xB2C7, - 0x7779, 0xB6C3, - 0x777D, 0xEEA5, - 0x777E, 0xD8BA, - 0x777F, 0xEEA3, - 0x7780, 0xEEA6, - 0x7784, 0xC3E9, - 0x7785, 0xB3F2, - 0x778C, 0xEEA7, - 0x778D, 0xEEA4, - 0x778E, 0xCFB9, - 0x7791, 0xEEA8, - 0x7792, 0xC2F7, - 0x779F, 0xEEA9, - 0x77A0, 0xEEAA, - 0x77A2, 0xDEAB, - 0x77A5, 0xC6B3, - 0x77A7, 0xC7C6, - 0x77A9, 0xD6F5, - 0x77AA, 0xB5C9, - 0x77AC, 0xCBB2, - 0x77B0, 0xEEAB, - 0x77B3, 0xCDAB, - 0x77B5, 0xEEAC, - 0x77BB, 0xD5B0, - 0x77BD, 0xEEAD, - 0x77BF, 0xF6C4, - 0x77CD, 0xDBC7, - 0x77D7, 0xB4A3, - 0x77DB, 0xC3AC, - 0x77DC, 0xF1E6, - 0x77E2, 0xCAB8, - 0x77E3, 0xD2D3, - 0x77E5, 0xD6AA, - 0x77E7, 0xEFF2, - 0x77E9, 0xBED8, - 0x77EB, 0xBDC3, - 0x77EC, 0xEFF3, - 0x77ED, 0xB6CC, - 0x77EE, 0xB0AB, - 0x77F3, 0xCAAF, - 0x77F6, 0xEDB6, - 0x77F8, 0xEDB7, - 0x77FD, 0xCEF9, - 0x77FE, 0xB7AF, - 0x77FF, 0xBFF3, - 0x7800, 0xEDB8, - 0x7801, 0xC2EB, - 0x7802, 0xC9B0, - 0x7809, 0xEDB9, - 0x780C, 0xC6F6, - 0x780D, 0xBFB3, - 0x7811, 0xEDBC, - 0x7812, 0xC5F8, - 0x7814, 0xD1D0, - 0x7816, 0xD7A9, - 0x7817, 0xEDBA, - 0x7818, 0xEDBB, - 0x781A, 0xD1E2, - 0x781C, 0xEDBF, - 0x781D, 0xEDC0, - 0x781F, 0xEDC4, - 0x7823, 0xEDC8, - 0x7825, 0xEDC6, - 0x7826, 0xEDCE, - 0x7827, 0xD5E8, - 0x7829, 0xEDC9, - 0x782C, 0xEDC7, - 0x782D, 0xEDBE, - 0x7830, 0xC5E9, - 0x7834, 0xC6C6, - 0x7837, 0xC9E9, - 0x7838, 0xD4D2, - 0x7839, 0xEDC1, - 0x783A, 0xEDC2, - 0x783B, 0xEDC3, - 0x783C, 0xEDC5, - 0x783E, 0xC0F9, - 0x7840, 0xB4A1, - 0x7845, 0xB9E8, - 0x7847, 0xEDD0, - 0x784C, 0xEDD1, - 0x784E, 0xEDCA, - 0x7850, 0xEDCF, - 0x7852, 0xCEF8, - 0x7855, 0xCBB6, - 0x7856, 0xEDCC, - 0x7857, 0xEDCD, - 0x785D, 0xCFF5, - 0x786A, 0xEDD2, - 0x786B, 0xC1F2, - 0x786C, 0xD3B2, - 0x786D, 0xEDCB, - 0x786E, 0xC8B7, - 0x7877, 0xBCEF, - 0x787C, 0xC5F0, - 0x7887, 0xEDD6, - 0x7889, 0xB5EF, - 0x788C, 0xC2B5, - 0x788D, 0xB0AD, - 0x788E, 0xCBE9, - 0x7891, 0xB1AE, - 0x7893, 0xEDD4, - 0x7897, 0xCDEB, - 0x7898, 0xB5E2, - 0x789A, 0xEDD5, - 0x789B, 0xEDD3, - 0x789C, 0xEDD7, - 0x789F, 0xB5FA, - 0x78A1, 0xEDD8, - 0x78A3, 0xEDD9, - 0x78A5, 0xEDDC, - 0x78A7, 0xB1CC, - 0x78B0, 0xC5F6, - 0x78B1, 0xBCEE, - 0x78B2, 0xEDDA, - 0x78B3, 0xCCBC, - 0x78B4, 0xB2EA, - 0x78B9, 0xEDDB, - 0x78BE, 0xC4EB, - 0x78C1, 0xB4C5, - 0x78C5, 0xB0F5, - 0x78C9, 0xEDDF, - 0x78CA, 0xC0DA, - 0x78CB, 0xB4E8, - 0x78D0, 0xC5CD, - 0x78D4, 0xEDDD, - 0x78D5, 0xBFC4, - 0x78D9, 0xEDDE, - 0x78E8, 0xC4A5, - 0x78EC, 0xEDE0, - 0x78F2, 0xEDE1, - 0x78F4, 0xEDE3, - 0x78F7, 0xC1D7, - 0x78FA, 0xBBC7, - 0x7901, 0xBDB8, - 0x7905, 0xEDE2, - 0x7913, 0xEDE4, - 0x791E, 0xEDE6, - 0x7924, 0xEDE5, - 0x7934, 0xEDE7, - 0x793A, 0xCABE, - 0x793B, 0xECEA, - 0x793C, 0xC0F1, - 0x793E, 0xC9E7, - 0x7940, 0xECEB, - 0x7941, 0xC6EE, - 0x7946, 0xECEC, - 0x7948, 0xC6ED, - 0x7949, 0xECED, - 0x7953, 0xECF0, - 0x7956, 0xD7E6, - 0x7957, 0xECF3, - 0x795A, 0xECF1, - 0x795B, 0xECEE, - 0x795C, 0xECEF, - 0x795D, 0xD7A3, - 0x795E, 0xC9F1, - 0x795F, 0xCBEE, - 0x7960, 0xECF4, - 0x7962, 0xECF2, - 0x7965, 0xCFE9, - 0x7967, 0xECF6, - 0x7968, 0xC6B1, - 0x796D, 0xBCC0, - 0x796F, 0xECF5, - 0x7977, 0xB5BB, - 0x7978, 0xBBF6, - 0x797A, 0xECF7, - 0x7980, 0xD9F7, - 0x7981, 0xBDFB, - 0x7984, 0xC2BB, - 0x7985, 0xECF8, - 0x798A, 0xECF9, - 0x798F, 0xB8A3, - 0x799A, 0xECFA, - 0x79A7, 0xECFB, - 0x79B3, 0xECFC, - 0x79B9, 0xD3ED, - 0x79BA, 0xD8AE, - 0x79BB, 0xC0EB, - 0x79BD, 0xC7DD, - 0x79BE, 0xBACC, - 0x79C0, 0xD0E3, - 0x79C1, 0xCBBD, - 0x79C3, 0xCDBA, - 0x79C6, 0xB8D1, - 0x79C9, 0xB1FC, - 0x79CB, 0xC7EF, - 0x79CD, 0xD6D6, - 0x79D1, 0xBFC6, - 0x79D2, 0xC3EB, - 0x79D5, 0xEFF5, - 0x79D8, 0xC3D8, - 0x79DF, 0xD7E2, - 0x79E3, 0xEFF7, - 0x79E4, 0xB3D3, - 0x79E6, 0xC7D8, - 0x79E7, 0xD1ED, - 0x79E9, 0xD6C8, - 0x79EB, 0xEFF8, - 0x79ED, 0xEFF6, - 0x79EF, 0xBBFD, - 0x79F0, 0xB3C6, - 0x79F8, 0xBDD5, - 0x79FB, 0xD2C6, - 0x79FD, 0xBBE0, - 0x7A00, 0xCFA1, - 0x7A02, 0xEFFC, - 0x7A03, 0xEFFB, - 0x7A06, 0xEFF9, - 0x7A0B, 0xB3CC, - 0x7A0D, 0xC9D4, - 0x7A0E, 0xCBB0, - 0x7A14, 0xEFFE, - 0x7A17, 0xB0DE, - 0x7A1A, 0xD6C9, - 0x7A1E, 0xEFFD, - 0x7A20, 0xB3ED, - 0x7A23, 0xF6D5, - 0x7A33, 0xCEC8, - 0x7A37, 0xF0A2, - 0x7A39, 0xF0A1, - 0x7A3B, 0xB5BE, - 0x7A3C, 0xBCDA, - 0x7A3D, 0xBBFC, - 0x7A3F, 0xB8E5, - 0x7A46, 0xC4C2, - 0x7A51, 0xF0A3, - 0x7A57, 0xCBEB, - 0x7A70, 0xF0A6, - 0x7A74, 0xD1A8, - 0x7A76, 0xBEBF, - 0x7A77, 0xC7EE, - 0x7A78, 0xF1B6, - 0x7A79, 0xF1B7, - 0x7A7A, 0xBFD5, - 0x7A7F, 0xB4A9, - 0x7A80, 0xF1B8, - 0x7A81, 0xCDBB, - 0x7A83, 0xC7D4, - 0x7A84, 0xD5AD, - 0x7A86, 0xF1B9, - 0x7A88, 0xF1BA, - 0x7A8D, 0xC7CF, - 0x7A91, 0xD2A4, - 0x7A92, 0xD6CF, - 0x7A95, 0xF1BB, - 0x7A96, 0xBDD1, - 0x7A97, 0xB4B0, - 0x7A98, 0xBEBD, - 0x7A9C, 0xB4DC, - 0x7A9D, 0xCED1, - 0x7A9F, 0xBFDF, - 0x7AA0, 0xF1BD, - 0x7AA5, 0xBFFA, - 0x7AA6, 0xF1BC, - 0x7AA8, 0xF1BF, - 0x7AAC, 0xF1BE, - 0x7AAD, 0xF1C0, - 0x7AB3, 0xF1C1, - 0x7ABF, 0xC1FE, - 0x7ACB, 0xC1A2, - 0x7AD6, 0xCAFA, - 0x7AD9, 0xD5BE, - 0x7ADE, 0xBEBA, - 0x7ADF, 0xBEB9, - 0x7AE0, 0xD5C2, - 0x7AE3, 0xBFA2, - 0x7AE5, 0xCDAF, - 0x7AE6, 0xF1B5, - 0x7AED, 0xBDDF, - 0x7AEF, 0xB6CB, - 0x7AF9, 0xD6F1, - 0x7AFA, 0xF3C3, - 0x7AFD, 0xF3C4, - 0x7AFF, 0xB8CD, - 0x7B03, 0xF3C6, - 0x7B04, 0xF3C7, - 0x7B06, 0xB0CA, - 0x7B08, 0xF3C5, - 0x7B0A, 0xF3C9, - 0x7B0B, 0xCBF1, - 0x7B0F, 0xF3CB, - 0x7B11, 0xD0A6, - 0x7B14, 0xB1CA, - 0x7B15, 0xF3C8, - 0x7B19, 0xF3CF, - 0x7B1B, 0xB5D1, - 0x7B1E, 0xF3D7, - 0x7B20, 0xF3D2, - 0x7B24, 0xF3D4, - 0x7B25, 0xF3D3, - 0x7B26, 0xB7FB, - 0x7B28, 0xB1BF, - 0x7B2A, 0xF3CE, - 0x7B2B, 0xF3CA, - 0x7B2C, 0xB5DA, - 0x7B2E, 0xF3D0, - 0x7B31, 0xF3D1, - 0x7B33, 0xF3D5, - 0x7B38, 0xF3CD, - 0x7B3A, 0xBCE3, - 0x7B3C, 0xC1FD, - 0x7B3E, 0xF3D6, - 0x7B45, 0xF3DA, - 0x7B47, 0xF3CC, - 0x7B49, 0xB5C8, - 0x7B4B, 0xBDEE, - 0x7B4C, 0xF3DC, - 0x7B4F, 0xB7A4, - 0x7B50, 0xBFF0, - 0x7B51, 0xD6FE, - 0x7B52, 0xCDB2, - 0x7B54, 0xB4F0, - 0x7B56, 0xB2DF, - 0x7B58, 0xF3D8, - 0x7B5A, 0xF3D9, - 0x7B5B, 0xC9B8, - 0x7B5D, 0xF3DD, - 0x7B60, 0xF3DE, - 0x7B62, 0xF3E1, - 0x7B6E, 0xF3DF, - 0x7B71, 0xF3E3, - 0x7B72, 0xF3E2, - 0x7B75, 0xF3DB, - 0x7B77, 0xBFEA, - 0x7B79, 0xB3EF, - 0x7B7B, 0xF3E0, - 0x7B7E, 0xC7A9, - 0x7B80, 0xBCF2, - 0x7B85, 0xF3EB, - 0x7B8D, 0xB9BF, - 0x7B90, 0xF3E4, - 0x7B94, 0xB2AD, - 0x7B95, 0xBBFE, - 0x7B97, 0xCBE3, - 0x7B9C, 0xF3ED, - 0x7B9D, 0xF3E9, - 0x7BA1, 0xB9DC, - 0x7BA2, 0xF3EE, - 0x7BA6, 0xF3E5, - 0x7BA7, 0xF3E6, - 0x7BA8, 0xF3EA, - 0x7BA9, 0xC2E1, - 0x7BAA, 0xF3EC, - 0x7BAB, 0xF3EF, - 0x7BAC, 0xF3E8, - 0x7BAD, 0xBCFD, - 0x7BB1, 0xCFE4, - 0x7BB4, 0xF3F0, - 0x7BB8, 0xF3E7, - 0x7BC1, 0xF3F2, - 0x7BC6, 0xD7AD, - 0x7BC7, 0xC6AA, - 0x7BCC, 0xF3F3, - 0x7BD1, 0xF3F1, - 0x7BD3, 0xC2A8, - 0x7BD9, 0xB8DD, - 0x7BDA, 0xF3F5, - 0x7BDD, 0xF3F4, - 0x7BE1, 0xB4DB, - 0x7BE5, 0xF3F6, - 0x7BE6, 0xF3F7, - 0x7BEA, 0xF3F8, - 0x7BEE, 0xC0BA, - 0x7BF1, 0xC0E9, - 0x7BF7, 0xC5F1, - 0x7BFC, 0xF3FB, - 0x7BFE, 0xF3FA, - 0x7C07, 0xB4D8, - 0x7C0B, 0xF3FE, - 0x7C0C, 0xF3F9, - 0x7C0F, 0xF3FC, - 0x7C16, 0xF3FD, - 0x7C1F, 0xF4A1, - 0x7C26, 0xF4A3, - 0x7C27, 0xBBC9, - 0x7C2A, 0xF4A2, - 0x7C38, 0xF4A4, - 0x7C3F, 0xB2BE, - 0x7C40, 0xF4A6, - 0x7C41, 0xF4A5, - 0x7C4D, 0xBCAE, - 0x7C73, 0xC3D7, - 0x7C74, 0xD9E1, - 0x7C7B, 0xC0E0, - 0x7C7C, 0xF4CC, - 0x7C7D, 0xD7D1, - 0x7C89, 0xB7DB, - 0x7C91, 0xF4CE, - 0x7C92, 0xC1A3, - 0x7C95, 0xC6C9, - 0x7C97, 0xB4D6, - 0x7C98, 0xD5B3, - 0x7C9C, 0xF4D0, - 0x7C9D, 0xF4CF, - 0x7C9E, 0xF4D1, - 0x7C9F, 0xCBDA, - 0x7CA2, 0xF4D2, - 0x7CA4, 0xD4C1, - 0x7CA5, 0xD6E0, - 0x7CAA, 0xB7E0, - 0x7CAE, 0xC1B8, - 0x7CB1, 0xC1BB, - 0x7CB2, 0xF4D3, - 0x7CB3, 0xBEAC, - 0x7CB9, 0xB4E2, - 0x7CBC, 0xF4D4, - 0x7CBD, 0xF4D5, - 0x7CBE, 0xBEAB, - 0x7CC1, 0xF4D6, - 0x7CC5, 0xF4DB, - 0x7CC7, 0xF4D7, - 0x7CC8, 0xF4DA, - 0x7CCA, 0xBAFD, - 0x7CCC, 0xF4D8, - 0x7CCD, 0xF4D9, - 0x7CD5, 0xB8E2, - 0x7CD6, 0xCCC7, - 0x7CD7, 0xF4DC, - 0x7CD9, 0xB2DA, - 0x7CDC, 0xC3D3, - 0x7CDF, 0xD4E3, - 0x7CE0, 0xBFB7, - 0x7CE8, 0xF4DD, - 0x7CEF, 0xC5B4, - 0x7CF8, 0xF4E9, - 0x7CFB, 0xCFB5, - 0x7D0A, 0xCEC9, - 0x7D20, 0xCBD8, - 0x7D22, 0xCBF7, - 0x7D27, 0xBDF4, - 0x7D2B, 0xD7CF, - 0x7D2F, 0xC0DB, - 0x7D6E, 0xD0F5, - 0x7D77, 0xF4EA, - 0x7DA6, 0xF4EB, - 0x7DAE, 0xF4EC, - 0x7E3B, 0xF7E3, - 0x7E41, 0xB7B1, - 0x7E47, 0xF4ED, - 0x7E82, 0xD7EB, - 0x7E9B, 0xF4EE, - 0x7E9F, 0xE6F9, - 0x7EA0, 0xBEC0, - 0x7EA1, 0xE6FA, - 0x7EA2, 0xBAEC, - 0x7EA3, 0xE6FB, - 0x7EA4, 0xCFCB, - 0x7EA5, 0xE6FC, - 0x7EA6, 0xD4BC, - 0x7EA7, 0xBCB6, - 0x7EA8, 0xE6FD, - 0x7EA9, 0xE6FE, - 0x7EAA, 0xBCCD, - 0x7EAB, 0xC8D2, - 0x7EAC, 0xCEB3, - 0x7EAD, 0xE7A1, - 0x7EAF, 0xB4BF, - 0x7EB0, 0xE7A2, - 0x7EB1, 0xC9B4, - 0x7EB2, 0xB8D9, - 0x7EB3, 0xC4C9, - 0x7EB5, 0xD7DD, - 0x7EB6, 0xC2DA, - 0x7EB7, 0xB7D7, - 0x7EB8, 0xD6BD, - 0x7EB9, 0xCEC6, - 0x7EBA, 0xB7C4, - 0x7EBD, 0xC5A6, - 0x7EBE, 0xE7A3, - 0x7EBF, 0xCFDF, - 0x7EC0, 0xE7A4, - 0x7EC1, 0xE7A5, - 0x7EC2, 0xE7A6, - 0x7EC3, 0xC1B7, - 0x7EC4, 0xD7E9, - 0x7EC5, 0xC9F0, - 0x7EC6, 0xCFB8, - 0x7EC7, 0xD6AF, - 0x7EC8, 0xD6D5, - 0x7EC9, 0xE7A7, - 0x7ECA, 0xB0ED, - 0x7ECB, 0xE7A8, - 0x7ECC, 0xE7A9, - 0x7ECD, 0xC9DC, - 0x7ECE, 0xD2EF, - 0x7ECF, 0xBEAD, - 0x7ED0, 0xE7AA, - 0x7ED1, 0xB0F3, - 0x7ED2, 0xC8DE, - 0x7ED3, 0xBDE1, - 0x7ED4, 0xE7AB, - 0x7ED5, 0xC8C6, - 0x7ED7, 0xE7AC, - 0x7ED8, 0xBBE6, - 0x7ED9, 0xB8F8, - 0x7EDA, 0xD1A4, - 0x7EDB, 0xE7AD, - 0x7EDC, 0xC2E7, - 0x7EDD, 0xBEF8, - 0x7EDE, 0xBDCA, - 0x7EDF, 0xCDB3, - 0x7EE0, 0xE7AE, - 0x7EE1, 0xE7AF, - 0x7EE2, 0xBEEE, - 0x7EE3, 0xD0E5, - 0x7EE5, 0xCBE7, - 0x7EE6, 0xCCD0, - 0x7EE7, 0xBCCC, - 0x7EE8, 0xE7B0, - 0x7EE9, 0xBCA8, - 0x7EEA, 0xD0F7, - 0x7EEB, 0xE7B1, - 0x7EED, 0xD0F8, - 0x7EEE, 0xE7B2, - 0x7EEF, 0xE7B3, - 0x7EF0, 0xB4C2, - 0x7EF1, 0xE7B4, - 0x7EF2, 0xE7B5, - 0x7EF3, 0xC9FE, - 0x7EF4, 0xCEAC, - 0x7EF5, 0xC3E0, - 0x7EF6, 0xE7B7, - 0x7EF7, 0xB1C1, - 0x7EF8, 0xB3F1, - 0x7EFA, 0xE7B8, - 0x7EFB, 0xE7B9, - 0x7EFC, 0xD7DB, - 0x7EFD, 0xD5C0, - 0x7EFE, 0xE7BA, - 0x7EFF, 0xC2CC, - 0x7F00, 0xD7BA, - 0x7F01, 0xE7BB, - 0x7F02, 0xE7BC, - 0x7F03, 0xE7BD, - 0x7F04, 0xBCEA, - 0x7F05, 0xC3E5, - 0x7F06, 0xC0C2, - 0x7F07, 0xE7BE, - 0x7F08, 0xE7BF, - 0x7F09, 0xBCA9, - 0x7F0B, 0xE7C0, - 0x7F0C, 0xE7C1, - 0x7F0D, 0xE7B6, - 0x7F0E, 0xB6D0, - 0x7F0F, 0xE7C2, - 0x7F11, 0xE7C3, - 0x7F12, 0xE7C4, - 0x7F13, 0xBBBA, - 0x7F14, 0xB5DE, - 0x7F15, 0xC2C6, - 0x7F16, 0xB1E0, - 0x7F17, 0xE7C5, - 0x7F18, 0xD4B5, - 0x7F19, 0xE7C6, - 0x7F1A, 0xB8BF, - 0x7F1B, 0xE7C8, - 0x7F1C, 0xE7C7, - 0x7F1D, 0xB7EC, - 0x7F1F, 0xE7C9, - 0x7F20, 0xB2F8, - 0x7F21, 0xE7CA, - 0x7F22, 0xE7CB, - 0x7F23, 0xE7CC, - 0x7F24, 0xE7CD, - 0x7F25, 0xE7CE, - 0x7F26, 0xE7CF, - 0x7F27, 0xE7D0, - 0x7F28, 0xD3A7, - 0x7F29, 0xCBF5, - 0x7F2A, 0xE7D1, - 0x7F2B, 0xE7D2, - 0x7F2C, 0xE7D3, - 0x7F2D, 0xE7D4, - 0x7F2E, 0xC9C9, - 0x7F2F, 0xE7D5, - 0x7F30, 0xE7D6, - 0x7F31, 0xE7D7, - 0x7F32, 0xE7D8, - 0x7F33, 0xE7D9, - 0x7F34, 0xBDC9, - 0x7F35, 0xE7DA, - 0x7F36, 0xF3BE, - 0x7F38, 0xB8D7, - 0x7F3A, 0xC8B1, - 0x7F42, 0xF3BF, - 0x7F44, 0xF3C0, - 0x7F45, 0xF3C1, - 0x7F50, 0xB9DE, - 0x7F51, 0xCDF8, - 0x7F54, 0xD8E8, - 0x7F55, 0xBAB1, - 0x7F57, 0xC2DE, - 0x7F58, 0xEEB7, - 0x7F5A, 0xB7A3, - 0x7F5F, 0xEEB9, - 0x7F61, 0xEEB8, - 0x7F62, 0xB0D5, - 0x7F68, 0xEEBB, - 0x7F69, 0xD5D6, - 0x7F6A, 0xD7EF, - 0x7F6E, 0xD6C3, - 0x7F71, 0xEEBD, - 0x7F72, 0xCAF0, - 0x7F74, 0xEEBC, - 0x7F79, 0xEEBE, - 0x7F7E, 0xEEC0, - 0x7F81, 0xEEBF, - 0x7F8A, 0xD1F2, - 0x7F8C, 0xC7BC, - 0x7F8E, 0xC3C0, - 0x7F94, 0xB8E1, - 0x7F9A, 0xC1E7, - 0x7F9D, 0xF4C6, - 0x7F9E, 0xD0DF, - 0x7F9F, 0xF4C7, - 0x7FA1, 0xCFDB, - 0x7FA4, 0xC8BA, - 0x7FA7, 0xF4C8, - 0x7FAF, 0xF4C9, - 0x7FB0, 0xF4CA, - 0x7FB2, 0xF4CB, - 0x7FB8, 0xD9FA, - 0x7FB9, 0xB8FE, - 0x7FBC, 0xE5F1, - 0x7FBD, 0xD3F0, - 0x7FBF, 0xF4E0, - 0x7FC1, 0xCECC, - 0x7FC5, 0xB3E1, - 0x7FCA, 0xF1B4, - 0x7FCC, 0xD2EE, - 0x7FCE, 0xF4E1, - 0x7FD4, 0xCFE8, - 0x7FD5, 0xF4E2, - 0x7FD8, 0xC7CC, - 0x7FDF, 0xB5D4, - 0x7FE0, 0xB4E4, - 0x7FE1, 0xF4E4, - 0x7FE5, 0xF4E3, - 0x7FE6, 0xF4E5, - 0x7FE9, 0xF4E6, - 0x7FEE, 0xF4E7, - 0x7FF0, 0xBAB2, - 0x7FF1, 0xB0BF, - 0x7FF3, 0xF4E8, - 0x7FFB, 0xB7AD, - 0x7FFC, 0xD2ED, - 0x8000, 0xD2AB, - 0x8001, 0xC0CF, - 0x8003, 0xBFBC, - 0x8004, 0xEBA3, - 0x8005, 0xD5DF, - 0x8006, 0xEAC8, - 0x800B, 0xF1F3, - 0x800C, 0xB6F8, - 0x800D, 0xCBA3, - 0x8010, 0xC4CD, - 0x8012, 0xF1E7, - 0x8014, 0xF1E8, - 0x8015, 0xB8FB, - 0x8016, 0xF1E9, - 0x8017, 0xBAC4, - 0x8018, 0xD4C5, - 0x8019, 0xB0D2, - 0x801C, 0xF1EA, - 0x8020, 0xF1EB, - 0x8022, 0xF1EC, - 0x8025, 0xF1ED, - 0x8026, 0xF1EE, - 0x8027, 0xF1EF, - 0x8028, 0xF1F1, - 0x8029, 0xF1F0, - 0x802A, 0xC5D5, - 0x8031, 0xF1F2, - 0x8033, 0xB6FA, - 0x8035, 0xF1F4, - 0x8036, 0xD2AE, - 0x8037, 0xDEC7, - 0x8038, 0xCBCA, - 0x803B, 0xB3DC, - 0x803D, 0xB5A2, - 0x803F, 0xB9A2, - 0x8042, 0xC4F4, - 0x8043, 0xF1F5, - 0x8046, 0xF1F6, - 0x804A, 0xC1C4, - 0x804B, 0xC1FB, - 0x804C, 0xD6B0, - 0x804D, 0xF1F7, - 0x8052, 0xF1F8, - 0x8054, 0xC1AA, - 0x8058, 0xC6B8, - 0x805A, 0xBEDB, - 0x8069, 0xF1F9, - 0x806A, 0xB4CF, - 0x8071, 0xF1FA, - 0x807F, 0xEDB2, - 0x8080, 0xEDB1, - 0x8083, 0xCBE0, - 0x8084, 0xD2DE, - 0x8086, 0xCBC1, - 0x8087, 0xD5D8, - 0x8089, 0xC8E2, - 0x808B, 0xC0DF, - 0x808C, 0xBCA1, - 0x8093, 0xEBC1, - 0x8096, 0xD0A4, - 0x8098, 0xD6E2, - 0x809A, 0xB6C7, - 0x809B, 0xB8D8, - 0x809C, 0xEBC0, - 0x809D, 0xB8CE, - 0x809F, 0xEBBF, - 0x80A0, 0xB3A6, - 0x80A1, 0xB9C9, - 0x80A2, 0xD6AB, - 0x80A4, 0xB7F4, - 0x80A5, 0xB7CA, - 0x80A9, 0xBCE7, - 0x80AA, 0xB7BE, - 0x80AB, 0xEBC6, - 0x80AD, 0xEBC7, - 0x80AE, 0xB0B9, - 0x80AF, 0xBFCF, - 0x80B1, 0xEBC5, - 0x80B2, 0xD3FD, - 0x80B4, 0xEBC8, - 0x80B7, 0xEBC9, - 0x80BA, 0xB7CE, - 0x80BC, 0xEBC2, - 0x80BD, 0xEBC4, - 0x80BE, 0xC9F6, - 0x80BF, 0xD6D7, - 0x80C0, 0xD5CD, - 0x80C1, 0xD0B2, - 0x80C2, 0xEBCF, - 0x80C3, 0xCEB8, - 0x80C4, 0xEBD0, - 0x80C6, 0xB5A8, - 0x80CC, 0xB1B3, - 0x80CD, 0xEBD2, - 0x80CE, 0xCCA5, - 0x80D6, 0xC5D6, - 0x80D7, 0xEBD3, - 0x80D9, 0xEBD1, - 0x80DA, 0xC5DF, - 0x80DB, 0xEBCE, - 0x80DC, 0xCAA4, - 0x80DD, 0xEBD5, - 0x80DE, 0xB0FB, - 0x80E1, 0xBAFA, - 0x80E4, 0xD8B7, - 0x80E5, 0xF1E3, - 0x80E7, 0xEBCA, - 0x80E8, 0xEBCB, - 0x80E9, 0xEBCC, - 0x80EA, 0xEBCD, - 0x80EB, 0xEBD6, - 0x80EC, 0xE6C0, - 0x80ED, 0xEBD9, - 0x80EF, 0xBFE8, - 0x80F0, 0xD2C8, - 0x80F1, 0xEBD7, - 0x80F2, 0xEBDC, - 0x80F3, 0xB8EC, - 0x80F4, 0xEBD8, - 0x80F6, 0xBDBA, - 0x80F8, 0xD0D8, - 0x80FA, 0xB0B7, - 0x80FC, 0xEBDD, - 0x80FD, 0xC4DC, - 0x8102, 0xD6AC, - 0x8106, 0xB4E0, - 0x8109, 0xC2F6, - 0x810A, 0xBCB9, - 0x810D, 0xEBDA, - 0x810E, 0xEBDB, - 0x810F, 0xD4E0, - 0x8110, 0xC6EA, - 0x8111, 0xC4D4, - 0x8112, 0xEBDF, - 0x8113, 0xC5A7, - 0x8114, 0xD9F5, - 0x8116, 0xB2B1, - 0x8118, 0xEBE4, - 0x811A, 0xBDC5, - 0x811E, 0xEBE2, - 0x812C, 0xEBE3, - 0x812F, 0xB8AC, - 0x8131, 0xCDD1, - 0x8132, 0xEBE5, - 0x8136, 0xEBE1, - 0x8138, 0xC1B3, - 0x813E, 0xC6A2, - 0x8146, 0xCCF3, - 0x8148, 0xEBE6, - 0x814A, 0xC0B0, - 0x814B, 0xD2B8, - 0x814C, 0xEBE7, - 0x8150, 0xB8AF, - 0x8151, 0xB8AD, - 0x8153, 0xEBE8, - 0x8154, 0xC7BB, - 0x8155, 0xCDF3, - 0x8159, 0xEBEA, - 0x815A, 0xEBEB, - 0x8160, 0xEBED, - 0x8165, 0xD0C8, - 0x8167, 0xEBF2, - 0x8169, 0xEBEE, - 0x816D, 0xEBF1, - 0x816E, 0xC8F9, - 0x8170, 0xD1FC, - 0x8171, 0xEBEC, - 0x8174, 0xEBE9, - 0x8179, 0xB8B9, - 0x817A, 0xCFD9, - 0x817B, 0xC4E5, - 0x817C, 0xEBEF, - 0x817D, 0xEBF0, - 0x817E, 0xCCDA, - 0x817F, 0xCDC8, - 0x8180, 0xB0F2, - 0x8182, 0xEBF6, - 0x8188, 0xEBF5, - 0x818A, 0xB2B2, - 0x818F, 0xB8E0, - 0x8191, 0xEBF7, - 0x8198, 0xB1EC, - 0x819B, 0xCCC5, - 0x819C, 0xC4A4, - 0x819D, 0xCFA5, - 0x81A3, 0xEBF9, - 0x81A6, 0xECA2, - 0x81A8, 0xC5F2, - 0x81AA, 0xEBFA, - 0x81B3, 0xC9C5, - 0x81BA, 0xE2DF, - 0x81BB, 0xEBFE, - 0x81C0, 0xCDCE, - 0x81C1, 0xECA1, - 0x81C2, 0xB1DB, - 0x81C3, 0xD3B7, - 0x81C6, 0xD2DC, - 0x81CA, 0xEBFD, - 0x81CC, 0xEBFB, - 0x81E3, 0xB3BC, - 0x81E7, 0xEAB0, - 0x81EA, 0xD7D4, - 0x81EC, 0xF4AB, - 0x81ED, 0xB3F4, - 0x81F3, 0xD6C1, - 0x81F4, 0xD6C2, - 0x81FB, 0xD5E9, - 0x81FC, 0xBECA, - 0x81FE, 0xF4A7, - 0x8200, 0xD2A8, - 0x8201, 0xF4A8, - 0x8202, 0xF4A9, - 0x8204, 0xF4AA, - 0x8205, 0xBECB, - 0x8206, 0xD3DF, - 0x820C, 0xC9E0, - 0x820D, 0xC9E1, - 0x8210, 0xF3C2, - 0x8212, 0xCAE6, - 0x8214, 0xCCF2, - 0x821B, 0xE2B6, - 0x821C, 0xCBB4, - 0x821E, 0xCEE8, - 0x821F, 0xD6DB, - 0x8221, 0xF4AD, - 0x8222, 0xF4AE, - 0x8223, 0xF4AF, - 0x8228, 0xF4B2, - 0x822A, 0xBABD, - 0x822B, 0xF4B3, - 0x822C, 0xB0E3, - 0x822D, 0xF4B0, - 0x822F, 0xF4B1, - 0x8230, 0xBDA2, - 0x8231, 0xB2D5, - 0x8233, 0xF4B6, - 0x8234, 0xF4B7, - 0x8235, 0xB6E6, - 0x8236, 0xB2B0, - 0x8237, 0xCFCF, - 0x8238, 0xF4B4, - 0x8239, 0xB4AC, - 0x823B, 0xF4B5, - 0x823E, 0xF4B8, - 0x8244, 0xF4B9, - 0x8247, 0xCDA7, - 0x8249, 0xF4BA, - 0x824B, 0xF4BB, - 0x824F, 0xF4BC, - 0x8258, 0xCBD2, - 0x825A, 0xF4BD, - 0x825F, 0xF4BE, - 0x8268, 0xF4BF, - 0x826E, 0xF4DE, - 0x826F, 0xC1BC, - 0x8270, 0xBCE8, - 0x8272, 0xC9AB, - 0x8273, 0xD1DE, - 0x8274, 0xE5F5, - 0x8279, 0xDCB3, - 0x827A, 0xD2D5, - 0x827D, 0xDCB4, - 0x827E, 0xB0AC, - 0x827F, 0xDCB5, - 0x8282, 0xBDDA, - 0x8284, 0xDCB9, - 0x8288, 0xD8C2, - 0x828A, 0xDCB7, - 0x828B, 0xD3F3, - 0x828D, 0xC9D6, - 0x828E, 0xDCBA, - 0x828F, 0xDCB6, - 0x8291, 0xDCBB, - 0x8292, 0xC3A2, - 0x8297, 0xDCBC, - 0x8298, 0xDCC5, - 0x8299, 0xDCBD, - 0x829C, 0xCEDF, - 0x829D, 0xD6A5, - 0x829F, 0xDCCF, - 0x82A1, 0xDCCD, - 0x82A4, 0xDCD2, - 0x82A5, 0xBDE6, - 0x82A6, 0xC2AB, - 0x82A8, 0xDCB8, - 0x82A9, 0xDCCB, - 0x82AA, 0xDCCE, - 0x82AB, 0xDCBE, - 0x82AC, 0xB7D2, - 0x82AD, 0xB0C5, - 0x82AE, 0xDCC7, - 0x82AF, 0xD0BE, - 0x82B0, 0xDCC1, - 0x82B1, 0xBBA8, - 0x82B3, 0xB7BC, - 0x82B4, 0xDCCC, - 0x82B7, 0xDCC6, - 0x82B8, 0xDCBF, - 0x82B9, 0xC7DB, - 0x82BD, 0xD1BF, - 0x82BE, 0xDCC0, - 0x82C1, 0xDCCA, - 0x82C4, 0xDCD0, - 0x82C7, 0xCEAD, - 0x82C8, 0xDCC2, - 0x82CA, 0xDCC3, - 0x82CB, 0xDCC8, - 0x82CC, 0xDCC9, - 0x82CD, 0xB2D4, - 0x82CE, 0xDCD1, - 0x82CF, 0xCBD5, - 0x82D1, 0xD4B7, - 0x82D2, 0xDCDB, - 0x82D3, 0xDCDF, - 0x82D4, 0xCCA6, - 0x82D5, 0xDCE6, - 0x82D7, 0xC3E7, - 0x82D8, 0xDCDC, - 0x82DB, 0xBFC1, - 0x82DC, 0xDCD9, - 0x82DE, 0xB0FA, - 0x82DF, 0xB9B6, - 0x82E0, 0xDCE5, - 0x82E1, 0xDCD3, - 0x82E3, 0xDCC4, - 0x82E4, 0xDCD6, - 0x82E5, 0xC8F4, - 0x82E6, 0xBFE0, - 0x82EB, 0xC9BB, - 0x82EF, 0xB1BD, - 0x82F1, 0xD3A2, - 0x82F4, 0xDCDA, - 0x82F7, 0xDCD5, - 0x82F9, 0xC6BB, - 0x82FB, 0xDCDE, - 0x8301, 0xD7C2, - 0x8302, 0xC3AF, - 0x8303, 0xB7B6, - 0x8304, 0xC7D1, - 0x8305, 0xC3A9, - 0x8306, 0xDCE2, - 0x8307, 0xDCD8, - 0x8308, 0xDCEB, - 0x8309, 0xDCD4, - 0x830C, 0xDCDD, - 0x830E, 0xBEA5, - 0x830F, 0xDCD7, - 0x8311, 0xDCE0, - 0x8314, 0xDCE3, - 0x8315, 0xDCE4, - 0x8317, 0xDCF8, - 0x831A, 0xDCE1, - 0x831B, 0xDDA2, - 0x831C, 0xDCE7, - 0x8327, 0xBCEB, - 0x8328, 0xB4C4, - 0x832B, 0xC3A3, - 0x832C, 0xB2E7, - 0x832D, 0xDCFA, - 0x832F, 0xDCF2, - 0x8331, 0xDCEF, - 0x8333, 0xDCFC, - 0x8334, 0xDCEE, - 0x8335, 0xD2F0, - 0x8336, 0xB2E8, - 0x8338, 0xC8D7, - 0x8339, 0xC8E3, - 0x833A, 0xDCFB, - 0x833C, 0xDCED, - 0x8340, 0xDCF7, - 0x8343, 0xDCF5, - 0x8346, 0xBEA3, - 0x8347, 0xDCF4, - 0x8349, 0xB2DD, - 0x834F, 0xDCF3, - 0x8350, 0xBCF6, - 0x8351, 0xDCE8, - 0x8352, 0xBBC4, - 0x8354, 0xC0F3, - 0x835A, 0xBCD4, - 0x835B, 0xDCE9, - 0x835C, 0xDCEA, - 0x835E, 0xDCF1, - 0x835F, 0xDCF6, - 0x8360, 0xDCF9, - 0x8361, 0xB5B4, - 0x8363, 0xC8D9, - 0x8364, 0xBBE7, - 0x8365, 0xDCFE, - 0x8366, 0xDCFD, - 0x8367, 0xD3AB, - 0x8368, 0xDDA1, - 0x8369, 0xDDA3, - 0x836A, 0xDDA5, - 0x836B, 0xD2F1, - 0x836C, 0xDDA4, - 0x836D, 0xDDA6, - 0x836E, 0xDDA7, - 0x836F, 0xD2A9, - 0x8377, 0xBAC9, - 0x8378, 0xDDA9, - 0x837B, 0xDDB6, - 0x837C, 0xDDB1, - 0x837D, 0xDDB4, - 0x8385, 0xDDB0, - 0x8386, 0xC6CE, - 0x8389, 0xC0F2, - 0x838E, 0xC9AF, - 0x8392, 0xDCEC, - 0x8393, 0xDDAE, - 0x8398, 0xDDB7, - 0x839B, 0xDCF0, - 0x839C, 0xDDAF, - 0x839E, 0xDDB8, - 0x83A0, 0xDDAC, - 0x83A8, 0xDDB9, - 0x83A9, 0xDDB3, - 0x83AA, 0xDDAD, - 0x83AB, 0xC4AA, - 0x83B0, 0xDDA8, - 0x83B1, 0xC0B3, - 0x83B2, 0xC1AB, - 0x83B3, 0xDDAA, - 0x83B4, 0xDDAB, - 0x83B6, 0xDDB2, - 0x83B7, 0xBBF1, - 0x83B8, 0xDDB5, - 0x83B9, 0xD3A8, - 0x83BA, 0xDDBA, - 0x83BC, 0xDDBB, - 0x83BD, 0xC3A7, - 0x83C0, 0xDDD2, - 0x83C1, 0xDDBC, - 0x83C5, 0xDDD1, - 0x83C7, 0xB9BD, - 0x83CA, 0xBED5, - 0x83CC, 0xBEFA, - 0x83CF, 0xBACA, - 0x83D4, 0xDDCA, - 0x83D6, 0xDDC5, - 0x83D8, 0xDDBF, - 0x83DC, 0xB2CB, - 0x83DD, 0xDDC3, - 0x83DF, 0xDDCB, - 0x83E0, 0xB2A4, - 0x83E1, 0xDDD5, - 0x83E5, 0xDDBE, - 0x83E9, 0xC6D0, - 0x83EA, 0xDDD0, - 0x83F0, 0xDDD4, - 0x83F1, 0xC1E2, - 0x83F2, 0xB7C6, - 0x83F8, 0xDDCE, - 0x83F9, 0xDDCF, - 0x83FD, 0xDDC4, - 0x8401, 0xDDBD, - 0x8403, 0xDDCD, - 0x8404, 0xCCD1, - 0x8406, 0xDDC9, - 0x840B, 0xDDC2, - 0x840C, 0xC3C8, - 0x840D, 0xC6BC, - 0x840E, 0xCEAE, - 0x840F, 0xDDCC, - 0x8411, 0xDDC8, - 0x8418, 0xDDC1, - 0x841C, 0xDDC6, - 0x841D, 0xC2DC, - 0x8424, 0xD3A9, - 0x8425, 0xD3AA, - 0x8426, 0xDDD3, - 0x8427, 0xCFF4, - 0x8428, 0xC8F8, - 0x8431, 0xDDE6, - 0x8438, 0xDDC7, - 0x843C, 0xDDE0, - 0x843D, 0xC2E4, - 0x8446, 0xDDE1, - 0x8451, 0xDDD7, - 0x8457, 0xD6F8, - 0x8459, 0xDDD9, - 0x845A, 0xDDD8, - 0x845B, 0xB8F0, - 0x845C, 0xDDD6, - 0x8461, 0xC6CF, - 0x8463, 0xB6AD, - 0x8469, 0xDDE2, - 0x846B, 0xBAF9, - 0x846C, 0xD4E1, - 0x846D, 0xDDE7, - 0x8471, 0xB4D0, - 0x8473, 0xDDDA, - 0x8475, 0xBFFB, - 0x8476, 0xDDE3, - 0x8478, 0xDDDF, - 0x847A, 0xDDDD, - 0x8482, 0xB5D9, - 0x8487, 0xDDDB, - 0x8488, 0xDDDC, - 0x8489, 0xDDDE, - 0x848B, 0xBDAF, - 0x848C, 0xDDE4, - 0x848E, 0xDDE5, - 0x8497, 0xDDF5, - 0x8499, 0xC3C9, - 0x849C, 0xCBE2, - 0x84A1, 0xDDF2, - 0x84AF, 0xD8E1, - 0x84B2, 0xC6D1, - 0x84B4, 0xDDF4, - 0x84B8, 0xD5F4, - 0x84B9, 0xDDF3, - 0x84BA, 0xDDF0, - 0x84BD, 0xDDEC, - 0x84BF, 0xDDEF, - 0x84C1, 0xDDE8, - 0x84C4, 0xD0EE, - 0x84C9, 0xC8D8, - 0x84CA, 0xDDEE, - 0x84CD, 0xDDE9, - 0x84D0, 0xDDEA, - 0x84D1, 0xCBF2, - 0x84D3, 0xDDED, - 0x84D6, 0xB1CD, - 0x84DD, 0xC0B6, - 0x84DF, 0xBCBB, - 0x84E0, 0xDDF1, - 0x84E3, 0xDDF7, - 0x84E5, 0xDDF6, - 0x84E6, 0xDDEB, - 0x84EC, 0xC5EE, - 0x84F0, 0xDDFB, - 0x84FC, 0xDEA4, - 0x84FF, 0xDEA3, - 0x850C, 0xDDF8, - 0x8511, 0xC3EF, - 0x8513, 0xC2FB, - 0x8517, 0xD5E1, - 0x851A, 0xCEB5, - 0x851F, 0xDDFD, - 0x8521, 0xB2CC, - 0x852B, 0xC4E8, - 0x852C, 0xCADF, - 0x8537, 0xC7BE, - 0x8538, 0xDDFA, - 0x8539, 0xDDFC, - 0x853A, 0xDDFE, - 0x853B, 0xDEA2, - 0x853C, 0xB0AA, - 0x853D, 0xB1CE, - 0x8543, 0xDEAC, - 0x8548, 0xDEA6, - 0x8549, 0xBDB6, - 0x854A, 0xC8EF, - 0x8556, 0xDEA1, - 0x8559, 0xDEA5, - 0x855E, 0xDEA9, - 0x8564, 0xDEA8, - 0x8568, 0xDEA7, - 0x8572, 0xDEAD, - 0x8574, 0xD4CC, - 0x8579, 0xDEB3, - 0x857A, 0xDEAA, - 0x857B, 0xDEAE, - 0x857E, 0xC0D9, - 0x8584, 0xB1A1, - 0x8585, 0xDEB6, - 0x8587, 0xDEB1, - 0x858F, 0xDEB2, - 0x859B, 0xD1A6, - 0x859C, 0xDEB5, - 0x85A4, 0xDEAF, - 0x85A8, 0xDEB0, - 0x85AA, 0xD0BD, - 0x85AE, 0xDEB4, - 0x85AF, 0xCAED, - 0x85B0, 0xDEB9, - 0x85B7, 0xDEB8, - 0x85B9, 0xDEB7, - 0x85C1, 0xDEBB, - 0x85C9, 0xBDE5, - 0x85CF, 0xB2D8, - 0x85D0, 0xC3EA, - 0x85D3, 0xDEBA, - 0x85D5, 0xC5BA, - 0x85DC, 0xDEBC, - 0x85E4, 0xCCD9, - 0x85E9, 0xB7AA, - 0x85FB, 0xD4E5, - 0x85FF, 0xDEBD, - 0x8605, 0xDEBF, - 0x8611, 0xC4A2, - 0x8616, 0xDEC1, - 0x8627, 0xDEBE, - 0x8629, 0xDEC0, - 0x8638, 0xD5BA, - 0x863C, 0xDEC2, - 0x864D, 0xF2AE, - 0x864E, 0xBBA2, - 0x864F, 0xC2B2, - 0x8650, 0xC5B0, - 0x8651, 0xC2C7, - 0x8654, 0xF2AF, - 0x865A, 0xD0E9, - 0x865E, 0xD3DD, - 0x8662, 0xEBBD, - 0x866B, 0xB3E6, - 0x866C, 0xF2B0, - 0x866E, 0xF2B1, - 0x8671, 0xCAAD, - 0x8679, 0xBAE7, - 0x867A, 0xF2B3, - 0x867B, 0xF2B5, - 0x867C, 0xF2B4, - 0x867D, 0xCBE4, - 0x867E, 0xCFBA, - 0x867F, 0xF2B2, - 0x8680, 0xCAB4, - 0x8681, 0xD2CF, - 0x8682, 0xC2EC, - 0x868A, 0xCEC3, - 0x868B, 0xF2B8, - 0x868C, 0xB0F6, - 0x868D, 0xF2B7, - 0x8693, 0xF2BE, - 0x8695, 0xB2CF, - 0x869C, 0xD1C1, - 0x869D, 0xF2BA, - 0x86A3, 0xF2BC, - 0x86A4, 0xD4E9, - 0x86A7, 0xF2BB, - 0x86A8, 0xF2B6, - 0x86A9, 0xF2BF, - 0x86AA, 0xF2BD, - 0x86AC, 0xF2B9, - 0x86AF, 0xF2C7, - 0x86B0, 0xF2C4, - 0x86B1, 0xF2C6, - 0x86B4, 0xF2CA, - 0x86B5, 0xF2C2, - 0x86B6, 0xF2C0, - 0x86BA, 0xF2C5, - 0x86C0, 0xD6FB, - 0x86C4, 0xF2C1, - 0x86C6, 0xC7F9, - 0x86C7, 0xC9DF, - 0x86C9, 0xF2C8, - 0x86CA, 0xB9C6, - 0x86CB, 0xB5B0, - 0x86CE, 0xF2C3, - 0x86CF, 0xF2C9, - 0x86D0, 0xF2D0, - 0x86D1, 0xF2D6, - 0x86D4, 0xBBD7, - 0x86D8, 0xF2D5, - 0x86D9, 0xCDDC, - 0x86DB, 0xD6EB, - 0x86DE, 0xF2D2, - 0x86DF, 0xF2D4, - 0x86E4, 0xB8F2, - 0x86E9, 0xF2CB, - 0x86ED, 0xF2CE, - 0x86EE, 0xC2F9, - 0x86F0, 0xD5DD, - 0x86F1, 0xF2CC, - 0x86F2, 0xF2CD, - 0x86F3, 0xF2CF, - 0x86F4, 0xF2D3, - 0x86F8, 0xF2D9, - 0x86F9, 0xD3BC, - 0x86FE, 0xB6EA, - 0x8700, 0xCAF1, - 0x8702, 0xB7E4, - 0x8703, 0xF2D7, - 0x8707, 0xF2D8, - 0x8708, 0xF2DA, - 0x8709, 0xF2DD, - 0x870A, 0xF2DB, - 0x870D, 0xF2DC, - 0x8712, 0xD1D1, - 0x8713, 0xF2D1, - 0x8715, 0xCDC9, - 0x8717, 0xCECF, - 0x8718, 0xD6A9, - 0x871A, 0xF2E3, - 0x871C, 0xC3DB, - 0x871E, 0xF2E0, - 0x8721, 0xC0AF, - 0x8722, 0xF2EC, - 0x8723, 0xF2DE, - 0x8725, 0xF2E1, - 0x8729, 0xF2E8, - 0x872E, 0xF2E2, - 0x8731, 0xF2E7, - 0x8734, 0xF2E6, - 0x8737, 0xF2E9, - 0x873B, 0xF2DF, - 0x873E, 0xF2E4, - 0x873F, 0xF2EA, - 0x8747, 0xD3AC, - 0x8748, 0xF2E5, - 0x8749, 0xB2F5, - 0x874C, 0xF2F2, - 0x874E, 0xD0AB, - 0x8753, 0xF2F5, - 0x8757, 0xBBC8, - 0x8759, 0xF2F9, - 0x8760, 0xF2F0, - 0x8763, 0xF2F6, - 0x8764, 0xF2F8, - 0x8765, 0xF2FA, - 0x876E, 0xF2F3, - 0x8770, 0xF2F1, - 0x8774, 0xBAFB, - 0x8776, 0xB5FB, - 0x877B, 0xF2EF, - 0x877C, 0xF2F7, - 0x877D, 0xF2ED, - 0x877E, 0xF2EE, - 0x8782, 0xF2EB, - 0x8783, 0xF3A6, - 0x8785, 0xF3A3, - 0x8788, 0xF3A2, - 0x878B, 0xF2F4, - 0x878D, 0xC8DA, - 0x8793, 0xF2FB, - 0x8797, 0xF3A5, - 0x879F, 0xC3F8, - 0x87A8, 0xF2FD, - 0x87AB, 0xF3A7, - 0x87AC, 0xF3A9, - 0x87AD, 0xF3A4, - 0x87AF, 0xF2FC, - 0x87B3, 0xF3AB, - 0x87B5, 0xF3AA, - 0x87BA, 0xC2DD, - 0x87BD, 0xF3AE, - 0x87C0, 0xF3B0, - 0x87C6, 0xF3A1, - 0x87CA, 0xF3B1, - 0x87CB, 0xF3AC, - 0x87D1, 0xF3AF, - 0x87D2, 0xF2FE, - 0x87D3, 0xF3AD, - 0x87DB, 0xF3B2, - 0x87E0, 0xF3B4, - 0x87E5, 0xF3A8, - 0x87EA, 0xF3B3, - 0x87EE, 0xF3B5, - 0x87F9, 0xD0B7, - 0x87FE, 0xF3B8, - 0x8803, 0xD9F9, - 0x880A, 0xF3B9, - 0x8813, 0xF3B7, - 0x8815, 0xC8E4, - 0x8816, 0xF3B6, - 0x881B, 0xF3BA, - 0x8821, 0xF3BB, - 0x8822, 0xB4C0, - 0x8832, 0xEEC3, - 0x8839, 0xF3BC, - 0x883C, 0xF3BD, - 0x8840, 0xD1AA, - 0x8844, 0xF4AC, - 0x8845, 0xD0C6, - 0x884C, 0xD0D0, - 0x884D, 0xD1DC, - 0x8854, 0xCFCE, - 0x8857, 0xBDD6, - 0x8859, 0xD1C3, - 0x8861, 0xBAE2, - 0x8862, 0xE1E9, - 0x8863, 0xD2C2, - 0x8864, 0xF1C2, - 0x8865, 0xB2B9, - 0x8868, 0xB1ED, - 0x8869, 0xF1C3, - 0x886B, 0xC9C0, - 0x886C, 0xB3C4, - 0x886E, 0xD9F2, - 0x8870, 0xCBA5, - 0x8872, 0xF1C4, - 0x8877, 0xD6D4, - 0x887D, 0xF1C5, - 0x887E, 0xF4C0, - 0x887F, 0xF1C6, - 0x8881, 0xD4AC, - 0x8882, 0xF1C7, - 0x8884, 0xB0C0, - 0x8885, 0xF4C1, - 0x8888, 0xF4C2, - 0x888B, 0xB4FC, - 0x888D, 0xC5DB, - 0x8892, 0xCCBB, - 0x8896, 0xD0E4, - 0x889C, 0xCDE0, - 0x88A2, 0xF1C8, - 0x88A4, 0xD9F3, - 0x88AB, 0xB1BB, - 0x88AD, 0xCFAE, - 0x88B1, 0xB8A4, - 0x88B7, 0xF1CA, - 0x88BC, 0xF1CB, - 0x88C1, 0xB2C3, - 0x88C2, 0xC1D1, - 0x88C5, 0xD7B0, - 0x88C6, 0xF1C9, - 0x88C9, 0xF1CC, - 0x88CE, 0xF1CE, - 0x88D2, 0xD9F6, - 0x88D4, 0xD2E1, - 0x88D5, 0xD4A3, - 0x88D8, 0xF4C3, - 0x88D9, 0xC8B9, - 0x88DF, 0xF4C4, - 0x88E2, 0xF1CD, - 0x88E3, 0xF1CF, - 0x88E4, 0xBFE3, - 0x88E5, 0xF1D0, - 0x88E8, 0xF1D4, - 0x88F0, 0xF1D6, - 0x88F1, 0xF1D1, - 0x88F3, 0xC9D1, - 0x88F4, 0xC5E1, - 0x88F8, 0xC2E3, - 0x88F9, 0xB9FC, - 0x88FC, 0xF1D3, - 0x88FE, 0xF1D5, - 0x8902, 0xB9D3, - 0x890A, 0xF1DB, - 0x8910, 0xBAD6, - 0x8912, 0xB0FD, - 0x8913, 0xF1D9, - 0x8919, 0xF1D8, - 0x891A, 0xF1D2, - 0x891B, 0xF1DA, - 0x8921, 0xF1D7, - 0x8925, 0xC8EC, - 0x892A, 0xCDCA, - 0x892B, 0xF1DD, - 0x8930, 0xE5BD, - 0x8934, 0xF1DC, - 0x8936, 0xF1DE, - 0x8941, 0xF1DF, - 0x8944, 0xCFE5, - 0x895E, 0xF4C5, - 0x895F, 0xBDF3, - 0x8966, 0xF1E0, - 0x897B, 0xF1E1, - 0x897F, 0xCEF7, - 0x8981, 0xD2AA, - 0x8983, 0xF1FB, - 0x8986, 0xB8B2, - 0x89C1, 0xBCFB, - 0x89C2, 0xB9DB, - 0x89C4, 0xB9E6, - 0x89C5, 0xC3D9, - 0x89C6, 0xCAD3, - 0x89C7, 0xEAE8, - 0x89C8, 0xC0C0, - 0x89C9, 0xBEF5, - 0x89CA, 0xEAE9, - 0x89CB, 0xEAEA, - 0x89CC, 0xEAEB, - 0x89CE, 0xEAEC, - 0x89CF, 0xEAED, - 0x89D0, 0xEAEE, - 0x89D1, 0xEAEF, - 0x89D2, 0xBDC7, - 0x89D6, 0xF5FB, - 0x89DA, 0xF5FD, - 0x89DC, 0xF5FE, - 0x89DE, 0xF5FC, - 0x89E3, 0xBDE2, - 0x89E5, 0xF6A1, - 0x89E6, 0xB4A5, - 0x89EB, 0xF6A2, - 0x89EF, 0xF6A3, - 0x89F3, 0xECB2, - 0x8A00, 0xD1D4, - 0x8A07, 0xD9EA, - 0x8A3E, 0xF6A4, - 0x8A48, 0xEEBA, - 0x8A79, 0xD5B2, - 0x8A89, 0xD3FE, - 0x8A8A, 0xCCDC, - 0x8A93, 0xCAC4, - 0x8B07, 0xE5C0, - 0x8B26, 0xF6A5, - 0x8B66, 0xBEAF, - 0x8B6C, 0xC6A9, - 0x8BA0, 0xDAA5, - 0x8BA1, 0xBCC6, - 0x8BA2, 0xB6A9, - 0x8BA3, 0xB8BC, - 0x8BA4, 0xC8CF, - 0x8BA5, 0xBCA5, - 0x8BA6, 0xDAA6, - 0x8BA7, 0xDAA7, - 0x8BA8, 0xCCD6, - 0x8BA9, 0xC8C3, - 0x8BAA, 0xDAA8, - 0x8BAB, 0xC6FD, - 0x8BAD, 0xD1B5, - 0x8BAE, 0xD2E9, - 0x8BAF, 0xD1B6, - 0x8BB0, 0xBCC7, - 0x8BB2, 0xBDB2, - 0x8BB3, 0xBBE4, - 0x8BB4, 0xDAA9, - 0x8BB5, 0xDAAA, - 0x8BB6, 0xD1C8, - 0x8BB7, 0xDAAB, - 0x8BB8, 0xD0ED, - 0x8BB9, 0xB6EF, - 0x8BBA, 0xC2DB, - 0x8BBC, 0xCBCF, - 0x8BBD, 0xB7ED, - 0x8BBE, 0xC9E8, - 0x8BBF, 0xB7C3, - 0x8BC0, 0xBEF7, - 0x8BC1, 0xD6A4, - 0x8BC2, 0xDAAC, - 0x8BC3, 0xDAAD, - 0x8BC4, 0xC6C0, - 0x8BC5, 0xD7E7, - 0x8BC6, 0xCAB6, - 0x8BC8, 0xD5A9, - 0x8BC9, 0xCBDF, - 0x8BCA, 0xD5EF, - 0x8BCB, 0xDAAE, - 0x8BCC, 0xD6DF, - 0x8BCD, 0xB4CA, - 0x8BCE, 0xDAB0, - 0x8BCF, 0xDAAF, - 0x8BD1, 0xD2EB, - 0x8BD2, 0xDAB1, - 0x8BD3, 0xDAB2, - 0x8BD4, 0xDAB3, - 0x8BD5, 0xCAD4, - 0x8BD6, 0xDAB4, - 0x8BD7, 0xCAAB, - 0x8BD8, 0xDAB5, - 0x8BD9, 0xDAB6, - 0x8BDA, 0xB3CF, - 0x8BDB, 0xD6EF, - 0x8BDC, 0xDAB7, - 0x8BDD, 0xBBB0, - 0x8BDE, 0xB5AE, - 0x8BDF, 0xDAB8, - 0x8BE0, 0xDAB9, - 0x8BE1, 0xB9EE, - 0x8BE2, 0xD1AF, - 0x8BE3, 0xD2E8, - 0x8BE4, 0xDABA, - 0x8BE5, 0xB8C3, - 0x8BE6, 0xCFEA, - 0x8BE7, 0xB2EF, - 0x8BE8, 0xDABB, - 0x8BE9, 0xDABC, - 0x8BEB, 0xBDEB, - 0x8BEC, 0xCEDC, - 0x8BED, 0xD3EF, - 0x8BEE, 0xDABD, - 0x8BEF, 0xCEF3, - 0x8BF0, 0xDABE, - 0x8BF1, 0xD3D5, - 0x8BF2, 0xBBE5, - 0x8BF3, 0xDABF, - 0x8BF4, 0xCBB5, - 0x8BF5, 0xCBD0, - 0x8BF6, 0xDAC0, - 0x8BF7, 0xC7EB, - 0x8BF8, 0xD6EE, - 0x8BF9, 0xDAC1, - 0x8BFA, 0xC5B5, - 0x8BFB, 0xB6C1, - 0x8BFC, 0xDAC2, - 0x8BFD, 0xB7CC, - 0x8BFE, 0xBFCE, - 0x8BFF, 0xDAC3, - 0x8C00, 0xDAC4, - 0x8C01, 0xCBAD, - 0x8C02, 0xDAC5, - 0x8C03, 0xB5F7, - 0x8C04, 0xDAC6, - 0x8C05, 0xC1C2, - 0x8C06, 0xD7BB, - 0x8C07, 0xDAC7, - 0x8C08, 0xCCB8, - 0x8C0A, 0xD2EA, - 0x8C0B, 0xC4B1, - 0x8C0C, 0xDAC8, - 0x8C0D, 0xB5FD, - 0x8C0E, 0xBBD1, - 0x8C0F, 0xDAC9, - 0x8C10, 0xD0B3, - 0x8C11, 0xDACA, - 0x8C12, 0xDACB, - 0x8C13, 0xCEBD, - 0x8C14, 0xDACC, - 0x8C15, 0xDACD, - 0x8C16, 0xDACE, - 0x8C17, 0xB2F7, - 0x8C18, 0xDAD1, - 0x8C19, 0xDACF, - 0x8C1A, 0xD1E8, - 0x8C1B, 0xDAD0, - 0x8C1C, 0xC3D5, - 0x8C1D, 0xDAD2, - 0x8C1F, 0xDAD3, - 0x8C20, 0xDAD4, - 0x8C21, 0xDAD5, - 0x8C22, 0xD0BB, - 0x8C23, 0xD2A5, - 0x8C24, 0xB0F9, - 0x8C25, 0xDAD6, - 0x8C26, 0xC7AB, - 0x8C27, 0xDAD7, - 0x8C28, 0xBDF7, - 0x8C29, 0xC3A1, - 0x8C2A, 0xDAD8, - 0x8C2B, 0xDAD9, - 0x8C2C, 0xC3FD, - 0x8C2D, 0xCCB7, - 0x8C2E, 0xDADA, - 0x8C2F, 0xDADB, - 0x8C30, 0xC0BE, - 0x8C31, 0xC6D7, - 0x8C32, 0xDADC, - 0x8C33, 0xDADD, - 0x8C34, 0xC7B4, - 0x8C35, 0xDADE, - 0x8C36, 0xDADF, - 0x8C37, 0xB9C8, - 0x8C41, 0xBBED, - 0x8C46, 0xB6B9, - 0x8C47, 0xF4F8, - 0x8C49, 0xF4F9, - 0x8C4C, 0xCDE3, - 0x8C55, 0xF5B9, - 0x8C5A, 0xEBE0, - 0x8C61, 0xCFF3, - 0x8C62, 0xBBBF, - 0x8C6A, 0xBAC0, - 0x8C6B, 0xD4A5, - 0x8C73, 0xE1D9, - 0x8C78, 0xF5F4, - 0x8C79, 0xB1AA, - 0x8C7A, 0xB2F2, - 0x8C82, 0xF5F5, - 0x8C85, 0xF5F7, - 0x8C89, 0xBAD1, - 0x8C8A, 0xF5F6, - 0x8C8C, 0xC3B2, - 0x8C94, 0xF5F9, - 0x8C98, 0xF5F8, - 0x8D1D, 0xB1B4, - 0x8D1E, 0xD5EA, - 0x8D1F, 0xB8BA, - 0x8D21, 0xB9B1, - 0x8D22, 0xB2C6, - 0x8D23, 0xD4F0, - 0x8D24, 0xCFCD, - 0x8D25, 0xB0DC, - 0x8D26, 0xD5CB, - 0x8D27, 0xBBF5, - 0x8D28, 0xD6CA, - 0x8D29, 0xB7B7, - 0x8D2A, 0xCCB0, - 0x8D2B, 0xC6B6, - 0x8D2C, 0xB1E1, - 0x8D2D, 0xB9BA, - 0x8D2E, 0xD6FC, - 0x8D2F, 0xB9E1, - 0x8D30, 0xB7A1, - 0x8D31, 0xBCFA, - 0x8D32, 0xEADA, - 0x8D33, 0xEADB, - 0x8D34, 0xCCF9, - 0x8D35, 0xB9F3, - 0x8D36, 0xEADC, - 0x8D37, 0xB4FB, - 0x8D38, 0xC3B3, - 0x8D39, 0xB7D1, - 0x8D3A, 0xBAD8, - 0x8D3B, 0xEADD, - 0x8D3C, 0xD4F4, - 0x8D3D, 0xEADE, - 0x8D3E, 0xBCD6, - 0x8D3F, 0xBBDF, - 0x8D40, 0xEADF, - 0x8D41, 0xC1DE, - 0x8D42, 0xC2B8, - 0x8D43, 0xD4DF, - 0x8D44, 0xD7CA, - 0x8D45, 0xEAE0, - 0x8D46, 0xEAE1, - 0x8D47, 0xEAE4, - 0x8D48, 0xEAE2, - 0x8D49, 0xEAE3, - 0x8D4A, 0xC9DE, - 0x8D4B, 0xB8B3, - 0x8D4C, 0xB6C4, - 0x8D4D, 0xEAE5, - 0x8D4E, 0xCAEA, - 0x8D4F, 0xC9CD, - 0x8D50, 0xB4CD, - 0x8D53, 0xE2D9, - 0x8D54, 0xC5E2, - 0x8D55, 0xEAE6, - 0x8D56, 0xC0B5, - 0x8D58, 0xD7B8, - 0x8D59, 0xEAE7, - 0x8D5A, 0xD7AC, - 0x8D5B, 0xC8FC, - 0x8D5C, 0xD8D3, - 0x8D5D, 0xD8CD, - 0x8D5E, 0xD4DE, - 0x8D60, 0xD4F9, - 0x8D61, 0xC9C4, - 0x8D62, 0xD3AE, - 0x8D63, 0xB8D3, - 0x8D64, 0xB3E0, - 0x8D66, 0xC9E2, - 0x8D67, 0xF4F6, - 0x8D6B, 0xBAD5, - 0x8D6D, 0xF4F7, - 0x8D70, 0xD7DF, - 0x8D73, 0xF4F1, - 0x8D74, 0xB8B0, - 0x8D75, 0xD5D4, - 0x8D76, 0xB8CF, - 0x8D77, 0xC6F0, - 0x8D81, 0xB3C3, - 0x8D84, 0xF4F2, - 0x8D85, 0xB3AC, - 0x8D8A, 0xD4BD, - 0x8D8B, 0xC7F7, - 0x8D91, 0xF4F4, - 0x8D94, 0xF4F3, - 0x8D9F, 0xCCCB, - 0x8DA3, 0xC8A4, - 0x8DB1, 0xF4F5, - 0x8DB3, 0xD7E3, - 0x8DB4, 0xC5BF, - 0x8DB5, 0xF5C0, - 0x8DB8, 0xF5BB, - 0x8DBA, 0xF5C3, - 0x8DBC, 0xF5C2, - 0x8DBE, 0xD6BA, - 0x8DBF, 0xF5C1, - 0x8DC3, 0xD4BE, - 0x8DC4, 0xF5C4, - 0x8DC6, 0xF5CC, - 0x8DCB, 0xB0CF, - 0x8DCC, 0xB5F8, - 0x8DCE, 0xF5C9, - 0x8DCF, 0xF5CA, - 0x8DD1, 0xC5DC, - 0x8DD6, 0xF5C5, - 0x8DD7, 0xF5C6, - 0x8DDA, 0xF5C7, - 0x8DDB, 0xF5CB, - 0x8DDD, 0xBEE0, - 0x8DDE, 0xF5C8, - 0x8DDF, 0xB8FA, - 0x8DE3, 0xF5D0, - 0x8DE4, 0xF5D3, - 0x8DE8, 0xBFE7, - 0x8DEA, 0xB9F2, - 0x8DEB, 0xF5BC, - 0x8DEC, 0xF5CD, - 0x8DEF, 0xC2B7, - 0x8DF3, 0xCCF8, - 0x8DF5, 0xBCF9, - 0x8DF7, 0xF5CE, - 0x8DF8, 0xF5CF, - 0x8DF9, 0xF5D1, - 0x8DFA, 0xB6E5, - 0x8DFB, 0xF5D2, - 0x8DFD, 0xF5D5, - 0x8E05, 0xF5BD, - 0x8E09, 0xF5D4, - 0x8E0A, 0xD3BB, - 0x8E0C, 0xB3EC, - 0x8E0F, 0xCCA4, - 0x8E14, 0xF5D6, - 0x8E1D, 0xF5D7, - 0x8E1E, 0xBEE1, - 0x8E1F, 0xF5D8, - 0x8E22, 0xCCDF, - 0x8E23, 0xF5DB, - 0x8E29, 0xB2C8, - 0x8E2A, 0xD7D9, - 0x8E2C, 0xF5D9, - 0x8E2E, 0xF5DA, - 0x8E2F, 0xF5DC, - 0x8E31, 0xF5E2, - 0x8E35, 0xF5E0, - 0x8E39, 0xF5DF, - 0x8E3A, 0xF5DD, - 0x8E3D, 0xF5E1, - 0x8E40, 0xF5DE, - 0x8E41, 0xF5E4, - 0x8E42, 0xF5E5, - 0x8E44, 0xCCE3, - 0x8E47, 0xE5BF, - 0x8E48, 0xB5B8, - 0x8E49, 0xF5E3, - 0x8E4A, 0xF5E8, - 0x8E4B, 0xCCA3, - 0x8E51, 0xF5E6, - 0x8E52, 0xF5E7, - 0x8E59, 0xF5BE, - 0x8E66, 0xB1C4, - 0x8E69, 0xF5BF, - 0x8E6C, 0xB5C5, - 0x8E6D, 0xB2E4, - 0x8E6F, 0xF5EC, - 0x8E70, 0xF5E9, - 0x8E72, 0xB6D7, - 0x8E74, 0xF5ED, - 0x8E76, 0xF5EA, - 0x8E7C, 0xF5EB, - 0x8E7F, 0xB4DA, - 0x8E81, 0xD4EA, - 0x8E85, 0xF5EE, - 0x8E87, 0xB3F9, - 0x8E8F, 0xF5EF, - 0x8E90, 0xF5F1, - 0x8E94, 0xF5F0, - 0x8E9C, 0xF5F2, - 0x8E9E, 0xF5F3, - 0x8EAB, 0xC9ED, - 0x8EAC, 0xB9AA, - 0x8EAF, 0xC7FB, - 0x8EB2, 0xB6E3, - 0x8EBA, 0xCCC9, - 0x8ECE, 0xEAA6, - 0x8F66, 0xB3B5, - 0x8F67, 0xD4FE, - 0x8F68, 0xB9EC, - 0x8F69, 0xD0F9, - 0x8F6B, 0xE9ED, - 0x8F6C, 0xD7AA, - 0x8F6D, 0xE9EE, - 0x8F6E, 0xC2D6, - 0x8F6F, 0xC8ED, - 0x8F70, 0xBAE4, - 0x8F71, 0xE9EF, - 0x8F72, 0xE9F0, - 0x8F73, 0xE9F1, - 0x8F74, 0xD6E1, - 0x8F75, 0xE9F2, - 0x8F76, 0xE9F3, - 0x8F77, 0xE9F5, - 0x8F78, 0xE9F4, - 0x8F79, 0xE9F6, - 0x8F7A, 0xE9F7, - 0x8F7B, 0xC7E1, - 0x8F7C, 0xE9F8, - 0x8F7D, 0xD4D8, - 0x8F7E, 0xE9F9, - 0x8F7F, 0xBDCE, - 0x8F81, 0xE9FA, - 0x8F82, 0xE9FB, - 0x8F83, 0xBDCF, - 0x8F84, 0xE9FC, - 0x8F85, 0xB8A8, - 0x8F86, 0xC1BE, - 0x8F87, 0xE9FD, - 0x8F88, 0xB1B2, - 0x8F89, 0xBBD4, - 0x8F8A, 0xB9F5, - 0x8F8B, 0xE9FE, - 0x8F8D, 0xEAA1, - 0x8F8E, 0xEAA2, - 0x8F8F, 0xEAA3, - 0x8F90, 0xB7F8, - 0x8F91, 0xBCAD, - 0x8F93, 0xCAE4, - 0x8F94, 0xE0CE, - 0x8F95, 0xD4AF, - 0x8F96, 0xCFBD, - 0x8F97, 0xD5B7, - 0x8F98, 0xEAA4, - 0x8F99, 0xD5DE, - 0x8F9A, 0xEAA5, - 0x8F9B, 0xD0C1, - 0x8F9C, 0xB9BC, - 0x8F9E, 0xB4C7, - 0x8F9F, 0xB1D9, - 0x8FA3, 0xC0B1, - 0x8FA8, 0xB1E6, - 0x8FA9, 0xB1E7, - 0x8FAB, 0xB1E8, - 0x8FB0, 0xB3BD, - 0x8FB1, 0xC8E8, - 0x8FB6, 0xE5C1, - 0x8FB9, 0xB1DF, - 0x8FBD, 0xC1C9, - 0x8FBE, 0xB4EF, - 0x8FC1, 0xC7A8, - 0x8FC2, 0xD3D8, - 0x8FC4, 0xC6F9, - 0x8FC5, 0xD1B8, - 0x8FC7, 0xB9FD, - 0x8FC8, 0xC2F5, - 0x8FCE, 0xD3AD, - 0x8FD0, 0xD4CB, - 0x8FD1, 0xBDFC, - 0x8FD3, 0xE5C2, - 0x8FD4, 0xB7B5, - 0x8FD5, 0xE5C3, - 0x8FD8, 0xBBB9, - 0x8FD9, 0xD5E2, - 0x8FDB, 0xBDF8, - 0x8FDC, 0xD4B6, - 0x8FDD, 0xCEA5, - 0x8FDE, 0xC1AC, - 0x8FDF, 0xB3D9, - 0x8FE2, 0xCCF6, - 0x8FE4, 0xE5C6, - 0x8FE5, 0xE5C4, - 0x8FE6, 0xE5C8, - 0x8FE8, 0xE5CA, - 0x8FE9, 0xE5C7, - 0x8FEA, 0xB5CF, - 0x8FEB, 0xC6C8, - 0x8FED, 0xB5FC, - 0x8FEE, 0xE5C5, - 0x8FF0, 0xCAF6, - 0x8FF3, 0xE5C9, - 0x8FF7, 0xC3D4, - 0x8FF8, 0xB1C5, - 0x8FF9, 0xBCA3, - 0x8FFD, 0xD7B7, - 0x9000, 0xCDCB, - 0x9001, 0xCBCD, - 0x9002, 0xCACA, - 0x9003, 0xCCD3, - 0x9004, 0xE5CC, - 0x9005, 0xE5CB, - 0x9006, 0xC4E6, - 0x9009, 0xD1A1, - 0x900A, 0xD1B7, - 0x900B, 0xE5CD, - 0x900D, 0xE5D0, - 0x900F, 0xCDB8, - 0x9010, 0xD6F0, - 0x9011, 0xE5CF, - 0x9012, 0xB5DD, - 0x9014, 0xCDBE, - 0x9016, 0xE5D1, - 0x9017, 0xB6BA, - 0x901A, 0xCDA8, - 0x901B, 0xB9E4, - 0x901D, 0xCAC5, - 0x901E, 0xB3D1, - 0x901F, 0xCBD9, - 0x9020, 0xD4EC, - 0x9021, 0xE5D2, - 0x9022, 0xB7EA, - 0x9026, 0xE5CE, - 0x902D, 0xE5D5, - 0x902E, 0xB4FE, - 0x902F, 0xE5D6, - 0x9035, 0xE5D3, - 0x9036, 0xE5D4, - 0x9038, 0xD2DD, - 0x903B, 0xC2DF, - 0x903C, 0xB1C6, - 0x903E, 0xD3E2, - 0x9041, 0xB6DD, - 0x9042, 0xCBEC, - 0x9044, 0xE5D7, - 0x9047, 0xD3F6, - 0x904D, 0xB1E9, - 0x904F, 0xB6F4, - 0x9050, 0xE5DA, - 0x9051, 0xE5D8, - 0x9052, 0xE5D9, - 0x9053, 0xB5C0, - 0x9057, 0xD2C5, - 0x9058, 0xE5DC, - 0x905B, 0xE5DE, - 0x9062, 0xE5DD, - 0x9063, 0xC7B2, - 0x9065, 0xD2A3, - 0x9068, 0xE5DB, - 0x906D, 0xD4E2, - 0x906E, 0xD5DA, - 0x9074, 0xE5E0, - 0x9075, 0xD7F1, - 0x907D, 0xE5E1, - 0x907F, 0xB1DC, - 0x9080, 0xD1FB, - 0x9082, 0xE5E2, - 0x9083, 0xE5E4, - 0x9088, 0xE5E3, - 0x908B, 0xE5E5, - 0x9091, 0xD2D8, - 0x9093, 0xB5CB, - 0x9095, 0xE7DF, - 0x9097, 0xDAF5, - 0x9099, 0xDAF8, - 0x909B, 0xDAF6, - 0x909D, 0xDAF7, - 0x90A1, 0xDAFA, - 0x90A2, 0xD0CF, - 0x90A3, 0xC4C7, - 0x90A6, 0xB0EE, - 0x90AA, 0xD0B0, - 0x90AC, 0xDAF9, - 0x90AE, 0xD3CA, - 0x90AF, 0xBAAA, - 0x90B0, 0xDBA2, - 0x90B1, 0xC7F1, - 0x90B3, 0xDAFC, - 0x90B4, 0xDAFB, - 0x90B5, 0xC9DB, - 0x90B6, 0xDAFD, - 0x90B8, 0xDBA1, - 0x90B9, 0xD7DE, - 0x90BA, 0xDAFE, - 0x90BB, 0xC1DA, - 0x90BE, 0xDBA5, - 0x90C1, 0xD3F4, - 0x90C4, 0xDBA7, - 0x90C5, 0xDBA4, - 0x90C7, 0xDBA8, - 0x90CA, 0xBDBC, - 0x90CE, 0xC0C9, - 0x90CF, 0xDBA3, - 0x90D0, 0xDBA6, - 0x90D1, 0xD6A3, - 0x90D3, 0xDBA9, - 0x90D7, 0xDBAD, - 0x90DB, 0xDBAE, - 0x90DC, 0xDBAC, - 0x90DD, 0xBAC2, - 0x90E1, 0xBFA4, - 0x90E2, 0xDBAB, - 0x90E6, 0xDBAA, - 0x90E7, 0xD4C7, - 0x90E8, 0xB2BF, - 0x90EB, 0xDBAF, - 0x90ED, 0xB9F9, - 0x90EF, 0xDBB0, - 0x90F4, 0xB3BB, - 0x90F8, 0xB5A6, - 0x90FD, 0xB6BC, - 0x90FE, 0xDBB1, - 0x9102, 0xB6F5, - 0x9104, 0xDBB2, - 0x9119, 0xB1C9, - 0x911E, 0xDBB4, - 0x9122, 0xDBB3, - 0x9123, 0xDBB5, - 0x912F, 0xDBB7, - 0x9131, 0xDBB6, - 0x9139, 0xDBB8, - 0x9143, 0xDBB9, - 0x9146, 0xDBBA, - 0x9149, 0xD3CF, - 0x914A, 0xF4FA, - 0x914B, 0xC7F5, - 0x914C, 0xD7C3, - 0x914D, 0xC5E4, - 0x914E, 0xF4FC, - 0x914F, 0xF4FD, - 0x9150, 0xF4FB, - 0x9152, 0xBEC6, - 0x9157, 0xD0EF, - 0x915A, 0xB7D3, - 0x915D, 0xD4CD, - 0x915E, 0xCCAA, - 0x9161, 0xF5A2, - 0x9162, 0xF5A1, - 0x9163, 0xBAA8, - 0x9164, 0xF4FE, - 0x9165, 0xCBD6, - 0x9169, 0xF5A4, - 0x916A, 0xC0D2, - 0x916C, 0xB3EA, - 0x916E, 0xCDAA, - 0x916F, 0xF5A5, - 0x9170, 0xF5A3, - 0x9171, 0xBDB4, - 0x9172, 0xF5A8, - 0x9174, 0xF5A9, - 0x9175, 0xBDCD, - 0x9176, 0xC3B8, - 0x9177, 0xBFE1, - 0x9178, 0xCBE1, - 0x9179, 0xF5AA, - 0x917D, 0xF5A6, - 0x917E, 0xF5A7, - 0x917F, 0xC4F0, - 0x9185, 0xF5AC, - 0x9187, 0xB4BC, - 0x9189, 0xD7ED, - 0x918B, 0xB4D7, - 0x918C, 0xF5AB, - 0x918D, 0xF5AE, - 0x9190, 0xF5AD, - 0x9191, 0xF5AF, - 0x9192, 0xD0D1, - 0x919A, 0xC3D1, - 0x919B, 0xC8A9, - 0x91A2, 0xF5B0, - 0x91A3, 0xF5B1, - 0x91AA, 0xF5B2, - 0x91AD, 0xF5B3, - 0x91AE, 0xF5B4, - 0x91AF, 0xF5B5, - 0x91B4, 0xF5B7, - 0x91B5, 0xF5B6, - 0x91BA, 0xF5B8, - 0x91C7, 0xB2C9, - 0x91C9, 0xD3D4, - 0x91CA, 0xCACD, - 0x91CC, 0xC0EF, - 0x91CD, 0xD6D8, - 0x91CE, 0xD2B0, - 0x91CF, 0xC1BF, - 0x91D1, 0xBDF0, - 0x91DC, 0xB8AA, - 0x9274, 0xBCF8, - 0x928E, 0xF6C6, - 0x92AE, 0xF6C7, - 0x92C8, 0xF6C8, - 0x933E, 0xF6C9, - 0x936A, 0xF6CA, - 0x938F, 0xF6CC, - 0x93CA, 0xF6CB, - 0x93D6, 0xF7E9, - 0x943E, 0xF6CD, - 0x946B, 0xF6CE, - 0x9485, 0xEEC4, - 0x9486, 0xEEC5, - 0x9487, 0xEEC6, - 0x9488, 0xD5EB, - 0x9489, 0xB6A4, - 0x948A, 0xEEC8, - 0x948B, 0xEEC7, - 0x948C, 0xEEC9, - 0x948D, 0xEECA, - 0x948E, 0xC7A5, - 0x948F, 0xEECB, - 0x9490, 0xEECC, - 0x9492, 0xB7B0, - 0x9493, 0xB5F6, - 0x9494, 0xEECD, - 0x9495, 0xEECF, - 0x9497, 0xEECE, - 0x9499, 0xB8C6, - 0x949A, 0xEED0, - 0x949B, 0xEED1, - 0x949C, 0xEED2, - 0x949D, 0xB6DB, - 0x949E, 0xB3AE, - 0x949F, 0xD6D3, - 0x94A0, 0xC4C6, - 0x94A1, 0xB1B5, - 0x94A2, 0xB8D6, - 0x94A3, 0xEED3, - 0x94A4, 0xEED4, - 0x94A5, 0xD4BF, - 0x94A6, 0xC7D5, - 0x94A7, 0xBEFB, - 0x94A8, 0xCED9, - 0x94A9, 0xB9B3, - 0x94AA, 0xEED6, - 0x94AB, 0xEED5, - 0x94AC, 0xEED8, - 0x94AD, 0xEED7, - 0x94AE, 0xC5A5, - 0x94AF, 0xEED9, - 0x94B0, 0xEEDA, - 0x94B1, 0xC7AE, - 0x94B2, 0xEEDB, - 0x94B3, 0xC7AF, - 0x94B4, 0xEEDC, - 0x94B5, 0xB2A7, - 0x94B6, 0xEEDD, - 0x94B7, 0xEEDE, - 0x94B8, 0xEEDF, - 0x94B9, 0xEEE0, - 0x94BA, 0xEEE1, - 0x94BB, 0xD7EA, - 0x94BC, 0xEEE2, - 0x94BD, 0xEEE3, - 0x94BE, 0xBCD8, - 0x94BF, 0xEEE4, - 0x94C0, 0xD3CB, - 0x94C1, 0xCCFA, - 0x94C2, 0xB2AC, - 0x94C3, 0xC1E5, - 0x94C4, 0xEEE5, - 0x94C5, 0xC7A6, - 0x94C6, 0xC3AD, - 0x94C8, 0xEEE6, - 0x94C9, 0xEEE7, - 0x94CA, 0xEEE8, - 0x94CB, 0xEEE9, - 0x94CC, 0xEEEA, - 0x94CD, 0xEEEB, - 0x94CE, 0xEEEC, - 0x94D0, 0xEEED, - 0x94D1, 0xEEEE, - 0x94D2, 0xEEEF, - 0x94D5, 0xEEF0, - 0x94D6, 0xEEF1, - 0x94D7, 0xEEF2, - 0x94D8, 0xEEF4, - 0x94D9, 0xEEF3, - 0x94DB, 0xEEF5, - 0x94DC, 0xCDAD, - 0x94DD, 0xC2C1, - 0x94DE, 0xEEF6, - 0x94DF, 0xEEF7, - 0x94E0, 0xEEF8, - 0x94E1, 0xD5A1, - 0x94E2, 0xEEF9, - 0x94E3, 0xCFB3, - 0x94E4, 0xEEFA, - 0x94E5, 0xEEFB, - 0x94E7, 0xEEFC, - 0x94E8, 0xEEFD, - 0x94E9, 0xEFA1, - 0x94EA, 0xEEFE, - 0x94EB, 0xEFA2, - 0x94EC, 0xB8F5, - 0x94ED, 0xC3FA, - 0x94EE, 0xEFA3, - 0x94EF, 0xEFA4, - 0x94F0, 0xBDC2, - 0x94F1, 0xD2BF, - 0x94F2, 0xB2F9, - 0x94F3, 0xEFA5, - 0x94F4, 0xEFA6, - 0x94F5, 0xEFA7, - 0x94F6, 0xD2F8, - 0x94F7, 0xEFA8, - 0x94F8, 0xD6FD, - 0x94F9, 0xEFA9, - 0x94FA, 0xC6CC, - 0x94FC, 0xEFAA, - 0x94FD, 0xEFAB, - 0x94FE, 0xC1B4, - 0x94FF, 0xEFAC, - 0x9500, 0xCFFA, - 0x9501, 0xCBF8, - 0x9502, 0xEFAE, - 0x9503, 0xEFAD, - 0x9504, 0xB3FA, - 0x9505, 0xB9F8, - 0x9506, 0xEFAF, - 0x9507, 0xEFB0, - 0x9508, 0xD0E2, - 0x9509, 0xEFB1, - 0x950A, 0xEFB2, - 0x950B, 0xB7E6, - 0x950C, 0xD0BF, - 0x950D, 0xEFB3, - 0x950E, 0xEFB4, - 0x950F, 0xEFB5, - 0x9510, 0xC8F1, - 0x9511, 0xCCE0, - 0x9512, 0xEFB6, - 0x9513, 0xEFB7, - 0x9514, 0xEFB8, - 0x9515, 0xEFB9, - 0x9516, 0xEFBA, - 0x9517, 0xD5E0, - 0x9518, 0xEFBB, - 0x9519, 0xB4ED, - 0x951A, 0xC3AA, - 0x951B, 0xEFBC, - 0x951D, 0xEFBD, - 0x951E, 0xEFBE, - 0x951F, 0xEFBF, - 0x9521, 0xCEFD, - 0x9522, 0xEFC0, - 0x9523, 0xC2E0, - 0x9524, 0xB4B8, - 0x9525, 0xD7B6, - 0x9526, 0xBDF5, - 0x9528, 0xCFC7, - 0x9529, 0xEFC3, - 0x952A, 0xEFC1, - 0x952B, 0xEFC2, - 0x952C, 0xEFC4, - 0x952D, 0xB6A7, - 0x952E, 0xBCFC, - 0x952F, 0xBEE2, - 0x9530, 0xC3CC, - 0x9531, 0xEFC5, - 0x9532, 0xEFC6, - 0x9534, 0xEFC7, - 0x9535, 0xEFCF, - 0x9536, 0xEFC8, - 0x9537, 0xEFC9, - 0x9538, 0xEFCA, - 0x9539, 0xC7C2, - 0x953A, 0xEFF1, - 0x953B, 0xB6CD, - 0x953C, 0xEFCB, - 0x953E, 0xEFCC, - 0x953F, 0xEFCD, - 0x9540, 0xB6C6, - 0x9541, 0xC3BE, - 0x9542, 0xEFCE, - 0x9544, 0xEFD0, - 0x9545, 0xEFD1, - 0x9546, 0xEFD2, - 0x9547, 0xD5F2, - 0x9549, 0xEFD3, - 0x954A, 0xC4F7, - 0x954C, 0xEFD4, - 0x954D, 0xC4F8, - 0x954E, 0xEFD5, - 0x954F, 0xEFD6, - 0x9550, 0xB8E4, - 0x9551, 0xB0F7, - 0x9552, 0xEFD7, - 0x9553, 0xEFD8, - 0x9554, 0xEFD9, - 0x9556, 0xEFDA, - 0x9557, 0xEFDB, - 0x9558, 0xEFDC, - 0x9559, 0xEFDD, - 0x955B, 0xEFDE, - 0x955C, 0xBEB5, - 0x955D, 0xEFE1, - 0x955E, 0xEFDF, - 0x955F, 0xEFE0, - 0x9561, 0xEFE2, - 0x9562, 0xEFE3, - 0x9563, 0xC1CD, - 0x9564, 0xEFE4, - 0x9565, 0xEFE5, - 0x9566, 0xEFE6, - 0x9567, 0xEFE7, - 0x9568, 0xEFE8, - 0x9569, 0xEFE9, - 0x956A, 0xEFEA, - 0x956B, 0xEFEB, - 0x956C, 0xEFEC, - 0x956D, 0xC0D8, - 0x956F, 0xEFED, - 0x9570, 0xC1AD, - 0x9571, 0xEFEE, - 0x9572, 0xEFEF, - 0x9573, 0xEFF0, - 0x9576, 0xCFE2, - 0x957F, 0xB3A4, - 0x95E8, 0xC3C5, - 0x95E9, 0xE3C5, - 0x95EA, 0xC9C1, - 0x95EB, 0xE3C6, - 0x95ED, 0xB1D5, - 0x95EE, 0xCECA, - 0x95EF, 0xB4B3, - 0x95F0, 0xC8F2, - 0x95F1, 0xE3C7, - 0x95F2, 0xCFD0, - 0x95F3, 0xE3C8, - 0x95F4, 0xBCE4, - 0x95F5, 0xE3C9, - 0x95F6, 0xE3CA, - 0x95F7, 0xC3C6, - 0x95F8, 0xD5A2, - 0x95F9, 0xC4D6, - 0x95FA, 0xB9EB, - 0x95FB, 0xCEC5, - 0x95FC, 0xE3CB, - 0x95FD, 0xC3F6, - 0x95FE, 0xE3CC, - 0x9600, 0xB7A7, - 0x9601, 0xB8F3, - 0x9602, 0xBAD2, - 0x9603, 0xE3CD, - 0x9604, 0xE3CE, - 0x9605, 0xD4C4, - 0x9606, 0xE3CF, - 0x9608, 0xE3D0, - 0x9609, 0xD1CB, - 0x960A, 0xE3D1, - 0x960B, 0xE3D2, - 0x960C, 0xE3D3, - 0x960D, 0xE3D4, - 0x960E, 0xD1D6, - 0x960F, 0xE3D5, - 0x9610, 0xB2FB, - 0x9611, 0xC0BB, - 0x9612, 0xE3D6, - 0x9614, 0xC0AB, - 0x9615, 0xE3D7, - 0x9616, 0xE3D8, - 0x9617, 0xE3D9, - 0x9619, 0xE3DA, - 0x961A, 0xE3DB, - 0x961C, 0xB8B7, - 0x961D, 0xDAE2, - 0x961F, 0xB6D3, - 0x9621, 0xDAE4, - 0x9622, 0xDAE3, - 0x962A, 0xDAE6, - 0x962E, 0xC8EE, - 0x9631, 0xDAE5, - 0x9632, 0xB7C0, - 0x9633, 0xD1F4, - 0x9634, 0xD2F5, - 0x9635, 0xD5F3, - 0x9636, 0xBDD7, - 0x963B, 0xD7E8, - 0x963C, 0xDAE8, - 0x963D, 0xDAE7, - 0x963F, 0xB0A2, - 0x9640, 0xCDD3, - 0x9642, 0xDAE9, - 0x9644, 0xB8BD, - 0x9645, 0xBCCA, - 0x9646, 0xC2BD, - 0x9647, 0xC2A4, - 0x9648, 0xB3C2, - 0x9649, 0xDAEA, - 0x964B, 0xC2AA, - 0x964C, 0xC4B0, - 0x964D, 0xBDB5, - 0x9650, 0xCFDE, - 0x9654, 0xDAEB, - 0x9655, 0xC9C2, - 0x965B, 0xB1DD, - 0x965F, 0xDAEC, - 0x9661, 0xB6B8, - 0x9662, 0xD4BA, - 0x9664, 0xB3FD, - 0x9667, 0xDAED, - 0x9668, 0xD4C9, - 0x9669, 0xCFD5, - 0x966A, 0xC5E3, - 0x966C, 0xDAEE, - 0x9672, 0xDAEF, - 0x9674, 0xDAF0, - 0x9675, 0xC1EA, - 0x9676, 0xCCD5, - 0x9677, 0xCFDD, - 0x9685, 0xD3E7, - 0x9686, 0xC2A1, - 0x9688, 0xDAF1, - 0x968B, 0xCBE5, - 0x968D, 0xDAF2, - 0x968F, 0xCBE6, - 0x9690, 0xD2FE, - 0x9694, 0xB8F4, - 0x9697, 0xDAF3, - 0x9698, 0xB0AF, - 0x9699, 0xCFB6, - 0x969C, 0xD5CF, - 0x96A7, 0xCBED, - 0x96B0, 0xDAF4, - 0x96B3, 0xE3C4, - 0x96B6, 0xC1A5, - 0x96B9, 0xF6BF, - 0x96BC, 0xF6C0, - 0x96BD, 0xF6C1, - 0x96BE, 0xC4D1, - 0x96C0, 0xC8B8, - 0x96C1, 0xD1E3, - 0x96C4, 0xD0DB, - 0x96C5, 0xD1C5, - 0x96C6, 0xBCAF, - 0x96C7, 0xB9CD, - 0x96C9, 0xEFF4, - 0x96CC, 0xB4C6, - 0x96CD, 0xD3BA, - 0x96CE, 0xF6C2, - 0x96CF, 0xB3FB, - 0x96D2, 0xF6C3, - 0x96D5, 0xB5F1, - 0x96E0, 0xF6C5, - 0x96E8, 0xD3EA, - 0x96E9, 0xF6A7, - 0x96EA, 0xD1A9, - 0x96EF, 0xF6A9, - 0x96F3, 0xF6A8, - 0x96F6, 0xC1E3, - 0x96F7, 0xC0D7, - 0x96F9, 0xB1A2, - 0x96FE, 0xCEED, - 0x9700, 0xD0E8, - 0x9701, 0xF6AB, - 0x9704, 0xCFF6, - 0x9706, 0xF6AA, - 0x9707, 0xD5F0, - 0x9708, 0xF6AC, - 0x9709, 0xC3B9, - 0x970D, 0xBBF4, - 0x970E, 0xF6AE, - 0x970F, 0xF6AD, - 0x9713, 0xC4DE, - 0x9716, 0xC1D8, - 0x971C, 0xCBAA, - 0x971E, 0xCFBC, - 0x972A, 0xF6AF, - 0x972D, 0xF6B0, - 0x9730, 0xF6B1, - 0x9732, 0xC2B6, - 0x9738, 0xB0D4, - 0x9739, 0xC5F9, - 0x973E, 0xF6B2, - 0x9752, 0xC7E0, - 0x9753, 0xF6A6, - 0x9756, 0xBEB8, - 0x9759, 0xBEB2, - 0x975B, 0xB5E5, - 0x975E, 0xB7C7, - 0x9760, 0xBFBF, - 0x9761, 0xC3D2, - 0x9762, 0xC3E6, - 0x9765, 0xD8CC, - 0x9769, 0xB8EF, - 0x9773, 0xBDF9, - 0x9774, 0xD1A5, - 0x9776, 0xB0D0, - 0x977C, 0xF7B0, - 0x9785, 0xF7B1, - 0x978B, 0xD0AC, - 0x978D, 0xB0B0, - 0x9791, 0xF7B2, - 0x9792, 0xF7B3, - 0x9794, 0xF7B4, - 0x9798, 0xC7CA, - 0x97A0, 0xBECF, - 0x97A3, 0xF7B7, - 0x97AB, 0xF7B6, - 0x97AD, 0xB1DE, - 0x97AF, 0xF7B5, - 0x97B2, 0xF7B8, - 0x97B4, 0xF7B9, - 0x97E6, 0xCEA4, - 0x97E7, 0xC8CD, - 0x97E9, 0xBAAB, - 0x97EA, 0xE8B8, - 0x97EB, 0xE8B9, - 0x97EC, 0xE8BA, - 0x97ED, 0xBEC2, - 0x97F3, 0xD2F4, - 0x97F5, 0xD4CF, - 0x97F6, 0xC9D8, - 0x9875, 0xD2B3, - 0x9876, 0xB6A5, - 0x9877, 0xC7EA, - 0x9878, 0xF1FC, - 0x9879, 0xCFEE, - 0x987A, 0xCBB3, - 0x987B, 0xD0EB, - 0x987C, 0xE7EF, - 0x987D, 0xCDE7, - 0x987E, 0xB9CB, - 0x987F, 0xB6D9, - 0x9880, 0xF1FD, - 0x9881, 0xB0E4, - 0x9882, 0xCBCC, - 0x9883, 0xF1FE, - 0x9884, 0xD4A4, - 0x9885, 0xC2AD, - 0x9886, 0xC1EC, - 0x9887, 0xC6C4, - 0x9888, 0xBEB1, - 0x9889, 0xF2A1, - 0x988A, 0xBCD5, - 0x988C, 0xF2A2, - 0x988D, 0xF2A3, - 0x988F, 0xF2A4, - 0x9890, 0xD2C3, - 0x9891, 0xC6B5, - 0x9893, 0xCDC7, - 0x9894, 0xF2A5, - 0x9896, 0xD3B1, - 0x9897, 0xBFC5, - 0x9898, 0xCCE2, - 0x989A, 0xF2A6, - 0x989B, 0xF2A7, - 0x989C, 0xD1D5, - 0x989D, 0xB6EE, - 0x989E, 0xF2A8, - 0x989F, 0xF2A9, - 0x98A0, 0xB5DF, - 0x98A1, 0xF2AA, - 0x98A2, 0xF2AB, - 0x98A4, 0xB2FC, - 0x98A5, 0xF2AC, - 0x98A6, 0xF2AD, - 0x98A7, 0xC8A7, - 0x98CE, 0xB7E7, - 0x98D1, 0xECA9, - 0x98D2, 0xECAA, - 0x98D3, 0xECAB, - 0x98D5, 0xECAC, - 0x98D8, 0xC6AE, - 0x98D9, 0xECAD, - 0x98DA, 0xECAE, - 0x98DE, 0xB7C9, - 0x98DF, 0xCAB3, - 0x98E7, 0xE2B8, - 0x98E8, 0xF7CF, - 0x990D, 0xF7D0, - 0x9910, 0xB2CD, - 0x992E, 0xF7D1, - 0x9954, 0xF7D3, - 0x9955, 0xF7D2, - 0x9963, 0xE2BB, - 0x9965, 0xBCA2, - 0x9967, 0xE2BC, - 0x9968, 0xE2BD, - 0x9969, 0xE2BE, - 0x996A, 0xE2BF, - 0x996B, 0xE2C0, - 0x996C, 0xE2C1, - 0x996D, 0xB7B9, - 0x996E, 0xD2FB, - 0x996F, 0xBDA4, - 0x9970, 0xCACE, - 0x9971, 0xB1A5, - 0x9972, 0xCBC7, - 0x9974, 0xE2C2, - 0x9975, 0xB6FC, - 0x9976, 0xC8C4, - 0x9977, 0xE2C3, - 0x997A, 0xBDC8, - 0x997C, 0xB1FD, - 0x997D, 0xE2C4, - 0x997F, 0xB6F6, - 0x9980, 0xE2C5, - 0x9981, 0xC4D9, - 0x9984, 0xE2C6, - 0x9985, 0xCFDA, - 0x9986, 0xB9DD, - 0x9987, 0xE2C7, - 0x9988, 0xC0A1, - 0x998A, 0xE2C8, - 0x998B, 0xB2F6, - 0x998D, 0xE2C9, - 0x998F, 0xC1F3, - 0x9990, 0xE2CA, - 0x9991, 0xE2CB, - 0x9992, 0xC2F8, - 0x9993, 0xE2CC, - 0x9994, 0xE2CD, - 0x9995, 0xE2CE, - 0x9996, 0xCAD7, - 0x9997, 0xD8B8, - 0x9998, 0xD9E5, - 0x9999, 0xCFE3, - 0x99A5, 0xF0A5, - 0x99A8, 0xDCB0, - 0x9A6C, 0xC2ED, - 0x9A6D, 0xD4A6, - 0x9A6E, 0xCDD4, - 0x9A6F, 0xD1B1, - 0x9A70, 0xB3DB, - 0x9A71, 0xC7FD, - 0x9A73, 0xB2B5, - 0x9A74, 0xC2BF, - 0x9A75, 0xE6E0, - 0x9A76, 0xCABB, - 0x9A77, 0xE6E1, - 0x9A78, 0xE6E2, - 0x9A79, 0xBED4, - 0x9A7A, 0xE6E3, - 0x9A7B, 0xD7A4, - 0x9A7C, 0xCDD5, - 0x9A7D, 0xE6E5, - 0x9A7E, 0xBCDD, - 0x9A7F, 0xE6E4, - 0x9A80, 0xE6E6, - 0x9A81, 0xE6E7, - 0x9A82, 0xC2EE, - 0x9A84, 0xBDBE, - 0x9A85, 0xE6E8, - 0x9A86, 0xC2E6, - 0x9A87, 0xBAA7, - 0x9A88, 0xE6E9, - 0x9A8A, 0xE6EA, - 0x9A8B, 0xB3D2, - 0x9A8C, 0xD1E9, - 0x9A8F, 0xBFA5, - 0x9A90, 0xE6EB, - 0x9A91, 0xC6EF, - 0x9A92, 0xE6EC, - 0x9A93, 0xE6ED, - 0x9A96, 0xE6EE, - 0x9A97, 0xC6AD, - 0x9A98, 0xE6EF, - 0x9A9A, 0xC9A7, - 0x9A9B, 0xE6F0, - 0x9A9C, 0xE6F1, - 0x9A9D, 0xE6F2, - 0x9A9E, 0xE5B9, - 0x9A9F, 0xE6F3, - 0x9AA0, 0xE6F4, - 0x9AA1, 0xC2E2, - 0x9AA2, 0xE6F5, - 0x9AA3, 0xE6F6, - 0x9AA4, 0xD6E8, - 0x9AA5, 0xE6F7, - 0x9AA7, 0xE6F8, - 0x9AA8, 0xB9C7, - 0x9AB0, 0xF7BB, - 0x9AB1, 0xF7BA, - 0x9AB6, 0xF7BE, - 0x9AB7, 0xF7BC, - 0x9AB8, 0xBAA1, - 0x9ABA, 0xF7BF, - 0x9ABC, 0xF7C0, - 0x9AC0, 0xF7C2, - 0x9AC1, 0xF7C1, - 0x9AC2, 0xF7C4, - 0x9AC5, 0xF7C3, - 0x9ACB, 0xF7C5, - 0x9ACC, 0xF7C6, - 0x9AD1, 0xF7C7, - 0x9AD3, 0xCBE8, - 0x9AD8, 0xB8DF, - 0x9ADF, 0xF7D4, - 0x9AE1, 0xF7D5, - 0x9AE6, 0xF7D6, - 0x9AEB, 0xF7D8, - 0x9AED, 0xF7DA, - 0x9AEF, 0xF7D7, - 0x9AF9, 0xF7DB, - 0x9AFB, 0xF7D9, - 0x9B03, 0xD7D7, - 0x9B08, 0xF7DC, - 0x9B0F, 0xF7DD, - 0x9B13, 0xF7DE, - 0x9B1F, 0xF7DF, - 0x9B23, 0xF7E0, - 0x9B2F, 0xDBCB, - 0x9B32, 0xD8AA, - 0x9B3B, 0xE5F7, - 0x9B3C, 0xB9ED, - 0x9B41, 0xBFFD, - 0x9B42, 0xBBEA, - 0x9B43, 0xF7C9, - 0x9B44, 0xC6C7, - 0x9B45, 0xF7C8, - 0x9B47, 0xF7CA, - 0x9B48, 0xF7CC, - 0x9B49, 0xF7CB, - 0x9B4D, 0xF7CD, - 0x9B4F, 0xCEBA, - 0x9B51, 0xF7CE, - 0x9B54, 0xC4A7, - 0x9C7C, 0xD3E3, - 0x9C7F, 0xF6CF, - 0x9C81, 0xC2B3, - 0x9C82, 0xF6D0, - 0x9C85, 0xF6D1, - 0x9C86, 0xF6D2, - 0x9C87, 0xF6D3, - 0x9C88, 0xF6D4, - 0x9C8B, 0xF6D6, - 0x9C8D, 0xB1AB, - 0x9C8E, 0xF6D7, - 0x9C90, 0xF6D8, - 0x9C91, 0xF6D9, - 0x9C92, 0xF6DA, - 0x9C94, 0xF6DB, - 0x9C95, 0xF6DC, - 0x9C9A, 0xF6DD, - 0x9C9B, 0xF6DE, - 0x9C9C, 0xCFCA, - 0x9C9E, 0xF6DF, - 0x9C9F, 0xF6E0, - 0x9CA0, 0xF6E1, - 0x9CA1, 0xF6E2, - 0x9CA2, 0xF6E3, - 0x9CA3, 0xF6E4, - 0x9CA4, 0xC0F0, - 0x9CA5, 0xF6E5, - 0x9CA6, 0xF6E6, - 0x9CA7, 0xF6E7, - 0x9CA8, 0xF6E8, - 0x9CA9, 0xF6E9, - 0x9CAB, 0xF6EA, - 0x9CAD, 0xF6EB, - 0x9CAE, 0xF6EC, - 0x9CB0, 0xF6ED, - 0x9CB1, 0xF6EE, - 0x9CB2, 0xF6EF, - 0x9CB3, 0xF6F0, - 0x9CB4, 0xF6F1, - 0x9CB5, 0xF6F2, - 0x9CB6, 0xF6F3, - 0x9CB7, 0xF6F4, - 0x9CB8, 0xBEA8, - 0x9CBA, 0xF6F5, - 0x9CBB, 0xF6F6, - 0x9CBC, 0xF6F7, - 0x9CBD, 0xF6F8, - 0x9CC3, 0xC8FA, - 0x9CC4, 0xF6F9, - 0x9CC5, 0xF6FA, - 0x9CC6, 0xF6FB, - 0x9CC7, 0xF6FC, - 0x9CCA, 0xF6FD, - 0x9CCB, 0xF6FE, - 0x9CCC, 0xF7A1, - 0x9CCD, 0xF7A2, - 0x9CCE, 0xF7A3, - 0x9CCF, 0xF7A4, - 0x9CD0, 0xF7A5, - 0x9CD3, 0xF7A6, - 0x9CD4, 0xF7A7, - 0x9CD5, 0xF7A8, - 0x9CD6, 0xB1EE, - 0x9CD7, 0xF7A9, - 0x9CD8, 0xF7AA, - 0x9CD9, 0xF7AB, - 0x9CDC, 0xF7AC, - 0x9CDD, 0xF7AD, - 0x9CDE, 0xC1DB, - 0x9CDF, 0xF7AE, - 0x9CE2, 0xF7AF, - 0x9E1F, 0xC4F1, - 0x9E20, 0xF0AF, - 0x9E21, 0xBCA6, - 0x9E22, 0xF0B0, - 0x9E23, 0xC3F9, - 0x9E25, 0xC5B8, - 0x9E26, 0xD1BB, - 0x9E28, 0xF0B1, - 0x9E29, 0xF0B2, - 0x9E2A, 0xF0B3, - 0x9E2B, 0xF0B4, - 0x9E2C, 0xF0B5, - 0x9E2D, 0xD1BC, - 0x9E2F, 0xD1EC, - 0x9E31, 0xF0B7, - 0x9E32, 0xF0B6, - 0x9E33, 0xD4A7, - 0x9E35, 0xCDD2, - 0x9E36, 0xF0B8, - 0x9E37, 0xF0BA, - 0x9E38, 0xF0B9, - 0x9E39, 0xF0BB, - 0x9E3A, 0xF0BC, - 0x9E3D, 0xB8EB, - 0x9E3E, 0xF0BD, - 0x9E3F, 0xBAE8, - 0x9E41, 0xF0BE, - 0x9E42, 0xF0BF, - 0x9E43, 0xBEE9, - 0x9E44, 0xF0C0, - 0x9E45, 0xB6EC, - 0x9E46, 0xF0C1, - 0x9E47, 0xF0C2, - 0x9E48, 0xF0C3, - 0x9E49, 0xF0C4, - 0x9E4A, 0xC8B5, - 0x9E4B, 0xF0C5, - 0x9E4C, 0xF0C6, - 0x9E4E, 0xF0C7, - 0x9E4F, 0xC5F4, - 0x9E51, 0xF0C8, - 0x9E55, 0xF0C9, - 0x9E57, 0xF0CA, - 0x9E58, 0xF7BD, - 0x9E5A, 0xF0CB, - 0x9E5B, 0xF0CC, - 0x9E5C, 0xF0CD, - 0x9E5E, 0xF0CE, - 0x9E63, 0xF0CF, - 0x9E64, 0xBAD7, - 0x9E66, 0xF0D0, - 0x9E67, 0xF0D1, - 0x9E68, 0xF0D2, - 0x9E69, 0xF0D3, - 0x9E6A, 0xF0D4, - 0x9E6B, 0xF0D5, - 0x9E6C, 0xF0D6, - 0x9E6D, 0xF0D8, - 0x9E70, 0xD3A5, - 0x9E71, 0xF0D7, - 0x9E73, 0xF0D9, - 0x9E7E, 0xF5BA, - 0x9E7F, 0xC2B9, - 0x9E82, 0xF7E4, - 0x9E87, 0xF7E5, - 0x9E88, 0xF7E6, - 0x9E8B, 0xF7E7, - 0x9E92, 0xF7E8, - 0x9E93, 0xC2B4, - 0x9E9D, 0xF7EA, - 0x9E9F, 0xF7EB, - 0x9EA6, 0xC2F3, - 0x9EB4, 0xF4F0, - 0x9EB8, 0xF4EF, - 0x9EBB, 0xC2E9, - 0x9EBD, 0xF7E1, - 0x9EBE, 0xF7E2, - 0x9EC4, 0xBBC6, - 0x9EC9, 0xD9E4, - 0x9ECD, 0xCAF2, - 0x9ECE, 0xC0E8, - 0x9ECF, 0xF0A4, - 0x9ED1, 0xBADA, - 0x9ED4, 0xC7AD, - 0x9ED8, 0xC4AC, - 0x9EDB, 0xF7EC, - 0x9EDC, 0xF7ED, - 0x9EDD, 0xF7EE, - 0x9EDF, 0xF7F0, - 0x9EE0, 0xF7EF, - 0x9EE2, 0xF7F1, - 0x9EE5, 0xF7F4, - 0x9EE7, 0xF7F3, - 0x9EE9, 0xF7F2, - 0x9EEA, 0xF7F5, - 0x9EEF, 0xF7F6, - 0x9EF9, 0xEDE9, - 0x9EFB, 0xEDEA, - 0x9EFC, 0xEDEB, - 0x9EFE, 0xF6BC, - 0x9F0B, 0xF6BD, - 0x9F0D, 0xF6BE, - 0x9F0E, 0xB6A6, - 0x9F10, 0xD8BE, - 0x9F13, 0xB9C4, - 0x9F17, 0xD8BB, - 0x9F19, 0xDCB1, - 0x9F20, 0xCAF3, - 0x9F22, 0xF7F7, - 0x9F2C, 0xF7F8, - 0x9F2F, 0xF7F9, - 0x9F37, 0xF7FB, - 0x9F39, 0xF7FA, - 0x9F3B, 0xB1C7, - 0x9F3D, 0xF7FC, - 0x9F3E, 0xF7FD, - 0x9F44, 0xF7FE, - 0x9F50, 0xC6EB, - 0x9F51, 0xECB4, - 0x9F7F, 0xB3DD, - 0x9F80, 0xF6B3, - 0x9F83, 0xF6B4, - 0x9F84, 0xC1E4, - 0x9F85, 0xF6B5, - 0x9F86, 0xF6B6, - 0x9F87, 0xF6B7, - 0x9F88, 0xF6B8, - 0x9F89, 0xF6B9, - 0x9F8A, 0xF6BA, - 0x9F8B, 0xC8A3, - 0x9F8C, 0xF6BB, - 0x9F99, 0xC1FA, - 0x9F9A, 0xB9A8, - 0x9F9B, 0xEDE8, - 0x9F9F, 0xB9EA, - 0x9FA0, 0xD9DF, - 0xFF01, 0xA3A1, - 0xFF02, 0xA3A2, - 0xFF03, 0xA3A3, - 0xFF04, 0xA1E7, - 0xFF05, 0xA3A5, - 0xFF06, 0xA3A6, - 0xFF07, 0xA3A7, - 0xFF08, 0xA3A8, - 0xFF09, 0xA3A9, - 0xFF0A, 0xA3AA, - 0xFF0B, 0xA3AB, - 0xFF0C, 0xA3AC, - 0xFF0D, 0xA3AD, - 0xFF0E, 0xA3AE, - 0xFF0F, 0xA3AF, - 0xFF10, 0xA3B0, - 0xFF11, 0xA3B1, - 0xFF12, 0xA3B2, - 0xFF13, 0xA3B3, - 0xFF14, 0xA3B4, - 0xFF15, 0xA3B5, - 0xFF16, 0xA3B6, - 0xFF17, 0xA3B7, - 0xFF18, 0xA3B8, - 0xFF19, 0xA3B9, - 0xFF1A, 0xA3BA, - 0xFF1B, 0xA3BB, - 0xFF1C, 0xA3BC, - 0xFF1D, 0xA3BD, - 0xFF1E, 0xA3BE, - 0xFF1F, 0xA3BF, - 0xFF20, 0xA3C0, - 0xFF21, 0xA3C1, - 0xFF22, 0xA3C2, - 0xFF23, 0xA3C3, - 0xFF24, 0xA3C4, - 0xFF25, 0xA3C5, - 0xFF26, 0xA3C6, - 0xFF27, 0xA3C7, - 0xFF28, 0xA3C8, - 0xFF29, 0xA3C9, - 0xFF2A, 0xA3CA, - 0xFF2B, 0xA3CB, - 0xFF2C, 0xA3CC, - 0xFF2D, 0xA3CD, - 0xFF2E, 0xA3CE, - 0xFF2F, 0xA3CF, - 0xFF30, 0xA3D0, - 0xFF31, 0xA3D1, - 0xFF32, 0xA3D2, - 0xFF33, 0xA3D3, - 0xFF34, 0xA3D4, - 0xFF35, 0xA3D5, - 0xFF36, 0xA3D6, - 0xFF37, 0xA3D7, - 0xFF38, 0xA3D8, - 0xFF39, 0xA3D9, - 0xFF3A, 0xA3DA, - 0xFF3B, 0xA3DB, - 0xFF3C, 0xA3DC, - 0xFF3D, 0xA3DD, - 0xFF3E, 0xA3DE, - 0xFF3F, 0xA3DF, - 0xFF40, 0xA3E0, - 0xFF41, 0xA3E1, - 0xFF42, 0xA3E2, - 0xFF43, 0xA3E3, - 0xFF44, 0xA3E4, - 0xFF45, 0xA3E5, - 0xFF46, 0xA3E6, - 0xFF47, 0xA3E7, - 0xFF48, 0xA3E8, - 0xFF49, 0xA3E9, - 0xFF4A, 0xA3EA, - 0xFF4B, 0xA3EB, - 0xFF4C, 0xA3EC, - 0xFF4D, 0xA3ED, - 0xFF4E, 0xA3EE, - 0xFF4F, 0xA3EF, - 0xFF50, 0xA3F0, - 0xFF51, 0xA3F1, - 0xFF52, 0xA3F2, - 0xFF53, 0xA3F3, - 0xFF54, 0xA3F4, - 0xFF55, 0xA3F5, - 0xFF56, 0xA3F6, - 0xFF57, 0xA3F7, - 0xFF58, 0xA3F8, - 0xFF59, 0xA3F9, - 0xFF5A, 0xA3FA, - 0xFF5B, 0xA3FB, - 0xFF5C, 0xA3FC, - 0xFF5D, 0xA3FD, - 0xFF5E, 0xA1AB, - 0xFFE0, 0xA1E9, - 0xFFE1, 0xA1EA, - 0xFFE3, 0xA3FE, - 0xFFE5, 0xA3A4 -}; diff --git a/3rdparty/zint-2.4.4/backend/gridmtx.c b/3rdparty/zint-2.4.4/backend/gridmtx.c deleted file mode 100644 index 47f904d..0000000 --- a/3rdparty/zint-2.4.4/backend/gridmtx.c +++ /dev/null @@ -1,1090 +0,0 @@ -/* gridmtx.c - Grid Matrix - - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* This file impliments Grid Matrix as specified in - AIM Global Document Number AIMD014 Rev. 1.63 Revised 9 Dec 2008 */ - -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" -#include "reedsol.h" -#include "gridmtx.h" -#include "gb2312.h" - -int number_lat(int gbdata[], int length, int position) -{ - /* Attempt to calculate the 'cost' of using numeric mode from a given position in number of bits */ - /* Also ensures that numeric mode is not selected when it cannot be used: for example in - a string which has "2.2.0" (cannot have more than one non-numeric character for each - block of three numeric characters) */ - int sp; - int numb = 0, nonum = 0, done; - int tally = 0; - - sp = position; - - do { - done = 0; - - if((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { numb++; done = 1; } - switch(gbdata[sp]) { - case ' ': - case '+': - case '-': - case '.': - case ',': - nonum++; - done = 1; - } - if((sp + 1) < length) { - if((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { - nonum++; - done = 1; - sp++; - } - } - - if(done == 0) { - tally += 80; - } else { - if(numb == 3) { - if(nonum == 0) { - tally += 10; - } - if(nonum == 1) { - tally += 20; - } - if(nonum > 1) { - tally += 80; - } - numb = 0; - nonum = 0; - } - } - - sp++; - } while ((sp < length) && (sp <= (position + 8))); - - if(numb == 0) { - tally += 80; - } - - if(numb > 1) { - if(nonum == 0) { - tally += 10; - } - if(nonum == 1) { - tally += 20; - } - if(nonum > 1) { - tally += 80; - } - } - - return tally; -} - -int seek_forward(int gbdata[], int length, int position, int current_mode) -{ - /* In complete contrast to the method recommended in Annex D of the ANSI standard this - code uses a look-ahead test in the same manner as Data Matrix. This decision was made - because the "official" algorithm does not provide clear methods for dealing with all - possible combinations of input data */ - - int number_count, byte_count, mixed_count, upper_count, lower_count, chinese_count; - int sp, best_mode, done; - int best_count, last = -1; - int debug = 0; - - if(gbdata[position] > 0xff) { return GM_CHINESE; } - - switch(current_mode) { - case GM_CHINESE: - number_count = 13; - byte_count = 13; - mixed_count = 13; - upper_count = 13; - lower_count = 13; - chinese_count = 0; - break; - case GM_NUMBER: - number_count = 0; - byte_count = 10; - mixed_count = 10; - upper_count = 10; - lower_count = 10; - chinese_count = 10; - break; - case GM_LOWER: - number_count = 5; - byte_count = 7; - mixed_count = 7; - upper_count = 5; - lower_count = 0; - chinese_count = 5; - break; - case GM_UPPER: - number_count = 5; - byte_count = 7; - mixed_count = 7; - upper_count = 0; - lower_count = 5; - chinese_count = 5; - break; - case GM_MIXED: - number_count = 10; - byte_count = 10; - mixed_count = 0; - upper_count = 10; - lower_count = 10; - chinese_count = 10; - break; - case GM_BYTE: - number_count = 4; - byte_count = 0; - mixed_count = 4; - upper_count = 4; - lower_count = 4; - chinese_count = 4; - default: /* Start of symbol */ - number_count = 4; - byte_count = 4; - mixed_count = 4; - upper_count = 4; - lower_count = 4; - chinese_count = 4; - } - - for(sp = position; (sp < length) && (sp <= (position + 8)); sp++) { - - done = 0; - - if(gbdata[sp] >= 0xff) { - byte_count += 17; - mixed_count += 23; - upper_count += 18; - lower_count += 18; - chinese_count += 13; - done = 1; - } - - if((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { - byte_count += 8; - mixed_count += 6; - upper_count += 10; - lower_count += 5; - chinese_count += 13; - done = 1; - } - - if((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { - byte_count += 8; - mixed_count += 6; - upper_count += 5; - lower_count += 10; - chinese_count += 13; - done = 1; - } - - if((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { - byte_count += 8; - mixed_count += 6; - upper_count += 8; - lower_count += 8; - chinese_count += 13; - done = 1; - } - - if(gbdata[sp] == ' ') { - byte_count += 8; - mixed_count += 6; - upper_count += 5; - lower_count += 5; - chinese_count += 13; - done = 1; - } - - if(done == 0) { - /* Control character */ - byte_count += 8; - mixed_count += 16; - upper_count += 13; - lower_count += 13; - chinese_count += 13; - } - - if(gbdata[sp] >= 0x7f) { - mixed_count += 20; - upper_count += 20; - lower_count += 20; - } - } - - /* Adjust for */ - for(sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) { - if((gbdata[sp] == 0x13) && (gbdata[sp] == 0x10)) { - chinese_count -= 13; - } - } - - /* Adjust for double digits */ - for(sp = position; (sp < (length - 1)) && (sp <= (position + 7)); sp++) { - if(sp != last) { - if(((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) { - chinese_count -= 13; - last = sp + 1; - } - } - } - - /* Numeric mode is more complex */ - number_count += number_lat(gbdata, length, position); - - if(debug) { printf("C %d / B %d / M %d / U %d / L %d / N %d\n", chinese_count, byte_count, mixed_count, upper_count, lower_count, number_count); } - - best_count = chinese_count; - best_mode = GM_CHINESE; - - if(byte_count <= best_count) { - best_count = byte_count; - best_mode = GM_BYTE; - } - - if(mixed_count <= best_count) { - best_count = mixed_count; - best_mode = GM_MIXED; - } - - if(upper_count <= best_count) { - best_count = upper_count; - best_mode = GM_UPPER; - } - - if(lower_count <= best_count) { - best_count = lower_count; - best_mode = GM_LOWER; - } - - if(number_count <= best_count) { - best_count = number_count; - best_mode = GM_NUMBER; - } - - return best_mode; -} - -void add_byte_count(char binary[], int byte_count_posn, int byte_count) -{ - /* Add the length indicator for byte encoded blocks */ - if(byte_count & 0x100) { binary[byte_count_posn] = '0'; } else { binary[byte_count_posn] = '1'; } - if(byte_count & 0x80) { binary[byte_count_posn + 1] = '0'; } else { binary[byte_count_posn + 1] = '1'; } - if(byte_count & 0x40) { binary[byte_count_posn + 2] = '0'; } else { binary[byte_count_posn + 2] = '1'; } - if(byte_count & 0x20) { binary[byte_count_posn + 3] = '0'; } else { binary[byte_count_posn + 3] = '1'; } - if(byte_count & 0x10) { binary[byte_count_posn + 4] = '0'; } else { binary[byte_count_posn + 4] = '1'; } - if(byte_count & 0x08) { binary[byte_count_posn + 5] = '0'; } else { binary[byte_count_posn + 5] = '1'; } - if(byte_count & 0x04) { binary[byte_count_posn + 6] = '0'; } else { binary[byte_count_posn + 6] = '1'; } - if(byte_count & 0x02) { binary[byte_count_posn + 7] = '0'; } else { binary[byte_count_posn + 7] = '1'; } - if(byte_count & 0x01) { binary[byte_count_posn + 8] = '0'; } else { binary[byte_count_posn + 8] = '1'; } -} - -void add_shift_char(char binary[], int shifty) -{ - /* Add a control character to the data stream */ - int i, debug = 0; - int glyph = 0; - - for(i = 0; i < 64; i++) { - if(shift_set[i] == shifty) { - glyph = i; - } - } - - if(debug) { printf("SHIFT [%d] ", glyph); } - - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } -} - -int gm_encode(int gbdata[], int length, char binary[], int reader) -{ - /* Create a binary stream representation of the input data. - 7 sets are defined - Chinese characters, Numerals, Lower case letters, Upper case letters, - Mixed numerals and latters, Control characters and 8-bit binary data */ - int sp, current_mode, next_mode, last_mode, glyph = 0; - int c1, c2, done; - int p = 0, ppos; - int numbuf[3], punt = 0; - int number_pad_posn, debug = 0; - int byte_count_posn = 0, byte_count = 0; - int shift, i; - - strcpy(binary, ""); - - sp = 0; - current_mode = 0; - last_mode = 0; - number_pad_posn = 0; - - if(reader) { - concat(binary, "1010"); /* FNC3 - Reader Initialisation */ - } - - do { - next_mode = seek_forward(gbdata, length, sp, current_mode); - - if(next_mode != current_mode) { - switch(current_mode) { - case 0: - switch(next_mode) { - case GM_CHINESE: concat(binary, "0001"); break; - case GM_NUMBER: concat(binary, "0010"); break; - case GM_LOWER: concat(binary, "0011"); break; - case GM_UPPER: concat(binary, "0100"); break; - case GM_MIXED: concat(binary, "0101"); break; - case GM_BYTE: concat(binary, "0111"); break; - } - break; - case GM_CHINESE: - switch(next_mode) { - case GM_NUMBER: concat(binary, "1111111100001"); break; // 8161 - case GM_LOWER: concat(binary, "1111111100010"); break; // 8162 - case GM_UPPER: concat(binary, "1111111100011"); break; // 8163 - case GM_MIXED: concat(binary, "1111111100100"); break; // 8164 - case GM_BYTE: concat(binary, "1111111100101"); break; // 8165 - } - break; - case GM_NUMBER: - /* add numeric block padding value */ - switch(p) { - case 1: binary[number_pad_posn] = '1'; binary[number_pad_posn + 1] = '0'; break; // 2 pad digits - case 2: binary[number_pad_posn] = '0'; binary[number_pad_posn + 1] = '1'; break; // 1 pad digit - case 3: binary[number_pad_posn] = '0'; binary[number_pad_posn + 1] = '0'; break; // 0 pad digits - } - switch(next_mode) { - case GM_CHINESE: concat(binary, "1111111011"); break; // 1019 - case GM_LOWER: concat(binary, "1111111100"); break; // 1020 - case GM_UPPER: concat(binary, "1111111101"); break; // 1021 - case GM_MIXED: concat(binary, "1111111110"); break; // 1022 - case GM_BYTE: concat(binary, "1111111111"); break; // 1023 - } - break; - case GM_LOWER: - case GM_UPPER: - switch(next_mode) { - case GM_CHINESE: concat(binary, "11100"); break; // 28 - case GM_NUMBER: concat(binary, "11101"); break; // 29 - case GM_LOWER: - case GM_UPPER: concat(binary, "11110"); break; // 30 - case GM_MIXED: concat(binary, "1111100"); break; // 124 - case GM_BYTE: concat(binary, "1111110"); break; // 126 - } - break; - case GM_MIXED: - switch(next_mode) { - case GM_CHINESE: concat(binary, "1111110001"); break; // 1009 - case GM_NUMBER: concat(binary, "1111110010"); break; // 1010 - case GM_LOWER: concat(binary, "1111110011"); break; // 1011 - case GM_UPPER: concat(binary, "1111110100"); break; // 1012 - case GM_BYTE: concat(binary, "1111110111"); break; // 1015 - } - break; - case GM_BYTE: - /* add byte block length indicator */ - add_byte_count(binary, byte_count_posn, byte_count); - byte_count = 0; - switch(next_mode) { - case GM_CHINESE: concat(binary, "0001"); break; // 1 - case GM_NUMBER: concat(binary, "0010"); break; // 2 - case GM_LOWER: concat(binary, "0011"); break; // 3 - case GM_UPPER: concat(binary, "0100"); break; // 4 - case GM_MIXED: concat(binary, "0101"); break; // 5 - } - break; - } - if(debug) { - switch(next_mode) { - case GM_CHINESE: printf("CHIN "); break; - case GM_NUMBER: printf("NUMB "); break; - case GM_LOWER: printf("LOWR "); break; - case GM_UPPER: printf("UPPR "); break; - case GM_MIXED: printf("MIXD "); break; - case GM_BYTE: printf("BYTE "); break; - } - } - } - last_mode = current_mode; - current_mode = next_mode; - - switch(current_mode) { - case GM_CHINESE: - done = 0; - if(gbdata[sp] > 0xff) { - /* GB2312 character */ - c1 = (gbdata[sp] & 0xff00) >> 8; - c2 = gbdata[sp] & 0xff; - - if((c1 >= 0xa0) && (c1 <= 0xa9)) { - glyph = (0x60 * (c1 - 0xa1)) + (c2 - 0xa0); - } - if((c1 >= 0xb0) && (c1 <= 0xf7)) { - glyph = (0x60 * (c1 - 0xb0 + 9)) + (c2 - 0xa0); - } - done = 1; - } - if(!(done)) { - if(sp != (length - 1)) { - if((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { - /* End of Line */ - glyph = 7776; - sp++; - } - done = 1; - } - } - if(!(done)) { - if(sp != (length - 1)) { - if(((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) && - ((gbdata[sp + 1] >= '0') && (gbdata[sp + 1] <= '9'))) { - /* Two digits */ - glyph = 8033 + (10 * (gbdata[sp] - '0')) + (gbdata[sp + 1] - '0'); - sp++; - } - } - } - if(!(done)) { - /* Byte value */ - glyph = 7777 + gbdata[sp]; - } - - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x1000) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x800) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x400) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x200) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x100) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - sp++; - break; - - case GM_NUMBER: - if(last_mode != current_mode) { - /* Reserve a space for numeric digit padding value (2 bits) */ - number_pad_posn = strlen(binary); - concat(binary, "XX"); - } - p = 0; - ppos = -1; - - /* Numeric compression can also include certain combinations of - non-numeric character */ - - numbuf[0] = '0'; - numbuf[1] = '0'; - numbuf[2] = '0'; - do { - if((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { - numbuf[p] = gbdata[sp]; - sp++; - p++; - } - switch(gbdata[sp]) { - case ' ': - case '+': - case '-': - case '.': - case ',': - punt = gbdata[sp]; - sp++; - ppos = p; - break; - } - if(sp < (length - 1)) { - if((gbdata[sp] == 0x13) && (gbdata[sp + 1] == 0x10)) { - /* */ - punt = gbdata[sp]; - sp += 2; - ppos = p; - } - } - } while ((p < 3) && (sp < length)); - - if(ppos != -1) { - switch(punt) { - case ' ': glyph = 0; break; - case '+': glyph = 3; break; - case '-': glyph = 6; break; - case '.': glyph = 9; break; - case ',': glyph = 12; break; - case 0x13: glyph = 15; break; - } - glyph += ppos; - glyph += 1000; - - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x200) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x100) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - } - - glyph = (100 * (numbuf[0] - '0')) + (10 * (numbuf[1] - '0')) + (numbuf[2] - '0'); - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x200) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x100) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - break; - - case GM_BYTE: - if(last_mode != current_mode) { - /* Reserve space for byte block length indicator (9 bits) */ - byte_count_posn = strlen(binary); - concat(binary, "LLLLLLLLL"); - } - if(byte_count == 512) { - /* Maximum byte block size is 512 bytes. If longer is needed then start a new block */ - add_byte_count(binary, byte_count_posn, byte_count); - concat(binary, "0111"); - byte_count_posn = strlen(binary); - concat(binary, "LLLLLLLLL"); - byte_count = 0; - } - - glyph = gbdata[sp]; - if(debug) { printf("[%d] ", glyph); } - if(glyph & 0x80) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x40) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - sp++; - byte_count++; - break; - - case GM_MIXED: - shift = 1; - if((gbdata[sp] >= '0') && (gbdata[sp] <= '9')) { shift = 0; } - if((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { shift = 0; } - if((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { shift = 0; } - if(gbdata[sp] == ' ') { shift = 0; } - - if(shift == 0) { - /* Mixed Mode character */ - glyph = posn(EUROPIUM, gbdata[sp]); - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x20) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - } else { - /* Shift Mode character */ - concat(binary, "1111110110"); /* 1014 - shift indicator */ - add_shift_char(binary, gbdata[sp]); - } - - sp++; - break; - - case GM_UPPER: - shift = 1; - if((gbdata[sp] >= 'A') && (gbdata[sp] <= 'Z')) { shift = 0; } - if(gbdata[sp] == ' ') { shift = 0; } - - if(shift == 0) { - /* Upper Case character */ - glyph = posn("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", gbdata[sp]); - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - } else { - /* Shift Mode character */ - concat(binary, "1111101"); /* 127 - shift indicator */ - add_shift_char(binary, gbdata[sp]); - } - - sp++; - break; - - case GM_LOWER: - shift = 1; - if((gbdata[sp] >= 'a') && (gbdata[sp] <= 'z')) { shift = 0; } - if(gbdata[sp] == ' ') { shift = 0; } - - if(shift == 0) { - /* Lower Case character */ - glyph = posn("abcdefghijklmnopqrstuvwxyz ", gbdata[sp]); - if(debug) { printf("[%d] ", glyph); } - - if(glyph & 0x10) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x08) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x04) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x02) { concat(binary, "1"); } else { concat(binary, "0"); } - if(glyph & 0x01) { concat(binary, "1"); } else { concat(binary, "0"); } - } else { - /* Shift Mode character */ - concat(binary, "1111101"); /* 127 - shift indicator */ - add_shift_char(binary, gbdata[sp]); - } - - sp++; - break; - } - if(strlen(binary) > 9191) { - return ERROR_TOO_LONG; - } - - } while(sp < length); - - if(current_mode == GM_NUMBER) { - /* add numeric block padding value */ - switch(p) { - case 1: binary[number_pad_posn] = '1'; binary[number_pad_posn + 1] = '0'; break; // 2 pad digits - case 2: binary[number_pad_posn] = '0'; binary[number_pad_posn + 1] = '1'; break; // 1 pad digit - case 3: binary[number_pad_posn] = '0'; binary[number_pad_posn + 1] = '0'; break; // 0 pad digits - } - } - - if(current_mode == GM_BYTE) { - /* Add byte block length indicator */ - add_byte_count(binary, byte_count_posn, byte_count); - } - - /* Add "end of data" character */ - switch(current_mode) { - case GM_CHINESE: concat(binary, "1111111100000"); break; // 8160 - case GM_NUMBER: concat(binary, "1111111010"); break; // 1018 - case GM_LOWER: - case GM_UPPER: concat(binary, "11011"); break; // 27 - case GM_MIXED: concat(binary, "1111110000"); break; // 1008 - case GM_BYTE: concat(binary, "0000"); break; // 0 - } - - /* Add padding bits if required */ - p = 7 - (strlen(binary) % 7); - if(p == 7) { p = 0; } - for(i = 0; i < p; i++) { - concat(binary, "0"); - } - - if(strlen(binary) > 9191) { - return ERROR_TOO_LONG; - } - return 0; -} - -void gm_add_ecc(char binary[], int data_posn, int layers, int ecc_level, int word[]) -{ - int total_cw, data_cw, i, j, wp; - int n1, b1, n2, b2, e1, b3, e2; - int block_size, data_size, ecc_size, toggle; - int data[1320], block[130]; - unsigned char data_block[115], ecc_block[70]; - - total_cw = gm_total_cw[(layers - 1)]; - data_cw = gm_data_codewords[((layers - 1) * 5) + (ecc_level - 1)]; - - for(i = 0; i < 1320; i++) { - data[i] = 0; - } - - /* Convert from binary sream to 7-bit codewords */ - for(i = 0; i < data_posn; i++) { - if(binary[i * 7] == '1') { data[i] += 0x40; } - if(binary[(i * 7) + 1] == '1') { data[i] += 0x20; } - if(binary[(i * 7) + 2] == '1') { data[i] += 0x10; } - if(binary[(i * 7) + 3] == '1') { data[i] += 0x08; } - if(binary[(i * 7) + 4] == '1') { data[i] += 0x04; } - if(binary[(i * 7) + 5] == '1') { data[i] += 0x02; } - if(binary[(i * 7) + 6] == '1') { data[i] += 0x01; } - } - - /* Add padding codewords */ - data[data_posn] = 0x00; - for(i = (data_posn + 1); i < data_cw; i++) { - if(i & 1) { - data[i] = 0x7e; - toggle = 1; - } else { - data[i] = 0x00; - toggle = 0; - } - } - - /* Get block sizes */ - n1 = gm_n1[(layers - 1)]; - b1 = gm_b1[(layers - 1)]; - n2 = n1 - 1; - b2 = gm_b2[(layers - 1)]; - e1 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4)]; - b3 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 1]; - e2 = gm_ebeb[((layers - 1) * 20) + ((ecc_level - 1) * 4) + 2]; - - /* Split the data into blocks */ - wp = 0; - for(i = 0; i < (b1 + b2); i++) { - if(i < b1) { block_size = n1; } else { block_size = n2; } - if(i < b3) { ecc_size = e1; } else { ecc_size = e2; } - data_size = block_size - ecc_size; - - /* printf("block %d/%d: data %d / ecc %d\n", i + 1, (b1 + b2), data_size, ecc_size);*/ - - for(j = 0; j < data_size; j++) { - data_block[j] = data[wp]; - wp++; - } - - /* Calculate ECC data for this block */ - rs_init_gf(0x89); - rs_init_code(ecc_size, 1); - rs_encode(data_size, data_block, ecc_block); - rs_free(); - - /* Correct error correction data but in reverse order */ - for(j = 0; j < data_size; j++) { - block[j] = data_block[j]; - } - for(j = 0; j < ecc_size; j++) { - block[(j + data_size)] = ecc_block[ecc_size - j - 1]; - } - - for(j = 0; j < n2; j++) { - word[((b1 + b2) * j) + i] = block[j]; - } - if(block_size == n1) { - word[((b1 + b2) * (n1 - 1)) + i] = block[(n1 - 1)]; - } - } -} - -void place_macromodule(char grid[], int x, int y, int word1, int word2, int size) -{ - int i, j; - - i = (x * 6) + 1; - j = (y * 6) + 1; - - if(word2 & 0x40) { grid[(j * size) + i + 2] = '1'; } - if(word2 & 0x20) { grid[(j * size) + i + 3] = '1'; } - if(word2 & 0x10) { grid[((j + 1) * size) + i] = '1'; } - if(word2 & 0x08) { grid[((j + 1) * size) + i + 1] = '1'; } - if(word2 & 0x04) { grid[((j + 1) * size) + i + 2] = '1'; } - if(word2 & 0x02) { grid[((j + 1) * size) + i + 3] = '1'; } - if(word2 & 0x01) { grid[((j + 2) * size) + i] = '1'; } - if(word1 & 0x40) { grid[((j + 2) * size) + i + 1] = '1'; } - if(word1 & 0x20) { grid[((j + 2) * size) + i + 2] = '1'; } - if(word1 & 0x10) { grid[((j + 2) * size) + i + 3] = '1'; } - if(word1 & 0x08) { grid[((j + 3) * size) + i] = '1'; } - if(word1 & 0x04) { grid[((j + 3) * size) + i + 1] = '1'; } - if(word1 & 0x02) { grid[((j + 3) * size) + i + 2] = '1'; } - if(word1 & 0x01) { grid[((j + 3) * size) + i + 3] = '1'; } -} - -void place_data_in_grid(int word[], char grid[], int modules, int size) -{ - int x, y, macromodule, offset; - - offset = 13 - ((modules - 1) / 2); - for(y = 0; y < modules; y++) { - for(x = 0; x < modules; x++) { - macromodule = gm_macro_matrix[((y + offset) * 27) + (x + offset)]; - place_macromodule(grid, x, y, word[macromodule * 2], word[(macromodule * 2) + 1], size); - } - } -} - -void place_layer_id(char* grid, int size, int layers, int modules, int ecc_level) -{ - /* Place the layer ID into each macromodule */ - - int i, j, layer, start, stop; - -#ifndef _MSC_VER - int layerid[layers + 1]; - int id[modules * modules]; -#else - int* layerid = (int *)_alloca((layers + 1) * sizeof(int)); - int* id = (int *)_alloca((modules * modules) * sizeof(int)); -#endif - - /* Calculate Layer IDs */ - for(i = 0; i <= layers; i++) { - if(ecc_level == 1) { - layerid[i] = 3 - (i % 4); - } else { - layerid[i] = (i + 5 - ecc_level) % 4; - } - } - - for(i = 0; i < modules; i++) { - for(j = 0; j < modules; j++) { - id[(i * modules) + j] = 0; - } - } - - /* Calculate which value goes in each macromodule */ - start = modules / 2; - stop = modules / 2; - for(layer = 0; layer <= layers; layer++) { - for(i = start; i <= stop; i++) { - id[(start * modules) + i] = layerid[layer]; - id[(i * modules) + start] = layerid[layer]; - id[((modules - start - 1) * modules) + i] = layerid[layer]; - id[(i * modules) + (modules - start - 1)] = layerid[layer]; - } - start--; - stop++; - } - - /* Place the data in the grid */ - for(i = 0; i < modules; i++) { - for(j = 0; j < modules; j++) { - if(id[(i * modules) + j] & 0x02) { - grid[(((i * 6) + 1) * size) + (j * 6) + 1] = '1'; - } - if(id[(i * modules) + j] & 0x01) { - grid[(((i * 6) + 1) * size) + (j * 6) + 2] = '1'; - } - } - } -} - -int grid_matrix(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int size, modules, dark, error_number; - int auto_layers, min_layers, layers, auto_ecc_level, min_ecc_level, ecc_level; - int x, y, i, j, glyph; - char binary[9300]; - int data_cw, input_latch = 0; - int word[1460], data_max, reader = 0; - -#ifndef _MSC_VER - int utfdata[length + 1]; - int gbdata[length + 1]; -#else - int* utfdata = (int *)_alloca((length + 1) * sizeof(int)); - int* gbdata = (int *)_alloca((length + 1) * sizeof(int)); - char* grid; -#endif - - for(i = 0; i < 1460; i++) { - word[i] = 0; - } - - switch(symbol->input_mode) { - case DATA_MODE: - for(i = 0; i < length; i++) { - gbdata[i] = (int)source[i]; - } - break; - default: - /* Convert Unicode input to GB-2312 */ - error_number = utf8toutf16(symbol, source, utfdata, &length); - if(error_number != 0) { return error_number; } - - for(i = 0; i < length; i++) { - if(utfdata[i] <= 0xff) { - gbdata[i] = utfdata[i]; - } else { - j = 0; - glyph = 0; - do { - if(gb2312_lookup[j * 2] == utfdata[i]) { - glyph = gb2312_lookup[(j * 2) + 1]; - } - j++; - } while ((j < 7445) && (glyph == 0)); - if(glyph == 0) { - strcpy(symbol->errtxt, "Invalid character in input data"); - return ERROR_INVALID_DATA1; - } - gbdata[i] = glyph; - } - } - break; - } - - if(symbol->output_options & READER_INIT) reader = 1; - - error_number = gm_encode(gbdata, length, binary, reader); - if(error_number != 0) { - strcpy(symbol->errtxt, "Input data too long"); - return error_number; - } - - /* Determine the size of the symbol */ - data_cw = strlen(binary) / 7; - - auto_layers = 13; - for(i = 12; i > 0; i--) { - if(gm_recommend_cw[(i - 1)] >= data_cw) { auto_layers = i; } - } - min_layers = 13; - for(i = 12; i > 0; i--) { - if(gm_max_cw[(i - 1)] >= data_cw) { min_layers = i; } - } - layers = auto_layers; - auto_ecc_level = 3; - if(layers == 1) { auto_ecc_level = 5; } - if((layers == 2) || (layers == 3)) { auto_ecc_level = 4; } - min_ecc_level = 1; - if(layers == 1) { min_ecc_level = 4; } - if((layers == 2) || (layers == 3)) { min_ecc_level = 2; } - ecc_level = auto_ecc_level; - - if((symbol->option_2 >= 1) && (symbol->option_2 <= 13)) { - input_latch = 1; - if(symbol->option_2 > min_layers) { - layers = symbol->option_2; - } else { - layers = min_layers; - } - } - - if(input_latch == 1) { - auto_ecc_level = 3; - if(layers == 1) { auto_ecc_level = 5; } - if((layers == 2) || (layers == 3)) { auto_ecc_level = 4; } - ecc_level = auto_ecc_level; - if(data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) { - layers++; - } - } - - if(input_latch == 0) { - if((symbol->option_1 >= 1) && (symbol->option_1 <= 5)) { - if(symbol->option_1 > min_ecc_level) { - ecc_level = symbol->option_1; - } else { - ecc_level = min_ecc_level; - } - } - if(data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) { - do { - layers++; - } while ((data_cw > gm_data_codewords[(5 * (layers - 1)) + (ecc_level - 1)]) && (layers <= 13)); - } - } - - data_max = 1313; - switch(ecc_level) { - case 2: data_max = 1167; break; - case 3: data_max = 1021; break; - case 4: data_max = 875; break; - case 5: data_max = 729; break; - } - - if(data_cw > data_max) { - strcpy(symbol->errtxt, "Input data too long"); - return ERROR_TOO_LONG; - } - - gm_add_ecc(binary, data_cw, layers, ecc_level, word); - size = 6 + (layers * 12); - modules = 1 + (layers * 2); - -#ifndef _MSC_VER - char grid[size * size]; -#else - grid = (char *)_alloca((size * size) * sizeof(char)); -#endif - - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - grid[(y * size) + x] = '0'; - } - } - - place_data_in_grid(word, grid, modules, size); - place_layer_id(grid, size, layers, modules, ecc_level); - - /* Add macromodule frames */ - for(x = 0; x < modules; x++) { - dark = 1 - (x & 1); - for(y = 0; y < modules; y++) { - if(dark == 1) { - for(i = 0; i < 5; i++) { - grid[((y * 6) * size) + (x * 6) + i] = '1'; - grid[(((y * 6) + 5) * size) + (x * 6) + i] = '1'; - grid[(((y * 6) + i) * size) + (x * 6)] = '1'; - grid[(((y * 6) + i) * size) + (x * 6) + 5] = '1'; - } - grid[(((y * 6) + 5) * size) + (x * 6) + 5] = '1'; - dark = 0; - } else { - dark = 1; - } - } - } - - /* Copy values to symbol */ - symbol->width = size; - symbol->rows = size; - - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - if(grid[(y * size) + x] == '1') { - set_module(symbol, y, x); - } - } - symbol->row_height[x] = 1; - } - - return 0; -} diff --git a/3rdparty/zint-2.4.4/backend/gridmtx.h b/3rdparty/zint-2.4.4/backend/gridmtx.h deleted file mode 100644 index ba684a1..0000000 --- a/3rdparty/zint-2.4.4/backend/gridmtx.h +++ /dev/null @@ -1,160 +0,0 @@ -/* gridmtx.h - definitions for Grid Matrix - - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#define GM_NUMBER 1 -#define GM_LOWER 2 -#define GM_UPPER 3 -#define GM_MIXED 4 -#define GM_CONTROL 5 -#define GM_BYTE 6 -#define GM_CHINESE 7 - -#define EUROPIUM "0123456789ABCDEFGHIJKLMOPRSTUVWXYZabcdefghijklmnopqrstuvwxyz " - -static char shift_set[] = { - /* From Table 7 - Encoding of control characters */ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* NULL -> SI */ - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, /* DLE -> US */ - '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', ':', - ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '_', '`', '{', '|', '}', '~' -}; - -static int gm_recommend_cw[] = { 9, 30, 59, 114, 170, 237, 315, 405, 506, 618, 741, 875, 1021 }; -static int gm_max_cw[] = { 11, 40, 79, 146, 218, 305, 405, 521, 650, 794, 953, 1125, 1313 }; -static int gm_total_cw[] = { 18, 50, 98, 162, 242, 338, 450, 578, 722, 882, 1058, 1250, 1458 }; - -static int gm_data_codewords[] = { - 0, 15, 13, 11, 9, - 45, 40, 35, 30, 25, - 89, 79, 69, 59, 49, - 146, 130, 114, 98, 81, - 218, 194, 170, 146, 121, - 305, 271, 237, 203, 169, - 405, 360, 315, 270, 225, - 521, 463, 405, 347, 289, - 650, 578, 506, 434, 361, - 794, 706, 618, 530, 441, - 953, 847, 741, 635, 529, - 1125, 1000, 875, 750, 625, - 1313, 1167, 1021, 875, 729 -}; - -static int gm_n1[] = { 18, 50, 98, 81, 121, 113, 113, 116, 121, 126, 118, 125, 122 }; -static int gm_b1[] = { 1, 1, 1, 2, 2, 2, 2, 3, 2, 7, 5, 10, 6 }; -static int gm_b2[] = { 0, 0, 0, 0, 0, 1, 2, 2, 4, 0, 4, 0, 6 }; - -static int gm_ebeb[] = { - /* E1 B3 E2 B4 */ - 0, 0, 0, 0, // version 1 - 3, 1, 0, 0, - 5, 1, 0, 0, - 7, 1, 0, 0, - 9, 1, 0, 0, - 5, 1, 0, 0, // version 2 - 10, 1, 0, 0, - 15, 1, 0, 0, - 20, 1, 0, 0, - 25, 1, 0, 0, - 9, 1, 0, 0, // version 3 - 19, 1, 0, 0, - 29, 1, 0, 0, - 39, 1, 0, 0, - 49, 1, 0, 0, - 8, 2, 0, 0, // version 4 - 16, 2, 0, 0, - 24, 2, 0, 0, - 32, 2, 0, 0, - 41, 1, 10, 1, - 12, 2, 0, 0, // version 5 - 24, 2, 0, 0, - 36, 2, 0, 0, - 48, 2, 0, 0, - 61, 1, 60, 1, - 11, 3, 0, 0, // version 6 - 23, 1, 22, 2, - 34, 2, 33, 1, - 45, 3, 0, 0, - 57, 1, 56, 2, - 12, 1, 11, 3, // version 7 - 23, 2, 22, 2, - 34, 3, 33, 1, - 45, 4, 0, 0, - 57, 1, 56, 3, - 12, 2, 11, 3, // version 8 - 23, 5, 0, 0, - 35, 3, 34, 2, - 47, 1, 46, 4, - 58, 4, 57, 1, - 12, 6, 0, 0, // version 9 - 24, 6, 0, 0, - 36, 6, 0, 0, - 48, 6, 0, 0, - 61, 1, 60, 5, - 13, 4, 12, 3, // version 10 - 26, 1, 25, 6, - 38, 5, 37, 2, - 51, 2, 50, 5, - 63, 7, 0, 0, - 12, 6, 11, 3, // version 11 - 24, 4, 23, 5, - 36, 2, 35, 7, - 47, 9, 0, 0, - 59, 7, 58, 2, - 13, 5, 12, 5, // version 12 - 25, 10, 0, 0, - 38, 5, 37, 5, - 50, 10, 0, 0, - 63, 5, 62, 5, - 13, 1, 12, 11, //version 13 - 25, 3, 24, 9, - 37, 5, 36, 7, - 49, 7, 48, 5, - 61, 9, 60, 3 -}; - -static int gm_macro_matrix[] = { - 728,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650, - 727,624,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,651, - 726,623,528,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,553,652, - 725,622,527,440,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,463,554,653, - 724,621,526,439,360,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,381,464,555,654, - 723,620,525,438,359,288,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,307,382,465,556,655, - 722,619,524,437,358,287,224,169,170,171,172,173,174,175,176,177,178,179,180,181,182,241,308,383,466,557,656, - 721,618,523,436,357,286,223,168,121,122,123,124,125,126,127,128,129,130,131,132,183,242,309,384,467,558,657, - 720,617,522,435,356,285,222,167,120,81,82,83,84,85,86,87,88,89,90,133,184,243,310,385,468,559,658, - 719,616,521,434,355,284,221,166,119,80,49,50,51,52,53,54,55,56,91,134,185,244,311,386,469,560,659, - 718,615,520,433,354,283,220,165,118,79,48,25,26,27,28,29,30,57,92,135,186,245,312,387,470,561,660, - 717,614,519,432,353,282,219,164,117,78,47,24,9,10,11,12,31,58,93,136,187,246,313,388,471,562,661, - 716,613,518,431,352,281,218,163,116,77,46,23,8,1,2,13,32,59,94,137,188,247,314,389,472,563,662, - 715,612,517,430,351,280,217,162,115,76,45,22,7,0,3,14,33,60,95,138,189,248,315,390,473,564,663, - 714,611,516,429,350,279,216,161,114,75,44,21,6,5,4,15,34,61,96,139,190,249,316,391,474,565,664, - 713,610,515,428,349,278,215,160,113,74,43,20,19,18,17,16,35,62,97,140,191,250,317,392,475,566,665, - 712,609,514,427,348,277,214,159,112,73,42,41,40,39,38,37,36,63,98,141,192,251,318,393,476,567,666, - 711,608,513,426,347,276,213,158,111,72,71,70,69,68,67,66,65,64,99,142,193,252,319,394,477,568,667, - 710,607,512,425,346,275,212,157,110,109,108,107,106,105,104,103,102,101,100,143,194,253,320,395,478,569,668, - 709,606,511,424,345,274,211,156,155,154,153,152,151,150,149,148,147,146,145,144,195,254,321,396,479,570,669, - 708,605,510,423,344,273,210,209,208,207,206,205,204,203,202,201,200,199,198,197,196,255,322,397,480,571,670, - 707,604,509,422,343,272,271,270,269,268,267,266,265,264,263,262,261,260,259,258,257,256,323,398,481,572,671, - 706,603,508,421,342,341,340,339,338,337,336,335,334,333,332,331,330,329,328,327,326,325,324,399,482,573,672, - 705,602,507,420,419,418,417,416,415,414,413,412,411,410,409,408,407,406,405,404,403,402,401,400,483,574,673, - 704,601,506,505,504,503,502,501,500,499,498,497,496,495,494,493,492,491,490,489,488,487,486,485,484,575,674, - 703,600,599,598,597,596,595,594,593,592,591,590,589,588,587,586,585,584,583,582,581,580,579,578,577,576,675, - 702,701,700,699,698,697,696,695,694,693,692,691,690,689,688,687,686,685,684,683,682,681,680,679,678,677,676, -}; diff --git a/3rdparty/zint-2.4.4/backend/gs1.c b/3rdparty/zint-2.4.4/backend/gs1.c deleted file mode 100644 index 45e14dd..0000000 --- a/3rdparty/zint-2.4.4/backend/gs1.c +++ /dev/null @@ -1,311 +0,0 @@ -/* gs1.c - Verifies GS1 data */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" -#include "gs1.h" - -/* This code does some checks on the integrity of GS1 data. It is not intended - to be bulletproof, nor does it report very accurately what problem was found - or where, but should prevent some of the more common encoding errors */ - -void itostr(char ai_string[], int ai_value) -{ - int thou, hund, ten, unit; - char temp[2]; - - strcpy(ai_string, "("); - thou = ai_value / 1000; - hund = (ai_value - (1000 * thou)) / 100; - ten = (ai_value - ((1000 * thou) + (100 * hund))) / 10; - unit = ai_value - ((1000 * thou) + (100 * hund) + (10 * ten)); - - temp[1] = '\0'; - if(ai_value >= 1000) { temp[0] = itoc(thou); concat(ai_string, temp); } - if(ai_value >= 100) { temp[0] = itoc(hund); concat(ai_string, temp); } - temp[0] = itoc(ten); - concat(ai_string, temp); - temp[0] = itoc(unit); - concat(ai_string, temp); - concat(ai_string, ")"); -} - -int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[]) -{ - int i, j, last_ai, ai_latch; - char ai_string[6]; - int bracket_level, max_bracket_level, ai_length, max_ai_length, min_ai_length; - int ai_value[100], ai_location[100], ai_count, data_location[100], data_length[100]; - int error_latch; - - /* Detect extended ASCII characters */ - for(i = 0; i < (int)src_len; i++) { - if(source[i] >=128) { - strcpy(symbol->errtxt, "Extended ASCII characters are not supported by GS1"); - return ERROR_INVALID_DATA1; - } - if(source[i] < 32) { - strcpy(symbol->errtxt, "Control characters are not supported by GS1"); - return ERROR_INVALID_DATA1; - } - } - - if(source[0] != '[') { - strcpy(symbol->errtxt, "Data does not start with an AI"); - return ERROR_INVALID_DATA1; - } - - /* Check the position of the brackets */ - bracket_level = 0; - max_bracket_level = 0; - ai_length = 0; - max_ai_length = 0; - min_ai_length = 5; - j = 0; - ai_latch = 0; - for(i = 0; i < (int)src_len; i++) { - ai_length += j; - if(((j == 1) && (source[i] != ']')) && ((source[i] < '0') || (source[i] > '9'))) { ai_latch = 1; } - if(source[i] == '[') { bracket_level++; j = 1; } - if(source[i] == ']') { - bracket_level--; - if(ai_length < min_ai_length) { min_ai_length = ai_length; } - j = 0; - ai_length = 0; - } - if(bracket_level > max_bracket_level) { max_bracket_level = bracket_level; } - if(ai_length > max_ai_length) { max_ai_length = ai_length; } - } - min_ai_length--; - - if(bracket_level != 0) { - /* Not all brackets are closed */ - strcpy(symbol->errtxt, "Malformed AI in input data (brackets don\'t match)"); - return ERROR_INVALID_DATA1; - } - - if(max_bracket_level > 1) { - /* Nested brackets */ - strcpy(symbol->errtxt, "Found nested brackets in input data"); - return ERROR_INVALID_DATA1; - } - - if(max_ai_length > 4) { - /* AI is too long */ - strcpy(symbol->errtxt, "Invalid AI in input data (AI too long)"); - return ERROR_INVALID_DATA1; - } - - if(min_ai_length <= 1) { - /* AI is too short */ - strcpy(symbol->errtxt, "Invalid AI in input data (AI too short)"); - return ERROR_INVALID_DATA1; - } - - if(ai_latch == 1) { - /* Non-numeric data in AI */ - strcpy(symbol->errtxt, "Invalid AI in input data (non-numeric characters in AI)"); - return ERROR_INVALID_DATA1; - } - - ai_count = 0; - for(i = 1; i < (int)src_len; i++) { - if(source[i - 1] == '[') { - ai_location[ai_count] = i; - j = 0; - do { - ai_string[j] = source[i + j]; - j++; - } while (ai_string[j - 1] != ']'); - ai_string[j - 1] = '\0'; - ai_value[ai_count] = atoi(ai_string); - ai_count++; - } - } - - for(i = 0; i < ai_count; i++) { - data_location[i] = ai_location[i] + 3; - if(ai_value[i] >= 100) { data_location[i]++; } - if(ai_value[i] >= 1000) { data_location[i]++; } - data_length[i] = 0; - do { - data_length[i]++; - } while ((source[data_location[i] + data_length[i] - 1] != '[') && (source[data_location[i] + data_length[i] - 1] != '\0')); - data_length[i]--; - } - - for(i = 0; i < ai_count; i++) { - if(data_length[i] == 0) { - /* No data for given AI */ - strcpy(symbol->errtxt, "Empty data field in input data"); - return ERROR_INVALID_DATA1; - } - } - - error_latch = 0; - strcpy(ai_string, ""); - for(i = 0; i < ai_count; i++) { - switch (ai_value[i]) { - case 0: if(data_length[i] != 18) { error_latch = 1; } break; - case 1: - case 2: - case 3: if(data_length[i] != 14) { error_latch = 1; } break; - case 4: if(data_length[i] != 16) { error_latch = 1; } break; - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - case 19: if(data_length[i] != 6) { error_latch = 1; } break; - case 20: if(data_length[i] != 2) { error_latch = 1; } break; - case 23: - case 24: - case 25: - case 39: - case 40: - case 41: - case 42: - case 70: - case 80: - case 81: error_latch = 2; break; - } - if( - ((ai_value[i] >= 100) && (ai_value[i] <= 179)) - || ((ai_value[i] >= 1000) && (ai_value[i] <= 1799)) - || ((ai_value[i] >= 200) && (ai_value[i] <= 229)) - || ((ai_value[i] >= 2000) && (ai_value[i] <= 2299)) - || ((ai_value[i] >= 300) && (ai_value[i] <= 309)) - || ((ai_value[i] >= 3000) && (ai_value[i] <= 3099)) - || ((ai_value[i] >= 31) && (ai_value[i] <= 36)) - || ((ai_value[i] >= 310) && (ai_value[i] <= 369)) - ) { - error_latch = 2; - } - if((ai_value[i] >= 3100) && (ai_value[i] <= 3699)) { - if(data_length[i] != 6) { - error_latch = 1; - } - } - if( - ((ai_value[i] >= 370) && (ai_value[i] <= 379)) - || ((ai_value[i] >= 3700) && (ai_value[i] <= 3799)) - ) { - error_latch = 2; - } - if((ai_value[i] >= 410) && (ai_value[i] <= 415)) { - if(data_length[i] != 13) { - error_latch = 1; - } - } - if( - ((ai_value[i] >= 4100) && (ai_value[i] <= 4199)) - || ((ai_value[i] >= 700) && (ai_value[i] <= 703)) - || ((ai_value[i] >= 800) && (ai_value[i] <= 810)) - || ((ai_value[i] >= 900) && (ai_value[i] <= 999)) - || ((ai_value[i] >= 9000) && (ai_value[i] <= 9999)) - ) { - error_latch = 2; - } - if((error_latch < 4) && (error_latch > 0)) { - /* error has just been detected: capture AI */ - itostr(ai_string, ai_value[i]); - error_latch += 4; - } - } - - if(error_latch == 5) { - strcpy(symbol->errtxt, "Invalid data length for AI "); - concat(symbol->errtxt, ai_string); - return ERROR_INVALID_DATA1; - } - - if(error_latch == 6) { - strcpy(symbol->errtxt, "Invalid AI value "); - concat(symbol->errtxt, ai_string); - return ERROR_INVALID_DATA1; - } - - /* Resolve AI data - put resulting string in 'reduced' */ - j = 0; - last_ai = 0; - ai_latch = 1; - for(i = 0; i < (int)src_len; i++) { - if((source[i] != '[') && (source[i] != ']')) { - reduced[j++] = source[i]; - } - if(source[i] == '[') { - /* Start of an AI string */ - if(ai_latch == 0) { - reduced[j++] = '['; - } - ai_string[0] = source[i + 1]; - ai_string[1] = source[i + 2]; - ai_string[2] = '\0'; - last_ai = atoi(ai_string); - ai_latch = 0; - /* The following values from "GS-1 General Specification version 8.0 issue 2, May 2008" - figure 5.4.8.2.1 - 1 "Element Strings with Pre-Defined Length Using Application Identifiers" */ - if( - ((last_ai >= 0) && (last_ai <= 4)) - || ((last_ai >= 11) && (last_ai <= 20)) - || (last_ai == 23) /* legacy support - see 5.3.8.2.2 */ - || ((last_ai >= 31) && (last_ai <= 36)) - || (last_ai == 41) - ) { - ai_latch = 1; - } - } - /* The ']' character is simply dropped from the input */ - } - reduced[j] = '\0'; - - /* the character '[' in the reduced string refers to the FNC1 character */ - return 0; -} - -int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[]) -{ - /* Only to keep the compiler happy */ -#ifndef _MSC_VER - char temp[src_len + 5]; -#else - char* temp = (char*)_alloca(src_len + 5); -#endif - int error_number; - - error_number = gs1_verify(symbol, source, src_len, temp); - if(error_number != 0) { return error_number; } - - if (strlen(temp) < src_len + 5) { - ustrcpy(reduced, (unsigned char*)temp); - return 0; - } - strcpy(symbol->errtxt, "ugs1_verify overflow"); - return ERROR_INVALID_DATA1; -} diff --git a/3rdparty/zint-2.4.4/backend/gs1.h b/3rdparty/zint-2.4.4/backend/gs1.h deleted file mode 100644 index 42b40df..0000000 --- a/3rdparty/zint-2.4.4/backend/gs1.h +++ /dev/null @@ -1,35 +0,0 @@ -/* gs1.h - Verifies GS1 data */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef __GS1_H -#define __GS1_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -extern int gs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char reduced[]); -extern int ugs1_verify(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, unsigned char reduced[]); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __GS1_H */ \ No newline at end of file diff --git a/3rdparty/zint-2.4.4/backend/imail.c b/3rdparty/zint-2.4.4/backend/imail.c deleted file mode 100644 index 5094139..0000000 --- a/3rdparty/zint-2.4.4/backend/imail.c +++ /dev/null @@ -1,700 +0,0 @@ -/* imail.c - Handles Intelligent Mail (aka OneCode) for USPS */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* The function "USPS_MSB_Math_CRC11GenerateFrameCheckSequence" - is Copyright (C) 2006 United States Postal Service */ - -static short int BCD[40] = { - 0, 0, 0, 0, - 1, 0, 0, 0, - 0, 1, 0, 0, - 1, 1, 0, 0, - 0, 0, 1, 0, - 1, 0, 1, 0, - 0, 1, 1, 0, - 1, 1, 1, 0, - 0, 0, 0, 1, - 1, 0, 0, 1 -}; - -#include -#include -#include -#include "common.h" -#include "large.h" - -#define SODIUM "0123456789-" - -/* The following lookup tables were generated using the code in Appendix C */ - -static unsigned short AppxD_I[1287] = { /* Appendix D Table 1 - 5 of 13 characters */ - 0x001F, 0x1F00, 0x002F, 0x1E80, 0x0037, 0x1D80, 0x003B, 0x1B80, 0x003D, 0x1780, - 0x003E, 0x0F80, 0x004F, 0x1E40, 0x0057, 0x1D40, 0x005B, 0x1B40, 0x005D, 0x1740, - 0x005E, 0x0F40, 0x0067, 0x1CC0, 0x006B, 0x1AC0, 0x006D, 0x16C0, 0x006E, 0x0EC0, - 0x0073, 0x19C0, 0x0075, 0x15C0, 0x0076, 0x0DC0, 0x0079, 0x13C0, 0x007A, 0x0BC0, - 0x007C, 0x07C0, 0x008F, 0x1E20, 0x0097, 0x1D20, 0x009B, 0x1B20, 0x009D, 0x1720, - 0x009E, 0x0F20, 0x00A7, 0x1CA0, 0x00AB, 0x1AA0, 0x00AD, 0x16A0, 0x00AE, 0x0EA0, - 0x00B3, 0x19A0, 0x00B5, 0x15A0, 0x00B6, 0x0DA0, 0x00B9, 0x13A0, 0x00BA, 0x0BA0, - 0x00BC, 0x07A0, 0x00C7, 0x1C60, 0x00CB, 0x1A60, 0x00CD, 0x1660, 0x00CE, 0x0E60, - 0x00D3, 0x1960, 0x00D5, 0x1560, 0x00D6, 0x0D60, 0x00D9, 0x1360, 0x00DA, 0x0B60, - 0x00DC, 0x0760, 0x00E3, 0x18E0, 0x00E5, 0x14E0, 0x00E6, 0x0CE0, 0x00E9, 0x12E0, - 0x00EA, 0x0AE0, 0x00EC, 0x06E0, 0x00F1, 0x11E0, 0x00F2, 0x09E0, 0x00F4, 0x05E0, - 0x00F8, 0x03E0, 0x010F, 0x1E10, 0x0117, 0x1D10, 0x011B, 0x1B10, 0x011D, 0x1710, - 0x011E, 0x0F10, 0x0127, 0x1C90, 0x012B, 0x1A90, 0x012D, 0x1690, 0x012E, 0x0E90, - 0x0133, 0x1990, 0x0135, 0x1590, 0x0136, 0x0D90, 0x0139, 0x1390, 0x013A, 0x0B90, - 0x013C, 0x0790, 0x0147, 0x1C50, 0x014B, 0x1A50, 0x014D, 0x1650, 0x014E, 0x0E50, - 0x0153, 0x1950, 0x0155, 0x1550, 0x0156, 0x0D50, 0x0159, 0x1350, 0x015A, 0x0B50, - 0x015C, 0x0750, 0x0163, 0x18D0, 0x0165, 0x14D0, 0x0166, 0x0CD0, 0x0169, 0x12D0, - 0x016A, 0x0AD0, 0x016C, 0x06D0, 0x0171, 0x11D0, 0x0172, 0x09D0, 0x0174, 0x05D0, - 0x0178, 0x03D0, 0x0187, 0x1C30, 0x018B, 0x1A30, 0x018D, 0x1630, 0x018E, 0x0E30, - 0x0193, 0x1930, 0x0195, 0x1530, 0x0196, 0x0D30, 0x0199, 0x1330, 0x019A, 0x0B30, - 0x019C, 0x0730, 0x01A3, 0x18B0, 0x01A5, 0x14B0, 0x01A6, 0x0CB0, 0x01A9, 0x12B0, - 0x01AA, 0x0AB0, 0x01AC, 0x06B0, 0x01B1, 0x11B0, 0x01B2, 0x09B0, 0x01B4, 0x05B0, - 0x01B8, 0x03B0, 0x01C3, 0x1870, 0x01C5, 0x1470, 0x01C6, 0x0C70, 0x01C9, 0x1270, - 0x01CA, 0x0A70, 0x01CC, 0x0670, 0x01D1, 0x1170, 0x01D2, 0x0970, 0x01D4, 0x0570, - 0x01D8, 0x0370, 0x01E1, 0x10F0, 0x01E2, 0x08F0, 0x01E4, 0x04F0, 0x01E8, 0x02F0, - 0x020F, 0x1E08, 0x0217, 0x1D08, 0x021B, 0x1B08, 0x021D, 0x1708, 0x021E, 0x0F08, - 0x0227, 0x1C88, 0x022B, 0x1A88, 0x022D, 0x1688, 0x022E, 0x0E88, 0x0233, 0x1988, - 0x0235, 0x1588, 0x0236, 0x0D88, 0x0239, 0x1388, 0x023A, 0x0B88, 0x023C, 0x0788, - 0x0247, 0x1C48, 0x024B, 0x1A48, 0x024D, 0x1648, 0x024E, 0x0E48, 0x0253, 0x1948, - 0x0255, 0x1548, 0x0256, 0x0D48, 0x0259, 0x1348, 0x025A, 0x0B48, 0x025C, 0x0748, - 0x0263, 0x18C8, 0x0265, 0x14C8, 0x0266, 0x0CC8, 0x0269, 0x12C8, 0x026A, 0x0AC8, - 0x026C, 0x06C8, 0x0271, 0x11C8, 0x0272, 0x09C8, 0x0274, 0x05C8, 0x0278, 0x03C8, - 0x0287, 0x1C28, 0x028B, 0x1A28, 0x028D, 0x1628, 0x028E, 0x0E28, 0x0293, 0x1928, - 0x0295, 0x1528, 0x0296, 0x0D28, 0x0299, 0x1328, 0x029A, 0x0B28, 0x029C, 0x0728, - 0x02A3, 0x18A8, 0x02A5, 0x14A8, 0x02A6, 0x0CA8, 0x02A9, 0x12A8, 0x02AA, 0x0AA8, - 0x02AC, 0x06A8, 0x02B1, 0x11A8, 0x02B2, 0x09A8, 0x02B4, 0x05A8, 0x02B8, 0x03A8, - 0x02C3, 0x1868, 0x02C5, 0x1468, 0x02C6, 0x0C68, 0x02C9, 0x1268, 0x02CA, 0x0A68, - 0x02CC, 0x0668, 0x02D1, 0x1168, 0x02D2, 0x0968, 0x02D4, 0x0568, 0x02D8, 0x0368, - 0x02E1, 0x10E8, 0x02E2, 0x08E8, 0x02E4, 0x04E8, 0x0307, 0x1C18, 0x030B, 0x1A18, - 0x030D, 0x1618, 0x030E, 0x0E18, 0x0313, 0x1918, 0x0315, 0x1518, 0x0316, 0x0D18, - 0x0319, 0x1318, 0x031A, 0x0B18, 0x031C, 0x0718, 0x0323, 0x1898, 0x0325, 0x1498, - 0x0326, 0x0C98, 0x0329, 0x1298, 0x032A, 0x0A98, 0x032C, 0x0698, 0x0331, 0x1198, - 0x0332, 0x0998, 0x0334, 0x0598, 0x0338, 0x0398, 0x0343, 0x1858, 0x0345, 0x1458, - 0x0346, 0x0C58, 0x0349, 0x1258, 0x034A, 0x0A58, 0x034C, 0x0658, 0x0351, 0x1158, - 0x0352, 0x0958, 0x0354, 0x0558, 0x0361, 0x10D8, 0x0362, 0x08D8, 0x0364, 0x04D8, - 0x0383, 0x1838, 0x0385, 0x1438, 0x0386, 0x0C38, 0x0389, 0x1238, 0x038A, 0x0A38, - 0x038C, 0x0638, 0x0391, 0x1138, 0x0392, 0x0938, 0x0394, 0x0538, 0x03A1, 0x10B8, - 0x03A2, 0x08B8, 0x03A4, 0x04B8, 0x03C1, 0x1078, 0x03C2, 0x0878, 0x03C4, 0x0478, - 0x040F, 0x1E04, 0x0417, 0x1D04, 0x041B, 0x1B04, 0x041D, 0x1704, 0x041E, 0x0F04, - 0x0427, 0x1C84, 0x042B, 0x1A84, 0x042D, 0x1684, 0x042E, 0x0E84, 0x0433, 0x1984, - 0x0435, 0x1584, 0x0436, 0x0D84, 0x0439, 0x1384, 0x043A, 0x0B84, 0x043C, 0x0784, - 0x0447, 0x1C44, 0x044B, 0x1A44, 0x044D, 0x1644, 0x044E, 0x0E44, 0x0453, 0x1944, - 0x0455, 0x1544, 0x0456, 0x0D44, 0x0459, 0x1344, 0x045A, 0x0B44, 0x045C, 0x0744, - 0x0463, 0x18C4, 0x0465, 0x14C4, 0x0466, 0x0CC4, 0x0469, 0x12C4, 0x046A, 0x0AC4, - 0x046C, 0x06C4, 0x0471, 0x11C4, 0x0472, 0x09C4, 0x0474, 0x05C4, 0x0487, 0x1C24, - 0x048B, 0x1A24, 0x048D, 0x1624, 0x048E, 0x0E24, 0x0493, 0x1924, 0x0495, 0x1524, - 0x0496, 0x0D24, 0x0499, 0x1324, 0x049A, 0x0B24, 0x049C, 0x0724, 0x04A3, 0x18A4, - 0x04A5, 0x14A4, 0x04A6, 0x0CA4, 0x04A9, 0x12A4, 0x04AA, 0x0AA4, 0x04AC, 0x06A4, - 0x04B1, 0x11A4, 0x04B2, 0x09A4, 0x04B4, 0x05A4, 0x04C3, 0x1864, 0x04C5, 0x1464, - 0x04C6, 0x0C64, 0x04C9, 0x1264, 0x04CA, 0x0A64, 0x04CC, 0x0664, 0x04D1, 0x1164, - 0x04D2, 0x0964, 0x04D4, 0x0564, 0x04E1, 0x10E4, 0x04E2, 0x08E4, 0x0507, 0x1C14, - 0x050B, 0x1A14, 0x050D, 0x1614, 0x050E, 0x0E14, 0x0513, 0x1914, 0x0515, 0x1514, - 0x0516, 0x0D14, 0x0519, 0x1314, 0x051A, 0x0B14, 0x051C, 0x0714, 0x0523, 0x1894, - 0x0525, 0x1494, 0x0526, 0x0C94, 0x0529, 0x1294, 0x052A, 0x0A94, 0x052C, 0x0694, - 0x0531, 0x1194, 0x0532, 0x0994, 0x0534, 0x0594, 0x0543, 0x1854, 0x0545, 0x1454, - 0x0546, 0x0C54, 0x0549, 0x1254, 0x054A, 0x0A54, 0x054C, 0x0654, 0x0551, 0x1154, - 0x0552, 0x0954, 0x0561, 0x10D4, 0x0562, 0x08D4, 0x0583, 0x1834, 0x0585, 0x1434, - 0x0586, 0x0C34, 0x0589, 0x1234, 0x058A, 0x0A34, 0x058C, 0x0634, 0x0591, 0x1134, - 0x0592, 0x0934, 0x05A1, 0x10B4, 0x05A2, 0x08B4, 0x05C1, 0x1074, 0x05C2, 0x0874, - 0x0607, 0x1C0C, 0x060B, 0x1A0C, 0x060D, 0x160C, 0x060E, 0x0E0C, 0x0613, 0x190C, - 0x0615, 0x150C, 0x0616, 0x0D0C, 0x0619, 0x130C, 0x061A, 0x0B0C, 0x061C, 0x070C, - 0x0623, 0x188C, 0x0625, 0x148C, 0x0626, 0x0C8C, 0x0629, 0x128C, 0x062A, 0x0A8C, - 0x062C, 0x068C, 0x0631, 0x118C, 0x0632, 0x098C, 0x0643, 0x184C, 0x0645, 0x144C, - 0x0646, 0x0C4C, 0x0649, 0x124C, 0x064A, 0x0A4C, 0x0651, 0x114C, 0x0652, 0x094C, - 0x0661, 0x10CC, 0x0662, 0x08CC, 0x0683, 0x182C, 0x0685, 0x142C, 0x0686, 0x0C2C, - 0x0689, 0x122C, 0x068A, 0x0A2C, 0x0691, 0x112C, 0x0692, 0x092C, 0x06A1, 0x10AC, - 0x06A2, 0x08AC, 0x06C1, 0x106C, 0x06C2, 0x086C, 0x0703, 0x181C, 0x0705, 0x141C, - 0x0706, 0x0C1C, 0x0709, 0x121C, 0x070A, 0x0A1C, 0x0711, 0x111C, 0x0712, 0x091C, - 0x0721, 0x109C, 0x0722, 0x089C, 0x0741, 0x105C, 0x0742, 0x085C, 0x0781, 0x103C, - 0x0782, 0x083C, 0x080F, 0x1E02, 0x0817, 0x1D02, 0x081B, 0x1B02, 0x081D, 0x1702, - 0x081E, 0x0F02, 0x0827, 0x1C82, 0x082B, 0x1A82, 0x082D, 0x1682, 0x082E, 0x0E82, - 0x0833, 0x1982, 0x0835, 0x1582, 0x0836, 0x0D82, 0x0839, 0x1382, 0x083A, 0x0B82, - 0x0847, 0x1C42, 0x084B, 0x1A42, 0x084D, 0x1642, 0x084E, 0x0E42, 0x0853, 0x1942, - 0x0855, 0x1542, 0x0856, 0x0D42, 0x0859, 0x1342, 0x085A, 0x0B42, 0x0863, 0x18C2, - 0x0865, 0x14C2, 0x0866, 0x0CC2, 0x0869, 0x12C2, 0x086A, 0x0AC2, 0x0871, 0x11C2, - 0x0872, 0x09C2, 0x0887, 0x1C22, 0x088B, 0x1A22, 0x088D, 0x1622, 0x088E, 0x0E22, - 0x0893, 0x1922, 0x0895, 0x1522, 0x0896, 0x0D22, 0x0899, 0x1322, 0x089A, 0x0B22, - 0x08A3, 0x18A2, 0x08A5, 0x14A2, 0x08A6, 0x0CA2, 0x08A9, 0x12A2, 0x08AA, 0x0AA2, - 0x08B1, 0x11A2, 0x08B2, 0x09A2, 0x08C3, 0x1862, 0x08C5, 0x1462, 0x08C6, 0x0C62, - 0x08C9, 0x1262, 0x08CA, 0x0A62, 0x08D1, 0x1162, 0x08D2, 0x0962, 0x08E1, 0x10E2, - 0x0907, 0x1C12, 0x090B, 0x1A12, 0x090D, 0x1612, 0x090E, 0x0E12, 0x0913, 0x1912, - 0x0915, 0x1512, 0x0916, 0x0D12, 0x0919, 0x1312, 0x091A, 0x0B12, 0x0923, 0x1892, - 0x0925, 0x1492, 0x0926, 0x0C92, 0x0929, 0x1292, 0x092A, 0x0A92, 0x0931, 0x1192, - 0x0932, 0x0992, 0x0943, 0x1852, 0x0945, 0x1452, 0x0946, 0x0C52, 0x0949, 0x1252, - 0x094A, 0x0A52, 0x0951, 0x1152, 0x0961, 0x10D2, 0x0983, 0x1832, 0x0985, 0x1432, - 0x0986, 0x0C32, 0x0989, 0x1232, 0x098A, 0x0A32, 0x0991, 0x1132, 0x09A1, 0x10B2, - 0x09C1, 0x1072, 0x0A07, 0x1C0A, 0x0A0B, 0x1A0A, 0x0A0D, 0x160A, 0x0A0E, 0x0E0A, - 0x0A13, 0x190A, 0x0A15, 0x150A, 0x0A16, 0x0D0A, 0x0A19, 0x130A, 0x0A1A, 0x0B0A, - 0x0A23, 0x188A, 0x0A25, 0x148A, 0x0A26, 0x0C8A, 0x0A29, 0x128A, 0x0A2A, 0x0A8A, - 0x0A31, 0x118A, 0x0A43, 0x184A, 0x0A45, 0x144A, 0x0A46, 0x0C4A, 0x0A49, 0x124A, - 0x0A51, 0x114A, 0x0A61, 0x10CA, 0x0A83, 0x182A, 0x0A85, 0x142A, 0x0A86, 0x0C2A, - 0x0A89, 0x122A, 0x0A91, 0x112A, 0x0AA1, 0x10AA, 0x0AC1, 0x106A, 0x0B03, 0x181A, - 0x0B05, 0x141A, 0x0B06, 0x0C1A, 0x0B09, 0x121A, 0x0B11, 0x111A, 0x0B21, 0x109A, - 0x0B41, 0x105A, 0x0B81, 0x103A, 0x0C07, 0x1C06, 0x0C0B, 0x1A06, 0x0C0D, 0x1606, - 0x0C0E, 0x0E06, 0x0C13, 0x1906, 0x0C15, 0x1506, 0x0C16, 0x0D06, 0x0C19, 0x1306, - 0x0C23, 0x1886, 0x0C25, 0x1486, 0x0C26, 0x0C86, 0x0C29, 0x1286, 0x0C31, 0x1186, - 0x0C43, 0x1846, 0x0C45, 0x1446, 0x0C49, 0x1246, 0x0C51, 0x1146, 0x0C61, 0x10C6, - 0x0C83, 0x1826, 0x0C85, 0x1426, 0x0C89, 0x1226, 0x0C91, 0x1126, 0x0CA1, 0x10A6, - 0x0CC1, 0x1066, 0x0D03, 0x1816, 0x0D05, 0x1416, 0x0D09, 0x1216, 0x0D11, 0x1116, - 0x0D21, 0x1096, 0x0D41, 0x1056, 0x0D81, 0x1036, 0x0E03, 0x180E, 0x0E05, 0x140E, - 0x0E09, 0x120E, 0x0E11, 0x110E, 0x0E21, 0x108E, 0x0E41, 0x104E, 0x0E81, 0x102E, - 0x0F01, 0x101E, 0x100F, 0x1E01, 0x1017, 0x1D01, 0x101B, 0x1B01, 0x101D, 0x1701, - 0x1027, 0x1C81, 0x102B, 0x1A81, 0x102D, 0x1681, 0x1033, 0x1981, 0x1035, 0x1581, - 0x1039, 0x1381, 0x1047, 0x1C41, 0x104B, 0x1A41, 0x104D, 0x1641, 0x1053, 0x1941, - 0x1055, 0x1541, 0x1059, 0x1341, 0x1063, 0x18C1, 0x1065, 0x14C1, 0x1069, 0x12C1, - 0x1071, 0x11C1, 0x1087, 0x1C21, 0x108B, 0x1A21, 0x108D, 0x1621, 0x1093, 0x1921, - 0x1095, 0x1521, 0x1099, 0x1321, 0x10A3, 0x18A1, 0x10A5, 0x14A1, 0x10A9, 0x12A1, - 0x10B1, 0x11A1, 0x10C3, 0x1861, 0x10C5, 0x1461, 0x10C9, 0x1261, 0x10D1, 0x1161, - 0x1107, 0x1C11, 0x110B, 0x1A11, 0x110D, 0x1611, 0x1113, 0x1911, 0x1115, 0x1511, - 0x1119, 0x1311, 0x1123, 0x1891, 0x1125, 0x1491, 0x1129, 0x1291, 0x1131, 0x1191, - 0x1143, 0x1851, 0x1145, 0x1451, 0x1149, 0x1251, 0x1183, 0x1831, 0x1185, 0x1431, - 0x1189, 0x1231, 0x1207, 0x1C09, 0x120B, 0x1A09, 0x120D, 0x1609, 0x1213, 0x1909, - 0x1215, 0x1509, 0x1219, 0x1309, 0x1223, 0x1889, 0x1225, 0x1489, 0x1229, 0x1289, - 0x1243, 0x1849, 0x1245, 0x1449, 0x1283, 0x1829, 0x1285, 0x1429, 0x1303, 0x1819, - 0x1305, 0x1419, 0x1407, 0x1C05, 0x140B, 0x1A05, 0x140D, 0x1605, 0x1413, 0x1905, - 0x1415, 0x1505, 0x1423, 0x1885, 0x1425, 0x1485, 0x1443, 0x1845, 0x1483, 0x1825, - 0x1503, 0x1815, 0x1603, 0x180D, 0x1807, 0x1C03, 0x180B, 0x1A03, 0x1813, 0x1903, - 0x1823, 0x1883, 0x1843, 0x1445, 0x1249, 0x1151, 0x10E1, 0x0C46, 0x0A4A, 0x0952, - 0x08E2, 0x064C, 0x0554, 0x04E4, 0x0358, 0x02E8, 0x01F0 }; - -static unsigned short AppxD_II[78] = { /* Appendix D Table II - 2 of 13 characters */ - 0x0003, 0x1800, 0x0005, 0x1400, 0x0006, 0x0C00, 0x0009, 0x1200, 0x000A, 0x0A00, - 0x000C, 0x0600, 0x0011, 0x1100, 0x0012, 0x0900, 0x0014, 0x0500, 0x0018, 0x0300, - 0x0021, 0x1080, 0x0022, 0x0880, 0x0024, 0x0480, 0x0028, 0x0280, 0x0030, 0x0180, - 0x0041, 0x1040, 0x0042, 0x0840, 0x0044, 0x0440, 0x0048, 0x0240, 0x0050, 0x0140, - 0x0060, 0x00C0, 0x0081, 0x1020, 0x0082, 0x0820, 0x0084, 0x0420, 0x0088, 0x0220, - 0x0090, 0x0120, 0x0101, 0x1010, 0x0102, 0x0810, 0x0104, 0x0410, 0x0108, 0x0210, - 0x0201, 0x1008, 0x0202, 0x0808, 0x0204, 0x0408, 0x0401, 0x1004, 0x0402, 0x0804, - 0x0801, 0x1002, 0x1001, 0x0802, 0x0404, 0x0208, 0x0110, 0x00A0 }; - -static int AppxD_IV[130] = { /* Appendix D Table IV - Bar-to-Character Mapping (reverse lookup) */ - 67, 6, 78, 16, 86, 95, 34, 40, 45, 113, 117, 121, 62, 87, 18, 104, 41, 76, 57, 119, 115, 72, 97, - 2, 127, 26, 105, 35, 122, 52, 114, 7, 24, 82, 68, 63, 94, 44, 77, 112, 70, 100, 39, 30, 107, - 15, 125, 85, 10, 65, 54, 88, 20, 106, 46, 66, 8, 116, 29, 61, 99, 80, 90, 37, 123, 51, 25, 84, - 129, 56, 4, 109, 96, 28, 36, 47, 11, 71, 33, 102, 21, 9, 17, 49, 124, 79, 64, 91, 42, 69, 53, - 60, 14, 1, 27, 103, 126, 75, 89, 50, 120, 19, 32, 110, 92, 111, 130, 59, 31, 12, 81, 43, 55, - 5, 74, 22, 101, 128, 58, 118, 48, 108, 38, 98, 93, 23, 83, 13, 73, 3 }; - -/*************************************************************************** - ** USPS_MSB_Math_CRC11GenerateFrameCheckSequence - ** - ** Inputs: - ** ByteAttayPtr is the address of a 13 byte array holding 102 bytes which - ** are right justified - ie: the leftmost 2 bits of the first byte do not - ** hold data and must be set to zero. - ** - ** Outputs: - ** return unsigned short - 11 bit Frame Check Sequence (right justified) -***************************************************************************/ -extern unsigned short - USPS_MSB_Math_CRC11GenerateFrameCheckSequence( unsigned char *ByteArrayPtr ) - -{ - unsigned short GeneratorPolynomial = 0x0F35; - unsigned short FrameCheckSequence = 0x07FF; - unsigned short Data; - int ByteIndex, Bit; - - /* Do most significant byte skipping the 2 most significant bits */ - Data = *ByteArrayPtr << 5; - ByteArrayPtr++; - for ( Bit = 2; Bit < 8; Bit++ ) - { - if ( (FrameCheckSequence ^ Data) & 0x400 ) - FrameCheckSequence = (FrameCheckSequence << 1) ^ GeneratorPolynomial; - else - FrameCheckSequence = (FrameCheckSequence << 1); - FrameCheckSequence &= 0x7FF; - Data <<= 1; - } - /* Do rest of the bytes */ - for ( ByteIndex = 1; ByteIndex < 13; ByteIndex++ ) - { - Data = *ByteArrayPtr << 3; - ByteArrayPtr++; - for ( Bit = 0; Bit < 8; Bit++ ) - { - if ( (FrameCheckSequence ^ Data) & 0x0400 ) { - FrameCheckSequence = (FrameCheckSequence << 1) ^ GeneratorPolynomial; - } else { - FrameCheckSequence = (FrameCheckSequence << 1); - } - FrameCheckSequence &= 0x7FF; - Data <<= 1; - } - } - return FrameCheckSequence; -} - -void breakup(short int fcs_bit[], unsigned short usps_crc) -{ - int i; - - for(i = 0; i < 13; i++) { - fcs_bit[i] = 0; - } - - if(usps_crc >= 4096) { - fcs_bit[12] = 1; - usps_crc -= 4096; - } - if(usps_crc >= 2048) { - fcs_bit[11] = 1; - usps_crc -= 2048; - } - if(usps_crc >= 1024) { - fcs_bit[10] = 1; - usps_crc -= 1024; - } - if(usps_crc >= 512) { - fcs_bit[9] = 1; - usps_crc -= 512; - } - if(usps_crc >= 256) { - fcs_bit[8] = 1; - usps_crc -= 256; - } - if(usps_crc >= 128) { - fcs_bit[7] = 1; - usps_crc -= 128; - } - if(usps_crc >= 64) { - fcs_bit[6] = 1; - usps_crc -= 64; - } - if(usps_crc >= 32) { - fcs_bit[5] = 1; - usps_crc -= 32; - } - if(usps_crc >= 16) { - fcs_bit[4] = 1; - usps_crc -= 16; - } - if(usps_crc >= 8) { - fcs_bit[3] = 1; - usps_crc -= 8; - } - if(usps_crc >= 4) { - fcs_bit[2] = 1; - usps_crc -= 4; - } - if(usps_crc >= 2) { - fcs_bit[1] = 1; - usps_crc -= 2; - } - if(usps_crc == 1) { - fcs_bit[0] = 1; - } -} - -int imail(struct zint_symbol *symbol, unsigned char source[], int length) -{ - char data_pattern[200]; - int error_number; - int i, j, read; - char zip[35], tracker[35], zip_adder[11], temp[2]; - short int accum[112], x_reg[112], y_reg[112]; - unsigned char byte_array[13]; - unsigned short usps_crc; - int codeword[10]; - unsigned short characters[10]; - short int bit_pattern[13], bar_map[130]; - - error_number = 0; - - if(length > 32) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(SODIUM, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - strcpy(zip, ""); - strcpy(tracker, ""); - - /* separate the tracking code from the routing code */ - - read = 0; - j = 0; - for(i = 0; i < length; i++) { - if(source[i] == '-') { - tracker[read] = '\0'; - j = 1; - read = 0; - } else { - if(j == 0) { - /* reading tracker */ - tracker[read] = source[i]; - read++; - } else { - /* reading zip code */ - zip[read] = source[i]; - read++; - } - } - } - if(j == 0) { - tracker[read] = '\0'; - } else { - zip[read] = '\0'; - } - - if(strlen(tracker) != 20) { - strcpy(symbol->errtxt, "Invalid length tracking code"); - return ERROR_INVALID_DATA1; - } - if(strlen(zip) > 11) { - strcpy(symbol->errtxt, "Invalid ZIP code"); - return ERROR_INVALID_DATA1; - } - - /* *** Step 1 - Conversion of Data Fields into Binary Data *** */ - - /* Routing code first */ - - for(i = 0; i < 112; i++) { - accum[i] = 0; - } - - for(read = 0; read < strlen(zip); read++) { - - for(i = 0; i < 112; i++) { - x_reg[i] = accum[i]; - } - - for(i = 0; i < 9; i++) { - binary_add(accum, x_reg); - } - - x_reg[0] = BCD[ctoi(zip[read]) * 4]; - x_reg[1] = BCD[(ctoi(zip[read]) * 4) + 1]; - x_reg[2] = BCD[(ctoi(zip[read]) * 4) + 2]; - x_reg[3] = BCD[(ctoi(zip[read]) * 4) + 3]; - for(i = 4; i < 112; i++) { - x_reg[i] = 0; - } - - binary_add(accum, x_reg); - } - - /* add weight to routing code */ - - for(i = 0; i < 112; i++) { - x_reg[i] = accum[i]; - } - - if(strlen(zip) > 9) { - strcpy(zip_adder, "1000100001"); - } else { - if(strlen(zip) > 5) { - strcpy(zip_adder, "100001"); - } else { - if(strlen(zip) > 0) { - strcpy(zip_adder, "1"); - } else { - strcpy(zip_adder, "0"); - } - } - } - - for(i = 0; i < 112; i++) { - accum[i] = 0; - } - - for(read = 0; read < strlen(zip_adder); read++) { - - for(i = 0; i < 112; i++) { - y_reg[i] = accum[i]; - } - - for(i = 0; i < 9; i++) { - binary_add(accum, y_reg); - } - - y_reg[0] = BCD[ctoi(zip_adder[read]) * 4]; - y_reg[1] = BCD[(ctoi(zip_adder[read]) * 4) + 1]; - y_reg[2] = BCD[(ctoi(zip_adder[read]) * 4) + 2]; - y_reg[3] = BCD[(ctoi(zip_adder[read]) * 4) + 3]; - for(i = 4; i < 112; i++) { - y_reg[i] = 0; - } - - binary_add(accum, y_reg); - } - - binary_add(accum, x_reg); - - /* tracking code */ - - /* multiply by 10 */ - for(i = 0; i < 112; i++) { - y_reg[i] = accum[i]; - } - - for(i = 0; i < 9; i++) { - binary_add(accum, y_reg); - } - - /* add first digit of tracker */ - y_reg[0] = BCD[ctoi(tracker[0]) * 4]; - y_reg[1] = BCD[(ctoi(tracker[0]) * 4) + 1]; - y_reg[2] = BCD[(ctoi(tracker[0]) * 4) + 2]; - y_reg[3] = BCD[(ctoi(tracker[0]) * 4) + 3]; - for(i = 4; i < 112; i++) { - y_reg[i] = 0; - } - - binary_add(accum, y_reg); - - /* multiply by 5 */ - for(i = 0; i < 112; i++) { - y_reg[i] = accum[i]; - } - - for(i = 0; i < 4; i++) { - binary_add(accum, y_reg); - } - - /* add second digit */ - y_reg[0] = BCD[ctoi(tracker[1]) * 4]; - y_reg[1] = BCD[(ctoi(tracker[1]) * 4) + 1]; - y_reg[2] = BCD[(ctoi(tracker[1]) * 4) + 2]; - y_reg[3] = BCD[(ctoi(tracker[1]) * 4) + 3]; - for(i = 4; i < 112; i++) { - y_reg[i] = 0; - } - - binary_add(accum, y_reg); - - /* and then the rest */ - - for(read = 2; read < strlen(tracker); read++) { - - for(i = 0; i < 112; i++) { - y_reg[i] = accum[i]; - } - - for(i = 0; i < 9; i++) { - binary_add(accum, y_reg); - } - - y_reg[0] = BCD[ctoi(tracker[read]) * 4]; - y_reg[1] = BCD[(ctoi(tracker[read]) * 4) + 1]; - y_reg[2] = BCD[(ctoi(tracker[read]) * 4) + 2]; - y_reg[3] = BCD[(ctoi(tracker[read]) * 4) + 3]; - for(i = 4; i < 112; i++) { - y_reg[i] = 0; - } - - binary_add(accum, y_reg); - } - - /* printf("Binary data 1: "); - hex_dump(accum); */ - - /* *** Step 2 - Generation of 11-bit CRC on Binary Data *** */ - - accum[103] = 0; - accum[102] = 0; - - memset(byte_array, 0, 13); - for(j = 0; j < 13; j++) { - i = 96 - (8 * j); - byte_array[j] = 0; - byte_array[j] += accum[i]; - byte_array[j] += 2 * accum[i + 1]; - byte_array[j] += 4 * accum[i + 2]; - byte_array[j] += 8 * accum[i + 3]; - byte_array[j] += 16 * accum[i + 4]; - byte_array[j] += 32 * accum[i + 5]; - byte_array[j] += 64 * accum[i + 6]; - byte_array[j] += 128 * accum[i + 7]; - } - - usps_crc = USPS_MSB_Math_CRC11GenerateFrameCheckSequence(byte_array); - /* printf("FCS 2: %4.4X\n", usps_crc); */ - - /* *** Step 3 - Conversion from Binary Data to Codewords *** */ - - /* start with codeword J which is base 636 */ - for(i = 0; i < 112; i++) { - x_reg[i] = 0; - y_reg[i] = 0; - } - - x_reg[101] = 1; - x_reg[98] = 1; - x_reg[97] = 1; - x_reg[96] = 1; - x_reg[95] = 1; - x_reg[94] = 1; - - for(i = 92; i >= 0; i--) { - y_reg[i] = islarger(accum, x_reg); - if(y_reg[i] == 1) { - binary_subtract(accum, x_reg); - } - shiftdown(x_reg); - } - - codeword[9] = (accum[9] * 512) + (accum[8] * 256) + (accum[7] * 128) + (accum[6] * 64) + - (accum[5] * 32) + (accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) + - (accum[1] * 2) + accum[0]; - - /* then codewords I to B with base 1365 */ - - for(j = 8; j > 0; j--) { - for(i = 0; i < 112; i++) { - accum[i] = y_reg[i]; - y_reg[i] = 0; - x_reg[i] = 0; - } - x_reg[101] = 1; - x_reg[99] = 1; - x_reg[97] = 1; - x_reg[95] = 1; - x_reg[93] = 1; - x_reg[91] = 1; - for(i = 91; i >= 0; i--) { - y_reg[i] = islarger(accum, x_reg); - if(y_reg[i] == 1) { - binary_subtract(accum, x_reg); - } - shiftdown(x_reg); - } - - codeword[j] = (accum[10] * 1024) + (accum[9] * 512) + (accum[8] * 256) + - (accum[7] * 128) + (accum[6] * 64) + (accum[5] * 32) + - (accum[4] * 16) + (accum[3] * 8) + (accum[2] * 4) + - (accum[1] * 2) + accum[0]; - } - - codeword[0] = (y_reg[10] * 1024) + (y_reg[9] * 512) + (y_reg[8] * 256) + - (y_reg[7] * 128) + (y_reg[6] * 64) + (y_reg[5] * 32) + - (y_reg[4] * 16) + (y_reg[3] * 8) + (y_reg[2] * 4) + - (y_reg[1] * 2) + y_reg[0]; - - for(i = 0; i < 8; i++) { - if(codeword[i] == 1365) { - codeword[i] = 0; - codeword[i + 1]++; - } - } - - /* printf("Codewords 3: "); - for(i = 0; i < 10; i++) { - printf("%d ", codeword[i]); - } - printf("\n"); */ - - /* *** Step 4 - Inserting Additional Information into Codewords *** */ - - codeword[9] = codeword[9] * 2; - - if(usps_crc >= 1024) { - codeword[0] += 659; - } - - /* printf("Codewords 4b: "); - for(i = 0; i < 10; i++) { - printf("%d ", codeword[i]); - } - printf("\n"); */ - - /* *** Step 5 - Conversion from Codewords to Characters *** */ - - for(i = 0; i < 10; i++) { - if(codeword[i] < 1287) { - characters[i] = AppxD_I[codeword[i]]; - } else { - characters[i] = AppxD_II[codeword[i] - 1287]; - } - } - - /* printf("Characters 5a: "); - for(i = 0; i < 10; i++) { - printf("%4.4X ", characters[i]); - } - printf("\n"); */ - - breakup(bit_pattern, usps_crc); - - for(i = 0; i < 10; i++) { - if(bit_pattern[i] == 1) { - characters[i] = 0x1FFF - characters[i]; - } - } - - /* printf("Characters 5b: "); - for(i = 0; i < 10; i++) { - printf("%4.4X ", characters[i]); - } - printf("\n"); */ - - /* *** Step 6 - Conversion from Characters to the Intelligent Mail Barcode *** */ - - for(i = 0; i < 10; i++) { - breakup(bit_pattern, characters[i]); - for(j = 0; j < 13; j++) { - bar_map[AppxD_IV[(13 * i) + j] - 1] = bit_pattern[j]; - } - } - - strcpy(data_pattern, ""); - temp[1] = '\0'; - for(i = 0; i < 65; i++) { - j = 0; - if(bar_map[i] == 0) - j += 1; - if(bar_map[i + 65] == 0) - j += 2; - temp[0] = itoc(j); - concat(data_pattern, temp); - } - - /* Translate 4-state data pattern to symbol */ - read = 0; - for(i = 0; i < strlen(data_pattern); i++) - { - if((data_pattern[i] == '1') || (data_pattern[i] == '0')) - { - set_module(symbol, 0, read); - } - set_module(symbol, 1, read); - if((data_pattern[i] == '2') || (data_pattern[i] == '0')) - { - set_module(symbol, 2, read); - } - read += 2; - } - - symbol->row_height[0] = 3; - symbol->row_height[1] = 2; - symbol->row_height[2] = 3; - - symbol->rows = 3; - symbol->width = read - 1; - return error_number; -} diff --git a/3rdparty/zint-2.4.4/backend/large.c b/3rdparty/zint-2.4.4/backend/large.c deleted file mode 100644 index e3f0453..0000000 --- a/3rdparty/zint-2.4.4/backend/large.c +++ /dev/null @@ -1,227 +0,0 @@ -/* large.c - Handles binary manipulation of large numbers */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include "common.h" -#include "large.h" - -static short int BCD[40] = { - 0, 0, 0, 0, - 1, 0, 0, 0, - 0, 1, 0, 0, - 1, 1, 0, 0, - 0, 0, 1, 0, - 1, 0, 1, 0, - 0, 1, 1, 0, - 1, 1, 1, 0, - 0, 0, 0, 1, - 1, 0, 0, 1 }; - -void binary_add(short int accumulator[], short int input_buffer[]) -{ /* Binary addition */ - int i, carry, done; - carry = 0; - - for(i = 0; i < 112; i++) { - done = 0; - if(((input_buffer[i] == 0) && (accumulator[i] == 0)) && ((carry == 0) && (done == 0))) { - accumulator[i] = 0; - carry = 0; - done = 1; - } - if(((input_buffer[i] == 0) && (accumulator[i] == 0)) && ((carry == 1) && (done == 0))) { - accumulator[i] = 1; - carry = 0; - done = 1; - } - if(((input_buffer[i] == 0) && (accumulator[i] == 1)) && ((carry == 0) && (done == 0))) { - accumulator[i] = 1; - carry = 0; - done = 1; - } - if(((input_buffer[i] == 0) && (accumulator[i] == 1)) && ((carry == 1) && (done == 0))) { - accumulator[i] = 0; - carry = 1; - done = 1; - } - if(((input_buffer[i] == 1) && (accumulator[i] == 0)) && ((carry == 0) && (done == 0))) { - accumulator[i] = 1; - carry = 0; - done = 1; - } - if(((input_buffer[i] == 1) && (accumulator[i] == 0)) && ((carry == 1) && (done == 0))) { - accumulator[i] = 0; - carry = 1; - done = 1; - } - if(((input_buffer[i] == 1) && (accumulator[i] == 1)) && ((carry == 0) && (done == 0))) { - accumulator[i] = 0; - carry = 1; - done = 1; - } - if(((input_buffer[i] == 1) && (accumulator[i] == 1)) && ((carry == 1) && (done == 0))) { - accumulator[i] = 1; - carry = 1; - done = 1; - } - } -} - -void binary_subtract(short int accumulator[], short int input_buffer[]) -{ /* 2's compliment subtraction */ - /* take input_buffer from accumulator and put answer in accumulator */ - int i; - short int sub_buffer[112]; - - for(i = 0; i < 112; i++) { - if(input_buffer[i] == 0) { - sub_buffer[i] = 1; - } else { - sub_buffer[i] = 0; - } - } - binary_add(accumulator, sub_buffer); - - sub_buffer[0] = 1; - - for(i = 1; i < 112; i++) { - sub_buffer[i] = 0; - } - binary_add(accumulator, sub_buffer); -} - -void shiftdown(short int buffer[]) -{ - int i; - - buffer[102] = 0; - buffer[103] = 0; - - for(i = 0; i < 102; i++) { - buffer[i] = buffer[i + 1]; - } -} - -void shiftup(short int buffer[]) -{ - int i; - - for(i = 102; i > 0; i--) { - buffer[i] = buffer[i - 1]; - } - - buffer[0] = 0; -} - -short int islarger(short int accum[], short int reg[]) -{ - /* Returns 1 if accum[] is larger than reg[], else 0 */ - int i, latch, larger; - latch = 0; - i = 103; - larger = 0; - - - do { - if((accum[i] == 1) && (reg[i] == 0)) { - latch = 1; - larger = 1; - } - if((accum[i] == 0) && (reg[i] == 1)) { - latch = 1; - } - i--; - } while ((latch == 0) && (i >= -1)); - - return larger; -} - -void binary_load(short int reg[], char data[], const unsigned int src_len) -{ - int read, i; - short int temp[112] = { 0 }; - - for(i = 0; i < 112; i++) { - reg[i] = 0; - } - - for(read = 0; read < (int)src_len; read++) { - - for(i = 0; i < 112; i++) { - temp[i] = reg[i]; - } - - for(i = 0; i < 9; i++) { - binary_add(reg, temp); - } - - temp[0] = BCD[ctoi(data[read]) * 4]; - temp[1] = BCD[(ctoi(data[read]) * 4) + 1]; - temp[2] = BCD[(ctoi(data[read]) * 4) + 2]; - temp[3] = BCD[(ctoi(data[read]) * 4) + 3]; - for(i = 4; i < 112; i++) { - temp[i] = 0; - } - - binary_add(reg, temp); - } -} - -void hex_dump(short int input_buffer[]) -{ - int i, digit, byte_space; - - byte_space = 1; - for(i = 100; i >= 0; i-=4) { - digit = 0; - digit += 1 * input_buffer[i]; - digit += 2 * input_buffer[i + 1]; - digit += 4 * input_buffer[i + 2]; - digit += 8 * input_buffer[i + 3]; - - switch(digit) { - case 0: printf("0"); break; - case 1: printf("1"); break; - case 2: printf("2"); break; - case 3: printf("3"); break; - case 4: printf("4"); break; - case 5: printf("5"); break; - case 6: printf("6"); break; - case 7: printf("7"); break; - case 8: printf("8"); break; - case 9: printf("9"); break; - case 10: printf("A"); break; - case 11: printf("B"); break; - case 12: printf("C"); break; - case 13: printf("D"); break; - case 14: printf("E"); break; - case 15: printf("F"); break; - } - if(byte_space == 1) { - byte_space = 0; - } else { - byte_space = 1; - printf(" "); - } - } - printf("\n"); -} diff --git a/3rdparty/zint-2.4.4/backend/large.h b/3rdparty/zint-2.4.4/backend/large.h deleted file mode 100644 index 72076b0..0000000 --- a/3rdparty/zint-2.4.4/backend/large.h +++ /dev/null @@ -1,40 +0,0 @@ -/* large.h - Handles binary manipulation of large numbers */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ -#ifndef __LARGE_H -#define __LARGE_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -extern void binary_load(short int reg[], char data[], const unsigned int src_len); -extern void binary_add(short int accumulator[], short int input_buffer[]); -extern void binary_subtract(short int accumulator[], short int input_buffer[]); -extern void shiftdown(short int buffer[]); -extern void shiftup(short int buffer[]); -extern short int islarger(short int accum[], short int reg[]); -extern void hex_dump(short int input_buffer[]); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __LARGE_H */ diff --git a/3rdparty/zint-2.4.4/backend/library.c b/3rdparty/zint-2.4.4/backend/library.c deleted file mode 100644 index f769a46..0000000 --- a/3rdparty/zint-2.4.4/backend/library.c +++ /dev/null @@ -1,908 +0,0 @@ -/* library.c - external functions of libzint - - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" -#include "gs1.h" - -#define TECHNETIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%" - -struct zint_symbol *ZBarcode_Create() -{ - struct zint_symbol *symbol; - int i; - - symbol = (struct zint_symbol*)malloc(sizeof(*symbol)); - if (!symbol) return NULL; - - memset(symbol, 0, sizeof(*symbol)); - symbol->symbology = BARCODE_CODE128; - symbol->height = 0; - symbol->whitespace_width = 0; - symbol->border_width = 0; - symbol->output_options = 0; - symbol->rows = 0; - symbol->width = 0; - strcpy(symbol->fgcolour, "000000"); - strcpy(symbol->bgcolour, "ffffff"); - strcpy(symbol->outfile, ""); - symbol->scale = 1.0; - symbol->option_1 = -1; - symbol->option_2 = 0; - symbol->option_3 = 928; // PDF_MAX - symbol->show_hrt = 1; // Show human readable text - symbol->input_mode = DATA_MODE; - strcpy(symbol->primary, ""); - memset(&(symbol->encoded_data[0][0]),0,sizeof(symbol->encoded_data)); - for(i = 0; i < 178; i++) { - symbol->row_height[i] = 0; - } - symbol->bitmap = NULL; - symbol->bitmap_width = 0; - symbol->bitmap_height = 0; - return symbol; -} - -void ZBarcode_Clear(struct zint_symbol *symbol) -{ - int i, j; - - for(i = 0; i < symbol->rows; i++) { - for(j = 0; j < symbol->width; j++) { - unset_module(symbol, i, j); - } - } - symbol->rows = 0; - symbol->width = 0; - symbol->text[0] = '\0'; - symbol->errtxt[0] = '\0'; - if (symbol->bitmap != NULL) - free(symbol->bitmap); - symbol->bitmap = NULL; - symbol->bitmap_width = 0; - symbol->bitmap_height = 0; -} - -void ZBarcode_Delete(struct zint_symbol *symbol) -{ - if (symbol->bitmap != NULL) - free(symbol->bitmap); - - // If there is a rendered version, ensure it's memory is released - if (symbol->rendered != NULL) { - struct zint_render_line *line, *l; - struct zint_render_string *string, *s; - - // Free lines - line = symbol->rendered->lines; - while(line) { - l = line; - line = line->next; - free(l); - } - // Free Strings - string = symbol->rendered->strings; - while (string) { - s = string; - string = string->next; - free(s->text); - free(s); - } - - // Free Render - free(symbol->rendered); - } - free(symbol); -} - -extern int eanx(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN system barcodes */ -extern int c39(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 3 from 9 (or Code 39) */ -extern int pharmazentral(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmazentral Nummer (PZN) */ -extern int ec39(struct zint_symbol *symbol, unsigned char source[], int length); /* Extended Code 3 from 9 (or Code 39+) */ -extern int codabar(struct zint_symbol *symbol, unsigned char source[], int length); /* Codabar - a simple substitution cipher */ -extern int matrix_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Standard (& Matrix) */ -extern int industrial_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Industrial */ -extern int iata_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 IATA */ -extern int interleaved_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Interleaved */ -extern int logic_two_of_five(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 2 of 5 Data Logic */ -extern int itf14(struct zint_symbol *symbol, unsigned char source[], int length); /* ITF-14 */ -extern int dpleit(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Leitcode */ -extern int dpident(struct zint_symbol *symbol, unsigned char source[], int length); /* Deutsche Post Identcode */ -extern int c93(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 93 - a re-working of Code 39+, generates 2 check digits */ -extern int code_128(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 128 and NVE-18 */ -extern int ean_128(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN-128 (GS1-128) */ -extern int code_11(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 11 */ -extern int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length); /* MSI Plessey */ -extern int telepen(struct zint_symbol *symbol, unsigned char source[], int length); /* Telepen ASCII */ -extern int telepen_num(struct zint_symbol *symbol, unsigned char source[], int length); /* Telepen Numeric */ -extern int plessey(struct zint_symbol *symbol, unsigned char source[], int length); /* Plessey Code */ -extern int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode One Track */ -extern int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length); /* Flattermarken */ -extern int fim(struct zint_symbol *symbol, unsigned char source[], int length); /* Facing Identification Mark */ -extern int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length); /* Pharmacode Two Track */ -extern int post_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* Postnet */ -extern int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* PLANET */ -extern int imail(struct zint_symbol *symbol, unsigned char source[], int length); /* Intelligent Mail (aka USPS OneCode) */ -extern int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length); /* RM4SCC */ -extern int australia_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Australia Post 4-state */ -extern int code16k(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 16k */ -extern int pdf417enc(struct zint_symbol *symbol, unsigned char source[], int length); /* PDF417 */ -extern int dmatrix(struct zint_symbol *symbol, unsigned char source[], int length); /* Data Matrix (IEC16022) */ -extern int qr_code(struct zint_symbol *symbol, unsigned char source[], int length); /* QR Code */ -extern int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], int length); /* Micro PDF417 */ -extern int maxicode(struct zint_symbol *symbol, unsigned char source[], int length); /* Maxicode */ -extern int rss14(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS-14 */ -extern int rsslimited(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Limited */ -extern int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int length); /* RSS Expanded */ -extern int composite(struct zint_symbol *symbol, unsigned char source[], int length); /* Composite Symbology */ -extern int kix_code(struct zint_symbol *symbol, unsigned char source[], int length); /* TNT KIX Code */ -extern int aztec(struct zint_symbol *symbol, unsigned char source[], int length); /* Aztec Code */ -extern int code32(struct zint_symbol *symbol, unsigned char source[], int length); /* Italian Pharmacode */ -extern int daft_code(struct zint_symbol *symbol, unsigned char source[], int length); /* DAFT Code */ -extern int ean_14(struct zint_symbol *symbol, unsigned char source[], int length); /* EAN-14 */ -extern int nve_18(struct zint_symbol *symbol, unsigned char source[], int length); /* NVE-18 */ -extern int microqr(struct zint_symbol *symbol, unsigned char source[], int length); /* Micro QR Code */ -extern int aztec_runes(struct zint_symbol *symbol, unsigned char source[], int length); /* Aztec Runes */ -extern int korea_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Korea Post */ -extern int japan_post(struct zint_symbol *symbol, unsigned char source[], int length); /* Japanese Post */ -extern int code_49(struct zint_symbol *symbol, unsigned char source[], int length); /* Code 49 */ -extern int channel_code(struct zint_symbol *symbol, unsigned char source[], int length); /* Channel Code */ -extern int code_one(struct zint_symbol *symbol, unsigned char source[], int length); /* Code One */ -extern int grid_matrix(struct zint_symbol *symbol, unsigned char source[], int length); /* Grid Matrix */ - -#ifndef NO_PNG -extern int png_handle(struct zint_symbol *symbol, int rotate_angle); -#endif - -extern int render_plot(struct zint_symbol *symbol, float width, float height); - -extern int bmp_handle(struct zint_symbol *symbol, int rotate_angle); -extern int ps_plot(struct zint_symbol *symbol); -extern int svg_plot(struct zint_symbol *symbol); - -void error_tag(char error_string[], int error_number) -{ - char error_buffer[100]; - - if(error_number != 0) { - strcpy(error_buffer, error_string); - - if(error_number > 4) { - strcpy(error_string, "error: "); - } else { - strcpy(error_string, "warning: "); - } - - concat(error_string, error_buffer); - } -} - -int dump_plot(struct zint_symbol *symbol) -{ - FILE *f; - int i, r; - - if(symbol->output_options & BARCODE_STDOUT) { - f = stdout; - } else { - f = fopen(symbol->outfile, "w"); - if(!f) { - strcpy(symbol->errtxt, "Could not open output file"); - return ERROR_FILE_ACCESS; - } - } - - fputs("[\n", f); - for (r = 0; r < symbol->rows; r++) { - fputs(" [ ", f); - for (i = 0; i < symbol->width; i++) { - fputs(module_is_set(symbol, r, i) ? "1 " : "0 ", f); - } - fputs("]\n", f); - } - fputs("]\n", f); - - fclose(f); - - return 0; -} - -int hibc(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int counter, error_number, i; - char to_process[40], temp[2], check_digit; - - if(length > 36) { - strcpy(symbol->errtxt, "Data too long for HIBC LIC"); - return ERROR_TOO_LONG; - } - to_upper(source); - error_number = is_sane(TECHNETIUM , source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - strcpy(to_process, "+"); - counter = 41; - for(i = 0; i < length; i++) { - counter += posn(TECHNETIUM, source[i]); - } - counter = counter % 43; - - if(counter < 10) { - check_digit = itoc(counter); - } else { - if(counter < 36) { - check_digit = (counter - 10) + 'A'; - } else { - switch(counter) { - case 36: check_digit = '-'; break; - case 37: check_digit = '.'; break; - case 38: check_digit = ' '; break; - case 39: check_digit = '$'; break; - case 40: check_digit = '/'; break; - case 41: check_digit = '+'; break; - case 42: check_digit = '%'; break; - default: check_digit = ' '; break; /* Keep compiler happy */ - } - } - } - - temp[0] = check_digit; - temp[1] = '\0'; - - concat(to_process, (char *)source); - concat(to_process, temp); - length = strlen(to_process); - - switch(symbol->symbology) { - case BARCODE_HIBC_128: - error_number = code_128(symbol, (unsigned char *)to_process, length); - ustrcpy(symbol->text, (unsigned char*)"*"); - uconcat(symbol->text, (unsigned char*)to_process); - uconcat(symbol->text, (unsigned char*)"*"); - break; - case BARCODE_HIBC_39: - symbol->option_2 = 0; - error_number = c39(symbol, (unsigned char *)to_process, length); - ustrcpy(symbol->text, (unsigned char*)"*"); - uconcat(symbol->text, (unsigned char*)to_process); - uconcat(symbol->text, (unsigned char*)"*"); - break; - case BARCODE_HIBC_DM: - error_number = dmatrix(symbol, (unsigned char *)to_process, length); - break; - case BARCODE_HIBC_QR: - error_number = qr_code(symbol, (unsigned char *)to_process, length); - break; - case BARCODE_HIBC_PDF: - error_number = pdf417enc(symbol, (unsigned char *)to_process, length); - break; - case BARCODE_HIBC_MICPDF: - error_number = micro_pdf417(symbol, (unsigned char *)to_process, length); - break; - case BARCODE_HIBC_AZTEC: - error_number = aztec(symbol, (unsigned char *)to_process, length); - break; - } - - return error_number; -} - -int gs1_compliant(int symbology) -{ - /* Returns 1 if symbology supports GS1 data */ - - int result = 0; - - switch(symbology) { - case BARCODE_EAN128: - case BARCODE_RSS_EXP: - case BARCODE_RSS_EXPSTACK: - case BARCODE_EANX_CC: - case BARCODE_EAN128_CC: - case BARCODE_RSS14_CC: - case BARCODE_RSS_LTD_CC: - case BARCODE_RSS_EXP_CC: - case BARCODE_UPCA_CC: - case BARCODE_UPCE_CC: - case BARCODE_RSS14STACK_CC: - case BARCODE_RSS14_OMNI_CC: - case BARCODE_RSS_EXPSTACK_CC: - case BARCODE_CODE16K: - case BARCODE_AZTEC: - case BARCODE_DATAMATRIX: - case BARCODE_CODEONE: - case BARCODE_CODE49: - case BARCODE_QRCODE: - result = 1; - break; - } - - return result; -} - -int ZBarcode_ValidID(int symbol_id) -{ - /* Checks whether a symbology is supported */ - - int result = 0; - - switch(symbol_id) { - case BARCODE_CODE11: - case BARCODE_C25MATRIX: - case BARCODE_C25INTER: - case BARCODE_C25IATA: - case BARCODE_C25LOGIC: - case BARCODE_C25IND: - case BARCODE_CODE39: - case BARCODE_EXCODE39: - case BARCODE_EANX: - case BARCODE_EAN128: - case BARCODE_CODABAR: - case BARCODE_CODE128: - case BARCODE_DPLEIT: - case BARCODE_DPIDENT: - case BARCODE_CODE16K: - case BARCODE_CODE49: - case BARCODE_CODE93: - case BARCODE_FLAT: - case BARCODE_RSS14: - case BARCODE_RSS_LTD: - case BARCODE_RSS_EXP: - case BARCODE_TELEPEN: - case BARCODE_UPCA: - case BARCODE_UPCE: - case BARCODE_POSTNET: - case BARCODE_MSI_PLESSEY: - case BARCODE_FIM: - case BARCODE_LOGMARS: - case BARCODE_PHARMA: - case BARCODE_PZN: - case BARCODE_PHARMA_TWO: - case BARCODE_PDF417: - case BARCODE_PDF417TRUNC: - case BARCODE_MAXICODE: - case BARCODE_QRCODE: - case BARCODE_CODE128B: - case BARCODE_AUSPOST: - case BARCODE_AUSREPLY: - case BARCODE_AUSROUTE: - case BARCODE_AUSREDIRECT: - case BARCODE_ISBNX: - case BARCODE_RM4SCC: - case BARCODE_DATAMATRIX: - case BARCODE_EAN14: - case BARCODE_NVE18: - case BARCODE_JAPANPOST: - case BARCODE_KOREAPOST: - case BARCODE_RSS14STACK: - case BARCODE_RSS14STACK_OMNI: - case BARCODE_RSS_EXPSTACK: - case BARCODE_PLANET: - case BARCODE_MICROPDF417: - case BARCODE_ONECODE: - case BARCODE_PLESSEY: - case BARCODE_TELEPEN_NUM: - case BARCODE_ITF14: - case BARCODE_KIX: - case BARCODE_AZTEC: - case BARCODE_DAFT: - case BARCODE_MICROQR: - case BARCODE_HIBC_128: - case BARCODE_HIBC_39: - case BARCODE_HIBC_DM: - case BARCODE_HIBC_QR: - case BARCODE_HIBC_PDF: - case BARCODE_HIBC_MICPDF: - case BARCODE_HIBC_AZTEC: - case BARCODE_AZRUNE: - case BARCODE_CODE32: - case BARCODE_EANX_CC: - case BARCODE_EAN128_CC: - case BARCODE_RSS14_CC: - case BARCODE_RSS_LTD_CC: - case BARCODE_RSS_EXP_CC: - case BARCODE_UPCA_CC: - case BARCODE_UPCE_CC: - case BARCODE_RSS14STACK_CC: - case BARCODE_RSS14_OMNI_CC: - case BARCODE_RSS_EXPSTACK_CC: - case BARCODE_CHANNEL: - case BARCODE_CODEONE: - case BARCODE_GRIDMATRIX: - result = 1; - break; - } - - return result; -} - -int extended_charset(struct zint_symbol *symbol, unsigned char *source, int length) -{ - int error_number = 0; - - /* These are the "elite" standards which can support multiple character sets */ - switch(symbol->symbology) { - case BARCODE_QRCODE: error_number = qr_code(symbol, source, length); break; - case BARCODE_MICROQR: error_number = microqr(symbol, source, length); break; - case BARCODE_GRIDMATRIX: error_number = grid_matrix(symbol, source, length); break; - } - - return error_number; -} - -int reduced_charset(struct zint_symbol *symbol, unsigned char *source, int length) -{ - /* These are the "norm" standards which only support Latin-1 at most */ - int error_number = 0; - -#ifndef _MSC_VER - unsigned char preprocessed[length + 1]; -#else - unsigned char* preprocessed = (unsigned char*)_alloca(length + 1); -#endif - - if(symbol->symbology == BARCODE_CODE16K) { - symbol->whitespace_width = 16; - symbol->border_width = 2; - symbol->output_options = BARCODE_BIND; - } - - if(symbol->symbology == BARCODE_ITF14) { - symbol->whitespace_width = 20; - symbol->border_width = 8; - symbol->output_options = BARCODE_BOX; - } - - switch(symbol->input_mode) { - case DATA_MODE: - case GS1_MODE: - memcpy(preprocessed, source, length); - preprocessed[length] = '\0'; - break; - case UNICODE_MODE: - error_number = latin1_process(symbol, source, preprocessed, &length); - if(error_number != 0) { return error_number; } - break; - } - - switch(symbol->symbology) { - case BARCODE_C25MATRIX: error_number = matrix_two_of_five(symbol, preprocessed, length); break; - case BARCODE_C25IND: error_number = industrial_two_of_five(symbol, preprocessed, length); break; - case BARCODE_C25INTER: error_number = interleaved_two_of_five(symbol, preprocessed, length); break; - case BARCODE_C25IATA: error_number = iata_two_of_five(symbol, preprocessed, length); break; - case BARCODE_C25LOGIC: error_number = logic_two_of_five(symbol, preprocessed, length); break; - case BARCODE_DPLEIT: error_number = dpleit(symbol, preprocessed, length); break; - case BARCODE_DPIDENT: error_number = dpident(symbol, preprocessed, length); break; - case BARCODE_UPCA: error_number = eanx(symbol, preprocessed, length); break; - case BARCODE_UPCE: error_number = eanx(symbol, preprocessed, length); break; - case BARCODE_EANX: error_number = eanx(symbol, preprocessed, length); break; - case BARCODE_EAN128: error_number = ean_128(symbol, preprocessed, length); break; - case BARCODE_CODE39: error_number = c39(symbol, preprocessed, length); break; - case BARCODE_PZN: error_number = pharmazentral(symbol, preprocessed, length); break; - case BARCODE_EXCODE39: error_number = ec39(symbol, preprocessed, length); break; - case BARCODE_CODABAR: error_number = codabar(symbol, preprocessed, length); break; - case BARCODE_CODE93: error_number = c93(symbol, preprocessed, length); break; - case BARCODE_LOGMARS: error_number = c39(symbol, preprocessed, length); break; - case BARCODE_CODE128: error_number = code_128(symbol, preprocessed, length); break; - case BARCODE_CODE128B: error_number = code_128(symbol, preprocessed, length); break; - case BARCODE_NVE18: error_number = nve_18(symbol, preprocessed, length); break; - case BARCODE_CODE11: error_number = code_11(symbol, preprocessed, length); break; - case BARCODE_MSI_PLESSEY: error_number = msi_handle(symbol, preprocessed, length); break; - case BARCODE_TELEPEN: error_number = telepen(symbol, preprocessed, length); break; - case BARCODE_TELEPEN_NUM: error_number = telepen_num(symbol, preprocessed, length); break; - case BARCODE_PHARMA: error_number = pharma_one(symbol, preprocessed, length); break; - case BARCODE_PLESSEY: error_number = plessey(symbol, preprocessed, length); break; - case BARCODE_ITF14: error_number = itf14(symbol, preprocessed, length); break; - case BARCODE_FLAT: error_number = flattermarken(symbol, preprocessed, length); break; - case BARCODE_FIM: error_number = fim(symbol, preprocessed, length); break; - case BARCODE_POSTNET: error_number = post_plot(symbol, preprocessed, length); break; - case BARCODE_PLANET: error_number = planet_plot(symbol, preprocessed, length); break; - case BARCODE_RM4SCC: error_number = royal_plot(symbol, preprocessed, length); break; - case BARCODE_AUSPOST: error_number = australia_post(symbol, preprocessed, length); break; - case BARCODE_AUSREPLY: error_number = australia_post(symbol, preprocessed, length); break; - case BARCODE_AUSROUTE: error_number = australia_post(symbol, preprocessed, length); break; - case BARCODE_AUSREDIRECT: error_number = australia_post(symbol, preprocessed, length); break; - case BARCODE_CODE16K: error_number = code16k(symbol, preprocessed, length); break; - case BARCODE_PHARMA_TWO: error_number = pharma_two(symbol, preprocessed, length); break; - case BARCODE_ONECODE: error_number = imail(symbol, preprocessed, length); break; - case BARCODE_ISBNX: error_number = eanx(symbol, preprocessed, length); break; - case BARCODE_RSS14: error_number = rss14(symbol, preprocessed, length); break; - case BARCODE_RSS14STACK: error_number = rss14(symbol, preprocessed, length); break; - case BARCODE_RSS14STACK_OMNI: error_number = rss14(symbol, preprocessed, length); break; - case BARCODE_RSS_LTD: error_number = rsslimited(symbol, preprocessed, length); break; - case BARCODE_RSS_EXP: error_number = rssexpanded(symbol, preprocessed, length); break; - case BARCODE_RSS_EXPSTACK: error_number = rssexpanded(symbol, preprocessed, length); break; - case BARCODE_EANX_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_EAN128_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_RSS14_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_RSS_LTD_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_RSS_EXP_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_UPCA_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_UPCE_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_RSS14STACK_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_RSS14_OMNI_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_RSS_EXPSTACK_CC: error_number = composite(symbol, preprocessed, length); break; - case BARCODE_KIX: error_number = kix_code(symbol, preprocessed, length); break; - case BARCODE_CODE32: error_number = code32(symbol, preprocessed, length); break; - case BARCODE_DAFT: error_number = daft_code(symbol, preprocessed, length); break; - case BARCODE_EAN14: error_number = ean_14(symbol, preprocessed, length); break; - case BARCODE_AZRUNE: error_number = aztec_runes(symbol, preprocessed, length); break; - case BARCODE_KOREAPOST: error_number = korea_post(symbol, preprocessed, length); break; - case BARCODE_HIBC_128: error_number = hibc(symbol, preprocessed, length); break; - case BARCODE_HIBC_39: error_number = hibc(symbol, preprocessed, length); break; - case BARCODE_HIBC_DM: error_number = hibc(symbol, preprocessed, length); break; - case BARCODE_HIBC_QR: error_number = hibc(symbol, preprocessed, length); break; - case BARCODE_HIBC_PDF: error_number = hibc(symbol, preprocessed, length); break; - case BARCODE_HIBC_MICPDF: error_number = hibc(symbol, preprocessed, length); break; - case BARCODE_HIBC_AZTEC: error_number = hibc(symbol, preprocessed, length); break; - case BARCODE_JAPANPOST: error_number = japan_post(symbol, preprocessed, length); break; - case BARCODE_CODE49: error_number = code_49(symbol, preprocessed, length); break; - case BARCODE_CHANNEL: error_number = channel_code(symbol, preprocessed, length); break; - case BARCODE_CODEONE: error_number = code_one(symbol, preprocessed, length); break; - case BARCODE_DATAMATRIX: error_number = dmatrix(symbol, preprocessed, length); break; - case BARCODE_PDF417: error_number = pdf417enc(symbol, preprocessed, length); break; - case BARCODE_PDF417TRUNC: error_number = pdf417enc(symbol, preprocessed, length); break; - case BARCODE_MICROPDF417: error_number = micro_pdf417(symbol, preprocessed, length); break; - case BARCODE_MAXICODE: error_number = maxicode(symbol, preprocessed, length); break; - case BARCODE_AZTEC: error_number = aztec(symbol, preprocessed, length); break; - } - - return error_number; -} - -int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *source, int length) -{ -#ifdef _MSC_VER - unsigned char* local_source; -#endif - int error_number, error_buffer, i; - error_number = 0; - - if(length == 0) { - length = ustrlen(source); - } - if(length == 0) { - strcpy(symbol->errtxt, "No input data"); - error_tag(symbol->errtxt, ERROR_INVALID_DATA1); - return ERROR_INVALID_DATA1; - } - - if(strcmp(symbol->outfile, "") == 0) { - strcpy(symbol->outfile, "out.png"); - } -#ifndef _MSC_VER - unsigned char local_source[length + 1]; -#else - local_source = (unsigned char*)_alloca(length + 1); -#endif - - /* First check the symbology field */ - if(symbol->symbology < 1) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } - - /* symbol->symbologys 1 to 86 are defined by tbarcode */ - if(symbol->symbology == 5) { symbol->symbology = BARCODE_C25MATRIX; } - if((symbol->symbology >= 10) && (symbol->symbology <= 12)) { symbol->symbology = BARCODE_EANX; } - if((symbol->symbology == 14) || (symbol->symbology == 15)) { symbol->symbology = BARCODE_EANX; } - if(symbol->symbology == 17) { symbol->symbology = BARCODE_UPCA; } - if(symbol->symbology == 19) { strcpy(symbol->errtxt, "Codabar 18 not supported, using Codabar"); symbol->symbology = BARCODE_CODABAR; error_number = WARN_INVALID_OPTION; } - if(symbol->symbology == 26) { symbol->symbology = BARCODE_UPCA; } - if(symbol->symbology == 27) { strcpy(symbol->errtxt, "UPCD1 not supported"); error_number = ERROR_INVALID_OPTION; } - if(symbol->symbology == 33) { symbol->symbology = BARCODE_EAN128; } - if((symbol->symbology == 35) || (symbol->symbology == 36)) { symbol->symbology = BARCODE_UPCA; } - if((symbol->symbology == 38) || (symbol->symbology == 39)) { symbol->symbology = BARCODE_UPCE; } - if((symbol->symbology >= 41) && (symbol->symbology <= 45)) { symbol->symbology = BARCODE_POSTNET; } - if(symbol->symbology == 46) { symbol->symbology = BARCODE_PLESSEY; } - if(symbol->symbology == 48) { symbol->symbology = BARCODE_NVE18; } - if(symbol->symbology == 54) { strcpy(symbol->errtxt, "General Parcel Code not supported, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } - if((symbol->symbology == 59) || (symbol->symbology == 61)) { symbol->symbology = BARCODE_CODE128; } - if(symbol->symbology == 62) { symbol->symbology = BARCODE_CODE93; } - if((symbol->symbology == 64) || (symbol->symbology == 65)) { symbol->symbology = BARCODE_AUSPOST; } - if(symbol->symbology == 73) { strcpy(symbol->errtxt, "Codablock E not supported"); error_number = ERROR_INVALID_OPTION; } - if(symbol->symbology == 78) { symbol->symbology = BARCODE_RSS14; } - if(symbol->symbology == 83) { symbol->symbology = BARCODE_PLANET; } - if(symbol->symbology == 88) { symbol->symbology = BARCODE_EAN128; } - if(symbol->symbology == 91) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } - if((symbol->symbology >= 94) && (symbol->symbology <= 96)) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } - if(symbol->symbology == 100) { symbol->symbology = BARCODE_HIBC_128; } - if(symbol->symbology == 101) { symbol->symbology = BARCODE_HIBC_39; } - if(symbol->symbology == 103) { symbol->symbology = BARCODE_HIBC_DM; } - if(symbol->symbology == 105) { symbol->symbology = BARCODE_HIBC_QR; } - if(symbol->symbology == 107) { symbol->symbology = BARCODE_HIBC_PDF; } - if(symbol->symbology == 109) { symbol->symbology = BARCODE_HIBC_MICPDF; } - if(symbol->symbology == 111) { symbol->symbology = BARCODE_HIBC_BLOCKF; } - if((symbol->symbology >= 113) && (symbol->symbology <= 127)) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } - /* Everything from 128 up is Zint-specific */ - if(symbol->symbology >= 143) { strcpy(symbol->errtxt, "Symbology out of range, using Code 128"); symbol->symbology = BARCODE_CODE128; error_number = WARN_INVALID_OPTION; } - if((symbol->symbology == BARCODE_CODABLOCKF) || (symbol->symbology == BARCODE_HIBC_BLOCKF)) { strcpy(symbol->errtxt, "Codablock F not supported"); error_number = ERROR_INVALID_OPTION; } - - if(error_number > 4) { - error_tag(symbol->errtxt, error_number); - return error_number; - } else { - error_buffer = error_number; - } - - if((symbol->input_mode < 0) || (symbol->input_mode > 2)) { symbol->input_mode = DATA_MODE; } - - if(symbol->input_mode == GS1_MODE) { - for(i = 0; i < length; i++) { - if(source[i] == '\0') { - strcpy(symbol->errtxt, "NULL characters not permitted in GS1 mode"); - return ERROR_INVALID_DATA1; - } - } - if(gs1_compliant(symbol->symbology) == 1) { - error_number = ugs1_verify(symbol, source, length, local_source); - if(error_number != 0) { return error_number; } - length = ustrlen(local_source); - } else { - strcpy(symbol->errtxt, "Selected symbology does not support GS1 mode"); - return ERROR_INVALID_OPTION; - } - } else { - memcpy(local_source, source, length); - local_source[length] = '\0'; - } - - switch(symbol->symbology) { - case BARCODE_QRCODE: - case BARCODE_MICROQR: - case BARCODE_GRIDMATRIX: - error_number = extended_charset(symbol, local_source, length); - break; - default: - error_number = reduced_charset(symbol, local_source, length); - break; - } - - if((symbol->symbology == BARCODE_CODE128) || (symbol->symbology == BARCODE_CODE128B)) { - for(i = 0; i < length; i++) { - if(local_source[i] == '\0') { - symbol->text[i] = ' '; - } else { - symbol->text[i] = local_source[i]; - } - } - } - - if(error_number == 0) { - error_number = error_buffer; - } - error_tag(symbol->errtxt, error_number); - /*printf("%s\n",symbol->text);*/ - return error_number; -} - -int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle) -{ - int error_number; - char output[4]; - - switch(rotate_angle) { - case 0: - case 90: - case 180: - case 270: - break; - default: - strcpy(symbol->errtxt, "Invalid rotation angle"); - return ERROR_INVALID_OPTION; - break; - } - - if(strlen(symbol->outfile) > 3) { - output[0] = symbol->outfile[strlen(symbol->outfile) - 3]; - output[1] = symbol->outfile[strlen(symbol->outfile) - 2]; - output[2] = symbol->outfile[strlen(symbol->outfile) - 1]; - output[3] = '\0'; - to_upper((unsigned char*)output); - -#ifndef NO_PNG - if(!(strcmp(output, "PNG"))) { - if(symbol->scale < 1.0) { symbol->text[0] = '\0'; } - error_number = png_handle(symbol, rotate_angle); - } else -#endif - if(!(strcmp(output, "TXT"))) { - error_number = dump_plot(symbol); - } else - if(!(strcmp(output, "EPS"))) { - error_number = ps_plot(symbol); - } else - if(!(strcmp(output, "SVG"))) { - error_number = svg_plot(symbol); - } else - { - strcpy(symbol->errtxt, "Unknown output format"); - error_tag(symbol->errtxt, ERROR_INVALID_OPTION); - return ERROR_INVALID_OPTION; - } - } else { - strcpy(symbol->errtxt, "Unknown output format"); - error_tag(symbol->errtxt, ERROR_INVALID_OPTION); - return ERROR_INVALID_OPTION; - } - - error_tag(symbol->errtxt, error_number); - return error_number; -} - -int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle) -{ - int error_number; - - switch(rotate_angle) { - case 0: - case 90: - case 180: - case 270: - break; - default: - strcpy(symbol->errtxt, "Invalid rotation angle"); - return ERROR_INVALID_OPTION; - break; - } - - error_number = bmp_handle(symbol, rotate_angle); - error_tag(symbol->errtxt, error_number); - return error_number; -} - -int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) -{ - int error_number; - - error_number = 0; - - error_number = ZBarcode_Encode(symbol, input, length); - if(error_number != 0) { - return error_number; - } - - error_number = ZBarcode_Print(symbol, rotate_angle); - return error_number; -} - -int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle) -{ - int error_number; - - error_number = 0; - - error_number = ZBarcode_Encode(symbol, input, length); - if(error_number != 0) { - return error_number; - } - - error_number = ZBarcode_Buffer(symbol, rotate_angle); - return error_number; -} - -int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename) -{ - FILE *file; - unsigned char *buffer; - unsigned long fileLen; - unsigned int nRead = 0, n = 0; - int ret; - - if (!strcmp(filename, "-")) { - file = stdin; - fileLen = 7100; - } else { - file = fopen(filename, "rb"); - if (!file) { - strcpy(symbol->errtxt, "Unable to read input file"); - return ERROR_INVALID_DATA1; - } - - /* Get file length */ - fseek(file, 0, SEEK_END); - fileLen = ftell(file); - fseek(file, 0, SEEK_SET); - - if(fileLen > 7100) { - /* The largest amount of data that can be encoded is 7089 numeric digits in QR Code */ - strcpy(symbol->errtxt, "Input file too long"); - fclose(file); - return ERROR_INVALID_DATA1; - } - } - - /* Allocate memory */ - buffer = (unsigned char *)malloc(fileLen * sizeof(unsigned char)); - if(!buffer) { - strcpy(symbol->errtxt, "Internal memory error"); - fclose(file); - return ERROR_MEMORY; - } - - /* Read file contents into buffer */ - - do - { - n = fread(buffer + nRead, 1, fileLen - nRead, file); - if (ferror(file)) - { - strcpy(symbol->errtxt, strerror(errno)); - nRead = 0; - return ERROR_INVALID_DATA1; - } - nRead += n; - } while (!feof(file) && (0 < n) && (nRead < fileLen)); - - fclose(file); - ret = ZBarcode_Encode(symbol, buffer, nRead); - free(buffer); - return ret; -} - -int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle) -{ - int error_number; - - error_number = 0; - - error_number = ZBarcode_Encode_File(symbol, filename); - if(error_number != 0) { - return error_number; - } - - return ZBarcode_Print(symbol, rotate_angle); -} - -int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle) -{ - int error_number; - - error_number = 0; - - error_number = ZBarcode_Encode_File(symbol, filename); - if(error_number != 0) { - return error_number; - } - - return ZBarcode_Buffer(symbol, rotate_angle); -} - -/* - * Rendering support, initially added by Sam Lown. - * - * Converts encoded data into an intermediate format to be interpreted - * in other applications using this library. - * - * If the width and height are not set to zero, the barcode will be resized to those - * dimensions. The symbol->scale and symbol->height values are totally ignored in this case. - * - */ -int ZBarcode_Render(struct zint_symbol *symbol, float width, float height) -{ - // Send the request to the render_plot method - return render_plot(symbol, width, height); -} diff --git a/3rdparty/zint-2.4.4/backend/maxicode.c b/3rdparty/zint-2.4.4/backend/maxicode.c deleted file mode 100644 index 53ce12e..0000000 --- a/3rdparty/zint-2.4.4/backend/maxicode.c +++ /dev/null @@ -1,709 +0,0 @@ -/* maxicode.c - Handles Maxicode */ - -/* - libzint - the open source barcode library - Copyright (C) 2010 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* Includes corrections thanks to Monica Swanson @ Source Technologies */ - -#include "common.h" -#include "maxicode.h" -#include "reedsol.h" -#include -#include -#ifdef __APPLE__ -#include -#else -#include -#endif - -int maxi_codeword[144]; - -void maxi_do_primary_check( ) -{ - /* Handles error correction of primary message */ - unsigned char data[15]; - unsigned char results[15]; - int j; - int datalen = 10; - int ecclen = 10; - - rs_init_gf(0x43); - rs_init_code(ecclen, 1); - - for(j = 0; j < datalen; j += 1) - data[j] = maxi_codeword[j]; - - rs_encode(datalen, data, results); - - for ( j = 0; j < ecclen; j += 1) - maxi_codeword[ datalen + j] = results[ecclen - 1 - j]; - rs_free(); -} - -void maxi_do_secondary_chk_odd( int ecclen ) -{ - /* Handles error correction of odd characters in secondary */ - unsigned char data[100]; - unsigned char results[30]; - int j; - int datalen = 68; - - rs_init_gf(0x43); - rs_init_code(ecclen, 1); - - if (ecclen == 20) - datalen = 84; - - for(j = 0; j < datalen; j += 1) - if (j & 1) // odd - data[(j-1)/2] = maxi_codeword[j + 20]; - - rs_encode(datalen/2, data, results); - - for ( j = 0; j < (ecclen); j += 1) - maxi_codeword[ datalen + (2 *j) + 1 + 20 ] = results[ecclen - 1 - j]; - rs_free(); -} - -void maxi_do_secondary_chk_even(int ecclen ) -{ - /* Handles error correction of even characters in secondary */ - unsigned char data[100]; - unsigned char results[30]; - int j; - int datalen = 68; - - if (ecclen == 20) - datalen = 84; - - rs_init_gf(0x43); - rs_init_code(ecclen, 1); - - for(j = 0; j < datalen + 1; j += 1) - if (!(j & 1)) // even - data[j/2] = maxi_codeword[j + 20]; - - rs_encode(datalen/2, data, results); - - for ( j = 0; j < (ecclen); j += 1) - maxi_codeword[ datalen + (2 *j) + 20] = results[ecclen - 1 - j]; - rs_free(); -} - -void maxi_bump(int set[], int character[], int bump_posn) -{ - /* Moves everything up so that a shift or latch can be inserted */ - int i; - - for(i = 143; i > bump_posn; i--) { - set[i] = set[i - 1]; - character[i] = character[i - 1]; - } -} - -int maxi_text_process(int mode, unsigned char source[], int length) -{ - /* Format text according to Appendix A */ - - /* This code doesn't make use of [Lock in C], [Lock in D] - and [Lock in E] and so is not always the most efficient at - compressing data, but should suffice for most applications */ - - int set[144], character[144], i, j, done, count, current_set; - - if(length > 138) { - return ERROR_TOO_LONG; - } - - for(i = 0; i < 144; i++) { - set[i] = -1; - character[i] = 0; - } - - for (i = 0; i < length; i++) { - /* Look up characters in table from Appendix A - this gives - value and code set for most characters */ - set[i] = maxiCodeSet[source[i]]; - character[i] = maxiSymbolChar[source[i]]; - } - - /* If a character can be represented in more than one code set, - pick which version to use */ - if(set[0] == 0) { - if(character[0] == 13) { - character[0] = 0; - } - set[0] = 1; - } - - for(i = 1; i < length; i++) { - if(set[i] == 0) { - done = 0; - /* Special character */ - if(character[i] == 13) { - /* Carriage Return */ - if(set[i - 1] == 5) { - character[i] = 13; - set[i] = 5; - } else { - if((i != length - 1) && (set[i + 1] == 5)) { - character[i] = 13; - set[i] = 5; - } else { - character[i] = 0; - set[i] = 1; - } - } - done = 1; - } - - if((character[i] == 28) && (done == 0)) { - /* FS */ - if(set[i - 1] == 5) { - character[i] = 32; - set[i] = 5; - } else { - set[i] = set[i - 1]; - } - done = 1; - } - - if((character[i] == 29) && (done == 0)) { - /* GS */ - if(set[i - 1] == 5) { - character[i] = 33; - set[i] = 5; - } else { - set[i] = set[i - 1]; - } - done = 1; - } - - if((character[i] == 30) && (done == 0)) { - /* RS */ - if(set[i - 1] == 5) { - character[i] = 34; - set[i] = 5; - } else { - set[i] = set[i - 1]; - } - done = 1; - } - - if((character[i] == 32) && (done == 0)) { - /* Space */ - if(set[i - 1] == 1) { - character[i] = 32; - set[i] = 1; - } - if(set[i - 1] == 2) { - character[i] = 47; - set[i] = 2; - } - if(set[i - 1] >= 3) { - if(i != length - 1) { - if(set[i + 1] == 1) { - character[i] = 32; - set[i] = 1; - } - if(set[i + 1] == 2) { - character[i] = 47; - set[i] = 2; - } - if(set[i + 1] >= 3) { - character[i] = 59; - set[i] = set[i - 1]; - } - } else { - character[i] = 59; - set[i] = set[i - 1]; - } - } - done = 1; - } - - if((character[i] == 44) && (done == 0)) { - /* Comma */ - if(set[i - 1] == 2) { - character[i] = 48; - set[i] = 2; - } else { - if((i != length - 1) && (set[i + 1] == 2)) { - character[i] = 48; - set[i] = 2; - } else { - set[i] = 1; - } - } - done = 1; - } - - if((character[i] == 46) && (done == 0)) { - /* Full Stop */ - if(set[i - 1] == 2) { - character[i] = 49; - set[i] = 2; - } else { - if((i != length - 1) && (set[i + 1] == 2)) { - character[i] = 49; - set[i] = 2; - } else { - set[i] = 1; - } - } - done = 1; - } - - if((character[i] == 47) && (done == 0)) { - /* Slash */ - if(set[i - 1] == 2) { - character[i] = 50; - set[i] = 2; - } else { - if((i != length - 1) && (set[i + 1] == 2)) { - character[i] = 50; - set[i] = 2; - } else { - set[i] = 1; - } - } - done = 1; - } - - if((character[i] == 58) && (done == 0)) { - /* Colon */ - if(set[i - 1] == 2) { - character[i] = 51; - set[i] = 2; - } else { - if((i != length - 1) && (set[i + 1] == 2)) { - character[i] = 51; - set[i] = 2; - } else { - set[i] = 1; - } - } - done = 1; - } - } - } - - for(i = length; i < 144; i++) { - /* Add the padding */ - if(set[length - 1] == 2) { - set[i] = 2; - } else { - set[i] = 1; - } - character[i] = 33; - } - - /* Find candidates for number compression */ - if((mode == 2) || (mode ==3)) { j = 0; } else { j = 9; } - /* Number compression not allowed in primary message */ - count = 0; - for(i = j; i < 143; i++) { - if((set[i] == 1) && ((character[i] >= 48) && (character[i] <= 57))) { - /* Character is a number */ - count++; - } else { - count = 0; - } - if(count == 9) { - /* Nine digits in a row can be compressed */ - set[i] = 6; - set[i - 1] = 6; - set[i - 2] = 6; - set[i - 3] = 6; - set[i - 4] = 6; - set[i - 5] = 6; - set[i - 6] = 6; - set[i - 7] = 6; - set[i - 8] = 6; - count = 0; - } - } - - /* Add shift and latch characters */ - current_set = 1; - i = 0; - do { - - if(set[i] != current_set) { - switch(set[i]) { - case 1: - if(set[i + 1] == 1) { - if(set[i + 2] == 1) { - if(set[i + 3] == 1) { - /* Latch A */ - maxi_bump(set, character, i); - character[i] = 63; - current_set = 1; - length++; - } else { - /* 3 Shift A */ - maxi_bump(set, character, i); - character[i] = 57; - length++; - i += 2; - } - } else { - /* 2 Shift A */ - maxi_bump(set, character, i); - character[i] = 56; - length++; - i++; - } - } else { - /* Shift A */ - maxi_bump(set, character, i); - character[i] = 59; - length++; - } - break; - case 2: - if(set[i + 1] == 2) { - /* Latch B */ - maxi_bump(set, character, i); - character[i] = 63; - current_set = 2; - length++; - } else { - /* Shift B */ - maxi_bump(set, character, i); - character[i] = 59; - length++; - } - break; - case 3: - /* Shift C */ - maxi_bump(set, character, i); - character[i] = 60; - length++; - break; - case 4: - /* Shift D */ - maxi_bump(set, character, i); - character[i] = 61; - length++; - break; - case 5: - /* Shift E */ - maxi_bump(set, character, i); - character[i] = 62; - length++; - break; - case 6: - /* Number Compressed */ - /* Do nothing */ - break; - } - i++; - } - i++; - } while(i < 145); - - /* Number compression has not been forgotten! - It's handled below */ - i = 0; - do { - if (set[i] == 6) { - /* Number compression */ - char substring[11]; - int value; - - for(j = 0; j < 10; j++) { - substring[j] = character[i + j]; - } - substring[10] = '\0'; - value = atoi(substring); - - character[i] = 31; /* NS */ - character[i + 1] = (value & 0x3f000000) >> 24; - character[i + 2] = (value & 0xfc0000) >> 18; - character[i + 3] = (value & 0x3f000) >> 12; - character[i + 4] = (value & 0xfc0) >> 6; - character[i + 5] = (value & 0x3f); - - i += 6; - for(j = i; j < 140; j++) { - set[j] = set[j + 3]; - character[j] = character[j + 3]; - } - length -= 3; - } else { - i++; - } - } while (i <= 143); - - if(((mode ==2) || (mode == 3)) && (length > 84)) { - return ERROR_TOO_LONG; - } - - if(((mode == 4) || (mode == 6)) && (length > 93)) { - return ERROR_TOO_LONG; - } - - if((mode == 5) && (length > 77)) { - return ERROR_TOO_LONG; - } - - - /* Copy the encoded text into the codeword array */ - if((mode == 2) || (mode == 3)) { - for(i = 0; i < 84; i++) { /* secondary only */ - maxi_codeword[i + 20] = character[i]; - } - } - - if((mode == 4) || (mode == 6)) { - for(i = 0; i < 9; i++) { /* primary */ - maxi_codeword[i + 1] = character[i]; - } - for(i = 0; i < 84; i++) { /* secondary */ - maxi_codeword[i + 20] = character[i + 9]; - } - } - - if(mode == 5) { - for(i = 0; i < 9; i++) { /* primary */ - maxi_codeword[i + 1] = character[i]; - } - for(i = 0; i < 68; i++) { /* secondary */ - maxi_codeword[i + 20] = character[i + 9]; - } - } - - return 0; -} - -void maxi_do_primary_2(char postcode[], int country, int service) -{ - /* Format structured primary for Mode 2 */ - int postcode_length, postcode_num, i; - - for(i = 0; i < 10; i++) { - if((postcode[i] < '0') || (postcode[i] > '9')) { - postcode[i] = '\0'; - } - } - - postcode_length = strlen(postcode); - postcode_num = atoi(postcode); - - maxi_codeword[0] = ((postcode_num & 0x03) << 4) | 2; - maxi_codeword[1] = ((postcode_num & 0xfc) >> 2); - maxi_codeword[2] = ((postcode_num & 0x3f00) >> 8); - maxi_codeword[3] = ((postcode_num & 0xfc000) >> 14); - maxi_codeword[4] = ((postcode_num & 0x3f00000) >> 20); - maxi_codeword[5] = ((postcode_num & 0x3c000000) >> 26) | ((postcode_length & 0x3) << 4); - maxi_codeword[6] = ((postcode_length & 0x3c) >> 2) | ((country & 0x3) << 4); - maxi_codeword[7] = (country & 0xfc) >> 2; - maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2); - maxi_codeword[9] = ((service & 0x3f0) >> 4); -} - -void maxi_do_primary_3(char postcode[], int country, int service) -{ - /* Format structured primary for Mode 3 */ - int i, h; - - h = strlen(postcode); - to_upper((unsigned char*)postcode); - for(i = 0; i < h; i++) { - if((postcode[i] >= 'A') && (postcode[i] <= 'Z')) { - /* (Capital) letters shifted to Code Set A values */ - postcode[i] -= 64; - } - if(((postcode[i] == 27) || (postcode[i] == 31)) || ((postcode[i] == 33) || (postcode[i] >= 59))) { - /* Not a valid postcode character */ - postcode[i] = ' '; - } - /* Input characters lower than 27 (NUL - SUB) in postcode are - interpreted as capital letters in Code Set A (e.g. LF becomes 'J') */ - } - - maxi_codeword[0] = ((postcode[5] & 0x03) << 4) | 3; - maxi_codeword[1] = ((postcode[4] & 0x03) << 4) | ((postcode[5] & 0x3c) >> 2); - maxi_codeword[2] = ((postcode[3] & 0x03) << 4) | ((postcode[4] & 0x3c) >> 2); - maxi_codeword[3] = ((postcode[2] & 0x03) << 4) | ((postcode[3] & 0x3c) >> 2); - maxi_codeword[4] = ((postcode[1] & 0x03) << 4) | ((postcode[2] & 0x3c) >> 2); - maxi_codeword[5] = ((postcode[0] & 0x03) << 4) | ((postcode[1] & 0x3c) >> 2); - maxi_codeword[6] = ((postcode[0] & 0x3c) >> 2) | ((country & 0x3) << 4); - maxi_codeword[7] = (country & 0xfc) >> 2; - maxi_codeword[8] = ((country & 0x300) >> 8) | ((service & 0xf) << 2); - maxi_codeword[9] = ((service & 0x3f0) >> 4); -} - -int maxicode(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int i, j, block, bit, mode, countrycode = 0, service = 0, lp = 0; - int bit_pattern[7], internal_error = 0, eclen, error_number; - char postcode[12], countrystr[4], servicestr[4]; - -#ifndef _MSC_VER - unsigned char local_source[length + 1]; -#else - unsigned char* local_source = (unsigned char*)_alloca(length + 1); -#endif - - mode = symbol->option_1; - strcpy(postcode, ""); - strcpy(countrystr, ""); - strcpy(servicestr, ""); - - /* The following to be replaced by ECI handling */ - switch(symbol->input_mode) { - case DATA_MODE: - case GS1_MODE: - memcpy(local_source, source, length); - local_source[length] = '\0'; - break; - case UNICODE_MODE: - error_number = latin1_process(symbol, source, local_source, &length); - if(error_number != 0) { return error_number; } - break; - } - memset(maxi_codeword, 0, sizeof(maxi_codeword)); - - if(mode == -1) { /* If mode is unspecified */ - lp = strlen(symbol->primary); - if(lp == 0) { - mode = 4; - } else { - mode = 2; - for(i = 0; i < 10 && i < lp; i++) { - if((symbol->primary[i] < 48) || (symbol->primary[i] > 57)) { - mode = 3; - break; - } - } - } - } - - if((mode < 2) || (mode > 6)) { /* Only codes 2 to 6 supported */ - strcpy(symbol->errtxt, "Invalid Maxicode Mode"); - return ERROR_INVALID_OPTION; - } - - if((mode == 2) || (mode == 3)) { /* Modes 2 and 3 need data in symbol->primary */ - if(lp == 0){ /* Mode set manually means lp doesn't get set */ - lp = strlen( symbol->primary ); - } - if(lp != 15) { - strcpy(symbol->errtxt, "Invalid Primary String"); - return ERROR_INVALID_DATA1; - } - - for(i = 9; i < 15; i++) { /* check that country code and service are numeric */ - if((symbol->primary[i] < '0') || (symbol->primary[i] > '9')) { - strcpy(symbol->errtxt, "Invalid Primary String"); - return ERROR_INVALID_DATA1; - } - } - - memcpy(postcode, symbol->primary, 9); - postcode[9] = '\0'; - - if(mode == 2) { - for(i = 0; i < 10; i++) { - if(postcode[i] == ' ') { - postcode[i] = '\0'; - } - } - } - else if(mode == 3) { postcode[6] = '\0'; } - - countrystr[0] = symbol->primary[9]; - countrystr[1] = symbol->primary[10]; - countrystr[2] = symbol->primary[11]; - countrystr[3] = '\0'; - - servicestr[0] = symbol->primary[12]; - servicestr[1] = symbol->primary[13]; - servicestr[2] = symbol->primary[14]; - servicestr[3] = '\0'; - - countrycode = atoi(countrystr); - service = atoi(servicestr); - - if(mode == 2) { maxi_do_primary_2(postcode, countrycode, service); } - if(mode == 3) { maxi_do_primary_3(postcode, countrycode, service); } - } else { - maxi_codeword[0] = mode; - } - - i = maxi_text_process(mode, local_source, length); - if(i == ERROR_TOO_LONG ) { - strcpy(symbol->errtxt, "Input data too long"); - return i; - } - - /* All the data is sorted - now do error correction */ - maxi_do_primary_check(); /* always EEC */ - - if ( mode == 5 ) - eclen = 56; // 68 data codewords , 56 error corrections - else - eclen = 40; // 84 data codewords, 40 error corrections - - maxi_do_secondary_chk_even(eclen/2); // do error correction of even - maxi_do_secondary_chk_odd(eclen/2); // do error correction of odd - - /* Copy data into symbol grid */ - for(i = 0; i < 33; i++) { - for(j = 0; j < 30; j++) { - block = (MaxiGrid[(i * 30) + j] + 5) / 6; - bit = (MaxiGrid[(i * 30) + j] + 5) % 6; - - if(block != 0) { - - bit_pattern[0] = (maxi_codeword[block - 1] & 0x20) >> 5; - bit_pattern[1] = (maxi_codeword[block - 1] & 0x10) >> 4; - bit_pattern[2] = (maxi_codeword[block - 1] & 0x8) >> 3; - bit_pattern[3] = (maxi_codeword[block - 1] & 0x4) >> 2; - bit_pattern[4] = (maxi_codeword[block - 1] & 0x2) >> 1; - bit_pattern[5] = (maxi_codeword[block - 1] & 0x1); - - if(bit_pattern[bit] != 0) { - set_module(symbol, i, j); - } - } - } - } - - /* Add orientation markings */ - set_module(symbol, 0, 28); // Top right filler - set_module(symbol, 0, 29); - set_module(symbol, 9, 10); // Top left marker - set_module(symbol, 9, 11); - set_module(symbol, 10, 11); - set_module(symbol, 15, 7); // Left hand marker - set_module(symbol, 16, 8); - set_module(symbol, 16, 20); // Right hand marker - set_module(symbol, 17, 20); - set_module(symbol, 22, 10); // Bottom left marker - set_module(symbol, 23, 10); - set_module(symbol, 22, 17); // Bottom right marker - set_module(symbol, 23, 17); - - symbol->width = 30; - symbol->rows = 33; - - return internal_error; -} diff --git a/3rdparty/zint-2.4.4/backend/maxicode.h b/3rdparty/zint-2.4.4/backend/maxicode.h deleted file mode 100644 index f03a902..0000000 --- a/3rdparty/zint-2.4.4/backend/maxicode.h +++ /dev/null @@ -1,90 +0,0 @@ -/* maxicode.h - Handles Maxicode */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -static int MaxiGrid[] = { /* ISO/IEC 16023 Figure 5 - MaxiCode Module Sequence */ /* 30 x 33 data grid */ - 122, 121, 128, 127, 134, 133, 140, 139, 146, 145, 152, 151, 158, 157, 164, 163, 170, 169, 176, 175, 182, 181, 188, 187, 194, 193, 200, 199, 0, 0, - 124, 123, 130, 129, 136, 135, 142, 141, 148, 147, 154, 153, 160, 159, 166, 165, 172, 171, 178, 177, 184, 183, 190, 189, 196, 195, 202, 201, 817, 0, - 126, 125, 132, 131, 138, 137, 144, 143, 150, 149, 156, 155, 162, 161, 168, 167, 174, 173, 180, 179, 186, 185, 192, 191, 198, 197, 204, 203, 819, 818, - 284, 283, 278, 277, 272, 271, 266, 265, 260, 259, 254, 253, 248, 247, 242, 241, 236, 235, 230, 229, 224, 223, 218, 217, 212, 211, 206, 205, 820, 0, - 286, 285, 280, 279, 274, 273, 268, 267, 262, 261, 256, 255, 250, 249, 244, 243, 238, 237, 232, 231, 226, 225, 220, 219, 214, 213, 208, 207, 822, 821, - 288, 287, 282, 281, 276, 275, 270, 269, 264, 263, 258, 257, 252, 251, 246, 245, 240, 239, 234, 233, 228, 227, 222, 221, 216, 215, 210, 209, 823, 0, - 290, 289, 296, 295, 302, 301, 308, 307, 314, 313, 320, 319, 326, 325, 332, 331, 338, 337, 344, 343, 350, 349, 356, 355, 362, 361, 368, 367, 825, 824, - 292, 291, 298, 297, 304, 303, 310, 309, 316, 315, 322, 321, 328, 327, 334, 333, 340, 339, 346, 345, 352, 351, 358, 357, 364, 363, 370, 369, 826, 0, - 294, 293, 300, 299, 306, 305, 312, 311, 318, 317, 324, 323, 330, 329, 336, 335, 342, 341, 348, 347, 354, 353, 360, 359, 366, 365, 372, 371, 828, 827, - 410, 409, 404, 403, 398, 397, 392, 391, 80, 79, 0, 0, 14, 13, 38, 37, 3, 0, 45, 44, 110, 109, 386, 385, 380, 379, 374, 373, 829, 0, - 412, 411, 406, 405, 400, 399, 394, 393, 82, 81, 41, 0, 16, 15, 40, 39, 4, 0, 0, 46, 112, 111, 388, 387, 382, 381, 376, 375, 831, 830, - 414, 413, 408, 407, 402, 401, 396, 395, 84, 83, 42, 0, 0, 0, 0, 0, 6, 5, 48, 47, 114, 113, 390, 389, 384, 383, 378, 377, 832, 0, - 416, 415, 422, 421, 428, 427, 104, 103, 56, 55, 17, 0, 0, 0, 0, 0, 0, 0, 21, 20, 86, 85, 434, 433, 440, 439, 446, 445, 834, 833, - 418, 417, 424, 423, 430, 429, 106, 105, 58, 57, 0, 0, 0, 0, 0, 0, 0, 0, 23, 22, 88, 87, 436, 435, 442, 441, 448, 447, 835, 0, - 420, 419, 426, 425, 432, 431, 108, 107, 60, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 90, 89, 438, 437, 444, 443, 450, 449, 837, 836, - 482, 481, 476, 475, 470, 469, 49, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 54, 53, 464, 463, 458, 457, 452, 451, 838, 0, - 484, 483, 478, 477, 472, 471, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 466, 465, 460, 459, 454, 453, 840, 839, - 486, 485, 480, 479, 474, 473, 52, 51, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 43, 468, 467, 462, 461, 456, 455, 841, 0, - 488, 487, 494, 493, 500, 499, 98, 97, 62, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 92, 91, 506, 505, 512, 511, 518, 517, 843, 842, - 490, 489, 496, 495, 502, 501, 100, 99, 64, 63, 0, 0, 0, 0, 0, 0, 0, 0, 29, 28, 94, 93, 508, 507, 514, 513, 520, 519, 844, 0, - 492, 491, 498, 497, 504, 503, 102, 101, 66, 65, 18, 0, 0, 0, 0, 0, 0, 0, 19, 30, 96, 95, 510, 509, 516, 515, 522, 521, 846, 845, - 560, 559, 554, 553, 548, 547, 542, 541, 74, 73, 33, 0, 0, 0, 0, 0, 0, 11, 68, 67, 116, 115, 536, 535, 530, 529, 524, 523, 847, 0, - 562, 561, 556, 555, 550, 549, 544, 543, 76, 75, 0, 0, 8, 7, 36, 35, 12, 0, 70, 69, 118, 117, 538, 537, 532, 531, 526, 525, 849, 848, - 564, 563, 558, 557, 552, 551, 546, 545, 78, 77, 0, 34, 10, 9, 26, 25, 0, 0, 72, 71, 120, 119, 540, 539, 534, 533, 528, 527, 850, 0, - 566, 565, 572, 571, 578, 577, 584, 583, 590, 589, 596, 595, 602, 601, 608, 607, 614, 613, 620, 619, 626, 625, 632, 631, 638, 637, 644, 643, 852, 851, - 568, 567, 574, 573, 580, 579, 586, 585, 592, 591, 598, 597, 604, 603, 610, 609, 616, 615, 622, 621, 628, 627, 634, 633, 640, 639, 646, 645, 853, 0, - 570, 569, 576, 575, 582, 581, 588, 587, 594, 593, 600, 599, 606, 605, 612, 611, 618, 617, 624, 623, 630, 629, 636, 635, 642, 641, 648, 647, 855, 854, - 728, 727, 722, 721, 716, 715, 710, 709, 704, 703, 698, 697, 692, 691, 686, 685, 680, 679, 674, 673, 668, 667, 662, 661, 656, 655, 650, 649, 856, 0, - 730, 729, 724, 723, 718, 717, 712, 711, 706, 705, 700, 699, 694, 693, 688, 687, 682, 681, 676, 675, 670, 669, 664, 663, 658, 657, 652, 651, 858, 857, - 732, 731, 726, 725, 720, 719, 714, 713, 708, 707, 702, 701, 696, 695, 690, 689, 684, 683, 678, 677, 672, 671, 666, 665, 660, 659, 654, 653, 859, 0, - 734, 733, 740, 739, 746, 745, 752, 751, 758, 757, 764, 763, 770, 769, 776, 775, 782, 781, 788, 787, 794, 793, 800, 799, 806, 805, 812, 811, 861, 860, - 736, 735, 742, 741, 748, 747, 754, 753, 760, 759, 766, 765, 772, 771, 778, 777, 784, 783, 790, 789, 796, 795, 802, 801, 808, 807, 814, 813, 862, 0, - 738, 737, 744, 743, 750, 749, 756, 755, 762, 761, 768, 767, 774, 773, 780, 779, 786, 785, 792, 791, 798, 797, 804, 803, 810, 809, 816, 815, 864, 863 -}; - -int maxiCodeSet[256] = { /* from Appendix A - ASCII character to Code Set (e.g. 2 = Set B) */ - /* set 0 refers to special characters that fit into more than one set (e.g. GS) */ - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 5, 0, 0, 0, 5, 0, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, - 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, - 5, 4, 5, 5, 5, 5, 5, 5, 4, 5, 3, 4, 3, 5, 5, 4, 4, 3, 3, 3, - 4, 3, 5, 4, 4, 3, 3, 4, 3, 3, 3, 4, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 -}; - -int maxiSymbolChar[256] = { /* from Appendix A - ASCII character to symbol value */ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 30, 28, 29, 30, 35, 32, 53, 34, 35, 36, 37, 38, 39, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 37, - 38, 39, 40, 41, 52, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 42, 43, 44, 45, 46, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 32, 54, 34, 35, 36, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 47, 48, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 36, - 37, 37, 38, 39, 40, 41, 42, 43, 38, 44, 37, 39, 38, 45, 46, 40, 41, 39, 40, 41, - 42, 42, 47, 43, 44, 43, 44, 45, 45, 46, 47, 46, 0, 1, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 32, - 33, 34, 35, 36, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 32, 33, 34, 35, 36 -}; - diff --git a/3rdparty/zint-2.4.4/backend/maxipng.h b/3rdparty/zint-2.4.4/backend/maxipng.h deleted file mode 100644 index d7beb6c..0000000 --- a/3rdparty/zint-2.4.4/backend/maxipng.h +++ /dev/null @@ -1,138 +0,0 @@ -/* maxipng.h - Shapes for Maxicode output to PNG file */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* This file contains the pixel-by-pixel representation of maxicode glyphs - at a resolution of 12 pixels per millimeter. hexagon[] is taken directly - from ISO 16023 Annex J. bullseye[] was calculated by the Gimp */ - -#define SSET "0123456789ABCDEF" - -static int hexagon[120] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, - 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, - 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static unsigned int bullseye_compressed[] = { - 0,0,0,0,0,255,248,0,0,0,0,0, - 0,0,0,0,31,255,255,192,0,0,0,0, - 0,0,0,1,255,255,255,252,0,0,0,0, - 0,0,0,7,255,255,255,255,0,0,0,0, - 0,0,0,31,255,255,255,255,192,0,0,0, - 0,0,0,127,255,255,255,255,240,0,0,0, - 0,0,1,255,255,255,255,255,252,0,0,0, - 0,0,7,255,255,255,255,255,255,0,0,0, - 0,0,15,255,255,0,7,255,255,128,0,0, - 0,0,63,255,240,0,0,127,255,224,0,0, - 0,0,127,255,128,0,0,15,255,240,0,0, - 0,0,255,252,0,0,0,1,255,248,0,0, - 0,1,255,240,0,0,0,0,127,252,0,0, - 0,3,255,224,0,0,0,0,63,254,0,0, - 0,7,255,128,0,0,0,0,15,255,0,0, - 0,15,255,0,0,0,0,0,7,255,128,0, - 0,31,252,0,0,127,240,0,1,255,192,0, - 0,63,248,0,7,255,255,0,0,255,224,0, - 0,127,240,0,63,255,255,224,0,127,240,0, - 0,127,224,0,255,255,255,248,0,63,240,0, - 0,255,192,1,255,255,255,252,0,31,248,0, - 1,255,128,7,255,255,255,255,0,15,252,0, - 1,255,0,15,255,255,255,255,128,7,252,0, - 3,255,0,63,255,255,255,255,224,7,254,0, - 3,254,0,127,255,192,31,255,240,3,254,0, - 7,252,0,255,252,0,1,255,248,1,255,0, - 7,252,1,255,240,0,0,127,252,1,255,0, - 15,248,1,255,192,0,0,31,252,0,255,128, - 15,240,3,255,128,0,0,15,254,0,127,128, - 31,240,7,255,0,0,0,7,255,0,127,192, - 31,224,7,254,0,0,0,3,255,0,63,192, - 63,224,15,252,0,0,0,1,255,128,63,224, - 63,224,31,248,0,63,192,0,255,192,63,224, - 63,192,31,240,0,255,240,0,127,192,31,224, - 63,192,63,224,3,255,252,0,63,224,31,224, - 127,192,63,224,7,255,254,0,63,224,31,240, - 127,128,63,192,15,255,255,0,31,224,15,240, - 127,128,127,192,31,255,255,128,31,240,15,240, - 127,128,127,128,63,255,255,192,15,240,15,240, - 127,128,127,128,63,255,255,192,15,240,15,240, - 255,0,127,128,127,240,255,224,15,240,7,240, - 255,0,255,128,127,192,63,224,15,248,7,240, - 255,0,255,0,255,128,31,240,7,248,7,240, - 255,0,255,0,255,128,31,240,7,248,7,240, - 255,0,255,0,255,0,15,240,7,248,7,240, - 255,0,255,0,255,0,15,240,7,248,7,240, - 255,0,255,0,255,0,15,240,7,248,7,240, - 255,0,255,0,255,0,15,240,7,248,7,240, - 255,0,255,0,255,128,31,240,7,248,7,240, - 255,0,255,0,255,128,31,240,7,248,7,240, - 255,0,255,0,127,192,63,224,7,248,7,240, - 255,0,255,128,127,240,255,224,15,248,7,240, - 255,0,127,128,63,255,255,192,15,240,7,240, - 127,128,127,128,63,255,255,192,15,240,15,240, - 127,128,127,128,31,255,255,128,15,240,15,240, - 127,128,127,192,15,255,255,0,31,240,15,240, - 127,128,63,192,7,255,254,0,31,224,15,240, - 127,192,63,224,3,255,252,0,63,224,31,240, - 63,192,63,224,0,255,240,0,63,224,31,224, - 63,192,31,240,0,63,192,0,127,192,31,224, - 63,224,31,248,0,0,0,0,255,192,63,224, - 63,224,15,252,0,0,0,1,255,128,63,224, - 31,224,7,254,0,0,0,3,255,0,63,192, - 31,240,7,255,0,0,0,7,255,0,127,192, - 15,240,3,255,128,0,0,15,254,0,127,128, - 15,248,1,255,192,0,0,31,252,0,255,128, - 7,252,1,255,240,0,0,127,252,1,255,0, - 7,252,0,255,252,0,1,255,248,1,255,0, - 3,254,0,127,255,192,31,255,240,3,254,0, - 3,255,0,63,255,255,255,255,224,7,254,0, - 1,255,0,15,255,255,255,255,128,7,252,0, - 1,255,128,7,255,255,255,255,0,15,252,0, - 0,255,192,1,255,255,255,252,0,31,248,0, - 0,127,224,0,255,255,255,248,0,63,240,0, - 0,127,240,0,63,255,255,224,0,127,240,0, - 0,63,248,0,7,255,255,0,0,255,224,0, - 0,31,252,0,0,127,240,0,1,255,192,0, - 0,15,255,0,0,0,0,0,7,255,128,0, - 0,7,255,128,0,0,0,0,15,255,0,0, - 0,3,255,224,0,0,0,0,63,254,0,0, - 0,1,255,240,0,0,0,0,127,252,0,0, - 0,0,255,252,0,0,0,1,255,248,0,0, - 0,0,127,255,128,0,0,15,255,240,0,0, - 0,0,63,255,240,0,0,127,255,224,0,0, - 0,0,15,255,255,0,7,255,255,128,0,0, - 0,0,7,255,255,255,255,255,255,0,0,0, - 0,0,1,255,255,255,255,255,252,0,0,0, - 0,0,0,127,255,255,255,255,240,0,0,0, - 0,0,0,31,255,255,255,255,192,0,0,0, - 0,0,0,7,255,255,255,255,0,0,0,0, - 0,0,0,1,255,255,255,252,0,0,0,0, - 0,0,0,0,31,255,255,192,0,0,0,0, - 0,0,0,0,0,255,248,0,0,0,0,0 -}; - diff --git a/3rdparty/zint-2.4.4/backend/medical.c b/3rdparty/zint-2.4.4/backend/medical.c deleted file mode 100644 index e26c410..0000000 --- a/3rdparty/zint-2.4.4/backend/medical.c +++ /dev/null @@ -1,308 +0,0 @@ -/* medical.c - Handles 1 track and 2 track pharmacode and Codabar */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#include "common.h" - -extern int c39(struct zint_symbol *symbol, unsigned char source[], int length); -/* Codabar table checked against EN 798:1995 */ - -#define CALCIUM "0123456789-$:/.+ABCD" - -static char *CodaTable[20] = {"11111221", "11112211", "11121121", "22111111", "11211211", "21111211", - "12111121", "12112111", "12211111", "21121111", "11122111", "11221111", "21112121", "21211121", - "21212111", "11212121", "11221211", "12121121", "11121221", "11122211"}; - -int pharma_one(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* "Pharmacode can represent only a single integer from 3 to 131070. Unlike other - commonly used one-dimensional barcode schemes, pharmacode does not store the data in a - form corresponding to the human-readable digits; the number is encoded in binary, rather - than decimal. Pharmacode is read from right to left: with n as the bar position starting - at 0 on the right, each narrow bar adds 2n to the value and each wide bar adds 2(2^n). - The minimum barcode is 2 bars and the maximum 16, so the smallest number that could - be encoded is 3 (2 narrow bars) and the biggest is 131070 (16 wide bars)." - - http://en.wikipedia.org/wiki/Pharmacode */ - - /* This code uses the One Track Pharamacode calculating algorithm as recommended by - the specification at http://www.laetus.com/laetus.php?request=file&id=69 */ - - unsigned long int tester; - int counter, error_number, h; - char inter[18] = { 0 }; /* 131070 -> 17 bits */ - char dest[64]; /* 17 * 2 + 1 */ - - error_number = 0; - - if(length > 6) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - tester = atoi((char*)source); - - if((tester < 3) || (tester > 131070)) { - strcpy(symbol->errtxt, "Data out of range"); - return ERROR_INVALID_DATA1; - } - - do - { - if(!(tester & 1)) { - concat(inter, "W"); - tester = (tester - 2) / 2; - } else { - concat(inter, "N"); - tester = (tester - 1) / 2; - } - } - while(tester != 0); - - h = strlen(inter) - 1; - *dest = '\0'; - for(counter = h; counter >= 0; counter--) { - if(inter[counter] == 'W') { - concat(dest, "32"); - } else { - concat(dest, "12"); - } - } - - expand(symbol, dest); - - return error_number; -} - -int pharma_two_calc(struct zint_symbol *symbol, unsigned char source[], char dest[]) -{ - /* This code uses the Two Track Pharamacode defined in the document at - http://www.laetus.com/laetus.php?request=file&id=69 and using a modified - algorithm from the One Track system. This standard accepts integet values - from 4 to 64570080. */ - - unsigned long int tester; - int counter, h; - char inter[17]; - int error_number; - - tester = atoi((char*)source); - - if((tester < 4) || (tester > 64570080)) - { - strcpy(symbol->errtxt, "Data out of range"); - return ERROR_INVALID_DATA1; - } - error_number = 0; - strcpy(inter, ""); - do - { - switch(tester%3) { - case 0: - concat(inter, "3"); - tester = (tester - 3) / 3; - break; - case 1: - concat(inter, "1"); - tester = (tester - 1) / 3; - break; - case 2: - concat(inter, "2"); - tester = (tester - 2) / 3; - break; - } - } - while(tester != 0); - - h = strlen(inter) - 1; - for(counter = h; counter >= 0; counter--) - { - dest[h - counter] = inter[counter]; - } - dest[h + 1] = '\0'; - - return error_number; -} - -int pharma_two(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Draws the patterns for two track pharmacode */ - char height_pattern[200]; - unsigned int loopey, h; - int writer; - int error_number = 0; - strcpy(height_pattern, ""); - - if(length > 8) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - error_number = pharma_two_calc(symbol, source, height_pattern); - if(error_number != 0) { - return error_number; - } - - writer = 0; - h = strlen(height_pattern); - for(loopey = 0; loopey < h; loopey++) - { - if((height_pattern[loopey] == '2') || (height_pattern[loopey] == '3')) - { - set_module(symbol, 0, writer); - } - if((height_pattern[loopey] == '1') || (height_pattern[loopey] == '3')) - { - set_module(symbol, 1, writer); - } - writer += 2; - } - symbol->rows = 2; - symbol->width = writer - 1; - - - return error_number; -} - -int codabar(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* The Codabar system consisting of simple substitution */ - - int i, error_number; - char dest[512]; - - error_number = 0; - strcpy(dest, ""); - - if(length > 60) { /* No stack smashing please */ - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - to_upper(source); - error_number = is_sane(CALCIUM, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - /* Codabar must begin and end with the characters A, B, C or D */ - if((source[0] != 'A') && (source[0] != 'B') && (source[0] != 'C') && (source[0] != 'D')) - { - strcpy(symbol->errtxt, "Invalid characters in data"); - return ERROR_INVALID_DATA1; - } - - if((source[length - 1] != 'A') && (source[length - 1] != 'B') && - (source[length - 1] != 'C') && (source[length - 1] != 'D')) - { - strcpy(symbol->errtxt, "Invalid characters in data"); - return ERROR_INVALID_DATA1; - } - - for(i = 0; i < length; i++) - { - lookup(CALCIUM, CodaTable, source[i], dest); - } - - expand(symbol, dest); - ustrcpy(symbol->text, source); - return error_number; -} - -int code32(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Italian Pharmacode */ - int i, zeroes, error_number, checksum, checkpart, checkdigit; - char localstr[10], risultante[7]; - long int pharmacode, remainder, devisor; - int codeword[6]; - char tabella[34]; - - /* Validate the input */ - if(length > 8) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - /* Add leading zeros as required */ - zeroes = 8 - length; - memset(localstr, '0', zeroes); - strcpy(localstr + zeroes, (char*)source); - - /* Calculate the check digit */ - checksum = 0; - checkpart = 0; - for(i = 0; i < 4; i++) { - checkpart = ctoi(localstr[i * 2]); - checksum += checkpart; - checkpart = 2 * (ctoi(localstr[(i * 2) + 1])); - if(checkpart >= 10) { - checksum += (checkpart - 10) + 1; - } else { - checksum += checkpart; - } - } - - /* Add check digit to data string */ - checkdigit = checksum % 10; - localstr[8] = itoc(checkdigit); - localstr[9] = '\0'; - - /* Convert string into an integer value */ - pharmacode = atoi(localstr); - - /* Convert from decimal to base-32 */ - devisor = 33554432; - for(i = 5; i >= 0; i--) { - codeword[i] = pharmacode / devisor; - remainder = pharmacode % devisor; - pharmacode = remainder; - devisor /= 32; - } - - /* Look up values in 'Tabella di conversione' */ - strcpy(tabella, "0123456789BCDFGHJKLMNPQRSTUVWXYZ"); - for(i = 5; i >= 0; i--) { - risultante[5 - i] = tabella[codeword[i]]; - } - risultante[6] = '\0'; - /* Plot the barcode using Code 39 */ - error_number = c39(symbol, (unsigned char*)risultante, strlen(risultante)); - if(error_number != 0) { return error_number; } - - /* Override the normal text output with the Pharmacode number */ - ustrcpy(symbol->text, (unsigned char*)"A"); - uconcat(symbol->text, (unsigned char*)localstr); - - return error_number; -} diff --git a/3rdparty/zint-2.4.4/backend/ms_stdint.h b/3rdparty/zint-2.4.4/backend/ms_stdint.h deleted file mode 100644 index 76987ab..0000000 --- a/3rdparty/zint-2.4.4/backend/ms_stdint.h +++ /dev/null @@ -1,234 +0,0 @@ -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -/* @(#) $Id: ms_stdint.h,v 1.1 2009/09/19 08:16:21 hooper114 Exp $ */ - -#ifndef _MSC_VER // [ -#error "Use this header only with Microsoft Visual C++ compilers!" -#endif // _MSC_VER ] - -#ifndef _MSC_STDINT_H_ // [ -#define _MSC_STDINT_H_ - -#if _MSC_VER > 1000 -#pragma once -#endif - -#include - -// For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#if (_MSC_VER < 1300) && defined(__cplusplus) - extern "C++" { -#endif -# include -#if (_MSC_VER < 1300) && defined(__cplusplus) - } -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types -typedef __int8 int8_t; -typedef __int16 int16_t; -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - - -#endif // _MSC_STDINT_H_ ] diff --git a/3rdparty/zint-2.4.4/backend/pdf417.c b/3rdparty/zint-2.4.4/backend/pdf417.c deleted file mode 100644 index 91d47e6..0000000 --- a/3rdparty/zint-2.4.4/backend/pdf417.c +++ /dev/null @@ -1,1069 +0,0 @@ -/* pdf417.c - Handles PDF417 stacked symbology */ - -/* Zint - A barcode generating program using libpng - Copyright (C) 2008 Robin Stuart - Portions Copyright (C) 2004 Grandzebu - Bug Fixes thanks to KL Chin - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* This code is adapted from "Code barre PDF 417 / PDF 417 barcode" v2.5.0 - which is Copyright (C) 2004 (Grandzebu). - The original code can be downloaded from http://grandzebu.net/index.php */ - -/* NOTE: symbol->option_1 is used to specify the security level (i.e. control the - number of check codewords) - - symbol->option_2 is used to adjust the width of the resulting symbol (i.e. the - number of codeword columns not including row start and end data) */ - -/* @(#) $Id: pdf417.c,v 1.21 2010/01/28 17:55:59 hooper114 Exp $ */ - -#include -#include -#include -#include -#ifndef _MSC_VER -#include -#else -#include -#include "ms_stdint.h" -#endif -#include "pdf417.h" -#include "common.h" -#include "large.h" - -/* - Three figure numbers in comments give the location of command equivalents in the - original Visual Basic source code file pdf417.frm - this code retains some original (French) procedure and variable names to ease conversion */ - -/* text mode processing tables */ - -static int asciix[95] = { 7, 8, 8, 4, 12, 4, 4, 8, 8, 8, 12, 4, 12, 12, 12, 12, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 12, 8, 8, 4, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 8, 8, 8, 4, 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 8, 8, 8, 8 }; - -static int asciiy[95] = { 26, 10, 20, 15, 18, 21, 10, 28, 23, 24, 22, 20, 13, 16, 17, 19, 0, 1, 2, 3, - 4, 5, 6, 7, 8, 9, 14, 0, 1, 23, 2, 25, 3, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 4, 5, 6, 24, 7, 8, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, - 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 21, 27, 9 }; - -/* Automatic sizing table */ - -static int MicroAutosize[56] = -{ 4, 6, 7, 8, 10, 12, 13, 14, 16, 18, 19, 20, 24, 29, 30, 33, 34, 37, 39, 46, 54, 58, 70, 72, 82, 90, 108, 126, - 1, 14, 2, 7, 3, 25, 8, 16, 5, 17, 9, 6, 10, 11, 28, 12, 19, 13, 29, 20, 30, 21, 22, 31, 23, 32, 33, 34 -}; - -int liste[2][1000]; /* global - okay, so I got _almost_ everything local! */ - -/* 866 */ - -int quelmode(char codeascii) -{ - int mode = BYT; - if ((codeascii == '\t') || (codeascii == '\n') || (codeascii == '\r') || ((codeascii >= ' ') && (codeascii <= '~'))) { mode = TEX; } - else if((codeascii >= '0') && (codeascii <= '9')) { mode = NUM; } - /* 876 */ - - return mode; -} - -/* 844 */ -void regroupe(int *indexliste) -{ - int i, j; - - /* bring together same type blocks */ - if(*(indexliste) > 1) { - i = 1; - while(i < *(indexliste)) { - if(liste[1][i - 1] == liste[1][i]) { - /* bring together */ - liste[0][i - 1] = liste[0][i - 1] + liste[0][i]; - j = i + 1; - - /* decreace the list */ - while(j < *(indexliste)) { - liste[0][j - 1] = liste[0][j]; - liste[1][j - 1] = liste[1][j]; - j++; - } - *(indexliste) = *(indexliste) - 1; - i--; - } - i++; - } - } - /* 865 */ -} - -/* 478 */ -void pdfsmooth(int *indexliste) -{ - int i, crnt, last, next, length; - - for(i = 0; i < *(indexliste); i++) { - crnt = liste[1][i]; - length = liste[0][i]; - if(i != 0) { last = liste[1][i - 1]; } else { last = FALSE; } - if(i != *(indexliste) - 1) { next = liste[1][i + 1]; } else { next = FALSE; } - - if(crnt == NUM) { - if(i == 0) { /* first block */ - if(*(indexliste) > 1) { /* and there are others */ - if((next == TEX) && (length < 8)) { liste[1][i] = TEX;} - if((next == BYT) && (length == 1)) { liste[1][i] = BYT; } - } - } else { - if(i == *(indexliste) - 1) { /* last block */ - if((last == TEX) && (length < 7)) { liste[1][i] = TEX; } - if((last == BYT) && (length == 1)) { liste[1][i] = BYT; } - } else { /* not first or last block */ - if(((last == BYT) && (next == BYT)) && (length < 4)) { liste[1][i] = BYT; } - if(((last == BYT) && (next == TEX)) && (length < 4)) { liste[1][i] = TEX; } - if(((last == TEX) && (next == BYT)) && (length < 5)) { liste[1][i] = TEX; } - if(((last == TEX) && (next == TEX)) && (length < 8)) { liste[1][i] = TEX; } - } - } - } - } - regroupe(indexliste); - /* 520 */ - for(i = 0; i < *(indexliste); i++) { - crnt = liste[1][i]; - length = liste[0][i]; - if(i != 0) { last = liste[1][i - 1]; } else { last = FALSE; } - if(i != *(indexliste) - 1) { next = liste[1][i + 1]; } else { next = FALSE; } - - if((crnt == TEX) && (i > 0)) { /* not the first */ - if(i == *(indexliste) - 1) { /* the last one */ - if((last == BYT) && (length == 1)) { liste[1][i] = BYT; } - } else { /* not the last one */ - if(((last == BYT) && (next == BYT)) && (length < 5)) { liste[1][i] = BYT; } - if((((last == BYT) && (next != BYT)) || ((last != BYT) && (next == BYT))) && (length < 3)) { - liste[1][i] = BYT; - } - } - } - } - /* 540 */ - regroupe(indexliste); -} - -/* 547 */ -void textprocess(int *chainemc, int *mclength, char chaine[], int start, int length, int block) -{ - int j, indexlistet, curtable, listet[2][5000], chainet[5000], wnet; - char codeascii; - - codeascii = 0; - wnet = 0; - - for(j = 0; j < 1000; j++) { - listet[0][j] = 0; - } - /* listet will contain the table numbers and the value of each characters */ - for(indexlistet = 0; indexlistet < length; indexlistet++) { - codeascii = chaine[start + indexlistet]; - switch(codeascii) { - case '\t': listet[0][indexlistet] = 12; listet[1][indexlistet] = 12; break; - case '\n': listet[0][indexlistet] = 8; listet[1][indexlistet] = 15; break; - case 13: listet[0][indexlistet] = 12; listet[1][indexlistet] = 11; break; - default: listet[0][indexlistet] = asciix[codeascii - 32]; - listet[1][indexlistet] = asciiy[codeascii - 32]; break; - } - } - - /* 570 */ - curtable = 1; /* default table */ - for(j = 0; j < length; j++) { - if(listet[0][j] & curtable) { /* The character is in the current table */ - chainet[wnet] = listet[1][j]; - wnet++; - } else { /* Obliged to change table */ - int flag = FALSE; /* True if we change table for only one character */ - if (j == (length - 1)) { - flag = TRUE; - } else { - if(!(listet[0][j] & listet[0][j + 1])) { flag = TRUE; } - } - - if (flag) { /* we change only one character - look for temporary switch */ - if((listet[0][j] & 1) && (curtable == 2)) { /* T_UPP */ - chainet[wnet] = 27; - chainet[wnet + 1] = listet[1][j]; - wnet += 2; - } - if(listet[0][j] & 8) { /* T_PUN */ - chainet[wnet] = 29; - chainet[wnet + 1] = listet[1][j]; - wnet += 2; - } - if(!(((listet[0][j] & 1) && (curtable == 2)) || (listet[0][j] & 8))) { - /* No temporary switch available */ - flag = FALSE; - } - } - - /* 599 */ - if (!(flag)) { - int newtable; - - if(j == (length - 1)) { - newtable = listet[0][j]; - } else { - if(!(listet[0][j] & listet[0][j + 1])) { - newtable = listet[0][j]; - } else { - newtable = listet[0][j] & listet[0][j + 1]; - } - } - - /* Maintain the first if several tables are possible */ - switch (newtable) { - case 3: - case 5: - case 7: - case 9: - case 11: - case 13: - case 15: - newtable = 1; break; - case 6: - case 10: - case 14: - newtable = 2; break; - case 12: - newtable = 4; break; - } - - /* 619 - select the switch */ - switch (curtable) { - case 1: - switch (newtable) { - case 2: chainet[wnet] = 27; wnet++; break; - case 4: chainet[wnet] = 28; wnet++; break; - case 8: chainet[wnet] = 28; wnet++; chainet[wnet] = 25; wnet++; break; - } break; - case 2: - switch (newtable) { - case 1: chainet[wnet] = 28; wnet++; chainet[wnet] = 28; wnet++; break; - case 4: chainet[wnet] = 28; wnet++; break; - case 8: chainet[wnet] = 28; wnet++; chainet[wnet] = 25; wnet++; break; - } break; - case 4: - switch (newtable) { - case 1: chainet[wnet] = 28; wnet++; break; - case 2: chainet[wnet] = 27; wnet++; break; - case 8: chainet[wnet] = 25; wnet++; break; - } break; - case 8: - switch (newtable) { - case 1: chainet[wnet] = 29; wnet++; break; - case 2: chainet[wnet] = 29; wnet++; chainet[wnet] = 27; wnet++; break; - case 4: chainet[wnet] = 29; wnet++; chainet[wnet] = 28; wnet++; break; - } break; - } - curtable = newtable; - /* 659 - at last we add the character */ - chainet[wnet] = listet[1][j]; - wnet++; - } - } - } - - /* 663 */ - if (wnet & 1) { - chainet[wnet] = 29; - wnet++; - } - /* Now translate the string chainet into codewords */ - chainemc[*(mclength)] = 900; - *(mclength) = *(mclength) + 1; - - for(j = 0; j < wnet; j+= 2) { - int cw_number; - - cw_number = (30 * chainet[j]) + chainet[j + 1]; - chainemc[*(mclength)] = cw_number; - *(mclength) = *(mclength) + 1; - - } -} - -/* 671 */ -void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block) -{ - int debug = 0; - int len = 0; - unsigned int chunkLen = 0; - uint64_t mantisa = 0ULL; - uint64_t total = 0ULL; - - if(debug) printf("\nEntering byte mode at position %d\n", start); - - if(length == 1) { - chainemc[(*mclength)++] = 913; - chainemc[(*mclength)++] = chaine[start]; - if(debug) { printf("913 %d\n", chainemc[*mclength - 1]); } - } else { - /* select the switch for multiple of 6 bytes */ - if (length % 6 == 0) { - chainemc[(*mclength)++] = 924; - if(debug) printf("924 "); - } else { - chainemc[(*mclength)++] = 901; - if(debug) printf("901 "); - } - - while (len < length) - { - chunkLen = length - len; - if (6 <= chunkLen) /* Take groups of 6 */ - { - chunkLen = 6; - len += chunkLen; - total = 0ULL; - - while (chunkLen--) - { - mantisa = chaine[start++]; - total |= mantisa << (uint64_t)(chunkLen * 8ULL); - } - - chunkLen = 5; - - while (chunkLen--) - { - chainemc[*mclength + chunkLen] = (int)(total % 900ULL); - total /= 900ULL; - } - *mclength += 5; - } - else /* If it remain a group of less than 6 bytes */ - { - len += chunkLen; - while (chunkLen--) - { - chainemc[(*mclength)++] = chaine[start++]; - } - } - } - } -} - -/* 712 */ -void numbprocess(int *chainemc, int *mclength, char chaine[], int start, int length, int block) -{ - int j, loop, longueur, dummy[100], dumlength, diviseur, nombre; - char chainemod[50], chainemult[100], temp; - - strcpy(chainemod, ""); - for(loop = 0; loop <= 50; loop++) { - dummy[loop] = 0; - } - - chainemc[*(mclength)] = 902; - *(mclength) = *(mclength) + 1; - - j = 0; - while(j < length) { - dumlength = 0; - strcpy(chainemod, ""); - longueur = length - j; - if(longueur > 44) { longueur = 44; } - concat(chainemod, "1"); - for(loop = 1; loop <= longueur; loop++) { - chainemod[loop] = chaine[start + loop + j - 1]; - } - chainemod[longueur + 1] = '\0'; - do { - diviseur = 900; - - /* 877 - gosub Modulo */ - strcpy(chainemult, ""); - nombre = 0; - while(strlen(chainemod) != 0) { - nombre *= 10; - nombre += ctoi(chainemod[0]); - for(loop = 0; loop < strlen(chainemod); loop++) { - chainemod[loop] = chainemod[loop + 1]; - } - if (nombre < diviseur) { - if (strlen(chainemult) != 0) { concat(chainemult, "0"); } - } else { - temp = (nombre / diviseur) + '0'; - chainemult[strlen(chainemult) + 1] = '\0'; - chainemult[strlen(chainemult)] = temp; - } - nombre = nombre % diviseur; - } - diviseur = nombre; - /* return to 723 */ - - for(loop = dumlength; loop > 0; loop--) { - dummy[loop] = dummy[loop - 1]; - } - dummy[0] = diviseur; - dumlength++; - strcpy(chainemod, chainemult); - } while(strlen(chainemult) != 0); - for(loop = 0; loop < dumlength; loop++) { - chainemc[*(mclength)] = dummy[loop]; - *(mclength) = *(mclength) + 1; - } - j += longueur; - } -} - -/* 366 */ -int pdf417(struct zint_symbol *symbol, unsigned char chaine[], int length) -{ - int i, k, j, indexchaine, indexliste, mode, longueur, loop, mccorrection[520], offset; - int total, chainemc[2700], mclength, c1, c2, c3, dummy[35], codeerr; - char codebarre[140], pattern[580]; - int debug = 0; - - codeerr = 0; - - /* 456 */ - indexliste = 0; - indexchaine = 0; - - mode = quelmode(chaine[indexchaine]); - - for(i = 0; i < 1000; i++) { - liste[0][i] = 0; - } - - /* 463 */ - do { - liste[1][indexliste] = mode; - while ((liste[1][indexliste] == mode) && (indexchaine < length)) { - liste[0][indexliste]++; - indexchaine++; - mode = quelmode(chaine[indexchaine]); - } - indexliste++; - } while (indexchaine < length); - - /* 474 */ - pdfsmooth(&indexliste); - - if(debug) { - printf("Initial block pattern:\n"); - for(i = 0; i < indexliste; i++) { - printf("Len: %d Type: ", liste[0][i]); - switch(liste[1][i]) { - case TEX: printf("Text\n"); break; - case BYT: printf("Byte\n"); break; - case NUM: printf("Number\n"); break; - default: printf("ERROR\n"); break; - } - } - } - - /* 541 - now compress the data */ - indexchaine = 0; - mclength = 0; - if(symbol->output_options & READER_INIT) { - chainemc[mclength] = 921; /* Reader Initialisation */ - mclength++; - } - for(i = 0; i < indexliste; i++) { - switch(liste[1][i]) { - case TEX: /* 547 - text mode */ - textprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i); - break; - case BYT: /* 670 - octet stream mode */ - byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i); - break; - case NUM: /* 712 - numeric mode */ - numbprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i); - break; - } - indexchaine = indexchaine + liste[0][i]; - } - - if(debug) { - printf("\nCompressed data stream:\n"); - for(i = 0; i < mclength; i++) { - printf("%d ", chainemc[i]); - } - printf("\n\n"); - } - - /* 752 - Now take care of the number of CWs per row */ - if (symbol->option_1 < 0) { - symbol->option_1 = 6; - if(mclength <= 863) { symbol->option_1 = 5; } - if(mclength <= 320) { symbol->option_1 = 4; } - if(mclength <= 160) { symbol->option_1 = 3; } - if(mclength <= 40) { symbol->option_1 = 2; } - } - k = 1; - for(loop = 1; loop <= (symbol->option_1 + 1); loop++) - { - k *= 2; - } - longueur = mclength; - if(symbol->option_2 > 30) { symbol->option_2 = 30; } - if(symbol->option_2 < 1) { - symbol->option_2 = 0.5 + sqrt((longueur + k) / 3.0); - } - if(((longueur + k) / symbol->option_2) > 90) { - /* stop the symbol from becoming too high */ - symbol->option_2 = symbol->option_2 + 1; - } - - if(longueur + k > 928) { - /* Enforce maximum codeword limit */ - return 2; - } - - if(((longueur + k) / symbol->option_2) > 90) { - return 4; - } - - /* 781 - Padding calculation */ - longueur = mclength + 1 + k; - i = 0; - if ((longueur / symbol->option_2) < 3) { - i = (symbol->option_2 * 3) - longueur; /* A bar code must have at least three rows */ - } else { - if((longueur % symbol->option_2) > 0) { i = symbol->option_2 - (longueur % symbol->option_2); } - } - /* We add the padding */ - while (i > 0) { - chainemc[mclength] = 900; - mclength++; - i--; - } - /* we add the length descriptor */ - for(i = mclength; i > 0; i--) { - chainemc[i] = chainemc[i - 1]; - } - chainemc[0] = mclength + 1; - mclength++; - - /* 796 - we now take care of the Reed Solomon codes */ - switch(symbol->option_1) { - case 1: offset = 2; break; - case 2: offset = 6; break; - case 3: offset = 14; break; - case 4: offset = 30; break; - case 5: offset = 62; break; - case 6: offset = 126; break; - case 7: offset = 254; break; - case 8: offset = 510; break; - default: offset = 0; break; - } - - longueur = mclength; - for(loop = 0; loop < 520; loop++) { - mccorrection[loop] = 0; - } - total = 0; - for(i = 0; i < longueur; i++) { - total = (chainemc[i] + mccorrection[k - 1]) % 929; - for(j = k - 1; j > 0; j--) { - mccorrection[j] = (mccorrection[j - 1] + 929 - (total * coefrs[offset + j]) % 929) % 929; - } - mccorrection[0] = (929 - (total * coefrs[offset + j]) % 929) % 929; - } - - /* we add these codes to the string */ - for(i = k - 1; i >= 0; i--) { - chainemc[mclength++] = mccorrection[i] ? 929 - mccorrection[i] : 0; - } - - /* 818 - The CW string is finished */ - c1 = (mclength / symbol->option_2 - 1) / 3; - c2 = symbol->option_1 * 3 + (mclength / symbol->option_2 - 1) % 3; - c3 = symbol->option_2 - 1; - - /* we now encode each row */ - for(i = 0; i <= (mclength / symbol->option_2) - 1; i++) { - for(j = 0; j < symbol->option_2 ; j++) { - dummy[j + 1] = chainemc[i * symbol->option_2 + j]; - } - k = (i / 3) * 30; - switch(i % 3) { - /* follows this pattern from US Patent 5,243,655: - Row 0: L0 (row #, # of rows) R0 (row #, # of columns) - Row 1: L1 (row #, security level) R1 (row #, # of rows) - Row 2: L2 (row #, # of columns) R2 (row #, security level) - Row 3: L3 (row #, # of rows) R3 (row #, # of columns) - etc. */ - case 0: - dummy[0] = k + c1; - dummy[symbol->option_2 + 1] = k + c3; - break; - case 1: - dummy[0] = k + c2; - dummy[symbol->option_2 + 1] = k + c1; - break; - case 2: - dummy[0] = k + c3; - dummy[symbol->option_2 + 1] = k + c2; - break; - } - strcpy(codebarre, "+*"); /* Start with a start char and a separator */ - if(symbol->symbology == BARCODE_PDF417TRUNC) { - /* truncated - so same as before except knock off the last 5 chars */ - for(j = 0; j <= symbol->option_2; j++) { - switch(i % 3) { - case 1: offset = 929; break; - case 2: offset = 1858; break; - default: offset = 0; break; - } - concat(codebarre, codagemc[offset + dummy[j]]); - concat(codebarre, "*"); - } - } else { - /* normal PDF417 symbol */ - for(j = 0; j <= symbol->option_2 + 1; j++) { - switch(i % 3) { - case 1: offset = 929; /* cluster(3) */ break; - case 2: offset = 1858; /* cluster(6) */ break; - default: offset = 0; /* cluster(0) */ break; - } - concat(codebarre, codagemc[offset + dummy[j]]); - concat(codebarre, "*"); - } - concat(codebarre, "-"); - } - - strcpy(pattern, ""); - for(loop = 0; loop < strlen(codebarre); loop++) { - lookup(BRSET, PDFttf, codebarre[loop], pattern); - } - for(loop = 0; loop < strlen(pattern); loop++) { - if(pattern[loop] == '1') { set_module(symbol, i, loop); } - } - if(symbol->height == 0) { - symbol->row_height[i] = 3; - } - } - symbol->rows = (mclength / symbol->option_2); - symbol->width = strlen(pattern); - - /* 843 */ - return codeerr; -} - -/* 345 */ -int pdf417enc(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int codeerr, error_number; - - error_number = 0; - - if((symbol->option_1 < -1) || (symbol->option_1 > 8)) { - strcpy(symbol->errtxt, "Security value out of range"); - symbol->option_1 = -1; - error_number = WARN_INVALID_OPTION; - } - if((symbol->option_2 < 0) || (symbol->option_2 > 30)) { - strcpy(symbol->errtxt, "Number of columns out of range"); - symbol->option_2 = 0; - error_number = WARN_INVALID_OPTION; - } - - /* 349 */ - codeerr = pdf417(symbol, source, length); - - /* 352 */ - if(codeerr != 0) { - switch(codeerr) { - case 1: - strcpy(symbol->errtxt, "No such file or file unreadable"); - error_number = ERROR_INVALID_OPTION; - break; - case 2: - strcpy(symbol->errtxt, "Input string too long"); - error_number = ERROR_TOO_LONG; - break; - case 3: - strcpy(symbol->errtxt, "Number of codewords per row too small"); - error_number = WARN_INVALID_OPTION; - break; - case 4: - strcpy(symbol->errtxt, "Data too long for specified number of columns"); - error_number = ERROR_TOO_LONG; - break; - default: - strcpy(symbol->errtxt, "Something strange happened"); - error_number = ERROR_ENCODING_PROBLEM; - break; - } - } - - /* 364 */ - return error_number; -} - - -int micro_pdf417(struct zint_symbol *symbol, unsigned char chaine[], int length) -{ /* like PDF417 only much smaller! */ - - int i, k, j, indexchaine, indexliste, mode, longueur, mccorrection[50], offset; - int total, chainemc[2700], mclength, dummy[5], codeerr; - char codebarre[100], pattern[580]; - int variant, LeftRAPStart, CentreRAPStart, RightRAPStart, StartCluster; - int LeftRAP, CentreRAP, RightRAP, Cluster, writer, flip, loop; - int debug = 0; - - /* Encoding starts out the same as PDF417, so use the same code */ - codeerr = 0; - - /* 456 */ - indexliste = 0; - indexchaine = 0; - - mode = quelmode(chaine[indexchaine]); - - for(i = 0; i < 1000; i++) { - liste[0][i] = 0; - } - - /* 463 */ - do { - liste[1][indexliste] = mode; - while ((liste[1][indexliste] == mode) && (indexchaine < length)) { - liste[0][indexliste]++; - indexchaine++; - mode = quelmode(chaine[indexchaine]); - } - indexliste++; - } while (indexchaine < length); - - /* 474 */ - pdfsmooth(&indexliste); - - if(debug) { - printf("Initial mapping:\n"); - for(i = 0; i < indexliste; i++) { - printf("len: %d type: ", liste[0][i]); - switch(liste[1][i]) { - case TEX: printf("TEXT\n"); break; - case BYT: printf("BYTE\n"); break; - case NUM: printf("NUMBER\n"); break; - default: printf("*ERROR*\n"); break; - } - } - } - - /* 541 - now compress the data */ - indexchaine = 0; - mclength = 0; - if(symbol->output_options & READER_INIT) { - chainemc[mclength] = 921; /* Reader Initialisation */ - mclength++; - } - for(i = 0; i < indexliste; i++) { - switch(liste[1][i]) { - case TEX: /* 547 - text mode */ - textprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i); - break; - case BYT: /* 670 - octet stream mode */ - byteprocess(chainemc, &mclength, chaine, indexchaine, liste[0][i], i); - break; - case NUM: /* 712 - numeric mode */ - numbprocess(chainemc, &mclength, (char*)chaine, indexchaine, liste[0][i], i); - break; - } - indexchaine = indexchaine + liste[0][i]; - } - - /* This is where it all changes! */ - - if(mclength > 126) { - strcpy(symbol->errtxt, "Input data too long"); - return ERROR_TOO_LONG; - } - if(symbol->option_2 > 4) { - strcpy(symbol->errtxt, "Specified width out of range"); - symbol->option_2 = 0; - codeerr = WARN_INVALID_OPTION; - } - - if(debug) { - printf("\nEncoded Data Stream:\n"); - for(i = 0; i < mclength; i++) { - printf("0x%02X ", chainemc[i]); - } - printf("\n"); - } - - /* Now figure out which variant of the symbol to use and load values accordingly */ - - variant = 0; - - if((symbol->option_2 == 1) && (mclength > 20)) { - /* the user specified 1 column but the data doesn't fit - go to automatic */ - symbol->option_2 = 0; - strcpy(symbol->errtxt, "Specified symbol size too small for data"); - codeerr = WARN_INVALID_OPTION; - } - - if((symbol->option_2 == 2) && (mclength > 37)) { - /* the user specified 2 columns but the data doesn't fit - go to automatic */ - symbol->option_2 = 0; - strcpy(symbol->errtxt, "Specified symbol size too small for data"); - codeerr = WARN_INVALID_OPTION; - } - - if((symbol->option_2 == 3) && (mclength > 82)) { - /* the user specified 3 columns but the data doesn't fit - go to automatic */ - symbol->option_2 = 0; - strcpy(symbol->errtxt, "Specified symbol size too small for data"); - codeerr = WARN_INVALID_OPTION; - } - - if(symbol->option_2 == 1) { - /* the user specified 1 column and the data does fit */ - variant = 6; - if(mclength <= 16) { variant = 5; } - if(mclength <= 12) { variant = 4; } - if(mclength <= 10) { variant = 3; } - if(mclength <= 7) { variant = 2; } - if(mclength <= 4) { variant = 1; } - } - - if(symbol->option_2 == 2) { - /* the user specified 2 columns and the data does fit */ - variant = 13; - if(mclength <= 33) { variant = 12; } - if(mclength <= 29) { variant = 11; } - if(mclength <= 24) { variant = 10; } - if(mclength <= 19) { variant = 9; } - if(mclength <= 13) { variant = 8; } - if(mclength <= 8) { variant = 7; } - } - - if(symbol->option_2 == 3) { - /* the user specified 3 columns and the data does fit */ - variant = 23; - if(mclength <= 70) { variant = 22; } - if(mclength <= 58) { variant = 21; } - if(mclength <= 46) { variant = 20; } - if(mclength <= 34) { variant = 19; } - if(mclength <= 24) { variant = 18; } - if(mclength <= 18) { variant = 17; } - if(mclength <= 14) { variant = 16; } - if(mclength <= 10) { variant = 15; } - if(mclength <= 6) { variant = 14; } - } - - if(symbol->option_2 == 4) { - /* the user specified 4 columns and the data does fit */ - variant = 34; - if(mclength <= 108) { variant = 33; } - if(mclength <= 90) { variant = 32; } - if(mclength <= 72) { variant = 31; } - if(mclength <= 54) { variant = 30; } - if(mclength <= 39) { variant = 29; } - if(mclength <= 30) { variant = 28; } - if(mclength <= 24) { variant = 27; } - if(mclength <= 18) { variant = 26; } - if(mclength <= 12) { variant = 25; } - if(mclength <= 8) { variant = 24; } - } - - if(variant == 0) { - /* Zint can choose automatically from all available variations */ - for(i = 27; i >= 0; i--) { - - if(MicroAutosize[i] >= mclength) { - variant = MicroAutosize[i + 28]; - } - } - } - - /* Now we have the variant we can load the data */ - variant --; - symbol->option_2 = MicroVariants[variant]; /* columns */ - symbol->rows = MicroVariants[variant + 34]; /* rows */ - k = MicroVariants[variant + 68]; /* number of EC CWs */ - longueur = (symbol->option_2 * symbol->rows) - k; /* number of non-EC CWs */ - i = longueur - mclength; /* amount of padding required */ - offset = MicroVariants[variant + 102]; /* coefficient offset */ - - if(debug) { - printf("\nChoose symbol size:\n"); - printf("%d columns x %d rows\n", symbol->option_2, symbol->rows); - printf("%d data codewords (including %d pads), %d ecc codewords\n", longueur, i, k); - printf("\n"); - } - - /* We add the padding */ - while (i > 0) { - chainemc[mclength] = 900; - mclength++; - i--; - } - - /* Reed-Solomon error correction */ - longueur = mclength; - for(loop = 0; loop < 50; loop++) { - mccorrection[loop] = 0; - } - total = 0; - for(i = 0; i < longueur; i++) { - total = (chainemc[i] + mccorrection[k - 1]) % 929; - for(j = k - 1; j >= 0; j--) { - if(j == 0) { - mccorrection[j] = (929 - (total * Microcoeffs[offset + j]) % 929) % 929; - } else { - mccorrection[j] = (mccorrection[j - 1] + 929 - (total * Microcoeffs[offset + j]) % 929) % 929; - } - } - } - - for(j = 0; j < k; j++) { - if(mccorrection[j] != 0) { mccorrection[j] = 929 - mccorrection[j]; } - } - /* we add these codes to the string */ - for(i = k - 1; i >= 0; i--) { - chainemc[mclength] = mccorrection[i]; - mclength++; - } - - if(debug) { - printf("Encoded Data Stream with ECC:\n"); - for(i = 0; i < mclength; i++) { - printf("0x%02X ", chainemc[i]); - } - printf("\n"); - } - - /* Now get the RAP (Row Address Pattern) start values */ - LeftRAPStart = RAPTable[variant]; - CentreRAPStart = RAPTable[variant + 34]; - RightRAPStart = RAPTable[variant + 68]; - StartCluster = RAPTable[variant + 102] / 3; - - /* That's all values loaded, get on with the encoding */ - - LeftRAP = LeftRAPStart; - CentreRAP = CentreRAPStart; - RightRAP = RightRAPStart; - Cluster = StartCluster; /* Cluster can be 0, 1 or 2 for Cluster(0), Cluster(3) and Cluster(6) */ - - if(debug) printf("\nInternal row representation:\n"); - for(i = 0; i < symbol->rows; i++) { - if(debug) printf("row %d: ", i); - strcpy(codebarre, ""); - offset = 929 * Cluster; - for(j = 0; j < 5; j++) { - dummy[j] = 0; - } - for(j = 0; j < symbol->option_2 ; j++) { - dummy[j + 1] = chainemc[i * symbol->option_2 + j]; - if(debug) printf("[%d] ", dummy[j + 1]); - } - - /* Copy the data into codebarre */ - concat(codebarre, RAPLR[LeftRAP]); - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[1]]); - concat(codebarre, "1"); - if(symbol->option_2 == 3) { - concat(codebarre, RAPC[CentreRAP]); - } - if(symbol->option_2 >= 2) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[2]]); - concat(codebarre, "1"); - } - if(symbol->option_2 == 4) { - concat(codebarre, RAPC[CentreRAP]); - } - if(symbol->option_2 >= 3) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[3]]); - concat(codebarre, "1"); - } - if(symbol->option_2 == 4) { - concat(codebarre, "1"); - concat(codebarre, codagemc[offset + dummy[4]]); - concat(codebarre, "1"); - } - concat(codebarre, RAPLR[RightRAP]); - concat(codebarre, "1"); /* stop */ - if(debug) printf("%s\n", codebarre); - - /* Now codebarre is a mixture of letters and numbers */ - - writer = 0; - flip = 1; - strcpy(pattern, ""); - for(loop = 0; loop < strlen(codebarre); loop++) { - if((codebarre[loop] >= '0') && (codebarre[loop] <= '9')) { - for(k = 0; k < ctoi(codebarre[loop]); k++) { - if(flip == 0) { - pattern[writer] = '0'; - } else { - pattern[writer] = '1'; - } - writer++; - } - pattern[writer] = '\0'; - if(flip == 0) { - flip = 1; - } else { - flip = 0; - } - } else { - lookup(BRSET, PDFttf, codebarre[loop], pattern); - writer += 5; - } - } - symbol->width = writer; - - /* so now pattern[] holds the string of '1's and '0's. - copy this to the symbol */ - for(loop = 0; loop < strlen(pattern); loop++) { - if(pattern[loop] == '1') { set_module(symbol, i, loop); } - } - symbol->row_height[i] = 2; - - /* Set up RAPs and Cluster for next row */ - LeftRAP++; - CentreRAP++; - RightRAP++; - Cluster++; - - if(LeftRAP == 53) { - LeftRAP = 1; - } - if(CentreRAP == 53) { - CentreRAP = 1; - } - if(RightRAP == 53) { - RightRAP = 1; - } - if(Cluster == 3) { - Cluster = 0; - } - } - - return codeerr; -} - diff --git a/3rdparty/zint-2.4.4/backend/pdf417.h b/3rdparty/zint-2.4.4/backend/pdf417.h deleted file mode 100644 index 4e65ecf..0000000 --- a/3rdparty/zint-2.4.4/backend/pdf417.h +++ /dev/null @@ -1,438 +0,0 @@ -/* pdf417.h - PDF417 tables and coefficients */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - Portions Copyright (C) 2004 Grandzebu - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* this file contains the character table, the pre-calculated coefficients and the - codeword patterns taken from lines 416 to 454 of pdf417.frm */ - -#define TRUE 1 -#define FALSE 0 -#define TEX 900 -#define BYT 901 -#define NUM 902 - -#define BRSET "ABCDEFabcdefghijklmnopqrstuvwxyz*+-" - -/* PDF417 error correction coefficients from Grand Zebu */ -static int coefrs[1022] = { - /* k = 2 */ - 27, 917, - - /* k = 4 */ - 522, 568, 723, 809, - - /* k = 8 */ - 237, 308, 436, 284, 646, 653, 428, 379, - - /* k = 16 */ - 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65, - - /* k = 32 */ - 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517, - 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410, - - /* k = 64 */ - 539, 422, 6, 93, 862, 771, 453, 106, 610, 287, 107, 505, 733, 877, 381, 612, - 723, 476, 462, 172, 430, 609, 858, 822, 543, 376, 511, 400, 672, 762, 283, 184, - 440, 35, 519, 31, 460, 594, 225, 535, 517, 352, 605, 158, 651, 201, 488, 502, - 648, 733, 717, 83, 404, 97, 280, 771, 840, 629, 4, 381, 843, 623, 264, 543, - - /* k = 128 */ - 521, 310, 864, 547, 858, 580, 296, 379, 53, 779, 897, 444, 400, 925, 749, 415, - 822, 93, 217, 208, 928, 244, 583, 620, 246, 148, 447, 631, 292, 908, 490, 704, - 516, 258, 457, 907, 594, 723, 674, 292, 272, 96, 684, 432, 686, 606, 860, 569, - 193, 219, 129, 186, 236, 287, 192, 775, 278, 173, 40, 379, 712, 463, 646, 776, - 171, 491, 297, 763, 156, 732, 95, 270, 447, 90, 507, 48, 228, 821, 808, 898, - 784, 663, 627, 378, 382, 262, 380, 602, 754, 336, 89, 614, 87, 432, 670, 616, - 157, 374, 242, 726, 600, 269, 375, 898, 845, 454, 354, 130, 814, 587, 804, 34, - 211, 330, 539, 297, 827, 865, 37, 517, 834, 315, 550, 86, 801, 4, 108, 539, - - /* k = 256 */ - 524, 894, 75, 766, 882, 857, 74, 204, 82, 586, 708, 250, 905, 786, 138, 720, - 858, 194, 311, 913, 275, 190, 375, 850, 438, 733, 194, 280, 201, 280, 828, 757, - 710, 814, 919, 89, 68, 569, 11, 204, 796, 605, 540, 913, 801, 700, 799, 137, - 439, 418, 592, 668, 353, 859, 370, 694, 325, 240, 216, 257, 284, 549, 209, 884, - 315, 70, 329, 793, 490, 274, 877, 162, 749, 812, 684, 461, 334, 376, 849, 521, - 307, 291, 803, 712, 19, 358, 399, 908, 103, 511, 51, 8, 517, 225, 289, 470, - 637, 731, 66, 255, 917, 269, 463, 830, 730, 433, 848, 585, 136, 538, 906, 90, - 2, 290, 743, 199, 655, 903, 329, 49, 802, 580, 355, 588, 188, 462, 10, 134, - 628, 320, 479, 130, 739, 71, 263, 318, 374, 601, 192, 605, 142, 673, 687, 234, - 722, 384, 177, 752, 607, 640, 455, 193, 689, 707, 805, 641, 48, 60, 732, 621, - 895, 544, 261, 852, 655, 309, 697, 755, 756, 60, 231, 773, 434, 421, 726, 528, - 503, 118, 49, 795, 32, 144, 500, 238, 836, 394, 280, 566, 319, 9, 647, 550, - 73, 914, 342, 126, 32, 681, 331, 792, 620, 60, 609, 441, 180, 791, 893, 754, - 605, 383, 228, 749, 760, 213, 54, 297, 134, 54, 834, 299, 922, 191, 910, 532, - 609, 829, 189, 20, 167, 29, 872, 449, 83, 402, 41, 656, 505, 579, 481, 173, - 404, 251, 688, 95, 497, 555, 642, 543, 307, 159, 924, 558, 648, 55, 497, 10, - - /* k = 512 */ - 352, 77, 373, 504, 35, 599, 428, 207, 409, 574, 118, 498, 285, 380, 350, 492, - 197, 265, 920, 155, 914, 299, 229, 643, 294, 871, 306, 88, 87, 193, 352, 781, - 846, 75, 327, 520, 435, 543, 203, 666, 249, 346, 781, 621, 640, 268, 794, 534, - 539, 781, 408, 390, 644, 102, 476, 499, 290, 632, 545, 37, 858, 916, 552, 41, - 542, 289, 122, 272, 383, 800, 485, 98, 752, 472, 761, 107, 784, 860, 658, 741, - 290, 204, 681, 407, 855, 85, 99, 62, 482, 180, 20, 297, 451, 593, 913, 142, - 808, 684, 287, 536, 561, 76, 653, 899, 729, 567, 744, 390, 513, 192, 516, 258, - 240, 518, 794, 395, 768, 848, 51, 610, 384, 168, 190, 826, 328, 596, 786, 303, - 570, 381, 415, 641, 156, 237, 151, 429, 531, 207, 676, 710, 89, 168, 304, 402, - 40, 708, 575, 162, 864, 229, 65, 861, 841, 512, 164, 477, 221, 92, 358, 785, - 288, 357, 850, 836, 827, 736, 707, 94, 8, 494, 114, 521, 2, 499, 851, 543, - 152, 729, 771, 95, 248, 361, 578, 323, 856, 797, 289, 51, 684, 466, 533, 820, - 669, 45, 902, 452, 167, 342, 244, 173, 35, 463, 651, 51, 699, 591, 452, 578, - 37, 124, 298, 332, 552, 43, 427, 119, 662, 777, 475, 850, 764, 364, 578, 911, - 283, 711, 472, 420, 245, 288, 594, 394, 511, 327, 589, 777, 699, 688, 43, 408, - 842, 383, 721, 521, 560, 644, 714, 559, 62, 145, 873, 663, 713, 159, 672, 729, - 624, 59, 193, 417, 158, 209, 563, 564, 343, 693, 109, 608, 563, 365, 181, 772, - 677, 310, 248, 353, 708, 410, 579, 870, 617, 841, 632, 860, 289, 536, 35, 777, - 618, 586, 424, 833, 77, 597, 346, 269, 757, 632, 695, 751, 331, 247, 184, 45, - 787, 680, 18, 66, 407, 369, 54, 492, 228, 613, 830, 922, 437, 519, 644, 905, - 789, 420, 305, 441, 207, 300, 892, 827, 141, 537, 381, 662, 513, 56, 252, 341, - 242, 797, 838, 837, 720, 224, 307, 631, 61, 87, 560, 310, 756, 665, 397, 808, - 851, 309, 473, 795, 378, 31, 647, 915, 459, 806, 590, 731, 425, 216, 548, 249, - 321, 881, 699, 535, 673, 782, 210, 815, 905, 303, 843, 922, 281, 73, 469, 791, - 660, 162, 498, 308, 155, 422, 907, 817, 187, 62, 16, 425, 535, 336, 286, 437, - 375, 273, 610, 296, 183, 923, 116, 667, 751, 353, 62, 366, 691, 379, 687, 842, - 37, 357, 720, 742, 330, 5, 39, 923, 311, 424, 242, 749, 321, 54, 669, 316, - 342, 299, 534, 105, 667, 488, 640, 672, 576, 540, 316, 486, 721, 610, 46, 656, - 447, 171, 616, 464, 190, 531, 297, 321, 762, 752, 533, 175, 134, 14, 381, 433, - 717, 45, 111, 20, 596, 284, 736, 138, 646, 411, 877, 669, 141, 919, 45, 780, - 407, 164, 332, 899, 165, 726, 600, 325, 498, 655, 357, 752, 768, 223, 849, 647, - 63, 310, 863, 251, 366, 304, 282, 738, 675, 410, 389, 244, 31, 121, 303, 263 }; - - -static char *codagemc[2787] = { "urA", "xfs", "ypy", "unk", "xdw", "yoz", "pDA", "uls", "pBk", "eBA", - "pAs", "eAk", "prA", "uvs", "xhy", "pnk", "utw", "xgz", "fDA", "pls", "fBk", "frA", "pvs", - "uxy", "fnk", "ptw", "uwz", "fls", "psy", "fvs", "pxy", "ftw", "pwz", "fxy", "yrx", "ufk", - "xFw", "ymz", "onA", "uds", "xEy", "olk", "ucw", "dBA", "oks", "uci", "dAk", "okg", "dAc", - "ovk", "uhw", "xaz", "dnA", "ots", "ugy", "dlk", "osw", "ugj", "dks", "osi", "dvk", "oxw", - "uiz", "dts", "owy", "dsw", "owj", "dxw", "oyz", "dwy", "dwj", "ofA", "uFs", "xCy", "odk", - "uEw", "xCj", "clA", "ocs", "uEi", "ckk", "ocg", "ckc", "ckE", "cvA", "ohs", "uay", "ctk", - "ogw", "uaj", "css", "ogi", "csg", "csa", "cxs", "oiy", "cww", "oij", "cwi", "cyy", "oFk", - "uCw", "xBj", "cdA", "oEs", "uCi", "cck", "oEg", "uCb", "ccc", "oEa", "ccE", "oED", "chk", - "oaw", "uDj", "cgs", "oai", "cgg", "oab", "cga", "cgD", "obj", "cib", "cFA", "oCs", "uBi", - "cEk", "oCg", "uBb", "cEc", "oCa", "cEE", "oCD", "cEC", "cas", "cag", "caa", "cCk", "uAr", - "oBa", "oBD", "cCB", "tfk", "wpw", "yez", "mnA", "tds", "woy", "mlk", "tcw", "woj", "FBA", - "mks", "FAk", "mvk", "thw", "wqz", "FnA", "mts", "tgy", "Flk", "msw", "Fks", "Fkg", "Fvk", - "mxw", "tiz", "Fts", "mwy", "Fsw", "Fsi", "Fxw", "myz", "Fwy", "Fyz", "vfA", "xps", "yuy", - "vdk", "xow", "yuj", "qlA", "vcs", "xoi", "qkk", "vcg", "xob", "qkc", "vca", "mfA", "tFs", - "wmy", "qvA", "mdk", "tEw", "wmj", "qtk", "vgw", "xqj", "hlA", "Ekk", "mcg", "tEb", "hkk", - "qsg", "hkc", "EvA", "mhs", "tay", "hvA", "Etk", "mgw", "taj", "htk", "qww", "vij", "hss", - "Esg", "hsg", "Exs", "miy", "hxs", "Eww", "mij", "hww", "qyj", "hwi", "Eyy", "hyy", "Eyj", - "hyj", "vFk", "xmw", "ytj", "qdA", "vEs", "xmi", "qck", "vEg", "xmb", "qcc", "vEa", "qcE", - "qcC", "mFk", "tCw", "wlj", "qhk", "mEs", "tCi", "gtA", "Eck", "vai", "tCb", "gsk", "Ecc", - "mEa", "gsc", "qga", "mED", "EcC", "Ehk", "maw", "tDj", "gxk", "Egs", "mai", "gws", "qii", - "mab", "gwg", "Ega", "EgD", "Eiw", "mbj", "gyw", "Eii", "gyi", "Eib", "gyb", "gzj", "qFA", - "vCs", "xli", "qEk", "vCg", "xlb", "qEc", "vCa", "qEE", "vCD", "qEC", "qEB", "EFA", "mCs", - "tBi", "ghA", "EEk", "mCg", "tBb", "ggk", "qag", "vDb", "ggc", "EEE", "mCD", "ggE", "qaD", - "ggC", "Eas", "mDi", "gis", "Eag", "mDb", "gig", "qbb", "gia", "EaD", "giD", "gji", "gjb", - "qCk", "vBg", "xkr", "qCc", "vBa", "qCE", "vBD", "qCC", "qCB", "ECk", "mBg", "tAr", "gak", - "ECc", "mBa", "gac", "qDa", "mBD", "gaE", "ECC", "gaC", "ECB", "EDg", "gbg", "gba", "gbD", - "vAq", "vAn", "qBB", "mAq", "EBE", "gDE", "gDC", "gDB", "lfA", "sps", "wey", "ldk", "sow", - "ClA", "lcs", "soi", "Ckk", "lcg", "Ckc", "CkE", "CvA", "lhs", "sqy", "Ctk", "lgw", "sqj", - "Css", "lgi", "Csg", "Csa", "Cxs", "liy", "Cww", "lij", "Cwi", "Cyy", "Cyj", "tpk", "wuw", - "yhj", "ndA", "tos", "wui", "nck", "tog", "wub", "ncc", "toa", "ncE", "toD", "lFk", "smw", - "wdj", "nhk", "lEs", "smi", "atA", "Cck", "tqi", "smb", "ask", "ngg", "lEa", "asc", "CcE", - "asE", "Chk", "law", "snj", "axk", "Cgs", "trj", "aws", "nii", "lab", "awg", "Cga", "awa", - "Ciw", "lbj", "ayw", "Cii", "ayi", "Cib", "Cjj", "azj", "vpA", "xus", "yxi", "vok", "xug", - "yxb", "voc", "xua", "voE", "xuD", "voC", "nFA", "tms", "wti", "rhA", "nEk", "xvi", "wtb", - "rgk", "vqg", "xvb", "rgc", "nEE", "tmD", "rgE", "vqD", "nEB", "CFA", "lCs", "sli", "ahA", - "CEk", "lCg", "slb", "ixA", "agk", "nag", "tnb", "iwk", "rig", "vrb", "lCD", "iwc", "agE", - "naD", "iwE", "CEB", "Cas", "lDi", "ais", "Cag", "lDb", "iys", "aig", "nbb", "iyg", "rjb", - "CaD", "aiD", "Cbi", "aji", "Cbb", "izi", "ajb", "vmk", "xtg", "ywr", "vmc", "xta", "vmE", - "xtD", "vmC", "vmB", "nCk", "tlg", "wsr", "rak", "nCc", "xtr", "rac", "vna", "tlD", "raE", - "nCC", "raC", "nCB", "raB", "CCk", "lBg", "skr", "aak", "CCc", "lBa", "iik", "aac", "nDa", - "lBD", "iic", "rba", "CCC", "iiE", "aaC", "CCB", "aaB", "CDg", "lBr", "abg", "CDa", "ijg", - "aba", "CDD", "ija", "abD", "CDr", "ijr", "vlc", "xsq", "vlE", "xsn", "vlC", "vlB", "nBc", - "tkq", "rDc", "nBE", "tkn", "rDE", "vln", "rDC", "nBB", "rDB", "CBc", "lAq", "aDc", "CBE", - "lAn", "ibc", "aDE", "nBn", "ibE", "rDn", "CBB", "ibC", "aDB", "ibB", "aDq", "ibq", "ibn", - "xsf", "vkl", "tkf", "nAm", "nAl", "CAo", "aBo", "iDo", "CAl", "aBl", "kpk", "BdA", "kos", - "Bck", "kog", "seb", "Bcc", "koa", "BcE", "koD", "Bhk", "kqw", "sfj", "Bgs", "kqi", "Bgg", - "kqb", "Bga", "BgD", "Biw", "krj", "Bii", "Bib", "Bjj", "lpA", "sus", "whi", "lok", "sug", - "loc", "sua", "loE", "suD", "loC", "BFA", "kms", "sdi", "DhA", "BEk", "svi", "sdb", "Dgk", - "lqg", "svb", "Dgc", "BEE", "kmD", "DgE", "lqD", "BEB", "Bas", "kni", "Dis", "Bag", "knb", - "Dig", "lrb", "Dia", "BaD", "Bbi", "Dji", "Bbb", "Djb", "tuk", "wxg", "yir", "tuc", "wxa", - "tuE", "wxD", "tuC", "tuB", "lmk", "stg", "nqk", "lmc", "sta", "nqc", "tva", "stD", "nqE", - "lmC", "nqC", "lmB", "nqB", "BCk", "klg", "Dak", "BCc", "str", "bik", "Dac", "lna", "klD", - "bic", "nra", "BCC", "biE", "DaC", "BCB", "DaB", "BDg", "klr", "Dbg", "BDa", "bjg", "Dba", - "BDD", "bja", "DbD", "BDr", "Dbr", "bjr", "xxc", "yyq", "xxE", "yyn", "xxC", "xxB", "ttc", - "wwq", "vvc", "xxq", "wwn", "vvE", "xxn", "vvC", "ttB", "vvB", "llc", "ssq", "nnc", "llE", - "ssn", "rrc", "nnE", "ttn", "rrE", "vvn", "llB", "rrC", "nnB", "rrB", "BBc", "kkq", "DDc", - "BBE", "kkn", "bbc", "DDE", "lln", "jjc", "bbE", "nnn", "BBB", "jjE", "rrn", "DDB", "jjC", - "BBq", "DDq", "BBn", "bbq", "DDn", "jjq", "bbn", "jjn", "xwo", "yyf", "xwm", "xwl", "tso", - "wwf", "vto", "xwv", "vtm", "tsl", "vtl", "lko", "ssf", "nlo", "lkm", "rno", "nlm", "lkl", - "rnm", "nll", "rnl", "BAo", "kkf", "DBo", "lkv", "bDo", "DBm", "BAl", "jbo", "bDm", "DBl", - "jbm", "bDl", "jbl", "DBv", "jbv", "xwd", "vsu", "vst", "nku", "rlu", "rlt", "DAu", "bBu", - "jDu", "jDt", "ApA", "Aok", "keg", "Aoc", "AoE", "AoC", "Aqs", "Aqg", "Aqa", "AqD", "Ari", - "Arb", "kuk", "kuc", "sha", "kuE", "shD", "kuC", "kuB", "Amk", "kdg", "Bqk", "kvg", "kda", - "Bqc", "kva", "BqE", "kvD", "BqC", "AmB", "BqB", "Ang", "kdr", "Brg", "kvr", "Bra", "AnD", - "BrD", "Anr", "Brr", "sxc", "sxE", "sxC", "sxB", "ktc", "lvc", "sxq", "sgn", "lvE", "sxn", - "lvC", "ktB", "lvB", "Alc", "Bnc", "AlE", "kcn", "Drc", "BnE", "AlC", "DrE", "BnC", "AlB", - "DrC", "BnB", "Alq", "Bnq", "Aln", "Drq", "Bnn", "Drn", "wyo", "wym", "wyl", "swo", "txo", - "wyv", "txm", "swl", "txl", "kso", "sgf", "lto", "swv", "nvo", "ltm", "ksl", "nvm", "ltl", - "nvl", "Ako", "kcf", "Blo", "ksv", "Dno", "Blm", "Akl", "bro", "Dnm", "Bll", "brm", "Dnl", - "Akv", "Blv", "Dnv", "brv", "yze", "yzd", "wye", "xyu", "wyd", "xyt", "swe", "twu", "swd", - "vxu", "twt", "vxt", "kse", "lsu", "ksd", "ntu", "lst", "rvu", "ypk", "zew", "xdA", "yos", - "zei", "xck", "yog", "zeb", "xcc", "yoa", "xcE", "yoD", "xcC", "xhk", "yqw", "zfj", "utA", - "xgs", "yqi", "usk", "xgg", "yqb", "usc", "xga", "usE", "xgD", "usC", "uxk", "xiw", "yrj", - "ptA", "uws", "xii", "psk", "uwg", "xib", "psc", "uwa", "psE", "uwD", "psC", "pxk", "uyw", - "xjj", "ftA", "pws", "uyi", "fsk", "pwg", "uyb", "fsc", "pwa", "fsE", "pwD", "fxk", "pyw", - "uzj", "fws", "pyi", "fwg", "pyb", "fwa", "fyw", "pzj", "fyi", "fyb", "xFA", "yms", "zdi", - "xEk", "ymg", "zdb", "xEc", "yma", "xEE", "ymD", "xEC", "xEB", "uhA", "xas", "yni", "ugk", - "xag", "ynb", "ugc", "xaa", "ugE", "xaD", "ugC", "ugB", "oxA", "uis", "xbi", "owk", "uig", - "xbb", "owc", "uia", "owE", "uiD", "owC", "owB", "dxA", "oys", "uji", "dwk", "oyg", "ujb", - "dwc", "oya", "dwE", "oyD", "dwC", "dys", "ozi", "dyg", "ozb", "dya", "dyD", "dzi", "dzb", - "xCk", "ylg", "zcr", "xCc", "yla", "xCE", "ylD", "xCC", "xCB", "uak", "xDg", "ylr", "uac", - "xDa", "uaE", "xDD", "uaC", "uaB", "oik", "ubg", "xDr", "oic", "uba", "oiE", "ubD", "oiC", - "oiB", "cyk", "ojg", "ubr", "cyc", "oja", "cyE", "ojD", "cyC", "cyB", "czg", "ojr", "cza", - "czD", "czr", "xBc", "ykq", "xBE", "ykn", "xBC", "xBB", "uDc", "xBq", "uDE", "xBn", "uDC", - "uDB", "obc", "uDq", "obE", "uDn", "obC", "obB", "cjc", "obq", "cjE", "obn", "cjC", "cjB", - "cjq", "cjn", "xAo", "ykf", "xAm", "xAl", "uBo", "xAv", "uBm", "uBl", "oDo", "uBv", "oDm", - "oDl", "cbo", "oDv", "cbm", "cbl", "xAe", "xAd", "uAu", "uAt", "oBu", "oBt", "wpA", "yes", - "zFi", "wok", "yeg", "zFb", "woc", "yea", "woE", "yeD", "woC", "woB", "thA", "wqs", "yfi", - "tgk", "wqg", "yfb", "tgc", "wqa", "tgE", "wqD", "tgC", "tgB", "mxA", "tis", "wri", "mwk", - "tig", "wrb", "mwc", "tia", "mwE", "tiD", "mwC", "mwB", "FxA", "mys", "tji", "Fwk", "myg", - "tjb", "Fwc", "mya", "FwE", "myD", "FwC", "Fys", "mzi", "Fyg", "mzb", "Fya", "FyD", "Fzi", - "Fzb", "yuk", "zhg", "hjs", "yuc", "zha", "hbw", "yuE", "zhD", "hDy", "yuC", "yuB", "wmk", - "ydg", "zEr", "xqk", "wmc", "zhr", "xqc", "yva", "ydD", "xqE", "wmC", "xqC", "wmB", "xqB", - "tak", "wng", "ydr", "vik", "tac", "wna", "vic", "xra", "wnD", "viE", "taC", "viC", "taB", - "viB", "mik", "tbg", "wnr", "qyk", "mic", "tba", "qyc", "vja", "tbD", "qyE", "miC", "qyC", - "miB", "qyB", "Eyk", "mjg", "tbr", "hyk", "Eyc", "mja", "hyc", "qza", "mjD", "hyE", "EyC", - "hyC", "EyB", "Ezg", "mjr", "hzg", "Eza", "hza", "EzD", "hzD", "Ezr", "ytc", "zgq", "grw", - "ytE", "zgn", "gny", "ytC", "glz", "ytB", "wlc", "ycq", "xnc", "wlE", "ycn", "xnE", "ytn", - "xnC", "wlB", "xnB", "tDc", "wlq", "vbc", "tDE", "wln", "vbE", "xnn", "vbC", "tDB", "vbB", - "mbc", "tDq", "qjc", "mbE", "tDn", "qjE", "vbn", "qjC", "mbB", "qjB", "Ejc", "mbq", "gzc", - "EjE", "mbn", "gzE", "qjn", "gzC", "EjB", "gzB", "Ejq", "gzq", "Ejn", "gzn", "yso", "zgf", - "gfy", "ysm", "gdz", "ysl", "wko", "ycf", "xlo", "ysv", "xlm", "wkl", "xll", "tBo", "wkv", - "vDo", "tBm", "vDm", "tBl", "vDl", "mDo", "tBv", "qbo", "vDv", "qbm", "mDl", "qbl", "Ebo", - "mDv", "gjo", "Ebm", "gjm", "Ebl", "gjl", "Ebv", "gjv", "yse", "gFz", "ysd", "wke", "xku", - "wkd", "xkt", "tAu", "vBu", "tAt", "vBt", "mBu", "qDu", "mBt", "qDt", "EDu", "gbu", "EDt", - "gbt", "ysF", "wkF", "xkh", "tAh", "vAx", "mAx", "qBx", "wek", "yFg", "zCr", "wec", "yFa", - "weE", "yFD", "weC", "weB", "sqk", "wfg", "yFr", "sqc", "wfa", "sqE", "wfD", "sqC", "sqB", - "lik", "srg", "wfr", "lic", "sra", "liE", "srD", "liC", "liB", "Cyk", "ljg", "srr", "Cyc", - "lja", "CyE", "ljD", "CyC", "CyB", "Czg", "ljr", "Cza", "CzD", "Czr", "yhc", "zaq", "arw", - "yhE", "zan", "any", "yhC", "alz", "yhB", "wdc", "yEq", "wvc", "wdE", "yEn", "wvE", "yhn", - "wvC", "wdB", "wvB", "snc", "wdq", "trc", "snE", "wdn", "trE", "wvn", "trC", "snB", "trB", - "lbc", "snq", "njc", "lbE", "snn", "njE", "trn", "njC", "lbB", "njB", "Cjc", "lbq", "azc", - "CjE", "lbn", "azE", "njn", "azC", "CjB", "azB", "Cjq", "azq", "Cjn", "azn", "zio", "irs", - "rfy", "zim", "inw", "rdz", "zil", "ily", "ikz", "ygo", "zaf", "afy", "yxo", "ziv", "ivy", - "adz", "yxm", "ygl", "itz", "yxl", "wco", "yEf", "wto", "wcm", "xvo", "yxv", "wcl", "xvm", - "wtl", "xvl", "slo", "wcv", "tno", "slm", "vro", "tnm", "sll", "vrm", "tnl", "vrl", "lDo", - "slv", "nbo", "lDm", "rjo", "nbm", "lDl", "rjm", "nbl", "rjl", "Cbo", "lDv", "ajo", "Cbm", - "izo", "ajm", "Cbl", "izm", "ajl", "izl", "Cbv", "ajv", "zie", "ifw", "rFz", "zid", "idy", - "icz", "yge", "aFz", "ywu", "ygd", "ihz", "ywt", "wce", "wsu", "wcd", "xtu", "wst", "xtt", - "sku", "tlu", "skt", "vnu", "tlt", "vnt", "lBu", "nDu", "lBt", "rbu", "nDt", "rbt", "CDu", - "abu", "CDt", "iju", "abt", "ijt", "ziF", "iFy", "iEz", "ygF", "ywh", "wcF", "wsh", "xsx", - "skh", "tkx", "vlx", "lAx", "nBx", "rDx", "CBx", "aDx", "ibx", "iCz", "wFc", "yCq", "wFE", - "yCn", "wFC", "wFB", "sfc", "wFq", "sfE", "wFn", "sfC", "sfB", "krc", "sfq", "krE", "sfn", - "krC", "krB", "Bjc", "krq", "BjE", "krn", "BjC", "BjB", "Bjq", "Bjn", "yao", "zDf", "Dfy", - "yam", "Ddz", "yal", "wEo", "yCf", "who", "wEm", "whm", "wEl", "whl", "sdo", "wEv", "svo", - "sdm", "svm", "sdl", "svl", "kno", "sdv", "lro", "knm", "lrm", "knl", "lrl", "Bbo", "knv", - "Djo", "Bbm", "Djm", "Bbl", "Djl", "Bbv", "Djv", "zbe", "bfw", "npz", "zbd", "bdy", "bcz", - "yae", "DFz", "yiu", "yad", "bhz", "yit", "wEe", "wgu", "wEd", "wxu", "wgt", "wxt", "scu", - "stu", "sct", "tvu", "stt", "tvt", "klu", "lnu", "klt", "nru", "lnt", "nrt", "BDu", "Dbu", - "BDt", "bju", "Dbt", "bjt", "jfs", "rpy", "jdw", "roz", "jcy", "jcj", "zbF", "bFy", "zjh", - "jhy", "bEz", "jgz", "yaF", "yih", "yyx", "wEF", "wgh", "wwx", "xxx", "sch", "ssx", "ttx", - "vvx", "kkx", "llx", "nnx", "rrx", "BBx", "DDx", "bbx", "jFw", "rmz", "jEy", "jEj", "bCz", - "jaz", "jCy", "jCj", "jBj", "wCo", "wCm", "wCl", "sFo", "wCv", "sFm", "sFl", "kfo", "sFv", - "kfm", "kfl", "Aro", "kfv", "Arm", "Arl", "Arv", "yDe", "Bpz", "yDd", "wCe", "wau", "wCd", - "wat", "sEu", "shu", "sEt", "sht", "kdu", "kvu", "kdt", "kvt", "Anu", "Bru", "Ant", "Brt", - "zDp", "Dpy", "Doz", "yDF", "ybh", "wCF", "wah", "wix", "sEh", "sgx", "sxx", "kcx", "ktx", - "lvx", "Alx", "Bnx", "Drx", "bpw", "nuz", "boy", "boj", "Dmz", "bqz", "jps", "ruy", "jow", - "ruj", "joi", "job", "bmy", "jqy", "bmj", "jqj", "jmw", "rtj", "jmi", "jmb", "blj", "jnj", - "jli", "jlb", "jkr", "sCu", "sCt", "kFu", "kFt", "Afu", "Aft", "wDh", "sCh", "sax", "kEx", - "khx", "Adx", "Avx", "Buz", "Duy", "Duj", "buw", "nxj", "bui", "bub", "Dtj", "bvj", "jus", - "rxi", "jug", "rxb", "jua", "juD", "bti", "jvi", "btb", "jvb", "jtg", "rwr", "jta", "jtD", - "bsr", "jtr", "jsq", "jsn", "Bxj", "Dxi", "Dxb", "bxg", "nyr", "bxa", "bxD", "Dwr", "bxr", - "bwq", "bwn", "pjk", "urw", "ejA", "pbs", "uny", "ebk", "pDw", "ulz", "eDs", "pBy", "eBw", - "zfc", "fjk", "prw", "zfE", "fbs", "pny", "zfC", "fDw", "plz", "zfB", "fBy", "yrc", "zfq", - "frw", "yrE", "zfn", "fny", "yrC", "flz", "yrB", "xjc", "yrq", "xjE", "yrn", "xjC", "xjB", - "uzc", "xjq", "uzE", "xjn", "uzC", "uzB", "pzc", "uzq", "pzE", "uzn", "pzC", "djA", "ors", - "ufy", "dbk", "onw", "udz", "dDs", "oly", "dBw", "okz", "dAy", "zdo", "drs", "ovy", "zdm", - "dnw", "otz", "zdl", "dly", "dkz", "yno", "zdv", "dvy", "ynm", "dtz", "ynl", "xbo", "ynv", - "xbm", "xbl", "ujo", "xbv", "ujm", "ujl", "ozo", "ujv", "ozm", "ozl", "crk", "ofw", "uFz", - "cns", "ody", "clw", "ocz", "cky", "ckj", "zcu", "cvw", "ohz", "zct", "cty", "csz", "ylu", - "cxz", "ylt", "xDu", "xDt", "ubu", "ubt", "oju", "ojt", "cfs", "oFy", "cdw", "oEz", "ccy", - "ccj", "zch", "chy", "cgz", "ykx", "xBx", "uDx", "cFw", "oCz", "cEy", "cEj", "caz", "cCy", - "cCj", "FjA", "mrs", "tfy", "Fbk", "mnw", "tdz", "FDs", "mly", "FBw", "mkz", "FAy", "zFo", - "Frs", "mvy", "zFm", "Fnw", "mtz", "zFl", "Fly", "Fkz", "yfo", "zFv", "Fvy", "yfm", "Ftz", - "yfl", "wro", "yfv", "wrm", "wrl", "tjo", "wrv", "tjm", "tjl", "mzo", "tjv", "mzm", "mzl", - "qrk", "vfw", "xpz", "hbA", "qns", "vdy", "hDk", "qlw", "vcz", "hBs", "qky", "hAw", "qkj", - "hAi", "Erk", "mfw", "tFz", "hrk", "Ens", "mdy", "hns", "qty", "mcz", "hlw", "Eky", "hky", - "Ekj", "hkj", "zEu", "Evw", "mhz", "zhu", "zEt", "hvw", "Ety", "zht", "hty", "Esz", "hsz", - "ydu", "Exz", "yvu", "ydt", "hxz", "yvt", "wnu", "xru", "wnt", "xrt", "tbu", "vju", "tbt", - "vjt", "mju", "mjt", "grA", "qfs", "vFy", "gnk", "qdw", "vEz", "gls", "qcy", "gkw", "qcj", - "gki", "gkb", "Efs", "mFy", "gvs", "Edw", "mEz", "gtw", "qgz", "gsy", "Ecj", "gsj", "zEh", - "Ehy", "zgx", "gxy", "Egz", "gwz", "ycx", "ytx", "wlx", "xnx", "tDx", "vbx", "mbx", "gfk", - "qFw", "vCz", "gds", "qEy", "gcw", "qEj", "gci", "gcb", "EFw", "mCz", "ghw", "EEy", "ggy", - "EEj", "ggj", "Eaz", "giz", "gFs", "qCy", "gEw", "qCj", "gEi", "gEb", "ECy", "gay", "ECj", - "gaj", "gCw", "qBj", "gCi", "gCb", "EBj", "gDj", "gBi", "gBb", "Crk", "lfw", "spz", "Cns", - "ldy", "Clw", "lcz", "Cky", "Ckj", "zCu", "Cvw", "lhz", "zCt", "Cty", "Csz", "yFu", "Cxz", - "yFt", "wfu", "wft", "sru", "srt", "lju", "ljt", "arA", "nfs", "tpy", "ank", "ndw", "toz", - "als", "ncy", "akw", "ncj", "aki", "akb", "Cfs", "lFy", "avs", "Cdw", "lEz", "atw", "ngz", - "asy", "Ccj", "asj", "zCh", "Chy", "zax", "axy", "Cgz", "awz", "yEx", "yhx", "wdx", "wvx", - "snx", "trx", "lbx", "rfk", "vpw", "xuz", "inA", "rds", "voy", "ilk", "rcw", "voj", "iks", - "rci", "ikg", "rcb", "ika", "afk", "nFw", "tmz", "ivk", "ads", "nEy", "its", "rgy", "nEj", - "isw", "aci", "isi", "acb", "isb", "CFw", "lCz", "ahw", "CEy", "ixw", "agy", "CEj", "iwy", - "agj", "iwj", "Caz", "aiz", "iyz", "ifA", "rFs", "vmy", "idk", "rEw", "vmj", "ics", "rEi", - "icg", "rEb", "ica", "icD", "aFs", "nCy", "ihs", "aEw", "nCj", "igw", "raj", "igi", "aEb", - "igb", "CCy", "aay", "CCj", "iiy", "aaj", "iij", "iFk", "rCw", "vlj", "iEs", "rCi", "iEg", - "rCb", "iEa", "iED", "aCw", "nBj", "iaw", "aCi", "iai", "aCb", "iab", "CBj", "aDj", "ibj", - "iCs", "rBi", "iCg", "rBb", "iCa", "iCD", "aBi", "iDi", "aBb", "iDb", "iBg", "rAr", "iBa", - "iBD", "aAr", "iBr", "iAq", "iAn", "Bfs", "kpy", "Bdw", "koz", "Bcy", "Bcj", "Bhy", "Bgz", - "yCx", "wFx", "sfx", "krx", "Dfk", "lpw", "suz", "Dds", "loy", "Dcw", "loj", "Dci", "Dcb", - "BFw", "kmz", "Dhw", "BEy", "Dgy", "BEj", "Dgj", "Baz", "Diz", "bfA", "nps", "tuy", "bdk", - "now", "tuj", "bcs", "noi", "bcg", "nob", "bca", "bcD", "DFs", "lmy", "bhs", "DEw", "lmj", - "bgw", "DEi", "bgi", "DEb", "bgb", "BCy", "Day", "BCj", "biy", "Daj", "bij", "rpk", "vuw", - "xxj", "jdA", "ros", "vui", "jck", "rog", "vub", "jcc", "roa", "jcE", "roD", "jcC", "bFk", - "nmw", "ttj", "jhk", "bEs", "nmi", "jgs", "rqi", "nmb", "jgg", "bEa", "jga", "bED", "jgD", - "DCw", "llj", "baw", "DCi", "jiw", "bai", "DCb", "jii", "bab", "jib", "BBj", "DDj", "bbj", - "jjj", "jFA", "rms", "vti", "jEk", "rmg", "vtb", "jEc", "rma", "jEE", "rmD", "jEC", "jEB", - "bCs", "nli", "jas", "bCg", "nlb", "jag", "rnb", "jaa", "bCD", "jaD", "DBi", "bDi", "DBb", - "jbi", "bDb", "jbb", "jCk", "rlg", "vsr", "jCc", "rla", "jCE", "rlD", "jCC", "jCB", "bBg", - "nkr", "jDg", "bBa", "jDa", "bBD", "jDD", "DAr", "bBr", "jDr", "jBc", "rkq", "jBE", "rkn", - "jBC", "jBB", "bAq", "jBq", "bAn", "jBn", "jAo", "rkf", "jAm", "jAl", "bAf", "jAv", "Apw", - "kez", "Aoy", "Aoj", "Aqz", "Bps", "kuy", "Bow", "kuj", "Boi", "Bob", "Amy", "Bqy", "Amj", - "Bqj", "Dpk", "luw", "sxj", "Dos", "lui", "Dog", "lub", "Doa", "DoD", "Bmw", "ktj", "Dqw", - "Bmi", "Dqi", "Bmb", "Dqb", "Alj", "Bnj", "Drj", "bpA", "nus", "txi", "bok", "nug", "txb", - "boc", "nua", "boE", "nuD", "boC", "boB", "Dms", "lti", "bqs", "Dmg", "ltb", "bqg", "nvb", - "bqa", "DmD", "bqD", "Bli", "Dni", "Blb", "bri", "Dnb", "brb", "ruk", "vxg", "xyr", "ruc", - "vxa", "ruE", "vxD", "ruC", "ruB", "bmk", "ntg", "twr", "jqk", "bmc", "nta", "jqc", "rva", - "ntD", "jqE", "bmC", "jqC", "bmB", "jqB", "Dlg", "lsr", "bng", "Dla", "jrg", "bna", "DlD", - "jra", "bnD", "jrD", "Bkr", "Dlr", "bnr", "jrr", "rtc", "vwq", "rtE", "vwn", "rtC", "rtB", - "blc", "nsq", "jnc", "blE", "nsn", "jnE", "rtn", "jnC", "blB", "jnB", "Dkq", "blq", "Dkn", - "jnq", "bln", "jnn", "rso", "vwf", "rsm", "rsl", "bko", "nsf", "jlo", "bkm", "jlm", "bkl", - "jll", "Dkf", "bkv", "jlv", "rse", "rsd", "bke", "jku", "bkd", "jkt", "Aey", "Aej", "Auw", - "khj", "Aui", "Aub", "Adj", "Avj", "Bus", "kxi", "Bug", "kxb", "Bua", "BuD", "Ati", "Bvi", - "Atb", "Bvb", "Duk", "lxg", "syr", "Duc", "lxa", "DuE", "lxD", "DuC", "DuB", "Btg", "kwr", - "Dvg", "lxr", "Dva", "BtD", "DvD", "Asr", "Btr", "Dvr", "nxc", "tyq", "nxE", "tyn", "nxC", - "nxB", "Dtc", "lwq", "bvc", "nxq", "lwn", "bvE", "DtC", "bvC", "DtB", "bvB", "Bsq", "Dtq", - "Bsn", "bvq", "Dtn", "bvn", "vyo", "xzf", "vym", "vyl", "nwo", "tyf", "rxo", "nwm", "rxm", - "nwl", "rxl", "Dso", "lwf", "bto", "Dsm", "jvo", "btm", "Dsl", "jvm", "btl", "jvl", "Bsf", - "Dsv", "btv", "jvv", "vye", "vyd", "nwe", "rwu", "nwd", "rwt", "Dse", "bsu", "Dsd", "jtu", - "bst", "jtt", "vyF", "nwF", "rwh", "DsF", "bsh", "jsx", "Ahi", "Ahb", "Axg", "kir", "Axa", - "AxD", "Agr", "Axr", "Bxc", "kyq", "BxE", "kyn", "BxC", "BxB", "Awq", "Bxq", "Awn", "Bxn", - "lyo", "szf", "lym", "lyl", "Bwo", "kyf", "Dxo", "lyv", "Dxm", "Bwl", "Dxl", "Awf", "Bwv", - "Dxv", "tze", "tzd", "lye", "nyu", "lyd", "nyt", "Bwe", "Dwu", "Bwd", "bxu", "Dwt", "bxt", - "tzF", "lyF", "nyh", "BwF", "Dwh", "bwx", "Aiq", "Ain", "Ayo", "kjf", "Aym", "Ayl", "Aif", - "Ayv", "kze", "kzd", "Aye", "Byu", "Ayd", "Byt", "szp" }; - -/* converts values into bar patterns - replacing Grand Zebu's true type font */ -static char *PDFttf[35] = { "00000", "00001", "00010", "00011", "00100", "00101", "00110", "00111", - "01000", "01001", "01010", "01011", "01100", "01101", "01110", "01111", "10000", "10001", - "10010", "10011", "10100", "10101", "10110", "10111", "11000", "11001", "11010", - "11011", "11100", "11101", "11110", "11111", "01", "1111111101010100", "11111101000101001"}; - -/* MicroPDF417 coefficients from ISO/IEC 24728:2006 Annex F */ -static int Microcoeffs[344] = { - /* k = 7 */ - 76, 925, 537, 597, 784, 691, 437, - - /* k = 8 */ - 237, 308, 436, 284, 646, 653, 428, 379, - - /* k = 9 */ - 567, 527, 622, 257, 289, 362, 501, 441, 205, - - /* k = 10 */ - 377, 457, 64, 244, 826, 841, 818, 691, 266, 612, - - /* k = 11 */ - 462, 45, 565, 708, 825, 213, 15, 68, 327, 602, 904, - - /* k = 12 */ - 597, 864, 757, 201, 646, 684, 347, 127, 388, 7, 69, 851, - - /* k = 13 */ - 764, 713, 342, 384, 606, 583, 322, 592, 678, 204, 184, 394, 692, - - /* k = 14 */ - 669, 677, 154, 187, 241, 286, 274, 354, 478, 915, 691, 833, 105, 215, - - /* k = 15 */ - 460, 829, 476, 109, 904, 664, 230, 5, 80, 74, 550, 575, 147, 868, 642, - - /* k = 16 */ - 274, 562, 232, 755, 599, 524, 801, 132, 295, 116, 442, 428, 295, 42, 176, 65, - - /* k = 18 */ - 279, 577, 315, 624, 37, 855, 275, 739, 120, 297, 312, 202, 560, 321, 233, 756, - 760, 573, - - /* k = 21 */ - 108, 519, 781, 534, 129, 425, 681, 553, 422, 716, 763, 693, 624, 610, 310, 691, - 347, 165, 193, 259, 568, - - /* k = 26 */ - 443, 284, 887, 544, 788, 93, 477, 760, 331, 608, 269, 121, 159, 830, 446, 893, - 699, 245, 441, 454, 325, 858, 131, 847, 764, 169, - - /* k = 32 */ - 361, 575, 922, 525, 176, 586, 640, 321, 536, 742, 677, 742, 687, 284, 193, 517, - 273, 494, 263, 147, 593, 800, 571, 320, 803, 133, 231, 390, 685, 330, 63, 410, - - /* k = 38 */ - 234, 228, 438, 848, 133, 703, 529, 721, 788, 322, 280, 159, 738, 586, 388, 684, - 445, 680, 245, 595, 614, 233, 812, 32, 284, 658, 745, 229, 95, 689, 920, 771, - 554, 289, 231, 125, 117, 518, - - /* k = 44 */ - 476, 36, 659, 848, 678, 64, 764, 840, 157, 915, 470, 876, 109, 25, 632, 405, - 417, 436, 714, 60, 376, 97, 413, 706, 446, 21, 3, 773, 569, 267, 272, 213, - 31, 560, 231, 758, 103, 271, 572, 436, 339, 730, 82, 285, - - /* k = 50 */ - 923, 797, 576, 875, 156, 706, 63, 81, 257, 874, 411, 416, 778, 50, 205, 303, - 188, 535, 909, 155, 637, 230, 534, 96, 575, 102, 264, 233, 919, 593, 865, 26, - 579, 623, 766, 146, 10, 739, 246, 127, 71, 244, 211, 477, 920, 876, 427, 820, - 718, 435 }; - -/* rows, columns, error codewords, k-offset of valid MicroPDF417 sizes from ISO/IEC 24728:2006 */ -static int MicroVariants[170] = -{ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 11, 14, 17, 20, 24, 28, 8, 11, 14, 17, 20, 23, 26, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44, 4, 6, 8, 10, 12, 15, 20, 26, 32, 38, 44, - 7, 7, 7, 8, 8, 8, 8, 9, 9, 10, 11, 13, 15, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50, 8, 12, 14, 16, 18, 21, 26, 32, 38, 44, 50, - 0, 0, 0, 7, 7, 7, 7, 15, 15, 24, 34, 57, 84, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294, 7, 45, 70, 99, 115, 133, 154, 180, 212, 250, 294 }; -/* rows, columns, error codewords, k-offset */ - -/* following is Left RAP, Centre RAP, Right RAP and Start Cluster from ISO/IEC 24728:2006 tables 10, 11 and 12 */ -static int RAPTable[136] = -{ 1, 8, 36, 19, 9, 25, 1, 1, 8, 36, 19, 9, 27, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1, 47, 1, 7, 15, 25, 37, 1, 1, 21, 15, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25, 19, 1, 7, 15, 25, 37, 17, 9, 29, 31, 25, - 9, 8, 36, 19, 17, 33, 1, 9, 8, 36, 19, 17, 35, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49, 43, 1, 7, 15, 25, 37, 33, 17, 37, 47, 49, - 0, 3, 6, 0, 6, 0, 0, 0, 3, 6, 0, 6, 6, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0, 3, 0, 0, 6, 0, 0, 0, 0, 6, 6, 0 }; - -/* Left and Right Row Address Pattern from Table 2 */ -static char *RAPLR[53] = {"", "221311", "311311", "312211", "222211", "213211", "214111", "223111", - "313111", "322111", "412111", "421111", "331111", "241111", "232111", "231211", "321211", - "411211", "411121", "411112", "321112", "312112", "311212", "311221", "311131", "311122", - "311113", "221113", "221122", "221131", "221221", "222121", "312121", "321121", "231121", - "231112", "222112", "213112", "212212", "212221", "212131", "212122", "212113", "211213", - "211123", "211132", "211141", "211231", "211222", "211312", "211321", "211411", "212311" }; - -/* Centre Row Address Pattern from Table 2 */ -static char *RAPC[53] = {"", "112231", "121231", "122131", "131131", "131221", "132121", "141121", - "141211", "142111", "133111", "132211", "131311", "122311", "123211", "124111", "115111", - "114211", "114121", "123121", "123112", "122212", "122221", "121321", "121411", "112411", - "113311", "113221", "113212", "113122", "122122", "131122", "131113", "122113", "113113", - "112213", "112222", "112312", "112321", "111421", "111331", "111322", "111232", "111223", - "111133", "111124", "111214", "112114", "121114", "121123", "121132", "112132", "112141" }; - -void byteprocess(int *chainemc, int *mclength, unsigned char chaine[], int start, int length, int block); \ No newline at end of file diff --git a/3rdparty/zint-2.4.4/backend/plessey.c b/3rdparty/zint-2.4.4/backend/plessey.c deleted file mode 100644 index 3c4cb5f..0000000 --- a/3rdparty/zint-2.4.4/backend/plessey.c +++ /dev/null @@ -1,498 +0,0 @@ -/* plessey.c - Handles Plessey and MSI Plessey */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#include "common.h" - - -#define SSET "0123456789ABCDEF" -static char *PlessTable[16] = {"13131313", "31131313", "13311313", "31311313", "13133113", "31133113", - "13313113", "31313113", "13131331", "31131331", "13311331", "31311331", "13133131", - "31133131", "13313131", "31313131"}; - -static char *MSITable[10] = {"12121212", "12121221", "12122112", "12122121", "12211212", "12211221", - "12212112", "12212121", "21121212", "21121221"}; - - -int plessey(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Not MSI/Plessey but the older Plessey standard */ - - unsigned int i, check; - unsigned char *checkptr; - static char grid[9] = {1,1,1,1,0,1,0,0,1}; - char dest[1024]; /* 8 + 65 * 8 + 8 * 2 + 9 + 1 ~ 1024 */ - int error_number; - - error_number = 0; - - if(length > 65) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(SSET, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - checkptr = (unsigned char *)calloc (1, length * 4 + 8); - - /* Start character */ - strcpy(dest, "31311331"); - - /* Data area */ - for(i = 0; i < length; i++) - { - check = posn(SSET, source[i]); - lookup(SSET, PlessTable, source[i], dest); - checkptr[4*i] = check & 1; - checkptr[4*i+1] = (check >> 1) & 1; - checkptr[4*i+2] = (check >> 2) & 1; - checkptr[4*i+3] = (check >> 3) & 1; - } - - /* CRC check digit code adapted from code by Leonid A. Broukhis - used in GNU Barcode */ - - for (i = 0; i < (4 * length); i++) { - int j; - if (checkptr[i]) - for (j = 0; j < 9; j++) - checkptr[i+j] ^= grid[j]; - } - - for (i = 0; i < 8; i++) { - switch(checkptr[length * 4 + i]) - { - case 0: concat(dest, "13"); break; - case 1: concat(dest, "31"); break; - } - } - - /* Stop character */ - concat(dest, "331311313"); - - expand(symbol, dest); - ustrcpy(symbol->text, source); - free(checkptr); - return error_number; -} - -int msi_plessey(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Plain MSI Plessey - does not calculate any check character */ - - unsigned int i; - char dest[512]; /* 2 + 55 * 8 + 3 + 1 ~ 512 */ - - if(length > 55) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* start character */ - strcpy(dest, "21"); - - for(i = 0; i < length; i++) - { - lookup(NEON, MSITable, source[i], dest); - } - - /* Stop character */ - concat (dest, "121"); - - expand(symbol, dest); - ustrcpy(symbol->text, source); - return 0; -} - -int msi_plessey_mod10(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* MSI Plessey with Modulo 10 check digit - algorithm from Barcode Island - http://www.barcodeisland.com/ */ - - int i; - unsigned long wright, dau, pedwar, pump, n; - char un[200], tri[32]; - int error_number, h; - char dest[1000]; - - error_number = 0; - - if(length > 18) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* start character */ - strcpy(dest, "21"); - - /* draw data section */ - for(i = 0; i < length; i++) - { - lookup(NEON, MSITable, source[i], dest); - } - - /* caluculate check digit */ - wright = 0; - n = !(length & 1); - for(i = n; i < length; i += 2) - { - un[wright++] = source[i]; - } - un[wright] = '\0'; - - dau = strtoul(un, NULL, 10); - dau *= 2; - - sprintf(tri, "%ld", dau); - - pedwar = 0; - h = strlen(tri); - for(i = 0; i < h; i++) - { - pedwar += ctoi(tri[i]); - } - - n = length & 1; - for(i = n; i < length; i+=2) - { - pedwar += ctoi(source[i]); - } - - pump = (10 - pedwar % 10); - if(pump == 10) - { - pump = 0; - } - - /* draw check digit */ - lookup(NEON, MSITable, itoc(pump), dest); - - /* Stop character */ - concat (dest, "121"); - expand(symbol, dest); - - ustrcpy(symbol->text, source); - symbol->text[length] = itoc(pump); - symbol->text[length + 1] = '\0'; - return error_number; -} - -int msi_plessey_mod1010(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) -{ /* MSI Plessey with two Modulo 10 check digits - algorithm from - Barcode Island http://www.barcodeisland.com/ */ - - unsigned long i, n, wright, dau, pedwar, pump, chwech; - char un[16], tri[32]; - int error_number, h; - char dest[1000]; - - error_number = 0; - - if(src_len > 18) { /* No Entry Stack Smashers! limit because of str->number conversion*/ - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* start character */ - strcpy(dest, "21"); - - /* draw data section */ - for(i = 0; i < src_len; i++) - { - lookup(NEON, MSITable, source[i], dest); - } - - /* calculate first check digit */ - wright = 0; - - n = !(src_len & 1); - for(i = n; i < src_len; i += 2) - { - un[wright++] = source[i]; - } - un[wright] = '\0'; - - dau = strtoul(un, NULL, 10); - dau *= 2; - - sprintf(tri, "%ld", dau); - - pedwar = 0; - h = strlen(tri); - for(i = 0; i < h; i++) - { - pedwar += ctoi(tri[i]); - } - - n = src_len & 1; - for(i = n; i < src_len; i += 2) - { - pedwar += ctoi(source[i]); - } - - pump = 10 - pedwar % 10; - if(pump == 10) - { - pump = 0; - } - - /* calculate second check digit */ - wright = 0; - n = src_len & 1; - for(i = n; i < src_len; i += 2) - { - un[wright++] = source[i]; - } - un[wright++] = itoc(pump); - un[wright] = '\0'; - - dau = strtoul(un, NULL, 10); - dau *= 2; - - sprintf(tri, "%ld", dau); - - pedwar = 0; - h = strlen(tri); - for(i = 0; i < h; i++) - { - pedwar += ctoi(tri[i]); - } - - - i = !(src_len & 1); - for(; i < src_len; i += 2) - { - pedwar += ctoi(source[i]); - } - - chwech = 10 - pedwar % 10; - if(chwech == 10) - { - chwech = 0; - } - - /* Draw check digits */ - lookup(NEON, MSITable, itoc(pump), dest); - lookup(NEON, MSITable, itoc(chwech), dest); - - /* Stop character */ - concat (dest, "121"); - - expand(symbol, dest); - - ustrcpy(symbol->text, source); - symbol->text[src_len] = itoc(pump); - symbol->text[src_len + 1] = itoc(chwech); - symbol->text[src_len + 2] = '\0'; - - return error_number; -} - - -int msi_plessey_mod11(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) -{ - /* Calculate a Modulo 11 check digit using the system discussed on Wikipedia - - see http://en.wikipedia.org/wiki/Talk:MSI_Barcode */ - /* uses the IBM weight system */ - - int i, weight, x, check; - int error_number; - char dest[1000]; - - error_number = 0; - - if(src_len > 55) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* start character */ - strcpy(dest, "21"); - - /* draw data section */ - for(i = 0; i < src_len; i++) - { - lookup(NEON, MSITable, source[i], dest); - } - - /* calculate check digit */ - x = 0; - weight = 2; - for(i = src_len - 1; i >= 0; i--) { - x += weight * ctoi(source[i]); - weight++; - if(weight > 7) { - weight = 2; - } - } - - check = (11 - (x % 11)) % 11; - if(check == 10) { - lookup(NEON, MSITable, '1', dest); - lookup(NEON, MSITable, '0', dest); - } else { - lookup(NEON, MSITable, itoc(check), dest); - } - - /* stop character */ - concat (dest, "121"); - - expand(symbol, dest); - - ustrcpy(symbol->text, source); - if(check == 10) { - concat((char* )symbol->text, "10"); - } else { - symbol->text[src_len] = itoc(check); - symbol->text[src_len + 1] = '\0'; - } - - return error_number; -} - -int msi_plessey_mod1110(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len) -{ - /* Combining the Barcode Island and Wikipedia code */ - /* Verified against http://www.bokai.com/BarcodeJSP/applet/BarcodeSampleApplet.htm */ - /* Weighted using the IBM system */ - - int i; - unsigned long weight, x, check, wright, dau, pedwar, pump, h; - char un[16], tri[16]; - int error_number; - char dest[1000]; - unsigned char temp[32]; - unsigned int temp_len; - - error_number = 0; - - if(src_len > 18) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* start character */ - strcpy(dest, "21"); - - /* draw data section */ - for(i = 0; i < src_len; i++) - { - lookup(NEON, MSITable, source[i], dest); - } - - /* calculate first (mod 11) digit */ - x = 0; - weight = 2; - for(i = src_len - 1; i >= 0; i--) { - x += weight * ctoi(source[i]); - weight++; - if(weight > 7) { - weight = 2; - } - } - - check = (11 - (x % 11)) % 11; - ustrcpy(temp, source); - temp_len = src_len; - if(check == 10) { - lookup(NEON, MSITable, '1', dest); - lookup(NEON, MSITable, '0', dest); - uconcat(temp, (unsigned char *)"10"); - temp_len += 2; - } else { - lookup(NEON, MSITable, itoc(check), dest); - temp[temp_len++] = itoc(check); - temp[temp_len] = '\0'; - } - - /* caluculate second (mod 10) check digit */ - wright = 0; - i = !(temp_len & 1); - for(; i < temp_len; i += 2) - { - un[wright++] = temp[i]; - } - un[wright] = '\0'; - - dau = strtoul(un, NULL, 10); - dau *= 2; - - sprintf(tri, "%ld", dau); - - pedwar = 0; - h = strlen(tri); - for(i = 0; i < h; i++) - { - pedwar += ctoi(tri[i]); - } - - i = temp_len & 1; - for(; i < temp_len; i+=2) - { - pedwar += ctoi(temp[i]); - } - - pump = 10 - pedwar % 10; - if(pump == 10) - { - pump = 0; - } - - /* draw check digit */ - lookup(NEON, MSITable, itoc(pump), dest); - - /* stop character */ - concat (dest, "121"); - expand(symbol, dest); - - temp[temp_len++] = itoc(pump); - temp[temp_len] = '\0'; - - - ustrcpy(symbol->text, temp); - return error_number; -} - -int msi_handle(struct zint_symbol *symbol, unsigned char source[], int length) { - int error_number; - - error_number = is_sane(NEON, source, length); - if(error_number != 0) { - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ERROR_INVALID_DATA1; - } - - - if((symbol->option_2 < 0) || (symbol->option_2 > 4)) { - symbol->option_2 = 0; - } - - switch(symbol->option_2) { - case 0: error_number = msi_plessey(symbol, source, length); break; - case 1: error_number = msi_plessey_mod10(symbol, source, length); break; - case 2: error_number = msi_plessey_mod1010(symbol, source, length); break; - case 3: error_number = msi_plessey_mod11(symbol, source, length); break; - case 4: error_number = msi_plessey_mod1110(symbol, source, length); break; - } - - return error_number; -} diff --git a/3rdparty/zint-2.4.4/backend/png.c b/3rdparty/zint-2.4.4/backend/png.c deleted file mode 100644 index 251df8b..0000000 --- a/3rdparty/zint-2.4.4/backend/png.c +++ /dev/null @@ -1,1146 +0,0 @@ -/* png.c - Handles output to PNG file */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#ifdef _MSC_VER -#include -#include -#endif -#include -#include -#include "common.h" - -#ifdef _MSC_VER -#include -#endif /* _MSC_VER */ - -#ifndef NO_PNG -#include "png.h" /* libpng header; includes zlib.h and setjmp.h */ -#endif /* NO_PNG */ -#include "maxipng.h" /* Maxicode shapes */ - -#include "font.h" /* Font for human readable text */ - -#define SSET "0123456789ABCDEF" - -#define PNG_DATA 100 -#define BMP_DATA 200 - -#ifndef NO_PNG -struct mainprog_info_type { - long width; - long height; - FILE *outfile; - jmp_buf jmpbuf; -}; - -static void writepng_error_handler(png_structp png_ptr, png_const_charp msg) -{ - struct mainprog_info_type *graphic; - - fprintf(stderr, "writepng libpng error: %s\n", msg); - fflush(stderr); - - graphic = (struct mainprog_info_type*)png_get_error_ptr(png_ptr); - if (graphic == NULL) { /* we are completely hosed now */ - fprintf(stderr, - "writepng severe error: jmpbuf not recoverable; terminating.\n"); - fflush(stderr); - return; - } - longjmp(graphic->jmpbuf, 1); -} - -int png_pixel_plot(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle) -{ - struct mainprog_info_type wpng_info; - struct mainprog_info_type *graphic; - -#ifndef _MSC_VER - unsigned char outdata[image_width * 3]; -#else - unsigned char* outdata = (unsigned char*)_alloca(image_width * 3); -#endif - png_structp png_ptr; - png_infop info_ptr; - graphic = &wpng_info; - unsigned long rowbytes; - unsigned char *image_data; - int i, row, column, errno; - int fgred, fggrn, fgblu, bgred, bggrn, bgblu; - - switch(rotate_angle) { - case 0: - case 180: - graphic->width = image_width; - graphic->height = image_height; - break; - case 90: - case 270: - graphic->width = image_height; - graphic->height = image_width; - break; - } - - /* sort out colour options */ - to_upper((unsigned char*)symbol->fgcolour); - to_upper((unsigned char*)symbol->bgcolour); - - if(strlen(symbol->fgcolour) != 6) { - strcpy(symbol->errtxt, "Malformed foreground colour target"); - return ERROR_INVALID_OPTION; - } - if(strlen(symbol->bgcolour) != 6) { - strcpy(symbol->errtxt, "Malformed background colour target"); - return ERROR_INVALID_OPTION; - } - errno = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour)); - if (errno == ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Malformed foreground colour target"); - return ERROR_INVALID_OPTION; - } - errno = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->bgcolour)); - if (errno == ERROR_INVALID_DATA) { - strcpy(symbol->errtxt, "Malformed background colour target"); - return ERROR_INVALID_OPTION; - } - - fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); - fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); - fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); - bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); - bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); - bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); - - /* Open output file in binary mode */ - if((symbol->output_options & BARCODE_STDOUT) != 0) { -#ifdef _MSC_VER - if (-1 == _setmode(_fileno(stdout), _O_BINARY)) { - strcpy(symbol->errtxt, "Can't open output file"); - return ERROR_FILE_ACCESS; - } -#endif - graphic->outfile = stdout; - } else { - if (!(graphic->outfile = fopen(symbol->outfile, "wb"))) { - strcpy(symbol->errtxt, "Can't open output file"); - return ERROR_FILE_ACCESS; - } - } - - /* Set up error handling routine as proc() above */ - png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, graphic, writepng_error_handler, NULL); - if (!png_ptr) { - strcpy(symbol->errtxt, "Out of memory"); - return ERROR_MEMORY; - } - - info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) { - png_destroy_write_struct(&png_ptr, NULL); - strcpy(symbol->errtxt, "Out of memory"); - return ERROR_MEMORY; - } - - /* catch jumping here */ - if (setjmp(graphic->jmpbuf)) { - png_destroy_write_struct(&png_ptr, &info_ptr); - strcpy(symbol->errtxt, "libpng error occurred"); - return ERROR_MEMORY; - } - - /* open output file with libpng */ - png_init_io(png_ptr, graphic->outfile); - - /* set compression */ - png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); - - /* set Header block */ - png_set_IHDR(png_ptr, info_ptr, graphic->width, graphic->height, - 8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); - - /* write all chunks up to (but not including) first IDAT */ - png_write_info(png_ptr, info_ptr); - - /* set up the transformations: for now, just pack low-bit-depth pixels - into bytes (one, two or four pixels per byte) */ - png_set_packing(png_ptr); - - /* set rowbytes - depends on picture depth */ - rowbytes = wpng_info.width * 3; - - /* Pixel Plotting */ - - switch(rotate_angle) { - case 0: /* Plot the right way up */ - for(row = 0; row < image_height; row++) { - for(column = 0; column < image_width; column++) { - i = column * 3; - switch(*(pixelbuf + (image_width * row) + column)) - { - case '1': - outdata[i] = fgred; - outdata[i + 1] = fggrn; - outdata[i + 2] = fgblu; - break; - default: - outdata[i] = bgred; - outdata[i + 1] = bggrn; - outdata[i + 2] = bgblu; - break; - - } - } - /* write row contents to file */ - image_data = outdata; - png_write_row(png_ptr, image_data); - } - break; - case 90: /* Plot 90 degrees clockwise */ - for(row = 0; row < image_width; row++) { - for(column = 0; column < image_height; column++) { - i = column * 3; - switch(*(pixelbuf + (image_width * (image_height - column - 1)) + row)) - { - case '1': - outdata[i] = fgred; - outdata[i + 1] = fggrn; - outdata[i + 2] = fgblu; - break; - default: - outdata[i] = bgred; - outdata[i + 1] = bggrn; - outdata[i + 2] = bgblu; - break; - - } - } - - /* write row contents to file */ - image_data = outdata; - png_write_row(png_ptr, image_data); - } - break; - case 180: /* Plot upside down */ - for(row = 0; row < image_height; row++) { - for(column = 0; column < image_width; column++) { - i = column * 3; - switch(*(pixelbuf + (image_width * (image_height - row - 1)) + (image_width - column - 1))) - { - case '1': - outdata[i] = fgred; - outdata[i + 1] = fggrn; - outdata[i + 2] = fgblu; - break; - default: - outdata[i] = bgred; - outdata[i + 1] = bggrn; - outdata[i + 2] = bgblu; - break; - - } - } - - /* write row contents to file */ - image_data = outdata; - png_write_row(png_ptr, image_data); - } - break; - case 270: /* Plot 90 degrees anti-clockwise */ - for(row = 0; row < image_width; row++) { - for(column = 0; column < image_height; column++) { - i = column * 3; - switch(*(pixelbuf + (image_width * column) + (image_width - row - 1))) - { - case '1': - outdata[i] = fgred; - outdata[i + 1] = fggrn; - outdata[i + 2] = fgblu; - break; - default: - outdata[i] = bgred; - outdata[i + 1] = bggrn; - outdata[i + 2] = bgblu; - break; - - } - } - - /* write row contents to file */ - image_data = outdata; - png_write_row(png_ptr, image_data); - } - break; - } - - /* End the file */ - png_write_end(png_ptr, NULL); - - /* make sure we have disengaged */ - if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr); - fclose(wpng_info.outfile); - return 0; -} -#endif /* NO_PNG */ - -int bmp_pixel_plot(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle) -{ - unsigned long rowbytes; - int i, row, column, errno; - int fgred, fggrn, fgblu, bgred, bggrn, bgblu; - - switch(rotate_angle) { - case 0: - case 180: - symbol->bitmap_width = image_width; - symbol->bitmap_height = image_height; - break; - case 90: - case 270: - symbol->bitmap_width = image_height; - symbol->bitmap_height = image_width; - break; - } - - if (symbol->bitmap != NULL) - free(symbol->bitmap); - - symbol->bitmap = (char *) malloc(image_width * image_height * 3); - - - /* sort out colour options */ - to_upper((unsigned char*)symbol->fgcolour); - to_upper((unsigned char*)symbol->bgcolour); - - if(strlen(symbol->fgcolour) != 6) { - strcpy(symbol->errtxt, "Malformed foreground colour target"); - return ERROR_INVALID_OPTION; - } - if(strlen(symbol->bgcolour) != 6) { - strcpy(symbol->errtxt, "Malformed background colour target"); - return ERROR_INVALID_OPTION; - } - errno = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour)); - if (errno == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Malformed foreground colour target"); - return ERROR_INVALID_OPTION; - } - errno = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->fgcolour)); - if (errno == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Malformed background colour target"); - return ERROR_INVALID_OPTION; - } - - fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); - fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); - fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); - bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); - bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); - bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); - - /* set rowbytes - depends on picture depth */ - rowbytes = symbol->bitmap_width * 3; - - /* Pixel Plotting */ - i = 0; - switch(rotate_angle) { - case 0: /* Plot the right way up */ - for(row = 0; row < image_height; row++) { - for(column = 0; column < image_width; column++) { - switch(*(pixelbuf + (image_width * row) + column)) - { - case '1': - symbol->bitmap[i++] = fgred; - symbol->bitmap[i++] = fggrn; - symbol->bitmap[i++] = fgblu; - break; - default: - symbol->bitmap[i++] = bgred; - symbol->bitmap[i++] = bggrn; - symbol->bitmap[i++] = bgblu; - break; - - } - } - } - break; - case 90: /* Plot 90 degrees clockwise */ - for(row = 0; row < image_width; row++) { - for(column = 0; column < image_height; column++) { - switch(*(pixelbuf + (image_width * (image_height - column - 1)) + row)) - { - case '1': - symbol->bitmap[i++] = fgred; - symbol->bitmap[i++] = fggrn; - symbol->bitmap[i++] = fgblu; - break; - default: - symbol->bitmap[i++] = bgred; - symbol->bitmap[i++] = bggrn; - symbol->bitmap[i++] = bgblu; - break; - - } - } - } - break; - case 180: /* Plot upside down */ - for(row = 0; row < image_height; row++) { - for(column = 0; column < image_width; column++) { - switch(*(pixelbuf + (image_width * (image_height - row - 1)) + (image_width - column - 1))) - { - case '1': - symbol->bitmap[i++] = fgred; - symbol->bitmap[i++] = fggrn; - symbol->bitmap[i++] = fgblu; - break; - default: - symbol->bitmap[i++] = bgred; - symbol->bitmap[i++] = bggrn; - symbol->bitmap[i++] = bgblu; - break; - - } - } - } - break; - case 270: /* Plot 90 degrees anti-clockwise */ - for(row = 0; row < image_width; row++) { - for(column = 0; column < image_height; column++) { - switch(*(pixelbuf + (image_width * column) + (image_width - row - 1))) - { - case '1': - symbol->bitmap[i++] = fgred; - symbol->bitmap[i++] = fggrn; - symbol->bitmap[i++] = fgblu; - break; - default: - symbol->bitmap[i++] = bgred; - symbol->bitmap[i++] = bggrn; - symbol->bitmap[i++] = bgblu; - break; - - } - } - } - break; - } - - return 0; -} - -int png_to_file(struct zint_symbol *symbol, int image_height, int image_width, char *pixelbuf, int rotate_angle, int image_type) -{ - int error_number; - float scaler = symbol->scale; - char *scaled_pixelbuf; - int horiz, vert, i; - int scale_width, scale_height; - - if(scaler == 0) { scaler = 0.5; } - scale_width = image_width * scaler; - scale_height = image_height * scaler; - - /* Apply scale options by creating another pixel buffer */ - if (!(scaled_pixelbuf = (char *) malloc(scale_width * scale_height))) { - printf("Insufficient memory for pixel buffer"); - return ERROR_ENCODING_PROBLEM; - } else { - for(i = 0; i < (scale_width * scale_height); i++) { - *(scaled_pixelbuf + i) = '0'; - } - } - - for(vert = 0; vert < scale_height; vert++) { - for(horiz = 0; horiz < scale_width; horiz++) { - *(scaled_pixelbuf + (vert * scale_width) + horiz) = *(pixelbuf + ((int)(vert / scaler) * image_width) + (int)(horiz / scaler)); - } - } - - if(image_type == PNG_DATA) { -#ifndef NO_PNG - error_number = png_pixel_plot(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle); -#else - return ERROR_INVALID_OPTION; -#endif - } else { - error_number = bmp_pixel_plot(symbol, scale_height, scale_width, scaled_pixelbuf, rotate_angle); - } - - free(scaled_pixelbuf); - - return error_number; -} - -void draw_bar(char *pixelbuf, int xpos, int xlen, int ypos, int ylen, int image_width, int image_height) -{ - /* Draw a rectangle */ - int i, j, png_ypos; - - png_ypos = image_height - ypos - ylen; - /* This fudge is needed because EPS measures height from the bottom up but - PNG measures y position from the top down */ - - for(i = (xpos); i < (xpos + xlen); i++) { - for( j = (png_ypos); j < (png_ypos + ylen); j++) { - *(pixelbuf + (image_width * j) + i) = '1'; - } - } -} - -int bullseye_pixel(int row, int col) { - int block_val, block_pos, return_val; - - block_val = bullseye_compressed[(row * 12) + (col / 8)]; - return_val = 0; - block_pos = col % 8; - - switch(block_pos) { - case 0: if((block_val & 0x80) != 0) { return_val = 1; } break; - case 1: if((block_val & 0x40) != 0) { return_val = 1; } break; - case 2: if((block_val & 0x20) != 0) { return_val = 1; } break; - case 3: if((block_val & 0x10) != 0) { return_val = 1; } break; - case 4: if((block_val & 0x08) != 0) { return_val = 1; } break; - case 5: if((block_val & 0x04) != 0) { return_val = 1; } break; - case 6: if((block_val & 0x02) != 0) { return_val = 1; } break; - case 7: if((block_val & 0x01) != 0) { return_val = 1; } break; - } - - return return_val; -} - -void draw_bullseye(char *pixelbuf, int image_width, int xoffset, int yoffset) -{ - /* Central bullseye in Maxicode symbols */ - int i, j; - - for(j = 103; j < 196; j++) { - for(i = 0; i < 93; i++) { - if(bullseye_pixel(j - 103, i)) { - /* if(bullseye[(((j - 103) * 93) + i)] == 1) { */ - *(pixelbuf + (image_width * j) + (image_width * yoffset) + i + 99 + xoffset) = '1'; - } - } - } -} - -void draw_hexagon(char *pixelbuf, int image_width, int xposn, int yposn) -{ - /* Put a hexagon into the pixel buffer */ - int i, j; - - for(i = 0; i < 12; i++) { - for(j = 0; j < 10; j++) { - if(hexagon[(i * 10) + j] == 1) { - *(pixelbuf + (image_width * i) + (image_width * yposn) + xposn + j) = '1'; - } - } - } -} - -void draw_letter(char *pixelbuf, unsigned char letter, int xposn, int yposn, int smalltext, int image_width, int image_height) -{ - /* Put a letter into a position */ - int skip, i, j, glyph_no, alphabet; - - skip = 0; - alphabet = 0; - - if(letter < 33) { skip = 1; } - if((letter > 127) && (letter < 161)) { skip = 1; } - - if(skip == 0) { - if(letter > 128) { - alphabet = 1; - glyph_no = letter - 161; - } else { - glyph_no = letter - 33; - } - - if(smalltext) { - for(i = 0; i <= 8; i++) { - for(j = 0; j < 5; j++) { - if(alphabet == 0) { - if(small_font[(glyph_no * 5) + (i * 475) + j - 1] == 1) { - *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1'; - } - } else { - if(small_font_extended[(glyph_no * 5) + (i * 475) + j - 1] == 1) { - *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1'; - } - } - } - } - } else { - for(i = 0; i <= 13; i++) { - for(j = 0; j < 7 ; j++) { - if(alphabet == 0) { - if(ascii_font[(glyph_no * 7) + (i * 665) + j - 1] == 1) { - *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1'; - } - } else { - if(ascii_ext_font[(glyph_no * 7) + (i * 665) + j - 1] == 1) { - *(pixelbuf + (i * image_width) + (yposn * image_width) + xposn + j) = '1'; - } - } - } - } - } - } -} - -void draw_string(char *pixbuf, char input_string[], int xposn, int yposn, int smalltext, int image_width, int image_height) -{ - /* Plot a string into the pixel buffer */ - int i, string_length, string_left_hand; - - string_length = strlen(input_string); - string_left_hand = xposn - ((7 * string_length) / 2); - - for(i = 0; i < string_length; i++) { - draw_letter(pixbuf, input_string[i], string_left_hand + (i * 7), yposn, smalltext, image_width, image_height); - } - -} - -int maxi_png_plot(struct zint_symbol *symbol, int rotate_angle, int data_type) -{ - int i, row, column, xposn, yposn; - int image_height, image_width; - char *pixelbuf; - int error_number; - int xoffset, yoffset; - - xoffset = symbol->border_width + symbol->whitespace_width; - yoffset = symbol->border_width; - image_width = 300 + (2 * xoffset * 2); - image_height = 300 + (2 * yoffset * 2); - - if (!(pixelbuf = (char *) malloc(image_width * image_height))) { - printf("Insifficient memory for pixel buffer"); - return ERROR_ENCODING_PROBLEM; - } else { - for(i = 0; i < (image_width * image_height); i++) { - *(pixelbuf + i) = '0'; - } - } - - draw_bullseye(pixelbuf, image_width, (2 * xoffset), (2 * yoffset)); - - for(row = 0; row < symbol->rows; row++) { - yposn = row * 9; - for(column = 0; column < symbol->width; column++) { - xposn = column * 10; - if(module_is_set(symbol, row, column)) { - if(row & 1) { - /* Odd (reduced) row */ - xposn += 5; - draw_hexagon(pixelbuf, image_width, xposn + (2 * xoffset), yposn + (2 * yoffset)); - } else { - /* Even (full) row */ - draw_hexagon(pixelbuf, image_width, xposn + (2 * xoffset), yposn + (2 * yoffset)); - } - } - } - } - - if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - /* boundary bars */ - draw_bar(pixelbuf, 0, image_width, 0, symbol->border_width * 2, image_width, image_height); - draw_bar(pixelbuf, 0, image_width, 300 + (symbol->border_width * 2), symbol->border_width * 2, image_width, image_height); - } - - if((symbol->output_options & BARCODE_BOX) != 0) { - /* side bars */ - draw_bar(pixelbuf, 0, symbol->border_width * 2, 0, image_height, image_width, image_height); - draw_bar(pixelbuf, 300 + ((symbol->border_width + symbol->whitespace_width + symbol->whitespace_width) * 2), symbol->border_width * 2, 0, image_height, image_width, image_height); - } - - error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type); - free(pixelbuf); - return error_number; -} - -void to_latin1(unsigned char source[], unsigned char preprocessed[]) -{ - int j, i, input_length; - - input_length = ustrlen(source); - - j = 0; - i = 0; - do { - if(source[i] < 128) { - preprocessed[j] = source[i]; - j++; - i++; - } else { - if(source[i] == 0xC2) { - preprocessed[j] = source[i + 1]; - j++; - i += 2; - } - if(source[i] == 0xC3) { - preprocessed[j] = source[i + 1] + 64; - j++; - i += 2; - } - } - } while (i < input_length); - preprocessed[j] = '\0'; - - return; -} - -int png_plot(struct zint_symbol *symbol, int rotate_angle, int data_type) -{ - int textdone, main_width, comp_offset, large_bar_count; - char textpart[10], addon[6]; - float addon_text_posn, preset_height, large_bar_height; - int i, r, textoffset, yoffset, xoffset, latch, image_width, image_height; - char *pixelbuf; - int addon_latch = 0, smalltext = 0; - int this_row, block_width, plot_height, plot_yposn, textpos; - float row_height, row_posn; - int error_number; - int default_text_posn; - int next_yposn; -#ifndef _MSC_VER - unsigned char local_text[ustrlen(symbol->text) + 1]; -#else - unsigned char* local_text = (unsigned char*)_alloca(ustrlen(symbol->text) + 1); -#endif - - if(symbol->show_hrt != 0) { - to_latin1(symbol->text, local_text); - } else { - local_text[0] = '\0'; - } - - textdone = 0; - main_width = symbol->width; - strcpy(addon, ""); - comp_offset = 0; - addon_text_posn = 0.0; - row_height = 0; - if(symbol->output_options & SMALL_TEXT) { - smalltext = 1; - } - - if (symbol->height == 0) { - symbol->height = 50; - } - - large_bar_count = 0; - preset_height = 0.0; - for(i = 0; i < symbol->rows; i++) { - preset_height += symbol->row_height[i]; - if(symbol->row_height[i] == 0) { - large_bar_count++; - } - } - - if (large_bar_count == 0) { - symbol->height = preset_height; - large_bar_height = 10; - } else { - large_bar_height = (symbol->height - preset_height) / large_bar_count; - } - - while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { - comp_offset++; - } - - /* Certain symbols need whitespace otherwise characters get chopped off the sides */ - if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) - || (symbol->symbology == BARCODE_ISBNX)) { - switch(ustrlen(local_text)) { - case 13: /* EAN 13 */ - case 16: - case 19: - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_width = 96 + comp_offset; - break; - default: - main_width = 68 + comp_offset; - } - } - - if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - main_width = 96 + comp_offset; - } - } - - if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - main_width = 51 + comp_offset; - } - } - - latch = 0; - r = 0; - /* Isolate add-on text */ - if(is_extendable(symbol->symbology)) { - for(i = 0; i < ustrlen(local_text); i++) { - if (latch == 1) { - addon[r] = local_text[i]; - r++; - } - if (symbol->text[i] == '+') { - latch = 1; - } - } - } - addon[r] = '\0'; - - if(ustrlen(local_text) != 0) { - textoffset = 9; - } else { - textoffset = 0; - } - xoffset = symbol->border_width + symbol->whitespace_width; - yoffset = symbol->border_width; - image_width = 2 * (symbol->width + xoffset + xoffset); - image_height = 2 * (symbol->height + textoffset + yoffset + yoffset); - - if (!(pixelbuf = (char *) malloc(image_width * image_height))) { - printf("Insufficient memory for pixel buffer"); - return ERROR_ENCODING_PROBLEM; - } else { - for(i = 0; i < (image_width * image_height); i++) { - *(pixelbuf + i) = '0'; - } - } - - if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - default_text_posn = image_height - 17; - } else { - default_text_posn = image_height - 17 - symbol->border_width - symbol->border_width; - } - - row_posn = textoffset + yoffset; - next_yposn = textoffset + yoffset; - row_height = 0; - - /* Plot the body of the symbol to the pixel buffer */ - for(r = 0; r < symbol->rows; r++) { - this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */ - row_posn += row_height; - plot_yposn = next_yposn; - if(symbol->row_height[this_row] == 0) { - row_height = large_bar_height; - } else { - row_height = symbol->row_height[this_row]; - } - next_yposn = (int)(row_posn + row_height); - plot_height = next_yposn - plot_yposn; - - i = 0; - if(module_is_set(symbol, this_row, 0)) { - latch = 1; - } else { - latch = 0; - } - - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); - if((addon_latch == 0) && (r == 0) && (i > main_width)) { - plot_height = (int)(row_height - 5.0); - plot_yposn = (int)(row_posn - 5.0); - addon_text_posn = row_posn + row_height - 8.0; - addon_latch = 1; - } - if(latch == 1) { - /* a bar */ - draw_bar(pixelbuf, (i + xoffset) * 2, block_width * 2, plot_yposn * 2, plot_height * 2, image_width, image_height); - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - - } while (i < symbol->width); - } - - xoffset += comp_offset; - - if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || (symbol->symbology == BARCODE_ISBNX)) { - /* guard bar extensions and text formatting for EAN8 and EAN13 */ - switch(ustrlen(local_text)) { - case 8: /* EAN-8 */ - case 11: - case 14: - draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (32 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (34 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (64 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (66 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - for(i = 0; i < 4; i++) { - textpart[i] = symbol->text[i]; - } - textpart[4] = '\0'; - textpos = 2 * (17 + xoffset); - - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - for(i = 0; i < 4; i++) { - textpart[i] = symbol->text[i + 4]; - } - textpart[4] = '\0'; - textpos = 2 * (50 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = 2 * (xoffset + 86); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); - break; - case 5: - textpos = 2 * (xoffset + 100); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); - break; - } - - break; - case 13: /* EAN 13 */ - case 16: - case 19: - draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (92 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (94 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = 2 * (-7 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - textpos = 2 * (24 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 7]; - } - textpart[6] = '\0'; - textpos = 2 * (71 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = 2 * (xoffset + 114); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); - break; - case 5: - textpos = 2 * (xoffset + 128); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); - break; - } - break; - - } - } - - if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { - /* guard bar extensions and text formatting for UPCA */ - latch = 1; - - i = 0 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); - if(latch == 1) { - /* a bar */ - draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - } while (i < 11 + comp_offset); - draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - latch = 1; - i = 85 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); - if(latch == 1) { - /* a bar */ - draw_bar(pixelbuf, (i + xoffset - comp_offset) * 2, block_width * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - } while (i < 96 + comp_offset); - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = 2 * (-5 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - for(i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[5] = '\0'; - textpos = 2 * (27 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - for(i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 6]; - } - textpart[6] = '\0'; - textpos = 2 * (68 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - textpart[0] = symbol->text[11]; - textpart[1] = '\0'; - textpos = 2 * (100 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = 2 * (xoffset + 116); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); - break; - case 5: - textpos = 2 * (xoffset + 130); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); - break; - } - - } - - if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { - /* guard bar extensions and text formatting for UPCE */ - draw_bar(pixelbuf, (0 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (2 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (46 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (48 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - draw_bar(pixelbuf, (50 + xoffset) * 2, 1 * 2, (4 + (int)yoffset) * 2, 5 * 2, image_width, image_height); - - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = 2 * (-5 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - textpos = 2 * (24 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - textpart[0] = symbol->text[7]; - textpart[1] = '\0'; - textpos = 2 * (55 + xoffset); - draw_string(pixelbuf, textpart, textpos, default_text_posn, smalltext, image_width, image_height); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = 2 * (xoffset + 70); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); - break; - case 5: - textpos = 2 * (xoffset + 84); - draw_string(pixelbuf, addon, textpos, image_height - (addon_text_posn * 2) - 13, smalltext, image_width, image_height); - break; - } - - } - - xoffset -= comp_offset; - - /* Put boundary bars or box around symbol */ - if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - /* boundary bars */ - draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, textoffset * 2, symbol->border_width * 2, image_width, image_height); - draw_bar(pixelbuf, 0, (symbol->width + xoffset + xoffset) * 2, (textoffset + symbol->height + symbol->border_width) * 2, symbol->border_width * 2, image_width, image_height); - if((symbol->output_options & BARCODE_BIND) != 0) { - if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { - /* row binding */ - for(r = 1; r < symbol->rows; r++) { - draw_bar(pixelbuf, xoffset * 2, symbol->width * 2, ((r * row_height) + textoffset + yoffset - 1) * 2, 2 * 2, image_width, image_height); - } - } - } - } - - if((symbol->output_options & BARCODE_BOX) != 0) { - /* side bars */ - draw_bar(pixelbuf, 0, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height); - draw_bar(pixelbuf, (symbol->width + xoffset + xoffset - symbol->border_width) * 2, symbol->border_width * 2, textoffset * 2, (symbol->height + (2 * symbol->border_width)) * 2, image_width, image_height); - } - - /* Put the human readable text at the bottom */ - if((textdone == 0) && (ustrlen(local_text) != 0)) { - textpos = (image_width / 2); - draw_string(pixelbuf, (char*)local_text, textpos, default_text_posn, smalltext, image_width, image_height); - } - - error_number=png_to_file(symbol, image_height, image_width, pixelbuf, rotate_angle, data_type); - free(pixelbuf); - return error_number; -} - -#ifndef NO_PNG -int png_handle(struct zint_symbol *symbol, int rotate_angle) -{ - int error; - - if(symbol->symbology == BARCODE_MAXICODE) { - error = maxi_png_plot(symbol, rotate_angle, PNG_DATA); - } else { - - error = png_plot(symbol, rotate_angle, PNG_DATA); - } - - return error; -} -#endif /* NO_PNG */ - -int bmp_handle(struct zint_symbol *symbol, int rotate_angle) -{ - int error; - - if(symbol->symbology == BARCODE_MAXICODE) { - error = maxi_png_plot(symbol, rotate_angle, BMP_DATA); - } else { - error = png_plot(symbol, rotate_angle, BMP_DATA); - } - - return error; -} - diff --git a/3rdparty/zint-2.4.4/backend/postal.c b/3rdparty/zint-2.4.4/backend/postal.c deleted file mode 100644 index f6a480f..0000000 --- a/3rdparty/zint-2.4.4/backend/postal.c +++ /dev/null @@ -1,594 +0,0 @@ -/* postal.c - Handles PostNet, PLANET, FIM. RM4SCC and Flattermarken */ - -/* Zint - A barcode generating program using libpng - Copyright (C) 2008 Robin Stuart - Including bug fixes by Bryan Hatton - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" - -#define DAFTSET "DAFT" -#define KRSET "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" -#define KASUTSET "1234567890-abcdefgh" -#define CHKASUTSET "0123456789-abcdefgh" -#define SHKASUTSET "1234567890-ABCDEFGHIJKLMNOPQRSTUVWXYZ" - -/* PostNet number encoding table - In this table L is long as S is short */ -static char *PNTable[10] = {"LLSSS", "SSSLL", "SSLSL", "SSLLS", "SLSSL", "SLSLS", "SLLSS", "LSSSL", - "LSSLS", "LSLSS"}; -static char *PLTable[10] = {"SSLLL", "LLLSS", "LLSLS", "LLSSL", "LSLLS", "LSLSL", "LSSLL", "SLLLS", - "SLLSL", "SLSLL"}; - -static char *RoyalValues[36] = {"11", "12", "13", "14", "15", "10", "21", "22", "23", "24", "25", - "20", "31", "32", "33", "34", "35", "30", "41", "42", "43", "44", "45", "40", "51", "52", - "53", "54", "55", "50", "01", "02", "03", "04", "05", "00"}; - -/* 0 = Full, 1 = Ascender, 2 = Descender, 3 = Tracker */ -static char *RoyalTable[36] = {"3300", "3210", "3201", "2310", "2301", "2211", "3120", "3030", "3021", - "2130", "2121", "2031", "3102", "3012", "3003", "2112", "2103", "2013", "1320", "1230", - "1221", "0330", "0321", "0231", "1302", "1212", "1203", "0312", "0303", "0213", "1122", - "1032", "1023", "0132", "0123", "0033"}; - -static char *FlatTable[10] = {"0504", "18", "0117", "0216", "0315", "0414", "0513", "0612", "0711", - "0810"}; - -static char *KoreaTable[10] = {"1313150613", "0713131313", "0417131313", "1506131313", - "0413171313", "17171313", "1315061313", "0413131713", "17131713", "13171713"}; - -static char *JapanTable[19] = {"114", "132", "312", "123", "141", "321", "213", "231", "411", "144", - "414", "324", "342", "234", "432", "243", "423", "441", "111"}; - -int postnet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) -{ - /* Handles the PostNet system used for Zip codes in the US */ - unsigned int sum, check_digit; - int i, error_number; - - error_number = 0; - - if(length > 38) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - sum = 0; - - /* start character */ - strcpy(dest, "L"); - - for (i=0; i < length; i++) - { - lookup(NEON, PNTable, source[i], dest); - sum += ctoi(source[i]); - } - - check_digit = (10 - (sum % 10)) % 10; - concat(dest, PNTable[check_digit]); - - /* stop character */ - concat (dest, "L"); - - return error_number; -} - -int post_plot(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Puts PostNet barcodes into the pattern matrix */ - char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 + 1 ~ 256 */ - unsigned int loopey, h; - int writer; - int error_number; - - error_number = 0; - - error_number = postnet(symbol, source, height_pattern, length); - if(error_number != 0) { - return error_number; - } - - writer = 0; - h = strlen(height_pattern); - for(loopey = 0; loopey < h; loopey++) - { - if(height_pattern[loopey] == 'L') - { - set_module(symbol, 0, writer); - } - set_module(symbol, 1, writer); - writer += 3; - } - symbol->row_height[0] = 6; - symbol->row_height[1] = 6; - symbol->rows = 2; - symbol->width = writer - 1; - - return error_number; -} - -int planet(struct zint_symbol *symbol, unsigned char source[], char dest[], int length) -{ - /* Handles the PLANET system used for item tracking in the US */ - unsigned int sum, check_digit; - int i, error_number; - - error_number = 0; - - if(length > 38) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - sum = 0; - - /* start character */ - strcpy(dest, "L"); - - for (i=0; i < length; i++) { - lookup(NEON, PLTable, source[i], dest); - sum += ctoi(source[i]); - } - - check_digit = (10 - (sum % 10)) % 10; - concat(dest, PLTable[check_digit]); - - /* stop character */ - concat (dest, "L"); - - return error_number; -} - -int planet_plot(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Puts PLANET barcodes into the pattern matrix */ - char height_pattern[256]; /* 5 + 38 * 5 + 5 + 5 + 1 ~ 256 */ - unsigned int loopey, h; - int writer; - int error_number; - - error_number = 0; - - error_number = planet(symbol, source, height_pattern, length); - if(error_number != 0) { - return error_number; - } - - writer = 0; - h = strlen(height_pattern); - for(loopey = 0; loopey < h; loopey++) - { - if(height_pattern[loopey] == 'L') - { - set_module(symbol, 0, writer); - } - set_module(symbol, 1, writer); - writer += 3; - } - symbol->row_height[0] = 6; - symbol->row_height[1] = 6; - symbol->rows = 2; - symbol->width = writer - 1; - return error_number; -} - -int korea_post(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Korean Postal Authority */ - - int total, loop, check, zeroes, error_number; - char localstr[8], dest[80]; - - error_number = 0; - if(length > 6) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - zeroes = 6 - length; - memset(localstr, '0', zeroes); - strcpy(localstr + zeroes, (char *)source); - - total = 0; - for(loop = 0; loop < 6; loop++) { - total += ctoi(localstr[loop]); - } - check = 10 - (total % 10); - if(check == 10) { check = 0; } - localstr[6] = itoc(check); - localstr[7] = '\0'; - *dest = '\0'; - for(loop = 5; loop >= 0; loop--) { - lookup(NEON, KoreaTable, localstr[loop], dest); - } - lookup(NEON, KoreaTable, localstr[6], dest); - expand(symbol, dest); - ustrcpy(symbol->text, (unsigned char*)localstr); - return error_number; -} - -int fim(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* The simplest barcode symbology ever! Supported by MS Word, so here it is! */ - /* glyphs from http://en.wikipedia.org/wiki/Facing_Identification_Mark */ - - char dest[16] = { 0 }; - - if(length > 1) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - switch((char)source[0]) { - case 'a': - case 'A': - strcpy(dest, "111515111"); - break; - case 'b': - case 'B': - strcpy(dest, "13111311131"); - break; - case 'c': - case 'C': - strcpy(dest, "11131313111"); - break; - case 'd': - case 'D': - strcpy(dest, "1111131311111"); - break; - default: - strcpy(symbol->errtxt, "Invalid characters in data"); - return ERROR_INVALID_DATA1; - break; - } - - expand(symbol, dest); - return 0; -} - -char rm4scc(char source[], unsigned char dest[], int length) -{ - /* Handles the 4 State barcodes used in the UK by Royal Mail */ - unsigned int i; - int top, bottom, row, column, check_digit; - char values[3], set_copy[] = KRSET; - - top = 0; - bottom = 0; - - /* start character */ - strcpy((char*)dest, "1"); - - for (i = 0; i < length; i++) { - lookup(KRSET, RoyalTable, source[i], (char*)dest); - strcpy(values, RoyalValues[posn(KRSET, source[i])]); - top += ctoi(values[0]); - bottom += ctoi(values[1]); - } - - /* Calculate the check digit */ - row = (top % 6) - 1; - column = (bottom % 6) - 1; - if(row == -1) { row = 5; } - if(column == -1) { column = 5; } - check_digit = (6 * row) + column; - concat((char*)dest, RoyalTable[check_digit]); - - /* stop character */ - concat ((char*)dest, "0"); - - return set_copy[check_digit]; -} - -int royal_plot(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Puts RM4SCC into the data matrix */ - char height_pattern[200], check; - int loopey, h, writer; - int error_number; - strcpy(height_pattern, ""); - - error_number = 0; - - if(length > 120) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - to_upper(source); - error_number = is_sane(KRSET, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - check = rm4scc((char*)source, (unsigned char*)height_pattern, length); - - writer = 0; - h = strlen(height_pattern); - for(loopey = 0; loopey < h; loopey++) { - if((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0')) { - set_module(symbol, 0, writer); - } - set_module(symbol, 1, writer); - if((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0')) { - set_module(symbol, 2, writer); - } - writer += 2; - } - - symbol->row_height[0] = 3; - symbol->row_height[1] = 2; - symbol->row_height[2] = 3; - symbol->rows = 3; - symbol->width = writer - 1; - - return error_number; -} - -int kix_code(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Handles Dutch Post TNT KIX symbols */ - /* The same as RM4SCC but without check digit */ - /* Specification at http://www.tntpost.nl/zakelijk/klantenservice/downloads/kIX_code/download.aspx */ - char height_pattern[50], localstr[20]; - int loopey, writer, i, h; - int error_number; /* zeroes; */ - strcpy(height_pattern, ""); - - error_number = 0; - - if(length > 18) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - to_upper(source); - error_number = is_sane(KRSET, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - /* Add leading zeroes */ - /* zeroes = 11 - length; - memset(localstr, '0', zeroes); - strcpy(localstr + zeroes, (char *)source);*/ - strcpy(localstr, (char *)source); - - /* Encode data */ - for (i = 0; i < 18; i++) { - lookup(KRSET, RoyalTable, localstr[i], height_pattern); - } - - writer = 0; - h = strlen(height_pattern); - for(loopey = 0; loopey < h; loopey++) { - if((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0')) { - set_module(symbol, 0, writer); - } - set_module(symbol, 1, writer); - if((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0')) { - set_module(symbol, 2, writer); - } - writer += 2; - } - - symbol->row_height[0] = 3; - symbol->row_height[1] = 2; - symbol->row_height[2] = 3; - symbol->rows = 3; - symbol->width = writer - 1; - - return error_number; -} - -int daft_code(struct zint_symbol *symbol, unsigned char source[], int length) -{ - /* Handles DAFT Code symbols */ - /* Presumably 'daft' doesn't mean the same thing in Germany as it does in the UK! */ - char height_pattern[100]; - unsigned int loopey, h; - int writer, i, error_number; - strcpy(height_pattern, ""); - - error_number = 0; - if(length > 50) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - to_upper((unsigned char*)source); - error_number = is_sane(DAFTSET, (unsigned char*)source, length); - - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - for (i = 0; i < length; i++) { - if(source[i] == 'D') { concat(height_pattern, "2"); } - if(source[i] == 'A') { concat(height_pattern, "1"); } - if(source[i] == 'F') { concat(height_pattern, "0"); } - if(source[i] == 'T') { concat(height_pattern, "3"); } - } - - writer = 0; - h = strlen(height_pattern); - for(loopey = 0; loopey < h; loopey++) - { - if((height_pattern[loopey] == '1') || (height_pattern[loopey] == '0')) - { - set_module(symbol, 0, writer); - } - set_module(symbol, 1, writer); - if((height_pattern[loopey] == '2') || (height_pattern[loopey] == '0')) - { - set_module(symbol, 2, writer); - } - writer += 2; - } - - symbol->row_height[0] = 3; - symbol->row_height[1] = 2; - symbol->row_height[2] = 3; - symbol->rows = 3; - symbol->width = writer - 1; - - return error_number; -} - -int flattermarken(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Flattermarken - Not really a barcode symbology and (in my opinion) probably not much use - but it's supported by TBarCode so it's supported by Zint! */ - int loop, error_number; - char dest[512]; /* 90 * 4 + 1 ~ */ - - error_number = 0; - - if(length > 90) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - *dest = '\0'; - for(loop = 0; loop < length; loop++) { - lookup(NEON, FlatTable, source[loop], dest); - } - - expand(symbol, dest); - return error_number; -} - -int japan_post(struct zint_symbol *symbol, unsigned char source[], int length) -{ /* Japanese Postal Code (Kasutama Barcode) */ - int error_number, h; - char pattern[69]; - int writer, loopey, inter_posn, i, sum, check; - char check_char; - char inter[23]; - -#ifndef _MSC_VER - char local_source[length + 1]; -#else - char* local_source = (char*)_alloca(length + 1); -#endif - - inter_posn = 0; - error_number = 0; - - strcpy(local_source, (char*)source); - for(i = 0; i < length; i++) { - local_source[i] = source[i]; - } - to_upper((unsigned char*)local_source); - error_number = is_sane(SHKASUTSET, (unsigned char*)local_source, length); - - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - memset(inter, 'd', 20);/* Pad character CC4 */ - inter[20] = '\0'; - - i = 0; - inter_posn = 0; - do { - if(((local_source[i] >= '0') && (local_source[i] <= '9')) || (local_source[i] == '-')) { - inter[inter_posn] = local_source[i]; - inter_posn++; - } else { - if((local_source[i] >= 'A') && (local_source[i] <= 'J')) { - inter[inter_posn] = 'a'; - inter[inter_posn + 1] = local_source[i] - 'A' + '0'; - inter_posn += 2; - } - if((local_source[i] >= 'K') && (local_source[i] <= 'T')) { - inter[inter_posn] = 'b'; - inter[inter_posn + 1] = local_source[i] - 'K' + '0'; - inter_posn += 2; - } - if((local_source[i] >= 'U') && (local_source[i] <= 'Z')) { - inter[inter_posn] = 'c'; - inter[inter_posn + 1] = local_source[i] - 'U' + '0'; - inter_posn += 2; - } - } - i++; - }while((i < length) && (inter_posn < 20)); - inter[20] = '\0'; - - strcpy(pattern, "13"); /* Start */ - - sum = 0; - for(i = 0; i < 20; i++) { - concat(pattern, JapanTable[posn(KASUTSET, inter[i])]); - sum += posn(CHKASUTSET, inter[i]); - /* printf("%c (%d)\n", inter[i], posn(CHKASUTSET, inter[i])); */ - } - - /* Calculate check digit */ - check = 19 - (sum % 19); - if(check == 19) { check = 0; } - if(check <= 9) { check_char = check + '0'; } - if(check == 10) { check_char = '-'; } - if(check >= 11) { check_char = (check - 11) + 'a'; } - concat(pattern, JapanTable[posn(KASUTSET, check_char)]); - /* printf("check %c (%d)\n", check_char, check); */ - - concat(pattern, "31"); /* Stop */ - - /* Resolve pattern to 4-state symbols */ - writer = 0; - h = strlen(pattern); - for(loopey = 0; loopey < h; loopey++) - { - if((pattern[loopey] == '2') || (pattern[loopey] == '1')) - { - set_module(symbol, 0, writer); - } - set_module(symbol, 1, writer); - if((pattern[loopey] == '3') || (pattern[loopey] == '1')) - { - set_module(symbol, 2, writer); - } - writer += 2; - } - - symbol->row_height[0] = 3; - symbol->row_height[1] = 2; - symbol->row_height[2] = 3; - symbol->rows = 3; - symbol->width = writer - 1; - - return error_number; -} diff --git a/3rdparty/zint-2.4.4/backend/ps.c b/3rdparty/zint-2.4.4/backend/ps.c deleted file mode 100644 index 7543561..0000000 --- a/3rdparty/zint-2.4.4/backend/ps.c +++ /dev/null @@ -1,761 +0,0 @@ -/* ps.c - Post Script output */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#include -#include "common.h" - -#define SSET "0123456789ABCDEF" - -/* This file has expanded quite a bit since version 1.5 in order to accomodate - the formatting rules for EAN and UPC symbols as set out in EN 797:1995 - the - down side of this support is that the code is now vertually unreadable! */ - -int ps_plot(struct zint_symbol *symbol) -{ - int i, block_width, latch, r, this_row; - float textpos, large_bar_height, preset_height, row_height, row_posn; - FILE *feps; - int fgred, fggrn, fgblu, bgred, bggrn, bgblu; - float red_ink, green_ink, blue_ink, red_paper, green_paper, blue_paper; - int error_number = 0; - int textoffset, xoffset, yoffset, textdone, main_width; - char textpart[10], addon[6]; - int large_bar_count, comp_offset; - float addon_text_posn; - float scaler = symbol->scale; - float default_text_posn; - int plot_text = 1; - const char *locale = NULL; - - row_height=0; - textdone = 0; - main_width = symbol->width; - strcpy(addon, ""); - comp_offset = 0; - addon_text_posn = 0.0; - - if((symbol->output_options & BARCODE_STDOUT) != 0) { - feps = stdout; - } else { - feps = fopen(symbol->outfile, "w"); - } - if(feps == NULL) { - strcpy(symbol->errtxt, "Could not open output file"); - return ERROR_FILE_ACCESS; - } - - /* sort out colour options */ - to_upper((unsigned char*)symbol->fgcolour); - to_upper((unsigned char*)symbol->bgcolour); - - if(strlen(symbol->fgcolour) != 6) { - strcpy(symbol->errtxt, "Malformed foreground colour target"); - return ERROR_INVALID_OPTION; - } - if(strlen(symbol->bgcolour) != 6) { - strcpy(symbol->errtxt, "Malformed background colour target"); - return ERROR_INVALID_OPTION; - } - error_number = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour)); - if (error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Malformed foreground colour target"); - return ERROR_INVALID_OPTION; - } - error_number = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->bgcolour)); - if (error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Malformed background colour target"); - return ERROR_INVALID_OPTION; - } - locale = setlocale(LC_ALL, "C"); - - fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); - fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); - fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); - bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); - bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); - bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); - red_ink = fgred / 256.0; - green_ink = fggrn / 256.0; - blue_ink = fgblu / 256.0; - red_paper = bgred / 256.0; - green_paper = bggrn / 256.0; - blue_paper = bgblu / 256.0; - - if (symbol->height == 0) { - symbol->height = 50; - } - - large_bar_count = 0; - preset_height = 0.0; - for(i = 0; i < symbol->rows; i++) { - preset_height += symbol->row_height[i]; - if(symbol->row_height[i] == 0) { - large_bar_count++; - } - } - large_bar_height = (symbol->height - preset_height) / large_bar_count; - - if (large_bar_count == 0) { - symbol->height = preset_height; - } - - while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { - comp_offset++; - } - - /* Certain symbols need whitespace otherwise characters get chopped off the sides */ - if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) - || (symbol->symbology == BARCODE_ISBNX)) { - switch(ustrlen(symbol->text)) { - case 13: /* EAN 13 */ - case 16: - case 19: - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_width = 96 + comp_offset; - break; - default: - main_width = 68 + comp_offset; - } - } - - if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - main_width = 96 + comp_offset; - } - } - - if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - main_width = 51 + comp_offset; - } - } - - latch = 0; - r = 0; - /* Isolate add-on text */ - if(is_extendable(symbol->symbology)) { - for(i = 0; i < ustrlen(symbol->text); i++) { - if (latch == 1) { - addon[r] = symbol->text[i]; - r++; - } - if (symbol->text[i] == '+') { - latch = 1; - } - } - } - addon[r] = '\0'; - - if((symbol->show_hrt == 0) || (ustrlen(symbol->text) == 0)) { - plot_text = 0; - } - if(plot_text) { - textoffset = 9; - } else { - textoffset = 0; - } - xoffset = symbol->border_width + symbol->whitespace_width; - yoffset = symbol->border_width; - - /* Start writing the header */ - fprintf(feps, "%%!PS-Adobe-3.0 EPSF-3.0\n"); - fprintf(feps, "%%%%Creator: Zint %s\n", ZINT_VERSION); - if(ustrlen(symbol->text) != 0) { - fprintf(feps, "%%%%Title: %s\n",symbol->text); - } else { - fprintf(feps, "%%%%Title: Zint Generated Symbol\n"); - } - fprintf(feps, "%%%%Pages: 0\n"); - if(symbol->symbology != BARCODE_MAXICODE) { - fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", roundup((symbol->width + xoffset + xoffset) * scaler), roundup((symbol->height + textoffset + yoffset + yoffset) * scaler)); - } else { - fprintf(feps, "%%%%BoundingBox: 0 0 %d %d\n", roundup((74.0 + xoffset + xoffset) * scaler), roundup((72.0 + yoffset + yoffset) * scaler)); - } - fprintf(feps, "%%%%EndComments\n"); - - /* Definitions */ - fprintf(feps, "/TL { setlinewidth moveto lineto stroke } bind def\n"); - fprintf(feps, "/TC { moveto 0 360 arc 360 0 arcn fill } bind def\n"); - fprintf(feps, "/TH { 0 setlinewidth moveto lineto lineto lineto lineto lineto closepath fill } bind def\n"); - fprintf(feps, "/TB { 2 copy } bind def\n"); - fprintf(feps, "/TR { newpath 4 1 roll exch moveto 1 index 0 rlineto 0 exch rlineto neg 0 rlineto closepath fill } bind def\n"); - fprintf(feps, "/TE { pop pop } bind def\n"); - - fprintf(feps, "newpath\n"); - - /* Now the actual representation */ - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_paper, green_paper, blue_paper); - fprintf(feps, "%.2f 0.00 TB 0.00 %.2f TR\n", (symbol->height + textoffset + yoffset + yoffset) * scaler, (symbol->width + xoffset + xoffset) * scaler); - - if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - default_text_posn = 0.5 * scaler; - } else { - default_text_posn = (symbol->border_width + 0.5) * scaler; - } - - if(symbol->symbology == BARCODE_MAXICODE) { - /* Maxicode uses hexagons */ - float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my; - - - textoffset = 0.0; - if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler); - fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + 72.0 + symbol->border_width) * scaler, 0.0, (74.0 + xoffset + xoffset) * scaler); - } - if((symbol->output_options & BARCODE_BOX) != 0) { - /* side bars */ - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler); - fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (72.0 + (2 * symbol->border_width)) * scaler, textoffset * scaler, (74.0 + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler); - } - - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 10.85 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 8.97 * scaler, (44.73 + xoffset) * scaler, (35.60 + yoffset) * scaler); - fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 7.10 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 5.22 * scaler, (40.98 + xoffset) * scaler, (35.60 + yoffset) * scaler); - fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TC\n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 3.31 * scaler, (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 1.43 * scaler, (37.19 + xoffset) * scaler, (35.60 + yoffset) * scaler); - for(r = 0; r < symbol->rows; r++) { - for(i = 0; i < symbol->width; i++) { - if(module_is_set(symbol, r, i)) { - /* Dump a hexagon */ - my = ((symbol->rows - r - 1)) * 2.135 + 1.43; - ay = my + 1.0 + yoffset; - by = my + 0.5 + yoffset; - cy = my - 0.5 + yoffset; - dy = my - 1.0 + yoffset; - ey = my - 0.5 + yoffset; - fy = my + 0.5 + yoffset; - - mx = 2.46 * i + 1.23 + (r & 1 ? 1.23 : 0); - - ax = mx + xoffset; - bx = mx + 0.86 + xoffset; - cx = mx + 0.86 + xoffset; - dx = mx + xoffset; - ex = mx - 0.86 + xoffset; - fx = mx - 0.86 + xoffset; - fprintf(feps, "%.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f TH\n", ax * scaler, ay * scaler, bx * scaler, by * scaler, cx * scaler, cy * scaler, dx * scaler, dy * scaler, ex * scaler, ey * scaler, fx * scaler, fy * scaler); - } - } - } - } - - if(symbol->symbology != BARCODE_MAXICODE) { - /* everything else uses rectangles (or squares) */ - /* Works from the bottom of the symbol up */ - int addon_latch = 0; - - for(r = 0; r < symbol->rows; r++) { - this_row = symbol->rows - r - 1; /* invert r otherwise plots upside down */ - if(symbol->row_height[this_row] == 0) { - row_height = large_bar_height; - } else { - row_height = symbol->row_height[this_row]; - } - row_posn = 0; - for(i = 0; i < r; i++) { - if(symbol->row_height[symbol->rows - i - 1] == 0) { - row_posn += large_bar_height; - } else { - row_posn += symbol->row_height[symbol->rows - i - 1]; - } - } - row_posn += (textoffset + yoffset); - - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f ", row_height * scaler, row_posn * scaler); - i = 0; - if(module_is_set(symbol, this_row, 0)) { - latch = 1; - } else { - latch = 0; - } - - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); - if((addon_latch == 0) && (r == 0) && (i > main_width)) { - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f ", (row_height - 5.0) * scaler, (row_posn - 5.0) * scaler); - addon_text_posn = row_posn + row_height - 8.0; - addon_latch = 1; - } - if(latch == 1) { - /* a bar */ - fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset) * scaler, block_width * scaler); - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - - } while (i < symbol->width); - } - } - /* That's done the actual data area, everything else is human-friendly */ - - xoffset += comp_offset; - - if (plot_text) { - if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || - (symbol->symbology == BARCODE_ISBNX)) { - /* guard bar extensions and text formatting for EAN8 and EAN13 */ - switch(ustrlen(symbol->text)) { - case 8: /* EAN-8 */ - case 11: - case 14: - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (32 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (34 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (64 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (66 + xoffset) * scaler, 1 * scaler); - for(i = 0; i < 4; i++) { - textpart[i] = symbol->text[i]; - } - textpart[4] = '\0'; - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = 17; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - for(i = 0; i < 4; i++) { - textpart[i] = symbol->text[i + 4]; - } - textpart[4] = '\0'; - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = 50; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - textdone = 1; - switch(strlen(addon)) { - case 2: - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = xoffset + 86; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); - fprintf(feps, " (%s) stringwidth\n", addon); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", addon); - fprintf(feps, "setmatrix\n"); - break; - case 5: - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = xoffset + 100; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); - fprintf(feps, " (%s) stringwidth\n", addon); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", addon); - fprintf(feps, "setmatrix\n"); - break; - } - - break; - case 13: /* EAN 13 */ - case 16: - case 19: - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (92 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (94 + xoffset) * scaler, 1 * scaler); - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = -7; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = 24; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 7]; - } - textpart[6] = '\0'; - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = 71; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - textdone = 1; - switch(strlen(addon)) { - case 2: - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = xoffset + 114; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); - fprintf(feps, " (%s) stringwidth\n", addon); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", addon); - fprintf(feps, "setmatrix\n"); - break; - case 5: - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = xoffset + 128; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); - fprintf(feps, " (%s) stringwidth\n", addon); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", addon); - fprintf(feps, "setmatrix\n"); - break; - } - break; - - } - } - - if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { - /* guard bar extensions and text formatting for UPCA */ - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); - latch = 1; - - i = 0 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); - if(latch == 1) { - /* a bar */ - fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler); - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - } while (i < 11 + comp_offset); - fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler); - latch = 1; - i = 85 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); - if(latch == 1) { - /* a bar */ - fprintf(feps, "TB %.2f %.2f TR\n", (i + xoffset - comp_offset) * scaler, block_width * scaler); - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - } while (i < 96 + comp_offset); - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); - textpos = -5; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - for(i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[5] = '\0'; - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = 27; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - for(i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 6]; - } - textpart[6] = '\0'; - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = 68; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - textpart[0] = symbol->text[11]; - textpart[1] = '\0'; - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); - textpos = 100; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - textdone = 1; - switch(strlen(addon)) { - case 2: - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = xoffset + 116; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); - fprintf(feps, " (%s) stringwidth\n", addon); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", addon); - fprintf(feps, "setmatrix\n"); - break; - case 5: - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = xoffset + 130; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); - fprintf(feps, " (%s) stringwidth\n", addon); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", addon); - fprintf(feps, "setmatrix\n"); - break; - } - - } - - if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { - /* guard bar extensions and text formatting for UPCE */ - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f ", 5.0 * scaler, (4.0 + yoffset) * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (0 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (2 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (46 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (48 + xoffset) * scaler, 1 * scaler); - fprintf(feps, "TB %.2f %.2f TR\n", (50 + xoffset) * scaler, 1 * scaler); - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); - textpos = -5; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = 24; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - textpart[0] = symbol->text[7]; - textpart[1] = '\0'; - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); - textpos = 55; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", textpart); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", textpart); - fprintf(feps, "setmatrix\n"); - textdone = 1; - switch(strlen(addon)) { - case 2: - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = xoffset + 70; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); - fprintf(feps, " (%s) stringwidth\n", addon); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", addon); - fprintf(feps, "setmatrix\n"); - break; - case 5: - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 11.0 * scaler); - textpos = xoffset + 84; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", textpos * scaler, addon_text_posn * scaler); - fprintf(feps, " (%s) stringwidth\n", addon); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", addon); - fprintf(feps, "setmatrix\n"); - break; - } - - } - } /* if (plot_text) */ - - xoffset -= comp_offset; - - switch(symbol->symbology) { - case BARCODE_MAXICODE: - /* Do nothing! (It's already been done) */ - break; - default: - if((symbol->output_options & BARCODE_BIND) != 0) { - if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { - /* row binding */ - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - for(r = 1; r < symbol->rows; r++) { - fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", 2.0 * scaler, ((r * row_height) + textoffset + yoffset - 1) * scaler, xoffset * scaler, symbol->width * scaler); - } - } - } - if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, textoffset * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler); - fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", symbol->border_width * scaler, (textoffset + symbol->height + symbol->border_width) * scaler, 0.0, (symbol->width + xoffset + xoffset) * scaler); - } - if((symbol->output_options & BARCODE_BOX) != 0) { - /* side bars */ - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, 0.0, symbol->border_width * scaler); - fprintf(feps, "%.2f %.2f TB %.2f %.2f TR\n", (symbol->height + (2 * symbol->border_width)) * scaler, textoffset * scaler, (symbol->width + xoffset + xoffset - symbol->border_width) * scaler, symbol->border_width * scaler); - } - break; - } - - /* Put the human readable text at the bottom */ - if(plot_text && (textdone == 0)) { - fprintf(feps, "TE\n"); - fprintf(feps, "%.2f %.2f %.2f setrgbcolor\n", red_ink, green_ink, blue_ink); - fprintf(feps, "matrix currentmatrix\n"); - fprintf(feps, "/Helvetica findfont\n"); - fprintf(feps, "%.2f scalefont setfont\n", 8.0 * scaler); - textpos = symbol->width / 2.0; - fprintf(feps, " 0 0 moveto %.2f %.2f translate 0.00 rotate 0 0 moveto\n", (textpos + xoffset) * scaler, default_text_posn); - fprintf(feps, " (%s) stringwidth\n", symbol->text); - fprintf(feps, "pop\n"); - fprintf(feps, "-2 div 0 rmoveto\n"); - fprintf(feps, " (%s) show\n", symbol->text); - fprintf(feps, "setmatrix\n"); - } - fprintf(feps, "\nshowpage\n"); - - fclose(feps); - - if (locale) - setlocale(LC_ALL, locale); - - return error_number; -} - diff --git a/3rdparty/zint-2.4.4/backend/qr.c b/3rdparty/zint-2.4.4/backend/qr.c deleted file mode 100644 index 23b4743..0000000 --- a/3rdparty/zint-2.4.4/backend/qr.c +++ /dev/null @@ -1,2244 +0,0 @@ -/* qr.c Handles QR Code */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" -#include -#include "sjis.h" -#include "qr.h" -#include "reedsol.h" - -int in_alpha(int glyph) { - /* Returns true if input glyph is in the Alphanumeric set */ - int retval = 0; - char cglyph = (char) glyph; - - if((cglyph >= '0') && (cglyph <= '9')) { - retval = 1; - } - if((cglyph >= 'A') && (cglyph <= 'Z')) { - retval = 1; - } - switch (cglyph) { - case ' ': - case '$': - case '%': - case '*': - case '+': - case '-': - case '.': - case '/': - case ':': - retval = 1; - break; - } - - return retval; -} - -void define_mode(char mode[], int jisdata[], int length, int gs1) -{ - /* Values placed into mode[] are: K = Kanji, B = Binary, A = Alphanumeric, N = Numeric */ - int i, mlen, j; - - for(i = 0; i < length; i++) { - if(jisdata[i] > 0xff) { - mode[i] = 'K'; - } else { - mode[i] = 'B'; - if(in_alpha(jisdata[i])) { mode[i] = 'A'; } - if(gs1 && (jisdata[i] == '[')) { mode[i] = 'A'; } - if((jisdata[i] >= '0') && (jisdata[i] <= '9')) { mode[i] = 'N'; } - } - } - - /* If less than 6 numeric digits together then don't use numeric mode */ - for(i = 0; i < length; i++) { - if(mode[i] == 'N') { - if(((i != 0) && (mode[i - 1] != 'N')) || (i == 0)) { - mlen = 0; - while (((mlen + i) < length) && (mode[mlen + i] == 'N')) { - mlen++; - }; - if(mlen < 6) { - for(j = 0; j < mlen; j++) { - mode[i + j] = 'A'; - } - } - } - } - } - - /* If less than 4 alphanumeric characters together then don't use alphanumeric mode */ - for(i = 0; i < length; i++) { - if(mode[i] == 'A') { - if(((i != 0) && (mode[i - 1] != 'A')) || (i == 0)) { - mlen = 0; - while (((mlen + i) < length) && (mode[mlen + i] == 'A')) { - mlen++; - }; - if(mlen < 6) { - for(j = 0; j < mlen; j++) { - mode[i + j] = 'B'; - } - } - } - } - } -} - -int estimate_binary_length(char mode[], int length, int gs1) -{ - /* Make an estimate (worst case scenario) of how long the binary string will be */ - int i, count = 0; - char current = 0; - int a_count = 0; - int n_count = 0; - - if(gs1) { count += 4; } - - for(i = 0; i < length; i++) { - if(mode[i] != current) { - switch(mode[i]) { - case 'K': count += 12 + 4; current = 'K'; break; - case 'B': count += 16 + 4; current = 'B'; break; - case 'A': count += 13 + 4; current = 'A'; a_count = 0; break; - case 'N': count += 14 + 4; current = 'N'; n_count = 0; break; - } - } - - switch(mode[i]) { - case 'K': count += 13; break; - case 'B': count += 8; break; - case 'A': - a_count++; - if((a_count & 1) == 0) { - count += 5; // 11 in total - a_count = 0; - } - else - count += 6; - break; - case 'N': - n_count++; - if((n_count % 3) == 0) { - count += 3; // 10 in total - n_count = 0; - } - else if ((n_count & 1) == 0) - count += 3; // 7 in total - else - count += 4; - break; - } - } - - return count; -} - -static void qr_bscan(char *binary, int data, int h) -{ - for (; h; h>>=1) { - concat(binary, data & h ? "1" : "0"); - } -} - -void qr_binary(int datastream[], int version, int target_binlen, char mode[], int jisdata[], int length, int gs1, int est_binlen) -{ - /* Convert input data to a binary stream and add padding */ - int position = 0, debug = 0; - int short_data_block_length, i, scheme = 1; - char data_block, padbits; - int current_binlen, current_bytes; - int toggle, percent; - -#ifndef _MSC_VER - char binary[est_binlen + 12]; -#else - char* binary = (char *)_alloca(est_binlen + 12); -#endif - strcpy(binary, ""); - - if(gs1) { - concat(binary, "0101"); /* FNC1 */ - } - - if(version <= 9) { - scheme = 1; - } else if((version >= 10) && (version <= 26)) { - scheme = 2; - } else if(version >= 27) { - scheme = 3; - } - - if(debug) { - for(i = 0; i < length; i++) { - printf("%c", mode[i]); - } - printf("\n"); - } - - percent = 0; - - do { - data_block = mode[position]; - short_data_block_length = 0; - do { - short_data_block_length++; - } while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block)); - - switch(data_block) { - case 'K': - /* Kanji mode */ - /* Mode indicator */ - concat(binary, "1000"); - - /* Character count indicator */ - qr_bscan(binary, short_data_block_length, 0x20 << (scheme*2)); /* scheme = 1..3 */ - - if(debug) { printf("Kanji block (length %d)\n\t", short_data_block_length); } - - /* Character representation */ - for(i = 0; i < short_data_block_length; i++) { - int jis = jisdata[position + i]; - int msb, lsb, prod; - - if(jis > 0x9fff) { jis -= 0xc140; } - msb = (jis & 0xff00) >> 4; - lsb = (jis & 0xff); - prod = (msb * 0xc0) + lsb; - - qr_bscan(binary, prod, 0x1000); - - if(debug) { printf("0x%4X ", prod); } - } - - if(debug) { printf("\n"); } - - break; - case 'B': - /* Byte mode */ - /* Mode indicator */ - concat(binary, "0100"); - - /* Character count indicator */ - qr_bscan(binary, short_data_block_length, scheme > 1 ? 0x8000 : 0x80); /* scheme = 1..3 */ - - if(debug) { printf("Byte block (length %d)\n\t", short_data_block_length); } - - /* Character representation */ - for(i = 0; i < short_data_block_length; i++) { - int byte = jisdata[position + i]; - - if(gs1 && (byte == '[')) { - byte = 0x1d; /* FNC1 */ - } - - qr_bscan(binary, byte, 0x80); - - if(debug) { printf("0x%2X(%d) ", byte, byte); } - } - - if(debug) { printf("\n"); } - - break; - case 'A': - /* Alphanumeric mode */ - /* Mode indicator */ - concat(binary, "0010"); - - /* Character count indicator */ - qr_bscan(binary, short_data_block_length, 0x40 << (2 * scheme)); /* scheme = 1..3 */ - - if(debug) { printf("Alpha block (length %d)\n\t", short_data_block_length); } - - /* Character representation */ - i = 0; - while ( i < short_data_block_length ) { - int count; - int first = 0, second = 0, prod; - - if(percent == 0) { - if(gs1 && (jisdata[position + i] == '%')) { - first = posn(RHODIUM, '%'); - second = posn(RHODIUM, '%'); - count = 2; - prod = (first * 45) + second; - i++; - } else { - if(gs1 && (jisdata[position + i] == '[')) { - first = posn(RHODIUM, '%'); /* FNC1 */ - } else { - first = posn(RHODIUM, (char) jisdata[position + i]); - } - count = 1; - i++; - prod = first; - - if(mode[position + i] == 'A') { - if(gs1 && (jisdata[position + i] == '%')) { - second = posn(RHODIUM, '%'); - count = 2; - prod = (first * 45) + second; - percent = 1; - } else { - if(gs1 && (jisdata[position + i] == '[')) { - second = posn(RHODIUM, '%'); /* FNC1 */ - } else { - second = posn(RHODIUM, (char) jisdata[position + i]); - } - count = 2; - i++; - prod = (first * 45) + second; - } - } - } - } else { - first = posn(RHODIUM, '%'); - count = 1; - i++; - prod = first; - percent = 0; - - if(mode[position + i] == 'A') { - if(gs1 && (jisdata[position + i] == '%')) { - second = posn(RHODIUM, '%'); - count = 2; - prod = (first * 45) + second; - percent = 1; - } else { - if(gs1 && (jisdata[position + i] == '[')) { - second = posn(RHODIUM, '%'); /* FNC1 */ - } else { - second = posn(RHODIUM, (char) jisdata[position + i]); - } - count = 2; - i++; - prod = (first * 45) + second; - } - } - } - - qr_bscan(binary, prod, count == 2 ? 0x400 : 0x20); /* count = 1..2 */ - - if(debug) { printf("0x%4X ", prod); } - }; - - if(debug) { printf("\n"); } - - break; - case 'N': - /* Numeric mode */ - /* Mode indicator */ - concat(binary, "0001"); - - /* Character count indicator */ - qr_bscan(binary, short_data_block_length, 0x80 << (2 * scheme)); /* scheme = 1..3 */ - - if(debug) { printf("Number block (length %d)\n\t", short_data_block_length); } - - /* Character representation */ - i = 0; - while ( i < short_data_block_length ) { - int count; - int first = 0, second = 0, third = 0, prod; - - first = posn(NEON, (char) jisdata[position + i]); - count = 1; - prod = first; - - if(mode[position + i + 1] == 'N') { - second = posn(NEON, (char) jisdata[position + i + 1]); - count = 2; - prod = (prod * 10) + second; - - if(mode[position + i + 2] == 'N') { - third = posn(NEON, (char) jisdata[position + i + 2]); - count = 3; - prod = (prod * 10) + third; - } - } - - qr_bscan(binary, prod, 1 << (3 * count)); /* count = 1..3 */ - - if(debug) { printf("0x%4X (%d)", prod, prod); } - - i += count; - }; - - if(debug) { printf("\n"); } - - break; - } - - position += short_data_block_length; - } while (position < length) ; - - /* Terminator */ - concat(binary, "0000"); - - current_binlen = strlen(binary); - padbits = 8 - (current_binlen % 8); - if(padbits == 8) { padbits = 0; } - current_bytes = (current_binlen + padbits) / 8; - - /* Padding bits */ - for(i = 0; i < padbits; i++) { - concat(binary, "0"); - } - - /* Put data into 8-bit codewords */ - for(i = 0; i < current_bytes; i++) { - datastream[i] = 0x00; - if(binary[i * 8] == '1') { datastream[i] += 0x80; } - if(binary[i * 8 + 1] == '1') { datastream[i] += 0x40; } - if(binary[i * 8 + 2] == '1') { datastream[i] += 0x20; } - if(binary[i * 8 + 3] == '1') { datastream[i] += 0x10; } - if(binary[i * 8 + 4] == '1') { datastream[i] += 0x08; } - if(binary[i * 8 + 5] == '1') { datastream[i] += 0x04; } - if(binary[i * 8 + 6] == '1') { datastream[i] += 0x02; } - if(binary[i * 8 + 7] == '1') { datastream[i] += 0x01; } - } - - /* Add pad codewords */ - toggle = 0; - for(i = current_bytes; i < target_binlen; i++) { - if(toggle == 0) { - datastream[i] = 0xec; - toggle = 1; - } else { - datastream[i] = 0x11; - toggle = 0; - } - } - - if(debug) { - printf("Resulting codewords:\n\t"); - for(i = 0; i < target_binlen; i++) { - printf("0x%2X ", datastream[i]); - } - printf("\n"); - } -} - -void add_ecc(int fullstream[], int datastream[], int version, int data_cw, int blocks) -{ - /* Split data into blocks, add error correction and then interleave the blocks and error correction data */ - int ecc_cw = qr_total_codewords[version - 1] - data_cw; - int short_data_block_length = data_cw / blocks; - int qty_long_blocks = data_cw % blocks; - int qty_short_blocks = blocks - qty_long_blocks; - int ecc_block_length = ecc_cw / blocks; - int i, j, length_this_block, posn, debug = 0; - - -#ifndef _MSC_VER - unsigned char data_block[short_data_block_length + 2]; - unsigned char ecc_block[ecc_block_length + 2]; - int interleaved_data[data_cw + 2]; - int interleaved_ecc[ecc_cw + 2]; -#else - unsigned char* data_block = (unsigned char *)_alloca(short_data_block_length + 2); - unsigned char* ecc_block = (unsigned char *)_alloca(ecc_block_length + 2); - int* interleaved_data = (int *)_alloca((data_cw + 2) * sizeof(int)); - int* interleaved_ecc = (int *)_alloca((ecc_cw + 2) * sizeof(int)); -#endif - - posn = 0; - - for(i = 0; i < blocks; i++) { - if(i < qty_short_blocks) { length_this_block = short_data_block_length; } else { length_this_block = short_data_block_length + 1; } - - for(j = 0; j < ecc_block_length; j++) { - ecc_block[j] = 0; - } - - for(j = 0; j < length_this_block; j++) { - data_block[j] = (unsigned char) datastream[posn + j]; - } - - rs_init_gf(0x11d); - rs_init_code(ecc_block_length, 0); - rs_encode(length_this_block, data_block, ecc_block); - rs_free(); - - if(debug) { - printf("Block %d: ", i + 1); - for(j = 0; j < length_this_block; j++) { - printf("%2X ", data_block[j]); - } - if(i < qty_short_blocks) { - printf(" "); - } - printf(" // "); - for(j = 0; j < ecc_block_length; j++) { - printf("%2X ", ecc_block[ecc_block_length - j - 1]); - } - printf("\n"); - } - - for(j = 0; j < short_data_block_length; j++) { - interleaved_data[(j * blocks) + i] = (int) data_block[j]; - } - - if(i >= qty_short_blocks){ - interleaved_data[(short_data_block_length * blocks) + (i - qty_short_blocks)] = (int) data_block[short_data_block_length]; - } - - for(j = 0; j < ecc_block_length; j++) { - interleaved_ecc[(j * blocks) + i] = (int) ecc_block[ecc_block_length - j - 1]; - } - - posn += length_this_block; - } - - for(j = 0; j < data_cw; j++) { - fullstream[j] = interleaved_data[j]; - } - for(j = 0; j < ecc_cw; j++) { - fullstream[j + data_cw] = interleaved_ecc[j]; - } - - if(debug) { - printf("\nData Stream: \n"); - for(j = 0; j < (data_cw + ecc_cw); j++) { - printf("%2X ", fullstream[j]); - } - printf("\n"); - } -} - -void place_finder(unsigned char grid[], int size, int x, int y) -{ - int xp, yp; - - int finder[] = { - 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 0, 0, 0, 1, - 1, 0, 1, 1, 1, 0, 1, - 1, 0, 1, 1, 1, 0, 1, - 1, 0, 1, 1, 1, 0, 1, - 1, 0, 0, 0, 0, 0, 1, - 1, 1, 1, 1, 1, 1, 1 - }; - - for(xp = 0; xp < 7; xp++) { - for(yp = 0; yp < 7; yp++) { - if (finder[xp + (7 * yp)] == 1) { - grid[((yp + y) * size) + (xp + x)] = 0x11; - } else { - grid[((yp + y) * size) + (xp + x)] = 0x10; - } - } - } -} - -void place_align(unsigned char grid[], int size, int x, int y) -{ - int xp, yp; - - int alignment[] = { - 1, 1, 1, 1, 1, - 1, 0, 0, 0, 1, - 1, 0, 1, 0, 1, - 1, 0, 0, 0, 1, - 1, 1, 1, 1, 1 - }; - - x -= 2; - y -= 2; /* Input values represent centre of pattern */ - - for(xp = 0; xp < 5; xp++) { - for(yp = 0; yp < 5; yp++) { - if (alignment[xp + (5 * yp)] == 1) { - grid[((yp + y) * size) + (xp + x)] = 0x11; - } else { - grid[((yp + y) * size) + (xp + x)] = 0x10; - } - } - } -} - -void setup_grid(unsigned char* grid, int size, int version) -{ - int i, toggle = 1; - int loopsize, x, y, xcoord, ycoord; - - /* Add timing patterns */ - for(i = 0; i < size; i++) { - if(toggle == 1) { - grid[(6 * size) + i] = 0x21; - grid[(i * size) + 6] = 0x21; - toggle = 0; - } else { - grid[(6 * size) + i] = 0x20; - grid[(i * size) + 6] = 0x20; - toggle = 1; - } - } - - /* Add finder patterns */ - place_finder(grid, size, 0, 0); - place_finder(grid, size, 0, size - 7); - place_finder(grid, size, size - 7, 0); - - /* Add separators */ - for(i = 0; i < 7; i++) { - grid[(7 * size) + i] = 0x10; - grid[(i * size) + 7] = 0x10; - grid[(7 * size) + (size - 1 - i)] = 0x10; - grid[(i * size) + (size - 8)] = 0x10; - grid[((size - 8) * size) + i] = 0x10; - grid[((size - 1 - i) * size) + 7] = 0x10; - } - grid[(7 * size) + 7] = 0x10; - grid[(7 * size) + (size - 8)] = 0x10; - grid[((size - 8) * size) + 7] = 0x10; - - /* Add alignment patterns */ - if(version != 1) { - /* Version 1 does not have alignment patterns */ - - loopsize = qr_align_loopsize[version - 1]; - for(x = 0; x < loopsize; x++) { - for(y = 0; y < loopsize; y++) { - xcoord = qr_table_e1[((version - 2) * 7) + x]; - ycoord = qr_table_e1[((version - 2) * 7) + y]; - - if(!(grid[(ycoord * size) + xcoord] & 0x10)) { - place_align(grid, size, xcoord, ycoord); - } - } - } - } - - /* Reserve space for format information */ - for(i = 0; i < 8; i++) { - grid[(8 * size) + i] += 0x20; - grid[(i * size) + 8] += 0x20; - grid[(8 * size) + (size - 1 - i)] = 0x20; - grid[((size - 1 - i) * size) + 8] = 0x20; - } - grid[(8 * size) + 8] += 20; - grid[((size - 1 - 7) * size) + 8] = 0x21; /* Dark Module from Figure 25 */ - - /* Reserve space for version information */ - if(version >= 7) { - for(i = 0; i < 6; i++) { - grid[((size - 9) * size) + i] = 0x20; - grid[((size - 10) * size) + i] = 0x20; - grid[((size - 11) * size) + i] = 0x20; - grid[(i * size) + (size - 9)] = 0x20; - grid[(i * size) + (size - 10)] = 0x20; - grid[(i * size) + (size - 11)] = 0x20; - } - } -} - -int cwbit(int* datastream, int i) { - int word = i / 8; - int bit = i % 8; - int resultant = 0; - - switch(bit) { - case 0: if(datastream[word] & 0x80) { resultant = 1; } else { resultant = 0; } break; - case 1: if(datastream[word] & 0x40) { resultant = 1; } else { resultant = 0; } break; - case 2: if(datastream[word] & 0x20) { resultant = 1; } else { resultant = 0; } break; - case 3: if(datastream[word] & 0x10) { resultant = 1; } else { resultant = 0; } break; - case 4: if(datastream[word] & 0x08) { resultant = 1; } else { resultant = 0; } break; - case 5: if(datastream[word] & 0x04) { resultant = 1; } else { resultant = 0; } break; - case 6: if(datastream[word] & 0x02) { resultant = 1; } else { resultant = 0; } break; - case 7: if(datastream[word] & 0x01) { resultant = 1; } else { resultant = 0; } break; - } - - return resultant; -} - -void populate_grid(unsigned char* grid, int size, int* datastream, int cw) -{ - int direction = 1; /* up */ - int row = 0; /* right hand side */ - - int i, n, x, y; - - n = cw * 8; - y = size - 1; - i = 0; - do { - x = (size - 2) - (row * 2); - if(x < 6) - x--; /* skip over vertical timing pattern */ - - if(!(grid[(y * size) + (x + 1)] & 0xf0)) { - if (cwbit(datastream, i)) { - grid[(y * size) + (x + 1)] = 0x01; - } else { - grid[(y * size) + (x + 1)] = 0x00; - } - i++; - } - - if(i < n) { - if(!(grid[(y * size) + x] & 0xf0)) { - if (cwbit(datastream, i)) { - grid[(y * size) + x] = 0x01; - } else { - grid[(y * size) + x] = 0x00; - } - i++; - } - } - - if(direction) { y--; } else { y++; } - if(y == -1) { - /* reached the top */ - row++; - y = 0; - direction = 0; - } - if(y == size) { - /* reached the bottom */ - row++; - y = size - 1; - direction = 1; - } - } while (i < n); -} - -int evaluate(unsigned char *grid, int size, int pattern) -{ - int x, y, block; - int result = 0; - char state; - int p; - int dark_mods; - int percentage, k; - -#ifndef _MSC_VER - char local[size * size]; -#else - char* local = (char *)_alloca((size * size) * sizeof(char)); -#endif - - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - switch(pattern) { - case 0: if (grid[(y * size) + x] & 0x01) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; - case 1: if (grid[(y * size) + x] & 0x02) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; - case 2: if (grid[(y * size) + x] & 0x04) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; - case 3: if (grid[(y * size) + x] & 0x08) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; - case 4: if (grid[(y * size) + x] & 0x10) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; - case 5: if (grid[(y * size) + x] & 0x20) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; - case 6: if (grid[(y * size) + x] & 0x40) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; - case 7: if (grid[(y * size) + x] & 0x80) { local[(y * size) + x] = '1'; } else { local[(y * size) + x] = '0'; } break; - } - } - } - - /* Test 1: Adjacent modules in row/column in same colour */ - /* Vertical */ - for(x = 0; x < size; x++) { - state = local[x]; - block = 0; - for(y = 0; y < size; y++) { - if(local[(y * size) + x] == state) { - block++; - } else { - if(block > 5) { - result += (3 + block); - } - block = 0; - state = local[(y * size) + x]; - } - } - if(block > 5) { - result += (3 + block); - } - } - - /* Horizontal */ - for(y = 0; y < size; y++) { - state = local[y * size]; - block = 0; - for(x = 0; x < size; x++) { - if(local[(y * size) + x] == state) { - block++; - } else { - if(block > 5) { - result += (3 + block); - } - block = 0; - state = local[(y * size) + x]; - } - } - if(block > 5) { - result += (3 + block); - } - } - - /* Test 2 is not implimented */ - - /* Test 3: 1:1:3:1:1 ratio pattern in row/column */ - /* Vertical */ - for(x = 0; x < size; x++) { - for(y = 0; y < (size - 7); y++) { - p = 0; - if(local[(y * size) + x] == '1') { p += 0x40; } - if(local[((y + 1) * size) + x] == '1') { p += 0x20; } - if(local[((y + 2) * size) + x] == '1') { p += 0x10; } - if(local[((y + 3) * size) + x] == '1') { p += 0x08; } - if(local[((y + 4) * size) + x] == '1') { p += 0x04; } - if(local[((y + 5) * size) + x] == '1') { p += 0x02; } - if(local[((y + 6) * size) + x] == '1') { p += 0x01; } - if(p == 0x5d) { - result += 40; - } - } - } - - /* Horizontal */ - for(y = 0; y < size; y++) { - for(x = 0; x < (size - 7); x++) { - p = 0; - if(local[(y * size) + x] == '1') { p += 0x40; } - if(local[(y * size) + x + 1] == '1') { p += 0x20; } - if(local[(y * size) + x + 2] == '1') { p += 0x10; } - if(local[(y * size) + x + 3] == '1') { p += 0x08; } - if(local[(y * size) + x + 4] == '1') { p += 0x04; } - if(local[(y * size) + x + 5] == '1') { p += 0x02; } - if(local[(y * size) + x + 6] == '1') { p += 0x01; } - if(p == 0x5d) { - result += 40; - } - } - } - - /* Test 4: Proportion of dark modules in entire symbol */ - dark_mods = 0; - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - if(local[(y * size) + x] == '1') { - dark_mods++; - } - } - } - percentage = 100 * (dark_mods / (size * size)); - if(percentage <= 50) { - k = ((100 - percentage) - 50) / 5; - } else { - k = (percentage - 50) / 5; - } - - result += 10 * k; - - return result; -} - - -int apply_bitmask(unsigned char *grid, int size) -{ - int x, y; - unsigned char p; - int pattern, penalty[8]; - int best_val, best_pattern; - int bit; - -#ifndef _MSC_VER - unsigned char mask[size * size]; - unsigned char eval[size * size]; -#else - unsigned char* mask = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); - unsigned char* eval = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); -#endif - - /* Perform data masking */ - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - mask[(y * size) + x] = 0x00; - - if (!(grid[(y * size) + x] & 0xf0)) { - if(((y + x) & 1) == 0) { mask[(y * size) + x] += 0x01; } - if((y & 1) == 0) { mask[(y * size) + x] += 0x02; } - if((x % 3) == 0) { mask[(y * size) + x] += 0x04; } - if(((y + x) % 3) == 0) { mask[(y * size) + x] += 0x08; } - if((((y / 2) + (x / 3)) & 1) == 0) { mask[(y * size) + x] += 0x10; } - if((((y * x) & 1) + ((y * x) % 3)) == 0) { mask[(y * size) + x] += 0x20; } - if(((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) { mask[(y * size) + x] += 0x40; } - if(((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) { mask[(y * size) + x] += 0x80; } - } - } - } - - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - if(grid[(y * size) + x] & 0x01) { p = 0xff; } else { p = 0x00; } - - eval[(y * size) + x] = mask[(y * size) + x] ^ p; - } - } - - - /* Evaluate result */ - for(pattern = 0; pattern < 8; pattern++) { - penalty[pattern] = evaluate(eval, size, pattern); - } - - best_pattern = 0; - best_val = penalty[0]; - for(pattern = 1; pattern < 8; pattern++) { - if(penalty[pattern] < best_val) { - best_pattern = pattern; - best_val = penalty[pattern]; - } - } - - /* Apply mask */ - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - bit = 0; - switch(best_pattern) { - case 0: if(mask[(y * size) + x] & 0x01) { bit = 1; } break; - case 1: if(mask[(y * size) + x] & 0x02) { bit = 1; } break; - case 2: if(mask[(y * size) + x] & 0x04) { bit = 1; } break; - case 3: if(mask[(y * size) + x] & 0x08) { bit = 1; } break; - case 4: if(mask[(y * size) + x] & 0x10) { bit = 1; } break; - case 5: if(mask[(y * size) + x] & 0x20) { bit = 1; } break; - case 6: if(mask[(y * size) + x] & 0x40) { bit = 1; } break; - case 7: if(mask[(y * size) + x] & 0x80) { bit = 1; } break; - } - if(bit == 1) { - if(grid[(y * size) + x] & 0x01) { - grid[(y * size) + x] = 0x00; - } else { - grid[(y * size) + x] = 0x01; - } - } - } - } - - return best_pattern; -} - -void add_format_info(unsigned char *grid, int size, int ecc_level, int pattern) -{ - /* Add format information to grid */ - - int format = pattern; - unsigned int seq; - int i; - - switch(ecc_level) { - case LEVEL_L: format += 0x08; break; - case LEVEL_Q: format += 0x18; break; - case LEVEL_H: format += 0x10; break; - } - - seq = qr_annex_c[format]; - - for(i = 0; i < 6; i++) { - grid[(i * size) + 8] += (seq >> i) & 0x01; - } - - for(i = 0; i < 8; i++) { - grid[(8 * size) + (size - i - 1)] += (seq >> i) & 0x01; - } - - for(i = 0; i < 6; i++) { - grid[(8 * size) + (5 - i)] += (seq >> (i + 9)) & 0x01; - } - - for(i = 0; i < 7; i++) { - grid[(((size - 7) + i) * size) + 8] += (seq >> (i + 8)) & 0x01; - } - - grid[(7 * size) + 8] += (seq >> 6) & 0x01; - grid[(8 * size) + 8] += (seq >> 7) & 0x01; - grid[(8 * size) + 7] += (seq >> 8) & 0x01; -} - -void add_version_info(unsigned char *grid, int size, int version) -{ - /* Add version information */ - int i; - - long int version_data = qr_annex_d[version - 7]; - for(i = 0; i < 6; i++) { - grid[((size - 11) * size) + i] += (version_data >> (i * 3)) & 0x01; - grid[((size - 10) * size) + i] += (version_data >> ((i * 3) + 1)) & 0x01; - grid[((size - 9) * size) + i] += (version_data >> ((i * 3) + 2)) & 0x01; - grid[(i * size) + (size - 11)] += (version_data >> (i * 3)) & 0x01; - grid[(i * size) + (size - 10)] += (version_data >> ((i * 3) + 1)) & 0x01; - grid[(i * size) + (size - 9)] += (version_data >> ((i * 3) + 2)) & 0x01; - } -} - -int qr_code(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int error_number, i, j, glyph, est_binlen; - int ecc_level, autosize, version, max_cw, target_binlen, blocks, size; - int bitmask, gs1; - -#ifndef _MSC_VER - int utfdata[length + 1]; - int jisdata[length + 1]; - char mode[length + 1]; -#else - int* datastream; - int* fullstream; - unsigned char* grid; - int* utfdata = (int *)_alloca((length + 1) * sizeof(int)); - int* jisdata = (int *)_alloca((length + 1) * sizeof(int)); - char* mode = (char *)_alloca(length + 1); -#endif - - gs1 = (symbol->input_mode == GS1_MODE); - - switch(symbol->input_mode) { - case DATA_MODE: - for(i = 0; i < length; i++) { - jisdata[i] = (int)source[i]; - } - break; - default: - /* Convert Unicode input to Shift-JIS */ - error_number = utf8toutf16(symbol, source, utfdata, &length); - if(error_number != 0) { return error_number; } - - for(i = 0; i < length; i++) { - if(utfdata[i] <= 0xff) { - jisdata[i] = utfdata[i]; - } else { - j = 0; - glyph = 0; - do { - if(sjis_lookup[j * 2] == utfdata[i]) { - glyph = sjis_lookup[(j * 2) + 1]; - } - j++; - } while ((j < 6843) && (glyph == 0)); - if(glyph == 0) { - strcpy(symbol->errtxt, "Invalid character in input data"); - return ERROR_INVALID_DATA1; - } - jisdata[i] = glyph; - } - } - break; - } - - define_mode(mode, jisdata, length, gs1); - est_binlen = estimate_binary_length(mode, length, gs1); - - ecc_level = LEVEL_L; - max_cw = 2956; - if((symbol->option_1 >= 1) && (symbol->option_1 <= 4)) { - switch (symbol->option_1) { - case 1: ecc_level = LEVEL_L; max_cw = 2956; break; - case 2: ecc_level = LEVEL_M; max_cw = 2334; break; - case 3: ecc_level = LEVEL_Q; max_cw = 1666; break; - case 4: ecc_level = LEVEL_H; max_cw = 1276; break; - } - } - - if(est_binlen > (8 * max_cw)) { - strcpy(symbol->errtxt, "Input too long for selected error correction level"); - return ERROR_TOO_LONG; - } - - autosize = 40; - for(i = 39; i >= 0; i--) { - switch(ecc_level) { - case LEVEL_L: - if ((8 * qr_data_codewords_L[i]) >= est_binlen) { - autosize = i + 1; - } - break; - case LEVEL_M: - if ((8 * qr_data_codewords_M[i]) >= est_binlen) { - autosize = i + 1; - } - break; - case LEVEL_Q: - if ((8 * qr_data_codewords_Q[i]) >= est_binlen) { - autosize = i + 1; - } - break; - case LEVEL_H: - if ((8 * qr_data_codewords_H[i]) >= est_binlen) { - autosize = i + 1; - } - break; - } - } - - if((symbol->option_2 >= 1) && (symbol->option_2 <= 40)) { - if (symbol->option_2 > autosize) { - version = symbol->option_2; - } else { - version = autosize; - } - } else { - version = autosize; - } - - /* Ensure maxium error correction capacity */ - if(est_binlen <= qr_data_codewords_M[version - 1]) { ecc_level = LEVEL_M; } - if(est_binlen <= qr_data_codewords_Q[version - 1]) { ecc_level = LEVEL_Q; } - if(est_binlen <= qr_data_codewords_H[version - 1]) { ecc_level = LEVEL_H; } - - target_binlen = qr_data_codewords_L[version - 1]; blocks = qr_blocks_L[version - 1]; - switch(ecc_level) { - case LEVEL_M: target_binlen = qr_data_codewords_M[version - 1]; blocks = qr_blocks_M[version - 1]; break; - case LEVEL_Q: target_binlen = qr_data_codewords_Q[version - 1]; blocks = qr_blocks_Q[version - 1]; break; - case LEVEL_H: target_binlen = qr_data_codewords_H[version - 1]; blocks = qr_blocks_H[version - 1]; break; - } - -#ifndef _MSC_VER - int datastream[target_binlen + 1]; - int fullstream[qr_total_codewords[version - 1] + 1]; -#else - datastream = (int *)_alloca((target_binlen + 1) * sizeof(int)); - fullstream = (int *)_alloca((qr_total_codewords[version - 1] + 1) * sizeof(int)); -#endif - - qr_binary(datastream, version, target_binlen, mode, jisdata, length, gs1, est_binlen); - add_ecc(fullstream, datastream, version, target_binlen, blocks); - - size = qr_sizes[version - 1]; -#ifndef _MSC_VER - unsigned char grid[size * size]; -#else - grid = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); -#endif - - for(i = 0; i < size; i++) { - for(j = 0; j < size; j++) { - grid[(i * size) + j] = 0; - } - } - - setup_grid(grid, size, version); - populate_grid(grid, size, fullstream, qr_total_codewords[version - 1]); - bitmask = apply_bitmask(grid, size); - add_format_info(grid, size, ecc_level, bitmask); - if(version >= 7) { - add_version_info(grid, size, version); - } - - symbol->width = size; - symbol->rows = size; - - for(i = 0; i < size; i++) { - for(j = 0; j < size; j++) { - if(grid[(i * size) + j] & 0x01) { - set_module(symbol, i, j); - } - } - symbol->row_height[i] = 1; - } - - return 0; -} - -/* NOTE: From this point forward concerns Micro QR Code only */ - -int micro_qr_intermediate(char binary[], int jisdata[], char mode[], int length, int *kanji_used, int *alphanum_used, int *byte_used) -{ - /* Convert input data to an "intermediate stage" where data is binary encoded but - control information is not */ - int position = 0, debug = 0; - int short_data_block_length, i; - char data_block; - char buffer[2]; - - strcpy(binary, ""); - - if(debug) { - for(i = 0; i < length; i++) { - printf("%c", mode[i]); - } - printf("\n"); - } - - do { - if(strlen(binary) > 128) { - return ERROR_TOO_LONG; - } - - data_block = mode[position]; - short_data_block_length = 0; - do { - short_data_block_length++; - } while (((short_data_block_length + position) < length) && (mode[position + short_data_block_length] == data_block)); - - switch(data_block) { - case 'K': - /* Kanji mode */ - /* Mode indicator */ - concat(binary, "K"); - *kanji_used = 1; - - /* Character count indicator */ - buffer[0] = short_data_block_length; - buffer[1] = '\0'; - concat(binary, buffer); - - if(debug) { printf("Kanji block (length %d)\n\t", short_data_block_length); } - - /* Character representation */ - for(i = 0; i < short_data_block_length; i++) { - int jis = jisdata[position + i]; - int msb, lsb, prod; - - if(jis > 0x9fff) { jis -= 0xc140; } - msb = (jis & 0xff00) >> 4; - lsb = (jis & 0xff); - prod = (msb * 0xc0) + lsb; - - qr_bscan(binary, prod, 0x1000); - - if(debug) { printf("0x%4X ", prod); } - - if(strlen(binary) > 128) { - return ERROR_TOO_LONG; - } - } - - if(debug) { printf("\n"); } - - break; - case 'B': - /* Byte mode */ - /* Mode indicator */ - concat(binary, "B"); - *byte_used = 1; - - /* Character count indicator */ - buffer[0] = short_data_block_length; - buffer[1] = '\0'; - concat(binary, buffer); - - if(debug) { printf("Byte block (length %d)\n\t", short_data_block_length); } - - /* Character representation */ - for(i = 0; i < short_data_block_length; i++) { - int byte = jisdata[position + i]; - - qr_bscan(binary, byte, 0x80); - - if(debug) { printf("0x%4X ", byte); } - - if(strlen(binary) > 128) { - return ERROR_TOO_LONG; - } - } - - if(debug) { printf("\n"); } - - break; - case 'A': - /* Alphanumeric mode */ - /* Mode indicator */ - concat(binary, "A"); - *alphanum_used = 1; - - /* Character count indicator */ - buffer[0] = short_data_block_length; - buffer[1] = '\0'; - concat(binary, buffer); - - if(debug) { printf("Alpha block (length %d)\n\t", short_data_block_length); } - - /* Character representation */ - i = 0; - while ( i < short_data_block_length ) { - int count; - int first = 0, second = 0, prod; - - first = posn(RHODIUM, (char) jisdata[position + i]); - count = 1; - prod = first; - - if(mode[position + i + 1] == 'A') { - second = posn(RHODIUM, (char) jisdata[position + i + 1]); - count = 2; - prod = (first * 45) + second; - } - - qr_bscan(binary, prod, 1 << (5 * count)); /* count = 1..2 */ - - if(debug) { printf("0x%4X ", prod); } - - if(strlen(binary) > 128) { - return ERROR_TOO_LONG; - } - - i += 2; - }; - - if(debug) { printf("\n"); } - - break; - case 'N': - /* Numeric mode */ - /* Mode indicator */ - concat(binary, "N"); - - /* Character count indicator */ - buffer[0] = short_data_block_length; - buffer[1] = '\0'; - concat(binary, buffer); - - if(debug) { printf("Number block (length %d)\n\t", short_data_block_length); } - - /* Character representation */ - i = 0; - while ( i < short_data_block_length ) { - int count; - int first = 0, second = 0, third = 0, prod; - - first = posn(NEON, (char) jisdata[position + i]); - count = 1; - prod = first; - - if(mode[position + i + 1] == 'N') { - second = posn(NEON, (char) jisdata[position + i + 1]); - count = 2; - prod = (prod * 10) + second; - } - - if(mode[position + i + 2] == 'N') { - third = posn(NEON, (char) jisdata[position + i + 2]); - count = 3; - prod = (prod * 10) + third; - } - - qr_bscan(binary, prod, 1 << (3 * count)); /* count = 1..3 */ - - if(debug) { printf("0x%4X (%d)", prod, prod); } - - if(strlen(binary) > 128) { - return ERROR_TOO_LONG; - } - - i += 3; - }; - - if(debug) { printf("\n"); } - - break; - } - - position += short_data_block_length; - } while (position < length - 1) ; - - return 0; -} - -void get_bitlength(int count[], char stream[]) { - int length, i; - - length = strlen(stream); - - for(i = 0; i < 4; i++) { - count[i] = 0; - } - - i = 0; - do { - if((stream[i] == '0') || (stream[i] == '1')) { - count[0]++; - count[1]++; - count[2]++; - count[3]++; - i++; - } else { - switch(stream[i]) { - case 'K': - count[2] += 5; - count[3] += 7; - i += 2; - break; - case 'B': - count[2] += 6; - count[3] += 8; - i += 2; - break; - case 'A': - count[1] += 4; - count[2] += 6; - count[3] += 8; - i += 2; - break; - case 'N': - count[0] += 3; - count[1] += 5; - count[2] += 7; - count[3] += 9; - i += 2; - break; - } - } - } while (i < length); -} - -void microqr_expand_binary(char binary_stream[], char full_stream[], int version) -{ - int i, length; - - length = strlen(binary_stream); - - i = 0; - do { - switch(binary_stream[i]) { - case '1': concat(full_stream, "1"); i++; break; - case '0': concat(full_stream, "0"); i++; break; - case 'N': - /* Numeric Mode */ - /* Mode indicator */ - switch(version) { - case 1: concat(full_stream, "0"); break; - case 2: concat(full_stream, "00"); break; - case 3: concat(full_stream, "000"); break; - } - - /* Character count indicator */ - qr_bscan(full_stream, binary_stream[i + 1], 4 << version); /* version = 0..3 */ - - i += 2; - break; - case 'A': - /* Alphanumeric Mode */ - /* Mode indicator */ - switch(version) { - case 1: concat(full_stream, "1"); break; - case 2: concat(full_stream, "01"); break; - case 3: concat(full_stream, "001"); break; - } - - /* Character count indicator */ - qr_bscan(full_stream, binary_stream[i + 1], 2 << version); /* version = 1..3 */ - - i += 2; - break; - case 'B': - /* Byte Mode */ - /* Mode indicator */ - switch(version) { - case 2: concat(full_stream, "10"); break; - case 3: concat(full_stream, "010"); break; - } - - /* Character count indicator */ - qr_bscan(full_stream, binary_stream[i + 1], 2 << version); /* version = 2..3 */ - - i += 2; - break; - case 'K': - /* Kanji Mode */ - /* Mode indicator */ - switch(version) { - case 2: concat(full_stream, "11"); break; - case 3: concat(full_stream, "011"); break; - } - - /* Character count indicator */ - qr_bscan(full_stream, binary_stream[i + 1], 1 << version); /* version = 2..3 */ - - i += 2; - break; - } - - } while (i < length); -} - -void micro_qr_m1(char binary_data[]) -{ - int i, latch; - int bits_total, bits_left, remainder; - int data_codewords, ecc_codewords; - unsigned char data_blocks[4], ecc_blocks[3]; - - bits_total = 20; - latch = 0; - - /* Add terminator */ - bits_left = bits_total - strlen(binary_data); - if(bits_left <= 3) { - for(i = 0; i < bits_left; i++) { - concat(binary_data, "0"); - } - latch = 1; - } else { - concat(binary_data, "000"); - } - - if(latch == 0) { - /* Manage last (4-bit) block */ - bits_left = bits_total - strlen(binary_data); - if(bits_left <= 4) { - for(i = 0; i < bits_left; i++) { - concat(binary_data, "0"); - } - latch = 1; - } - } - - if(latch == 0) { - /* Complete current byte */ - remainder = 8 - (strlen(binary_data) % 8); - if(remainder == 8) { remainder = 0; } - for(i = 0; i < remainder; i++) { - concat(binary_data, "0"); - } - - /* Add padding */ - bits_left = bits_total - strlen(binary_data); - if(bits_left > 4) { - remainder = (bits_left - 4) / 8; - for(i = 0; i < remainder; i++) { - concat(binary_data, i & 1 ? "00010001" : "11101100"); - } - } - concat(binary_data, "0000"); - } - - data_codewords = 3; - ecc_codewords = 2; - - /* Copy data into codewords */ - for(i = 0; i < (data_codewords - 1); i++) { - data_blocks[i] = 0; - if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; } - if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; } - if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; } - if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; } - if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; } - if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; } - if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; } - if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; } - } - data_blocks[2] = 0; - if(binary_data[16] == '1') { data_blocks[2] += 0x08; } - if(binary_data[17] == '1') { data_blocks[2] += 0x04; } - if(binary_data[18] == '1') { data_blocks[2] += 0x02; } - if(binary_data[19] == '1') { data_blocks[2] += 0x01; } - - /* Calculate Reed-Solomon error codewords */ - rs_init_gf(0x11d); - rs_init_code(ecc_codewords, 0); - rs_encode(data_codewords,data_blocks,ecc_blocks); - rs_free(); - - /* Add Reed-Solomon codewords to binary data */ - for(i = 0; i < ecc_codewords; i++) { - qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80); - } -} - -void micro_qr_m2(char binary_data[], int ecc_mode) -{ - int i, latch; - int bits_total, bits_left, remainder; - int data_codewords, ecc_codewords; - unsigned char data_blocks[6], ecc_blocks[7]; - - latch = 0; - - if(ecc_mode == LEVEL_L) { bits_total = 40; } - if(ecc_mode == LEVEL_M) { bits_total = 32; } - - /* Add terminator */ - bits_left = bits_total - strlen(binary_data); - if(bits_left <= 5) { - for(i = 0; i < bits_left; i++) { - concat(binary_data, "0"); - } - latch = 1; - } else { - concat(binary_data, "00000"); - } - - if(latch == 0) { - /* Complete current byte */ - remainder = 8 - (strlen(binary_data) % 8); - if(remainder == 8) { remainder = 0; } - for(i = 0; i < remainder; i++) { - concat(binary_data, "0"); - } - - /* Add padding */ - bits_left = bits_total - strlen(binary_data); - remainder = bits_left / 8; - for(i = 0; i < remainder; i++) { - concat(binary_data, i & 1 ? "00010001" : "11101100"); - } - } - - if(ecc_mode == LEVEL_L) { data_codewords = 5; ecc_codewords = 5; } - if(ecc_mode == LEVEL_M) { data_codewords = 4; ecc_codewords = 6; } - - /* Copy data into codewords */ - for(i = 0; i < data_codewords; i++) { - data_blocks[i] = 0; - if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; } - if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; } - if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; } - if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; } - if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; } - if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; } - if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; } - if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; } - } - - /* Calculate Reed-Solomon error codewords */ - rs_init_gf(0x11d); - rs_init_code(ecc_codewords, 0); - rs_encode(data_codewords,data_blocks,ecc_blocks); - rs_free(); - - /* Add Reed-Solomon codewords to binary data */ - for(i = 0; i < ecc_codewords; i++) { - qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80); - } - - return; -} - -void micro_qr_m3(char binary_data[], int ecc_mode) -{ - int i, latch; - int bits_total, bits_left, remainder; - int data_codewords, ecc_codewords; - unsigned char data_blocks[12], ecc_blocks[9]; - - latch = 0; - - if(ecc_mode == LEVEL_L) { bits_total = 84; } - if(ecc_mode == LEVEL_M) { bits_total = 68; } - - /* Add terminator */ - bits_left = bits_total - strlen(binary_data); - if(bits_left <= 7) { - for(i = 0; i < bits_left; i++) { - concat(binary_data, "0"); - } - latch = 1; - } else { - concat(binary_data, "0000000"); - } - - if(latch == 0) { - /* Manage last (4-bit) block */ - bits_left = bits_total - strlen(binary_data); - if(bits_left <= 4) { - for(i = 0; i < bits_left; i++) { - concat(binary_data, "0"); - } - latch = 1; - } - } - - if(latch == 0) { - /* Complete current byte */ - remainder = 8 - (strlen(binary_data) % 8); - if(remainder == 8) { remainder = 0; } - for(i = 0; i < remainder; i++) { - concat(binary_data, "0"); - } - - /* Add padding */ - bits_left = bits_total - strlen(binary_data); - if(bits_left > 4) { - remainder = (bits_left - 4) / 8; - for(i = 0; i < remainder; i++) { - concat(binary_data, i & 1 ? "00010001" : "11101100"); - } - } - concat(binary_data, "0000"); - } - - if(ecc_mode == LEVEL_L) { data_codewords = 11; ecc_codewords = 6; } - if(ecc_mode == LEVEL_M) { data_codewords = 9; ecc_codewords = 8; } - - /* Copy data into codewords */ - for(i = 0; i < (data_codewords - 1); i++) { - data_blocks[i] = 0; - if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; } - if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; } - if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; } - if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; } - if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; } - if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; } - if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; } - if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; } - } - - if(ecc_mode == LEVEL_L) { - data_blocks[11] = 0; - if(binary_data[80] == '1') { data_blocks[2] += 0x08; } - if(binary_data[81] == '1') { data_blocks[2] += 0x04; } - if(binary_data[82] == '1') { data_blocks[2] += 0x02; } - if(binary_data[83] == '1') { data_blocks[2] += 0x01; } - } - - if(ecc_mode == LEVEL_M) { - data_blocks[9] = 0; - if(binary_data[64] == '1') { data_blocks[2] += 0x08; } - if(binary_data[65] == '1') { data_blocks[2] += 0x04; } - if(binary_data[66] == '1') { data_blocks[2] += 0x02; } - if(binary_data[67] == '1') { data_blocks[2] += 0x01; } - } - - /* Calculate Reed-Solomon error codewords */ - rs_init_gf(0x11d); - rs_init_code(ecc_codewords, 0); - rs_encode(data_codewords,data_blocks,ecc_blocks); - rs_free(); - - /* Add Reed-Solomon codewords to binary data */ - for(i = 0; i < ecc_codewords; i++) { - qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80); - } - - return; -} - -void micro_qr_m4(char binary_data[], int ecc_mode) -{ - int i, latch; - int bits_total, bits_left, remainder; - int data_codewords, ecc_codewords; - unsigned char data_blocks[17], ecc_blocks[15]; - - latch = 0; - - if(ecc_mode == LEVEL_L) { bits_total = 128; } - if(ecc_mode == LEVEL_M) { bits_total = 112; } - if(ecc_mode == LEVEL_Q) { bits_total = 80; } - - /* Add terminator */ - bits_left = bits_total - strlen(binary_data); - if(bits_left <= 9) { - for(i = 0; i < bits_left; i++) { - concat(binary_data, "0"); - } - latch = 1; - } else { - concat(binary_data, "000000000"); - } - - if(latch == 0) { - /* Complete current byte */ - remainder = 8 - (strlen(binary_data) % 8); - if(remainder == 8) { remainder = 0; } - for(i = 0; i < remainder; i++) { - concat(binary_data, "0"); - } - - /* Add padding */ - bits_left = bits_total - strlen(binary_data); - remainder = bits_left / 8; - for(i = 0; i < remainder; i++) { - concat(binary_data, i & 1 ? "00010001" : "11101100"); - } - } - - if(ecc_mode == LEVEL_L) { data_codewords = 16; ecc_codewords = 8; } - if(ecc_mode == LEVEL_M) { data_codewords = 14; ecc_codewords = 10; } - if(ecc_mode == LEVEL_Q) { data_codewords = 10; ecc_codewords = 14; } - - /* Copy data into codewords */ - for(i = 0; i < data_codewords; i++) { - data_blocks[i] = 0; - if(binary_data[i * 8] == '1') { data_blocks[i] += 0x80; } - if(binary_data[(i * 8) + 1] == '1') { data_blocks[i] += 0x40; } - if(binary_data[(i * 8) + 2] == '1') { data_blocks[i] += 0x20; } - if(binary_data[(i * 8) + 3] == '1') { data_blocks[i] += 0x10; } - if(binary_data[(i * 8) + 4] == '1') { data_blocks[i] += 0x08; } - if(binary_data[(i * 8) + 5] == '1') { data_blocks[i] += 0x04; } - if(binary_data[(i * 8) + 6] == '1') { data_blocks[i] += 0x02; } - if(binary_data[(i * 8) + 7] == '1') { data_blocks[i] += 0x01; } - } - - /* Calculate Reed-Solomon error codewords */ - rs_init_gf(0x11d); - rs_init_code(ecc_codewords, 0); - rs_encode(data_codewords,data_blocks,ecc_blocks); - rs_free(); - - /* Add Reed-Solomon codewords to binary data */ - for(i = 0; i < ecc_codewords; i++) { - qr_bscan(binary_data, ecc_blocks[ecc_codewords - i - 1], 0x80); - } -} - -void micro_setup_grid(unsigned char* grid, int size) -{ - int i, toggle = 1; - - /* Add timing patterns */ - for(i = 0; i < size; i++) { - if(toggle == 1) { - grid[i] = 0x21; - grid[(i * size)] = 0x21; - toggle = 0; - } else { - grid[i] = 0x20; - grid[(i * size)] = 0x20; - toggle = 1; - } - } - - /* Add finder patterns */ - place_finder(grid, size, 0, 0); - - /* Add separators */ - for(i = 0; i < 7; i++) { - grid[(7 * size) + i] = 0x10; - grid[(i * size) + 7] = 0x10; - } - grid[(7 * size) + 7] = 0x10; - - - /* Reserve space for format information */ - for(i = 0; i < 8; i++) { - grid[(8 * size) + i] += 0x20; - grid[(i * size) + 8] += 0x20; - } - grid[(8 * size) + 8] += 20; -} - -void micro_populate_grid(unsigned char* grid, int size, char full_stream[]) -{ - int direction = 1; /* up */ - int row = 0; /* right hand side */ - - int i, n, x, y; - - n = strlen(full_stream); - y = size - 1; - i = 0; - do { - x = (size - 2) - (row * 2); - - if(!(grid[(y * size) + (x + 1)] & 0xf0)) { - if (full_stream[i] == '1') { - grid[(y * size) + (x + 1)] = 0x01; - } else { - grid[(y * size) + (x + 1)] = 0x00; - } - i++; - } - - if(i < n) { - if(!(grid[(y * size) + x] & 0xf0)) { - if (full_stream[i] == '1') { - grid[(y * size) + x] = 0x01; - } else { - grid[(y * size) + x] = 0x00; - } - i++; - } - } - - if(direction) { y--; } else { y++; } - if(y == 0) { - /* reached the top */ - row++; - y = 1; - direction = 0; - } - if(y == size) { - /* reached the bottom */ - row++; - y = size - 1; - direction = 1; - } - } while (i < n); -} - -int micro_evaluate(unsigned char *grid, int size, int pattern) -{ - int sum1, sum2, i, filter = 0, retval; - - switch(pattern) { - case 0: filter = 0x01; break; - case 1: filter = 0x02; break; - case 2: filter = 0x04; break; - case 3: filter = 0x08; break; - } - - sum1 = 0; - sum2 = 0; - for(i = 1; i < size; i++) { - if(grid[(i * size) + size - 1] & filter) { sum1++; } - if(grid[((size - 1) * size) + i] & filter) { sum2++; } - } - - if(sum1 <= sum2) { retval = (sum1 * 16) + sum2; } else { retval = (sum2 * 16) + sum1; } - - return retval; -} - -int micro_apply_bitmask(unsigned char *grid, int size) -{ - int x, y; - unsigned char p; - int pattern, value[8]; - int best_val, best_pattern; - int bit; - -#ifndef _MSC_VER - unsigned char mask[size * size]; - unsigned char eval[size * size]; -#else - unsigned char* mask = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); - unsigned char* eval = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); -#endif - - /* Perform data masking */ - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - mask[(y * size) + x] = 0x00; - - if (!(grid[(y * size) + x] & 0xf0)) { - if((y & 1) == 0) { - mask[(y * size) + x] += 0x01; - } - - if((((y / 2) + (x / 3)) & 1) == 0) { - mask[(y * size) + x] += 0x02; - } - - if(((((y * x) & 1) + ((y * x) % 3)) & 1) == 0) { - mask[(y * size) + x] += 0x04; - } - - if(((((y + x) & 1) + ((y * x) % 3)) & 1) == 0) { - mask[(y * size) + x] += 0x08; - } - } - } - } - - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - if(grid[(y * size) + x] & 0x01) { p = 0xff; } else { p = 0x00; } - - eval[(y * size) + x] = mask[(y * size) + x] ^ p; - } - } - - - /* Evaluate result */ - for(pattern = 0; pattern < 8; pattern++) { - value[pattern] = micro_evaluate(eval, size, pattern); - } - - best_pattern = 0; - best_val = value[0]; - for(pattern = 1; pattern < 4; pattern++) { - if(value[pattern] > best_val) { - best_pattern = pattern; - best_val = value[pattern]; - } - } - - /* Apply mask */ - for(x = 0; x < size; x++) { - for(y = 0; y < size; y++) { - bit = 0; - switch(best_pattern) { - case 0: if(mask[(y * size) + x] & 0x01) { bit = 1; } break; - case 1: if(mask[(y * size) + x] & 0x02) { bit = 1; } break; - case 2: if(mask[(y * size) + x] & 0x04) { bit = 1; } break; - case 3: if(mask[(y * size) + x] & 0x08) { bit = 1; } break; - } - if(bit == 1) { - if(grid[(y * size) + x] & 0x01) { - grid[(y * size) + x] = 0x00; - } else { - grid[(y * size) + x] = 0x01; - } - } - } - } - - return best_pattern; -} - -int microqr(struct zint_symbol *symbol, unsigned char source[], int length) -{ - int i, j, glyph, size; - char binary_stream[200]; - char full_stream[200]; - int utfdata[40]; - int jisdata[40]; - char mode[40]; - int error_number, kanji_used = 0, alphanum_used = 0, byte_used = 0; - int version_valid[4]; - int binary_count[4]; - int ecc_level, autoversion, version; - int n_count, a_count, bitmask, format, format_full; - -#ifdef _MSC_VER - unsigned char* grid; -#endif - - if(length > 35) { - strcpy(symbol->errtxt, "Input data too long"); - return ERROR_TOO_LONG; - } - - for(i = 0; i < 4; i++) { - version_valid[i] = 1; - } - - switch(symbol->input_mode) { - case DATA_MODE: - for(i = 0; i < length; i++) { - jisdata[i] = (int)source[i]; - } - break; - default: - /* Convert Unicode input to Shift-JIS */ - error_number = utf8toutf16(symbol, source, utfdata, &length); - if(error_number != 0) { return error_number; } - - for(i = 0; i < length; i++) { - if(utfdata[i] <= 0xff) { - jisdata[i] = utfdata[i]; - } else { - j = 0; - glyph = 0; - do { - if(sjis_lookup[j * 2] == utfdata[i]) { - glyph = sjis_lookup[(j * 2) + 1]; - } - j++; - } while ((j < 6843) && (glyph == 0)); - if(glyph == 0) { - strcpy(symbol->errtxt, "Invalid character in input data"); - return ERROR_INVALID_DATA1; - } - jisdata[i] = glyph; - } - } - break; - } - - define_mode(mode, jisdata, length, 0); - - n_count = 0; - a_count = 0; - for(i = 0; i < length; i++) { - if((jisdata[i] >= '0') && (jisdata[i] <= '9')) { n_count++; } - if(in_alpha(jisdata[i])) { a_count++; } - } - - if(a_count == length) { - /* All data can be encoded in Alphanumeric mode */ - for(i = 0; i < length; i++) { - mode[i] = 'A'; - } - } - - if(n_count == length) { - /* All data can be encoded in Numeric mode */ - for(i = 0; i < length; i++) { - mode[i] = 'N'; - } - } - - error_number = micro_qr_intermediate(binary_stream, jisdata, mode, length, &kanji_used, &alphanum_used, &byte_used); - if(error_number != 0) { - strcpy(symbol->errtxt, "Input data too long"); - return error_number; - } - - get_bitlength(binary_count, binary_stream); - - /* Eliminate possivle versions depending on type of content */ - if(byte_used) { - version_valid[0] = 0; - version_valid[1] = 0; - } - - if(alphanum_used) { - version_valid[0] = 0; - } - - if(kanji_used) { - version_valid[0] = 0; - version_valid[1] = 0; - } - - /* Eliminate possible versions depending on length of binary data */ - if(binary_count[0] > 20) { version_valid[0] = 0; } - if(binary_count[1] > 40) { version_valid[1] = 0; } - if(binary_count[2] > 84) { version_valid[2] = 0; } - if(binary_count[3] > 128) { - strcpy(symbol->errtxt, "Input data too long"); - return ERROR_TOO_LONG; - } - - /* Eliminate possible versions depending on error correction level specified */ - ecc_level = LEVEL_L; - if((symbol->option_1 >= 1) && (symbol->option_2 <= 4)) { - ecc_level = symbol->option_1; - } - - if(ecc_level == LEVEL_H) { - strcpy(symbol->errtxt, "Error correction level H not available"); - return ERROR_INVALID_OPTION; - } - - if(ecc_level == LEVEL_Q) { - version_valid[0] = 0; - version_valid[1] = 0; - version_valid[2] = 0; - if(binary_count[3] > 80) { - strcpy(symbol->errtxt, "Input data too long"); - return ERROR_TOO_LONG; - } - } - - if(ecc_level == LEVEL_M) { - version_valid[0] = 0; - if(binary_count[1] > 32) { version_valid[1] = 0; } - if(binary_count[2] > 68) { version_valid[2] = 0; } - if(binary_count[3] > 112) { - strcpy(symbol->errtxt, "Input data too long"); - return ERROR_TOO_LONG; - } - } - - autoversion = 3; - if(version_valid[2]) { autoversion = 2; } - if(version_valid[1]) { autoversion = 1; } - if(version_valid[0]) { autoversion = 0; } - - version = autoversion; - /* Get version from user */ - if((symbol->option_2 >= 1) && (symbol->option_2 <= 4)) { - if(symbol->option_2 >= autoversion) { - version = symbol->option_2; - } - } - - /* If there is enough unused space then increase the error correction level */ - if(version == 3) { - if(binary_count[3] <= 112) { ecc_level = LEVEL_M; } - if(binary_count[3] <= 80) { ecc_level = LEVEL_Q; } - } - - if(version == 2) { - if(binary_count[2] <= 68) { ecc_level = LEVEL_M; } - } - - if(version == 1) { - if(binary_count[1] <= 32) { ecc_level = LEVEL_M; } - } - - strcpy(full_stream, ""); - microqr_expand_binary(binary_stream, full_stream, version); - - switch(version) { - case 0: micro_qr_m1(full_stream); break; - case 1: micro_qr_m2(full_stream, ecc_level); break; - case 2: micro_qr_m3(full_stream, ecc_level); break; - case 3: micro_qr_m4(full_stream, ecc_level); break; - } - - size = micro_qr_sizes[version]; -#ifndef _MSC_VER - unsigned char grid[size * size]; -#else - grid = (unsigned char *)_alloca((size * size) * sizeof(unsigned char)); -#endif - - for(i = 0; i < size; i++) { - for(j = 0; j < size; j++) { - grid[(i * size) + j] = 0; - } - } - - micro_setup_grid(grid, size); - micro_populate_grid(grid, size, full_stream); - bitmask = micro_apply_bitmask(grid, size); - - /* Add format data */ - format = 0; - switch(version) { - case 1: switch(ecc_level) { - case 1: format = 1; break; - case 2: format = 2; break; - } - break; - case 2: switch(ecc_level) { - case 1: format = 3; break; - case 2: format = 4; break; - } - break; - case 3: switch(ecc_level) { - case 1: format = 5; break; - case 2: format = 6; break; - case 3: format = 7; break; - } - break; - } - - format_full = qr_annex_c1[(format << 2) + bitmask]; - - if(format_full & 0x4000) { grid[(8 * size) + 1] += 0x01; } - if(format_full & 0x2000) { grid[(8 * size) + 2] += 0x01; } - if(format_full & 0x1000) { grid[(8 * size) + 3] += 0x01; } - if(format_full & 0x800) { grid[(8 * size) + 4] += 0x01; } - if(format_full & 0x400) { grid[(8 * size) + 5] += 0x01; } - if(format_full & 0x200) { grid[(8 * size) + 6] += 0x01; } - if(format_full & 0x100) { grid[(8 * size) + 7] += 0x01; } - if(format_full & 0x80) { grid[(8 * size) + 8] += 0x01; } - if(format_full & 0x40) { grid[(7 * size) + 8] += 0x01; } - if(format_full & 0x20) { grid[(6 * size) + 8] += 0x01; } - if(format_full & 0x10) { grid[(5 * size) + 8] += 0x01; } - if(format_full & 0x08) { grid[(4 * size) + 8] += 0x01; } - if(format_full & 0x04) { grid[(3 * size) + 8] += 0x01; } - if(format_full & 0x02) { grid[(2 * size) + 8] += 0x01; } - if(format_full & 0x01) { grid[(1 * size) + 8] += 0x01; } - - symbol->width = size; - symbol->rows = size; - - for(i = 0; i < size; i++) { - for(j = 0; j < size; j++) { - if(grid[(i * size) + j] & 0x01) { - set_module(symbol, i, j); - } - } - symbol->row_height[i] = 1; - } - - return 0; -} diff --git a/3rdparty/zint-2.4.4/backend/qr.h b/3rdparty/zint-2.4.4/backend/qr.h deleted file mode 100644 index 47576d5..0000000 --- a/3rdparty/zint-2.4.4/backend/qr.h +++ /dev/null @@ -1,156 +0,0 @@ -/* qr.h Data for QR Code */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - Copyright (C) 2006 Kentaro Fukuchi - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#define LEVEL_L 1 -#define LEVEL_M 2 -#define LEVEL_Q 3 -#define LEVEL_H 4 - -#define RHODIUM "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:" - -/* From ISO/IEC 18004:2006 Table 7 */ -static int qr_data_codewords_L[] = { - 19, 34, 55, 80, 108, 136, 156, 194, 232, 274, 324, 370, 428, 461, 523, 589, 647, - 721, 795, 861, 932, 1006, 1094, 1174, 1276, 1370, 1468, 1531, 1631, - 1735, 1843, 1955, 2071, 2191, 2306, 2434, 2566, 2702, 2812, 2956 -}; - -static int qr_data_codewords_M[] = { - 16, 28, 44, 64, 86, 108, 124, 154, 182, 216, 254, 290, 334, 365, 415, 453, 507, - 563, 627, 669, 714, 782, 860, 914, 1000, 1062, 1128, 1193, 1267, - 1373, 1455, 1541, 1631, 1725, 1812, 1914, 1992, 2102, 2216, 2334 -}; - -static int qr_data_codewords_Q[] = { - 13, 22, 34, 48, 62, 76, 88, 110, 132, 154, 180, 206, 244, 261, 295, 325, 367, - 397, 445, 485, 512, 568, 614, 664, 718, 754, 808, 871, 911, - 985, 1033, 1115, 1171, 1231, 1286, 1354, 1426, 1502, 1582, 1666 -}; - -static int qr_data_codewords_H[] = { - 9, 16, 26, 36, 46, 60, 66, 86, 100, 122, 140, 158, 180, 197, 223, 253, 283, - 313, 341, 385, 406, 442, 464, 514, 538, 596, 628, 661, 701, - 745, 793, 845, 901, 961, 986, 1054, 1096, 1142, 1222, 1276 -}; - -static int qr_total_codewords[] = { - 26, 44, 70, 100, 134, 172, 196, 242, 292, 346, 404, 466, 532, 581, 655, 733, 815, - 901, 991, 1085, 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, - 2185, 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706 -}; - -static int qr_blocks_L[] = { - 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, - 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25 -}; - -static int qr_blocks_M[] = { - 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, - 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49 -}; - -static int qr_blocks_Q[] = { - 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, - 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68 -}; - -static int qr_blocks_H[] = { - 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, - 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81 -}; - -static int qr_sizes[] = { - 21, 25, 29, 33, 37, 41, 45, 49, 53, 57, 61, 65, 69, 73, 77, 81, 85, 89, 93, 97, - 101, 105, 109, 113, 117, 121, 125, 129, 133, 137, 141, 145, 149, 153, 157, 161, 165, 169, 173, 177 -}; - -static int micro_qr_sizes[] = { - 11, 13, 15, 17 -}; - -static int qr_align_loopsize[] = { - 0, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7 -}; - -static int qr_table_e1[] = { - 6, 18, 0, 0, 0, 0, 0, - 6, 22, 0, 0, 0, 0, 0, - 6, 26, 0, 0, 0, 0, 0, - 6, 30, 0, 0, 0, 0, 0, - 6, 34, 0, 0, 0, 0, 0, - 6, 22, 38, 0, 0, 0, 0, - 6, 24, 42, 0, 0, 0, 0, - 6, 26, 46, 0, 0, 0, 0, - 6, 28, 50, 0, 0, 0, 0, - 6, 30, 54, 0, 0, 0, 0, - 6, 32, 58, 0, 0, 0, 0, - 6, 34, 62, 0, 0, 0, 0, - 6, 26, 46, 66, 0, 0, 0, - 6, 26, 48, 70, 0, 0, 0, - 6, 26, 50, 74, 0, 0, 0, - 6, 30, 54, 78, 0, 0, 0, - 6, 30, 56, 82, 0, 0, 0, - 6, 30, 58, 86, 0, 0, 0, - 6, 34, 62, 90, 0, 0, 0, - 6, 28, 50, 72, 94, 0, 0, - 6, 26, 50, 74, 98, 0, 0, - 6, 30, 54, 78, 102, 0, 0, - 6, 28, 54, 80, 106, 0, 0, - 6, 32, 58, 84, 110, 0, 0, - 6, 30, 58, 86, 114, 0, 0, - 6, 34, 62, 90, 118, 0, 0, - 6, 26, 50, 74, 98, 122, 0, - 6, 30, 54, 78, 102, 126, 0, - 6, 26, 52, 78, 104, 130, 0, - 6, 30, 56, 82, 108, 134, 0, - 6, 34, 60, 86, 112, 138, 0, - 6, 30, 58, 86, 114, 142, 0, - 6, 34, 62, 90, 118, 146, 0, - 6, 30, 54, 78, 102, 126, 150, - 6, 24, 50, 76, 102, 128, 154, - 6, 28, 54, 80, 106, 132, 158, - 6, 32, 58, 84, 110, 136, 162, - 6, 26, 54, 82, 110, 138, 166, - 6, 30, 58, 86, 114, 142, 170 -}; - -static unsigned int qr_annex_c[] = { - /* Format information bit sequences */ - 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, 0x77c4, 0x72f3, 0x7daa, 0x789d, - 0x662f, 0x6318, 0x6c41, 0x6976, 0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b, - 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed -}; - -static long int qr_annex_d[] = { - /* Version information bit sequences */ - 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78, - 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab, - 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, - 0x2542e, 0x26a64, 0x27541, 0x28c69 -}; - -static int qr_annex_c1[] = { - /* Micro QR Code format information */ - 0x4445, 0x4172, 0x4e2b, 0x4b1c, 0x55ae, 0x5099, 0x5fc0, 0x5af7, 0x6793, 0x62a4, 0x6dfd, 0x68ca, 0x7678, 0x734f, - 0x7c16, 0x7921, 0x06de, 0x03e9, 0x0cb0, 0x0987, 0x1735, 0x1202, 0x1d5b, 0x186c, 0x2508, 0x203f, 0x2f66, 0x2a51, 0x34e3, - 0x31d4, 0x3e8d, 0x3bba -}; \ No newline at end of file diff --git a/3rdparty/zint-2.4.4/backend/reedsol.c b/3rdparty/zint-2.4.4/backend/reedsol.c deleted file mode 100644 index b37950b..0000000 --- a/3rdparty/zint-2.4.4/backend/reedsol.c +++ /dev/null @@ -1,161 +0,0 @@ -/** - * - * This is a simple Reed-Solomon encoder - * (C) Cliff Hones 2004 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -// It is not written with high efficiency in mind, so is probably -// not suitable for real-time encoding. The aim was to keep it -// simple, general and clear. -// -// - -// Usage: -// First call rs_init_gf(poly) to set up the Galois Field parameters. -// Then call rs_init_code(size, index) to set the encoding size -// Then call rs_encode(datasize, data, out) to encode the data. -// -// These can be called repeatedly as required - but note that -// rs_init_code must be called following any rs_init_gf call. -// -// If the parameters are fixed, some of the statics below can be -// replaced with constants in the obvious way, and additionally -// malloc/free can be avoided by using static arrays of a suitable -// size. - -#include // only needed for debug (main) -#include // only needed for malloc/free -#include "reedsol.h" -static int gfpoly; -static int symsize; // in bits -static int logmod; // 2**symsize - 1 -static int rlen; - -static int *logt = NULL, *alog = NULL, *rspoly = NULL; - -// rs_init_gf(poly) initialises the parameters for the Galois Field. -// The symbol size is determined from the highest bit set in poly -// This implementation will support sizes up to 30 bits (though that -// will result in very large log/antilog tables) - bit sizes of -// 8 or 4 are typical -// -// The poly is the bit pattern representing the GF characteristic -// polynomial. e.g. for ECC200 (8-bit symbols) the polynomial is -// a**8 + a**5 + a**3 + a**2 + 1, which translates to 0x12d. - -void rs_init_gf(int poly) -{ - int m, b, p, v; - - // Find the top bit, and hence the symbol size - for (b = 1, m = 0; b <= poly; b <<= 1) - m++; - b >>= 1; - m--; - gfpoly = poly; - symsize = m; - - // Calculate the log/alog tables - logmod = (1 << m) - 1; - logt = (int *)malloc(sizeof(int) * (logmod + 1)); - alog = (int *)malloc(sizeof(int) * logmod); - - for (p = 1, v = 0; v < logmod; v++) { - alog[v] = p; - logt[p] = v; - p <<= 1; - if (p & b) - p ^= poly; - } -} - -// rs_init_code(nsym, index) initialises the Reed-Solomon encoder -// nsym is the number of symbols to be generated (to be appended -// to the input data). index is usually 1 - it is the index of -// the constant in the first term (i) of the RS generator polynomial: -// (x + 2**i)*(x + 2**(i+1))*... [nsym terms] -// For ECC200, index is 1. - -void rs_init_code(int nsym, int index) -{ - int i, k; - - rspoly = (int *)malloc(sizeof(int) * (nsym + 1)); - - rlen = nsym; - - rspoly[0] = 1; - for (i = 1; i <= nsym; i++) { - rspoly[i] = 1; - for (k = i - 1; k > 0; k--) { - if (rspoly[k]) - rspoly[k] = alog[(logt[rspoly[k]] + index) % logmod]; - rspoly[k] ^= rspoly[k - 1]; - } - rspoly[0] = alog[(logt[rspoly[0]] + index) % logmod]; - index++; - } -} - -void rs_encode(int len, unsigned char *data, unsigned char *res) -{ - int i, k, m; - for (i = 0; i < rlen; i++) - res[i] = 0; - for (i = 0; i < len; i++) { - m = res[rlen - 1] ^ data[i]; - for (k = rlen - 1; k > 0; k--) { - if (m && rspoly[k]) - res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod]; - else - res[k] = res[k - 1]; - } - if (m && rspoly[0]) - res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod]; - else - res[0] = 0; - } -} - -void rs_encode_long(int len, unsigned int *data, unsigned int *res) -{ /* The same as above but for larger bitlengths - Aztec code compatible */ - int i, k, m; - for (i = 0; i < rlen; i++) - res[i] = 0; - for (i = 0; i < len; i++) { - m = res[rlen - 1] ^ data[i]; - for (k = rlen - 1; k > 0; k--) { - if (m && rspoly[k]) - res[k] = res[k - 1] ^ alog[(logt[m] + logt[rspoly[k]]) % logmod]; - else - res[k] = res[k - 1]; - } - if (m && rspoly[0]) - res[0] = alog[(logt[m] + logt[rspoly[0]]) % logmod]; - else - res[0] = 0; - } -} - -void rs_free(void) -{ /* Free memory */ - free(logt); - free(alog); - free(rspoly); - rspoly = NULL; -} diff --git a/3rdparty/zint-2.4.4/backend/reedsol.h b/3rdparty/zint-2.4.4/backend/reedsol.h deleted file mode 100644 index 3a7f8ef..0000000 --- a/3rdparty/zint-2.4.4/backend/reedsol.h +++ /dev/null @@ -1,40 +0,0 @@ -/** - * - * This is a simple Reed-Solomon encoder - * (C) Cliff Hones 2004 - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef __REEDSOL_H -#define __REEDSOL_H - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -extern void rs_init_gf(int poly); -extern void rs_init_code(int nsym, int index); -extern void rs_encode(int len, unsigned char *data, unsigned char *res); -extern void rs_encode_long(int len, unsigned int *data, unsigned int *res); -extern void rs_free(void); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __REEDSOL_H */ diff --git a/3rdparty/zint-2.4.4/backend/render.c b/3rdparty/zint-2.4.4/backend/render.c deleted file mode 100644 index de086d5..0000000 --- a/3rdparty/zint-2.4.4/backend/render.c +++ /dev/null @@ -1,798 +0,0 @@ -/* - * render.c - Generic Rendered Format - * - * Initiall written by Sam Lown for use in gLabels. Converts encoded - * data into a generic internal structure of lines and characters - * usable in external applications. - */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" - -#define GL_CONST 2.8346 - -struct zint_render_line *render_plot_create_line(float x, float y, float width, float length); -int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line); -struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width); -int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring); -struct zint_render_hexagon *render_plot_create_hexagon(float x, float y); -int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *ring, struct zint_render_hexagon **last_hexagon); - -int render_plot_add_string(struct zint_symbol *symbol, unsigned char *text, float x, float y, float fsize, float width, struct zint_render_string **last_string); - -int render_plot(struct zint_symbol *symbol, float width, float height) -{ - struct zint_render *render; - struct zint_render_line *line, *last_line = NULL; - struct zint_render_string *last_string = NULL; - struct zint_render_ring *ring, *last_ring = NULL; - struct zint_render_hexagon *hexagon, *last_hexagon = NULL; - - int i, r, block_width, latch, this_row; - float textpos, textwidth, large_bar_height, preset_height, row_height, row_posn = 0.0; - // int error_number = 0; - int text_offset, text_height, xoffset, yoffset, textdone, main_symbol_width_x, addon_width_x; - char addon[6], textpart[10]; - int large_bar_count, symbol_lead_in, total_symbol_width_x, total_area_width_x; - float addon_text_posn; - float default_text_posn; - float scaler; - const char *locale = NULL; - int hide_text = 0; - float required_aspect; - float symbol_aspect = 1; - float x_dimension; - int upceanflag = 0; - - // Allocate memory for the rendered version -#ifndef _MSC_VER - render = symbol->rendered = malloc(sizeof(struct zint_render)); -#else - render = symbol->rendered = (struct zint_render *)_alloca(sizeof(struct zint_render)); -#endif - render->lines = NULL; - render->strings = NULL; - render->rings = NULL; - render->hexagons = NULL; - - locale = setlocale(LC_ALL, "C"); - - row_height = 0; - textdone = 0; - textpos = 0.0; - main_symbol_width_x = symbol->width; - strcpy(addon, ""); - symbol_lead_in = 0; - addon_text_posn = 0.0; - addon_width_x = 0; - - /* - * Determine if there will be any addon texts and text height - */ - latch = 0; - r = 0; - /* Isolate add-on text */ - if(is_extendable(symbol->symbology)) { - for(i = 0; i < ustrlen(symbol->text); i++) { - if (latch == 1) { - addon[r] = symbol->text[i]; - r++; - } - if (symbol->text[i] == '+') { - latch = 1; - } - } - } - addon[r] = '\0'; - - if((!symbol->show_hrt) || (ustrlen(symbol->text) == 0)) { - hide_text = 1; - text_height = text_offset = 0.0; - } else { - text_height = 9.0; - text_offset = 2.0; - } - - - /* - * Calculate the width of the barcode, especially if there are any extra - * borders or white space to add. - */ - - while(!(module_is_set(symbol, symbol->rows - 1, symbol_lead_in))) { - symbol_lead_in++; - } - - /* Certain symbols need whitespace otherwise characters get chopped off the sides */ - if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) - || (symbol->symbology == BARCODE_ISBNX)) { - switch(ustrlen(symbol->text)) { - case 13: /* EAN 13 */ - case 16: - case 19: - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_symbol_width_x = 96 + symbol_lead_in; - upceanflag = 13; - break; - case 2: - main_symbol_width_x = 22 + symbol_lead_in; - upceanflag = 2; - break; - case 5: - main_symbol_width_x = 49 + symbol_lead_in; - upceanflag = 5; - break; - default: - main_symbol_width_x = 68 + symbol_lead_in; - upceanflag = 8; - } - switch(ustrlen(symbol->text)) { - case 11: - case 16: - /* EAN-2 add-on */ - addon_width_x = 31; - break; - case 14: - case 19: - /* EAN-5 add-on */ - addon_width_x = 58; - break; - } - } - - if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { - upceanflag = 12; - if(symbol->whitespace_width < 10) { - symbol->whitespace_width = 10; - main_symbol_width_x = 96 + symbol_lead_in; - } - switch(ustrlen(symbol->text)) { - case 15: - /* EAN-2 add-on */ - addon_width_x = 31; - break; - case 18: - /* EAN-5 add-on */ - addon_width_x = 58; - break; - } - } - - if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { - upceanflag = 6; - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - main_symbol_width_x = 51 + symbol_lead_in; - } - switch(ustrlen(symbol->text)) { - case 11: - /* EAN-2 add-on */ - addon_width_x = 31; - break; - case 14: - /* EAN-5 add-on */ - addon_width_x = 58; - break; - } - } - - total_symbol_width_x = main_symbol_width_x + addon_width_x; - total_area_width_x = total_symbol_width_x + (2 * (symbol->border_width + symbol->whitespace_width)); - - xoffset = symbol->border_width + symbol->whitespace_width; - yoffset = symbol->border_width; - - // Determine if height should be overridden - large_bar_count = 0; - preset_height = 0.0; - for(i = 0; i < symbol->rows; i++) { - preset_height += symbol->row_height[i]; - if(symbol->row_height[i] == 0) { - large_bar_count++; - } - } - - if (large_bar_count == 0) { - required_aspect = width / height; - symbol_aspect = (total_symbol_width_x + (2 * xoffset)) / (preset_height + (2 * yoffset) + text_offset + text_height); - symbol->height = preset_height; - if (required_aspect > symbol_aspect) { - /* the area is too wide */ - scaler = height / (preset_height + (2 * yoffset) + text_offset + text_height); - render->width = symbol_aspect * height; - render->height = height; - } else { - /* the area is too high */ - scaler = width / (total_symbol_width_x + (2 * xoffset)); - render->width = width; - render->height = width / symbol_aspect; - } - } else { - scaler = width / (total_symbol_width_x + (2 * xoffset)); - symbol->height = (height / scaler) - ((2 * yoffset) + text_offset + text_height); - - render->width = width; - render->height = height; - } - large_bar_height = (symbol->height - preset_height) / large_bar_count; - - if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - default_text_posn = (symbol->height + text_offset + symbol->border_width + symbol->border_width) * scaler; - } else { - default_text_posn = (symbol->height + text_offset + symbol->border_width) * scaler; - } - - x_dimension = render->width / total_area_width_x; - x_dimension /= GL_CONST; - - /* Set minimum size of symbol */ - /* Barcode must be at least 2mm high by 2mm across */ - if(render->height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST) { - render->height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 2.0) * GL_CONST; - } - if(render->width < (2.0 * GL_CONST)) { - render->width = (2.0 * GL_CONST); - } - - if(symbol->symbology == BARCODE_CODABAR) { - /* The minimum X-dimension of Codabar is 0.191mm. The minimum bar height is 5mm */ - if(x_dimension < 0.191) { - render->width = 0.191 * GL_CONST * total_area_width_x; - } - if(render->height < ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST) { - render->height = ((x_dimension * ((2 * symbol->border_width) + text_offset + text_height)) + 5.0) * GL_CONST; - } - } - - if(symbol->symbology == BARCODE_CODE49) { - /* The minimum X-dimension of Code 49 is 0.191mm */ - if(x_dimension < 0.191) { - render->width = 0.191 * GL_CONST * total_area_width_x; - render->height = render->width / symbol_aspect; - } - } - - if(upceanflag != 0) { - /* The X-dimension of UPC/EAN symbols is fixed at 0.330mm */ - /* NOTE: This code will need adjustment before it correctly deals with composite symbols */ - render->width = 0.330 * GL_CONST * total_area_width_x; - /* The height is also fixed */ - switch (upceanflag) { - case 6: - case 12: - case 13: - /* UPC-A, UPC-E and EAN-13 */ - /* Height of bars should be 22.85mm */ - render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 22.85) * GL_CONST; - break; - case 8: - /* EAN-8 */ - /* Height of bars should be 18.23mm */ - render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 18.23) * GL_CONST; - break; - default: - /* EAN-2 and EAN-5 */ - /* Height of bars should be 21.10mm */ - render->height = ((0.330 * ((2 * symbol->border_width) + text_offset + text_height)) + 21.10) * GL_CONST; - } - } - - if(symbol->symbology == BARCODE_ONECODE) { - /* The size of USPS Intelligent Mail barcode is fixed */ - render->width = 0.508 * GL_CONST * total_area_width_x; - render->height = 4.064 * GL_CONST; - } - - if((symbol->symbology == BARCODE_POSTNET) || (symbol->symbology == BARCODE_PLANET)) { - /* The size of PostNet and PLANET are fized */ - render->width = 0.508 * GL_CONST * total_area_width_x; - render->height = 2.921 * GL_CONST; - } - - if(((symbol->symbology == BARCODE_AUSPOST) || (symbol->symbology == BARCODE_AUSREPLY)) || - ((symbol->symbology == BARCODE_AUSROUTE) || (symbol->symbology == BARCODE_AUSREDIRECT))) { - /* Australia Post use the same sizes as USPS */ - render->width = 0.508 * GL_CONST * total_area_width_x; - render->height = 4.064 * GL_CONST; - } - - if((symbol->symbology == BARCODE_RM4SCC) || (symbol->symbology == BARCODE_KIX)) { - /* Royal Mail and KIX Code uses 22 bars per inch */ - render->width = 0.577 * GL_CONST * total_area_width_x; - render->height = 5.22 * GL_CONST; - } - - if(symbol->symbology == BARCODE_MAXICODE) { - /* Maxicode is a fixed size */ - scaler = GL_CONST; /* Converts from millimeters to the scale used by glabels */ - render->width = 28.16 * scaler; - render->height = 26.86 * scaler; - - /* Central bullseye pattern */ - ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 0.85 * scaler, 0.67 * scaler); - render_plot_add_ring(symbol, ring, &last_ring); - ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 2.20 * scaler, 0.67 * scaler); - render_plot_add_ring(symbol, ring, &last_ring); - ring = render_plot_create_ring(13.64 * scaler, 13.43 * scaler, 3.54 * scaler, 0.67 * scaler); - render_plot_add_ring(symbol, ring, &last_ring); - - /* Hexagons */ - for(r = 0; r < symbol->rows; r++) { - for(i = 0; i < symbol->width; i++) { - if(module_is_set(symbol, r, i)) { - hexagon = render_plot_create_hexagon(((i * 0.88) + (r & 1 ? 1.76 : 1.32)) * scaler, ((r * 0.76) + 0.76) * scaler); - render_plot_add_hexagon(symbol, hexagon, &last_hexagon); - } - } - } - - } else { - /* everything else uses rectangles (or squares) */ - /* Works from the bottom of the symbol up */ - int addon_latch = 0; - - for(r = 0; r < symbol->rows; r++) { - this_row = r; - if(symbol->row_height[this_row] == 0) { - row_height = large_bar_height; - } else { - row_height = symbol->row_height[this_row]; - } - row_posn = 0; - for(i = 0; i < r; i++) { - if(symbol->row_height[i] == 0) { - row_posn += large_bar_height; - } else { - row_posn += symbol->row_height[i]; - } - } - row_posn += yoffset; - - i = 0; - if(module_is_set(symbol, this_row, 0)) { - latch = 1; - } else { - latch = 0; - } - - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); - if((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_symbol_width_x)) { - addon_text_posn = row_posn * scaler; - addon_latch = 1; - } - if(latch == 1) { - /* a bar */ - if(addon_latch == 0) { - line = render_plot_create_line((i + xoffset) * scaler, (row_posn) * scaler, block_width * scaler, row_height * scaler); - } else { - line = render_plot_create_line((i + xoffset) * scaler, (row_posn + 10.0) * scaler, block_width * scaler, (row_height - 5.0) * scaler); - } - latch = 0; - - render_plot_add_line(symbol, line, &last_line); - } else { - /* a space */ - latch = 1; - } - i += block_width; - - } while (i < symbol->width); - } - } - /* That's done the actual data area, everything else is human-friendly */ - - - /* Add the text */ - xoffset -= symbol_lead_in; - row_posn = (row_posn + large_bar_height) * scaler; - - if (!hide_text) { - if(upceanflag == 8) { - /* guard bar extensions and text formatting for EAN-8 */ - i = 0; - for (line = symbol->rendered->lines; line != NULL; line = line->next) { - switch(i) { - case 0: - case 1: - case 10: - case 11: - case 20: - case 21: - line->length += (5.0 * scaler); - break; - } - i++; - } - - for(i = 0; i < 4; i++) { - textpart[i] = symbol->text[i]; - } - textpart[4] = '\0'; - textpos = 17; - textwidth = 4.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); - for(i = 0; i < 4; i++) { - textpart[i] = symbol->text[i + 4]; - } - textpart[4] = '\0'; - textpos = 50; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = xoffset + 86; - textwidth = 2.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); - break; - case 5: - textpos = xoffset + 100; - textwidth = 5.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); - break; - } - - } - - if(upceanflag == 13) { - /* guard bar extensions and text formatting for EAN-13 */ - i = 0; - for (line = symbol->rendered->lines; line != NULL; line = line->next) { - switch(i) { - case 0: - case 1: - case 14: - case 15: - case 28: - case 29: - line->length += (5.0 * scaler); - break; - } - i++; - } - - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = -5; // 7 - textwidth = 8.5; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); - - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - textpos = 25; - textwidth = 6.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 7]; - } - textpart[6] = '\0'; - textpos = 72; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = xoffset + 114; - textwidth = 2.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); - break; - case 5: - textpos = xoffset + 128; - textwidth = 5.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); - break; - } - } - - if (upceanflag == 12) { - /* guard bar extensions and text formatting for UPCA */ - i = 0; - for (line = symbol->rendered->lines; line != NULL; line = line->next) { - switch(i) { - case 0: - case 1: - case 2: - case 3: - case 14: - case 15: - case 26: - case 27: - case 28: - case 29: - line->length += (5.0 * scaler); - break; - } - i++; - } - - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = -5; - textwidth = 6.2; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); - for(i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[5] = '\0'; - textpos = 27; - textwidth = 5.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); - for(i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 6]; - } - textpos = 68; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); - textpart[0] = symbol->text[11]; - textpart[1] = '\0'; - textpos = 100; - textwidth = 6.2; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = xoffset + 116; - textwidth = 2.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); - break; - case 5: - textpos = xoffset + 130; - textwidth = 5.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); - break; - } - } - - if (upceanflag == 6) { - /* guard bar extensions and text formatting for UPCE */ - i = 0; - for (line = symbol->rendered->lines; line != NULL; line = line->next) { - switch(i) { - case 0: - case 1: - case 14: - case 15: - case 16: - line->length += (5.0 * scaler); - break; - } - i++; - } - - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = -5; - textwidth = 6.2; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - textpos = 24; - textwidth = 6.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn, 11.0 * scaler, textwidth * scaler, &last_string); - textpart[0] = symbol->text[7]; - textpart[1] = '\0'; - textpos = 55; - textwidth = 6.2; - render_plot_add_string(symbol, (unsigned char *) textpart, (textpos + xoffset) * scaler, default_text_posn + (2.0 * scaler), 8.0 * scaler, textwidth * scaler, &last_string); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = xoffset + 70; - textwidth = 2.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); - break; - case 5: - textpos = xoffset + 84; - textwidth = 5.0 * 8.5; - render_plot_add_string(symbol, (unsigned char *) addon, textpos * scaler, addon_text_posn * scaler, 11.0 * scaler, textwidth * scaler, &last_string); - break; - } - } - - /* Put normal human readable text at the bottom (and centered) */ - if (textdone == 0) { - // caculate start xoffset to center text - render_plot_add_string(symbol, symbol->text, ((symbol->width / 2.0) + xoffset) * scaler, default_text_posn, 9.0 * scaler, 0.0, &last_string); - } - } - - switch(symbol->symbology) { - case BARCODE_MAXICODE: - /* Do nothing! */ - break; - default: - if((symbol->output_options & BARCODE_BIND) != 0) { - if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { - /* row binding */ - for(r = 1; r < symbol->rows; r++) { - line = render_plot_create_line(xoffset * scaler, ((r * row_height) + yoffset - 1) * scaler, symbol->width * scaler, 2.0 * scaler); - render_plot_add_line(symbol, line, &last_line); - } - } - } - if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - line = render_plot_create_line(0, 0, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); - render_plot_add_line(symbol, line, &last_line); - line = render_plot_create_line(0, (symbol->height + symbol->border_width) * scaler, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); - render_plot_add_line(symbol, line, &last_line); - } - if((symbol->output_options & BARCODE_BOX) != 0) { - /* side bars */ - line = render_plot_create_line(0, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); - render_plot_add_line(symbol, line, &last_line); - line = render_plot_create_line((symbol->width + xoffset + xoffset - symbol->border_width) * scaler, 0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); - render_plot_add_line(symbol, line, &last_line); - } - break; - } - - if (locale) - setlocale(LC_ALL, locale); - - return 1; -} - - -/* - * Create a new line with its memory allocated ready for adding to the - * rendered structure. - * - * This is much quicker than writing out each line manually (in some cases!) - */ -struct zint_render_line *render_plot_create_line(float x, float y, float width, float length) -{ - struct zint_render_line *line; - -#ifndef _MSC_VER - line = malloc(sizeof(struct zint_render_line)); -#else - line = (struct zint_render_line *)_alloca(sizeof(struct zint_render_line)); -#endif - line->next = NULL; - line->x = x; - line->y = y; - line->width = width; - line->length = length; - - return line; -} - -/* - * Add the line to the current rendering and update the last line's - * next value. - */ -int render_plot_add_line(struct zint_symbol *symbol, struct zint_render_line *line, struct zint_render_line **last_line) -{ - if (*last_line) - (*last_line)->next = line; - else - symbol->rendered->lines = line; // first line - - *last_line = line; - return 1; -} - -struct zint_render_ring *render_plot_create_ring(float x, float y, float radius, float line_width) -{ - struct zint_render_ring *ring; - -#ifndef _MSC_VER - ring = malloc(sizeof(struct zint_render_ring)); -#else - ring = (struct zint_render_ring *)_alloca(sizeof(struct zint_render_ring)); -#endif - ring->next = NULL; - ring->x = x; - ring->y = y; - ring->radius = radius; - ring->line_width = line_width; - - return ring; -} - -int render_plot_add_ring(struct zint_symbol *symbol, struct zint_render_ring *ring, struct zint_render_ring **last_ring) -{ - if (*last_ring) - (*last_ring)->next = ring; - else - symbol->rendered->rings = ring; // first ring - - *last_ring = ring; - return 1; -} - -struct zint_render_hexagon *render_plot_create_hexagon(float x, float y) -{ - struct zint_render_hexagon *hexagon; - -#ifndef _MSC_VER - hexagon = malloc(sizeof(struct zint_render_hexagon)); -#else - hexagon = (struct zint_render_hexagon *)_alloca(sizeof(struct zint_render_hexagon)); -#endif - hexagon->next = NULL; - hexagon->x = x; - hexagon->y = y; - - return hexagon; -} - -int render_plot_add_hexagon(struct zint_symbol *symbol, struct zint_render_hexagon *hexagon, struct zint_render_hexagon **last_hexagon) -{ - if (*last_hexagon) - (*last_hexagon)->next = hexagon; - else - symbol->rendered->hexagons = hexagon; // first hexagon - - *last_hexagon = hexagon; - return 1; -} - -/* - * Add a string structure to the symbol. - * Coordinates assumed to be from top-center. - */ -int render_plot_add_string(struct zint_symbol *symbol, - unsigned char *text, float x, float y, float fsize, float width, - struct zint_render_string **last_string) -{ - struct zint_render_string *string; - -#ifndef _MSC_VER - string = malloc(sizeof(struct zint_render_string)); -#else - string = (struct zint_render_string *)_alloca(sizeof(struct zint_render_string)); -#endif - string->next = NULL; - string->x = x; - string->y = y; - string->width = width; - string->fsize = fsize; - string->length = ustrlen(text); -#ifndef _MSC_VER - string->text = malloc(sizeof(unsigned char) * (ustrlen(text) + 1)); -#else - string->text = (unsigned char *)_alloca((ustrlen(text) + 1) * sizeof(unsigned char)); -#endif - ustrcpy(string->text, text); - - if (*last_string) - (*last_string)->next = string; - else - symbol->rendered->strings = string; // First character - *last_string = string; - - return 1; -} diff --git a/3rdparty/zint-2.4.4/backend/rss.c b/3rdparty/zint-2.4.4/backend/rss.c deleted file mode 100644 index edf1cdc..0000000 --- a/3rdparty/zint-2.4.4/backend/rss.c +++ /dev/null @@ -1,2264 +0,0 @@ -/* rss.c - Handles Reduced Space Symbology (GS1 DataBar) */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* The functions "combins" and "getRSSwidths" are copyright BSI and are - released with permission under the following terms: - - "Copyright subsists in all BSI publications. BSI also holds the copyright, in the - UK, of the international standardisation bodies. Except as - permitted under the Copyright, Designs and Patents Act 1988 no extract may be - reproduced, stored in a retrieval system or transmitted in any form or by any - means - electronic, photocopying, recording or otherwise - without prior written - permission from BSI. - - "This does not preclude the free use, in the course of implementing the standard, - of necessary details such as symbols, and size, type or grade designations. If these - details are to be used for any other purpose than implementation then the prior - written permission of BSI must be obtained." - - The date of publication for these functions is 30 November 2006 -*/ - -/* Includes numerous bugfixes thanks to Pablo Orduña @ the PIRAmIDE project */ - -#include -#include -#include -#ifdef _MSC_VER -#include -#endif -#include "common.h" -#include "large.h" -#include "rss.h" -#include "gs1.h" - -/********************************************************************** -* combins(n,r): returns the number of Combinations of r selected from n: -* Combinations = n! / ((n - r)! * r!) -**********************************************************************/ -int combins(int n, int r) { - int i, j; - int maxDenom, minDenom; - int val; - - if (n-r > r) { - minDenom = r; - maxDenom = n-r; - } - else { - minDenom = n-r; - maxDenom = r; - } - val = 1; - j = 1; - for (i = n; i > maxDenom; i--) { - val *= i; - if (j <= minDenom) { - val /= j; - j++; - } - } - for (; j <= minDenom; j++) { - val /= j; - } - return(val); -} - -/********************************************************************** -* getRSSwidths -* routine to generate widths for RSS elements for a given value.# -* -* Calling arguments: -* val = required value -* n = number of modules -* elements = elements in a set (RSS-14 & Expanded = 4; RSS Limited = 7) -* maxWidth = maximum module width of an element -* noNarrow = 0 will skip patterns without a one module wide element -* -* Return: -* static int widths[] = element widths -**********************************************************************/ -void getRSSwidths(int val, int n, int elements, int maxWidth, int noNarrow) -{ - int bar; - int elmWidth; - int mxwElement; - int subVal, lessVal; - int narrowMask = 0; - for (bar = 0; bar < elements-1; bar++) - { - for(elmWidth = 1, narrowMask |= (1<= elements-bar-1)) - { - subVal -= combins(n-elmWidth-(elements-bar), elements-bar-2); - } - /* less combinations with elements > maxVal */ - if (elements-bar-1 > 1) - { - lessVal = 0; - for (mxwElement = n-elmWidth-(elements-bar-2); - mxwElement > maxWidth; - mxwElement--) - { - lessVal += combins(n-elmWidth-mxwElement-1, elements-bar-3); - } - subVal -= lessVal * (elements-1-bar); - } - else if (n-elmWidth > maxWidth) - { - subVal--; - } - val -= subVal; - if (val < 0) break; - } - val += subVal; - n -= elmWidth; - widths[bar] = elmWidth; - } - widths[bar] = n; - return; -} - -int rss14(struct zint_symbol *symbol, unsigned char source[], int src_len) -{ /* GS1 DataBar-14 */ - int error_number = 0, i, j, mask; - short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112]; - int data_character[4], data_group[4], v_odd[4], v_even[4]; - int data_widths[8][4], checksum, c_left, c_right, total_widths[46], writer; - char latch, hrt[15], temp[32]; - int check_digit, count, separator_row; - - separator_row = 0; - - if(src_len > 13) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, src_len); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - /* make some room for a separator row for composite symbols */ - switch(symbol->symbology) { - case BARCODE_RSS14_CC: - case BARCODE_RSS14STACK_CC: - case BARCODE_RSS14_OMNI_CC: - separator_row = symbol->rows; - symbol->row_height[separator_row] = 1; - symbol->rows += 1; - break; - } - - for(i = 0; i < 112; i++) { - accum[i] = 0; - x_reg[i] = 0; - y_reg[i] = 0; - } - - for(i = 0; i < 4; i++) { - data_character[i] = 0; - data_group[i] = 0; - } - - binary_load(accum, (char*)source, src_len); - strcpy(temp, "10000000000000"); - if(symbol->option_1 == 2) { - /* Add symbol linkage flag */ - binary_load(y_reg, temp, strlen(temp)); - binary_add(accum, y_reg); - for(i = 0; i < 112; i++) { - y_reg[i] = 0; - } - } - - /* Calculate left and right pair values */ - strcpy(temp, "4537077"); - binary_load(x_reg, temp, strlen(temp)); - - for(i = 0; i < 24; i++) { - shiftup(x_reg); - } - - for(i = 24; i >= 0; i--) { - y_reg[i] = islarger(accum, x_reg); - if(y_reg[i] == 1) { - binary_subtract(accum, x_reg); - } - shiftdown(x_reg); - } - - for(i = 0; i < 112; i++) { - left_reg[i] = y_reg[i]; - right_reg[i] = accum[i]; - } - - /* Calculate four data characters */ - strcpy(temp, "1597"); - binary_load(x_reg, temp, strlen(temp)); - for(i = 0; i < 112; i++) { - accum[i] = left_reg[i]; - } - - for(i = 0; i < 24; i++) { - shiftup(x_reg); - } - - for(i = 24; i >= 0; i--) { - y_reg[i] = islarger(accum, x_reg); - if(y_reg[i] == 1) { - binary_subtract(accum, x_reg); - } - shiftdown(x_reg); - } - - data_character[0] = 0; - data_character[1] = 0; - mask = 0x2000; - for(i = 13; i >= 0; i--) { - if(y_reg[i] == 1) { - data_character[0] += mask; - } - if(accum[i] == 1) { - data_character[1] += mask; - } - mask = mask >> 1; - } - strcpy(temp, "1597"); - binary_load(x_reg, temp, strlen(temp)); - for(i = 0; i < 112; i++) { - accum[i] = right_reg[i]; - } - - for(i = 0; i < 24; i++) { - shiftup(x_reg); - } - - for(i = 24; i >= 0; i--) { - y_reg[i] = islarger(accum, x_reg); - if(y_reg[i] == 1) { - binary_subtract(accum, x_reg); - } - shiftdown(x_reg); - } - - data_character[2] = 0; - data_character[3] = 0; - mask = 0x2000; - for(i = 13; i >= 0; i--) { - if(y_reg[i] == 1) { - data_character[2] += mask; - } - if(accum[i] == 1) { - data_character[3] += mask; - } - mask = mask >> 1; - } - - /* Calculate odd and even subset values */ - - if((data_character[0] >= 0) && (data_character[0] <= 160)) { data_group[0] = 0; } - if((data_character[0] >= 161) && (data_character[0] <= 960)) { data_group[0] = 1; } - if((data_character[0] >= 961) && (data_character[0] <= 2014)) { data_group[0] = 2; } - if((data_character[0] >= 2015) && (data_character[0] <= 2714)) { data_group[0] = 3; } - if((data_character[0] >= 2715) && (data_character[0] <= 2840)) { data_group[0] = 4; } - if((data_character[1] >= 0) && (data_character[1] <= 335)) { data_group[1] = 5; } - if((data_character[1] >= 336) && (data_character[1] <= 1035)) { data_group[1] = 6; } - if((data_character[1] >= 1036) && (data_character[1] <= 1515)) { data_group[1] = 7; } - if((data_character[1] >= 1516) && (data_character[1] <= 1596)) { data_group[1] = 8; } - if((data_character[3] >= 0) && (data_character[3] <= 335)) { data_group[3] = 5; } - if((data_character[3] >= 336) && (data_character[3] <= 1035)) { data_group[3] = 6; } - if((data_character[3] >= 1036) && (data_character[3] <= 1515)) { data_group[3] = 7; } - if((data_character[3] >= 1516) && (data_character[3] <= 1596)) { data_group[3] = 8; } - if((data_character[2] >= 0) && (data_character[2] <= 160)) { data_group[2] = 0; } - if((data_character[2] >= 161) && (data_character[2] <= 960)) { data_group[2] = 1; } - if((data_character[2] >= 961) && (data_character[2] <= 2014)) { data_group[2] = 2; } - if((data_character[2] >= 2015) && (data_character[2] <= 2714)) { data_group[2] = 3; } - if((data_character[2] >= 2715) && (data_character[2] <= 2840)) { data_group[2] = 4; } - - v_odd[0] = (data_character[0] - g_sum_table[data_group[0]]) / t_table[data_group[0]]; - v_even[0] = (data_character[0] - g_sum_table[data_group[0]]) % t_table[data_group[0]]; - v_odd[1] = (data_character[1] - g_sum_table[data_group[1]]) % t_table[data_group[1]]; - v_even[1] = (data_character[1] - g_sum_table[data_group[1]]) / t_table[data_group[1]]; - v_odd[3] = (data_character[3] - g_sum_table[data_group[3]]) % t_table[data_group[3]]; - v_even[3] = (data_character[3] - g_sum_table[data_group[3]]) / t_table[data_group[3]]; - v_odd[2] = (data_character[2] - g_sum_table[data_group[2]]) / t_table[data_group[2]]; - v_even[2] = (data_character[2] - g_sum_table[data_group[2]]) % t_table[data_group[2]]; - - - /* Use RSS subset width algorithm */ - for(i = 0; i < 4; i++) { - if((i == 0)||(i == 2)) { - getRSSwidths(v_odd[i], modules_odd[data_group[i]], 4, widest_odd[data_group[i]], 1); - data_widths[0][i] = widths[0]; - data_widths[2][i] = widths[1]; - data_widths[4][i] = widths[2]; - data_widths[6][i] = widths[3]; - getRSSwidths(v_even[i], modules_even[data_group[i]], 4, widest_even[data_group[i]], 0); - data_widths[1][i] = widths[0]; - data_widths[3][i] = widths[1]; - data_widths[5][i] = widths[2]; - data_widths[7][i] = widths[3]; - } else { - getRSSwidths(v_odd[i], modules_odd[data_group[i]], 4, widest_odd[data_group[i]], 0); - data_widths[0][i] = widths[0]; - data_widths[2][i] = widths[1]; - data_widths[4][i] = widths[2]; - data_widths[6][i] = widths[3]; - getRSSwidths(v_even[i], modules_even[data_group[i]], 4, widest_even[data_group[i]], 1); - data_widths[1][i] = widths[0]; - data_widths[3][i] = widths[1]; - data_widths[5][i] = widths[2]; - data_widths[7][i] = widths[3]; - } - } - - - checksum = 0; - /* Calculate the checksum */ - for(i = 0; i < 8; i++) { - checksum += checksum_weight[i] * data_widths[i][0]; - checksum += checksum_weight[i+8] * data_widths[i][1]; - checksum += checksum_weight[i+16] * data_widths[i][2]; - checksum += checksum_weight[i+24] * data_widths[i][3]; - } - checksum %= 79; - - /* Calculate the two check characters */ - if(checksum >= 8) { checksum++; } - if(checksum >= 72) { checksum++; } - c_left = checksum / 9; - c_right = checksum % 9; - - /* Put element widths together */ - total_widths[0] = 1; - total_widths[1] = 1; - total_widths[44] = 1; - total_widths[45] = 1; - for(i = 0; i < 8; i++) { - total_widths[i + 2] = data_widths[i][0]; - total_widths[i + 15] = data_widths[7 - i][1]; - total_widths[i + 23] = data_widths[i][3]; - total_widths[i + 36] = data_widths[7 - i][2]; - } - for(i = 0; i < 5; i++) { - total_widths[i + 10] = finder_pattern[i + (5 * c_left)]; - total_widths[i + 31] = finder_pattern[(4 - i) + (5 * c_right)]; - } - - /* Put this data into the symbol */ - if((symbol->symbology == BARCODE_RSS14) || (symbol->symbology == BARCODE_RSS14_CC)) { - writer = 0; - latch = '0'; - for(i = 0; i < 46; i++) { - for(j = 0; j < total_widths[i]; j++) { - if(latch == '1') { set_module(symbol, symbol->rows, writer); } - writer++; - } - if(latch == '1') { - latch = '0'; - } else { - latch = '1'; - } - } - if(symbol->width < writer) { symbol->width = writer; } - if(symbol->symbology == BARCODE_RSS14_CC) { - /* separator pattern for composite symbol */ - for(i = 4; i < 92; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - set_module(symbol, separator_row, i); } - } - latch = '1'; - for(i = 16; i < 32; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - if(latch == '1') { - set_module(symbol, separator_row, i); - latch = '0'; - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } - latch = '1'; - for(i = 63; i < 78; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - if(latch == '1') { - set_module(symbol, separator_row, i); - latch = '0'; - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } - } - symbol->rows = symbol->rows + 1; - - count = 0; - check_digit = 0; - - /* Calculate check digit from Annex A and place human readable text */ - ustrcpy(symbol->text, (unsigned char*)"(01)"); - for(i = 0; i < 14; i++) { - hrt[i] = '0'; - } - for(i = 0; i < src_len; i++) { - hrt[12 - i] = source[src_len - i - 1]; - } - hrt[14] = '\0'; - - for (i = 0; i < 13; i++) { - count += ctoi(hrt[i]); - - if (!(i & 1)) { - count += 2 * (ctoi(hrt[i])); - } - } - - check_digit = 10 - (count%10); - if (check_digit == 10) { check_digit = 0; } - hrt[13] = itoc(check_digit); - - uconcat(symbol->text, (unsigned char*)hrt); - } - - if((symbol->symbology == BARCODE_RSS14STACK) || (symbol->symbology == BARCODE_RSS14STACK_CC)) { - /* top row */ - writer = 0; - latch = '0'; - for(i = 0; i < 23; i++) { - for(j = 0; j < total_widths[i]; j++) { - if(latch == '1') { - set_module(symbol, symbol->rows, writer); - } else { - unset_module(symbol, symbol->rows, writer); - } - writer++; - } - if(latch == '1') { - latch = '0'; - } else { - latch = '1'; - } - } - set_module(symbol, symbol->rows, writer); - unset_module(symbol, symbol->rows, writer + 1); - symbol->row_height[symbol->rows] = 5; - /* bottom row */ - symbol->rows = symbol->rows + 2; - set_module(symbol, symbol->rows, 0); - unset_module(symbol, symbol->rows, 1); - writer = 0; - latch = '1'; - for(i = 23; i < 46; i++) { - for(j = 0; j < total_widths[i]; j++) { - if(latch == '1') { - set_module(symbol, symbol->rows, writer + 2); - } else { - unset_module(symbol, symbol->rows, writer + 2); - } - writer++; - } - if(latch == '1') { - latch = '0'; - } else { - latch = '1'; - } - } - symbol->row_height[symbol->rows] = 7; - /* separator pattern */ - for(i = 4; i < 46; i++) { - if(module_is_set(symbol, symbol->rows - 2, i) == module_is_set(symbol, symbol->rows, i)) { - if(!(module_is_set(symbol, symbol->rows - 2, i))) { - set_module(symbol, symbol->rows - 1, i); - } - } else { - if(!(module_is_set(symbol, symbol->rows - 1, i - 1))) { - set_module(symbol, symbol->rows - 1, i); - } - } - } - symbol->row_height[symbol->rows - 1] = 1; - if(symbol->symbology == BARCODE_RSS14STACK_CC) { - /* separator pattern for composite symbol */ - for(i = 4; i < 46; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - set_module(symbol, separator_row, i); - } - } - latch = '1'; - for(i = 16; i < 32; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - if(latch == '1') { - set_module(symbol, separator_row, i); - latch = '0'; - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } - } - symbol->rows = symbol->rows + 1; - if(symbol->width < 50) { symbol->width = 50; } - } - - if((symbol->symbology == BARCODE_RSS14STACK_OMNI) || (symbol->symbology == BARCODE_RSS14_OMNI_CC)) { - /* top row */ - writer = 0; - latch = '0'; - for(i = 0; i < 23; i++) { - for(j = 0; j < total_widths[i]; j++) { - if(latch == '1') { set_module(symbol, symbol->rows, writer); } else { unset_module(symbol, symbol->rows, writer); } - writer++; - } - latch = (latch == '1' ? '0' : '1'); - } - set_module(symbol, symbol->rows, writer); - unset_module(symbol, symbol->rows, writer + 1); - /* bottom row */ - symbol->rows = symbol->rows + 4; - set_module(symbol, symbol->rows, 0); - unset_module(symbol, symbol->rows, 1); - writer = 0; - latch = '1'; - for(i = 23; i < 46; i++) { - for(j = 0; j < total_widths[i]; j++) { - if(latch == '1') { set_module(symbol, symbol->rows, writer + 2); } else { unset_module(symbol, symbol->rows, writer + 2); } - writer++; - } - if(latch == '1') { - latch = '0'; - } else { - latch = '1'; - } - } - /* middle separator */ - for(i = 5; i < 46; i += 2) { - set_module(symbol, symbol->rows - 2, i); - } - symbol->row_height[symbol->rows - 2] = 1; - /* top separator */ - for(i = 4; i < 46; i++) { - if(!(module_is_set(symbol, symbol->rows - 4, i))) { - set_module(symbol, symbol->rows - 3, i); - } - } - latch = '1'; - for(i = 17; i < 33; i++) { - if(!(module_is_set(symbol, symbol->rows - 4, i))) { - if(latch == '1') { - set_module(symbol, symbol->rows - 3, i); - latch = '0'; - } else { - unset_module(symbol, symbol->rows - 3, i); - latch = '1'; - } - } else { - unset_module(symbol, symbol->rows - 3, i); - latch = '1'; - } - } - symbol->row_height[symbol->rows - 3] = 1; - /* bottom separator */ - for(i = 4; i < 46; i++) { - if(!(module_is_set(symbol, symbol->rows, i))) { - set_module(symbol, symbol->rows - 1, i); - } - } - latch = '1'; - for(i = 16; i < 32; i++) { - if(!(module_is_set(symbol, symbol->rows, i))) { - if(latch == '1') { - set_module(symbol, symbol->rows - 1, i); - latch = '0'; - } else { - unset_module(symbol, symbol->rows - 1, i); - latch = '1'; - } - } else { - unset_module(symbol, symbol->rows - 1, i); - latch = '1'; - } - } - symbol->row_height[symbol->rows - 1] = 1; - if(symbol->width < 50) { symbol->width = 50; } - if(symbol->symbology == BARCODE_RSS14_OMNI_CC) { - /* separator pattern for composite symbol */ - for(i = 4; i < 46; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - set_module(symbol, separator_row, i); - } - } - latch = '1'; - for(i = 16; i < 32; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - if(latch == '1') { - set_module(symbol, separator_row, i); - latch = '0'; - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } else { - unset_module(symbol, separator_row, i); - latch = '1'; - } - } - } - symbol->rows = symbol->rows + 1; - } - - - return error_number; -} - -int rsslimited(struct zint_symbol *symbol, unsigned char source[], int src_len) -{ /* GS1 DataBar Limited */ - int error_number = 0, i, mask; - short int accum[112], left_reg[112], right_reg[112], x_reg[112], y_reg[112]; - int left_group, right_group, left_odd, left_even, right_odd, right_even; - int left_character, right_character, left_widths[14], right_widths[14]; - int checksum, check_elements[14], total_widths[46], writer, j, check_digit, count; - char latch, hrt[15], temp[32]; - int separator_row; - - separator_row = 0; - - if(src_len > 13) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - error_number = is_sane(NEON, source, src_len); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - if(src_len == 13) { - if((source[0] != '0') && (source[0] != '1')) { - strcpy(symbol->errtxt, "Input out of range"); - return ERROR_INVALID_DATA1; - } - } - - /* make some room for a separator row for composite symbols */ - if(symbol->symbology == BARCODE_RSS_LTD_CC) { - separator_row = symbol->rows; - symbol->row_height[separator_row] = 1; - symbol->rows += 1; - } - - for(i = 0; i < 112; i++) { - accum[i] = 0; - x_reg[i] = 0; - y_reg[i] = 0; - } - - binary_load(accum, (char*)source, src_len); - if(symbol->option_1 == 2) { - /* Add symbol linkage flag */ - strcpy(temp, "2015133531096"); - binary_load(y_reg, temp, strlen(temp)); - binary_add(accum, y_reg); - for(i = 0; i < 112; i++) { - y_reg[i] = 0; - } - } - - /* Calculate left and right pair values */ - strcpy(temp, "2013571"); - binary_load(x_reg, temp, strlen(temp)); - - for(i = 0; i < 24; i++) { - shiftup(x_reg); - } - - for(i = 24; i >= 0; i--) { - y_reg[i] = islarger(accum, x_reg); - if(y_reg[i] == 1) { - binary_subtract(accum, x_reg); - } - shiftdown(x_reg); - } - - for(i = 0; i < 112; i++) { - left_reg[i] = y_reg[i]; - right_reg[i] = accum[i]; - } - - left_group = 0; - strcpy(temp, "183063"); - binary_load(accum, temp, strlen(temp)); - if(islarger(left_reg, accum)) { left_group = 1; } - strcpy(temp, "820063"); - binary_load(accum, temp, strlen(temp)); - if(islarger(left_reg, accum)) { left_group = 2; } - strcpy(temp, "1000775"); - binary_load(accum, temp, strlen(temp)); - if(islarger(left_reg, accum)) { left_group = 3; } - strcpy(temp, "1491020"); - binary_load(accum, temp, strlen(temp)); - if(islarger(left_reg, accum)) { left_group = 4; } - strcpy(temp, "1979844"); - binary_load(accum, temp, strlen(temp)); - if(islarger(left_reg, accum)) { left_group = 5; } - strcpy(temp, "1996938"); - binary_load(accum, temp, strlen(temp)); - if(islarger(left_reg, accum)) { left_group = 6; } - right_group = 0; - strcpy(temp, "183063"); - binary_load(accum, temp, strlen(temp)); - if(islarger(right_reg, accum)) { right_group = 1; } - strcpy(temp, "820063"); - binary_load(accum, temp, strlen(temp)); - if(islarger(right_reg, accum)) { right_group = 2; } - strcpy(temp, "1000775"); - binary_load(accum, temp, strlen(temp)); - if(islarger(right_reg, accum)) { right_group = 3; } - strcpy(temp, "1491020"); - binary_load(accum, temp, strlen(temp)); - if(islarger(right_reg, accum)) { right_group = 4; } - strcpy(temp, "1979844"); - binary_load(accum, temp, strlen(temp)); - if(islarger(right_reg, accum)) { right_group = 5; } - strcpy(temp, "1996938"); - binary_load(accum, temp, strlen(temp)); - if(islarger(right_reg, accum)) { right_group = 6; } - - switch(left_group) { - case 1: strcpy(temp, "183064"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(left_reg, accum); - break; - case 2: strcpy(temp, "820064"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(left_reg, accum); - break; - case 3: strcpy(temp, "1000776"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(left_reg, accum); - break; - case 4: strcpy(temp, "1491021"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(left_reg, accum); - break; - case 5: strcpy(temp, "1979845"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(left_reg, accum); - break; - case 6: strcpy(temp, "1996939"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(left_reg, accum); - break; - } - - switch(right_group) { - case 1: strcpy(temp, "183064"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(right_reg, accum); - break; - case 2: strcpy(temp, "820064"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(right_reg, accum); - break; - case 3: strcpy(temp, "1000776"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(right_reg, accum); - break; - case 4: strcpy(temp, "1491021"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(right_reg, accum); - break; - case 5: strcpy(temp, "1979845"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(right_reg, accum); - break; - case 6: strcpy(temp, "1996939"); - binary_load(accum, temp, strlen(temp)); - binary_subtract(right_reg, accum); - break; - } - - left_character = 0; - right_character = 0; - mask = 0x800000; - for(i = 23; i >= 0; i--) { - if(left_reg[i] == 1) { - left_character += mask; - } - if(right_reg[i] == 1) { - right_character += mask; - } - mask = mask >> 1; - } - - left_odd = left_character / t_even_ltd[left_group]; - left_even = left_character % t_even_ltd[left_group]; - right_odd = right_character / t_even_ltd[right_group]; - right_even = right_character % t_even_ltd[right_group]; - - getRSSwidths(left_odd, modules_odd_ltd[left_group], 7, widest_odd_ltd[left_group], 1); - left_widths[0] = widths[0]; - left_widths[2] = widths[1]; - left_widths[4] = widths[2]; - left_widths[6] = widths[3]; - left_widths[8] = widths[4]; - left_widths[10] = widths[5]; - left_widths[12] = widths[6]; - getRSSwidths(left_even, modules_even_ltd[left_group], 7, widest_even_ltd[left_group], 0); - left_widths[1] = widths[0]; - left_widths[3] = widths[1]; - left_widths[5] = widths[2]; - left_widths[7] = widths[3]; - left_widths[9] = widths[4]; - left_widths[11] = widths[5]; - left_widths[13] = widths[6]; - getRSSwidths(right_odd, modules_odd_ltd[right_group], 7, widest_odd_ltd[right_group], 1); - right_widths[0] = widths[0]; - right_widths[2] = widths[1]; - right_widths[4] = widths[2]; - right_widths[6] = widths[3]; - right_widths[8] = widths[4]; - right_widths[10] = widths[5]; - right_widths[12] = widths[6]; - getRSSwidths(right_even, modules_even_ltd[right_group], 7, widest_even_ltd[right_group], 0); - right_widths[1] = widths[0]; - right_widths[3] = widths[1]; - right_widths[5] = widths[2]; - right_widths[7] = widths[3]; - right_widths[9] = widths[4]; - right_widths[11] = widths[5]; - right_widths[13] = widths[6]; - - checksum = 0; - /* Calculate the checksum */ - for(i = 0; i < 14; i++) { - checksum += checksum_weight_ltd[i] * left_widths[i]; - checksum += checksum_weight_ltd[i + 14] * right_widths[i]; - } - checksum %= 89; - - for(i = 0; i < 14; i++) { - check_elements[i] = finder_pattern_ltd[i + (checksum * 14)]; - } - - total_widths[0] = 1; - total_widths[1] = 1; - total_widths[44] = 1; - total_widths[45] = 1; - for(i = 0; i < 14; i++) { - total_widths[i + 2] = left_widths[i]; - total_widths[i + 16] = check_elements[i]; - total_widths[i + 30] = right_widths[i]; - } - - writer = 0; - latch = '0'; - for(i = 0; i < 46; i++) { - for(j = 0; j < total_widths[i]; j++) { - if(latch == '1') { set_module(symbol, symbol->rows, writer); } else { unset_module(symbol, symbol->rows, writer); } - writer++; - } - latch = (latch == '1' ? '0' : '1'); - } - if(symbol->width < writer) { symbol->width = writer; } - symbol->rows = symbol->rows + 1; - - /* add separator pattern if composite symbol */ - if(symbol->symbology == BARCODE_RSS_LTD_CC) { - for(i = 4; i < 70; i++) { - if(!(module_is_set(symbol, separator_row + 1, i))) { - set_module(symbol, separator_row, i); - } - } - } - - /* Calculate check digit from Annex A and place human readable text */ - - check_digit = 0; - count = 0; - - ustrcpy(symbol->text, (unsigned char*)"(01)"); - for(i = 0; i < 14; i++) { - hrt[i] = '0'; - } - for(i = 0; i < src_len; i++) { - hrt[12 - i] = source[src_len - i - 1]; - } - - for (i = 0; i < 13; i++) { - count += ctoi(hrt[i]); - - if (!(i & 1)) { - count += 2 * (ctoi(hrt[i])); - } - } - - check_digit = 10 - (count%10); - if (check_digit == 10) { check_digit = 0; } - - hrt[13] = itoc(check_digit); - hrt[14] = '\0'; - - uconcat(symbol->text, (unsigned char*)hrt); - - return error_number; -} - -int general_rules(char field[], char type[]) -{ /* Attempts to apply encoding rules from secions 7.2.5.5.1 to 7.2.5.5.3 - of ISO/IEC 24724:2006 */ - int block[2][200], block_count, i, j, k; - char current, next, last; - - block_count = 0; - - block[0][block_count] = 1; - block[1][block_count] = type[0]; - - for(i = 1; i < strlen(type); i++) { - current = type[i]; - last = type[i - 1]; - - if(current == last) { - block[0][block_count] = block[0][block_count] + 1; - } else { - block_count++; - block[0][block_count] = 1; - block[1][block_count] = type[i]; - } - } - - block_count++; - - for(i = 0; i < block_count; i++) { - } - - for(i = 0; i < block_count; i++) { - current = block[1][i]; - next = (block[1][i + 1] & 0xFF); - - if((current == ISOIEC) && (i != (block_count - 1))) { - if((next == ANY_ENC) && (block[0][i + 1] >= 4)) { - block[1][i + 1] = NUMERIC; - } - if((next == ANY_ENC) && (block[0][i + 1] < 4)) { - block[1][i + 1] = ISOIEC; - } - if((next == ALPHA_OR_ISO) && (block[0][i + 1] >= 5)) { - block[1][i + 1] = ALPHA; - } - if((next == ALPHA_OR_ISO) && (block[0][i + 1] < 5)) { - block[1][i + 1] = ISOIEC; - } - } - - if(current == ALPHA_OR_ISO) { - block[1][i] = ALPHA; - } - - if((current == ALPHA) && (i != (block_count - 1))) { - if((next == ANY_ENC) && (block[0][i + 1] >= 6)) { - block[1][i + 1] = NUMERIC; - } - if((next == ANY_ENC) && (block[0][i + 1] < 6)) { - if((i == block_count - 2) && (block[0][i + 1] >= 4)) { - block[1][i + 1] = NUMERIC; - } else { - block[1][i + 1] = ALPHA; - } - } - } - - if(current == ANY_ENC) { - block[1][i] = NUMERIC; - } - } - - if(block_count > 1) { - i = 1; - while(i < block_count) { - if(block[1][i - 1] == block[1][i]) { - /* bring together */ - block[0][i - 1] = block[0][i - 1] + block[0][i]; - j = i + 1; - - /* decreace the list */ - while(j < block_count) { - block[0][j - 1] = block[0][j]; - block[1][j - 1] = block[1][j]; - j++; - } - block_count--; - i--; - } - i++; - } - } - - for(i = 0; i < block_count - 1; i++) { - if((block[1][i] == NUMERIC) && (block[0][i] & 1)) { - /* Odd size numeric block */ - block[0][i] = block[0][i] - 1; - block[0][i + 1] = block[0][i + 1] + 1; - } - } - - j = 0; - for(i = 0; i < block_count; i++) { - for(k = 0; k < block[0][i]; k++) { - type[j] = block[1][i]; - j++; - } - } - - if((block[1][block_count - 1] == NUMERIC) && (block[0][block_count - 1] & 1)) { - /* If the last block is numeric and an odd size, further - processing needs to be done outside this procedure */ - return 1; - } else { - return 0; - } -} - -int rss_binary_string(struct zint_symbol *symbol, char source[], char binary_string[]) -{ /* Handles all data encodation from section 7.2.5 of ISO/IEC 24724 */ - int encoding_method, i, mask, j, read_posn, latch, debug = 0, last_mode = ISOIEC; -#ifndef _MSC_VER - char general_field[strlen(source)], general_field_type[strlen(source)]; -#else - char* general_field = (char*)_alloca(strlen(source)); - char* general_field_type = (char*)_alloca(strlen(source)); -#endif - int remainder, d1, d2, value; - char padstring[40]; - - read_posn=0; - value=0; - - /* Decide whether a compressed data field is required and if so what - method to use - method 2 = no compressed data field */ - - if((strlen(source) >= 16) && ((source[0] == '0') && (source[1] == '1'))) { - /* (01) and other AIs */ - encoding_method = 1; - if(debug) printf("Choosing Method 1\n"); - } else { - /* any AIs */ - encoding_method = 2; - if(debug) printf("Choosing Mehod 2\n"); - } - - if(((strlen(source) >= 20) && (encoding_method == 1)) && ((source[2] == '9') && (source[16] == '3'))) { - /* Possibly encoding method > 2 */ - if(debug) printf("Checking for other methods\n"); - - if((strlen(source) >= 26) && (source[17] == '1')) { - /* Methods 3, 7, 9, 11 and 13 */ - - if(source[18] == '0') { - /* (01) and (310x) */ - char weight_str[7]; - float weight; /* In kilos */ - - for(i = 0; i < 6; i++) { - weight_str[i] = source[20 + i]; - } - weight_str[6] = '\0'; - - if (weight_str[0] == '0') { /* Maximum weight = 99999 */ - - - encoding_method = 7; - - if((source[19] == '3') && (strlen(source) == 26)) { - /* (01) and (3103) */ - weight = atof(weight_str) / 1000.0; - - if(weight <= 32.767) { encoding_method = 3; } - } - - if(strlen(source) == 34){ - if((source[26] == '1') && (source[27] == '1')) { - /* (01), (310x) and (11) - metric weight and production date */ - encoding_method = 7; - } - - if((source[26] == '1') && (source[27] == '3')) { - /* (01), (310x) and (13) - metric weight and packaging date */ - encoding_method = 9; - } - - if((source[26] == '1') && (source[27] == '5')) { - /* (01), (310x) and (15) - metric weight and "best before" date */ - encoding_method = 11; - } - - if((source[26] == '1') && (source[27] == '7')) { - /* (01), (310x) and (17) - metric weight and expiration date */ - encoding_method = 13; - } - } - } - } - if(debug) printf("Now using method %d\n", encoding_method); - } - - if((strlen(source) >= 26) && (source[17] == '2')) { - /* Methods 4, 8, 10, 12 and 14 */ - - if(source[18] == '0') { - /* (01) and (320x) */ - char weight_str[7]; - float weight; /* In pounds */ - - for(i = 0; i < 6; i++) { - weight_str[i] = source[20 + i]; - } - weight_str[6] = '\0'; - - if (weight_str[0] == '0') { /* Maximum weight = 99999 */ - - encoding_method = 8; - - if(((source[19] == '2') || (source[19] == '3')) && (strlen(source) == 26)) { - /* (01) and (3202)/(3203) */ - - if(source[19] == '3') { - weight = atof(weight_str) / 1000.0; - if(weight <= 22.767) { - encoding_method = 4; - } - } else { - weight = atof(weight_str) / 100.0; - if(weight <= 99.99) { - encoding_method = 4; - } - } - - } - - if(strlen(source) == 34){ - if((source[26] == '1') && (source[27] == '1')) { - /* (01), (320x) and (11) - English weight and production date */ - encoding_method = 8; - } - - if((source[26] == '1') && (source[27] == '3')) { - /* (01), (320x) and (13) - English weight and packaging date */ - encoding_method = 10; - } - - if((source[26] == '1') && (source[27] == '5')) { - /* (01), (320x) and (15) - English weight and "best before" date */ - encoding_method = 12; - } - - if((source[26] == '1') && (source[27] == '7')) { - /* (01), (320x) and (17) - English weight and expiration date */ - encoding_method = 14; - } - } - } - } - if(debug) printf("Now using method %d\n", encoding_method); - - } - - if(source[17] == '9') { - /* Methods 5 and 6 */ - if((source[18] == '2') && ((source[19] >= '0') && (source[19] <= '3'))) { - /* (01) and (392x) */ - encoding_method = 5; - } - if((source[18] == '3') && ((source[19] >= '0') && (source[19] <= '3'))) { - /* (01) and (393x) */ - encoding_method = 6; - } - if(debug) printf("Now using method %d\n", encoding_method); - } - } - - switch(encoding_method) { /* Encoding method - Table 10 */ - case 1: concat(binary_string, "1XX"); read_posn = 16; break; - case 2: concat(binary_string, "00XX"); read_posn = 0; break; - case 3: concat(binary_string, "0100"); read_posn = strlen(source); break; - case 4: concat(binary_string, "0101"); read_posn = strlen(source); break; - case 5: concat(binary_string, "01100XX"); read_posn = 20; break; - case 6: concat(binary_string, "01101XX"); read_posn = 23; break; - case 7: concat(binary_string, "0111000"); read_posn = strlen(source); break; - case 8: concat(binary_string, "0111001"); read_posn = strlen(source); break; - case 9: concat(binary_string, "0111010"); read_posn = strlen(source); break; - case 10: concat(binary_string, "0111011"); read_posn = strlen(source); break; - case 11: concat(binary_string, "0111100"); read_posn = strlen(source); break; - case 12: concat(binary_string, "0111101"); read_posn = strlen(source); break; - case 13: concat(binary_string, "0111110"); read_posn = strlen(source); break; - case 14: concat(binary_string, "0111111"); read_posn = strlen(source); break; - } - if(debug) printf("Setting binary = %s\n", binary_string); - - /* Variable length symbol bit field is just given a place holder (XX) - for the time being */ - - /* Verify that the data to be placed in the compressed data field is all - numeric data before carrying out compression */ - for(i = 0; i < read_posn; i++) { - if((source[i] < '0') || (source[i] > '9')) { - if((source[i] != '[') && (source[i] != ']')) { - /* Something is wrong */ - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ERROR_INVALID_DATA1; - } - } - } - - /* Now encode the compressed data field */ - - if(debug) printf("Proceeding to encode data\n"); - if(encoding_method == 1) { - /* Encoding method field "1" - general item identification data */ - char group[4]; - int group_val; - - group[0] = source[2]; - group[1] = '\0'; - group_val = atoi(group); - - mask = 0x08; - for(j = 0; j < 4; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - - for(i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - group_val = atoi(group); - - mask = 0x200; - for(j = 0; j < 10; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - - } - - - if(encoding_method == 3) { - /* Encoding method field "0100" - variable weight item - (0,001 kilogram icrements) */ - char group[4]; - int group_val; - char weight_str[7]; - - for(i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - group_val = atoi(group); - - mask = 0x200; - for(j = 0; j < 10; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - for(i = 0; i < 6; i++) { - weight_str[i] = source[20 + i]; - } - weight_str[6] = '\0'; - group_val = atoi(weight_str); - - mask = 0x4000; - for(j = 0; j < 15; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - - - } - - if(encoding_method == 4) { - /* Encoding method field "0101" - variable weight item (0,01 or - 0,001 pound increment) */ - char group[4]; - int group_val; - char weight_str[7]; - - for(i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - group_val = atoi(group); - - mask = 0x200; - for(j = 0; j < 10; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - for(i = 0; i < 6; i++) { - weight_str[i] = source[20 + i]; - } - weight_str[6] = '\0'; - group_val = atoi(weight_str); - - if(source[19] == '3') { - group_val = group_val + 10000; - } - - mask = 0x4000; - for(j = 0; j < 15; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - - } - - - if((encoding_method >= 7) && (encoding_method <= 14)) { - /* Encoding method fields "0111000" through "0111111" - variable - weight item plus date */ - char group[4]; - int group_val; - char weight_str[8]; - char date_str[4]; - - for(i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - group_val = atoi(group); - - mask = 0x200; - for(j = 0; j < 10; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - weight_str[0] = source[19]; - - for(i = 0; i < 5; i++) { - weight_str[i + 1] = source[21 + i]; - } - weight_str[6] = '\0'; - group_val = atoi(weight_str); - - mask = 0x80000; - for(j = 0; j < 20; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - - if(strlen(source) == 34) { - /* Date information is included */ - date_str[0] = source[28]; - date_str[1] = source[29]; - date_str[2] = '\0'; - group_val = atoi(date_str) * 384; - - date_str[0] = source[30]; - date_str[1] = source[31]; - group_val += (atoi(date_str) - 1) * 32; - - date_str[0] = source[32]; - date_str[1] = source[33]; - group_val += atoi(date_str); - } else { - group_val = 38400; - } - - mask = 0x8000; - for(j = 0; j < 16; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - - } - - if(encoding_method == 5) { - /* Encoding method field "01100" - variable measure item and price */ - char group[4]; - int group_val; - - for(i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - group_val = atoi(group); - - mask = 0x200; - for(j = 0; j < 10; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - switch(source[19]) { - case '0': concat(binary_string, "00"); break; - case '1': concat(binary_string, "01"); break; - case '2': concat(binary_string, "10"); break; - case '3': concat(binary_string, "11"); break; - } - } - - if(encoding_method == 6) { - /* Encoding method "01101" - variable measure item and price with ISO 4217 - Currency Code */ - - char group[4]; - int group_val; - char currency_str[5]; - - for(i = 1; i < 5; i++) { - group[0] = source[(i * 3)]; - group[1] = source[(i * 3) + 1]; - group[2] = source[(i * 3) + 2]; - group[3] = '\0'; - group_val = atoi(group); - - mask = 0x200; - for(j = 0; j < 10; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - switch(source[19]) { - case '0': concat(binary_string, "00"); break; - case '1': concat(binary_string, "01"); break; - case '2': concat(binary_string, "10"); break; - case '3': concat(binary_string, "11"); break; - } - - for(i = 0; i < 3; i++) { - currency_str[i] = source[20 + i]; - } - currency_str[3] = '\0'; - group_val = atoi(currency_str); - - mask = 0x200; - for(j = 0; j < 10; j++) { - concat(binary_string, (group_val & mask) ? "1" : "0"); - mask = mask >> 1; - } - - - } - - /* The compressed data field has been processed if appropriate - the - rest of the data (if any) goes into a general-purpose data compaction field */ - - j = 0; - for(i = read_posn; i < strlen(source); i++) { - general_field[j] = source[i]; - j++; - } - general_field[j] = '\0'; - if(debug) printf("General field data = %s\n", general_field); - - latch = 0; - for(i = 0; i < strlen(general_field); i++) { - /* Table 13 - ISO/IEC 646 encodation */ - if((general_field[i] < ' ') || (general_field[i] > 'z')) { - general_field_type[i] = INVALID_CHAR; latch = 1; - } else { - general_field_type[i] = ISOIEC; - } - - if(general_field[i] == '#') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == '$') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == '@') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == 92) { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == '^') { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - if(general_field[i] == 96) { - general_field_type[i] = INVALID_CHAR; latch = 1; - } - - /* Table 12 - Alphanumeric encodation */ - if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '*') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == ',') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '-') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '.') { - general_field_type[i] = ALPHA_OR_ISO; - } - if(general_field[i] == '/') { - general_field_type[i] = ALPHA_OR_ISO; - } - - /* Numeric encodation */ - if((general_field[i] >= '0') && (general_field[i] <= '9')) { - general_field_type[i] = ANY_ENC; - } - if(general_field[i] == '[') { - /* FNC1 can be encoded in any system */ - general_field_type[i] = ANY_ENC; - } - - } - - general_field_type[strlen(general_field)] = '\0'; - if(debug) printf("General field type: %s\n", general_field_type); - - if(latch == 1) { - /* Invalid characters in input data */ - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ERROR_INVALID_DATA1; - } - - for(i = 0; i < strlen(general_field); i++) { - if((general_field_type[i] == ISOIEC) && (general_field[i + 1] == '[')) { - general_field_type[i + 1] = ISOIEC; - } - } - - for(i = 0; i < strlen(general_field); i++) { - if((general_field_type[i] == ALPHA_OR_ISO) && (general_field[i + 1] == '[')) { - general_field_type[i + 1] = ALPHA_OR_ISO; - } - } - - latch = general_rules(general_field, general_field_type); - if(debug) printf("General field type: %s\n", general_field_type); - - last_mode = NUMERIC; - - /* Set initial mode if not NUMERIC */ - if(general_field_type[0] == ALPHA) { - concat(binary_string, "0000"); /* Alphanumeric latch */ - last_mode = ALPHA; - } - if(general_field_type[0] == ISOIEC) { - concat(binary_string, "0000"); /* Alphanumeric latch */ - concat(binary_string, "00100"); /* ISO/IEC 646 latch */ - last_mode = ISOIEC; - } - - i = 0; - do { - if(debug) printf("Processing character %d ", i); - switch(general_field_type[i]) { - case NUMERIC: - if(debug) printf("as NUMERIC:"); - - if(last_mode != NUMERIC) { - concat(binary_string, "000"); /* Numeric latch */ - if(debug) printf("\n"); - } - - if(debug) printf(" %c%c > ", general_field[i], general_field[i + 1]); - if(general_field[i] != '[') { - d1 = ctoi(general_field[i]); - } else { - d1 = 10; - } - - if(general_field[i + 1] != '[') { - d2 = ctoi(general_field[i + 1]); - } else { - d2 = 10; - } - - value = (11 * d1) + d2 + 8; - - mask = 0x40; - for(j = 0; j < 7; j++) { - concat(binary_string, (value & mask) ? "1" : "0"); - if (debug) { - printf("%d", !!(value & mask)); - } - mask = mask >> 1; - } - - i += 2; - if(debug) printf("\n"); - last_mode = NUMERIC; - break; - - case ALPHA: - if(debug) printf("as ALPHA\n"); - if(i != 0) { - if(last_mode == NUMERIC) { - concat(binary_string, "0000"); /* Alphanumeric latch */ - } - if(last_mode == ISOIEC) { - concat(binary_string, "00100"); /* Alphanumeric latch */ - } - } - - if((general_field[i] >= '0') && (general_field[i] <= '9')) { - - value = general_field[i] - 43; - - mask = 0x10; - for(j = 0; j < 5; j++) { - concat(binary_string, (value & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - - value = general_field[i] - 33; - - mask = 0x20; - for(j = 0; j < 6; j++) { - concat(binary_string, (value & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - last_mode = ALPHA; - if(general_field[i] == '[') { concat(binary_string, "01111"); last_mode = NUMERIC; } /* FNC1/Numeric latch */ - if(general_field[i] == '*') concat(binary_string, "111010"); /* asterisk */ - if(general_field[i] == ',') concat(binary_string, "111011"); /* comma */ - if(general_field[i] == '-') concat(binary_string, "111100"); /* minus or hyphen */ - if(general_field[i] == '.') concat(binary_string, "111101"); /* period or full stop */ - if(general_field[i] == '/') concat(binary_string, "111110"); /* slash or solidus */ - - i++; - break; - - case ISOIEC: - if(debug) printf("as ISOIEC\n"); - if(i != 0) { - if(last_mode == NUMERIC) { - concat(binary_string, "0000"); /* Alphanumeric latch */ - concat(binary_string, "00100"); /* ISO/IEC 646 latch */ - } - if(last_mode == ALPHA) { - concat(binary_string, "00100"); /* ISO/IEC 646 latch */ - } - } - - if((general_field[i] >= '0') && (general_field[i] <= '9')) { - - value = general_field[i] - 43; - - mask = 0x10; - for(j = 0; j < 5; j++) { - concat(binary_string, (value & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - if((general_field[i] >= 'A') && (general_field[i] <= 'Z')) { - - value = general_field[i] - 1; - - mask = 0x40; - for(j = 0; j < 7; j++) { - concat(binary_string, (value & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - if((general_field[i] >= 'a') && (general_field[i] <= 'z')) { - - value = general_field[i] - 7; - - mask = 0x40; - for(j = 0; j < 7; j++) { - concat(binary_string, (value & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - last_mode = ISOIEC; - if(general_field[i] == '[') { concat(binary_string, "01111"); last_mode = NUMERIC; } /* FNC1/Numeric latch */ - if(general_field[i] == '!') concat(binary_string, "11101000"); /* exclamation mark */ - if(general_field[i] == 34) concat(binary_string, "11101001"); /* quotation mark */ - if(general_field[i] == 37) concat(binary_string, "11101010"); /* percent sign */ - if(general_field[i] == '&') concat(binary_string, "11101011"); /* ampersand */ - if(general_field[i] == 39) concat(binary_string, "11101100"); /* apostrophe */ - if(general_field[i] == '(') concat(binary_string, "11101101"); /* left parenthesis */ - if(general_field[i] == ')') concat(binary_string, "11101110"); /* right parenthesis */ - if(general_field[i] == '*') concat(binary_string, "11101111"); /* asterisk */ - if(general_field[i] == '+') concat(binary_string, "11110000"); /* plus sign */ - if(general_field[i] == ',') concat(binary_string, "11110001"); /* comma */ - if(general_field[i] == '-') concat(binary_string, "11110010"); /* minus or hyphen */ - if(general_field[i] == '.') concat(binary_string, "11110011"); /* period or full stop */ - if(general_field[i] == '/') concat(binary_string, "11110100"); /* slash or solidus */ - if(general_field[i] == ':') concat(binary_string, "11110101"); /* colon */ - if(general_field[i] == ';') concat(binary_string, "11110110"); /* semicolon */ - if(general_field[i] == '<') concat(binary_string, "11110111"); /* less-than sign */ - if(general_field[i] == '=') concat(binary_string, "11111000"); /* equals sign */ - if(general_field[i] == '>') concat(binary_string, "11111001"); /* greater-than sign */ - if(general_field[i] == '?') concat(binary_string, "11111010"); /* question mark */ - if(general_field[i] == '_') concat(binary_string, "11111011"); /* underline or low line */ - if(general_field[i] == ' ') concat(binary_string, "11111100"); /* space */ - - i++; - break; - } - } while (i + latch < strlen(general_field)); - if(debug) printf("Resultant binary = %s\n", binary_string); - if(debug) printf("\tLength: %d\n", (int)strlen(binary_string)); - - remainder = 12 - (strlen(binary_string) % 12); - if(remainder == 12) { remainder = 0; } - if(strlen(binary_string) < 36) { remainder = 36 - strlen(binary_string); } - - if(latch == 1) { - /* There is still one more numeric digit to encode */ - if(debug) printf("Adding extra (odd) numeric digit\n"); - - if(last_mode == NUMERIC) { - if((remainder >= 4) && (remainder <= 6)) { - value = ctoi(general_field[i]); - value++; - - mask = 0x08; - for(j = 0; j < 4; j++) { - concat(binary_string, (value & mask) ? "1" : "0"); - mask = mask >> 1; - } - } else { - d1 = ctoi(general_field[i]); - d2 = 10; - - value = (11 * d1) + d2 + 8; - - mask = 0x40; - for(j = 0; j < 7; j++) { - concat(binary_string, (value & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - } else { - value = general_field[i] - 43; - - mask = 0x10; - for(j = 0; j < 5; j++) { - concat(binary_string, (value & mask) ? "1" : "0"); - mask = mask >> 1; - } - } - - remainder = 12 - (strlen(binary_string) % 12); - if(remainder == 12) { remainder = 0; } - if(strlen(binary_string) < 36) { remainder = 36 - strlen(binary_string); } - if(debug) printf("Resultant binary = %s\n", binary_string); - if(debug) printf("\tLength: %d\n", (int)strlen(binary_string)); - } - - if(strlen(binary_string) > 252) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - - /* Now add padding to binary string (7.2.5.5.4) */ - i = remainder; - if((strlen(general_field) != 0) && (last_mode == NUMERIC)) { - strcpy(padstring, "0000"); - i -= 4; - } else { - strcpy(padstring, ""); - } - for(;i > 0;i -= 5) { - concat(padstring, "00100"); - } - - padstring[remainder] = '\0'; - concat(binary_string, padstring); - - /* Patch variable length symbol bit field */ - d1 = ((strlen(binary_string) / 12) + 1) & 1; - if(strlen(binary_string) <= 156) { d2 = 0; } else { d2 = 1; } - - if(encoding_method == 1) { - binary_string[2] = d1 ? '1' : '0'; - binary_string[3] = d2 ? '1' : '0'; - } - if(encoding_method == 2) { - binary_string[3] = d1 ? '1' : '0'; - binary_string[4] = d2 ? '1' : '0'; - } - if((encoding_method == 5) || (encoding_method == 6)) { - binary_string[6] = d1 ? '1' : '0'; - binary_string[7] = d2 ? '1' : '0'; - } - if(debug) printf("Resultant binary = %s\n", binary_string); - if(debug) printf("\tLength: %d\n", (int)strlen(binary_string)); - return 0; -} - -int rssexpanded(struct zint_symbol *symbol, unsigned char source[], int src_len) -{ /* GS1 DataBar Expanded */ - int i, j, k, l, data_chars, vs[21], group[21], v_odd[21], v_even[21]; - char substring[21][14], latch; - int char_widths[21][8], checksum, check_widths[8], c_group; - int check_char, c_odd, c_even, elements[235], pattern_width, reader, writer; - int row, elements_in_sub, special_case_row, left_to_right; - int codeblocks, sub_elements[235], stack_rows, current_row, current_block; - int separator_row; -#ifndef _MSC_VER - char reduced[src_len], binary_string[7 * src_len]; -#else - char* reduced = (char*)_alloca(src_len); - char* binary_string = (char*)_alloca(7 * src_len); -#endif - - separator_row = 0; - reader=0; - - if(symbol->input_mode != GS1_MODE) { - /* GS1 data has not been verified yet */ - i = gs1_verify(symbol, source, src_len, reduced); - if(i != 0) { return i; } - } - - if((symbol->symbology == BARCODE_RSS_EXP_CC) || (symbol->symbology == BARCODE_RSS_EXPSTACK_CC)) { - /* make space for a composite separator pattern */ - separator_row = symbol->rows; - symbol->row_height[separator_row] = 1; - symbol->rows += 1; - } - - strcpy(binary_string, ""); - - if(symbol->option_1 == 2) { - concat(binary_string, "1"); - } else { - concat(binary_string, "0"); - } - - i = rss_binary_string(symbol, reduced, binary_string); - if(i != 0) { - return i; - } - - data_chars = strlen(binary_string) / 12; - - for(i = 0; i < data_chars; i++) { - for(j = 0; j < 12; j++) { - substring[i][j] = binary_string[(i * 12) + j]; - } - substring[i][12] = '\0'; - } - - for(i = 0; i < data_chars; i++) { - vs[i] = 0; - if(substring[i][0] == '1') { vs[i] += 2048; } - if(substring[i][1] == '1') { vs[i] += 1024; } - if(substring[i][2] == '1') { vs[i] += 512; } - if(substring[i][3] == '1') { vs[i] += 256; } - if(substring[i][4] == '1') { vs[i] += 128; } - if(substring[i][5] == '1') { vs[i] += 64; } - if(substring[i][6] == '1') { vs[i] += 32; } - if(substring[i][7] == '1') { vs[i] += 16; } - if(substring[i][8] == '1') { vs[i] += 8; } - if(substring[i][9] == '1') { vs[i] += 4; } - if(substring[i][10] == '1') { vs[i] += 2; } - if(substring[i][11] == '1') { vs[i] += 1; } - } - - for(i = 0; i < data_chars; i++) { - if(vs[i] <= 347) { group[i] = 1; } - if((vs[i] >= 348) && (vs[i] <= 1387)) { group[i] = 2; } - if((vs[i] >= 1388) && (vs[i] <= 2947)) { group[i] = 3; } - if((vs[i] >= 2948) && (vs[i] <= 3987)) { group[i] = 4; } - if(vs[i] >= 3988) { group[i] = 5; } - v_odd[i] = (vs[i] - g_sum_exp[group[i] - 1]) / t_even_exp[group[i] - 1]; - v_even[i] = (vs[i] - g_sum_exp[group[i] - 1]) % t_even_exp[group[i] - 1]; - - getRSSwidths(v_odd[i], modules_odd_exp[group[i] - 1], 4, widest_odd_exp[group[i] - 1], 0); - char_widths[i][0] = widths[0]; - char_widths[i][2] = widths[1]; - char_widths[i][4] = widths[2]; - char_widths[i][6] = widths[3]; - getRSSwidths(v_even[i], modules_even_exp[group[i] - 1], 4, widest_even_exp[group[i] - 1], 1); - char_widths[i][1] = widths[0]; - char_widths[i][3] = widths[1]; - char_widths[i][5] = widths[2]; - char_widths[i][7] = widths[3]; - } - - /* 7.2.6 Check character */ - /* The checksum value is equal to the mod 211 residue of the weighted sum of the widths of the - elements in the data characters. */ - checksum = 0; - for(i = 0; i < data_chars; i++) { - row = weight_rows[(((data_chars - 2) / 2) * 21) + i]; - for(j = 0; j < 8; j++) { - checksum += (char_widths[i][j] * checksum_weight_exp[(row * 8) + j]); - - } - } - - check_char = (211 * ((data_chars + 1) - 4)) + (checksum % 211); - - if(check_char <= 347) { c_group = 1; } - if((check_char >= 348) && (check_char <= 1387)) { c_group = 2; } - if((check_char >= 1388) && (check_char <= 2947)) { c_group = 3; } - if((check_char >= 2948) && (check_char <= 3987)) { c_group = 4; } - if(check_char >= 3988) { c_group = 5; } - - c_odd = (check_char - g_sum_exp[c_group - 1]) / t_even_exp[c_group - 1]; - c_even = (check_char - g_sum_exp[c_group - 1]) % t_even_exp[c_group - 1]; - - getRSSwidths(c_odd, modules_odd_exp[c_group - 1], 4, widest_odd_exp[c_group - 1], 0); - check_widths[0] = widths[0]; - check_widths[2] = widths[1]; - check_widths[4] = widths[2]; - check_widths[6] = widths[3]; - getRSSwidths(c_even, modules_even_exp[c_group - 1], 4, widest_even_exp[c_group - 1], 1); - check_widths[1] = widths[0]; - check_widths[3] = widths[1]; - check_widths[5] = widths[2]; - check_widths[7] = widths[3]; - - /* Initialise element array */ - pattern_width = ((((data_chars + 1) / 2) + ((data_chars + 1) & 1)) * 5) + ((data_chars + 1) * 8) + 4; - for(i = 0; i < pattern_width; i++) { - elements[i] = 0; - } - - elements[0] = 1; - elements[1] = 1; - elements[pattern_width - 2] = 1; - elements[pattern_width - 1] = 1; - - /* Put finder patterns in element array */ - for(i = 0; i < (((data_chars + 1) / 2) + ((data_chars + 1) & 1)); i++) { - k = ((((((data_chars + 1) - 2) / 2) + ((data_chars + 1) & 1)) - 1) * 11) + i; - for(j = 0; j < 5; j++) { - elements[(21 * i) + j + 10] = finder_pattern_exp[((finder_sequence[k] - 1) * 5) + j]; - } - } - - /* Put check character in element array */ - for(i = 0; i < 8; i++) { - elements[i + 2] = check_widths[i]; - } - - /* Put forward reading data characters in element array */ - for(i = 1; i < data_chars; i += 2) { - for(j = 0; j < 8; j++) { - elements[(((i - 1) / 2) * 21) + 23 + j] = char_widths[i][j]; - } - } - - /* Put reversed data characters in element array */ - for(i = 0; i < data_chars; i += 2) { - for(j = 0; j < 8; j++) { - elements[((i / 2) * 21) + 15 + j] = char_widths[i][7 - j]; - } - } - - if((symbol->symbology == BARCODE_RSS_EXP) || (symbol->symbology == BARCODE_RSS_EXP_CC)) { - /* Copy elements into symbol */ - writer = 0; - latch = '0'; - for(i = 0; i < pattern_width; i++) { - for(j = 0; j < elements[i]; j++) { - if(latch == '1') { set_module(symbol, symbol->rows, writer); } else { unset_module(symbol, symbol->rows, writer); } - writer++; - } - if(latch == '1') { - latch = '0'; - } else { - latch = '1'; - } - } - if(symbol->width < writer) { symbol->width = writer; } - symbol->rows = symbol->rows + 1; - if(symbol->symbology == BARCODE_RSS_EXP_CC) { - for(j = 4; j < (symbol->width - 4); j++) { - if(module_is_set(symbol, separator_row + 1, j)) { - unset_module(symbol, separator_row, j); - } else { - set_module(symbol, separator_row, j); - } - } - /* finder bar adjustment */ - for(j = 0; j < (writer / 49); j++) { - k = (49 * j) + 18; - for(i = 0; i < 15; i++) { - if((!(module_is_set(symbol, separator_row + 1, i + k - 1))) && - (!(module_is_set(symbol, separator_row + 1, i + k))) && - module_is_set(symbol, separator_row, i + k - 1)) { - unset_module(symbol, separator_row, i + k); - } - } - } - } - - /* Add human readable text */ - for(i = 0; i <= src_len; i++) { - if((source[i] != '[') && (source[i] != ']')) { - symbol->text[i] = source[i]; - } else { - if(source[i] == '[') { - symbol->text[i] = '('; - } - if(source[i] == ']') { - symbol->text[i] = ')'; - } - } - } - - } else { - /* RSS Expanded Stacked */ - - codeblocks = (data_chars + 1) / 2; - - if((symbol->option_2 < 1) || (symbol->option_2 > 10)) { - symbol->option_2 = 2; - } - if((symbol->option_1 == 2) && (symbol->option_2 == 1)) { - /* "There shall be a minimum of four symbol characters in the - first row of an RSS Expanded Stacked symbol when it is the linear - component of an EAN.UCC Composite symbol." */ - symbol->option_2 = 2; - } - - stack_rows = codeblocks / symbol->option_2; - if(codeblocks % symbol->option_2 > 0) { - stack_rows++; - } - - current_block = 0; - for(current_row = 1; current_row <= stack_rows; current_row++) { - for(i = 0; i < 235; i++) { - sub_elements[i] = 0; - } - special_case_row = 0; - - /* Row Start */ - sub_elements[0] = 1; - sub_elements[1] = 1; - elements_in_sub = 2; - - /* Row Data */ - reader = 0; - do { - if(((symbol->option_2 & 1) || (current_row & 1)) || - ((current_row == stack_rows) && (codeblocks != (current_row * symbol->option_2)) && - (((current_row * symbol->option_2) - codeblocks) & 1))) { - /* left to right */ - left_to_right = 1; - i = 2 + (current_block * 21); - for(j = 0; j < 21; j++) { - sub_elements[j + (reader * 21) + 2] = elements[i + j]; - elements_in_sub++; - } - } else { - /* right to left */ - left_to_right = 0; - if((current_row * symbol->option_2) < codeblocks) { - /* a full row */ - i = 2 + (((current_row * symbol->option_2) - reader - 1) * 21); - for(j = 0; j < 21; j++) { - sub_elements[(20 - j) + (reader * 21) + 2] = elements[i + j]; - elements_in_sub++; - } - } else { - /* a partial row */ - k = ((current_row * symbol->option_2) - codeblocks); - l = (current_row * symbol->option_2) - reader - 1; - i = 2 + ((l - k) * 21); - for(j = 0; j < 21; j++) { - sub_elements[(20 - j) + (reader * 21) + 2] = elements[i + j]; - elements_in_sub++; - } - } - } - reader++; - current_block++; - } while ((reader < symbol->option_2) && (current_block < codeblocks)); - - /* Row Stop */ - sub_elements[elements_in_sub] = 1; - sub_elements[elements_in_sub + 1] = 1; - elements_in_sub += 2; - - latch = current_row & 1 ? '0' : '1'; - - if ((current_row == stack_rows) && (codeblocks != (current_row * symbol->option_2)) && - (((current_row * symbol->option_2) - codeblocks) & 1) ) { - /* Special case bottom row */ - special_case_row = 1; - sub_elements[0] = 2; - latch = '0'; - } - - writer = 0; - for(i = 0; i < elements_in_sub; i++) { - for(j = 0; j < sub_elements[i]; j++) { - if(latch == '1') { set_module(symbol, symbol->rows, writer); } else { unset_module(symbol, symbol->rows, writer); } - writer++; - } - if(latch == '1') { - latch = '0'; - } else { - latch = '1'; - } - } - if(symbol->width < writer) { symbol->width = writer; } - - if(current_row != 1) { - /* middle separator pattern (above current row) */ - for(j = 5; j < (49 * symbol->option_2); j += 2) { - set_module(symbol, symbol->rows - 2, j); - } - symbol->row_height[symbol->rows - 2] = 1; - /* bottom separator pattern (above current row) */ - for(j = 4; j < (writer - 4); j++) { - if(module_is_set(symbol, symbol->rows, j)) { - unset_module(symbol, symbol->rows - 1, j); - } else { - set_module(symbol, symbol->rows - 1, j); - } - } - symbol->row_height[symbol->rows - 1] = 1; - /* finder bar adjustment */ - for(j = 0; j < reader; j++) { - k = (49 * j) + (special_case_row ? 19 : 18); - if(left_to_right) { - for(i = 0; i < 15; i++) { - if((!(module_is_set(symbol, symbol->rows, i + k - 1))) && - (!(module_is_set(symbol, symbol->rows, i + k))) && - module_is_set(symbol, symbol->rows - 1, i + k - 1)) { - unset_module(symbol, symbol->rows - 1, i + k); - } - } - } else { - for(i = 14; i >= 0; i--) { - if((!(module_is_set(symbol, symbol->rows, i + k + 1))) && - (!(module_is_set(symbol, symbol->rows, i + k))) && - module_is_set(symbol, symbol->rows - 1, i + k + 1)) { - unset_module(symbol, symbol->rows - 1, i + k); - } - } - } - } - } - - if(current_row != stack_rows) { - /* top separator pattern (below current row) */ - for(j = 4; j < (writer - 4); j++) { - if(module_is_set(symbol, symbol->rows, j)) { - unset_module(symbol, symbol->rows + 1, j); - } else { - set_module(symbol, symbol->rows + 1, j); - } - } - symbol->row_height[symbol->rows + 1] = 1; - /* finder bar adjustment */ - for(j = 0; j < reader; j++) { - k = (49 * j) + 18; - if(left_to_right) { - for(i = 0; i < 15; i++) { - if((!(module_is_set(symbol, symbol->rows, i + k - 1))) && - (!(module_is_set(symbol, symbol->rows, i + k))) && - module_is_set(symbol, symbol->rows + 1, i + k - 1)) { - unset_module(symbol, symbol->rows + 1, i + k); - } - } - } else{ - for(i = 14; i >= 0; i--) { - if((!(module_is_set(symbol, symbol->rows, i + k + 1))) && - (!(module_is_set(symbol, symbol->rows, i + k))) && - module_is_set(symbol, symbol->rows + 1, i + k + 1)) { - unset_module(symbol, symbol->rows + 1, i + k); - } - } - } - } - } - - symbol->rows = symbol->rows + 4; - } - symbol->rows = symbol->rows - 3; - if(symbol->symbology == BARCODE_RSS_EXPSTACK_CC) { - for(j = 4; j < (symbol->width - 4); j++) { - if(module_is_set(symbol, separator_row + 1, j)) { - unset_module(symbol, separator_row, j); - } else { - set_module(symbol, separator_row, j); - } - } - /* finder bar adjustment */ - for(j = 0; j < reader; j++) { - k = (49 * j) + 18; - for(i = 0; i < 15; i++) { - if((!(module_is_set(symbol, separator_row + 1, i + k - 1))) && - (!(module_is_set(symbol, separator_row + 1, i + k))) && - module_is_set(symbol, separator_row, i + k - 1)) { - unset_module(symbol, separator_row, i + k); - } - } - } - } - - } - - return 0; -} diff --git a/3rdparty/zint-2.4.4/backend/rss.h b/3rdparty/zint-2.4.4/backend/rss.h deleted file mode 100644 index f1463a9..0000000 --- a/3rdparty/zint-2.4.4/backend/rss.h +++ /dev/null @@ -1,225 +0,0 @@ -/* rss.h - Data tables for Reduced Space Symbology */ - -/* - libzint - the open source barcode library - Copyright (C) 2007 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#define NUMERIC 110 -#define ALPHA 97 -#define ISOIEC 105 -#define INVALID_CHAR 100 -#define ANY_ENC 120 -#define ALPHA_OR_ISO 121 - -/* RSS-14 Tables */ -static int g_sum_table[9] = { 0, 161, 961, 2015, 2715, 0, 336, 1036, 1516}; -static int t_table[9] = { 1, 10, 34, 70, 126, 4, 20, 48, 81}; -static int modules_odd[9] = { 12, 10, 8, 6, 4, 5, 7, 9, 11 }; -static int modules_even[9] = { 4, 6, 8, 10, 12, 10, 8, 6, 4 }; -static int widest_odd[9] = { 8, 6, 4, 3, 1, 2, 4, 6, 8 }; -static int widest_even[9] = { 1, 3, 5, 6, 8, 7, 5, 3, 1 }; -static int widths[8]; -static int finder_pattern[45] = { - 3, 8, 2, 1, 1, - 3, 5, 5, 1, 1, - 3, 3, 7, 1, 1, - 3, 1, 9, 1, 1, - 2, 7, 4, 1, 1, - 2, 5, 6, 1, 1, - 2, 3, 8, 1, 1, - 1, 5, 7, 1, 1, - 1, 3, 9, 1, 1 -}; -static int checksum_weight[32] = { /* Table 5 */ - 1, 3, 9, 27, 2, 6, 18, 54, - 4, 12, 36, 29, 8, 24, 72, 58, - 16, 48, 65, 37, 32, 17, 51, 74, - 64, 34, 23, 69, 49, 68, 46, 59 -}; - -/* RSS Limited Tables */ -static int t_even_ltd[7] = { 28, 728, 6454, 203, 2408, 1, 16632 }; -static int modules_odd_ltd[7] = { 17, 13, 9, 15, 11, 19, 7 }; -static int modules_even_ltd[7] = { 9, 13, 17, 11, 15, 7, 19 }; -static int widest_odd_ltd[7] = { 6, 5, 3, 5, 4, 8, 1 }; -static int widest_even_ltd[7] = { 3, 4, 6, 4, 5, 1, 8 }; -static int checksum_weight_ltd[28] = { /* Table 7 */ - 1, 3, 9, 27, 81, 65, 17, 51, 64, 14, 42, 37, 22, 66, - 20, 60, 2, 6, 18, 54, 73, 41, 34, 13, 39, 28, 84, 74 -}; -static int finder_pattern_ltd[1232] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 2, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, - 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 3, 1, 1, 1, - 1, 2, 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1, 1, - 1, 2, 1, 1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 1, - 1, 2, 1, 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, - 1, 3, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 2, 1, 1, - 1, 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, - 1, 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 3, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 3, 2, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, - 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, - 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, - 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, - 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, - 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 2, 2, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 1, 1, 3, 2, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, - 1, 1, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 1, 1, - 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 1, - 1, 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, - 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, - 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, - 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 1, 1, 1, - 1, 2, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, - 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, - 1, 1, 2, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, - 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1, - 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, - 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 2, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 2, 1, 1, 1, - 2, 1, 1, 1, 1, 1, 1, 3, 1, 1, 2, 1, 1, 1, - 2, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 1, 1, - 2, 1, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 1, - 2, 1, 1, 2, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1 -}; - -/* RSS Expanded Tables */ -static int g_sum_exp[5] = { 0, 348, 1388, 2948, 3988 }; -static int t_even_exp[5] = { 4, 20, 52, 104, 204 }; -static int modules_odd_exp[5] = { 12, 10, 8, 6, 4 }; -static int modules_even_exp[5] = { 5, 7, 9, 11, 13 }; -static int widest_odd_exp[5] = { 7, 5, 4, 3, 1 }; -static int widest_even_exp[5] = { 2, 4, 5, 6, 8 }; -static int checksum_weight_exp[184] = { /* Table 14 */ - 1, 3, 9, 27, 81, 32, 96, 77, - 20, 60, 180, 118, 143, 7, 21, 63, - 189, 145, 13, 39, 117, 140, 209, 205, - 193, 157, 49, 147, 19, 57, 171, 91, - 62, 186, 136, 197, 169, 85, 44, 132, - 185, 133, 188, 142, 4, 12, 36, 108, - 113, 128, 173, 97, 80, 29, 87, 50, - 150, 28, 84, 41, 123, 158, 52, 156, - 46, 138, 203, 187, 139, 206, 196, 166, - 76, 17, 51, 153, 37, 111, 122, 155, - 43, 129, 176, 106, 107, 110, 119, 146, - 16, 48, 144, 10, 30, 90, 59, 177, - 109, 116, 137, 200, 178, 112, 125, 164, - 70, 210, 208, 202, 184, 130, 179, 115, - 134, 191, 151, 31, 93, 68, 204, 190, - 148, 22, 66, 198, 172, 94, 71, 2, - 6, 18, 54, 162, 64, 192, 154, 40, - 120, 149, 25, 75, 14, 42, 126, 167, - 79, 26, 78, 23, 69, 207, 199, 175, - 103, 98, 83, 38, 114, 131, 182, 124, - 161, 61, 183, 127, 170, 88, 53, 159, - 55, 165, 73, 8, 24, 72, 5, 15, - 45, 135, 194, 160, 58, 174, 100, 89 -}; -static int finder_pattern_exp[60] = { /* Table 15 */ - 1, 8, 4, 1, 1, - 1, 1, 4, 8, 1, - 3, 6, 4, 1, 1, - 1, 1, 4, 6, 3, - 3, 4, 6, 1, 1, - 1, 1, 6, 4, 3, - 3, 2, 8, 1, 1, - 1, 1, 8, 2, 3, - 2, 6, 5, 1, 1, - 1, 1, 5, 6, 2, - 2, 2, 9, 1, 1, - 1, 1, 9, 2, 2 -}; -static int finder_sequence[198] = { /* Table 16 */ - 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 4, 3, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 6, 3, 8, 0, 0, 0, 0, 0, 0, 0, - 1, 10, 3, 8, 5, 0, 0, 0, 0, 0, 0, - 1, 10, 3, 8, 7, 12, 0, 0, 0, 0, 0, - 1, 10, 3, 8, 9, 12, 11, 0, 0, 0, 0, - 1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, - 1, 2, 3, 4, 5, 6, 7, 10, 9, 0, 0, - 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 0, - 1, 2, 3, 4, 5, 8, 7, 10, 9, 12, 11 -}; -static int weight_rows[210] = { - 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 5, 6, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 10, 3, 4, 13, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 18, 3, 4, 13, 14, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 18, 3, 4, 13, 14, 11, 12, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 17, 18, 3, 4, 13, 14, 15, 16, 21, 22, 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 15, 16, 0, 0, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 17, 18, 19, 20, 21, 22, 0, 0, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 13, 14, 11, 12, 17, 18, 15, 16, 21, 22, 19, 20 -}; diff --git a/3rdparty/zint-2.4.4/backend/sjis.h b/3rdparty/zint-2.4.4/backend/sjis.h deleted file mode 100644 index a75d80b..0000000 --- a/3rdparty/zint-2.4.4/backend/sjis.h +++ /dev/null @@ -1,6875 +0,0 @@ -/* sjis.h - Unicode to Shift JIS lookup table - - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -/* Derived from : -## Shift_JIS (JIS X 0208:1997 Appendix 1) vs Unicode mapping table -## -## Date: 06 Mar 2002 06:01:22 GMT -## License: -## Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved. -## Copyright (C) 2001 I'O, All Rights Reserved. -## You can use, modify, distribute this table freely. -*/ - -unsigned long int sjis_lookup[] = { - 0x005C,0x815F, // REVERSE SOLIDUS - 0x00A2,0x8191, // CENT SIGN - 0x00A3,0x8192, // POUND SIGN - 0x00A7,0x8198, // SECTION SIGN - 0x00A8,0x814E, // DIAERESIS - 0x00AC,0x81CA, // NOT SIGN - 0x00B0,0x818B, // DEGREE SIGN - 0x00B1,0x817D, // PLUS-MINUS SIGN - 0x00B4,0x814C, // ACUTE ACCENT - 0x00B6,0x81F7, // PILCROW SIGN - 0x00D7,0x817E, // MULTIPLICATION SIGN - 0x00F7,0x8180, // DIVISION SIGN - 0x0391,0x839F, // GREEK CAPITAL LETTER ALPHA - 0x0392,0x83A0, // GREEK CAPITAL LETTER BETA - 0x0393,0x83A1, // GREEK CAPITAL LETTER GAMMA - 0x0394,0x83A2, // GREEK CAPITAL LETTER DELTA - 0x0395,0x83A3, // GREEK CAPITAL LETTER EPSILON - 0x0396,0x83A4, // GREEK CAPITAL LETTER ZETA - 0x0397,0x83A5, // GREEK CAPITAL LETTER ETA - 0x0398,0x83A6, // GREEK CAPITAL LETTER THETA - 0x0399,0x83A7, // GREEK CAPITAL LETTER IOTA - 0x039A,0x83A8, // GREEK CAPITAL LETTER KAPPA - 0x039B,0x83A9, // GREEK CAPITAL LETTER LAMDA - 0x039C,0x83AA, // GREEK CAPITAL LETTER MU - 0x039D,0x83AB, // GREEK CAPITAL LETTER NU - 0x039E,0x83AC, // GREEK CAPITAL LETTER XI - 0x039F,0x83AD, // GREEK CAPITAL LETTER OMICRON - 0x03A0,0x83AE, // GREEK CAPITAL LETTER PI - 0x03A1,0x83AF, // GREEK CAPITAL LETTER RHO - 0x03A3,0x83B0, // GREEK CAPITAL LETTER SIGMA - 0x03A4,0x83B1, // GREEK CAPITAL LETTER TAU - 0x03A5,0x83B2, // GREEK CAPITAL LETTER UPSILON - 0x03A6,0x83B3, // GREEK CAPITAL LETTER PHI - 0x03A7,0x83B4, // GREEK CAPITAL LETTER CHI - 0x03A8,0x83B5, // GREEK CAPITAL LETTER PSI - 0x03A9,0x83B6, // GREEK CAPITAL LETTER OMEGA - 0x03B1,0x83BF, // GREEK SMALL LETTER ALPHA - 0x03B2,0x83C0, // GREEK SMALL LETTER BETA - 0x03B3,0x83C1, // GREEK SMALL LETTER GAMMA - 0x03B4,0x83C2, // GREEK SMALL LETTER DELTA - 0x03B5,0x83C3, // GREEK SMALL LETTER EPSILON - 0x03B6,0x83C4, // GREEK SMALL LETTER ZETA - 0x03B7,0x83C5, // GREEK SMALL LETTER ETA - 0x03B8,0x83C6, // GREEK SMALL LETTER THETA - 0x03B9,0x83C7, // GREEK SMALL LETTER IOTA - 0x03BA,0x83C8, // GREEK SMALL LETTER KAPPA - 0x03BB,0x83C9, // GREEK SMALL LETTER LAMDA - 0x03BC,0x83CA, // GREEK SMALL LETTER MU - 0x03BD,0x83CB, // GREEK SMALL LETTER NU - 0x03BE,0x83CC, // GREEK SMALL LETTER XI - 0x03BF,0x83CD, // GREEK SMALL LETTER OMICRON - 0x03C0,0x83CE, // GREEK SMALL LETTER PI - 0x03C1,0x83CF, // GREEK SMALL LETTER RHO - 0x03C3,0x83D0, // GREEK SMALL LETTER SIGMA - 0x03C4,0x83D1, // GREEK SMALL LETTER TAU - 0x03C5,0x83D2, // GREEK SMALL LETTER UPSILON - 0x03C6,0x83D3, // GREEK SMALL LETTER PHI - 0x03C7,0x83D4, // GREEK SMALL LETTER CHI - 0x03C8,0x83D5, // GREEK SMALL LETTER PSI - 0x03C9,0x83D6, // GREEK SMALL LETTER OMEGA - 0x0401,0x8446, // CYRILLIC CAPITAL LETTER IO - 0x0410,0x8440, // CYRILLIC CAPITAL LETTER A - 0x0411,0x8441, // CYRILLIC CAPITAL LETTER BE - 0x0412,0x8442, // CYRILLIC CAPITAL LETTER VE - 0x0413,0x8443, // CYRILLIC CAPITAL LETTER GHE - 0x0414,0x8444, // CYRILLIC CAPITAL LETTER DE - 0x0415,0x8445, // CYRILLIC CAPITAL LETTER IE - 0x0416,0x8447, // CYRILLIC CAPITAL LETTER ZHE - 0x0417,0x8448, // CYRILLIC CAPITAL LETTER ZE - 0x0418,0x8449, // CYRILLIC CAPITAL LETTER I - 0x0419,0x844A, // CYRILLIC CAPITAL LETTER SHORT I - 0x041A,0x844B, // CYRILLIC CAPITAL LETTER KA - 0x041B,0x844C, // CYRILLIC CAPITAL LETTER EL - 0x041C,0x844D, // CYRILLIC CAPITAL LETTER EM - 0x041D,0x844E, // CYRILLIC CAPITAL LETTER EN - 0x041E,0x844F, // CYRILLIC CAPITAL LETTER O - 0x041F,0x8450, // CYRILLIC CAPITAL LETTER PE - 0x0420,0x8451, // CYRILLIC CAPITAL LETTER ER - 0x0421,0x8452, // CYRILLIC CAPITAL LETTER ES - 0x0422,0x8453, // CYRILLIC CAPITAL LETTER TE - 0x0423,0x8454, // CYRILLIC CAPITAL LETTER U - 0x0424,0x8455, // CYRILLIC CAPITAL LETTER EF - 0x0425,0x8456, // CYRILLIC CAPITAL LETTER HA - 0x0426,0x8457, // CYRILLIC CAPITAL LETTER TSE - 0x0427,0x8458, // CYRILLIC CAPITAL LETTER CHE - 0x0428,0x8459, // CYRILLIC CAPITAL LETTER SHA - 0x0429,0x845A, // CYRILLIC CAPITAL LETTER SHCHA - 0x042B,0x845C, // CYRILLIC CAPITAL LETTER YERU - 0x042C,0x845D, // CYRILLIC CAPITAL LETTER SOFT SIGN - 0x042D,0x845E, // CYRILLIC CAPITAL LETTER E - 0x042E,0x845F, // CYRILLIC CAPITAL LETTER YU - 0x042F,0x8460, // CYRILLIC CAPITAL LETTER YA - 0x0430,0x8470, // CYRILLIC SMALL LETTER A - 0x0431,0x8471, // CYRILLIC SMALL LETTER BE - 0x0432,0x8472, // CYRILLIC SMALL LETTER VE - 0x0433,0x8473, // CYRILLIC SMALL LETTER GHE - 0x0434,0x8474, // CYRILLIC SMALL LETTER DE - 0x0435,0x8475, // CYRILLIC SMALL LETTER IE - 0x0436,0x8477, // CYRILLIC SMALL LETTER ZHE - 0x0437,0x8478, // CYRILLIC SMALL LETTER ZE - 0x0438,0x8479, // CYRILLIC SMALL LETTER I - 0x0439,0x847A, // CYRILLIC SMALL LETTER SHORT I - 0x043A,0x847B, // CYRILLIC SMALL LETTER KA - 0x043B,0x847C, // CYRILLIC SMALL LETTER EL - 0x043C,0x847D, // CYRILLIC SMALL LETTER EM - 0x043D,0x847E, // CYRILLIC SMALL LETTER EN - 0x043E,0x8480, // CYRILLIC SMALL LETTER O - 0x043F,0x8481, // CYRILLIC SMALL LETTER PE - 0x0440,0x8482, // CYRILLIC SMALL LETTER ER - 0x0441,0x8483, // CYRILLIC SMALL LETTER ES - 0x0442,0x8484, // CYRILLIC SMALL LETTER TE - 0x0443,0x8485, // CYRILLIC SMALL LETTER U - 0x0444,0x8486, // CYRILLIC SMALL LETTER EF - 0x0445,0x8487, // CYRILLIC SMALL LETTER HA - 0x0446,0x8488, // CYRILLIC SMALL LETTER TSE - 0x0447,0x8489, // CYRILLIC SMALL LETTER CHE - 0x0448,0x848A, // CYRILLIC SMALL LETTER SHA - 0x0449,0x848B, // CYRILLIC SMALL LETTER SHCHA - 0x044A,0x848C, // CYRILLIC SMALL LETTER HARD SIGN - 0x044B,0x848D, // CYRILLIC SMALL LETTER YERU - 0x044C,0x848E, // CYRILLIC SMALL LETTER SOFT SIGN - 0x044D,0x848F, // CYRILLIC SMALL LETTER E - 0x044E,0x8490, // CYRILLIC SMALL LETTER YU - 0x044F,0x8491, // CYRILLIC SMALL LETTER YA - 0x0451,0x8476, // CYRILLIC SMALL LETTER IO - 0x2010,0x815D, // HYPHEN - 0x2014,0x815C, // EM DASH - 0x2016,0x8161, // DOUBLE VERTICAL LINE - 0x2018,0x8165, // LEFT SINGLE QUOTATION MARK - 0x2019,0x8166, // RIGHT SINGLE QUOTATION MARK - 0x201C,0x8167, // LEFT DOUBLE QUOTATION MARK - 0x201D,0x8168, // RIGHT DOUBLE QUOTATION MARK - 0x2020,0x81F5, // DAGGER - 0x2021,0x81F6, // DOUBLE DAGGER - 0x2025,0x8164, // TWO DOT LEADER - 0x2026,0x8163, // HORIZONTAL ELLIPSIS - 0x2030,0x81F1, // PER MILLE SIGN - 0x2032,0x818C, // PRIME - 0x2033,0x818D, // DOUBLE PRIME - 0x203B,0x81A6, // REFERENCE MARK - 0x2103,0x818E, // DEGREE CELSIUS - 0x212B,0x81F0, // ANGSTROM SIGN - 0x2190,0x81A9, // LEFTWARDS ARROW - 0x2191,0x81AA, // UPWARDS ARROW - 0x2192,0x81A8, // RIGHTWARDS ARROW - 0x2193,0x81AB, // DOWNWARDS ARROW - 0x21D2,0x81CB, // RIGHTWARDS DOUBLE ARROW - 0x21D4,0x81CC, // LEFT RIGHT DOUBLE ARROW - 0x2200,0x81CD, // FOR ALL - 0x2202,0x81DD, // PARTIAL DIFFERENTIAL - 0x2203,0x81CE, // THERE EXISTS - 0x2207,0x81DE, // NABLA - 0x2208,0x81B8, // ELEMENT OF - 0x220B,0x81B9, // CONTAINS AS MEMBER - 0x2212,0x817C, // MINUS SIGN - 0x221A,0x81E3, // SQUARE ROOT - 0x221D,0x81E5, // PROPORTIONAL TO - 0x221E,0x8187, // INFINITY - 0x2220,0x81DA, // ANGLE - 0x2227,0x81C8, // LOGICAL AND - 0x2228,0x81C9, // LOGICAL OR - 0x2229,0x81BF, // INTERSECTION - 0x222A,0x81BE, // UNION - 0x222B,0x81E7, // INTEGRAL - 0x222C,0x81E8, // DOUBLE INTEGRAL - 0x2234,0x8188, // THEREFORE - 0x2235,0x81E6, // BECAUSE - 0x223D,0x81E4, // REVERSED TILDE - 0x2252,0x81E0, // APPROXIMATELY EQUAL TO OR THE IMAGE OF - 0x2260,0x8182, // NOT EQUAL TO - 0x2261,0x81DF, // IDENTICAL TO - 0x2266,0x8185, // LESS-THAN OVER EQUAL TO - 0x2267,0x8186, // GREATER-THAN OVER EQUAL TO - 0x226A,0x81E1, // MUCH LESS-THAN - 0x226B,0x81E2, // MUCH GREATER-THAN - 0x2282,0x81BC, // SUBSET OF - 0x2283,0x81BD, // SUPERSET OF - 0x2286,0x81BA, // SUBSET OF OR EQUAL TO - 0x2287,0x81BB, // SUPERSET OF OR EQUAL TO - 0x22A5,0x81DB, // UP TACK - 0x2312,0x81DC, // ARC - 0x2500,0x849F, // BOX DRAWINGS LIGHT HORIZONTAL - 0x2501,0x84AA, // BOX DRAWINGS HEAVY HORIZONTAL - 0x2502,0x84A0, // BOX DRAWINGS LIGHT VERTICAL - 0x2503,0x84AB, // BOX DRAWINGS HEAVY VERTICAL - 0x250C,0x84A1, // BOX DRAWINGS LIGHT DOWN AND RIGHT - 0x250F,0x84AC, // BOX DRAWINGS HEAVY DOWN AND RIGHT - 0x2510,0x84A2, // BOX DRAWINGS LIGHT DOWN AND LEFT - 0x2513,0x84AD, // BOX DRAWINGS HEAVY DOWN AND LEFT - 0x2514,0x84A4, // BOX DRAWINGS LIGHT UP AND RIGHT - 0x2517,0x84AF, // BOX DRAWINGS HEAVY UP AND RIGHT - 0x2518,0x84A3, // BOX DRAWINGS LIGHT UP AND LEFT - 0x251B,0x84AE, // BOX DRAWINGS HEAVY UP AND LEFT - 0x251C,0x84A5, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT - 0x251D,0x84BA, // BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY - 0x2520,0x84B5, // BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT - 0x2523,0x84B0, // BOX DRAWINGS HEAVY VERTICAL AND RIGHT - 0x2524,0x84A7, // BOX DRAWINGS LIGHT VERTICAL AND LEFT - 0x2525,0x84BC, // BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY - 0x2528,0x84B7, // BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT - 0x252B,0x84B2, // BOX DRAWINGS HEAVY VERTICAL AND LEFT - 0x252C,0x84A6, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL - 0x252F,0x84B6, // BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY - 0x2530,0x84BB, // BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT - 0x2533,0x84B1, // BOX DRAWINGS HEAVY DOWN AND HORIZONTAL - 0x2534,0x84A8, // BOX DRAWINGS LIGHT UP AND HORIZONTAL - 0x2537,0x84B8, // BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY - 0x2538,0x84BD, // BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT - 0x253B,0x84B3, // BOX DRAWINGS HEAVY UP AND HORIZONTAL - 0x253C,0x84A9, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL - 0x253F,0x84B9, // BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY - 0x2542,0x84BE, // BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT - 0x254B,0x84B4, // BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL - 0x25A0,0x81A1, // BLACK SQUARE - 0x25A1,0x81A0, // WHITE SQUARE - 0x25B2,0x81A3, // BLACK UP-POINTING TRIANGLE - 0x25B3,0x81A2, // WHITE UP-POINTING TRIANGLE - 0x25BC,0x81A5, // BLACK DOWN-POINTING TRIANGLE - 0x25BD,0x81A4, // WHITE DOWN-POINTING TRIANGLE - 0x25C6,0x819F, // BLACK DIAMOND - 0x25C7,0x819E, // WHITE DIAMOND - 0x25CB,0x819B, // WHITE CIRCLE - 0x25CE,0x819D, // BULLSEYE - 0x25CF,0x819C, // BLACK CIRCLE - 0x25EF,0x81FC, // LARGE CIRCLE - 0x2605,0x819A, // BLACK STAR - 0x2606,0x8199, // WHITE STAR - 0x2640,0x818A, // FEMALE SIGN - 0x2642,0x8189, // MALE SIGN - 0x266A,0x81F4, // EIGHTH NOTE - 0x266D,0x81F3, // MUSIC FLAT SIGN - 0x266F,0x81F2, // MUSIC SHARP SIGN - 0x3000,0x8140, // IDEOGRAPHIC SPACE - 0x3001,0x8141, // IDEOGRAPHIC COMMA - 0x3002,0x8142, // IDEOGRAPHIC FULL STOP - 0x3003,0x8156, // DITTO MARK - 0x3005,0x8158, // IDEOGRAPHIC ITERATION MARK - 0x3006,0x8159, // IDEOGRAPHIC CLOSING MARK - 0x3007,0x815A, // IDEOGRAPHIC NUMBER ZERO - 0x3008,0x8171, // LEFT ANGLE BRACKET - 0x3009,0x8172, // RIGHT ANGLE BRACKET - 0x300A,0x8173, // LEFT DOUBLE ANGLE BRACKET - 0x300B,0x8174, // RIGHT DOUBLE ANGLE BRACKET - 0x300C,0x8175, // LEFT CORNER BRACKET - 0x300D,0x8176, // RIGHT CORNER BRACKET - 0x300E,0x8177, // LEFT WHITE CORNER BRACKET - 0x300F,0x8178, // RIGHT WHITE CORNER BRACKET - 0x3010,0x8179, // LEFT BLACK LENTICULAR BRACKET - 0x3011,0x817A, // RIGHT BLACK LENTICULAR BRACKET - 0x3012,0x81A7, // POSTAL MARK - 0x3013,0x81AC, // GETA MARK - 0x3014,0x816B, // LEFT TORTOISE SHELL BRACKET - 0x3015,0x816C, // RIGHT TORTOISE SHELL BRACKET - 0x301C,0x8160, // WAVE DASH - 0x3041,0x829F, // HIRAGANA LETTER SMALL A - 0x3042,0x82A0, // HIRAGANA LETTER A - 0x3043,0x82A1, // HIRAGANA LETTER SMALL I - 0x3044,0x82A2, // HIRAGANA LETTER I - 0x3045,0x82A3, // HIRAGANA LETTER SMALL U - 0x3046,0x82A4, // HIRAGANA LETTER U - 0x3047,0x82A5, // HIRAGANA LETTER SMALL E - 0x3048,0x82A6, // HIRAGANA LETTER E - 0x3049,0x82A7, // HIRAGANA LETTER SMALL O - 0x304A,0x82A8, // HIRAGANA LETTER O - 0x304B,0x82A9, // HIRAGANA LETTER KA - 0x304C,0x82AA, // HIRAGANA LETTER GA - 0x304D,0x82AB, // HIRAGANA LETTER KI - 0x304E,0x82AC, // HIRAGANA LETTER GI - 0x304F,0x82AD, // HIRAGANA LETTER KU - 0x3050,0x82AE, // HIRAGANA LETTER GU - 0x3051,0x82AF, // HIRAGANA LETTER KE - 0x3052,0x82B0, // HIRAGANA LETTER GE - 0x3053,0x82B1, // HIRAGANA LETTER KO - 0x3054,0x82B2, // HIRAGANA LETTER GO - 0x3055,0x82B3, // HIRAGANA LETTER SA - 0x3056,0x82B4, // HIRAGANA LETTER ZA - 0x3057,0x82B5, // HIRAGANA LETTER SI - 0x3058,0x82B6, // HIRAGANA LETTER ZI - 0x3059,0x82B7, // HIRAGANA LETTER SU - 0x305A,0x82B8, // HIRAGANA LETTER ZU - 0x305B,0x82B9, // HIRAGANA LETTER SE - 0x305C,0x82BA, // HIRAGANA LETTER ZE - 0x305D,0x82BB, // HIRAGANA LETTER SO - 0x305E,0x82BC, // HIRAGANA LETTER ZO - 0x305F,0x82BD, // HIRAGANA LETTER TA - 0x3060,0x82BE, // HIRAGANA LETTER DA - 0x3061,0x82BF, // HIRAGANA LETTER TI - 0x3062,0x82C0, // HIRAGANA LETTER DI - 0x3063,0x82C1, // HIRAGANA LETTER SMALL TU - 0x3064,0x82C2, // HIRAGANA LETTER TU - 0x3065,0x82C3, // HIRAGANA LETTER DU - 0x3066,0x82C4, // HIRAGANA LETTER TE - 0x3067,0x82C5, // HIRAGANA LETTER DE - 0x3068,0x82C6, // HIRAGANA LETTER TO - 0x3069,0x82C7, // HIRAGANA LETTER DO - 0x306A,0x82C8, // HIRAGANA LETTER NA - 0x306B,0x82C9, // HIRAGANA LETTER NI - 0x306C,0x82CA, // HIRAGANA LETTER NU - 0x306D,0x82CB, // HIRAGANA LETTER NE - 0x306E,0x82CC, // HIRAGANA LETTER NO - 0x306F,0x82CD, // HIRAGANA LETTER HA - 0x3070,0x82CE, // HIRAGANA LETTER BA - 0x3071,0x82CF, // HIRAGANA LETTER PA - 0x3072,0x82D0, // HIRAGANA LETTER HI - 0x3073,0x82D1, // HIRAGANA LETTER BI - 0x3074,0x82D2, // HIRAGANA LETTER PI - 0x3075,0x82D3, // HIRAGANA LETTER HU - 0x3076,0x82D4, // HIRAGANA LETTER BU - 0x3077,0x82D5, // HIRAGANA LETTER PU - 0x3078,0x82D6, // HIRAGANA LETTER HE - 0x3079,0x82D7, // HIRAGANA LETTER BE - 0x307A,0x82D8, // HIRAGANA LETTER PE - 0x307B,0x82D9, // HIRAGANA LETTER HO - 0x307C,0x82DA, // HIRAGANA LETTER BO - 0x307D,0x82DB, // HIRAGANA LETTER PO - 0x307E,0x82DC, // HIRAGANA LETTER MA - 0x307F,0x82DD, // HIRAGANA LETTER MI - 0x3080,0x82DE, // HIRAGANA LETTER MU - 0x3081,0x82DF, // HIRAGANA LETTER ME - 0x3082,0x82E0, // HIRAGANA LETTER MO - 0x3083,0x82E1, // HIRAGANA LETTER SMALL YA - 0x3084,0x82E2, // HIRAGANA LETTER YA - 0x3085,0x82E3, // HIRAGANA LETTER SMALL YU - 0x3086,0x82E4, // HIRAGANA LETTER YU - 0x3087,0x82E5, // HIRAGANA LETTER SMALL YO - 0x3088,0x82E6, // HIRAGANA LETTER YO - 0x3089,0x82E7, // HIRAGANA LETTER RA - 0x308A,0x82E8, // HIRAGANA LETTER RI - 0x308B,0x82E9, // HIRAGANA LETTER RU - 0x308C,0x82EA, // HIRAGANA LETTER RE - 0x308D,0x82EB, // HIRAGANA LETTER RO - 0x308E,0x82EC, // HIRAGANA LETTER SMALL WA - 0x308F,0x82ED, // HIRAGANA LETTER WA - 0x3090,0x82EE, // HIRAGANA LETTER WI - 0x3091,0x82EF, // HIRAGANA LETTER WE - 0x3092,0x82F0, // HIRAGANA LETTER WO - 0x3093,0x82F1, // HIRAGANA LETTER N - 0x309B,0x814A, // KATAKANA-HIRAGANA VOICED SOUND MARK - 0x309C,0x814B, // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK - 0x309D,0x8154, // HIRAGANA ITERATION MARK - 0x309E,0x8155, // HIRAGANA VOICED ITERATION MARK - 0x30A1,0x8340, // KATAKANA LETTER SMALL A - 0x30A2,0x8341, // KATAKANA LETTER A - 0x30A3,0x8342, // KATAKANA LETTER SMALL I - 0x30A4,0x8343, // KATAKANA LETTER I - 0x30A5,0x8344, // KATAKANA LETTER SMALL U - 0x30A6,0x8345, // KATAKANA LETTER U - 0x30A7,0x8346, // KATAKANA LETTER SMALL E - 0x30A8,0x8347, // KATAKANA LETTER E - 0x30A9,0x8348, // KATAKANA LETTER SMALL O - 0x30AA,0x8349, // KATAKANA LETTER O - 0x30AB,0x834A, // KATAKANA LETTER KA - 0x30AC,0x834B, // KATAKANA LETTER GA - 0x30AD,0x834C, // KATAKANA LETTER KI - 0x30AE,0x834D, // KATAKANA LETTER GI - 0x30AF,0x834E, // KATAKANA LETTER KU - 0x30B0,0x834F, // KATAKANA LETTER GU - 0x30B1,0x8350, // KATAKANA LETTER KE - 0x30B2,0x8351, // KATAKANA LETTER GE - 0x30B3,0x8352, // KATAKANA LETTER KO - 0x30B4,0x8353, // KATAKANA LETTER GO - 0x30B5,0x8354, // KATAKANA LETTER SA - 0x30B6,0x8355, // KATAKANA LETTER ZA - 0x30B7,0x8356, // KATAKANA LETTER SI - 0x30B8,0x8357, // KATAKANA LETTER ZI - 0x30B9,0x8358, // KATAKANA LETTER SU - 0x30BA,0x8359, // KATAKANA LETTER ZU - 0x30BB,0x835A, // KATAKANA LETTER SE - 0x30BD,0x835C, // KATAKANA LETTER SO - 0x30BE,0x835D, // KATAKANA LETTER ZO - 0x30BF,0x835E, // KATAKANA LETTER TA - 0x30C0,0x835F, // KATAKANA LETTER DA - 0x30C1,0x8360, // KATAKANA LETTER TI - 0x30C2,0x8361, // KATAKANA LETTER DI - 0x30C3,0x8362, // KATAKANA LETTER SMALL TU - 0x30C4,0x8363, // KATAKANA LETTER TU - 0x30C5,0x8364, // KATAKANA LETTER DU - 0x30C6,0x8365, // KATAKANA LETTER TE - 0x30C7,0x8366, // KATAKANA LETTER DE - 0x30C8,0x8367, // KATAKANA LETTER TO - 0x30C9,0x8368, // KATAKANA LETTER DO - 0x30CA,0x8369, // KATAKANA LETTER NA - 0x30CB,0x836A, // KATAKANA LETTER NI - 0x30CC,0x836B, // KATAKANA LETTER NU - 0x30CD,0x836C, // KATAKANA LETTER NE - 0x30CE,0x836D, // KATAKANA LETTER NO - 0x30CF,0x836E, // KATAKANA LETTER HA - 0x30D0,0x836F, // KATAKANA LETTER BA - 0x30D1,0x8370, // KATAKANA LETTER PA - 0x30D2,0x8371, // KATAKANA LETTER HI - 0x30D3,0x8372, // KATAKANA LETTER BI - 0x30D4,0x8373, // KATAKANA LETTER PI - 0x30D5,0x8374, // KATAKANA LETTER HU - 0x30D6,0x8375, // KATAKANA LETTER BU - 0x30D7,0x8376, // KATAKANA LETTER PU - 0x30D8,0x8377, // KATAKANA LETTER HE - 0x30D9,0x8378, // KATAKANA LETTER BE - 0x30DA,0x8379, // KATAKANA LETTER PE - 0x30DB,0x837A, // KATAKANA LETTER HO - 0x30DC,0x837B, // KATAKANA LETTER BO - 0x30DD,0x837C, // KATAKANA LETTER PO - 0x30DE,0x837D, // KATAKANA LETTER MA - 0x30DF,0x837E, // KATAKANA LETTER MI - 0x30E0,0x8380, // KATAKANA LETTER MU - 0x30E1,0x8381, // KATAKANA LETTER ME - 0x30E2,0x8382, // KATAKANA LETTER MO - 0x30E3,0x8383, // KATAKANA LETTER SMALL YA - 0x30E4,0x8384, // KATAKANA LETTER YA - 0x30E5,0x8385, // KATAKANA LETTER SMALL YU - 0x30E6,0x8386, // KATAKANA LETTER YU - 0x30E7,0x8387, // KATAKANA LETTER SMALL YO - 0x30E8,0x8388, // KATAKANA LETTER YO - 0x30E9,0x8389, // KATAKANA LETTER RA - 0x30EA,0x838A, // KATAKANA LETTER RI - 0x30EB,0x838B, // KATAKANA LETTER RU - 0x30EC,0x838C, // KATAKANA LETTER RE - 0x30ED,0x838D, // KATAKANA LETTER RO - 0x30EE,0x838E, // KATAKANA LETTER SMALL WA - 0x30EF,0x838F, // KATAKANA LETTER WA - 0x30F0,0x8390, // KATAKANA LETTER WI - 0x30F1,0x8391, // KATAKANA LETTER WE - 0x30F2,0x8392, // KATAKANA LETTER WO - 0x30F3,0x8393, // KATAKANA LETTER N - 0x30F4,0x8394, // KATAKANA LETTER VU - 0x30F5,0x8395, // KATAKANA LETTER SMALL KA - 0x30F6,0x8396, // KATAKANA LETTER SMALL KE - 0x30FB,0x8145, // KATAKANA MIDDLE DOT - 0x30FD,0x8152, // KATAKANA ITERATION MARK - 0x30FE,0x8153, // KATAKANA VOICED ITERATION MARK - 0x4E00,0x88EA, // - 0x4E01,0x929A, // - 0x4E03,0x8EB5, // - 0x4E07,0x969C, // - 0x4E08,0x8FE4, // - 0x4E09,0x8E4F, // - 0x4E0A,0x8FE3, // - 0x4E0B,0x89BA, // - 0x4E0D,0x9573, // - 0x4E0E,0x975E, // - 0x4E10,0x98A0, // - 0x4E11,0x894E, // - 0x4E14,0x8A8E, // - 0x4E15,0x98A1, // - 0x4E16,0x90A2, // - 0x4E17,0x99C0, // - 0x4E18,0x8B75, // - 0x4E19,0x95B8, // - 0x4E1E,0x8FE5, // - 0x4E21,0x97BC, // - 0x4E26,0x95C0, // - 0x4E2A,0x98A2, // - 0x4E2D,0x9286, // - 0x4E31,0x98A3, // - 0x4E32,0x8BF8, // - 0x4E36,0x98A4, // - 0x4E38,0x8ADB, // - 0x4E39,0x924F, // - 0x4E3B,0x8EE5, // - 0x4E3C,0x98A5, // - 0x4E3F,0x98A6, // - 0x4E42,0x98A7, // - 0x4E43,0x9454, // - 0x4E45,0x8B76, // - 0x4E4B,0x9456, // - 0x4E4D,0x93E1, // - 0x4E4E,0x8CC1, // - 0x4E4F,0x9652, // - 0x4E55,0xE568, // - 0x4E56,0x98A8, // - 0x4E57,0x8FE6, // - 0x4E58,0x98A9, // - 0x4E59,0x89B3, // - 0x4E5D,0x8BE3, // - 0x4E5E,0x8CEE, // - 0x4E5F,0x96E7, // - 0x4E62,0x9BA4, // - 0x4E71,0x9790, // - 0x4E73,0x93FB, // - 0x4E7E,0x8AA3, // - 0x4E80,0x8B54, // - 0x4E82,0x98AA, // - 0x4E85,0x98AB, // - 0x4E86,0x97B9, // - 0x4E88,0x975C, // - 0x4E89,0x9188, // - 0x4E8A,0x98AD, // - 0x4E8B,0x8E96, // - 0x4E8C,0x93F1, // - 0x4E8E,0x98B0, // - 0x4E91,0x895D, // - 0x4E92,0x8CDD, // - 0x4E94,0x8CDC, // - 0x4E95,0x88E4, // - 0x4E98,0x986A, // - 0x4E99,0x9869, // - 0x4E9B,0x8DB1, // - 0x4E9C,0x889F, // - 0x4E9E,0x98B1, // - 0x4E9F,0x98B2, // - 0x4EA0,0x98B3, // - 0x4EA1,0x9653, // - 0x4EA2,0x98B4, // - 0x4EA4,0x8CF0, // - 0x4EA5,0x88E5, // - 0x4EA6,0x9692, // - 0x4EA8,0x8B9C, // - 0x4EAB,0x8B9D, // - 0x4EAC,0x8B9E, // - 0x4EAD,0x92E0, // - 0x4EAE,0x97BA, // - 0x4EB0,0x98B5, // - 0x4EB3,0x98B6, // - 0x4EB6,0x98B7, // - 0x4EBA,0x906C, // - 0x4EC0,0x8F59, // - 0x4EC1,0x906D, // - 0x4EC2,0x98BC, // - 0x4EC4,0x98BA, // - 0x4EC6,0x98BB, // - 0x4EC7,0x8B77, // - 0x4ECA,0x8DA1, // - 0x4ECB,0x89EE, // - 0x4ECD,0x98B9, // - 0x4ECE,0x98B8, // - 0x4ECF,0x95A7, // - 0x4ED4,0x8E65, // - 0x4ED5,0x8E64, // - 0x4ED6,0x91BC, // - 0x4ED7,0x98BD, // - 0x4ED8,0x9574, // - 0x4ED9,0x90E5, // - 0x4EDD,0x8157, // - 0x4EDE,0x98BE, // - 0x4EDF,0x98C0, // - 0x4EE3,0x91E3, // - 0x4EE4,0x97DF, // - 0x4EE5,0x88C8, // - 0x4EED,0x98BF, // - 0x4EEE,0x89BC, // - 0x4EF0,0x8BC2, // - 0x4EF2,0x9287, // - 0x4EF6,0x8C8F, // - 0x4EF7,0x98C1, // - 0x4EFB,0x9443, // - 0x4F01,0x8AE9, // - 0x4F09,0x98C2, // - 0x4F0A,0x88C9, // - 0x4F0D,0x8CDE, // - 0x4F0E,0x8AEA, // - 0x4F0F,0x959A, // - 0x4F10,0x94B0, // - 0x4F11,0x8B78, // - 0x4F1A,0x89EF, // - 0x4F1C,0x98E5, // - 0x4F1D,0x9360, // - 0x4F2F,0x948C, // - 0x4F30,0x98C4, // - 0x4F34,0x94BA, // - 0x4F36,0x97E0, // - 0x4F38,0x904C, // - 0x4F3A,0x8E66, // - 0x4F3C,0x8E97, // - 0x4F3D,0x89BE, // - 0x4F43,0x92CF, // - 0x4F46,0x9241, // - 0x4F47,0x98C8, // - 0x4F4D,0x88CA, // - 0x4F4E,0x92E1, // - 0x4F4F,0x8F5A, // - 0x4F50,0x8DB2, // - 0x4F51,0x9743, // - 0x4F53,0x91CC, // - 0x4F55,0x89BD, // - 0x4F57,0x98C7, // - 0x4F59,0x975D, // - 0x4F5A,0x98C3, // - 0x4F5B,0x98C5, // - 0x4F5C,0x8DEC, // - 0x4F5D,0x98C6, // - 0x4F5E,0x9B43, // - 0x4F69,0x98CE, // - 0x4F6F,0x98D1, // - 0x4F70,0x98CF, // - 0x4F73,0x89C0, // - 0x4F75,0x95B9, // - 0x4F76,0x98C9, // - 0x4F7B,0x98CD, // - 0x4F7C,0x8CF1, // - 0x4F7F,0x8E67, // - 0x4F83,0x8AA4, // - 0x4F86,0x98D2, // - 0x4F88,0x98CA, // - 0x4F8B,0x97E1, // - 0x4F8D,0x8E98, // - 0x4F8F,0x98CB, // - 0x4F91,0x98D0, // - 0x4F96,0x98D3, // - 0x4F98,0x98CC, // - 0x4F9B,0x8B9F, // - 0x4F9D,0x88CB, // - 0x4FA0,0x8BA0, // - 0x4FA1,0x89BF, // - 0x4FAB,0x9B44, // - 0x4FAD,0x9699, // - 0x4FAE,0x958E, // - 0x4FAF,0x8CF2, // - 0x4FB5,0x904E, // - 0x4FB6,0x97B5, // - 0x4FBF,0x95D6, // - 0x4FC2,0x8C57, // - 0x4FC3,0x91A3, // - 0x4FC4,0x89E2, // - 0x4FCA,0x8F72, // - 0x4FCE,0x98D7, // - 0x4FD0,0x98DC, // - 0x4FD1,0x98DA, // - 0x4FD4,0x98D5, // - 0x4FD7,0x91AD, // - 0x4FD8,0x98D8, // - 0x4FDA,0x98DB, // - 0x4FDB,0x98D9, // - 0x4FDD,0x95DB, // - 0x4FDF,0x98D6, // - 0x4FE1,0x904D, // - 0x4FE3,0x9693, // - 0x4FE4,0x98DD, // - 0x4FE5,0x98DE, // - 0x4FEE,0x8F43, // - 0x4FEF,0x98EB, // - 0x4FF3,0x946F, // - 0x4FF5,0x9555, // - 0x4FF6,0x98E6, // - 0x4FF8,0x95EE, // - 0x4FFA,0x89B4, // - 0x4FFE,0x98EA, // - 0x5005,0x98E4, // - 0x5006,0x98ED, // - 0x5009,0x9171, // - 0x500B,0x8CC2, // - 0x500D,0x947B, // - 0x500F,0xE0C5, // - 0x5011,0x98EC, // - 0x5012,0x937C, // - 0x5014,0x98E1, // - 0x5016,0x8CF4, // - 0x5019,0x8CF3, // - 0x501A,0x98DF, // - 0x501F,0x8ED8, // - 0x5021,0x98E7, // - 0x5023,0x95ED, // - 0x5024,0x926C, // - 0x5025,0x98E3, // - 0x5026,0x8C91, // - 0x5028,0x98E0, // - 0x5029,0x98E8, // - 0x502A,0x98E2, // - 0x502B,0x97CF, // - 0x502C,0x98E9, // - 0x502D,0x9860, // - 0x5036,0x8BE4, // - 0x5039,0x8C90, // - 0x5043,0x98EE, // - 0x5047,0x98EF, // - 0x5048,0x98F3, // - 0x5049,0x88CC, // - 0x504F,0x95CE, // - 0x5050,0x98F2, // - 0x5055,0x98F1, // - 0x5056,0x98F5, // - 0x505A,0x98F4, // - 0x505C,0x92E2, // - 0x5065,0x8C92, // - 0x506C,0x98F6, // - 0x5072,0x8EC3, // - 0x5074,0x91A4, // - 0x5075,0x92E3, // - 0x5076,0x8BF4, // - 0x5078,0x98F7, // - 0x507D,0x8B55, // - 0x5080,0x98F8, // - 0x5085,0x98FA, // - 0x508D,0x9654, // - 0x5091,0x8C86, // - 0x5098,0x8E50, // - 0x5099,0x94F5, // - 0x509A,0x98F9, // - 0x50AC,0x8DC3, // - 0x50AD,0x9762, // - 0x50B2,0x98FC, // - 0x50B3,0x9942, // - 0x50B4,0x98FB, // - 0x50B5,0x8DC2, // - 0x50B7,0x8F9D, // - 0x50BE,0x8C58, // - 0x50C2,0x9943, // - 0x50C5,0x8BCD, // - 0x50C9,0x9940, // - 0x50CA,0x9941, // - 0x50CD,0x93AD, // - 0x50CF,0x919C, // - 0x50D1,0x8BA1, // - 0x50D5,0x966C, // - 0x50D6,0x9944, // - 0x50DA,0x97BB, // - 0x50DE,0x9945, // - 0x50E3,0x9948, // - 0x50E5,0x9946, // - 0x50E7,0x916D, // - 0x50ED,0x9947, // - 0x50EE,0x9949, // - 0x50F5,0x994B, // - 0x50F9,0x994A, // - 0x50FB,0x95C6, // - 0x5100,0x8B56, // - 0x5101,0x994D, // - 0x5102,0x994E, // - 0x5104,0x89AD, // - 0x5109,0x994C, // - 0x5112,0x8EF2, // - 0x5114,0x9951, // - 0x5115,0x9950, // - 0x5116,0x994F, // - 0x5118,0x98D4, // - 0x511A,0x9952, // - 0x511F,0x8F9E, // - 0x5121,0x9953, // - 0x512A,0x9744, // - 0x5132,0x96D7, // - 0x5137,0x9955, // - 0x513A,0x9954, // - 0x513B,0x9957, // - 0x513C,0x9956, // - 0x513F,0x9958, // - 0x5140,0x9959, // - 0x5141,0x88F2, // - 0x5143,0x8CB3, // - 0x5144,0x8C5A, // - 0x5146,0x929B, // - 0x5147,0x8BA2, // - 0x5148,0x90E6, // - 0x5149,0x8CF5, // - 0x514B,0x8D8E, // - 0x514D,0x96C6, // - 0x514E,0x9365, // - 0x5150,0x8E99, // - 0x5152,0x995A, // - 0x5154,0x995C, // - 0x515A,0x937D, // - 0x515C,0x8A95, // - 0x5162,0x995D, // - 0x5165,0x93FC, // - 0x5168,0x9153, // - 0x5169,0x995F, // - 0x516A,0x9960, // - 0x516B,0x94AA, // - 0x516C,0x8CF6, // - 0x516D,0x985A, // - 0x516E,0x9961, // - 0x5171,0x8BA4, // - 0x5175,0x95BA, // - 0x5176,0x91B4, // - 0x5177,0x8BEF, // - 0x5178,0x9354, // - 0x517C,0x8C93, // - 0x5180,0x9962, // - 0x5182,0x9963, // - 0x5185,0x93E0, // - 0x5186,0x897E, // - 0x5189,0x9966, // - 0x518A,0x8DFB, // - 0x518C,0x9965, // - 0x518D,0x8DC4, // - 0x518F,0x9967, // - 0x5190,0xE3EC, // - 0x5191,0x9968, // - 0x5192,0x9660, // - 0x5193,0x9969, // - 0x5195,0x996A, // - 0x5196,0x996B, // - 0x5197,0x8FE7, // - 0x5199,0x8ECA, // - 0x51A0,0x8AA5, // - 0x51A2,0x996E, // - 0x51A4,0x996C, // - 0x51A5,0x96BB, // - 0x51A6,0x996D, // - 0x51A8,0x9579, // - 0x51A9,0x996F, // - 0x51AA,0x9970, // - 0x51AB,0x9971, // - 0x51AC,0x937E, // - 0x51B0,0x9975, // - 0x51B1,0x9973, // - 0x51B2,0x9974, // - 0x51B3,0x9972, // - 0x51B4,0x8DE1, // - 0x51B5,0x9976, // - 0x51B6,0x96E8, // - 0x51B7,0x97E2, // - 0x51BD,0x9977, // - 0x51C4,0x90A6, // - 0x51C5,0x9978, // - 0x51C6,0x8F79, // - 0x51C9,0x9979, // - 0x51CB,0x929C, // - 0x51CC,0x97BD, // - 0x51CD,0x9380, // - 0x51D6,0x99C3, // - 0x51DB,0x997A, // - 0x51DC,0xEAA3, // - 0x51DD,0x8BC3, // - 0x51E0,0x997B, // - 0x51E1,0x967D, // - 0x51E6,0x8F88, // - 0x51E7,0x91FA, // - 0x51E9,0x997D, // - 0x51EA,0x93E2, // - 0x51ED,0x997E, // - 0x51F0,0x9980, // - 0x51F1,0x8A4D, // - 0x51F5,0x9981, // - 0x51F6,0x8BA5, // - 0x51F8,0x93CA, // - 0x51F9,0x899A, // - 0x51FA,0x8F6F, // - 0x51FD,0x949F, // - 0x51FE,0x9982, // - 0x5200,0x9381, // - 0x5203,0x906E, // - 0x5204,0x9983, // - 0x5206,0x95AA, // - 0x5207,0x90D8, // - 0x5208,0x8AA0, // - 0x520A,0x8AA7, // - 0x520B,0x9984, // - 0x520E,0x9986, // - 0x5211,0x8C59, // - 0x5214,0x9985, // - 0x5217,0x97F1, // - 0x521D,0x8F89, // - 0x5224,0x94BB, // - 0x5225,0x95CA, // - 0x5227,0x9987, // - 0x5229,0x9798, // - 0x522A,0x9988, // - 0x522E,0x9989, // - 0x5230,0x939E, // - 0x5233,0x998A, // - 0x5236,0x90A7, // - 0x5237,0x8DFC, // - 0x5238,0x8C94, // - 0x5239,0x998B, // - 0x523A,0x8E68, // - 0x523B,0x8D8F, // - 0x5243,0x92E4, // - 0x5244,0x998D, // - 0x5247,0x91A5, // - 0x524A,0x8DED, // - 0x524B,0x998E, // - 0x524C,0x998F, // - 0x524D,0x914F, // - 0x524F,0x998C, // - 0x5254,0x9991, // - 0x5256,0x9655, // - 0x525B,0x8D84, // - 0x525E,0x9990, // - 0x5263,0x8C95, // - 0x5264,0x8DDC, // - 0x5265,0x948D, // - 0x5269,0x9994, // - 0x526A,0x9992, // - 0x526F,0x959B, // - 0x5270,0x8FE8, // - 0x5271,0x999B, // - 0x5272,0x8A84, // - 0x5273,0x9995, // - 0x5274,0x9993, // - 0x5275,0x916E, // - 0x527D,0x9997, // - 0x527F,0x9996, // - 0x5283,0x8A63, // - 0x5287,0x8C80, // - 0x5288,0x999C, // - 0x5289,0x97AB, // - 0x528D,0x9998, // - 0x5291,0x999D, // - 0x5292,0x999A, // - 0x5294,0x9999, // - 0x529B,0x97CD, // - 0x529F,0x8CF7, // - 0x52A0,0x89C1, // - 0x52A3,0x97F2, // - 0x52A9,0x8F95, // - 0x52AA,0x9377, // - 0x52AB,0x8D85, // - 0x52AC,0x99A0, // - 0x52AD,0x99A1, // - 0x52B1,0x97E3, // - 0x52B4,0x984A, // - 0x52B5,0x99A3, // - 0x52B9,0x8CF8, // - 0x52BC,0x99A2, // - 0x52BE,0x8A4E, // - 0x52C1,0x99A4, // - 0x52C3,0x9675, // - 0x52C5,0x92BA, // - 0x52C7,0x9745, // - 0x52C9,0x95D7, // - 0x52CD,0x99A5, // - 0x52D2,0xE8D3, // - 0x52D5,0x93AE, // - 0x52D7,0x99A6, // - 0x52D8,0x8AA8, // - 0x52D9,0x96B1, // - 0x52DD,0x8F9F, // - 0x52DE,0x99A7, // - 0x52DF,0x95E5, // - 0x52E0,0x99AB, // - 0x52E2,0x90A8, // - 0x52E3,0x99A8, // - 0x52E4,0x8BCE, // - 0x52E6,0x99A9, // - 0x52E7,0x8AA9, // - 0x52F2,0x8C4D, // - 0x52F3,0x99AC, // - 0x52F5,0x99AD, // - 0x52F8,0x99AE, // - 0x52F9,0x99AF, // - 0x52FA,0x8ED9, // - 0x52FE,0x8CF9, // - 0x52FF,0x96DC, // - 0x5301,0x96E6, // - 0x5302,0x93F5, // - 0x5305,0x95EF, // - 0x5306,0x99B0, // - 0x5308,0x99B1, // - 0x530D,0x99B3, // - 0x530F,0x99B5, // - 0x5310,0x99B4, // - 0x5315,0x99B6, // - 0x5316,0x89BB, // - 0x5317,0x966B, // - 0x5319,0x8DFA, // - 0x531A,0x99B7, // - 0x531D,0x9178, // - 0x5320,0x8FA0, // - 0x5321,0x8BA7, // - 0x5323,0x99B8, // - 0x532A,0x94D9, // - 0x532F,0x99B9, // - 0x5331,0x99BA, // - 0x5333,0x99BB, // - 0x5338,0x99BC, // - 0x5339,0x9543, // - 0x533A,0x8BE6, // - 0x533B,0x88E3, // - 0x533F,0x93BD, // - 0x5340,0x99BD, // - 0x5341,0x8F5C, // - 0x5343,0x90E7, // - 0x5345,0x99BF, // - 0x5346,0x99BE, // - 0x5347,0x8FA1, // - 0x5348,0x8CDF, // - 0x5349,0x99C1, // - 0x534A,0x94BC, // - 0x534D,0x99C2, // - 0x5351,0x94DA, // - 0x5352,0x91B2, // - 0x5353,0x91EC, // - 0x5354,0x8BA6, // - 0x5357,0x93EC, // - 0x5358,0x9250, // - 0x535A,0x948E, // - 0x535C,0x966D, // - 0x535E,0x99C4, // - 0x5360,0x90E8, // - 0x5366,0x8C54, // - 0x5369,0x99C5, // - 0x536E,0x99C6, // - 0x536F,0x894B, // - 0x5370,0x88F3, // - 0x5371,0x8AEB, // - 0x5373,0x91A6, // - 0x5374,0x8B70, // - 0x5375,0x9791, // - 0x5377,0x99C9, // - 0x5378,0x89B5, // - 0x537B,0x99C8, // - 0x537F,0x8BA8, // - 0x5382,0x99CA, // - 0x5384,0x96EF, // - 0x5396,0x99CB, // - 0x5398,0x97D0, // - 0x539A,0x8CFA, // - 0x539F,0x8CB4, // - 0x53A0,0x99CC, // - 0x53A5,0x99CE, // - 0x53A6,0x99CD, // - 0x53A8,0x907E, // - 0x53A9,0x8958, // - 0x53AD,0x897D, // - 0x53AE,0x99CF, // - 0x53B0,0x99D0, // - 0x53B3,0x8CB5, // - 0x53B6,0x99D1, // - 0x53BB,0x8B8E, // - 0x53C2,0x8E51, // - 0x53C3,0x99D2, // - 0x53C8,0x9694, // - 0x53C9,0x8DB3, // - 0x53CA,0x8B79, // - 0x53CB,0x9746, // - 0x53CC,0x916F, // - 0x53CD,0x94BD, // - 0x53CE,0x8EFB, // - 0x53D4,0x8F66, // - 0x53D6,0x8EE6, // - 0x53D7,0x8EF3, // - 0x53D9,0x8F96, // - 0x53DB,0x94BE, // - 0x53DF,0x99D5, // - 0x53E1,0x8962, // - 0x53E2,0x9170, // - 0x53E3,0x8CFB, // - 0x53E4,0x8CC3, // - 0x53E5,0x8BE5, // - 0x53E8,0x99D9, // - 0x53E9,0x9240, // - 0x53EA,0x91FC, // - 0x53EB,0x8BA9, // - 0x53EC,0x8FA2, // - 0x53ED,0x99DA, // - 0x53EE,0x99D8, // - 0x53EF,0x89C2, // - 0x53F0,0x91E4, // - 0x53F1,0x8EB6, // - 0x53F2,0x8E6A, // - 0x53F3,0x8945, // - 0x53F6,0x8A90, // - 0x53F7,0x8D86, // - 0x53F8,0x8E69, // - 0x53FA,0x99DB, // - 0x5401,0x99DC, // - 0x5403,0x8B68, // - 0x5404,0x8A65, // - 0x5408,0x8D87, // - 0x5409,0x8B67, // - 0x540A,0x92DD, // - 0x540B,0x8944, // - 0x540C,0x93AF, // - 0x540D,0x96BC, // - 0x540E,0x8D40, // - 0x540F,0x9799, // - 0x5410,0x9366, // - 0x5411,0x8CFC, // - 0x541B,0x8C4E, // - 0x541D,0x99E5, // - 0x541F,0x8BE1, // - 0x5420,0x9669, // - 0x5426,0x94DB, // - 0x5429,0x99E4, // - 0x542B,0x8ADC, // - 0x542C,0x99DF, // - 0x542D,0x99E0, // - 0x542E,0x99E2, // - 0x5436,0x99E3, // - 0x5438,0x8B7A, // - 0x5439,0x9081, // - 0x543B,0x95AB, // - 0x543C,0x99E1, // - 0x543D,0x99DD, // - 0x543E,0x8CE1, // - 0x5440,0x99DE, // - 0x5442,0x9843, // - 0x5446,0x95F0, // - 0x5448,0x92E6, // - 0x5449,0x8CE0, // - 0x544A,0x8D90, // - 0x544E,0x99E6, // - 0x5451,0x93DB, // - 0x545F,0x99EA, // - 0x5468,0x8EFC, // - 0x546A,0x8EF4, // - 0x5470,0x99ED, // - 0x5471,0x99EB, // - 0x5473,0x96A1, // - 0x5475,0x99E8, // - 0x5476,0x99F1, // - 0x5477,0x99EC, // - 0x547B,0x99EF, // - 0x547C,0x8CC4, // - 0x547D,0x96BD, // - 0x5480,0x99F0, // - 0x5484,0x99F2, // - 0x5486,0x99F4, // - 0x548B,0x8DEE, // - 0x548C,0x9861, // - 0x548E,0x99E9, // - 0x548F,0x99E7, // - 0x5490,0x99F3, // - 0x5492,0x99EE, // - 0x54A2,0x99F6, // - 0x54A4,0x9A42, // - 0x54A5,0x99F8, // - 0x54A8,0x99FC, // - 0x54AB,0x9A40, // - 0x54AC,0x99F9, // - 0x54AF,0x9A5D, // - 0x54B2,0x8DE7, // - 0x54B3,0x8A50, // - 0x54B8,0x99F7, // - 0x54BC,0x9A44, // - 0x54BD,0x88F4, // - 0x54BE,0x9A43, // - 0x54C0,0x88A3, // - 0x54C1,0x9569, // - 0x54C2,0x9A41, // - 0x54C4,0x99FA, // - 0x54C7,0x99F5, // - 0x54C8,0x99FB, // - 0x54C9,0x8DC6, // - 0x54D8,0x9A45, // - 0x54E1,0x88F5, // - 0x54E2,0x9A4E, // - 0x54E5,0x9A46, // - 0x54E6,0x9A47, // - 0x54E8,0x8FA3, // - 0x54E9,0x9689, // - 0x54ED,0x9A4C, // - 0x54EE,0x9A4B, // - 0x54F2,0x934E, // - 0x54FA,0x9A4D, // - 0x54FD,0x9A4A, // - 0x5504,0x8953, // - 0x5506,0x8DB4, // - 0x5507,0x904F, // - 0x550F,0x9A48, // - 0x5510,0x9382, // - 0x5514,0x9A49, // - 0x5516,0x88A0, // - 0x552E,0x9A53, // - 0x552F,0x9742, // - 0x5531,0x8FA5, // - 0x5533,0x9A59, // - 0x5538,0x9A58, // - 0x5539,0x9A4F, // - 0x553E,0x91C1, // - 0x5540,0x9A50, // - 0x5544,0x91ED, // - 0x5545,0x9A55, // - 0x5546,0x8FA4, // - 0x554C,0x9A52, // - 0x554F,0x96E2, // - 0x5556,0x9A56, // - 0x5557,0x9A57, // - 0x555C,0x9A54, // - 0x555D,0x9A5A, // - 0x5563,0x9A51, // - 0x557B,0x9A60, // - 0x557C,0x9A65, // - 0x557E,0x9A61, // - 0x5580,0x9A5C, // - 0x5583,0x9A66, // - 0x5584,0x9150, // - 0x5587,0x9A68, // - 0x5589,0x8D41, // - 0x558A,0x9A5E, // - 0x558B,0x929D, // - 0x5598,0x9A62, // - 0x559A,0x8AAB, // - 0x559C,0x8AEC, // - 0x559D,0x8A85, // - 0x559E,0x9A63, // - 0x559F,0x9A5F, // - 0x55A7,0x8C96, // - 0x55A8,0x9A69, // - 0x55A9,0x9A67, // - 0x55AA,0x9172, // - 0x55AB,0x8B69, // - 0x55AC,0x8BAA, // - 0x55AE,0x9A64, // - 0x55B0,0x8BF2, // - 0x55B6,0x8963, // - 0x55C4,0x9A6D, // - 0x55C5,0x9A6B, // - 0x55C7,0x9AA5, // - 0x55D4,0x9A70, // - 0x55DA,0x9A6A, // - 0x55DC,0x9A6E, // - 0x55DF,0x9A6C, // - 0x55E3,0x8E6B, // - 0x55E4,0x9A6F, // - 0x55F7,0x9A72, // - 0x55F9,0x9A77, // - 0x55FD,0x9A75, // - 0x55FE,0x9A74, // - 0x5606,0x9251, // - 0x5609,0x89C3, // - 0x5614,0x9A71, // - 0x5616,0x9A73, // - 0x5617,0x8FA6, // - 0x5618,0x8952, // - 0x561B,0x9A76, // - 0x5629,0x89DC, // - 0x562F,0x9A82, // - 0x5631,0x8FFA, // - 0x5632,0x9A7D, // - 0x5634,0x9A7B, // - 0x5636,0x9A7C, // - 0x5638,0x9A7E, // - 0x5642,0x895C, // - 0x564C,0x9158, // - 0x564E,0x9A78, // - 0x5650,0x9A79, // - 0x565B,0x8A9A, // - 0x5664,0x9A81, // - 0x5668,0x8AED, // - 0x566A,0x9A84, // - 0x566B,0x9A80, // - 0x566C,0x9A83, // - 0x5674,0x95AC, // - 0x5678,0x93D3, // - 0x567A,0x94B6, // - 0x5680,0x9A86, // - 0x5686,0x9A85, // - 0x5687,0x8A64, // - 0x568A,0x9A87, // - 0x568F,0x9A8A, // - 0x5694,0x9A89, // - 0x56A0,0x9A88, // - 0x56A2,0x9458, // - 0x56A5,0x9A8B, // - 0x56AE,0x9A8C, // - 0x56B4,0x9A8E, // - 0x56B6,0x9A8D, // - 0x56BC,0x9A90, // - 0x56C0,0x9A93, // - 0x56C1,0x9A91, // - 0x56C2,0x9A8F, // - 0x56C3,0x9A92, // - 0x56C8,0x9A94, // - 0x56CE,0x9A95, // - 0x56D1,0x9A96, // - 0x56D3,0x9A97, // - 0x56D7,0x9A98, // - 0x56D8,0x9964, // - 0x56DA,0x8EFA, // - 0x56DB,0x8E6C, // - 0x56DE,0x89F1, // - 0x56E0,0x88F6, // - 0x56E3,0x9263, // - 0x56EE,0x9A99, // - 0x56F0,0x8DA2, // - 0x56F2,0x88CD, // - 0x56F3,0x907D, // - 0x56F9,0x9A9A, // - 0x56FA,0x8CC5, // - 0x56FD,0x8D91, // - 0x56FF,0x9A9C, // - 0x5700,0x9A9B, // - 0x5703,0x95DE, // - 0x5704,0x9A9D, // - 0x5708,0x9A9F, // - 0x5709,0x9A9E, // - 0x570B,0x9AA0, // - 0x570D,0x9AA1, // - 0x570F,0x8C97, // - 0x5712,0x8980, // - 0x5713,0x9AA2, // - 0x5716,0x9AA4, // - 0x5718,0x9AA3, // - 0x571C,0x9AA6, // - 0x571F,0x9379, // - 0x5726,0x9AA7, // - 0x5727,0x88B3, // - 0x5728,0x8DDD, // - 0x572D,0x8C5C, // - 0x5730,0x926E, // - 0x5737,0x9AA8, // - 0x5738,0x9AA9, // - 0x573B,0x9AAB, // - 0x5740,0x9AAC, // - 0x5742,0x8DE2, // - 0x5747,0x8BCF, // - 0x574A,0x9656, // - 0x574E,0x9AAA, // - 0x574F,0x9AAD, // - 0x5750,0x8DBF, // - 0x5751,0x8D42, // - 0x5761,0x9AB1, // - 0x5764,0x8DA3, // - 0x5766,0x9252, // - 0x5769,0x9AAE, // - 0x576A,0x92D8, // - 0x577F,0x9AB2, // - 0x5782,0x9082, // - 0x5788,0x9AB0, // - 0x5789,0x9AB3, // - 0x578B,0x8C5E, // - 0x5793,0x9AB4, // - 0x57A0,0x9AB5, // - 0x57A2,0x8D43, // - 0x57A3,0x8A5F, // - 0x57A4,0x9AB7, // - 0x57AA,0x9AB8, // - 0x57B0,0x9AB9, // - 0x57B3,0x9AB6, // - 0x57C0,0x9AAF, // - 0x57C3,0x9ABA, // - 0x57C6,0x9ABB, // - 0x57CB,0x9684, // - 0x57CE,0x8FE9, // - 0x57D2,0x9ABD, // - 0x57D3,0x9ABE, // - 0x57D4,0x9ABC, // - 0x57D6,0x9AC0, // - 0x57DC,0x9457, // - 0x57DF,0x88E6, // - 0x57E0,0x9575, // - 0x57E3,0x9AC1, // - 0x57F4,0x8FFB, // - 0x57F7,0x8EB7, // - 0x57F9,0x947C, // - 0x57FA,0x8AEE, // - 0x57FC,0x8DE9, // - 0x5800,0x9678, // - 0x5802,0x93B0, // - 0x5805,0x8C98, // - 0x5806,0x91CD, // - 0x580A,0x9ABF, // - 0x580B,0x9AC2, // - 0x5815,0x91C2, // - 0x5819,0x9AC3, // - 0x581D,0x9AC4, // - 0x5821,0x9AC6, // - 0x5824,0x92E7, // - 0x582A,0x8AAC, // - 0x582F,0xEA9F, // - 0x5830,0x8981, // - 0x5831,0x95F1, // - 0x5834,0x8FEA, // - 0x5835,0x9367, // - 0x583A,0x8DE4, // - 0x583D,0x9ACC, // - 0x5840,0x95BB, // - 0x5841,0x97DB, // - 0x584A,0x89F2, // - 0x584B,0x9AC8, // - 0x5851,0x9159, // - 0x5852,0x9ACB, // - 0x5854,0x9383, // - 0x5857,0x9368, // - 0x5858,0x9384, // - 0x5859,0x94B7, // - 0x585A,0x92CB, // - 0x585E,0x8DC7, // - 0x5862,0x9AC7, // - 0x5869,0x8996, // - 0x586B,0x9355, // - 0x5870,0x9AC9, // - 0x5872,0x9AC5, // - 0x5875,0x906F, // - 0x5879,0x9ACD, // - 0x587E,0x8F6D, // - 0x5883,0x8BAB, // - 0x5885,0x9ACE, // - 0x5893,0x95E6, // - 0x5897,0x919D, // - 0x589C,0x92C4, // - 0x589F,0x9AD0, // - 0x58A8,0x966E, // - 0x58AB,0x9AD1, // - 0x58AE,0x9AD6, // - 0x58B3,0x95AD, // - 0x58B8,0x9AD5, // - 0x58B9,0x9ACF, // - 0x58BA,0x9AD2, // - 0x58BB,0x9AD4, // - 0x58BE,0x8DA4, // - 0x58C1,0x95C7, // - 0x58C5,0x9AD7, // - 0x58C7,0x9264, // - 0x58CA,0x89F3, // - 0x58CC,0x8FEB, // - 0x58D1,0x9AD9, // - 0x58D3,0x9AD8, // - 0x58D5,0x8D88, // - 0x58D7,0x9ADA, // - 0x58D8,0x9ADC, // - 0x58D9,0x9ADB, // - 0x58DC,0x9ADE, // - 0x58DE,0x9AD3, // - 0x58DF,0x9AE0, // - 0x58E4,0x9ADF, // - 0x58E5,0x9ADD, // - 0x58EB,0x8E6D, // - 0x58EC,0x9070, // - 0x58EE,0x9173, // - 0x58EF,0x9AE1, // - 0x58F0,0x90BA, // - 0x58F1,0x88EB, // - 0x58F2,0x9484, // - 0x58F7,0x92D9, // - 0x58F9,0x9AE3, // - 0x58FA,0x9AE2, // - 0x58FB,0x9AE4, // - 0x58FC,0x9AE5, // - 0x58FD,0x9AE6, // - 0x5902,0x9AE7, // - 0x5909,0x95CF, // - 0x590A,0x9AE8, // - 0x590F,0x89C4, // - 0x5910,0x9AE9, // - 0x5916,0x8A4F, // - 0x5918,0x99C7, // - 0x5919,0x8F67, // - 0x591A,0x91BD, // - 0x591B,0x9AEA, // - 0x591C,0x96E9, // - 0x5922,0x96B2, // - 0x5925,0x9AEC, // - 0x5927,0x91E5, // - 0x5929,0x9356, // - 0x592A,0x91BE, // - 0x592B,0x9576, // - 0x592C,0x9AED, // - 0x592D,0x9AEE, // - 0x592E,0x899B, // - 0x5931,0x8EB8, // - 0x5932,0x9AEF, // - 0x5937,0x88CE, // - 0x5938,0x9AF0, // - 0x593E,0x9AF1, // - 0x5944,0x8982, // - 0x5947,0x8AEF, // - 0x5948,0x93DE, // - 0x5949,0x95F2, // - 0x594E,0x9AF5, // - 0x594F,0x9174, // - 0x5950,0x9AF4, // - 0x5951,0x8C5F, // - 0x5954,0x967A, // - 0x5955,0x9AF3, // - 0x5957,0x9385, // - 0x5958,0x9AF7, // - 0x595A,0x9AF6, // - 0x5960,0x9AF9, // - 0x5962,0x9AF8, // - 0x5965,0x899C, // - 0x5967,0x9AFA, // - 0x5968,0x8FA7, // - 0x5969,0x9AFC, // - 0x596A,0x9244, // - 0x596C,0x9AFB, // - 0x596E,0x95B1, // - 0x5973,0x8F97, // - 0x5974,0x937A, // - 0x5978,0x9B40, // - 0x597D,0x8D44, // - 0x5981,0x9B41, // - 0x5982,0x9440, // - 0x5983,0x94DC, // - 0x5984,0x96CF, // - 0x598A,0x9444, // - 0x598D,0x9B4A, // - 0x5993,0x8B57, // - 0x5996,0x9764, // - 0x5999,0x96AD, // - 0x599B,0x9BAA, // - 0x599D,0x9B42, // - 0x59A3,0x9B45, // - 0x59A5,0x91C3, // - 0x59A8,0x9657, // - 0x59AC,0x9369, // - 0x59B2,0x9B46, // - 0x59B9,0x9685, // - 0x59BB,0x8DC8, // - 0x59BE,0x8FA8, // - 0x59C6,0x9B47, // - 0x59C9,0x8E6F, // - 0x59CB,0x8E6E, // - 0x59D0,0x88B7, // - 0x59D1,0x8CC6, // - 0x59D3,0x90A9, // - 0x59D4,0x88CF, // - 0x59D9,0x9B4B, // - 0x59DA,0x9B4C, // - 0x59DC,0x9B49, // - 0x59E5,0x8957, // - 0x59E6,0x8AAD, // - 0x59E8,0x9B48, // - 0x59EA,0x96C3, // - 0x59EB,0x9550, // - 0x59F6,0x88A6, // - 0x59FB,0x88F7, // - 0x59FF,0x8E70, // - 0x5A01,0x88D0, // - 0x5A03,0x88A1, // - 0x5A09,0x9B51, // - 0x5A11,0x9B4F, // - 0x5A18,0x96BA, // - 0x5A1A,0x9B52, // - 0x5A1C,0x9B50, // - 0x5A1F,0x9B4E, // - 0x5A20,0x9050, // - 0x5A25,0x9B4D, // - 0x5A29,0x95D8, // - 0x5A2F,0x8CE2, // - 0x5A35,0x9B56, // - 0x5A36,0x9B57, // - 0x5A3C,0x8FA9, // - 0x5A40,0x9B53, // - 0x5A41,0x984B, // - 0x5A46,0x946B, // - 0x5A49,0x9B55, // - 0x5A5A,0x8DA5, // - 0x5A62,0x9B58, // - 0x5A66,0x9577, // - 0x5A6A,0x9B59, // - 0x5A6C,0x9B54, // - 0x5A7F,0x96B9, // - 0x5A92,0x947D, // - 0x5A9A,0x9B5A, // - 0x5A9B,0x9551, // - 0x5ABD,0x9B5F, // - 0x5ABE,0x9B5C, // - 0x5AC1,0x89C5, // - 0x5AC2,0x9B5E, // - 0x5AC9,0x8EB9, // - 0x5ACB,0x9B5D, // - 0x5ACC,0x8C99, // - 0x5AD0,0x9B6B, // - 0x5AD6,0x9B64, // - 0x5AD7,0x9B61, // - 0x5AE1,0x9284, // - 0x5AE3,0x9B60, // - 0x5AE6,0x9B62, // - 0x5AE9,0x9B63, // - 0x5AFA,0x9B65, // - 0x5AFB,0x9B66, // - 0x5B09,0x8AF0, // - 0x5B0B,0x9B68, // - 0x5B0C,0x9B67, // - 0x5B16,0x9B69, // - 0x5B22,0x8FEC, // - 0x5B2A,0x9B6C, // - 0x5B2C,0x92DA, // - 0x5B30,0x8964, // - 0x5B32,0x9B6A, // - 0x5B36,0x9B6D, // - 0x5B3E,0x9B6E, // - 0x5B40,0x9B71, // - 0x5B43,0x9B6F, // - 0x5B45,0x9B70, // - 0x5B50,0x8E71, // - 0x5B51,0x9B72, // - 0x5B54,0x8D45, // - 0x5B55,0x9B73, // - 0x5B57,0x8E9A, // - 0x5B58,0x91B6, // - 0x5B5A,0x9B74, // - 0x5B5B,0x9B75, // - 0x5B5C,0x8E79, // - 0x5B5D,0x8D46, // - 0x5B5F,0x96D0, // - 0x5B63,0x8B47, // - 0x5B64,0x8CC7, // - 0x5B65,0x9B76, // - 0x5B66,0x8A77, // - 0x5B69,0x9B77, // - 0x5B6B,0x91B7, // - 0x5B70,0x9B78, // - 0x5B71,0x9BA1, // - 0x5B73,0x9B79, // - 0x5B75,0x9B7A, // - 0x5B78,0x9B7B, // - 0x5B7A,0x9B7D, // - 0x5B80,0x9B7E, // - 0x5B83,0x9B80, // - 0x5B85,0x91EE, // - 0x5B87,0x8946, // - 0x5B88,0x8EE7, // - 0x5B89,0x88C0, // - 0x5B8B,0x9176, // - 0x5B8C,0x8AAE, // - 0x5B8D,0x8EB3, // - 0x5B8F,0x8D47, // - 0x5B95,0x9386, // - 0x5B97,0x8F40, // - 0x5B98,0x8AAF, // - 0x5B99,0x9288, // - 0x5B9A,0x92E8, // - 0x5B9B,0x88B6, // - 0x5B9C,0x8B58, // - 0x5B9D,0x95F3, // - 0x5B9F,0x8EC0, // - 0x5BA2,0x8B71, // - 0x5BA3,0x90E9, // - 0x5BA4,0x8EBA, // - 0x5BA5,0x9747, // - 0x5BA6,0x9B81, // - 0x5BAE,0x8B7B, // - 0x5BB0,0x8DC9, // - 0x5BB3,0x8A51, // - 0x5BB4,0x8983, // - 0x5BB5,0x8FAA, // - 0x5BB6,0x89C6, // - 0x5BB8,0x9B82, // - 0x5BB9,0x9765, // - 0x5BBF,0x8F68, // - 0x5BC2,0x8EE2, // - 0x5BC3,0x9B83, // - 0x5BC4,0x8AF1, // - 0x5BC5,0x93D0, // - 0x5BC6,0x96A7, // - 0x5BC7,0x9B84, // - 0x5BC9,0x9B85, // - 0x5BCC,0x9578, // - 0x5BD0,0x9B87, // - 0x5BD2,0x8AA6, // - 0x5BD3,0x8BF5, // - 0x5BD4,0x9B86, // - 0x5BDB,0x8AB0, // - 0x5BDD,0x9051, // - 0x5BDE,0x9B8B, // - 0x5BDF,0x8E40, // - 0x5BE1,0x89C7, // - 0x5BE2,0x9B8A, // - 0x5BE4,0x9B88, // - 0x5BE5,0x9B8C, // - 0x5BE6,0x9B89, // - 0x5BE7,0x944A, // - 0x5BE8,0x9ECB, // - 0x5BE9,0x9052, // - 0x5BEB,0x9B8D, // - 0x5BEE,0x97BE, // - 0x5BF0,0x9B8E, // - 0x5BF3,0x9B90, // - 0x5BF5,0x929E, // - 0x5BF6,0x9B8F, // - 0x5BF8,0x90A1, // - 0x5BFA,0x8E9B, // - 0x5BFE,0x91CE, // - 0x5BFF,0x8EF5, // - 0x5C01,0x9595, // - 0x5C02,0x90EA, // - 0x5C04,0x8ECB, // - 0x5C05,0x9B91, // - 0x5C06,0x8FAB, // - 0x5C07,0x9B92, // - 0x5C08,0x9B93, // - 0x5C09,0x88D1, // - 0x5C0A,0x91B8, // - 0x5C0B,0x9071, // - 0x5C0D,0x9B94, // - 0x5C0E,0x93B1, // - 0x5C0F,0x8FAC, // - 0x5C11,0x8FAD, // - 0x5C13,0x9B95, // - 0x5C16,0x90EB, // - 0x5C1A,0x8FAE, // - 0x5C20,0x9B96, // - 0x5C22,0x9B97, // - 0x5C24,0x96DE, // - 0x5C28,0x9B98, // - 0x5C2D,0x8BC4, // - 0x5C31,0x8F41, // - 0x5C38,0x9B99, // - 0x5C39,0x9B9A, // - 0x5C3A,0x8EDA, // - 0x5C3B,0x904B, // - 0x5C3C,0x93F2, // - 0x5C3D,0x9073, // - 0x5C3E,0x94F6, // - 0x5C3F,0x9441, // - 0x5C40,0x8BC7, // - 0x5C41,0x9B9B, // - 0x5C45,0x8B8F, // - 0x5C46,0x9B9C, // - 0x5C48,0x8BFC, // - 0x5C4A,0x93CD, // - 0x5C4B,0x89AE, // - 0x5C4D,0x8E72, // - 0x5C4E,0x9B9D, // - 0x5C4F,0x9BA0, // - 0x5C50,0x9B9F, // - 0x5C51,0x8BFB, // - 0x5C53,0x9B9E, // - 0x5C55,0x9357, // - 0x5C5E,0x91AE, // - 0x5C60,0x936A, // - 0x5C61,0x8EC6, // - 0x5C64,0x9177, // - 0x5C65,0x979A, // - 0x5C6C,0x9BA2, // - 0x5C6E,0x9BA3, // - 0x5C6F,0x93D4, // - 0x5C71,0x8E52, // - 0x5C76,0x9BA5, // - 0x5C79,0x9BA6, // - 0x5C8C,0x9BA7, // - 0x5C90,0x8AF2, // - 0x5C91,0x9BA8, // - 0x5C94,0x9BA9, // - 0x5CA1,0x89AA, // - 0x5CA8,0x915A, // - 0x5CA9,0x8AE2, // - 0x5CAB,0x9BAB, // - 0x5CAC,0x96A6, // - 0x5CB1,0x91D0, // - 0x5CB3,0x8A78, // - 0x5CB6,0x9BAD, // - 0x5CB7,0x9BAF, // - 0x5CB8,0x8ADD, // - 0x5CBB,0x9BAC, // - 0x5CBC,0x9BAE, // - 0x5CBE,0x9BB1, // - 0x5CC5,0x9BB0, // - 0x5CC7,0x9BB2, // - 0x5CD9,0x9BB3, // - 0x5CE0,0x93BB, // - 0x5CE1,0x8BAC, // - 0x5CE8,0x89E3, // - 0x5CE9,0x9BB4, // - 0x5CEA,0x9BB9, // - 0x5CED,0x9BB7, // - 0x5CEF,0x95F5, // - 0x5CF0,0x95F4, // - 0x5CF6,0x9387, // - 0x5CFA,0x9BB6, // - 0x5CFB,0x8F73, // - 0x5CFD,0x9BB5, // - 0x5D07,0x9092, // - 0x5D0B,0x9BBA, // - 0x5D0E,0x8DE8, // - 0x5D11,0x9BC0, // - 0x5D14,0x9BC1, // - 0x5D15,0x9BBB, // - 0x5D16,0x8A52, // - 0x5D17,0x9BBC, // - 0x5D18,0x9BC5, // - 0x5D19,0x9BC4, // - 0x5D1A,0x9BC3, // - 0x5D1B,0x9BBF, // - 0x5D1F,0x9BBE, // - 0x5D22,0x9BC2, // - 0x5D29,0x95F6, // - 0x5D4B,0x9BC9, // - 0x5D4C,0x9BC6, // - 0x5D4E,0x9BC8, // - 0x5D50,0x9792, // - 0x5D52,0x9BC7, // - 0x5D5C,0x9BBD, // - 0x5D69,0x9093, // - 0x5D6C,0x9BCA, // - 0x5D6F,0x8DB5, // - 0x5D73,0x9BCB, // - 0x5D76,0x9BCC, // - 0x5D82,0x9BCF, // - 0x5D84,0x9BCE, // - 0x5D87,0x9BCD, // - 0x5D8B,0x9388, // - 0x5D8C,0x9BB8, // - 0x5D90,0x9BD5, // - 0x5D9D,0x9BD1, // - 0x5DA2,0x9BD0, // - 0x5DAC,0x9BD2, // - 0x5DAE,0x9BD3, // - 0x5DB7,0x9BD6, // - 0x5DBA,0x97E4, // - 0x5DBC,0x9BD7, // - 0x5DBD,0x9BD4, // - 0x5DC9,0x9BD8, // - 0x5DCC,0x8ADE, // - 0x5DCD,0x9BD9, // - 0x5DD2,0x9BDB, // - 0x5DD3,0x9BDA, // - 0x5DD6,0x9BDC, // - 0x5DDB,0x9BDD, // - 0x5DDD,0x90EC, // - 0x5DDE,0x8F42, // - 0x5DE1,0x8F84, // - 0x5DE3,0x9183, // - 0x5DE5,0x8D48, // - 0x5DE6,0x8DB6, // - 0x5DE7,0x8D49, // - 0x5DE8,0x8B90, // - 0x5DEB,0x9BDE, // - 0x5DEE,0x8DB7, // - 0x5DF1,0x8CC8, // - 0x5DF2,0x9BDF, // - 0x5DF3,0x96A4, // - 0x5DF4,0x9462, // - 0x5DF5,0x9BE0, // - 0x5DF7,0x8D4A, // - 0x5DFB,0x8AAA, // - 0x5DFD,0x9246, // - 0x5DFE,0x8BD0, // - 0x5E02,0x8E73, // - 0x5E03,0x957A, // - 0x5E06,0x94BF, // - 0x5E0B,0x9BE1, // - 0x5E0C,0x8AF3, // - 0x5E11,0x9BE4, // - 0x5E16,0x929F, // - 0x5E19,0x9BE3, // - 0x5E1A,0x9BE2, // - 0x5E1B,0x9BE5, // - 0x5E1D,0x92E9, // - 0x5E25,0x9083, // - 0x5E2B,0x8E74, // - 0x5E2D,0x90C8, // - 0x5E2F,0x91D1, // - 0x5E30,0x8B41, // - 0x5E33,0x92A0, // - 0x5E36,0x9BE6, // - 0x5E37,0x9BE7, // - 0x5E38,0x8FED, // - 0x5E3D,0x9658, // - 0x5E40,0x9BEA, // - 0x5E43,0x9BE9, // - 0x5E44,0x9BE8, // - 0x5E45,0x959D, // - 0x5E47,0x9BF1, // - 0x5E4C,0x9679, // - 0x5E4E,0x9BEB, // - 0x5E54,0x9BED, // - 0x5E55,0x968B, // - 0x5E57,0x9BEC, // - 0x5E5F,0x9BEE, // - 0x5E61,0x94A6, // - 0x5E62,0x9BEF, // - 0x5E63,0x95BC, // - 0x5E64,0x9BF0, // - 0x5E72,0x8AB1, // - 0x5E73,0x95BD, // - 0x5E74,0x944E, // - 0x5E75,0x9BF2, // - 0x5E76,0x9BF3, // - 0x5E78,0x8D4B, // - 0x5E79,0x8AB2, // - 0x5E7A,0x9BF4, // - 0x5E7B,0x8CB6, // - 0x5E7C,0x9763, // - 0x5E7D,0x9748, // - 0x5E7E,0x8AF4, // - 0x5E7F,0x9BF6, // - 0x5E81,0x92A1, // - 0x5E83,0x8D4C, // - 0x5E84,0x8FAF, // - 0x5E87,0x94DD, // - 0x5E8A,0x8FB0, // - 0x5E8F,0x8F98, // - 0x5E95,0x92EA, // - 0x5E96,0x95F7, // - 0x5E97,0x9358, // - 0x5E9A,0x8D4D, // - 0x5E9C,0x957B, // - 0x5EA0,0x9BF7, // - 0x5EA6,0x9378, // - 0x5EA7,0x8DC0, // - 0x5EAB,0x8CC9, // - 0x5EAD,0x92EB, // - 0x5EB5,0x88C1, // - 0x5EB6,0x8F8E, // - 0x5EB7,0x8D4E, // - 0x5EB8,0x9766, // - 0x5EC1,0x9BF8, // - 0x5EC2,0x9BF9, // - 0x5EC3,0x9470, // - 0x5EC8,0x9BFA, // - 0x5EC9,0x97F5, // - 0x5ECA,0x984C, // - 0x5ECF,0x9BFC, // - 0x5ED0,0x9BFB, // - 0x5ED3,0x8A66, // - 0x5ED6,0x9C40, // - 0x5EDA,0x9C43, // - 0x5EDB,0x9C44, // - 0x5EDD,0x9C42, // - 0x5EDF,0x955F, // - 0x5EE0,0x8FB1, // - 0x5EE1,0x9C46, // - 0x5EE2,0x9C45, // - 0x5EE3,0x9C41, // - 0x5EE8,0x9C47, // - 0x5EE9,0x9C48, // - 0x5EEC,0x9C49, // - 0x5EF0,0x9C4C, // - 0x5EF1,0x9C4A, // - 0x5EF3,0x9C4B, // - 0x5EF4,0x9C4D, // - 0x5EF6,0x8984, // - 0x5EF7,0x92EC, // - 0x5EF8,0x9C4E, // - 0x5EFA,0x8C9A, // - 0x5EFB,0x89F4, // - 0x5EFC,0x9455, // - 0x5EFE,0x9C4F, // - 0x5EFF,0x93F9, // - 0x5F01,0x95D9, // - 0x5F03,0x9C50, // - 0x5F04,0x984D, // - 0x5F09,0x9C51, // - 0x5F0A,0x95BE, // - 0x5F0B,0x9C54, // - 0x5F0C,0x989F, // - 0x5F0D,0x98AF, // - 0x5F0F,0x8EAE, // - 0x5F10,0x93F3, // - 0x5F11,0x9C55, // - 0x5F13,0x8B7C, // - 0x5F14,0x92A2, // - 0x5F15,0x88F8, // - 0x5F16,0x9C56, // - 0x5F17,0x95A4, // - 0x5F18,0x8D4F, // - 0x5F1B,0x926F, // - 0x5F1F,0x92ED, // - 0x5F25,0x96ED, // - 0x5F26,0x8CB7, // - 0x5F27,0x8CCA, // - 0x5F29,0x9C57, // - 0x5F2D,0x9C58, // - 0x5F2F,0x9C5E, // - 0x5F31,0x8EE3, // - 0x5F35,0x92A3, // - 0x5F37,0x8BAD, // - 0x5F38,0x9C59, // - 0x5F3C,0x954A, // - 0x5F3E,0x9265, // - 0x5F41,0x9C5A, // - 0x5F4A,0x8BAE, // - 0x5F4C,0x9C5C, // - 0x5F4E,0x9C5D, // - 0x5F51,0x9C5F, // - 0x5F53,0x9396, // - 0x5F56,0x9C60, // - 0x5F57,0x9C61, // - 0x5F59,0x9C62, // - 0x5F5C,0x9C53, // - 0x5F5D,0x9C52, // - 0x5F61,0x9C63, // - 0x5F62,0x8C60, // - 0x5F66,0x9546, // - 0x5F69,0x8DCA, // - 0x5F6A,0x9556, // - 0x5F6B,0x92A4, // - 0x5F6C,0x956A, // - 0x5F6D,0x9C64, // - 0x5F70,0x8FB2, // - 0x5F71,0x8965, // - 0x5F73,0x9C65, // - 0x5F77,0x9C66, // - 0x5F79,0x96F0, // - 0x5F7C,0x94DE, // - 0x5F7F,0x9C69, // - 0x5F80,0x899D, // - 0x5F81,0x90AA, // - 0x5F82,0x9C68, // - 0x5F83,0x9C67, // - 0x5F84,0x8C61, // - 0x5F85,0x91D2, // - 0x5F87,0x9C6D, // - 0x5F88,0x9C6B, // - 0x5F8A,0x9C6A, // - 0x5F8B,0x97A5, // - 0x5F8C,0x8CE3, // - 0x5F90,0x8F99, // - 0x5F91,0x9C6C, // - 0x5F92,0x936B, // - 0x5F93,0x8F5D, // - 0x5F97,0x93BE, // - 0x5F98,0x9C70, // - 0x5F99,0x9C6F, // - 0x5F9E,0x9C6E, // - 0x5FA0,0x9C71, // - 0x5FA1,0x8CE4, // - 0x5FA8,0x9C72, // - 0x5FA9,0x959C, // - 0x5FAA,0x8F7A, // - 0x5FAD,0x9C73, // - 0x5FAE,0x94F7, // - 0x5FB3,0x93BF, // - 0x5FB4,0x92A5, // - 0x5FB9,0x934F, // - 0x5FBC,0x9C74, // - 0x5FBD,0x8B4A, // - 0x5FC3,0x9053, // - 0x5FC5,0x954B, // - 0x5FCC,0x8AF5, // - 0x5FCD,0x9445, // - 0x5FD6,0x9C75, // - 0x5FD7,0x8E75, // - 0x5FD8,0x9659, // - 0x5FD9,0x965A, // - 0x5FDC,0x899E, // - 0x5FDD,0x9C7A, // - 0x5FE0,0x9289, // - 0x5FE4,0x9C77, // - 0x5FEB,0x89F5, // - 0x5FF0,0x9CAB, // - 0x5FF1,0x9C79, // - 0x5FF5,0x944F, // - 0x5FF8,0x9C78, // - 0x5FFB,0x9C76, // - 0x5FFD,0x8D9A, // - 0x5FFF,0x9C7C, // - 0x600E,0x9C83, // - 0x600F,0x9C89, // - 0x6010,0x9C81, // - 0x6012,0x937B, // - 0x6015,0x9C86, // - 0x6016,0x957C, // - 0x6019,0x9C80, // - 0x601B,0x9C85, // - 0x601C,0x97E5, // - 0x601D,0x8E76, // - 0x6020,0x91D3, // - 0x6021,0x9C7D, // - 0x6025,0x8B7D, // - 0x6026,0x9C88, // - 0x6027,0x90AB, // - 0x6028,0x8985, // - 0x6029,0x9C82, // - 0x602A,0x89F6, // - 0x602B,0x9C87, // - 0x602F,0x8BAF, // - 0x6031,0x9C84, // - 0x603A,0x9C8A, // - 0x6041,0x9C8C, // - 0x6042,0x9C96, // - 0x6043,0x9C94, // - 0x6046,0x9C91, // - 0x604A,0x9C90, // - 0x604B,0x97F6, // - 0x604D,0x9C92, // - 0x6050,0x8BB0, // - 0x6052,0x8D50, // - 0x6055,0x8F9A, // - 0x6059,0x9C99, // - 0x605A,0x9C8B, // - 0x605F,0x9C8F, // - 0x6060,0x9C7E, // - 0x6062,0x89F8, // - 0x6063,0x9C93, // - 0x6064,0x9C95, // - 0x6065,0x9270, // - 0x6068,0x8DA6, // - 0x6069,0x89B6, // - 0x606A,0x9C8D, // - 0x606B,0x9C98, // - 0x606C,0x9C97, // - 0x606D,0x8BB1, // - 0x606F,0x91A7, // - 0x6070,0x8A86, // - 0x6075,0x8C62, // - 0x6077,0x9C8E, // - 0x6081,0x9C9A, // - 0x6083,0x9C9D, // - 0x6084,0x9C9F, // - 0x6089,0x8EBB, // - 0x608B,0x9CA5, // - 0x608C,0x92EE, // - 0x608D,0x9C9B, // - 0x6092,0x9CA3, // - 0x6094,0x89F7, // - 0x6096,0x9CA1, // - 0x6097,0x9CA2, // - 0x609A,0x9C9E, // - 0x609B,0x9CA0, // - 0x609F,0x8CE5, // - 0x60A0,0x9749, // - 0x60A3,0x8AB3, // - 0x60A6,0x8978, // - 0x60A7,0x9CA4, // - 0x60A9,0x9459, // - 0x60AA,0x88AB, // - 0x60B2,0x94DF, // - 0x60B3,0x9C7B, // - 0x60B4,0x9CAA, // - 0x60B5,0x9CAE, // - 0x60B6,0x96E3, // - 0x60B8,0x9CA7, // - 0x60BC,0x9389, // - 0x60BD,0x9CAC, // - 0x60C5,0x8FEE, // - 0x60C6,0x9CAD, // - 0x60C7,0x93D5, // - 0x60D1,0x9866, // - 0x60D3,0x9CA9, // - 0x60D8,0x9CAF, // - 0x60DA,0x8D9B, // - 0x60DC,0x90C9, // - 0x60DF,0x88D2, // - 0x60E0,0x9CA8, // - 0x60E1,0x9CA6, // - 0x60E3,0x9179, // - 0x60E7,0x9C9C, // - 0x60E8,0x8E53, // - 0x60F0,0x91C4, // - 0x60F1,0x9CBB, // - 0x60F3,0x917A, // - 0x60F4,0x9CB6, // - 0x60F6,0x9CB3, // - 0x60F7,0x9CB4, // - 0x60F9,0x8EE4, // - 0x60FA,0x9CB7, // - 0x60FB,0x9CBA, // - 0x6100,0x9CB5, // - 0x6101,0x8F44, // - 0x6103,0x9CB8, // - 0x6106,0x9CB2, // - 0x6108,0x96FA, // - 0x6109,0x96F9, // - 0x610D,0x9CBC, // - 0x610E,0x9CBD, // - 0x610F,0x88D3, // - 0x6115,0x9CB1, // - 0x611A,0x8BF0, // - 0x611B,0x88A4, // - 0x611F,0x8AB4, // - 0x6121,0x9CB9, // - 0x6127,0x9CC1, // - 0x6128,0x9CC0, // - 0x612C,0x9CC5, // - 0x6134,0x9CC6, // - 0x613C,0x9CC4, // - 0x613D,0x9CC7, // - 0x613E,0x9CBF, // - 0x613F,0x9CC3, // - 0x6142,0x9CC8, // - 0x6144,0x9CC9, // - 0x6147,0x9CBE, // - 0x6148,0x8E9C, // - 0x614A,0x9CC2, // - 0x614B,0x91D4, // - 0x614C,0x8D51, // - 0x614D,0x9CB0, // - 0x614E,0x9054, // - 0x6153,0x9CD6, // - 0x6155,0x95E7, // - 0x6158,0x9CCC, // - 0x6159,0x9CCD, // - 0x615A,0x9CCE, // - 0x615D,0x9CD5, // - 0x615F,0x9CD4, // - 0x6162,0x969D, // - 0x6163,0x8AB5, // - 0x6165,0x9CD2, // - 0x6167,0x8C64, // - 0x6168,0x8A53, // - 0x616B,0x9CCF, // - 0x616E,0x97B6, // - 0x616F,0x9CD1, // - 0x6170,0x88D4, // - 0x6171,0x9CD3, // - 0x6173,0x9CCA, // - 0x6174,0x9CD0, // - 0x6175,0x9CD7, // - 0x6176,0x8C63, // - 0x6177,0x9CCB, // - 0x617E,0x977C, // - 0x6182,0x974A, // - 0x6187,0x9CDA, // - 0x618A,0x9CDE, // - 0x618E,0x919E, // - 0x6190,0x97F7, // - 0x6191,0x9CDF, // - 0x6194,0x9CDC, // - 0x6196,0x9CD9, // - 0x6199,0x9CD8, // - 0x619A,0x9CDD, // - 0x61A4,0x95AE, // - 0x61A7,0x93B2, // - 0x61A9,0x8C65, // - 0x61AB,0x9CE0, // - 0x61AC,0x9CDB, // - 0x61AE,0x9CE1, // - 0x61B2,0x8C9B, // - 0x61B6,0x89AF, // - 0x61BA,0x9CE9, // - 0x61BE,0x8AB6, // - 0x61C3,0x9CE7, // - 0x61C6,0x9CE8, // - 0x61C7,0x8DA7, // - 0x61C8,0x9CE6, // - 0x61C9,0x9CE4, // - 0x61CA,0x9CE3, // - 0x61CB,0x9CEA, // - 0x61CC,0x9CE2, // - 0x61CD,0x9CEC, // - 0x61D0,0x89F9, // - 0x61E3,0x9CEE, // - 0x61E6,0x9CED, // - 0x61F2,0x92A6, // - 0x61F4,0x9CF1, // - 0x61F6,0x9CEF, // - 0x61F7,0x9CE5, // - 0x61F8,0x8C9C, // - 0x61FA,0x9CF0, // - 0x61FC,0x9CF4, // - 0x61FD,0x9CF3, // - 0x61FE,0x9CF5, // - 0x61FF,0x9CF2, // - 0x6200,0x9CF6, // - 0x6208,0x9CF7, // - 0x6209,0x9CF8, // - 0x620A,0x95E8, // - 0x620C,0x9CFA, // - 0x620D,0x9CF9, // - 0x620E,0x8F5E, // - 0x6210,0x90AC, // - 0x6211,0x89E4, // - 0x6212,0x89FA, // - 0x6214,0x9CFB, // - 0x6216,0x88BD, // - 0x621A,0x90CA, // - 0x621B,0x9CFC, // - 0x621D,0xE6C1, // - 0x621E,0x9D40, // - 0x621F,0x8C81, // - 0x6221,0x9D41, // - 0x6226,0x90ED, // - 0x622A,0x9D42, // - 0x622E,0x9D43, // - 0x622F,0x8B59, // - 0x6230,0x9D44, // - 0x6232,0x9D45, // - 0x6233,0x9D46, // - 0x6234,0x91D5, // - 0x6238,0x8CCB, // - 0x623B,0x96DF, // - 0x6240,0x8F8A, // - 0x6241,0x9D47, // - 0x6247,0x90EE, // - 0x6248,0xE7BB, // - 0x6249,0x94E0, // - 0x624B,0x8EE8, // - 0x624D,0x8DCB, // - 0x624E,0x9D48, // - 0x6253,0x91C5, // - 0x6255,0x95A5, // - 0x6258,0x91EF, // - 0x625B,0x9D4B, // - 0x625E,0x9D49, // - 0x6260,0x9D4C, // - 0x6263,0x9D4A, // - 0x6268,0x9D4D, // - 0x626E,0x95AF, // - 0x6271,0x88B5, // - 0x6276,0x957D, // - 0x6279,0x94E1, // - 0x627C,0x9D4E, // - 0x627E,0x9D51, // - 0x627F,0x8FB3, // - 0x6280,0x8B5A, // - 0x6282,0x9D4F, // - 0x6283,0x9D56, // - 0x6284,0x8FB4, // - 0x6289,0x9D50, // - 0x628A,0x9463, // - 0x6291,0x977D, // - 0x6292,0x9D52, // - 0x6293,0x9D53, // - 0x6294,0x9D57, // - 0x6295,0x938A, // - 0x6296,0x9D54, // - 0x6297,0x8D52, // - 0x6298,0x90DC, // - 0x629B,0x9D65, // - 0x629C,0x94B2, // - 0x629E,0x91F0, // - 0x62AB,0x94E2, // - 0x62AC,0x9DAB, // - 0x62B1,0x95F8, // - 0x62B5,0x92EF, // - 0x62B9,0x9695, // - 0x62BB,0x9D5A, // - 0x62BC,0x899F, // - 0x62BD,0x928A, // - 0x62C2,0x9D63, // - 0x62C5,0x9253, // - 0x62C6,0x9D5D, // - 0x62C7,0x9D64, // - 0x62C8,0x9D5F, // - 0x62C9,0x9D66, // - 0x62CA,0x9D62, // - 0x62CC,0x9D61, // - 0x62CD,0x948F, // - 0x62D0,0x89FB, // - 0x62D1,0x9D59, // - 0x62D2,0x8B91, // - 0x62D3,0x91F1, // - 0x62D4,0x9D55, // - 0x62D7,0x9D58, // - 0x62D8,0x8D53, // - 0x62D9,0x90D9, // - 0x62DB,0x8FB5, // - 0x62DC,0x9D60, // - 0x62DD,0x9471, // - 0x62E0,0x8B92, // - 0x62E1,0x8A67, // - 0x62EC,0x8A87, // - 0x62ED,0x9040, // - 0x62EE,0x9D68, // - 0x62EF,0x9D6D, // - 0x62F1,0x9D69, // - 0x62F3,0x8C9D, // - 0x62F5,0x9D6E, // - 0x62F6,0x8E41, // - 0x62F7,0x8D89, // - 0x62FE,0x8F45, // - 0x62FF,0x9D5C, // - 0x6301,0x8E9D, // - 0x6302,0x9D6B, // - 0x6307,0x8E77, // - 0x6308,0x9D6C, // - 0x6309,0x88C2, // - 0x630C,0x9D67, // - 0x6311,0x92A7, // - 0x6319,0x8B93, // - 0x631F,0x8BB2, // - 0x6327,0x9D6A, // - 0x6328,0x88A5, // - 0x632B,0x8DC1, // - 0x632F,0x9055, // - 0x633A,0x92F0, // - 0x633D,0x94D2, // - 0x633E,0x9D70, // - 0x633F,0x917D, // - 0x6349,0x91A8, // - 0x634C,0x8E4A, // - 0x634D,0x9D71, // - 0x634F,0x9D73, // - 0x6350,0x9D6F, // - 0x6355,0x95DF, // - 0x6357,0x92BB, // - 0x635C,0x917B, // - 0x6367,0x95F9, // - 0x6368,0x8ECC, // - 0x6369,0x9D80, // - 0x636B,0x9D7E, // - 0x636E,0x9098, // - 0x6372,0x8C9E, // - 0x6376,0x9D78, // - 0x6377,0x8FB7, // - 0x637A,0x93E6, // - 0x637B,0x9450, // - 0x6380,0x9D76, // - 0x6383,0x917C, // - 0x6388,0x8EF6, // - 0x6389,0x9D7B, // - 0x638C,0x8FB6, // - 0x638E,0x9D75, // - 0x638F,0x9D7A, // - 0x6392,0x9472, // - 0x6396,0x9D74, // - 0x6398,0x8C40, // - 0x639B,0x8A7C, // - 0x639F,0x9D7C, // - 0x63A0,0x97A9, // - 0x63A1,0x8DCC, // - 0x63A2,0x9254, // - 0x63A3,0x9D79, // - 0x63A5,0x90DA, // - 0x63A7,0x8D54, // - 0x63A8,0x9084, // - 0x63A9,0x8986, // - 0x63AB,0x9D77, // - 0x63AC,0x8B64, // - 0x63B2,0x8C66, // - 0x63B4,0x92CD, // - 0x63B5,0x9D7D, // - 0x63BB,0x917E, // - 0x63BE,0x9D81, // - 0x63C0,0x9D83, // - 0x63C3,0x91B5, // - 0x63C4,0x9D89, // - 0x63C6,0x9D84, // - 0x63C9,0x9D86, // - 0x63CF,0x9560, // - 0x63D0,0x92F1, // - 0x63D2,0x9D87, // - 0x63D6,0x974B, // - 0x63DA,0x9767, // - 0x63DB,0x8AB7, // - 0x63E1,0x88AC, // - 0x63E3,0x9D85, // - 0x63E9,0x9D82, // - 0x63EE,0x8AF6, // - 0x63F4,0x8987, // - 0x63F6,0x9D88, // - 0x63FA,0x9768, // - 0x6406,0x9D8C, // - 0x640D,0x91B9, // - 0x640F,0x9D93, // - 0x6413,0x9D8D, // - 0x6416,0x9D8A, // - 0x6417,0x9D91, // - 0x641C,0x9D72, // - 0x6426,0x9D8E, // - 0x6428,0x9D92, // - 0x642C,0x94C0, // - 0x642D,0x938B, // - 0x6434,0x9D8B, // - 0x6436,0x9D8F, // - 0x643A,0x8C67, // - 0x643E,0x8DEF, // - 0x6442,0x90DB, // - 0x644E,0x9D97, // - 0x6458,0x9345, // - 0x6467,0x9D94, // - 0x6469,0x9680, // - 0x646F,0x9D95, // - 0x6476,0x9D96, // - 0x6478,0x96CC, // - 0x647A,0x90A0, // - 0x6483,0x8C82, // - 0x6488,0x9D9D, // - 0x6492,0x8E54, // - 0x6493,0x9D9A, // - 0x6495,0x9D99, // - 0x649A,0x9451, // - 0x649E,0x93B3, // - 0x64A4,0x9350, // - 0x64A5,0x9D9B, // - 0x64A9,0x9D9C, // - 0x64AB,0x958F, // - 0x64AD,0x9464, // - 0x64AE,0x8E42, // - 0x64B0,0x90EF, // - 0x64B2,0x966F, // - 0x64B9,0x8A68, // - 0x64BB,0x9DA3, // - 0x64BC,0x9D9E, // - 0x64C1,0x9769, // - 0x64C2,0x9DA5, // - 0x64C5,0x9DA1, // - 0x64C7,0x9DA2, // - 0x64CD,0x9180, // - 0x64D2,0x9DA0, // - 0x64D4,0x9D5E, // - 0x64D8,0x9DA4, // - 0x64DA,0x9D9F, // - 0x64E0,0x9DA9, // - 0x64E1,0x9DAA, // - 0x64E2,0x9346, // - 0x64E3,0x9DAC, // - 0x64E6,0x8E43, // - 0x64E7,0x9DA7, // - 0x64EF,0x9DAD, // - 0x64F1,0x9DA6, // - 0x64F2,0x9DB1, // - 0x64F4,0x9DB0, // - 0x64F6,0x9DAF, // - 0x64FA,0x9DB2, // - 0x64FD,0x9DB4, // - 0x64FE,0x8FEF, // - 0x6500,0x9DB3, // - 0x6505,0x9DB7, // - 0x6518,0x9DB5, // - 0x651C,0x9DB6, // - 0x651D,0x9D90, // - 0x6523,0x9DB9, // - 0x6524,0x9DB8, // - 0x652A,0x9D98, // - 0x652B,0x9DBA, // - 0x652C,0x9DAE, // - 0x652F,0x8E78, // - 0x6534,0x9DBB, // - 0x6535,0x9DBC, // - 0x6536,0x9DBE, // - 0x6537,0x9DBD, // - 0x6538,0x9DBF, // - 0x6539,0x89FC, // - 0x653B,0x8D55, // - 0x653E,0x95FA, // - 0x653F,0x90AD, // - 0x6545,0x8CCC, // - 0x6548,0x9DC1, // - 0x654D,0x9DC4, // - 0x654F,0x9571, // - 0x6551,0x8B7E, // - 0x6555,0x9DC3, // - 0x6556,0x9DC2, // - 0x6557,0x9473, // - 0x6558,0x9DC5, // - 0x6559,0x8BB3, // - 0x655D,0x9DC7, // - 0x655E,0x9DC6, // - 0x6562,0x8AB8, // - 0x6563,0x8E55, // - 0x6566,0x93D6, // - 0x656C,0x8C68, // - 0x6570,0x9094, // - 0x6572,0x9DC8, // - 0x6574,0x90AE, // - 0x6575,0x9347, // - 0x6577,0x957E, // - 0x6578,0x9DC9, // - 0x6582,0x9DCA, // - 0x6583,0x9DCB, // - 0x6587,0x95B6, // - 0x6588,0x9B7C, // - 0x6589,0x90C4, // - 0x658C,0x956B, // - 0x658E,0x8DD6, // - 0x6590,0x94E3, // - 0x6591,0x94C1, // - 0x6597,0x936C, // - 0x6599,0x97BF, // - 0x659B,0x9DCD, // - 0x659C,0x8ECE, // - 0x659F,0x9DCE, // - 0x65A1,0x88B4, // - 0x65A4,0x8BD2, // - 0x65A5,0x90CB, // - 0x65A7,0x9580, // - 0x65AB,0x9DCF, // - 0x65AC,0x8E61, // - 0x65AD,0x9266, // - 0x65AF,0x8E7A, // - 0x65B0,0x9056, // - 0x65B7,0x9DD0, // - 0x65B9,0x95FB, // - 0x65BC,0x8997, // - 0x65BD,0x8E7B, // - 0x65C1,0x9DD3, // - 0x65C3,0x9DD1, // - 0x65C4,0x9DD4, // - 0x65C5,0x97B7, // - 0x65C6,0x9DD2, // - 0x65CB,0x90F9, // - 0x65CC,0x9DD5, // - 0x65CF,0x91B0, // - 0x65D2,0x9DD6, // - 0x65D7,0x8AF8, // - 0x65D9,0x9DD8, // - 0x65DB,0x9DD7, // - 0x65E0,0x9DD9, // - 0x65E1,0x9DDA, // - 0x65E2,0x8AF9, // - 0x65E5,0x93FA, // - 0x65E6,0x9255, // - 0x65E7,0x8B8C, // - 0x65E8,0x8E7C, // - 0x65E9,0x9181, // - 0x65EC,0x8F7B, // - 0x65ED,0x88AE, // - 0x65F1,0x9DDB, // - 0x65FA,0x89A0, // - 0x65FB,0x9DDF, // - 0x6602,0x8D56, // - 0x6603,0x9DDE, // - 0x6606,0x8DA9, // - 0x6607,0x8FB8, // - 0x660A,0x9DDD, // - 0x660C,0x8FB9, // - 0x660E,0x96BE, // - 0x660F,0x8DA8, // - 0x6613,0x88D5, // - 0x6614,0x90CC, // - 0x661C,0x9DE4, // - 0x661F,0x90AF, // - 0x6620,0x8966, // - 0x6625,0x8F74, // - 0x6627,0x9686, // - 0x6628,0x8DF0, // - 0x662D,0x8FBA, // - 0x662F,0x90A5, // - 0x6634,0x9DE3, // - 0x6635,0x9DE1, // - 0x6636,0x9DE2, // - 0x663C,0x928B, // - 0x663F,0x9E45, // - 0x6641,0x9DE8, // - 0x6642,0x8E9E, // - 0x6643,0x8D57, // - 0x6644,0x9DE6, // - 0x6649,0x9DE7, // - 0x664B,0x9057, // - 0x664F,0x9DE5, // - 0x6652,0x8E4E, // - 0x665D,0x9DEA, // - 0x665E,0x9DE9, // - 0x665F,0x9DEE, // - 0x6662,0x9DEF, // - 0x6664,0x9DEB, // - 0x6666,0x8A41, // - 0x6667,0x9DEC, // - 0x6668,0x9DED, // - 0x6669,0x94D3, // - 0x666E,0x9581, // - 0x666F,0x8C69, // - 0x6670,0x9DF0, // - 0x6674,0x90B0, // - 0x6676,0x8FBB, // - 0x667A,0x9271, // - 0x6681,0x8BC5, // - 0x6683,0x9DF1, // - 0x6684,0x9DF5, // - 0x6687,0x89C9, // - 0x6688,0x9DF2, // - 0x6689,0x9DF4, // - 0x668E,0x9DF3, // - 0x6691,0x8F8B, // - 0x6696,0x9267, // - 0x6697,0x88C3, // - 0x6698,0x9DF6, // - 0x669D,0x9DF7, // - 0x66A2,0x92A8, // - 0x66A6,0x97EF, // - 0x66AB,0x8E62, // - 0x66AE,0x95E9, // - 0x66B4,0x965C, // - 0x66B8,0x9E41, // - 0x66B9,0x9DF9, // - 0x66BC,0x9DFC, // - 0x66BE,0x9DFB, // - 0x66C1,0x9DF8, // - 0x66C4,0x9E40, // - 0x66C7,0x93DC, // - 0x66C9,0x9DFA, // - 0x66D6,0x9E42, // - 0x66D9,0x8F8C, // - 0x66DA,0x9E43, // - 0x66DC,0x976A, // - 0x66DD,0x9498, // - 0x66E0,0x9E44, // - 0x66E6,0x9E46, // - 0x66E9,0x9E47, // - 0x66F0,0x9E48, // - 0x66F2,0x8BC8, // - 0x66F3,0x8967, // - 0x66F4,0x8D58, // - 0x66F5,0x9E49, // - 0x66F7,0x9E4A, // - 0x66F8,0x8F91, // - 0x66F9,0x9182, // - 0x66FC,0x99D6, // - 0x66FD,0x915D, // - 0x66FE,0x915C, // - 0x66FF,0x91D6, // - 0x6700,0x8DC5, // - 0x6703,0x98F0, // - 0x6708,0x8C8E, // - 0x6709,0x974C, // - 0x670B,0x95FC, // - 0x670D,0x959E, // - 0x670F,0x9E4B, // - 0x6714,0x8DF1, // - 0x6715,0x92BD, // - 0x6716,0x9E4C, // - 0x6717,0x984E, // - 0x671B,0x965D, // - 0x671D,0x92A9, // - 0x671E,0x9E4D, // - 0x671F,0x8AFA, // - 0x6726,0x9E4E, // - 0x6727,0x9E4F, // - 0x6728,0x96D8, // - 0x672A,0x96A2, // - 0x672B,0x9696, // - 0x672C,0x967B, // - 0x672D,0x8E44, // - 0x672E,0x9E51, // - 0x6731,0x8EE9, // - 0x6734,0x9670, // - 0x6736,0x9E53, // - 0x6737,0x9E56, // - 0x6738,0x9E55, // - 0x673A,0x8AF7, // - 0x673D,0x8B80, // - 0x673F,0x9E52, // - 0x6741,0x9E54, // - 0x6746,0x9E57, // - 0x6749,0x9099, // - 0x674E,0x979B, // - 0x674F,0x88C7, // - 0x6750,0x8DDE, // - 0x6751,0x91BA, // - 0x6753,0x8EDB, // - 0x6756,0x8FF1, // - 0x6759,0x9E5A, // - 0x675C,0x936D, // - 0x675E,0x9E58, // - 0x675F,0x91A9, // - 0x6760,0x9E59, // - 0x6761,0x8FF0, // - 0x6762,0x96DB, // - 0x6764,0x9E5C, // - 0x6765,0x9788, // - 0x676A,0x9E61, // - 0x676D,0x8D59, // - 0x676F,0x9474, // - 0x6770,0x9E5E, // - 0x6771,0x938C, // - 0x6772,0x9DDC, // - 0x6773,0x9DE0, // - 0x6775,0x8B6E, // - 0x6777,0x9466, // - 0x677C,0x9E60, // - 0x677E,0x8FBC, // - 0x677F,0x94C2, // - 0x6785,0x9E66, // - 0x6787,0x94F8, // - 0x6789,0x9E5D, // - 0x678B,0x9E63, // - 0x678C,0x9E62, // - 0x6790,0x90CD, // - 0x6795,0x968D, // - 0x6797,0x97D1, // - 0x679A,0x9687, // - 0x679C,0x89CA, // - 0x679D,0x8E7D, // - 0x67A0,0x9867, // - 0x67A1,0x9E65, // - 0x67A2,0x9095, // - 0x67A6,0x9E64, // - 0x67A9,0x9E5F, // - 0x67AF,0x8CCD, // - 0x67B3,0x9E6B, // - 0x67B4,0x9E69, // - 0x67B6,0x89CB, // - 0x67B7,0x9E67, // - 0x67B8,0x9E6D, // - 0x67B9,0x9E73, // - 0x67C1,0x91C6, // - 0x67C4,0x95BF, // - 0x67C6,0x9E75, // - 0x67CA,0x9541, // - 0x67CE,0x9E74, // - 0x67CF,0x9490, // - 0x67D0,0x965E, // - 0x67D1,0x8AB9, // - 0x67D3,0x90F5, // - 0x67D4,0x8F5F, // - 0x67D8,0x92D1, // - 0x67DA,0x974D, // - 0x67DD,0x9E70, // - 0x67DE,0x9E6F, // - 0x67E2,0x9E71, // - 0x67E4,0x9E6E, // - 0x67E7,0x9E76, // - 0x67E9,0x9E6C, // - 0x67EC,0x9E6A, // - 0x67EE,0x9E72, // - 0x67EF,0x9E68, // - 0x67F1,0x928C, // - 0x67F3,0x96F6, // - 0x67F4,0x8EC4, // - 0x67F5,0x8DF2, // - 0x67FB,0x8DB8, // - 0x67FE,0x968F, // - 0x67FF,0x8A60, // - 0x6802,0x92CC, // - 0x6803,0x93C8, // - 0x6804,0x8968, // - 0x6813,0x90F0, // - 0x6816,0x90B2, // - 0x6817,0x8C49, // - 0x681E,0x9E78, // - 0x6821,0x8D5A, // - 0x6822,0x8A9C, // - 0x6829,0x9E7A, // - 0x682A,0x8A94, // - 0x682B,0x9E81, // - 0x6832,0x9E7D, // - 0x6834,0x90F1, // - 0x6838,0x8A6A, // - 0x6839,0x8DAA, // - 0x683C,0x8A69, // - 0x683D,0x8DCD, // - 0x6840,0x9E7B, // - 0x6841,0x8C85, // - 0x6842,0x8C6A, // - 0x6843,0x938D, // - 0x6846,0x9E79, // - 0x6848,0x88C4, // - 0x684D,0x9E7C, // - 0x684E,0x9E7E, // - 0x6850,0x8BCB, // - 0x6851,0x8C4B, // - 0x6853,0x8ABA, // - 0x6854,0x8B6A, // - 0x6859,0x9E82, // - 0x685C,0x8DF7, // - 0x685D,0x9691, // - 0x685F,0x8E56, // - 0x6863,0x9E83, // - 0x6867,0x954F, // - 0x6874,0x9E8F, // - 0x6876,0x89B1, // - 0x6877,0x9E84, // - 0x687E,0x9E95, // - 0x687F,0x9E85, // - 0x6881,0x97C0, // - 0x6883,0x9E8C, // - 0x6885,0x947E, // - 0x688D,0x9E94, // - 0x688F,0x9E87, // - 0x6893,0x88B2, // - 0x6894,0x9E89, // - 0x689B,0x9E8B, // - 0x689D,0x9E8A, // - 0x689F,0x9E86, // - 0x68A0,0x9E91, // - 0x68A2,0x8FBD, // - 0x68A6,0x9AEB, // - 0x68A7,0x8CE6, // - 0x68A8,0x979C, // - 0x68AD,0x9E88, // - 0x68AF,0x92F2, // - 0x68B0,0x8A42, // - 0x68B1,0x8DAB, // - 0x68B3,0x9E80, // - 0x68B5,0x9E90, // - 0x68B6,0x8A81, // - 0x68B9,0x9E8E, // - 0x68BA,0x9E92, // - 0x68BC,0x938E, // - 0x68C4,0x8AFC, // - 0x68C6,0x9EB0, // - 0x68C9,0x96C7, // - 0x68CA,0x9E97, // - 0x68CB,0x8AFB, // - 0x68CD,0x9E9E, // - 0x68D2,0x965F, // - 0x68D4,0x9E9F, // - 0x68D5,0x9EA1, // - 0x68D7,0x9EA5, // - 0x68D8,0x9E99, // - 0x68DA,0x9249, // - 0x68DF,0x938F, // - 0x68E0,0x9EA9, // - 0x68E1,0x9E9C, // - 0x68E3,0x9EA6, // - 0x68E7,0x9EA0, // - 0x68EE,0x9058, // - 0x68EF,0x9EAA, // - 0x68F2,0x90B1, // - 0x68F9,0x9EA8, // - 0x68FA,0x8ABB, // - 0x6900,0x986F, // - 0x6901,0x9E96, // - 0x6904,0x9EA4, // - 0x6905,0x88D6, // - 0x6908,0x9E98, // - 0x690B,0x96B8, // - 0x690C,0x9E9D, // - 0x690D,0x9041, // - 0x690E,0x92C5, // - 0x690F,0x9E93, // - 0x6912,0x9EA3, // - 0x6919,0x909A, // - 0x691A,0x9EAD, // - 0x691B,0x8A91, // - 0x691C,0x8C9F, // - 0x6921,0x9EAF, // - 0x6922,0x9E9A, // - 0x6923,0x9EAE, // - 0x6925,0x9EA7, // - 0x6926,0x9E9B, // - 0x6928,0x9EAB, // - 0x692A,0x9EAC, // - 0x6930,0x9EBD, // - 0x6934,0x93CC, // - 0x6936,0x9EA2, // - 0x6939,0x9EB9, // - 0x693D,0x9EBB, // - 0x693F,0x92D6, // - 0x694A,0x976B, // - 0x6953,0x9596, // - 0x6954,0x9EB6, // - 0x6955,0x91C8, // - 0x6959,0x9EBC, // - 0x695A,0x915E, // - 0x695C,0x9EB3, // - 0x695D,0x9EC0, // - 0x695E,0x9EBF, // - 0x6960,0x93ED, // - 0x6961,0x9EBE, // - 0x6962,0x93E8, // - 0x696A,0x9EC2, // - 0x696B,0x9EB5, // - 0x696D,0x8BC6, // - 0x696E,0x9EB8, // - 0x696F,0x8F7C, // - 0x6973,0x9480, // - 0x6974,0x9EBA, // - 0x6975,0x8BC9, // - 0x6977,0x9EB2, // - 0x6978,0x9EB4, // - 0x6979,0x9EB1, // - 0x697C,0x984F, // - 0x697D,0x8A79, // - 0x697E,0x9EB7, // - 0x6981,0x9EC1, // - 0x6982,0x8A54, // - 0x698A,0x8DE5, // - 0x698E,0x897C, // - 0x6991,0x9ED2, // - 0x6994,0x9850, // - 0x6995,0x9ED5, // - 0x699B,0x9059, // - 0x699C,0x9ED4, // - 0x69A0,0x9ED3, // - 0x69A7,0x9ED0, // - 0x69AE,0x9EC4, // - 0x69B1,0x9EE1, // - 0x69B2,0x9EC3, // - 0x69B4,0x9ED6, // - 0x69BB,0x9ECE, // - 0x69BE,0x9EC9, // - 0x69BF,0x9EC6, // - 0x69C1,0x9EC7, // - 0x69C3,0x9ECF, // - 0x69C7,0xEAA0, // - 0x69CA,0x9ECC, // - 0x69CB,0x8D5C, // - 0x69CC,0x92C6, // - 0x69CD,0x9184, // - 0x69CE,0x9ECA, // - 0x69D0,0x9EC5, // - 0x69D3,0x9EC8, // - 0x69D8,0x976C, // - 0x69D9,0x968A, // - 0x69DD,0x9ECD, // - 0x69DE,0x9ED7, // - 0x69E7,0x9EDF, // - 0x69E8,0x9ED8, // - 0x69EB,0x9EE5, // - 0x69ED,0x9EE3, // - 0x69F2,0x9EDE, // - 0x69F9,0x9EDD, // - 0x69FB,0x92CE, // - 0x69FD,0x9185, // - 0x69FF,0x9EDB, // - 0x6A02,0x9ED9, // - 0x6A05,0x9EE0, // - 0x6A0A,0x9EE6, // - 0x6A0B,0x94F3, // - 0x6A0C,0x9EEC, // - 0x6A12,0x9EE7, // - 0x6A13,0x9EEA, // - 0x6A14,0x9EE4, // - 0x6A17,0x9294, // - 0x6A19,0x9557, // - 0x6A1B,0x9EDA, // - 0x6A1E,0x9EE2, // - 0x6A1F,0x8FBE, // - 0x6A21,0x96CD, // - 0x6A22,0x9EF6, // - 0x6A23,0x9EE9, // - 0x6A29,0x8CA0, // - 0x6A2A,0x89A1, // - 0x6A2B,0x8A7E, // - 0x6A2E,0x9ED1, // - 0x6A35,0x8FBF, // - 0x6A36,0x9EEE, // - 0x6A38,0x9EF5, // - 0x6A39,0x8EF7, // - 0x6A3A,0x8A92, // - 0x6A3D,0x924D, // - 0x6A44,0x9EEB, // - 0x6A47,0x9EF0, // - 0x6A48,0x9EF4, // - 0x6A4B,0x8BB4, // - 0x6A58,0x8B6B, // - 0x6A59,0x9EF2, // - 0x6A5F,0x8B40, // - 0x6A61,0x93C9, // - 0x6A62,0x9EF1, // - 0x6A66,0x9EF3, // - 0x6A72,0x9EED, // - 0x6A78,0x9EEF, // - 0x6A7F,0x8A80, // - 0x6A80,0x9268, // - 0x6A84,0x9EFA, // - 0x6A8D,0x9EF8, // - 0x6A8E,0x8CE7, // - 0x6A90,0x9EF7, // - 0x6A97,0x9F40, // - 0x6A9C,0x9E77, // - 0x6AA0,0x9EF9, // - 0x6AA2,0x9EFB, // - 0x6AA3,0x9EFC, // - 0x6AAA,0x9F4B, // - 0x6AAC,0x9F47, // - 0x6AAE,0x9E8D, // - 0x6AB3,0x9F46, // - 0x6AB8,0x9F45, // - 0x6ABB,0x9F42, // - 0x6AC1,0x9EE8, // - 0x6AC2,0x9F44, // - 0x6AC3,0x9F43, // - 0x6AD1,0x9F49, // - 0x6AD3,0x9845, // - 0x6ADA,0x9F4C, // - 0x6ADB,0x8BF9, // - 0x6ADE,0x9F48, // - 0x6ADF,0x9F4A, // - 0x6AE8,0x94A5, // - 0x6AEA,0x9F4D, // - 0x6AFA,0x9F51, // - 0x6AFB,0x9F4E, // - 0x6B04,0x9793, // - 0x6B05,0x9F4F, // - 0x6B0A,0x9EDC, // - 0x6B12,0x9F52, // - 0x6B16,0x9F53, // - 0x6B1D,0x8954, // - 0x6B1F,0x9F55, // - 0x6B20,0x8C87, // - 0x6B21,0x8E9F, // - 0x6B23,0x8BD3, // - 0x6B27,0x89A2, // - 0x6B32,0x977E, // - 0x6B37,0x9F57, // - 0x6B38,0x9F56, // - 0x6B39,0x9F59, // - 0x6B3A,0x8B5C, // - 0x6B3D,0x8BD4, // - 0x6B3E,0x8ABC, // - 0x6B43,0x9F5C, // - 0x6B49,0x9F5D, // - 0x6B4C,0x89CC, // - 0x6B4E,0x9256, // - 0x6B50,0x9F5E, // - 0x6B53,0x8ABD, // - 0x6B54,0x9F60, // - 0x6B59,0x9F5F, // - 0x6B5B,0x9F61, // - 0x6B5F,0x9F62, // - 0x6B61,0x9F63, // - 0x6B62,0x8E7E, // - 0x6B63,0x90B3, // - 0x6B64,0x8D9F, // - 0x6B66,0x9590, // - 0x6B69,0x95E0, // - 0x6B6A,0x9863, // - 0x6B6F,0x8E95, // - 0x6B73,0x8DCE, // - 0x6B74,0x97F0, // - 0x6B78,0x9F64, // - 0x6B79,0x9F65, // - 0x6B7B,0x8E80, // - 0x6B7F,0x9F66, // - 0x6B80,0x9F67, // - 0x6B83,0x9F69, // - 0x6B84,0x9F68, // - 0x6B86,0x9677, // - 0x6B89,0x8F7D, // - 0x6B8A,0x8EEA, // - 0x6B8B,0x8E63, // - 0x6B8D,0x9F6A, // - 0x6B95,0x9F6C, // - 0x6B96,0x9042, // - 0x6B98,0x9F6B, // - 0x6B9E,0x9F6D, // - 0x6BA4,0x9F6E, // - 0x6BAA,0x9F6F, // - 0x6BAB,0x9F70, // - 0x6BAF,0x9F71, // - 0x6BB1,0x9F73, // - 0x6BB2,0x9F72, // - 0x6BB3,0x9F74, // - 0x6BB4,0x89A3, // - 0x6BB5,0x9269, // - 0x6BB7,0x9F75, // - 0x6BBA,0x8E45, // - 0x6BBB,0x8A6B, // - 0x6BBC,0x9F76, // - 0x6BBF,0x9361, // - 0x6BC0,0x9ACA, // - 0x6BC5,0x8B42, // - 0x6BC6,0x9F77, // - 0x6BCB,0x9F78, // - 0x6BCD,0x95EA, // - 0x6BCE,0x9688, // - 0x6BD2,0x93C5, // - 0x6BD3,0x9F79, // - 0x6BD4,0x94E4, // - 0x6BD8,0x94F9, // - 0x6BDB,0x96D1, // - 0x6BDF,0x9F7A, // - 0x6BEB,0x9F7C, // - 0x6BEC,0x9F7B, // - 0x6BEF,0x9F7E, // - 0x6BF3,0x9F7D, // - 0x6C08,0x9F81, // - 0x6C0F,0x8E81, // - 0x6C11,0x96AF, // - 0x6C13,0x9F82, // - 0x6C14,0x9F83, // - 0x6C17,0x8B43, // - 0x6C1B,0x9F84, // - 0x6C23,0x9F86, // - 0x6C24,0x9F85, // - 0x6C34,0x9085, // - 0x6C37,0x9558, // - 0x6C38,0x8969, // - 0x6C3E,0x94C3, // - 0x6C40,0x92F3, // - 0x6C41,0x8F60, // - 0x6C42,0x8B81, // - 0x6C4E,0x94C4, // - 0x6C50,0x8EAC, // - 0x6C55,0x9F88, // - 0x6C57,0x8ABE, // - 0x6C5A,0x8998, // - 0x6C5D,0x93F0, // - 0x6C5E,0x9F87, // - 0x6C5F,0x8D5D, // - 0x6C60,0x9272, // - 0x6C62,0x9F89, // - 0x6C68,0x9F91, // - 0x6C6A,0x9F8A, // - 0x6C70,0x91BF, // - 0x6C72,0x8B82, // - 0x6C73,0x9F92, // - 0x6C7A,0x8C88, // - 0x6C7D,0x8B44, // - 0x6C7E,0x9F90, // - 0x6C81,0x9F8E, // - 0x6C82,0x9F8B, // - 0x6C83,0x9780, // - 0x6C88,0x92BE, // - 0x6C8C,0x93D7, // - 0x6C8D,0x9F8C, // - 0x6C90,0x9F94, // - 0x6C92,0x9F93, // - 0x6C93,0x8C42, // - 0x6C96,0x89AB, // - 0x6C99,0x8DB9, // - 0x6C9A,0x9F8D, // - 0x6C9B,0x9F8F, // - 0x6CA1,0x9676, // - 0x6CA2,0x91F2, // - 0x6CAB,0x9697, // - 0x6CAE,0x9F9C, // - 0x6CB1,0x9F9D, // - 0x6CB3,0x89CD, // - 0x6CB8,0x95A6, // - 0x6CB9,0x96FB, // - 0x6CBA,0x9F9F, // - 0x6CBB,0x8EA1, // - 0x6CBC,0x8FC0, // - 0x6CBD,0x9F98, // - 0x6CBE,0x9F9E, // - 0x6CBF,0x8988, // - 0x6CC1,0x8BB5, // - 0x6CC4,0x9F95, // - 0x6CC5,0x9F9A, // - 0x6CC9,0x90F2, // - 0x6CCA,0x9491, // - 0x6CCC,0x94E5, // - 0x6CD3,0x9F97, // - 0x6CD5,0x9640, // - 0x6CD7,0x9F99, // - 0x6CD9,0x9FA2, // - 0x6CDB,0x9FA0, // - 0x6CDD,0x9F9B, // - 0x6CE1,0x9641, // - 0x6CE2,0x9467, // - 0x6CE3,0x8B83, // - 0x6CE5,0x9344, // - 0x6CE8,0x928D, // - 0x6CEA,0x9FA3, // - 0x6CEF,0x9FA1, // - 0x6CF0,0x91D7, // - 0x6CF1,0x9F96, // - 0x6CF3,0x896A, // - 0x6D0B,0x976D, // - 0x6D0C,0x9FAE, // - 0x6D12,0x9FAD, // - 0x6D17,0x90F4, // - 0x6D19,0x9FAA, // - 0x6D1B,0x978C, // - 0x6D1E,0x93B4, // - 0x6D1F,0x9FA4, // - 0x6D25,0x92C3, // - 0x6D29,0x896B, // - 0x6D2A,0x8D5E, // - 0x6D2B,0x9FA7, // - 0x6D32,0x8F46, // - 0x6D33,0x9FAC, // - 0x6D35,0x9FAB, // - 0x6D36,0x9FA6, // - 0x6D38,0x9FA9, // - 0x6D3B,0x8A88, // - 0x6D3D,0x9FA8, // - 0x6D3E,0x9468, // - 0x6D41,0x97AC, // - 0x6D44,0x8FF2, // - 0x6D45,0x90F3, // - 0x6D59,0x9FB4, // - 0x6D5A,0x9FB2, // - 0x6D5C,0x956C, // - 0x6D63,0x9FAF, // - 0x6D64,0x9FB1, // - 0x6D66,0x8959, // - 0x6D69,0x8D5F, // - 0x6D6A,0x9851, // - 0x6D6C,0x8A5C, // - 0x6D6E,0x9582, // - 0x6D74,0x9781, // - 0x6D77,0x8A43, // - 0x6D78,0x905A, // - 0x6D79,0x9FB3, // - 0x6D85,0x9FB8, // - 0x6D88,0x8FC1, // - 0x6D8C,0x974F, // - 0x6D8E,0x9FB5, // - 0x6D93,0x9FB0, // - 0x6D95,0x9FB6, // - 0x6D99,0x97DC, // - 0x6D9B,0x9393, // - 0x6D9C,0x93C0, // - 0x6DAF,0x8A55, // - 0x6DB2,0x8974, // - 0x6DB5,0x9FBC, // - 0x6DB8,0x9FBF, // - 0x6DBC,0x97C1, // - 0x6DC0,0x9784, // - 0x6DC5,0x9FC6, // - 0x6DC6,0x9FC0, // - 0x6DC7,0x9FBD, // - 0x6DCB,0x97D2, // - 0x6DCC,0x9FC3, // - 0x6DD1,0x8F69, // - 0x6DD2,0x9FC5, // - 0x6DD5,0x9FCA, // - 0x6DD8,0x9391, // - 0x6DD9,0x9FC8, // - 0x6DDE,0x9FC2, // - 0x6DE1,0x9257, // - 0x6DE4,0x9FC9, // - 0x6DE6,0x9FBE, // - 0x6DE8,0x9FC4, // - 0x6DEA,0x9FCB, // - 0x6DEB,0x88FA, // - 0x6DEC,0x9FC1, // - 0x6DEE,0x9FCC, // - 0x6DF3,0x8F7E, // - 0x6DF5,0x95A3, // - 0x6DF7,0x8DAC, // - 0x6DF9,0x9FB9, // - 0x6DFA,0x9FC7, // - 0x6DFB,0x9359, // - 0x6E05,0x90B4, // - 0x6E07,0x8A89, // - 0x6E08,0x8DCF, // - 0x6E09,0x8FC2, // - 0x6E0A,0x9FBB, // - 0x6E0B,0x8F61, // - 0x6E13,0x8C6B, // - 0x6E15,0x9FBA, // - 0x6E19,0x9FD0, // - 0x6E1A,0x8F8D, // - 0x6E1B,0x8CB8, // - 0x6E1D,0x9FDF, // - 0x6E1F,0x9FD9, // - 0x6E20,0x8B94, // - 0x6E21,0x936E, // - 0x6E23,0x9FD4, // - 0x6E24,0x9FDD, // - 0x6E25,0x88AD, // - 0x6E26,0x8951, // - 0x6E29,0x89B7, // - 0x6E2B,0x9FD6, // - 0x6E2C,0x91AA, // - 0x6E2D,0x9FCD, // - 0x6E2E,0x9FCF, // - 0x6E2F,0x8D60, // - 0x6E38,0x9FE0, // - 0x6E3A,0x9FDB, // - 0x6E3E,0x9FD3, // - 0x6E43,0x9FDA, // - 0x6E4A,0x96A9, // - 0x6E4D,0x9FD8, // - 0x6E4E,0x9FDC, // - 0x6E56,0x8CCE, // - 0x6E58,0x8FC3, // - 0x6E5B,0x9258, // - 0x6E5F,0x9FD2, // - 0x6E67,0x974E, // - 0x6E6B,0x9FD5, // - 0x6E6E,0x9FCE, // - 0x6E6F,0x9392, // - 0x6E72,0x9FD1, // - 0x6E76,0x9FD7, // - 0x6E7E,0x9870, // - 0x6E7F,0x8EBC, // - 0x6E80,0x969E, // - 0x6E82,0x9FE1, // - 0x6E8C,0x94AC, // - 0x6E8F,0x9FED, // - 0x6E90,0x8CB9, // - 0x6E96,0x8F80, // - 0x6E98,0x9FE3, // - 0x6E9C,0x97AD, // - 0x6E9D,0x8D61, // - 0x6E9F,0x9FF0, // - 0x6EA2,0x88EC, // - 0x6EA5,0x9FEE, // - 0x6EAA,0x9FE2, // - 0x6EAF,0x9FE8, // - 0x6EB2,0x9FEA, // - 0x6EB6,0x976E, // - 0x6EB7,0x9FE5, // - 0x6EBA,0x934D, // - 0x6EBD,0x9FE7, // - 0x6EC2,0x9FEF, // - 0x6EC4,0x9FE9, // - 0x6EC5,0x96C5, // - 0x6EC9,0x9FE4, // - 0x6ECB,0x8EA0, // - 0x6ECC,0x9FFC, // - 0x6ED1,0x8A8A, // - 0x6ED3,0x9FE6, // - 0x6ED4,0x9FEB, // - 0x6ED5,0x9FEC, // - 0x6EDD,0x91EA, // - 0x6EDE,0x91D8, // - 0x6EEC,0x9FF4, // - 0x6EEF,0x9FFA, // - 0x6EF2,0x9FF8, // - 0x6EF4,0x9348, // - 0x6EF7,0xE042, // - 0x6EF8,0x9FF5, // - 0x6EFE,0x9FF6, // - 0x6EFF,0x9FDE, // - 0x6F01,0x8B99, // - 0x6F02,0x9559, // - 0x6F06,0x8EBD, // - 0x6F09,0x8D97, // - 0x6F0F,0x9852, // - 0x6F11,0x9FF2, // - 0x6F13,0xE041, // - 0x6F14,0x8989, // - 0x6F15,0x9186, // - 0x6F20,0x9499, // - 0x6F22,0x8ABF, // - 0x6F23,0x97F8, // - 0x6F2B,0x969F, // - 0x6F2C,0x92D0, // - 0x6F31,0x9FF9, // - 0x6F32,0x9FFB, // - 0x6F38,0x9151, // - 0x6F3E,0xE040, // - 0x6F3F,0x9FF7, // - 0x6F41,0x9FF1, // - 0x6F45,0x8AC1, // - 0x6F54,0x8C89, // - 0x6F58,0xE04E, // - 0x6F5B,0xE049, // - 0x6F5C,0x90F6, // - 0x6F5F,0x8A83, // - 0x6F64,0x8F81, // - 0x6F66,0xE052, // - 0x6F6D,0xE04B, // - 0x6F6E,0x92AA, // - 0x6F6F,0xE048, // - 0x6F70,0x92D7, // - 0x6F74,0xE06B, // - 0x6F78,0xE045, // - 0x6F7A,0xE044, // - 0x6F7C,0xE04D, // - 0x6F80,0xE047, // - 0x6F81,0xE046, // - 0x6F82,0xE04C, // - 0x6F84,0x909F, // - 0x6F86,0xE043, // - 0x6F8E,0xE04F, // - 0x6F91,0xE050, // - 0x6F97,0x8AC0, // - 0x6FA1,0xE055, // - 0x6FA3,0xE054, // - 0x6FA4,0xE056, // - 0x6FAA,0xE059, // - 0x6FB1,0x9362, // - 0x6FB3,0xE053, // - 0x6FB9,0xE057, // - 0x6FC0,0x8C83, // - 0x6FC1,0x91F7, // - 0x6FC2,0xE051, // - 0x6FC3,0x945A, // - 0x6FC6,0xE058, // - 0x6FD4,0xE05D, // - 0x6FD8,0xE05E, // - 0x6FDB,0xE061, // - 0x6FDF,0xE05A, // - 0x6FE0,0x8D8A, // - 0x6FE1,0x9447, // - 0x6FE4,0x9FB7, // - 0x6FEB,0x9794, // - 0x6FEC,0xE05C, // - 0x6FEE,0xE060, // - 0x6FEF,0x91F3, // - 0x6FF1,0xE05F, // - 0x6FF3,0xE04A, // - 0x6FF6,0xE889, // - 0x6FFA,0xE064, // - 0x6FFE,0xE068, // - 0x7001,0xE066, // - 0x7009,0xE062, // - 0x700B,0xE063, // - 0x700F,0xE067, // - 0x7011,0xE065, // - 0x7015,0x956D, // - 0x7018,0xE06D, // - 0x701A,0xE06A, // - 0x701B,0xE069, // - 0x701D,0xE06C, // - 0x701E,0x93D2, // - 0x701F,0xE06E, // - 0x7026,0x9295, // - 0x7027,0x91EB, // - 0x702C,0x90A3, // - 0x7030,0xE06F, // - 0x7032,0xE071, // - 0x703E,0xE070, // - 0x704C,0x9FF3, // - 0x7051,0xE072, // - 0x7058,0x93E5, // - 0x7063,0xE073, // - 0x706B,0x89CE, // - 0x706F,0x9394, // - 0x7070,0x8A44, // - 0x7078,0x8B84, // - 0x707C,0x8EDC, // - 0x707D,0x8DD0, // - 0x7089,0x9846, // - 0x708A,0x9086, // - 0x708E,0x898A, // - 0x7092,0xE075, // - 0x7099,0xE074, // - 0x70AC,0xE078, // - 0x70AD,0x9259, // - 0x70AE,0xE07B, // - 0x70AF,0xE076, // - 0x70B3,0xE07A, // - 0x70B8,0xE079, // - 0x70B9,0x935F, // - 0x70BA,0x88D7, // - 0x70C8,0x97F3, // - 0x70CB,0xE07D, // - 0x70CF,0x8947, // - 0x70D9,0xE080, // - 0x70DD,0xE07E, // - 0x70DF,0xE07C, // - 0x70F1,0xE077, // - 0x70F9,0x9642, // - 0x70FD,0xE082, // - 0x7109,0xE081, // - 0x7114,0x898B, // - 0x7119,0xE084, // - 0x711A,0x95B0, // - 0x711C,0xE083, // - 0x7121,0x96B3, // - 0x7126,0x8FC5, // - 0x7136,0x9152, // - 0x713C,0x8FC4, // - 0x7149,0x97F9, // - 0x714C,0xE08A, // - 0x714E,0x90F7, // - 0x7155,0xE086, // - 0x7156,0xE08B, // - 0x7159,0x898C, // - 0x7162,0xE089, // - 0x7164,0x9481, // - 0x7165,0xE085, // - 0x7166,0xE088, // - 0x7167,0x8FC6, // - 0x7169,0x94CF, // - 0x716C,0xE08C, // - 0x716E,0x8ECF, // - 0x717D,0x90F8, // - 0x7184,0xE08F, // - 0x7188,0xE087, // - 0x718A,0x8C46, // - 0x718F,0xE08D, // - 0x7194,0x976F, // - 0x7195,0xE090, // - 0x7199,0xEAA4, // - 0x719F,0x8F6E, // - 0x71A8,0xE091, // - 0x71AC,0xE092, // - 0x71B1,0x944D, // - 0x71B9,0xE094, // - 0x71BE,0xE095, // - 0x71C3,0x9452, // - 0x71C8,0x9395, // - 0x71C9,0xE097, // - 0x71CE,0xE099, // - 0x71D0,0x97D3, // - 0x71D2,0xE096, // - 0x71D4,0xE098, // - 0x71D5,0x898D, // - 0x71D7,0xE093, // - 0x71DF,0x9A7A, // - 0x71E0,0xE09A, // - 0x71E5,0x9187, // - 0x71E6,0x8E57, // - 0x71E7,0xE09C, // - 0x71EC,0xE09B, // - 0x71ED,0x9043, // - 0x71EE,0x99D7, // - 0x71F5,0xE09D, // - 0x71F9,0xE09F, // - 0x71FB,0xE08E, // - 0x71FC,0xE09E, // - 0x71FF,0xE0A0, // - 0x7206,0x949A, // - 0x720D,0xE0A1, // - 0x7210,0xE0A2, // - 0x721B,0xE0A3, // - 0x7228,0xE0A4, // - 0x722A,0x92DC, // - 0x722C,0xE0A6, // - 0x722D,0xE0A5, // - 0x7230,0xE0A7, // - 0x7232,0xE0A8, // - 0x7235,0x8EDD, // - 0x7236,0x9583, // - 0x723A,0x96EA, // - 0x723B,0xE0A9, // - 0x723C,0xE0AA, // - 0x723D,0x9175, // - 0x723E,0x8EA2, // - 0x723F,0xE0AB, // - 0x7240,0xE0AC, // - 0x7246,0xE0AD, // - 0x7247,0x95D0, // - 0x7248,0x94C5, // - 0x724B,0xE0AE, // - 0x724C,0x9476, // - 0x7252,0x92AB, // - 0x7258,0xE0AF, // - 0x7259,0x89E5, // - 0x725B,0x8B8D, // - 0x725D,0x96C4, // - 0x725F,0x96B4, // - 0x7261,0x89B2, // - 0x7262,0x9853, // - 0x7267,0x9671, // - 0x7269,0x95A8, // - 0x7272,0x90B5, // - 0x7274,0xE0B0, // - 0x7279,0x93C1, // - 0x727D,0x8CA1, // - 0x727E,0xE0B1, // - 0x7280,0x8DD2, // - 0x7281,0xE0B3, // - 0x7282,0xE0B2, // - 0x7287,0xE0B4, // - 0x7292,0xE0B5, // - 0x7296,0xE0B6, // - 0x72A0,0x8B5D, // - 0x72A2,0xE0B7, // - 0x72A7,0xE0B8, // - 0x72AC,0x8CA2, // - 0x72AF,0x94C6, // - 0x72B2,0xE0BA, // - 0x72B6,0x8FF3, // - 0x72B9,0xE0B9, // - 0x72C2,0x8BB6, // - 0x72C3,0xE0BB, // - 0x72C4,0xE0BD, // - 0x72C6,0xE0BC, // - 0x72CE,0xE0BE, // - 0x72D0,0x8CCF, // - 0x72D2,0xE0BF, // - 0x72D7,0x8BE7, // - 0x72D9,0x915F, // - 0x72DB,0x8D9D, // - 0x72E0,0xE0C1, // - 0x72E1,0xE0C2, // - 0x72E2,0xE0C0, // - 0x72E9,0x8EEB, // - 0x72EC,0x93C6, // - 0x72ED,0x8BB7, // - 0x72F7,0xE0C4, // - 0x72F8,0x924B, // - 0x72F9,0xE0C3, // - 0x72FC,0x9854, // - 0x72FD,0x9482, // - 0x730A,0xE0C7, // - 0x7316,0xE0C9, // - 0x7317,0xE0C6, // - 0x731B,0x96D2, // - 0x731C,0xE0C8, // - 0x731D,0xE0CA, // - 0x731F,0x97C2, // - 0x7325,0xE0CE, // - 0x7329,0xE0CD, // - 0x732A,0x9296, // - 0x732B,0x944C, // - 0x732E,0x8CA3, // - 0x732F,0xE0CC, // - 0x7334,0xE0CB, // - 0x7336,0x9750, // - 0x7337,0x9751, // - 0x733E,0xE0CF, // - 0x733F,0x898E, // - 0x7344,0x8D96, // - 0x7345,0x8E82, // - 0x734E,0xE0D0, // - 0x734F,0xE0D1, // - 0x7357,0xE0D3, // - 0x7363,0x8F62, // - 0x7368,0xE0D5, // - 0x736A,0xE0D4, // - 0x7370,0xE0D6, // - 0x7372,0x8A6C, // - 0x7375,0xE0D8, // - 0x7378,0xE0D7, // - 0x737A,0xE0DA, // - 0x737B,0xE0D9, // - 0x7384,0x8CBA, // - 0x7387,0x97A6, // - 0x7389,0x8BCA, // - 0x738B,0x89A4, // - 0x7396,0x8BE8, // - 0x73A9,0x8ADF, // - 0x73B2,0x97E6, // - 0x73B3,0xE0DC, // - 0x73BB,0xE0DE, // - 0x73C0,0xE0DF, // - 0x73C2,0x89CF, // - 0x73C8,0xE0DB, // - 0x73CA,0x8E58, // - 0x73CD,0x92BF, // - 0x73CE,0xE0DD, // - 0x73DE,0xE0E2, // - 0x73E0,0x8EEC, // - 0x73E5,0xE0E0, // - 0x73EA,0x8C5D, // - 0x73ED,0x94C7, // - 0x73EE,0xE0E1, // - 0x73F1,0xE0FC, // - 0x73F8,0xE0E7, // - 0x73FE,0x8CBB, // - 0x7403,0x8B85, // - 0x7405,0xE0E4, // - 0x7406,0x979D, // - 0x7409,0x97AE, // - 0x7422,0x91F4, // - 0x7425,0xE0E6, // - 0x7432,0xE0E8, // - 0x7433,0x97D4, // - 0x7434,0x8BD5, // - 0x7435,0x94FA, // - 0x7436,0x9469, // - 0x743A,0xE0E9, // - 0x743F,0xE0EB, // - 0x7441,0xE0EE, // - 0x7455,0xE0EA, // - 0x7459,0xE0ED, // - 0x745A,0x8CE8, // - 0x745B,0x896C, // - 0x745C,0xE0EF, // - 0x745E,0x9090, // - 0x745F,0xE0EC, // - 0x7460,0x97DA, // - 0x7463,0xE0F2, // - 0x7464,0xEAA2, // - 0x7469,0xE0F0, // - 0x746A,0xE0F3, // - 0x746F,0xE0E5, // - 0x7470,0xE0F1, // - 0x7473,0x8DBA, // - 0x7476,0xE0F4, // - 0x747E,0xE0F5, // - 0x7483,0x979E, // - 0x748B,0xE0F6, // - 0x749E,0xE0F7, // - 0x74A2,0xE0E3, // - 0x74A7,0xE0F8, // - 0x74B0,0x8AC2, // - 0x74BD,0x8EA3, // - 0x74CA,0xE0F9, // - 0x74CF,0xE0FA, // - 0x74D4,0xE0FB, // - 0x74DC,0x895A, // - 0x74E0,0xE140, // - 0x74E2,0x955A, // - 0x74E3,0xE141, // - 0x74E6,0x8AA2, // - 0x74E7,0xE142, // - 0x74E9,0xE143, // - 0x74EE,0xE144, // - 0x74F0,0xE146, // - 0x74F1,0xE147, // - 0x74F2,0xE145, // - 0x74F6,0x9572, // - 0x74F7,0xE149, // - 0x74F8,0xE148, // - 0x7503,0xE14B, // - 0x7504,0xE14A, // - 0x7505,0xE14C, // - 0x750C,0xE14D, // - 0x750D,0xE14F, // - 0x750E,0xE14E, // - 0x7511,0x8D99, // - 0x7513,0xE151, // - 0x7515,0xE150, // - 0x7518,0x8AC3, // - 0x751A,0x9072, // - 0x751E,0xE152, // - 0x751F,0x90B6, // - 0x7523,0x8E59, // - 0x7525,0x8999, // - 0x7526,0xE153, // - 0x7528,0x9770, // - 0x752B,0x95E1, // - 0x752C,0xE154, // - 0x7530,0x9363, // - 0x7531,0x9752, // - 0x7532,0x8D62, // - 0x7533,0x905C, // - 0x7537,0x926A, // - 0x7538,0x99B2, // - 0x753A,0x92AC, // - 0x753B,0x89E6, // - 0x753C,0xE155, // - 0x7544,0xE156, // - 0x7549,0xE159, // - 0x754A,0xE158, // - 0x754B,0x9DC0, // - 0x754C,0x8A45, // - 0x754D,0xE157, // - 0x754F,0x88D8, // - 0x7551,0x94A8, // - 0x7554,0x94C8, // - 0x7559,0x97AF, // - 0x755A,0xE15C, // - 0x755B,0xE15A, // - 0x755C,0x927B, // - 0x755D,0x90A4, // - 0x7560,0x94A9, // - 0x7562,0x954C, // - 0x7564,0xE15E, // - 0x7565,0x97AA, // - 0x7566,0x8C6C, // - 0x7567,0xE15F, // - 0x7569,0xE15D, // - 0x756A,0x94D4, // - 0x756B,0xE160, // - 0x756D,0xE161, // - 0x7570,0x88D9, // - 0x7573,0x8FF4, // - 0x7574,0xE166, // - 0x7576,0xE163, // - 0x7577,0x93EB, // - 0x7578,0xE162, // - 0x757F,0x8B45, // - 0x7582,0xE169, // - 0x7586,0xE164, // - 0x7587,0xE165, // - 0x7589,0xE168, // - 0x758A,0xE167, // - 0x758B,0x9544, // - 0x758E,0x9161, // - 0x758F,0x9160, // - 0x7591,0x8B5E, // - 0x7594,0xE16A, // - 0x759A,0xE16B, // - 0x759D,0xE16C, // - 0x75A3,0xE16E, // - 0x75A5,0xE16D, // - 0x75AB,0x8975, // - 0x75B1,0xE176, // - 0x75B2,0x94E6, // - 0x75B3,0xE170, // - 0x75B5,0xE172, // - 0x75B8,0xE174, // - 0x75B9,0x905D, // - 0x75BC,0xE175, // - 0x75BD,0xE173, // - 0x75BE,0x8EBE, // - 0x75C2,0xE16F, // - 0x75C3,0xE171, // - 0x75C5,0x9561, // - 0x75C7,0x8FC7, // - 0x75CA,0xE178, // - 0x75CD,0xE177, // - 0x75D2,0xE179, // - 0x75D4,0x8EA4, // - 0x75D5,0x8DAD, // - 0x75D8,0x9397, // - 0x75D9,0xE17A, // - 0x75DB,0x92C9, // - 0x75DE,0xE17C, // - 0x75E2,0x979F, // - 0x75E3,0xE17B, // - 0x75E9,0x9189, // - 0x75F0,0xE182, // - 0x75F2,0xE184, // - 0x75F3,0xE185, // - 0x75F4,0x9273, // - 0x75FA,0xE183, // - 0x75FC,0xE180, // - 0x75FE,0xE17D, // - 0x75FF,0xE17E, // - 0x7601,0xE181, // - 0x7609,0xE188, // - 0x760B,0xE186, // - 0x760D,0xE187, // - 0x761F,0xE189, // - 0x7620,0xE18B, // - 0x7621,0xE18C, // - 0x7622,0xE18D, // - 0x7624,0xE18E, // - 0x7627,0xE18A, // - 0x7630,0xE190, // - 0x7634,0xE18F, // - 0x763B,0xE191, // - 0x7642,0x97C3, // - 0x7646,0xE194, // - 0x7647,0xE192, // - 0x7648,0xE193, // - 0x764C,0x8AE0, // - 0x7652,0x96FC, // - 0x7656,0x95C8, // - 0x7658,0xE196, // - 0x765C,0xE195, // - 0x7661,0xE197, // - 0x7662,0xE198, // - 0x7667,0xE19C, // - 0x7668,0xE199, // - 0x7669,0xE19A, // - 0x766A,0xE19B, // - 0x766C,0xE19D, // - 0x7670,0xE19E, // - 0x7672,0xE19F, // - 0x7676,0xE1A0, // - 0x7678,0xE1A1, // - 0x767A,0x94AD, // - 0x767B,0x936F, // - 0x767C,0xE1A2, // - 0x767D,0x9492, // - 0x767E,0x9553, // - 0x7680,0xE1A3, // - 0x7683,0xE1A4, // - 0x7684,0x9349, // - 0x7686,0x8A46, // - 0x7687,0x8D63, // - 0x7688,0xE1A5, // - 0x768B,0xE1A6, // - 0x768E,0xE1A7, // - 0x7690,0x8E48, // - 0x7693,0xE1A9, // - 0x7696,0xE1A8, // - 0x7699,0xE1AA, // - 0x769A,0xE1AB, // - 0x76AE,0x94E7, // - 0x76B0,0xE1AC, // - 0x76B4,0xE1AD, // - 0x76B7,0xEA89, // - 0x76B8,0xE1AE, // - 0x76B9,0xE1AF, // - 0x76BA,0xE1B0, // - 0x76BF,0x8E4D, // - 0x76C2,0xE1B1, // - 0x76C3,0x9475, // - 0x76C6,0x967E, // - 0x76C8,0x896D, // - 0x76CA,0x8976, // - 0x76CD,0xE1B2, // - 0x76D2,0xE1B4, // - 0x76D6,0xE1B3, // - 0x76D7,0x9390, // - 0x76DB,0x90B7, // - 0x76DC,0x9F58, // - 0x76DE,0xE1B5, // - 0x76DF,0x96BF, // - 0x76E1,0xE1B6, // - 0x76E3,0x8AC4, // - 0x76E4,0x94D5, // - 0x76E5,0xE1B7, // - 0x76E7,0xE1B8, // - 0x76EA,0xE1B9, // - 0x76EE,0x96DA, // - 0x76F2,0x96D3, // - 0x76F4,0x92BC, // - 0x76F8,0x918A, // - 0x76FB,0xE1BB, // - 0x76FE,0x8F82, // - 0x7701,0x8FC8, // - 0x7704,0xE1BE, // - 0x7707,0xE1BD, // - 0x7708,0xE1BC, // - 0x7709,0x94FB, // - 0x770B,0x8AC5, // - 0x770C,0x8CA7, // - 0x771B,0xE1C4, // - 0x771E,0xE1C1, // - 0x771F,0x905E, // - 0x7720,0x96B0, // - 0x7724,0xE1C0, // - 0x7725,0xE1C2, // - 0x7726,0xE1C3, // - 0x7729,0xE1BF, // - 0x7737,0xE1C5, // - 0x7738,0xE1C6, // - 0x773A,0x92AD, // - 0x773C,0x8AE1, // - 0x7740,0x9285, // - 0x7747,0xE1C7, // - 0x775A,0xE1C8, // - 0x775B,0xE1CB, // - 0x7761,0x9087, // - 0x7763,0x93C2, // - 0x7765,0xE1CC, // - 0x7766,0x9672, // - 0x7768,0xE1C9, // - 0x776B,0xE1CA, // - 0x7779,0xE1CF, // - 0x777E,0xE1CE, // - 0x777F,0xE1CD, // - 0x778B,0xE1D1, // - 0x778E,0xE1D0, // - 0x7791,0xE1D2, // - 0x779E,0xE1D4, // - 0x77A0,0xE1D3, // - 0x77A5,0x95CB, // - 0x77AC,0x8F75, // - 0x77AD,0x97C4, // - 0x77B0,0xE1D5, // - 0x77B3,0x93B5, // - 0x77B6,0xE1D6, // - 0x77B9,0xE1D7, // - 0x77BB,0xE1DB, // - 0x77BC,0xE1D9, // - 0x77BD,0xE1DA, // - 0x77BF,0xE1D8, // - 0x77C7,0xE1DC, // - 0x77CD,0xE1DD, // - 0x77D7,0xE1DE, // - 0x77DA,0xE1DF, // - 0x77DB,0x96B5, // - 0x77DC,0xE1E0, // - 0x77E2,0x96EE, // - 0x77E3,0xE1E1, // - 0x77E5,0x926D, // - 0x77E7,0x948A, // - 0x77E9,0x8BE9, // - 0x77ED,0x925A, // - 0x77EE,0xE1E2, // - 0x77EF,0x8BB8, // - 0x77F3,0x90CE, // - 0x77FC,0xE1E3, // - 0x7802,0x8DBB, // - 0x780C,0xE1E4, // - 0x7812,0xE1E5, // - 0x7814,0x8CA4, // - 0x7815,0x8DD3, // - 0x7820,0xE1E7, // - 0x7825,0x9375, // - 0x7826,0x8DD4, // - 0x7827,0x8B6D, // - 0x7832,0x9643, // - 0x7834,0x946A, // - 0x783A,0x9376, // - 0x783F,0x8D7B, // - 0x7845,0xE1E9, // - 0x785D,0x8FC9, // - 0x786B,0x97B0, // - 0x786C,0x8D64, // - 0x786F,0x8CA5, // - 0x7872,0x94A1, // - 0x7874,0xE1EB, // - 0x787C,0xE1ED, // - 0x7881,0x8CE9, // - 0x7886,0xE1EC, // - 0x7887,0x92F4, // - 0x788C,0xE1EF, // - 0x788D,0x8A56, // - 0x788E,0xE1EA, // - 0x7891,0x94E8, // - 0x7893,0x894F, // - 0x7895,0x8DEA, // - 0x7897,0x9871, // - 0x789A,0xE1EE, // - 0x78A3,0xE1F0, // - 0x78A7,0x95C9, // - 0x78A9,0x90D7, // - 0x78AA,0xE1F2, // - 0x78AF,0xE1F3, // - 0x78B5,0xE1F1, // - 0x78BA,0x8A6D, // - 0x78BC,0xE1F9, // - 0x78BE,0xE1F8, // - 0x78C1,0x8EA5, // - 0x78C5,0xE1FA, // - 0x78C6,0xE1F5, // - 0x78CA,0xE1FB, // - 0x78CB,0xE1F6, // - 0x78D0,0x94D6, // - 0x78D1,0xE1F4, // - 0x78D4,0xE1F7, // - 0x78DA,0xE241, // - 0x78E7,0xE240, // - 0x78E8,0x9681, // - 0x78EC,0xE1FC, // - 0x78EF,0x88E9, // - 0x78F4,0xE243, // - 0x78FD,0xE242, // - 0x7901,0x8FCA, // - 0x7907,0xE244, // - 0x790E,0x9162, // - 0x7911,0xE246, // - 0x7912,0xE245, // - 0x7919,0xE247, // - 0x7926,0xE1E6, // - 0x792A,0xE1E8, // - 0x792B,0xE249, // - 0x792C,0xE248, // - 0x793A,0x8EA6, // - 0x793C,0x97E7, // - 0x793E,0x8ED0, // - 0x7940,0xE24A, // - 0x7941,0x8C56, // - 0x7947,0x8B5F, // - 0x7948,0x8B46, // - 0x7949,0x8E83, // - 0x7950,0x9753, // - 0x7953,0xE250, // - 0x7955,0xE24F, // - 0x7956,0x9163, // - 0x7957,0xE24C, // - 0x795A,0xE24E, // - 0x795D,0x8F6A, // - 0x795E,0x905F, // - 0x795F,0xE24D, // - 0x7960,0xE24B, // - 0x7962,0x9449, // - 0x7965,0x8FCB, // - 0x796D,0x8DD5, // - 0x7977,0x9398, // - 0x797A,0xE251, // - 0x797F,0xE252, // - 0x7980,0xE268, // - 0x7981,0x8BD6, // - 0x7984,0x985C, // - 0x7985,0x9154, // - 0x798A,0xE253, // - 0x798D,0x89D0, // - 0x798E,0x92F5, // - 0x798F,0x959F, // - 0x799D,0xE254, // - 0x79A6,0x8B9A, // - 0x79A7,0xE255, // - 0x79AA,0xE257, // - 0x79AE,0xE258, // - 0x79B0,0x9448, // - 0x79B3,0xE259, // - 0x79B9,0xE25A, // - 0x79BD,0x8BD7, // - 0x79BE,0x89D1, // - 0x79BF,0x93C3, // - 0x79C0,0x8F47, // - 0x79C1,0x8E84, // - 0x79C9,0xE25C, // - 0x79CB,0x8F48, // - 0x79D1,0x89C8, // - 0x79D2,0x9562, // - 0x79D5,0xE25D, // - 0x79D8,0x94E9, // - 0x79DF,0x9164, // - 0x79E1,0xE260, // - 0x79E3,0xE261, // - 0x79E4,0x9489, // - 0x79E6,0x9060, // - 0x79E7,0xE25E, // - 0x79E9,0x9281, // - 0x79EC,0xE25F, // - 0x79F0,0x8FCC, // - 0x79FB,0x88DA, // - 0x7A00,0x8B48, // - 0x7A08,0xE262, // - 0x7A0B,0x92F6, // - 0x7A0D,0xE263, // - 0x7A0E,0x90C5, // - 0x7A14,0x96AB, // - 0x7A17,0x9542, // - 0x7A18,0xE264, // - 0x7A19,0xE265, // - 0x7A1A,0x9274, // - 0x7A1C,0x97C5, // - 0x7A1F,0xE267, // - 0x7A20,0xE266, // - 0x7A2E,0x8EED, // - 0x7A31,0xE269, // - 0x7A32,0x88EE, // - 0x7A37,0xE26C, // - 0x7A3B,0xE26A, // - 0x7A3C,0x89D2, // - 0x7A3D,0x8C6D, // - 0x7A3E,0xE26B, // - 0x7A3F,0x8D65, // - 0x7A40,0x8D92, // - 0x7A42,0x95E4, // - 0x7A43,0xE26D, // - 0x7A46,0x9673, // - 0x7A49,0xE26F, // - 0x7A4D,0x90CF, // - 0x7A4E,0x896E, // - 0x7A4F,0x89B8, // - 0x7A50,0x88AA, // - 0x7A57,0xE26E, // - 0x7A61,0xE270, // - 0x7A62,0xE271, // - 0x7A63,0x8FF5, // - 0x7A69,0xE272, // - 0x7A6B,0x8A6E, // - 0x7A70,0xE274, // - 0x7A74,0x8C8A, // - 0x7A76,0x8B86, // - 0x7A79,0xE275, // - 0x7A7A,0x8BF3, // - 0x7A7D,0xE276, // - 0x7A7F,0x90FA, // - 0x7A81,0x93CB, // - 0x7A83,0x90DE, // - 0x7A84,0x8DF3, // - 0x7A88,0xE277, // - 0x7A92,0x9282, // - 0x7A93,0x918B, // - 0x7A95,0xE279, // - 0x7A96,0xE27B, // - 0x7A97,0xE278, // - 0x7A98,0xE27A, // - 0x7A9F,0x8C41, // - 0x7AA9,0xE27C, // - 0x7AAA,0x8C45, // - 0x7AAE,0x8B87, // - 0x7AAF,0x9771, // - 0x7AB0,0xE27E, // - 0x7AB6,0xE280, // - 0x7ABA,0x894D, // - 0x7ABF,0xE283, // - 0x7AC3,0x8A96, // - 0x7AC4,0xE282, // - 0x7AC5,0xE281, // - 0x7AC7,0xE285, // - 0x7AC8,0xE27D, // - 0x7ACA,0xE286, // - 0x7ACB,0x97A7, // - 0x7ACD,0xE287, // - 0x7ACF,0xE288, // - 0x7AD2,0x9AF2, // - 0x7AD3,0xE28A, // - 0x7AD5,0xE289, // - 0x7AD9,0xE28B, // - 0x7ADA,0xE28C, // - 0x7ADC,0x97B3, // - 0x7ADD,0xE28D, // - 0x7ADF,0xE8ED, // - 0x7AE0,0x8FCD, // - 0x7AE1,0xE28E, // - 0x7AE2,0xE28F, // - 0x7AE3,0x8F76, // - 0x7AE5,0x93B6, // - 0x7AE6,0xE290, // - 0x7AEA,0x9247, // - 0x7AED,0xE291, // - 0x7AF0,0xE292, // - 0x7AF6,0x8BA3, // - 0x7AF8,0x995E, // - 0x7AF9,0x927C, // - 0x7AFA,0x8EB1, // - 0x7AFF,0x8AC6, // - 0x7B02,0xE293, // - 0x7B04,0xE2A0, // - 0x7B06,0xE296, // - 0x7B08,0x8B88, // - 0x7B0A,0xE295, // - 0x7B0B,0xE2A2, // - 0x7B0F,0xE294, // - 0x7B11,0x8FCE, // - 0x7B18,0xE298, // - 0x7B19,0xE299, // - 0x7B1B,0x934A, // - 0x7B1E,0xE29A, // - 0x7B20,0x8A7D, // - 0x7B25,0x9079, // - 0x7B26,0x9584, // - 0x7B28,0xE29C, // - 0x7B2C,0x91E6, // - 0x7B33,0xE297, // - 0x7B35,0xE29B, // - 0x7B36,0xE29D, // - 0x7B39,0x8DF9, // - 0x7B45,0xE2A4, // - 0x7B46,0x954D, // - 0x7B48,0x94A4, // - 0x7B49,0x9399, // - 0x7B4B,0x8BD8, // - 0x7B4C,0xE2A3, // - 0x7B4D,0xE2A1, // - 0x7B4F,0x94B3, // - 0x7B50,0xE29E, // - 0x7B51,0x927D, // - 0x7B52,0x939B, // - 0x7B54,0x939A, // - 0x7B56,0x8DF4, // - 0x7B5D,0xE2B6, // - 0x7B65,0xE2A6, // - 0x7B67,0xE2A8, // - 0x7B6C,0xE2AB, // - 0x7B6E,0xE2AC, // - 0x7B70,0xE2A9, // - 0x7B71,0xE2AA, // - 0x7B74,0xE2A7, // - 0x7B75,0xE2A5, // - 0x7B7A,0xE29F, // - 0x7B86,0x95CD, // - 0x7B87,0x89D3, // - 0x7B8B,0xE2B3, // - 0x7B8D,0xE2B0, // - 0x7B8F,0xE2B5, // - 0x7B92,0xE2B4, // - 0x7B94,0x9493, // - 0x7B95,0x96A5, // - 0x7B97,0x8E5A, // - 0x7B98,0xE2AE, // - 0x7B99,0xE2B7, // - 0x7B9A,0xE2B2, // - 0x7B9C,0xE2B1, // - 0x7B9D,0xE2AD, // - 0x7B9F,0xE2AF, // - 0x7BA1,0x8AC7, // - 0x7BAA,0x925C, // - 0x7BAD,0x90FB, // - 0x7BB1,0x94A0, // - 0x7BB4,0xE2BC, // - 0x7BB8,0x94A2, // - 0x7BC0,0x90DF, // - 0x7BC1,0xE2B9, // - 0x7BC4,0x94CD, // - 0x7BC6,0xE2BD, // - 0x7BC7,0x95D1, // - 0x7BC9,0x927A, // - 0x7BCB,0xE2B8, // - 0x7BCC,0xE2BA, // - 0x7BCF,0xE2BB, // - 0x7BDD,0xE2BE, // - 0x7BE0,0x8EC2, // - 0x7BE4,0x93C4, // - 0x7BE5,0xE2C3, // - 0x7BE6,0xE2C2, // - 0x7BE9,0xE2BF, // - 0x7BED,0x9855, // - 0x7BF3,0xE2C8, // - 0x7BF6,0xE2CC, // - 0x7BF7,0xE2C9, // - 0x7C00,0xE2C5, // - 0x7C07,0xE2C6, // - 0x7C0D,0xE2CB, // - 0x7C11,0xE2C0, // - 0x7C12,0x99D3, // - 0x7C13,0xE2C7, // - 0x7C14,0xE2C1, // - 0x7C17,0xE2CA, // - 0x7C1F,0xE2D0, // - 0x7C21,0x8AC8, // - 0x7C23,0xE2CD, // - 0x7C27,0xE2CE, // - 0x7C2A,0xE2CF, // - 0x7C2B,0xE2D2, // - 0x7C37,0xE2D1, // - 0x7C38,0x94F4, // - 0x7C3D,0xE2D3, // - 0x7C3E,0x97FA, // - 0x7C3F,0x95EB, // - 0x7C40,0xE2D8, // - 0x7C43,0xE2D5, // - 0x7C4C,0xE2D4, // - 0x7C4D,0x90D0, // - 0x7C4F,0xE2D7, // - 0x7C50,0xE2D9, // - 0x7C54,0xE2D6, // - 0x7C56,0xE2DD, // - 0x7C58,0xE2DA, // - 0x7C5F,0xE2DB, // - 0x7C60,0xE2C4, // - 0x7C64,0xE2DC, // - 0x7C65,0xE2DE, // - 0x7C6C,0xE2DF, // - 0x7C73,0x95C4, // - 0x7C75,0xE2E0, // - 0x7C7E,0x96E0, // - 0x7C81,0x8BCC, // - 0x7C82,0x8C48, // - 0x7C83,0xE2E1, // - 0x7C89,0x95B2, // - 0x7C8B,0x9088, // - 0x7C8D,0x96AE, // - 0x7C90,0xE2E2, // - 0x7C92,0x97B1, // - 0x7C95,0x9494, // - 0x7C97,0x9165, // - 0x7C98,0x9453, // - 0x7C9B,0x8F6C, // - 0x7C9F,0x88BE, // - 0x7CA1,0xE2E7, // - 0x7CA2,0xE2E5, // - 0x7CA4,0xE2E3, // - 0x7CA5,0x8A9F, // - 0x7CA7,0x8FCF, // - 0x7CA8,0xE2E8, // - 0x7CAB,0xE2E6, // - 0x7CAD,0xE2E4, // - 0x7CAE,0xE2EC, // - 0x7CB1,0xE2EB, // - 0x7CB2,0xE2EA, // - 0x7CB3,0xE2E9, // - 0x7CB9,0xE2ED, // - 0x7CBD,0xE2EE, // - 0x7CBE,0x90B8, // - 0x7CC0,0xE2EF, // - 0x7CC2,0xE2F1, // - 0x7CC5,0xE2F0, // - 0x7CCA,0x8CD0, // - 0x7CCE,0x9157, // - 0x7CD2,0xE2F3, // - 0x7CD6,0x939C, // - 0x7CD8,0xE2F2, // - 0x7CDC,0xE2F4, // - 0x7CDE,0x95B3, // - 0x7CDF,0x918C, // - 0x7CE0,0x8D66, // - 0x7CE2,0xE2F5, // - 0x7CE7,0x97C6, // - 0x7CEF,0xE2F7, // - 0x7CF2,0xE2F8, // - 0x7CF4,0xE2F9, // - 0x7CF6,0xE2FA, // - 0x7CF8,0x8E85, // - 0x7CFA,0xE2FB, // - 0x7CFB,0x8C6E, // - 0x7CFE,0x8B8A, // - 0x7D00,0x8B49, // - 0x7D02,0xE340, // - 0x7D04,0x96F1, // - 0x7D05,0x8D67, // - 0x7D06,0xE2FC, // - 0x7D0A,0xE343, // - 0x7D0B,0x96E4, // - 0x7D10,0x9552, // - 0x7D14,0x8F83, // - 0x7D15,0xE342, // - 0x7D17,0x8ED1, // - 0x7D18,0x8D68, // - 0x7D19,0x8E86, // - 0x7D1A,0x8B89, // - 0x7D1B,0x95B4, // - 0x7D1C,0xE341, // - 0x7D20,0x9166, // - 0x7D21,0x9661, // - 0x7D22,0x8DF5, // - 0x7D2B,0x8E87, // - 0x7D2C,0x92DB, // - 0x7D2E,0xE346, // - 0x7D2F,0x97DD, // - 0x7D30,0x8DD7, // - 0x7D32,0xE347, // - 0x7D33,0x9061, // - 0x7D35,0xE349, // - 0x7D39,0x8FD0, // - 0x7D3A,0x8DAE, // - 0x7D3F,0xE348, // - 0x7D42,0x8F49, // - 0x7D43,0x8CBC, // - 0x7D44,0x9167, // - 0x7D45,0xE344, // - 0x7D46,0xE34A, // - 0x7D4B,0xE345, // - 0x7D4C,0x8C6F, // - 0x7D4E,0xE34D, // - 0x7D4F,0xE351, // - 0x7D50,0x8C8B, // - 0x7D56,0xE34C, // - 0x7D5B,0xE355, // - 0x7D5E,0x8D69, // - 0x7D61,0x978D, // - 0x7D62,0x88BA, // - 0x7D63,0xE352, // - 0x7D66,0x8B8B, // - 0x7D68,0xE34F, // - 0x7D6E,0xE350, // - 0x7D71,0x939D, // - 0x7D72,0xE34E, // - 0x7D73,0xE34B, // - 0x7D75,0x8A47, // - 0x7D76,0x90E2, // - 0x7D79,0x8CA6, // - 0x7D7D,0xE357, // - 0x7D89,0xE354, // - 0x7D8F,0xE356, // - 0x7D93,0xE353, // - 0x7D99,0x8C70, // - 0x7D9A,0x91B1, // - 0x7D9B,0xE358, // - 0x7D9C,0x918E, // - 0x7D9F,0xE365, // - 0x7DA2,0xE361, // - 0x7DAB,0xE35F, // - 0x7DAC,0x8EF8, // - 0x7DAD,0x88DB, // - 0x7DAE,0xE35A, // - 0x7DAF,0xE362, // - 0x7DB0,0xE366, // - 0x7DB1,0x8D6A, // - 0x7DB2,0x96D4, // - 0x7DB4,0x92D4, // - 0x7DB5,0xE35C, // - 0x7DB8,0xE364, // - 0x7DBA,0xE359, // - 0x7DBB,0x925D, // - 0x7DBD,0xE35E, // - 0x7DBE,0x88BB, // - 0x7DBF,0x96C8, // - 0x7DC7,0xE35D, // - 0x7DCA,0x8BD9, // - 0x7DCB,0x94EA, // - 0x7DCF,0x918D, // - 0x7DD1,0x97CE, // - 0x7DD2,0x8F8F, // - 0x7DD5,0xE38E, // - 0x7DD8,0xE367, // - 0x7DDA,0x90FC, // - 0x7DDC,0xE363, // - 0x7DDD,0xE368, // - 0x7DDE,0xE36A, // - 0x7DE0,0x92F7, // - 0x7DE1,0xE36D, // - 0x7DE4,0xE369, // - 0x7DE8,0x95D2, // - 0x7DE9,0x8AC9, // - 0x7DEC,0x96C9, // - 0x7DEF,0x88DC, // - 0x7DF2,0xE36C, // - 0x7DF4,0x97FB, // - 0x7DFB,0xE36B, // - 0x7E01,0x898F, // - 0x7E04,0x93EA, // - 0x7E05,0xE36E, // - 0x7E09,0xE375, // - 0x7E0A,0xE36F, // - 0x7E0B,0xE376, // - 0x7E12,0xE372, // - 0x7E1B,0x949B, // - 0x7E1E,0x8EC8, // - 0x7E1F,0xE374, // - 0x7E21,0xE371, // - 0x7E22,0xE377, // - 0x7E23,0xE370, // - 0x7E26,0x8F63, // - 0x7E2B,0x9644, // - 0x7E2E,0x8F6B, // - 0x7E31,0xE373, // - 0x7E32,0xE380, // - 0x7E35,0xE37B, // - 0x7E37,0xE37E, // - 0x7E39,0xE37C, // - 0x7E3A,0xE381, // - 0x7E3B,0xE37A, // - 0x7E3D,0xE360, // - 0x7E3E,0x90D1, // - 0x7E41,0x94C9, // - 0x7E43,0xE37D, // - 0x7E46,0xE378, // - 0x7E4A,0x9140, // - 0x7E4B,0x8C71, // - 0x7E4D,0x8F4A, // - 0x7E54,0x9044, // - 0x7E55,0x9155, // - 0x7E56,0xE384, // - 0x7E59,0xE386, // - 0x7E5A,0xE387, // - 0x7E5D,0xE383, // - 0x7E5E,0xE385, // - 0x7E66,0xE379, // - 0x7E67,0xE382, // - 0x7E69,0xE38A, // - 0x7E6A,0xE389, // - 0x7E6D,0x969A, // - 0x7E70,0x8C4A, // - 0x7E79,0xE388, // - 0x7E7B,0xE38C, // - 0x7E7C,0xE38B, // - 0x7E7D,0xE38F, // - 0x7E7F,0xE391, // - 0x7E83,0xE38D, // - 0x7E88,0xE392, // - 0x7E89,0xE393, // - 0x7E8C,0xE394, // - 0x7E8E,0xE39A, // - 0x7E8F,0x935A, // - 0x7E90,0xE396, // - 0x7E92,0xE395, // - 0x7E93,0xE397, // - 0x7E94,0xE398, // - 0x7E96,0xE399, // - 0x7E9B,0xE39B, // - 0x7E9C,0xE39C, // - 0x7F36,0x8ACA, // - 0x7F38,0xE39D, // - 0x7F3A,0xE39E, // - 0x7F45,0xE39F, // - 0x7F4C,0xE3A0, // - 0x7F4D,0xE3A1, // - 0x7F4E,0xE3A2, // - 0x7F50,0xE3A3, // - 0x7F51,0xE3A4, // - 0x7F54,0xE3A6, // - 0x7F55,0xE3A5, // - 0x7F58,0xE3A7, // - 0x7F5F,0xE3A8, // - 0x7F60,0xE3A9, // - 0x7F67,0xE3AC, // - 0x7F68,0xE3AA, // - 0x7F69,0xE3AB, // - 0x7F6A,0x8DDF, // - 0x7F6B,0x8C72, // - 0x7F6E,0x9275, // - 0x7F70,0x94B1, // - 0x7F72,0x8F90, // - 0x7F75,0x946C, // - 0x7F77,0x94EB, // - 0x7F78,0xE3AD, // - 0x7F79,0x9CEB, // - 0x7F82,0xE3AE, // - 0x7F83,0xE3B0, // - 0x7F85,0x9785, // - 0x7F86,0xE3AF, // - 0x7F87,0xE3B2, // - 0x7F88,0xE3B1, // - 0x7F8A,0x9772, // - 0x7F8C,0xE3B3, // - 0x7F8E,0x94FC, // - 0x7F94,0xE3B4, // - 0x7F9A,0xE3B7, // - 0x7F9D,0xE3B6, // - 0x7F9E,0xE3B5, // - 0x7FA3,0xE3B8, // - 0x7FA4,0x8C51, // - 0x7FA8,0x9141, // - 0x7FA9,0x8B60, // - 0x7FAE,0xE3BC, // - 0x7FAF,0xE3B9, // - 0x7FB2,0xE3BA, // - 0x7FB6,0xE3BD, // - 0x7FB8,0xE3BE, // - 0x7FB9,0xE3BB, // - 0x7FBD,0x8948, // - 0x7FC1,0x89A5, // - 0x7FC5,0xE3C0, // - 0x7FC6,0xE3C1, // - 0x7FCA,0xE3C2, // - 0x7FCC,0x9782, // - 0x7FD2,0x8F4B, // - 0x7FD4,0xE3C4, // - 0x7FD5,0xE3C3, // - 0x7FE0,0x9089, // - 0x7FE1,0xE3C5, // - 0x7FE6,0xE3C6, // - 0x7FE9,0xE3C7, // - 0x7FEB,0x8AE3, // - 0x7FF0,0x8ACB, // - 0x7FF3,0xE3C8, // - 0x7FF9,0xE3C9, // - 0x7FFB,0x967C, // - 0x7FFC,0x9783, // - 0x8000,0x9773, // - 0x8001,0x9856, // - 0x8003,0x8D6C, // - 0x8004,0xE3CC, // - 0x8005,0x8ED2, // - 0x8006,0xE3CB, // - 0x800B,0xE3CD, // - 0x800C,0x8EA7, // - 0x8010,0x91CF, // - 0x8012,0xE3CE, // - 0x8015,0x8D6B, // - 0x8017,0x96D5, // - 0x8018,0xE3CF, // - 0x8019,0xE3D0, // - 0x801C,0xE3D1, // - 0x8021,0xE3D2, // - 0x8028,0xE3D3, // - 0x8033,0x8EA8, // - 0x8036,0x96EB, // - 0x803B,0xE3D5, // - 0x803D,0x925E, // - 0x803F,0xE3D4, // - 0x8046,0xE3D7, // - 0x804A,0xE3D6, // - 0x8052,0xE3D8, // - 0x8056,0x90B9, // - 0x8058,0xE3D9, // - 0x805A,0xE3DA, // - 0x805E,0x95B7, // - 0x805F,0xE3DB, // - 0x8061,0x918F, // - 0x8062,0xE3DC, // - 0x8068,0xE3DD, // - 0x806F,0x97FC, // - 0x8070,0xE3E0, // - 0x8072,0xE3DF, // - 0x8073,0xE3DE, // - 0x8074,0x92AE, // - 0x8076,0xE3E1, // - 0x8077,0x9045, // - 0x8079,0xE3E2, // - 0x807D,0xE3E3, // - 0x807E,0x9857, // - 0x807F,0xE3E4, // - 0x8084,0xE3E5, // - 0x8085,0xE3E7, // - 0x8086,0xE3E6, // - 0x8087,0x94A3, // - 0x8089,0x93F7, // - 0x808B,0x985D, // - 0x808C,0x94A7, // - 0x8093,0xE3E9, // - 0x8096,0x8FD1, // - 0x8098,0x9549, // - 0x809A,0xE3EA, // - 0x809B,0xE3E8, // - 0x809D,0x8ACC, // - 0x80A1,0x8CD2, // - 0x80A2,0x8E88, // - 0x80A5,0x94EC, // - 0x80A9,0x8CA8, // - 0x80AA,0x9662, // - 0x80AC,0xE3ED, // - 0x80AD,0xE3EB, // - 0x80AF,0x8D6D, // - 0x80B1,0x8D6E, // - 0x80B2,0x88E7, // - 0x80B4,0x8DE6, // - 0x80BA,0x9478, // - 0x80C3,0x88DD, // - 0x80C4,0xE3F2, // - 0x80C6,0x925F, // - 0x80CC,0x9477, // - 0x80CE,0x91D9, // - 0x80D6,0xE3F4, // - 0x80D9,0xE3F0, // - 0x80DA,0xE3F3, // - 0x80DB,0xE3EE, // - 0x80DD,0xE3F1, // - 0x80DE,0x9645, // - 0x80E1,0x8CD3, // - 0x80E4,0x88FB, // - 0x80E5,0xE3EF, // - 0x80EF,0xE3F6, // - 0x80F1,0xE3F7, // - 0x80F4,0x93B7, // - 0x80F8,0x8BB9, // - 0x80FC,0xE445, // - 0x80FD,0x945C, // - 0x8102,0x8E89, // - 0x8105,0x8BBA, // - 0x8106,0x90C6, // - 0x8107,0x9865, // - 0x8108,0x96AC, // - 0x8109,0xE3F5, // - 0x810A,0x90D2, // - 0x811A,0x8B72, // - 0x811B,0xE3F8, // - 0x8123,0xE3FA, // - 0x8129,0xE3F9, // - 0x812F,0xE3FB, // - 0x8131,0x9245, // - 0x8133,0x945D, // - 0x8139,0x92AF, // - 0x813E,0xE442, // - 0x8146,0xE441, // - 0x814B,0xE3FC, // - 0x814E,0x9074, // - 0x8150,0x9585, // - 0x8151,0xE444, // - 0x8153,0xE443, // - 0x8154,0x8D6F, // - 0x8155,0x9872, // - 0x815F,0xE454, // - 0x8165,0xE448, // - 0x8166,0xE449, // - 0x816B,0x8EEE, // - 0x816E,0xE447, // - 0x8170,0x8D98, // - 0x8171,0xE446, // - 0x8174,0xE44A, // - 0x8178,0x92B0, // - 0x8179,0x95A0, // - 0x817A,0x9142, // - 0x817F,0x91DA, // - 0x8180,0xE44E, // - 0x8182,0xE44F, // - 0x8183,0xE44B, // - 0x8188,0xE44C, // - 0x818A,0xE44D, // - 0x818F,0x8D70, // - 0x8193,0xE455, // - 0x8195,0xE451, // - 0x819A,0x9586, // - 0x819C,0x968C, // - 0x819D,0x9547, // - 0x81A0,0xE450, // - 0x81A3,0xE453, // - 0x81A4,0xE452, // - 0x81A8,0x9663, // - 0x81A9,0xE456, // - 0x81B0,0xE457, // - 0x81B3,0x9156, // - 0x81B5,0xE458, // - 0x81B8,0xE45A, // - 0x81BA,0xE45E, // - 0x81BE,0xE459, // - 0x81BF,0x945E, // - 0x81C0,0xE45C, // - 0x81C2,0xE45D, // - 0x81C6,0x89B0, // - 0x81C8,0xE464, // - 0x81C9,0xE45F, // - 0x81CD,0xE460, // - 0x81D1,0xE461, // - 0x81D3,0x919F, // - 0x81D8,0xE463, // - 0x81D9,0xE462, // - 0x81DA,0xE465, // - 0x81DF,0xE466, // - 0x81E0,0xE467, // - 0x81E3,0x9062, // - 0x81E5,0x89E7, // - 0x81E7,0xE468, // - 0x81E8,0x97D5, // - 0x81EA,0x8EA9, // - 0x81ED,0x8F4C, // - 0x81F3,0x8E8A, // - 0x81F4,0x9276, // - 0x81FA,0xE469, // - 0x81FB,0xE46A, // - 0x81FC,0x8950, // - 0x81FE,0xE46B, // - 0x8201,0xE46C, // - 0x8202,0xE46D, // - 0x8205,0xE46E, // - 0x8207,0xE46F, // - 0x8208,0x8BBB, // - 0x8209,0x9DA8, // - 0x820A,0xE470, // - 0x820C,0x90E3, // - 0x820D,0xE471, // - 0x820E,0x8EC9, // - 0x8210,0xE472, // - 0x8212,0x98AE, // - 0x8216,0xE473, // - 0x8217,0x95DC, // - 0x8218,0x8ADA, // - 0x821B,0x9143, // - 0x821C,0x8F77, // - 0x821E,0x9591, // - 0x821F,0x8F4D, // - 0x8229,0xE474, // - 0x822A,0x8D71, // - 0x822B,0xE475, // - 0x822C,0x94CA, // - 0x822E,0xE484, // - 0x8233,0xE477, // - 0x8235,0x91C7, // - 0x8236,0x9495, // - 0x8237,0x8CBD, // - 0x8238,0xE476, // - 0x8239,0x9144, // - 0x8240,0xE478, // - 0x8247,0x92F8, // - 0x8258,0xE47A, // - 0x8259,0xE479, // - 0x825A,0xE47C, // - 0x825D,0xE47B, // - 0x825F,0xE47D, // - 0x8262,0xE480, // - 0x8264,0xE47E, // - 0x8266,0x8ACD, // - 0x8268,0xE481, // - 0x826A,0xE482, // - 0x826B,0xE483, // - 0x826E,0x8DAF, // - 0x826F,0x97C7, // - 0x8271,0xE485, // - 0x8272,0x9046, // - 0x8276,0x8990, // - 0x8277,0xE486, // - 0x8278,0xE487, // - 0x827E,0xE488, // - 0x828B,0x88F0, // - 0x828D,0xE489, // - 0x8292,0xE48A, // - 0x8299,0x9587, // - 0x829D,0x8EC5, // - 0x829F,0xE48C, // - 0x82A5,0x8A48, // - 0x82A6,0x88B0, // - 0x82AB,0xE48B, // - 0x82AC,0xE48E, // - 0x82AD,0x946D, // - 0x82AF,0x9063, // - 0x82B1,0x89D4, // - 0x82B3,0x9646, // - 0x82B8,0x8C7C, // - 0x82B9,0x8BDA, // - 0x82BB,0xE48D, // - 0x82BD,0x89E8, // - 0x82C5,0x8AA1, // - 0x82D1,0x8991, // - 0x82D2,0xE492, // - 0x82D3,0x97E8, // - 0x82D4,0x91DB, // - 0x82D7,0x9563, // - 0x82D9,0xE49E, // - 0x82DB,0x89D5, // - 0x82DC,0xE49C, // - 0x82DE,0xE49A, // - 0x82DF,0xE491, // - 0x82E1,0xE48F, // - 0x82E3,0xE490, // - 0x82E5,0x8EE1, // - 0x82E6,0x8BEA, // - 0x82E7,0x9297, // - 0x82EB,0x93CF, // - 0x82F1,0x8970, // - 0x82F3,0xE494, // - 0x82F4,0xE493, // - 0x82F9,0xE499, // - 0x82FA,0xE495, // - 0x82FB,0xE498, // - 0x8302,0x96CE, // - 0x8303,0xE497, // - 0x8304,0x89D6, // - 0x8305,0x8A9D, // - 0x8306,0xE49B, // - 0x8309,0xE49D, // - 0x830E,0x8C73, // - 0x8316,0xE4A1, // - 0x8317,0xE4AA, // - 0x8318,0xE4AB, // - 0x831C,0x88A9, // - 0x8323,0xE4B2, // - 0x8328,0x88EF, // - 0x832B,0xE4A9, // - 0x832F,0xE4A8, // - 0x8331,0xE4A3, // - 0x8332,0xE4A2, // - 0x8334,0xE4A0, // - 0x8335,0xE49F, // - 0x8336,0x9283, // - 0x8338,0x91F9, // - 0x8339,0xE4A5, // - 0x8340,0xE4A4, // - 0x8345,0xE4A7, // - 0x8349,0x9190, // - 0x834A,0x8C74, // - 0x834F,0x8960, // - 0x8350,0xE4A6, // - 0x8352,0x8D72, // - 0x8358,0x9191, // - 0x8373,0xE4B8, // - 0x8375,0xE4B9, // - 0x8377,0x89D7, // - 0x837B,0x89AC, // - 0x837C,0xE4B6, // - 0x8385,0xE4AC, // - 0x8387,0xE4B4, // - 0x8389,0xE4BB, // - 0x838A,0xE4B5, // - 0x838E,0xE4B3, // - 0x8393,0xE496, // - 0x8396,0xE4B1, // - 0x839A,0xE4AD, // - 0x839E,0x8ACE, // - 0x839F,0xE4AF, // - 0x83A0,0xE4BA, // - 0x83A2,0xE4B0, // - 0x83A8,0xE4BC, // - 0x83AA,0xE4AE, // - 0x83AB,0x949C, // - 0x83B1,0x9789, // - 0x83B5,0xE4B7, // - 0x83BD,0xE4CD, // - 0x83C1,0xE4C5, // - 0x83C5,0x909B, // - 0x83CA,0x8B65, // - 0x83CC,0x8BDB, // - 0x83CE,0xE4C0, // - 0x83D3,0x89D9, // - 0x83D6,0x8FD2, // - 0x83D8,0xE4C3, // - 0x83DC,0x8DD8, // - 0x83DF,0x9370, // - 0x83E0,0xE4C8, // - 0x83E9,0x95EC, // - 0x83EB,0xE4BF, // - 0x83EF,0x89D8, // - 0x83F0,0x8CD4, // - 0x83F1,0x9548, // - 0x83F2,0xE4C9, // - 0x83F4,0xE4BD, // - 0x83F7,0xE4C6, // - 0x83FB,0xE4D0, // - 0x83FD,0xE4C1, // - 0x8403,0xE4C2, // - 0x8404,0x93B8, // - 0x8407,0xE4C7, // - 0x840B,0xE4C4, // - 0x840C,0x9647, // - 0x840D,0xE4CA, // - 0x840E,0x88DE, // - 0x8413,0xE4BE, // - 0x8420,0xE4CC, // - 0x8422,0xE4CB, // - 0x8429,0x948B, // - 0x842A,0xE4D2, // - 0x842C,0xE4DD, // - 0x8431,0x8A9E, // - 0x8435,0xE4E0, // - 0x8438,0xE4CE, // - 0x843C,0xE4D3, // - 0x843D,0x978E, // - 0x8446,0xE4DC, // - 0x8449,0x9774, // - 0x844E,0x97A8, // - 0x8457,0x9298, // - 0x845B,0x8A8B, // - 0x8461,0x9592, // - 0x8462,0xE4E2, // - 0x8463,0x939F, // - 0x8466,0x88AF, // - 0x8469,0xE4DB, // - 0x846B,0xE4D7, // - 0x846C,0x9192, // - 0x846D,0xE4D1, // - 0x846E,0xE4D9, // - 0x846F,0xE4DE, // - 0x8471,0x944B, // - 0x8475,0x88A8, // - 0x8477,0xE4D6, // - 0x8479,0xE4DF, // - 0x847A,0x9598, // - 0x8482,0xE4DA, // - 0x8484,0xE4D5, // - 0x848B,0x8FD3, // - 0x8490,0x8F4E, // - 0x8494,0x8EAA, // - 0x8499,0x96D6, // - 0x849C,0x9566, // - 0x849F,0xE4E5, // - 0x84A1,0xE4EE, // - 0x84AD,0xE4D8, // - 0x84B2,0x8A97, // - 0x84B8,0x8FF6, // - 0x84B9,0xE4E3, // - 0x84BB,0xE4E8, // - 0x84BC,0x9193, // - 0x84BF,0xE4E4, // - 0x84C1,0xE4EB, // - 0x84C4,0x927E, // - 0x84C6,0xE4EC, // - 0x84C9,0x9775, // - 0x84CA,0xE4E1, // - 0x84CB,0x8A57, // - 0x84CD,0xE4E7, // - 0x84D0,0xE4EA, // - 0x84D1,0x96AA, // - 0x84D6,0xE4ED, // - 0x84D9,0xE4E6, // - 0x84DA,0xE4E9, // - 0x84EC,0x9648, // - 0x84EE,0x9840, // - 0x84F4,0xE4F1, // - 0x84FC,0xE4F8, // - 0x84FF,0xE4F0, // - 0x8500,0x8EC1, // - 0x8506,0xE4CF, // - 0x8511,0x95CC, // - 0x8513,0x96A0, // - 0x8514,0xE4F7, // - 0x8515,0xE4F6, // - 0x8517,0xE4F2, // - 0x8518,0xE4F3, // - 0x851A,0x8955, // - 0x851F,0xE4F5, // - 0x8521,0xE4EF, // - 0x8526,0x92D3, // - 0x852C,0xE4F4, // - 0x852D,0x88FC, // - 0x8535,0x91A0, // - 0x853D,0x95C1, // - 0x8540,0xE4F9, // - 0x8541,0xE540, // - 0x8543,0x94D7, // - 0x8548,0xE4FC, // - 0x8549,0x8FD4, // - 0x854A,0x8EC7, // - 0x854B,0xE542, // - 0x854E,0x8BBC, // - 0x8555,0xE543, // - 0x8557,0x9599, // - 0x8558,0xE4FB, // - 0x855A,0xE4D4, // - 0x8563,0xE4FA, // - 0x8568,0x986E, // - 0x8569,0x93A0, // - 0x856A,0x9593, // - 0x856D,0xE54A, // - 0x8577,0xE550, // - 0x857E,0xE551, // - 0x8580,0xE544, // - 0x8584,0x9496, // - 0x8587,0xE54E, // - 0x8588,0xE546, // - 0x858A,0xE548, // - 0x8590,0xE552, // - 0x8591,0xE547, // - 0x8594,0xE54B, // - 0x8597,0x8992, // - 0x8599,0x93E3, // - 0x859B,0xE54C, // - 0x859C,0xE54F, // - 0x85A4,0xE545, // - 0x85A6,0x9145, // - 0x85A8,0xE549, // - 0x85A9,0x8E46, // - 0x85AA,0x9064, // - 0x85AB,0x8C4F, // - 0x85AC,0x96F2, // - 0x85AE,0x96F7, // - 0x85AF,0x8F92, // - 0x85B9,0xE556, // - 0x85BA,0xE554, // - 0x85C1,0x986D, // - 0x85C9,0xE553, // - 0x85CD,0x9795, // - 0x85CF,0xE555, // - 0x85D0,0xE557, // - 0x85D5,0xE558, // - 0x85DD,0xE559, // - 0x85E4,0x93A1, // - 0x85E5,0xE55A, // - 0x85E9,0x94CB, // - 0x85EA,0xE54D, // - 0x85F7,0x8F93, // - 0x85F9,0xE55C, // - 0x85FA,0xE561, // - 0x85FB,0x9194, // - 0x85FE,0xE560, // - 0x8602,0xE541, // - 0x8606,0xE562, // - 0x8607,0x9168, // - 0x860A,0xE55D, // - 0x860B,0xE55F, // - 0x8613,0xE55E, // - 0x8616,0x9F50, // - 0x8617,0x9F41, // - 0x861A,0xE564, // - 0x8622,0xE563, // - 0x862D,0x9796, // - 0x862F,0xE1BA, // - 0x8630,0xE565, // - 0x863F,0xE566, // - 0x864D,0xE567, // - 0x864E,0x8CD5, // - 0x8650,0x8B73, // - 0x8654,0xE569, // - 0x8655,0x997C, // - 0x865A,0x8B95, // - 0x865C,0x97B8, // - 0x865E,0x8BF1, // - 0x865F,0xE56A, // - 0x8667,0xE56B, // - 0x866B,0x928E, // - 0x8671,0xE56C, // - 0x8679,0x93F8, // - 0x867B,0x88B8, // - 0x868A,0x89E1, // - 0x868B,0xE571, // - 0x868C,0xE572, // - 0x8693,0xE56D, // - 0x8695,0x8E5C, // - 0x86A3,0xE56E, // - 0x86A4,0x9461, // - 0x86A9,0xE56F, // - 0x86AA,0xE570, // - 0x86AB,0xE57A, // - 0x86AF,0xE574, // - 0x86B0,0xE577, // - 0x86B6,0xE573, // - 0x86C4,0xE575, // - 0x86C6,0xE576, // - 0x86C7,0x8ED6, // - 0x86C9,0xE578, // - 0x86CB,0x9260, // - 0x86CD,0x8C75, // - 0x86CE,0x8A61, // - 0x86D4,0xE57B, // - 0x86D9,0x8A5E, // - 0x86DB,0xE581, // - 0x86DE,0xE57C, // - 0x86DF,0xE580, // - 0x86E4,0x94B8, // - 0x86E9,0xE57D, // - 0x86EC,0xE57E, // - 0x86ED,0x9567, // - 0x86EE,0x94D8, // - 0x86EF,0xE582, // - 0x86F8,0x91FB, // - 0x86F9,0xE58C, // - 0x86FB,0xE588, // - 0x86FE,0x89E9, // - 0x8700,0xE586, // - 0x8702,0x9649, // - 0x8703,0xE587, // - 0x8706,0xE584, // - 0x8708,0xE585, // - 0x8709,0xE58A, // - 0x870A,0xE58D, // - 0x870D,0xE58B, // - 0x8711,0xE589, // - 0x8712,0xE583, // - 0x8718,0x9277, // - 0x871A,0xE594, // - 0x871C,0x96A8, // - 0x8725,0xE592, // - 0x8729,0xE593, // - 0x8734,0xE58E, // - 0x8737,0xE590, // - 0x873B,0xE591, // - 0x873F,0xE58F, // - 0x8749,0x90E4, // - 0x874B,0x9858, // - 0x874C,0xE598, // - 0x874E,0xE599, // - 0x8753,0xE59F, // - 0x8755,0x9049, // - 0x8757,0xE59B, // - 0x8759,0xE59E, // - 0x875F,0xE596, // - 0x8760,0xE595, // - 0x8763,0xE5A0, // - 0x8766,0x89DA, // - 0x8768,0xE59C, // - 0x876A,0xE5A1, // - 0x876E,0xE59D, // - 0x8774,0xE59A, // - 0x8776,0x92B1, // - 0x8778,0xE597, // - 0x877F,0x9488, // - 0x8782,0xE5A5, // - 0x878D,0x975A, // - 0x879F,0xE5A4, // - 0x87A2,0xE5A3, // - 0x87AB,0xE5AC, // - 0x87AF,0xE5A6, // - 0x87B3,0xE5AE, // - 0x87BA,0x9786, // - 0x87BB,0xE5B1, // - 0x87BD,0xE5A8, // - 0x87C0,0xE5A9, // - 0x87C4,0xE5AD, // - 0x87C6,0xE5B0, // - 0x87C7,0xE5AF, // - 0x87CB,0xE5A7, // - 0x87D0,0xE5AA, // - 0x87D2,0xE5BB, // - 0x87E0,0xE5B4, // - 0x87EF,0xE5B2, // - 0x87F2,0xE5B3, // - 0x87F6,0xE5B8, // - 0x87F7,0xE5B9, // - 0x87F9,0x8A49, // - 0x87FB,0x8B61, // - 0x87FE,0xE5B7, // - 0x8805,0xE5A2, // - 0x880D,0xE5B6, // - 0x880E,0xE5BA, // - 0x880F,0xE5B5, // - 0x8811,0xE5BC, // - 0x8815,0xE5BE, // - 0x8816,0xE5BD, // - 0x8821,0xE5C0, // - 0x8822,0xE5BF, // - 0x8823,0xE579, // - 0x8827,0xE5C4, // - 0x8831,0xE5C1, // - 0x8836,0xE5C2, // - 0x8839,0xE5C3, // - 0x883B,0xE5C5, // - 0x8840,0x8C8C, // - 0x8842,0xE5C7, // - 0x8844,0xE5C6, // - 0x8846,0x8F4F, // - 0x884C,0x8D73, // - 0x884D,0x9FA5, // - 0x8852,0xE5C8, // - 0x8853,0x8F70, // - 0x8857,0x8A58, // - 0x8859,0xE5C9, // - 0x885B,0x8971, // - 0x885D,0x8FD5, // - 0x885E,0xE5CA, // - 0x8861,0x8D74, // - 0x8862,0xE5CB, // - 0x8863,0x88DF, // - 0x8868,0x955C, // - 0x886B,0xE5CC, // - 0x8870,0x908A, // - 0x8872,0xE5D3, // - 0x8875,0xE5D0, // - 0x8877,0x928F, // - 0x887D,0xE5D1, // - 0x887E,0xE5CE, // - 0x887F,0x8BDC, // - 0x8881,0xE5CD, // - 0x8882,0xE5D4, // - 0x8888,0x8C55, // - 0x888B,0x91DC, // - 0x888D,0xE5DA, // - 0x8892,0xE5D6, // - 0x8896,0x91B3, // - 0x8897,0xE5D5, // - 0x8899,0xE5D8, // - 0x889E,0xE5CF, // - 0x88A2,0xE5D9, // - 0x88A4,0xE5DB, // - 0x88AB,0x94ED, // - 0x88AE,0xE5D7, // - 0x88B0,0xE5DC, // - 0x88B1,0xE5DE, // - 0x88B4,0x8CD1, // - 0x88B5,0xE5D2, // - 0x88B7,0x88BF, // - 0x88BF,0xE5DD, // - 0x88C1,0x8DD9, // - 0x88C2,0x97F4, // - 0x88C3,0xE5DF, // - 0x88C4,0xE5E0, // - 0x88C5,0x9195, // - 0x88CF,0x97A0, // - 0x88D4,0xE5E1, // - 0x88D5,0x9754, // - 0x88D8,0xE5E2, // - 0x88D9,0xE5E3, // - 0x88DC,0x95E2, // - 0x88DD,0xE5E4, // - 0x88DF,0x8DBE, // - 0x88E1,0x97A1, // - 0x88E8,0xE5E9, // - 0x88F2,0xE5EA, // - 0x88F3,0x8FD6, // - 0x88F4,0xE5E8, // - 0x88F8,0x9787, // - 0x88F9,0xE5E5, // - 0x88FC,0xE5E7, // - 0x88FD,0x90BB, // - 0x88FE,0x909E, // - 0x8902,0xE5E6, // - 0x8904,0xE5EB, // - 0x8907,0x95A1, // - 0x890A,0xE5ED, // - 0x890C,0xE5EC, // - 0x8910,0x8A8C, // - 0x8912,0x964A, // - 0x8913,0xE5EE, // - 0x891D,0xE5FA, // - 0x891E,0xE5F0, // - 0x8925,0xE5F1, // - 0x892A,0xE5F2, // - 0x892B,0xE5F3, // - 0x8936,0xE5F7, // - 0x8938,0xE5F8, // - 0x893B,0xE5F6, // - 0x8941,0xE5F4, // - 0x8943,0xE5EF, // - 0x8944,0xE5F5, // - 0x894C,0xE5F9, // - 0x894D,0xE8B5, // - 0x8956,0x89A6, // - 0x895E,0xE5FC, // - 0x895F,0x8BDD, // - 0x8960,0xE5FB, // - 0x8964,0xE641, // - 0x8966,0xE640, // - 0x896A,0xE643, // - 0x896D,0xE642, // - 0x896F,0xE644, // - 0x8972,0x8F50, // - 0x8974,0xE645, // - 0x8977,0xE646, // - 0x897E,0xE647, // - 0x897F,0x90BC, // - 0x8981,0x9776, // - 0x8983,0xE648, // - 0x8986,0x95A2, // - 0x8987,0x9465, // - 0x8988,0xE649, // - 0x898A,0xE64A, // - 0x898B,0x8CA9, // - 0x898F,0x8B4B, // - 0x8993,0xE64B, // - 0x8996,0x8E8B, // - 0x8997,0x9460, // - 0x8998,0xE64C, // - 0x899A,0x8A6F, // - 0x89A1,0xE64D, // - 0x89A6,0xE64F, // - 0x89A7,0x9797, // - 0x89A9,0xE64E, // - 0x89AA,0x9065, // - 0x89AC,0xE650, // - 0x89AF,0xE651, // - 0x89B2,0xE652, // - 0x89B3,0x8ACF, // - 0x89BA,0xE653, // - 0x89BD,0xE654, // - 0x89BF,0xE655, // - 0x89C0,0xE656, // - 0x89D2,0x8A70, // - 0x89DA,0xE657, // - 0x89DC,0xE658, // - 0x89DD,0xE659, // - 0x89E3,0x89F0, // - 0x89E6,0x9047, // - 0x89E7,0xE65A, // - 0x89F8,0xE65C, // - 0x8A00,0x8CBE, // - 0x8A02,0x92F9, // - 0x8A03,0xE65D, // - 0x8A08,0x8C76, // - 0x8A0A,0x9075, // - 0x8A0C,0xE660, // - 0x8A0E,0x93A2, // - 0x8A10,0xE65F, // - 0x8A13,0x8C50, // - 0x8A16,0xE65E, // - 0x8A17,0x91F5, // - 0x8A18,0x8B4C, // - 0x8A1B,0xE661, // - 0x8A1D,0xE662, // - 0x8A1F,0x8FD7, // - 0x8A23,0x8C8D, // - 0x8A25,0xE663, // - 0x8A2A,0x964B, // - 0x8A2D,0x90DD, // - 0x8A31,0x8B96, // - 0x8A33,0x96F3, // - 0x8A34,0x9169, // - 0x8A36,0xE664, // - 0x8A3A,0x9066, // - 0x8A3B,0x9290, // - 0x8A3C,0x8FD8, // - 0x8A41,0xE665, // - 0x8A46,0xE668, // - 0x8A48,0xE669, // - 0x8A50,0x8DBC, // - 0x8A51,0x91C0, // - 0x8A52,0xE667, // - 0x8A54,0x8FD9, // - 0x8A55,0x955D, // - 0x8A5B,0xE666, // - 0x8A5E,0x8E8C, // - 0x8A60,0x8972, // - 0x8A62,0xE66D, // - 0x8A63,0x8C77, // - 0x8A66,0x8E8E, // - 0x8A69,0x8E8D, // - 0x8A6B,0x986C, // - 0x8A6C,0xE66C, // - 0x8A6D,0xE66B, // - 0x8A6E,0x9146, // - 0x8A70,0x8B6C, // - 0x8A71,0x9862, // - 0x8A72,0x8A59, // - 0x8A73,0x8FDA, // - 0x8A7C,0xE66A, // - 0x8A82,0xE66F, // - 0x8A84,0xE670, // - 0x8A85,0xE66E, // - 0x8A87,0x8CD6, // - 0x8A89,0x975F, // - 0x8A8C,0x8E8F, // - 0x8A8D,0x9446, // - 0x8A91,0xE673, // - 0x8A93,0x90BE, // - 0x8A95,0x9261, // - 0x8A98,0x9755, // - 0x8A9A,0xE676, // - 0x8A9E,0x8CEA, // - 0x8AA0,0x90BD, // - 0x8AA1,0xE672, // - 0x8AA3,0xE677, // - 0x8AA4,0x8CEB, // - 0x8AA5,0xE674, // - 0x8AA6,0xE675, // - 0x8AA8,0xE671, // - 0x8AAC,0x90E0, // - 0x8AAD,0x93C7, // - 0x8AB0,0x924E, // - 0x8AB2,0x89DB, // - 0x8AB9,0x94EE, // - 0x8ABC,0x8B62, // - 0x8ABF,0x92B2, // - 0x8AC2,0xE67A, // - 0x8AC4,0xE678, // - 0x8AC7,0x926B, // - 0x8ACB,0x90BF, // - 0x8ACC,0x8AD0, // - 0x8ACD,0xE679, // - 0x8ACF,0x907A, // - 0x8AD2,0x97C8, // - 0x8AD6,0x985F, // - 0x8ADA,0xE67B, // - 0x8ADB,0xE687, // - 0x8ADC,0x92B3, // - 0x8ADE,0xE686, // - 0x8AE0,0xE683, // - 0x8AE1,0xE68B, // - 0x8AE2,0xE684, // - 0x8AE4,0xE680, // - 0x8AE6,0x92FA, // - 0x8AE7,0xE67E, // - 0x8AEB,0xE67C, // - 0x8AED,0x9740, // - 0x8AEE,0x8E90, // - 0x8AF1,0xE681, // - 0x8AF3,0xE67D, // - 0x8AF7,0xE685, // - 0x8AF8,0x8F94, // - 0x8AFA,0x8CBF, // - 0x8AFE,0x91F8, // - 0x8B00,0x9664, // - 0x8B01,0x8979, // - 0x8B02,0x88E0, // - 0x8B04,0x93A3, // - 0x8B07,0xE689, // - 0x8B0C,0xE688, // - 0x8B0E,0x93E4, // - 0x8B10,0xE68D, // - 0x8B14,0xE682, // - 0x8B16,0xE68C, // - 0x8B17,0xE68E, // - 0x8B19,0x8CAA, // - 0x8B1A,0xE68A, // - 0x8B1B,0x8D75, // - 0x8B1D,0x8ED3, // - 0x8B20,0xE68F, // - 0x8B21,0x9777, // - 0x8B26,0xE692, // - 0x8B28,0xE695, // - 0x8B2B,0xE693, // - 0x8B2C,0x9554, // - 0x8B33,0xE690, // - 0x8B39,0x8BDE, // - 0x8B3E,0xE694, // - 0x8B41,0xE696, // - 0x8B49,0xE69A, // - 0x8B4C,0xE697, // - 0x8B4E,0xE699, // - 0x8B4F,0xE698, // - 0x8B56,0xE69B, // - 0x8B58,0x8EAF, // - 0x8B5A,0xE69D, // - 0x8B5B,0xE69C, // - 0x8B5C,0x9588, // - 0x8B5F,0xE69F, // - 0x8B66,0x8C78, // - 0x8B6B,0xE69E, // - 0x8B6C,0xE6A0, // - 0x8B6F,0xE6A1, // - 0x8B70,0x8B63, // - 0x8B71,0xE3BF, // - 0x8B72,0x8FF7, // - 0x8B74,0xE6A2, // - 0x8B77,0x8CEC, // - 0x8B7D,0xE6A3, // - 0x8B80,0xE6A4, // - 0x8B83,0x8E5D, // - 0x8B8A,0x9DCC, // - 0x8B8C,0xE6A5, // - 0x8B8E,0xE6A6, // - 0x8B90,0x8F51, // - 0x8B92,0xE6A7, // - 0x8B93,0xE6A8, // - 0x8B96,0xE6A9, // - 0x8B99,0xE6AA, // - 0x8B9A,0xE6AB, // - 0x8C37,0x924A, // - 0x8C3A,0xE6AC, // - 0x8C3F,0xE6AE, // - 0x8C41,0xE6AD, // - 0x8C46,0x93A4, // - 0x8C48,0xE6AF, // - 0x8C4A,0x964C, // - 0x8C4C,0xE6B0, // - 0x8C4E,0xE6B1, // - 0x8C50,0xE6B2, // - 0x8C55,0xE6B3, // - 0x8C5A,0x93D8, // - 0x8C61,0x8FDB, // - 0x8C62,0xE6B4, // - 0x8C6A,0x8D8B, // - 0x8C6B,0x98AC, // - 0x8C6C,0xE6B5, // - 0x8C78,0xE6B6, // - 0x8C79,0x955E, // - 0x8C7A,0xE6B7, // - 0x8C7C,0xE6BF, // - 0x8C82,0xE6B8, // - 0x8C85,0xE6BA, // - 0x8C89,0xE6B9, // - 0x8C8A,0xE6BB, // - 0x8C8C,0x9665, // - 0x8C8D,0xE6BC, // - 0x8C8E,0xE6BD, // - 0x8C94,0xE6BE, // - 0x8C98,0xE6C0, // - 0x8C9D,0x8A4C, // - 0x8C9E,0x92E5, // - 0x8CA0,0x9589, // - 0x8CA1,0x8DE0, // - 0x8CA2,0x8D76, // - 0x8CA7,0x956E, // - 0x8CA8,0x89DD, // - 0x8CA9,0x94CC, // - 0x8CAA,0xE6C3, // - 0x8CAB,0x8AD1, // - 0x8CAC,0x90D3, // - 0x8CAD,0xE6C2, // - 0x8CAE,0xE6C7, // - 0x8CAF,0x9299, // - 0x8CB0,0x96E1, // - 0x8CB2,0xE6C5, // - 0x8CB3,0xE6C6, // - 0x8CB4,0x8B4D, // - 0x8CB6,0xE6C8, // - 0x8CB7,0x9483, // - 0x8CB8,0x91DD, // - 0x8CBB,0x94EF, // - 0x8CBC,0x935C, // - 0x8CBD,0xE6C4, // - 0x8CBF,0x9666, // - 0x8CC0,0x89EA, // - 0x8CC1,0xE6CA, // - 0x8CC2,0x9847, // - 0x8CC3,0x92C0, // - 0x8CC4,0x9864, // - 0x8CC7,0x8E91, // - 0x8CC8,0xE6C9, // - 0x8CCA,0x91AF, // - 0x8CCD,0xE6DA, // - 0x8CCE,0x9147, // - 0x8CD1,0x93F6, // - 0x8CD3,0x956F, // - 0x8CDA,0xE6CD, // - 0x8CDB,0x8E5E, // - 0x8CDC,0x8E92, // - 0x8CDE,0x8FDC, // - 0x8CE0,0x9485, // - 0x8CE2,0x8CAB, // - 0x8CE3,0xE6CC, // - 0x8CE4,0xE6CB, // - 0x8CE6,0x958A, // - 0x8CEA,0x8EBF, // - 0x8CED,0x9371, // - 0x8CFA,0xE6CF, // - 0x8CFB,0xE6D0, // - 0x8CFC,0x8D77, // - 0x8CFD,0xE6CE, // - 0x8D04,0xE6D1, // - 0x8D05,0xE6D2, // - 0x8D07,0xE6D4, // - 0x8D08,0x91A1, // - 0x8D0A,0xE6D3, // - 0x8D0B,0x8AE4, // - 0x8D0D,0xE6D6, // - 0x8D0F,0xE6D5, // - 0x8D10,0xE6D7, // - 0x8D13,0xE6D9, // - 0x8D14,0xE6DB, // - 0x8D16,0xE6DC, // - 0x8D64,0x90D4, // - 0x8D66,0x8ECD, // - 0x8D67,0xE6DD, // - 0x8D6B,0x8A71, // - 0x8D6D,0xE6DE, // - 0x8D70,0x9196, // - 0x8D71,0xE6DF, // - 0x8D73,0xE6E0, // - 0x8D74,0x958B, // - 0x8D77,0x8B4E, // - 0x8D81,0xE6E1, // - 0x8D85,0x92B4, // - 0x8D8A,0x897A, // - 0x8D99,0xE6E2, // - 0x8DA3,0x8EEF, // - 0x8DA8,0x9096, // - 0x8DB3,0x91AB, // - 0x8DBA,0xE6E5, // - 0x8DBE,0xE6E4, // - 0x8DC2,0xE6E3, // - 0x8DCB,0xE6EB, // - 0x8DCC,0xE6E9, // - 0x8DCF,0xE6E6, // - 0x8DD6,0xE6E8, // - 0x8DDA,0xE6E7, // - 0x8DDB,0xE6EA, // - 0x8DDD,0x8B97, // - 0x8DDF,0xE6EE, // - 0x8DE1,0x90D5, // - 0x8DE3,0xE6EF, // - 0x8DE8,0x8CD7, // - 0x8DEA,0xE6EC, // - 0x8DEB,0xE6ED, // - 0x8DEF,0x9848, // - 0x8DF3,0x92B5, // - 0x8DF5,0x9148, // - 0x8DFC,0xE6F0, // - 0x8DFF,0xE6F3, // - 0x8E08,0xE6F1, // - 0x8E09,0xE6F2, // - 0x8E0A,0x9778, // - 0x8E0F,0x93A5, // - 0x8E10,0xE6F6, // - 0x8E1D,0xE6F4, // - 0x8E1E,0xE6F5, // - 0x8E1F,0xE6F7, // - 0x8E2A,0xE748, // - 0x8E30,0xE6FA, // - 0x8E34,0xE6FB, // - 0x8E35,0xE6F9, // - 0x8E42,0xE6F8, // - 0x8E44,0x92FB, // - 0x8E47,0xE740, // - 0x8E48,0xE744, // - 0x8E49,0xE741, // - 0x8E4A,0xE6FC, // - 0x8E4C,0xE742, // - 0x8E50,0xE743, // - 0x8E55,0xE74A, // - 0x8E59,0xE745, // - 0x8E5F,0x90D6, // - 0x8E60,0xE747, // - 0x8E63,0xE749, // - 0x8E64,0xE746, // - 0x8E72,0xE74C, // - 0x8E74,0x8F52, // - 0x8E76,0xE74B, // - 0x8E7C,0xE74D, // - 0x8E81,0xE74E, // - 0x8E84,0xE751, // - 0x8E85,0xE750, // - 0x8E87,0xE74F, // - 0x8E8A,0xE753, // - 0x8E8B,0xE752, // - 0x8E8D,0x96F4, // - 0x8E91,0xE755, // - 0x8E93,0xE754, // - 0x8E94,0xE756, // - 0x8E99,0xE757, // - 0x8EA1,0xE759, // - 0x8EAA,0xE758, // - 0x8EAB,0x9067, // - 0x8EAC,0xE75A, // - 0x8EAF,0x8BEB, // - 0x8EB1,0xE75D, // - 0x8EBE,0xE75E, // - 0x8EC5,0xE75F, // - 0x8EC6,0xE75C, // - 0x8EC8,0xE760, // - 0x8ECA,0x8ED4, // - 0x8ECB,0xE761, // - 0x8ECC,0x8B4F, // - 0x8ECD,0x8C52, // - 0x8ED2,0x8CAC, // - 0x8EDB,0xE762, // - 0x8EDF,0x93EE, // - 0x8EE2,0x935D, // - 0x8EE3,0xE763, // - 0x8EEB,0xE766, // - 0x8EF8,0x8EB2, // - 0x8EFB,0xE765, // - 0x8EFC,0xE764, // - 0x8EFD,0x8C79, // - 0x8EFE,0xE767, // - 0x8F03,0x8A72, // - 0x8F05,0xE769, // - 0x8F09,0x8DDA, // - 0x8F0A,0xE768, // - 0x8F0C,0xE771, // - 0x8F12,0xE76B, // - 0x8F13,0xE76D, // - 0x8F14,0x95E3, // - 0x8F15,0xE76A, // - 0x8F19,0xE76C, // - 0x8F1B,0xE770, // - 0x8F1C,0xE76E, // - 0x8F1D,0x8B50, // - 0x8F1F,0xE76F, // - 0x8F26,0xE772, // - 0x8F29,0x9479, // - 0x8F2A,0x97D6, // - 0x8F2F,0x8F53, // - 0x8F33,0xE773, // - 0x8F38,0x9741, // - 0x8F39,0xE775, // - 0x8F3B,0xE774, // - 0x8F3E,0xE778, // - 0x8F3F,0x9760, // - 0x8F42,0xE777, // - 0x8F44,0x8A8D, // - 0x8F45,0xE776, // - 0x8F46,0xE77B, // - 0x8F49,0xE77A, // - 0x8F4C,0xE779, // - 0x8F4D,0x9351, // - 0x8F4E,0xE77C, // - 0x8F57,0xE77D, // - 0x8F5C,0xE77E, // - 0x8F5F,0x8D8C, // - 0x8F61,0x8C44, // - 0x8F62,0xE780, // - 0x8F63,0xE781, // - 0x8F64,0xE782, // - 0x8F9B,0x9068, // - 0x8F9C,0xE783, // - 0x8F9E,0x8EAB, // - 0x8F9F,0xE784, // - 0x8FA3,0xE785, // - 0x8FA7,0x999F, // - 0x8FA8,0x999E, // - 0x8FAD,0xE786, // - 0x8FAE,0xE390, // - 0x8FAF,0xE787, // - 0x8FB0,0x9243, // - 0x8FB1,0x904A, // - 0x8FB2,0x945F, // - 0x8FB7,0xE788, // - 0x8FBA,0x95D3, // - 0x8FBB,0x92D2, // - 0x8FBC,0x8D9E, // - 0x8FBF,0x9248, // - 0x8FC2,0x8949, // - 0x8FC4,0x9698, // - 0x8FC5,0x9076, // - 0x8FCE,0x8C7D, // - 0x8FD1,0x8BDF, // - 0x8FD4,0x95D4, // - 0x8FDA,0xE789, // - 0x8FE2,0xE78B, // - 0x8FE5,0xE78A, // - 0x8FE6,0x89DE, // - 0x8FE9,0x93F4, // - 0x8FEA,0xE78C, // - 0x8FEB,0x9497, // - 0x8FED,0x9352, // - 0x8FEF,0xE78D, // - 0x8FF0,0x8F71, // - 0x8FF4,0xE78F, // - 0x8FF7,0x96C0, // - 0x8FF8,0xE79E, // - 0x8FF9,0xE791, // - 0x8FFA,0xE792, // - 0x8FFD,0x92C7, // - 0x9000,0x91DE, // - 0x9001,0x9197, // - 0x9003,0x93A6, // - 0x9005,0xE790, // - 0x9006,0x8B74, // - 0x900B,0xE799, // - 0x900D,0xE796, // - 0x900E,0xE7A3, // - 0x900F,0x93A7, // - 0x9010,0x9280, // - 0x9011,0xE793, // - 0x9013,0x92FC, // - 0x9014,0x9372, // - 0x9015,0xE794, // - 0x9016,0xE798, // - 0x9017,0x9080, // - 0x9019,0x9487, // - 0x901A,0x92CA, // - 0x901D,0x90C0, // - 0x901E,0xE797, // - 0x901F,0x91AC, // - 0x9020,0x91A2, // - 0x9021,0xE795, // - 0x9022,0x88A7, // - 0x9023,0x9841, // - 0x9027,0xE79A, // - 0x902E,0x91DF, // - 0x9031,0x8F54, // - 0x9032,0x9069, // - 0x9035,0xE79C, // - 0x9036,0xE79B, // - 0x9038,0x88ED, // - 0x9039,0xE79D, // - 0x903C,0x954E, // - 0x903E,0xE7A5, // - 0x9041,0x93D9, // - 0x9042,0x908B, // - 0x9045,0x9278, // - 0x9047,0x8BF6, // - 0x9049,0xE7A4, // - 0x904A,0x9756, // - 0x904B,0x895E, // - 0x904D,0x95D5, // - 0x904E,0x89DF, // - 0x904F,0xE79F, // - 0x9050,0xE7A0, // - 0x9051,0xE7A1, // - 0x9052,0xE7A2, // - 0x9053,0x93B9, // - 0x9054,0x9242, // - 0x9055,0x88E1, // - 0x9056,0xE7A6, // - 0x9058,0xE7A7, // - 0x9059,0xEAA1, // - 0x905C,0x91BB, // - 0x905E,0xE7A8, // - 0x9060,0x8993, // - 0x9061,0x916B, // - 0x9063,0x8CAD, // - 0x9065,0x9779, // - 0x9068,0xE7A9, // - 0x9069,0x934B, // - 0x906D,0x9198, // - 0x906E,0x8ED5, // - 0x906F,0xE7AA, // - 0x9072,0xE7AD, // - 0x9075,0x8F85, // - 0x9076,0xE7AB, // - 0x9077,0x914A, // - 0x9078,0x9149, // - 0x907A,0x88E2, // - 0x907C,0x97C9, // - 0x907D,0xE7AF, // - 0x907F,0x94F0, // - 0x9080,0xE7B1, // - 0x9081,0xE7B0, // - 0x9082,0xE7AE, // - 0x9083,0xE284, // - 0x9084,0x8AD2, // - 0x9087,0xE78E, // - 0x9089,0xE7B3, // - 0x908A,0xE7B2, // - 0x908F,0xE7B4, // - 0x9091,0x9757, // - 0x90A3,0x93DF, // - 0x90A6,0x964D, // - 0x90A8,0xE7B5, // - 0x90AA,0x8ED7, // - 0x90AF,0xE7B6, // - 0x90B1,0xE7B7, // - 0x90B5,0xE7B8, // - 0x90B8,0x9340, // - 0x90C1,0x88E8, // - 0x90CA,0x8D78, // - 0x90CE,0x9859, // - 0x90DB,0xE7BC, // - 0x90E1,0x8C53, // - 0x90E2,0xE7B9, // - 0x90E4,0xE7BA, // - 0x90E8,0x9594, // - 0x90ED,0x8A73, // - 0x90F5,0x9758, // - 0x90F7,0x8BBD, // - 0x90FD,0x9373, // - 0x9102,0xE7BD, // - 0x9112,0xE7BE, // - 0x9119,0xE7BF, // - 0x912D,0x9341, // - 0x9130,0xE7C1, // - 0x9132,0xE7C0, // - 0x9149,0x93D1, // - 0x914A,0xE7C2, // - 0x914B,0x8F55, // - 0x914C,0x8EDE, // - 0x914D,0x947A, // - 0x914E,0x9291, // - 0x9152,0x8EF0, // - 0x9154,0x908C, // - 0x9156,0xE7C3, // - 0x9158,0xE7C4, // - 0x9162,0x907C, // - 0x9163,0xE7C5, // - 0x9165,0xE7C6, // - 0x9169,0xE7C7, // - 0x916A,0x978F, // - 0x916C,0x8F56, // - 0x9172,0xE7C9, // - 0x9173,0xE7C8, // - 0x9175,0x8D79, // - 0x9177,0x8D93, // - 0x9178,0x8E5F, // - 0x9182,0xE7CC, // - 0x9187,0x8F86, // - 0x9189,0xE7CB, // - 0x918B,0xE7CA, // - 0x918D,0x91E7, // - 0x9190,0x8CED, // - 0x9192,0x90C1, // - 0x9197,0x94AE, // - 0x919C,0x8F58, // - 0x91A2,0xE7CD, // - 0x91A4,0x8FDD, // - 0x91AA,0xE7D0, // - 0x91AB,0xE7CE, // - 0x91AF,0xE7CF, // - 0x91B4,0xE7D2, // - 0x91B5,0xE7D1, // - 0x91B8,0x8FF8, // - 0x91BA,0xE7D3, // - 0x91C0,0xE7D4, // - 0x91C1,0xE7D5, // - 0x91C6,0x94CE, // - 0x91C7,0x8DD1, // - 0x91C8,0x8EDF, // - 0x91C9,0xE7D6, // - 0x91CB,0xE7D7, // - 0x91CC,0x97A2, // - 0x91CD,0x8F64, // - 0x91CE,0x96EC, // - 0x91CF,0x97CA, // - 0x91D0,0xE7D8, // - 0x91D1,0x8BE0, // - 0x91D6,0xE7D9, // - 0x91D8,0x9342, // - 0x91DB,0xE7DC, // - 0x91DC,0x8A98, // - 0x91DD,0x906A, // - 0x91DF,0xE7DA, // - 0x91E1,0xE7DB, // - 0x91E3,0x92DE, // - 0x91E6,0x9674, // - 0x91E7,0x8BFA, // - 0x91F5,0xE7DE, // - 0x91F6,0xE7DF, // - 0x91FC,0xE7DD, // - 0x91FF,0xE7E1, // - 0x920D,0x93DD, // - 0x920E,0x8A62, // - 0x9211,0xE7E5, // - 0x9214,0xE7E2, // - 0x9215,0xE7E4, // - 0x921E,0xE7E0, // - 0x9229,0xE86E, // - 0x922C,0xE7E3, // - 0x9234,0x97E9, // - 0x9237,0x8CD8, // - 0x923F,0xE7ED, // - 0x9244,0x9353, // - 0x9245,0xE7E8, // - 0x9248,0xE7EB, // - 0x9249,0xE7E9, // - 0x924B,0xE7EE, // - 0x9250,0xE7EF, // - 0x9257,0xE7E7, // - 0x925A,0xE7F4, // - 0x925B,0x8994, // - 0x925E,0xE7E6, // - 0x9262,0x94AB, // - 0x9264,0xE7EA, // - 0x9266,0x8FDE, // - 0x9271,0x8D7A, // - 0x927E,0x9667, // - 0x9280,0x8BE2, // - 0x9283,0x8F65, // - 0x9285,0x93BA, // - 0x9291,0x914C, // - 0x9293,0xE7F2, // - 0x9295,0xE7EC, // - 0x9296,0xE7F1, // - 0x9298,0x96C1, // - 0x929A,0x92B6, // - 0x929B,0xE7F3, // - 0x929C,0xE7F0, // - 0x92AD,0x914B, // - 0x92B7,0xE7F7, // - 0x92B9,0xE7F6, // - 0x92CF,0xE7F5, // - 0x92D2,0x964E, // - 0x92E4,0x8F9B, // - 0x92E9,0xE7F8, // - 0x92EA,0x95DD, // - 0x92ED,0x8973, // - 0x92F2,0x9565, // - 0x92F3,0x9292, // - 0x92F8,0x8B98, // - 0x92FA,0xE7FA, // - 0x92FC,0x8D7C, // - 0x9306,0x8E4B, // - 0x930F,0xE7F9, // - 0x9310,0x908D, // - 0x9318,0x908E, // - 0x9319,0xE840, // - 0x931A,0xE842, // - 0x9320,0x8FF9, // - 0x9322,0xE841, // - 0x9323,0xE843, // - 0x9326,0x8BD1, // - 0x9328,0x9564, // - 0x932B,0x8EE0, // - 0x932C,0x9842, // - 0x932E,0xE7FC, // - 0x932F,0x8DF6, // - 0x9332,0x985E, // - 0x9335,0xE845, // - 0x933A,0xE844, // - 0x933B,0xE846, // - 0x9344,0xE7FB, // - 0x934B,0x93E7, // - 0x934D,0x9374, // - 0x9354,0x92D5, // - 0x9356,0xE84B, // - 0x935B,0x9262, // - 0x935C,0xE847, // - 0x9360,0xE848, // - 0x936C,0x8C4C, // - 0x936E,0xE84A, // - 0x9375,0x8CAE, // - 0x937C,0xE849, // - 0x937E,0x8FDF, // - 0x938C,0x8A99, // - 0x9394,0xE84F, // - 0x9396,0x8DBD, // - 0x9397,0x9199, // - 0x939A,0x92C8, // - 0x93A7,0x8A5A, // - 0x93AC,0xE84D, // - 0x93AD,0xE84E, // - 0x93AE,0x92C1, // - 0x93B0,0xE84C, // - 0x93B9,0xE850, // - 0x93C3,0xE856, // - 0x93C8,0xE859, // - 0x93D0,0xE858, // - 0x93D1,0x934C, // - 0x93D6,0xE851, // - 0x93D7,0xE852, // - 0x93D8,0xE855, // - 0x93DD,0xE857, // - 0x93E1,0x8BBE, // - 0x93E4,0xE85A, // - 0x93E5,0xE854, // - 0x93E8,0xE853, // - 0x9403,0xE85E, // - 0x9407,0xE85F, // - 0x9410,0xE860, // - 0x9413,0xE85D, // - 0x9414,0xE85C, // - 0x9418,0x8FE0, // - 0x9419,0x93A8, // - 0x9421,0xE864, // - 0x942B,0xE862, // - 0x9435,0xE863, // - 0x9436,0xE861, // - 0x9438,0x91F6, // - 0x943A,0xE865, // - 0x9441,0xE866, // - 0x9444,0xE868, // - 0x9451,0x8AD3, // - 0x9452,0xE867, // - 0x9453,0x96F8, // - 0x945A,0xE873, // - 0x945B,0xE869, // - 0x945E,0xE86C, // - 0x9460,0xE86A, // - 0x9462,0xE86B, // - 0x946A,0xE86D, // - 0x9470,0xE86F, // - 0x9475,0xE870, // - 0x9477,0xE871, // - 0x947C,0xE874, // - 0x947D,0xE872, // - 0x947E,0xE875, // - 0x947F,0xE877, // - 0x9481,0xE876, // - 0x9577,0x92B7, // - 0x9580,0x96E5, // - 0x9582,0xE878, // - 0x9583,0x914D, // - 0x9587,0xE879, // - 0x9589,0x95C2, // - 0x958A,0xE87A, // - 0x958B,0x8A4A, // - 0x9591,0x8AD5, // - 0x9593,0x8AD4, // - 0x9594,0xE87B, // - 0x9596,0xE87C, // - 0x9598,0xE87D, // - 0x9599,0xE87E, // - 0x95A0,0xE880, // - 0x95A2,0x8AD6, // - 0x95A3,0x8A74, // - 0x95A4,0x8D7D, // - 0x95A5,0x94B4, // - 0x95A7,0xE882, // - 0x95A8,0xE881, // - 0x95AD,0xE883, // - 0x95B2,0x897B, // - 0x95B9,0xE886, // - 0x95BB,0xE885, // - 0x95BC,0xE884, // - 0x95BE,0xE887, // - 0x95C3,0xE88A, // - 0x95C7,0x88C5, // - 0x95CA,0xE888, // - 0x95CC,0xE88C, // - 0x95CD,0xE88B, // - 0x95D4,0xE88E, // - 0x95D5,0xE88D, // - 0x95D6,0xE88F, // - 0x95D8,0x93AC, // - 0x95DC,0xE890, // - 0x95E1,0xE891, // - 0x95E2,0xE893, // - 0x95E5,0xE892, // - 0x961C,0x958C, // - 0x9621,0xE894, // - 0x9628,0xE895, // - 0x962A,0x8DE3, // - 0x962E,0xE896, // - 0x962F,0xE897, // - 0x9632,0x9668, // - 0x963B,0x916A, // - 0x963F,0x88A2, // - 0x9640,0x91C9, // - 0x9642,0xE898, // - 0x9644,0x958D, // - 0x964B,0xE89B, // - 0x964C,0xE899, // - 0x964D,0x8D7E, // - 0x964F,0xE89A, // - 0x9650,0x8CC0, // - 0x965B,0x95C3, // - 0x965C,0xE89D, // - 0x965D,0xE89F, // - 0x965E,0xE89E, // - 0x965F,0xE8A0, // - 0x9662,0x8940, // - 0x9663,0x9077, // - 0x9664,0x8F9C, // - 0x9665,0x8AD7, // - 0x9666,0xE8A1, // - 0x966A,0x9486, // - 0x966C,0xE8A3, // - 0x9670,0x8941, // - 0x9672,0xE8A2, // - 0x9673,0x92C2, // - 0x9675,0x97CB, // - 0x9676,0x93A9, // - 0x9677,0xE89C, // - 0x9678,0x97A4, // - 0x967A,0x8CAF, // - 0x967D,0x977A, // - 0x9685,0x8BF7, // - 0x9686,0x97B2, // - 0x9688,0x8C47, // - 0x968A,0x91E0, // - 0x968B,0xE440, // - 0x968D,0xE8A4, // - 0x968E,0x8A4B, // - 0x968F,0x908F, // - 0x9694,0x8A75, // - 0x9695,0xE8A6, // - 0x9697,0xE8A7, // - 0x9698,0xE8A5, // - 0x9699,0x8C84, // - 0x969B,0x8DDB, // - 0x969C,0x8FE1, // - 0x96A0,0x8942, // - 0x96A3,0x97D7, // - 0x96A7,0xE8A9, // - 0x96A8,0xE7AC, // - 0x96AA,0xE8A8, // - 0x96B0,0xE8AC, // - 0x96B1,0xE8AA, // - 0x96B2,0xE8AB, // - 0x96B4,0xE8AD, // - 0x96B6,0xE8AE, // - 0x96B7,0x97EA, // - 0x96B8,0xE8AF, // - 0x96B9,0xE8B0, // - 0x96BB,0x90C7, // - 0x96BC,0x94B9, // - 0x96C0,0x909D, // - 0x96C1,0x8AE5, // - 0x96C4,0x9759, // - 0x96C5,0x89EB, // - 0x96C6,0x8F57, // - 0x96C7,0x8CD9, // - 0x96C9,0xE8B3, // - 0x96CB,0xE8B2, // - 0x96CC,0x8E93, // - 0x96CD,0xE8B4, // - 0x96CE,0xE8B1, // - 0x96D1,0x8E47, // - 0x96D5,0xE8B8, // - 0x96D6,0xE5AB, // - 0x96D9,0x99D4, // - 0x96DB,0x9097, // - 0x96DC,0xE8B6, // - 0x96E2,0x97A3, // - 0x96E3,0x93EF, // - 0x96E8,0x894A, // - 0x96EA,0x90E1, // - 0x96EB,0x8EB4, // - 0x96F0,0x95B5, // - 0x96F2,0x895F, // - 0x96F6,0x97EB, // - 0x96F7,0x978B, // - 0x96F9,0xE8B9, // - 0x96FB,0x9364, // - 0x9700,0x8EF9, // - 0x9704,0xE8BA, // - 0x9706,0xE8BB, // - 0x9707,0x906B, // - 0x9708,0xE8BC, // - 0x970A,0x97EC, // - 0x970D,0xE8B7, // - 0x970E,0xE8BE, // - 0x970F,0xE8C0, // - 0x9711,0xE8BF, // - 0x9713,0xE8BD, // - 0x9716,0xE8C1, // - 0x9719,0xE8C2, // - 0x971C,0x919A, // - 0x971E,0x89E0, // - 0x9724,0xE8C3, // - 0x9727,0x96B6, // - 0x972A,0xE8C4, // - 0x9730,0xE8C5, // - 0x9732,0x9849, // - 0x9738,0x9E50, // - 0x9739,0xE8C6, // - 0x973D,0xE8C7, // - 0x973E,0xE8C8, // - 0x9742,0xE8CC, // - 0x9744,0xE8C9, // - 0x9746,0xE8CA, // - 0x9748,0xE8CB, // - 0x9749,0xE8CD, // - 0x9752,0x90C2, // - 0x9756,0x96F5, // - 0x9759,0x90C3, // - 0x975C,0xE8CE, // - 0x975E,0x94F1, // - 0x9760,0xE8CF, // - 0x9761,0xEA72, // - 0x9762,0x96CA, // - 0x9764,0xE8D0, // - 0x9766,0xE8D1, // - 0x9768,0xE8D2, // - 0x9769,0x8A76, // - 0x976B,0xE8D4, // - 0x976D,0x9078, // - 0x9771,0xE8D5, // - 0x9774,0x8C43, // - 0x9779,0xE8D6, // - 0x977A,0xE8DA, // - 0x977C,0xE8D8, // - 0x9781,0xE8D9, // - 0x9784,0x8A93, // - 0x9785,0xE8D7, // - 0x9786,0xE8DB, // - 0x978B,0xE8DC, // - 0x978D,0x88C6, // - 0x978F,0xE8DD, // - 0x9790,0xE8DE, // - 0x9798,0x8FE2, // - 0x979C,0xE8DF, // - 0x97A0,0x8B66, // - 0x97A3,0xE8E2, // - 0x97A6,0xE8E1, // - 0x97A8,0xE8E0, // - 0x97AB,0xE691, // - 0x97AD,0x95DA, // - 0x97B3,0xE8E3, // - 0x97B4,0xE8E4, // - 0x97C3,0xE8E5, // - 0x97C6,0xE8E6, // - 0x97C8,0xE8E7, // - 0x97CB,0xE8E8, // - 0x97D3,0x8AD8, // - 0x97DC,0xE8E9, // - 0x97ED,0xE8EA, // - 0x97EE,0x9442, // - 0x97F2,0xE8EC, // - 0x97F3,0x89B9, // - 0x97F5,0xE8EF, // - 0x97F6,0xE8EE, // - 0x97FB,0x8943, // - 0x97FF,0x8BBF, // - 0x9801,0x95C5, // - 0x9802,0x92B8, // - 0x9803,0x8DA0, // - 0x9805,0x8D80, // - 0x9806,0x8F87, // - 0x9808,0x907B, // - 0x980C,0xE8F1, // - 0x980F,0xE8F0, // - 0x9810,0x9761, // - 0x9811,0x8AE6, // - 0x9812,0x94D0, // - 0x9813,0x93DA, // - 0x9817,0x909C, // - 0x9818,0x97CC, // - 0x981A,0x8C7A, // - 0x9821,0xE8F4, // - 0x9824,0xE8F3, // - 0x982C,0x966A, // - 0x982D,0x93AA, // - 0x9834,0x896F, // - 0x9837,0xE8F5, // - 0x9838,0xE8F2, // - 0x983B,0x9570, // - 0x983C,0x978A, // - 0x983D,0xE8F6, // - 0x9846,0xE8F7, // - 0x984B,0xE8F9, // - 0x984C,0x91E8, // - 0x984D,0x8A7A, // - 0x984E,0x8A7B, // - 0x984F,0xE8F8, // - 0x9854,0x8AE7, // - 0x9855,0x8CB0, // - 0x9858,0x8AE8, // - 0x985B,0x935E, // - 0x985E,0x97DE, // - 0x9867,0x8CDA, // - 0x986B,0xE8FA, // - 0x986F,0xE8FB, // - 0x9870,0xE8FC, // - 0x9871,0xE940, // - 0x9873,0xE942, // - 0x9874,0xE941, // - 0x98A8,0x9597, // - 0x98AA,0xE943, // - 0x98AF,0xE944, // - 0x98B1,0xE945, // - 0x98B6,0xE946, // - 0x98C3,0xE948, // - 0x98C4,0xE947, // - 0x98C6,0xE949, // - 0x98DB,0x94F2, // - 0x98DC,0xE3CA, // - 0x98DF,0x9048, // - 0x98E2,0x8B51, // - 0x98E9,0xE94A, // - 0x98EB,0xE94B, // - 0x98ED,0x99AA, // - 0x98EE,0x9F5A, // - 0x98EF,0x94D1, // - 0x98F2,0x88F9, // - 0x98F4,0x88B9, // - 0x98FC,0x8E94, // - 0x98FD,0x964F, // - 0x98FE,0x8FFC, // - 0x9903,0xE94C, // - 0x9905,0x96DD, // - 0x9909,0xE94D, // - 0x990A,0x977B, // - 0x990C,0x8961, // - 0x9910,0x8E60, // - 0x9912,0xE94E, // - 0x9913,0x89EC, // - 0x9914,0xE94F, // - 0x9918,0xE950, // - 0x991D,0xE952, // - 0x991E,0xE953, // - 0x9920,0xE955, // - 0x9921,0xE951, // - 0x9924,0xE954, // - 0x9928,0x8AD9, // - 0x992C,0xE956, // - 0x992E,0xE957, // - 0x993D,0xE958, // - 0x993E,0xE959, // - 0x9942,0xE95A, // - 0x9945,0xE95C, // - 0x994B,0xE95E, // - 0x994C,0xE961, // - 0x9950,0xE95D, // - 0x9951,0xE95F, // - 0x9952,0xE960, // - 0x9955,0xE962, // - 0x9957,0x8BC0, // - 0x9996,0x8EF1, // - 0x9997,0xE963, // - 0x9998,0xE964, // - 0x9999,0x8D81, // - 0x99A5,0xE965, // - 0x99A8,0x8A5D, // - 0x99AC,0x946E, // - 0x99AD,0xE966, // - 0x99AE,0xE967, // - 0x99B3,0x9279, // - 0x99B4,0x93E9, // - 0x99BC,0xE968, // - 0x99C1,0x949D, // - 0x99C4,0x91CA, // - 0x99C5,0x8977, // - 0x99C6,0x8BEC, // - 0x99C8,0x8BED, // - 0x99D0,0x9293, // - 0x99D1,0xE96D, // - 0x99D2,0x8BEE, // - 0x99D5,0x89ED, // - 0x99D8,0xE96C, // - 0x99DB,0xE96A, // - 0x99DD,0xE96B, // - 0x99DF,0xE969, // - 0x99E2,0xE977, // - 0x99ED,0xE96E, // - 0x99EE,0xE96F, // - 0x99F1,0xE970, // - 0x99F2,0xE971, // - 0x99F8,0xE973, // - 0x99FB,0xE972, // - 0x99FF,0x8F78, // - 0x9A01,0xE974, // - 0x9A05,0xE976, // - 0x9A0E,0x8B52, // - 0x9A0F,0xE975, // - 0x9A12,0x919B, // - 0x9A13,0x8CB1, // - 0x9A19,0xE978, // - 0x9A28,0x91CB, // - 0x9A2B,0xE979, // - 0x9A30,0x93AB, // - 0x9A37,0xE97A, // - 0x9A3E,0xE980, // - 0x9A40,0xE97D, // - 0x9A42,0xE97C, // - 0x9A43,0xE97E, // - 0x9A45,0xE97B, // - 0x9A4D,0xE982, // - 0x9A55,0xE981, // - 0x9A57,0xE984, // - 0x9A5A,0x8BC1, // - 0x9A5B,0xE983, // - 0x9A5F,0xE985, // - 0x9A62,0xE986, // - 0x9A64,0xE988, // - 0x9A65,0xE987, // - 0x9A69,0xE989, // - 0x9A6A,0xE98B, // - 0x9A6B,0xE98A, // - 0x9AA8,0x8D9C, // - 0x9AAD,0xE98C, // - 0x9AB0,0xE98D, // - 0x9ABC,0xE98E, // - 0x9AC0,0xE98F, // - 0x9AC4,0x9091, // - 0x9ACF,0xE990, // - 0x9AD1,0xE991, // - 0x9AD3,0xE992, // - 0x9AD4,0xE993, // - 0x9AD8,0x8D82, // - 0x9ADE,0xE994, // - 0x9ADF,0xE995, // - 0x9AE2,0xE996, // - 0x9AE3,0xE997, // - 0x9AE6,0xE998, // - 0x9AEA,0x94AF, // - 0x9AEB,0xE99A, // - 0x9AED,0x9545, // - 0x9AEE,0xE99B, // - 0x9AEF,0xE999, // - 0x9AF1,0xE99D, // - 0x9AF4,0xE99C, // - 0x9AF7,0xE99E, // - 0x9AFB,0xE99F, // - 0x9B06,0xE9A0, // - 0x9B18,0xE9A1, // - 0x9B1A,0xE9A2, // - 0x9B1F,0xE9A3, // - 0x9B22,0xE9A4, // - 0x9B23,0xE9A5, // - 0x9B25,0xE9A6, // - 0x9B27,0xE9A7, // - 0x9B28,0xE9A8, // - 0x9B29,0xE9A9, // - 0x9B2A,0xE9AA, // - 0x9B2E,0xE9AB, // - 0x9B2F,0xE9AC, // - 0x9B31,0x9F54, // - 0x9B32,0xE9AD, // - 0x9B3B,0xE2F6, // - 0x9B3C,0x8B53, // - 0x9B41,0x8A40, // - 0x9B42,0x8DB0, // - 0x9B43,0xE9AF, // - 0x9B44,0xE9AE, // - 0x9B45,0x96A3, // - 0x9B4D,0xE9B1, // - 0x9B4E,0xE9B2, // - 0x9B4F,0xE9B0, // - 0x9B51,0xE9B3, // - 0x9B54,0x9682, // - 0x9B58,0xE9B4, // - 0x9B5A,0x8B9B, // - 0x9B6F,0x9844, // - 0x9B74,0xE9B5, // - 0x9B83,0xE9B7, // - 0x9B8E,0x88BC, // - 0x9B91,0xE9B8, // - 0x9B92,0x95A9, // - 0x9B93,0xE9B6, // - 0x9B96,0xE9B9, // - 0x9B97,0xE9BA, // - 0x9B9F,0xE9BB, // - 0x9BA0,0xE9BC, // - 0x9BA8,0xE9BD, // - 0x9BAA,0x968E, // - 0x9BAB,0x8E4C, // - 0x9BAD,0x8DF8, // - 0x9BAE,0x914E, // - 0x9BB4,0xE9BE, // - 0x9BB9,0xE9C1, // - 0x9BC0,0xE9BF, // - 0x9BC6,0xE9C2, // - 0x9BC9,0x8CEF, // - 0x9BCA,0xE9C0, // - 0x9BCF,0xE9C3, // - 0x9BD1,0xE9C4, // - 0x9BD2,0xE9C5, // - 0x9BD4,0xE9C9, // - 0x9BD6,0x8E49, // - 0x9BDB,0x91E2, // - 0x9BE1,0xE9CA, // - 0x9BE2,0xE9C7, // - 0x9BE3,0xE9C6, // - 0x9BE4,0xE9C8, // - 0x9BE8,0x8C7E, // - 0x9BF0,0xE9CE, // - 0x9BF1,0xE9CD, // - 0x9BF2,0xE9CC, // - 0x9BF5,0x88B1, // - 0x9C04,0xE9D8, // - 0x9C06,0xE9D4, // - 0x9C08,0xE9D5, // - 0x9C09,0xE9D1, // - 0x9C0A,0xE9D7, // - 0x9C0C,0xE9D3, // - 0x9C0D,0x8A82, // - 0x9C10,0x986B, // - 0x9C12,0xE9D6, // - 0x9C13,0xE9D2, // - 0x9C14,0xE9D0, // - 0x9C15,0xE9CF, // - 0x9C1B,0xE9DA, // - 0x9C21,0xE9DD, // - 0x9C24,0xE9DC, // - 0x9C25,0xE9DB, // - 0x9C2D,0x9568, // - 0x9C2E,0xE9D9, // - 0x9C2F,0x88F1, // - 0x9C30,0xE9DE, // - 0x9C32,0xE9E0, // - 0x9C39,0x8A8F, // - 0x9C3A,0xE9CB, // - 0x9C3B,0x8956, // - 0x9C3E,0xE9E2, // - 0x9C46,0xE9E1, // - 0x9C47,0xE9DF, // - 0x9C48,0x924C, // - 0x9C52,0x9690, // - 0x9C57,0x97D8, // - 0x9C5A,0xE9E3, // - 0x9C60,0xE9E4, // - 0x9C67,0xE9E5, // - 0x9C76,0xE9E6, // - 0x9C78,0xE9E7, // - 0x9CE5,0x92B9, // - 0x9CE7,0xE9E8, // - 0x9CE9,0x94B5, // - 0x9CEB,0xE9ED, // - 0x9CEC,0xE9E9, // - 0x9CF0,0xE9EA, // - 0x9CF3,0x9650, // - 0x9CF4,0x96C2, // - 0x9CF6,0x93CE, // - 0x9D03,0xE9EE, // - 0x9D06,0xE9EF, // - 0x9D07,0x93BC, // - 0x9D08,0xE9EC, // - 0x9D09,0xE9EB, // - 0x9D0E,0x89A8, // - 0x9D12,0xE9F7, // - 0x9D15,0xE9F6, // - 0x9D1B,0x8995, // - 0x9D1F,0xE9F4, // - 0x9D23,0xE9F3, // - 0x9D26,0xE9F1, // - 0x9D28,0x8A9B, // - 0x9D2A,0xE9F0, // - 0x9D2B,0x8EB0, // - 0x9D2C,0x89A7, // - 0x9D3B,0x8D83, // - 0x9D3E,0xE9FA, // - 0x9D3F,0xE9F9, // - 0x9D41,0xE9F8, // - 0x9D44,0xE9F5, // - 0x9D46,0xE9FB, // - 0x9D48,0xE9FC, // - 0x9D50,0xEA44, // - 0x9D51,0xEA43, // - 0x9D59,0xEA45, // - 0x9D5C,0x894C, // - 0x9D5D,0xEA40, // - 0x9D5E,0xEA41, // - 0x9D60,0x8D94, // - 0x9D61,0x96B7, // - 0x9D64,0xEA42, // - 0x9D6C,0x9651, // - 0x9D6F,0xEA4A, // - 0x9D72,0xEA46, // - 0x9D7A,0xEA4B, // - 0x9D87,0xEA48, // - 0x9D89,0xEA47, // - 0x9D8F,0x8C7B, // - 0x9D9A,0xEA4C, // - 0x9DA4,0xEA4D, // - 0x9DA9,0xEA4E, // - 0x9DAB,0xEA49, // - 0x9DAF,0xE9F2, // - 0x9DB2,0xEA4F, // - 0x9DB4,0x92DF, // - 0x9DB8,0xEA53, // - 0x9DBA,0xEA54, // - 0x9DBB,0xEA52, // - 0x9DC1,0xEA51, // - 0x9DC2,0xEA57, // - 0x9DC4,0xEA50, // - 0x9DC6,0xEA55, // - 0x9DCF,0xEA56, // - 0x9DD3,0xEA59, // - 0x9DD9,0xEA58, // - 0x9DED,0xEA5C, // - 0x9DEF,0xEA5D, // - 0x9DF2,0x9868, // - 0x9DF8,0xEA5A, // - 0x9DF9,0x91E9, // - 0x9DFA,0x8DEB, // - 0x9DFD,0xEA5E, // - 0x9E1A,0xEA5F, // - 0x9E1B,0xEA60, // - 0x9E1E,0xEA61, // - 0x9E75,0xEA62, // - 0x9E78,0x8CB2, // - 0x9E79,0xEA63, // - 0x9E7D,0xEA64, // - 0x9E7F,0x8EAD, // - 0x9E81,0xEA65, // - 0x9E88,0xEA66, // - 0x9E8B,0xEA67, // - 0x9E8C,0xEA68, // - 0x9E91,0xEA6B, // - 0x9E92,0xEA69, // - 0x9E95,0xEA6A, // - 0x9E97,0x97ED, // - 0x9E9D,0xEA6C, // - 0x9E9F,0x97D9, // - 0x9EA5,0xEA6D, // - 0x9EA6,0x949E, // - 0x9EA9,0xEA6E, // - 0x9EAA,0xEA70, // - 0x9EAD,0xEA71, // - 0x9EB8,0xEA6F, // - 0x9EB9,0x8D8D, // - 0x9EBA,0x96CB, // - 0x9EBB,0x9683, // - 0x9EBC,0x9BF5, // - 0x9EBE,0x9F80, // - 0x9EBF,0x969B, // - 0x9EC4,0x89A9, // - 0x9ECC,0xEA73, // - 0x9ECD,0x8B6F, // - 0x9ECE,0xEA74, // - 0x9ECF,0xEA75, // - 0x9ED0,0xEA76, // - 0x9ED2,0x8D95, // - 0x9ED4,0xEA77, // - 0x9ED8,0xE0D2, // - 0x9ED9,0x96D9, // - 0x9EDB,0x91E1, // - 0x9EDC,0xEA78, // - 0x9EDD,0xEA7A, // - 0x9EDE,0xEA79, // - 0x9EE0,0xEA7B, // - 0x9EE5,0xEA7C, // - 0x9EE8,0xEA7D, // - 0x9EEF,0xEA7E, // - 0x9EF4,0xEA80, // - 0x9EF6,0xEA81, // - 0x9EF7,0xEA82, // - 0x9EF9,0xEA83, // - 0x9EFB,0xEA84, // - 0x9EFC,0xEA85, // - 0x9EFD,0xEA86, // - 0x9F07,0xEA87, // - 0x9F08,0xEA88, // - 0x9F0E,0x9343, // - 0x9F13,0x8CDB, // - 0x9F15,0xEA8A, // - 0x9F20,0x916C, // - 0x9F21,0xEA8B, // - 0x9F2C,0xEA8C, // - 0x9F3B,0x9540, // - 0x9F3E,0xEA8D, // - 0x9F4A,0xEA8E, // - 0x9F4B,0xE256, // - 0x9F4E,0xE6D8, // - 0x9F4F,0xE8EB, // - 0x9F52,0xEA8F, // - 0x9F54,0xEA90, // - 0x9F5F,0xEA92, // - 0x9F60,0xEA93, // - 0x9F61,0xEA94, // - 0x9F62,0x97EE, // - 0x9F63,0xEA91, // - 0x9F66,0xEA95, // - 0x9F67,0xEA96, // - 0x9F6A,0xEA98, // - 0x9F6C,0xEA97, // - 0x9F72,0xEA9A, // - 0x9F76,0xEA9B, // - 0x9F77,0xEA99, // - 0x9F8D,0x97B4, // - 0x9F95,0xEA9C, // - 0x9F9C,0xEA9D, // - 0x9F9D,0xE273, // - 0x9FA0,0xEA9E, // - 0xFF01,0x8149, // FULLWIDTH EXCLAMATION MARK - 0xFF03,0x8194, // FULLWIDTH NUMBER SIGN - 0xFF04,0x8190, // FULLWIDTH DOLLAR SIGN - 0xFF05,0x8193, // FULLWIDTH PERCENT SIGN - 0xFF06,0x8195, // FULLWIDTH AMPERSAND - 0xFF07,0x81AD, // FULLWIDTH APOSTROPHE - 0xFF08,0x8169, // FULLWIDTH LEFT PARENTHESIS - 0xFF09,0x816A, // FULLWIDTH RIGHT PARENTHESIS - 0xFF0A,0x8196, // FULLWIDTH ASTERISK - 0xFF0B,0x817B, // FULLWIDTH PLUS SIGN - 0xFF0C,0x8143, // FULLWIDTH COMMA - 0xFF0E,0x8144, // FULLWIDTH FULL STOP - 0xFF0F,0x815E, // FULLWIDTH SOLIDUS - 0xFF10,0x824F, // FULLWIDTH DIGIT ZERO - 0xFF11,0x8250, // FULLWIDTH DIGIT ONE - 0xFF12,0x8251, // FULLWIDTH DIGIT TWO - 0xFF13,0x8252, // FULLWIDTH DIGIT THREE - 0xFF14,0x8253, // FULLWIDTH DIGIT FOUR - 0xFF15,0x8254, // FULLWIDTH DIGIT FIVE - 0xFF16,0x8255, // FULLWIDTH DIGIT SIX - 0xFF17,0x8256, // FULLWIDTH DIGIT SEVEN - 0xFF18,0x8257, // FULLWIDTH DIGIT EIGHT - 0xFF19,0x8258, // FULLWIDTH DIGIT NINE - 0xFF1A,0x8146, // FULLWIDTH COLON - 0xFF1B,0x8147, // FULLWIDTH SEMICOLON - 0xFF1C,0x8183, // FULLWIDTH LESS-THAN SIGN - 0xFF1D,0x8181, // FULLWIDTH EQUALS SIGN - 0xFF1E,0x8184, // FULLWIDTH GREATER-THAN SIGN - 0xFF1F,0x8148, // FULLWIDTH QUESTION MARK - 0xFF20,0x8197, // FULLWIDTH COMMERCIAL AT - 0xFF21,0x8260, // FULLWIDTH LATIN CAPITAL LETTER A - 0xFF22,0x8261, // FULLWIDTH LATIN CAPITAL LETTER B - 0xFF23,0x8262, // FULLWIDTH LATIN CAPITAL LETTER C - 0xFF24,0x8263, // FULLWIDTH LATIN CAPITAL LETTER D - 0xFF25,0x8264, // FULLWIDTH LATIN CAPITAL LETTER E - 0xFF26,0x8265, // FULLWIDTH LATIN CAPITAL LETTER F - 0xFF27,0x8266, // FULLWIDTH LATIN CAPITAL LETTER G - 0xFF28,0x8267, // FULLWIDTH LATIN CAPITAL LETTER H - 0xFF29,0x8268, // FULLWIDTH LATIN CAPITAL LETTER I - 0xFF2A,0x8269, // FULLWIDTH LATIN CAPITAL LETTER J - 0xFF2B,0x826A, // FULLWIDTH LATIN CAPITAL LETTER K - 0xFF2C,0x826B, // FULLWIDTH LATIN CAPITAL LETTER L - 0xFF2D,0x826C, // FULLWIDTH LATIN CAPITAL LETTER M - 0xFF2E,0x826D, // FULLWIDTH LATIN CAPITAL LETTER N - 0xFF2F,0x826E, // FULLWIDTH LATIN CAPITAL LETTER O - 0xFF30,0x826F, // FULLWIDTH LATIN CAPITAL LETTER P - 0xFF31,0x8270, // FULLWIDTH LATIN CAPITAL LETTER Q - 0xFF32,0x8271, // FULLWIDTH LATIN CAPITAL LETTER R - 0xFF33,0x8272, // FULLWIDTH LATIN CAPITAL LETTER S - 0xFF34,0x8273, // FULLWIDTH LATIN CAPITAL LETTER T - 0xFF35,0x8274, // FULLWIDTH LATIN CAPITAL LETTER U - 0xFF36,0x8275, // FULLWIDTH LATIN CAPITAL LETTER V - 0xFF37,0x8276, // FULLWIDTH LATIN CAPITAL LETTER W - 0xFF38,0x8277, // FULLWIDTH LATIN CAPITAL LETTER X - 0xFF39,0x8278, // FULLWIDTH LATIN CAPITAL LETTER Y - 0xFF3A,0x8279, // FULLWIDTH LATIN CAPITAL LETTER Z - 0xFF3B,0x816D, // FULLWIDTH LEFT SQUARE BRACKET - 0xFF3D,0x816E, // FULLWIDTH RIGHT SQUARE BRACKET - 0xFF3E,0x814F, // FULLWIDTH CIRCUMFLEX ACCENT - 0xFF3F,0x8151, // FULLWIDTH LOW LINE - 0xFF40,0x814D, // FULLWIDTH GRAVE ACCENT - 0xFF41,0x8281, // FULLWIDTH LATIN SMALL LETTER A - 0xFF42,0x8282, // FULLWIDTH LATIN SMALL LETTER B - 0xFF43,0x8283, // FULLWIDTH LATIN SMALL LETTER C - 0xFF44,0x8284, // FULLWIDTH LATIN SMALL LETTER D - 0xFF45,0x8285, // FULLWIDTH LATIN SMALL LETTER E - 0xFF46,0x8286, // FULLWIDTH LATIN SMALL LETTER F - 0xFF47,0x8287, // FULLWIDTH LATIN SMALL LETTER G - 0xFF48,0x8288, // FULLWIDTH LATIN SMALL LETTER H - 0xFF49,0x8289, // FULLWIDTH LATIN SMALL LETTER I - 0xFF4A,0x828A, // FULLWIDTH LATIN SMALL LETTER J - 0xFF4B,0x828B, // FULLWIDTH LATIN SMALL LETTER K - 0xFF4C,0x828C, // FULLWIDTH LATIN SMALL LETTER L - 0xFF4D,0x828D, // FULLWIDTH LATIN SMALL LETTER M - 0xFF4E,0x828E, // FULLWIDTH LATIN SMALL LETTER N - 0xFF4F,0x828F, // FULLWIDTH LATIN SMALL LETTER O - 0xFF50,0x8290, // FULLWIDTH LATIN SMALL LETTER P - 0xFF51,0x8291, // FULLWIDTH LATIN SMALL LETTER Q - 0xFF52,0x8292, // FULLWIDTH LATIN SMALL LETTER R - 0xFF53,0x8293, // FULLWIDTH LATIN SMALL LETTER S - 0xFF54,0x8294, // FULLWIDTH LATIN SMALL LETTER T - 0xFF55,0x8295, // FULLWIDTH LATIN SMALL LETTER U - 0xFF56,0x8296, // FULLWIDTH LATIN SMALL LETTER V - 0xFF57,0x8297, // FULLWIDTH LATIN SMALL LETTER W - 0xFF58,0x8298, // FULLWIDTH LATIN SMALL LETTER X - 0xFF59,0x8299, // FULLWIDTH LATIN SMALL LETTER Y - 0xFF5A,0x829A, // FULLWIDTH LATIN SMALL LETTER Z - 0xFF5B,0x816F, // FULLWIDTH LEFT CURLY BRACKET - 0xFF5C,0x8162, // FULLWIDTH VERTICAL LINE - 0xFF5D,0x8170, // FULLWIDTH RIGHT CURLY BRACKET - 0xFFE3,0x8150, // FULLWIDTH MACRON - 0xFFE5,0x818F // FULLWIDTH YEN SIGN -}; \ No newline at end of file diff --git a/3rdparty/zint-2.4.4/backend/svg.c b/3rdparty/zint-2.4.4/backend/svg.c deleted file mode 100644 index 5cbba13..0000000 --- a/3rdparty/zint-2.4.4/backend/svg.c +++ /dev/null @@ -1,614 +0,0 @@ -/* svg.c - Scalable Vector Graphics */ - -/* - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include -#include -#include -#include -#include "common.h" - -#define SSET "0123456789ABCDEF" - -int svg_plot(struct zint_symbol *symbol) -{ - int i, block_width, latch, r, this_row; - float textpos, large_bar_height, preset_height, row_height, row_posn = 0.0; - FILE *fsvg; - int fgred, fggrn, fgblu, bgred, bggrn, bgblu; - float /*red_ink,*/ green_ink, blue_ink, red_paper, green_paper , blue_paper; - int error_number = 0; - int textoffset, xoffset, yoffset, textdone, main_width; - char textpart[10], addon[6]; - int large_bar_count, comp_offset; - float addon_text_posn; - float scaler = symbol->scale; - float default_text_posn; - int plot_text = 1; - const char *locale = NULL; - - row_height=0; - textdone = 0; - main_width = symbol->width; - strcpy(addon, ""); - comp_offset = 0; - addon_text_posn = 0.0; - - if((symbol->output_options & BARCODE_STDOUT) != 0) { - fsvg = stdout; - } else { - fsvg = fopen(symbol->outfile, "w"); - } - if(fsvg == NULL) { - strcpy(symbol->errtxt, "Could not open output file"); - return ERROR_FILE_ACCESS; - } - - /* sort out colour options */ - to_upper((unsigned char*)symbol->fgcolour); - to_upper((unsigned char*)symbol->bgcolour); - - if(strlen(symbol->fgcolour) != 6) { - strcpy(symbol->errtxt, "Malformed foreground colour target"); - return ERROR_INVALID_OPTION; - } - if(strlen(symbol->bgcolour) != 6) { - strcpy(symbol->errtxt, "Malformed background colour target"); - return ERROR_INVALID_OPTION; - } - error_number = is_sane(SSET, (unsigned char*)symbol->fgcolour, strlen(symbol->fgcolour)); - if (error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Malformed foreground colour target"); - return ERROR_INVALID_OPTION; - } - error_number = is_sane(SSET, (unsigned char*)symbol->bgcolour, strlen(symbol->bgcolour)); - if (error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Malformed background colour target"); - return ERROR_INVALID_OPTION; - } - locale = setlocale(LC_ALL, "C"); - - fgred = (16 * ctoi(symbol->fgcolour[0])) + ctoi(symbol->fgcolour[1]); - fggrn = (16 * ctoi(symbol->fgcolour[2])) + ctoi(symbol->fgcolour[3]); - fgblu = (16 * ctoi(symbol->fgcolour[4])) + ctoi(symbol->fgcolour[5]); - bgred = (16 * ctoi(symbol->bgcolour[0])) + ctoi(symbol->bgcolour[1]); - bggrn = (16 * ctoi(symbol->bgcolour[2])) + ctoi(symbol->bgcolour[3]); - bgblu = (16 * ctoi(symbol->bgcolour[4])) + ctoi(symbol->bgcolour[5]); -// red_ink = fgred / 256.0; - green_ink = fggrn / 256.0; - blue_ink = fgblu / 256.0; - red_paper = bgred / 256.0; - green_paper = bggrn / 256.0; - blue_paper = bgblu / 256.0; - - if (symbol->height == 0) { - symbol->height = 50; - } - - large_bar_count = 0; - preset_height = 0.0; - for(i = 0; i < symbol->rows; i++) { - preset_height += symbol->row_height[i]; - if(symbol->row_height[i] == 0) { - large_bar_count++; - } - } - large_bar_height = (symbol->height - preset_height) / large_bar_count; - - if (large_bar_count == 0) { - symbol->height = preset_height; - } - - while(!(module_is_set(symbol, symbol->rows - 1, comp_offset))) { - comp_offset++; - } - - /* Certain symbols need whitespace otherwise characters get chopped off the sides */ - if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) - || (symbol->symbology == BARCODE_ISBNX)) { - switch(ustrlen(symbol->text)) { - case 13: /* EAN 13 */ - case 16: - case 19: - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - } - main_width = 96 + comp_offset; - break; - default: - main_width = 68 + comp_offset; - } - } - - if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - main_width = 96 + comp_offset; - } - } - - if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { - if(symbol->whitespace_width == 0) { - symbol->whitespace_width = 10; - main_width = 51 + comp_offset; - } - } - - latch = 0; - r = 0; - /* Isolate add-on text */ - if(is_extendable(symbol->symbology)) { - for(i = 0; i < ustrlen(symbol->text); i++) { - if (latch == 1) { - addon[r] = symbol->text[i]; - r++; - } - if (symbol->text[i] == '+') { - latch = 1; - } - } - } - addon[r] = '\0'; - - if((symbol->show_hrt == 0) || (ustrlen(symbol->text) == 0)) { - plot_text = 0; - } - if(plot_text) { - textoffset = 9; - } else { - textoffset = 0; - } - xoffset = symbol->border_width + symbol->whitespace_width; - yoffset = symbol->border_width; - - /* Start writing the header */ - fprintf(fsvg, "\n"); - fprintf(fsvg, "\n"); - if(symbol->symbology != BARCODE_MAXICODE) { - fprintf(fsvg, "width + xoffset + xoffset) * scaler), roundup((symbol->height + textoffset + yoffset + yoffset) * scaler)); - } else { - fprintf(fsvg, "\n"); - if(ustrlen(symbol->text) != 0) { - fprintf(fsvg, " %s\n", symbol->text); - } else { - fprintf(fsvg, " Zint Generated Symbol\n"); - } - fprintf(fsvg, " \n"); - fprintf(fsvg, "\n \n", symbol->fgcolour); - - if(symbol->symbology != BARCODE_MAXICODE) { - fprintf(fsvg, " \n", roundup((symbol->width + xoffset + xoffset) * scaler), roundup((symbol->height + textoffset + yoffset + yoffset) * scaler), symbol->bgcolour); - } else { - fprintf(fsvg, " \n", roundup((74.0 + xoffset + xoffset) * scaler), roundup((72.0 + yoffset + yoffset) * scaler), symbol->bgcolour); - } - - if(((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - default_text_posn = (symbol->height + textoffset + symbol->border_width + symbol->border_width) * scaler; - } else { - default_text_posn = (symbol->height + textoffset + symbol->border_width) * scaler; - } - - if(symbol->symbology == BARCODE_MAXICODE) { - /* Maxicode uses hexagons */ - float ax, ay, bx, by, cx, cy, dx, dy, ex, ey, fx, fy, mx, my; - - - textoffset = 0.0; - if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - fprintf(fsvg, " \n", 0.0, 0.0, (74.0 + xoffset + xoffset) * scaler, symbol->border_width * scaler); - fprintf(fsvg, " \n", 0.0, (72.0 + symbol->border_width) * scaler, (74.0 + xoffset + xoffset) * scaler, symbol->border_width * scaler); - } - if((symbol->output_options & BARCODE_BOX) != 0) { - /* side bars */ - fprintf(fsvg, " \n", 0.0, 0.0, symbol->border_width * scaler, (72.0 + (2 * symbol->border_width)) * scaler); - fprintf(fsvg, " \n", (74.0 + xoffset + xoffset - symbol->border_width) * scaler, 0.0, symbol->border_width * scaler, (72.0 + (2 * symbol->border_width)) * scaler); - } - fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 10.85 * scaler, symbol->fgcolour); - fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 8.97 * scaler, symbol->bgcolour); - fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 7.10 * scaler, symbol->fgcolour); - fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 5.22 * scaler, symbol->bgcolour); - fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 3.31 * scaler, symbol->fgcolour); - fprintf(fsvg, " \n", (35.76 + xoffset) * scaler, (35.60 + yoffset) * scaler, 1.43 * scaler, symbol->bgcolour); - for(r = 0; r < symbol->rows; r++) { - for(i = 0; i < symbol->width; i++) { - if(module_is_set(symbol, r, i)) { - /* Dump a hexagon */ - my = r * 2.135 + 1.43; - ay = my + 1.0 + yoffset; - by = my + 0.5 + yoffset; - cy = my - 0.5 + yoffset; - dy = my - 1.0 + yoffset; - ey = my - 0.5 + yoffset; - fy = my + 0.5 + yoffset; - if(r & 1) { - mx = (2.46 * i) + 1.23 + 1.23; - } else { - mx = (2.46 * i) + 1.23; - } - ax = mx + xoffset; - bx = mx + 0.86 + xoffset; - cx = mx + 0.86 + xoffset; - dx = mx + xoffset; - ex = mx - 0.86 + xoffset; - fx = mx - 0.86 + xoffset; - fprintf(fsvg, " \n", ax * scaler, ay * scaler, bx * scaler, by * scaler, cx * scaler, cy * scaler, dx * scaler, dy * scaler, ex * scaler, ey * scaler, fx * scaler, fy * scaler); - } - } - } - } - - if(symbol->symbology != BARCODE_MAXICODE) { - /* everything else uses rectangles (or squares) */ - /* Works from the bottom of the symbol up */ - int addon_latch = 0; - - for(r = 0; r < symbol->rows; r++) { - this_row = r; - if(symbol->row_height[this_row] == 0) { - row_height = large_bar_height; - } else { - row_height = symbol->row_height[this_row]; - } - row_posn = 0; - for(i = 0; i < r; i++) { - if(symbol->row_height[i] == 0) { - row_posn += large_bar_height; - } else { - row_posn += symbol->row_height[i]; - } - } - row_posn += yoffset; - - i = 0; - if(module_is_set(symbol, this_row, 0)) { - latch = 1; - } else { - latch = 0; - } - - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, this_row, i + block_width) == module_is_set(symbol, this_row, i)); - if((addon_latch == 0) && (r == (symbol->rows - 1)) && (i > main_width)) { - addon_text_posn = (row_posn + 8.0) * scaler; - addon_latch = 1; - } - if(latch == 1) { - /* a bar */ - if(addon_latch == 0) { - fprintf(fsvg, " \n", (i + xoffset) * scaler, row_posn * scaler, block_width * scaler, row_height * scaler); - } else { - fprintf(fsvg, " \n", (i + xoffset) * scaler, (row_posn + 10.0) * scaler, block_width * scaler, (row_height - 5.0) * scaler); - } - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - - } while (i < symbol->width); - } - } - /* That's done the actual data area, everything else is human-friendly */ - - xoffset += comp_offset; - row_posn = (row_posn + large_bar_height) * scaler; - - if(plot_text) { - if ((((symbol->symbology == BARCODE_EANX) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_EANX_CC)) || - (symbol->symbology == BARCODE_ISBNX)) { - /* guard bar extensions and text formatting for EAN8 and EAN13 */ - switch(ustrlen(symbol->text)) { - case 8: /* EAN-8 */ - case 11: - case 14: - fprintf(fsvg, " \n", (0 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (2 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (32 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (34 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (64 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (66 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - for(i = 0; i < 4; i++) { - textpart[i] = symbol->text[i]; - } - textpart[4] = '\0'; - textpos = 17; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - for(i = 0; i < 4; i++) { - textpart[i] = symbol->text[i + 4]; - } - textpart[4] = '\0'; - textpos = 50; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = xoffset + 86; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", addon); - fprintf(fsvg, " \n"); - break; - case 5: - textpos = xoffset + 100; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", addon); - fprintf(fsvg, " \n"); - break; - } - - break; - case 13: /* EAN 13 */ - case 16: - case 19: - fprintf(fsvg, " \n", (0 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (2 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (46 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (48 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (92 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (94 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = -7; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - textpos = 24; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 7]; - } - textpart[6] = '\0'; - textpos = 71; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = xoffset + 114; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", addon); - fprintf(fsvg, " \n"); - break; - case 5: - textpos = xoffset + 128; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", addon); - fprintf(fsvg, " \n"); - break; - } - break; - - } - } - - if (((symbol->symbology == BARCODE_UPCA) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCA_CC)) { - /* guard bar extensions and text formatting for UPCA */ - latch = 1; - - i = 0 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); - if(latch == 1) { - /* a bar */ - fprintf(fsvg, " \n", (i + xoffset - comp_offset) * scaler, row_posn, block_width * scaler, 5.0 * scaler); - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - } while (i < 11 + comp_offset); - fprintf(fsvg, " \n", (46 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (48 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - latch = 1; - i = 85 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while (module_is_set(symbol, symbol->rows - 1, i + block_width) == module_is_set(symbol, symbol->rows - 1, i)); - if(latch == 1) { - /* a bar */ - fprintf(fsvg, " \n", (i + xoffset - comp_offset) * scaler, row_posn, block_width * scaler, 5.0 * scaler); - latch = 0; - } else { - /* a space */ - latch = 1; - } - i += block_width; - } while (i < 96 + comp_offset); - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = -5; - fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - for(i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[5] = '\0'; - textpos = 27; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - for(i = 0; i < 5; i++) { - textpart[i] = symbol->text[i + 6]; - } - textpart[6] = '\0'; - textpos = 68; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - textpart[0] = symbol->text[11]; - textpart[1] = '\0'; - textpos = 100; - fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = xoffset + 116; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", addon); - fprintf(fsvg, " \n"); - break; - case 5: - textpos = xoffset + 130; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", addon); - fprintf(fsvg, " \n"); - break; - } - - } - - if (((symbol->symbology == BARCODE_UPCE) && (symbol->rows == 1)) || (symbol->symbology == BARCODE_UPCE_CC)) { - /* guard bar extensions and text formatting for UPCE */ - fprintf(fsvg, " \n", (0 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (2 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (46 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (48 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - fprintf(fsvg, " \n", (50 + xoffset) * scaler, row_posn, scaler, 5.0 * scaler); - textpart[0] = symbol->text[0]; - textpart[1] = '\0'; - textpos = -5; - fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - for(i = 0; i < 6; i++) { - textpart[i] = symbol->text[i + 1]; - } - textpart[6] = '\0'; - textpos = 24; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - textpart[0] = symbol->text[7]; - textpart[1] = '\0'; - textpos = 55; - fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", textpart); - fprintf(fsvg, " \n"); - textdone = 1; - switch(strlen(addon)) { - case 2: - textpos = xoffset + 70; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", addon); - fprintf(fsvg, " \n"); - break; - case 5: - textpos = xoffset + 84; - fprintf(fsvg, " \n", 11.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", addon); - fprintf(fsvg, " \n"); - break; - } - - } - } /* if (plot_text) */ - - xoffset -= comp_offset; - - switch(symbol->symbology) { - case BARCODE_MAXICODE: - /* Do nothing! (It's already been done) */ - break; - default: - if((symbol->output_options & BARCODE_BIND) != 0) { - if((symbol->rows > 1) && (is_stackable(symbol->symbology) == 1)) { - /* row binding */ - for(r = 1; r < symbol->rows; r++) { - fprintf(fsvg, " \n", xoffset * scaler, ((r * row_height) + yoffset - 1) * scaler, symbol->width * scaler, 2.0 * scaler); - } - } - } - if (((symbol->output_options & BARCODE_BOX) != 0) || ((symbol->output_options & BARCODE_BIND) != 0)) { - fprintf(fsvg, " \n", 0.0, 0.0, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); - fprintf(fsvg, " \n", 0.0, (symbol->height + symbol->border_width) * scaler, (symbol->width + xoffset + xoffset) * scaler, symbol->border_width * scaler); - } - if((symbol->output_options & BARCODE_BOX) != 0) { - /* side bars */ - fprintf(fsvg, " \n", 0.0, 0.0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); - fprintf(fsvg, " \n", (symbol->width + xoffset + xoffset - symbol->border_width) * scaler, 0.0, symbol->border_width * scaler, (symbol->height + (2 * symbol->border_width)) * scaler); - } - break; - } - - /* Put the human readable text at the bottom */ - if(plot_text && (textdone == 0)) { - textpos = symbol->width / 2.0; - fprintf(fsvg, " \n", 8.0 * scaler, symbol->fgcolour); - fprintf(fsvg, " %s\n", symbol->text); - fprintf(fsvg, " \n"); - } - fprintf(fsvg, " \n"); - fprintf(fsvg, "\n"); - - fclose(fsvg); - - if (locale) - setlocale(LC_ALL, locale); - - return error_number; -} - diff --git a/3rdparty/zint-2.4.4/backend/telepen.c b/3rdparty/zint-2.4.4/backend/telepen.c deleted file mode 100644 index 5ee4a5d..0000000 --- a/3rdparty/zint-2.4.4/backend/telepen.c +++ /dev/null @@ -1,157 +0,0 @@ -/* telepen.c - Handles Telepen and Telepen numeric */ - -/* - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#define SODIUM "0123456789X" - -#include -#include -#include -#include "common.h" - -static char *TeleTable[] = -{ - "1111111111111111", "1131313111", "33313111", "1111313131", "3111313111", "11333131", "13133131", "111111313111", - "31333111", "1131113131", "33113131", "1111333111", "3111113131", "1113133111", "1311133111", "111111113131", - "3131113111", "11313331", "333331", "111131113111", "31113331", "1133113111", "1313113111", "1111113331", - "31131331", "113111113111", "3311113111", "1111131331", "311111113111", "1113111331", "1311111331", "11111111113111", - "31313311", "1131311131", "33311131", "1111313311", "3111311131", "11333311", "13133311", "111111311131", - "31331131", "1131113311", "33113311", "1111331131", "3111113311", "1113131131", "1311131131", "111111113311", - "3131111131", "1131131311", "33131311", "111131111131", "3111131311", "1133111131", "1313111131", "111111131311", - "3113111311", "113111111131", "3311111131", "111113111311", "311111111131", "111311111311", "131111111311", "11111111111131", - "3131311111", "11313133", "333133", "111131311111", "31113133", "1133311111", "1313311111", "1111113133", - "313333", "113111311111", "3311311111", "11113333", "311111311111", "11131333", "13111333", "11111111311111", - "31311133", "1131331111", "33331111", " 1111311133", "3111331111", "11331133", "13131133", "111111331111", - "3113131111", "1131111133", "33111133", "111113131111", "3111111133", "111311131111", "131111131111", "111111111133", - "31311313", "113131111111", "3331111111", "1111311313", "311131111111", "11331313", "13131313", "11111131111111", - "3133111111", "1131111313", "33111313", "111133111111", "3111111313", "111313111111", "131113111111", "111111111313", - "313111111111", "1131131113", "33131113", "11113111111111","3111131113", "113311111111", "131311111111", "111111131113", - "3113111113", "11311111111111","331111111111","111113111113", "31111111111111","111311111113","131111111113"}; - -int telepen(struct zint_symbol *symbol, unsigned char source[], int src_len) -{ - int i, count, check_digit; - int error_number; - char dest[512]; /*14 + 30 * 14 + 14 + 14 + 1 ~ 512 */ - - error_number = 0; - - count = 0; - - if(src_len > 30) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - /* Start character */ - strcpy(dest, TeleTable['_']); - - for(i = 0; i < src_len; i++) { - if(source[i] > 126) { - /* Cannot encode extended ASCII */ - strcpy(symbol->errtxt, "Invalid characters in input data"); - return ERROR_INVALID_DATA1; - } - concat(dest, TeleTable[source[i]]); - count += source[i]; - } - - check_digit = 127 - (count % 127); - if(check_digit == 127) { check_digit = 0; } - concat(dest, TeleTable[check_digit]); - - /* Stop character */ - concat(dest, TeleTable['z']); - - expand(symbol, dest); - for(i = 0; i < src_len; i++) { - if(source[i] == '\0') { - symbol->text[i] = ' '; - } else { - symbol->text[i] = source[i]; - } - } - symbol->text[src_len] = '\0'; - return error_number; -} - -int telepen_num(struct zint_symbol *symbol, unsigned char source[], int src_len) -{ - int i, count, check_digit, glyph; - int error_number, temp_length = src_len; - char dest[1024]; /* 14 + 60 * 14 + 14 + 14 + 1 ~ 1024 */ - unsigned char temp[64]; - - error_number = 0; - count = 0; - - if(temp_length > 60) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - ustrcpy(temp, source); - to_upper(temp); - error_number = is_sane(NEON, temp, temp_length); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - - /* Add a leading zero if required */ - if (temp_length & 1) - { - memmove(temp + 1, temp, temp_length); - temp[0] = '0'; - - temp[++temp_length] = '\0'; - } - - /* Start character */ - strcpy(dest, TeleTable['_']); - - for (i = 0; i < temp_length; i += 2) - { - if(temp[i] == 'X') { - strcpy(symbol->errtxt, "Invalid position of X in Telepen data"); - return ERROR_INVALID_DATA1; - } - - if(temp[i + 1] == 'X') { - glyph = ctoi(temp[i]) + 17; - count += glyph; - } else { - glyph = (10 * ctoi(temp[i])) + ctoi(temp[i + 1]); - glyph += 27; - count += glyph; - } - concat(dest, TeleTable[glyph]); - } - - check_digit = 127 - (count % 127); - if(check_digit == 127) { check_digit = 0; } - concat(dest, TeleTable[check_digit]); - - /* Stop character */ - concat(dest, TeleTable['z']); - - expand(symbol, dest); - ustrcpy(symbol->text, temp); - return error_number; -} - diff --git a/3rdparty/zint-2.4.4/backend/upcean.c b/3rdparty/zint-2.4.4/backend/upcean.c deleted file mode 100644 index f403f3d..0000000 --- a/3rdparty/zint-2.4.4/backend/upcean.c +++ /dev/null @@ -1,796 +0,0 @@ -/* upcean.c - Handles UPC, EAN and ISBN - - libzint - the open source barcode library - Copyright (C) 2008 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#define SODIUM "0123456789+" -#define EAN2 102 -#define EAN5 105 - -#include -#include -#include -#include "common.h" - -/* UPC and EAN tables checked against EN 797:1996 */ - -static char *UPCParity0[10] = {"BBBAAA", "BBABAA", "BBAABA", "BBAAAB", "BABBAA", "BAABBA", "BAAABB", - "BABABA", "BABAAB", "BAABAB"}; /* Number set for UPC-E symbol (EN Table 4) */ -static char *UPCParity1[10] = {"AAABBB", "AABABB", "AABBAB", "AABBBA", "ABAABB", "ABBAAB", "ABBBAA", - "ABABAB", "ABABBA", "ABBABA"}; /* Not covered by BS EN 797:1995 */ -static char *EAN2Parity[4] = {"AA", "AB", "BA", "BB"}; /* Number sets for 2-digit add-on (EN Table 6) */ -static char *EAN5Parity[10] = {"BBAAA", "BABAA", "BAABA", "BAAAB", "ABBAA", "AABBA", "AAABB", "ABABA", - "ABAAB", "AABAB"}; /* Number set for 5-digit add-on (EN Table 7) */ -static char *EAN13Parity[10] = {"AAAAA", "ABABB", "ABBAB", "ABBBA", "BAABB", "BBAAB", "BBBAA", "BABAB", - "BABBA", "BBABA"}; /* Left hand of the EAN-13 symbol (EN Table 3) */ -static char *EANsetA[10] = {"3211", "2221", "2122", "1411", "1132", "1231", "1114", "1312", "1213", - "3112"}; /* Representation set A and C (EN Table 1) */ -static char *EANsetB[10] = {"1123", "1222", "2212", "1141", "2311", "1321", "4111", "2131", "3121", - "2113"}; /* Representation set B (EN Table 1) */ - -char upc_check(char source[]) -{ /* Calculate the correct check digit for a UPC barcode */ - unsigned int i, count, check_digit; - - count = 0; - - for (i = 0; i < strlen(source); i++) { - count += ctoi(source[i]); - - if (!(i & 1)) { - count += 2 * (ctoi(source[i])); - } - } - - check_digit = 10 - (count%10); - if (check_digit == 10) { check_digit = 0; } - return itoc(check_digit); -} - -void upca_draw(char source[], char dest[]) -{ /* UPC A is usually used for 12 digit numbers, but this function takes a source of any length */ - unsigned int i, half_way; - - half_way = strlen(source) / 2; - - /* start character */ - concat (dest, "111"); - - for(i = 0; i <= strlen(source); i++) - { - if (i == half_way) - { - /* middle character - separates manufacturer no. from product no. */ - /* also inverts right hand characters */ - concat(dest, "11111"); - } - - lookup(NEON, EANsetA, source[i], dest); - } - - /* stop character */ - concat (dest, "111"); -} - -void upca(struct zint_symbol *symbol, unsigned char source[], char dest[]) -{ /* Make a UPC A barcode when we haven't been given the check digit */ - int length; - char gtin[15]; - - strcpy(gtin, (char*)source); - length = strlen(gtin); - gtin[length] = upc_check(gtin); - gtin[length + 1] = '\0'; - upca_draw(gtin, dest); - ustrcpy(symbol->text, (unsigned char*)gtin); -} - -void upce(struct zint_symbol *symbol, unsigned char source[], char dest[]) -{ /* UPC E is a zero-compressed version of UPC A */ - int i, num_system; - char emode, equivalent[12], check_digit, parity[8], temp[8]; - char hrt[9]; - - /* Two number systems can be used - system 0 and system 1 */ - if(ustrlen(source) == 7) { - switch(source[0]) { - case '0': num_system = 0; break; - case '1': num_system = 1; break; - default: num_system = 0; source[0] = '0'; break; - } - strcpy(temp, (char*)source); - strcpy(hrt, (char*)source); - for(i = 1; i <= 7; i++) { - source[i - 1] = temp[i]; - } - } - else { - num_system = 0; - hrt[0] = '0'; - hrt[1] = '\0'; - concat(hrt, (char*)source); - } - - /* Expand the zero-compressed UPCE code to make a UPCA equivalent (EN Table 5) */ - emode = source[5]; - for(i = 0; i < 11; i++) { - equivalent[i] = '0'; - } - if(num_system == 1) { equivalent[0] = temp[0]; } - equivalent[1] = source[0]; - equivalent[2] = source[1]; - equivalent[11] = '\0'; - - switch(emode) - { - case '0': - case '1': - case '2': - equivalent[3] = emode; - equivalent[8] = source[2]; - equivalent[9] = source[3]; - equivalent[10] = source[4]; - break; - case '3': - equivalent[3] = source[2]; - equivalent[9] = source[3]; - equivalent[10] = source[4]; - if(((source[2] == '0') || (source[2] == '1')) || (source[2] == '2')) { - /* Note 1 - "X3 shall not be equal to 0, 1 or 2" */ - strcpy(symbol->errtxt, "Invalid UPC-E data"); - } - break; - case '4': - equivalent[3] = source[2]; - equivalent[4] = source[3]; - equivalent[10] = source[4]; - if(source[3] == '0') { - /* Note 2 - "X4 shall not be equal to 0" */ - strcpy(symbol->errtxt, "Invalid UPC-E data"); - } - break; - case '5': - case '6': - case '7': - case '8': - case '9': - equivalent[3] = source[2]; - equivalent[4] = source[3]; - equivalent[5] = source[4]; - equivalent[10] = emode; - if(source[4] == '0') { - /* Note 3 - "X5 shall not be equal to 0" */ - strcpy(symbol->errtxt, "Invalid UPC-E data"); - } - break; - } - - /* Get the check digit from the expanded UPCA code */ - - check_digit = upc_check(equivalent); - - /* Use the number system and check digit information to choose a parity scheme */ - if(num_system == 1) { - strcpy(parity, UPCParity1[ctoi(check_digit)]); - } else { - strcpy(parity, UPCParity0[ctoi(check_digit)]); - } - - /* Take all this information and make the barcode pattern */ - - /* start character */ - concat (dest, "111"); - - for(i = 0; i <= ustrlen(source); i++) { - switch(parity[i]) { - case 'A': lookup(NEON, EANsetA, source[i], dest); break; - case 'B': lookup(NEON, EANsetB, source[i], dest); break; - } - } - - /* stop character */ - concat (dest, "111111"); - - hrt[7] = check_digit; - hrt[8] = '\0'; - ustrcpy(symbol->text, (unsigned char*)hrt); -} - - -void add_on(unsigned char source[], char dest[], int mode) -{ /* EAN-2 and EAN-5 add-on codes */ - char parity[6]; - int i, code_type; - - /* If an add-on then append with space */ - if (mode != 0) - { - concat(dest, "9"); - } - - /* Start character */ - concat (dest, "112"); - - /* Determine EAN2 or EAN5 add-on */ - if(ustrlen(source) == 2) - { - code_type = EAN2; - } - else - { - code_type = EAN5; - } - - /* Calculate parity for EAN2 */ - if(code_type == EAN2) - { - int code_value, parity_bit; - - code_value = (10 * ctoi(source[0])) + ctoi(source[1]); - parity_bit = code_value%4; - strcpy(parity, EAN2Parity[parity_bit]); - } - - if(code_type == EAN5) - { - int values[6], parity_sum, parity_bit; - - for(i = 0; i < 6; i++) - { - values[i] = ctoi(source[i]); - } - - parity_sum = (3 * (values[0] + values[2] + values[4])); - parity_sum += (9 * (values[1] + values[3])); - - parity_bit = parity_sum%10; - strcpy(parity, EAN5Parity[parity_bit]); - } - - for(i = 0; i < ustrlen(source); i++) - { - switch(parity[i]) { - case 'A': lookup(NEON, EANsetA, source[i], dest); break; - case 'B': lookup(NEON, EANsetB, source[i], dest); break; - } - - /* Glyph separator */ - if(i != (ustrlen(source) - 1)) - { - concat (dest, "11"); - } - } -} - - -/* ************************ EAN-13 ****************** */ - -char ean_check(char source[]) -{ /* Calculate the correct check digit for a EAN-13 barcode */ - int i; - unsigned int h, count, check_digit; - - count = 0; - - h = strlen(source); - for (i = h - 1; i >= 0; i--) { - count += ctoi(source[i]); - - if (i & 1) { - count += 2 * ctoi(source[i]); - } - } - check_digit = 10 - (count%10); - if (check_digit == 10) { check_digit = 0; } - return itoc(check_digit); -} - -void ean13(struct zint_symbol *symbol, unsigned char source[], char dest[]) -{ - unsigned int length, i, half_way; - char parity[6]; - char gtin[15]; - - strcpy(parity, ""); - strcpy(gtin, (char*)source); - - /* Add the appropriate check digit */ - length = strlen(gtin); - gtin[length] = ean_check(gtin); - gtin[length + 1] = '\0'; - - /* Get parity for first half of the symbol */ - lookup(SODIUM, EAN13Parity, gtin[0], parity); - - /* Now get on with the cipher */ - half_way = 7; - - /* start character */ - concat (dest, "111"); - length = strlen(gtin); - for(i = 1; i <= length; i++) - { - if (i == half_way) - { - /* middle character - separates manufacturer no. from product no. */ - /* also inverses right hand characters */ - concat (dest, "11111"); - } - - if(((i > 1) && (i < 7)) && (parity[i - 2] == 'B')) - { - lookup(NEON, EANsetB, gtin[i], dest); - } - else - { - lookup(NEON, EANsetA, gtin[i], dest); - } - } - - /* stop character */ - concat (dest, "111"); - - ustrcpy(symbol->text, (unsigned char*)gtin); -} - -void ean8(struct zint_symbol *symbol, unsigned char source[], char dest[]) -{ /* Make an EAN-8 barcode when we haven't been given the check digit */ - /* EAN-8 is basically the same as UPC-A but with fewer digits */ - int length; - char gtin[10]; - - strcpy(gtin, (char*)source); - length = strlen(gtin); - gtin[length] = upc_check(gtin); - gtin[length + 1] = '\0'; - upca_draw(gtin, dest); - ustrcpy(symbol->text, (unsigned char*)gtin); -} - -char isbn13_check(unsigned char source[]) /* For ISBN(13) only */ -{ - unsigned int i, weight, sum, check, h; - - sum = 0; - weight = 1; - h = ustrlen(source) - 1; - - for(i = 0; i < h; i++) - { - sum += ctoi(source[i]) * weight; - if(weight == 1) weight = 3; else weight = 1; - } - - check = sum % 10; - check = 10 - check; - return itoc(check); -} - -char isbn_check(unsigned char source[]) /* For ISBN(10) and SBN only */ -{ - unsigned int i, weight, sum, check, h; - char check_char; - - sum = 0; - weight = 1; - h = ustrlen(source) - 1; - - for(i = 0; i < h; i++) - { - sum += ctoi(source[i]) * weight; - weight++; - } - - check = sum % 11; - check_char = itoc(check); - if(check == 10) { check_char = 'X'; } - return check_char; -} - -int isbn(struct zint_symbol *symbol, unsigned char source[], const unsigned int src_len, char dest[]) /* Make an EAN-13 barcode from an SBN or ISBN */ -{ - int i, error_number; - char check_digit; - - to_upper(source); - error_number = is_sane("0123456789X", source, src_len); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in input"); - return error_number; - } - - /* Input must be 9, 10 or 13 characters */ - if(((src_len < 9) || (src_len > 13)) || ((src_len > 10) && (src_len < 13))) - { - strcpy(symbol->errtxt, "Input wrong length"); - return ERROR_TOO_LONG; - } - - if(src_len == 13) /* Using 13 character ISBN */ - { - if(!(((source[0] == '9') && (source[1] == '7')) && - ((source[2] == '8') || (source[2] == '9')))) - { - strcpy(symbol->errtxt, "Invalid ISBN"); - return ERROR_INVALID_DATA1; - } - - check_digit = isbn13_check(source); - if (source[src_len - 1] != check_digit) - { - strcpy(symbol->errtxt, "Incorrect ISBN check"); - return ERROR_INVALID_CHECK; - } - source[12] = '\0'; - - ean13(symbol, source, dest); - } - - if(src_len == 10) /* Using 10 digit ISBN */ - { - check_digit = isbn_check(source); - if(check_digit != source[src_len - 1]) - { - strcpy(symbol->errtxt, "Incorrect ISBN check"); - return ERROR_INVALID_CHECK; - } - for(i = 13; i > 0; i--) - { - source[i] = source[i - 3]; - } - source[0] = '9'; - source[1] = '7'; - source[2] = '8'; - source[12] = '\0'; - - ean13(symbol, source, dest); - } - - if(src_len == 9) /* Using 9 digit SBN */ - { - /* Add leading zero */ - for(i = 10; i > 0; i--) - { - source[i] = source[i - 1]; - } - source[0] = '0'; - - /* Verify check digit */ - check_digit = isbn_check(source); - if(check_digit != source[ustrlen(source) - 1]) - { - strcpy(symbol->errtxt, "Incorrect SBN check"); - return ERROR_INVALID_CHECK; - } - - /* Convert to EAN-13 number */ - for(i = 13; i > 0; i--) - { - source[i] = source[i - 3]; - } - source[0] = '9'; - source[1] = '7'; - source[2] = '8'; - source[12] = '\0'; - - ean13(symbol, source, dest); - } - - return 0; -} - -void ean_leading_zeroes(struct zint_symbol *symbol, unsigned char source[], unsigned char local_source[]) { - /* Add leading zeroes to EAN and UPC strings */ - unsigned char first_part[20], second_part[20], zfirst_part[20], zsecond_part[20]; - int with_addon = 0; - int first_len = 0, second_len = 0, zfirst_len = 0, zsecond_len = 0, i, h; - - h = ustrlen(source); - for(i = 0; i < h; i++) { - if(source[i] == '+') { - with_addon = 1; - } else { - if(with_addon == 0) { - first_len++; - } else { - second_len++; - } - } - } - - ustrcpy(first_part, (unsigned char *)""); - ustrcpy(second_part, (unsigned char *)""); - ustrcpy(zfirst_part, (unsigned char *)""); - ustrcpy(zsecond_part, (unsigned char *)""); - - /* Split input into two strings */ - for(i = 0; i < first_len; i++) { - first_part[i] = source[i]; - first_part[i + 1] = '\0'; - } - - for(i = 0; i < second_len; i++) { - second_part[i] = source[i + first_len + 1]; - second_part[i + 1] = '\0'; - } - - /* Calculate target lengths */ - if(second_len <= 5) { zsecond_len = 5; } - if(second_len <= 2) { zsecond_len = 2; } - if(second_len == 0) { zsecond_len = 0; } - switch(symbol->symbology) { - case BARCODE_EANX: - case BARCODE_EANX_CC: - if(first_len <= 12) { zfirst_len = 12; } - if(first_len <= 7) { zfirst_len = 7; } - if(second_len == 0) { - if(first_len <= 5) { zfirst_len = 5; } - if(first_len <= 2) { zfirst_len = 2; } - } - break; - case BARCODE_UPCA: - case BARCODE_UPCA_CC: - zfirst_len = 11; - break; - case BARCODE_UPCE: - case BARCODE_UPCE_CC: - if(first_len == 7) { zfirst_len = 7; } - if(first_len <= 6) { zfirst_len = 6; } - break; - case BARCODE_ISBNX: - if(first_len <= 9) { zfirst_len = 9; } - break; - } - - - /* Add leading zeroes */ - for(i = 0; i < (zfirst_len - first_len); i++) { - uconcat(zfirst_part, (unsigned char *)"0"); - } - uconcat(zfirst_part, first_part); - for(i = 0; i < (zsecond_len - second_len); i++) { - uconcat(zsecond_part, (unsigned char *)"0"); - } - uconcat(zsecond_part, second_part); - - /* Copy adjusted data back to local_source */ - uconcat(local_source, zfirst_part); - if(zsecond_len != 0) { - uconcat(local_source, (unsigned char *)"+"); - uconcat(local_source, zsecond_part); - } -} - -int eanx(struct zint_symbol *symbol, unsigned char source[], int src_len) -{ - /* splits string to parts before and after '+' parts */ - unsigned char first_part[20] = { 0 }, second_part[20] = { 0 }, dest[1000] = { 0 }; - unsigned char local_source[20] = { 0 }; - int latch, reader, writer, with_addon; - int error_number, i; - - - with_addon = FALSE; - latch = FALSE; - writer = 0; - - if(src_len > 19) { - strcpy(symbol->errtxt, "Input too long"); - return ERROR_TOO_LONG; - } - if(symbol->symbology != BARCODE_ISBNX) { - /* ISBN has it's own checking routine */ - error_number = is_sane("0123456789+", source, src_len); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in data"); - return error_number; - } - } else { - error_number = is_sane("0123456789Xx", source, src_len); - if(error_number == ERROR_INVALID_DATA1) { - strcpy(symbol->errtxt, "Invalid characters in input"); - return error_number; - } - } - - - /* Add leading zeroes */ - ustrcpy(local_source, (unsigned char *)""); - if(symbol->symbology == BARCODE_ISBNX) { - to_upper(local_source); - } - - ean_leading_zeroes(symbol, source, local_source); - - for(reader = 0; reader <= ustrlen(local_source); reader++) - { - if(source[reader] == '+') { with_addon = TRUE; } - } - - reader = 0; - if(with_addon) { - do { - if(local_source[reader] == '+') { - first_part[writer] = '\0'; - latch = TRUE; - reader++; - writer = 0; - } - - if(latch) { - second_part[writer] = local_source[reader]; - reader++; - writer++; - } else { - first_part[writer] = local_source[reader]; - reader++; - writer++; - } - } while (reader <= ustrlen(local_source)); - } else { - strcpy((char*)first_part, (char*)local_source); - } - - - switch(symbol->symbology) - { - case BARCODE_EANX: - switch(ustrlen(first_part)) - { - case 2: add_on(first_part, (char*)dest, 0); ustrcpy(symbol->text, first_part); break; - case 5: add_on(first_part, (char*)dest, 0); ustrcpy(symbol->text, first_part); break; - case 7: ean8(symbol, first_part, (char*)dest); break; - case 12: ean13(symbol, first_part, (char*)dest); break; - default: strcpy(symbol->errtxt, "Invalid length input"); return ERROR_TOO_LONG; break; - } - break; - case BARCODE_EANX_CC: - switch(ustrlen(first_part)) - { /* Adds vertical separator bars according to ISO/IEC 24723 section 11.4 */ - case 7: set_module(symbol, symbol->rows, 1); - set_module(symbol, symbol->rows, 67); - set_module(symbol, symbol->rows + 1, 0); - set_module(symbol, symbol->rows + 1, 68); - set_module(symbol, symbol->rows + 2, 1); - set_module(symbol, symbol->rows + 1, 67); - symbol->row_height[symbol->rows] = 2; - symbol->row_height[symbol->rows + 1] = 2; - symbol->row_height[symbol->rows + 2] = 2; - symbol->rows += 3; - ean8(symbol, first_part, (char*)dest); break; - case 12:set_module(symbol, symbol->rows, 1); - set_module(symbol, symbol->rows, 95); - set_module(symbol, symbol->rows + 1, 0); - set_module(symbol, symbol->rows + 1, 96); - set_module(symbol, symbol->rows + 2, 1); - set_module(symbol, symbol->rows + 2, 95); - symbol->row_height[symbol->rows] = 2; - symbol->row_height[symbol->rows + 1] = 2; - symbol->row_height[symbol->rows + 2] = 2; - symbol->rows += 3; - ean13(symbol, first_part, (char*)dest); break; - default: strcpy(symbol->errtxt, "Invalid length EAN input"); return ERROR_TOO_LONG; break; - } - break; - case BARCODE_UPCA: - if(ustrlen(first_part) == 11) { - upca(symbol, first_part, (char*)dest); - } else { - strcpy(symbol->errtxt, "Input wrong length"); - return ERROR_TOO_LONG; - } - break; - case BARCODE_UPCA_CC: - if(ustrlen(first_part) == 11) { - set_module(symbol, symbol->rows, 1); - set_module(symbol, symbol->rows, 95); - set_module(symbol, symbol->rows + 1, 0); - set_module(symbol, symbol->rows + 1, 96); - set_module(symbol, symbol->rows + 2, 1); - set_module(symbol, symbol->rows + 2, 95); - symbol->row_height[symbol->rows] = 2; - symbol->row_height[symbol->rows + 1] = 2; - symbol->row_height[symbol->rows + 2] = 2; - symbol->rows += 3; - upca(symbol, first_part, (char*)dest); - } else { - strcpy(symbol->errtxt, "UPCA input wrong length"); - return ERROR_TOO_LONG; - } - break; - case BARCODE_UPCE: - if((ustrlen(first_part) >= 6) && (ustrlen(first_part) <= 7)) { - upce(symbol, first_part, (char*)dest); - } else { - strcpy(symbol->errtxt, "Input wrong length"); - return ERROR_TOO_LONG; - } - break; - case BARCODE_UPCE_CC: - if((ustrlen(first_part) >= 6) && (ustrlen(first_part) <= 7)) { - set_module(symbol, symbol->rows, 1); - set_module(symbol, symbol->rows, 51); - set_module(symbol, symbol->rows + 1, 0); - set_module(symbol, symbol->rows + 1, 52); - set_module(symbol, symbol->rows + 2, 1); - set_module(symbol, symbol->rows + 2, 51); - symbol->row_height[symbol->rows] = 2; - symbol->row_height[symbol->rows + 1] = 2; - symbol->row_height[symbol->rows + 2] = 2; - symbol->rows += 3; - upce(symbol, first_part, (char*)dest); - } else { - strcpy(symbol->errtxt, "UPCE input wrong length"); - return ERROR_TOO_LONG; - } - break; - case BARCODE_ISBNX: - error_number = isbn(symbol, first_part, ustrlen(first_part), (char*)dest); - if(error_number > 4) { - return error_number; - } - break; - } - switch(ustrlen(second_part)) - { - case 0: break; - case 2: - add_on(second_part, (char*)dest, 1); - uconcat(symbol->text, (unsigned char*)"+"); - uconcat(symbol->text, second_part); - break; - case 5: - add_on(second_part, (char*)dest, 1); - uconcat(symbol->text, (unsigned char*)"+"); - uconcat(symbol->text, second_part); - break; - default: - strcpy(symbol->errtxt, "Invalid length input"); - return ERROR_TOO_LONG; - break; - } - - expand(symbol, (char*)dest); - - switch(symbol->symbology) { - case BARCODE_EANX_CC: - case BARCODE_UPCA_CC: - case BARCODE_UPCE_CC: - /* shift the symbol to the right one space to allow for separator bars */ - for(i = (symbol->width + 1); i >= 1; i--) { - if(module_is_set(symbol, symbol->rows - 1, i - 1)) { - set_module(symbol, symbol->rows - 1, i); - } else { - unset_module(symbol, symbol->rows - 1, i); - } - } - unset_module(symbol, symbol->rows - 1, 0); - symbol->width += 2; - break; - } - - - if((symbol->errtxt[0] == 'w') && (error_number == 0)) { - error_number = 1; /* flag UPC-E warnings */ - } - return error_number; -} - - - - diff --git a/3rdparty/zint-2.4.4/backend/zint.h b/3rdparty/zint-2.4.4/backend/zint.h deleted file mode 100644 index 2d5e2c5..0000000 --- a/3rdparty/zint-2.4.4/backend/zint.h +++ /dev/null @@ -1,238 +0,0 @@ -/* zint.h - definitions for libzint - - libzint - the open source barcode library - Copyright (C) 2009 Robin Stuart - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#ifndef ZINT_H -#define ZINT_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -struct zint_render_line { - float x, y, length, width; - struct zint_render_line *next; /* Pointer to next line */ -}; - -struct zint_render_string { - float x, y, fsize; - float width; /* Suggested string width, may be 0 if none recommended */ - int length; - unsigned char *text; - struct zint_render_string *next; /* Pointer to next character */ -}; - -struct zint_render_ring { - float x, y, radius, line_width; - struct zint_render_ring *next; /* Pointer to next ring */ -}; - -struct zint_render_hexagon { - float x, y; - struct zint_render_hexagon *next; /* Pointer to next hexagon */ -}; - -struct zint_render { - float width, height; - struct zint_render_line *lines; /* Pointer to first line */ - struct zint_render_string *strings; /* Pointer to first string */ - struct zint_render_ring *rings; /* Pointer to first ring */ - struct zint_render_hexagon *hexagons; /* Pointer to first hexagon */ -}; - -struct zint_symbol { - int symbology; - int height; - int whitespace_width; - int border_width; - int output_options; - char fgcolour[10]; - char bgcolour[10]; - char outfile[256]; - float scale; - int option_1; - int option_2; - int option_3; - int show_hrt; - int input_mode; - unsigned char text[128]; - int rows; - int width; - char primary[128]; - unsigned char encoded_data[178][143]; - int row_height[178]; /* Largest symbol is 177x177 QR Code */ - char errtxt[100]; - char *bitmap; - int bitmap_width; - int bitmap_height; - struct zint_render *rendered; -}; - - -/* Tbarcode 7 codes */ -#define BARCODE_CODE11 1 -#define BARCODE_C25MATRIX 2 -#define BARCODE_C25INTER 3 -#define BARCODE_C25IATA 4 -#define BARCODE_C25LOGIC 6 -#define BARCODE_C25IND 7 -#define BARCODE_CODE39 8 -#define BARCODE_EXCODE39 9 -#define BARCODE_EANX 13 -#define BARCODE_EAN128 16 -#define BARCODE_CODABAR 18 -#define BARCODE_CODE128 20 -#define BARCODE_DPLEIT 21 -#define BARCODE_DPIDENT 22 -#define BARCODE_CODE16K 23 -#define BARCODE_CODE49 24 -#define BARCODE_CODE93 25 -#define BARCODE_FLAT 28 -#define BARCODE_RSS14 29 -#define BARCODE_RSS_LTD 30 -#define BARCODE_RSS_EXP 31 -#define BARCODE_TELEPEN 32 -#define BARCODE_UPCA 34 -#define BARCODE_UPCE 37 -#define BARCODE_POSTNET 40 -#define BARCODE_MSI_PLESSEY 47 -#define BARCODE_FIM 49 -#define BARCODE_LOGMARS 50 -#define BARCODE_PHARMA 51 -#define BARCODE_PZN 52 -#define BARCODE_PHARMA_TWO 53 -#define BARCODE_PDF417 55 -#define BARCODE_PDF417TRUNC 56 -#define BARCODE_MAXICODE 57 -#define BARCODE_QRCODE 58 -#define BARCODE_CODE128B 60 -#define BARCODE_AUSPOST 63 -#define BARCODE_AUSREPLY 66 -#define BARCODE_AUSROUTE 67 -#define BARCODE_AUSREDIRECT 68 -#define BARCODE_ISBNX 69 -#define BARCODE_RM4SCC 70 -#define BARCODE_DATAMATRIX 71 -#define BARCODE_EAN14 72 -#define BARCODE_CODABLOCKF 74 -#define BARCODE_NVE18 75 -#define BARCODE_JAPANPOST 76 -#define BARCODE_KOREAPOST 77 -#define BARCODE_RSS14STACK 79 -#define BARCODE_RSS14STACK_OMNI 80 -#define BARCODE_RSS_EXPSTACK 81 -#define BARCODE_PLANET 82 -#define BARCODE_MICROPDF417 84 -#define BARCODE_ONECODE 85 -#define BARCODE_PLESSEY 86 - -/* Tbarcode 8 codes */ -#define BARCODE_TELEPEN_NUM 87 -#define BARCODE_ITF14 89 -#define BARCODE_KIX 90 -#define BARCODE_AZTEC 92 -#define BARCODE_DAFT 93 -#define BARCODE_MICROQR 97 - -/* Tbarcode 9 codes */ -#define BARCODE_HIBC_128 98 -#define BARCODE_HIBC_39 99 -#define BARCODE_HIBC_DM 102 -#define BARCODE_HIBC_QR 104 -#define BARCODE_HIBC_PDF 106 -#define BARCODE_HIBC_MICPDF 108 -#define BARCODE_HIBC_BLOCKF 110 -#define BARCODE_HIBC_AZTEC 112 - -/* Zint specific */ -#define BARCODE_AZRUNE 128 -#define BARCODE_CODE32 129 -#define BARCODE_EANX_CC 130 -#define BARCODE_EAN128_CC 131 -#define BARCODE_RSS14_CC 132 -#define BARCODE_RSS_LTD_CC 133 -#define BARCODE_RSS_EXP_CC 134 -#define BARCODE_UPCA_CC 135 -#define BARCODE_UPCE_CC 136 -#define BARCODE_RSS14STACK_CC 137 -#define BARCODE_RSS14_OMNI_CC 138 -#define BARCODE_RSS_EXPSTACK_CC 139 -#define BARCODE_CHANNEL 140 -#define BARCODE_CODEONE 141 -#define BARCODE_GRIDMATRIX 142 - -#define BARCODE_NO_ASCII 1 -#define BARCODE_BIND 2 -#define BARCODE_BOX 4 -#define BARCODE_STDOUT 8 -#define READER_INIT 16 -#define SMALL_TEXT 32 - -#define DATA_MODE 0 -#define UNICODE_MODE 1 -#define GS1_MODE 2 -#define KANJI_MODE 3 -#define SJIS_MODE 4 - -#define DM_SQUARE 100 - -#define WARN_INVALID_OPTION 2 -#define ERROR_TOO_LONG 5 -#define ERROR_INVALID_DATA1 6 -#define ERROR_INVALID_CHECK 7 -#define ERROR_INVALID_OPTION 8 -#define ERROR_ENCODING_PROBLEM 9 -#define ERROR_FILE_ACCESS 10 -#define ERROR_MEMORY 11 - -#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) || defined(_MSC_VER) -# if defined (DLL_EXPORT) || defined(PIC) || defined(_USRDLL) -# define ZINT_EXTERN __declspec(dllexport) -# elif defined(ZINT_DLL) -# define ZINT_EXTERN __declspec(dllimport) -# else -# define ZINT_EXTERN extern -# endif -#else -# define ZINT_EXTERN extern -#endif - -ZINT_EXTERN struct zint_symbol *ZBarcode_Create(void); -ZINT_EXTERN void ZBarcode_Clear(struct zint_symbol *symbol); -ZINT_EXTERN void ZBarcode_Delete(struct zint_symbol *symbol); - -ZINT_EXTERN int ZBarcode_Encode(struct zint_symbol *symbol, unsigned char *input, int length); -ZINT_EXTERN int ZBarcode_Encode_File(struct zint_symbol *symbol, char *filename); -ZINT_EXTERN int ZBarcode_Print(struct zint_symbol *symbol, int rotate_angle); -ZINT_EXTERN int ZBarcode_Encode_and_Print(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle); -ZINT_EXTERN int ZBarcode_Encode_File_and_Print(struct zint_symbol *symbol, char *filename, int rotate_angle); - -ZINT_EXTERN int ZBarcode_Render(struct zint_symbol *symbol, float width, float height); - -ZINT_EXTERN int ZBarcode_Buffer(struct zint_symbol *symbol, int rotate_angle); -ZINT_EXTERN int ZBarcode_Encode_and_Buffer(struct zint_symbol *symbol, unsigned char *input, int length, int rotate_angle); -ZINT_EXTERN int ZBarcode_Encode_File_and_Buffer(struct zint_symbol *symbol, char *filename, int rotate_angle); - -ZINT_EXTERN int ZBarcode_ValidID(int symbol_id); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* ZINT_H */ diff --git a/3rdparty/zint-2.4.4/backend_qt4/Zint.pro b/3rdparty/zint-2.4.4/backend_qt4/Zint.pro deleted file mode 100644 index 5ee72e0..0000000 --- a/3rdparty/zint-2.4.4/backend_qt4/Zint.pro +++ /dev/null @@ -1,114 +0,0 @@ -DEFINES += NO_PNG -TEMPLATE = lib - -contains(CONFIG, static_build){ - CONFIG += staticlib - DEFINES += HAVE_STATIC_BUILD -} - -!contains(CONFIG, staticlib){ - CONFIG += dll - DEFINES += QZINT_LIBRARY -} - -include(../../../common.pri) - -macx{ - CONFIG -= dll - CONFIG += lib_bundle -} - -unix{ - CONFIG += plugin -} - -#VERSION = 2.4.4 - -INCLUDEPATH += $$PWD/../backend -DEFINES += _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS ZINT_VERSION=\\\"$$VERSION\\\" -contains(CONFIG,release) { - TARGET = QtZint -} else { - TARGET = QtZintd -} - -!contains(DEFINES, NO_PNG) { - SOURCES += $$PWD/../backend/png.c - LIBS += -lpng -} - - -win32-msvc* { - DEFINES += _CRT_SECURE_NO_WARNINGS - #QMAKE_CFLAGS += /TP /wd4018 /wd4244 /wd4305 - #QMAKE_CXXFLAGS += /TP /wd4018 /wd4244 /wd4305 -} - - -INCLUDEPATH += zint zint/backend zint/backend_qt4 - -HEADERS += \ - $$PWD/qzint.h \ - $$PWD/qzint_global.h \ - $$PWD/../backend/aztec.h \ - $$PWD/../backend/code1.h \ - $$PWD/../backend/code49.h \ - $$PWD/../backend/common.h \ - $$PWD/../backend/composite.h \ - $$PWD/../backend/dmatrix.h \ - $$PWD/../backend/font.h \ - $$PWD/../backend/gb2312.h \ - $$PWD/../backend/gridmtx.h \ - $$PWD/../backend/gs1.h \ - $$PWD/../backend/large.h \ - $$PWD/../backend/maxicode.h \ - $$PWD/../backend/maxipng.h \ - $$PWD/../backend/ms_stdint.h \ - $$PWD/../backend/pdf417.h \ - $$PWD/../backend/qr.h \ - $$PWD/../backend/reedsol.h \ - $$PWD/../backend/rss.h \ - $$PWD/../backend/sjis.h \ - $$PWD/../backend/zint.h - -SOURCES += \ - $$PWD/qzint.cpp \ - $$PWD/../backend/2of5.c \ - $$PWD/../backend/auspost.c \ - $$PWD/../backend/aztec.c \ - $$PWD/../backend/code.c \ - $$PWD/../backend/code1.c \ - $$PWD/../backend/code16k.c \ - $$PWD/../backend/code49.c \ - $$PWD/../backend/code128.c \ - $$PWD/../backend/common.c \ - $$PWD/../backend/composite.c \ - $$PWD/../backend/dllversion.c \ - $$PWD/../backend/dmatrix.c \ - $$PWD/../backend/gridmtx.c \ - $$PWD/../backend/gs1.c \ - $$PWD/../backend/imail.c \ - $$PWD/../backend/large.c \ - $$PWD/../backend/library.c \ - $$PWD/../backend/maxicode.c \ - $$PWD/../backend/medical.c \ - $$PWD/../backend/pdf417.c \ - $$PWD/../backend/plessey.c \ - $$PWD/../backend/png.c \ - $$PWD/../backend/postal.c \ - $$PWD/../backend/ps.c \ - $$PWD/../backend/qr.c \ - $$PWD/../backend/reedsol.c \ - $$PWD/../backend/render.c \ - $$PWD/../backend/rss.c \ - $$PWD/../backend/svg.c \ - $$PWD/../backend/telepen.c \ - $$PWD/../backend/upcean.c - - -DESTDIR = $${DEST_LIBS} -#DLLDESTDIR = $${DESTDIR} -unix { - target.path = $${DESTDIR} - INSTALLS = target -} diff --git a/3rdparty/zint-2.4.4/backend_qt4/qzint.cpp b/3rdparty/zint-2.4.4/backend_qt4/qzint.cpp deleted file mode 100644 index eb4f65e..0000000 --- a/3rdparty/zint-2.4.4/backend_qt4/qzint.cpp +++ /dev/null @@ -1,692 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by BogDan Vatra * - * bogdan@licentia.eu * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - ***************************************************************************/ - -#include "qzint.h" -#include - -Zint::QZint* createWidget() { - Zint::QZint *z = new Zint::QZint(); - return z; -} - -namespace Zint -{ - -static const qreal maxi_diagonal=11; -static const qreal maxi_width=1.73205807568877*maxi_diagonal/2; -static const char* fontstyle="Arial"; -static const int fontPixelSizeSmall=6; -static const int fontPixelSizeLarge=8; - -QZint::QZint() -{ - m_symbol=BARCODE_CODE128; - m_height=50; - m_border=NO_BORDER; - m_borderWidth=1; - m_securityLevel=-1; - m_pdf417CodeWords=928; - m_fgColor=Qt::black; - m_bgColor=Qt::white; - m_zintSymbol=0; - m_error=0; - m_input_mode = UNICODE_MODE; - m_scale = 1.0; - m_option_3 = 0; - m_hidetext = false; - m_whitespace = 0; -} - -QZint::~QZint() -{ - if (m_zintSymbol) - ZBarcode_Delete(m_zintSymbol); -} - -void QZint::encode() -{ - if (m_zintSymbol) - ZBarcode_Delete(m_zintSymbol); - - m_lastError.clear(); - m_zintSymbol = ZBarcode_Create(); - m_zintSymbol->output_options=m_border; - m_zintSymbol->symbology=m_symbol; - m_zintSymbol->height=m_height; - m_zintSymbol->whitespace_width=m_whitespace; - m_zintSymbol->border_width=m_borderWidth; - m_zintSymbol->option_1=m_securityLevel; - m_zintSymbol->input_mode = m_input_mode; - m_zintSymbol->option_2=m_width; - if(m_hidetext) { - m_zintSymbol->show_hrt = 0; - } else { - m_zintSymbol->show_hrt = 1; - } - if(m_symbol == BARCODE_PDF417) { - m_zintSymbol->option_3=m_pdf417CodeWords; - } else { - m_zintSymbol->option_3 = m_option_3; - } - QByteArray bstr=m_text.toUtf8(); - QByteArray pstr=m_primaryMessage.left(99).toLatin1(); - strcpy(m_zintSymbol->primary,pstr.data()); - int error = ZBarcode_Encode(m_zintSymbol, (unsigned char*)bstr.data(), bstr.length()); - if (error > WARN_INVALID_OPTION) - m_lastError=m_zintSymbol->errtxt; - - if (m_zintSymbol->symbology == BARCODE_MAXICODE) - m_zintSymbol->height = 33; - - switch(m_zintSymbol->output_options) { - case 0: m_border = NO_BORDER; break; - case 2: m_border = BIND; break; - case 4: m_border = BOX; break; - } - m_borderWidth = (BorderType)m_zintSymbol->border_width; - m_whitespace = m_zintSymbol->whitespace_width; -} - -int QZint::symbol() -{ - return m_symbol; -} -void QZint::setSymbol(int symbol) -{ - m_symbol=symbol; -} - -void QZint::setInputMode(int input_mode) -{ - m_input_mode = input_mode; -} - -QString QZint::text() -{ - return m_text; -} -void QZint::setText(const QString & text) -{ - m_text=text; -} - -QString QZint::primaryMessage() -{ - return m_primaryMessage; -} -void QZint::setPrimaryMessage(const QString & primaryMessage) -{ - m_primaryMessage=primaryMessage; -} - -int QZint::height() -{ - encode(); - return (m_zintSymbol->height+(m_border!=NO_BORDER)?m_borderWidth*2:0)*(m_zintSymbol->symbology == BARCODE_MAXICODE?(maxi_width+1):1); -} - -void QZint::setHeight(int height) -{ - m_height=height; -} - -void QZint::setWidth(int width) -{ - m_width=width; -} - -void QZint::setOption3(int option) -{ - m_option_3 = option; -} - -int QZint::width() -{ - encode(); - return (m_zintSymbol->width+(m_border==BOX)?m_borderWidth*2:0)*(m_zintSymbol->symbology == BARCODE_MAXICODE?(maxi_width+1):1); -} - -float QZint::scale() -{ - return m_scale; -} - -void QZint::setScale(float scale) -{ - m_scale = scale; -} - -QColor QZint::fgColor() -{ - return m_fgColor; -} -void QZint::setFgColor(const QColor & fgColor) -{ - m_fgColor=fgColor; -} - -QColor QZint::bgColor() -{ - return m_bgColor; -} -void QZint::setBgColor(const QColor & bgColor) -{ - m_bgColor=bgColor; -} - -QZint::BorderType QZint::borderType() -{ - return m_border; -} -void QZint::setBorderType(BorderType border) -{ - m_border=border; -} - -int QZint::borderWidth() -{ - return m_borderWidth; -} -void QZint::setBorderWidth(int boderWidth) -{ - if (boderWidth<1 || boderWidth>16) - boderWidth=1; - m_borderWidth=boderWidth; -} - -void QZint::setWhitespace(int whitespace) -{ - m_whitespace = whitespace; -} - -int QZint::pdf417CodeWords() -{ - return m_pdf417CodeWords; -} -void QZint::setPdf417CodeWords(int pdf417CodeWords) -{ - m_pdf417CodeWords=pdf417CodeWords; -} - -int QZint::securityLevel() -{ - return m_securityLevel; -} -void QZint::setSecurityLevel(int securityLevel) -{ - m_securityLevel=securityLevel; -} - -QString QZint::error_message() -{ - return m_lastError; -} - -int QZint::mode() -{ - return m_securityLevel; -} -void QZint::setMode(int securityLevel) -{ - m_securityLevel=securityLevel; -} - -void QZint::setHideText(bool hide) -{ - m_hidetext = hide; -} - -bool QZint::save_to_file(QString filename) -{ - if (m_zintSymbol) - ZBarcode_Delete(m_zintSymbol); - - QString fg_colour_hash = m_fgColor.name(); - QString bg_colour_hash = m_bgColor.name(); - - m_lastError.clear(); - m_zintSymbol = ZBarcode_Create(); - m_zintSymbol->output_options=m_border; - m_zintSymbol->symbology=m_symbol; - m_zintSymbol->height=m_height; - m_zintSymbol->whitespace_width=m_whitespace; - m_zintSymbol->border_width=m_borderWidth; - m_zintSymbol->option_1=m_securityLevel; - m_zintSymbol->input_mode = m_input_mode; - m_zintSymbol->option_2=m_width; - if(m_hidetext) { - m_zintSymbol->show_hrt = 0; - } else { - m_zintSymbol->show_hrt = 1; - } - if(m_symbol == BARCODE_PDF417) { - m_zintSymbol->option_3=m_pdf417CodeWords; - } else { - m_zintSymbol->option_3 = m_option_3; - } - m_zintSymbol->scale=m_scale; - QByteArray bstr=m_text.toUtf8(); - QByteArray pstr=m_primaryMessage.left(99).toLatin1(); - QByteArray fstr=filename.left(255).toLatin1(); - strcpy(m_zintSymbol->primary,pstr.data()); - strcpy(m_zintSymbol->outfile,fstr.data()); - QByteArray fgcol=fg_colour_hash.right(6).toLatin1(); - QByteArray bgcol=bg_colour_hash.right(6).toLatin1(); - strcpy(m_zintSymbol->fgcolour,fgcol.data()); - strcpy(m_zintSymbol->bgcolour,bgcol.data()); - int error = ZBarcode_Encode(m_zintSymbol, (unsigned char*)bstr.data(), bstr.length()); - if (error > WARN_INVALID_OPTION) - m_lastError=m_zintSymbol->errtxt; - error = ZBarcode_Print(m_zintSymbol, 0); - if (error > WARN_INVALID_OPTION) - m_lastError=m_zintSymbol->errtxt; - if(error == 0) { return true; } else { return false; } -} - -int QZint::module_set(int y_coord, int x_coord) -{ - int x_char, x_sub, result; - - x_char = x_coord / 7; - x_sub = x_coord % 7; - result = 0; - - switch(x_sub) { - case 0: if((m_zintSymbol->encoded_data[y_coord][x_char] & 0x01) != 0) { result = 1; } break; - case 1: if((m_zintSymbol->encoded_data[y_coord][x_char] & 0x02) != 0) { result = 1; } break; - case 2: if((m_zintSymbol->encoded_data[y_coord][x_char] & 0x04) != 0) { result = 1; } break; - case 3: if((m_zintSymbol->encoded_data[y_coord][x_char] & 0x08) != 0) { result = 1; } break; - case 4: if((m_zintSymbol->encoded_data[y_coord][x_char] & 0x10) != 0) { result = 1; } break; - case 5: if((m_zintSymbol->encoded_data[y_coord][x_char] & 0x20) != 0) { result = 1; } break; - case 6: if((m_zintSymbol->encoded_data[y_coord][x_char] & 0x40) != 0) { result = 1; } break; - } - - return result; -} - -void QZint::render(QPainter & painter, const QRectF & paintRect, AspectRatioMode mode) -{ - encode(); - bool textdone; - int comp_offset = 0, xoffset = m_whitespace, j, main_width = 0, addon_text_height = 0; - int yoffset = 0; - QString caption = QString::fromUtf8((const char *)m_zintSymbol->text, -1); - QFont fontSmall(fontstyle); - fontSmall.setPixelSize(fontPixelSizeSmall); - QFont fontLarge(fontstyle); - fontLarge.setPixelSize(fontPixelSizeLarge); - - if (m_lastError.length()) - { - painter.setFont(fontLarge); - painter.drawText(paintRect,Qt::AlignCenter,m_lastError); - return; - } - - painter.save(); - painter.setClipRect(paintRect,Qt::IntersectClip); - qreal xtr=paintRect.x(); - qreal ytr=paintRect.y(); - - int zrow_height=m_zintSymbol->height; - int zrows=0; - for (int i=0;irows;i++) - { - zrow_height-=m_zintSymbol->row_height[i]; - if (!m_zintSymbol->row_height[i]) - zrows++; - } - if (zrows) - { - zrow_height/=zrows; - for (int i=0;irows;i++) - if (!m_zintSymbol->row_height[i]) - m_zintSymbol->row_height[i]=zrow_height; - } - else - m_zintSymbol->height-=zrow_height; - - - qreal gwidth=m_zintSymbol->width; - qreal gheight=m_zintSymbol->height; - if (m_zintSymbol->symbology == BARCODE_MAXICODE) - { - gheight*=(maxi_width); - gwidth*=(maxi_width+1); - } - - qreal xsf=1; - qreal ysf=1; - qreal textoffset = 0; - - gwidth+=((m_border==BOX)?m_borderWidth*2:0); - gheight+=((m_border!=NO_BORDER)?m_borderWidth*2:0); - if(QString((const char*)m_zintSymbol->text).isEmpty() == false) { - textoffset = 9; - gheight += textoffset; - } else { - textoffset = 0; - } - gwidth+=m_zintSymbol->whitespace_width*2; - switch(mode) - { - case IgnoreAspectRatio: - xsf=(qreal)paintRect.width()/gwidth; - ysf=(qreal)paintRect.height()/gheight; - break; - - case KeepAspectRatio: - if (paintRect.width()/gwidthsymbology != BARCODE_MAXICODE) { - /* Draw boundary bars or boxes around the symbol */ - switch(m_border) - { - case BOX: - painter.fillRect(0,m_borderWidth,m_borderWidth,m_zintSymbol->height,QBrush(m_fgColor)); - painter.fillRect(m_zintSymbol->width + xoffset + xoffset + m_borderWidth,m_borderWidth,m_borderWidth,m_zintSymbol->height,QBrush(m_fgColor)); - painter.fillRect(0,0,m_zintSymbol->width + xoffset + xoffset + m_borderWidth + m_borderWidth,m_borderWidth,QBrush(m_fgColor)); - painter.fillRect(0,m_zintSymbol->height + m_borderWidth,m_zintSymbol->width + xoffset + xoffset + m_borderWidth + m_borderWidth, m_borderWidth,QBrush(m_fgColor)); - painter.translate(m_borderWidth+m_zintSymbol->whitespace_width,m_borderWidth); - yoffset = m_borderWidth; - break; - case BIND: - painter.fillRect(0,0,m_zintSymbol->width + xoffset + xoffset,m_borderWidth,QBrush(m_fgColor)); - painter.fillRect(0,m_zintSymbol->height + m_borderWidth,m_zintSymbol->width + xoffset + xoffset, m_borderWidth,QBrush(m_fgColor)); - painter.translate(m_zintSymbol->whitespace_width,m_borderWidth); - yoffset = m_borderWidth; - break; - - default: - painter.translate(m_zintSymbol->whitespace_width,0); - break;; - } - } - - while(!(module_set(m_zintSymbol->rows - 1, comp_offset))) { - comp_offset++; - } - xoffset = comp_offset; - - /* Set up some values for displaying EAN and UPC symbols correctly */ - main_width = m_zintSymbol->width; - if ((((m_zintSymbol->symbology == BARCODE_EANX) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_EANX_CC)) - || (m_zintSymbol->symbology == BARCODE_ISBNX)) { - switch(caption.size()) { - case 13: /* EAN 13 */ - case 16: - case 19: - if(m_zintSymbol->whitespace_width == 0) { - m_zintSymbol->whitespace_width = 10; - } - main_width = 96 + comp_offset; - break; - default: - main_width = 68 + comp_offset; - break; - } - } - - if (((m_zintSymbol->symbology == BARCODE_UPCA) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_UPCA_CC)) { - if(m_zintSymbol->whitespace_width == 0) { - m_zintSymbol->whitespace_width = 10; - } - main_width = 96 + comp_offset; - } - - if (((m_zintSymbol->symbology == BARCODE_UPCE) && (m_zintSymbol->rows == 1)) || (m_zintSymbol->symbology == BARCODE_UPCE_CC)) { - if(m_zintSymbol->whitespace_width == 0) { - m_zintSymbol->whitespace_width = 10; - } - main_width = 51 + comp_offset; - } - - p.setWidth(1); - painter.setPen(p); - - if (m_zintSymbol->symbology == BARCODE_MAXICODE) - { - /* Draw Maxicode with hexagons */ - painter.save(); - painter.setRenderHint(QPainter::Antialiasing); - for (int r=0;rrows;r++) - { - for (int c=0;cwidth;c++) - { - if (module_set(r, c)) - { - qreal col=(qreal)c*(maxi_width+1)+(r%2)*((maxi_width+1)/2); - qreal row=(qreal)r*(maxi_width+1)*0.868; - QPainterPath pt; - pt.moveTo(col+maxi_width/2, row); - pt.lineTo(col+maxi_width, row+maxi_diagonal/4); - pt.lineTo(col+maxi_width, row+(maxi_diagonal-maxi_diagonal/4)); - pt.lineTo(col+maxi_width/2, row+maxi_diagonal); - pt.lineTo(col, row+(maxi_diagonal-maxi_diagonal/4)); - pt.lineTo(col, row+maxi_diagonal/4); - pt.lineTo(col+maxi_width/2, row); - painter.fillPath(pt,QBrush(m_fgColor)); - } - } - } - p.setWidth(maxi_width); - painter.setPen(p); - const qreal w=maxi_width+1; - painter.drawEllipse(QPointF(14.5*w,16.5*w*0.868),w,w); - painter.drawEllipse(QPointF(14.5*w,16.5*w*0.868),w+w*1.5,w+w*1.5); - painter.drawEllipse(QPointF(14.5*w,16.5*w*0.868),w+w*3,w+w*3); - painter.restore(); - } - else - { - /* Draw all other symbols with rectangles */ - int y=0; - for (int row=0;rowrows;row++) - { - for (int i=0;iwidth;i++) { - if (module_set(row, i)) - { - int ed = module_set(row, i); - int linewidth=0; - for (int j=i;jwidth;j++,linewidth++) - if (ed != module_set(row, j)) - break; - QColor color; - color=m_fgColor; - - if(!((i > main_width) && (row == m_zintSymbol->rows - 1))) { - painter.fillRect(i,y,linewidth,m_zintSymbol->row_height[row],QBrush(color)); - } else { - painter.fillRect(i,y + 8,linewidth,m_zintSymbol->row_height[row] - 3,QBrush(color)); - addon_text_height = y; - } - } - } - /* Add row binding */ - if(((m_zintSymbol->symbology == BARCODE_CODE16K) || (m_zintSymbol->symbology == BARCODE_CODE49)) && (row != 0)) { - painter.fillRect(0,y - 1,m_zintSymbol->width,2,QBrush(m_fgColor)); - } - y+=m_zintSymbol->row_height[row]; - } - } - - textdone = false; - - if(m_hidetext == false) { - painter.setFont(fontSmall); - if(((m_zintSymbol->symbology == BARCODE_EANX) || (m_zintSymbol->symbology == BARCODE_EANX_CC)) || - (m_zintSymbol->symbology == BARCODE_ISBNX)) { - /* Add bridge and format text for EAN */ - switch(caption.size()) { - case 8: - case 11: - case 14: - painter.fillRect(0 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(2 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(32 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(34 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(64 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(66 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.setFont(fontLarge); - painter.drawText(3 + xoffset, m_zintSymbol->height + yoffset, 29, 9,Qt::AlignCenter, caption.mid(0,4)); - painter.drawText(35 + xoffset, m_zintSymbol->height + yoffset, 29, 9,Qt::AlignCenter, caption.mid(4,4)); - if(caption.size() == 11) { /* EAN-2 */ painter.drawText(76 + xoffset, addon_text_height, 20, 9,Qt::AlignCenter, caption.mid(9,2)); }; - if(caption.size() == 14) { /* EAN-5 */ painter.drawText(76 + xoffset, addon_text_height, 47, 9,Qt::AlignCenter, caption.mid(9,5)); }; - painter.setFont(fontSmall); - textdone = true; - break; - case 13: - case 16: - case 19: - painter.fillRect(0 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(2 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(46 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(48 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(92 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(94 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.setFont(fontLarge); - painter.drawText(xoffset - 7, m_zintSymbol->height + yoffset, 7, 9,Qt::AlignCenter, caption.mid(0,1)); - painter.drawText(3 + xoffset, m_zintSymbol->height + yoffset, 43, 9,Qt::AlignCenter, caption.mid(1,6)); - painter.drawText(49 + xoffset, m_zintSymbol->height + yoffset, 43, 9,Qt::AlignCenter, caption.mid(7,6)); - if(caption.size() == 16) { /* EAN-2 */ painter.drawText(104 + xoffset, addon_text_height, 20, 9,Qt::AlignCenter, caption.mid(14,2)); }; - if(caption.size() == 19) { /* EAN-5 */ painter.drawText(104 + xoffset, addon_text_height, 47, 9,Qt::AlignCenter, caption.mid(14,5)); }; - painter.setFont(fontSmall); - textdone = true; - break; - } - if(textdone == false) { - painter.setFont(fontLarge); - painter.drawText(0, m_zintSymbol->height, m_zintSymbol->width, 9,Qt::AlignCenter, caption); - painter.setFont(fontSmall); - textdone = true; - } - } - - if((m_zintSymbol->symbology == BARCODE_UPCA) || (m_zintSymbol->symbology == BARCODE_UPCA_CC)) { - /* Add bridge and format text for UPC-A */ - int block_width; - bool latch = true; - - j = 0 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while (module_set(m_zintSymbol->rows - 1, j + block_width) == module_set(m_zintSymbol->rows - 1, j)); - if(latch == true) { - /* a bar */ - painter.fillRect(j + xoffset - comp_offset,m_zintSymbol->height,block_width,5,QBrush(m_fgColor)); - latch = false; - } else { - /* a space */ - latch = true; - } - j += block_width; - } while (j < 11 + comp_offset); - painter.fillRect(46 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(48 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - latch = true; - j = 85 + comp_offset; - do { - block_width = 0; - do { - block_width++; - } while (module_set(m_zintSymbol->rows - 1, j + block_width) == module_set(m_zintSymbol->rows - 1, j)); - if(latch == true) { - /* a bar */ - painter.fillRect(j + xoffset - comp_offset,m_zintSymbol->height,block_width,5,QBrush(m_fgColor)); - latch = false; - } else { - /* a space */ - latch = true; - } - j += block_width; - } while (j < 96 + comp_offset); - painter.drawText(xoffset - 7, m_zintSymbol->height + yoffset + 2, 7, 7,Qt::AlignCenter, caption.mid(0,1)); - painter.drawText(96 + xoffset, m_zintSymbol->height + yoffset + 2, 7, 7,Qt::AlignCenter, caption.mid(11,1)); - painter.setFont(fontLarge); - painter.drawText(11 + xoffset, m_zintSymbol->height + yoffset, 35, 9,Qt::AlignCenter, caption.mid(1,5)); - painter.drawText(49 + xoffset, m_zintSymbol->height + yoffset, 35, 9,Qt::AlignCenter, caption.mid(6,5)); - if(caption.size() == 15) { /* EAN-2 */ painter.drawText(104 + xoffset, addon_text_height, 20, 9,Qt::AlignCenter, caption.mid(13,2)); }; - if(caption.size() == 18) { /* EAN-5 */ painter.drawText(104 + xoffset, addon_text_height, 47, 9,Qt::AlignCenter, caption.mid(13,5)); }; - painter.setFont(fontSmall); - textdone = true; - } - - if((m_zintSymbol->symbology == BARCODE_UPCE) || (m_zintSymbol->symbology == BARCODE_UPCE_CC)) { - /* Add bridge and format text for UPC-E */ - painter.fillRect(0 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(2 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(46 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(48 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.fillRect(50 + xoffset,m_zintSymbol->height,1,5,QBrush(m_fgColor)); - painter.drawText(xoffset - 7, m_zintSymbol->height + yoffset + 2, 7, 7,Qt::AlignCenter, caption.mid(0,1)); - painter.drawText(51 + xoffset, m_zintSymbol->height + yoffset + 2, 7, 7,Qt::AlignCenter, caption.mid(7,1)); - painter.setFont(fontLarge); - painter.drawText(3 + xoffset, m_zintSymbol->height + yoffset, 43, 9,Qt::AlignCenter, caption.mid(1,6)); - if(caption.size() == 11) { /* EAN-2 */ painter.drawText(60 + xoffset, addon_text_height, 20, 9,Qt::AlignCenter, caption.mid(9,2)); }; - if(caption.size() == 14) { /* EAN-2 */ painter.drawText(60 + xoffset, addon_text_height, 47, 9,Qt::AlignCenter, caption.mid(9,5)); }; - painter.setFont(fontSmall); - textdone = true; - } - } /* if (m_hidetext == false) */ - - if((m_hidetext == false) && (textdone == false)) { - /* Add text to any other symbol */ - painter.drawText(0, m_zintSymbol->height + yoffset, m_zintSymbol->width, 7, Qt::AlignCenter, caption); - } - painter.restore(); -} - -const QString & QZint::lastError() -{ - return m_lastError; -} - -bool QZint::hasErrors() -{ - return m_lastError.length(); -} - -} - diff --git a/3rdparty/zint-2.4.4/backend_qt4/qzint.h b/3rdparty/zint-2.4.4/backend_qt4/qzint.h deleted file mode 100644 index cf11a04..0000000 --- a/3rdparty/zint-2.4.4/backend_qt4/qzint.h +++ /dev/null @@ -1,126 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by BogDan Vatra * - * bogdan@licentia.eu * - * * - * This program is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - ***************************************************************************/ - -#ifndef BARCODERENDER_H -#define BARCODERENDER_H - -#include "qzint_global.h" -#include -#include - - -namespace Zint -{ -#include "zint.h" - -class QZINTSHARED_EXPORT QZint -{ -private: - -public: - enum BorderType{NO_BORDER=0, BIND=2, BOX=4}; - enum AspectRatioMode{IgnoreAspectRatio=0, KeepAspectRatio=1, CenterBarCode=2}; - -public: - QZint(); - ~QZint(); - - int symbol(); - void setSymbol(int symbol); - - QString text(); - void setText(const QString & text); - - QString primaryMessage(); - void setPrimaryMessage(const QString & primaryMessage); - - void setHeight(int height); - int height(); - - void setWidth(int width); - int width(); - - void setOption3(int option); - - QColor fgColor(); - void setFgColor(const QColor & fgColor); - - QColor bgColor(); - void setBgColor(const QColor & bgColor); - - BorderType borderType(); - void setBorderType(BorderType border); - - int borderWidth(); - void setBorderWidth(int boderWidth); - - int pdf417CodeWords(); - void setPdf417CodeWords(int pdf417CodeWords); - - int securityLevel(); - void setSecurityLevel(int securityLevel); - - float scale(); - void setScale(float scale); - - int mode(); - void setMode(int securityLevel); - - void setInputMode(int input_mode); - - void setWhitespace(int whitespace); - - QString error_message(); - - void render(QPainter & painter, const QRectF & paintRect, AspectRatioMode mode=IgnoreAspectRatio); - - const QString & lastError(); - bool hasErrors(); - - bool save_to_file(QString filename); - - void setHideText(bool hide); - -private: - void encode(); - int module_set(int y_coord, int x_coord); - -private: - int m_symbol; - QString m_text; - QString m_primaryMessage; - int m_height; - BorderType m_border; - int m_borderWidth; - int m_width; - int m_securityLevel; - int m_pdf417CodeWords; - int m_input_mode; - QColor m_fgColor; - QColor m_bgColor; - QString m_lastError; - int m_error; - int m_whitespace; - zint_symbol * m_zintSymbol; - float m_scale; - int m_option_3; - bool m_hidetext; -}; -} - -extern "C" QZINTSHARED_EXPORT Zint::QZint* createWidget(); - -#endif diff --git a/3rdparty/zint-2.4.4/backend_qt4/qzint_global.h b/3rdparty/zint-2.4.4/backend_qt4/qzint_global.h deleted file mode 100644 index ea46fe2..0000000 --- a/3rdparty/zint-2.4.4/backend_qt4/qzint_global.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef QZINT_GLOBAL_H -#define QZINT_GLOBAL_H - -#include - -#ifdef HAVE_STATIC_BUILD -# define QZINTSHARED_EXPORT /**/ -#else -#if defined(QZINT_LIBRARY) -# define QZINTSHARED_EXPORT Q_DECL_EXPORT -#else -# define QZINTSHARED_EXPORT Q_DECL_IMPORT -#endif -#endif - -#endif // QZINT_GLOBAL_H From b6d03ab71c70faa6f25f7caa1b182f37e467d787 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Fri, 8 Sep 2017 01:18:35 +0300 Subject: [PATCH 049/347] Big pages printing has been changed --- limereport/lrpageitemdesignintf.cpp | 63 +++++++++++++++++++++++++---- limereport/lrpageitemdesignintf.h | 6 +++ limereport/lrreportengine.cpp | 32 +++++++++++++-- 3 files changed, 91 insertions(+), 10 deletions(-) diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index ac7b5b6..269244e 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -50,7 +50,7 @@ PageItemDesignIntf::PageItemDesignIntf(QObject *owner, QGraphicsItem *parent) : m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(A4), m_sizeChainging(false), m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), - m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false) + m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false), m_setPageSizeToPrinter(false) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -331,6 +331,19 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } +bool PageItemDesignIntf::getSetPageSizeToPrinter() const +{ + return m_setPageSizeToPrinter; +} + +void PageItemDesignIntf::setSetPageSizeToPrinter(bool setPageSizeToPrinter) +{ + if (m_setPageSizeToPrinter != setPageSizeToPrinter){ + m_setPageSizeToPrinter = setPageSizeToPrinter; + notify("setPageSizeToPrinter", !setPageSizeToPrinter, setPageSizeToPrinter); + } +} + bool PageItemDesignIntf::isTOC() const { return m_isTOC; @@ -340,9 +353,7 @@ void PageItemDesignIntf::setIsTOC(bool isTOC) { if (m_isTOC != isTOC){ m_isTOC = isTOC; - if (!isLoading()){ - notify("pageIsTOC", !isTOC, isTOC); - } + notify("pageIsTOC", !isTOC, isTOC); } } @@ -381,9 +392,7 @@ void PageItemDesignIntf::setResetPageNumber(bool resetPageNumber) { if (m_resetPageNumber!=resetPageNumber){ m_resetPageNumber = resetPageNumber; - if (!isLoading()){ - notify("resetPageNumber",!m_resetPageNumber,m_resetPageNumber); - } + notify("resetPageNumber",!m_resetPageNumber,m_resetPageNumber); } } @@ -605,6 +614,46 @@ void PageItemDesignIntf::preparePopUpMenu(QMenu &menu) if (action->text().compare(tr("Paste")) != 0) action->setVisible(false); } + + menu.addSeparator(); + + QAction* action = menu.addAction(tr("Page is TOC")); + action->setCheckable(true); + action->setChecked(isTOC()); + + action = menu.addAction(tr("Reset page number")); + action->setCheckable(true); + action->setChecked(resetPageNumber()); + + action = menu.addAction(tr("Full page")); + action->setCheckable(true); + action->setChecked(fullPage()); + + action = menu.addAction(tr("Set page size to printer")); + action->setCheckable(true); + action->setChecked(getSetPageSizeToPrinter()); + +// action = menu.addAction(tr("Transparent")); +// action->setCheckable(true); +// action->setChecked(backgroundMode() == TransparentMode); + +} + +void PageItemDesignIntf::processPopUpAction(QAction *action) +{ + if (action->text().compare(tr("Page is TOC")) == 0){ + page()->setPropertyToSelectedItems("pageIsTOC",action->isChecked()); + } + if (action->text().compare(tr("Reset page number")) == 0){ + page()->setPropertyToSelectedItems("resetPageNumber",action->isChecked()); + } + if (action->text().compare(tr("Full page")) == 0){ + page()->setPropertyToSelectedItems("fullPage",action->isChecked()); + } + if (action->text().compare(tr("Set page size to printer")) == 0){ + page()->setPropertyToSelectedItems("setPageSizeToPrinter",action->isChecked()); + } + } void PageItemDesignIntf::initPageSize(const PageItemDesignIntf::PageSize &size) { diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index d484492..af023cc 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -56,6 +56,7 @@ class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft Q_PROPERTY(bool isExtendedInDesignMode READ isExtendedInDesignMode WRITE setExtendedInDesignMode) Q_PROPERTY(int extendedHeight READ extendedHeight WRITE setExtendedHeight) Q_PROPERTY(bool pageIsTOC READ isTOC WRITE setIsTOC) + Q_PROPERTY(bool setPageSizeToPrinter READ getSetPageSizeToPrinter WRITE setSetPageSizeToPrinter ) friend class ReportRender; public: enum Orientation { Portrait, Landscape }; @@ -129,6 +130,9 @@ public: bool isTOC() const; void setIsTOC(bool isTOC); + bool getSetPageSizeToPrinter() const; + void setSetPageSizeToPrinter(bool setPageSizeToPrinter); + signals: void beforeFirstPageRendered(); void afterLastPageRendered(); @@ -144,6 +148,7 @@ protected: void initPageSize(const QSizeF &size); QColor selectionMarkerColor(){return Qt::transparent;} void preparePopUpMenu(QMenu &menu); + void processPopUpAction(QAction *action); private: void paintGrid(QPainter *ppainter, QRectF rect); void initColumnsPos(QVector&posByColumns, qreal pos, int columnCount); @@ -163,6 +168,7 @@ private: bool m_isExtendedInDesignMode; int m_extendedHeight; bool m_isTOC; + bool m_setPageSizeToPrinter; }; typedef QList ReportPages; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index bc3f626..a325cfa 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -249,6 +249,15 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) bool isFirst = true; int currenPage = 1; + + + qreal leftMargin, topMargin, rightMargin, bottomMargin; + printer.getPageMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin, QPrinter::Millimeter); + + QRectF printerPageRect = printer.pageRect(QPrinter::Millimeter); + printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR, + (printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR); + foreach(PageItemDesignIntf::Ptr page, pages){ if ( @@ -261,6 +270,7 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) { QPointF pagePos = page->pos(); + page->setPos(0,0); renderPage.setPageItem(page); renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); @@ -282,9 +292,11 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): renderPage.pageItem()->sizeMM(); - printer.setPaperSize(pageSize,QPrinter::Millimeter); + if (page->getSetPageSizeToPrinter()) + printer.setPaperSize(pageSize,QPrinter::Millimeter); } else { - printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize()); + if (page->getSetPageSizeToPrinter()) + printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize()); } } @@ -293,9 +305,23 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) } else { isFirst=false; painter = new QPainter(&printer); + } + + if (printerPageRect.width() < page->geometry().width()){ + qreal pageWidth = page->geometry().width(); + QRectF currentPrintingRect = printerPageRect; + while (pageWidth>0){ + renderPage.render(painter, printer.pageRect(), currentPrintingRect); + currentPrintingRect.adjust(printerPageRect.size().width(),0,printerPageRect.size().width(),0); + pageWidth -= printerPageRect.size().width(); + if (pageWidth>0) printer.newPage(); + } + + } else { + renderPage.render(painter); } - renderPage.render(painter); + page->setPos(pagePos); } From 280b90dd0e575a58dd21f96c025e47fb6ebc3803 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Fri, 8 Sep 2017 06:30:38 +0300 Subject: [PATCH 050/347] QZint has been fixed --- 3rdparty/zint-2.6.1/backend_qt/backend_qt.pro | 2 -- 3rdparty/zint-2.6.1/backend_qt/qzint.h | 9 ++--- 3rdparty/zint-2.6.1/backend_qt/qzint_global.h | 12 +++++++ common.pri | 1 + limereport/items/lrbarcodeitem.h | 36 +++++++++++++------ 5 files changed, 44 insertions(+), 16 deletions(-) create mode 100644 3rdparty/zint-2.6.1/backend_qt/qzint_global.h diff --git a/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro b/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro index e0032e9..9bea19e 100644 --- a/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro +++ b/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro @@ -22,8 +22,6 @@ unix{ CONFIG += plugin } -#VERSION = 2.4.4 - INCLUDEPATH += $$PWD/../backend DEFINES += _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS ZINT_VERSION=\\\"$$VERSION\\\" contains(CONFIG,release) { diff --git a/3rdparty/zint-2.6.1/backend_qt/qzint.h b/3rdparty/zint-2.6.1/backend_qt/qzint.h index c319225..5c1f9e1 100644 --- a/3rdparty/zint-2.6.1/backend_qt/qzint.h +++ b/3rdparty/zint-2.6.1/backend_qt/qzint.h @@ -19,12 +19,13 @@ #include #include +#include "qzint_global.h" #include "zint.h" namespace Zint { -class QZint +class QZINTSHARED_EXPORT QZint { private: @@ -120,9 +121,9 @@ private: float m_scale; int m_option_3; bool m_hidetext; - float m_dot_size; - int target_size_horiz; - int target_size_vert; + float m_dot_size; + int target_size_horiz; + int target_size_vert; }; } #endif diff --git a/3rdparty/zint-2.6.1/backend_qt/qzint_global.h b/3rdparty/zint-2.6.1/backend_qt/qzint_global.h new file mode 100644 index 0000000..025b16e --- /dev/null +++ b/3rdparty/zint-2.6.1/backend_qt/qzint_global.h @@ -0,0 +1,12 @@ +#ifndef QZINT_GLOBAL_H +#define QZINT_GLOBAL_H + +#include + +#if defined(QZINT_LIBRARY) +# define QZINTSHARED_EXPORT Q_DECL_EXPORT +#else +# define QZINTSHARED_EXPORT Q_DECL_IMPORT +#endif + +#endif // QZINT_GLOBAL_H diff --git a/common.pri b/common.pri index 7ac3243..d9d35bd 100644 --- a/common.pri +++ b/common.pri @@ -7,6 +7,7 @@ CONFIG += build_translations !contains(CONFIG, qtscriptengine){ CONFIG += qjsengine } + !contains(CONFIG, no_formdesigner){ CONFIG += dialogdesigner } diff --git a/limereport/items/lrbarcodeitem.h b/limereport/items/lrbarcodeitem.h index 3f56c59..6b6f98f 100644 --- a/limereport/items/lrbarcodeitem.h +++ b/limereport/items/lrbarcodeitem.h @@ -55,6 +55,7 @@ public: // enum BarcodeType {CODE_11=1,C25MATRIX=2,QRCODE=58,CODE128=20,DATAMATRIX=71,MAXICODE=57,MICROPDF417=84, // EAN=13,PDF417=55, TELEPEN_NUM=87,ITF14=89, KIX=90, MICROQR=97, // EAN14=72,CHANNEL=140,CODEONE=141,GRIDMATRIX=142}; + enum BarcodeType { CODE11 =1, C25MATRIX =2, @@ -65,6 +66,7 @@ public: CODE39 =8, EXCODE39 =9, EANX =13, + EANX_CHK =14, EAN128 =16, CODABAR =18, CODE128 =20, @@ -115,18 +117,32 @@ public: ITALYPOST =94, DPD =96, MICROQR =97, + HIBC_128 =98, + HIBC_39 =99, + HIBC_DM =102, + HIBC_QR =104, + HIBC_PDF =106, + HIBC_MICPDF =108, + HIBC_BLOCKF =110, + HIBC_AZTEC =112, + DOTCODE =115, + HANXIN =116, TELEPEN_NUM =128, CODE32 =129, - EANX_CC =130, - EAN128_CC =131, - RSS14_CC =132, - RSS_LTD_CC =133, - RSS_EXP_CC =134, - UPCA_CC =135, - UPCE_CC =136, - RSS14STACK_CC =137, - RSS14_OMNI_CC =138, - RSS_EXPSTACK_CC =139 +// EANX_CC =130, +// EAN128_CC =131, +// RSS14_CC =132, +// RSS_LTD_CC =133, +// RSS_EXP_CC =134, +// UPCA_CC =135, +// UPCE_CC =136, +// RSS14STACK_CC =137, +// RSS14_OMNI_CC =138, +// RSS_EXPSTACK_CC =139, + CHANNEL =140, + CODEONE =141, + GRIDMATRIX =142, + UPNQR =143 }; enum AngleType{Angle0,Angle90,Angle180,Angle270}; From 614bb38c542514122fdd683d3c0a55150906d695 Mon Sep 17 00:00:00 2001 From: Rodrigo Torres Date: Sun, 10 Sep 2017 00:45:56 -0300 Subject: [PATCH 051/347] Simplify --- common.pri | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/common.pri b/common.pri index d9d35bd..b99a952 100644 --- a/common.pri +++ b/common.pri @@ -72,9 +72,8 @@ LIMEREPORT_VERSION_MAJOR = 1 LIMEREPORT_VERSION_MINOR = 4 LIMEREPORT_VERSION_RELEASE = 40 -LIMEREPORT_VERSION = '\\"$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}\\"' -DEFINES += LIMEREPORT_VERSION_STR=\"$${LIMEREPORT_VERSION}\" -DEFINES += LIMEREPORT_VERSION=$${LIMEREPORT_VERSION} +LIMEREPORT_VERSION = '$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}' +DEFINES += LIMEREPORT_VERSION_STR=\\\"$${LIMEREPORT_VERSION}\\\" QT += script xml sql REPORT_PATH = $$PWD/limereport From 066a31d1c4152f8609f6a7b5e1c51499b1e488ea Mon Sep 17 00:00:00 2001 From: Rodrigo Torres Date: Sun, 10 Sep 2017 00:47:53 -0300 Subject: [PATCH 052/347] Define only once --- common.pri | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/common.pri b/common.pri index b99a952..6101c54 100644 --- a/common.pri +++ b/common.pri @@ -1,27 +1,27 @@ -CONFIG += build_translations +CONFIG *= build_translations !contains(CONFIG, no_zint){ - CONFIG += zint + CONFIG *= zint } !contains(CONFIG, qtscriptengine){ - CONFIG += qjsengine + CONFIG *= qjsengine } !contains(CONFIG, no_formdesigner){ - CONFIG += dialogdesigner + CONFIG *= dialogdesigner } ZINT_PATH = $$PWD/3rdparty/zint-2.6.1 contains(CONFIG,zint){ - DEFINES += HAVE_ZINT + DEFINES *= HAVE_ZINT } greaterThan(QT_MAJOR_VERSION, 4) { - QT += uitools + QT *= uitools } lessThan(QT_MAJOR_VERSION, 5){ - CONFIG += uitools + CONFIG *= uitools } CONFIG(release, debug|release){ @@ -73,30 +73,30 @@ LIMEREPORT_VERSION_MINOR = 4 LIMEREPORT_VERSION_RELEASE = 40 LIMEREPORT_VERSION = '$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}' -DEFINES += LIMEREPORT_VERSION_STR=\\\"$${LIMEREPORT_VERSION}\\\" +DEFINES *= LIMEREPORT_VERSION_STR=\\\"$${LIMEREPORT_VERSION}\\\" -QT += script xml sql +QT *= script xml sql REPORT_PATH = $$PWD/limereport TRANSLATIONS_PATH = $$PWD/translations greaterThan(QT_MAJOR_VERSION, 4) { - DEFINES+=HAVE_QT5 - QT+= printsupport widgets qml + DEFINES *= HAVE_QT5 + QT *= printsupport widgets qml contains(QT,uitools){ message(uitools) - DEFINES += HAVE_UI_LOADER + DEFINES *= HAVE_UI_LOADER } contains(CONFIG, qjsengine){ message(qjsengine) - DEFINES += USE_QJSENGINE + DEFINES *= USE_QJSENGINE } } lessThan(QT_MAJOR_VERSION, 5){ - DEFINES+=HAVE_QT4 + DEFINES *= HAVE_QT4 CONFIG(uitools){ message(uitools) - DEFINES += HAVE_UI_LOADER + DEFINES *= HAVE_UI_LOADER } } From 34192da524debff96ddaa8163c1b787fff228c80 Mon Sep 17 00:00:00 2001 From: Rodrigo Torres Date: Sun, 10 Sep 2017 01:03:06 -0300 Subject: [PATCH 053/347] Remove unused variable --- limereport/items/lrbarcodeitem.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/limereport/items/lrbarcodeitem.h b/limereport/items/lrbarcodeitem.h index 6b6f98f..c7eebb2 100644 --- a/limereport/items/lrbarcodeitem.h +++ b/limereport/items/lrbarcodeitem.h @@ -30,7 +30,6 @@ #ifndef LRBARCODEITEM_H #define LRBARCODEITEM_H #include "lritemdesignintf.h" -#include namespace LimeReport{ @@ -184,7 +183,6 @@ public: void setInputMode(const InputMode &inputMode); private: - Zint::QZint m_bc; QString m_content; QString m_designTestValue; BarcodeType m_barcodeType; From f5f3f246f0e70f200bff71625a5cf15e83e46d58 Mon Sep 17 00:00:00 2001 From: Rodrigo Torres Date: Sun, 10 Sep 2017 01:03:32 -0300 Subject: [PATCH 054/347] Remove parameter that does nothing --- 3rdparty/zint-2.6.1/backend_qt/qzint.cpp | 2 +- 3rdparty/zint-2.6.1/backend_qt/qzint.h | 2 +- limereport/items/lrbarcodeitem.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/3rdparty/zint-2.6.1/backend_qt/qzint.cpp b/3rdparty/zint-2.6.1/backend_qt/qzint.cpp index ba5815f..cec92ce 100644 --- a/3rdparty/zint-2.6.1/backend_qt/qzint.cpp +++ b/3rdparty/zint-2.6.1/backend_qt/qzint.cpp @@ -300,7 +300,7 @@ namespace Zint { return result; } - void QZint::render(QPainter & painter, const QRectF & paintRect, AspectRatioMode mode) { + void QZint::render(QPainter & painter, const QRectF & paintRect) { bool textdone; int comp_offset = 0; int xoffset = m_whitespace; diff --git a/3rdparty/zint-2.6.1/backend_qt/qzint.h b/3rdparty/zint-2.6.1/backend_qt/qzint.h index 5c1f9e1..70b5acc 100644 --- a/3rdparty/zint-2.6.1/backend_qt/qzint.h +++ b/3rdparty/zint-2.6.1/backend_qt/qzint.h @@ -86,7 +86,7 @@ public: QString error_message(); - void render(QPainter & painter, const QRectF & paintRect, AspectRatioMode mode=IgnoreAspectRatio); + void render(QPainter & painter, const QRectF & paintRect); const QString & lastError(); bool hasErrors(); diff --git a/limereport/items/lrbarcodeitem.cpp b/limereport/items/lrbarcodeitem.cpp index 7af23bf..ff2e7cc 100644 --- a/limereport/items/lrbarcodeitem.cpp +++ b/limereport/items/lrbarcodeitem.cpp @@ -99,7 +99,7 @@ void BarcodeItem::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *opti break; } - bc.render(*ppainter,bcRect,Zint::QZint::KeepAspectRatio); + bc.render(*ppainter,bcRect); ppainter->restore(); ItemDesignIntf::paint(ppainter,option,widget); } From c9b6078fa88555a68d4ded82aaa7175c08bca726 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Mon, 11 Sep 2017 21:31:54 +0300 Subject: [PATCH 055/347] #ScriptEngine: The method setVariable() does not only change the value of the variable but also adds a new one if the variable does not exists --- limereport/lrscriptenginemanager.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 6ee0689..0780951 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1491,7 +1491,11 @@ QVariant ScriptFunctionsManager::currencyUSBasedFormat(QVariant value, const QSt void ScriptFunctionsManager::setVariable(const QString &name, QVariant value) { DataSourceManager* dm = scriptEngineManager()->dataManager(); - dm->changeVariable(name,value); + if (dm->containsVariable(name)){ + dm->changeVariable(name,value); + } else { + dm->addVariable(name, value, VarDesc::User); + } } QVariant ScriptFunctionsManager::getVariable(const QString &name) From 090477fa684319385f844b8bd43181b676527724 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 13 Sep 2017 17:16:54 +0300 Subject: [PATCH 056/347] Initial commit --- limereport/items/lrtextitemeditor.cpp | 1 - limereport/limereport.pri | 5 +- limereport/lrreportdesignwidget.cpp | 12 ++ limereport/lrreportdesignwidget.h | 5 +- limereport/scripteditor/lrscripteditor.cpp | 189 +++++++++++++++++++++ limereport/scripteditor/lrscripteditor.h | 56 ++++++ limereport/scripteditor/lrscripteditor.ui | 139 +++++++++++++++ 7 files changed, 404 insertions(+), 3 deletions(-) create mode 100644 limereport/scripteditor/lrscripteditor.cpp create mode 100644 limereport/scripteditor/lrscripteditor.h create mode 100644 limereport/scripteditor/lrscripteditor.ui diff --git a/limereport/items/lrtextitemeditor.cpp b/limereport/items/lrtextitemeditor.cpp index 76e6891..f46333d 100644 --- a/limereport/items/lrtextitemeditor.cpp +++ b/limereport/items/lrtextitemeditor.cpp @@ -33,7 +33,6 @@ #include "lrdatasourcemanager.h" #include "lrscriptenginemanager.h" #include "lrdatadesignintf.h" -#include "lrdatasourcemanager.h" #include #include diff --git a/limereport/limereport.pri b/limereport/limereport.pri index 69af57f..d27d6f7 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -59,6 +59,7 @@ SOURCES += \ $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ + $$REPORT_PATH/scripteditor/lrscripteditor.cpp \ $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ $$REPORT_PATH/items/lralignpropitem.cpp \ $$REPORT_PATH/items/lrhorizontallayout.cpp \ @@ -161,6 +162,7 @@ HEADERS += \ $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ + $$REPORT_PATH/scripteditor/lrscripteditor.h \ $$REPORT_PATH/items/editors/lritemeditorwidget.h \ $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ @@ -235,7 +237,8 @@ FORMS += \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ $$REPORT_PATH/items/lrchartitemeditor.ui \ $$REPORT_PATH/translationeditor/translationeditor.ui \ - $$PWD/translationeditor/languageselectdialog.ui + $$REPORT_PATH/translationeditor/languageselectdialog.ui + $$REPORT_PATH/scripteditor/lrscripteditor.ui RESOURCES += \ $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 9472f13..2b7f160 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -35,6 +35,7 @@ #include "lrsettingdialog.h" #include "dialogdesigner/lrdialogdesigner.h" #include "translationeditor/translationeditor.h" +#include "scripteditor/lrscripteditor.h" #include #include @@ -246,6 +247,12 @@ void ReportDesignWidget::createTabs(){ m_tabWidget->setTabWhatsThis(pageIndex,"script"); m_tabWidget->setCurrentIndex(0); + m_newScriptEditor = new ScriptEditor(this); + m_newScriptEditor->setReportEngine(m_report); + pageIndex = m_tabWidget->addTab(m_newScriptEditor,QIcon(),tr("New Script Editor")); + m_tabWidget->setTabWhatsThis(pageIndex,"script"); + m_tabWidget->setCurrentIndex(0); + #ifdef HAVE_QTDESIGNER_INTEGRATION QWidget* dialogDesigner; foreach(DialogDescriber::Ptr dialogDesc, m_report->scriptContext()->dialogDescribers()){ @@ -787,6 +794,11 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) if (activeTabType() == Translations){ m_traslationEditor->setReportEngine(report()); } + + if (activeTabType() == Script){ + m_newScriptEditor->initCompleter(); + } + emit activePageChanged(); } diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 4d3b25d..d710537 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -51,6 +51,8 @@ class ReportDesignWindow; class DialogDesignerManager; class DialogDesigner; class TranslationEditor; +class ScriptEditor; + class ReportDesignWidget : public QWidget { @@ -190,6 +192,7 @@ private: ReportEnginePrivate* m_report; QGraphicsView *m_view; QTextEdit* m_scriptEditor; + ScriptEditor* m_newScriptEditor; TranslationEditor* m_traslationEditor; #ifdef HAVE_QTDESIGNER_INTEGRATION DialogDesignerManager* m_dialogDesignerManager; @@ -205,5 +208,5 @@ private: bool m_dialogChanged; }; -} +} // namespace LimeReport #endif // LRREPORTDESIGNWIDGET_H diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp new file mode 100644 index 0000000..80bbd27 --- /dev/null +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -0,0 +1,189 @@ +#include "lrscripteditor.h" +#include "ui_lrscripteditor.h" +#include + +#include "lrdatasourcemanager.h" +#include "lrscriptenginemanager.h" +#include "lrdatadesignintf.h" +#include "lrreportengine_p.h" + +namespace LimeReport{ + +TextEditorWithCompleater::TextEditorWithCompleater(QWidget *parent) + : QTextEdit(parent),m_compleater(0) +{ +} + +void TextEditorWithCompleater::setCompleter(QCompleter *value) +{ + if (value) disconnect(value,0,this,0); + m_compleater = value; + if (!m_compleater) return; + m_compleater->setWidget(this); + m_compleater->setCompletionMode(QCompleter::PopupCompletion); + m_compleater->setCaseSensitivity(Qt::CaseInsensitive); + connect(m_compleater,SIGNAL(activated(QString)),this,SLOT(insertCompletion(QString))); +} + +void TextEditorWithCompleater::keyPressEvent(QKeyEvent *e) +{ + if (m_compleater && m_compleater->popup()->isVisible()) { + switch (e->key()) { + case Qt::Key_Enter: + case Qt::Key_Return: + case Qt::Key_Escape: + case Qt::Key_Tab: + case Qt::Key_Backtab: + e->ignore(); + return; + default: + break; + } + } + + bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_Space); + if (!m_compleater || !isShortcut) QTextEdit::keyPressEvent(e); + + const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); + if (!m_compleater || (ctrlOrShift && e->text().isEmpty())) + return; + + static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word + bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; + + QString completionPrefix = textUnderCursor(); + + if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3 + || eow.contains(e->text().right(1)))) { + m_compleater->popup()->hide(); + return; + } + + if (completionPrefix != m_compleater->completionPrefix()) { + m_compleater->setCompletionPrefix(completionPrefix); + m_compleater->popup()->setCurrentIndex(m_compleater->completionModel()->index(0, 0)); + } + + QRect cr = cursorRect(); + cr.setWidth(m_compleater->popup()->sizeHintForColumn(0) + + m_compleater->popup()->verticalScrollBar()->sizeHint().width()); + m_compleater->complete(cr); + +} + +void TextEditorWithCompleater::focusInEvent(QFocusEvent *e) +{ + if (m_compleater) m_compleater->setWidget(this); + QTextEdit::focusInEvent(e); +} + +QString TextEditorWithCompleater::textUnderCursor() const +{ + QTextCursor tc = textCursor(); + tc.select(QTextCursor::WordUnderCursor); + return tc.selectedText(); +} + +void TextEditorWithCompleater::insertCompletion(const QString &completion) +{ + if (m_compleater->widget() != this) + return; + QTextCursor tc = textCursor(); + int extra = completion.length() - m_compleater->completionPrefix().length(); + tc.movePosition(QTextCursor::Left); + tc.movePosition(QTextCursor::EndOfWord); + tc.insertText(completion.right(extra)); + setTextCursor(tc); +} + +ScriptEditor::ScriptEditor(QWidget *parent) : + QWidget(parent), + ui(new Ui::ScriptEditor) +{ + ui->setupUi(this); + m_completer = new QCompleter(this); + ui->textEdit->setCompleter(m_completer); +} + +ScriptEditor::~ScriptEditor() +{ + delete ui; +} + +void ScriptEditor::setReportEngine(ReportEnginePrivate* reportEngine) +{ + m_reportEngine = reportEngine; + DataSourceManager* dm = m_reportEngine->dataManager(); + ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); + se.setDataManager(dm); + + initCompleter(); + + if (dm){ + if (dm->isNeedUpdateDatasourceModel()) + dm->updateDatasourceModel(); + ui->twData->setModel(dm->datasourcesModel()); + ui->twScriptEngine->setModel(se.model()); + } + +} + +void ScriptEditor::initCompleter() +{ + QStringList dataWords; + DataSourceManager* dm = m_reportEngine->dataManager(); + ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); + + QJSValue globalObject = se.scriptEngine()->globalObject(); + QJSValueIterator it(globalObject); + while (it.hasNext()){ + it.next(); + if (it.value().isCallable() ){ + dataWords << it.name(); + } + } + + foreach(const QString &dsName,dm->dataSourceNames()){ + dataWords << dsName; + foreach(const QString &field, dm->fieldNames(dsName)){ + dataWords<variableNames()) { + dataWords << varName.remove("#"); + } + + for ( int i = 0; i < m_reportEngine->pageCount(); ++i){ + PageDesignIntf* page = m_reportEngine->pageAt(i); + dataWords << page->pageItem()->objectName(); + foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ + addItemToCompleater(page->pageItem()->objectName(), item, dataWords); + } + } + + m_completer->setModel(new QStringListModel(dataWords,m_completer)); +} + +void ScriptEditor::addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords) +{ + BandDesignIntf* band = dynamic_cast(item); + if (band){ + dataWords << band->objectName(); + dataWords << pageName+"_"+band->objectName(); + dataWords << pageName+"_"+band->objectName()+".beforeRender"; + dataWords << pageName+"_"+item->objectName()+".afterData"; + dataWords << pageName+"_"+band->objectName()+".afterRender"; + foreach (BaseDesignIntf* child, band->childBaseItems()){ + addItemToCompleater(pageName, child, dataWords); + } + } else { + dataWords << item->objectName(); + dataWords << pageName+"_"+item->objectName(); + dataWords << pageName+"_"+item->objectName()+".beforeRender"; + dataWords << pageName+"_"+item->objectName()+".afterData"; + dataWords << pageName+"_"+item->objectName()+".afterRender"; + } +} + +} // namespace LimeReport diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h new file mode 100644 index 0000000..7674025 --- /dev/null +++ b/limereport/scripteditor/lrscripteditor.h @@ -0,0 +1,56 @@ +#ifndef LRSCRIPTEDITOR_H +#define LRSCRIPTEDITOR_H + +#include +#include +#include +#include +#include + +namespace LimeReport{ + +class ReportEnginePrivate; +class BaseDesignIntf; + +class TextEditorWithCompleater :public QTextEdit +{ + Q_OBJECT +public: + TextEditorWithCompleater(QWidget* parent=0); + void setCompleter(QCompleter* value); + QCompleter* compleater() const{ return m_compleater;} +protected: + virtual void keyPressEvent(QKeyEvent *e); + virtual void focusInEvent(QFocusEvent *e); +private: + QString textUnderCursor() const; +private slots: + void insertCompletion(const QString& completion); +private: + QCompleter* m_compleater; +}; + +namespace Ui { +class ScriptEditor; +} + +class ScriptEditor : public QWidget +{ + Q_OBJECT +public: + explicit ScriptEditor(QWidget *parent = 0); + ~ScriptEditor(); + void setReportEngine(ReportEnginePrivate* reportEngine); + void initCompleter(); +private: + void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); +private: + Ui::ScriptEditor *ui; + ReportEnginePrivate* m_reportEngine; + QCompleter* m_completer; + +}; + +} // namespace LimeReport + +#endif // LRSCRIPTEDITOR_H diff --git a/limereport/scripteditor/lrscripteditor.ui b/limereport/scripteditor/lrscripteditor.ui new file mode 100644 index 0000000..5a5af17 --- /dev/null +++ b/limereport/scripteditor/lrscripteditor.ui @@ -0,0 +1,139 @@ + + + ScriptEditor + + + + 0 + 0 + 706 + 541 + + + + Form + + + + + + + 0 + 0 + + + + Content + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + 0 + 0 + + + + Qt::Horizontal + + + + + 12 + + + + + + QTabWidget::South + + + 0 + + + + Data + + + + 3 + + + 3 + + + 3 + + + 3 + + + 3 + + + + + false + + + + + + + + Functions + + + + + + Qt::Vertical + + + + false + + + + + + + + + + + + + + + + + + + + + + TextEditorWithCompleater + QTextEdit +
lrscripteditor.h
+
+
+ + +
From aa66b6a057c83e12f01062167c49c3443fe2b981 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 16 Sep 2017 16:04:29 +0300 Subject: [PATCH 057/347] Highlighter has been added --- limereport/limereport.pri | 7 +- limereport/limereport.pro | 6 + limereport/scripteditor/lrcodeeditor.cpp | 193 ++++++++++++++++++ limereport/scripteditor/lrcodeeditor.h | 64 ++++++ limereport/scripteditor/lrscripteditor.cpp | 87 -------- limereport/scripteditor/lrscripteditor.h | 18 -- limereport/scripteditor/lrscripteditor.ui | 10 +- .../scripteditor/lrscripthighlighter.cpp | 118 +++++++++++ limereport/scripteditor/lrscripthighlighter.h | 17 ++ 9 files changed, 408 insertions(+), 112 deletions(-) create mode 100644 limereport/scripteditor/lrcodeeditor.cpp create mode 100644 limereport/scripteditor/lrcodeeditor.h create mode 100644 limereport/scripteditor/lrscripthighlighter.cpp create mode 100644 limereport/scripteditor/lrscripthighlighter.h diff --git a/limereport/limereport.pri b/limereport/limereport.pri index d27d6f7..649f8f6 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -12,7 +12,8 @@ INCLUDEPATH += \ $$REPORT_PATH/bands \ $$REPORT_PATH/base \ $$REPORT_PATH/objectinspector \ - $$REPORT_PATH/databrowser + $$REPORT_PATH/databrowser \ + $$REPORT_PATH/scripteditor SOURCES += \ $$REPORT_PATH/bands/lrpageheader.cpp \ @@ -60,6 +61,7 @@ SOURCES += \ $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ $$REPORT_PATH/scripteditor/lrscripteditor.cpp \ + $$REPORT_PATH/scripteditor/lrcodeeditor.cpp \ $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ $$REPORT_PATH/items/lralignpropitem.cpp \ $$REPORT_PATH/items/lrhorizontallayout.cpp \ @@ -163,6 +165,7 @@ HEADERS += \ $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ $$REPORT_PATH/scripteditor/lrscripteditor.h \ + $$REPORT_PATH/scripteditor/lrcodeeditor.h \ $$REPORT_PATH/items/editors/lritemeditorwidget.h \ $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ @@ -237,7 +240,7 @@ FORMS += \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ $$REPORT_PATH/items/lrchartitemeditor.ui \ $$REPORT_PATH/translationeditor/translationeditor.ui \ - $$REPORT_PATH/translationeditor/languageselectdialog.ui + $$REPORT_PATH/translationeditor/languageselectdialog.ui \ $$REPORT_PATH/scripteditor/lrscripteditor.ui RESOURCES += \ diff --git a/limereport/limereport.pro b/limereport/limereport.pro index e98a9d1..fa57ae6 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -118,4 +118,10 @@ contains(CONFIG,build_translations){ #### EN AUTOMATIC TRANSLATIONS +HEADERS += \ + scripteditor/lrscripthighlighter.h + +SOURCES += \ + scripteditor/lrscripthighlighter.cpp + diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp new file mode 100644 index 0000000..ae3aec9 --- /dev/null +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -0,0 +1,193 @@ +#include "lrcodeeditor.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "lrscripthighlighter.h" + +namespace LimeReport{ + +CodeEditor::CodeEditor(QWidget *parent) + : QPlainTextEdit(parent), m_compleater(0) +{ + lineNumberArea = new LineNumberArea(this); + + connect(this, SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int))); + connect(this, SIGNAL(updateRequest(QRect,int)), this, SLOT(updateLineNumberArea(QRect,int))); + connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlightCurrentLine())); + + updateLineNumberAreaWidth(0); + highlightCurrentLine(); + (void) new ScriptHighlighter(document()); +} + +void CodeEditor::setCompleter(QCompleter *value) +{ + if (value) disconnect(value,0,this,0); + m_compleater = value; + if (!m_compleater) return; + m_compleater->setWidget(this); + m_compleater->setCompletionMode(QCompleter::PopupCompletion); + m_compleater->setCaseSensitivity(Qt::CaseInsensitive); + connect(m_compleater,SIGNAL(activated(QString)),this,SLOT(insertCompletion(QString))); +} + +void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent* event) +{ + QPainter painter(lineNumberArea); + painter.fillRect(event->rect(), QPalette().background().color()); + + QTextBlock block = firstVisibleBlock(); + int blockNumber = block.blockNumber(); + int top = (int) blockBoundingGeometry(block).translated(contentOffset()).top(); + int bottom = top + (int) blockBoundingRect(block).height(); + + while (block.isValid() && top <= event->rect().bottom()) { + if (block.isVisible() && bottom >= event->rect().top()) { + QString number = QString::number(blockNumber + 1); + painter.setPen(QPalette().text().color()); + painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(), + Qt::AlignCenter, number); + } + + block = block.next(); + top = bottom; + bottom = top + (int) blockBoundingRect(block).height(); + ++blockNumber; + } +} + +int CodeEditor::lineNumberAreaWidth() +{ + int digits = 1; + int max = qMax(1, blockCount()); + while (max >= 10) { + max /= 10; + ++digits; + } + + int space = fontMetrics().width(QLatin1Char('9'))*2 + fontMetrics().width(QLatin1Char('9')) * digits; + + return space; +} + +void CodeEditor::keyPressEvent(QKeyEvent *e) +{ + if (m_compleater && m_compleater->popup()->isVisible()) { + switch (e->key()) { + case Qt::Key_Enter: + case Qt::Key_Return: + case Qt::Key_Escape: + case Qt::Key_Tab: + case Qt::Key_Backtab: + e->ignore(); + return; + default: + break; + } + } + + bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_Space); + if (!m_compleater || !isShortcut) QPlainTextEdit::keyPressEvent(e); + + const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); + if (!m_compleater || (ctrlOrShift && e->text().isEmpty())) + return; + + static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word + bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; + + QString completionPrefix = textUnderCursor(); + + if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3 + || eow.contains(e->text().right(1)))) { + m_compleater->popup()->hide(); + return; + } + + if (completionPrefix != m_compleater->completionPrefix()) { + m_compleater->setCompletionPrefix(completionPrefix); + m_compleater->popup()->setCurrentIndex(m_compleater->completionModel()->index(0, 0)); + } + + QRect cr = cursorRect(); + cr.setWidth(m_compleater->popup()->sizeHintForColumn(0) + + m_compleater->popup()->verticalScrollBar()->sizeHint().width()); + m_compleater->complete(cr); + +} + +void CodeEditor::focusInEvent(QFocusEvent *e) +{ + if (m_compleater) m_compleater->setWidget(this); + QPlainTextEdit::focusInEvent(e); +} + +void CodeEditor::resizeEvent(QResizeEvent* event) +{ + QPlainTextEdit::resizeEvent(event); + QRect cr = contentsRect(); + lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height())); +} + +QString CodeEditor::textUnderCursor() const +{ + QTextCursor tc = textCursor(); + tc.select(QTextCursor::WordUnderCursor); + return tc.selectedText(); +} + +void CodeEditor::insertCompletion(const QString &completion) +{ + if (m_compleater->widget() != this) + return; + QTextCursor tc = textCursor(); + int extra = completion.length() - m_compleater->completionPrefix().length(); + tc.movePosition(QTextCursor::Left); + tc.movePosition(QTextCursor::EndOfWord); + tc.insertText(completion.right(extra)); + setTextCursor(tc); +} + +void CodeEditor::updateLineNumberAreaWidth(int newBlockCount) +{ + setViewportMargins(lineNumberAreaWidth(), 0, 0, 0); +} + +void CodeEditor::highlightCurrentLine() +{ + QList extraSelections; + + if (!isReadOnly()) { + QTextEdit::ExtraSelection selection; + + QColor lineColor = QColor(QPalette().background().color()).darker(160); + + selection.format.setBackground(lineColor); + selection.format.setProperty(QTextFormat::FullWidthSelection, true); + selection.cursor = textCursor(); + selection.cursor.clearSelection(); + extraSelections.append(selection); + } + + setExtraSelections(extraSelections); +} + +void CodeEditor::updateLineNumberArea(const QRect& rect, int dy) +{ + if (dy) + lineNumberArea->scroll(0, dy); + else + lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height()); + + if (rect.contains(viewport()->rect())) + updateLineNumberAreaWidth(0); +} + +} //namespace LimeReport diff --git a/limereport/scripteditor/lrcodeeditor.h b/limereport/scripteditor/lrcodeeditor.h new file mode 100644 index 0000000..83c2dc0 --- /dev/null +++ b/limereport/scripteditor/lrcodeeditor.h @@ -0,0 +1,64 @@ +#ifndef LRCODEEDITOR_H +#define LRCODEEDITOR_H + +#include +#include + +QT_BEGIN_NAMESPACE +class QWidget; +class QCompleter; +class QKeyEvent; +class QScrollBar; +QT_END_NAMESPACE + +namespace LimeReport{ + +class CodeEditor :public QPlainTextEdit +{ + Q_OBJECT +public: + CodeEditor(QWidget* parent=0); + void setCompleter(QCompleter* value); + QCompleter* compleater() const{ return m_compleater;} + void lineNumberAreaPaintEvent(QPaintEvent *event); + int lineNumberAreaWidth(); +protected: + void keyPressEvent(QKeyEvent *e); + void focusInEvent(QFocusEvent *e); + void resizeEvent(QResizeEvent *event); +private: + QString textUnderCursor() const; +private slots: + void insertCompletion(const QString& completion); + void updateLineNumberAreaWidth(int newBlockCount); + void highlightCurrentLine(); + void updateLineNumberArea(const QRect &rect, int dy); +private: + QCompleter* m_compleater; + QWidget *lineNumberArea; +}; + + +class LineNumberArea : public QWidget +{ +public: + LineNumberArea(CodeEditor *editor) : QWidget(editor) { + codeEditor = editor; + } + + QSize sizeHint() const { + return QSize(codeEditor->lineNumberAreaWidth(), 0); + } + +protected: + void paintEvent(QPaintEvent *event) { + codeEditor->lineNumberAreaPaintEvent(event); + } + +private: + CodeEditor *codeEditor; +}; + +} // namespace LimeReport + +#endif // LRCODEEDITOR_H diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 80bbd27..613926e 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -9,93 +9,6 @@ namespace LimeReport{ -TextEditorWithCompleater::TextEditorWithCompleater(QWidget *parent) - : QTextEdit(parent),m_compleater(0) -{ -} - -void TextEditorWithCompleater::setCompleter(QCompleter *value) -{ - if (value) disconnect(value,0,this,0); - m_compleater = value; - if (!m_compleater) return; - m_compleater->setWidget(this); - m_compleater->setCompletionMode(QCompleter::PopupCompletion); - m_compleater->setCaseSensitivity(Qt::CaseInsensitive); - connect(m_compleater,SIGNAL(activated(QString)),this,SLOT(insertCompletion(QString))); -} - -void TextEditorWithCompleater::keyPressEvent(QKeyEvent *e) -{ - if (m_compleater && m_compleater->popup()->isVisible()) { - switch (e->key()) { - case Qt::Key_Enter: - case Qt::Key_Return: - case Qt::Key_Escape: - case Qt::Key_Tab: - case Qt::Key_Backtab: - e->ignore(); - return; - default: - break; - } - } - - bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_Space); - if (!m_compleater || !isShortcut) QTextEdit::keyPressEvent(e); - - const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); - if (!m_compleater || (ctrlOrShift && e->text().isEmpty())) - return; - - static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word - bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; - - QString completionPrefix = textUnderCursor(); - - if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3 - || eow.contains(e->text().right(1)))) { - m_compleater->popup()->hide(); - return; - } - - if (completionPrefix != m_compleater->completionPrefix()) { - m_compleater->setCompletionPrefix(completionPrefix); - m_compleater->popup()->setCurrentIndex(m_compleater->completionModel()->index(0, 0)); - } - - QRect cr = cursorRect(); - cr.setWidth(m_compleater->popup()->sizeHintForColumn(0) - + m_compleater->popup()->verticalScrollBar()->sizeHint().width()); - m_compleater->complete(cr); - -} - -void TextEditorWithCompleater::focusInEvent(QFocusEvent *e) -{ - if (m_compleater) m_compleater->setWidget(this); - QTextEdit::focusInEvent(e); -} - -QString TextEditorWithCompleater::textUnderCursor() const -{ - QTextCursor tc = textCursor(); - tc.select(QTextCursor::WordUnderCursor); - return tc.selectedText(); -} - -void TextEditorWithCompleater::insertCompletion(const QString &completion) -{ - if (m_compleater->widget() != this) - return; - QTextCursor tc = textCursor(); - int extra = completion.length() - m_compleater->completionPrefix().length(); - tc.movePosition(QTextCursor::Left); - tc.movePosition(QTextCursor::EndOfWord); - tc.insertText(completion.right(extra)); - setTextCursor(tc); -} - ScriptEditor::ScriptEditor(QWidget *parent) : QWidget(parent), ui(new Ui::ScriptEditor) diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index 7674025..6943fcb 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -12,24 +12,6 @@ namespace LimeReport{ class ReportEnginePrivate; class BaseDesignIntf; -class TextEditorWithCompleater :public QTextEdit -{ - Q_OBJECT -public: - TextEditorWithCompleater(QWidget* parent=0); - void setCompleter(QCompleter* value); - QCompleter* compleater() const{ return m_compleater;} -protected: - virtual void keyPressEvent(QKeyEvent *e); - virtual void focusInEvent(QFocusEvent *e); -private: - QString textUnderCursor() const; -private slots: - void insertCompletion(const QString& completion); -private: - QCompleter* m_compleater; -}; - namespace Ui { class ScriptEditor; } diff --git a/limereport/scripteditor/lrscripteditor.ui b/limereport/scripteditor/lrscripteditor.ui index 5a5af17..49fcfb6 100644 --- a/limereport/scripteditor/lrscripteditor.ui +++ b/limereport/scripteditor/lrscripteditor.ui @@ -1,7 +1,7 @@ - ScriptEditor - + LimeReport::ScriptEditor + 0 @@ -52,7 +52,7 @@ Qt::Horizontal - + 12 @@ -129,9 +129,9 @@ - TextEditorWithCompleater + LimeReport::CodeEditor QTextEdit -
lrscripteditor.h
+
lrcodeeditor.h
diff --git a/limereport/scripteditor/lrscripthighlighter.cpp b/limereport/scripteditor/lrscripthighlighter.cpp new file mode 100644 index 0000000..d85a571 --- /dev/null +++ b/limereport/scripteditor/lrscripthighlighter.cpp @@ -0,0 +1,118 @@ +#include "lrscripthighlighter.h" +#include + +namespace LimeReport{ + +#define KEYWORDS_COUNT 59 + +static const char *const keywords[KEYWORDS_COUNT] = { + "do","if","in","for","int","new","try","var","byte","case","char","else","enum", + "goto","long","null","this","true","void","with","break","catch","class","const", + "false","final","float","short","super","throw","while","delete","double","export", + "import","native","public","return","static","switch","throws","typeof","boolean", + "default","extends","finally","package","private","abstract","continue","debugger", + "function","volatile","interface","protected","transient","implements","instanceof", + "synchronized" +}; + +enum LiteralsType{SpaceFound, AlpahabetFound, NumberFound, HashFound, SlashFound, AsterixFound, + BracketFound, QuotationFound, ApostropheFound, SeparatorFound, BackSlashFound, LiteralsCount}; +enum States {MayBeKeyWord, Code, MayBeComment, Comment, Comment2, MayBeComment2End, String, String2, MayBeNumber, Separator, StatesCount}; + +void ScriptHighlighter::highlightBlock(const QString& text) +{ + int literal = -1; + bool lastWasBackSlash = false; + int state = previousBlockState() != -1 ? previousBlockState() : MayBeKeyWord ; + int oldState = -1; + int stateMaschine[StatesCount][LiteralsCount] = { + {Separator, MayBeKeyWord, Code, Separator, MayBeComment, Separator, Separator, String, String2, Separator, Separator}, + {Separator, Code, Code, Separator, Separator, Separator, Separator, String, String2, Separator, Separator}, + {Separator, Code, Code, Code, Comment, Comment2, Code, String, String2, Separator, Code}, + {Comment, Comment, Comment, Comment, Comment, Comment, Comment, Comment, Comment, Comment, Comment}, + {Comment2, Comment2, Comment2, Comment2, Comment2, MayBeComment2End, Comment2, Comment2, Comment2, Comment2, Comment2}, + {Comment2, Comment2, Comment2, Comment2, Separator, Comment2, Comment2, Comment2, Comment2, Comment2, Comment2}, + {String, String, String, String, String, String, String, Separator, String, String, String}, + {String2, String2, String2, String2, String2, String2, String2, String2, Separator, String2, String2}, + {Separator, Code, MayBeNumber, Separator, MayBeComment, Separator, Separator, String, String2, Separator, Code}, + {Separator, MayBeKeyWord, MayBeNumber, Separator, MayBeComment, String, String2, Separator, Separator } + }; + + QString buffer; + + if (text.isEmpty()) return; + int i = 0; + for (;;){ + QChar currentChar = text.at(i); + switch(currentChar.toLatin1()){ + case ' ': + literal = SpaceFound; + break; + case '/': + literal = SlashFound; + break; + case '*': + literal = AsterixFound; + break; + case '#': + literal = HashFound; + break; + case '\'': + literal = ApostropheFound; + break; + case '\\': + literal = BackSlashFound; + break; + case '"': + literal = QuotationFound; + break; + case '{': case '[': case '(': + case '}': case ']': case ')': + literal = BracketFound; + break; + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': case '0': + literal = NumberFound; + break; + default: + if (currentChar.isLetter()) + literal = AlpahabetFound; + else + literal = SeparatorFound; + }; + + lastWasBackSlash = !lastWasBackSlash && currentChar == QLatin1Char('\\'); + + oldState = state; + state = stateMaschine[state][literal]; + + if (oldState != state){ + switch( state ){ + case MayBeComment: + buffer.clear(); + buffer += currentChar; + break; + case Comment2: + buffer += currentChar; + qDebug()<= text.length()) break; + } +} + +} // namespace LimeReport diff --git a/limereport/scripteditor/lrscripthighlighter.h b/limereport/scripteditor/lrscripthighlighter.h new file mode 100644 index 0000000..3a54693 --- /dev/null +++ b/limereport/scripteditor/lrscripthighlighter.h @@ -0,0 +1,17 @@ +#ifndef LRSCRIPTHIGHLIGHTER_H +#define LRSCRIPTHIGHLIGHTER_H + +#include + +namespace LimeReport{ + +class ScriptHighlighter : QSyntaxHighlighter{ +public: + ScriptHighlighter(QTextDocument* parent): QSyntaxHighlighter(parent){} + // QSyntaxHighlighter interface +protected: + void highlightBlock(const QString& text); +}; + +} +#endif // LRSCRIPTHIGHLIGHTER_H From f4dbddafade4569b0557a06c93c025713f310b8b Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 19 Sep 2017 19:05:38 +0300 Subject: [PATCH 058/347] Script highlighter has been finished --- limereport/limereport.pri | 2 + limereport/limereport.pro | 6 - limereport/scripteditor/lrcodeeditor.cpp | 135 +++++++++++++++++- limereport/scripteditor/lrcodeeditor.h | 7 + .../scripteditor/lrscripthighlighter.cpp | 130 +++++++++++++++-- limereport/scripteditor/lrscripthighlighter.h | 37 ++++- 6 files changed, 295 insertions(+), 22 deletions(-) diff --git a/limereport/limereport.pri b/limereport/limereport.pri index 649f8f6..385ad4d 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -62,6 +62,7 @@ SOURCES += \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ $$REPORT_PATH/scripteditor/lrscripteditor.cpp \ $$REPORT_PATH/scripteditor/lrcodeeditor.cpp \ + $$REPORT_PATH/scripteditor/lrscripthighlighter.cpp \ $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ $$REPORT_PATH/items/lralignpropitem.cpp \ $$REPORT_PATH/items/lrhorizontallayout.cpp \ @@ -166,6 +167,7 @@ HEADERS += \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ $$REPORT_PATH/scripteditor/lrscripteditor.h \ $$REPORT_PATH/scripteditor/lrcodeeditor.h \ + $$REPORT_PATH/scripteditor/lrscripthighlighter.h \ $$REPORT_PATH/items/editors/lritemeditorwidget.h \ $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ diff --git a/limereport/limereport.pro b/limereport/limereport.pro index fa57ae6..e98a9d1 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -118,10 +118,4 @@ contains(CONFIG,build_translations){ #### EN AUTOMATIC TRANSLATIONS -HEADERS += \ - scripteditor/lrscripthighlighter.h - -SOURCES += \ - scripteditor/lrscripthighlighter.cpp - diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index ae3aec9..273a1b3 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -24,7 +24,9 @@ CodeEditor::CodeEditor(QWidget *parent) updateLineNumberAreaWidth(0); highlightCurrentLine(); - (void) new ScriptHighlighter(document()); + new ScriptHighlighter(document()); + connect(this, SIGNAL(cursorPositionChanged()), + this, SLOT(matchParentheses())); } void CodeEditor::setCompleter(QCompleter *value) @@ -143,6 +145,105 @@ QString CodeEditor::textUnderCursor() const return tc.selectedText(); } +bool CodeEditor::matchLeftParenthesis(QTextBlock currentBlock, QChar parenthesisType, int i, int numLeftParentheses) +{ + TextBlockData *data = static_cast(currentBlock.userData()); + QVector infos = data->parentheses(); + + int docPos = currentBlock.position(); + for (; i < infos.size(); ++i) { + ParenthesisInfo *info = infos.at(i); + + if (info->character == parenthesisType) { + ++numLeftParentheses; + continue; + } + + if (info->character == getParenthesisReverceChar(parenthesisType)){ + if (numLeftParentheses == 0) { + createParenthesisSelection(docPos + info->position); + return true; + } else + --numLeftParentheses; + } + + } + + currentBlock = currentBlock.next(); + if (currentBlock.isValid()) + return matchLeftParenthesis(currentBlock, parenthesisType, 0, numLeftParentheses); + + return false; +} + +bool CodeEditor::matchRightParenthesis(QTextBlock currentBlock, QChar parenthesisType, int i, int numRightParentheses) +{ + TextBlockData *data = static_cast(currentBlock.userData()); + QVector parentheses = data->parentheses(); + + int docPos = currentBlock.position(); + for (; i > -1 && parentheses.size() > 0; --i) { + ParenthesisInfo *info = parentheses.at(i); + if (info->character == parenthesisType) { + ++numRightParentheses; + continue; + } + if (info->character == getParenthesisReverceChar(parenthesisType)){ + if (numRightParentheses == 0) { + createParenthesisSelection(docPos + info->position); + return true; + } else + --numRightParentheses; + } + } + + currentBlock = currentBlock.previous(); + if (currentBlock.isValid()) + return matchRightParenthesis(currentBlock, parenthesisType, 0, numRightParentheses); + + return false; +} + +void CodeEditor::createParenthesisSelection(int pos) +{ + QList selections = extraSelections(); + + QTextEdit::ExtraSelection selection; + QTextCharFormat format = selection.format; + format.setBackground(QColor("#619934")); + format.setForeground(QColor("#ffffff")); + selection.format = format; + + QTextCursor cursor = textCursor(); + cursor.setPosition(pos); + cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor); + selection.cursor = cursor; + + selections.append(selection); + + setExtraSelections(selections); +} + +bool CodeEditor::charIsParenthesis(QChar character, ParenthesisType type) +{ + for (int i = 0; i < PARENHEIS_COUNT; ++i){ + if (character == parenthesisCharacters[type][i]) + return true; + } + return false; +} + +QChar CodeEditor::getParenthesisReverceChar(QChar parenthesisChar) +{ + for (int i = 0; i < PARENHEIS_COUNT; ++i){ + if ( parenthesisCharacters[RightParenthesis][i] == parenthesisChar) + return parenthesisCharacters[LeftParenthesis][i]; + if ( parenthesisCharacters[LeftParenthesis][i] == parenthesisChar) + return parenthesisCharacters[RightParenthesis][i]; + } + return ' '; +} + void CodeEditor::insertCompletion(const QString &completion) { if (m_compleater->widget() != this) @@ -155,7 +256,7 @@ void CodeEditor::insertCompletion(const QString &completion) setTextCursor(tc); } -void CodeEditor::updateLineNumberAreaWidth(int newBlockCount) +void CodeEditor::updateLineNumberAreaWidth(int /*newBlockCount*/) { setViewportMargins(lineNumberAreaWidth(), 0, 0, 0); } @@ -167,7 +268,7 @@ void CodeEditor::highlightCurrentLine() if (!isReadOnly()) { QTextEdit::ExtraSelection selection; - QColor lineColor = QColor(QPalette().background().color()).darker(160); + QColor lineColor = QColor(QPalette().background().color()).darker(100); selection.format.setBackground(lineColor); selection.format.setProperty(QTextFormat::FullWidthSelection, true); @@ -190,4 +291,32 @@ void CodeEditor::updateLineNumberArea(const QRect& rect, int dy) updateLineNumberAreaWidth(0); } +void CodeEditor::matchParentheses() +{ + QList selections; + setExtraSelections(selections); + + TextBlockData *data = static_cast(textCursor().block().userData()); + + if (data) { + QVector infos = data->parentheses(); + + int pos = textCursor().block().position(); + for (int i = 0; i < infos.size(); ++i) { + ParenthesisInfo *info = infos.at(i); + + int curPos = textCursor().position() - textCursor().block().position(); + + if ( (info->position == (curPos - 1)) && charIsParenthesis(info->character, LeftParenthesis)) + { + if (matchLeftParenthesis(textCursor().block(), info->character, i + 1, 0)) + createParenthesisSelection(pos + info->position); + } else if ( (info->position == (curPos - 1)) && charIsParenthesis(info->character, RightParenthesis)) { + if (matchRightParenthesis(textCursor().block(), info->character, i - 1, 0)) + createParenthesisSelection(pos + info->position); + } + } + } +} + } //namespace LimeReport diff --git a/limereport/scripteditor/lrcodeeditor.h b/limereport/scripteditor/lrcodeeditor.h index 83c2dc0..851583f 100644 --- a/limereport/scripteditor/lrcodeeditor.h +++ b/limereport/scripteditor/lrcodeeditor.h @@ -3,6 +3,7 @@ #include #include +#include "lrscripthighlighter.h" QT_BEGIN_NAMESPACE class QWidget; @@ -28,11 +29,17 @@ protected: void resizeEvent(QResizeEvent *event); private: QString textUnderCursor() const; + bool matchLeftParenthesis(QTextBlock currentBlock, QChar parenthesisType, int i, int numLeftParentheses); + bool matchRightParenthesis(QTextBlock currentBlock, QChar parenthesisType, int i, int numRightParentheses); + void createParenthesisSelection(int pos); + bool charIsParenthesis(QChar character, ParenthesisType type); + QChar getParenthesisReverceChar(QChar parenthesisChar); private slots: void insertCompletion(const QString& completion); void updateLineNumberAreaWidth(int newBlockCount); void highlightCurrentLine(); void updateLineNumberArea(const QRect &rect, int dy); + void matchParentheses(); private: QCompleter* m_compleater; QWidget *lineNumberArea; diff --git a/limereport/scripteditor/lrscripthighlighter.cpp b/limereport/scripteditor/lrscripthighlighter.cpp index d85a571..d88e18f 100644 --- a/limereport/scripteditor/lrscripthighlighter.cpp +++ b/limereport/scripteditor/lrscripthighlighter.cpp @@ -1,5 +1,6 @@ #include "lrscripthighlighter.h" #include +#include namespace LimeReport{ @@ -17,25 +18,38 @@ static const char *const keywords[KEYWORDS_COUNT] = { enum LiteralsType{SpaceFound, AlpahabetFound, NumberFound, HashFound, SlashFound, AsterixFound, BracketFound, QuotationFound, ApostropheFound, SeparatorFound, BackSlashFound, LiteralsCount}; -enum States {MayBeKeyWord, Code, MayBeComment, Comment, Comment2, MayBeComment2End, String, String2, MayBeNumber, Separator, StatesCount}; +enum States {Start, MayBeKeyWord, Code, MayBeComment, Comment, Comment2, MayBeComment2End, String, String2, MayBeNumber, Separator, StatesCount}; + +void ScriptHighlighter::createParentheisisInfo(const char& literal, TextBlockData *data, const QString& text) +{ + int pos = text.indexOf(literal); + while (pos != -1) { + ParenthesisInfo *info = new ParenthesisInfo; + info->character = literal; + info->position = pos; + data->insert(info); + pos = text.indexOf(literal, pos + 1); + } +} void ScriptHighlighter::highlightBlock(const QString& text) { int literal = -1; bool lastWasBackSlash = false; - int state = previousBlockState() != -1 ? previousBlockState() : MayBeKeyWord ; + int state = previousBlockState() != -1 ? previousBlockState() : Start ; int oldState = -1; int stateMaschine[StatesCount][LiteralsCount] = { + {Separator, MayBeKeyWord, MayBeNumber, Separator, MayBeComment, Separator, Separator, String, String2, Separator, Separator}, {Separator, MayBeKeyWord, Code, Separator, MayBeComment, Separator, Separator, String, String2, Separator, Separator}, {Separator, Code, Code, Separator, Separator, Separator, Separator, String, String2, Separator, Separator}, - {Separator, Code, Code, Code, Comment, Comment2, Code, String, String2, Separator, Code}, + {Separator, Code, MayBeNumber, Code, Comment, Comment2, Code, String, String2, Separator, Code}, {Comment, Comment, Comment, Comment, Comment, Comment, Comment, Comment, Comment, Comment, Comment}, {Comment2, Comment2, Comment2, Comment2, Comment2, MayBeComment2End, Comment2, Comment2, Comment2, Comment2, Comment2}, {Comment2, Comment2, Comment2, Comment2, Separator, Comment2, Comment2, Comment2, Comment2, Comment2, Comment2}, {String, String, String, String, String, String, String, Separator, String, String, String}, {String2, String2, String2, String2, String2, String2, String2, String2, Separator, String2, String2}, {Separator, Code, MayBeNumber, Separator, MayBeComment, Separator, Separator, String, String2, Separator, Code}, - {Separator, MayBeKeyWord, MayBeNumber, Separator, MayBeComment, String, String2, Separator, Separator } + {Separator, MayBeKeyWord, MayBeNumber, Separator, MayBeComment, Separator, Separator, String, String2, Separator, Separator } }; QString buffer; @@ -86,33 +100,127 @@ void ScriptHighlighter::highlightBlock(const QString& text) oldState = state; state = stateMaschine[state][literal]; + buffer += currentChar; + if (oldState != state){ switch( state ){ case MayBeComment: + if (oldState == MayBeNumber){ + setFormat(i-(buffer.length()-1), buffer.length()-1, m_formats[NumberFormat]); + } + buffer.clear(); + buffer += currentChar; + + break; + case MayBeKeyWord: + case MayBeNumber: buffer.clear(); buffer += currentChar; break; case Comment2: - buffer += currentChar; - qDebug()<= text.length()) break; } + + TextBlockData *data = new TextBlockData; + + + for (int i = 0; i < PARENHEIS_COUNT; ++i){ + createParentheisisInfo(parenthesisCharacters[LeftParenthesis][i].toLatin1(), data, text); + createParentheisisInfo(parenthesisCharacters[RightParenthesis][i].toLatin1(), data, text); + } +// createParentheisisInfo('(', data, text); +// createParentheisisInfo(')', data, text); +// createParentheisisInfo('{', data, text); +// createParentheisisInfo('}', data, text); +// createParentheisisInfo('[', data, text); +// createParentheisisInfo(']', data, text); + + setCurrentBlockUserData(data); +} + +bool ScriptHighlighter::isKeyWord(const QString& word) +{ + for (int i = 0; i < KEYWORDS_COUNT-1; ++i){ + if (QLatin1String(keywords[i]) == word) return true; + } + return false; +} + +bool ScriptHighlighter::isDark(QColor color) +{ + double a = 1 - ( 0.299 * color.red() + 0.587 * color.green() + 0.114 * color.blue()) / 255; + return (a < 0.5); +} + +ScriptHighlighter::ScriptHighlighter(QTextDocument* parent): + QSyntaxHighlighter(parent) +{ + + if ( isDark(QPalette().background().color())){ + m_formats[NumberFormat].setForeground(Qt::darkBlue); + m_formats[StringFormat].setForeground(Qt::darkGreen); + m_formats[KeywordFormat].setForeground(Qt::darkYellow); + m_formats[CommentFormat].setForeground(Qt::darkGreen); + m_formats[CommentFormat].setFontItalic(true); + } else { + m_formats[NumberFormat].setForeground(QColor("#ff6aad")); + m_formats[StringFormat].setForeground(QColor("#b27f40")); + m_formats[KeywordFormat].setForeground(QColor("#45c5d5")); + m_formats[CommentFormat].setForeground(QColor("#a1a4a9")); + m_formats[CommentFormat].setFontItalic(true); + } +} + +QVector TextBlockData::parentheses() +{ + return m_parentheses; +} + +void TextBlockData::insert(ParenthesisInfo* info) +{ + int i = 0; + while (i < m_parentheses.size() && + info->position > m_parentheses.at(i)->position) + ++i; + + m_parentheses.insert(i, info); } } // namespace LimeReport diff --git a/limereport/scripteditor/lrscripthighlighter.h b/limereport/scripteditor/lrscripthighlighter.h index 3a54693..4580484 100644 --- a/limereport/scripteditor/lrscripthighlighter.h +++ b/limereport/scripteditor/lrscripthighlighter.h @@ -5,13 +5,46 @@ namespace LimeReport{ +enum ParenthesisType {LeftParenthesis, RightParenthesis, ParenthesisTypeCount}; + +#define PARENHEIS_COUNT 3 +const QChar parenthesisCharacters[ParenthesisTypeCount][PARENHEIS_COUNT] = { + {'(', '{', '['}, + {')', '}', ']'} +}; + +struct ParenthesisInfo +{ + char character; + int position; +}; + +class TextBlockData : public QTextBlockUserData +{ +public: + TextBlockData(){} + QVector parentheses(); + void insert(ParenthesisInfo *info); + +private: + QVector m_parentheses; +}; + class ScriptHighlighter : QSyntaxHighlighter{ public: - ScriptHighlighter(QTextDocument* parent): QSyntaxHighlighter(parent){} - // QSyntaxHighlighter interface + ScriptHighlighter(QTextDocument* parent); protected: void highlightBlock(const QString& text); + enum ScriptFormats { + NumberFormat, StringFormat, KeywordFormat, + CommentFormat, FormatsCount + }; + QTextCharFormat m_formats[FormatsCount]; + bool isKeyWord(const QString& word); + bool isDark(QColor color); + void createParentheisisInfo(const char& literal, TextBlockData *data, const QString& text); }; + } #endif // LRSCRIPTHIGHLIGHTER_H From 1af031f19c6f398f9e87425d47ee72d5010088ba Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 19 Sep 2017 21:02:55 +0300 Subject: [PATCH 059/347] The update of data sources was added if they contain changed variables --- limereport/lrdatasourcemanager.cpp | 45 ++++++++++++++++++++++++++++ limereport/lrdatasourcemanager.h | 10 +++++-- limereport/lrscriptenginemanager.cpp | 22 ++++++++++++++ limereport/lrscriptenginemanager.h | 2 ++ limereport/lrvariablesholder.cpp | 3 ++ limereport/lrvariablesholder.h | 3 ++ 6 files changed, 82 insertions(+), 3 deletions(-) diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 09cf5c6..55ba747 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -229,6 +229,17 @@ DataSourceManager::DataSourceManager(QObject *parent) : setSystemVariable(QLatin1String("#IS_LAST_PAGEFOOTER"),false,FirstPass); setSystemVariable(QLatin1String("#IS_FIRST_PAGEFOOTER"),false,FirstPass); m_datasourcesModel.setDataSourceManager(this); + + connect(&m_reportVariables, SIGNAL(variableHasBeenAdded(QString)), + this, SLOT(slotVariableHasBeenAdded(QString)) ); + connect(&m_reportVariables, SIGNAL(variableHasBeenChanged(QString)), + this, SLOT(slotVariableHasBeenChanged(QString))); + connect(&m_userVariables, SIGNAL(variableHasBeenAdded(QString)), + this, SLOT(slotVariableHasBeenAdded(QString)) ); + connect(&m_userVariables, SIGNAL(variableHasBeenChanged(QString)), + this, SLOT(slotVariableHasBeenChanged(QString))); + + } QString DataSourceManager::defaultDatabasePath() const @@ -1188,6 +1199,7 @@ void DataSourceManager::changeVariable(const QString& name,const QVariant& value if (m_reportVariables.containsVariable(name)){ m_reportVariables.changeVariable(name,value); } + } void DataSourceManager::setSystemVariable(const QString &name, const QVariant &value, RenderPass pass) @@ -1236,6 +1248,30 @@ void DataSourceManager::slotQueryTextChanged(const QString &queryName, const QSt } } +void DataSourceManager::invalidateQueriesContainsVariable(const QString& variableName) +{ + foreach (const QString& datasourceName, dataSourceNames()){ + QueryHolder* holder = dynamic_cast(m_datasources.value(datasourceName)); + if (holder){ + QRegExp rx(QString(Const::NAMED_VARIABLE_RX).arg(variableName)); + if (holder->queryText().contains(rx)) + holder->invalidate(designTime()?IDataSource::DESIGN_MODE:IDataSource::RENDER_MODE); + } + } +} + +void DataSourceManager::slotVariableHasBeenAdded(const QString& variableName) +{ + //qDebug()<< "variable has been added"<< variableName; + invalidateQueriesContainsVariable(variableName); +} + +void DataSourceManager::slotVariableHasBeenChanged(const QString& variableName) +{ + //qDebug()<< "variable has been changed"<< variableName; + invalidateQueriesContainsVariable(variableName); +} + void DataSourceManager::clear(ClearMethod method) { DataSourcesMap::iterator dit; @@ -1386,6 +1422,15 @@ QVariant DataSourceManager::fieldDataByKey(const QString& datasourceName, const return QVariant(); } +void DataSourceManager::reopenDatasource(const QString& datasourceName) +{ + QueryHolder* qh = dynamic_cast(dataSourceHolder(datasourceName)); + if (qh){ + qh->invalidate(designTime()?IDataSource::DESIGN_MODE:IDataSource::RENDER_MODE); + invalidateChildren(datasourceName); + } +} + QVariant DataSourceManager::variable(const QString &variableName) { if (m_userVariables.containsVariable(variableName)) diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index 5483b55..285a258 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -160,14 +160,15 @@ public: QStringList dataSourceNames(const QString& connectionName); QStringList connectionNames(); QStringList fieldNames(const QString& datasourceName); - bool containsField(const QString& fieldName); - QVariant fieldData(const QString& fieldName); - QVariant fieldDataByKey( + bool containsField(const QString& fieldName); + QVariant fieldData(const QString& fieldName); + QVariant fieldDataByKey( const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue ); + void reopenDatasource(const QString& datasourceName); QString extractDataSource(const QString& fieldName); QString extractFieldName(const QString& fieldName); @@ -231,9 +232,12 @@ protected: void setLastError(const QString& value); void invalidateLinkedDatasources(QString datasourceName); bool checkConnection(QSqlDatabase db); + void invalidateQueriesContainsVariable(const QString& variableName); private slots: void slotConnectionRenamed(const QString& oldName,const QString& newName); void slotQueryTextChanged(const QString& queryName, const QString& queryText); + void slotVariableHasBeenAdded(const QString& variableName); + void slotVariableHasBeenChanged(const QString& variableName); private: explicit DataSourceManager(QObject *parent = 0); bool initAndOpenDB(QSqlDatabase &db, ConnectionDesc &connectionDesc); diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 0780951..6ad79c6 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -813,6 +813,21 @@ bool ScriptEngineManager::createClearTableOfContensFunction() return addFunction(fd); } +bool ScriptEngineManager::createReopenDatasourceFunction() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory(tr("GENERAL")); + fd.setName("reopenDatasource"); + fd.setDescription("reopenDatasource(\""+tr("datasourceName")+"\")"); + fd.setScriptWrapper(QString("function reopenDatasource(datasourceName){" + "return %1.reopenDatasource(datasourceName);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + ScriptEngineManager::ScriptEngineManager() :m_model(0), m_dataManager(0) { @@ -850,6 +865,7 @@ ScriptEngineManager::ScriptEngineManager() #endif createAddTableOfContensItemFunction(); createClearTableOfContensFunction(); + createReopenDatasourceFunction(); m_model = new ScriptEngineModel(this); } @@ -1516,6 +1532,12 @@ QVariant ScriptFunctionsManager::getFieldByKeyField(const QString& datasourceNam return dm->fieldDataByKey(datasourceName, valueFieldName, keyFieldName, keyValue); } +void ScriptFunctionsManager::reopenDatasource(const QString& datasourceName) +{ + DataSourceManager* dm = scriptEngineManager()->dataManager(); + return dm->reopenDatasource(datasourceName); +} + void ScriptFunctionsManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int indent) { scriptEngineManager()->addTableOfContensItem(uniqKey, content, indent); diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 162a21e..3edd6dc 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -319,6 +319,7 @@ public: Q_INVOKABLE QVariant getVariable(const QString& name); Q_INVOKABLE QVariant getField(const QString& field); Q_INVOKABLE QVariant getFieldByKeyField(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue); + Q_INVOKABLE void reopenDatasource(const QString& datasourceName); Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} Q_INVOKABLE void addTableOfContensItem(const QString& uniqKey, const QString& content, int indent = 0); Q_INVOKABLE void clearTableOfContens(); @@ -390,6 +391,7 @@ private: bool createGetFieldByKeyFunction(); bool createAddTableOfContensItemFunction(); bool createClearTableOfContensFunction(); + bool createReopenDatasourceFunction(); private: ScriptEngineManager(); ScriptEngineType* m_scriptEngine; diff --git a/limereport/lrvariablesholder.cpp b/limereport/lrvariablesholder.cpp index dd46b4e..9cdf630 100644 --- a/limereport/lrvariablesholder.cpp +++ b/limereport/lrvariablesholder.cpp @@ -61,6 +61,7 @@ void VariablesHolder::addVariable(const QString& name, const QVariant& value, Va m_varNames.insert(name,varValue); if (type==VarDesc::Report) m_userVariables.append(varValue); + emit variableHasBeenAdded(name); } else { throw ReportError(tr("variable with name ")+name+tr(" already exists!")); } @@ -86,6 +87,7 @@ void VariablesHolder::deleteVariable(const QString &name) m_userVariables.removeOne(m_varNames.value(name)); delete m_varNames.value(name); m_varNames.remove(name); + emit variableHasBennDeleted(name); } } @@ -93,6 +95,7 @@ void VariablesHolder::changeVariable(const QString &name, const QVariant &value) { if(m_varNames.contains(name)) { m_varNames.value(name)->setValue(value); + emit variableHasBeenChanged(name); } else throw ReportError(tr("variable with name ")+name+tr(" does not exists!")); } diff --git a/limereport/lrvariablesholder.h b/limereport/lrvariablesholder.h index ede1ac6..e375ea8 100644 --- a/limereport/lrvariablesholder.h +++ b/limereport/lrvariablesholder.h @@ -92,6 +92,9 @@ public: int userVariablesCount(); VarDesc* userVariableAt(int index); signals: + void variableHasBeenAdded(const QString& variableName); + void variableHasBeenChanged(const QString& variableName); + void variableHasBennDeleted(const QString& variableName); private: QMap m_varNames; QList m_userVariables; From 47643349404d6a6d2f3b8b97462a89b0959961b2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Sep 2017 00:51:17 +0300 Subject: [PATCH 060/347] Script editor has been finishes --- limereport/lrreportdesignwidget.cpp | 21 ++- limereport/lrreportdesignwidget.h | 3 +- limereport/lrreportdesignwindow.cpp | 76 ++++++---- limereport/lrreportdesignwindow.h | 1 + limereport/scripteditor/lrscripteditor.cpp | 48 ++++++ limereport/scripteditor/lrscripteditor.h | 9 ++ limereport/scripteditor/lrscripteditor.ui | 162 +++++++++------------ 7 files changed, 191 insertions(+), 129 deletions(-) diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 2b7f160..0145940 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -184,6 +184,7 @@ void ReportDesignWidget::saveState(QSettings* settings) settings->setValue("vGridStep",m_verticalGridStep); settings->setValue("defaultFont",m_defaultFont); settings->setValue("useGrid",m_useGrid); + settings->setValue("ScriptEditorState", m_scriptEditor->saveState()); settings->endGroup(); } @@ -216,6 +217,12 @@ void ReportDesignWidget::loadState(QSettings* settings) if (v.isValid()){ m_useGrid = v.toBool(); } + + v = settings->value("ScriptEditorState"); + if (v.isValid()){ + m_scriptEditor->restoreState(v.toByteArray()); + } + settings->endGroup(); applySettings(); } @@ -242,17 +249,12 @@ void ReportDesignWidget::createTabs(){ this, SLOT(slotPagePropertyObjectNameChanged(QString,QString))); } - m_scriptEditor = new QTextEdit(this); + m_scriptEditor = new ScriptEditor(this); + m_scriptEditor->setReportEngine(m_report); pageIndex = m_tabWidget->addTab(m_scriptEditor,QIcon(),tr("Script")); m_tabWidget->setTabWhatsThis(pageIndex,"script"); m_tabWidget->setCurrentIndex(0); - m_newScriptEditor = new ScriptEditor(this); - m_newScriptEditor->setReportEngine(m_report); - pageIndex = m_tabWidget->addTab(m_newScriptEditor,QIcon(),tr("New Script Editor")); - m_tabWidget->setTabWhatsThis(pageIndex,"script"); - m_tabWidget->setCurrentIndex(0); - #ifdef HAVE_QTDESIGNER_INTEGRATION QWidget* dialogDesigner; foreach(DialogDescriber::Ptr dialogDesc, m_report->scriptContext()->dialogDescribers()){ @@ -442,9 +444,11 @@ bool ReportDesignWidget::save() bool ReportDesignWidget::loadFromFile(const QString &fileName) { if (m_report->loadFromFile(fileName,false)){ + QByteArray editorState = m_scriptEditor->saveState(); createTabs(); //connectPage(m_report->pageAt(0)); m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); + m_scriptEditor->restoreState(editorState); emit loaded(); m_dialogChanged = false; return true; @@ -796,7 +800,8 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) } if (activeTabType() == Script){ - m_newScriptEditor->initCompleter(); + m_scriptEditor->initCompleter(); + m_scriptEditor->setFocus(); } emit activePageChanged(); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index d710537..b7e38b7 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -191,8 +191,7 @@ private: private: ReportEnginePrivate* m_report; QGraphicsView *m_view; - QTextEdit* m_scriptEditor; - ScriptEditor* m_newScriptEditor; + ScriptEditor* m_scriptEditor; TranslationEditor* m_traslationEditor; #ifdef HAVE_QTDESIGNER_INTEGRATION DialogDesignerManager* m_dialogDesignerManager; diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 0bdae75..1ad41c7 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -664,14 +664,21 @@ void ReportDesignWindow::writeState() { settings()->beginGroup("DesignerWindow"); switch (m_editorTabType) { - case ReportDesignWidget::Page: - settings()->setValue("PageEditorsState", saveState()); - settings()->setValue("DialogEditorsState", m_dialogEditorsState); - break; - default: - settings()->setValue("DialogEditorsState", saveState()); - settings()->setValue("PageEditorsState", m_pageEditorsState); - break; + case ReportDesignWidget::Page: + settings()->setValue("PageEditorsState", saveState()); + settings()->setValue("DialogEditorsState", m_dialogEditorsState); + settings()->setValue("ScriptEditorsState", m_scriptEditorState); + break; + case ReportDesignWidget::Script: + settings()->setValue("ScriptEditorsState", saveState()); + settings()->setValue("DialogEditorsState", m_dialogEditorsState); + settings()->setValue("PageEditorsState", m_pageEditorsState); + break; + default: + settings()->setValue("DialogEditorsState", saveState()); + settings()->setValue("PageEditorsState", m_pageEditorsState); + settings()->setValue("ScriptEditorsState", m_scriptEditorState); + break; } settings()->setValue("InspectorFirsColumnWidth",m_objectInspector->columnWidth(0)); settings()->endGroup(); @@ -775,6 +782,10 @@ void ReportDesignWindow::restoreSetting() if (v.isValid()){ m_dialogEditorsState = v.toByteArray(); } + v = settings()->value("ScriptEditorsState"); + if (v.isValid()){ + m_scriptEditorState = v.toByteArray(); + } v = settings()->value("InspectorFirsColumnWidth"); if (v.isValid()){ m_objectInspector->setColumnWidth(0,v.toInt()); @@ -1277,12 +1288,15 @@ void ReportDesignWindow::slotActivePageChanged() updateAvaibleBands(); switch (m_editorTabType) { - case ReportDesignWidget::Dialog: - m_dialogEditorsState = saveState(); + case ReportDesignWidget::Dialog: + m_dialogEditorsState = saveState(); #ifdef HAVE_UI_LOADER - m_scriptBrowser->updateDialogsTree(); + m_scriptBrowser->updateDialogsTree(); #endif - break; + break; + case ReportDesignWidget::Script: + m_scriptEditorState = saveState(); + break; default: m_pageEditorsState = saveState(); break; @@ -1291,20 +1305,30 @@ void ReportDesignWindow::slotActivePageChanged() m_editorTabType = m_reportDesignWidget->activeTabType(); switch (m_editorTabType) { - case ReportDesignWidget::Dialog: - if (!m_dialogEditorsState.isEmpty()) - restoreState(m_dialogEditorsState); - else - showDefaultEditors(); - showDefaultToolBars(); - break; - default: - if (!m_pageEditors.isEmpty()) - restoreState(m_pageEditorsState); - else - showDefaultEditors(); - showDefaultToolBars(); - break; + case ReportDesignWidget::Dialog: + if (!m_dialogEditorsState.isEmpty()){ + restoreState(m_dialogEditorsState); + } else { + showDefaultEditors(); + showDefaultToolBars(); + } + break; + case ReportDesignWidget::Script: + if (!m_scriptEditorState.isEmpty()){ + restoreState(m_scriptEditorState); + } else { + showDefaultEditors(); + showDefaultToolBars(); + } + break; + default: + if (!m_pageEditors.isEmpty()){ + restoreState(m_pageEditorsState); + } else { + showDefaultEditors(); + showDefaultToolBars(); + } + break; } } diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 94c4bd5..1779ed3 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -264,6 +264,7 @@ private: ReportDesignWidget::EditorTabType m_editorTabType; QByteArray m_pageEditorsState; QByteArray m_dialogEditorsState; + QByteArray m_scriptEditorState; QVector m_pageTools; QVector m_dialogTools; diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 613926e..461a8f9 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -14,6 +14,7 @@ ScriptEditor::ScriptEditor(QWidget *parent) : ui(new Ui::ScriptEditor) { ui->setupUi(this); + setFocusProxy(ui->textEdit); m_completer = new QCompleter(this); ui->textEdit->setCompleter(m_completer); } @@ -78,6 +79,26 @@ void ScriptEditor::initCompleter() m_completer->setModel(new QStringListModel(dataWords,m_completer)); } +QByteArray ScriptEditor::saveState() +{ + return ui->splitter->saveState(); +} + +void ScriptEditor::restoreState(QByteArray state) +{ + ui->splitter->restoreState(state); +} + +void ScriptEditor::setPlainText(const QString& text) +{ + ui->textEdit->setPlainText(text); +} + +QString ScriptEditor::toPlainText() +{ + return ui->textEdit->toPlainText(); +} + void ScriptEditor::addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords) { BandDesignIntf* band = dynamic_cast(item); @@ -99,4 +120,31 @@ void ScriptEditor::addItemToCompleater(const QString& pageName, BaseDesignIntf* } } +void ScriptEditor::on_twData_doubleClicked(const QModelIndex &index) +{ + if (!index.isValid()) return; + LimeReport::DataNode* node = static_cast(index.internalPointer()); + if (node->type()==LimeReport::DataNode::Field){ + ui->textEdit->insertPlainText(QString("$D{%1.%2}").arg(node->parent()->name()).arg(node->name())); + } + if (node->type()==LimeReport::DataNode::Variable){ + ui->textEdit->insertPlainText(QString("$V{%1}").arg(node->name())); + } + ui->textEdit->setFocus(); +} + +void ScriptEditor::on_twScriptEngine_doubleClicked(const QModelIndex &index) +{ + if (!index.isValid()) return; + LimeReport::ScriptEngineNode* node = static_cast(index.internalPointer()); + if (node->type()==LimeReport::ScriptEngineNode::Function){ + ui->textEdit->insertPlainText(node->name()+"()"); + } + ui->textEdit->setFocus(); +} + } // namespace LimeReport + + + + diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index 6943fcb..eedb66d 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -24,6 +24,15 @@ public: ~ScriptEditor(); void setReportEngine(ReportEnginePrivate* reportEngine); void initCompleter(); + QByteArray saveState(); + void restoreState(QByteArray state); + void setPlainText(const QString &text); + QString toPlainText(); +private slots: + void on_twData_doubleClicked(const QModelIndex &index); + + void on_twScriptEngine_doubleClicked(const QModelIndex &index); + private: void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); private: diff --git a/limereport/scripteditor/lrscripteditor.ui b/limereport/scripteditor/lrscripteditor.ui index 49fcfb6..27f8e7f 100644 --- a/limereport/scripteditor/lrscripteditor.ui +++ b/limereport/scripteditor/lrscripteditor.ui @@ -13,116 +13,92 @@ Form - + - + 0 0 - - Content + + Qt::Horizontal - - - 2 + + + + 0 + 0 + - - 2 + + + 12 + - - 2 + + + + QTabWidget::South - - 2 + + 0 - - 2 - - - - - - 0 - 0 - + + + Data + + + + 3 - - Qt::Horizontal + + 3 - - - - 12 - - - - - - QTabWidget::South - - - 0 - - - - Data + + 3 + + + 3 + + + 3 + + + + + false - - - 3 - - - 3 - - - 3 - - - 3 - - - 3 - - - - - false - - - - - - - Functions - - - - - - Qt::Vertical - - - - false - - - - - - - - - - + + + + + + Functions + + + + + + Qt::Vertical + + + + false + + + + + + + - - - - + + +
+
From 2b708b38f58f1ac7c6145010a33bc4fc830a4fdc Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Sep 2017 22:25:50 +0300 Subject: [PATCH 061/347] Saving the designer state has been refactored --- limereport/lrreportdesignwidget.h | 3 +- limereport/lrreportdesignwindow.cpp | 101 +++++++++++----------------- limereport/lrreportdesignwindow.h | 5 +- 3 files changed, 44 insertions(+), 65 deletions(-) diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index b7e38b7..37aed74 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -71,7 +71,8 @@ public: Page, Dialog, Script, - Translations + Translations, + TabTypeCount }; ReportDesignWidget(ReportEngine* report, QMainWindow *mainWindow, QWidget *parent = 0); ~ReportDesignWidget(); diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 1ad41c7..657f289 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -63,7 +63,8 @@ namespace LimeReport{ ReportDesignWindow* ReportDesignWindow::m_instance=0; ReportDesignWindow::ReportDesignWindow(ReportEngine *report, QWidget *parent, QSettings* settings) : - QMainWindow(parent), m_textAttibutesIsChanging(false), m_settings(settings), m_ownedSettings(false), m_progressDialog(0), m_showProgressDialog(true) + QMainWindow(parent), m_textAttibutesIsChanging(false), m_settings(settings), m_ownedSettings(false), + m_progressDialog(0), m_showProgressDialog(true), m_editorTabType(ReportDesignWidget::Page) { initReportEditor(report); createActions(); @@ -92,8 +93,7 @@ ReportDesignWindow::ReportDesignWindow(ReportEngine *report, QWidget *parent, QS showDefaultToolBars(); restoreSetting(); m_hideLeftPanel->setChecked(isDockAreaVisible(Qt::LeftDockWidgetArea)); - m_hideRightPanel->setChecked(isDockAreaVisible(Qt::RightDockWidgetArea)); - m_editorTabType = ReportDesignWidget::Page; + m_hideRightPanel->setChecked(isDockAreaVisible(Qt::RightDockWidgetArea)); } ReportDesignWindow::~ReportDesignWindow() @@ -663,23 +663,12 @@ void ReportDesignWindow::writePosition() void ReportDesignWindow::writeState() { settings()->beginGroup("DesignerWindow"); - switch (m_editorTabType) { - case ReportDesignWidget::Page: - settings()->setValue("PageEditorsState", saveState()); - settings()->setValue("DialogEditorsState", m_dialogEditorsState); - settings()->setValue("ScriptEditorsState", m_scriptEditorState); - break; - case ReportDesignWidget::Script: - settings()->setValue("ScriptEditorsState", saveState()); - settings()->setValue("DialogEditorsState", m_dialogEditorsState); - settings()->setValue("PageEditorsState", m_pageEditorsState); - break; - default: - settings()->setValue("DialogEditorsState", saveState()); - settings()->setValue("PageEditorsState", m_pageEditorsState); - settings()->setValue("ScriptEditorsState", m_scriptEditorState); - break; - } + + m_editorsStates[m_editorTabType] = saveState(); + settings()->setValue("PageEditorsState", m_editorsStates[ReportDesignWidget::Page]); + settings()->setValue("DialogEditorsState", m_editorsStates[ReportDesignWidget::Dialog]); + settings()->setValue("ScriptEditorsState", m_editorsStates[ReportDesignWidget::Script]); + settings()->setValue("TranslationEditorsState", m_editorsStates[ReportDesignWidget::Translations]); settings()->setValue("InspectorFirsColumnWidth",m_objectInspector->columnWidth(0)); settings()->endGroup(); settings()->beginGroup("RecentFiles"); @@ -774,18 +763,23 @@ void ReportDesignWindow::restoreSetting() } v = settings()->value("PageEditorsState"); if (v.isValid()){ - m_pageEditorsState = v.toByteArray(); - restoreState(v.toByteArray()); + m_editorsStates[ReportDesignWidget::Page] = v.toByteArray(); m_editorTabType = ReportDesignWidget::Page; } v = settings()->value("DialogEditorsState"); if (v.isValid()){ - m_dialogEditorsState = v.toByteArray(); + m_editorsStates[ReportDesignWidget::Dialog] = v.toByteArray(); } v = settings()->value("ScriptEditorsState"); if (v.isValid()){ - m_scriptEditorState = v.toByteArray(); + m_editorsStates[ReportDesignWidget::Script] = v.toByteArray(); } + + v = settings()->value("TranslationEditorsState"); + if (v.isValid()){ + m_editorsStates[ReportDesignWidget::Translations] = v.toByteArray(); + } + v = settings()->value("InspectorFirsColumnWidth"); if (v.isValid()){ m_objectInspector->setColumnWidth(0,v.toInt()); @@ -1087,7 +1081,7 @@ void ReportDesignWindow::slotLoadReport() setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); addRecentFile(fileName); m_editorTabType = ReportDesignWidget::Page; - showDefaultToolBars(); + //showDefaultToolBars(); showDefaultEditors(); } } @@ -1287,48 +1281,20 @@ void ReportDesignWindow::slotActivePageChanged() updateRedoUndo(); updateAvaibleBands(); - switch (m_editorTabType) { - case ReportDesignWidget::Dialog: - m_dialogEditorsState = saveState(); + if (m_editorTabType == ReportDesignWidget::Dialog){ #ifdef HAVE_UI_LOADER - m_scriptBrowser->updateDialogsTree(); + m_scriptBrowser->updateDialogsTree(); #endif - break; - case ReportDesignWidget::Script: - m_scriptEditorState = saveState(); - break; - default: - m_pageEditorsState = saveState(); - break; } + m_editorsStates[m_editorTabType] = saveState(); m_editorTabType = m_reportDesignWidget->activeTabType(); - switch (m_editorTabType) { - case ReportDesignWidget::Dialog: - if (!m_dialogEditorsState.isEmpty()){ - restoreState(m_dialogEditorsState); - } else { - showDefaultEditors(); - showDefaultToolBars(); - } - break; - case ReportDesignWidget::Script: - if (!m_scriptEditorState.isEmpty()){ - restoreState(m_scriptEditorState); - } else { - showDefaultEditors(); - showDefaultToolBars(); - } - break; - default: - if (!m_pageEditors.isEmpty()){ - restoreState(m_pageEditorsState); - } else { - showDefaultEditors(); - showDefaultToolBars(); - } - break; + if (!m_editorsStates[m_editorTabType].isEmpty()){ + restoreState(m_editorsStates[m_editorTabType]); + } else { + showDefaultEditors(); + showDefaultToolBars(); } } @@ -1474,6 +1440,19 @@ void ReportDesignWindow::resizeEvent(QResizeEvent*) #endif } +void ReportDesignWindow::showEvent(QShowEvent* event) +{ + QMainWindow::showEvent(event); + + if (!m_editorsStates[m_editorTabType].isEmpty()){ + restoreState(m_editorsStates[m_editorTabType]); + } else { + showDefaultEditors(); + showDefaultToolBars(); + } + +} + void ReportDesignWindow::moveEvent(QMoveEvent*) { #ifdef Q_OS_UNIX diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 1779ed3..9a96845 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -126,6 +126,7 @@ private slots: protected: void closeEvent(QCloseEvent *event); void resizeEvent(QResizeEvent *); + void showEvent(QShowEvent* event); void moveEvent(QMoveEvent *); void hideDockWidgets(Qt::DockWidgetArea area, bool value); bool isDockAreaVisible(Qt::DockWidgetArea area); @@ -262,9 +263,7 @@ private: QVector m_dialogEditors; QVector m_docksToTabify; ReportDesignWidget::EditorTabType m_editorTabType; - QByteArray m_pageEditorsState; - QByteArray m_dialogEditorsState; - QByteArray m_scriptEditorState; + QByteArray m_editorsStates[ReportDesignWidget::TabTypeCount]; QVector m_pageTools; QVector m_dialogTools; From fcf165df66e3978e7c3722f4ff6cd8bd26a90486 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 21 Sep 2017 00:44:09 +0300 Subject: [PATCH 062/347] TextItem editor has been refactored --- limereport/items/lrtextitemeditor.cpp | 254 +++------------------ limereport/items/lrtextitemeditor.h | 48 ++-- limereport/items/lrtextitemeditor.ui | 105 ++------- limereport/scripteditor/lrscripteditor.cpp | 67 +++++- limereport/scripteditor/lrscripteditor.h | 11 +- 5 files changed, 135 insertions(+), 350 deletions(-) diff --git a/limereport/items/lrtextitemeditor.cpp b/limereport/items/lrtextitemeditor.cpp index f46333d..37ac44d 100644 --- a/limereport/items/lrtextitemeditor.cpp +++ b/limereport/items/lrtextitemeditor.cpp @@ -33,6 +33,7 @@ #include "lrdatasourcemanager.h" #include "lrscriptenginemanager.h" #include "lrdatadesignintf.h" +#include "lrscripteditor.h" #include #include @@ -45,10 +46,9 @@ TextItemEditor::TextItemEditor(LimeReport::TextItem *item, LimeReport::PageDesig { ui->setupUi(this); initUI(); - m_teContent->setPlainText(item->content()); - m_teContent->setFocus(); setWindowIcon(QIcon(":/items/images/TextItem")); readSetting(); + connect(ui->codeEditor, SIGNAL(splitterMoved(int,int)), this, SLOT(slotSplitterMoved(int,int)) ); } TextItemEditor::~TextItemEditor() @@ -96,10 +96,20 @@ void TextItemEditor::moveEvent(QMoveEvent*) #endif } +void TextItemEditor::closeEvent(QCloseEvent* event) +{ + if (settings()!=0){ + settings()->beginGroup("TextItemEditor"); + settings()->setValue("CodeEditorState",ui->codeEditor->saveState()); + settings()->endGroup(); + } + QWidget::closeEvent(event); +} + void TextItemEditor::on_pbOk_clicked() { - if (m_textItem->content()!=m_teContent->toPlainText()){ - m_textItem->setContent(m_teContent->toPlainText()); + if (m_textItem->content()!= ui->codeEditor->toPlainText()){ + m_textItem->setContent(ui->codeEditor->toPlainText()); } close(); } @@ -107,84 +117,19 @@ void TextItemEditor::on_pbOk_clicked() void TextItemEditor::initUI() { QStringList dataWords; - m_teContent = ui->textEdit; - m_completer = new QCompleter(this); - m_teContent->setCompleter(m_completer); - - m_datasourcesMenu = new QMenu(this); + ui->toolButton->setChecked(false); + ui->gbSettings->setVisible(false); LimeReport::DataSourceManager* dm = m_page->datasourceManager(); LimeReport::ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); se.setDataManager(dm); - if (dm){ - if (dm->isNeedUpdateDatasourceModel()) - dm->updateDatasourceModel(); - ui->twData->setModel(dm->datasourcesModel()); - ui->twScriptEngine->setModel(se.model()); - - foreach(const QString &dsName,dm->dataSourceNames()){ - foreach(const QString &field, dm->fieldNames(dsName)){ - dataWords<tabWidget->setVisible(false); + ScriptEditor* scriptEditor = dynamic_cast(ui->codeEditor); + if (scriptEditor){ + scriptEditor->setReportPage(m_page); + scriptEditor->setPageBand(findParentBand()); + scriptEditor->setPlainText(m_textItem->content()); } - - foreach (LimeReport::ScriptFunctionDesc functionDesc, se.functionsDescribers()) { - dataWords<setModel(new QStringListModel(dataWords,m_completer)); - ui->gbSettings->setVisible(false); - - if (ui->twScriptEngine->selectionModel()){ - connect(ui->twScriptEngine->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), - this, SLOT(slotScriptItemsSelectionChanged(QModelIndex,QModelIndex))); - } - - BandDesignIntf* band = findParentBand(); - if (band && ui->twData->model() && !band->datasourceName().isEmpty()){ - QModelIndexList nodes = ui->twData->model()->match( - ui->twData->model()->index(0,0), - Qt::DisplayRole, - band->datasourceName(), - 2, - Qt::MatchRecursive - ); - if (!nodes.isEmpty()){ - ui->twData->expand(nodes.at(0).parent()); - ui->twData->expand(nodes.at(0)); - } - } -} - -QStringListModel *TextItemEditor::getDataSources() -{ - LimeReport::DataSourceManager* dm = m_page->datasourceManager(); - QStringList dataSources; - foreach(QString dsName,dm->dataSourceNames()){ - dataSources<datasourceManager(); - foreach(QString field, dm->fieldNames(datasource)){ - fields<(sender()); - m_teContent->insertPlainText(action->whatsThis()); -} - void TextItemEditor::readSetting() { if (settings()==0) return; @@ -209,16 +148,16 @@ void TextItemEditor::readSetting() if (v.isValid()){ restoreGeometry(v.toByteArray()); } - v = settings()->value("State"); + v = settings()->value("CodeEditorState"); if (v.isValid()){ - ui->splitter->restoreState(v.toByteArray()); + ui->codeEditor->restoreState(v.toByteArray()); } QVariant fontName = settings()->value("FontName"); if (fontName.isValid()){ QVariant fontSize = settings()->value("FontSize"); - ui->textEdit->setFont(QFont(fontName.toString(),fontSize.toInt())); - ui->editorFont->setCurrentFont(ui->textEdit->font()); + ui->codeEditor->setEditorFont(QFont(fontName.toString(),fontSize.toInt())); + ui->editorFont->setCurrentFont(ui->codeEditor->editorFont()); ui->editorFontSize->setValue(fontSize.toInt()); } settings()->endGroup(); @@ -231,136 +170,19 @@ void TextItemEditor::writeSetting() if (settings()!=0){ settings()->beginGroup("TextItemEditor"); settings()->setValue("Geometry",saveGeometry()); - settings()->setValue("State",ui->splitter->saveState()); + settings()->setValue("CodeEditorState",ui->codeEditor->saveState()); settings()->endGroup(); } } - -CompleaterTextEditor::CompleaterTextEditor(QWidget *parent) - : QTextEdit(parent),m_compleater(0) -{ -} - -void CompleaterTextEditor::setCompleter(QCompleter *value) -{ - if (value) disconnect(value,0,this,0); - m_compleater = value; - if (!m_compleater) return; - m_compleater->setWidget(this); - m_compleater->setCompletionMode(QCompleter::PopupCompletion); - m_compleater->setCaseSensitivity(Qt::CaseInsensitive); - connect(m_compleater,SIGNAL(activated(QString)),this,SLOT(insertCompletion(QString))); -} - -void CompleaterTextEditor::keyPressEvent(QKeyEvent *e) -{ - if (m_compleater && m_compleater->popup()->isVisible()) { - switch (e->key()) { - case Qt::Key_Enter: - case Qt::Key_Return: - case Qt::Key_Escape: - case Qt::Key_Tab: - case Qt::Key_Backtab: - e->ignore(); - return; - default: - break; - } - } - - bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E); - if (!m_compleater || !isShortcut) QTextEdit::keyPressEvent(e); - - const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); - if (!m_compleater || (ctrlOrShift && e->text().isEmpty())) - return; - - static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word - bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; - - QString completionPrefix = textUnderCursor(); - - if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3 - || eow.contains(e->text().right(1)))) { - m_compleater->popup()->hide(); - return; - } - - if (completionPrefix != m_compleater->completionPrefix()) { - m_compleater->setCompletionPrefix(completionPrefix); - m_compleater->popup()->setCurrentIndex(m_compleater->completionModel()->index(0, 0)); - } - - QRect cr = cursorRect(); - cr.setWidth(m_compleater->popup()->sizeHintForColumn(0) - + m_compleater->popup()->verticalScrollBar()->sizeHint().width()); - m_compleater->complete(cr); - -} - -void CompleaterTextEditor::focusInEvent(QFocusEvent *e) -{ - if (m_compleater) m_compleater->setWidget(this); - QTextEdit::focusInEvent(e); -} - -QString CompleaterTextEditor::textUnderCursor() const -{ - QTextCursor tc = textCursor(); - tc.select(QTextCursor::WordUnderCursor); - return tc.selectedText(); -} - - -void CompleaterTextEditor::insertCompletion(const QString &completion) -{ - if (m_compleater->widget() != this) - return; - QTextCursor tc = textCursor(); - int extra = completion.length() - m_compleater->completionPrefix().length(); - tc.movePosition(QTextCursor::Left); - tc.movePosition(QTextCursor::EndOfWord); - tc.insertText(completion.right(extra)); - setTextCursor(tc); -} - -void TextItemEditor::on_twData_doubleClicked(const QModelIndex &index) -{ - if (!index.isValid()) return; - LimeReport::DataNode* node = static_cast(index.internalPointer()); - if (node->type()==LimeReport::DataNode::Field){ - m_teContent->insertPlainText(QString("$D{%1.%2}").arg(node->parent()->name()).arg(node->name())); - } - if (node->type()==LimeReport::DataNode::Variable){ - m_teContent->insertPlainText(QString("$V{%1}").arg(node->name())); - } -} - -void TextItemEditor::on_twScriptEngine_doubleClicked(const QModelIndex &index) -{ - if (!index.isValid()) return; - LimeReport::ScriptEngineNode* node = static_cast(index.internalPointer()); - if (node->type()==LimeReport::ScriptEngineNode::Function){ - m_teContent->insertPlainText(node->name()+"()"); - } -} - -void TextItemEditor::on_splitter_splitterMoved(int , int ) -{ -#ifdef unix - writeSetting(); -#endif -} - void TextItemEditor::on_editorFont_currentFontChanged(const QFont &f) { if (m_isReadingSetting) return; QFont tmp = f; tmp.setPointSize(ui->editorFontSize->value()); - ui->textEdit->setFont(tmp); + ui->codeEditor->setEditorFont(tmp); settings()->beginGroup("TextItemEditor"); - settings()->setValue("FontName",ui->textEdit->font().family()); + settings()->setValue("FontName",ui->codeEditor->editorFont().family()); settings()->setValue("FontSize",ui->editorFontSize->value()); settings()->endGroup(); } @@ -368,9 +190,9 @@ void TextItemEditor::on_editorFont_currentFontChanged(const QFont &f) void TextItemEditor::on_editorFontSize_valueChanged(int arg1) { if (m_isReadingSetting) return; - ui->textEdit->setFont(QFont(ui->textEdit->font().family(),arg1)); + ui->codeEditor->setEditorFont(QFont(ui->codeEditor->editorFont().family(),arg1)); settings()->beginGroup("TextItemEditor"); - settings()->setValue("FontName",ui->textEdit->font().family()); + settings()->setValue("FontName",ui->codeEditor->editorFont().family()); settings()->setValue("FontSize",ui->editorFontSize->value()); settings()->endGroup(); } @@ -380,21 +202,9 @@ void TextItemEditor::on_toolButton_clicked(bool checked) ui->gbSettings->setVisible(checked); } - -void TextItemEditor::on_twScriptEngine_activated(const QModelIndex &index) +void TextItemEditor::slotSplitterMoved(int, int) { - LimeReport::ScriptEngineNode* node = static_cast(index.internalPointer()); - if (node->type()==LimeReport::ScriptEngineNode::Function){ - ui->lblDescription->setText(node->name()); - } -} - -void TextItemEditor::slotScriptItemsSelectionChanged(const QModelIndex &to, const QModelIndex) -{ - LimeReport::ScriptEngineNode* node = static_cast(to.internalPointer()); - if (node->type()==LimeReport::ScriptEngineNode::Function){ - ui->lblDescription->setText(node->description()); - } + writeSetting(); } BandDesignIntf *TextItemEditor::findParentBand() diff --git a/limereport/items/lrtextitemeditor.h b/limereport/items/lrtextitemeditor.h index cf02781..43b41ad 100644 --- a/limereport/items/lrtextitemeditor.h +++ b/limereport/items/lrtextitemeditor.h @@ -43,23 +43,23 @@ namespace Ui { class TextItemEditor; } -class CompleaterTextEditor :public QTextEdit -{ - Q_OBJECT -public: - CompleaterTextEditor(QWidget* parent=0); - void setCompleter(QCompleter* value); - QCompleter* compleater() const{ return m_compleater;} -protected: - virtual void keyPressEvent(QKeyEvent *e); - virtual void focusInEvent(QFocusEvent *e); -private: - QString textUnderCursor() const; -private slots: - void insertCompletion(const QString& completion); -private: - QCompleter* m_compleater; -}; +//class CompleaterTextEditor :public QTextEdit +//{ +// Q_OBJECT +//public: +// CompleaterTextEditor(QWidget* parent=0); +// void setCompleter(QCompleter* value); +// QCompleter* compleater() const{ return m_compleater;} +//protected: +// virtual void keyPressEvent(QKeyEvent *e); +// virtual void focusInEvent(QFocusEvent *e); +//private: +// QString textUnderCursor() const; +//private slots: +// void insertCompletion(const QString& completion); +//private: +// QCompleter* m_compleater; +//}; class TextItemEditor : public QWidget { @@ -73,33 +73,23 @@ public: protected: void resizeEvent(QResizeEvent *); void moveEvent(QMoveEvent *); + void closeEvent(QCloseEvent *event); BandDesignIntf* findParentBand(); private slots: void on_pbOk_clicked(); void on_pbCancel_clicked(); - void slotFieldSelected(); - void on_twData_doubleClicked(const QModelIndex &index); - void on_twScriptEngine_doubleClicked(const QModelIndex &index); - void on_splitter_splitterMoved(int, int); void on_editorFont_currentFontChanged(const QFont &f); void on_editorFontSize_valueChanged(int arg1); void on_toolButton_clicked(bool checked); - void on_twScriptEngine_activated(const QModelIndex &index); - void slotScriptItemsSelectionChanged(const QModelIndex &to, const QModelIndex); + void slotSplitterMoved(int, int); private: void initUI(); void readSetting(); void writeSetting(); - QStringListModel* getDataSources(); - QStringListModel* getPrefixes(); - QStringListModel* getColumns(QString datasource); private: Ui::TextItemEditor *ui; LimeReport::TextItem* m_textItem; LimeReport::PageDesignIntf* m_page; - QMenu* m_datasourcesMenu; - CompleaterTextEditor* m_teContent; - QCompleter* m_completer; QSettings* m_settings; bool m_ownedSettings; bool m_isReadingSetting; diff --git a/limereport/items/lrtextitemeditor.ui b/limereport/items/lrtextitemeditor.ui index 9030fdb..f9d74e4 100644 --- a/limereport/items/lrtextitemeditor.ui +++ b/limereport/items/lrtextitemeditor.ui @@ -9,15 +9,15 @@ 0 0 - 539 - 436 + 457 + 366 Text Item Editor - + :/items/images/insert-text_3.png:/items/images/insert-text_3.png @@ -33,9 +33,6 @@ Content - - 2 - 2 @@ -49,84 +46,13 @@ 2 - - - - 0 - 0 - + + + + 0 + 0 + - - Qt::Horizontal - - - - - 12 - - - - - - QTabWidget::South - - - 0 - - - - Data - - - - 3 - - - 3 - - - 3 - - - 3 - - - 3 - - - - - false - - - - - - - - Functions - - - - - - Qt::Vertical - - - - false - - - - - - - - - - - - @@ -183,7 +109,7 @@ ... - + :/items/images/settings.png:/items/images/settings.png @@ -233,17 +159,16 @@ - CompleaterTextEditor - QTextEdit -
lrtextitemeditor.h
+ LimeReport::ScriptEditor + QWidget +
lrscripteditor.h
+ 1
pbOk pbCancel - - - + diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 461a8f9..263eff3 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -11,12 +11,13 @@ namespace LimeReport{ ScriptEditor::ScriptEditor(QWidget *parent) : QWidget(parent), - ui(new Ui::ScriptEditor) + ui(new Ui::ScriptEditor), m_reportEngine(0), m_page(0) { ui->setupUi(this); setFocusProxy(ui->textEdit); m_completer = new QCompleter(this); ui->textEdit->setCompleter(m_completer); + connect(ui->splitter, SIGNAL(splitterMoved(int,int)), this, SIGNAL(splitterMoved(int,int))); } ScriptEditor::~ScriptEditor() @@ -42,10 +43,50 @@ void ScriptEditor::setReportEngine(ReportEnginePrivate* reportEngine) } +void ScriptEditor::setReportPage(PageDesignIntf* page) +{ + m_page = page; + DataSourceManager* dm = page->datasourceManager(); + ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); + se.setDataManager(dm); + + initCompleter(); + + if (dm){ + if (dm->isNeedUpdateDatasourceModel()) + dm->updateDatasourceModel(); + ui->twData->setModel(dm->datasourcesModel()); + ui->twScriptEngine->setModel(se.model()); + } +} + +void ScriptEditor::setPageBand(BandDesignIntf* band) +{ + if (band && ui->twData->model() && !band->datasourceName().isEmpty()){ + QModelIndexList nodes = ui->twData->model()->match( + ui->twData->model()->index(0,0), + Qt::DisplayRole, + band->datasourceName(), + 2, + Qt::MatchRecursive + ); + if (!nodes.isEmpty()){ + ui->twData->expand(nodes.at(0).parent()); + ui->twData->expand(nodes.at(0)); + } + } +} + void ScriptEditor::initCompleter() { QStringList dataWords; - DataSourceManager* dm = m_reportEngine->dataManager(); + + DataSourceManager* dm = 0; + if (m_reportEngine) + dm = m_reportEngine->dataManager(); + if (m_page) + dm = m_page->datasourceManager(); + ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); QJSValue globalObject = se.scriptEngine()->globalObject(); @@ -68,11 +109,13 @@ void ScriptEditor::initCompleter() dataWords << varName.remove("#"); } - for ( int i = 0; i < m_reportEngine->pageCount(); ++i){ - PageDesignIntf* page = m_reportEngine->pageAt(i); - dataWords << page->pageItem()->objectName(); - foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ - addItemToCompleater(page->pageItem()->objectName(), item, dataWords); + if (m_reportEngine){ + for ( int i = 0; i < m_reportEngine->pageCount(); ++i){ + PageDesignIntf* page = m_reportEngine->pageAt(i); + dataWords << page->pageItem()->objectName(); + foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ + addItemToCompleater(page->pageItem()->objectName(), item, dataWords); + } } } @@ -94,6 +137,16 @@ void ScriptEditor::setPlainText(const QString& text) ui->textEdit->setPlainText(text); } +void ScriptEditor::setEditorFont(QFont font) +{ + ui->textEdit->setFont(font); +} + +QFont ScriptEditor::editorFont() +{ + return ui->textEdit->font(); +} + QString ScriptEditor::toPlainText() { return ui->textEdit->toPlainText(); diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index eedb66d..fc7d7be 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -11,6 +11,8 @@ namespace LimeReport{ class ReportEnginePrivate; class BaseDesignIntf; +class PageDesignIntf; +class BandDesignIntf; namespace Ui { class ScriptEditor; @@ -23,21 +25,26 @@ public: explicit ScriptEditor(QWidget *parent = 0); ~ScriptEditor(); void setReportEngine(ReportEnginePrivate* reportEngine); + void setReportPage(PageDesignIntf* page); + void setPageBand(BandDesignIntf* band); void initCompleter(); QByteArray saveState(); void restoreState(QByteArray state); void setPlainText(const QString &text); + void setEditorFont(QFont font); + QFont editorFont(); QString toPlainText(); +signals: + void splitterMoved(int, int); private slots: void on_twData_doubleClicked(const QModelIndex &index); - void on_twScriptEngine_doubleClicked(const QModelIndex &index); - private: void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); private: Ui::ScriptEditor *ui; ReportEnginePrivate* m_reportEngine; + PageDesignIntf* m_page; QCompleter* m_completer; }; From af589e31ba0187fed6099b8a66e85a50edc474bd Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 26 Sep 2017 00:19:59 +0300 Subject: [PATCH 063/347] New functionality has been added to the report's variables --- include/lrdatasourcemanagerintf.h | 6 ++ include/lrglobal.h | 11 +++ limereport/databrowser/lrdatabrowser.cpp | 2 +- limereport/databrowser/lrvariabledialog.cpp | 46 +++++++++---- limereport/databrowser/lrvariabledialog.ui | 59 ++++++++-------- limereport/lrdatasourcemanager.cpp | 36 ++++++++-- limereport/lrdatasourcemanager.h | 12 ++-- limereport/lrdatasourcemanagerintf.h | 6 ++ limereport/lrglobal.h | 11 +++ limereport/lrvariablesholder.cpp | 74 ++++++++++++++++++++- limereport/lrvariablesholder.h | 51 +++++++++----- 11 files changed, 242 insertions(+), 72 deletions(-) diff --git a/include/lrdatasourcemanagerintf.h b/include/lrdatasourcemanagerintf.h index c0b345e..f86e51e 100644 --- a/include/lrdatasourcemanagerintf.h +++ b/include/lrdatasourcemanagerintf.h @@ -31,6 +31,7 @@ #define LRDATASOURCEMANAGERINTF_H #include "lrcallbackdatasourceintf.h" +#include "lrglobal.h" class QVariant; class QString; @@ -56,6 +57,11 @@ public: virtual void clearUserVariables()=0; virtual ICallbackDatasource* createCallbackDatasource(const QString& name) = 0; virtual void registerDbCredentialsProvider(IDbCredentialsProvider* provider) = 0; + + virtual QStringList variableNames() = 0; + virtual bool variableIsMandatory(const QString& name) = 0; + virtual VariableDataType variableDataType(const QString& name) = 0; + virtual bool variableIsSystem(const QString& name) = 0; }; } diff --git a/include/lrglobal.h b/include/lrglobal.h index a8ed17d..77156d3 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -157,6 +157,17 @@ namespace Const{ typedef QScriptValue ScriptValueType; #endif + class Enums + { + public: + enum VariableDataType {Undefined, String, Bool, Int, Real, Date, Time, DateTime}; + Q_ENUM(VariableDataType) + private: + Enums(){} + Q_GADGET + }; + typedef Enums::VariableDataType VariableDataType; + } // namespace LimeReport Q_DECLARE_OPERATORS_FOR_FLAGS(LimeReport::PreviewHints) diff --git a/limereport/databrowser/lrdatabrowser.cpp b/limereport/databrowser/lrdatabrowser.cpp index 0b4ac5a..79baae0 100644 --- a/limereport/databrowser/lrdatabrowser.cpp +++ b/limereport/databrowser/lrdatabrowser.cpp @@ -237,7 +237,7 @@ void DataBrowser::updateVariablesTree() } } - foreach(QString variableName,m_report->dataManager()->namesOfUserVariables()){ + foreach(QString variableName,m_report->dataManager()->userVariableNames()){ if (!m_report->dataManager()->variableNames().contains(variableName)){ QStringList values; values<dataManager()->variable(variableName).toString()+"]" diff --git a/limereport/databrowser/lrvariabledialog.cpp b/limereport/databrowser/lrvariabledialog.cpp index 4cebd55..d5c34d9 100644 --- a/limereport/databrowser/lrvariabledialog.cpp +++ b/limereport/databrowser/lrvariabledialog.cpp @@ -30,8 +30,10 @@ #include "lrvariabledialog.h" #include "ui_lrvariabledialog.h" #include "lrglobal.h" +#include "lrvariablesholder.h" #include #include +#include LRVariableDialog::LRVariableDialog(QWidget *parent) : QDialog(parent), @@ -42,8 +44,14 @@ LRVariableDialog::LRVariableDialog(QWidget *parent) : m_oldVariableName("") { ui->setupUi(this); - ui->cbbType->setVisible(false); - ui->lblType->setVisible(false); + + static int enumIndex = LimeReport::Enums::staticMetaObject.indexOfEnumerator("VariableDataType"); + QMetaEnum enumerator = LimeReport::Enums::staticMetaObject.enumerator(enumIndex); + for (int i = 0; icbbType->addItem(enumerator.key(i)); + } + //ui->cbbType->setVisible(false); + //ui->lblType->setVisible(false); } LRVariableDialog::~LRVariableDialog() @@ -66,28 +74,40 @@ void LRVariableDialog::setVariableName(const QString &value) void LRVariableDialog::showEvent(QShowEvent *) { ui->leName->setText(m_variableName); - if (!m_variableName.isEmpty()&&m_variablesContainer&&m_variablesContainer->containsVariable(m_variableName)){ + static int enumIndex = LimeReport::Enums::staticMetaObject.indexOfEnumerator("VariableDataType"); + QMetaEnum enumerator = LimeReport::Enums::staticMetaObject.enumerator(enumIndex); + if (!m_variableName.isEmpty()&&m_variablesContainer&&m_variablesContainer->containsVariable(m_variableName)){ ui->leValue->setText(m_variablesContainer->variable(m_variableName).toString()); + ui->cbbType->setCurrentText(enumerator.valueToKey(m_variablesContainer->variableDataType(m_variableName))); + ui->cbbMandatory->setChecked(m_variablesContainer->variableIsMandatory(m_variableName)); } } void LRVariableDialog::accept() { try{ - if (m_variablesContainer&&!ui->leName->text().isEmpty()){ - if (m_changeMode){ - if (m_oldVariableName==ui->leName->text()){ - m_variablesContainer->changeVariable(m_oldVariableName,value()); + static int enumIndex = LimeReport::Enums::staticMetaObject.indexOfEnumerator("VariableDataType"); + QMetaEnum enumerator = LimeReport::Enums::staticMetaObject.enumerator(enumIndex); + + if (m_variablesContainer&&!ui->leName->text().isEmpty()){ + if (m_changeMode){ + if (m_oldVariableName==ui->leName->text()){ + m_variablesContainer->changeVariable(m_oldVariableName,value()); + } else { + m_variablesContainer->deleteVariable(m_oldVariableName); + m_variablesContainer->addVariable(ui->leName->text(),value(), LimeReport::VarDesc::Report); + } } else { - m_variablesContainer->deleteVariable(m_oldVariableName); m_variablesContainer->addVariable(ui->leName->text(),value(), LimeReport::VarDesc::Report); } - } else { - m_variablesContainer->addVariable(ui->leName->text(),value(), LimeReport::VarDesc::Report); + m_variablesContainer->setVarableMandatory(ui->leName->text(),ui->cbbMandatory->isChecked()); + m_variablesContainer->setVariableDataType( + ui->leName->text(), + LimeReport::VariableDataType(enumerator.keysToValue(ui->cbbType->currentText().toLatin1())) + ); + emit signalVariableAccepted(ui->leName->text()); + QDialog::accept(); } - emit signalVariableAccepted(ui->leName->text()); - QDialog::accept(); - } } catch (LimeReport::ReportError &exception){ QMessageBox::critical(this,tr("Attention"),exception.what()); } diff --git a/limereport/databrowser/lrvariabledialog.ui b/limereport/databrowser/lrvariabledialog.ui index df97830..f372c73 100644 --- a/limereport/databrowser/lrvariabledialog.ui +++ b/limereport/databrowser/lrvariabledialog.ui @@ -6,8 +6,8 @@ 0 0 - 218 - 126 + 328 + 173
@@ -18,35 +18,8 @@ :/databrowser/images/value:/databrowser/images/value - - 2 - - - 4 - - - 4 - - - 4 - - - 4 - - - - 7 - - - 5 - - - 4 - - - 8 - + @@ -67,9 +40,6 @@ - - - @@ -77,8 +47,31 @@ + + + + + + + Mandatory + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index f7ba818..0e03986 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -211,7 +211,7 @@ void DataSourceModel::updateModel() } vars = m_rootNode->addChild(tr("External variables"),DataNode::Variables,QIcon(":/report/images/folder")); - foreach (QString name, m_dataManager->namesOfUserVariables()){ + foreach (QString name, m_dataManager->userVariableNames()){ vars->addChild(name,DataNode::Variable,QIcon(":/report/images/value")); } } @@ -1072,7 +1072,7 @@ int DataSourceManager::elementsCount(const QString &collectionName) return m_proxies.count(); } if (collectionName=="variables"){ - return m_reportVariables.userVariablesCount(); + return m_reportVariables.variablesCount(); } return 0; } @@ -1092,7 +1092,7 @@ QObject* DataSourceManager::elementAt(const QString &collectionName, int index) return m_proxies.at(index); } if (collectionName=="variables"){ - return m_reportVariables.userVariableAt(index); + return m_reportVariables.variableAt(index); } return 0; } @@ -1160,6 +1160,8 @@ void DataSourceManager::collectionLoadFinished(const QString &collectionName) foreach (VarDesc* item, m_tempVars) { if (!m_reportVariables.containsVariable(item->name())){ m_reportVariables.addVariable(item->name(),item->value(),VarDesc::Report,FirstPass); + VarDesc* currentVar = m_reportVariables.variableByName(item->name()); + currentVar->initFrom(item); } delete item; } @@ -1454,6 +1456,19 @@ bool DataSourceManager::variableIsSystem(const QString &name) return false; } +bool DataSourceManager::variableIsMandatory(const QString& name) +{ + if (m_reportVariables.containsVariable(name)) + return m_reportVariables.variableByName(name)->isMandatory(); + return false; +} + +void DataSourceManager::setVarableMandatory(const QString& name, bool value) +{ + if (m_reportVariables.containsVariable(name)) + m_reportVariables.variableByName(name)->setMandatory(value); +} + QStringList DataSourceManager::variableNames() { return m_reportVariables.variableNames(); @@ -1470,7 +1485,7 @@ QStringList DataSourceManager::variableNamesByRenderPass(RenderPass pass) return result; } -QStringList DataSourceManager::namesOfUserVariables(){ +QStringList DataSourceManager::userVariableNames(){ return m_userVariables.variableNames(); } @@ -1481,6 +1496,19 @@ VarDesc::VarType DataSourceManager::variableType(const QString &name) return VarDesc::User; } +VariableDataType DataSourceManager::variableDataType(const QString& name) +{ + if (m_reportVariables.containsVariable(name)) + return m_reportVariables.variableByName(name)->dataType(); + return VariableDataType::Undefined; +} + +void DataSourceManager::setVariableDataType(const QString& name, VariableDataType value) +{ + if (m_reportVariables.containsVariable(name)) + m_reportVariables.variableByName(name)->setDataType(value); +} + void DataSourceManager::setAllDatasourcesToFirst() { foreach(IDataSourceHolder* ds,m_datasources.values()) { diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index 285a258..628a5f5 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -123,13 +123,17 @@ public: void clearUserVariables(); void addVariable(const QString& name, const QVariant& value, VarDesc::VarType type=VarDesc::User, RenderPass pass=FirstPass); void changeVariable(const QString& name,const QVariant& value); - QVariant variable(const QString& variableName); - RenderPass variablePass(const QString& name); + QVariant variable(const QString& variableName); + RenderPass variablePass(const QString& name); QStringList variableNames(); QStringList variableNamesByRenderPass(RenderPass pass); - QStringList namesOfUserVariables(); - VarDesc::VarType variableType(const QString& name); + QStringList userVariableNames(); + VarDesc::VarType variableType(const QString& name); + VariableDataType variableDataType(const QString& name); + void setVariableDataType(const QString &name, VariableDataType value); bool variableIsSystem(const QString& name); + bool variableIsMandatory(const QString& name); + void setVarableMandatory(const QString &name, bool value); QString queryText(const QString& dataSourceName); QString connectionName(const QString& dataSourceName); void removeDatasource(const QString& name); diff --git a/limereport/lrdatasourcemanagerintf.h b/limereport/lrdatasourcemanagerintf.h index c0b345e..f86e51e 100644 --- a/limereport/lrdatasourcemanagerintf.h +++ b/limereport/lrdatasourcemanagerintf.h @@ -31,6 +31,7 @@ #define LRDATASOURCEMANAGERINTF_H #include "lrcallbackdatasourceintf.h" +#include "lrglobal.h" class QVariant; class QString; @@ -56,6 +57,11 @@ public: virtual void clearUserVariables()=0; virtual ICallbackDatasource* createCallbackDatasource(const QString& name) = 0; virtual void registerDbCredentialsProvider(IDbCredentialsProvider* provider) = 0; + + virtual QStringList variableNames() = 0; + virtual bool variableIsMandatory(const QString& name) = 0; + virtual VariableDataType variableDataType(const QString& name) = 0; + virtual bool variableIsSystem(const QString& name) = 0; }; } diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index a8ed17d..77156d3 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -157,6 +157,17 @@ namespace Const{ typedef QScriptValue ScriptValueType; #endif + class Enums + { + public: + enum VariableDataType {Undefined, String, Bool, Int, Real, Date, Time, DateTime}; + Q_ENUM(VariableDataType) + private: + Enums(){} + Q_GADGET + }; + typedef Enums::VariableDataType VariableDataType; + } // namespace LimeReport Q_DECLARE_OPERATORS_FOR_FLAGS(LimeReport::PreviewHints) diff --git a/limereport/lrvariablesholder.cpp b/limereport/lrvariablesholder.cpp index 9cdf630..c34dc4c 100644 --- a/limereport/lrvariablesholder.cpp +++ b/limereport/lrvariablesholder.cpp @@ -122,16 +122,50 @@ bool VariablesHolder::containsVariable(const QString &name) return m_varNames.contains(name); } -int VariablesHolder::userVariablesCount() +int VariablesHolder::variablesCount() { return m_userVariables.count(); } -VarDesc *VariablesHolder::userVariableAt(int index) +VarDesc* VariablesHolder::variableByName(const QString& name) +{ + if (m_varNames.contains(name)) + return m_varNames.value(name); + else return 0; +} + +VarDesc *VariablesHolder::variableAt(int index) { return m_userVariables.at(index); } +bool VariablesHolder::variableIsMandatory(const QString& name) +{ + if (m_varNames.contains(name)) + return m_varNames.value(name)->isMandatory(); + else return false; +} + +void VariablesHolder::setVarableMandatory(const QString& name, bool value) +{ + if (m_varNames.contains(name)) + m_varNames.value(name)->setMandatory(value); + +} + +VariableDataType VariablesHolder::variableDataType(const QString& name) +{ + if (m_varNames.contains(name)) + return m_varNames.value(name)->dataType(); + else return Enums::Undefined; +} + +void VariablesHolder::setVariableDataType(const QString& name, VariableDataType value) +{ + if (m_varNames.contains(name)) + m_varNames.value(name)->setDataType(value); +} + QStringList VariablesHolder::variableNames() { QStringList result; @@ -148,4 +182,40 @@ RenderPass VariablesHolder::variablePass(const QString &name) else throw ReportError(tr("variable with name ")+name+tr(" does not exists!")); } +bool VarDesc::isMandatory() const +{ + return m_mandatory; +} + +void VarDesc::setMandatory(bool mandatory) +{ + m_mandatory = mandatory; +} + +void VarDesc::initFrom(VarDesc* value) +{ + m_mandatory = value->isMandatory(); + m_dataType = value->dataType(); +} + +VariableDataType VarDesc::dataType() const +{ + return m_dataType; +} + +void VarDesc::setDataType(const VariableDataType& dataType) +{ + m_dataType = dataType; +} + +int VarDesc::readDataTypeProperty() const +{ + return static_cast(m_dataType); +} + +void VarDesc::setDataTypeProperty(int value) +{ + m_dataType = static_cast(value); +} + }// namespace LimeReport diff --git a/limereport/lrvariablesholder.h b/limereport/lrvariablesholder.h index e375ea8..2c3f961 100644 --- a/limereport/lrvariablesholder.h +++ b/limereport/lrvariablesholder.h @@ -42,7 +42,10 @@ class VarDesc : public QObject{ Q_OBJECT Q_PROPERTY(QString name READ name WRITE setName) Q_PROPERTY(QVariant value READ value WRITE setValue) + Q_PROPERTY(bool isMandatory READ isMandatory WRITE setMandatory) + Q_PROPERTY(int dataType READ readDataTypeProperty WRITE setDataTypeProperty) public: + VarDesc() : m_dataType(VariableDataType::Undefined), m_mandatory(false){} enum VarType {System, User, Report}; void setVarType(VarType value){m_varType=value;} VarType varType(){return m_varType;} @@ -52,26 +55,39 @@ public: QString name(){return m_name;} void setValue(QVariant value){m_value=value;} QVariant value(){return m_value;} + VariableDataType dataType() const; + void setDataType(const VariableDataType& dataType); + int readDataTypeProperty() const; + void setDataTypeProperty(int value); + bool isMandatory() const; + void setMandatory(bool isMandatory); + void initFrom(VarDesc* value); private: VarType m_varType; RenderPass m_varPass; QString m_name; QVariant m_value; + VariableDataType m_dataType; + bool m_mandatory; }; class IVariablesContainer { public: virtual ~IVariablesContainer(){} - virtual void addVariable(const QString &name, const QVariant &value, VarDesc::VarType type=VarDesc::User, RenderPass pass=FirstPass)=0; - virtual void deleteVariable(const QString &name)=0; - virtual void changeVariable(const QString &name, const QVariant &value)=0; - virtual void clearUserVariables()=0; - virtual QVariant variable(const QString &name)=0; - virtual VarDesc::VarType variableType(const QString &name)=0; - virtual RenderPass variablePass(const QString &name)=0; - virtual bool containsVariable(const QString &name)=0; - virtual QStringList variableNames()=0; + virtual void addVariable(const QString& name, const QVariant &value, VarDesc::VarType type=VarDesc::User, RenderPass pass=FirstPass) = 0; + virtual void deleteVariable(const QString& name) = 0; + virtual void changeVariable(const QString& name, const QVariant &value) = 0; + virtual void clearUserVariables() = 0; + virtual QVariant variable(const QString& name) = 0; + virtual VarDesc::VarType variableType(const QString& name) = 0; + virtual RenderPass variablePass(const QString& name) = 0; + virtual bool containsVariable(const QString& name) = 0; + virtual QStringList variableNames() = 0; + virtual bool variableIsMandatory(const QString& name) = 0; + virtual void setVarableMandatory(const QString& name, bool value) = 0; + virtual VariableDataType variableDataType(const QString& name) = 0; + virtual void setVariableDataType(const QString& name, VariableDataType value) = 0; }; class VariablesHolder : public QObject, public IVariablesContainer @@ -85,12 +101,17 @@ public: void changeVariable(const QString &name, const QVariant &value); void clearUserVariables(); QVariant variable(const QString &name); - VarDesc::VarType variableType(const QString &name); - RenderPass variablePass(const QString &name); - bool containsVariable(const QString &name); - QStringList variableNames(); - int userVariablesCount(); - VarDesc* userVariableAt(int index); + VarDesc::VarType variableType(const QString& name); + RenderPass variablePass(const QString &name); + bool containsVariable(const QString &name); + QStringList variableNames(); + int variablesCount(); + VarDesc* variableByName(const QString& name); + VarDesc* variableAt(int index); + bool variableIsMandatory(const QString& name); + void setVarableMandatory(const QString &name, bool value); + VariableDataType variableDataType(const QString& name); + void setVariableDataType(const QString &name, VariableDataType value); signals: void variableHasBeenAdded(const QString& variableName); void variableHasBeenChanged(const QString& variableName); From cc0dad863e12ce60dd9aea987450bafc59ec6dab Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 27 Sep 2017 01:05:22 +0300 Subject: [PATCH 064/347] ChartItem has been updated --- limereport/items/lrchartitem.cpp | 92 ++++++++++++++++++++++---- limereport/items/lrchartitem.h | 10 ++- limereport/items/lrchartitemeditor.cpp | 22 +++++- limereport/items/lrchartitemeditor.h | 2 + limereport/items/lrchartitemeditor.ui | 10 +++ limereport/lrcolorindicator.cpp | 16 ++++- 6 files changed, 135 insertions(+), 17 deletions(-) diff --git a/limereport/items/lrchartitem.cpp b/limereport/items/lrchartitem.cpp index 4b03242..1a8a58b 100644 --- a/limereport/items/lrchartitem.cpp +++ b/limereport/items/lrchartitem.cpp @@ -77,10 +77,9 @@ void SeriesItem::setLabelsColumn(const QString &labelsColumn) SeriesItem *SeriesItem::clone() { SeriesItem* result = new SeriesItem(); - result->setName(name()); - result->setLabelsColumn(labelsColumn()); - result->setValuesColumn(valuesColumn()); - result->setColor(color()); + for (int i = 0; i < this->metaObject()->propertyCount(); ++i){ + result->setProperty(this->metaObject()->property(i).name(),property(this->metaObject()->property(i).name())); + } return result; } @@ -110,6 +109,16 @@ void SeriesItem::setColor(const QColor &color) m_color = color; } +SeriesItem::SeriesItemPreferredType SeriesItem::preferredType() const +{ + return m_preferredType; +} + +void SeriesItem::setPreferredType(const SeriesItemPreferredType& type) +{ + m_preferredType = type; +} + ChartItem::ChartItem(QObject *owner, QGraphicsItem *parent) : ItemDesignIntf(xmlTag, owner, parent), m_legendBorder(true), m_legendAlign(LegendAlignCenter), m_titleAlign(TitleAlignCenter), @@ -665,6 +674,11 @@ void VerticalBarChart::paintChart(QPainter *painter, QRectF chartRect) vPadding(chartRect)+valuesVMargin(painter), -(hPadding(chartRect)*2), -(vPadding(chartRect)+barsShift) )); + paintSerialLines(painter, chartRect.adjusted( + hPadding(chartRect)*2+valuesHMargin(painter), + vPadding(chartRect)+valuesVMargin(painter), + -(hPadding(chartRect)*2), + -(vPadding(chartRect)+barsShift) )); paintLabels(painter,calcRect); } @@ -692,25 +706,36 @@ void VerticalBarChart::paintVerticalGrid(QPainter *painter, QRectF gridRect) void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect) { - painter->save(); - painter->setRenderHint(QPainter::Antialiasing,false); + int delta = int(maxValue()-minValue()); delta = genNextValue(delta); + int barSeriesCount = 0; + foreach(SeriesItem* series, m_chartItem->series()){ + if (series->preferredType() == SeriesItem::Bar) barSeriesCount++; + } + + barSeriesCount = (m_chartItem->itemMode()==DesignMode) ? seriesCount() : barSeriesCount; + + painter->save(); + painter->setRenderHint(QPainter::Antialiasing,false); + qreal vStep = barsRect.height() / delta; - qreal hStep = (barsRect.width() / valuesCount()) / seriesCount(); + qreal hStep = (barsRect.width() / valuesCount()) / (barSeriesCount == 0 ? 1 : barSeriesCount); qreal topShift = (delta - (maxValue()-minValue())) * vStep +barsRect.top(); if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ int curSeries = 0; foreach (SeriesItem* series, m_chartItem->series()) { - qreal curHOffset = curSeries*hStep+barsRect.left(); - painter->setBrush(series->color()); - foreach (qreal value, series->data()->values()) { - painter->drawRect(QRectF(curHOffset, maxValue()*vStep+topShift, hStep, -value*vStep)); - curHOffset+=hStep*seriesCount(); + if (series->preferredType() == SeriesItem::Bar){ + qreal curHOffset = curSeries*hStep+barsRect.left(); + painter->setBrush(series->color()); + foreach (qreal value, series->data()->values()) { + painter->drawRect(QRectF(curHOffset, maxValue()*vStep+topShift, hStep, -value*vStep)); + curHOffset+=hStep*barSeriesCount; + } + curSeries++; } - curSeries++; } } else { qreal curHOffset = barsRect.left(); @@ -726,6 +751,47 @@ void VerticalBarChart::paintVerticalBars(QPainter *painter, QRectF barsRect) painter->restore(); } +void VerticalBarChart::paintSerialLines(QPainter* painter, QRectF barsRect) +{ + painter->save(); + painter->setRenderHint(QPainter::Antialiasing,true); + int delta = int(maxValue()-minValue()); + delta = genNextValue(delta); + + qreal vStep = barsRect.height() / delta; + qreal hStep = (barsRect.width() / valuesCount()); + qreal topShift = (delta - (maxValue()-minValue())) * vStep +barsRect.top(); + + if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ + int curSeries = 0; + foreach (SeriesItem* series, m_chartItem->series()) { + if (series->preferredType() == SeriesItem::Line){ + QPen pen(series->color()); + pen.setWidth(4); + painter->setPen(pen); + for (int i = 0; i < series->data()->values().count()-1; ++i ){ + QPoint startPoint = QPoint((i+1)*hStep + barsRect.left()-hStep/2, + (maxValue()*vStep+topShift) - series->data()->values().at(i)*vStep + ); + QPoint endPoint = QPoint((i+2)*hStep + barsRect.left()-hStep/2, + (maxValue()*vStep+topShift) - series->data()->values().at(i+1)*vStep + ); + painter->drawLine(startPoint, endPoint); + QRect startPointRect(startPoint,startPoint); + QRect endPointRect(endPoint,endPoint); + int radius = 4; + painter->setBrush(series->color()); + painter->drawEllipse(startPointRect.adjusted(radius,radius,-radius,-radius)); + painter->drawEllipse(endPointRect.adjusted(radius,radius,-radius,-radius)); + + } + } + curSeries++; + } + } + painter->restore(); +} + void VerticalBarChart::paintLabels(QPainter *painter, QRectF labelsRect) diff --git a/limereport/items/lrchartitem.h b/limereport/items/lrchartitem.h index c89ea76..3419d20 100644 --- a/limereport/items/lrchartitem.h +++ b/limereport/items/lrchartitem.h @@ -1,6 +1,7 @@ #ifndef LRCHARTITEM_H #define LRCHARTITEM_H #include "lritemdesignintf.h" +#include "lrglobal.h" namespace LimeReport{ @@ -27,8 +28,11 @@ class SeriesItem : public QObject{ Q_PROPERTY(QString valuesColumn READ valuesColumn WRITE setValuesColumn ) Q_PROPERTY(QString labelsColumn READ labelsColumn WRITE setLabelsColumn ) Q_PROPERTY(QColor color READ color WRITE setColor) + Q_PROPERTY(SeriesItemPreferredType preferredType READ preferredType WRITE setPreferredType) + Q_ENUMS(SeriesItemPreferredType) public: - SeriesItem(QObject* parent = 0):QObject(parent){} + enum SeriesItemPreferredType {Bar, Line}; + SeriesItem(QObject* parent = 0) : QObject(parent), m_preferredType(Bar){} QString name() const; void setName(const QString &name); QString valuesColumn() const; @@ -40,12 +44,15 @@ public: SeriesItemData* data(){ return &m_data;} QColor color() const; void setColor(const QColor &color); + SeriesItemPreferredType preferredType() const; + void setPreferredType(const SeriesItemPreferredType& preferredType); private: QString m_name; QString m_valuesColumn; QString m_labelsColumn; SeriesItemData m_data; QColor m_color; + SeriesItemPreferredType m_preferredType; }; class ChartItem; @@ -121,6 +128,7 @@ public: void paintChart(QPainter *painter, QRectF chartRect); void paintVerticalGrid(QPainter *painter, QRectF gridRect); void paintVerticalBars(QPainter *painter, QRectF barsRect); + void paintSerialLines(QPainter *painter, QRectF barsRect); void paintLabels(QPainter *painter, QRectF labelsRect); }; diff --git a/limereport/items/lrchartitemeditor.cpp b/limereport/items/lrchartitemeditor.cpp index cfb9761..da58cbd 100644 --- a/limereport/items/lrchartitemeditor.cpp +++ b/limereport/items/lrchartitemeditor.cpp @@ -22,7 +22,6 @@ ChartItemEditor::ChartItemEditor(LimeReport::ChartItem *item, LimeReport::PageDe colorLayout->insertStretch(0); readSetting(); init(); - connect(m_colorButton, SIGNAL(clicked(bool)), this, SLOT(slotChangeSeriesColor())); } @@ -112,6 +111,13 @@ void ChartItemEditor::init() } } + + static int enumIndex = LimeReport::SeriesItem::staticMetaObject.indexOfEnumerator("SeriesItemPreferredType"); + QMetaEnum enumerator = LimeReport::SeriesItem::staticMetaObject.enumerator(enumIndex); + for (int i = 0; iseriesTypeComboBox->addItem(enumerator.key(i)); + } + ui->labelsFieldComboBox->setCurrentText(m_charItem->labelsField()); if (!m_charItem->series().isEmpty()){ enableSeriesEditor(); @@ -127,6 +133,7 @@ void ChartItemEditor::enableSeriesEditor() { ui->seriesNameLineEdit->setEnabled(true); ui->valuesFieldComboBox->setEnabled(true); + ui->seriesTypeComboBox->setEnabled(true); m_colorButton->setEnabled(true); m_colorIndicator->setEnabled(true); } @@ -139,6 +146,7 @@ void ChartItemEditor::disableSeriesEditor() m_colorButton->setDisabled(true); m_colorIndicator->setDisabled(true); ui->valuesFieldComboBox->setCurrentText(""); + ui->seriesTypeComboBox->setDisabled(true); } LimeReport::SeriesItem *ChartItemEditor::currentSeries() @@ -214,6 +222,9 @@ void ChartItemEditor::on_tableWidget_itemSelectionChanged() ui->seriesNameLineEdit->setText(series->name()); ui->valuesFieldComboBox->setCurrentText(series->valuesColumn()); m_colorIndicator->setColor(series->color()); + static int enumIndex = LimeReport::SeriesItem::staticMetaObject.indexOfEnumerator("SeriesItemPreferredType"); + QMetaEnum enumerator = LimeReport::SeriesItem::staticMetaObject.enumerator(enumIndex); + ui->seriesTypeComboBox->setCurrentText(enumerator.valueToKey(series->preferredType())); enableSeriesEditor(); } } @@ -247,3 +258,12 @@ void ChartItemEditor::slotChangeSeriesColor() m_colorIndicator->setColor(colorDialog.selectedColor()); } } + +void ChartItemEditor::on_seriesTypeComboBox_currentIndexChanged(const QString &arg1) +{ + static int enumIndex = LimeReport::SeriesItem::staticMetaObject.indexOfEnumerator("SeriesItemPreferredType"); + QMetaEnum enumerator = LimeReport::SeriesItem::staticMetaObject.enumerator(enumIndex); + if (currentSeries()){ + currentSeries()->setPreferredType(static_cast(enumerator.keysToValue(arg1.toLatin1()))); + } +} diff --git a/limereport/items/lrchartitemeditor.h b/limereport/items/lrchartitemeditor.h index 4e3d699..a406fc8 100644 --- a/limereport/items/lrchartitemeditor.h +++ b/limereport/items/lrchartitemeditor.h @@ -35,6 +35,8 @@ private slots: void on_valuesFieldComboBox_currentTextChanged(const QString &arg1); void on_labelsFieldComboBox_currentTextChanged(const QString &arg1); void slotChangeSeriesColor(); + void on_seriesTypeComboBox_currentIndexChanged(const QString &arg1); + private: void readSetting(); void writeSetting(); diff --git a/limereport/items/lrchartitemeditor.ui b/limereport/items/lrchartitemeditor.ui index 8e21a59..99a1676 100644 --- a/limereport/items/lrchartitemeditor.ui +++ b/limereport/items/lrchartitemeditor.ui @@ -110,6 +110,16 @@ + + + + Type + + + + + + diff --git a/limereport/lrcolorindicator.cpp b/limereport/lrcolorindicator.cpp index 73662f1..4844330 100644 --- a/limereport/lrcolorindicator.cpp +++ b/limereport/lrcolorindicator.cpp @@ -1,5 +1,6 @@ #include "lrcolorindicator.h" #include +#include void ColorIndicator::paintEvent(QPaintEvent* event) { @@ -7,8 +8,19 @@ void ColorIndicator::paintEvent(QPaintEvent* event) painter.save(); painter.setBrush(m_color); painter.setPen(Qt::gray); - QRect rect = event->rect().adjusted(3,3,-4,-4); - rect.setWidth(rect.height()); + + QRect rect = event->rect().adjusted(3,3,-3,-3); + + if (rect.height() < rect.width()){ + qreal offset = (rect.width()-rect.height()) / 2; + rect.setWidth(rect.height()); + rect.adjust(offset,0,offset,0); + } else { + qreal offset = (rect.height()-rect.width()) / 2; + rect.setHeight(rect.width()); + rect.adjust(0,offset,0,offset); + } + painter.setRenderHint(QPainter::Antialiasing); painter.drawEllipse(rect); painter.restore(); From de618ebb58b78b244ef7e9521cde9e95c4153360 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 1 Oct 2017 21:07:30 +0300 Subject: [PATCH 065/347] Qt 5.8+ build fixed --- include/lrglobal.h | 3 +++ limereport/lrglobal.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/include/lrglobal.h b/include/lrglobal.h index 4b20774..b324900 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -157,6 +157,9 @@ namespace Const{ typedef QScriptValue ScriptValueType; #endif +#if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0) + Q_NAMESPACE +#endif class Enums { public: diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 4b20774..b324900 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -157,6 +157,9 @@ namespace Const{ typedef QScriptValue ScriptValueType; #endif +#if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0) + Q_NAMESPACE +#endif class Enums { public: From c72014069f008562ac93c6539589c624f1af5789 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 2 Oct 2017 16:37:38 +0300 Subject: [PATCH 066/347] Insert item lock added --- include/lrglobal.h | 10 +--------- limereport/lrglobal.h | 10 +--------- limereport/lrreportdesignwindow.cpp | 16 ++++++++++++---- limereport/lrreportdesignwindow.h | 1 + 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index b324900..a553c58 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -84,15 +84,7 @@ namespace Const{ const QString FIELD_RX = "\\$D\\s*\\{\\s*([^{}]*)\\s*\\}"; const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}"; const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; - const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; - - //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(((?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"))(\\w+\\.?\\w+)((?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,\\s*\\\"(\\w+)\\\"\\s*\\)"; - //const int DATASOURCE_INDEX = 6; - //const int VALUE_INDEX = 2; - - //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:((?:(?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"?\\$S\\s*\\{\\s*)|(?:\\\"))((?:\\w+\\.?\\w+)|(?:\\w+))(?:(?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,)|(?:))\\s*\\\"(\\w+)\\\"\\s*\\)"; - //const QString GROUP_FUNCTION_PARAM_RX = "\\((?:(.+),(.+))|(?:\\\"(\\w+)\\\")\\)"; - //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:)))|(?:(?:(?:\\\")|(?:))(\\s*\\$\\w\\s*\\{.+\\}\\s*)(?:(?:\\\")|(?:))\\s*,\\s*(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:))))\\)"; + const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*.\\w*\\s*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))\\)"; const int DATASOURCE_INDEX = 3;//4; const int VALUE_INDEX = 2; //2; diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index b324900..a553c58 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -84,15 +84,7 @@ namespace Const{ const QString FIELD_RX = "\\$D\\s*\\{\\s*([^{}]*)\\s*\\}"; const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}"; const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; - const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; - - //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(((?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"))(\\w+\\.?\\w+)((?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,\\s*\\\"(\\w+)\\\"\\s*\\)"; - //const int DATASOURCE_INDEX = 6; - //const int VALUE_INDEX = 2; - - //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:((?:(?:\\\"?\\$D\\s*\\{\\s*)|(?:\\\"?\\$V\\s*\\{\\s*)|(?:\\\"?\\$S\\s*\\{\\s*)|(?:\\\"))((?:\\w+\\.?\\w+)|(?:\\w+))(?:(?:\\\")|(?:\\s*\\}\\\"?\\s*)))\\s*,)|(?:))\\s*\\\"(\\w+)\\\"\\s*\\)"; - //const QString GROUP_FUNCTION_PARAM_RX = "\\((?:(.+),(.+))|(?:\\\"(\\w+)\\\")\\)"; - //const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*(?:(?:(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:)))|(?:(?:(?:\\\")|(?:))(\\s*\\$\\w\\s*\\{.+\\}\\s*)(?:(?:\\\")|(?:))\\s*,\\s*(?:(?:\\\")|(?:))(\\w+)(?:(?:\\\")|(?:))))\\)"; + const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*.\\w*\\s*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))\\)"; const int DATASOURCE_INDEX = 3;//4; const int VALUE_INDEX = 2; //2; diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 657f289..fc611e3 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -64,7 +64,7 @@ ReportDesignWindow* ReportDesignWindow::m_instance=0; ReportDesignWindow::ReportDesignWindow(ReportEngine *report, QWidget *parent, QSettings* settings) : QMainWindow(parent), m_textAttibutesIsChanging(false), m_settings(settings), m_ownedSettings(false), - m_progressDialog(0), m_showProgressDialog(true), m_editorTabType(ReportDesignWidget::Page) + m_progressDialog(0), m_showProgressDialog(true), m_editorTabType(ReportDesignWidget::Page), m_reportItemIsLocked(false) { initReportEditor(report); createActions(); @@ -123,6 +123,7 @@ void ReportDesignWindow::createActions() m_editModeAction->setIcon(QIcon(":/report/images/editMode")); m_editModeAction->setCheckable(true); m_editModeAction->setChecked(true); + m_editModeAction->setShortcut(QKeySequence(Qt::Key_Escape)); connect(m_editModeAction,SIGNAL(triggered()),this,SLOT(slotEditMode())); m_undoAction = new QAction(tr("Undo"),this); @@ -888,6 +889,7 @@ void ReportDesignWindow::slotNewTextItem() { if (m_newTextItemAction->isChecked()) {m_newTextItemAction->setCheckable(false);return;} if (m_reportDesignWidget) { + m_reportItemIsLocked = QApplication::keyboardModifiers() == Qt::SHIFT; m_reportDesignWidget->startInsertMode("TextItem"); m_newTextItemAction->setCheckable(true); m_newTextItemAction->setChecked(true); @@ -987,14 +989,19 @@ void ReportDesignWindow::slotInsertModeStarted() void ReportDesignWindow::slotItemInserted(PageDesignIntf *, QPointF, const QString &ItemType) { - m_editModeAction->setChecked(true); - if (m_actionMap.value(ItemType)) - m_actionMap.value(ItemType)->setCheckable(false); + if (!m_reportItemIsLocked){ + m_editModeAction->setChecked(true); + if (m_actionMap.value(ItemType)) + m_actionMap.value(ItemType)->setCheckable(false); + } else { + m_reportDesignWidget->startInsertMode(ItemType); + } } void ReportDesignWindow::slotItemInsertCanceled(const QString &ItemType) { m_editModeAction->setChecked(true); + m_reportItemIsLocked = false; if (m_actionMap.value(ItemType)) m_actionMap.value(ItemType)->setCheckable(false); } @@ -1169,6 +1176,7 @@ void ReportDesignWindow::slotItemActionCliked() QAction* action=dynamic_cast(sender()); action->setCheckable(true); action->setChecked(true); + m_reportItemIsLocked = QApplication::keyboardModifiers() == Qt::SHIFT; m_reportDesignWidget->startInsertMode(action->whatsThis()); } diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 9a96845..a01db94 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -266,6 +266,7 @@ private: QByteArray m_editorsStates[ReportDesignWidget::TabTypeCount]; QVector m_pageTools; QVector m_dialogTools; + bool m_reportItemIsLocked; }; From 93665fc7caae85ed10e72c753cd3874160f2e2a4 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Mon, 2 Oct 2017 20:50:11 +0300 Subject: [PATCH 067/347] Script engine manager fixed --- limereport/lrscriptenginemanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 6ad79c6..bb5aa16 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -829,7 +829,7 @@ bool ScriptEngineManager::createReopenDatasourceFunction() } ScriptEngineManager::ScriptEngineManager() - :m_model(0), m_dataManager(0) + :m_model(0), m_dataManager(0), m_context(0) { m_scriptEngine = new ScriptEngineType; m_functionManager = new ScriptFunctionsManager(this); From 0f915a95811d1b8e3c8fc395a6ce76f3f8c1933e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 4 Oct 2017 17:14:07 +0300 Subject: [PATCH 068/347] Script editor fixed --- limereport/scripteditor/lrcodeeditor.cpp | 79 ++++++++++++------------ 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index 273a1b3..97b300e 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -148,31 +148,33 @@ QString CodeEditor::textUnderCursor() const bool CodeEditor::matchLeftParenthesis(QTextBlock currentBlock, QChar parenthesisType, int i, int numLeftParentheses) { TextBlockData *data = static_cast(currentBlock.userData()); - QVector infos = data->parentheses(); + if (data){ + QVector infos = data->parentheses(); - int docPos = currentBlock.position(); - for (; i < infos.size(); ++i) { - ParenthesisInfo *info = infos.at(i); + int docPos = currentBlock.position(); + for (; i < infos.size(); ++i) { + ParenthesisInfo *info = infos.at(i); + + if (info->character == parenthesisType) { + ++numLeftParentheses; + continue; + } + + if (info->character == getParenthesisReverceChar(parenthesisType)){ + if (numLeftParentheses == 0) { + createParenthesisSelection(docPos + info->position); + return true; + } else + --numLeftParentheses; + } - if (info->character == parenthesisType) { - ++numLeftParentheses; - continue; - } - - if (info->character == getParenthesisReverceChar(parenthesisType)){ - if (numLeftParentheses == 0) { - createParenthesisSelection(docPos + info->position); - return true; - } else - --numLeftParentheses; } + currentBlock = currentBlock.next(); + if (currentBlock.isValid()) + return matchLeftParenthesis(currentBlock, parenthesisType, 0, numLeftParentheses); } - currentBlock = currentBlock.next(); - if (currentBlock.isValid()) - return matchLeftParenthesis(currentBlock, parenthesisType, 0, numLeftParentheses); - return false; } @@ -180,27 +182,28 @@ bool CodeEditor::matchRightParenthesis(QTextBlock currentBlock, QChar parenthesi { TextBlockData *data = static_cast(currentBlock.userData()); QVector parentheses = data->parentheses(); + if (data){ + int docPos = currentBlock.position(); + for (; i > -1 && parentheses.size() > 0; --i) { + ParenthesisInfo *info = parentheses.at(i); + if (info->character == parenthesisType) { + ++numRightParentheses; + continue; + } + if (info->character == getParenthesisReverceChar(parenthesisType)){ + if (numRightParentheses == 0) { + createParenthesisSelection(docPos + info->position); + return true; + } else + --numRightParentheses; + } + } + + currentBlock = currentBlock.previous(); + if (currentBlock.isValid()) + return matchRightParenthesis(currentBlock, parenthesisType, 0, numRightParentheses); - int docPos = currentBlock.position(); - for (; i > -1 && parentheses.size() > 0; --i) { - ParenthesisInfo *info = parentheses.at(i); - if (info->character == parenthesisType) { - ++numRightParentheses; - continue; - } - if (info->character == getParenthesisReverceChar(parenthesisType)){ - if (numRightParentheses == 0) { - createParenthesisSelection(docPos + info->position); - return true; - } else - --numRightParentheses; - } } - - currentBlock = currentBlock.previous(); - if (currentBlock.isValid()) - return matchRightParenthesis(currentBlock, parenthesisType, 0, numRightParentheses); - return false; } From a48d82c74298b72c62544bf1e4f48d91ce05e311 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 01:27:04 +0300 Subject: [PATCH 069/347] Script editor fixed --- limereport/scripteditor/lrscripteditor.cpp | 37 +++++++++++++--------- limereport/scripteditor/lrscripteditor.h | 5 +++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 263eff3..abb254f 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -25,10 +25,8 @@ ScriptEditor::~ScriptEditor() delete ui; } -void ScriptEditor::setReportEngine(ReportEnginePrivate* reportEngine) +void ScriptEditor::initEditor(DataSourceManager* dm) { - m_reportEngine = reportEngine; - DataSourceManager* dm = m_reportEngine->dataManager(); ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); se.setDataManager(dm); @@ -41,23 +39,24 @@ void ScriptEditor::setReportEngine(ReportEnginePrivate* reportEngine) ui->twScriptEngine->setModel(se.model()); } + if (ui->twScriptEngine->selectionModel()){ + connect(ui->twScriptEngine->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), + this, SLOT(slotOnCurrentChanged(QModelIndex,QModelIndex))); + } +} + +void ScriptEditor::setReportEngine(ReportEnginePrivate* reportEngine) +{ + m_reportEngine = reportEngine; + DataSourceManager* dm = m_reportEngine->dataManager(); + initEditor(dm); } void ScriptEditor::setReportPage(PageDesignIntf* page) { m_page = page; DataSourceManager* dm = page->datasourceManager(); - ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); - se.setDataManager(dm); - - initCompleter(); - - if (dm){ - if (dm->isNeedUpdateDatasourceModel()) - dm->updateDatasourceModel(); - ui->twData->setModel(dm->datasourcesModel()); - ui->twScriptEngine->setModel(se.model()); - } + initEditor(dm); } void ScriptEditor::setPageBand(BandDesignIntf* band) @@ -119,7 +118,7 @@ void ScriptEditor::initCompleter() } } - m_completer->setModel(new QStringListModel(dataWords,m_completer)); + m_completer->setModel(new QStringListModel(dataWords,m_completer)); } QByteArray ScriptEditor::saveState() @@ -196,6 +195,14 @@ void ScriptEditor::on_twScriptEngine_doubleClicked(const QModelIndex &index) ui->textEdit->setFocus(); } +void ScriptEditor::slotOnCurrentChanged(const QModelIndex &to, const QModelIndex &) +{ + LimeReport::ScriptEngineNode* node = static_cast(to.internalPointer()); + if (node->type()==LimeReport::ScriptEngineNode::Function){ + ui->lblDescription->setText(node->description()); + } +} + } // namespace LimeReport diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index fc7d7be..b67be79 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -13,6 +13,7 @@ class ReportEnginePrivate; class BaseDesignIntf; class PageDesignIntf; class BandDesignIntf; +class DataSourceManager; namespace Ui { class ScriptEditor; @@ -36,9 +37,13 @@ public: QString toPlainText(); signals: void splitterMoved(int, int); +protected: + void initEditor(DataSourceManager* dm); + private slots: void on_twData_doubleClicked(const QModelIndex &index); void on_twScriptEngine_doubleClicked(const QModelIndex &index); + void slotOnCurrentChanged(const QModelIndex& to, const QModelIndex&); private: void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); private: From 87a366a59a7174b7c178a4c4e54e109e4ea0fcd4 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 01:28:24 +0300 Subject: [PATCH 070/347] Script editor fixed --- limereport/scripteditor/lrcodeeditor.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index 97b300e..c1b5643 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include "lrscripthighlighter.h" @@ -43,7 +44,11 @@ void CodeEditor::setCompleter(QCompleter *value) void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent* event) { QPainter painter(lineNumberArea); - painter.fillRect(event->rect(), QPalette().background().color()); + QStyleOption option; + option.initFrom(this); + //painter.fillRect(event->rect(), QPalette().background().color()); + QColor bg = option.palette.background().color().darker(150); + painter.fillRect(event->rect(), bg); QTextBlock block = firstVisibleBlock(); int blockNumber = block.blockNumber(); @@ -53,7 +58,7 @@ void CodeEditor::lineNumberAreaPaintEvent(QPaintEvent* event) while (block.isValid() && top <= event->rect().bottom()) { if (block.isVisible() && bottom >= event->rect().top()) { QString number = QString::number(blockNumber + 1); - painter.setPen(QPalette().text().color()); + painter.setPen(option.palette.text().color()); painter.drawText(0, top, lineNumberArea->width(), fontMetrics().height(), Qt::AlignCenter, number); } From 3303d4461b54c2deb32881b875b53a76e9b991a4 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 01:38:11 +0300 Subject: [PATCH 071/347] icons updated --- demo_r2/images/ZoomIn.png | Bin 765 -> 810 bytes demo_r2/images/ZoomOut.png | Bin 750 -> 808 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/demo_r2/images/ZoomIn.png b/demo_r2/images/ZoomIn.png index ecbff8887e9624df6b38e62a3c0cdcb674c29c7d..541ea2281abc08c26362b035c15c90de62ce90f6 100644 GIT binary patch delta 724 zcmV;_0xSLf1*!&+Bo78+OGiWiUjSbKU*9ywjgcW93gHR_5I7%Fum2B`Nhp7kNkl8`f;M2Q+GQv{N~Bzci=t)A@%;foQ46U} zgqX~vWdA`m846-%5K1XcRL|6fWD7&O0Bl%SU9o2!*}n zzy+WgsI|nSzyR>v(9PJE0HJ@dw*^%Xz1ymsvs>+*3 z8jf`)ON%Sr0P{aT#)qc5)rr_Zos{V{P>rFR?{fk|VediUGoT(RtslD_e7wi0x=Vx* zZop+d`z@u6CsOf+zG%m0*#@twTbUy8189W@oIt@Q`bgCZJx;rgOc6{2$Cp-qB=#2h zRsomg;Xj_+W!6b9t;{8CHZuN$L4eWeo>eL3@+KmPk52a_ta5*r4bTguqm%a=Qt8!M zAeo2pR5F#AjZWTcu-VucVCd#M;8iM}AoAwgqLgwb2P6s1JRN`TTuh}C0(fcY=6F7x z`~^@dJZHu(1s@f;RBbmGjq|?mi&;Rn_u&pMJIuAKoLTbRpl+# zEIO+FokgGGLsQ+3iCBM~l<76yYC|_CHZx62fxEWGk-2mX-4t8h2TefBfBT>x7&LS< z77BZ1E{NFf#>y-O*)|{-WJdtmAUg)g1W|Spkgb|_?fd~MA#8ou-r&XPm|Lqa4H}sT7?>7ML0Cgp8ugq_)d&7p+>3 z_b;$^LT#c!hmj%$$u^Z4<)X>7Kv0oMN4tx(A%zJ)=Co*rE;e6&y_*Z~y}$Q)f9IZa zUO3T%#Qa20UH(gENZFsN(B{H}ih9=}=u+y`0#C5bKy_<%dQX8gz);PI=c zfX{$M2!(RBap+t{=TwQkb`>DB@+tSjbWi21@w!>cXdG0nYsS~K0FPfS0=@y3!u&HM zH!t`C*;ZRf2qDb^DW!;Pgp0i+Zr4(H@?s2fOxKL1L;&*=cmYePg?!9$kp-zV*e>Jy)ALkxR;0karnS(L_+fje#ubmzw`#()tDhG4G$)9V%JV#!6#N45|b8{{p zD{H|#Q;nqmU;toj=AlzcDR$yuZ03dMrG_g!1$mAq107_AQ)tmMPUm(Y73nhONMb^W` zPe$CXrSL>!ELEaw#$qOS(P>};P=ruqxq4~nd`0I}vAt#$U~y$U_x*HF<*f0lS;}Z! zTcvBpmz~_E4&Z_5;K+0uT{FaP=Rpf_ZQDF}3JmC)G4JuKG95(hbz-H1>=}>_vM+#C nkbMIrgDCq6NVS^|EdBuQ8|L43UD=K#MhK!x|&{P*>SqciwJBS<2m6zYe?%%*^>c=l9N;_rN-bNc6z# za~1>jzzLwzy!{q<0Q6|89$bGB!0U5v2Ce{2fRZ530PX^pG*$nRGQjI|?grigHX#(s z3Xl40+%2Jk4eo4!$*HkW|5#i0=)@C`l*R(6LR0nkmH@BMxgGcn*orn)4xB#Nr8sOk z1wx38K$iL1td#P1WIm*K^fek^e!kgnLUw4X{&gup{1$Wow$g&y7w3QL9@#SNx#dEL z5+Dz-n=4NUQR1-Y>}#&;v6mKj{H8`{A_t0DeK}B@rliwYb0`aUpR*#FgC;%DDB)mu+}1IVv(ol}4MKVFl-ao}Syp(=f56=m+PYy^ z4#4-R5206MZCRrek3CWv3%TW*s*fz^G~EJRjjKvp?3bHC{fE8p-0LdV021o=^))J7co7OG<0;3V?%`kXx_y7O^07*qoM6N<$ Ef`WukTmS$7 delta 690 zcmV;j0!{s>2JQurBqa%ONLh0L01FcU01FcV0GgZ_00007bV*G`2jBz&6a^oA{DPa2 zTPS~MNkla2Y6%y!HdnfKFXACbxeCaQoCO;6C62lsLLD;012$nlYO+!0l6y z0iOYj5DEqAxvo=%O~bjivL%4&`A_M6BP~T^#@kvc!|R|DT{FHW1h{?bL0|%~WFI)u zbK{KHpK8sV7DC8qfs|4NR~BQDuk+y%= zHnq_lKnNkzteMk|)!m(W_KFt~kG6OTlt}l*KvjxjrJ=IjAImrvsG+jWpQ2bLQ04Zi zC1wd+fKuvkdMzpY=8_%3J(kqDQpYuKl*fN%i9G88DvmS;*1Kxz_Hv_Z*;emkHxw`h-maO^8YA|ac(C&=#hz-y+V+iP73y1LZ zy2_JH;dy_(Y%LrTz&l+t1`};G7Z9G9?Z43ax~A?|XdySAaWJ%)^YB$o-Nb*7zKdof z8tW`N4h#Z{5Q;2N&v%_JY#Pq7l`a8%n;%I3Fw#;qX1uADGQ6%W)-~hHW=>N(@F1!y znMk8+hS=(TP!C+$a34GcI&{sLbo*492qM^KC4y`lkO;CP05iyr0pdZFodlRo)2`JY YUoYWC6i9JV00000NkvXXu0jG}f^m;NX8-^I From b0137f9f7fbf7c647881bbcdc11bd758fd71fa41 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 01:39:16 +0300 Subject: [PATCH 072/347] Property delegate updated --- .../objectinspector/lrpropertydelegate.cpp | 65 +++++++++++-------- .../objectinspector/lrpropertydelegate.h | 4 +- 2 files changed, 41 insertions(+), 28 deletions(-) diff --git a/limereport/objectinspector/lrpropertydelegate.cpp b/limereport/objectinspector/lrpropertydelegate.cpp index 170ccd3..e1808eb 100644 --- a/limereport/objectinspector/lrpropertydelegate.cpp +++ b/limereport/objectinspector/lrpropertydelegate.cpp @@ -36,13 +36,16 @@ #include "lrglobal.h" LimeReport::PropertyDelegate::PropertyDelegate(QObject *parent) - :QItemDelegate(parent), m_objectInspector(NULL), m_editingItem(0), m_isEditing(false) + :QStyledItemDelegate(parent), m_objectInspector(NULL), m_editingItem(0), m_isEditing(false) {} void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (!index.isValid()) return; + QStyleOptionViewItemV4 opt = option; + QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); + LimeReport::ObjectPropItem *node = static_cast(index.internalPointer()); if (node){ if (!node->isHaveValue()){ @@ -54,31 +57,17 @@ void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionVi painter->save(); painter->setPen(option.palette.color(QPalette::HighlightedText)); painter->setBackground(QBrush(option.palette.color(QPalette::Highlight))); - drawBackground(painter,option,index); + //drawBackground(painter,option,index); cellOpt.widget->style()->drawPrimitive(QStyle::PE_IndicatorBranch,&primitiveOpt,painter); cellOpt.rect.adjust(primitiveOpt.rect.width(),0,0,0); cellOpt.font.setBold(true); cellOpt.palette.setColor(QPalette::Text,cellOpt.palette.color(QPalette::BrightText)); - drawDisplay(painter,cellOpt,cellOpt.rect,LimeReport::extractClassName(node->propertyName())); + cellOpt.text = LimeReport::extractClassName(node->propertyName()); + style->drawControl(QStyle::CE_ItemViewItem, &cellOpt, painter, cellOpt.widget); + //drawDisplay(painter,cellOpt,cellOpt.rect,LimeReport::extractClassName(node->propertyName())); painter->restore(); } - } else - { - if (index.column()==0){ - QPointF start( - option.rect.x()+option.rect.width()-1, - option.rect.y() - ); - QPointF end( - option.rect.x()+option.rect.width()-1, - option.rect.y()+option.rect.height() - ); - painter->save(); - QColor color = static_cast(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &option)); - painter->setPen(color); - painter->drawLine(start,end); - painter->restore(); - } + } else { StyleOptionViewItem so = option; if ((node->isValueReadonly())&&(!node->isHaveChildren())) { @@ -98,14 +87,36 @@ void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionVi else so.palette.setColor(QPalette::Text,Qt::black); - drawBackground(painter,option,index); - if (!node->paint(painter,so,index)) - QItemDelegate::paint(painter, so, index); +// drawBackground(painter,option,index); + + opt.text = ""; + style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); + + if (!node->paint(painter,so,index)){ + so.state &= ~QStyle::State_HasFocus; + QStyledItemDelegate::paint(painter, so, index); + } + + if (index.column()==0){ + QPointF start( + option.rect.x()+option.rect.width()-1, + option.rect.y() + ); + QPointF end( + option.rect.x()+option.rect.width()-1, + option.rect.y()+option.rect.height() + ); + painter->save(); + QColor color = static_cast(QApplication::style()->styleHint(QStyle::SH_Table_GridLineColor, &option)); + painter->setPen(color); + painter->drawLine(start,end); + painter->restore(); + } } } } -QSize LimeReport::PropertyDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &/*index*/) const +QSize LimeReport::PropertyDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const { QSize size=option.rect.size(); size.setHeight(option.fontMetrics.height()+ @@ -113,8 +124,10 @@ QSize LimeReport::PropertyDelegate::sizeHint(const QStyleOptionViewItem &option, #ifdef Q_OS_MAC +QApplication::style()->pixelMetric(QStyle::PM_FocusFrameVMargin) #endif - +2); - return size; + +4); + //return size; + QSize defaultSize = QStyledItemDelegate::sizeHint(option, index); + return size.height() > defaultSize.height() ? size : defaultSize; } QWidget * LimeReport::PropertyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const diff --git a/limereport/objectinspector/lrpropertydelegate.h b/limereport/objectinspector/lrpropertydelegate.h index f7e2414..d9d9b66 100644 --- a/limereport/objectinspector/lrpropertydelegate.h +++ b/limereport/objectinspector/lrpropertydelegate.h @@ -40,8 +40,8 @@ namespace LimeReport{ class ObjectInspectorWidget; -class PropertyDelegate : public QItemDelegate -//class PropertyDelegate : public QStyledItemDelegate +//class PropertyDelegate : public QItemDelegate +class PropertyDelegate : public QStyledItemDelegate { Q_OBJECT public: From 3bf8637c4c02c78ebae39c88e9591a07633e67bb Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 01:39:57 +0300 Subject: [PATCH 073/347] Demo2 updated --- demo_r2/mainwindow.cpp | 2 +- demo_r2/mainwindow.ui | 60 +++++++++++++++++++++++++++++++++++++----- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/demo_r2/mainwindow.cpp b/demo_r2/mainwindow.cpp index b7bde34..6f2aa7b 100644 --- a/demo_r2/mainwindow.cpp +++ b/demo_r2/mainwindow.cpp @@ -16,7 +16,7 @@ MainWindow::MainWindow(QWidget *parent) : m_pageNavigator = new QSpinBox(this); m_pageNavigator->setPrefix(tr("Page :")); - ui->toolBar->insertWidget(ui->actionZoomIn,m_scalePercent); + ui->toolBar->insertWidget(ui->actionZoom_Out,m_scalePercent); ui->toolBar->insertWidget(ui->actionNext_Page,m_pageNavigator); connect(m_scalePercent, SIGNAL(currentIndexChanged(QString)), this, SLOT(scaleComboboxChanged(QString))); connect(m_pageNavigator, SIGNAL(valueChanged(int)), this, SLOT(slotPageNavigatorChanged(int))); diff --git a/demo_r2/mainwindow.ui b/demo_r2/mainwindow.ui index 436974c..8475814 100644 --- a/demo_r2/mainwindow.ui +++ b/demo_r2/mainwindow.ui @@ -17,14 +17,17 @@ :/report/images/logo32:/report/images/logo32 + + false + - + Qt::Horizontal - + @@ -107,7 +110,7 @@ 5 - + 0 @@ -240,6 +243,27 @@ + + + + RadioButton + + + + + + + + Tab 1 + + + + + Tab 2 + + + + @@ -247,6 +271,9 @@ toolBar + + Qt::ToolButtonTextBesideIcon + TopToolBarArea @@ -302,7 +329,13 @@ :/images/images/ZoomIn.png:/images/images/ZoomIn.png - Zoom In + + + + + + + Zoom in @@ -311,7 +344,10 @@ :/images/images/ZoomOut.png:/images/images/ZoomOut.png - Zoom Out + + + + Zoom out @@ -347,6 +383,9 @@ :/images/images/First.png:/images/images/First.png + + + First Page @@ -356,6 +395,9 @@ :/images/images/Prev.png:/images/images/Prev.png + + + Prior Page @@ -365,6 +407,9 @@ :/images/images/Next.png:/images/images/Next.png + + + Next Page @@ -374,14 +419,17 @@ :/images/images/Last.png:/images/images/Last.png + + + Last Page - + From 38ffb3b64b0a5ce64d239767b03b58323bedff97 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 02:08:35 +0300 Subject: [PATCH 074/347] Demo2 fixed --- demo_r2/mainwindow.ui | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/demo_r2/mainwindow.ui b/demo_r2/mainwindow.ui index 8475814..75c02b0 100644 --- a/demo_r2/mainwindow.ui +++ b/demo_r2/mainwindow.ui @@ -243,27 +243,6 @@ - - - - RadioButton - - - - - - - - Tab 1 - - - - - Tab 2 - - - - From cb9dd9e5d31feb3873c4b89883556106e084bb28 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 02:25:36 +0300 Subject: [PATCH 075/347] Dark theme added --- 3rdparty/QDarkStyleSheet/COPYING | 21 + .../qdarkstyle/rc/Hmovetoolbar.png | Bin 0 -> 180 bytes .../qdarkstyle/rc/Hsepartoolbar.png | Bin 0 -> 147 bytes .../qdarkstyle/rc/Vmovetoolbar.png | Bin 0 -> 179 bytes .../qdarkstyle/rc/Vsepartoolbar.png | Bin 0 -> 150 bytes .../qdarkstyle/rc/branch_closed-on.png | Bin 0 -> 147 bytes .../qdarkstyle/rc/branch_closed.png | Bin 0 -> 160 bytes .../qdarkstyle/rc/branch_open-on.png | Bin 0 -> 150 bytes .../qdarkstyle/rc/branch_open.png | Bin 0 -> 166 bytes .../qdarkstyle/rc/checkbox_checked.png | Bin 0 -> 492 bytes .../rc/checkbox_checked_disabled.png | Bin 0 -> 491 bytes .../qdarkstyle/rc/checkbox_checked_focus.png | Bin 0 -> 252 bytes .../qdarkstyle/rc/checkbox_indeterminate.png | Bin 0 -> 493 bytes .../rc/checkbox_indeterminate_disabled.png | Bin 0 -> 492 bytes .../rc/checkbox_indeterminate_focus.png | Bin 0 -> 249 bytes .../qdarkstyle/rc/checkbox_unchecked.png | Bin 0 -> 464 bytes .../rc/checkbox_unchecked_disabled.png | Bin 0 -> 464 bytes .../rc/checkbox_unchecked_focus.png | Bin 0 -> 240 bytes .../qdarkstyle/rc/close-hover.png | Bin 0 -> 598 bytes .../qdarkstyle/rc/close-pressed.png | Bin 0 -> 598 bytes .../QDarkStyleSheet/qdarkstyle/rc/close.png | Bin 0 -> 586 bytes .../qdarkstyle/rc/down_arrow.png | Bin 0 -> 165 bytes .../qdarkstyle/rc/down_arrow_disabled.png | Bin 0 -> 166 bytes .../QDarkStyleSheet/qdarkstyle/rc/extend.png | Bin 0 -> 195 bytes .../qdarkstyle/rc/left_arrow.png | Bin 0 -> 166 bytes .../qdarkstyle/rc/left_arrow_disabled.png | Bin 0 -> 166 bytes .../qdarkstyle/rc/radio_checked.png | Bin 0 -> 940 bytes .../qdarkstyle/rc/radio_checked_disabled.png | Bin 0 -> 972 bytes .../qdarkstyle/rc/radio_checked_focus.png | Bin 0 -> 846 bytes .../qdarkstyle/rc/radio_unchecked.png | Bin 0 -> 728 bytes .../rc/radio_unchecked_disabled.png | Bin 0 -> 760 bytes .../qdarkstyle/rc/radio_unchecked_focus.png | Bin 0 -> 646 bytes .../qdarkstyle/rc/right_arrow.png | Bin 0 -> 160 bytes .../qdarkstyle/rc/right_arrow_disabled.png | Bin 0 -> 160 bytes .../qdarkstyle/rc/sizegrip.png | Bin 0 -> 129 bytes .../qdarkstyle/rc/stylesheet-branch-end.png | Bin 0 -> 224 bytes .../qdarkstyle/rc/stylesheet-branch-more.png | Bin 0 -> 182 bytes .../qdarkstyle/rc/stylesheet-vline.png | Bin 0 -> 239 bytes .../qdarkstyle/rc/transparent.png | Bin 0 -> 195 bytes .../QDarkStyleSheet/qdarkstyle/rc/undock.png | Bin 0 -> 578 bytes .../qdarkstyle/rc/up_arrow.png | Bin 0 -> 158 bytes .../qdarkstyle/rc/up_arrow_disabled.png | Bin 0 -> 159 bytes 3rdparty/QDarkStyleSheet/qdarkstyle/style.qrc | 47 + 3rdparty/QDarkStyleSheet/qdarkstyle/style.qss | 1295 +++++++++++++++++ .../QDarkStyleSheet/svg/checkbox_checked.svg | 96 ++ .../svg/checkbox_checked_disabled.svg | 96 ++ .../svg/checkbox_checked_focus.svg | 96 ++ .../svg/checkbox_indeterminate.svg | 96 ++ .../svg/checkbox_indeterminate_disabled.svg | 96 ++ .../svg/checkbox_indeterminate_focus.svg | 96 ++ .../svg/checkbox_unchecked.svg | 71 + .../svg/checkbox_unchecked_disabled.svg | 71 + .../svg/checkbox_unchecked_focus.svg | 71 + .../QDarkStyleSheet/svg/radio_checked.svg | 73 + .../svg/radio_checked_disabled.svg | 73 + .../svg/radio_checked_focus.svg | 73 + .../QDarkStyleSheet/svg/radio_unchecked.svg | 67 + .../svg/radio_unchecked_disabled.svg | 67 + .../svg/radio_unchecked_focus.svg | 67 + 59 files changed, 2572 insertions(+) create mode 100644 3rdparty/QDarkStyleSheet/COPYING create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hmovetoolbar.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hsepartoolbar.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/Vmovetoolbar.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/Vsepartoolbar.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed-on.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_open-on.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_open.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_disabled.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_focus.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate_disabled.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate_focus.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked_disabled.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked_focus.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/close-hover.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/close-pressed.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/close.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/down_arrow.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/down_arrow_disabled.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/extend.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/left_arrow.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/left_arrow_disabled.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_checked.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_checked_disabled.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_checked_focus.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked_disabled.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked_focus.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/right_arrow.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/right_arrow_disabled.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/sizegrip.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-branch-end.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-branch-more.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-vline.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/transparent.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/undock.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/up_arrow.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/up_arrow_disabled.png create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/style.qrc create mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/style.qss create mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_checked.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_checked_disabled.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_checked_focus.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_disabled.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_focus.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_unchecked.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_disabled.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_focus.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/radio_checked.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/radio_checked_disabled.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/radio_checked_focus.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/radio_unchecked.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/radio_unchecked_disabled.svg create mode 100644 3rdparty/QDarkStyleSheet/svg/radio_unchecked_focus.svg diff --git a/3rdparty/QDarkStyleSheet/COPYING b/3rdparty/QDarkStyleSheet/COPYING new file mode 100644 index 0000000..49f878c --- /dev/null +++ b/3rdparty/QDarkStyleSheet/COPYING @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) <2013-2017> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hmovetoolbar.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hmovetoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..349b9f02cf57392ad3739b4e89eeb542747c26aa GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eO!3HGrSK5O(Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPt7qfthQepbFUqB&8PZ!4!jq_J0UgTmB5Mbe#x4K_u z|7wq?l3FiN}K1 Uj$Y0702;>N>FVdQ&MBb@0JDcT2mk;8 literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hsepartoolbar.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..70465de9d30b4cc6cbf9e7e71980abe8de2ba43b GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^96&6{!3HEBTzh*1NUlU;2PT3Z5>GAsXkC6BcN7^!NXlmzV!9 mAKBA6VObz+Nw9+@1H<1{XE)7O>#As4eKKhIsRC)O# z(@UES6k1%=)%F~f3|jf2(rt}n5YvsmyNtPIl|^fJWmxAve|JjV`_**2f63WA`THbZ Ui0KqJ1I=RaboFyt=akR{07cX{`2YX_ literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Vsepartoolbar.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Vsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..14b9d1341d49d1afca119d4d53ad4eb7113d0d7a GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^f{XE)7O>#As4f#fC#fqQ9V#d+0(@_MB{vNf<#z@;IWSW{{Q}~ np0#p|8yOh@fng6*2?N93sVpq5+S*@%${9Re{an^LB{Ts5Z$u=u literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed-on.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed-on.png new file mode 100644 index 0000000000000000000000000000000000000000..d081e9b3b90d774450a8ea48f1184019e33a755a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq?nSt-CYAmd+F5V%0wNv=peG!PC{xWt~$(69A|)Be?(o literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..d652159a365396a046329cfc7695c89ee54431ca GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S90ZA8lL>4nJ za0`PlBg3pY5H=O_B-6{JiOAS{|sjWh15M=978y+r}k{*WnkcFe(-;BX~D)* rS0)5haD*y~YzrxP=F!`JhM)Jr2M#8aN7~DQS{OWC{an^LB{Ts5zf35P literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_open.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..66f8e1ac619d242f3d5a31ffb11291c09ea40468 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>w z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac*foG2iHXppcfQi(?4K_2h&D z3_UzN#dZqZOE?US3>3JRaTpjFIL#0^D8eWr9I$mUBg3(s>=R~}U&3=E8!o-U3d z5v^~hTl*b$5NO-KaZ$^2My7CvC3jk<^u2WvDUf$c)s+rzv%V1E9{A4TMP-Z4lZ6F6 zJvyqaW~@Kfmu*$9pTBmh4fB87Nq1MQib$?;e-iXiZ<}* z4@CWD;9;1v<$&N$mS=`@#Ch2ZV#{}RJvQ4QaCNnQ-mU-(MmI+R8*yI$%dfxAYY;s7 z_m>{S8>aWE2aPM4zg_apbyj4!CUG}xvu2#YiDkvbx1hxrj-4fv9WXW}Qu2zs*=;EB~B@C9lD4Pt3jc#EK9uo4$63*ah<+ zss)BhMo2G`V&I;1@X1nvU9S{R&b}_{bpE^krGqN=vm#%w`~A&$lHbmbGYy8TuE%Y! g4!>ah-@}e^jYL&g^Ys^bz?fn1boFyt=akR{0GqMPK>z>% literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..cb63cc2fac47ad304451f864be5fb9b9085910ee GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7Jo-U3d z5v^~h`}!SnkZ7B~UO?mu^MY^z;cfGr%T7e}s1?W?8ZIpHm|nqi{YV9S;d_3jiRW9V zC@j#CiOINs*XRD1%4NQnC4ao1_;X|a8O{J^t^>=I&uJH^EA=Yy=q@QJXMe6{= z3nu?QmTiqn8yL4lU7L4ID46lSggggJ-lhEfrK>ewSvD~j#OXbEpLgByNx%V?Yugz2 z%=F`x=yC0fIn20j(F*mKC7cqgJZ$I97rnv0D^bF3N854ErU!Bp^;Wf}GDU{OUt^u0 zW>d#j^wD7Ns`t{1S6kg*n)>$7^lzH?%EjxII~|lJaHueWsWo@_*Zi9Q-(<7@f_{&8 zrO0b9HEPU+9v)SBw)%l|Fntmmjz{W9#jS ei>v=l+`}wZn5FJg^3NX_F$|urelF{r5}E*p0K`TB literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_focus.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..671be273b06e2b721f494379ab61e527932ba69e GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI zppNSx%;=;sy8pirl$i(^Q{;p7B~mkolg-~Zb$e)}u@ ze@5oRhYp5nY;MQ?&){3o{PczlV|l~dUDN*uim-MX2VD+|d1jngsyJ2mc)FUftqnvzx5JtA;>!fgJt|n_5jQ7B^fH6Ii)cTP@1u pu!mvshZ3I`*Gv}|E|RNaU|1Y$kt#XS(go-!22WQ%mvv4FO#o$0SI__e literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate.png new file mode 100644 index 0000000000000000000000000000000000000000..41024f7688c0623c853ee9ceb8138949cb167738 GIT binary patch literal 493 zcmVq3^Yy%*$?9v7vi2H2P(8128Bb|(G4PNvN{@ZTf(3sn_sOi&WJR5%589C1Db zhCs&)0xKfAB%rDi8*{57O<)4_5qWijS3LmgKot?w^!;`wQO?#_V**LxkEL?C;d$Q3 z34D<_j%&$$-a|FC);<7TfKs-gBytH%5;%7a2k<;^G*6NSFcsCSFK#waI05=$7(Tm( zXKA)Hc7gXz!E<>7_ErgOC56D&1`2f;J-djcl1whQ1*)tmxvW08H=aDaB2-ihxwfOi!+%lfAUc7T48B=@f2S)wSqMWl~v zZI(b4)#rJ^CmD~QfYn(73rQ)kZ~?z)ATUOY#(t96+Wf5x{DKuI1xkTZpzt0jI=8N~ z@D(TpewDxrBCCa!&WPR`@bXPS;RdLmG@G0AVz*kYZB*;P;G2LaatSOCE0wD-47cV1 zuZZ-3B^9~I`tuKy4iEtEUw^L;PUs>VUo&4)=p@!2lYf|GrJ*qgDsqPEE>LwM@VVy$ iRL|pXH+A&QKavmPo@ys59Ed6a0000E;YP`4SSj=K`lQnqN;26wzVN;k)FHnvrk3C?wm`aM7umdKI;Vst05m34zW@LL literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..2159aca9a10f75729912579b33a1226e575799aa GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9Eo-U3d z5v^~hTl*b$5Mg-k8hGeCL!&lB&^xD7y>BB#3gn$qXZC6ymd#kPSfgCwOO2D=r^N+5 zJw7|dgetV6qbk!>#or&Sckj|)rDfLlx9!BzLz){NpZKh3z}$B1``V5SO@~m`&d1TB zFPXg)nog`1-usI20_&}gBemzbKX;_n9XqyBf99W!7jwS#7#6F4()FBFa_MYZPgcU( zS_U_U-aih`PlO_t6}*e$OX!)Ie`yQ*8keuHPS3X2n8Pqxfn#3m>Ec5MHB4$L|F3^% zND!}B?-loe_r`C{2jMH2Uo}`Q;Db^cY&se~TB4iwmri9$b1?Uu;sB%_cFATAov~jhym_YEdgAln?ixeQ z^=a2;y}eWCW~RA2fzc;$?>Dw)YxnzqlxvtK94R$eY;o}lF!UKbUHx3vIVCg!09=m0 AT>t<8 literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ade721e81ba47fa792d4586516b8744f8c49c8bb GIT binary patch literal 464 zcmV;>0WbcEP)z3Xli7-6*p9aNvlr>Itd;TFIVxd-y|OyrCsEBb@QA; zCyb(7HXkO*sBg@biZoF@2MSgIU*CL)>Rq?ji!Gh`NAd|iaAZN1hu>)c0000U^V1tLjO7h)cTN8vD8kxl9CSG-=9zI~sp3@KWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNQT>E=U)k3)21RpJh4PJd%48X!1Rk<{TbF5DteGD^~0|g!!@C>GY`iyW{mLQwXR9 zjuawUp;Cior+G8=rW1YKL<346a~6o?i6 z?{azNxS!7yQSaX@eYYe*y&Lw~I5fO96fyKs5_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNJl_8_?B`8_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00FK^L_t(|+U=W3lEWYj zMI&9@_Q}(`u2cpl>3<1~)?G61A!s1*ckDcfFZ2UV}LO?5Uq!7sp&5|Lr zfTKjnjPRZkWJYjL5i&cxRf5b8ZWSRb!H-Cg)!=(2=w1ph*!w+IAXfO}IR0~7*F_Qa z`pw#RYZBDEVegGY!&^fUrH_&@lDEd7sB!Nt!IH1UVjcpe@#iI>l*c;nh*$5U8tIw$ z+l1&g2_h;1+4GS90-h2W@Lz|3$D+sDcqIJ$Fn}zDEtSCPdH7ynL;@Qgz8UI~5CQ)& z2cR}RH8?i>>pVc&4v)?WjLjA8JfIhbwX>uih_phn;OPQd;F$0s0xau*=>@dHF(qg= zc(w$MhG(27gbHYZkCXt}4UYCaV^Kue4UWP@RDxz2^AQp>6MTdOw?k3H81~KwJrqSu zV2n!8tne%eQYe>aG`#0`e*H)qaweD|UsZtR<`t^3qj^g#n!V@I`OOz3vPZ3w_Z69r zWc!xbim@+B4kW+tRoToUXqTlkN(i|wpGAW8(Zqf-18CSiA59@;O!aKeLkRQXw z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac(A-+!@lDKp{;}7sn8e>&XcR z7pulY;Wn^IBG(*7A%~?b^VC!N=hHC=sm-IdEdjT~uc)I$ztaD0e F0ssj2CNKa1 literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/down_arrow_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/down_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5805d9842bb3c8bdf9ae741ebabc690a4929585a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAyZcdU741BJ9aT^vI=t|uoP zVCdoDDYjGKUczBuWT3#kjKjddz-flSK@mm~;ef4+85xf4WS1|%O$WD@{VY)RhkE)4M?c;Dn$FG#w;BeIx* zfm;}a85w5HkpK#^mw5WRvOnZv5j2u@?~$1Y6bkTkaSV~TJhlHIZ-W63vwrG^WzJI- zUj+D0eB0To`msDR_F-mcngoGnGkCiCxvXF7(8A5T-G@y GGywodVJqnX literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/left_arrow_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/left_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b9af8a34edb5f8dd767bf6afa303b89a31d38f GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9bR`<_$&i(E==bj5a^zeU&bwdtch>=_qAH5C#I(A02SZ= z-pqyvve{!vh3V|K2(Z;?j0;|Hq>tJ+4>OtTGCRJHZF@ZOcP8^q5Cr`I<~ScB9o=p= z&m^6bC_rXoz*@WDo;`Hvf?xzGIc?G2OIwY`1pwD|f5YrH(7gbIoJl|JS(+dUbvmTb zB5r&Bqu`aU1z`4E`<=%)mdf9?a};sgxR2RT5LuX#bWVMU#oQ*xD``&)6vecw1(rnna}5U zBv}}JUU#-zt!rHi$mjDrIL<6^D(>w}Oik4Xve{RW-j%cpG=ZjI)y&=*IB?)K*LCj$ zRDHh$oRrzj^z?Kq>70&LUiJM2-~*uKdfs9uz9g&qe#y)}0Tx})E2Z%}7S+9tjgq8G zz(UpczpGZOFDG$V%H`Y_mC6rh_9@YK{BbA$PyEhTe19x7TSPh3(2no@8jnJ}d` zxvz`)Xu-@3Q@U%O-8ttu@B6#&eeXFJcD1YLUFyZ`x^CY1#GHEIZf^VJ)fa|)EWFnC_vkwH{ z6N%(XrPA_FUeEIm3uZ8T)68avQmNeZ^mN!MezY4vBl-Klxl+0Oc_(iW1WUkMr#lwA61mWP^6gmcikThUVXxDm7!9M*?_AgI18~gF z1H*|#;zYYVZ2=^WVYb|CxN5a}7PC=xsG2|quMNcGX92#vbZHT|j#=*jKpN?%*2wG> z^-_116auGOL$e=c_Il3%1~2LHcaC7B3vd(Eku=gAhHwvQuxEgJEbHl{+%bXUhz^zO z1aMzw`&uyYd#6AxNnr@rTl>rgF}wdX0Kb}a^ohVmh_EiNtnd~J1gWB9;< zQeQOsw@G^iF9MGY79E(`tkvF|pP&B+z|Uqc0A~cJFP2I-+U4om@B3+mVcy`Fr2H#G zLmzjg?Ph4o^Sm*c%>u*JKeMaA-Ny3E)PG1ufSZlmvu)!&6#&$4$V4J>LSZIJL>K{la{0H2c zs~|?9C^x;rMaWb-8PX3|8pCWt!biMuy0?XQWQb<;X|43Tx`%u2d*Ay#=bm%m2uC>V zP+^=~UTj8M8r2nG5a!!_AedR2Z~X` z^C#k-|Ev48KfKp7anB!#d;YJu=VuP2fR+8R!0=+yodD>W_Zv61xCvYrMa;V91*W48 zlk+`pV9$aJo67F4y{x)QP|# zuvAI7%`!tkOxID(?!{Xg)et~F>Au&7WnfWmGWAJX(Q5Xad@h zW4pXoZt`faArQrMmE8|4geKr9vZClrczyyP>M$wW1;^C+m=Rbk24>RMfiB>Tz-(v& zg}`J5R?CJlfcYLbaD)NiLsho($9hS_#bPR2np!I<+q}LsH82yJKrt09X&4bjD(?9s z0J&awy%3nQz-?_<0DQpLhJ}c5s}PuT`K0>|VEpS=+R8ut=DfSL?<|gce#SPIk-hj& zt(8>gOaGp2U}Fbv$L{QRX+PHZKoq0E9FWc@-S;(`SC^H&KO$sSHiG-Rwc{`Y$)JXZ zz-et*7KJCUW)t9~eK8%t7hpJ_bZ7s|NY)%tmqqQ2WNlR=*;_}EZE9fVKruhU5e^-G Y1NpBZRoRadK>z>%07*qoM6N<$f;w}DFaQ7m literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4def65c64a9d55441f82fe66fc7f46e5b73a75 GIT binary patch literal 728 zcmV;}0w?{6P)@!=&7gwT^7eV48y+tYIRCxlLiT(zip~u_E}K!eZQ1UCJ)XWpcn*qFv|mj2Hymm zGOGZ1&1OGlqk`+ej=|zgCiDDE0Kzalw_mH}fqMq8tl7*>&(3Zg z<=pb}a>SKCQhxe=1 zDZv#_S~^K`0Q0>2NJI5nZ6eAi5Q&W)Tj`Fao}46Y)*j1A!XehJuV&-U1oWX;y{+O9Vm8?gbB$>af^ zw*ZW{XL~Faoy!4ZGMk^9n`^`d07#`$FMw5G<+u=%tPliCX7&)sr_<@k@^=LQ*e#cH zlGcEH(Ye>fV(~_l?|Kj7Dkc) literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6ece890e750b0685bbd818f22e5fbf999ccd35e1 GIT binary patch literal 760 zcmV6Hyq3pRX0tGI#@4O=(z(ra$opASN0&l!V!~ zGsFupMi4Yn7A{E9xN<|Zbl8%Z;>x%YH!O_WHWI)PKm&#gz*M7gJ{PpnM5bj5JNs=u!`ga zdVmk2x~L*MwQ&UK2QB~`Dl%3m6rLT6fN7e+lZKH~)f)mY2nNUV`F!P|tYujVfhklk ztLk(#78{?OoOB!Qf1;T{t^7JLns=NBjk1M8p$uFZv8+*G>eJ>Xz*wU-!A3(nlNkmc z35?D<&ckN1bxP&(QZkYFE+Y35$z-KmF0XlIJs*K-nw{NUU8}&yS;x70*z&)zv)PwG z&(~_T&+A|YycTzd!$Uw!g29Pa$^inZw}4*5Fa|v{UIP(HqgwGgaEIaP+*}D*M%BLn zkV52jtL1e>^_8ez^ev!pO8&g(E#tx$L?XTg094i2O?hBJARzl5{sneL_4H8%R5gO? zZYu(BRiyu@0>FU48{Yx~Mc}+;S&3GgZQD)(=Mi(Ony70 zgw)FKi^z1|aUM4cH~kt$W3lniTU)BCIV+pJ6jU9r-EjY4+jdG^H>WTlBDu5C=s2S%SwytG|&qy1B<|RZG49PACf*`UEpTkaXb%RO9HU}g)|IfP+T{SND8Rm6FUm; qM77uv3N6gc%>4ATZ<{v%H@^W&H{IQg@q%gq0000;(ZNqD1xa&r7l*n1_#$VNv$@8uKpD^(Yg!rs-u&mySz3x zZPmewoA|3(5ed=3lvIQo?lU4S?;e*cbV-``!^wBndk*Jwe%*6`Ofvc3g`y}Qe%Lrf zM~=<{C<7<~DB7nM*t{X(_-1F@|8?!;Zt4JTJ(y!=55OpZ_h7S5!fDy(A~R0{I738D zL8$7fp+~8t=)#MxT`%|Gok$E|orn3AV17^=sdPmu z9ZIFWq|WE0((KlQ>oIJr*0vn02W-QAB%)70FAq({4B!bfkMfUi~ek_$f*RST)55J#+#BE2=;@(#CR+jDgK2NURglS37FQ?Zk`&XaJb+PUn~Z%}G`mo&kx!C)voplk7DK$Im&m^!<{% gmtDJ=WHPAy0n)7IgxW`FVE_OC07*qoM6N<$f`lX-a{vGU literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/right_arrow.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0a4e6a7a8097818d9c0626c84f19f4d690dd31 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9wUkJ;l%oZHT?}(3D>Wp7T%b9XV|~Y(T_!;F44$rjF6*2UngIS-C?Eg; literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/sizegrip.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/sizegrip.png new file mode 100644 index 0000000000000000000000000000000000000000..350583aaac4aa474ac449eaea2cc7ddd060276b9 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0A8dZe4lyHC-T!u_VYZ zn8D%MjWi%f)6>Nz(!sM1rC-2ha+zM<2rMwpeI*@Z@PO%TWH}e*?iSqXK(y9 XcW6R37#&FAr-gY z-rUH`puoZ4SQyZj9Qd}kRkgExspwA+*PdmovgYQ`l$1@M%Pi(EdF8VmvF&CX@A%e}M=bpY`_UHx3vIVCg!0H#+y$^ZZW literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-branch-more.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-branch-more.png new file mode 100644 index 0000000000000000000000000000000000000000..62711409d7ed69ec98979394795822630458d9eb GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5PiX%b9eR9<JS%C8jVk7;fc! UBk#RM6lem2r>mdKI;Vst0ANBkrT_o{ literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-vline.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-vline.png new file mode 100644 index 0000000000000000000000000000000000000000..87536cce16aabb3710663f720f8d354b1bb0b757 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^fk14@;zM~Ln>~) zy|9s&!GMF=@x%h2gO1`OFspnaH4_oY}#FfpL8m Q-wTkir>mdKI;Vst0J6j{!2kdN literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/undock.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/undock.png new file mode 100644 index 0000000000000000000000000000000000000000..88691d779507c9b809391396407f5cb4a6497c40 GIT binary patch literal 578 zcmV-I0=@l-P)WFU8GbZ8()Nlj2>E@cM*00E{+L_t(|+U=X$4#OY} zLz`&--S*43w`rPoNlWaQLS8pfd~hg*uq-oX%osV0`LJ!+SPR{}9r(JUC& zi*OVO>rs3r1nW_FCJ5_Yd@BU&U3e=9yOQ`b5bSE=k3zUrc5+?UXD9c4F9B>-qyH)% z1tH=BQxRVU!7FWl=67leWRLz4ahXo| zoe{&T7oZ-FMxDSsBBvjZ{}acq6e%f?_~rzJ_LzyflS`(bcuN3?R&llQTw-2U8((=NC3B QV*mgE07*qoM6N<$f{lRZzyJUM literal 0 HcmV?d00001 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/up_arrow.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/up_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..abcc7245212f19a5dbff1bb19647b1dd4bb05b6a GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAy| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;v6FKKb3EC1BH}5T^vI=t|uoP z;C)upuu) + + rc/up_arrow_disabled.png + rc/Hmovetoolbar.png + rc/stylesheet-branch-end.png + rc/branch_closed-on.png + rc/stylesheet-vline.png + rc/branch_closed.png + rc/branch_open-on.png + rc/transparent.png + rc/right_arrow_disabled.png + rc/sizegrip.png + rc/close.png + rc/close-hover.png + rc/close-pressed.png + rc/down_arrow.png + rc/Vmovetoolbar.png + rc/left_arrow.png + rc/stylesheet-branch-more.png + rc/up_arrow.png + rc/right_arrow.png + rc/left_arrow_disabled.png + rc/Hsepartoolbar.png + rc/branch_open.png + rc/Vsepartoolbar.png + rc/down_arrow_disabled.png + rc/undock.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_focus.png + rc/checkbox_checked.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked.png + rc/radio_checked_disabled.png + rc/radio_checked_focus.png + rc/radio_checked.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_focus.png + rc/radio_unchecked.png + rc/extend.png + + + style.qss + + diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/style.qss b/3rdparty/QDarkStyleSheet/qdarkstyle/style.qss new file mode 100644 index 0000000..831f210 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/qdarkstyle/style.qss @@ -0,0 +1,1295 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) <2013-2014> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +QToolTip +{ + border: 1px solid #2b2b2b; + background-color: rgb(90, 102, 117);; + color: white; + padding: 5px; + opacity: 200; +} + +QWidget +{ + color: #eff0f1; + background-color: #383838; + selection-background-color:#2e2e2e; + selection-color: #eff0f1; + background-clip: border; + border-image: none; + border: 0px transparent black; + outline: 0; +} + +QWidget:item:hover +{ + background-color: #819a67; + color: #eff0f1; +} + +QWidget:item:selected +{ + background-color: #819a67; +} + +QCheckBox +{ + spacing: 5px; + outline: none; + color: #eff0f1; + margin-right: 2px; +} + +QCheckBox:disabled +{ + color: #2b2b2b; +} + +QCheckBox::indicator{ + width: 16px; + height: 16px; + color: #222222; +} + +QGroupBox::indicator +{ + width: 18px; + height: 18px; +} +QGroupBox::indicator +{ + margin-left: 2px; +} + +\\QCheckBox::indicator:unchecked +\\{ +\\ image: url(:/qss_icons/rc/checkbox_unchecked.png); +\\} + +\\QCheckBox::indicator:unchecked:hover, +\\QCheckBox::indicator:unchecked:focus, +\\QCheckBox::indicator:unchecked:pressed, +\\QGroupBox::indicator:unchecked:hover, +\\QGroupBox::indicator:unchecked:focus, +\\QGroupBox::indicator:unchecked:pressed +\\{ +\\ border: none; +\\ image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); +\\} + +\\QCheckBox::indicator:checked +\\{ +\\ image: url(:/qss_icons/rc/checkbox_checked.png); +\\} + +\\QCheckBox::indicator:checked:hover, +\\QCheckBox::indicator:checked:focus, +\\QCheckBox::indicator:checked:pressed, +\\QGroupBox::indicator:checked:hover, +\\QGroupBox::indicator:checked:focus, +\\QGroupBox::indicator:checked:pressed +\\{ +\\ border: none; +\\ image: url(:/qss_icons/rc/checkbox_checked_focus.png); +\\} + + +\\QCheckBox::indicator:indeterminate +\\{ +\\ image: url(:/qss_icons/rc/checkbox_indeterminate.png); +\\} + +\\QCheckBox::indicator:indeterminate:focus, +\\QCheckBox::indicator:indeterminate:hover, +\\QCheckBox::indicator:indeterminate:pressed +\\{ +\\ image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); +\\} + +\\QCheckBox::indicator:checked:disabled, +\\QGroupBox::indicator:checked:disabled +\\{ +\\ image: url(:/qss_icons/rc/checkbox_checked_disabled.png); +\\} + +\\QCheckBox::indicator:unchecked:disabled, +\\QGroupBox::indicator:unchecked:disabled +\\{ +\\ image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); +\\} + +QRadioButton +{ + spacing: 5px; + outline: none; + color: #eff0f1; + margin-bottom: 2px; +} + +QRadioButton:disabled +{ + color: #2b2b2b; +} +QRadioButton::indicator +{ + width: 16px; + height: 16px; +} + +\\QRadioButton::indicator:unchecked +\\{ +\\ image: url(:/qss_icons/rc/radio_unchecked.png); +\\} + + +\\QRadioButton::indicator:unchecked:hover, +\\QRadioButton::indicator:unchecked:focus, +\\QRadioButton::indicator:unchecked:pressed +\\{ +\\ border: none; +\\ outline: none; +\\ image: url(:/qss_icons/rc/radio_unchecked_focus.png); +\\} + +\\QRadioButton::indicator:checked +\\{ +\\ border: none; +\\ outline: none; +\\ image: url(:/qss_icons/rc/radio_checked.png); +\\} + +\\QRadioButton::indicator:checked:hover, +\\QRadioButton::indicator:checked:focus, +\\QRadioButton::indicator:checked:pressed +\\{ +\\ border: none; +\\ outline: none; +\\ image: url(:/qss_icons/rc/radio_checked_focus.png); +\\} + +\\QRadioButton::indicator:checked:disabled +\\{ +\\ outline: none; +\\ image: url(:/qss_icons/rc/radio_checked_disabled.png); +\\} + +\\QRadioButton::indicator:unchecked:disabled +\\{ +\\ image: url(:/qss_icons/rc/radio_unchecked_disabled.png); +\\} + +QMenuBar +{ + background-color: #383838; + color: #eff0f1; +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + background: transparent; + border: 1px solid #2b2b2b; +} + +QMenuBar::item:pressed +{ + border: 1px solid #2b2b2b; + background-color: #2e2e2e; + color: #eff0f1; + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu +{ + border: 1px solid #2b2b2b; + color: #eff0f1; + margin: 2px; +} + +QMenu::icon +{ + margin: 5px; +} + +QMenu::item +{ + padding: 5px 30px 5px 30px; + border: 1px solid transparent; /* reserve space for selection border */ +} + +QMenu::item:selected +{ + color: #eff0f1; +} + +QMenu::separator { + height: 2px; + background: lightblue; + margin-left: 10px; + margin-right: 5px; +} + +QMenu::indicator { + width: 18px; + height: 18px; +} + +/* non-exclusive indicator = check box style indicator + (see QActionGroup::setExclusive) */ +QMenu::indicator:non-exclusive:unchecked { + image: url(:/qss_icons/rc/checkbox_unchecked.png); +} + +QMenu::indicator:non-exclusive:unchecked:selected { + image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); +} + +QMenu::indicator:non-exclusive:checked { + image: url(:/qss_icons/rc/checkbox_checked.png); +} + +QMenu::indicator:non-exclusive:checked:selected { + image: url(:/qss_icons/rc/checkbox_checked_disabled.png); +} + +/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +QMenu::indicator:exclusive:unchecked { + image: url(:/qss_icons/rc/radio_unchecked.png); +} + +QMenu::indicator:exclusive:unchecked:selected { + image: url(:/qss_icons/rc/radio_unchecked_disabled.png); +} + +QMenu::indicator:exclusive:checked { + image: url(:/qss_icons/rc/radio_checked.png); +} + +QMenu::indicator:exclusive:checked:selected { + image: url(:/qss_icons/rc/radio_checked_disabled.png); +} + +QMenu::right-arrow { + margin: 5px; + image: url(:/qss_icons/rc/right_arrow.png) +} + + +QWidget:disabled +{ + color: #454545; + background-color: #383838; +} + +QAbstractItemView +{ + alternate-background-color: #383838; + color: #eff0f1; + border: 1px solid 3A3939; + border-radius: 2px; +} + +QWidget:focus, QMenuBar:focus +{ + border: 1px solid #4b6807; +} + +QTabWidget:focus, QCheckBox:focus, QRadioButton:focus, QSlider:focus +{ + border: none; +} + +QLineEdit +{ + background-color: #232629; + padding: 5px; + border-style: solid; + border: 1px solid #2b2b2b; + border-radius: 2px; + color: #eff0f1; +} + +QLineEdit:disabled{ + color: #858585; +} + +QAbstractItemView QLineEdit +{ + padding: 0; +} + +QGroupBox { + margin-top: 10px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; +} + +QAbstractScrollArea +{ + border-radius: 2px; + border: 1px solid #2b2b2b; + background-color: transparent; +} + +QScrollBar:horizontal +{ + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent #2A2929; + border-radius: 4px; + background-color: #2A2929; +} + +QScrollBar::handle:horizontal +{ + background-color: #605F5F; + min-width: 5px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal +{ + margin: 0px 3px 0px 3px; + border-image: url(:/qss_icons/rc/right_arrow_disabled.png); + width: 10px; + height: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal +{ + margin: 0px 3px 0px 3px; + border-image: url(:/qss_icons/rc/left_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on +{ + border-image: url(:/qss_icons/rc/right_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on +{ + border-image: url(:/qss_icons/rc/left_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal +{ + background: none; +} + + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal +{ + background: none; +} + +QScrollBar:vertical +{ + background-color: #2A2929; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent #2A2929; + border-radius: 4px; +} + +QScrollBar::handle:vertical +{ + background-color: #605F5F; + min-height: 5px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical +{ + margin: 3px 0px 3px 0px; + border-image: url(:/qss_icons/rc/up_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical +{ + margin: 3px 0px 3px 0px; + border-image: url(:/qss_icons/rc/down_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on +{ + + border-image: url(:/qss_icons/rc/up_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + + +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on +{ + border-image: url(:/qss_icons/rc/down_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical +{ + background: none; +} + + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical +{ + background: none; +} + +QTextEdit +{ + background-color: #232629; + color: #eff0f1; + border: 1px solid #2b2b2b; +} + +QPlainTextEdit +{ + background-color: #232629;; + color: #eff0f1; + border-radius: 2px; + border: 1px solid #2b2b2b; +} + +QHeaderView::section +{ + background-color: #2b2b2b; + color: #eff0f1; + padding: 5px; + border: 1px solid #2b2b2b; +} + +QSizeGrip { + image: url(:/qss_icons/rc/sizegrip.png); + width: 12px; + height: 12px; +} + + +QMainWindow::separator +{ + background-color: #383838; + color: white; + padding-left: 4px; + spacing: 2px; + border: 1px dashed #2b2b2b; +} + +QMainWindow::separator:hover +{ + + background-color: #787876; + color: white; + padding-left: 4px; + border: 1px solid #2b2b2b; + spacing: 2px; +} + + +QMenu::separator +{ + height: 1px; + background-color: #2b2b2b; + color: white; + padding-left: 4px; + margin-left: 10px; + margin-right: 5px; +} + + +QFrame +{ + border-radius: 0px; + border-top: 1px solid #2b2b2b; + border-left: 1px solid #2b2b2b; + border-bottom: 1px solid #767676; + border-right: 1px solid #767676; +} + +QFrame[frameShape="0"] +{ + border-radius: 2px; + border: 1px transparent #2b2b2b; +} + +QStackedWidget +{ + border: 1px transparent black; +} + +QToolBar { + border: 1px transparent #2b2b2b; + background: 1px solid #383838; + font-weight: bold; +} + +QToolBar::handle:horizontal { + image: url(:/qss_icons/rc/Hmovetoolbar.png); +} +QToolBar::handle:vertical { + image: url(:/qss_icons/rc/Vmovetoolbar.png); +} +QToolBar::separator:horizontal { + image: url(:/qss_icons/rc/Hsepartoolbar.png); +} +QToolBar::separator:vertical { + image: url(:/qss_icons/rc/Vsepartoolbar.png); +} + +QToolButton#qt_toolbar_ext_button { + background: transparent; + min-width: 8px; + width: 8px; + padding: 1px; + qproperty-icon: url(:/qss_icons/rc/extend.png); +} + +QPushButton +{ + color: #fff; + background-color: #404040; + border-width: 1px; + border-color: #2b2b2b; + border-style: solid; + padding: 5px; + border-radius: 2px; + outline: none; +} + +QPushButton:disabled +{ + background-color: #383838; + border-width: 1px; + border-color: #454545; + border-style: solid; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; + border-radius: 2px; + color: #454545; +} + +QPushButton:focus { + background-color: #2e2e2e; + color: white; +} + +QPushButton:pressed +{ + background-color: #2e2e2e; + padding-top: -15px; + padding-bottom: -17px; +} + +QComboBox +{ + selection-background-color: #2e2e2e; + border-style: solid; + border: 1px solid #2b2b2b; + border-radius: 2px; + padding: 5px; + min-width: 75px; +} + +QPushButton:checked{ + background-color: #2b2b2b; + border-color: #6A6969; +} + +QComboBox:hover,QPushButton:hover,QAbstractSpinBox:hover,QLineEdit:hover,QTextEdit:hover,QPlainTextEdit:hover,QAbstractView:hover,QTreeView:hover +{ + border: 1px solid #4b6807; + color: #eff0f1; +} + +QComboBox:on +{ + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QComboBox QAbstractItemView +{ + background-color: #232629; + border-radius: 2px; + border: 1px solid #2b2b2b; + selection-background-color: #89ae30; +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QComboBox::down-arrow +{ + image: url(:/qss_icons/rc/down_arrow_disabled.png); +} + +QComboBox::down-arrow:on, QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus +{ + image: url(:/qss_icons/rc/down_arrow.png); +} + +QAbstractSpinBox { + padding: 5px; + border: 1px solid #2b2b2b; + background-color: #232629; + color: #eff0f1; + border-radius: 2px; + min-width: 75px; +} + +QAbstractSpinBox:up-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center right; +} + +QAbstractSpinBox:down-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center left; +} + +QAbstractSpinBox::up-arrow,QAbstractSpinBox::up-arrow:disabled,QAbstractSpinBox::up-arrow:off { + image: url(:/qss_icons/rc/up_arrow_disabled.png); + width: 10px; + height: 10px; +} +QAbstractSpinBox::up-arrow:hover +{ + image: url(:/qss_icons/rc/up_arrow.png); +} + + +QAbstractSpinBox::down-arrow,QAbstractSpinBox::down-arrow:disabled,QAbstractSpinBox::down-arrow:off +{ + image: url(:/qss_icons/rc/down_arrow_disabled.png); + width: 10px; + height: 10px; +} +QAbstractSpinBox::down-arrow:hover +{ + image: url(:/qss_icons/rc/down_arrow.png); +} + + +QLabel +{ + border: 0px solid black; +} + +QTabWidget{ + border: 0px transparent black; +} + +QTabWidget::pane { + border: 1px solid #2b2b2b; + background-color: #404040; + padding: 5px; +} + +QTabWidget QWidget{ + background-color: #404040; +} + +QTabWidget::tab-bar { + left: 5px; /* move to the right by 5px */ +} + +QTabBar +{ + qproperty-drawBase: 0; + border-radius: 3px; +} + +QTabBar:focus +{ + border: 0px transparent black; +} + +QTabBar::close-button { + image: url(:/qss_icons/rc/close.png); + background: transparent; +} + +QTabBar::close-button:hover +{ + image: url(:/qss_icons/rc/close-hover.png); + background: transparent; +} + +QTabBar::close-button:pressed { + image: url(:/qss_icons/rc/close-pressed.png); + background: transparent; +} + +/* TOP TABS */ +QTabBar::tab:top { + color: #eff0f1; + border: 1px solid #2b2b2b; + border-bottom: 1px transparent black; + background-color: #404040; + padding: 5px; + min-width: 50px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +QTabBar::tab:top:!selected +{ + color: #eff0f1; + background-color: #383838; + border: 1px transparent #2b2b2b; + border-bottom: 1px transparent #2b2b2b; + border-top-left-radius: 2px; + border-top-right-radius: 2px; + +} + +QTabBar::tab:top:!selected:hover { + background-color: #2e2e2e; +} + +/* BOTTOM TABS */ +QTabBar::tab:bottom { + color: #eff0f1; + border: 1px solid #2b2b2b; + border-top: 1px solid #404040; + background-color: #404040; + padding: 5px; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + min-width: 50px; +} + +QTabBar::tab:bottom:!selected +{ + color: #eff0f1; + background-color: #383838; + border: 1px transparent #2b2b2b; + border-top: 1px transparent #2b2b2b; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:bottom:!selected:hover { + background-color: #2e2e2e; +} + +/* LEFT TABS */ +QTabBar::tab:left { + color: #eff0f1; + border: 1px solid #2b2b2b; + border-left: 1px transparent black; + background-color: #383838; + padding: 5px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + min-height: 50px; +} + +QTabBar::tab:left:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 1px solid #2b2b2b; + border-left: 1px transparent black; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:left:!selected:hover { + background-color: #2e2e2e; +} + + +/* RIGHT TABS */ +QTabBar::tab:right { + color: #eff0f1; + border: 1px solid #2b2b2b; + border-right: 1px transparent black; + background-color: #383838; + padding: 5px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; + min-height: 50px; +} + +QTabBar::tab:right:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 1px solid #2b2b2b; + border-right: 1px transparent black; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +QTabBar::tab:right:!selected:hover { + background-color: #2e2e2e; +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(:/qss_icons/rc/right_arrow.png); + } + + QTabBar QToolButton::left-arrow:enabled { + image: url(:/qss_icons/rc/left_arrow.png); + } + +QTabBar QToolButton::right-arrow:disabled { + image: url(:/qss_icons/rc/right_arrow_disabled.png); + } + + QTabBar QToolButton::left-arrow:disabled { + image: url(:/qss_icons/rc/left_arrow_disabled.png); + } + + +QDockWidget { + background: #383838; + border: 1px solid #403F3F; + titlebar-close-icon: url(:/qss_icons/rc/close.png); + titlebar-normal-icon: url(:/qss_icons/rc/undock.png); +} + +QDockWidget::close-button, QDockWidget::float-button { + border: 1px solid transparent; + border-radius: 2px; + background: transparent; +} + +QDockWidget::close-button:hover, QDockWidget::float-button:hover { + background: rgba(255, 255, 255, 10); +} + +QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { + padding: 1px -1px -1px 1px; + background: rgba(255, 255, 255, 10); +} + +QLabel#limeReportLabel{ + color: #7faa18; +} + +QTreeView, QListView +{ + border-top: 1px solid #2b2b2b; + border-left: 1px solid #2b2b2b; + border-bottom: 1px solid #767676; + border-right: 1px solid #767676; + background-color: #404040; +} + +QTreeView::item, QListView::item{ + height: 25px; +} + +QTreeView::branch:selected{ + background-color: #819a67; +} + +QTreeView::branch:!selected:hover, QTreeView::item:!selected:hover{ + background-color: #287399; +} + +QTreeView::branch:has-siblings:!adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-siblings:adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { + image: url(:/qss_icons/rc/branch_closed.png); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { + image: url(:/qss_icons/rc/branch_open.png); +} + +QTreeView::branch:has-children:!has-siblings:closed:hover, +QTreeView::branch:closed:has-children:has-siblings:hover { + image: url(:/qss_icons/rc/branch_closed-on.png); +} + +QTreeView::branch:open:has-children:!has-siblings:hover, +QTreeView::branch:open:has-children:has-siblings:hover { + image: url(:/qss_icons/rc/branch_open-on.png); +} + +QSlider::groove:horizontal { + border: 1px solid #565a5e; + height: 4px; + background: #565a5e; + margin: 0px; + border-radius: 2px; +} + +QSlider::handle:horizontal { + background: #232629; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: -8px 0; + border-radius: 9px; +} + +QSlider::groove:vertical { + border: 1px solid #565a5e; + width: 4px; + background: #565a5e; + margin: 0px; + border-radius: 3px; +} + +QSlider::handle:vertical { + background: #232629; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: 0 -8px; + border-radius: 9px; +} + +QToolButton { + background-color: #383838; + color : white; + border: 1px transparent #2b2b2b; + border-radius: 2px; + margin: 2px; + padding: 2px; +} + +QToolButton:hover, QToolButton::menu-button:hover { + background-color: #2b2b2b; + border: 1px solid #7faa18; +} + +QToolButton:checked, QToolButton:pressed, + QToolButton::menu-button:pressed { + background-color: #2e2e2e; + border: 1px solid #7faa18; +} + +QToolButton:text{ + color: #ffffff; +} + +QToolButton:disabled{ + background-color: transparent; +} + +QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ + padding-right: 20px; /* make way for the popup button */ + border: 1px #2b2b2b; + border-radius: 5px; +} + +QToolButton[popupMode="2"] { /* only for InstantPopup */ + padding-right: 10px; /* make way for the popup button */ + border: 1px #2b2b2b; +} + +/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +QToolButton::menu-indicator { + image: url(:/qss_icons/rc/down_arrow.png); + top: -7px; left: -2px; /* shift it a bit */ +} + +/* the subcontrols below are used only in the MenuButtonPopup mode */ +QToolButton::menu-button { + border: 1px transparent #2b2b2b; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + /* 16px width + 4px for border = 20px allocated above */ + width: 16px; + outline: none; +} + +QToolButton::menu-arrow { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QToolButton::menu-arrow:open { + border: 1px solid #2b2b2b; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + left: 8px; +} + +QTableView +{ + border: 1px solid #2b2b2b; + gridline-color: #383838; + background-color: #232629; +} + + +QTableView, QHeaderView +{ + border-radius: 0px; +} + +QTableView::item:pressed, QListView::item:pressed { + background: #819a67; + color: #eff0f1; +} + +QTableView::item:selected:active, QListView::item:selected:active { + background: #819a67; + color: #eff0f1; +} + + +QHeaderView +{ + background-color: #383838; + border: 1px transparent; + border-radius: 0px; + margin: 0px; + padding: 0px; + +} + +QHeaderView::section { + background-color: #383838; + color: #eff0f1; + padding: 5px; + border: 1px solid #2b2b2b; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one +{ + border-top: 1px transparent #2b2b2b; +} + +QHeaderView::section::vertical +{ + border-top: transparent; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one +{ + border-left: 1px transparent #2b2b2b; +} + +QHeaderView::section::horizontal +{ + border-left: transparent; +} + + +QHeaderView::section:checked + { + color: white; + background-color: #334e5e; + } + + /* style the sort indicator */ +QHeaderView::down-arrow { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QHeaderView::up-arrow { + image: url(:/qss_icons/rc/up_arrow.png); +} + + +QTableCornerButton::section { + background-color: #383838; + border: 1px transparent #2b2b2b; + border-radius: 0px; +} + +QToolBox { + padding: 5px; + border: 1px transparent black; +} + +QToolBox::tab { + color: #eff0f1; + background-color: #383838; + border: 1px solid #2b2b2b; + border-bottom: 1px transparent #383838; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +QToolBox::tab:selected { /* italicize selected tabs */ + font: italic; + background-color: #383838; + border-color: #7faa18; + } + +QStatusBar::item { + border: 0px transparent dark; + } + + +QFrame[height="3"], QFrame[width="3"] { + background-color: #2b2b2b; +} + + +QSplitter::handle { + border: 1px dashed #2b2b2b; +} + +QSplitter::handle:hover { + background-color: #787876; + border: 1px solid #2b2b2b; +} + +QSplitter::handle:horizontal { + width: 1px; +} + +QSplitter::handle:vertical { + height: 1px; +} + +QProgressBar { + border: 1px solid #2b2b2b; + border-radius: 5px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #05B8CC; +} + +QDateEdit +{ + selection-background-color: #2e2e2e; + border-style: solid; + border: 1px solid #3375A3; + border-radius: 2px; + padding: 1px; + min-width: 75px; +} + +QDateEdit:on +{ + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QDateEdit QAbstractItemView +{ + background-color: #232629; + border-radius: 2px; + border: 1px solid #3375A3; + selection-background-color: #2e2e2e; +} + +QDateEdit::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QDateEdit::down-arrow +{ + image: url(:/qss_icons/rc/down_arrow_disabled.png); +} + +QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, +QDateEdit::down-arrow:focus +{ + image: url(:/qss_icons/rc/down_arrow.png); +} diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_checked.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_checked.svg new file mode 100644 index 0000000..a0f5045 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/checkbox_checked.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_checked_disabled.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_checked_disabled.svg new file mode 100644 index 0000000..79e23f2 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/checkbox_checked_disabled.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_checked_focus.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_checked_focus.svg new file mode 100644 index 0000000..2683c6b --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/checkbox_checked_focus.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate.svg new file mode 100644 index 0000000..648734a --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_disabled.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_disabled.svg new file mode 100644 index 0000000..79f9afb --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_disabled.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_focus.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_focus.svg new file mode 100644 index 0000000..22d7337 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_focus.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked.svg new file mode 100644 index 0000000..b365e1b --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_disabled.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_disabled.svg new file mode 100644 index 0000000..a2a2059 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_disabled.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_focus.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_focus.svg new file mode 100644 index 0000000..ffb2523 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_focus.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/radio_checked.svg b/3rdparty/QDarkStyleSheet/svg/radio_checked.svg new file mode 100644 index 0000000..062c7ec --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/radio_checked.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/radio_checked_disabled.svg b/3rdparty/QDarkStyleSheet/svg/radio_checked_disabled.svg new file mode 100644 index 0000000..c0d9720 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/radio_checked_disabled.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/radio_checked_focus.svg b/3rdparty/QDarkStyleSheet/svg/radio_checked_focus.svg new file mode 100644 index 0000000..458c051 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/radio_checked_focus.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/radio_unchecked.svg b/3rdparty/QDarkStyleSheet/svg/radio_unchecked.svg new file mode 100644 index 0000000..83db993 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/radio_unchecked.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/radio_unchecked_disabled.svg b/3rdparty/QDarkStyleSheet/svg/radio_unchecked_disabled.svg new file mode 100644 index 0000000..0297243 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/radio_unchecked_disabled.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/QDarkStyleSheet/svg/radio_unchecked_focus.svg b/3rdparty/QDarkStyleSheet/svg/radio_unchecked_focus.svg new file mode 100644 index 0000000..3f5e289 --- /dev/null +++ b/3rdparty/QDarkStyleSheet/svg/radio_unchecked_focus.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + From 31f06a2320da270b2906968a00aa0a587d9cfb44 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 02:29:03 +0300 Subject: [PATCH 076/347] Dark theme dir renamed --- 3rdparty/dark_style_sheet/COPYING | 21 + .../qdarkstyle/rc/Hmovetoolbar.png | Bin 0 -> 180 bytes .../qdarkstyle/rc/Hsepartoolbar.png | Bin 0 -> 147 bytes .../qdarkstyle/rc/Vmovetoolbar.png | Bin 0 -> 179 bytes .../qdarkstyle/rc/Vsepartoolbar.png | Bin 0 -> 150 bytes .../qdarkstyle/rc/branch_closed-on.png | Bin 0 -> 147 bytes .../qdarkstyle/rc/branch_closed.png | Bin 0 -> 160 bytes .../qdarkstyle/rc/branch_open-on.png | Bin 0 -> 150 bytes .../qdarkstyle/rc/branch_open.png | Bin 0 -> 166 bytes .../qdarkstyle/rc/checkbox_checked.png | Bin 0 -> 492 bytes .../rc/checkbox_checked_disabled.png | Bin 0 -> 491 bytes .../qdarkstyle/rc/checkbox_checked_focus.png | Bin 0 -> 252 bytes .../qdarkstyle/rc/checkbox_indeterminate.png | Bin 0 -> 493 bytes .../rc/checkbox_indeterminate_disabled.png | Bin 0 -> 492 bytes .../rc/checkbox_indeterminate_focus.png | Bin 0 -> 249 bytes .../qdarkstyle/rc/checkbox_unchecked.png | Bin 0 -> 464 bytes .../rc/checkbox_unchecked_disabled.png | Bin 0 -> 464 bytes .../rc/checkbox_unchecked_focus.png | Bin 0 -> 240 bytes .../qdarkstyle/rc/close-hover.png | Bin 0 -> 598 bytes .../qdarkstyle/rc/close-pressed.png | Bin 0 -> 598 bytes .../dark_style_sheet/qdarkstyle/rc/close.png | Bin 0 -> 586 bytes .../qdarkstyle/rc/down_arrow.png | Bin 0 -> 165 bytes .../qdarkstyle/rc/down_arrow_disabled.png | Bin 0 -> 166 bytes .../dark_style_sheet/qdarkstyle/rc/extend.png | Bin 0 -> 195 bytes .../qdarkstyle/rc/left_arrow.png | Bin 0 -> 166 bytes .../qdarkstyle/rc/left_arrow_disabled.png | Bin 0 -> 166 bytes .../qdarkstyle/rc/radio_checked.png | Bin 0 -> 940 bytes .../qdarkstyle/rc/radio_checked_disabled.png | Bin 0 -> 972 bytes .../qdarkstyle/rc/radio_checked_focus.png | Bin 0 -> 846 bytes .../qdarkstyle/rc/radio_unchecked.png | Bin 0 -> 728 bytes .../rc/radio_unchecked_disabled.png | Bin 0 -> 760 bytes .../qdarkstyle/rc/radio_unchecked_focus.png | Bin 0 -> 646 bytes .../qdarkstyle/rc/right_arrow.png | Bin 0 -> 160 bytes .../qdarkstyle/rc/right_arrow_disabled.png | Bin 0 -> 160 bytes .../qdarkstyle/rc/sizegrip.png | Bin 0 -> 129 bytes .../qdarkstyle/rc/stylesheet-branch-end.png | Bin 0 -> 224 bytes .../qdarkstyle/rc/stylesheet-branch-more.png | Bin 0 -> 182 bytes .../qdarkstyle/rc/stylesheet-vline.png | Bin 0 -> 239 bytes .../qdarkstyle/rc/transparent.png | Bin 0 -> 195 bytes .../dark_style_sheet/qdarkstyle/rc/undock.png | Bin 0 -> 578 bytes .../qdarkstyle/rc/up_arrow.png | Bin 0 -> 158 bytes .../qdarkstyle/rc/up_arrow_disabled.png | Bin 0 -> 159 bytes .../dark_style_sheet/qdarkstyle/style.qrc | 47 + .../dark_style_sheet/qdarkstyle/style.qss | 1295 +++++++++++++++++ .../dark_style_sheet/svg/checkbox_checked.svg | 96 ++ .../svg/checkbox_checked_disabled.svg | 96 ++ .../svg/checkbox_checked_focus.svg | 96 ++ .../svg/checkbox_indeterminate.svg | 96 ++ .../svg/checkbox_indeterminate_disabled.svg | 96 ++ .../svg/checkbox_indeterminate_focus.svg | 96 ++ .../svg/checkbox_unchecked.svg | 71 + .../svg/checkbox_unchecked_disabled.svg | 71 + .../svg/checkbox_unchecked_focus.svg | 71 + .../dark_style_sheet/svg/radio_checked.svg | 73 + .../svg/radio_checked_disabled.svg | 73 + .../svg/radio_checked_focus.svg | 73 + .../dark_style_sheet/svg/radio_unchecked.svg | 67 + .../svg/radio_unchecked_disabled.svg | 67 + .../svg/radio_unchecked_focus.svg | 67 + 59 files changed, 2572 insertions(+) create mode 100644 3rdparty/dark_style_sheet/COPYING create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/Hmovetoolbar.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/Hsepartoolbar.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/Vmovetoolbar.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/Vsepartoolbar.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/branch_closed-on.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/branch_closed.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/branch_open-on.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/branch_open.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_checked.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_checked_disabled.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_checked_focus.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_indeterminate.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_indeterminate_disabled.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_indeterminate_focus.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_unchecked.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_unchecked_disabled.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_unchecked_focus.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/close-hover.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/close-pressed.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/close.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/down_arrow.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/down_arrow_disabled.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/extend.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/left_arrow.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/left_arrow_disabled.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/radio_checked.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/radio_checked_disabled.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/radio_checked_focus.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/radio_unchecked.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/radio_unchecked_disabled.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/radio_unchecked_focus.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/right_arrow.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/right_arrow_disabled.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/sizegrip.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/stylesheet-branch-end.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/stylesheet-branch-more.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/stylesheet-vline.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/transparent.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/undock.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/up_arrow.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/up_arrow_disabled.png create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/style.qrc create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/style.qss create mode 100644 3rdparty/dark_style_sheet/svg/checkbox_checked.svg create mode 100644 3rdparty/dark_style_sheet/svg/checkbox_checked_disabled.svg create mode 100644 3rdparty/dark_style_sheet/svg/checkbox_checked_focus.svg create mode 100644 3rdparty/dark_style_sheet/svg/checkbox_indeterminate.svg create mode 100644 3rdparty/dark_style_sheet/svg/checkbox_indeterminate_disabled.svg create mode 100644 3rdparty/dark_style_sheet/svg/checkbox_indeterminate_focus.svg create mode 100644 3rdparty/dark_style_sheet/svg/checkbox_unchecked.svg create mode 100644 3rdparty/dark_style_sheet/svg/checkbox_unchecked_disabled.svg create mode 100644 3rdparty/dark_style_sheet/svg/checkbox_unchecked_focus.svg create mode 100644 3rdparty/dark_style_sheet/svg/radio_checked.svg create mode 100644 3rdparty/dark_style_sheet/svg/radio_checked_disabled.svg create mode 100644 3rdparty/dark_style_sheet/svg/radio_checked_focus.svg create mode 100644 3rdparty/dark_style_sheet/svg/radio_unchecked.svg create mode 100644 3rdparty/dark_style_sheet/svg/radio_unchecked_disabled.svg create mode 100644 3rdparty/dark_style_sheet/svg/radio_unchecked_focus.svg diff --git a/3rdparty/dark_style_sheet/COPYING b/3rdparty/dark_style_sheet/COPYING new file mode 100644 index 0000000..49f878c --- /dev/null +++ b/3rdparty/dark_style_sheet/COPYING @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) <2013-2017> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/Hmovetoolbar.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/Hmovetoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..349b9f02cf57392ad3739b4e89eeb542747c26aa GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eO!3HGrSK5O(Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPt7qfthQepbFUqB&8PZ!4!jq_J0UgTmB5Mbe#x4K_u z|7wq?l3FiN}K1 Uj$Y0702;>N>FVdQ&MBb@0JDcT2mk;8 literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/Hsepartoolbar.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/Hsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..70465de9d30b4cc6cbf9e7e71980abe8de2ba43b GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^96&6{!3HEBTzh*1NUlU;2PT3Z5>GAsXkC6BcN7^!NXlmzV!9 mAKBA6VObz+Nw9+@1H<1{XE)7O>#As4eKKhIsRC)O# z(@UES6k1%=)%F~f3|jf2(rt}n5YvsmyNtPIl|^fJWmxAve|JjV`_**2f63WA`THbZ Ui0KqJ1I=RaboFyt=akR{07cX{`2YX_ literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/Vsepartoolbar.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/Vsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..14b9d1341d49d1afca119d4d53ad4eb7113d0d7a GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^f{XE)7O>#As4f#fC#fqQ9V#d+0(@_MB{vNf<#z@;IWSW{{Q}~ np0#p|8yOh@fng6*2?N93sVpq5+S*@%${9Re{an^LB{Ts5Z$u=u literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/branch_closed-on.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/branch_closed-on.png new file mode 100644 index 0000000000000000000000000000000000000000..d081e9b3b90d774450a8ea48f1184019e33a755a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq?nSt-CYAmd+F5V%0wNv=peG!PC{xWt~$(69A|)Be?(o literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/branch_closed.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/branch_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..d652159a365396a046329cfc7695c89ee54431ca GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S90ZA8lL>4nJ za0`PlBg3pY5H=O_B-6{JiOAS{|sjWh15M=978y+r}k{*WnkcFe(-;BX~D)* rS0)5haD*y~YzrxP=F!`JhM)Jr2M#8aN7~DQS{OWC{an^LB{Ts5zf35P literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/branch_open.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/branch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..66f8e1ac619d242f3d5a31ffb11291c09ea40468 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>w z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac*foG2iHXppcfQi(?4K_2h&D z3_UzN#dZqZOE?US3>3JRaTpjFIL#0^D8eWr9I$mUBg3(s>=R~}U&3=E8!o-U3d z5v^~hTl*b$5NO-KaZ$^2My7CvC3jk<^u2WvDUf$c)s+rzv%V1E9{A4TMP-Z4lZ6F6 zJvyqaW~@Kfmu*$9pTBmh4fB87Nq1MQib$?;e-iXiZ<}* z4@CWD;9;1v<$&N$mS=`@#Ch2ZV#{}RJvQ4QaCNnQ-mU-(MmI+R8*yI$%dfxAYY;s7 z_m>{S8>aWE2aPM4zg_apbyj4!CUG}xvu2#YiDkvbx1hxrj-4fv9WXW}Qu2zs*=;EB~B@C9lD4Pt3jc#EK9uo4$63*ah<+ zss)BhMo2G`V&I;1@X1nvU9S{R&b}_{bpE^krGqN=vm#%w`~A&$lHbmbGYy8TuE%Y! g4!>ah-@}e^jYL&g^Ys^bz?fn1boFyt=akR{0GqMPK>z>% literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_checked_disabled.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..cb63cc2fac47ad304451f864be5fb9b9085910ee GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7Jo-U3d z5v^~h`}!SnkZ7B~UO?mu^MY^z;cfGr%T7e}s1?W?8ZIpHm|nqi{YV9S;d_3jiRW9V zC@j#CiOINs*XRD1%4NQnC4ao1_;X|a8O{J^t^>=I&uJH^EA=Yy=q@QJXMe6{= z3nu?QmTiqn8yL4lU7L4ID46lSggggJ-lhEfrK>ewSvD~j#OXbEpLgByNx%V?Yugz2 z%=F`x=yC0fIn20j(F*mKC7cqgJZ$I97rnv0D^bF3N854ErU!Bp^;Wf}GDU{OUt^u0 zW>d#j^wD7Ns`t{1S6kg*n)>$7^lzH?%EjxII~|lJaHueWsWo@_*Zi9Q-(<7@f_{&8 zrO0b9HEPU+9v)SBw)%l|Fntmmjz{W9#jS ei>v=l+`}wZn5FJg^3NX_F$|urelF{r5}E*p0K`TB literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_checked_focus.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_checked_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..671be273b06e2b721f494379ab61e527932ba69e GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI zppNSx%;=;sy8pirl$i(^Q{;p7B~mkolg-~Zb$e)}u@ ze@5oRhYp5nY;MQ?&){3o{PczlV|l~dUDN*uim-MX2VD+|d1jngsyJ2mc)FUftqnvzx5JtA;>!fgJt|n_5jQ7B^fH6Ii)cTP@1u pu!mvshZ3I`*Gv}|E|RNaU|1Y$kt#XS(go-!22WQ%mvv4FO#o$0SI__e literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_indeterminate.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_indeterminate.png new file mode 100644 index 0000000000000000000000000000000000000000..41024f7688c0623c853ee9ceb8138949cb167738 GIT binary patch literal 493 zcmVq3^Yy%*$?9v7vi2H2P(8128Bb|(G4PNvN{@ZTf(3sn_sOi&WJR5%589C1Db zhCs&)0xKfAB%rDi8*{57O<)4_5qWijS3LmgKot?w^!;`wQO?#_V**LxkEL?C;d$Q3 z34D<_j%&$$-a|FC);<7TfKs-gBytH%5;%7a2k<;^G*6NSFcsCSFK#waI05=$7(Tm( zXKA)Hc7gXz!E<>7_ErgOC56D&1`2f;J-djcl1whQ1*)tmxvW08H=aDaB2-ihxwfOi!+%lfAUc7T48B=@f2S)wSqMWl~v zZI(b4)#rJ^CmD~QfYn(73rQ)kZ~?z)ATUOY#(t96+Wf5x{DKuI1xkTZpzt0jI=8N~ z@D(TpewDxrBCCa!&WPR`@bXPS;RdLmG@G0AVz*kYZB*;P;G2LaatSOCE0wD-47cV1 zuZZ-3B^9~I`tuKy4iEtEUw^L;PUs>VUo&4)=p@!2lYf|GrJ*qgDsqPEE>LwM@VVy$ iRL|pXH+A&QKavmPo@ys59Ed6a0000E;YP`4SSj=K`lQnqN;26wzVN;k)FHnvrk3C?wm`aM7umdKI;Vst05m34zW@LL literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_unchecked.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..2159aca9a10f75729912579b33a1226e575799aa GIT binary patch literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9Eo-U3d z5v^~hTl*b$5Mg-k8hGeCL!&lB&^xD7y>BB#3gn$qXZC6ymd#kPSfgCwOO2D=r^N+5 zJw7|dgetV6qbk!>#or&Sckj|)rDfLlx9!BzLz){NpZKh3z}$B1``V5SO@~m`&d1TB zFPXg)nog`1-usI20_&}gBemzbKX;_n9XqyBf99W!7jwS#7#6F4()FBFa_MYZPgcU( zS_U_U-aih`PlO_t6}*e$OX!)Ie`yQ*8keuHPS3X2n8Pqxfn#3m>Ec5MHB4$L|F3^% zND!}B?-loe_r`C{2jMH2Uo}`Q;Db^cY&se~TB4iwmri9$b1?Uu;sB%_cFATAov~jhym_YEdgAln?ixeQ z^=a2;y}eWCW~RA2fzc;$?>Dw)YxnzqlxvtK94R$eY;o}lF!UKbUHx3vIVCg!09=m0 AT>t<8 literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_unchecked_disabled.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ade721e81ba47fa792d4586516b8744f8c49c8bb GIT binary patch literal 464 zcmV;>0WbcEP)z3Xli7-6*p9aNvlr>Itd;TFIVxd-y|OyrCsEBb@QA; zCyb(7HXkO*sBg@biZoF@2MSgIU*CL)>Rq?ji!Gh`NAd|iaAZN1hu>)c0000U^V1tLjO7h)cTN8vD8kxl9CSG-=9zI~sp3@KWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNQT>E=U)k3)21RpJh4PJd%48X!1Rk<{TbF5DteGD^~0|g!!@C>GY`iyW{mLQwXR9 zjuawUp;Cior+G8=rW1YKL<346a~6o?i6 z?{azNxS!7yQSaX@eYYe*y&Lw~I5fO96fyKs5_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNJl_8_?B`8_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00FK^L_t(|+U=W3lEWYj zMI&9@_Q}(`u2cpl>3<1~)?G61A!s1*ckDcfFZ2UV}LO?5Uq!7sp&5|Lr zfTKjnjPRZkWJYjL5i&cxRf5b8ZWSRb!H-Cg)!=(2=w1ph*!w+IAXfO}IR0~7*F_Qa z`pw#RYZBDEVegGY!&^fUrH_&@lDEd7sB!Nt!IH1UVjcpe@#iI>l*c;nh*$5U8tIw$ z+l1&g2_h;1+4GS90-h2W@Lz|3$D+sDcqIJ$Fn}zDEtSCPdH7ynL;@Qgz8UI~5CQ)& z2cR}RH8?i>>pVc&4v)?WjLjA8JfIhbwX>uih_phn;OPQd;F$0s0xau*=>@dHF(qg= zc(w$MhG(27gbHYZkCXt}4UYCaV^Kue4UWP@RDxz2^AQp>6MTdOw?k3H81~KwJrqSu zV2n!8tne%eQYe>aG`#0`e*H)qaweD|UsZtR<`t^3qj^g#n!V@I`OOz3vPZ3w_Z69r zWc!xbim@+B4kW+tRoToUXqTlkN(i|wpGAW8(Zqf-18CSiA59@;O!aKeLkRQXw z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac(A-+!@lDKp{;}7sn8e>&XcR z7pulY;Wn^IBG(*7A%~?b^VC!N=hHC=sm-IdEdjT~uc)I$ztaD0e F0ssj2CNKa1 literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/down_arrow_disabled.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/down_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5805d9842bb3c8bdf9ae741ebabc690a4929585a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAyZcdU741BJ9aT^vI=t|uoP zVCdoDDYjGKUczBuWT3#kjKjddz-flSK@mm~;ef4+85xf4WS1|%O$WD@{VY)RhkE)4M?c;Dn$FG#w;BeIx* zfm;}a85w5HkpK#^mw5WRvOnZv5j2u@?~$1Y6bkTkaSV~TJhlHIZ-W63vwrG^WzJI- zUj+D0eB0To`msDR_F-mcngoGnGkCiCxvXF7(8A5T-G@y GGywodVJqnX literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/left_arrow_disabled.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/left_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b9af8a34edb5f8dd767bf6afa303b89a31d38f GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9bR`<_$&i(E==bj5a^zeU&bwdtch>=_qAH5C#I(A02SZ= z-pqyvve{!vh3V|K2(Z;?j0;|Hq>tJ+4>OtTGCRJHZF@ZOcP8^q5Cr`I<~ScB9o=p= z&m^6bC_rXoz*@WDo;`Hvf?xzGIc?G2OIwY`1pwD|f5YrH(7gbIoJl|JS(+dUbvmTb zB5r&Bqu`aU1z`4E`<=%)mdf9?a};sgxR2RT5LuX#bWVMU#oQ*xD``&)6vecw1(rnna}5U zBv}}JUU#-zt!rHi$mjDrIL<6^D(>w}Oik4Xve{RW-j%cpG=ZjI)y&=*IB?)K*LCj$ zRDHh$oRrzj^z?Kq>70&LUiJM2-~*uKdfs9uz9g&qe#y)}0Tx})E2Z%}7S+9tjgq8G zz(UpczpGZOFDG$V%H`Y_mC6rh_9@YK{BbA$PyEhTe19x7TSPh3(2no@8jnJ}d` zxvz`)Xu-@3Q@U%O-8ttu@B6#&eeXFJcD1YLUFyZ`x^CY1#GHEIZf^VJ)fa|)EWFnC_vkwH{ z6N%(XrPA_FUeEIm3uZ8T)68avQmNeZ^mN!MezY4vBl-Klxl+0Oc_(iW1WUkMr#lwA61mWP^6gmcikThUVXxDm7!9M*?_AgI18~gF z1H*|#;zYYVZ2=^WVYb|CxN5a}7PC=xsG2|quMNcGX92#vbZHT|j#=*jKpN?%*2wG> z^-_116auGOL$e=c_Il3%1~2LHcaC7B3vd(Eku=gAhHwvQuxEgJEbHl{+%bXUhz^zO z1aMzw`&uyYd#6AxNnr@rTl>rgF}wdX0Kb}a^ohVmh_EiNtnd~J1gWB9;< zQeQOsw@G^iF9MGY79E(`tkvF|pP&B+z|Uqc0A~cJFP2I-+U4om@B3+mVcy`Fr2H#G zLmzjg?Ph4o^Sm*c%>u*JKeMaA-Ny3E)PG1ufSZlmvu)!&6#&$4$V4J>LSZIJL>K{la{0H2c zs~|?9C^x;rMaWb-8PX3|8pCWt!biMuy0?XQWQb<;X|43Tx`%u2d*Ay#=bm%m2uC>V zP+^=~UTj8M8r2nG5a!!_AedR2Z~X` z^C#k-|Ev48KfKp7anB!#d;YJu=VuP2fR+8R!0=+yodD>W_Zv61xCvYrMa;V91*W48 zlk+`pV9$aJo67F4y{x)QP|# zuvAI7%`!tkOxID(?!{Xg)et~F>Au&7WnfWmGWAJX(Q5Xad@h zW4pXoZt`faArQrMmE8|4geKr9vZClrczyyP>M$wW1;^C+m=Rbk24>RMfiB>Tz-(v& zg}`J5R?CJlfcYLbaD)NiLsho($9hS_#bPR2np!I<+q}LsH82yJKrt09X&4bjD(?9s z0J&awy%3nQz-?_<0DQpLhJ}c5s}PuT`K0>|VEpS=+R8ut=DfSL?<|gce#SPIk-hj& zt(8>gOaGp2U}Fbv$L{QRX+PHZKoq0E9FWc@-S;(`SC^H&KO$sSHiG-Rwc{`Y$)JXZ zz-et*7KJCUW)t9~eK8%t7hpJ_bZ7s|NY)%tmqqQ2WNlR=*;_}EZE9fVKruhU5e^-G Y1NpBZRoRadK>z>%07*qoM6N<$f;w}DFaQ7m literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/radio_unchecked.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/radio_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4def65c64a9d55441f82fe66fc7f46e5b73a75 GIT binary patch literal 728 zcmV;}0w?{6P)@!=&7gwT^7eV48y+tYIRCxlLiT(zip~u_E}K!eZQ1UCJ)XWpcn*qFv|mj2Hymm zGOGZ1&1OGlqk`+ej=|zgCiDDE0Kzalw_mH}fqMq8tl7*>&(3Zg z<=pb}a>SKCQhxe=1 zDZv#_S~^K`0Q0>2NJI5nZ6eAi5Q&W)Tj`Fao}46Y)*j1A!XehJuV&-U1oWX;y{+O9Vm8?gbB$>af^ zw*ZW{XL~Faoy!4ZGMk^9n`^`d07#`$FMw5G<+u=%tPliCX7&)sr_<@k@^=LQ*e#cH zlGcEH(Ye>fV(~_l?|Kj7Dkc) literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/radio_unchecked_disabled.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/radio_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6ece890e750b0685bbd818f22e5fbf999ccd35e1 GIT binary patch literal 760 zcmV6Hyq3pRX0tGI#@4O=(z(ra$opASN0&l!V!~ zGsFupMi4Yn7A{E9xN<|Zbl8%Z;>x%YH!O_WHWI)PKm&#gz*M7gJ{PpnM5bj5JNs=u!`ga zdVmk2x~L*MwQ&UK2QB~`Dl%3m6rLT6fN7e+lZKH~)f)mY2nNUV`F!P|tYujVfhklk ztLk(#78{?OoOB!Qf1;T{t^7JLns=NBjk1M8p$uFZv8+*G>eJ>Xz*wU-!A3(nlNkmc z35?D<&ckN1bxP&(QZkYFE+Y35$z-KmF0XlIJs*K-nw{NUU8}&yS;x70*z&)zv)PwG z&(~_T&+A|YycTzd!$Uw!g29Pa$^inZw}4*5Fa|v{UIP(HqgwGgaEIaP+*}D*M%BLn zkV52jtL1e>^_8ez^ev!pO8&g(E#tx$L?XTg094i2O?hBJARzl5{sneL_4H8%R5gO? zZYu(BRiyu@0>FU48{Yx~Mc}+;S&3GgZQD)(=Mi(Ony70 zgw)FKi^z1|aUM4cH~kt$W3lniTU)BCIV+pJ6jU9r-EjY4+jdG^H>WTlBDu5C=s2S%SwytG|&qy1B<|RZG49PACf*`UEpTkaXb%RO9HU}g)|IfP+T{SND8Rm6FUm; qM77uv3N6gc%>4ATZ<{v%H@^W&H{IQg@q%gq0000;(ZNqD1xa&r7l*n1_#$VNv$@8uKpD^(Yg!rs-u&mySz3x zZPmewoA|3(5ed=3lvIQo?lU4S?;e*cbV-``!^wBndk*Jwe%*6`Ofvc3g`y}Qe%Lrf zM~=<{C<7<~DB7nM*t{X(_-1F@|8?!;Zt4JTJ(y!=55OpZ_h7S5!fDy(A~R0{I738D zL8$7fp+~8t=)#MxT`%|Gok$E|orn3AV17^=sdPmu z9ZIFWq|WE0((KlQ>oIJr*0vn02W-QAB%)70FAq({4B!bfkMfUi~ek_$f*RST)55J#+#BE2=;@(#CR+jDgK2NURglS37FQ?Zk`&XaJb+PUn~Z%}G`mo&kx!C)voplk7DK$Im&m^!<{% gmtDJ=WHPAy0n)7IgxW`FVE_OC07*qoM6N<$f`lX-a{vGU literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/right_arrow.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0a4e6a7a8097818d9c0626c84f19f4d690dd31 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9wUkJ;l%oZHT?}(3D>Wp7T%b9XV|~Y(T_!;F44$rjF6*2UngIS-C?Eg; literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/sizegrip.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/sizegrip.png new file mode 100644 index 0000000000000000000000000000000000000000..350583aaac4aa474ac449eaea2cc7ddd060276b9 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0A8dZe4lyHC-T!u_VYZ zn8D%MjWi%f)6>Nz(!sM1rC-2ha+zM<2rMwpeI*@Z@PO%TWH}e*?iSqXK(y9 XcW6R37#&FAr-gY z-rUH`puoZ4SQyZj9Qd}kRkgExspwA+*PdmovgYQ`l$1@M%Pi(EdF8VmvF&CX@A%e}M=bpY`_UHx3vIVCg!0H#+y$^ZZW literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/stylesheet-branch-more.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/stylesheet-branch-more.png new file mode 100644 index 0000000000000000000000000000000000000000..62711409d7ed69ec98979394795822630458d9eb GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5PiX%b9eR9<JS%C8jVk7;fc! UBk#RM6lem2r>mdKI;Vst0ANBkrT_o{ literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/stylesheet-vline.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/stylesheet-vline.png new file mode 100644 index 0000000000000000000000000000000000000000..87536cce16aabb3710663f720f8d354b1bb0b757 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^fk14@;zM~Ln>~) zy|9s&!GMF=@x%h2gO1`OFspnaH4_oY}#FfpL8m Q-wTkir>mdKI;Vst0J6j{!2kdN literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/undock.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/undock.png new file mode 100644 index 0000000000000000000000000000000000000000..88691d779507c9b809391396407f5cb4a6497c40 GIT binary patch literal 578 zcmV-I0=@l-P)WFU8GbZ8()Nlj2>E@cM*00E{+L_t(|+U=X$4#OY} zLz`&--S*43w`rPoNlWaQLS8pfd~hg*uq-oX%osV0`LJ!+SPR{}9r(JUC& zi*OVO>rs3r1nW_FCJ5_Yd@BU&U3e=9yOQ`b5bSE=k3zUrc5+?UXD9c4F9B>-qyH)% z1tH=BQxRVU!7FWl=67leWRLz4ahXo| zoe{&T7oZ-FMxDSsBBvjZ{}acq6e%f?_~rzJ_LzyflS`(bcuN3?R&llQTw-2U8((=NC3B QV*mgE07*qoM6N<$f{lRZzyJUM literal 0 HcmV?d00001 diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/up_arrow.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/up_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..abcc7245212f19a5dbff1bb19647b1dd4bb05b6a GIT binary patch literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAy| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;v6FKKb3EC1BH}5T^vI=t|uoP z;C)upuu) + + rc/up_arrow_disabled.png + rc/Hmovetoolbar.png + rc/stylesheet-branch-end.png + rc/branch_closed-on.png + rc/stylesheet-vline.png + rc/branch_closed.png + rc/branch_open-on.png + rc/transparent.png + rc/right_arrow_disabled.png + rc/sizegrip.png + rc/close.png + rc/close-hover.png + rc/close-pressed.png + rc/down_arrow.png + rc/Vmovetoolbar.png + rc/left_arrow.png + rc/stylesheet-branch-more.png + rc/up_arrow.png + rc/right_arrow.png + rc/left_arrow_disabled.png + rc/Hsepartoolbar.png + rc/branch_open.png + rc/Vsepartoolbar.png + rc/down_arrow_disabled.png + rc/undock.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_focus.png + rc/checkbox_checked.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked.png + rc/radio_checked_disabled.png + rc/radio_checked_focus.png + rc/radio_checked.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_focus.png + rc/radio_unchecked.png + rc/extend.png + + + style.qss + + diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss new file mode 100644 index 0000000..831f210 --- /dev/null +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -0,0 +1,1295 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) <2013-2014> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +QToolTip +{ + border: 1px solid #2b2b2b; + background-color: rgb(90, 102, 117);; + color: white; + padding: 5px; + opacity: 200; +} + +QWidget +{ + color: #eff0f1; + background-color: #383838; + selection-background-color:#2e2e2e; + selection-color: #eff0f1; + background-clip: border; + border-image: none; + border: 0px transparent black; + outline: 0; +} + +QWidget:item:hover +{ + background-color: #819a67; + color: #eff0f1; +} + +QWidget:item:selected +{ + background-color: #819a67; +} + +QCheckBox +{ + spacing: 5px; + outline: none; + color: #eff0f1; + margin-right: 2px; +} + +QCheckBox:disabled +{ + color: #2b2b2b; +} + +QCheckBox::indicator{ + width: 16px; + height: 16px; + color: #222222; +} + +QGroupBox::indicator +{ + width: 18px; + height: 18px; +} +QGroupBox::indicator +{ + margin-left: 2px; +} + +\\QCheckBox::indicator:unchecked +\\{ +\\ image: url(:/qss_icons/rc/checkbox_unchecked.png); +\\} + +\\QCheckBox::indicator:unchecked:hover, +\\QCheckBox::indicator:unchecked:focus, +\\QCheckBox::indicator:unchecked:pressed, +\\QGroupBox::indicator:unchecked:hover, +\\QGroupBox::indicator:unchecked:focus, +\\QGroupBox::indicator:unchecked:pressed +\\{ +\\ border: none; +\\ image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); +\\} + +\\QCheckBox::indicator:checked +\\{ +\\ image: url(:/qss_icons/rc/checkbox_checked.png); +\\} + +\\QCheckBox::indicator:checked:hover, +\\QCheckBox::indicator:checked:focus, +\\QCheckBox::indicator:checked:pressed, +\\QGroupBox::indicator:checked:hover, +\\QGroupBox::indicator:checked:focus, +\\QGroupBox::indicator:checked:pressed +\\{ +\\ border: none; +\\ image: url(:/qss_icons/rc/checkbox_checked_focus.png); +\\} + + +\\QCheckBox::indicator:indeterminate +\\{ +\\ image: url(:/qss_icons/rc/checkbox_indeterminate.png); +\\} + +\\QCheckBox::indicator:indeterminate:focus, +\\QCheckBox::indicator:indeterminate:hover, +\\QCheckBox::indicator:indeterminate:pressed +\\{ +\\ image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); +\\} + +\\QCheckBox::indicator:checked:disabled, +\\QGroupBox::indicator:checked:disabled +\\{ +\\ image: url(:/qss_icons/rc/checkbox_checked_disabled.png); +\\} + +\\QCheckBox::indicator:unchecked:disabled, +\\QGroupBox::indicator:unchecked:disabled +\\{ +\\ image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); +\\} + +QRadioButton +{ + spacing: 5px; + outline: none; + color: #eff0f1; + margin-bottom: 2px; +} + +QRadioButton:disabled +{ + color: #2b2b2b; +} +QRadioButton::indicator +{ + width: 16px; + height: 16px; +} + +\\QRadioButton::indicator:unchecked +\\{ +\\ image: url(:/qss_icons/rc/radio_unchecked.png); +\\} + + +\\QRadioButton::indicator:unchecked:hover, +\\QRadioButton::indicator:unchecked:focus, +\\QRadioButton::indicator:unchecked:pressed +\\{ +\\ border: none; +\\ outline: none; +\\ image: url(:/qss_icons/rc/radio_unchecked_focus.png); +\\} + +\\QRadioButton::indicator:checked +\\{ +\\ border: none; +\\ outline: none; +\\ image: url(:/qss_icons/rc/radio_checked.png); +\\} + +\\QRadioButton::indicator:checked:hover, +\\QRadioButton::indicator:checked:focus, +\\QRadioButton::indicator:checked:pressed +\\{ +\\ border: none; +\\ outline: none; +\\ image: url(:/qss_icons/rc/radio_checked_focus.png); +\\} + +\\QRadioButton::indicator:checked:disabled +\\{ +\\ outline: none; +\\ image: url(:/qss_icons/rc/radio_checked_disabled.png); +\\} + +\\QRadioButton::indicator:unchecked:disabled +\\{ +\\ image: url(:/qss_icons/rc/radio_unchecked_disabled.png); +\\} + +QMenuBar +{ + background-color: #383838; + color: #eff0f1; +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + background: transparent; + border: 1px solid #2b2b2b; +} + +QMenuBar::item:pressed +{ + border: 1px solid #2b2b2b; + background-color: #2e2e2e; + color: #eff0f1; + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu +{ + border: 1px solid #2b2b2b; + color: #eff0f1; + margin: 2px; +} + +QMenu::icon +{ + margin: 5px; +} + +QMenu::item +{ + padding: 5px 30px 5px 30px; + border: 1px solid transparent; /* reserve space for selection border */ +} + +QMenu::item:selected +{ + color: #eff0f1; +} + +QMenu::separator { + height: 2px; + background: lightblue; + margin-left: 10px; + margin-right: 5px; +} + +QMenu::indicator { + width: 18px; + height: 18px; +} + +/* non-exclusive indicator = check box style indicator + (see QActionGroup::setExclusive) */ +QMenu::indicator:non-exclusive:unchecked { + image: url(:/qss_icons/rc/checkbox_unchecked.png); +} + +QMenu::indicator:non-exclusive:unchecked:selected { + image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); +} + +QMenu::indicator:non-exclusive:checked { + image: url(:/qss_icons/rc/checkbox_checked.png); +} + +QMenu::indicator:non-exclusive:checked:selected { + image: url(:/qss_icons/rc/checkbox_checked_disabled.png); +} + +/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +QMenu::indicator:exclusive:unchecked { + image: url(:/qss_icons/rc/radio_unchecked.png); +} + +QMenu::indicator:exclusive:unchecked:selected { + image: url(:/qss_icons/rc/radio_unchecked_disabled.png); +} + +QMenu::indicator:exclusive:checked { + image: url(:/qss_icons/rc/radio_checked.png); +} + +QMenu::indicator:exclusive:checked:selected { + image: url(:/qss_icons/rc/radio_checked_disabled.png); +} + +QMenu::right-arrow { + margin: 5px; + image: url(:/qss_icons/rc/right_arrow.png) +} + + +QWidget:disabled +{ + color: #454545; + background-color: #383838; +} + +QAbstractItemView +{ + alternate-background-color: #383838; + color: #eff0f1; + border: 1px solid 3A3939; + border-radius: 2px; +} + +QWidget:focus, QMenuBar:focus +{ + border: 1px solid #4b6807; +} + +QTabWidget:focus, QCheckBox:focus, QRadioButton:focus, QSlider:focus +{ + border: none; +} + +QLineEdit +{ + background-color: #232629; + padding: 5px; + border-style: solid; + border: 1px solid #2b2b2b; + border-radius: 2px; + color: #eff0f1; +} + +QLineEdit:disabled{ + color: #858585; +} + +QAbstractItemView QLineEdit +{ + padding: 0; +} + +QGroupBox { + margin-top: 10px; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 10px; + padding-right: 10px; + padding-top: 2px; +} + +QAbstractScrollArea +{ + border-radius: 2px; + border: 1px solid #2b2b2b; + background-color: transparent; +} + +QScrollBar:horizontal +{ + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent #2A2929; + border-radius: 4px; + background-color: #2A2929; +} + +QScrollBar::handle:horizontal +{ + background-color: #605F5F; + min-width: 5px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal +{ + margin: 0px 3px 0px 3px; + border-image: url(:/qss_icons/rc/right_arrow_disabled.png); + width: 10px; + height: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal +{ + margin: 0px 3px 0px 3px; + border-image: url(:/qss_icons/rc/left_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on +{ + border-image: url(:/qss_icons/rc/right_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on +{ + border-image: url(:/qss_icons/rc/left_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal +{ + background: none; +} + + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal +{ + background: none; +} + +QScrollBar:vertical +{ + background-color: #2A2929; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent #2A2929; + border-radius: 4px; +} + +QScrollBar::handle:vertical +{ + background-color: #605F5F; + min-height: 5px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical +{ + margin: 3px 0px 3px 0px; + border-image: url(:/qss_icons/rc/up_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical +{ + margin: 3px 0px 3px 0px; + border-image: url(:/qss_icons/rc/down_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on +{ + + border-image: url(:/qss_icons/rc/up_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + + +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on +{ + border-image: url(:/qss_icons/rc/down_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical +{ + background: none; +} + + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical +{ + background: none; +} + +QTextEdit +{ + background-color: #232629; + color: #eff0f1; + border: 1px solid #2b2b2b; +} + +QPlainTextEdit +{ + background-color: #232629;; + color: #eff0f1; + border-radius: 2px; + border: 1px solid #2b2b2b; +} + +QHeaderView::section +{ + background-color: #2b2b2b; + color: #eff0f1; + padding: 5px; + border: 1px solid #2b2b2b; +} + +QSizeGrip { + image: url(:/qss_icons/rc/sizegrip.png); + width: 12px; + height: 12px; +} + + +QMainWindow::separator +{ + background-color: #383838; + color: white; + padding-left: 4px; + spacing: 2px; + border: 1px dashed #2b2b2b; +} + +QMainWindow::separator:hover +{ + + background-color: #787876; + color: white; + padding-left: 4px; + border: 1px solid #2b2b2b; + spacing: 2px; +} + + +QMenu::separator +{ + height: 1px; + background-color: #2b2b2b; + color: white; + padding-left: 4px; + margin-left: 10px; + margin-right: 5px; +} + + +QFrame +{ + border-radius: 0px; + border-top: 1px solid #2b2b2b; + border-left: 1px solid #2b2b2b; + border-bottom: 1px solid #767676; + border-right: 1px solid #767676; +} + +QFrame[frameShape="0"] +{ + border-radius: 2px; + border: 1px transparent #2b2b2b; +} + +QStackedWidget +{ + border: 1px transparent black; +} + +QToolBar { + border: 1px transparent #2b2b2b; + background: 1px solid #383838; + font-weight: bold; +} + +QToolBar::handle:horizontal { + image: url(:/qss_icons/rc/Hmovetoolbar.png); +} +QToolBar::handle:vertical { + image: url(:/qss_icons/rc/Vmovetoolbar.png); +} +QToolBar::separator:horizontal { + image: url(:/qss_icons/rc/Hsepartoolbar.png); +} +QToolBar::separator:vertical { + image: url(:/qss_icons/rc/Vsepartoolbar.png); +} + +QToolButton#qt_toolbar_ext_button { + background: transparent; + min-width: 8px; + width: 8px; + padding: 1px; + qproperty-icon: url(:/qss_icons/rc/extend.png); +} + +QPushButton +{ + color: #fff; + background-color: #404040; + border-width: 1px; + border-color: #2b2b2b; + border-style: solid; + padding: 5px; + border-radius: 2px; + outline: none; +} + +QPushButton:disabled +{ + background-color: #383838; + border-width: 1px; + border-color: #454545; + border-style: solid; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; + border-radius: 2px; + color: #454545; +} + +QPushButton:focus { + background-color: #2e2e2e; + color: white; +} + +QPushButton:pressed +{ + background-color: #2e2e2e; + padding-top: -15px; + padding-bottom: -17px; +} + +QComboBox +{ + selection-background-color: #2e2e2e; + border-style: solid; + border: 1px solid #2b2b2b; + border-radius: 2px; + padding: 5px; + min-width: 75px; +} + +QPushButton:checked{ + background-color: #2b2b2b; + border-color: #6A6969; +} + +QComboBox:hover,QPushButton:hover,QAbstractSpinBox:hover,QLineEdit:hover,QTextEdit:hover,QPlainTextEdit:hover,QAbstractView:hover,QTreeView:hover +{ + border: 1px solid #4b6807; + color: #eff0f1; +} + +QComboBox:on +{ + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QComboBox QAbstractItemView +{ + background-color: #232629; + border-radius: 2px; + border: 1px solid #2b2b2b; + selection-background-color: #89ae30; +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QComboBox::down-arrow +{ + image: url(:/qss_icons/rc/down_arrow_disabled.png); +} + +QComboBox::down-arrow:on, QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus +{ + image: url(:/qss_icons/rc/down_arrow.png); +} + +QAbstractSpinBox { + padding: 5px; + border: 1px solid #2b2b2b; + background-color: #232629; + color: #eff0f1; + border-radius: 2px; + min-width: 75px; +} + +QAbstractSpinBox:up-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center right; +} + +QAbstractSpinBox:down-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: center left; +} + +QAbstractSpinBox::up-arrow,QAbstractSpinBox::up-arrow:disabled,QAbstractSpinBox::up-arrow:off { + image: url(:/qss_icons/rc/up_arrow_disabled.png); + width: 10px; + height: 10px; +} +QAbstractSpinBox::up-arrow:hover +{ + image: url(:/qss_icons/rc/up_arrow.png); +} + + +QAbstractSpinBox::down-arrow,QAbstractSpinBox::down-arrow:disabled,QAbstractSpinBox::down-arrow:off +{ + image: url(:/qss_icons/rc/down_arrow_disabled.png); + width: 10px; + height: 10px; +} +QAbstractSpinBox::down-arrow:hover +{ + image: url(:/qss_icons/rc/down_arrow.png); +} + + +QLabel +{ + border: 0px solid black; +} + +QTabWidget{ + border: 0px transparent black; +} + +QTabWidget::pane { + border: 1px solid #2b2b2b; + background-color: #404040; + padding: 5px; +} + +QTabWidget QWidget{ + background-color: #404040; +} + +QTabWidget::tab-bar { + left: 5px; /* move to the right by 5px */ +} + +QTabBar +{ + qproperty-drawBase: 0; + border-radius: 3px; +} + +QTabBar:focus +{ + border: 0px transparent black; +} + +QTabBar::close-button { + image: url(:/qss_icons/rc/close.png); + background: transparent; +} + +QTabBar::close-button:hover +{ + image: url(:/qss_icons/rc/close-hover.png); + background: transparent; +} + +QTabBar::close-button:pressed { + image: url(:/qss_icons/rc/close-pressed.png); + background: transparent; +} + +/* TOP TABS */ +QTabBar::tab:top { + color: #eff0f1; + border: 1px solid #2b2b2b; + border-bottom: 1px transparent black; + background-color: #404040; + padding: 5px; + min-width: 50px; + border-top-left-radius: 2px; + border-top-right-radius: 2px; +} + +QTabBar::tab:top:!selected +{ + color: #eff0f1; + background-color: #383838; + border: 1px transparent #2b2b2b; + border-bottom: 1px transparent #2b2b2b; + border-top-left-radius: 2px; + border-top-right-radius: 2px; + +} + +QTabBar::tab:top:!selected:hover { + background-color: #2e2e2e; +} + +/* BOTTOM TABS */ +QTabBar::tab:bottom { + color: #eff0f1; + border: 1px solid #2b2b2b; + border-top: 1px solid #404040; + background-color: #404040; + padding: 5px; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + min-width: 50px; +} + +QTabBar::tab:bottom:!selected +{ + color: #eff0f1; + background-color: #383838; + border: 1px transparent #2b2b2b; + border-top: 1px transparent #2b2b2b; + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:bottom:!selected:hover { + background-color: #2e2e2e; +} + +/* LEFT TABS */ +QTabBar::tab:left { + color: #eff0f1; + border: 1px solid #2b2b2b; + border-left: 1px transparent black; + background-color: #383838; + padding: 5px; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; + min-height: 50px; +} + +QTabBar::tab:left:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 1px solid #2b2b2b; + border-left: 1px transparent black; + border-top-right-radius: 2px; + border-bottom-right-radius: 2px; +} + +QTabBar::tab:left:!selected:hover { + background-color: #2e2e2e; +} + + +/* RIGHT TABS */ +QTabBar::tab:right { + color: #eff0f1; + border: 1px solid #2b2b2b; + border-right: 1px transparent black; + background-color: #383838; + padding: 5px; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; + min-height: 50px; +} + +QTabBar::tab:right:!selected +{ + color: #eff0f1; + background-color: #54575B; + border: 1px solid #2b2b2b; + border-right: 1px transparent black; + border-top-left-radius: 2px; + border-bottom-left-radius: 2px; +} + +QTabBar::tab:right:!selected:hover { + background-color: #2e2e2e; +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(:/qss_icons/rc/right_arrow.png); + } + + QTabBar QToolButton::left-arrow:enabled { + image: url(:/qss_icons/rc/left_arrow.png); + } + +QTabBar QToolButton::right-arrow:disabled { + image: url(:/qss_icons/rc/right_arrow_disabled.png); + } + + QTabBar QToolButton::left-arrow:disabled { + image: url(:/qss_icons/rc/left_arrow_disabled.png); + } + + +QDockWidget { + background: #383838; + border: 1px solid #403F3F; + titlebar-close-icon: url(:/qss_icons/rc/close.png); + titlebar-normal-icon: url(:/qss_icons/rc/undock.png); +} + +QDockWidget::close-button, QDockWidget::float-button { + border: 1px solid transparent; + border-radius: 2px; + background: transparent; +} + +QDockWidget::close-button:hover, QDockWidget::float-button:hover { + background: rgba(255, 255, 255, 10); +} + +QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { + padding: 1px -1px -1px 1px; + background: rgba(255, 255, 255, 10); +} + +QLabel#limeReportLabel{ + color: #7faa18; +} + +QTreeView, QListView +{ + border-top: 1px solid #2b2b2b; + border-left: 1px solid #2b2b2b; + border-bottom: 1px solid #767676; + border-right: 1px solid #767676; + background-color: #404040; +} + +QTreeView::item, QListView::item{ + height: 25px; +} + +QTreeView::branch:selected{ + background-color: #819a67; +} + +QTreeView::branch:!selected:hover, QTreeView::item:!selected:hover{ + background-color: #287399; +} + +QTreeView::branch:has-siblings:!adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-siblings:adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + border-image: url(:/qss_icons/rc/transparent.png); +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { + image: url(:/qss_icons/rc/branch_closed.png); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { + image: url(:/qss_icons/rc/branch_open.png); +} + +QTreeView::branch:has-children:!has-siblings:closed:hover, +QTreeView::branch:closed:has-children:has-siblings:hover { + image: url(:/qss_icons/rc/branch_closed-on.png); +} + +QTreeView::branch:open:has-children:!has-siblings:hover, +QTreeView::branch:open:has-children:has-siblings:hover { + image: url(:/qss_icons/rc/branch_open-on.png); +} + +QSlider::groove:horizontal { + border: 1px solid #565a5e; + height: 4px; + background: #565a5e; + margin: 0px; + border-radius: 2px; +} + +QSlider::handle:horizontal { + background: #232629; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: -8px 0; + border-radius: 9px; +} + +QSlider::groove:vertical { + border: 1px solid #565a5e; + width: 4px; + background: #565a5e; + margin: 0px; + border-radius: 3px; +} + +QSlider::handle:vertical { + background: #232629; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: 0 -8px; + border-radius: 9px; +} + +QToolButton { + background-color: #383838; + color : white; + border: 1px transparent #2b2b2b; + border-radius: 2px; + margin: 2px; + padding: 2px; +} + +QToolButton:hover, QToolButton::menu-button:hover { + background-color: #2b2b2b; + border: 1px solid #7faa18; +} + +QToolButton:checked, QToolButton:pressed, + QToolButton::menu-button:pressed { + background-color: #2e2e2e; + border: 1px solid #7faa18; +} + +QToolButton:text{ + color: #ffffff; +} + +QToolButton:disabled{ + background-color: transparent; +} + +QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ + padding-right: 20px; /* make way for the popup button */ + border: 1px #2b2b2b; + border-radius: 5px; +} + +QToolButton[popupMode="2"] { /* only for InstantPopup */ + padding-right: 10px; /* make way for the popup button */ + border: 1px #2b2b2b; +} + +/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +QToolButton::menu-indicator { + image: url(:/qss_icons/rc/down_arrow.png); + top: -7px; left: -2px; /* shift it a bit */ +} + +/* the subcontrols below are used only in the MenuButtonPopup mode */ +QToolButton::menu-button { + border: 1px transparent #2b2b2b; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + /* 16px width + 4px for border = 20px allocated above */ + width: 16px; + outline: none; +} + +QToolButton::menu-arrow { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QToolButton::menu-arrow:open { + border: 1px solid #2b2b2b; +} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + left: 8px; +} + +QTableView +{ + border: 1px solid #2b2b2b; + gridline-color: #383838; + background-color: #232629; +} + + +QTableView, QHeaderView +{ + border-radius: 0px; +} + +QTableView::item:pressed, QListView::item:pressed { + background: #819a67; + color: #eff0f1; +} + +QTableView::item:selected:active, QListView::item:selected:active { + background: #819a67; + color: #eff0f1; +} + + +QHeaderView +{ + background-color: #383838; + border: 1px transparent; + border-radius: 0px; + margin: 0px; + padding: 0px; + +} + +QHeaderView::section { + background-color: #383838; + color: #eff0f1; + padding: 5px; + border: 1px solid #2b2b2b; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one +{ + border-top: 1px transparent #2b2b2b; +} + +QHeaderView::section::vertical +{ + border-top: transparent; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one +{ + border-left: 1px transparent #2b2b2b; +} + +QHeaderView::section::horizontal +{ + border-left: transparent; +} + + +QHeaderView::section:checked + { + color: white; + background-color: #334e5e; + } + + /* style the sort indicator */ +QHeaderView::down-arrow { + image: url(:/qss_icons/rc/down_arrow.png); +} + +QHeaderView::up-arrow { + image: url(:/qss_icons/rc/up_arrow.png); +} + + +QTableCornerButton::section { + background-color: #383838; + border: 1px transparent #2b2b2b; + border-radius: 0px; +} + +QToolBox { + padding: 5px; + border: 1px transparent black; +} + +QToolBox::tab { + color: #eff0f1; + background-color: #383838; + border: 1px solid #2b2b2b; + border-bottom: 1px transparent #383838; + border-top-left-radius: 5px; + border-top-right-radius: 5px; +} + +QToolBox::tab:selected { /* italicize selected tabs */ + font: italic; + background-color: #383838; + border-color: #7faa18; + } + +QStatusBar::item { + border: 0px transparent dark; + } + + +QFrame[height="3"], QFrame[width="3"] { + background-color: #2b2b2b; +} + + +QSplitter::handle { + border: 1px dashed #2b2b2b; +} + +QSplitter::handle:hover { + background-color: #787876; + border: 1px solid #2b2b2b; +} + +QSplitter::handle:horizontal { + width: 1px; +} + +QSplitter::handle:vertical { + height: 1px; +} + +QProgressBar { + border: 1px solid #2b2b2b; + border-radius: 5px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #05B8CC; +} + +QDateEdit +{ + selection-background-color: #2e2e2e; + border-style: solid; + border: 1px solid #3375A3; + border-radius: 2px; + padding: 1px; + min-width: 75px; +} + +QDateEdit:on +{ + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QDateEdit QAbstractItemView +{ + background-color: #232629; + border-radius: 2px; + border: 1px solid #3375A3; + selection-background-color: #2e2e2e; +} + +QDateEdit::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QDateEdit::down-arrow +{ + image: url(:/qss_icons/rc/down_arrow_disabled.png); +} + +QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, +QDateEdit::down-arrow:focus +{ + image: url(:/qss_icons/rc/down_arrow.png); +} diff --git a/3rdparty/dark_style_sheet/svg/checkbox_checked.svg b/3rdparty/dark_style_sheet/svg/checkbox_checked.svg new file mode 100644 index 0000000..a0f5045 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/checkbox_checked.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/checkbox_checked_disabled.svg b/3rdparty/dark_style_sheet/svg/checkbox_checked_disabled.svg new file mode 100644 index 0000000..79e23f2 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/checkbox_checked_disabled.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/checkbox_checked_focus.svg b/3rdparty/dark_style_sheet/svg/checkbox_checked_focus.svg new file mode 100644 index 0000000..2683c6b --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/checkbox_checked_focus.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/checkbox_indeterminate.svg b/3rdparty/dark_style_sheet/svg/checkbox_indeterminate.svg new file mode 100644 index 0000000..648734a --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/checkbox_indeterminate.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/checkbox_indeterminate_disabled.svg b/3rdparty/dark_style_sheet/svg/checkbox_indeterminate_disabled.svg new file mode 100644 index 0000000..79f9afb --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/checkbox_indeterminate_disabled.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/checkbox_indeterminate_focus.svg b/3rdparty/dark_style_sheet/svg/checkbox_indeterminate_focus.svg new file mode 100644 index 0000000..22d7337 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/checkbox_indeterminate_focus.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/checkbox_unchecked.svg b/3rdparty/dark_style_sheet/svg/checkbox_unchecked.svg new file mode 100644 index 0000000..b365e1b --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/checkbox_unchecked.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/checkbox_unchecked_disabled.svg b/3rdparty/dark_style_sheet/svg/checkbox_unchecked_disabled.svg new file mode 100644 index 0000000..a2a2059 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/checkbox_unchecked_disabled.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/checkbox_unchecked_focus.svg b/3rdparty/dark_style_sheet/svg/checkbox_unchecked_focus.svg new file mode 100644 index 0000000..ffb2523 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/checkbox_unchecked_focus.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/radio_checked.svg b/3rdparty/dark_style_sheet/svg/radio_checked.svg new file mode 100644 index 0000000..062c7ec --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/radio_checked.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/radio_checked_disabled.svg b/3rdparty/dark_style_sheet/svg/radio_checked_disabled.svg new file mode 100644 index 0000000..c0d9720 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/radio_checked_disabled.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/radio_checked_focus.svg b/3rdparty/dark_style_sheet/svg/radio_checked_focus.svg new file mode 100644 index 0000000..458c051 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/radio_checked_focus.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/radio_unchecked.svg b/3rdparty/dark_style_sheet/svg/radio_unchecked.svg new file mode 100644 index 0000000..83db993 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/radio_unchecked.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/radio_unchecked_disabled.svg b/3rdparty/dark_style_sheet/svg/radio_unchecked_disabled.svg new file mode 100644 index 0000000..0297243 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/radio_unchecked_disabled.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/dark_style_sheet/svg/radio_unchecked_focus.svg b/3rdparty/dark_style_sheet/svg/radio_unchecked_focus.svg new file mode 100644 index 0000000..3f5e289 --- /dev/null +++ b/3rdparty/dark_style_sheet/svg/radio_unchecked_focus.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + From 5a185c444d2195ef5bda6efc05172b19568eff76 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 02:30:00 +0300 Subject: [PATCH 077/347] Dark theme dir renamed --- 3rdparty/QDarkStyleSheet/COPYING | 21 - .../qdarkstyle/rc/Hmovetoolbar.png | Bin 180 -> 0 bytes .../qdarkstyle/rc/Hsepartoolbar.png | Bin 147 -> 0 bytes .../qdarkstyle/rc/Vmovetoolbar.png | Bin 179 -> 0 bytes .../qdarkstyle/rc/Vsepartoolbar.png | Bin 150 -> 0 bytes .../qdarkstyle/rc/branch_closed-on.png | Bin 147 -> 0 bytes .../qdarkstyle/rc/branch_closed.png | Bin 160 -> 0 bytes .../qdarkstyle/rc/branch_open-on.png | Bin 150 -> 0 bytes .../qdarkstyle/rc/branch_open.png | Bin 166 -> 0 bytes .../qdarkstyle/rc/checkbox_checked.png | Bin 492 -> 0 bytes .../rc/checkbox_checked_disabled.png | Bin 491 -> 0 bytes .../qdarkstyle/rc/checkbox_checked_focus.png | Bin 252 -> 0 bytes .../qdarkstyle/rc/checkbox_indeterminate.png | Bin 493 -> 0 bytes .../rc/checkbox_indeterminate_disabled.png | Bin 492 -> 0 bytes .../rc/checkbox_indeterminate_focus.png | Bin 249 -> 0 bytes .../qdarkstyle/rc/checkbox_unchecked.png | Bin 464 -> 0 bytes .../rc/checkbox_unchecked_disabled.png | Bin 464 -> 0 bytes .../rc/checkbox_unchecked_focus.png | Bin 240 -> 0 bytes .../qdarkstyle/rc/close-hover.png | Bin 598 -> 0 bytes .../qdarkstyle/rc/close-pressed.png | Bin 598 -> 0 bytes .../QDarkStyleSheet/qdarkstyle/rc/close.png | Bin 586 -> 0 bytes .../qdarkstyle/rc/down_arrow.png | Bin 165 -> 0 bytes .../qdarkstyle/rc/down_arrow_disabled.png | Bin 166 -> 0 bytes .../QDarkStyleSheet/qdarkstyle/rc/extend.png | Bin 195 -> 0 bytes .../qdarkstyle/rc/left_arrow.png | Bin 166 -> 0 bytes .../qdarkstyle/rc/left_arrow_disabled.png | Bin 166 -> 0 bytes .../qdarkstyle/rc/radio_checked.png | Bin 940 -> 0 bytes .../qdarkstyle/rc/radio_checked_disabled.png | Bin 972 -> 0 bytes .../qdarkstyle/rc/radio_checked_focus.png | Bin 846 -> 0 bytes .../qdarkstyle/rc/radio_unchecked.png | Bin 728 -> 0 bytes .../rc/radio_unchecked_disabled.png | Bin 760 -> 0 bytes .../qdarkstyle/rc/radio_unchecked_focus.png | Bin 646 -> 0 bytes .../qdarkstyle/rc/right_arrow.png | Bin 160 -> 0 bytes .../qdarkstyle/rc/right_arrow_disabled.png | Bin 160 -> 0 bytes .../qdarkstyle/rc/sizegrip.png | Bin 129 -> 0 bytes .../qdarkstyle/rc/stylesheet-branch-end.png | Bin 224 -> 0 bytes .../qdarkstyle/rc/stylesheet-branch-more.png | Bin 182 -> 0 bytes .../qdarkstyle/rc/stylesheet-vline.png | Bin 239 -> 0 bytes .../qdarkstyle/rc/transparent.png | Bin 195 -> 0 bytes .../QDarkStyleSheet/qdarkstyle/rc/undock.png | Bin 578 -> 0 bytes .../qdarkstyle/rc/up_arrow.png | Bin 158 -> 0 bytes .../qdarkstyle/rc/up_arrow_disabled.png | Bin 159 -> 0 bytes 3rdparty/QDarkStyleSheet/qdarkstyle/style.qrc | 47 - 3rdparty/QDarkStyleSheet/qdarkstyle/style.qss | 1295 ----------------- .../QDarkStyleSheet/svg/checkbox_checked.svg | 96 -- .../svg/checkbox_checked_disabled.svg | 96 -- .../svg/checkbox_checked_focus.svg | 96 -- .../svg/checkbox_indeterminate.svg | 96 -- .../svg/checkbox_indeterminate_disabled.svg | 96 -- .../svg/checkbox_indeterminate_focus.svg | 96 -- .../svg/checkbox_unchecked.svg | 71 - .../svg/checkbox_unchecked_disabled.svg | 71 - .../svg/checkbox_unchecked_focus.svg | 71 - .../QDarkStyleSheet/svg/radio_checked.svg | 73 - .../svg/radio_checked_disabled.svg | 73 - .../svg/radio_checked_focus.svg | 73 - .../QDarkStyleSheet/svg/radio_unchecked.svg | 67 - .../svg/radio_unchecked_disabled.svg | 67 - .../svg/radio_unchecked_focus.svg | 67 - demo_r2/demo_r2.pro | 3 +- demo_r2/main.cpp | 12 + translations/limereport_ar.ts | 682 ++++++++- translations/limereport_es_ES.qm | Bin 6410 -> 6052 bytes translations/limereport_es_ES.ts | 706 ++++++++- translations/limereport_ru.qm | Bin 39080 -> 53777 bytes translations/limereport_ru.ts | 210 ++- 66 files changed, 1519 insertions(+), 2666 deletions(-) delete mode 100644 3rdparty/QDarkStyleSheet/COPYING delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hmovetoolbar.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hsepartoolbar.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/Vmovetoolbar.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/Vsepartoolbar.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed-on.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_open-on.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_open.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_disabled.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_focus.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate_disabled.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate_focus.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked_disabled.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked_focus.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/close-hover.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/close-pressed.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/close.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/down_arrow.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/down_arrow_disabled.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/extend.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/left_arrow.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/left_arrow_disabled.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_checked.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_checked_disabled.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_checked_focus.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked_disabled.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked_focus.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/right_arrow.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/right_arrow_disabled.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/sizegrip.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-branch-end.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-branch-more.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-vline.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/transparent.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/undock.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/up_arrow.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/rc/up_arrow_disabled.png delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/style.qrc delete mode 100644 3rdparty/QDarkStyleSheet/qdarkstyle/style.qss delete mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_checked.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_checked_disabled.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_checked_focus.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_disabled.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_focus.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_unchecked.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_disabled.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_focus.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/radio_checked.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/radio_checked_disabled.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/radio_checked_focus.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/radio_unchecked.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/radio_unchecked_disabled.svg delete mode 100644 3rdparty/QDarkStyleSheet/svg/radio_unchecked_focus.svg diff --git a/3rdparty/QDarkStyleSheet/COPYING b/3rdparty/QDarkStyleSheet/COPYING deleted file mode 100644 index 49f878c..0000000 --- a/3rdparty/QDarkStyleSheet/COPYING +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) <2013-2017> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hmovetoolbar.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hmovetoolbar.png deleted file mode 100644 index 349b9f02cf57392ad3739b4e89eeb542747c26aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eO!3HGrSK5O(Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPt7qfthQepbFUqB&8PZ!4!jq_J0UgTmB5Mbe#x4K_u z|7wq?l3FiN}K1 Uj$Y0702;>N>FVdQ&MBb@0JDcT2mk;8 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hsepartoolbar.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Hsepartoolbar.png deleted file mode 100644 index 70465de9d30b4cc6cbf9e7e71980abe8de2ba43b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^96&6{!3HEBTzh*1NUlU;2PT3Z5>GAsXkC6BcN7^!NXlmzV!9 mAKBA6VObz+Nw9+@1H<1{XE)7O>#As4eKKhIsRC)O# z(@UES6k1%=)%F~f3|jf2(rt}n5YvsmyNtPIl|^fJWmxAve|JjV`_**2f63WA`THbZ Ui0KqJ1I=RaboFyt=akR{07cX{`2YX_ diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Vsepartoolbar.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/Vsepartoolbar.png deleted file mode 100644 index 14b9d1341d49d1afca119d4d53ad4eb7113d0d7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^f{XE)7O>#As4f#fC#fqQ9V#d+0(@_MB{vNf<#z@;IWSW{{Q}~ np0#p|8yOh@fng6*2?N93sVpq5+S*@%${9Re{an^LB{Ts5Z$u=u diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed-on.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed-on.png deleted file mode 100644 index d081e9b3b90d774450a8ea48f1184019e33a755a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq?nSt-CYAmd+F5V%0wNv=peG!PC{xWt~$(69A|)Be?(o diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_closed.png deleted file mode 100644 index d652159a365396a046329cfc7695c89ee54431ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S90ZA8lL>4nJ za0`PlBg3pY5H=O_B-6{JiOAS{|sjWh15M=978y+r}k{*WnkcFe(-;BX~D)* rS0)5haD*y~YzrxP=F!`JhM)Jr2M#8aN7~DQS{OWC{an^LB{Ts5zf35P diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_open.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/branch_open.png deleted file mode 100644 index 66f8e1ac619d242f3d5a31ffb11291c09ea40468..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>w z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac*foG2iHXppcfQi(?4K_2h&D z3_UzN#dZqZOE?US3>3JRaTpjFIL#0^D8eWr9I$mUBg3(s>=R~}U&3=E8!o-U3d z5v^~hTl*b$5NO-KaZ$^2My7CvC3jk<^u2WvDUf$c)s+rzv%V1E9{A4TMP-Z4lZ6F6 zJvyqaW~@Kfmu*$9pTBmh4fB87Nq1MQib$?;e-iXiZ<}* z4@CWD;9;1v<$&N$mS=`@#Ch2ZV#{}RJvQ4QaCNnQ-mU-(MmI+R8*yI$%dfxAYY;s7 z_m>{S8>aWE2aPM4zg_apbyj4!CUG}xvu2#YiDkvbx1hxrj-4fv9WXW}Qu2zs*=;EB~B@C9lD4Pt3jc#EK9uo4$63*ah<+ zss)BhMo2G`V&I;1@X1nvU9S{R&b}_{bpE^krGqN=vm#%w`~A&$lHbmbGYy8TuE%Y! g4!>ah-@}e^jYL&g^Ys^bz?fn1boFyt=akR{0GqMPK>z>% diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_disabled.png deleted file mode 100644 index cb63cc2fac47ad304451f864be5fb9b9085910ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7Jo-U3d z5v^~h`}!SnkZ7B~UO?mu^MY^z;cfGr%T7e}s1?W?8ZIpHm|nqi{YV9S;d_3jiRW9V zC@j#CiOINs*XRD1%4NQnC4ao1_;X|a8O{J^t^>=I&uJH^EA=Yy=q@QJXMe6{= z3nu?QmTiqn8yL4lU7L4ID46lSggggJ-lhEfrK>ewSvD~j#OXbEpLgByNx%V?Yugz2 z%=F`x=yC0fIn20j(F*mKC7cqgJZ$I97rnv0D^bF3N854ErU!Bp^;Wf}GDU{OUt^u0 zW>d#j^wD7Ns`t{1S6kg*n)>$7^lzH?%EjxII~|lJaHueWsWo@_*Zi9Q-(<7@f_{&8 zrO0b9HEPU+9v)SBw)%l|Fntmmjz{W9#jS ei>v=l+`}wZn5FJg^3NX_F$|urelF{r5}E*p0K`TB diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_focus.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_checked_focus.png deleted file mode 100644 index 671be273b06e2b721f494379ab61e527932ba69e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI zppNSx%;=;sy8pirl$i(^Q{;p7B~mkolg-~Zb$e)}u@ ze@5oRhYp5nY;MQ?&){3o{PczlV|l~dUDN*uim-MX2VD+|d1jngsyJ2mc)FUftqnvzx5JtA;>!fgJt|n_5jQ7B^fH6Ii)cTP@1u pu!mvshZ3I`*Gv}|E|RNaU|1Y$kt#XS(go-!22WQ%mvv4FO#o$0SI__e diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_indeterminate.png deleted file mode 100644 index 41024f7688c0623c853ee9ceb8138949cb167738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493 zcmVq3^Yy%*$?9v7vi2H2P(8128Bb|(G4PNvN{@ZTf(3sn_sOi&WJR5%589C1Db zhCs&)0xKfAB%rDi8*{57O<)4_5qWijS3LmgKot?w^!;`wQO?#_V**LxkEL?C;d$Q3 z34D<_j%&$$-a|FC);<7TfKs-gBytH%5;%7a2k<;^G*6NSFcsCSFK#waI05=$7(Tm( zXKA)Hc7gXz!E<>7_ErgOC56D&1`2f;J-djcl1whQ1*)tmxvW08H=aDaB2-ihxwfOi!+%lfAUc7T48B=@f2S)wSqMWl~v zZI(b4)#rJ^CmD~QfYn(73rQ)kZ~?z)ATUOY#(t96+Wf5x{DKuI1xkTZpzt0jI=8N~ z@D(TpewDxrBCCa!&WPR`@bXPS;RdLmG@G0AVz*kYZB*;P;G2LaatSOCE0wD-47cV1 zuZZ-3B^9~I`tuKy4iEtEUw^L;PUs>VUo&4)=p@!2lYf|GrJ*qgDsqPEE>LwM@VVy$ iRL|pXH+A&QKavmPo@ys59Ed6a0000E;YP`4SSj=K`lQnqN;26wzVN;k)FHnvrk3C?wm`aM7umdKI;Vst05m34zW@LL diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked.png deleted file mode 100644 index 2159aca9a10f75729912579b33a1226e575799aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E9Eo-U3d z5v^~hTl*b$5Mg-k8hGeCL!&lB&^xD7y>BB#3gn$qXZC6ymd#kPSfgCwOO2D=r^N+5 zJw7|dgetV6qbk!>#or&Sckj|)rDfLlx9!BzLz){NpZKh3z}$B1``V5SO@~m`&d1TB zFPXg)nog`1-usI20_&}gBemzbKX;_n9XqyBf99W!7jwS#7#6F4()FBFa_MYZPgcU( zS_U_U-aih`PlO_t6}*e$OX!)Ie`yQ*8keuHPS3X2n8Pqxfn#3m>Ec5MHB4$L|F3^% zND!}B?-loe_r`C{2jMH2Uo}`Q;Db^cY&se~TB4iwmri9$b1?Uu;sB%_cFATAov~jhym_YEdgAln?ixeQ z^=a2;y}eWCW~RA2fzc;$?>Dw)YxnzqlxvtK94R$eY;o}lF!UKbUHx3vIVCg!09=m0 AT>t<8 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/checkbox_unchecked_disabled.png deleted file mode 100644 index ade721e81ba47fa792d4586516b8744f8c49c8bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 464 zcmV;>0WbcEP)z3Xli7-6*p9aNvlr>Itd;TFIVxd-y|OyrCsEBb@QA; zCyb(7HXkO*sBg@biZoF@2MSgIU*CL)>Rq?ji!Gh`NAd|iaAZN1hu>)c0000U^V1tLjO7h)cTN8vD8kxl9CSG-=9zI~sp3@KWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNQT>E=U)k3)21RpJh4PJd%48X!1Rk<{TbF5DteGD^~0|g!!@C>GY`iyW{mLQwXR9 zjuawUp;Cior+G8=rW1YKL<346a~6o?i6 z?{azNxS!7yQSaX@eYYe*y&Lw~I5fO96fyKs5_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNJl_8_?B`8_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljWFU8GbZ8()Nlj2>E@cM*00FK^L_t(|+U=W3lEWYj zMI&9@_Q}(`u2cpl>3<1~)?G61A!s1*ckDcfFZ2UV}LO?5Uq!7sp&5|Lr zfTKjnjPRZkWJYjL5i&cxRf5b8ZWSRb!H-Cg)!=(2=w1ph*!w+IAXfO}IR0~7*F_Qa z`pw#RYZBDEVegGY!&^fUrH_&@lDEd7sB!Nt!IH1UVjcpe@#iI>l*c;nh*$5U8tIw$ z+l1&g2_h;1+4GS90-h2W@Lz|3$D+sDcqIJ$Fn}zDEtSCPdH7ynL;@Qgz8UI~5CQ)& z2cR}RH8?i>>pVc&4v)?WjLjA8JfIhbwX>uih_phn;OPQd;F$0s0xau*=>@dHF(qg= zc(w$MhG(27gbHYZkCXt}4UYCaV^Kue4UWP@RDxz2^AQp>6MTdOw?k3H81~KwJrqSu zV2n!8tne%eQYe>aG`#0`e*H)qaweD|UsZtR<`t^3qj^g#n!V@I`OOz3vPZ3w_Z69r zWc!xbim@+B4kW+tRoToUXqTlkN(i|wpGAW8(Zqf-18CSiA59@;O!aKeLkRQXw z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac(A-+!@lDKp{;}7sn8e>&XcR z7pulY;Wn^IBG(*7A%~?b^VC!N=hHC=sm-IdEdjT~uc)I$ztaD0e F0ssj2CNKa1 diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/down_arrow_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/down_arrow_disabled.png deleted file mode 100644 index 5805d9842bb3c8bdf9ae741ebabc690a4929585a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAyZcdU741BJ9aT^vI=t|uoP zVCdoDDYjGKUczBuWT3#kjKjddz-flSK@mm~;ef4+85xf4WS1|%O$WD@{VY)RhkE)4M?c;Dn$FG#w;BeIx* zfm;}a85w5HkpK#^mw5WRvOnZv5j2u@?~$1Y6bkTkaSV~TJhlHIZ-W63vwrG^WzJI- zUj+D0eB0To`msDR_F-mcngoGnGkCiCxvXF7(8A5T-G@y GGywodVJqnX diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/left_arrow_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/left_arrow_disabled.png deleted file mode 100644 index f5b9af8a34edb5f8dd767bf6afa303b89a31d38f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9bR`<_$&i(E==bj5a^zeU&bwdtch>=_qAH5C#I(A02SZ= z-pqyvve{!vh3V|K2(Z;?j0;|Hq>tJ+4>OtTGCRJHZF@ZOcP8^q5Cr`I<~ScB9o=p= z&m^6bC_rXoz*@WDo;`Hvf?xzGIc?G2OIwY`1pwD|f5YrH(7gbIoJl|JS(+dUbvmTb zB5r&Bqu`aU1z`4E`<=%)mdf9?a};sgxR2RT5LuX#bWVMU#oQ*xD``&)6vecw1(rnna}5U zBv}}JUU#-zt!rHi$mjDrIL<6^D(>w}Oik4Xve{RW-j%cpG=ZjI)y&=*IB?)K*LCj$ zRDHh$oRrzj^z?Kq>70&LUiJM2-~*uKdfs9uz9g&qe#y)}0Tx})E2Z%}7S+9tjgq8G zz(UpczpGZOFDG$V%H`Y_mC6rh_9@YK{BbA$PyEhTe19x7TSPh3(2no@8jnJ}d` zxvz`)Xu-@3Q@U%O-8ttu@B6#&eeXFJcD1YLUFyZ`x^CY1#GHEIZf^VJ)fa|)EWFnC_vkwH{ z6N%(XrPA_FUeEIm3uZ8T)68avQmNeZ^mN!MezY4vBl-Klxl+0Oc_(iW1WUkMr#lwA61mWP^6gmcikThUVXxDm7!9M*?_AgI18~gF z1H*|#;zYYVZ2=^WVYb|CxN5a}7PC=xsG2|quMNcGX92#vbZHT|j#=*jKpN?%*2wG> z^-_116auGOL$e=c_Il3%1~2LHcaC7B3vd(Eku=gAhHwvQuxEgJEbHl{+%bXUhz^zO z1aMzw`&uyYd#6AxNnr@rTl>rgF}wdX0Kb}a^ohVmh_EiNtnd~J1gWB9;< zQeQOsw@G^iF9MGY79E(`tkvF|pP&B+z|Uqc0A~cJFP2I-+U4om@B3+mVcy`Fr2H#G zLmzjg?Ph4o^Sm*c%>u*JKeMaA-Ny3E)PG1ufSZlmvu)!&6#&$4$V4J>LSZIJL>K{la{0H2c zs~|?9C^x;rMaWb-8PX3|8pCWt!biMuy0?XQWQb<;X|43Tx`%u2d*Ay#=bm%m2uC>V zP+^=~UTj8M8r2nG5a!!_AedR2Z~X` z^C#k-|Ev48KfKp7anB!#d;YJu=VuP2fR+8R!0=+yodD>W_Zv61xCvYrMa;V91*W48 zlk+`pV9$aJo67F4y{x)QP|# zuvAI7%`!tkOxID(?!{Xg)et~F>Au&7WnfWmGWAJX(Q5Xad@h zW4pXoZt`faArQrMmE8|4geKr9vZClrczyyP>M$wW1;^C+m=Rbk24>RMfiB>Tz-(v& zg}`J5R?CJlfcYLbaD)NiLsho($9hS_#bPR2np!I<+q}LsH82yJKrt09X&4bjD(?9s z0J&awy%3nQz-?_<0DQpLhJ}c5s}PuT`K0>|VEpS=+R8ut=DfSL?<|gce#SPIk-hj& zt(8>gOaGp2U}Fbv$L{QRX+PHZKoq0E9FWc@-S;(`SC^H&KO$sSHiG-Rwc{`Y$)JXZ zz-et*7KJCUW)t9~eK8%t7hpJ_bZ7s|NY)%tmqqQ2WNlR=*;_}EZE9fVKruhU5e^-G Y1NpBZRoRadK>z>%07*qoM6N<$f;w}DFaQ7m diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked.png deleted file mode 100644 index 9a4def65c64a9d55441f82fe66fc7f46e5b73a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcmV;}0w?{6P)@!=&7gwT^7eV48y+tYIRCxlLiT(zip~u_E}K!eZQ1UCJ)XWpcn*qFv|mj2Hymm zGOGZ1&1OGlqk`+ej=|zgCiDDE0Kzalw_mH}fqMq8tl7*>&(3Zg z<=pb}a>SKCQhxe=1 zDZv#_S~^K`0Q0>2NJI5nZ6eAi5Q&W)Tj`Fao}46Y)*j1A!XehJuV&-U1oWX;y{+O9Vm8?gbB$>af^ zw*ZW{XL~Faoy!4ZGMk^9n`^`d07#`$FMw5G<+u=%tPliCX7&)sr_<@k@^=LQ*e#cH zlGcEH(Ye>fV(~_l?|Kj7Dkc) diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked_disabled.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/radio_unchecked_disabled.png deleted file mode 100644 index 6ece890e750b0685bbd818f22e5fbf999ccd35e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 760 zcmV6Hyq3pRX0tGI#@4O=(z(ra$opASN0&l!V!~ zGsFupMi4Yn7A{E9xN<|Zbl8%Z;>x%YH!O_WHWI)PKm&#gz*M7gJ{PpnM5bj5JNs=u!`ga zdVmk2x~L*MwQ&UK2QB~`Dl%3m6rLT6fN7e+lZKH~)f)mY2nNUV`F!P|tYujVfhklk ztLk(#78{?OoOB!Qf1;T{t^7JLns=NBjk1M8p$uFZv8+*G>eJ>Xz*wU-!A3(nlNkmc z35?D<&ckN1bxP&(QZkYFE+Y35$z-KmF0XlIJs*K-nw{NUU8}&yS;x70*z&)zv)PwG z&(~_T&+A|YycTzd!$Uw!g29Pa$^inZw}4*5Fa|v{UIP(HqgwGgaEIaP+*}D*M%BLn zkV52jtL1e>^_8ez^ev!pO8&g(E#tx$L?XTg094i2O?hBJARzl5{sneL_4H8%R5gO? zZYu(BRiyu@0>FU48{Yx~Mc}+;S&3GgZQD)(=Mi(Ony70 zgw)FKi^z1|aUM4cH~kt$W3lniTU)BCIV+pJ6jU9r-EjY4+jdG^H>WTlBDu5C=s2S%SwytG|&qy1B<|RZG49PACf*`UEpTkaXb%RO9HU}g)|IfP+T{SND8Rm6FUm; qM77uv3N6gc%>4ATZ<{v%H@^W&H{IQg@q%gq0000;(ZNqD1xa&r7l*n1_#$VNv$@8uKpD^(Yg!rs-u&mySz3x zZPmewoA|3(5ed=3lvIQo?lU4S?;e*cbV-``!^wBndk*Jwe%*6`Ofvc3g`y}Qe%Lrf zM~=<{C<7<~DB7nM*t{X(_-1F@|8?!;Zt4JTJ(y!=55OpZ_h7S5!fDy(A~R0{I738D zL8$7fp+~8t=)#MxT`%|Gok$E|orn3AV17^=sdPmu z9ZIFWq|WE0((KlQ>oIJr*0vn02W-QAB%)70FAq({4B!bfkMfUi~ek_$f*RST)55J#+#BE2=;@(#CR+jDgK2NURglS37FQ?Zk`&XaJb+PUn~Z%}G`mo&kx!C)voplk7DK$Im&m^!<{% gmtDJ=WHPAy0n)7IgxW`FVE_OC07*qoM6N<$f`lX-a{vGU diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/right_arrow.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/right_arrow.png deleted file mode 100644 index 9b0a4e6a7a8097818d9c0626c84f19f4d690dd31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9wUkJ;l%oZHT?}(3D>Wp7T%b9XV|~Y(T_!;F44$rjF6*2UngIS-C?Eg; diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/sizegrip.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/sizegrip.png deleted file mode 100644 index 350583aaac4aa474ac449eaea2cc7ddd060276b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0A8dZe4lyHC-T!u_VYZ zn8D%MjWi%f)6>Nz(!sM1rC-2ha+zM<2rMwpeI*@Z@PO%TWH}e*?iSqXK(y9 XcW6R37#&FAr-gY z-rUH`puoZ4SQyZj9Qd}kRkgExspwA+*PdmovgYQ`l$1@M%Pi(EdF8VmvF&CX@A%e}M=bpY`_UHx3vIVCg!0H#+y$^ZZW diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-branch-more.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-branch-more.png deleted file mode 100644 index 62711409d7ed69ec98979394795822630458d9eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5PiX%b9eR9<JS%C8jVk7;fc! UBk#RM6lem2r>mdKI;Vst0ANBkrT_o{ diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-vline.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/stylesheet-vline.png deleted file mode 100644 index 87536cce16aabb3710663f720f8d354b1bb0b757..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^fk14@;zM~Ln>~) zy|9s&!GMF=@x%h2gO1`OFspnaH4_oY}#FfpL8m Q-wTkir>mdKI;Vst0J6j{!2kdN diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/undock.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/undock.png deleted file mode 100644 index 88691d779507c9b809391396407f5cb4a6497c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578 zcmV-I0=@l-P)WFU8GbZ8()Nlj2>E@cM*00E{+L_t(|+U=X$4#OY} zLz`&--S*43w`rPoNlWaQLS8pfd~hg*uq-oX%osV0`LJ!+SPR{}9r(JUC& zi*OVO>rs3r1nW_FCJ5_Yd@BU&U3e=9yOQ`b5bSE=k3zUrc5+?UXD9c4F9B>-qyH)% z1tH=BQxRVU!7FWl=67leWRLz4ahXo| zoe{&T7oZ-FMxDSsBBvjZ{}acq6e%f?_~rzJ_LzyflS`(bcuN3?R&llQTw-2U8((=NC3B QV*mgE07*qoM6N<$f{lRZzyJUM diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/rc/up_arrow.png b/3rdparty/QDarkStyleSheet/qdarkstyle/rc/up_arrow.png deleted file mode 100644 index abcc7245212f19a5dbff1bb19647b1dd4bb05b6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAy| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;v6FKKb3EC1BH}5T^vI=t|uoP z;C)upuu) - - rc/up_arrow_disabled.png - rc/Hmovetoolbar.png - rc/stylesheet-branch-end.png - rc/branch_closed-on.png - rc/stylesheet-vline.png - rc/branch_closed.png - rc/branch_open-on.png - rc/transparent.png - rc/right_arrow_disabled.png - rc/sizegrip.png - rc/close.png - rc/close-hover.png - rc/close-pressed.png - rc/down_arrow.png - rc/Vmovetoolbar.png - rc/left_arrow.png - rc/stylesheet-branch-more.png - rc/up_arrow.png - rc/right_arrow.png - rc/left_arrow_disabled.png - rc/Hsepartoolbar.png - rc/branch_open.png - rc/Vsepartoolbar.png - rc/down_arrow_disabled.png - rc/undock.png - rc/checkbox_checked_disabled.png - rc/checkbox_checked_focus.png - rc/checkbox_checked.png - rc/checkbox_indeterminate.png - rc/checkbox_indeterminate_focus.png - rc/checkbox_unchecked_disabled.png - rc/checkbox_unchecked_focus.png - rc/checkbox_unchecked.png - rc/radio_checked_disabled.png - rc/radio_checked_focus.png - rc/radio_checked.png - rc/radio_unchecked_disabled.png - rc/radio_unchecked_focus.png - rc/radio_unchecked.png - rc/extend.png - - - style.qss - - diff --git a/3rdparty/QDarkStyleSheet/qdarkstyle/style.qss b/3rdparty/QDarkStyleSheet/qdarkstyle/style.qss deleted file mode 100644 index 831f210..0000000 --- a/3rdparty/QDarkStyleSheet/qdarkstyle/style.qss +++ /dev/null @@ -1,1295 +0,0 @@ -/* - * The MIT License (MIT) - * - * Copyright (c) <2013-2014> - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -QToolTip -{ - border: 1px solid #2b2b2b; - background-color: rgb(90, 102, 117);; - color: white; - padding: 5px; - opacity: 200; -} - -QWidget -{ - color: #eff0f1; - background-color: #383838; - selection-background-color:#2e2e2e; - selection-color: #eff0f1; - background-clip: border; - border-image: none; - border: 0px transparent black; - outline: 0; -} - -QWidget:item:hover -{ - background-color: #819a67; - color: #eff0f1; -} - -QWidget:item:selected -{ - background-color: #819a67; -} - -QCheckBox -{ - spacing: 5px; - outline: none; - color: #eff0f1; - margin-right: 2px; -} - -QCheckBox:disabled -{ - color: #2b2b2b; -} - -QCheckBox::indicator{ - width: 16px; - height: 16px; - color: #222222; -} - -QGroupBox::indicator -{ - width: 18px; - height: 18px; -} -QGroupBox::indicator -{ - margin-left: 2px; -} - -\\QCheckBox::indicator:unchecked -\\{ -\\ image: url(:/qss_icons/rc/checkbox_unchecked.png); -\\} - -\\QCheckBox::indicator:unchecked:hover, -\\QCheckBox::indicator:unchecked:focus, -\\QCheckBox::indicator:unchecked:pressed, -\\QGroupBox::indicator:unchecked:hover, -\\QGroupBox::indicator:unchecked:focus, -\\QGroupBox::indicator:unchecked:pressed -\\{ -\\ border: none; -\\ image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); -\\} - -\\QCheckBox::indicator:checked -\\{ -\\ image: url(:/qss_icons/rc/checkbox_checked.png); -\\} - -\\QCheckBox::indicator:checked:hover, -\\QCheckBox::indicator:checked:focus, -\\QCheckBox::indicator:checked:pressed, -\\QGroupBox::indicator:checked:hover, -\\QGroupBox::indicator:checked:focus, -\\QGroupBox::indicator:checked:pressed -\\{ -\\ border: none; -\\ image: url(:/qss_icons/rc/checkbox_checked_focus.png); -\\} - - -\\QCheckBox::indicator:indeterminate -\\{ -\\ image: url(:/qss_icons/rc/checkbox_indeterminate.png); -\\} - -\\QCheckBox::indicator:indeterminate:focus, -\\QCheckBox::indicator:indeterminate:hover, -\\QCheckBox::indicator:indeterminate:pressed -\\{ -\\ image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); -\\} - -\\QCheckBox::indicator:checked:disabled, -\\QGroupBox::indicator:checked:disabled -\\{ -\\ image: url(:/qss_icons/rc/checkbox_checked_disabled.png); -\\} - -\\QCheckBox::indicator:unchecked:disabled, -\\QGroupBox::indicator:unchecked:disabled -\\{ -\\ image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); -\\} - -QRadioButton -{ - spacing: 5px; - outline: none; - color: #eff0f1; - margin-bottom: 2px; -} - -QRadioButton:disabled -{ - color: #2b2b2b; -} -QRadioButton::indicator -{ - width: 16px; - height: 16px; -} - -\\QRadioButton::indicator:unchecked -\\{ -\\ image: url(:/qss_icons/rc/radio_unchecked.png); -\\} - - -\\QRadioButton::indicator:unchecked:hover, -\\QRadioButton::indicator:unchecked:focus, -\\QRadioButton::indicator:unchecked:pressed -\\{ -\\ border: none; -\\ outline: none; -\\ image: url(:/qss_icons/rc/radio_unchecked_focus.png); -\\} - -\\QRadioButton::indicator:checked -\\{ -\\ border: none; -\\ outline: none; -\\ image: url(:/qss_icons/rc/radio_checked.png); -\\} - -\\QRadioButton::indicator:checked:hover, -\\QRadioButton::indicator:checked:focus, -\\QRadioButton::indicator:checked:pressed -\\{ -\\ border: none; -\\ outline: none; -\\ image: url(:/qss_icons/rc/radio_checked_focus.png); -\\} - -\\QRadioButton::indicator:checked:disabled -\\{ -\\ outline: none; -\\ image: url(:/qss_icons/rc/radio_checked_disabled.png); -\\} - -\\QRadioButton::indicator:unchecked:disabled -\\{ -\\ image: url(:/qss_icons/rc/radio_unchecked_disabled.png); -\\} - -QMenuBar -{ - background-color: #383838; - color: #eff0f1; -} - -QMenuBar::item -{ - background: transparent; -} - -QMenuBar::item:selected -{ - background: transparent; - border: 1px solid #2b2b2b; -} - -QMenuBar::item:pressed -{ - border: 1px solid #2b2b2b; - background-color: #2e2e2e; - color: #eff0f1; - margin-bottom:-1px; - padding-bottom:1px; -} - -QMenu -{ - border: 1px solid #2b2b2b; - color: #eff0f1; - margin: 2px; -} - -QMenu::icon -{ - margin: 5px; -} - -QMenu::item -{ - padding: 5px 30px 5px 30px; - border: 1px solid transparent; /* reserve space for selection border */ -} - -QMenu::item:selected -{ - color: #eff0f1; -} - -QMenu::separator { - height: 2px; - background: lightblue; - margin-left: 10px; - margin-right: 5px; -} - -QMenu::indicator { - width: 18px; - height: 18px; -} - -/* non-exclusive indicator = check box style indicator - (see QActionGroup::setExclusive) */ -QMenu::indicator:non-exclusive:unchecked { - image: url(:/qss_icons/rc/checkbox_unchecked.png); -} - -QMenu::indicator:non-exclusive:unchecked:selected { - image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); -} - -QMenu::indicator:non-exclusive:checked { - image: url(:/qss_icons/rc/checkbox_checked.png); -} - -QMenu::indicator:non-exclusive:checked:selected { - image: url(:/qss_icons/rc/checkbox_checked_disabled.png); -} - -/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ -QMenu::indicator:exclusive:unchecked { - image: url(:/qss_icons/rc/radio_unchecked.png); -} - -QMenu::indicator:exclusive:unchecked:selected { - image: url(:/qss_icons/rc/radio_unchecked_disabled.png); -} - -QMenu::indicator:exclusive:checked { - image: url(:/qss_icons/rc/radio_checked.png); -} - -QMenu::indicator:exclusive:checked:selected { - image: url(:/qss_icons/rc/radio_checked_disabled.png); -} - -QMenu::right-arrow { - margin: 5px; - image: url(:/qss_icons/rc/right_arrow.png) -} - - -QWidget:disabled -{ - color: #454545; - background-color: #383838; -} - -QAbstractItemView -{ - alternate-background-color: #383838; - color: #eff0f1; - border: 1px solid 3A3939; - border-radius: 2px; -} - -QWidget:focus, QMenuBar:focus -{ - border: 1px solid #4b6807; -} - -QTabWidget:focus, QCheckBox:focus, QRadioButton:focus, QSlider:focus -{ - border: none; -} - -QLineEdit -{ - background-color: #232629; - padding: 5px; - border-style: solid; - border: 1px solid #2b2b2b; - border-radius: 2px; - color: #eff0f1; -} - -QLineEdit:disabled{ - color: #858585; -} - -QAbstractItemView QLineEdit -{ - padding: 0; -} - -QGroupBox { - margin-top: 10px; -} - -QGroupBox::title { - subcontrol-origin: margin; - subcontrol-position: top left; - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; -} - -QAbstractScrollArea -{ - border-radius: 2px; - border: 1px solid #2b2b2b; - background-color: transparent; -} - -QScrollBar:horizontal -{ - height: 15px; - margin: 3px 15px 3px 15px; - border: 1px transparent #2A2929; - border-radius: 4px; - background-color: #2A2929; -} - -QScrollBar::handle:horizontal -{ - background-color: #605F5F; - min-width: 5px; - border-radius: 4px; -} - -QScrollBar::add-line:horizontal -{ - margin: 0px 3px 0px 3px; - border-image: url(:/qss_icons/rc/right_arrow_disabled.png); - width: 10px; - height: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:horizontal -{ - margin: 0px 3px 0px 3px; - border-image: url(:/qss_icons/rc/left_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on -{ - border-image: url(:/qss_icons/rc/right_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: right; - subcontrol-origin: margin; -} - - -QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on -{ - border-image: url(:/qss_icons/rc/left_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: left; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal -{ - background: none; -} - - -QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal -{ - background: none; -} - -QScrollBar:vertical -{ - background-color: #2A2929; - width: 15px; - margin: 15px 3px 15px 3px; - border: 1px transparent #2A2929; - border-radius: 4px; -} - -QScrollBar::handle:vertical -{ - background-color: #605F5F; - min-height: 5px; - border-radius: 4px; -} - -QScrollBar::sub-line:vertical -{ - margin: 3px 0px 3px 0px; - border-image: url(:/qss_icons/rc/up_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - -QScrollBar::add-line:vertical -{ - margin: 3px 0px 3px 0px; - border-image: url(:/qss_icons/rc/down_arrow_disabled.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on -{ - - border-image: url(:/qss_icons/rc/up_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: top; - subcontrol-origin: margin; -} - - -QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on -{ - border-image: url(:/qss_icons/rc/down_arrow.png); - height: 10px; - width: 10px; - subcontrol-position: bottom; - subcontrol-origin: margin; -} - -QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical -{ - background: none; -} - - -QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical -{ - background: none; -} - -QTextEdit -{ - background-color: #232629; - color: #eff0f1; - border: 1px solid #2b2b2b; -} - -QPlainTextEdit -{ - background-color: #232629;; - color: #eff0f1; - border-radius: 2px; - border: 1px solid #2b2b2b; -} - -QHeaderView::section -{ - background-color: #2b2b2b; - color: #eff0f1; - padding: 5px; - border: 1px solid #2b2b2b; -} - -QSizeGrip { - image: url(:/qss_icons/rc/sizegrip.png); - width: 12px; - height: 12px; -} - - -QMainWindow::separator -{ - background-color: #383838; - color: white; - padding-left: 4px; - spacing: 2px; - border: 1px dashed #2b2b2b; -} - -QMainWindow::separator:hover -{ - - background-color: #787876; - color: white; - padding-left: 4px; - border: 1px solid #2b2b2b; - spacing: 2px; -} - - -QMenu::separator -{ - height: 1px; - background-color: #2b2b2b; - color: white; - padding-left: 4px; - margin-left: 10px; - margin-right: 5px; -} - - -QFrame -{ - border-radius: 0px; - border-top: 1px solid #2b2b2b; - border-left: 1px solid #2b2b2b; - border-bottom: 1px solid #767676; - border-right: 1px solid #767676; -} - -QFrame[frameShape="0"] -{ - border-radius: 2px; - border: 1px transparent #2b2b2b; -} - -QStackedWidget -{ - border: 1px transparent black; -} - -QToolBar { - border: 1px transparent #2b2b2b; - background: 1px solid #383838; - font-weight: bold; -} - -QToolBar::handle:horizontal { - image: url(:/qss_icons/rc/Hmovetoolbar.png); -} -QToolBar::handle:vertical { - image: url(:/qss_icons/rc/Vmovetoolbar.png); -} -QToolBar::separator:horizontal { - image: url(:/qss_icons/rc/Hsepartoolbar.png); -} -QToolBar::separator:vertical { - image: url(:/qss_icons/rc/Vsepartoolbar.png); -} - -QToolButton#qt_toolbar_ext_button { - background: transparent; - min-width: 8px; - width: 8px; - padding: 1px; - qproperty-icon: url(:/qss_icons/rc/extend.png); -} - -QPushButton -{ - color: #fff; - background-color: #404040; - border-width: 1px; - border-color: #2b2b2b; - border-style: solid; - padding: 5px; - border-radius: 2px; - outline: none; -} - -QPushButton:disabled -{ - background-color: #383838; - border-width: 1px; - border-color: #454545; - border-style: solid; - padding-top: 5px; - padding-bottom: 5px; - padding-left: 10px; - padding-right: 10px; - border-radius: 2px; - color: #454545; -} - -QPushButton:focus { - background-color: #2e2e2e; - color: white; -} - -QPushButton:pressed -{ - background-color: #2e2e2e; - padding-top: -15px; - padding-bottom: -17px; -} - -QComboBox -{ - selection-background-color: #2e2e2e; - border-style: solid; - border: 1px solid #2b2b2b; - border-radius: 2px; - padding: 5px; - min-width: 75px; -} - -QPushButton:checked{ - background-color: #2b2b2b; - border-color: #6A6969; -} - -QComboBox:hover,QPushButton:hover,QAbstractSpinBox:hover,QLineEdit:hover,QTextEdit:hover,QPlainTextEdit:hover,QAbstractView:hover,QTreeView:hover -{ - border: 1px solid #4b6807; - color: #eff0f1; -} - -QComboBox:on -{ - padding-top: 3px; - padding-left: 4px; - selection-background-color: #4a4a4a; -} - -QComboBox QAbstractItemView -{ - background-color: #232629; - border-radius: 2px; - border: 1px solid #2b2b2b; - selection-background-color: #89ae30; -} - -QComboBox::drop-down -{ - subcontrol-origin: padding; - subcontrol-position: top right; - width: 15px; - - border-left-width: 0px; - border-left-color: darkgray; - border-left-style: solid; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -QComboBox::down-arrow -{ - image: url(:/qss_icons/rc/down_arrow_disabled.png); -} - -QComboBox::down-arrow:on, QComboBox::down-arrow:hover, -QComboBox::down-arrow:focus -{ - image: url(:/qss_icons/rc/down_arrow.png); -} - -QAbstractSpinBox { - padding: 5px; - border: 1px solid #2b2b2b; - background-color: #232629; - color: #eff0f1; - border-radius: 2px; - min-width: 75px; -} - -QAbstractSpinBox:up-button -{ - background-color: transparent; - subcontrol-origin: border; - subcontrol-position: center right; -} - -QAbstractSpinBox:down-button -{ - background-color: transparent; - subcontrol-origin: border; - subcontrol-position: center left; -} - -QAbstractSpinBox::up-arrow,QAbstractSpinBox::up-arrow:disabled,QAbstractSpinBox::up-arrow:off { - image: url(:/qss_icons/rc/up_arrow_disabled.png); - width: 10px; - height: 10px; -} -QAbstractSpinBox::up-arrow:hover -{ - image: url(:/qss_icons/rc/up_arrow.png); -} - - -QAbstractSpinBox::down-arrow,QAbstractSpinBox::down-arrow:disabled,QAbstractSpinBox::down-arrow:off -{ - image: url(:/qss_icons/rc/down_arrow_disabled.png); - width: 10px; - height: 10px; -} -QAbstractSpinBox::down-arrow:hover -{ - image: url(:/qss_icons/rc/down_arrow.png); -} - - -QLabel -{ - border: 0px solid black; -} - -QTabWidget{ - border: 0px transparent black; -} - -QTabWidget::pane { - border: 1px solid #2b2b2b; - background-color: #404040; - padding: 5px; -} - -QTabWidget QWidget{ - background-color: #404040; -} - -QTabWidget::tab-bar { - left: 5px; /* move to the right by 5px */ -} - -QTabBar -{ - qproperty-drawBase: 0; - border-radius: 3px; -} - -QTabBar:focus -{ - border: 0px transparent black; -} - -QTabBar::close-button { - image: url(:/qss_icons/rc/close.png); - background: transparent; -} - -QTabBar::close-button:hover -{ - image: url(:/qss_icons/rc/close-hover.png); - background: transparent; -} - -QTabBar::close-button:pressed { - image: url(:/qss_icons/rc/close-pressed.png); - background: transparent; -} - -/* TOP TABS */ -QTabBar::tab:top { - color: #eff0f1; - border: 1px solid #2b2b2b; - border-bottom: 1px transparent black; - background-color: #404040; - padding: 5px; - min-width: 50px; - border-top-left-radius: 2px; - border-top-right-radius: 2px; -} - -QTabBar::tab:top:!selected -{ - color: #eff0f1; - background-color: #383838; - border: 1px transparent #2b2b2b; - border-bottom: 1px transparent #2b2b2b; - border-top-left-radius: 2px; - border-top-right-radius: 2px; - -} - -QTabBar::tab:top:!selected:hover { - background-color: #2e2e2e; -} - -/* BOTTOM TABS */ -QTabBar::tab:bottom { - color: #eff0f1; - border: 1px solid #2b2b2b; - border-top: 1px solid #404040; - background-color: #404040; - padding: 5px; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - min-width: 50px; -} - -QTabBar::tab:bottom:!selected -{ - color: #eff0f1; - background-color: #383838; - border: 1px transparent #2b2b2b; - border-top: 1px transparent #2b2b2b; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; -} - -QTabBar::tab:bottom:!selected:hover { - background-color: #2e2e2e; -} - -/* LEFT TABS */ -QTabBar::tab:left { - color: #eff0f1; - border: 1px solid #2b2b2b; - border-left: 1px transparent black; - background-color: #383838; - padding: 5px; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; - min-height: 50px; -} - -QTabBar::tab:left:!selected -{ - color: #eff0f1; - background-color: #54575B; - border: 1px solid #2b2b2b; - border-left: 1px transparent black; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; -} - -QTabBar::tab:left:!selected:hover { - background-color: #2e2e2e; -} - - -/* RIGHT TABS */ -QTabBar::tab:right { - color: #eff0f1; - border: 1px solid #2b2b2b; - border-right: 1px transparent black; - background-color: #383838; - padding: 5px; - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; - min-height: 50px; -} - -QTabBar::tab:right:!selected -{ - color: #eff0f1; - background-color: #54575B; - border: 1px solid #2b2b2b; - border-right: 1px transparent black; - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; -} - -QTabBar::tab:right:!selected:hover { - background-color: #2e2e2e; -} - -QTabBar QToolButton::right-arrow:enabled { - image: url(:/qss_icons/rc/right_arrow.png); - } - - QTabBar QToolButton::left-arrow:enabled { - image: url(:/qss_icons/rc/left_arrow.png); - } - -QTabBar QToolButton::right-arrow:disabled { - image: url(:/qss_icons/rc/right_arrow_disabled.png); - } - - QTabBar QToolButton::left-arrow:disabled { - image: url(:/qss_icons/rc/left_arrow_disabled.png); - } - - -QDockWidget { - background: #383838; - border: 1px solid #403F3F; - titlebar-close-icon: url(:/qss_icons/rc/close.png); - titlebar-normal-icon: url(:/qss_icons/rc/undock.png); -} - -QDockWidget::close-button, QDockWidget::float-button { - border: 1px solid transparent; - border-radius: 2px; - background: transparent; -} - -QDockWidget::close-button:hover, QDockWidget::float-button:hover { - background: rgba(255, 255, 255, 10); -} - -QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { - padding: 1px -1px -1px 1px; - background: rgba(255, 255, 255, 10); -} - -QLabel#limeReportLabel{ - color: #7faa18; -} - -QTreeView, QListView -{ - border-top: 1px solid #2b2b2b; - border-left: 1px solid #2b2b2b; - border-bottom: 1px solid #767676; - border-right: 1px solid #767676; - background-color: #404040; -} - -QTreeView::item, QListView::item{ - height: 25px; -} - -QTreeView::branch:selected{ - background-color: #819a67; -} - -QTreeView::branch:!selected:hover, QTreeView::item:!selected:hover{ - background-color: #287399; -} - -QTreeView::branch:has-siblings:!adjoins-item { - border-image: url(:/qss_icons/rc/transparent.png); -} - -QTreeView::branch:has-siblings:adjoins-item { - border-image: url(:/qss_icons/rc/transparent.png); -} - -QTreeView::branch:!has-children:!has-siblings:adjoins-item { - border-image: url(:/qss_icons/rc/transparent.png); -} - -QTreeView::branch:has-children:!has-siblings:closed, -QTreeView::branch:closed:has-children:has-siblings { - image: url(:/qss_icons/rc/branch_closed.png); -} - -QTreeView::branch:open:has-children:!has-siblings, -QTreeView::branch:open:has-children:has-siblings { - image: url(:/qss_icons/rc/branch_open.png); -} - -QTreeView::branch:has-children:!has-siblings:closed:hover, -QTreeView::branch:closed:has-children:has-siblings:hover { - image: url(:/qss_icons/rc/branch_closed-on.png); -} - -QTreeView::branch:open:has-children:!has-siblings:hover, -QTreeView::branch:open:has-children:has-siblings:hover { - image: url(:/qss_icons/rc/branch_open-on.png); -} - -QSlider::groove:horizontal { - border: 1px solid #565a5e; - height: 4px; - background: #565a5e; - margin: 0px; - border-radius: 2px; -} - -QSlider::handle:horizontal { - background: #232629; - border: 1px solid #565a5e; - width: 16px; - height: 16px; - margin: -8px 0; - border-radius: 9px; -} - -QSlider::groove:vertical { - border: 1px solid #565a5e; - width: 4px; - background: #565a5e; - margin: 0px; - border-radius: 3px; -} - -QSlider::handle:vertical { - background: #232629; - border: 1px solid #565a5e; - width: 16px; - height: 16px; - margin: 0 -8px; - border-radius: 9px; -} - -QToolButton { - background-color: #383838; - color : white; - border: 1px transparent #2b2b2b; - border-radius: 2px; - margin: 2px; - padding: 2px; -} - -QToolButton:hover, QToolButton::menu-button:hover { - background-color: #2b2b2b; - border: 1px solid #7faa18; -} - -QToolButton:checked, QToolButton:pressed, - QToolButton::menu-button:pressed { - background-color: #2e2e2e; - border: 1px solid #7faa18; -} - -QToolButton:text{ - color: #ffffff; -} - -QToolButton:disabled{ - background-color: transparent; -} - -QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ - padding-right: 20px; /* make way for the popup button */ - border: 1px #2b2b2b; - border-radius: 5px; -} - -QToolButton[popupMode="2"] { /* only for InstantPopup */ - padding-right: 10px; /* make way for the popup button */ - border: 1px #2b2b2b; -} - -/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ -QToolButton::menu-indicator { - image: url(:/qss_icons/rc/down_arrow.png); - top: -7px; left: -2px; /* shift it a bit */ -} - -/* the subcontrols below are used only in the MenuButtonPopup mode */ -QToolButton::menu-button { - border: 1px transparent #2b2b2b; - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; - /* 16px width + 4px for border = 20px allocated above */ - width: 16px; - outline: none; -} - -QToolButton::menu-arrow { - image: url(:/qss_icons/rc/down_arrow.png); -} - -QToolButton::menu-arrow:open { - border: 1px solid #2b2b2b; -} - -QPushButton::menu-indicator { - subcontrol-origin: padding; - subcontrol-position: bottom right; - left: 8px; -} - -QTableView -{ - border: 1px solid #2b2b2b; - gridline-color: #383838; - background-color: #232629; -} - - -QTableView, QHeaderView -{ - border-radius: 0px; -} - -QTableView::item:pressed, QListView::item:pressed { - background: #819a67; - color: #eff0f1; -} - -QTableView::item:selected:active, QListView::item:selected:active { - background: #819a67; - color: #eff0f1; -} - - -QHeaderView -{ - background-color: #383838; - border: 1px transparent; - border-radius: 0px; - margin: 0px; - padding: 0px; - -} - -QHeaderView::section { - background-color: #383838; - color: #eff0f1; - padding: 5px; - border: 1px solid #2b2b2b; - border-radius: 0px; - text-align: center; -} - -QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one -{ - border-top: 1px transparent #2b2b2b; -} - -QHeaderView::section::vertical -{ - border-top: transparent; -} - -QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one -{ - border-left: 1px transparent #2b2b2b; -} - -QHeaderView::section::horizontal -{ - border-left: transparent; -} - - -QHeaderView::section:checked - { - color: white; - background-color: #334e5e; - } - - /* style the sort indicator */ -QHeaderView::down-arrow { - image: url(:/qss_icons/rc/down_arrow.png); -} - -QHeaderView::up-arrow { - image: url(:/qss_icons/rc/up_arrow.png); -} - - -QTableCornerButton::section { - background-color: #383838; - border: 1px transparent #2b2b2b; - border-radius: 0px; -} - -QToolBox { - padding: 5px; - border: 1px transparent black; -} - -QToolBox::tab { - color: #eff0f1; - background-color: #383838; - border: 1px solid #2b2b2b; - border-bottom: 1px transparent #383838; - border-top-left-radius: 5px; - border-top-right-radius: 5px; -} - -QToolBox::tab:selected { /* italicize selected tabs */ - font: italic; - background-color: #383838; - border-color: #7faa18; - } - -QStatusBar::item { - border: 0px transparent dark; - } - - -QFrame[height="3"], QFrame[width="3"] { - background-color: #2b2b2b; -} - - -QSplitter::handle { - border: 1px dashed #2b2b2b; -} - -QSplitter::handle:hover { - background-color: #787876; - border: 1px solid #2b2b2b; -} - -QSplitter::handle:horizontal { - width: 1px; -} - -QSplitter::handle:vertical { - height: 1px; -} - -QProgressBar { - border: 1px solid #2b2b2b; - border-radius: 5px; - text-align: center; -} - -QProgressBar::chunk { - background-color: #05B8CC; -} - -QDateEdit -{ - selection-background-color: #2e2e2e; - border-style: solid; - border: 1px solid #3375A3; - border-radius: 2px; - padding: 1px; - min-width: 75px; -} - -QDateEdit:on -{ - padding-top: 3px; - padding-left: 4px; - selection-background-color: #4a4a4a; -} - -QDateEdit QAbstractItemView -{ - background-color: #232629; - border-radius: 2px; - border: 1px solid #3375A3; - selection-background-color: #2e2e2e; -} - -QDateEdit::drop-down -{ - subcontrol-origin: padding; - subcontrol-position: top right; - width: 15px; - border-left-width: 0px; - border-left-color: darkgray; - border-left-style: solid; - border-top-right-radius: 3px; - border-bottom-right-radius: 3px; -} - -QDateEdit::down-arrow -{ - image: url(:/qss_icons/rc/down_arrow_disabled.png); -} - -QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, -QDateEdit::down-arrow:focus -{ - image: url(:/qss_icons/rc/down_arrow.png); -} diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_checked.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_checked.svg deleted file mode 100644 index a0f5045..0000000 --- a/3rdparty/QDarkStyleSheet/svg/checkbox_checked.svg +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_checked_disabled.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_checked_disabled.svg deleted file mode 100644 index 79e23f2..0000000 --- a/3rdparty/QDarkStyleSheet/svg/checkbox_checked_disabled.svg +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_checked_focus.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_checked_focus.svg deleted file mode 100644 index 2683c6b..0000000 --- a/3rdparty/QDarkStyleSheet/svg/checkbox_checked_focus.svg +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate.svg deleted file mode 100644 index 648734a..0000000 --- a/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate.svg +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_disabled.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_disabled.svg deleted file mode 100644 index 79f9afb..0000000 --- a/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_disabled.svg +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_focus.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_focus.svg deleted file mode 100644 index 22d7337..0000000 --- a/3rdparty/QDarkStyleSheet/svg/checkbox_indeterminate_focus.svg +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked.svg deleted file mode 100644 index b365e1b..0000000 --- a/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_disabled.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_disabled.svg deleted file mode 100644 index a2a2059..0000000 --- a/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_disabled.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_focus.svg b/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_focus.svg deleted file mode 100644 index ffb2523..0000000 --- a/3rdparty/QDarkStyleSheet/svg/checkbox_unchecked_focus.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/radio_checked.svg b/3rdparty/QDarkStyleSheet/svg/radio_checked.svg deleted file mode 100644 index 062c7ec..0000000 --- a/3rdparty/QDarkStyleSheet/svg/radio_checked.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/radio_checked_disabled.svg b/3rdparty/QDarkStyleSheet/svg/radio_checked_disabled.svg deleted file mode 100644 index c0d9720..0000000 --- a/3rdparty/QDarkStyleSheet/svg/radio_checked_disabled.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/radio_checked_focus.svg b/3rdparty/QDarkStyleSheet/svg/radio_checked_focus.svg deleted file mode 100644 index 458c051..0000000 --- a/3rdparty/QDarkStyleSheet/svg/radio_checked_focus.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/radio_unchecked.svg b/3rdparty/QDarkStyleSheet/svg/radio_unchecked.svg deleted file mode 100644 index 83db993..0000000 --- a/3rdparty/QDarkStyleSheet/svg/radio_unchecked.svg +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/radio_unchecked_disabled.svg b/3rdparty/QDarkStyleSheet/svg/radio_unchecked_disabled.svg deleted file mode 100644 index 0297243..0000000 --- a/3rdparty/QDarkStyleSheet/svg/radio_unchecked_disabled.svg +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/3rdparty/QDarkStyleSheet/svg/radio_unchecked_focus.svg b/3rdparty/QDarkStyleSheet/svg/radio_unchecked_focus.svg deleted file mode 100644 index 3f5e289..0000000 --- a/3rdparty/QDarkStyleSheet/svg/radio_unchecked_focus.svg +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/demo_r2/demo_r2.pro b/demo_r2/demo_r2.pro index a30cc83..22a4cb3 100644 --- a/demo_r2/demo_r2.pro +++ b/demo_r2/demo_r2.pro @@ -20,7 +20,8 @@ INCLUDEPATH += $$PWD/../include DEPENDPATH += $$PWD/../include RESOURCES += \ - demo_r2.qrc + demo_r2.qrc \ + ../3rdparty/QDarkStyleSheet/qdarkstyle/style.qrc EXTRA_DIR += $$PWD/demo_reports DEST_DIR = $${DEST_BINS} diff --git a/demo_r2/main.cpp b/demo_r2/main.cpp index b48f94e..f0c521f 100644 --- a/demo_r2/main.cpp +++ b/demo_r2/main.cpp @@ -4,6 +4,18 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); + QFile f(":qdarkstyle/style.qss"); + if (!f.exists()) + { + printf("Unable to set stylesheet, file not found\n"); + } + else + { + f.open(QFile::ReadOnly | QFile::Text); + QTextStream ts(&f); + a.setStyleSheet(ts.readAll()); + //a.setStyleSheet(""); + } MainWindow w; w.show(); diff --git a/translations/limereport_ar.ts b/translations/limereport_ar.ts index 007f13d..db8ac9c 100644 --- a/translations/limereport_ar.ts +++ b/translations/limereport_ar.ts @@ -1,6 +1,13 @@ + + $ClassName$ + + $ClassName$ + + + AboutDialog @@ -24,6 +31,49 @@ الإصدار 1.1.1 + + ChartItemEditor + + Form + نموذج + + + Series + + + + Add + + + + Delete + + + + Name + الأسم + + + Values field + + + + Color + + + + Type + النوع + + + Labels field + + + + Ok + موافق + + ConnectionDialog @@ -156,6 +206,21 @@ Attention Attention + + Mandatory + + + + + LanguageSelectDialog + + Dialog + + + + Language + + LimeReport::AVariablesHolder @@ -398,6 +463,70 @@ p, li { white-space: pre-wrap; } Splittable + + DataBand + + + + DataHeaderBand + + + + DataFooterBand + + + + ReportHeader + + + + ReportFooter + + + + PageHeader + + + + PageFooter + + + + SubDetailBand + + + + SubDetailHeaderBand + + + + SubDetailFooterBand + + + + GroupBandHeader + + + + GroupBandFooter + + + + TearOffBand + + + + Keep bottom space + + + + Start from new page + + + + Start new page + + LimeReport::BaseDesignIntf @@ -497,7 +626,7 @@ p, li { white-space: pre-wrap; } already exists - موجود مسبقاً + موجود مسبقاً ... @@ -519,6 +648,10 @@ p, li { white-space: pre-wrap; } defaultConnection + + already exists! + + LimeReport::ContentItemDesignIntf @@ -533,6 +666,10 @@ p, li { white-space: pre-wrap; } Data بيانات + + useAlternateBackgroundColor + + LimeReport::DataBrowser @@ -587,7 +724,7 @@ p, li { white-space: pre-wrap; } Do you really want to delete "%1" connection ? Do you really want delete "%1" connection ? - هل ترغب في حذف الإتصال "%1" ? + هل ترغب في حذف الإتصال "%1" ? User variables @@ -600,7 +737,7 @@ p, li { white-space: pre-wrap; } Do you really want to delete "%1" datasource ? Do you really want delete "%1" datasource ? - هل ترغب في حذف مصدر البيانات "%1" ? + هل ترغب في حذف مصدر البيانات "%1" ? Do you really want delete variable "%1" ? @@ -616,7 +753,7 @@ p, li { white-space: pre-wrap; } Do you really want to delete variable "%1" ? - هل ترغب في حذف المتغير "%1" ? + هل ترغب في حذف المتغير "%1" ? Grab variable @@ -630,6 +767,18 @@ p, li { white-space: pre-wrap; } External variables + + Do you really want to delete "%1" connection? + + + + Do you really want to delete "%1" datasource? + + + + Do you really want to delete variable "%1"? + + LimeReport::DataFooterBand @@ -653,16 +802,16 @@ p, li { white-space: pre-wrap; } Datasource "%1" not found ! - الإتصال "%1" غير موجود ! + الإتصال "%1" غير موجود ! connection with name "%1" already exists ! - الإتصال بأسم "%1" موجود مسبقاً ! + الإتصال بأسم "%1" موجود مسبقاً ! datasource with name "%1" already exists ! data source with name "%1" already exists !! - مصدر البيانات بأسم "%1" موجود مسبقاً ! + مصدر البيانات بأسم "%1" موجود مسبقاً ! invalid connection @@ -676,6 +825,18 @@ p, li { white-space: pre-wrap; } Database "%1" not found + + Datasource "%1" not found! + + + + Connection with name "%1" already exists! + + + + Datasource with name "%1" already exists! + + LimeReport::DataSourceModel @@ -692,6 +853,37 @@ p, li { white-space: pre-wrap; } + + LimeReport::DialogDesignerManager + + Edit Widgets + + + + Widget Box + + + + Object Inspector + فاحص الكائن + + + Property Editor + + + + Signals && Slots Editor + + + + Resource Editor + + + + Action Editor + + + LimeReport::FontEditorWidget @@ -748,7 +940,7 @@ p, li { white-space: pre-wrap; } - Datasource "%1" not found !!! + Datasource "%1" not found! @@ -904,6 +1096,22 @@ p, li { white-space: pre-wrap; } Paste لصق + + Page is TOC + + + + Reset page number + + + + Full page + + + + Set page size to printer + + LimeReport::PreviewReportWidget @@ -1252,6 +1460,202 @@ p, li { white-space: pre-wrap; } bottomMargin + + gridStep + + + + fullPage + + + + oldPrintMode + + + + borderColor + + + + resetPageNumber + + + + alternateBackgroundColor + + + + backgroundBrushStyle + + + + startFromNewPage + + + + startNewPage + + + + adaptFontToSize + + + + allowHTML + + + + allowHTMLInFields + + + + followTo + + + + format + + + + lineSpacing + + + + textIndent + + + + textLayoutDirection + + + + underlineLineSize + + + + underlines + + + + valueType + + + + securityLevel + + + + testValue + + + + whitespace + + + + resourcePath + + + + scale + + + + cornerRadius + + + + shapeColor + + + + layoutType + + + + barcodeType + + + + barcodeWidth + + + + foregroundColor + + + + inputMode + + + + pdf417CodeWords + + + + autoSize + + + + center + + + + field + الحقل + + + image + + + + keepAspectRatio + + + + columnsCount + + + + useAlternateBackgroundColor + + + + printBeforePageHeader + + + + maxScalePercent + + + + printOnFirstPage + + + + printOnLastPage + + + + printAlways + + + + repeatOnEachRow + + + + condition + + + + groupFieldName + + + + keepGroupTogether + + LimeReport::RectMMPropItem @@ -1281,10 +1685,6 @@ p, li { white-space: pre-wrap; } Report file name أسم التقرير - - Page - - Script @@ -1297,6 +1697,10 @@ p, li { white-space: pre-wrap; } Wrong file format + + Translations + + LimeReport::ReportDesignWindow @@ -1490,7 +1894,7 @@ p, li { white-space: pre-wrap; } Report has been modified ! Do you want save the report ? - تم تعديل التقرير ! هل تريد حفظ التعديلات ? + تم تعديل التقرير ! هل تريد حفظ التعديلات ? Report file name @@ -1552,6 +1956,42 @@ p, li { white-space: pre-wrap; } Script Browser + + Delete dialog + + + + Add new dialog + + + + Widget Box + + + + Property Editor + + + + Action Editor + + + + Resource Editor + + + + SignalSlot Editor + + + + Dialog Designer Tools + + + + Report has been modified! Do you want save the report? + + LimeReport::ReportEnginePrivate @@ -1563,6 +2003,20 @@ p, li { white-space: pre-wrap; } Preview معاينة + + Report File Change + + + + The report file "%1" has changed names or been deleted. + +This preview is no longer valid. + + + + Language %1 already exists + + LimeReport::ReportFooter @@ -1657,15 +2111,15 @@ p, li { white-space: pre-wrap; } Datasource Name is empty ! - أسم مصدر البيانات فارغ ! + أسم مصدر البيانات فارغ ! SQL is empty ! - SQL فارغة ! + SQL فارغة ! Datasource with name: "%1" already exists ! - مصدر البيانات بأسم: "%1" موجود مسبقاً ! + مصدر البيانات بأسم: "%1" موجود مسبقاً ! Datasource with name %1 already exist @@ -1699,6 +2153,18 @@ p, li { white-space: pre-wrap; } defaultConnection + + Datasource Name is empty! + + + + SQL is empty! + + + + Datasource with name: "%1" already exists! + + LimeReport::ScriptBrowser @@ -1747,18 +2213,37 @@ p, li { white-space: pre-wrap; } + + LimeReport::ScriptEditor + + Form + نموذج + + + Data + + + + Functions + الدوال + + LimeReport::ScriptEngineContext Dialog with name: %1 can`t be created + + Error + + LimeReport::ScriptEngineManager FieldName - Имя поля + Имя поля BandName @@ -1792,6 +2277,66 @@ p, li { white-space: pre-wrap; } Variable %1 not found المتغير %1 غير موجود + + Function manger with name "%1" already exists! + + + + GROUP FUNCTIONS + + + + Field %1 not found in %2! + + + + SYSTEM + + + + NUMBER + + + + DATE&TIME + + + + GENERAL + + + + Datasource + مصدر البيانات + + + ValueField + + + + KeyField + + + + KeyFieldValue + + + + Unique identifier + + + + Content + المحتوى + + + Indent + + + + datasourceName + + LimeReport::SettingDialog @@ -1907,7 +2452,11 @@ p, li { white-space: pre-wrap; } - TextItem " %1 " not found ! + Transparent + + + + TextItem " %1 " not found! @@ -1923,7 +2472,7 @@ p, li { white-space: pre-wrap; } Functions - الدوال + الدوال Editor settings @@ -1937,10 +2486,6 @@ p, li { white-space: pre-wrap; } Cancel إلغاء الأمر - - Data - - ... @@ -1958,6 +2503,53 @@ p, li { white-space: pre-wrap; } + + LimeReport::TranslationEditor + + Form + نموذج + + + Languages + + + + ... + + + + Pages + + + + Strings + + + + Source Text + + + + Translation + + + + Checked + + + + Report Item + + + + Property + + + + Source text + + + LimeReport::VariablesHolder @@ -1966,11 +2558,19 @@ p, li { white-space: pre-wrap; } already exists !! - موجود مسبقاً !! + موجود مسبقاً !! does not exists !! - غير موجود !! + غير موجود !! + + + already exists! + + + + does not exists! + @@ -2144,7 +2744,7 @@ p, li { white-space: pre-wrap; } Master datasource "%1" not found! - مصدر البيانات الرئيسي "%1" غير موجود! + مصدر البيانات الرئيسي "%1" غير موجود! Child @@ -2168,7 +2768,7 @@ p, li { white-space: pre-wrap; } Object with name %1 already exists - أسم الكائن %1 уже موجود مسبقاً + أسم الكائن %1 уже موجود مسبقاً Function %1 not found or have wrong arguments @@ -2222,10 +2822,6 @@ p, li { white-space: pre-wrap; } content المحتوى - - Master datasource "%1" not found!!! - - Master datasouce "%1" not found! @@ -2282,6 +2878,30 @@ p, li { white-space: pre-wrap; } Wrong file format + + Chart Item + + + + First + + + + Second + + + + Thrid + + + + Object with name %1 already exists! + + + + Datasource manager not found + + SQLEditDialog diff --git a/translations/limereport_es_ES.qm b/translations/limereport_es_ES.qm index eb316e359f0890f04ad494279092808922d14daa..176f1c23a596f2ff3e376f890d7c977100627782 100644 GIT binary patch delta 644 zcmZXRQAkr!7{~v2JJ;Ra?(TK>ZnjYmnY13F#Lylj=t0buF4A7Y*)Vh92&arI6od8< zQH?zqmqwvciIEs2aVuJgL^Zh1o21<{w~fbPJNZr zn1J{qPTl5BmN+v8U0i%g1}f;tzXqI}^kxx0OD4n~96fLyU<2s7IRMC?aq@SS1}4#W z@d+SEoW?S;t}(!);bZfA>Q{y1GjvaSCA^)xN;)M+Bvt`xI~~ub)&cdC<7csm4A^bw zp&j=CZJPClk|cPL<>qJ*3$YvFc}nC1r{2fuyTvAZ$*^d#2T>a2E3<+^d-)+-kSRgw z9H)LqELUME?Y=!j7E}^;cxfVJfm1Zj|8G89K>Bm|dIeX+zNDeZx;a+@K zOZ5pk`Vo1yTo1UP%EeU@#2}}q#Hst0;5Ygb-%cf8?IztX%En`X z3;J2L*Y?>l$FmwMqx$U&?oP=*ug^OL*}A3}*7#O;AkdWxna|#HjgC N&2FrV2v#yM`3H^os}=wN delta 895 zcmZXRT}V@59LAq*=WJ)keYnj{y9nMbCPa}MDMcS6EKM^qFCw(0sfU`a9ok231nolX zLyU|=QejY`CF0^sIQUUU=CEu-Rg9U#u&*pCGYBI0=S z5D9gu%qm8!Ax6QL@pjuQI&arh_EMcNpqc8wN`WHUL$zrj^NaS$gRg+)rFL;*g7kOl ze5{-Hi*@m(c_iU{&sFD!NcbHm#R>W}*Va$Qx^eDS*$BPJm`eMSN~ebFtfmh5Jnmr) z8N0S~!zNmbcezoKUQjrt(&6Ld`Xhj|nIFDFK`j~lhu9|yaM7Syn4{nqgr2s-Bo&qm zeQ7$#*e!gUD+X+p#(fVR5IX zY$LkVn6p%)G-a<>W?if>=l_Pt)eZNmk9}=hZnsjE?Jdfo9%Q=v&r__abg%|lim;Fz N{re(nsUl=|{sLj1-7^3H diff --git a/translations/limereport_es_ES.ts b/translations/limereport_es_ES.ts index 5d39e3f..9cca063 100644 --- a/translations/limereport_es_ES.ts +++ b/translations/limereport_es_ES.ts @@ -1,6 +1,56 @@ + + $ClassName$ + + $ClassName$ + + + + + ChartItemEditor + + Form + + + + Series + + + + Add + + + + Delete + + + + Name + Nombre + + + Values field + + + + Color + + + + Type + Tipo + + + Labels field + + + + Ok + + + LRVariableDialog @@ -23,6 +73,21 @@ Attention Atención + + Mandatory + + + + + LanguageSelectDialog + + Dialog + + + + Language + + LimeReport::AVariablesHolder @@ -265,6 +330,70 @@ p, li { white-space: pre-wrap; } Splittable + + DataBand + + + + DataHeaderBand + + + + DataFooterBand + + + + ReportHeader + + + + ReportFooter + + + + PageHeader + + + + PageFooter + + + + SubDetailBand + + + + SubDetailHeaderBand + + + + SubDetailFooterBand + + + + GroupBandHeader + + + + GroupBandFooter + + + + TearOffBand + + + + Keep bottom space + + + + Start from new page + + + + Start new page + + LimeReport::BaseDesignIntf @@ -372,7 +501,7 @@ p, li { white-space: pre-wrap; } already exists - ya existe + ya existe Use default application connection @@ -386,6 +515,10 @@ p, li { white-space: pre-wrap; } defaultConnection + + already exists! + + LimeReport::ContentItemDesignIntf @@ -400,6 +533,10 @@ p, li { white-space: pre-wrap; } Data Datos + + useAlternateBackgroundColor + + LimeReport::DataBrowser @@ -457,7 +594,7 @@ p, li { white-space: pre-wrap; } Do you really want to delete "%1" connection ? - Realmente quieres borrar la conexion "%1"? + Realmente quieres borrar la conexion "%1"? User variables @@ -467,14 +604,6 @@ p, li { white-space: pre-wrap; } System variables Variables del sistema - - Do you really want to delete "%1" datasource ? - - - - Do you really want to delete variable "%1" ? - - Error @@ -491,6 +620,18 @@ p, li { white-space: pre-wrap; } External variables + + Do you really want to delete "%1" connection? + + + + Do you really want to delete "%1" datasource? + + + + Do you really want to delete variable "%1"? + + LimeReport::DataFooterBand @@ -516,18 +657,6 @@ p, li { white-space: pre-wrap; } Variable "%1" not found! - - Datasource "%1" not found ! - - - - connection with name "%1" already exists ! - - - - datasource with name "%1" already exists ! - - invalid connection @@ -536,6 +665,18 @@ p, li { white-space: pre-wrap; } Database "%1" not found + + Datasource "%1" not found! + + + + Connection with name "%1" already exists! + + + + Datasource with name "%1" already exists! + + LimeReport::DataSourceModel @@ -552,6 +693,37 @@ p, li { white-space: pre-wrap; } + + LimeReport::DialogDesignerManager + + Edit Widgets + + + + Widget Box + + + + Object Inspector + + + + Property Editor + + + + Signals && Slots Editor + + + + Resource Editor + + + + Action Editor + + + LimeReport::FontEditorWidget @@ -608,7 +780,7 @@ p, li { white-space: pre-wrap; } - Datasource "%1" not found !!! + Datasource "%1" not found! @@ -753,6 +925,22 @@ p, li { white-space: pre-wrap; } Paste + + Page is TOC + + + + Reset page number + + + + Full page + + + + Set page size to printer + + LimeReport::PreviewReportWidget @@ -1089,6 +1277,202 @@ p, li { white-space: pre-wrap; } Warning + + gridStep + + + + fullPage + + + + oldPrintMode + + + + borderColor + + + + resetPageNumber + + + + alternateBackgroundColor + + + + backgroundBrushStyle + + + + startFromNewPage + + + + startNewPage + + + + adaptFontToSize + + + + allowHTML + + + + allowHTMLInFields + + + + followTo + + + + format + + + + lineSpacing + + + + textIndent + + + + textLayoutDirection + + + + underlineLineSize + + + + underlines + + + + valueType + + + + securityLevel + + + + testValue + + + + whitespace + + + + resourcePath + + + + scale + + + + cornerRadius + + + + shapeColor + + + + layoutType + + + + barcodeType + + + + barcodeWidth + + + + foregroundColor + + + + inputMode + + + + pdf417CodeWords + + + + autoSize + + + + center + + + + field + + + + image + + + + keepAspectRatio + + + + columnsCount + + + + useAlternateBackgroundColor + + + + printBeforePageHeader + + + + maxScalePercent + + + + printOnFirstPage + + + + printOnLastPage + + + + printAlways + + + + repeatOnEachRow + + + + condition + + + + groupFieldName + + + + keepGroupTogether + + LimeReport::RectMMPropItem @@ -1118,10 +1502,6 @@ p, li { white-space: pre-wrap; } Report file name - - Page - - Script @@ -1134,6 +1514,10 @@ p, li { white-space: pre-wrap; } Wrong file format + + Translations + + LimeReport::ReportDesignWindow @@ -1333,10 +1717,6 @@ p, li { white-space: pre-wrap; } Data Browser - - Report has been modified ! Do you want save the report ? - - Report file name @@ -1377,6 +1757,42 @@ p, li { white-space: pre-wrap; } Tear-off Band + + Delete dialog + + + + Add new dialog + + + + Widget Box + + + + Property Editor + + + + Action Editor + + + + Resource Editor + + + + SignalSlot Editor + + + + Dialog Designer Tools + + + + Report has been modified! Do you want save the report? + + LimeReport::ReportEnginePrivate @@ -1388,6 +1804,20 @@ p, li { white-space: pre-wrap; } Preview + + Report File Change + + + + The report file "%1" has changed names or been deleted. + +This preview is no longer valid. + + + + Language %1 already exists + + LimeReport::ReportFooter @@ -1496,18 +1926,6 @@ p, li { white-space: pre-wrap; } Error - - Datasource Name is empty ! - - - - SQL is empty ! - - - - Datasource with name: "%1" already exists ! - - Datasource with name %1 already exist @@ -1524,6 +1942,18 @@ p, li { white-space: pre-wrap; } defaultConnection + + Datasource Name is empty! + + + + SQL is empty! + + + + Datasource with name: "%1" already exists! + + LimeReport::ScriptBrowser @@ -1572,12 +2002,31 @@ p, li { white-space: pre-wrap; } + + LimeReport::ScriptEditor + + Form + + + + Data + Datos + + + Functions + + + LimeReport::ScriptEngineContext Dialog with name: %1 can`t be created + + Error + + LimeReport::ScriptEngineManager @@ -1613,6 +2062,70 @@ p, li { white-space: pre-wrap; } Name Nombre + + Function manger with name "%1" already exists! + + + + GROUP FUNCTIONS + + + + FieldName + + + + Field %1 not found in %2! + + + + SYSTEM + + + + NUMBER + + + + DATE&TIME + + + + GENERAL + + + + Datasource + + + + ValueField + + + + KeyField + + + + KeyFieldValue + + + + Unique identifier + + + + Content + + + + Indent + + + + datasourceName + + LimeReport::SettingDialog @@ -1728,7 +2241,11 @@ p, li { white-space: pre-wrap; } - TextItem " %1 " not found ! + Transparent + + + + TextItem " %1 " not found! @@ -1748,11 +2265,7 @@ p, li { white-space: pre-wrap; } Data - Datos - - - Functions - + Datos Editor settings @@ -1779,6 +2292,53 @@ p, li { white-space: pre-wrap; } + + LimeReport::TranslationEditor + + Form + + + + Languages + + + + ... + + + + Pages + + + + Strings + + + + Source Text + + + + Translation + + + + Checked + + + + Report Item + + + + Property + + + + Source text + + + LimeReport::VariablesHolder @@ -1787,11 +2347,19 @@ p, li { white-space: pre-wrap; } already exists !! - ya existe !! + ya existe !! does not exists !! - no existe !! + no existe !! + + + already exists! + + + + does not exists! + @@ -1876,10 +2444,6 @@ p, li { white-space: pre-wrap; } Invalid connection! %1 - - Master datasource "%1" not found!!! - - Master datasouce "%1" not found! @@ -1904,10 +2468,6 @@ p, li { white-space: pre-wrap; } Selected elements have different parent containers - - Object with name %1 already exists - - Function %1 not found or have wrong arguments @@ -1996,5 +2556,33 @@ p, li { white-space: pre-wrap; } Tear-off Band + + Chart Item + + + + First + + + + Second + + + + Thrid + + + + Master datasource "%1" not found! + + + + Object with name %1 already exists! + + + + Datasource manager not found + + diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index f21886b98fffb2fbd8bb07f576c5a0bfa7cd1893..0b912bd5f6646bef0e8f9b119eba6832b305f7a2 100644 GIT binary patch delta 13407 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 diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index c8fce48..305a698 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -8,6 +8,49 @@ + + ChartItemEditor + + Form + Форма + + + Series + + + + Add + + + + Delete + + + + Name + Имя переменной + + + Values field + + + + Color + + + + Type + Тип + + + Labels field + + + + Ok + Ок + + LRVariableDialog @@ -30,6 +73,21 @@ Attention Внимание + + Mandatory + + + + + LanguageSelectDialog + + Dialog + + + + Language + + LimeReport::AboutDialog @@ -330,6 +388,18 @@ p, li { white-space: pre-wrap; } SubDetailFooterBand Завершение подчиненных данных + + Keep bottom space + + + + Start from new page + + + + Start new page + + LimeReport::BaseDesignIntf @@ -861,6 +931,22 @@ p, li { white-space: pre-wrap; } Paste Вставить + + Page is TOC + + + + Reset page number + + + + Full page + + + + Set page size to printer + + LimeReport::PreviewReportWidget @@ -1432,7 +1518,7 @@ p, li { white-space: pre-wrap; } Page - Страница + Страница Script @@ -1446,6 +1532,10 @@ p, li { white-space: pre-wrap; } Wrong file format Неверный формат файла + + Translations + + LimeReport::ReportDesignWindow @@ -1742,6 +1832,10 @@ p, li { white-space: pre-wrap; } This preview is no longer valid. Файл отчета "%1" изменил имя или был удален. + + Language %1 already exists + + LimeReport::ReportFooter @@ -1926,6 +2020,21 @@ This preview is no longer valid. неверный формат файла + + LimeReport::ScriptEditor + + Form + Форма + + + Data + Данные + + + Functions + Функции + + LimeReport::ScriptEngineContext @@ -2011,6 +2120,38 @@ This preview is no longer valid. GENERAL ОБЩИЕ + + Datasource + Источник данных + + + ValueField + + + + KeyField + + + + KeyFieldValue + + + + Unique identifier + + + + Content + Содержимое + + + Indent + + + + datasourceName + + LimeReport::SettingDialog @@ -2146,7 +2287,7 @@ This preview is no longer valid. Functions - Функции + Функции Editor settings @@ -2162,7 +2303,7 @@ This preview is no longer valid. Data - Данные + Данные ... @@ -2181,6 +2322,53 @@ This preview is no longer valid. Esc + + LimeReport::TranslationEditor + + Form + Форма + + + Languages + + + + ... + ... + + + Pages + + + + Strings + + + + Source Text + + + + Translation + + + + Checked + + + + Report Item + + + + Property + + + + Source text + + + LimeReport::VariablesHolder @@ -2410,5 +2598,21 @@ This preview is no longer valid. Object with name %1 already exists! Объект с именем %1 уже существует! + + Chart Item + + + + First + + + + Second + + + + Thrid + + From 8061d162dc255f761a2b3a2fc817950be3193b30 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 02:47:45 +0300 Subject: [PATCH 078/347] Demo2 fixed --- demo_r2/main.cpp | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/demo_r2/main.cpp b/demo_r2/main.cpp index f0c521f..dac3ecc 100644 --- a/demo_r2/main.cpp +++ b/demo_r2/main.cpp @@ -4,18 +4,7 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); - QFile f(":qdarkstyle/style.qss"); - if (!f.exists()) - { - printf("Unable to set stylesheet, file not found\n"); - } - else - { - f.open(QFile::ReadOnly | QFile::Text); - QTextStream ts(&f); - a.setStyleSheet(ts.readAll()); - //a.setStyleSheet(""); - } + MainWindow w; w.show(); From 8d18a51c9d11a09d8bb428dfce4a068c7f1c327c Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 5 Oct 2017 02:48:13 +0300 Subject: [PATCH 079/347] SpinBox theme fixed --- 3rdparty/dark_style_sheet/qdarkstyle/style.qss | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 831f210..e0a8fe1 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -708,21 +708,20 @@ QAbstractSpinBox { background-color: #232629; color: #eff0f1; border-radius: 2px; - min-width: 75px; } QAbstractSpinBox:up-button { background-color: transparent; subcontrol-origin: border; - subcontrol-position: center right; + subcontrol-position: top right; } QAbstractSpinBox:down-button { background-color: transparent; subcontrol-origin: border; - subcontrol-position: center left; + subcontrol-position: bottom right; } QAbstractSpinBox::up-arrow,QAbstractSpinBox::up-arrow:disabled,QAbstractSpinBox::up-arrow:off { From ce9955bc47037a01d0f57ab869ef3a2a4d54495e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 5 Oct 2017 14:12:12 +0300 Subject: [PATCH 080/347] Demo2 fixed --- demo_r2/demo_r2.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/demo_r2/demo_r2.pro b/demo_r2/demo_r2.pro index 22a4cb3..224661d 100644 --- a/demo_r2/demo_r2.pro +++ b/demo_r2/demo_r2.pro @@ -20,8 +20,8 @@ INCLUDEPATH += $$PWD/../include DEPENDPATH += $$PWD/../include RESOURCES += \ - demo_r2.qrc \ - ../3rdparty/QDarkStyleSheet/qdarkstyle/style.qrc + demo_r2.qrc + EXTRA_DIR += $$PWD/demo_reports DEST_DIR = $${DEST_BINS} From 40bafebbbd919da17698accdb4d486461b82ab68 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 26 Oct 2017 13:24:06 +0400 Subject: [PATCH 081/347] Qt4 build fixed --- demo_r1/demo_r1.pro | 7 +++++- demo_r2/demo_r2.pro | 7 +++++- include/lrglobal.h | 2 +- limereport/databrowser/lrvariabledialog.cpp | 5 ++++ limereport/items/lrchartitem.cpp | 5 ++++ limereport/items/lrchartitemeditor.cpp | 25 +++++++++++++++++++ limereport/limereport.pro | 7 +++++- limereport/lrglobal.h | 2 +- limereport/lrreportdesignwidget.cpp | 6 ++--- limereport/lrreportdesignwidget.h | 7 +++--- limereport/lrreportrender.cpp | 8 +++++- limereport/lrscriptenginemanager.h | 17 ++++++++++--- limereport/scripteditor/lrscripteditor.cpp | 6 ++++- .../languageselectdialog.cpp | 5 ++++ .../translationeditor/languageselectdialog.h | 2 ++ 15 files changed, 95 insertions(+), 16 deletions(-) diff --git a/demo_r1/demo_r1.pro b/demo_r1/demo_r1.pro index 20c576f..9c4c76d 100644 --- a/demo_r1/demo_r1.pro +++ b/demo_r1/demo_r1.pro @@ -59,7 +59,12 @@ win32 { DESTDIR = $$DEST_DIR RC_FILE += mainicon.rc - QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$shell_quote($$EXTRA_DIR\\*) $$shell_quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) + greaterThan(QT_MAJOR_VERSION, 4) { + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$shell_quote($$EXTRA_DIR\\*) $$shell_quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) + } + lessThan(QT_MAJOR_VERSION, 5){ + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR\\*) $$quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) + } !contains(CONFIG, static_build){ contains(CONFIG,zint){ LIBS += -L$${DEST_LIBS} -lQtZint diff --git a/demo_r2/demo_r2.pro b/demo_r2/demo_r2.pro index 224661d..a5961c0 100644 --- a/demo_r2/demo_r2.pro +++ b/demo_r2/demo_r2.pro @@ -70,6 +70,11 @@ win32 { LIBS += -llimereportd } - QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$shell_quote($$EXTRA_DIR\\*) $$shell_quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) + greaterThan(QT_MAJOR_VERSION, 4) { + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$shell_quote($$EXTRA_DIR\\*) $$shell_quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) + } + lessThan(QT_MAJOR_VERSION, 5){ + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($$EXTRA_DIR\\*) $$quote($$REPORTS_DIR\\demo_reports) $$escape_expand(\\n\\t) + } } diff --git a/include/lrglobal.h b/include/lrglobal.h index a553c58..74eeb00 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -156,7 +156,7 @@ namespace Const{ { public: enum VariableDataType {Undefined, String, Bool, Int, Real, Date, Time, DateTime}; - Q_ENUM(VariableDataType) + Q_ENUMS(VariableDataType) private: Enums(){} Q_GADGET diff --git a/limereport/databrowser/lrvariabledialog.cpp b/limereport/databrowser/lrvariabledialog.cpp index d5c34d9..d039315 100644 --- a/limereport/databrowser/lrvariabledialog.cpp +++ b/limereport/databrowser/lrvariabledialog.cpp @@ -78,7 +78,12 @@ void LRVariableDialog::showEvent(QShowEvent *) QMetaEnum enumerator = LimeReport::Enums::staticMetaObject.enumerator(enumIndex); if (!m_variableName.isEmpty()&&m_variablesContainer&&m_variablesContainer->containsVariable(m_variableName)){ ui->leValue->setText(m_variablesContainer->variable(m_variableName).toString()); +#ifdef HAVE_QT5 ui->cbbType->setCurrentText(enumerator.valueToKey(m_variablesContainer->variableDataType(m_variableName))); +#endif +#ifdef HAVE_QT4 + ui->cbbType->setCurrentIndex(ui->cbbType->findText(enumerator.valueToKey(m_variablesContainer->variableDataType(m_variableName)))); +#endif ui->cbbMandatory->setChecked(m_variablesContainer->variableIsMandatory(m_variableName)); } } diff --git a/limereport/items/lrchartitem.cpp b/limereport/items/lrchartitem.cpp index 1a8a58b..62f9230 100644 --- a/limereport/items/lrchartitem.cpp +++ b/limereport/items/lrchartitem.cpp @@ -461,7 +461,12 @@ void PieChart::drawPercent(QPainter *painter, QRectF chartRect, qreal startAngle QPointF center(chartRect.left()+chartRect.width()/2,chartRect.top()+chartRect.height()/2); qreal percent = angle/3.6; +#ifdef HAVE_QT4 + qreal radAngle = (angle/2+startAngle)*(M_PI/180); +#endif +#ifdef HAVE_QT5 qreal radAngle = qDegreesToRadians(angle/2+startAngle); +#endif qreal radius = painter->fontMetrics().width("99,9%"); qreal border = chartRect.height()*0.02; qreal length = (chartRect.height())/2-(radius/2+border); diff --git a/limereport/items/lrchartitemeditor.cpp b/limereport/items/lrchartitemeditor.cpp index da58cbd..cb13541 100644 --- a/limereport/items/lrchartitemeditor.cpp +++ b/limereport/items/lrchartitemeditor.cpp @@ -118,7 +118,12 @@ void ChartItemEditor::init() ui->seriesTypeComboBox->addItem(enumerator.key(i)); } +#ifdef HAVE_QT5 ui->labelsFieldComboBox->setCurrentText(m_charItem->labelsField()); +#endif +#ifdef HAVE_QT4 + ui->labelsFieldComboBox->setCurrentIndex(ui->labelsFieldComboBox->findText( m_charItem->labelsField())); +#endif if (!m_charItem->series().isEmpty()){ enableSeriesEditor(); ui->tableWidget->selectRow(0); @@ -145,7 +150,12 @@ void ChartItemEditor::disableSeriesEditor() ui->valuesFieldComboBox->setDisabled(true); m_colorButton->setDisabled(true); m_colorIndicator->setDisabled(true); +#ifdef HAVE_QT5 ui->valuesFieldComboBox->setCurrentText(""); +#endif +#ifdef HAVE_QT4 + ui->valuesFieldComboBox->setEditText(""); +#endif ui->seriesTypeComboBox->setDisabled(true); } @@ -198,7 +208,12 @@ void ChartItemEditor::slotAddSeries() ui->tableWidget->setRowCount(m_charItem->series().count()); ui->tableWidget->setItem(m_charItem->series().count()-1, 0, new QTableWidgetItem(series->name())); ui->tableWidget->selectRow(m_charItem->series().count()-1); +#ifdef HAVE_QT5 ui->valuesFieldComboBox->setCurrentText(""); +#endif +#ifdef HAVE_QT4 + ui->valuesFieldComboBox->setEditText(""); +#endif } void ChartItemEditor::slotDeleteSeries() @@ -220,11 +235,21 @@ void ChartItemEditor::on_tableWidget_itemSelectionChanged() if (ui->tableWidget->selectionModel()->hasSelection()){ LimeReport::SeriesItem* series = m_charItem->series().at(ui->tableWidget->selectionModel()->currentIndex().row()); ui->seriesNameLineEdit->setText(series->name()); +#ifdef HAVE_QT5 ui->valuesFieldComboBox->setCurrentText(series->valuesColumn()); +#endif +#ifdef HAVE_QT4 + ui->valuesFieldComboBox->setCurrentIndex(ui->valuesFieldComboBox->findText(series->valuesColumn())); +#endif m_colorIndicator->setColor(series->color()); static int enumIndex = LimeReport::SeriesItem::staticMetaObject.indexOfEnumerator("SeriesItemPreferredType"); QMetaEnum enumerator = LimeReport::SeriesItem::staticMetaObject.enumerator(enumIndex); +#ifdef HAVE_QT5 ui->seriesTypeComboBox->setCurrentText(enumerator.valueToKey(series->preferredType())); +#endif +#ifdef HAVE_QT4 + ui->seriesTypeComboBox->setCurrentIndex(ui->seriesTypeComboBox->findText(enumerator.valueToKey(series->preferredType()))); +#endif enableSeriesEditor(); } } diff --git a/limereport/limereport.pro b/limereport/limereport.pro index e98a9d1..815fc72 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -99,8 +99,13 @@ contains(CONFIG,build_translations){ TRANSLATIONS = $$prependAll(LANGUAGES, \"$$TRANSLATIONS_PATH/limereport_,.ts\") qtPrepareTool(LUPDATE, lupdate) - ts.commands = $$LUPDATE $$shell_quote($$PWD) -ts $$TRANSLATIONS +greaterThan(QT_MAJOR_VERSION, 4) { + ts.commands = $$LUPDATE $$shell_quote($$PWD) -ts $$TRANSLATIONS +} +lessThan(QT_MAJOR_VERSION, 5){ + ts.commands = $$LUPDATE $$quote($$PWD) -ts $$TRANSLATIONS +} TRANSLATIONS_FILES = qtPrepareTool(LRELEASE, lrelease) for(tsfile, TRANSLATIONS) { diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index a553c58..74eeb00 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -156,7 +156,7 @@ namespace Const{ { public: enum VariableDataType {Undefined, String, Bool, Int, Real, Date, Time, DateTime}; - Q_ENUM(VariableDataType) + Q_ENUMS(VariableDataType) private: Enums(){} Q_GADGET diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 709ad3c..ff342b3 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -58,11 +58,11 @@ ReportDesignWidget::ReportDesignWidget(ReportEngine *report, QMainWindow *mainWi #endif m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), m_dialogChanged(false) { -#ifdef HAVE_QT5 - m_tabWidget = new QTabWidget(this); -#endif #ifdef HAVE_QT4 m_tabWidget = new LimeReportTabWidget(this); +#endif +#ifdef HAVE_QT5 + m_tabWidget = new QTabWidget(this); #endif m_tabWidget->setTabPosition(QTabWidget::South); m_tabWidget->setMovable(true); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 25b9a74..81c13fd 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -45,6 +45,7 @@ #ifdef HAVE_QT4 QT_BEGIN_NAMESPACE class LimeReportTabWidget: public QTabWidget{ + Q_OBJECT public: explicit LimeReportTabWidget(QWidget *parent = 0):QTabWidget(parent){} QTabBar* tabBar() const{ return QTabWidget::tabBar();} @@ -207,11 +208,11 @@ private: DialogDesignerManager* m_dialogDesignerManager; #endif QMainWindow *m_mainWindow; -#ifdef HAVE_QT5 - QTabWidget* m_tabWidget; -#endif #ifdef HAVE_QT4 LimeReportTabWidget* m_tabWidget; +#endif +#ifdef HAVE_QT5 + QTabWidget* m_tabWidget; #endif GraphicsViewZoomer* m_zoomer; QFont m_defaultFont; diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index cd701c7..4e8be0f 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -1003,8 +1003,14 @@ bool ReportRender::registerBand(BandDesignIntf *band, bool registerInChildren) if (band->isData()) m_renderedDataBandCount++; band->setObjectName(band->objectName()+QString::number(++m_curentNameIndex)); renameChildItems(band); - if (m_lastDataBand) + if (m_lastDataBand){ +#ifdef HAVE_QT4 + m_lastDataBand->metaObject()->invokeMethod(m_lastDataBand,"bandRegistred"); +#endif +#ifdef HAVE_QT5 emit m_lastDataBand->bandRegistred(); +#endif + } return true; } else return false; } diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 3edd6dc..0c88af3 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -303,8 +303,16 @@ private: class ScriptFunctionsManager : public QObject{ Q_OBJECT public: - explicit ScriptFunctionsManager(QObject* parent = 0):QObject(parent){ m_wrappersFactory.insert("QComboBox",new ComboBoxWrapperCreator());} - ~ScriptFunctionsManager(){ foreach(IWrapperCreator* wrapper, m_wrappersFactory.values()){ delete wrapper;} m_wrappersFactory.clear();} + explicit ScriptFunctionsManager(QObject* parent = 0):QObject(parent){ +#ifdef USE_QJSENGINE + m_wrappersFactory.insert("QComboBox",new ComboBoxWrapperCreator()); +#endif + } + ~ScriptFunctionsManager(){ +#ifdef USE_QJSENGINE + foreach(IWrapperCreator* wrapper, m_wrappersFactory.values()){ delete wrapper;} m_wrappersFactory.clear(); +#endif + } Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName); Q_INVOKABLE QVariant line(const QString& bandName); Q_INVOKABLE QVariant numberFormat(QVariant value, const char &format, int precision, const QString &locale); @@ -337,7 +345,9 @@ public: static QColor createQColor(const QString& color){ return QColor(color);} private: ScriptEngineManager* m_scriptEngineManager; +#ifdef USE_QJSENGINE QMap m_wrappersFactory; +#endif }; class ScriptEngineManager : public QObject, public Singleton, public IScriptEngineManager @@ -484,7 +494,8 @@ public: } #ifndef USE_QJSENGINE -Q_DECLARE_METATYPE(LimeReport::ComboBoxPrototype*); +Q_DECLARE_METATYPE(LimeReport::ComboBoxPrototype*) +Q_DECLARE_METATYPE(QComboBox*) #endif #endif // LRSCRIPTENGINEMANAGER_H diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index abb254f..4db2fac 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -1,6 +1,9 @@ #include "lrscripteditor.h" #include "ui_lrscripteditor.h" + +#ifdef USE_QJSENGINE #include +#endif #include "lrdatasourcemanager.h" #include "lrscriptenginemanager.h" @@ -88,6 +91,7 @@ void ScriptEditor::initCompleter() ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); +#ifdef USE_QJSENGINE QJSValue globalObject = se.scriptEngine()->globalObject(); QJSValueIterator it(globalObject); while (it.hasNext()){ @@ -96,7 +100,7 @@ void ScriptEditor::initCompleter() dataWords << it.name(); } } - +#endif foreach(const QString &dsName,dm->dataSourceNames()){ dataWords << dsName; foreach(const QString &field, dm->fieldNames(dsName)){ diff --git a/limereport/translationeditor/languageselectdialog.cpp b/limereport/translationeditor/languageselectdialog.cpp index f52be35..64265c8 100644 --- a/limereport/translationeditor/languageselectdialog.cpp +++ b/limereport/translationeditor/languageselectdialog.cpp @@ -12,7 +12,12 @@ LanguageSelectDialog::LanguageSelectDialog(QWidget *parent) : for (int i = 2; icomboBox->addItem(QLocale::languageToString(static_cast(i)),static_cast(i)); } +#ifdef HAVE_QT5 ui->comboBox->setCurrentText(""); +#endif +#ifdef HAVE_QT4 + ui->comboBox->setEditText(""); +#endif } LanguageSelectDialog::~LanguageSelectDialog() diff --git a/limereport/translationeditor/languageselectdialog.h b/limereport/translationeditor/languageselectdialog.h index 3286527..0402327 100644 --- a/limereport/translationeditor/languageselectdialog.h +++ b/limereport/translationeditor/languageselectdialog.h @@ -20,4 +20,6 @@ private: Ui::LanguageSelectDialog *ui; }; +Q_DECLARE_METATYPE(QLocale::Language) + #endif // LANGUAGESELECTDIALOG_H From c42d87b1463c7cb19c05e7e3a1d541a07ecc68bc Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Sat, 28 Oct 2017 01:19:39 +0300 Subject: [PATCH 082/347] enndlessHeight added --- limereport/lrpageitemdesignintf.cpp | 13 ++++++++++++- limereport/lrpageitemdesignintf.h | 6 ++++++ limereport/lrreportrender.cpp | 10 ++++++++-- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 269244e..f1e654b 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -63,7 +63,8 @@ PageItemDesignIntf::PageItemDesignIntf(const PageSize pageSize, const QRectF &re m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(pageSize), m_sizeChainging(false), m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), - m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false) + m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false), + m_endlessHeight(false) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -331,6 +332,16 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } +bool PageItemDesignIntf::endlessHeight() const +{ + return m_endlessHeight; +} + +void PageItemDesignIntf::setEndlessHeight(bool endlessPage) +{ + m_endlessHeight = endlessPage; +} + bool PageItemDesignIntf::getSetPageSizeToPrinter() const { return m_setPageSizeToPrinter; diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index af023cc..93df860 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -57,6 +57,8 @@ class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft Q_PROPERTY(int extendedHeight READ extendedHeight WRITE setExtendedHeight) Q_PROPERTY(bool pageIsTOC READ isTOC WRITE setIsTOC) Q_PROPERTY(bool setPageSizeToPrinter READ getSetPageSizeToPrinter WRITE setSetPageSizeToPrinter ) + Q_PROPERTY(bool endlessHeight READ endlessHeight WRITE setEndlessHeight) + friend class ReportRender; public: enum Orientation { Portrait, Landscape }; @@ -133,6 +135,9 @@ public: bool getSetPageSizeToPrinter() const; void setSetPageSizeToPrinter(bool setPageSizeToPrinter); + bool endlessHeight() const; + void setEndlessHeight(bool endlessHeight); + signals: void beforeFirstPageRendered(); void afterLastPageRendered(); @@ -169,6 +174,7 @@ private: int m_extendedHeight; bool m_isTOC; bool m_setPageSizeToPrinter; + bool m_endlessHeight; }; typedef QList ReportPages; diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 4e8be0f..906f72f 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -949,7 +949,7 @@ bool ReportRender::registerBand(BandDesignIntf *band, bool registerInChildren) } - if (band->height() <= m_maxHeightByColumn[m_currentColumn]){ + if (band->height() <= m_maxHeightByColumn[m_currentColumn] || m_patternPageItem->endlessHeight()){ if (band->bandType()==BandDesignIntf::PageFooter){ for (int i=0;isetCurrentPage(m_renderPageItem); emit m_patternPageItem->afterRender(); if (isLast) emit m_patternPageItem->afterLastPageRendered(); - + if (isLast && m_patternPageItem->endlessHeight()){ + qreal pageHeight = 0; + foreach (BandDesignIntf* band, m_renderPageItem->bands()) { + pageHeight += band->height(); + } + m_renderPageItem->setHeight(pageHeight+10+(m_patternPageItem->topMargin()+m_patternPageItem->bottomMargin())*Const::mmFACTOR); + } } QString ReportRender::toString() From f42dde62118f1561e37c06200f6f94e90044d28d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Skowro=C5=84ski?= Date: Sat, 4 Nov 2017 19:17:49 +0100 Subject: [PATCH 083/347] Fix typos. s/contens/contents. --- limereport/lrreportengine.cpp | 6 +- limereport/lrreportrender.cpp | 4 +- limereport/lrscriptenginemanager.cpp | 82 ++++++++++++++-------------- limereport/lrscriptenginemanager.h | 30 +++++----- 4 files changed, 61 insertions(+), 61 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index fafa4c4..87ef13b 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -76,9 +76,9 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_datasources->setReportSettings(&m_reportSettings); m_scriptEngineContext = new ScriptEngineContext(this); - ICallbackDatasource* tableOfContens = m_datasources->createCallbackDatasource("tableofcontens"); - connect(tableOfContens, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), - m_scriptEngineContext->tableOfContens(), SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); + ICallbackDatasource* tableOfContents = m_datasources->createCallbackDatasource("tableofcontents"); + connect(tableOfContents, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), + m_scriptEngineContext->tableOfContents(), SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); m_datasources->setObjectName("datasources"); connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 906f72f..7117960 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -1055,7 +1055,7 @@ BandDesignIntf* ReportRender::sliceBand(BandDesignIntf *band, BandDesignIntf* pa void ReportRender::updateTOC(BaseDesignIntf* item, int pageNumber){ BandDesignIntf* band = dynamic_cast(item); if (band){ - TableOfContens* toc = m_scriptEngineContext->tableOfContens(); + TableOfContents* toc = m_scriptEngineContext->tableOfContents(); foreach (QString key, band->bookmarks()){ toc->setItem(key, band->getBookMark(key).toString(), pageNumber); } @@ -1065,7 +1065,7 @@ void ReportRender::updateTOC(BaseDesignIntf* item, int pageNumber){ void ReportRender::secondRenderPass(ReportPages renderedPages) { - if (!m_scriptEngineContext->tableOfContens()->isEmpty()){ + if (!m_scriptEngineContext->tableOfContents()->isEmpty()){ for(int i=0; ichildBaseItems()){ diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index bb5aa16..f20d8a4 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -347,9 +347,9 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ // qDebug()<<"is script context exists before set datamanager is called"<< (m_context == 0); -// ICallbackDatasource* tableOfContens = m_dataManager->createCallbackDatasource("tableofcontens"); -// connect(tableOfContens, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), -// m_tableOfContens, SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); +// ICallbackDatasource* tableOfContents = m_dataManager->createCallbackDatasource("tableofcontents"); +// connect(tableOfContents, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), +// m_tableOfContents, SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); } } } @@ -540,21 +540,21 @@ QVariant ScriptEngineManager::evaluateScript(const QString& script){ return QVariant(); } -void ScriptEngineManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int indent) +void ScriptEngineManager::addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent) { Q_ASSERT(m_context != 0); if (m_context){ BandDesignIntf* currentBand = m_context->getCurrentBand(); - m_context->tableOfContens()->setItem(uniqKey, content, 0, indent); + m_context->tableOfContents()->setItem(uniqKey, content, 0, indent); if (currentBand) currentBand->addBookmark(uniqKey, content); } } -void ScriptEngineManager::clearTableOfContens(){ +void ScriptEngineManager::clearTableOfContents(){ if (m_context) { - if (m_context->tableOfContens()) - m_context->tableOfContens()->clear(); + if (m_context->tableOfContents()) + m_context->tableOfContents()->clear(); } } @@ -783,31 +783,31 @@ bool ScriptEngineManager::createGetFieldByKeyFunction() return addFunction(fd); } -bool ScriptEngineManager::createAddTableOfContensItemFunction() +bool ScriptEngineManager::createAddTableOfContentsItemFunction() { JSFunctionDesc fd; fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); fd.setCategory(tr("GENERAL")); - fd.setName("addTableOfContensItem"); - fd.setDescription("addTableOfContensItem(\""+tr("Unique identifier")+" \""+tr("Content")+"\", \""+tr("Indent")+"\")"); - fd.setScriptWrapper(QString("function addTableOfContensItem(uniqKey, content, indent){" - "return %1.addTableOfContensItem(uniqKey, content, indent);}" + fd.setName("addTableOfContentsItem"); + fd.setDescription("addTableOfContentsItem(\""+tr("Unique identifier")+" \""+tr("Content")+"\", \""+tr("Indent")+"\")"); + fd.setScriptWrapper(QString("function addTableOfContentsItem(uniqKey, content, indent){" + "return %1.addTableOfContentsItem(uniqKey, content, indent);}" ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); return addFunction(fd); } -bool ScriptEngineManager::createClearTableOfContensFunction() +bool ScriptEngineManager::createClearTableOfContentsFunction() { JSFunctionDesc fd; fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); fd.setCategory(tr("GENERAL")); - fd.setName("clearTableOfContens"); - fd.setDescription("clearTableOfContens()"); - fd.setScriptWrapper(QString("function clearTableOfContens(){" - "return %1.clearTableOfContens();}" + fd.setName("clearTableOfContents"); + fd.setDescription("clearTableOfContents()"); + fd.setScriptWrapper(QString("function clearTableOfContents(){" + "return %1.clearTableOfContents();}" ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); return addFunction(fd); @@ -863,8 +863,8 @@ ScriptEngineManager::ScriptEngineManager() QScriptValue fontConstructor = m_scriptEngine->newFunction(QFontPrototype::constructorQFont, fontProto); m_scriptEngine->globalObject().setProperty("QFont", fontConstructor); #endif - createAddTableOfContensItemFunction(); - createClearTableOfContensFunction(); + createAddTableOfContentsItemFunction(); + createClearTableOfContentsFunction(); createReopenDatasourceFunction(); m_model = new ScriptEngineModel(this); @@ -1103,7 +1103,7 @@ void ScriptEngineContext::clear() m_createdDialogs.clear(); #endif m_initScript.clear(); - m_tableOfContens->clear(); + m_tableOfContents->clear(); m_lastError=""; } @@ -1186,14 +1186,14 @@ DialogDescriber* ScriptEngineContext::findDialogContainer(const QString& dialogN return 0; } -TableOfContens* ScriptEngineContext::tableOfContens() const +TableOfContents* ScriptEngineContext::tableOfContents() const { - return m_tableOfContens; + return m_tableOfContents; } -void ScriptEngineContext::setTableOfContens(TableOfContens* tableOfContens) +void ScriptEngineContext::setTableOfContents(TableOfContents* tableOfContents) { - m_tableOfContens = tableOfContens; + m_tableOfContents = tableOfContents; } PageItemDesignIntf* ScriptEngineContext::getCurrentPage() const @@ -1321,9 +1321,9 @@ void ScriptEngineContext::initDialogs(){ bool ScriptEngineContext::runInitScript(){ ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); - ScriptEngineManager::instance().clearTableOfContens(); + ScriptEngineManager::instance().clearTableOfContents(); ScriptEngineManager::instance().setContext(this); - m_tableOfContens->clear(); + m_tableOfContents->clear(); #ifndef USE_QJSENGINE engine->pushContext(); @@ -1538,14 +1538,14 @@ void ScriptFunctionsManager::reopenDatasource(const QString& datasourceName) return dm->reopenDatasource(datasourceName); } -void ScriptFunctionsManager::addTableOfContensItem(const QString& uniqKey, const QString& content, int indent) +void ScriptFunctionsManager::addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent) { - scriptEngineManager()->addTableOfContensItem(uniqKey, content, indent); + scriptEngineManager()->addTableOfContentsItem(uniqKey, content, indent); } -void ScriptFunctionsManager::clearTableOfContens() +void ScriptFunctionsManager::clearTableOfContents() { - scriptEngineManager()->clearTableOfContens(); + scriptEngineManager()->clearTableOfContents(); } @@ -1627,12 +1627,12 @@ void ScriptFunctionsManager::setScriptEngineManager(ScriptEngineManager *scriptE m_scriptEngineManager = scriptEngineManager; } -TableOfContens::~TableOfContens() +TableOfContents::~TableOfContents() { clear(); } -void TableOfContens::setItem(const QString& uniqKey, const QString& content, int pageNumber, int indent) +void TableOfContents::setItem(const QString& uniqKey, const QString& content, int pageNumber, int indent) { ContentItem * item = 0; if (m_hash.contains(uniqKey)){ @@ -1647,20 +1647,20 @@ void TableOfContens::setItem(const QString& uniqKey, const QString& content, int item->pageNumber = pageNumber; item->indent = indent; item->uniqKey = uniqKey; - m_tableOfContens.append(item); + m_tableOfContents.append(item); m_hash.insert(uniqKey, item); } } -void TableOfContens::slotOneSlotDS(CallbackInfo info, QVariant& data) +void TableOfContents::slotOneSlotDS(CallbackInfo info, QVariant& data) { QStringList columns; columns << "Content" << "Page number" << "Content Key"; switch (info.dataType) { case LimeReport::CallbackInfo::RowCount: - data = m_tableOfContens.count(); + data = m_tableOfContents.count(); break; case LimeReport::CallbackInfo::ColumnCount: data = columns.size(); @@ -1670,8 +1670,8 @@ void TableOfContens::slotOneSlotDS(CallbackInfo info, QVariant& data) break; } case LimeReport::CallbackInfo::ColumnData: - if (info.index < m_tableOfContens.count()){ - ContentItem* item = m_tableOfContens.at(info.index); + if (info.index < m_tableOfContents.count()){ + ContentItem* item = m_tableOfContents.at(info.index); if (info.columnName.compare("Content",Qt::CaseInsensitive) == 0) data = item->content.rightJustified(item->indent+item->content.size()); if (info.columnName.compare("Content Key",Qt::CaseInsensitive) == 0) @@ -1684,13 +1684,13 @@ void TableOfContens::slotOneSlotDS(CallbackInfo info, QVariant& data) } } -void LimeReport::TableOfContens::clear(){ +void LimeReport::TableOfContents::clear(){ m_hash.clear(); - foreach(ContentItem* item, m_tableOfContens){ + foreach(ContentItem* item, m_tableOfContents){ delete item; } - m_tableOfContens.clear(); + m_tableOfContents.clear(); } diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 0c88af3..2549890 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -66,18 +66,18 @@ struct ContentItem { QString uniqKey; }; -class TableOfContens : public QObject{ +class TableOfContents : public QObject{ Q_OBJECT public: - TableOfContens(QObject* parent = 0):QObject(parent){} - ~TableOfContens(); + TableOfContents(QObject* parent = 0):QObject(parent){} + ~TableOfContents(); void setItem(const QString& uniqKey, const QString& content, int pageNumber, int indent = 0); void clear(); - bool isEmpty(){ return m_tableOfContens.isEmpty();} + bool isEmpty(){ return m_tableOfContents.isEmpty();} private slots: void slotOneSlotDS(LimeReport::CallbackInfo info, QVariant &data); private: - QVector m_tableOfContens; + QVector m_tableOfContents; QHash m_hash; }; @@ -169,7 +169,7 @@ public: #ifdef HAVE_UI_LOADER typedef QSharedPointer DialogPtr; #endif - explicit ScriptEngineContext(QObject* parent=0):QObject(parent), m_tableOfContens(new TableOfContens(this)){} + explicit ScriptEngineContext(QObject* parent=0):QObject(parent), m_tableOfContents(new TableOfContents(this)){} #ifdef HAVE_UI_LOADER void addDialog(const QString& name, const QByteArray& description); bool changeDialog(const QString& name, const QByteArray &description); @@ -193,8 +193,8 @@ public: void setCurrentBand(BandDesignIntf* currentBand); PageItemDesignIntf* getCurrentPage() const; void setCurrentPage(PageItemDesignIntf* currentPage); - TableOfContens* tableOfContens() const; - void setTableOfContens(TableOfContens* tableOfContens); + TableOfContents* tableOfContents() const; + void setTableOfContents(TableOfContents* tableOfContents); #ifdef HAVE_UI_LOADER signals: @@ -221,7 +221,7 @@ private: QString m_initScript; BandDesignIntf* m_currentBand; PageItemDesignIntf* m_currentPage; - TableOfContens* m_tableOfContens; + TableOfContents* m_tableOfContents; }; class JSFunctionDesc{ @@ -329,8 +329,8 @@ public: Q_INVOKABLE QVariant getFieldByKeyField(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue); Q_INVOKABLE void reopenDatasource(const QString& datasourceName); Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} - Q_INVOKABLE void addTableOfContensItem(const QString& uniqKey, const QString& content, int indent = 0); - Q_INVOKABLE void clearTableOfContens(); + Q_INVOKABLE void addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent = 0); + Q_INVOKABLE void clearTableOfContents(); #ifdef USE_QJSENGINE Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); @@ -378,8 +378,8 @@ public: QString expandDataFields(QString context, ExpandType expandType, QVariant &varValue, QObject* reportItem); QString expandScripts(QString context, QVariant &varValue, QObject* reportItem); QVariant evaluateScript(const QString &script); - void addTableOfContensItem(const QString& uniqKey, const QString& content, int indent); - void clearTableOfContens(); + void addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent); + void clearTableOfContents(); protected: void updateModel(); @@ -399,8 +399,8 @@ private: bool createGetVariableFunction(); bool createGetFieldFunction(); bool createGetFieldByKeyFunction(); - bool createAddTableOfContensItemFunction(); - bool createClearTableOfContensFunction(); + bool createAddTableOfContentsItemFunction(); + bool createClearTableOfContentsFunction(); bool createReopenDatasourceFunction(); private: ScriptEngineManager(); From 05f6eb9284f6e15be4117930b9b55c74d6e7de5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Skowro=C5=84ski?= Date: Sun, 5 Nov 2017 00:32:25 +0100 Subject: [PATCH 084/347] Fix some GCC warnings. --- limereport/items/lrchartitemeditor.ui | 2 +- limereport/lrscriptenginemanager.cpp | 4 ++-- limereport/objectinspector/lrpropertydelegate.cpp | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/limereport/items/lrchartitemeditor.ui b/limereport/items/lrchartitemeditor.ui index 99a1676..f32e269 100644 --- a/limereport/items/lrchartitemeditor.ui +++ b/limereport/items/lrchartitemeditor.ui @@ -59,7 +59,7 @@ - + QFormLayout::AllNonFixedFieldsGrow diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index bb5aa16..775c163 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -354,7 +354,7 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ } } -QString ScriptEngineManager::expandUserVariables(QString context, RenderPass pass, ExpandType expandType, QVariant &varValue) +QString ScriptEngineManager::expandUserVariables(QString context, RenderPass /* pass */, ExpandType expandType, QVariant &varValue) { QRegExp rx(Const::VARIABLE_RX); if (context.contains(rx)){ @@ -829,7 +829,7 @@ bool ScriptEngineManager::createReopenDatasourceFunction() } ScriptEngineManager::ScriptEngineManager() - :m_model(0), m_dataManager(0), m_context(0) + :m_model(0), m_context(0), m_dataManager(0) { m_scriptEngine = new ScriptEngineType; m_functionManager = new ScriptFunctionsManager(this); diff --git a/limereport/objectinspector/lrpropertydelegate.cpp b/limereport/objectinspector/lrpropertydelegate.cpp index e1808eb..80bd4d0 100644 --- a/limereport/objectinspector/lrpropertydelegate.cpp +++ b/limereport/objectinspector/lrpropertydelegate.cpp @@ -43,7 +43,12 @@ void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionVi { if (!index.isValid()) return; +#if QT_VERSION >= 0x050000 + QStyleOptionViewItem opt = option; +#else QStyleOptionViewItemV4 opt = option; +#endif + QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); LimeReport::ObjectPropItem *node = static_cast(index.internalPointer()); From 0f5e5a9ef1a269b1497eb2159b83d525397d364a Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 5 Nov 2017 18:36:49 +0300 Subject: [PATCH 085/347] endlesHeight init fixed --- limereport/lrpageitemdesignintf.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index f1e654b..fcccff0 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -50,7 +50,8 @@ PageItemDesignIntf::PageItemDesignIntf(QObject *owner, QGraphicsItem *parent) : m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(A4), m_sizeChainging(false), m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), - m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false), m_setPageSizeToPrinter(false) + m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false), m_setPageSizeToPrinter(false), + m_endlessHeight(false) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); From beaef31c6983ccf1ea42033a8d5ced21ba75b40c Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 5 Nov 2017 18:40:55 +0300 Subject: [PATCH 086/347] Fix: #90 Print to PDF does not honor page size --- limereport/lrreportengine.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 87ef13b..5768951 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -292,10 +292,10 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): renderPage.pageItem()->sizeMM(); - if (page->getSetPageSizeToPrinter()) + if (page->getSetPageSizeToPrinter() || printer.outputFormat() == QPrinter::PdfFormat) printer.setPaperSize(pageSize,QPrinter::Millimeter); } else { - if (page->getSetPageSizeToPrinter()) + if (page->getSetPageSizeToPrinter() || printer.outputFormat() == QPrinter::PdfFormat) printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize()); } } From 9e4025f886742813c1200921551d7e2da2bcf4a0 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 10 Nov 2017 00:47:47 +0300 Subject: [PATCH 087/347] CodeEditor fixed --- limereport/scripteditor/lrcodeeditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index c1b5643..57a9d69 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -186,8 +186,8 @@ bool CodeEditor::matchLeftParenthesis(QTextBlock currentBlock, QChar parenthesis bool CodeEditor::matchRightParenthesis(QTextBlock currentBlock, QChar parenthesisType, int i, int numRightParentheses) { TextBlockData *data = static_cast(currentBlock.userData()); - QVector parentheses = data->parentheses(); if (data){ + QVector parentheses = data->parentheses(); int docPos = currentBlock.position(); for (; i > -1 && parentheses.size() > 0; --i) { ParenthesisInfo *info = parentheses.at(i); From 0fb1ba1bd8474f08065871686cf201cdfc5a25e8 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 24 Nov 2017 00:13:47 +0300 Subject: [PATCH 088/347] plugin extracted --- demo_r1/demo_reports/change_alignment.lrxml | 105 ++ ...t1_report_header_group_subdetail_TOC.lrxml | 141 ++- designer_plugin/designer_plugin.pro | 44 + designer_plugin/limereport.pri | 257 ++++ designer_plugin/lrdesignerplugin.cpp | 31 + designer_plugin/lrdesignerplugin.h | 20 + designer_plugin/main.cpp | 13 + include/lrrenderengine.h | 91 ++ limerender/limerender.h | 120 ++ limerender/limerender.pri | 156 +++ limerender/limerender.pro | 124 ++ limerender/limerender_p.h | 192 +++ limerender/lrreportrender.cpp | 1104 +++++++++++++++++ limereport.pro | 2 +- .../items/editors/lrfonteditorwidget.cpp | 125 +- limereport/items/editors/lrfonteditorwidget.h | 60 +- .../items/editors/lritemeditorwidget.cpp | 42 +- limereport/items/editors/lritemeditorwidget.h | 33 +- .../editors/lritemsborderseditorwidget.cpp | 64 +- .../editors/lritemsborderseditorwidget.h | 40 +- .../editors/lrtextalignmenteditorwidget.cpp | 159 ++- .../editors/lrtextalignmenteditorwidget.h | 57 +- limereport/limereport.pri | 201 +-- limereport/lrdesignelementsfactory.h | 2 +- limereport/lrdesignerplugininterface.h | 30 + limereport/lrpreviewreportwindow.cpp | 4 +- limereport/lrreportdesignwidget.cpp | 37 +- limereport/lrreportdesignwidget.h | 6 +- limereport/lrreportdesignwindow.cpp | 20 +- limereport/lrreportdesignwindow.h | 4 +- limereport/lrreportengine.cpp | 64 +- limereport/lrreportengine_p.h | 39 +- limereport/scripteditor/lrscripteditor.cpp | 2 +- limereport/scripteditor/lrscripteditor.h | 6 +- 34 files changed, 3025 insertions(+), 370 deletions(-) create mode 100644 demo_r1/demo_reports/change_alignment.lrxml create mode 100644 designer_plugin/designer_plugin.pro create mode 100644 designer_plugin/limereport.pri create mode 100644 designer_plugin/lrdesignerplugin.cpp create mode 100644 designer_plugin/lrdesignerplugin.h create mode 100644 designer_plugin/main.cpp create mode 100644 include/lrrenderengine.h create mode 100644 limerender/limerender.h create mode 100644 limerender/limerender.pri create mode 100644 limerender/limerender.pro create mode 100644 limerender/limerender_p.h create mode 100644 limerender/lrreportrender.cpp create mode 100644 limereport/lrdesignerplugininterface.h diff --git a/demo_r1/demo_reports/change_alignment.lrxml b/demo_r1/demo_reports/change_alignment.lrxml new file mode 100644 index 0000000..507954e --- /dev/null +++ b/demo_r1/demo_reports/change_alignment.lrxml @@ -0,0 +1,105 @@ + + + + + + + page1 + + + + + + + + Reportpage1 + + + + TextItem1 + + + + + Reportpage1 + + + + + + + $S{ +const Alignment = { + Left : 1, + Right: 2, + HCenter: 4, + Justify: 8, + Top: 32, + Bottom: 64, + VCenter: 128 +} + +THIS.alignment = (Alignment.Right | Alignment.Bottom); + "Test" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + datasources + + + + + + + + + + + + + + diff --git a/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml b/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml index 732b484..141b5b0 100644 --- a/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml +++ b/demo_r1/demo_reports/demoReport1_report_header_group_subdetail_TOC.lrxml @@ -5,23 +5,23 @@ page2 - + - + TOC - + DataBand1 - + TextItem1 - + @@ -32,12 +32,12 @@ - $D{tableofcontens.Content} + $D{tableofcontents.Content} - + @@ -61,7 +61,7 @@ TextItem2 - + @@ -74,17 +74,17 @@ $S{ getFieldByKeyField( - "tableofcontens", + "tableofcontents", "Page number", "Content Key", - "$D{tableofcontens.Content Key}" + "$D{tableofcontents.Content Key}" ) } - + @@ -120,7 +120,7 @@ getFieldByKeyField( - tableofcontens + tableofcontents @@ -152,27 +152,29 @@ getFieldByKeyField( + + page1 - + - + ReportPage1 - + ReportHeader1 - + TextItem1 - + @@ -189,7 +191,7 @@ Report - + @@ -213,7 +215,7 @@ Report ImageItem1 - + @@ -228,6 +230,7 @@ Report + @@ -236,7 +239,7 @@ Report ShapeItem1 - + @@ -258,7 +261,7 @@ Report ShapeItem2 - + @@ -280,7 +283,7 @@ Report TextItem9 - + @@ -296,7 +299,7 @@ Report - + @@ -320,7 +323,7 @@ Report TextItem10 - + @@ -336,7 +339,7 @@ Report - + @@ -377,11 +380,11 @@ Report DataBand1 - + TextItem3 - + @@ -397,7 +400,7 @@ Report - + @@ -421,7 +424,7 @@ Report TextItem4 - + @@ -437,7 +440,7 @@ Report - + @@ -461,7 +464,7 @@ Report TextItem12 - + @@ -477,7 +480,7 @@ Report - + @@ -501,7 +504,7 @@ Report TextItem16 - + @@ -517,7 +520,7 @@ Report - + @@ -541,7 +544,7 @@ Report TextItem17 - + @@ -557,7 +560,7 @@ Report - + @@ -607,11 +610,11 @@ Report GroupBandHeader1 - + TextItem2 - + @@ -627,7 +630,7 @@ Report - + @@ -651,7 +654,7 @@ Report ShapeItem3 - + @@ -673,7 +676,7 @@ Report TextItem11 - + @@ -689,7 +692,7 @@ Report - + @@ -735,11 +738,11 @@ Report SubDetailBand1 - + TextItem5 - + @@ -755,7 +758,7 @@ Report - + @@ -779,7 +782,7 @@ Report TextItem6 - + @@ -795,7 +798,7 @@ Report - + @@ -819,7 +822,7 @@ Report TextItem7 - + @@ -835,7 +838,7 @@ Report - + @@ -859,7 +862,7 @@ Report TextItem13 - + @@ -875,7 +878,7 @@ Report - + @@ -921,11 +924,11 @@ Report SubDetailFooterBand1 - + TextItem8 - + @@ -941,7 +944,7 @@ Report - + @@ -965,7 +968,7 @@ Report TextItem14 - + @@ -981,7 +984,7 @@ Report - + @@ -1005,7 +1008,7 @@ Report TextItem15 - + @@ -1021,7 +1024,7 @@ Report - + @@ -1045,7 +1048,7 @@ Report ShapeItem4 - + @@ -1085,11 +1088,11 @@ Report PageFooter1 - + TextItem18 - + @@ -1105,7 +1108,7 @@ Report - + @@ -1146,11 +1149,11 @@ Report PageHeader18 - + TextItem19 - + @@ -1166,7 +1169,7 @@ Report - + @@ -1225,6 +1228,8 @@ Report + + @@ -1278,15 +1283,15 @@ var firstLevel = "&nbsp;&nbsp;&nbsp;&nbsp;"; var secondLevel = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; function SB1AfterData(){ - addTableOfContensItem(getField("orders.OrderID"),firstLevel+getField("orders.OrderID")); + addTableOfContentsItem(getField("orders.OrderID"),firstLevel+getField("orders.OrderID")); } function SB2AfterData(){ - addTableOfContensItem(getField("orders.OrderID")+getField("orderItems.ProductName"), secondLevel+"<i>"+getField("orderItems.ProductName")+"</i>"); + addTableOfContentsItem(getField("orders.OrderID")+getField("orderItems.ProductName"), secondLevel+"<i>"+getField("orderItems.ProductName")+"</i>"); } function SB3AfterData(){ - addTableOfContensItem(getField("orders.CompanyName"), "<b>"+getField("orders.CompanyName")+"</b>"); + addTableOfContentsItem(getField("orders.CompanyName"), "<b>"+getField("orders.CompanyName")+"</b>"); } diff --git a/designer_plugin/designer_plugin.pro b/designer_plugin/designer_plugin.pro new file mode 100644 index 0000000..9c0ebcb --- /dev/null +++ b/designer_plugin/designer_plugin.pro @@ -0,0 +1,44 @@ +include(../common.pri) +include(limereport.pri) +QT += core gui + +contains(CONFIG,release) { + TARGET = LRDesigner_plugin +} else { + TARGET = LRDesigner_plugind +} + +TEMPLATE = lib +CONFIG += plugin + +HEADERS += \ + lrdesignerplugin.h +SOURCES += \ + lrdesignerplugin.cpp + +INCLUDEPATH += $$PWD/../include +DEPENDPATH += $$PWD/../include + +macx{ + CONFIG += lib_bundle + CONFIG += -dll +} + +DESTDIR = $${DEST_LIBS} +unix { + target.path = $${DESTDIR} + INSTALLS = target +} + + +contains(CONFIG,zint){ + message(zint) + INCLUDEPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt + DEPENDPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt + LIBS += -L$${DEST_LIBS} + contains(CONFIG,release) { + LIBS += -lQtZint + } else { + LIBS += -lQtZintd + } +} diff --git a/designer_plugin/limereport.pri b/designer_plugin/limereport.pri new file mode 100644 index 0000000..f1455ed --- /dev/null +++ b/designer_plugin/limereport.pri @@ -0,0 +1,257 @@ +include(../common.pri) + +DEFINES += IS_REPORT_DESIGNER + +contains(CONFIG,dialogdesigner){ + include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) +} + +DEFINES += INSPECT_BASEDESIGN + +INCLUDEPATH += \ + $$REPORT_PATH/ \ + $$REPORT_PATH/items \ + $$REPORT_PATH/bands \ + $$REPORT_PATH/base \ + $$REPORT_PATH/objectinspector \ + $$REPORT_PATH/databrowser \ + $$REPORT_PATH/scripteditor \ + $$REPORT_PATH/../designer_plugin + +SOURCES += \ + $$REPORT_PATH/bands/lrpageheader.cpp \ + $$REPORT_PATH/bands/lrpagefooter.cpp \ + $$REPORT_PATH/bands/lrreportheader.cpp \ + $$REPORT_PATH/bands/lrreportfooter.cpp \ + $$REPORT_PATH/bands/lrdataband.cpp \ + $$REPORT_PATH/bands/lrgroupbands.cpp \ + $$REPORT_PATH/bands/lrsubdetailband.cpp \ + $$REPORT_PATH/bands/lrtearoffband.cpp \ + $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ + $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ + $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ + $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ + $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ + $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ + $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ + $$REPORT_PATH/serializators/lrxmlreader.cpp \ + $$REPORT_PATH/serializators/lrxmlwriter.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.cpp \ + $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrfonteditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrimageeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcoloreditor.cpp \ + $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.cpp \ + $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.cpp \ + $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ + $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ + $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ + $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ + $$REPORT_PATH/scripteditor/lrscripteditor.cpp \ + $$REPORT_PATH/scripteditor/lrcodeeditor.cpp \ + $$REPORT_PATH/scripteditor/lrscripthighlighter.cpp \ + $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ + $$REPORT_PATH/items/lralignpropitem.cpp \ + $$REPORT_PATH/items/lrhorizontallayout.cpp \ + $$REPORT_PATH/items/editors/lritemeditorwidget.cpp \ + $$REPORT_PATH/items/editors/lrfonteditorwidget.cpp \ + $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ + $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ + $$REPORT_PATH/items/lrsimpletagparser.cpp \ + $$REPORT_PATH/items/lrimageitem.cpp \ + $$REPORT_PATH/items/lrtextitemeditor.cpp \ + $$REPORT_PATH/items/lrshapeitem.cpp \ + $$REPORT_PATH/items/lrtextitem.cpp \ + $$REPORT_PATH/translationeditor/translationeditor.cpp \ + $$REPORT_PATH/lrbanddesignintf.cpp \ + $$REPORT_PATH/lrpageitemdesignintf.cpp \ + $$REPORT_PATH/lrpagedesignintf.cpp \ + $$REPORT_PATH/lrbandsmanager.cpp \ + $$REPORT_PATH/lrglobal.cpp \ + $$REPORT_PATH/lritemdesignintf.cpp \ + $$REPORT_PATH/lrdatadesignintf.cpp \ + $$REPORT_PATH/lrreportdesignwidget.cpp \ + $$REPORT_PATH/lrbasedesignintf.cpp \ + $$REPORT_PATH/lrreportengine.cpp \ + $$REPORT_PATH/lrdatasourcemanager.cpp \ + $$REPORT_PATH/lrreportdesignwindow.cpp \ +# $$REPORT_PATH/lrreportrender.cpp \ + $$REPORT_PATH/lrscriptenginemanager.cpp \ + $$REPORT_PATH/lrpreviewreportwindow.cpp \ + $$REPORT_PATH/lrpreviewreportwidget.cpp \ + $$REPORT_PATH/lrgraphicsviewzoom.cpp \ + $$REPORT_PATH/lrvariablesholder.cpp \ + $$REPORT_PATH/lrgroupfunctions.cpp \ + $$REPORT_PATH/lrsimplecrypt.cpp \ + $$REPORT_PATH/lraboutdialog.cpp \ + $$REPORT_PATH/lrsettingdialog.cpp \ + $$REPORT_PATH/lritemscontainerdesignitf.cpp \ + $$REPORT_PATH/lrcolorindicator.cpp \ + $$REPORT_PATH/items/lrchartitem.cpp \ + $$REPORT_PATH/items/lrchartitemeditor.cpp \ + $$REPORT_PATH/lrreporttranslation.cpp \ + $$REPORT_PATH/translationeditor/languageselectdialog.cpp + +contains(CONFIG, staticlib){ + SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp +} + +contains(CONFIG, zint){ + SOURCES += $$REPORT_PATH/items/lrbarcodeitem.cpp +} + +HEADERS += \ + $$REPORT_PATH/base/lrsingleton.h \ + $$REPORT_PATH/base/lrsimpleabstractfactory.h \ + $$REPORT_PATH/base/lrattribsabstractfactory.h \ + $$REPORT_PATH/bands/lrpageheader.h \ + $$REPORT_PATH/bands/lrpagefooter.h \ + $$REPORT_PATH/bands/lrreportheader.h \ + $$REPORT_PATH/bands/lrreportfooter.h \ + $$REPORT_PATH/bands/lrdataband.h \ + $$REPORT_PATH/bands/lrtearoffband.h \ + $$REPORT_PATH/bands/lrsubdetailband.h \ + $$REPORT_PATH/bands/lrgroupbands.h \ + $$REPORT_PATH/databrowser/lrdatabrowser.h \ + $$REPORT_PATH/databrowser/lrsqleditdialog.h \ + $$REPORT_PATH/databrowser/lrconnectiondialog.h \ + $$REPORT_PATH/databrowser/lrvariabledialog.h \ + $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ + $$REPORT_PATH/serializators/lrserializatorintf.h \ + $$REPORT_PATH/serializators/lrstorageintf.h \ + $$REPORT_PATH/serializators/lrxmlqrectserializator.h \ + $$REPORT_PATH/serializators/lrxmlserializatorsfactory.h \ + $$REPORT_PATH/serializators/lrxmlbasetypesserializators.h \ + $$REPORT_PATH/serializators/lrxmlreader.h \ + $$REPORT_PATH/serializators/lrxmlwriter.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ + $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrimageeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcoloreditor.h \ + $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ + $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.h \ + $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.h \ + $$REPORT_PATH/objectinspector/lrobjectitemmodel.h \ + $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ + $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ + $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ + $$REPORT_PATH/scripteditor/lrscripteditor.h \ + $$REPORT_PATH/scripteditor/lrcodeeditor.h \ + $$REPORT_PATH/scripteditor/lrscripthighlighter.h \ + $$REPORT_PATH/items/editors/lritemeditorwidget.h \ + $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ + $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ + $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ + $$REPORT_PATH/items/lrtextitem.h \ + $$REPORT_PATH/items/lrsubitemparentpropitem.h \ + $$REPORT_PATH/items/lralignpropitem.h \ + $$REPORT_PATH/items/lrhorizontallayout.h \ + $$REPORT_PATH/items/lrtextitemeditor.h \ + $$REPORT_PATH/items/lrshapeitem.h \ + $$REPORT_PATH/items/lrimageitem.h \ + $$REPORT_PATH/items/lrsimpletagparser.h \ + $$REPORT_PATH/translationeditor/translationeditor.h \ + $$REPORT_PATH/lrfactoryinitializer.h \ + $$REPORT_PATH/lrbanddesignintf.h \ + $$REPORT_PATH/lrpageitemdesignintf.h \ + $$REPORT_PATH/lrbandsmanager.h \ + $$REPORT_PATH/lrglobal.h \ + $$REPORT_PATH/lrdatadesignintf.h \ + $$REPORT_PATH/lrcollection.h \ + $$REPORT_PATH/lrpagedesignintf.h \ + $$REPORT_PATH/lrreportdesignwidget.h \ + $$REPORT_PATH/lrreportengine_p.h \ + $$REPORT_PATH/lrdatasourcemanager.h \ + $$REPORT_PATH/lrreportdesignwindow.h \ +# $$REPORT_PATH/lrreportrender.h \ + $$REPORT_PATH/lrpreviewreportwindow.h \ + $$REPORT_PATH/lrpreviewreportwidget.h \ + $$REPORT_PATH/lrpreviewreportwidget_p.h \ + $$REPORT_PATH/lrgraphicsviewzoom.h \ + $$REPORT_PATH/lrbasedesignintf.h \ + $$REPORT_PATH/lritemdesignintf.h \ + $$REPORT_PATH/lrdesignelementsfactory.h \ + $$REPORT_PATH/lrscriptenginemanager.h \ + $$REPORT_PATH/lrvariablesholder.h \ + $$REPORT_PATH/lrgroupfunctions.h \ + $$REPORT_PATH/lrreportengine.h \ + $$REPORT_PATH/lrdatasourcemanagerintf.h \ + $$REPORT_PATH/lrscriptenginemanagerintf.h \ + $$REPORT_PATH/lrsimplecrypt.h \ + $$REPORT_PATH/lraboutdialog.h \ + $$REPORT_PATH/lrcallbackdatasourceintf.h \ + $$REPORT_PATH/lrsettingdialog.h \ + $$REPORT_PATH/lrpreviewreportwidget_p.h \ + $$REPORT_PATH/lritemscontainerdesignitf.h \ + $$REPORT_PATH/lrcolorindicator.h \ + $$REPORT_PATH/items/lrchartitem.h \ + $$REPORT_PATH/items/lrchartitemeditor.h \ + $$REPORT_PATH/lrreporttranslation.h \ + $$REPORT_PATH/translationeditor/languageselectdialog.h + +contains(CONFIG, staticlib){ + HEADERS += $$REPORT_PATH/lrfactoryinitializer.h +} + +contains(CONFIG,zint){ + HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h +} + +FORMS += \ + $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ + $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ + $$REPORT_PATH/databrowser/lrdatabrowser.ui \ + $$REPORT_PATH/databrowser/lrvariabledialog.ui \ + $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ + $$REPORT_PATH/lrpreviewreportwindow.ui \ + $$REPORT_PATH/lrpreviewreportwidget.ui \ + $$REPORT_PATH/items/lrtextitemeditor.ui \ + $$REPORT_PATH/lraboutdialog.ui \ + $$REPORT_PATH/lrsettingdialog.ui \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ + $$REPORT_PATH/items/lrchartitemeditor.ui \ + $$REPORT_PATH/translationeditor/translationeditor.ui \ + $$REPORT_PATH/translationeditor/languageselectdialog.ui \ + $$REPORT_PATH/scripteditor/lrscripteditor.ui + +RESOURCES += \ + $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ + $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ + $$REPORT_PATH/report.qrc \ + $$REPORT_PATH/items/items.qrc \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \ + $$REPORT_PATH/translationeditor/translationeditor.qrc diff --git a/designer_plugin/lrdesignerplugin.cpp b/designer_plugin/lrdesignerplugin.cpp new file mode 100644 index 0000000..a957399 --- /dev/null +++ b/designer_plugin/lrdesignerplugin.cpp @@ -0,0 +1,31 @@ +#include "lrdesignerplugin.h" + +#include +#include "lrreportdesignwindow.h" + +DesignerFactoryPlugin::~DesignerFactoryPlugin() { +} + +QString DesignerFactoryPlugin::getString() const { + return "Hello, Plugin!"; +} + +QVariant DesignerFactoryPlugin::getVar() const { + return QRect( 10, 10, 500, 500 ); +} + +QMainWindow* DesignerFactoryPlugin::getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget* parent, QSettings* settings) +{ + LimeReport::ReportDesignWindow* designerWindow = new LimeReport::ReportDesignWindow(report, parent, settings); + + settings->beginGroup("DesignerWindow"); + designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); + designerWindow->setWindowIcon(QIcon(":report/images/logo32")); + designerWindow->setShowProgressDialog(settings->value("showProgressDialog").toBool()); + settings->endGroup(); + + return designerWindow; +} + +//Q_EXPORT_PLUGIN2( LimeReportPluginInterface, DesignerFactoryPlugin ) + diff --git a/designer_plugin/lrdesignerplugin.h b/designer_plugin/lrdesignerplugin.h new file mode 100644 index 0000000..d7064d5 --- /dev/null +++ b/designer_plugin/lrdesignerplugin.h @@ -0,0 +1,20 @@ +#ifndef LRDESIGNERPLUGIN_H +#define LRDESIGNERPLUGIN_H + +#include +#include + +class DesignerFactoryPlugin : public QObject, public LimeReportPluginInterface { + Q_OBJECT + Q_PLUGIN_METADATA(IID "ru.limereport.DersignerFactoryInterface") + Q_INTERFACES( LimeReportPluginInterface ) + +public: + ~DesignerFactoryPlugin(); + + QString getString() const; + QVariant getVar() const; + QMainWindow* getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget* parent, QSettings* settings); +}; + +#endif diff --git a/designer_plugin/main.cpp b/designer_plugin/main.cpp new file mode 100644 index 0000000..6ecf8ef --- /dev/null +++ b/designer_plugin/main.cpp @@ -0,0 +1,13 @@ +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + LimeReport::ReportEngine report; + if (a.arguments().count()>1){ + report.loadFromFile(a.arguments().at(1)); + } + report.designReport(); + return a.exec(); +} diff --git a/include/lrrenderengine.h b/include/lrrenderengine.h new file mode 100644 index 0000000..ccbecd4 --- /dev/null +++ b/include/lrrenderengine.h @@ -0,0 +1,91 @@ +#ifndef LRRENDERENGINE_H +#define LRRENDERENGINE_H + +#include +#include +#include + +#include "lrglobal.h" +#include "lrdatasourcemanagerintf.h" +#include "lrscriptenginemanagerintf.h" +#include "lrpreviewreportwidget.h" + +namespace LimeReport{ + +class PrintRange{ +public: + int fromPage() const { return m_fromPage;} + int toPage() const { return m_toPage;} + QPrintDialog::PrintRange rangeType() const { return m_rangeType;} + PrintRange(QAbstractPrintDialog::PrintRange rangeType=QPrintDialog::AllPages, int fromPage=0, int toPage=0); + void setRangeType(QAbstractPrintDialog::PrintRange rangeType){ m_rangeType=rangeType;} + void setFromPage(int fromPage){ m_fromPage = fromPage;} + void setToPage(int toPage){ m_toPage = toPage;} +private: + QPrintDialog::PrintRange m_rangeType; + int m_fromPage; + int m_toPage; +}; + +class DataSourceManager; +class PageDesignIntf; +class PageItemDesignIntf; +class PreviewReportWidget; + +typedef QList< QSharedPointer > ReportPages; + +class RenderEnginePrivate; + +class LIMEREPORT_EXPORT RenderEngine: public QObject{ + Q_OBJECT + friend class PreviewReportWidget; +public: + static void setSettings(QSettings *value){m_settings=value;} +public: + explicit RenderEngine(QObject *parent = 0); + explicit RenderEngine(RenderEnginePrivate* dd, QObject *parent = 0); + ~RenderEngine(); + bool printReport(QPrinter *printer=0); + bool printPages(ReportPages pages, QPrinter *printer); + void printToFile(const QString& fileName); + PageDesignIntf *createPreviewScene(QObject *parent = 0); + bool printToPDF(const QString& fileName); + void previewReport(PreviewHints hints = PreviewBarsUserSetting); + IDataSourceManager* dataManager(); + IScriptEngineManager* scriptManager(); + bool loadFromFile(const QString& fileName, bool autoLoadPreviewOnChange = false); + bool loadFromByteArray(QByteArray *data); + bool loadFromString(const QString& data); + QString reportFileName(); + void setReportFileName(const QString& fileName); + QString lastError(); + PreviewReportWidget *createPreviewWidget(QWidget *parent = 0); + void setPreviewWindowTitle(const QString& title); + void setPreviewWindowIcon(const QIcon& icon); + void setResultEditable(bool value); + bool resultIsEditable(); + bool isBusy(); + void setPassPharse(QString& passPharse); + QList aviableLanguages(); + bool setReportLanguage(QLocale::Language language); + Qt::LayoutDirection previewLayoutDirection(); + void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); + QSettings* settings(){ return m_settings;} +signals: + void renderStarted(); + void renderFinished(); + void renderPageFinished(int renderedPageCount); + void onLoad(bool& loaded); +public slots: + void cancelRender(); +protected: + QObject* d_ptr; +private: + static QSettings* m_settings; + void init(); +private: + Q_DECLARE_PRIVATE(RenderEngine) +}; + +} // namespace LimeReport +#endif // LRRENDERENGINE_H diff --git a/limerender/limerender.h b/limerender/limerender.h new file mode 100644 index 0000000..213adec --- /dev/null +++ b/limerender/limerender.h @@ -0,0 +1,120 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library 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. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRLIMERENDER_H +#define LRLIMERENDER_H + +#include +#include +#include +//#include + +#include "lrreportrender.h" +#include "limerender_p.h" +#include "lrglobal.h" +#include "lrdatasourcemanagerintf.h" +#include "lrscriptenginemanagerintf.h" +#include "lrpreviewreportwidget.h" + +class QPrinter; + +namespace LimeReport { + +//class PrintRange{ +//public: +// int fromPage() const { return m_fromPage;} +// int toPage() const { return m_toPage;} +// QPrintDialog::PrintRange rangeType() const { return m_rangeType;} +// PrintRange(QAbstractPrintDialog::PrintRange rangeType=QPrintDialog::AllPages, int fromPage=0, int toPage=0); +// void setRangeType(QAbstractPrintDialog::PrintRange rangeType){ m_rangeType=rangeType;} +// void setFromPage(int fromPage){ m_fromPage = fromPage;} +// void setToPage(int toPage){ m_toPage = toPage;} +//private: +// QPrintDialog::PrintRange m_rangeType; +// int m_fromPage; +// int m_toPage; +//}; + +class DataSourceManager; +class LimeRenderPrivate; +class PageDesignIntf; +class PageItemDesignIntf; +class PreviewReportWidget; + +typedef QList< QSharedPointer > ReportPages; + +class LIMEREPORT_EXPORT LimeRender : public QObject{ + Q_OBJECT + friend class PreviewReportWidget; +public: + static void setSettings(QSettings *value){m_settings=value;} +public: + explicit LimeRender(QObject *parent = 0); + ~LimeRender(); + bool printReport(QPrinter *printer=0); + bool printPages(ReportPages pages, QPrinter *printer); + void printToFile(const QString& fileName); + PageDesignIntf *createPreviewScene(QObject *parent = 0); + bool printToPDF(const QString& fileName); + void previewReport(PreviewHints hints = PreviewBarsUserSetting); + IDataSourceManager* dataManager(); + IScriptEngineManager* scriptManager(); + bool loadFromFile(const QString& fileName, bool autoLoadPreviewOnChange = false); + bool loadFromByteArray(QByteArray *data); + bool loadFromString(const QString& data); + QString lastError(); + PreviewReportWidget *createPreviewWidget(QWidget *parent = 0); + void setPreviewWindowTitle(const QString& title); + void setPreviewWindowIcon(const QIcon& icon); + void setResultEditable(bool value); + bool resultIsEditable(); + bool isBusy(); + void setPassPharse(QString& passPharse); + QList aviableLanguages(); + bool setReportLanguage(QLocale::Language language); + Qt::LayoutDirection previewLayoutDirection(); + void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); +signals: + void renderStarted(); + void renderFinished(); + void renderPageFinished(int renderedPageCount); + void onLoad(bool& loaded); +public slots: + void cancelRender(); +protected: + LimeRenderPrivate * const d_ptr; + LimeRender(LimeRenderPrivate &dd, QObject * parent=0); +private: + Q_DECLARE_PRIVATE(LimeRender) + static QSettings* m_settings; +}; + +} // namespace LimeReport + +#endif // LRLIMERENDER_H diff --git a/limerender/limerender.pri b/limerender/limerender.pri new file mode 100644 index 0000000..1fffc27 --- /dev/null +++ b/limerender/limerender.pri @@ -0,0 +1,156 @@ +include(../common.pri) + +DEFINES += IS_RENDER_BUILD + +INCLUDEPATH += \ + $$REPORT_PATH/ \ + $$REPORT_PATH/items \ + $$REPORT_PATH/bands \ + $$REPORT_PATH/base \ + $$REPORT_PATH/scripteditor + +SOURCES += \ + $$REPORT_PATH/bands/lrpageheader.cpp \ + $$REPORT_PATH/bands/lrpagefooter.cpp \ + $$REPORT_PATH/bands/lrreportheader.cpp \ + $$REPORT_PATH/bands/lrreportfooter.cpp \ + $$REPORT_PATH/bands/lrdataband.cpp \ + $$REPORT_PATH/bands/lrgroupbands.cpp \ + $$REPORT_PATH/bands/lrsubdetailband.cpp \ + $$REPORT_PATH/bands/lrtearoffband.cpp \ + $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ + $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ + $$REPORT_PATH/serializators/lrxmlreader.cpp \ + $$REPORT_PATH/serializators/lrxmlwriter.cpp \ + $$REPORT_PATH/scripteditor/lrscripteditor.cpp \ + $$REPORT_PATH/scripteditor/lrcodeeditor.cpp \ + $$REPORT_PATH/scripteditor/lrscripthighlighter.cpp \ + $$REPORT_PATH/items/lrhorizontallayout.cpp \ + $$REPORT_PATH/items/editors/lritemeditorwidget.cpp \ + $$REPORT_PATH/items/editors/lrfonteditorwidget.cpp \ + $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ + $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ + $$REPORT_PATH/items/lrsimpletagparser.cpp \ + $$REPORT_PATH/items/lrimageitem.cpp \ + $$REPORT_PATH/items/lrtextitemeditor.cpp \ + $$REPORT_PATH/items/lrshapeitem.cpp \ + $$REPORT_PATH/items/lrtextitem.cpp \ + $$REPORT_PATH/lrbanddesignintf.cpp \ + $$REPORT_PATH/lrpageitemdesignintf.cpp \ + $$REPORT_PATH/lrpagedesignintf.cpp \ + $$REPORT_PATH/lrbandsmanager.cpp \ + $$REPORT_PATH/lrglobal.cpp \ + $$REPORT_PATH/lritemdesignintf.cpp \ + $$REPORT_PATH/lrdatadesignintf.cpp \ + $$REPORT_PATH/lrbasedesignintf.cpp \ + $$REPORT_PATH/lrdatasourcemanager.cpp \ + $$REPORT_PATH/lrreportrender.cpp \ + $$REPORT_PATH/lrscriptenginemanager.cpp \ + $$REPORT_PATH/lrpreviewreportwindow.cpp \ + $$REPORT_PATH/lrpreviewreportwidget.cpp \ + $$REPORT_PATH/lrgraphicsviewzoom.cpp \ + $$REPORT_PATH/lrvariablesholder.cpp \ + $$REPORT_PATH/lrgroupfunctions.cpp \ + $$REPORT_PATH/lrsimplecrypt.cpp \ + $$REPORT_PATH/lraboutdialog.cpp \ + $$REPORT_PATH/lritemscontainerdesignitf.cpp \ + $$REPORT_PATH/lrcolorindicator.cpp \ + $$REPORT_PATH/items/lrchartitem.cpp \ + $$REPORT_PATH/lrreporttranslation.cpp +# $$PWD/lrreportrender.cpp + + +contains(CONFIG, staticlib){ + SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp +} + +contains(CONFIG, zint){ + SOURCES += $$REPORT_PATH/items/lrbarcodeitem.cpp +} + +HEADERS += \ + $$REPORT_PATH/base/lrsingleton.h \ + $$REPORT_PATH/base/lrsimpleabstractfactory.h \ + $$REPORT_PATH/base/lrattribsabstractfactory.h \ + $$REPORT_PATH/bands/lrpageheader.h \ + $$REPORT_PATH/bands/lrpagefooter.h \ + $$REPORT_PATH/bands/lrreportheader.h \ + $$REPORT_PATH/bands/lrreportfooter.h \ + $$REPORT_PATH/bands/lrdataband.h \ + $$REPORT_PATH/bands/lrtearoffband.h \ + $$REPORT_PATH/bands/lrsubdetailband.h \ + $$REPORT_PATH/bands/lrgroupbands.h \ + $$REPORT_PATH/serializators/lrserializatorintf.h \ + $$REPORT_PATH/serializators/lrstorageintf.h \ + $$REPORT_PATH/serializators/lrxmlqrectserializator.h \ + $$REPORT_PATH/serializators/lrxmlserializatorsfactory.h \ + $$REPORT_PATH/serializators/lrxmlbasetypesserializators.h \ + $$REPORT_PATH/serializators/lrxmlreader.h \ + $$REPORT_PATH/serializators/lrxmlwriter.h \ + $$REPORT_PATH/scripteditor/lrscripteditor.h \ + $$REPORT_PATH/scripteditor/lrcodeeditor.h \ + $$REPORT_PATH/scripteditor/lrscripthighlighter.h \ + $$REPORT_PATH/items/editors/lritemeditorwidget.h \ + $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ + $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ + $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ + $$REPORT_PATH/items/lrtextitem.h \ + $$REPORT_PATH/items/lrhorizontallayout.h \ + $$REPORT_PATH/items/lrtextitemeditor.h \ + $$REPORT_PATH/items/lrshapeitem.h \ + $$REPORT_PATH/items/lrimageitem.h \ + $$REPORT_PATH/items/lrsimpletagparser.h \ + $$REPORT_PATH/lrfactoryinitializer.h \ + $$REPORT_PATH/lrbanddesignintf.h \ + $$REPORT_PATH/lrpageitemdesignintf.h \ + $$REPORT_PATH/lrbandsmanager.h \ + $$REPORT_PATH/lrglobal.h \ + $$REPORT_PATH/lrdatadesignintf.h \ + $$REPORT_PATH/lrcollection.h \ + $$REPORT_PATH/lrpagedesignintf.h \ + $$REPORT_PATH/lrdatasourcemanager.h \ + $$REPORT_PATH/lrreportrender.h \ + $$REPORT_PATH/lrpreviewreportwindow.h \ + $$REPORT_PATH/lrpreviewreportwidget.h \ + $$REPORT_PATH/lrpreviewreportwidget_p.h \ + $$REPORT_PATH/lrgraphicsviewzoom.h \ + $$REPORT_PATH/lrbasedesignintf.h \ + $$REPORT_PATH/lritemdesignintf.h \ + $$REPORT_PATH/lrdesignelementsfactory.h \ + $$REPORT_PATH/lrscriptenginemanager.h \ + $$REPORT_PATH/lrvariablesholder.h \ + $$REPORT_PATH/lrgroupfunctions.h \ + $$REPORT_PATH/lrdatasourcemanagerintf.h \ + $$REPORT_PATH/lrscriptenginemanagerintf.h \ + $$REPORT_PATH/lrsimplecrypt.h \ + $$REPORT_PATH/lraboutdialog.h \ + $$REPORT_PATH/lrcallbackdatasourceintf.h \ + $$REPORT_PATH/lrpreviewreportwidget_p.h \ + $$REPORT_PATH/lritemscontainerdesignitf.h \ + $$REPORT_PATH/lrcolorindicator.h \ + $$REPORT_PATH/items/lrchartitem.h \ + $$REPORT_PATH/lrreporttranslation.h +# $$PWD/limerender.h \ +# $$PWD/limerender_p.h + +contains(CONFIG, staticlib){ + HEADERS += $$REPORT_PATH/lrfactoryinitializer.h +} + +contains(CONFIG,zint){ + HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h +} + +FORMS += \ + $$REPORT_PATH/lrpreviewreportwindow.ui \ + $$REPORT_PATH/lrpreviewreportwidget.ui \ + $$REPORT_PATH/items/lrtextitemeditor.ui \ + $$REPORT_PATH/lraboutdialog.ui \ + $$REPORT_PATH/scripteditor/lrscripteditor.ui + +RESOURCES += \ + $$REPORT_PATH/report.qrc \ + $$REPORT_PATH/items/items.qrc + diff --git a/limerender/limerender.pro b/limerender/limerender.pro new file mode 100644 index 0000000..12f8bd3 --- /dev/null +++ b/limerender/limerender.pro @@ -0,0 +1,124 @@ +contains(CONFIG,release) { + TARGET = limerender +} else { + TARGET = limerenderd +} + +TEMPLATE = lib + +contains(CONFIG, static_build){ + CONFIG += staticlib +} + +!contains(CONFIG, staticlib){ + CONFIG += lib + CONFIG += dll +} + +CONFIG += create_prl +CONFIG += link_prl + +macx{ + CONFIG -= dll + CONFIG += lib_bundle + CONFIG += plugin +} + +DEFINES += LIMEREPORT_EXPORTS + +contains(CONFIG, staticlib){ + DEFINES += HAVE_STATIC_BUILD + message(STATIC_BUILD) + DEFINES -= LIMEREPORT_EXPORTS +} + +EXTRA_FILES += \ + $$PWD/../limereport/lrglobal.cpp \ + $$PWD/../limereport/lrglobal.h \ + $$PWD/../limereport/lrdatasourcemanagerintf.h \ + $$PWD/../limereport/lrreportengine.h \ + $$PWD/../limereport/lrscriptenginemanagerintf.h \ + $$PWD/../limereport/lrcallbackdatasourceintf.h \ + $$PWD/../limereport/lrpreviewreportwidget.h + +include(limerender.pri) + +unix:{ + DESTDIR = $${DEST_LIBS} + linux{ + QMAKE_POST_LINK += mkdir -p $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t) # qmake need make mkdir -p on subdirs more than root/ + for(FILE,EXTRA_FILES){ + QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t) # inside of libs make /include/files + } + } + macx{ + for(FILE,EXTRA_FILES){ + QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t) + } + QMAKE_POST_LINK += mkdir -p $$quote($${DESTDIR}/include) $$escape_expand(\\n\\t) + } + QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($${DEST_INCLUDE_DIR}) $$quote($${DESTDIR}) +} + +win32 { + EXTRA_FILES ~= s,/,\\,g + BUILD_DIR ~= s,/,\\,g + DESTDIR = $${DEST_LIBS} + DEST_DIR = $$DESTDIR/include + DEST_DIR ~= s,/,\\,g + DEST_INCLUDE_DIR ~= s,/,\\,g + + for(FILE,EXTRA_FILES){ + QMAKE_POST_LINK += $$QMAKE_COPY \"$$FILE\" \"$${DEST_INCLUDE_DIR}\" $$escape_expand(\\n\\t) + } + QMAKE_POST_LINK += $$QMAKE_COPY_DIR \"$${DEST_INCLUDE_DIR}\" \"$${DEST_DIR}\" +} + +contains(CONFIG,zint){ + message(zint) + INCLUDEPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt + DEPENDPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt + LIBS += -L$${DEST_LIBS} + contains(CONFIG,release) { + LIBS += -lQtZint + } else { + LIBS += -lQtZintd + } +} + +####Automatically build required translation files (*.qm) + +contains(CONFIG,build_translations){ + LANGUAGES = ru es_ES ar + + defineReplace(prependAll) { + for(a,$$1):result += $$2$${a}$$3 + return($$result) + } + + TRANSLATIONS = $$prependAll(LANGUAGES, \"$$TRANSLATIONS_PATH/limereport_,.ts\") + + qtPrepareTool(LUPDATE, lupdate) + +greaterThan(QT_MAJOR_VERSION, 4) { + ts.commands = $$LUPDATE $$shell_quote($$PWD) -ts $$TRANSLATIONS +} +lessThan(QT_MAJOR_VERSION, 5){ + ts.commands = $$LUPDATE $$quote($$PWD) -ts $$TRANSLATIONS +} + TRANSLATIONS_FILES = + qtPrepareTool(LRELEASE, lrelease) + for(tsfile, TRANSLATIONS) { + qmfile = $$tsfile + qmfile ~= s,".ts\"$",".qm\"", + qm.commands += $$LRELEASE -removeidentical $$tsfile -qm $$qmfile $$escape_expand(\\n\\t) + tmp_command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile $$escape_expand(\\n\\t) + TRANSLATIONS_FILES += $$qmfile + } + qm.depends = ts + OTHER_FILES += $$TRANSLATIONS + QMAKE_EXTRA_TARGETS += qm ts + POST_TARGETDEPS += qm +} + +#### EN AUTOMATIC TRANSLATIONS diff --git a/limerender/limerender_p.h b/limerender/limerender_p.h new file mode 100644 index 0000000..af650b4 --- /dev/null +++ b/limerender/limerender_p.h @@ -0,0 +1,192 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library 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. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#ifndef LRLIMERENDER_P_H +#define LRLIMERENDER_P_H + +#include +#include +#include + +#include "limerender.h" +#include "lrcollection.h" +#include "lrglobal.h" +#include "lrdatasourcemanager.h" +#include "lrbanddesignintf.h" +#include "serializators/lrstorageintf.h" +#include "lrscriptenginemanager.h" +#include "lrreporttranslation.h" + +class QFileSystemWatcher; + +namespace LimeReport{ + +class PageDesignIntf; +class PrintRange; +class ReportDesignWindow; + +//TODO: Add on render callback + +class LimeRenderPrivate : public QObject, public ICollectionContainer, public ITranslationContainer +{ + Q_OBJECT + Q_DECLARE_PUBLIC(ReportEngine) + Q_PROPERTY(ACollectionProperty pages READ fakeCollectionReader()) + Q_PROPERTY(QObject* datasourcesManager READ dataManager) + Q_PROPERTY(QObject* scriptContext READ scriptContext) + Q_PROPERTY(bool suppressFieldAndVarError READ suppressFieldAndVarError WRITE setSuppressFieldAndVarError) + Q_PROPERTY(ATranslationProperty translation READ fakeTranslationReader) + friend class PreviewReportWidget; +public: + static void printReport(ItemsReaderIntf::Ptr reader, QPrinter &printer); + static void printReport(ReportPages pages, QPrinter &printer); + Q_INVOKABLE QStringList aviableReportTranslations(); + Q_INVOKABLE void setReportTranslation(const QString& languageName); +public: + explicit LimeRenderPrivate(QObject *parent = 0); + virtual ~LimeRenderPrivate(); + + PageDesignIntf* appendPage(const QString& pageName=""); + bool deletePage(PageDesignIntf *page); + PageDesignIntf* createPreviewPage(); + PageDesignIntf* pageAt(int index){return (index<=(m_pages.count()-1)) ? m_pages.at(index):0;} + int pageCount() {return m_pages.count();} + DataSourceManager* dataManager(){return m_datasources;} + ScriptEngineContext* scriptContext(){return m_scriptEngineContext;} + ScriptEngineManager* scriptManager(); + IDataSourceManager* dataManagerIntf(){return m_datasources;} + + IScriptEngineManager* scriptManagerIntf(){ + ScriptEngineManager::instance().setDataManager(dataManager()); + return &ScriptEngineManager::instance(); + } + + void clearReport(); + bool printReport(QPrinter *printer=0); + bool printPages(ReportPages pages, QPrinter *printer); + void printToFile(const QString& fileName); + bool printToPDF(const QString& fileName); + void previewReport(PreviewHints hints = PreviewBarsUserSetting); + void setSettings(QSettings* value); + QSettings* settings(); + bool loadFromFile(const QString& fileName, bool autoLoadPreviewOnChange); + bool loadFromByteArray(QByteArray *data, const QString& name = ""); + bool loadFromString(const QString& report, const QString& name = ""); + QString lastError(); + ReportEngine * q_ptr; + bool emitLoadReport(); + bool hasActivePreview(){return m_activePreview;} + PageDesignIntf *createPreviewScene(QObject *parent); + PreviewReportWidget *createPreviewWidget(QWidget *parent); + QIcon previewWindowIcon() const; + void setPreviewWindowIcon(const QIcon &previewWindowIcon); + QString previewWindowTitle() const; + void setPreviewWindowTitle(const QString &previewWindowTitle); + + bool suppressFieldAndVarError() const; + void setSuppressFieldAndVarError(bool suppressFieldAndVarError); + bool isBusy(); + bool resultIsEditable() const; + void setResultEditable(bool value); + + void setPassPhrase(const QString &passPhrase); + bool addTranslationLanguage(QLocale::Language language); + bool removeTranslationLanguage(QLocale::Language language); + bool setReportLanguage(QLocale::Language language); + QList aviableLanguages(); + ReportTranslation* reportTranslation(QLocale::Language language); + void reorderPages(const QList &reorderedPages); + void clearSelection(); + Qt::LayoutDirection previewLayoutDirection(); + void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); +signals: + void pagesLoadFinished(); + void datasourceCollectionLoadFinished(const QString& collectionName); + void cleared(); + void renderStarted(); + void renderFinished(); + void renderPageFinished(int renderedPageCount); + void onLoad(bool& loaded); +public slots: + bool slotLoadFromFile(const QString& fileName); + void cancelRender(); +protected: + PageDesignIntf* createPage(const QString& pageName=""); +protected slots: + void slotDataSourceCollectionLoaded(const QString& collectionName); +private slots: + void slotPreviewWindowDestroyed(QObject *window); +private: + //ICollectionContainer + virtual QObject* createElement(const QString&,const QString&); + virtual int elementsCount(const QString&); + virtual QObject* elementAt(const QString&, int index); + virtual void collectionLoadFinished(const QString&); + void saveError(QString message); + void showError(QString message); + //ICollectionContainer + //ITranslationContainer + Translations* translations(){ return &m_translations;} + void updateTranslations(); + //ITranslationContainer + ReportPages renderToPages(); + QString renderToString(); + PageDesignIntf* getPageByName(const QString& pageName); + ATranslationProperty fakeTranslationReader(){ return ATranslationProperty();} +private: + QList m_pages; + DataSourceManager* m_datasources; + ScriptEngineContext* m_scriptEngineContext; + ReportRender::Ptr m_reportRender; + QString m_fileName; + QString m_lastError; + QSettings* m_settings; + bool m_ownedSettings; + QScopedPointer m_printer; + bool m_printerSelected; + bool m_showProgressDialog; + QString m_reportsDir; + QString m_reportName; + QMainWindow* m_activePreview; + QIcon m_previewWindowIcon; + QString m_previewWindowTitle; + QPointer m_designerWindow; + ReportSettings m_reportSettings; + bool m_LimeRendering; + bool m_resultIsEditable; + QString m_passPhrase; + QFileSystemWatcher *m_fileWatcher; + Translations m_translations; + QLocale::Language m_reportLanguage; + void activateLanguage(QLocale::Language language); + Qt::LayoutDirection m_previewLayoutDirection; +}; + +} +#endif // LRLIMERENDER_P_H diff --git a/limerender/lrreportrender.cpp b/limerender/lrreportrender.cpp new file mode 100644 index 0000000..782db29 --- /dev/null +++ b/limerender/lrreportrender.cpp @@ -0,0 +1,1104 @@ +/*************************************************************************** + * This file is part of the Lime Report project * + * Copyright (C) 2015 by Alexander Arin * + * arin_a@bk.ru * + * * + ** GNU General Public License Usage ** + * * + * This library is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + * * + ** GNU Lesser General Public License ** + * * + * This library 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. * + * You should have received a copy of the GNU Lesser General Public * + * License along with this library. * + * If not, see . * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + ****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#include "time.h" + +#include "limerender_p.h" +#include "limerender.h" + +#include "lrpagedesignintf.h" +#include "lrdatasourcemanager.h" +#include "lrreportrender.h" +#include "serializators/lrxmlwriter.h" +#include "serializators/lrxmlreader.h" +#include "lrpreviewreportwindow.h" +#include "lrpreviewreportwidget.h" +#include "lrpreviewreportwidget_p.h" + +#ifdef HAVE_STATIC_BUILD +#include "lrfactoryinitializer.h" +#endif +namespace LimeReport{ + +QSettings* LimeRender::m_settings = 0; + +LimeRenderPrivate::LimeRenderPrivate(QObject *parent) : + QObject(parent), m_fileName(""), m_settings(0), m_ownedSettings(false), + m_printer(new QPrinter(QPrinter::HighResolution)), m_printerSelected(false), + m_showProgressDialog(true), m_reportName(""), m_activePreview(0), + m_previewWindowIcon(":/report/images/logo32"), m_previewWindowTitle(tr("Preview")), + m_LimeRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), + m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage) +{ +#ifdef HAVE_STATIC_BUILD + initResources(); + initReportItems(); + initObjectInspectorProperties(); + initSerializators(); +#endif + m_datasources = new DataSourceManager(this); + m_datasources->setReportSettings(&m_reportSettings); + m_scriptEngineContext = new ScriptEngineContext(this); + + ICallbackDatasource* tableOfContens = m_datasources->createCallbackDatasource("tableofcontens"); + connect(tableOfContens, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), + m_scriptEngineContext->tableOfContens(), SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); + + m_datasources->setObjectName("datasources"); + connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); + connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &))); +} + +LimeRenderPrivate::~LimeRenderPrivate() +{ + if (m_activePreview){ + m_activePreview->close(); + } + foreach(PageDesignIntf* page,m_pages) delete page; + m_pages.clear(); + + foreach(ReportTranslation* translation, m_translations) + delete translation; + m_translations.clear(); + + if (m_ownedSettings&&m_settings) delete m_settings; +} + +QObject* LimeRenderPrivate::createElement(const QString &, const QString &) +{ + return appendPage(); +} + +QObject *LimeRenderPrivate::elementAt(const QString &, int index) +{ + return pageAt(index); +} + +PageDesignIntf *LimeRenderPrivate::createPage(const QString &pageName) +{ + PageDesignIntf* page =new PageDesignIntf(); + page->setObjectName(pageName); + page->pageItem()->setObjectName("Report"+pageName); + page->setReportRender(this); + page->setReportSettings(&m_reportSettings); + return page; +} + +PageDesignIntf *LimeRenderPrivate::appendPage(const QString &pageName) +{ + PageDesignIntf* page = createPage(pageName); + m_pages.append(page); + return page; +} + +bool LimeRenderPrivate::deletePage(PageDesignIntf *page){ + QList::iterator it = m_pages.begin(); + while (it != m_pages.end()){ + if (*it == page) { + it = m_pages.erase(it); + return true; + } else ++it; + } + return false; +} + +PageDesignIntf *LimeRenderPrivate::createPreviewPage() +{ + return createPage(); +} + +int LimeRenderPrivate::elementsCount(const QString &) +{ + return m_pages.count(); +} + +void LimeRenderPrivate::collectionLoadFinished(const QString &) +{ + foreach (PageDesignIntf* page, m_pages) { + page->setReportRender(this); + page->setReportSettings(&m_reportSettings); + page->setSceneRect(-Const::SCENE_MARGIN,-Const::SCENE_MARGIN, + page->pageItem()->width()+Const::SCENE_MARGIN*2, + page->pageItem()->height()+Const::SCENE_MARGIN*2); + } + emit pagesLoadFinished(); +} + +void LimeRenderPrivate::saveError(QString message) +{ + m_lastError = message; +} + +void LimeRenderPrivate::showError(QString message) +{ + QMessageBox::critical(0,tr("Error"),message); +} + +void LimeRenderPrivate::updateTranslations() +{ + foreach(ReportTranslation* translation, m_translations.values()){ + foreach(PageDesignIntf* page, m_pages){ + translation->updatePageTranslation(page); + } + } +} + +void LimeRenderPrivate::slotDataSourceCollectionLoaded(const QString &collectionName) +{ + emit datasourceCollectionLoadFinished(collectionName); +} + +void LimeRenderPrivate::slotPreviewWindowDestroyed(QObject* window) +{ + if (m_activePreview == window){ + m_activePreview = 0; + } +} + +void LimeRenderPrivate::clearReport() +{ + foreach(PageDesignIntf* page,m_pages) delete page; + m_pages.clear(); + foreach(ReportTranslation* reportTranslation, m_translations) + delete reportTranslation; + m_translations.clear(); + m_datasources->clear(DataSourceManager::Owned); + m_fileName=""; + m_scriptEngineContext->clear(); + m_reportSettings.setDefaultValues(); + + emit cleared(); +} + +void LimeRenderPrivate::printReport(ItemsReaderIntf::Ptr reader, QPrinter& printer) +{ + LimeReport::PageDesignIntf renderPage; + renderPage.setItemMode(PrintMode); + if (reader->first()){ + reader->readItem(renderPage.pageItem()); + printer.setFullPage(renderPage.pageItem()->fullPage()); + printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); + renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); + + if (renderPage.pageItem()->pageSize()==PageItemDesignIntf::Custom){ + QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? + QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): + renderPage.pageItem()->sizeMM(); + printer.setPaperSize(pageSize,QPrinter::Millimeter); + } else { + printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize()); + } + + QPainter painter(&printer); + renderPage.render(&painter); + + while (reader->next()){ + printer.newPage(); + renderPage.removeAllItems(); + reader->readItem(renderPage.pageItem()); + renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); + renderPage.render(&painter); + } + } +} + +void LimeRenderPrivate::printReport(ReportPages pages, QPrinter &printer) +{ + LimeReport::PageDesignIntf renderPage; + renderPage.setItemMode(PrintMode); + QPainter* painter=0; + + bool isFirst = true; + int currenPage = 1; + + + qreal leftMargin, topMargin, rightMargin, bottomMargin; + printer.getPageMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin, QPrinter::Millimeter); + + QRectF printerPageRect = printer.pageRect(QPrinter::Millimeter); + printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR, + (printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR); + + foreach(PageItemDesignIntf::Ptr page, pages){ + + if ( + (printer.printRange() == QPrinter::AllPages) || + ( (printer.printRange()==QPrinter::PageRange) && + (currenPage>=printer.fromPage()) && + (currenPage<=printer.toPage()) + ) + ) + { + + QPointF pagePos = page->pos(); + + page->setPos(0,0); + renderPage.setPageItem(page); + renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); + if (renderPage.pageItem()->oldPrintMode()){ + printer.setPageMargins(renderPage.pageItem()->leftMargin(), + renderPage.pageItem()->topMargin(), + renderPage.pageItem()->rightMargin(), + renderPage.pageItem()->bottomMargin(), + QPrinter::Millimeter); + printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); + QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? + QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): + renderPage.pageItem()->sizeMM(); + printer.setPaperSize(pageSize,QPrinter::Millimeter); + } else { + printer.setFullPage(renderPage.pageItem()->fullPage()); + printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); + if (renderPage.pageItem()->pageSize()==PageItemDesignIntf::Custom){ + QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? + QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): + renderPage.pageItem()->sizeMM(); + if (page->getSetPageSizeToPrinter()) + printer.setPaperSize(pageSize,QPrinter::Millimeter); + } else { + if (page->getSetPageSizeToPrinter()) + printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize()); + } + } + + if (!isFirst){ + printer.newPage(); + } else { + isFirst=false; + painter = new QPainter(&printer); + } + + if (printerPageRect.width() < page->geometry().width()){ + qreal pageWidth = page->geometry().width(); + QRectF currentPrintingRect = printerPageRect; + while (pageWidth>0){ + renderPage.render(painter, printer.pageRect(), currentPrintingRect); + currentPrintingRect.adjust(printerPageRect.size().width(),0,printerPageRect.size().width(),0); + pageWidth -= printerPageRect.size().width(); + if (pageWidth>0) printer.newPage(); + } + + } else { + renderPage.render(painter); + } + + + page->setPos(pagePos); + } + + currenPage++; + } + delete painter; +} + +QStringList LimeRenderPrivate::aviableReportTranslations() +{ + QStringList result; + foreach (QLocale::Language language, aviableLanguages()){ + result << QLocale::languageToString(language); + } + return result; +} + +void LimeRenderPrivate::setReportTranslation(const QString &languageName) +{ + foreach(QLocale::Language language, aviableLanguages()){ + if (QLocale::languageToString(language).compare(languageName) == 0){ + setReportLanguage(language); + } + } +}; + +bool LimeRenderPrivate::printReport(QPrinter* printer) +{ + if (!printer&&!m_printerSelected){ + QPrinterInfo pi; + if (!pi.defaultPrinter().isNull()) +#ifdef HAVE_QT4 + m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); +#endif +#ifdef HAVE_QT5 + m_printer.data()->setPrinterName(pi.defaultPrinterName()); +#endif + QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); + m_printerSelected = dialog.exec()!=QDialog::Rejected; + } + if (!printer&&!m_printerSelected) return false; + + printer =(printer)?printer:m_printer.data(); + if (printer&&printer->isValid()){ + try{ + dataManager()->setDesignTime(false); + ReportPages pages = renderToPages(); + dataManager()->setDesignTime(true); + if (pages.count()>0){ + printReport(pages,*printer); + } + } catch(ReportError &exception){ + saveError(exception.what()); + } + return true; + } else return false; +} + +bool LimeRenderPrivate::printPages(ReportPages pages, QPrinter *printer) +{ + if (!printer&&!m_printerSelected){ + QPrinterInfo pi; + if (!pi.defaultPrinter().isNull()) +#ifdef HAVE_QT4 + m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); +#endif +#ifdef HAVE_QT5 + m_printer.data()->setPrinterName(pi.defaultPrinterName()); +#endif + QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); + m_printerSelected = dialog.exec()!=QDialog::Rejected; + } + if (!printer&&!m_printerSelected) return false; + + printer =(printer)?printer:m_printer.data(); + if (printer&&printer->isValid()){ + try{ + if (pages.count()>0){ + printReport( + pages, + *printer + ); + } + } catch(ReportError &exception){ + saveError(exception.what()); + } + return true; + } else return false; +} + +void LimeRenderPrivate::printToFile(const QString &fileName) +{ + if (!fileName.isEmpty()){ + QFile file(fileName); + if (file.open(QIODevice::WriteOnly)){ + QTextStream out(&file); + try { + dataManager()->setDesignTime(false); + out<setDesignTime(true); + } catch( ReportError &exception){ + saveError(exception.what()); + } + } + file.close(); + } +} + +bool LimeRenderPrivate::printToPDF(const QString &fileName) +{ + if (!fileName.isEmpty()){ + QFileInfo fi(fileName); + QString fn = fileName; + if (fi.suffix().isEmpty()) + fn+=".pdf"; + QPrinter printer; + printer.setOutputFileName(fn); + printer.setOutputFormat(QPrinter::PdfFormat); + return printReport(&printer); + } + return false; +} + +void LimeRenderPrivate::previewReport(PreviewHints hints) +{ +// QTime start = QTime::currentTime(); + try{ + dataManager()->setDesignTime(false); + ReportPages pages = renderToPages(); + dataManager()->setDesignTime(true); + if (pages.count()>0){ + Q_Q(LimeRender); + PreviewReportWindow* w = new PreviewReportWindow(q,0,settings()); + w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint| Qt::WindowMinMaxButtonsHint); + w->setAttribute(Qt::WA_DeleteOnClose,true); + w->setWindowModality(Qt::ApplicationModal); + //w->setWindowIcon(QIcon(":/report/images/main.ico")); + w->setWindowIcon(m_previewWindowIcon); + w->setWindowTitle(m_previewWindowTitle); + w->setSettings(settings()); + w->setPages(pages); + w->setLayoutDirection(m_previewLayoutDirection); + if (!dataManager()->errorsList().isEmpty()){ + w->setErrorMessages(dataManager()->errorsList()); + } + + if (!hints.testFlag(PreviewBarsUserSetting)){ + w->setMenuVisible(!hints.testFlag(HidePreviewMenuBar)); + w->setStatusBarVisible(!hints.testFlag(HidePreviewStatusBar)); + w->setToolBarVisible(!hints.testFlag(HidePreviewToolBar)); + } + + w->setHideResultEditButton(resultIsEditable()); + + m_activePreview = w; + connect(w,SIGNAL(destroyed(QObject*)), this, SLOT(slotPreviewWindowDestroyed(QObject*))); + w->exec(); + } + } catch (ReportError &exception){ + saveError(exception.what()); + showError(exception.what()); + } +} + +PreviewReportWidget* LimeRenderPrivate::createPreviewWidget(QWidget* parent){ + + Q_Q(LimeRender); + PreviewReportWidget* widget = new PreviewReportWidget(q, parent); + try{ + dataManager()->setDesignTime(false); + ReportPages pages = renderToPages(); + dataManager()->setDesignTime(true); + if (pages.count()>0) + widget->d_ptr->setPages(pages); + } catch (ReportError &exception){ + saveError(exception.what()); + showError(exception.what()); + } + return widget; +} + +PageDesignIntf* LimeRenderPrivate::createPreviewScene(QObject* parent){ + PageDesignIntf* result = 0; + try { + ReportPages pages = renderToPages(); + result = new PageDesignIntf(parent); + result->setPageItems(pages); + } catch (ReportError &exception){ + saveError(exception.what()); + showError(exception.what()); + } + return result; +} + +bool LimeRenderPrivate::emitLoadReport() +{ + bool result = false; + emit onLoad(result); + return result; +} + +bool LimeRenderPrivate::slotLoadFromFile(const QString &fileName) +{ + PreviewReportWindow *currentPreview = qobject_cast(m_activePreview); + + if (!QFile::exists(fileName)) + { + if ( hasActivePreview() ) + { + QMessageBox::information( NULL, + tr( "Report File Change" ), + tr( "The report file \"%1\" has changed names or been deleted.\n\nThis preview is no longer valid." ).arg( fileName ) + ); + + clearReport(); + + currentPreview->close(); + } + + return false; + } + + clearReport(); + + ItemsReaderIntf::Ptr reader = FileXMLReader::create(fileName); + reader->setPassPhrase(m_passPhrase); + if (reader->first()){ + if (reader->readItem(this)){ + m_fileName=fileName; + QFileInfo fi(fileName); + m_reportName = fi.fileName(); + + QString dbSettingFileName = fi.absolutePath()+"/"+fi.baseName()+".db"; + if (QFile::exists(dbSettingFileName)){ + QSettings dbcredentals(dbSettingFileName, QSettings::IniFormat); + foreach (ConnectionDesc* connection, dataManager()->conections()) { + if (!connection->keepDBCredentials()){ + dbcredentals.beginGroup(connection->name()); + connection->setUserName(dbcredentals.value("user").toString()); + connection->setPassword(dbcredentals.value("password").toString()); + dbcredentals.endGroup(); + } + } + } + + dataManager()->connectAutoConnections(); + + if ( hasActivePreview() ) + { + currentPreview->reloadPreview(); + } + return true; + }; + } + m_lastError = reader->lastError(); + return false; +} + +void LimeRenderPrivate::cancelRender() +{ + if (m_LimeRender) + m_LimeRender->cancelRender(); + m_LimeRendering = false; +} + +PageDesignIntf* LimeRender::createPreviewScene(QObject* parent){ + Q_D(LimeRender); + return d->createPreviewScene(parent); +} + +void LimeRenderPrivate::setSettings(QSettings* value) +{ + if (value){ + if (m_ownedSettings&&m_settings) + delete m_settings; + m_settings = value; + m_ownedSettings = false; + } +} + +QSettings*LimeRenderPrivate::settings() +{ + if (m_settings){ + return m_settings; + } else { + m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_ownedSettings=true; + return m_settings; + } +} + +bool LimeRenderPrivate::loadFromFile(const QString &fileName, bool autoLoadPreviewOnChange) +{ + // only watch one file at a time + if ( !m_fileWatcher->files().isEmpty() ) + { + m_fileWatcher->removePaths( m_fileWatcher->files() ); + } + + if ( autoLoadPreviewOnChange ) + { + m_fileWatcher->addPath( fileName ); + } + + return slotLoadFromFile( fileName ); +} + +bool LimeRenderPrivate::loadFromByteArray(QByteArray* data, const QString &name){ + clearReport(); + + ItemsReaderIntf::Ptr reader = ByteArrayXMLReader::create(data); + reader->setPassPhrase(m_passPhrase); + if (reader->first()){ + if (reader->readItem(this)){ + m_fileName = ""; + m_reportName = name; + return true; + }; + } + return false; +} + +bool LimeRenderPrivate::loadFromString(const QString &report, const QString &name) +{ + clearReport(); + + ItemsReaderIntf::Ptr reader = StringXMLreader::create(report); + reader->setPassPhrase(m_passPhrase); + if (reader->first()){ + if (reader->readItem(this)){ + m_fileName = ""; + m_reportName = name; + return true; + }; + } + return false; +} + +QString LimeRenderPrivate::renderToString() +{ + LimeReport::LimeRender render; + dataManager()->connectAllDatabases(); + dataManager()->setDesignTime(false); + if (m_pages.count()){ + render.setDatasources(dataManager()); + render.setScriptContext(scriptContext()); + return render.renderPageToString(m_pages.at(0)); + }else return QString(); +} + +PageDesignIntf* LimeRenderPrivate::getPageByName(const QString& pageName) +{ + foreach(PageDesignIntf* page, m_pages){ + if ( page->objectName().compare(pageName, Qt::CaseInsensitive) == 0) + return page; + } + return 0; +} + +Qt::LayoutDirection LimeRenderPrivate::previewLayoutDirection() +{ + return m_previewLayoutDirection; +} + +void LimeRenderPrivate::setPreviewLayoutDirection(const Qt::LayoutDirection& layoutDirection) +{ + m_previewLayoutDirection = layoutDirection; +} + +void LimeRenderPrivate::setPassPhrase(const QString &passPhrase) +{ + m_passPhrase = passPhrase; +} + +void LimeRenderPrivate::reorderPages(const QList& reorderedPages) +{ + m_pages.clear(); + foreach(PageDesignIntf* page, reorderedPages){ + m_pages.append(page); + } +} + +void LimeRenderPrivate::clearSelection() +{ + foreach (PageDesignIntf* page, m_pages) { + foreach(QGraphicsItem* item, page->selectedItems()){ + item->setSelected(false); + } + } +} + +bool LimeRenderPrivate::addTranslationLanguage(QLocale::Language language) +{ + if (!m_translations.keys().contains(language)){ + ReportTranslation* translation = 0; + if (!m_translations.contains(QLocale::AnyLanguage)){ + translation = new ReportTranslation(QLocale::AnyLanguage,m_pages); + m_translations.insert(QLocale::AnyLanguage,translation); + } + translation = new ReportTranslation(language,m_pages); + m_translations.insert(language, translation); + return true; + } else { + m_lastError = tr("Language %1 already exists").arg(QLocale::languageToString(language)); + return false; + } +} + +bool LimeRenderPrivate::removeTranslationLanguage(QLocale::Language language) +{ + return m_translations.remove(language) != 0; +} + +void LimeRenderPrivate::activateLanguage(QLocale::Language language) +{ + if (!m_translations.keys().contains(language)) return; + ReportTranslation* translation = m_translations.value(language); + + foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){ + PageDesignIntf* page = getPageByName(pageTranslation->pageName); + if (page){ + foreach(ItemTranslation* itemTranslation, pageTranslation->itemsTranslation){ + BaseDesignIntf* item = page->pageItem()->childByName(itemTranslation->itemName); + if (item) { + foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){ + item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value); + } + } + } + } + } +} + +bool LimeRenderPrivate::setReportLanguage(QLocale::Language language){ + m_reportLanguage = language; + if (!m_translations.keys().contains(language)) return false; +// activateLanguage(language); + return true; +} + +QList LimeRenderPrivate::aviableLanguages() +{ + return m_translations.keys(); +} + +ReportTranslation*LimeRenderPrivate::reportTranslation(QLocale::Language language) +{ + return m_translations.value(language); +} + +bool LimeRenderPrivate::resultIsEditable() const +{ + return m_resultIsEditable; +} + +void LimeRenderPrivate::setResultEditable(bool value) +{ + m_resultIsEditable = value; +} + +bool LimeRenderPrivate::suppressFieldAndVarError() const +{ + return m_reportSettings.suppressAbsentFieldsAndVarsWarnings(); +} + +void LimeRenderPrivate::setSuppressFieldAndVarError(bool suppressFieldAndVarError) +{ + m_reportSettings.setSuppressAbsentFieldsAndVarsWarnings(suppressFieldAndVarError); +} + +bool LimeRenderPrivate::isBusy() +{ + return m_LimeRendering; +} + +QString LimeRenderPrivate::previewWindowTitle() const +{ + return m_previewWindowTitle; +} + +void LimeRenderPrivate::setPreviewWindowTitle(const QString &previewWindowTitle) +{ + m_previewWindowTitle = previewWindowTitle; +} + +QIcon LimeRenderPrivate::previewWindowIcon() const +{ + return m_previewWindowIcon; +} + +void LimeRenderPrivate::setPreviewWindowIcon(const QIcon &previewWindowIcon) +{ + m_previewWindowIcon = previewWindowIcon; +} + +ReportPages LimeRenderPrivate::renderToPages() +{ + if (m_LimeRendering) return ReportPages(); + m_LimeRender = LimeRender::Ptr(new LimeRender); + + dataManager()->clearErrors(); + dataManager()->connectAllDatabases(); + dataManager()->setDesignTime(false); + dataManager()->updateDatasourceModel(); + + connect(m_LimeRender.data(),SIGNAL(pageRendered(int)), + this, SIGNAL(renderPageFinished(int))); + + if (m_pages.count()){ +#ifdef HAVE_UI_LOADER + m_scriptEngineContext->initDialogs(); +#endif + ReportPages result; + m_LimeRendering = true; + + m_LimeRender->setDatasources(dataManager()); + m_LimeRender->setScriptContext(scriptContext()); + + foreach (PageDesignIntf* page, m_pages) { + scriptContext()->baseDesignIntfToScript(page->pageItem()->objectName(), page->pageItem()); + } + + scriptContext()->qobjectToScript("engine",this); + + if (m_scriptEngineContext->runInitScript()){ + + activateLanguage(m_reportLanguage); + emit renderStarted(); + + foreach(PageDesignIntf* page , m_pages){ + if (!page->pageItem()->isTOC()){ + page->setReportSettings(&m_reportSettings); + result.append(m_LimeRender->renderPageToPages(page)); + } + } + + +// m_LimeRender->secondRenderPass(result); + + for (int i=0; ipageItem()->isTOC()){ + page->setReportSettings(&m_reportSettings); + if (i==0){ + PageDesignIntf* secondPage = 0; + if (m_pages.count()>1) secondPage = m_pages.at(1); + ReportPages pages = m_LimeRender->renderTOC( + page, + true, + secondPage && secondPage->pageItem()->resetPageNumber() + ); + for (int j=0; jrenderPageToPages(page)); + } + } + } + + m_LimeRender->secondRenderPass(result); + + emit renderFinished(); + m_LimeRender.clear(); + } + m_LimeRendering = false; + activateLanguage(QLocale::AnyLanguage); + return result; + } else { + return ReportPages(); + } +} + +QString LimeRenderPrivate::lastError() +{ + return m_lastError; +} + +LimeRender::LimeRender(QObject *parent) + : QObject(parent), d_ptr(new LimeRenderPrivate()) +{ + Q_D(LimeRender); + d->q_ptr=this; + connect(d, SIGNAL(renderStarted()), this, SIGNAL(renderStarted())); + connect(d, SIGNAL(renderPageFinished(int)), + this, SIGNAL(renderPageFinished(int))); + connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); + connect(d, SIGNAL(onLoad(bool&)), this, SIGNAL(onLoad(bool&))); +} + +LimeRender::~LimeRender() +{ + delete d_ptr; +} + +bool LimeRender::printReport(QPrinter *printer) +{ + Q_D(LimeRender); + return d->printReport(printer); +} + +bool LimeRender::printPages(ReportPages pages, QPrinter *printer){ + Q_D(LimeRender); + return d->printPages(pages,printer); +} + +void LimeRender::printToFile(const QString &fileName) +{ + Q_D(LimeRender); + d->printToFile(fileName); +} + +bool LimeRender::printToPDF(const QString &fileName) +{ + Q_D(LimeRender); + return d->printToPDF(fileName); +} + +void LimeRender::previewReport(PreviewHints hints) +{ + Q_D(LimeRender); + if (m_settings) + d->setSettings(m_settings); + d->previewReport(hints); +} + +void LimeRender::designReport() +{ + Q_D(LimeRender); + if (m_settings) + d->setSettings(m_settings); + d->designReport(); +} + +PreviewReportWidget* LimeRender::createPreviewWidget(QWidget *parent) +{ + Q_D(LimeRender); + return d->createPreviewWidget(parent); +} + +void LimeRender::setPreviewWindowTitle(const QString &title) +{ + Q_D(LimeRender); + d->setPreviewWindowTitle(title); +} + +void LimeRender::setPreviewWindowIcon(const QIcon &icon) +{ + Q_D(LimeRender); + d->setPreviewWindowIcon(icon); +} + +void LimeRender::setResultEditable(bool value) +{ + Q_D(LimeRender); + d->setResultEditable(value); +} + +bool LimeRender::resultIsEditable() +{ + Q_D(LimeRender); + return d->resultIsEditable(); +} + +bool LimeRender::isBusy() +{ + Q_D(LimeRender); + return d->isBusy(); +} + +void LimeRender::setPassPharse(QString &passPharse) +{ + Q_D(LimeRender); + d->setPassPhrase(passPharse); +} + +QList LimeRender::aviableLanguages() +{ + Q_D(LimeRender); + return d->aviableLanguages(); +} + +bool LimeRender::setReportLanguage(QLocale::Language language) +{ + Q_D(LimeRender); + return d->setReportLanguage(language); +} + +void LimeRender::setShowProgressDialog(bool value) +{ + Q_D(LimeRender); + d->setShowProgressDialog(value); +} + +IDataSourceManager *LimeRender::dataManager() +{ + Q_D(LimeRender); + return d->dataManagerIntf(); +} + +IScriptEngineManager *LimeRender::scriptManager() +{ + Q_D(LimeRender); + return d->scriptManagerIntf(); +} + +bool LimeRender::loadFromFile(const QString &fileName, bool autoLoadPreviewOnChange) +{ + Q_D(LimeRender); + return d->loadFromFile(fileName, autoLoadPreviewOnChange); +} + +bool LimeRender::loadFromByteArray(QByteArray* data){ + Q_D(LimeRender); + return d->loadFromByteArray(data); +} + +bool LimeRender::loadFromString(const QString &data) +{ + Q_D(LimeRender); + return d->loadFromString(data); +} + +QString LimeRender::reportFileName() +{ + Q_D(LimeRender); + return d->reportFileName(); +} + +void LimeRender::setReportFileName(const QString &fileName) +{ + Q_D(LimeRender); + return d->setReportFileName(fileName); +} + +QString LimeRender::lastError() +{ + Q_D(LimeRender); + return d->lastError(); +} + +void LimeRender::setCurrentReportsDir(const QString &dirName) +{ + Q_D(LimeRender); + return d->setCurrentReportsDir(dirName); +} + +void LimeRender::setReportName(const QString &name) +{ + Q_D(LimeRender); + return d->setReportName(name); +} + +QString LimeRender::reportName() +{ + Q_D(LimeRender); + return d->reportName(); +} + +void LimeRender::cancelRender() +{ + Q_D(LimeRender); + d->cancelRender(); +} + +LimeRender::LimeRender(LimeRenderPrivate &dd, QObject *parent) + :QObject(parent),d_ptr(&dd) +{ + Q_D(LimeRender); + d->q_ptr=this; + connect(d, SIGNAL(renderStarted()), this, SIGNAL(renderStarted())); + connect(d, SIGNAL(renderPageFinished(int)), + this, SIGNAL(renderPageFinished(int))); + connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); +} + +ScriptEngineManager*LimeReport::LimeRenderPrivate::scriptManager(){ + ScriptEngineManager::instance().setContext(scriptContext()); + ScriptEngineManager::instance().setDataManager(dataManager()); + return &ScriptEngineManager::instance(); +} + +}// namespace LimeReport + diff --git a/limereport.pro b/limereport.pro index 84179ac..0615e31 100644 --- a/limereport.pro +++ b/limereport.pro @@ -15,7 +15,7 @@ SUBDIRS += \ CONFIG += ordered -SUBDIRS += demo_r1 demo_r2 designer +SUBDIRS += demo_r1 demo_r2 designer designer_plugin diff --git a/limereport/items/editors/lrfonteditorwidget.cpp b/limereport/items/editors/lrfonteditorwidget.cpp index a2d7dbc..beef254 100644 --- a/limereport/items/editors/lrfonteditorwidget.cpp +++ b/limereport/items/editors/lrfonteditorwidget.cpp @@ -31,23 +31,31 @@ namespace LimeReport{ -FontEditorWidget::FontEditorWidget(ReportDesignWidget *reportEditor, const QString &title, QWidget *parent) - : ItemEditorWidget(reportEditor,title,parent), m_ignoreSlots(false) { - initEditor(); -} +//#ifdef IS_REPORT_DESIGNER +//FontEditorWidget::FontEditorWidget(ReportDesignWidget *reportEditor, const QString &title, QWidget *parent) +// : ItemEditorWidget(reportEditor,title,parent), m_ignoreSlots(false) { +// initEditor(); +//} -FontEditorWidget::FontEditorWidget(ReportDesignWidget *reportEditor, QWidget *parent) - :ItemEditorWidget(reportEditor,parent), m_ignoreSlots(false) { - initEditor(); -} +//FontEditorWidget::FontEditorWidget(ReportDesignWidget *reportEditor, QWidget *parent) +// :ItemEditorWidget(reportEditor,parent), m_ignoreSlots(false) { +// initEditor(); +//} +//#endif -FontEditorWidget::FontEditorWidget(PageDesignIntf *page, const QString &title, QWidget *parent) - :ItemEditorWidget(page,title,parent), m_ignoreSlots(false) { - initEditor(); -} +//FontEditorWidget::FontEditorWidget(PageDesignIntf *page, const QString &title, QWidget *parent) +// :ItemEditorWidget(page,title,parent), m_ignoreSlots(false) { +// initEditor(); +//} -FontEditorWidget::FontEditorWidget(LimeReport::PageDesignIntf *page, QWidget *parent) - :ItemEditorWidget(page,parent), m_ignoreSlots(false){ +//FontEditorWidget::FontEditorWidget(LimeReport::PageDesignIntf *page, QWidget *parent) +// :ItemEditorWidget(page,parent), m_ignoreSlots(false){ +// initEditor(); +//} + +FontEditorWidget::FontEditorWidget(const QString& title, QWidget* parent) + :ItemEditorWidget(title, parent), m_ignoreSlots(false) +{ initEditor(); } @@ -101,10 +109,13 @@ void FontEditorWidget::initEditor() connect(m_fontUnderline,SIGNAL(toggled(bool)),this,SLOT(slotFontAttribsChanged(bool))); addAction(m_fontUnderline); - if (reportEditor()){ - connect(reportEditor(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), - this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); - } +//#ifdef IS_REPORT_DESIGNER +// if (reportEditor()){ +// connect(reportEditor(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), +// this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); +// } +//#endif + } void FontEditorWidget::updateValues(const QFont& font) @@ -118,34 +129,41 @@ void FontEditorWidget::updateValues(const QFont& font) m_ignoreSlots=false; } +bool FontEditorWidget::ignoreSlots() const +{ + return m_ignoreSlots; +} + void FontEditorWidget::slotFontChanged(const QFont &font) { - if (reportEditor() && !m_ignoreSlots) reportEditor()->setFont(font); - if (page()) page()->setFont(font); + // if (page()) page()->setFont(font); } void FontEditorWidget::slotFontSizeChanged(const QString &value) { if (m_ignoreSlots) return; - QFont resFont(fontNameEditor()->currentFont()); - resFont.setPointSize(value.toInt()); - - if (reportEditor()) reportEditor()->setFont(resFont); - if (page()) page()->setFont(resFont); + m_resFont = fontNameEditor()->currentFont(); + m_resFont.setPointSize(value.toInt()); +//#ifdef IS_REPORT_DESIGNER +// if (reportEditor()) reportEditor()->setFont(resFont); +//#endif +// if (page()) page()->setFont(resFont); } void FontEditorWidget::slotFontAttribsChanged(bool) { if (m_ignoreSlots) return; - QFont resFont(m_fontNameEditor->currentFont()); - resFont.setBold(m_fontBold->isChecked()); - resFont.setItalic(m_fontItalic->isChecked()); - resFont.setUnderline(m_fontUnderline->isChecked()); - if (reportEditor()) reportEditor()->setFont(resFont); - if (page()) page()->setFont(resFont); + m_resFont = m_fontNameEditor->currentFont(); + m_resFont.setBold(m_fontBold->isChecked()); + m_resFont.setItalic(m_fontItalic->isChecked()); + m_resFont.setUnderline(m_fontUnderline->isChecked()); +//#ifdef IS_REPORT_DESIGNER +// if (reportEditor()) reportEditor()->setFont(resFont); +//#endif +// if (page()) page()->setFont(resFont); } @@ -159,4 +177,49 @@ void FontEditorWidget::slotPropertyChanged(const QString &objectName, const QStr } +void FontEditorWidgetForPage::slotFontChanged(const QFont& font) +{ + m_page->setFont(font); +} + +void FontEditorWidgetForPage::slotFontSizeChanged(const QString& value) +{ + FontEditorWidget::slotFontSizeChanged(value); + m_page->setFont(resFont()); +} + +void FontEditorWidgetForPage::slotFontAttribsChanged(bool value) +{ + FontEditorWidget::slotFontAttribsChanged(value); + m_page->setFont(resFont()); +} + +#ifdef IS_REPORT_DESIGNER +void FontEditorWidgetForDesigner::initEditor() +{ + FontEditorWidget::initEditor(); + connect(m_reportEditor,SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), + this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); +} + +void FontEditorWidgetForDesigner::slotFontChanged(const QFont& font) +{ + if (!ignoreSlots()) m_reportEditor->setFont(font); +} + +void FontEditorWidgetForDesigner::slotFontSizeChanged(const QString& value) +{ + FontEditorWidget::slotFontSizeChanged(value); + m_reportEditor->setFont(resFont()); +} + +void FontEditorWidgetForDesigner::slotFontAttribsChanged(bool value) +{ + FontEditorWidget::slotFontAttribsChanged(value); + m_reportEditor->setFont(resFont()); +} + +#endif + + } //namespace LimeReport diff --git a/limereport/items/editors/lrfonteditorwidget.h b/limereport/items/editors/lrfonteditorwidget.h index 23f9ab7..4269b3e 100644 --- a/limereport/items/editors/lrfonteditorwidget.h +++ b/limereport/items/editors/lrfonteditorwidget.h @@ -35,7 +35,10 @@ #include #include +#ifdef IS_REPORT_DESIGNER #include "lrreportdesignwidget.h" +#endif + #include "lritemeditorwidget.h" namespace LimeReport{ @@ -43,20 +46,27 @@ namespace LimeReport{ class FontEditorWidget :public ItemEditorWidget{ Q_OBJECT public: - explicit FontEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); - explicit FontEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); - explicit FontEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); - explicit FontEditorWidget(PageDesignIntf* page, QWidget *parent = 0); + explicit FontEditorWidget(const QString &title, QWidget *parent = 0); +//#ifdef IS_REPORT_DESIGNER +// explicit FontEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); +// explicit FontEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); +//#endif +// explicit FontEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); +// explicit FontEditorWidget(PageDesignIntf* page, QWidget *parent = 0); + bool ignoreSlots() const; protected: void setItemEvent(BaseDesignIntf *item); QFontComboBox* fontNameEditor(){return m_fontNameEditor;} -private slots: - void slotFontChanged(const QFont& font); - void slotFontSizeChanged(const QString& value); - void slotFontAttribsChanged(bool); + virtual void initEditor(); +protected slots: + virtual void slotFontChanged(const QFont& font); + virtual void slotFontSizeChanged(const QString& value); + virtual void slotFontAttribsChanged(bool); void slotPropertyChanged(const QString& objectName, const QString& property, const QVariant &oldValue, const QVariant &newValue); +protected: + QFont resFont(){return m_resFont;} private: - void initEditor(); + void updateValues(const QFont &font); QFontComboBox* m_fontNameEditor; @@ -68,9 +78,41 @@ private: QAction* m_fontUnderline; bool m_ignoreSlots; + QFont m_resFont; }; +class FontEditorWidgetForPage : public FontEditorWidget{ + Q_OBJECT +public: + explicit FontEditorWidgetForPage(PageDesignIntf* page, const QString &title, QWidget *parent = 0) + : FontEditorWidget(title, parent), m_page(page){} +protected slots: + virtual void slotFontChanged(const QFont& font); + virtual void slotFontSizeChanged(const QString& value); + virtual void slotFontAttribsChanged(bool value); +private: + PageDesignIntf* m_page; +}; + +#ifdef IS_REPORT_DESIGNER +class FontEditorWidgetForDesigner : public FontEditorWidget{ + Q_OBJECT +public: + explicit FontEditorWidgetForDesigner(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0) + : FontEditorWidget(title, parent), m_reportEditor(reportEditor){} + +protected: + void initEditor(); +protected slots: + virtual void slotFontChanged(const QFont& font); + virtual void slotFontSizeChanged(const QString& value); + virtual void slotFontAttribsChanged(bool value); +private: + ReportDesignWidget* m_reportEditor; +}; +#endif + } //namespace LimeReport #endif // LRFONTEDITORWIDGET_H diff --git a/limereport/items/editors/lritemeditorwidget.cpp b/limereport/items/editors/lritemeditorwidget.cpp index d335697..86287a7 100644 --- a/limereport/items/editors/lritemeditorwidget.cpp +++ b/limereport/items/editors/lritemeditorwidget.cpp @@ -31,25 +31,35 @@ namespace LimeReport{ -ItemEditorWidget::ItemEditorWidget(ReportDesignWidget* reportEditor, const QString& title, QWidget* parent) - :QToolBar(title,parent), m_reportEditor(reportEditor), m_item(0), m_page(0) -{ -} +//#ifdef IS_REPORT_DESIGNER +//ItemEditorWidget::ItemEditorWidget(ReportDesignWidget* reportEditor, const QString& title, QWidget* parent) +// :QToolBar(title,parent), m_reportEditor(reportEditor), m_item(0), m_page(0) +//{ +//} -ItemEditorWidget::ItemEditorWidget(ReportDesignWidget* reportEditor, QWidget* parent) - :QToolBar(parent), m_reportEditor(reportEditor), m_item(0), m_page(0) -{ -} +//ItemEditorWidget::ItemEditorWidget(ReportDesignWidget* reportEditor, QWidget* parent) +// :QToolBar(parent), m_reportEditor(reportEditor), m_item(0), m_page(0) +//{ +//} +//#endif -ItemEditorWidget::ItemEditorWidget(PageDesignIntf* page, const QString& title, QWidget* parent) - :QToolBar(title,parent), m_reportEditor(0), m_item(0), m_page(page) -{ -} +//ItemEditorWidget::ItemEditorWidget(PageDesignIntf* page, const QString& title, QWidget* parent) +// :QToolBar(title,parent), +//#ifdef IS_REPORT_DESIGNER +// m_reportEditor(0), +//#endif +// m_item(0), m_page(page) +//{ +//} -ItemEditorWidget::ItemEditorWidget(PageDesignIntf* page, QWidget* parent) - :QToolBar(parent), m_reportEditor(0), m_item(0), m_page(page) -{ -} +//ItemEditorWidget::ItemEditorWidget(PageDesignIntf* page, QWidget* parent) +// :QToolBar(parent), +//#ifdef IS_REPORT_DESIGNER +// m_reportEditor(0), +//#endif +// m_item(0), m_page(page) +//{ +//} void ItemEditorWidget::setItem(BaseDesignIntf* item) { diff --git a/limereport/items/editors/lritemeditorwidget.h b/limereport/items/editors/lritemeditorwidget.h index 5214756..7bf2404 100644 --- a/limereport/items/editors/lritemeditorwidget.h +++ b/limereport/items/editors/lritemeditorwidget.h @@ -31,7 +31,11 @@ #define LRITEMEDITORWIDGET_H #include + +#ifdef IS_REPORT_DESIGNER #include "lrreportdesignwidget.h" +#endif +#include "lrpagedesignintf.h" namespace LimeReport { @@ -39,26 +43,35 @@ class ItemEditorWidget : public QToolBar { Q_OBJECT public: - explicit ItemEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); - explicit ItemEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); - explicit ItemEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); - explicit ItemEditorWidget(PageDesignIntf* page, QWidget *parent = 0); - + explicit ItemEditorWidget(const QString &title, QWidget *parent = 0) + : QToolBar(title, parent), m_item(0){} +//#ifdef IS_REPORT_DESIGNER +// explicit ItemEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); +// explicit ItemEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); +//#endif +// explicit ItemEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); +// explicit ItemEditorWidget(PageDesignIntf* page, QWidget *parent = 0); void setItem(BaseDesignIntf *item); - void setReportEditor(ReportDesignWidget* editor){m_reportEditor = editor;} +//#ifdef IS_REPORT_DESIGNER +// void setReportEditor(ReportDesignWidget* editor){m_reportEditor = editor;} +//#endif protected: virtual void setItemEvent(BaseDesignIntf*){} virtual void properyChangedEvent(const QString& propertName, const QVariant& oldValue, const QVariant& newValue); BaseDesignIntf* item(){return m_item;} - ReportDesignWidget* reportEditor(){return m_reportEditor;} - PageDesignIntf* page(){return m_page;} +//#ifdef IS_REPORT_DESIGNER +// ReportDesignWidget* reportEditor(){return m_reportEditor;} +//#endif +// PageDesignIntf* page(){return m_page;} private slots: void slotItemDestroyed(QObject* item); void slotPropertyChanged(const QString& propertName, const QVariant& oldValue, const QVariant& newValue); private: - ReportDesignWidget* m_reportEditor; +//#ifdef IS_REPORT_DESIGNER +// ReportDesignWidget* m_reportEditor; +//#endif BaseDesignIntf* m_item; - PageDesignIntf* m_page; +// PageDesignIntf* m_page; }; } // namespace LimeReport diff --git a/limereport/items/editors/lritemsborderseditorwidget.cpp b/limereport/items/editors/lritemsborderseditorwidget.cpp index afdf766..2a2f771 100644 --- a/limereport/items/editors/lritemsborderseditorwidget.cpp +++ b/limereport/items/editors/lritemsborderseditorwidget.cpp @@ -31,19 +31,19 @@ #include namespace LimeReport{ +//#ifdef IS_REPORT_DESIGNER +//ItemsBordersEditorWidget::ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, const QString& title, QWidget* parent) +// : ItemEditorWidget(reportEditor,title,parent), m_changing(false) +//{ +// initEditor(); +//} -ItemsBordersEditorWidget::ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, const QString& title, QWidget* parent) - : ItemEditorWidget(reportEditor,title,parent), m_changing(false) -{ - initEditor(); -} - -ItemsBordersEditorWidget::ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, QWidget* parent) - : ItemEditorWidget(reportEditor,parent), m_changing(false) -{ - initEditor(); -} - +//ItemsBordersEditorWidget::ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, QWidget* parent) +// : ItemEditorWidget(reportEditor,parent), m_changing(false) +//{ +// initEditor(); +//} +//#endif void ItemsBordersEditorWidget::setItemEvent(BaseDesignIntf* item) { QVariant borders=item->property("borders"); @@ -65,8 +65,10 @@ void ItemsBordersEditorWidget::properyChangedEvent(const QString& property, cons void ItemsBordersEditorWidget::noBordesClicked() { - if (reportEditor()) - reportEditor()->setBorders(0); +//#ifdef IS_REPORT_DESIGNER +// if (reportEditor()) +// reportEditor()->setBorders(0); +//#endif updateValues(0); } @@ -78,14 +80,15 @@ void ItemsBordersEditorWidget::allBordesClicked() BaseDesignIntf::BottomLine; updateValues((BaseDesignIntf::BorderLines)borders); - if (reportEditor()) - reportEditor()->setBorders((BaseDesignIntf::BorderLines)borders); +//#ifdef IS_REPORT_DESIGNER +// if (reportEditor()) +// reportEditor()->setBorders((BaseDesignIntf::BorderLines)borders); +//#endif } void ItemsBordersEditorWidget::buttonClicked(bool) { - if (!m_changing&&reportEditor()) - reportEditor()->setBorders(createBorders()); + } void ItemsBordersEditorWidget::initEditor() @@ -151,4 +154,29 @@ BaseDesignIntf::BorderLines ItemsBordersEditorWidget::createBorders() return (BaseDesignIntf::BorderLines)borders; } +bool ItemsBordersEditorWidget::changing() const +{ + return m_changing; +} + +#ifdef IS_REPORT_DESIGNER +void ItemsBordersEditorWidgetForDesigner::buttonClicked(bool) +{ + if (!changing()) + m_reportEditor->setBorders(createBorders()); +} + +void ItemsBordersEditorWidgetForDesigner::noBordesClicked() +{ + m_reportEditor->setBorders(0); + ItemsBordersEditorWidget::noBordesClicked(); +} + +void ItemsBordersEditorWidgetForDesigner::allBordesClicked() +{ + ItemsBordersEditorWidget::allBordesClicked(); + m_reportEditor->setBorders(createBorders()); +} +#endif + } //namespace LimeReport diff --git a/limereport/items/editors/lritemsborderseditorwidget.h b/limereport/items/editors/lritemsborderseditorwidget.h index 296107e..ff10d14 100644 --- a/limereport/items/editors/lritemsborderseditorwidget.h +++ b/limereport/items/editors/lritemsborderseditorwidget.h @@ -36,23 +36,32 @@ namespace LimeReport{ + + class ItemsBordersEditorWidget : public ItemEditorWidget { Q_OBJECT public: - explicit ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); - explicit ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); -private slots: - void noBordesClicked(); - void allBordesClicked(); - void buttonClicked(bool); + explicit ItemsBordersEditorWidget(const QString &title, QWidget *parent = 0) + : ItemEditorWidget(title, parent), m_changing(false), m_borders(0){ + initEditor(); + } +//#ifdef IS_REPORT_DESIGNER +// explicit ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); +// explicit ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); +//#endif + bool changing() const; +protected slots: + virtual void noBordesClicked(); + virtual void allBordesClicked(); + virtual void buttonClicked(bool); protected: void setItemEvent(BaseDesignIntf *item); void properyChangedEvent(const QString &property, const QVariant &oldValue, const QVariant &newValue); + BaseDesignIntf::BorderLines createBorders(); private: void initEditor(); void updateValues(BaseDesignIntf::BorderLines borders); - BaseDesignIntf::BorderLines createBorders(); QAction* m_noLines; QAction* m_leftLine; QAction* m_rightLine; @@ -60,8 +69,25 @@ private: QAction* m_bottomLine; QAction* m_allLines; bool m_changing; + int m_borders; }; + +#ifdef IS_REPORT_DESIGNER +class ItemsBordersEditorWidgetForDesigner : public ItemsBordersEditorWidget{ + Q_OBJECT +public: + explicit ItemsBordersEditorWidgetForDesigner(ReportDesignWidget* reportEditor, const QString &title="", QWidget *parent = 0) + : ItemsBordersEditorWidget(title,parent), m_reportEditor(reportEditor){} +protected slots: + void buttonClicked(bool); + void noBordesClicked(); + void allBordesClicked(); +private: + ReportDesignWidget* m_reportEditor; +}; +#endif + }//namespace LimeReport #endif // LRITEMSBORDERSEDITORWIDGET_H diff --git a/limereport/items/editors/lrtextalignmenteditorwidget.cpp b/limereport/items/editors/lrtextalignmenteditorwidget.cpp index 50da901..3ba282d 100644 --- a/limereport/items/editors/lrtextalignmenteditorwidget.cpp +++ b/limereport/items/editors/lrtextalignmenteditorwidget.cpp @@ -30,30 +30,36 @@ #include "lrtextalignmenteditorwidget.h" namespace LimeReport{ - -TextAlignmentEditorWidget::TextAlignmentEditorWidget(ReportDesignWidget *reportEditor, const QString &title, QWidget *parent) - :ItemEditorWidget(reportEditor,title,parent), m_textAttibutesIsChanging(false) +TextAlignmentEditorWidget::TextAlignmentEditorWidget(const QString& title, QWidget* parent) + :ItemEditorWidget(title, parent), m_textAttibutesIsChanging(false), m_flag(0) { initEditor(); } -TextAlignmentEditorWidget::TextAlignmentEditorWidget(ReportDesignWidget *reportEditor, QWidget *parent) - :ItemEditorWidget(reportEditor,parent), m_textAttibutesIsChanging(false) -{ - initEditor(); -} +//#ifdef IS_REPORT_DESIGNER +//TextAlignmentEditorWidget::TextAlignmentEditorWidget(ReportDesignWidget *reportEditor, const QString &title, QWidget *parent) +// :ItemEditorWidget(reportEditor,title,parent), m_textAttibutesIsChanging(false) +//{ +// initEditor(); +//} -TextAlignmentEditorWidget::TextAlignmentEditorWidget(PageDesignIntf* page, const QString& title, QWidget* parent) - :ItemEditorWidget(page,title,parent), m_textAttibutesIsChanging(false) -{ - initEditor(); -} +//TextAlignmentEditorWidget::TextAlignmentEditorWidget(ReportDesignWidget *reportEditor, QWidget *parent) +// :ItemEditorWidget(reportEditor,parent), m_textAttibutesIsChanging(false) +//{ +// initEditor(); +//} +//#endif +//TextAlignmentEditorWidget::TextAlignmentEditorWidget(PageDesignIntf* page, const QString& title, QWidget* parent) +// :ItemEditorWidget(page,title,parent), m_textAttibutesIsChanging(false) +//{ +// initEditor(); +//} -TextAlignmentEditorWidget::TextAlignmentEditorWidget(PageDesignIntf* page, QWidget* parent) - :ItemEditorWidget(page,parent), m_textAttibutesIsChanging(false) -{ - initEditor(); -} +//TextAlignmentEditorWidget::TextAlignmentEditorWidget(PageDesignIntf* page, QWidget* parent) +// :ItemEditorWidget(page,parent), m_textAttibutesIsChanging(false) +//{ +// initEditor(); +//} void TextAlignmentEditorWidget::setItemEvent(BaseDesignIntf *item) { @@ -109,21 +115,22 @@ void TextAlignmentEditorWidget::initEditor() m_textAliginBottom->setCheckable(true); connect(m_textAliginBottom,SIGNAL(toggled(bool)),this,SLOT(slotTextVAttribsChanged(bool))); addAction(m_textAliginBottom); - - if (reportEditor()){ - connect(reportEditor(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), - this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); - } - if (page()){ - connect(page(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), - this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); - } +//#ifdef IS_REPORT_DESIGNER +// if (reportEditor()){ +// connect(reportEditor(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), +// this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); +// } +//#endif +// if (page()){ +// connect(page(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), +// this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); +// } setEnabled(false); } void TextAlignmentEditorWidget::updateValues(const Qt::Alignment &align) { - m_textAttibutesIsChanging=true; + m_textAttibutesIsChanging=true; m_textAliginLeft->setChecked((align & Qt::AlignLeft)==Qt::AlignLeft); m_textAliginRight->setChecked((align & Qt::AlignRight)==Qt::AlignRight); m_textAliginHCenter->setChecked((align & Qt::AlignHCenter)==Qt::AlignHCenter); @@ -157,17 +164,18 @@ void TextAlignmentEditorWidget::slotTextHAttribsChanged(bool) m_textAliginRight->setChecked(sender()==m_textAliginRight); m_textAliginJustify->setChecked(sender()==m_textAliginJustify); - int flag = 0; - if (sender()==m_textAliginLeft) flag |= Qt::AlignLeft; - if (sender()==m_textAliginHCenter) flag |= Qt::AlignHCenter; - if (sender()==m_textAliginRight) flag |= Qt::AlignRight; - if (sender()==m_textAliginJustify) flag |= Qt::AlignJustify; - - if (reportEditor()) reportEditor()->setTextAlign(true,Qt::AlignmentFlag(flag)); - if (page()) { - //page()->setTextAlign(createAlignment()); - page()->changeSelectedGrpoupTextAlignPropperty(true,Qt::AlignmentFlag(flag)); - } + m_flag = 0; + if (sender()==m_textAliginLeft) m_flag |= Qt::AlignLeft; + if (sender()==m_textAliginHCenter) m_flag |= Qt::AlignHCenter; + if (sender()==m_textAliginRight) m_flag |= Qt::AlignRight; + if (sender()==m_textAliginJustify) m_flag |= Qt::AlignJustify; +//#ifdef IS_REPORT_DESIGNER +// if (reportEditor()) reportEditor()->setTextAlign(true,Qt::AlignmentFlag(flag)); +//#endif +// if (page()) { +// //page()->setTextAlign(createAlignment()); +// page()->changeSelectedGrpoupTextAlignPropperty(true,Qt::AlignmentFlag(flag)); +// } m_textAttibutesIsChanging = false; } @@ -180,13 +188,14 @@ void TextAlignmentEditorWidget::slotTextVAttribsChanged(bool) m_textAliginVCenter->setChecked(sender()==m_textAliginVCenter); m_textAliginBottom->setChecked(sender()==m_textAliginBottom); - int flag = 0; - if (sender()==m_textAliginTop) flag |= Qt::AlignTop; - if (sender()==m_textAliginVCenter) flag |= Qt::AlignVCenter; - if (sender()==m_textAliginBottom) flag |= Qt::AlignBottom; - - if (reportEditor()) reportEditor()->setTextAlign(false,Qt::AlignmentFlag(flag)); - if (page()) page()->changeSelectedGrpoupTextAlignPropperty(false,Qt::AlignmentFlag(flag) ); + m_flag = 0; + if (sender()==m_textAliginTop) m_flag |= Qt::AlignTop; + if (sender()==m_textAliginVCenter) m_flag |= Qt::AlignVCenter; + if (sender()==m_textAliginBottom) m_flag |= Qt::AlignBottom; +//#ifdef IS_REPORT_DESIGNER +// if (reportEditor()) reportEditor()->setTextAlign(false,Qt::AlignmentFlag(flag)); +//#endif +// if (page()) page()->changeSelectedGrpoupTextAlignPropperty(false,Qt::AlignmentFlag(flag) ); m_textAttibutesIsChanging = false; } @@ -200,5 +209,63 @@ void TextAlignmentEditorWidget::slotPropertyChanged(const QString &objectName, c } } +int TextAlignmentEditorWidget::flag() const +{ + return m_flag; +} + +void TextAlignmentEditorWidgetForPage::initEditor() +{ + TextAlignmentEditorWidget::initEditor(); + connect(m_page,SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), + this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); +} + +void TextAlignmentEditorWidgetForPage::slotTextHAttribsChanged(bool value) +{ + + TextAlignmentEditorWidget::slotTextHAttribsChanged(value); + if (m_textAttibutesIsChanging) return; + m_textAttibutesIsChanging = true; + m_page->changeSelectedGrpoupTextAlignPropperty(true,Qt::AlignmentFlag(flag())); + m_textAttibutesIsChanging = false; +} + +void TextAlignmentEditorWidgetForPage::slotTextVAttribsChanged(bool value) +{ + TextAlignmentEditorWidget::slotTextVAttribsChanged(value); + if (m_textAttibutesIsChanging) return; + m_textAttibutesIsChanging = true; + m_page->changeSelectedGrpoupTextAlignPropperty(false,Qt::AlignmentFlag(flag()) ); + m_textAttibutesIsChanging = false; +} + +#ifdef IS_REPORT_DESIGNER +void TextAlignmentEditorWidgetForDesigner::initEditor() +{ + TextAlignmentEditorWidget::initEditor(); + connect(m_reportEditor,SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), + this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); + +} + +void TextAlignmentEditorWidgetForDesigner::slotTextHAttribsChanged(bool value) +{ + TextAlignmentEditorWidget::slotTextHAttribsChanged(value); + if (m_textAttibutesIsChanging) return; + m_textAttibutesIsChanging = true; + m_reportEditor->setTextAlign(true,Qt::AlignmentFlag(flag())); + m_textAttibutesIsChanging = false; +} + +void TextAlignmentEditorWidgetForDesigner::slotTextVAttribsChanged(bool value) +{ + TextAlignmentEditorWidget::slotTextVAttribsChanged(value); + if (m_textAttibutesIsChanging) return; + m_textAttibutesIsChanging = true; + m_reportEditor->setTextAlign(false,Qt::AlignmentFlag(flag())); + m_textAttibutesIsChanging = false; +} +#endif } //namespace LimeReport diff --git a/limereport/items/editors/lrtextalignmenteditorwidget.h b/limereport/items/editors/lrtextalignmenteditorwidget.h index 93fd39d..0934406 100644 --- a/limereport/items/editors/lrtextalignmenteditorwidget.h +++ b/limereport/items/editors/lrtextalignmenteditorwidget.h @@ -41,23 +41,26 @@ class TextAlignmentEditorWidget:public ItemEditorWidget { Q_OBJECT public: - explicit TextAlignmentEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); - explicit TextAlignmentEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); - explicit TextAlignmentEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); - explicit TextAlignmentEditorWidget(PageDesignIntf* page, QWidget *parent = 0); + explicit TextAlignmentEditorWidget(const QString &title, QWidget *parent = 0); +//#ifdef IS_REPORT_DESIGNER +// explicit TextAlignmentEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); +// explicit TextAlignmentEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); +//#endif +// explicit TextAlignmentEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); +// explicit TextAlignmentEditorWidget(PageDesignIntf* page, QWidget *parent = 0); + int flag() const; protected: void setItemEvent(BaseDesignIntf *item); + virtual void initEditor(); + bool m_textAttibutesIsChanging; private: - void initEditor(); void updateValues(const Qt::Alignment& align); Qt::Alignment createAlignment(); -private slots: - void slotTextHAttribsChanged(bool); - void slotTextVAttribsChanged(bool); - void slotPropertyChanged(const QString& objectName, const QString& property, const QVariant &oldValue, const QVariant &newValue); +protected slots: + virtual void slotTextHAttribsChanged(bool); + virtual void slotTextVAttribsChanged(bool); + virtual void slotPropertyChanged(const QString& objectName, const QString& property, const QVariant &oldValue, const QVariant &newValue); private: - bool m_textAttibutesIsChanging; - QAction* m_textAliginLeft; QAction* m_textAliginRight; QAction* m_textAliginHCenter; @@ -66,8 +69,40 @@ private: QAction* m_textAliginBottom; QAction* m_textAliginVCenter; + int m_flag; + }; +class TextAlignmentEditorWidgetForPage: public TextAlignmentEditorWidget{ + Q_OBJECT +public: + TextAlignmentEditorWidgetForPage(PageDesignIntf* page, const QString &title, QWidget *parent = 0) + :TextAlignmentEditorWidget(title, parent), m_page(page){} +protected: + void initEditor(); +protected slots: + void slotTextHAttribsChanged(bool value); + void slotTextVAttribsChanged(bool value); +private: + PageDesignIntf* m_page; +}; + +#ifdef IS_REPORT_DESIGNER +class TextAlignmentEditorWidgetForDesigner: public TextAlignmentEditorWidget{ + Q_OBJECT +public: + TextAlignmentEditorWidgetForDesigner(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0) + :TextAlignmentEditorWidget(title, parent), m_reportEditor(reportEditor){} +protected: + void initEditor(); +protected slots: + void slotTextHAttribsChanged(bool value); + void slotTextVAttribsChanged(bool value); +private: + ReportDesignWidget* m_reportEditor; +}; +#endif + } //namespace LimeReport #endif // LRTEXTALIGNMENTEDITORWIDGET_H diff --git a/limereport/limereport.pri b/limereport/limereport.pri index 385ad4d..cf9c5af 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -1,8 +1,8 @@ include(../common.pri) -contains(CONFIG,dialogdesigner){ - include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) -} +#contains(CONFIG,dialogdesigner){ +# include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) +#} DEFINES += INSPECT_BASEDESIGN @@ -11,9 +11,10 @@ INCLUDEPATH += \ $$REPORT_PATH/items \ $$REPORT_PATH/bands \ $$REPORT_PATH/base \ - $$REPORT_PATH/objectinspector \ - $$REPORT_PATH/databrowser \ +# $$REPORT_PATH/objectinspector \ +# $$REPORT_PATH/databrowser \ $$REPORT_PATH/scripteditor +# $$REPORT_PATH/../designer_plugin SOURCES += \ $$REPORT_PATH/bands/lrpageheader.cpp \ @@ -24,59 +25,59 @@ SOURCES += \ $$REPORT_PATH/bands/lrgroupbands.cpp \ $$REPORT_PATH/bands/lrsubdetailband.cpp \ $$REPORT_PATH/bands/lrtearoffband.cpp \ - $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ - $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ - $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ - $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ - $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ +# $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ +# $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ +# $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ +# $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ +# $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ $$REPORT_PATH/serializators/lrxmlreader.cpp \ $$REPORT_PATH/serializators/lrxmlwriter.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.cpp \ - $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrfonteditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrimageeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrcoloreditor.cpp \ - $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.cpp \ - $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.cpp \ - $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ - $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ - $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ - $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ +# $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.cpp \ +# $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ +# $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ +# $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ +# $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.cpp \ +# $$REPORT_PATH/objectinspector/editors/lrfonteditor.cpp \ +# $$REPORT_PATH/objectinspector/editors/lrimageeditor.cpp \ +# $$REPORT_PATH/objectinspector/editors/lrcoloreditor.cpp \ +# $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.cpp \ +# $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.cpp \ +# $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ +# $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ +# $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ +# $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ +# $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ $$REPORT_PATH/scripteditor/lrscripteditor.cpp \ $$REPORT_PATH/scripteditor/lrcodeeditor.cpp \ $$REPORT_PATH/scripteditor/lrscripthighlighter.cpp \ - $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ - $$REPORT_PATH/items/lralignpropitem.cpp \ +# $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ +# $$REPORT_PATH/items/lralignpropitem.cpp \ $$REPORT_PATH/items/lrhorizontallayout.cpp \ $$REPORT_PATH/items/editors/lritemeditorwidget.cpp \ $$REPORT_PATH/items/editors/lrfonteditorwidget.cpp \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ - $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ - $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ +# $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ +# $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ $$REPORT_PATH/items/lrsimpletagparser.cpp \ $$REPORT_PATH/items/lrimageitem.cpp \ $$REPORT_PATH/items/lrtextitemeditor.cpp \ $$REPORT_PATH/items/lrshapeitem.cpp \ $$REPORT_PATH/items/lrtextitem.cpp \ - $$REPORT_PATH/translationeditor/translationeditor.cpp \ +# $$REPORT_PATH/translationeditor/translationeditor.cpp \ $$REPORT_PATH/lrbanddesignintf.cpp \ $$REPORT_PATH/lrpageitemdesignintf.cpp \ $$REPORT_PATH/lrpagedesignintf.cpp \ @@ -84,11 +85,11 @@ SOURCES += \ $$REPORT_PATH/lrglobal.cpp \ $$REPORT_PATH/lritemdesignintf.cpp \ $$REPORT_PATH/lrdatadesignintf.cpp \ - $$REPORT_PATH/lrreportdesignwidget.cpp \ +# $$REPORT_PATH/lrreportdesignwidget.cpp \ $$REPORT_PATH/lrbasedesignintf.cpp \ $$REPORT_PATH/lrreportengine.cpp \ $$REPORT_PATH/lrdatasourcemanager.cpp \ - $$REPORT_PATH/lrreportdesignwindow.cpp \ +# $$REPORT_PATH/lrreportdesignwindow.cpp \ $$REPORT_PATH/lrreportrender.cpp \ $$REPORT_PATH/lrscriptenginemanager.cpp \ $$REPORT_PATH/lrpreviewreportwindow.cpp \ @@ -104,7 +105,7 @@ SOURCES += \ $$REPORT_PATH/items/lrchartitem.cpp \ $$REPORT_PATH/items/lrchartitemeditor.cpp \ $$REPORT_PATH/lrreporttranslation.cpp \ - $$REPORT_PATH/translationeditor/languageselectdialog.cpp +# $$REPORT_PATH/translationeditor/languageselectdialog.cpp contains(CONFIG, staticlib){ SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp @@ -126,11 +127,11 @@ HEADERS += \ $$REPORT_PATH/bands/lrtearoffband.h \ $$REPORT_PATH/bands/lrsubdetailband.h \ $$REPORT_PATH/bands/lrgroupbands.h \ - $$REPORT_PATH/databrowser/lrdatabrowser.h \ - $$REPORT_PATH/databrowser/lrsqleditdialog.h \ - $$REPORT_PATH/databrowser/lrconnectiondialog.h \ - $$REPORT_PATH/databrowser/lrvariabledialog.h \ - $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ +# $$REPORT_PATH/databrowser/lrdatabrowser.h \ +# $$REPORT_PATH/databrowser/lrsqleditdialog.h \ +# $$REPORT_PATH/databrowser/lrconnectiondialog.h \ +# $$REPORT_PATH/databrowser/lrvariabledialog.h \ +# $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ $$REPORT_PATH/serializators/lrserializatorintf.h \ $$REPORT_PATH/serializators/lrstorageintf.h \ $$REPORT_PATH/serializators/lrxmlqrectserializator.h \ @@ -138,50 +139,50 @@ HEADERS += \ $$REPORT_PATH/serializators/lrxmlbasetypesserializators.h \ $$REPORT_PATH/serializators/lrxmlreader.h \ $$REPORT_PATH/serializators/lrxmlwriter.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ - $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrimageeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrcoloreditor.h \ - $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ - $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.h \ - $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.h \ - $$REPORT_PATH/objectinspector/lrobjectitemmodel.h \ - $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ - $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ - $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ +# $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ +# $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ +# $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ +# $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ +# $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.h \ +# $$REPORT_PATH/objectinspector/editors/lrimageeditor.h \ +# $$REPORT_PATH/objectinspector/editors/lrcoloreditor.h \ +# $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ +# $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.h \ +# $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.h \ +# $$REPORT_PATH/objectinspector/lrobjectitemmodel.h \ +# $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ +# $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ +# $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ +# $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ $$REPORT_PATH/scripteditor/lrscripteditor.h \ $$REPORT_PATH/scripteditor/lrcodeeditor.h \ $$REPORT_PATH/scripteditor/lrscripthighlighter.h \ $$REPORT_PATH/items/editors/lritemeditorwidget.h \ $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ - $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ - $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ +# $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ +# $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ $$REPORT_PATH/items/lrtextitem.h \ - $$REPORT_PATH/items/lrsubitemparentpropitem.h \ - $$REPORT_PATH/items/lralignpropitem.h \ +# $$REPORT_PATH/items/lrsubitemparentpropitem.h \ +# $$REPORT_PATH/items/lralignpropitem.h \ $$REPORT_PATH/items/lrhorizontallayout.h \ $$REPORT_PATH/items/lrtextitemeditor.h \ $$REPORT_PATH/items/lrshapeitem.h \ $$REPORT_PATH/items/lrimageitem.h \ $$REPORT_PATH/items/lrsimpletagparser.h \ - $$REPORT_PATH/translationeditor/translationeditor.h \ +# $$REPORT_PATH/translationeditor/translationeditor.h \ $$REPORT_PATH/lrfactoryinitializer.h \ $$REPORT_PATH/lrbanddesignintf.h \ $$REPORT_PATH/lrpageitemdesignintf.h \ @@ -190,10 +191,10 @@ HEADERS += \ $$REPORT_PATH/lrdatadesignintf.h \ $$REPORT_PATH/lrcollection.h \ $$REPORT_PATH/lrpagedesignintf.h \ - $$REPORT_PATH/lrreportdesignwidget.h \ +# $$REPORT_PATH/lrreportdesignwidget.h \ $$REPORT_PATH/lrreportengine_p.h \ $$REPORT_PATH/lrdatasourcemanager.h \ - $$REPORT_PATH/lrreportdesignwindow.h \ +# $$REPORT_PATH/lrreportdesignwindow.h \ $$REPORT_PATH/lrreportrender.h \ $$REPORT_PATH/lrpreviewreportwindow.h \ $$REPORT_PATH/lrpreviewreportwidget.h \ @@ -216,9 +217,9 @@ HEADERS += \ $$REPORT_PATH/lritemscontainerdesignitf.h \ $$REPORT_PATH/lrcolorindicator.h \ $$REPORT_PATH/items/lrchartitem.h \ - $$REPORT_PATH/items/lrchartitemeditor.h \ - $$REPORT_PATH/lrreporttranslation.h \ - $$REPORT_PATH/translationeditor/languageselectdialog.h + $$REPORT_PATH/items/lrchartitemeditor.h +# $$REPORT_PATH/lrreporttranslation.h \ +# $$REPORT_PATH/translationeditor/languageselectdialog.h contains(CONFIG, staticlib){ HEADERS += $$REPORT_PATH/lrfactoryinitializer.h @@ -229,26 +230,26 @@ contains(CONFIG,zint){ } FORMS += \ - $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ - $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ - $$REPORT_PATH/databrowser/lrdatabrowser.ui \ - $$REPORT_PATH/databrowser/lrvariabledialog.ui \ - $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ +# $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ +# $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ +# $$REPORT_PATH/databrowser/lrdatabrowser.ui \ +# $$REPORT_PATH/databrowser/lrvariabledialog.ui \ +# $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ $$REPORT_PATH/lrpreviewreportwindow.ui \ $$REPORT_PATH/lrpreviewreportwidget.ui \ $$REPORT_PATH/items/lrtextitemeditor.ui \ $$REPORT_PATH/lraboutdialog.ui \ $$REPORT_PATH/lrsettingdialog.ui \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ +# $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ $$REPORT_PATH/items/lrchartitemeditor.ui \ - $$REPORT_PATH/translationeditor/translationeditor.ui \ - $$REPORT_PATH/translationeditor/languageselectdialog.ui \ +# $$REPORT_PATH/translationeditor/translationeditor.ui \ +# $$REPORT_PATH/translationeditor/languageselectdialog.ui \ $$REPORT_PATH/scripteditor/lrscripteditor.ui RESOURCES += \ - $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ - $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ +# $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ +# $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ $$REPORT_PATH/report.qrc \ - $$REPORT_PATH/items/items.qrc \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \ - $$REPORT_PATH/translationeditor/translationeditor.qrc + $$REPORT_PATH/items/items.qrc +# $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \ +# $$REPORT_PATH/translationeditor/translationeditor.qrc diff --git a/limereport/lrdesignelementsfactory.h b/limereport/lrdesignelementsfactory.h index 3afc554..9a647a2 100644 --- a/limereport/lrdesignelementsfactory.h +++ b/limereport/lrdesignelementsfactory.h @@ -31,7 +31,7 @@ #define LRDESIGNELEMENTSFACTORY_H #include "lrbanddesignintf.h" -#include "lrpageheader.h" +//#include "lrpageheader.h" #include "lrattribsabstractfactory.h" #include "lrsimpleabstractfactory.h" #include "lrsingleton.h" diff --git a/limereport/lrdesignerplugininterface.h b/limereport/lrdesignerplugininterface.h new file mode 100644 index 0000000..b5b80a2 --- /dev/null +++ b/limereport/lrdesignerplugininterface.h @@ -0,0 +1,30 @@ +#ifndef LRDESIGNERPLUGININTERFACE_H +#define LRDESIGNERPLUGININTERFACE_H + +#include +#include + +#include + +QT_BEGIN_NAMESPACE +class QSettings; +class QMainWindow; +QT_END_NAMESPACE + +namespace LimeReport { + class ReportDesignWindow; + class ReportEnginePrivateInterface; +} + +class LimeReportPluginInterface { +public: + virtual ~LimeReportPluginInterface() { } + + virtual QString getString() const = 0; + virtual QVariant getVar() const = 0; + virtual QMainWindow* getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget *parent = 0, QSettings* settings=0) = 0; +}; + +Q_DECLARE_INTERFACE( LimeReportPluginInterface, "ru.limereport.LimeReport.DesignerPluginInterface/1.0" ) + +#endif // LRDESIGNERPLUGININTERFACE_H diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 49a3e89..32b0b5d 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -66,10 +66,10 @@ PreviewReportWindow::PreviewReportWindow(ReportEngine *report, QWidget *parent, connect(m_previewReportWidget->d_ptr->m_previewPage,SIGNAL(selectionChanged()),this,SLOT(slotSelectionChanged())); connect(m_pagesNavigator,SIGNAL(valueChanged(int)),this,SLOT(slotPageNavigatorChanged(int))); - m_fontEditor = new FontEditorWidget(m_previewReportWidget->d_ptr->m_previewPage,tr("Font"),this); + m_fontEditor = new FontEditorWidgetForPage(m_previewReportWidget->d_ptr->m_previewPage,tr("Font"),this); m_fontEditor->setObjectName("fontTools"); m_fontEditor->setIconSize(ui->toolBar->iconSize()); - m_textAlignmentEditor = new TextAlignmentEditorWidget(m_previewReportWidget->d_ptr->m_previewPage,tr("Text align"),this); + m_textAlignmentEditor = new TextAlignmentEditorWidgetForPage(m_previewReportWidget->d_ptr->m_previewPage,tr("Text align"),this); m_textAlignmentEditor->setObjectName("textAlignmentTools"); m_textAlignmentEditor->setIconSize(ui->toolBar->iconSize()); addToolBar(Qt::TopToolBarArea,m_fontEditor); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index ff342b3..8b68570 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -51,7 +51,7 @@ namespace LimeReport { // ReportDesignIntf -ReportDesignWidget::ReportDesignWidget(ReportEngine *report, QMainWindow *mainWindow, QWidget *parent) : +ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QMainWindow *mainWindow, QWidget *parent) : QWidget(parent), #ifdef HAVE_QTDESIGNER_INTEGRATION m_dialogDesignerManager(new DialogDesignerManager(this)), @@ -72,20 +72,20 @@ ReportDesignWidget::ReportDesignWidget(ReportEngine *report, QMainWindow *mainWi mainLayout->addWidget(m_tabWidget); setLayout(mainLayout); - if (!report) { - m_report=new ReportEnginePrivate(this); - m_report->setObjectName("report"); - m_report->appendPage("page1"); - } - else { - m_report=report->d_ptr; +// if (!report) { +// m_report=new ReportEnginePrivate(this); +// m_report->setObjectName("report"); +// m_report->appendPage("page1"); +// } +// else { + m_report=report;//report->d_ptr; if (!m_report->pageCount()) m_report->appendPage("page1"); - } +// } createTabs(); - connect(m_report,SIGNAL(pagesLoadFinished()),this,SLOT(slotPagesLoadFinished())); - connect(m_report,SIGNAL(cleared()),this,SIGNAL(cleared())); + connect(dynamic_cast(m_report), SIGNAL(pagesLoadFinished()),this,SLOT(slotPagesLoadFinished())); + connect(dynamic_cast(m_report), SIGNAL(cleared()),this,SIGNAL(cleared())); connect(m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slotCurrentTabChanged(int))); #ifdef HAVE_UI_LOADER connect(m_report->scriptContext(), SIGNAL(dialogDeleted(QString)), this, SLOT(slotDialogDeleted(QString))); @@ -241,9 +241,11 @@ void ReportDesignWidget::createTabs(){ view->setFrameShape(QFrame::NoFrame); view->setScene(m_report->pageAt(i)); - foreach(QGraphicsItem* item, m_report->pageAt(i)->selectedItems()){ - item->setSelected(false); - } +// foreach(QGraphicsItem* item, m_report->pageAt(i)->selectedItems()){ +// item->setSelected(false); +// } + + m_report->pageAt(i)->clearSelection(); view->centerOn(0,0); view->scale(0.5,0.5); @@ -796,7 +798,8 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) QGraphicsView* view = dynamic_cast(m_tabWidget->widget(index)); if (view) { if (view->scene()){ - foreach (QGraphicsItem* item, view->scene()->selectedItems()) item->setSelected(false); + //foreach (QGraphicsItem* item, view->scene()->selectedItems()) item->setSelected(false); + view->scene()->clearSelection(); } m_zoomer->setView(view); } @@ -807,7 +810,7 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) updateDialogs(); #endif if (activeTabType() == Translations){ - m_traslationEditor->setReportEngine(report()); + m_traslationEditor->setReportEngine(dynamic_cast(report())); } if (activeTabType() == Script){ @@ -816,6 +819,8 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) } emit activePageChanged(); + + if (view) view->centerOn(0,0); } #ifdef HAVE_QTDESIGNER_INTEGRATION diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 81c13fd..e38338b 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -84,7 +84,7 @@ public: Translations, TabTypeCount }; - ReportDesignWidget(ReportEngine* report, QMainWindow *mainWindow, QWidget *parent = 0); + ReportDesignWidget(ReportEnginePrivateInterface* report, QMainWindow *mainWindow, QWidget *parent = 0); ~ReportDesignWidget(); void createStartPage(); void clear(); @@ -105,7 +105,7 @@ public: QList selectedItems(); QStringList datasourcesNames(); void scale( qreal sx, qreal sy); - ReportEnginePrivate* report(){return m_report;} + ReportEnginePrivateInterface* report(){return m_report;} QString reportFileName(); bool isNeedToSave(); bool emitLoadReport(); @@ -200,7 +200,7 @@ protected: private: bool eventFilter(QObject *target, QEvent *event); private: - ReportEnginePrivate* m_report; + ReportEnginePrivateInterface* m_report; QGraphicsView *m_view; ScriptEditor* m_scriptEditor; TranslationEditor* m_traslationEditor; diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index fc611e3..b0ca4be 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -62,7 +62,7 @@ namespace LimeReport{ ReportDesignWindow* ReportDesignWindow::m_instance=0; -ReportDesignWindow::ReportDesignWindow(ReportEngine *report, QWidget *parent, QSettings* settings) : +ReportDesignWindow::ReportDesignWindow(ReportEnginePrivateInterface* report, QWidget *parent, QSettings* settings) : QMainWindow(parent), m_textAttibutesIsChanging(false), m_settings(settings), m_ownedSettings(false), m_progressDialog(0), m_showProgressDialog(true), m_editorTabType(ReportDesignWidget::Page), m_reportItemIsLocked(false) { @@ -309,11 +309,11 @@ void ReportDesignWindow::createToolBars() //m_mainToolBar->addAction(m_printReportAction); - m_fontEditorBar = new FontEditorWidget(m_reportDesignWidget,tr("Font"),this); + m_fontEditorBar = new FontEditorWidgetForDesigner(m_reportDesignWidget,tr("Font"),this); m_fontEditorBar->setIconSize(m_mainToolBar->iconSize()); m_fontEditorBar->setObjectName("fontTools"); addToolBar(m_fontEditorBar); - m_textAlignmentEditorBar = new TextAlignmentEditorWidget(m_reportDesignWidget,tr("Text alignment"),this); + m_textAlignmentEditorBar = new TextAlignmentEditorWidgetForDesigner(m_reportDesignWidget,tr("Text alignment"),this); m_textAlignmentEditorBar->setIconSize(m_mainToolBar->iconSize()); m_textAlignmentEditorBar->setObjectName("textAlignmentTools"); addToolBar(m_textAlignmentEditorBar); @@ -324,7 +324,7 @@ void ReportDesignWindow::createToolBars() m_itemsAlignmentEditorBar->insertAction(m_itemsAlignmentEditorBar->actions().at(1),m_useMagnetAction); m_itemsAlignmentEditorBar->insertSeparator(m_itemsAlignmentEditorBar->actions().at(2)); addToolBar(m_itemsAlignmentEditorBar); - m_itemsBordersEditorBar = new ItemsBordersEditorWidget(m_reportDesignWidget,tr("Borders"),this); + m_itemsBordersEditorBar = new ItemsBordersEditorWidgetForDesigner(m_reportDesignWidget,tr("Borders"),this); m_itemsBordersEditorBar->setIconSize(m_mainToolBar->iconSize()); m_itemsBordersEditorBar->setObjectName("itemsBorderTools"); addToolBar(m_itemsBordersEditorBar); @@ -459,7 +459,7 @@ void ReportDesignWindow::createMainMenu() m_recentFilesMenu->setDisabled(m_recentFiles.isEmpty()); } -void ReportDesignWindow::initReportEditor(ReportEngine* report) +void ReportDesignWindow::initReportEditor(ReportEnginePrivateInterface* report) { m_reportDesignWidget=new ReportDesignWidget(report,this,this); setCentralWidget(m_reportDesignWidget); @@ -472,16 +472,16 @@ void ReportDesignWindow::initReportEditor(ReportEngine* report) connect(m_reportDesignWidget,SIGNAL(itemInserted(LimeReport::PageDesignIntf*,QPointF,QString)), this,SLOT(slotItemInserted(LimeReport::PageDesignIntf*,QPointF,QString))); connect(m_reportDesignWidget,SIGNAL(itemInsertCanceled(QString)),this,SLOT(slotItemInsertCanceled(QString))); - connect(m_reportDesignWidget->report(),SIGNAL(datasourceCollectionLoadFinished(QString)),this,SLOT(slotUpdateDataBrowser(QString))); + connect(dynamic_cast(report), SIGNAL(datasourceCollectionLoadFinished(QString)),this,SLOT(slotUpdateDataBrowser(QString))); connect(m_reportDesignWidget,SIGNAL(commandHistoryChanged()),this,SLOT(slotCommandHistoryChanged())); connect(m_reportDesignWidget,SIGNAL(activePageChanged()),this,SLOT(slotActivePageChanged())); connect(m_reportDesignWidget, SIGNAL(bandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), this, SLOT(slotBandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); connect(m_reportDesignWidget, SIGNAL(bandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), this, SLOT(slotBandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); - connect(m_reportDesignWidget->report(), SIGNAL(renderStarted()), this, SLOT(renderStarted())); - connect(m_reportDesignWidget->report(), SIGNAL(renderPageFinished(int)), this, SLOT(renderPageFinished(int))); - connect(m_reportDesignWidget->report(), SIGNAL(renderFinished()), this, SLOT(renderFinished())); + connect(dynamic_cast(report), SIGNAL(renderStarted()), this, SLOT(renderStarted())); + connect(dynamic_cast(report), SIGNAL(renderPageFinished(int)), this, SLOT(renderPageFinished(int))); + connect(dynamic_cast(report), SIGNAL(renderFinished()), this, SLOT(renderFinished())); connect(m_reportDesignWidget, SIGNAL(pageAdded(PageDesignIntf*)), this, SLOT(slotPageAdded(PageDesignIntf*))); connect(m_reportDesignWidget, SIGNAL(pageDeleted()), this, SLOT(slotPageDeleted())); } @@ -1311,7 +1311,7 @@ void ReportDesignWindow::renderStarted() { if (m_showProgressDialog){ m_progressDialog = new QProgressDialog(tr("Rendering report"),tr("Abort"),0,0,this); - m_progressDialog->open(m_reportDesignWidget->report(),SLOT(cancelRender())); + m_progressDialog->open(dynamic_cast(m_reportDesignWidget->report()), SLOT(cancelRender())); QApplication::processEvents(); } } diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index a01db94..ef435f6 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -59,7 +59,7 @@ class ReportDesignWindow : public QMainWindow { Q_OBJECT public: - explicit ReportDesignWindow(ReportEngine *report, QWidget *parent = 0, QSettings* settings=0); + explicit ReportDesignWindow(ReportEnginePrivateInterface *report, QWidget *parent = 0, QSettings* settings=0); ~ReportDesignWindow(); static ReportDesignWindow* instance(){return m_instance;} @@ -140,7 +140,7 @@ private: void createItemsActions(); void createObjectInspector(); void createObjectsBrowser(); - void initReportEditor(ReportEngine *report); + void initReportEditor(ReportEnginePrivateInterface* report); void createDataWindow(); void createScriptWindow(); #ifdef HAVE_QTDESIGNER_INTEGRATION diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 5768951..500223a 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include "time.h" @@ -42,8 +43,9 @@ #include "lrpagedesignintf.h" #include "lrdatasourcemanager.h" -#include "lrdatabrowser.h" -#include "lrreportdesignwindow.h" +//#include "lrdatabrowser.h" +//#include "lrreportdesignwindow.h" + #include "serializators/lrxmlwriter.h" #include "serializators/lrxmlreader.h" @@ -51,6 +53,8 @@ #include "lrpreviewreportwindow.h" #include "lrpreviewreportwidget.h" #include "lrpreviewreportwidget_p.h" + + #ifdef HAVE_STATIC_BUILD #include "lrfactoryinitializer.h" #endif @@ -64,7 +68,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_showProgressDialog(true), m_reportName(""), m_activePreview(0), m_previewWindowIcon(":/report/images/logo32"), m_previewWindowTitle(tr("Preview")), m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), - m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage) + m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage), m_designerFactory(0) { #ifdef HAVE_STATIC_BUILD initResources(); @@ -83,6 +87,29 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_datasources->setObjectName("datasources"); connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &))); + + QDir pluginsDir( "../lib" ); + foreach( const QString& pluginName, pluginsDir.entryList( QDir::Files ) ) { + qDebug() << "==============================================================================="; + qDebug() << "Found:" << pluginName; + + QPluginLoader loader( pluginsDir.absoluteFilePath( pluginName ) ); + if( loader.load() ) { + if( LimeReportPluginInterface* myPlugin = qobject_cast< LimeReportPluginInterface* >( loader.instance() ) ) { + qDebug() << "Testing: \n" << + "(1)" << myPlugin->getString() << "\n" << + "(2)" << myPlugin->getVar(); + m_designerFactory = myPlugin; + } + //loader.unload(); + } else { + qDebug() << "Failed to load :("; + qDebug() << loader.errorString(); + } + + qDebug() << ""; + } + } ReportEnginePrivate::~ReportEnginePrivate() @@ -619,21 +646,32 @@ PageDesignIntf* ReportEngine::createPreviewScene(QObject* parent){ void ReportEnginePrivate::designReport() { if (!m_designerWindow) { - Q_Q(ReportEngine); - m_designerWindow = new LimeReport::ReportDesignWindow(q,QApplication::activeWindow(),settings()); - m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); - m_designerWindow->setWindowIcon(QIcon(":report/images/logo32")); - m_designerWindow->setShowProgressDialog(m_showProgressDialog); +// Q_Q(ReportEngine); + if (m_designerFactory){ + settings()->beginGroup("DesignerWindow"); + settings()->setValue("showProgressDialog",m_showProgressDialog); + settings()->endGroup(); + m_designerWindow = m_designerFactory->getDesignerWindow(this,QApplication::activeWindow(),settings()); + //m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); + //m_designerWindow->setWindowIcon(QIcon(":report/images/logo32")); + //m_designerWindow->setShowProgressDialog(m_showProgressDialog); + } else { + //m_designerWindow = new LimeReport::ReportDesignWindow(this,QApplication::activeWindow(),settings()); + //m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); + //m_designerWindow->setWindowIcon(QIcon(":report/images/logo32")); + //m_designerWindow->setShowProgressDialog(m_showProgressDialog); + } } m_datasources->updateDatasourceModel(); #ifdef Q_OS_WIN m_designerWindow->setWindowModality(Qt::ApplicationModal); #endif - if (QApplication::activeWindow()==0){ - m_designerWindow->show();; - } else { - m_designerWindow->showModal(); - } +// if (QApplication::activeWindow()==0){ +// m_designerWindow->show();; +// } else { +// m_designerWindow->showModal(); +// } + m_designerWindow->show(); } void ReportEnginePrivate::setSettings(QSettings* value) diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 49505ca..0dba7ad 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -42,6 +42,7 @@ #include "serializators/lrstorageintf.h" #include "lrscriptenginemanager.h" #include "lrreporttranslation.h" +#include "lrdesignerplugininterface.h" class QFileSystemWatcher; @@ -53,7 +54,40 @@ class ReportDesignWindow; //TODO: Add on render callback -class ReportEnginePrivate : public QObject, public ICollectionContainer, public ITranslationContainer +class ReportEnginePrivateInterface { +public: + virtual PageDesignIntf* appendPage(const QString& pageName="") = 0; + virtual bool deletePage(PageDesignIntf *page) = 0; + virtual void reorderPages(const QList &reorderedPages) = 0; + virtual int pageCount() = 0; + virtual PageDesignIntf* pageAt(int index) = 0; + virtual void clearReport() = 0; + virtual ScriptEngineContext* scriptContext() = 0; + virtual ScriptEngineManager* scriptManager() = 0; + virtual DataSourceManager* dataManager() = 0; + virtual QString reportFileName() = 0; + virtual void setReportFileName(const QString& reportFileName) = 0; + virtual void emitSaveFinished() = 0; + virtual bool isNeedToSave() = 0; + virtual void emitSaveReport() = 0; + virtual bool saveToFile() = 0; + virtual bool saveToFile(const QString& fileName) = 0; + virtual bool isSaved() = 0; + virtual QString reportName() = 0; + virtual bool loadFromFile(const QString& fileName, bool autoLoadPreviewOnChange) = 0; + virtual bool emitLoadReport() = 0; + virtual void clearSelection() = 0; + virtual bool printReport(QPrinter *printer=0) = 0; + virtual void previewReport(PreviewHints hints = PreviewBarsUserSetting) = 0; + virtual void setCurrentReportsDir(const QString& dirName) = 0; + virtual QString currentReportsDir() = 0; + virtual bool suppressFieldAndVarError() const = 0; + virtual void setSuppressFieldAndVarError(bool suppressFieldAndVarError) = 0; + +}; + +class ReportEnginePrivate : public QObject, public ICollectionContainer, public ITranslationContainer, + public ReportEnginePrivateInterface { Q_OBJECT Q_DECLARE_PUBLIC(ReportEngine) @@ -195,7 +229,7 @@ private: QMainWindow* m_activePreview; QIcon m_previewWindowIcon; QString m_previewWindowTitle; - QPointer m_designerWindow; + QPointer m_designerWindow; ReportSettings m_reportSettings; bool m_reportRendering; bool m_resultIsEditable; @@ -205,6 +239,7 @@ private: QLocale::Language m_reportLanguage; void activateLanguage(QLocale::Language language); Qt::LayoutDirection m_previewLayoutDirection; + LimeReportPluginInterface* m_designerFactory; }; } diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 4db2fac..667a238 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -48,7 +48,7 @@ void ScriptEditor::initEditor(DataSourceManager* dm) } } -void ScriptEditor::setReportEngine(ReportEnginePrivate* reportEngine) +void ScriptEditor::setReportEngine(ReportEnginePrivateInterface* reportEngine) { m_reportEngine = reportEngine; DataSourceManager* dm = m_reportEngine->dataManager(); diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index b67be79..f9b8db7 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -9,7 +9,7 @@ namespace LimeReport{ -class ReportEnginePrivate; +class ReportEnginePrivateInterface; class BaseDesignIntf; class PageDesignIntf; class BandDesignIntf; @@ -25,7 +25,7 @@ class ScriptEditor : public QWidget public: explicit ScriptEditor(QWidget *parent = 0); ~ScriptEditor(); - void setReportEngine(ReportEnginePrivate* reportEngine); + void setReportEngine(LimeReport::ReportEnginePrivateInterface* reportEngine); void setReportPage(PageDesignIntf* page); void setPageBand(BandDesignIntf* band); void initCompleter(); @@ -48,7 +48,7 @@ private: void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); private: Ui::ScriptEditor *ui; - ReportEnginePrivate* m_reportEngine; + ReportEnginePrivateInterface* m_reportEngine; PageDesignIntf* m_page; QCompleter* m_completer; From 911eb1102a65a8fc85c447f2391ad7f32e5c0283 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 27 Nov 2017 23:14:05 +0300 Subject: [PATCH 089/347] plugin finished --- 3rdparty/zint-2.6.1/backend_qt/backend_qt.pro | 1 + common.pri | 5 + designer_plugin/limereport.pri | 83 +------ designer_plugin/lrdesignerplugin.cpp | 26 +- designer_plugin/lrdesignerplugin.h | 9 +- include/lrreportengine.h | 2 + limereport.pro | 12 +- .../items/editors/lrfonteditorwidget.cpp | 44 +--- limereport/items/editors/lrfonteditorwidget.h | 12 +- .../items/editors/lritemeditorwidget.cpp | 30 --- limereport/items/editors/lritemeditorwidget.h | 19 +- .../editors/lritemsborderseditorwidget.cpp | 22 +- .../editors/lritemsborderseditorwidget.h | 9 +- .../editors/lrtextalignmenteditorwidget.cpp | 48 +--- .../editors/lrtextalignmenteditorwidget.h | 10 +- limereport/limereport.pri | 233 ++++++++++-------- limereport/limereport.pro | 5 +- limereport/lrdesignerplugininterface.h | 6 +- limereport/lrfactoryinitializer.cpp | 22 +- limereport/lrreportdesignwindow.cpp | 2 +- limereport/lrreportdesignwindow.h | 3 +- limereport/lrreportdesignwindowintrerface.h | 23 ++ limereport/lrreportengine.cpp | 92 ++++--- limereport/lrreportengine.h | 2 + limereport/lrreportengine_p.h | 5 +- 25 files changed, 270 insertions(+), 455 deletions(-) create mode 100644 limereport/lrreportdesignwindowintrerface.h diff --git a/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro b/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro index 9bea19e..06203b6 100644 --- a/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro +++ b/3rdparty/zint-2.6.1/backend_qt/backend_qt.pro @@ -2,6 +2,7 @@ DEFINES += NO_PNG TEMPLATE = lib contains(CONFIG, static_build){ + message(Static Build) CONFIG += staticlib DEFINES += HAVE_STATIC_BUILD } diff --git a/common.pri b/common.pri index 7bb8861..d87d912 100644 --- a/common.pri +++ b/common.pri @@ -12,6 +12,11 @@ CONFIG *= build_translations CONFIG *= dialogdesigner } +!contains(CONFIG, no_embedded_designer){ + CONFIG *= embedded_designer + DEFINES += HAVE_REPORT_DESIGNER +} + ZINT_PATH = $$PWD/3rdparty/zint-2.6.1 contains(CONFIG,zint){ DEFINES *= HAVE_ZINT diff --git a/designer_plugin/limereport.pri b/designer_plugin/limereport.pri index f1455ed..72b19ba 100644 --- a/designer_plugin/limereport.pri +++ b/designer_plugin/limereport.pri @@ -1,6 +1,6 @@ include(../common.pri) -DEFINES += IS_REPORT_DESIGNER +DEFINES += HAVE_REPORT_DESIGNER contains(CONFIG,dialogdesigner){ include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) @@ -19,23 +19,11 @@ INCLUDEPATH += \ $$REPORT_PATH/../designer_plugin SOURCES += \ - $$REPORT_PATH/bands/lrpageheader.cpp \ - $$REPORT_PATH/bands/lrpagefooter.cpp \ - $$REPORT_PATH/bands/lrreportheader.cpp \ - $$REPORT_PATH/bands/lrreportfooter.cpp \ - $$REPORT_PATH/bands/lrdataband.cpp \ - $$REPORT_PATH/bands/lrgroupbands.cpp \ - $$REPORT_PATH/bands/lrsubdetailband.cpp \ - $$REPORT_PATH/bands/lrtearoffband.cpp \ $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ - $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ - $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ - $$REPORT_PATH/serializators/lrxmlreader.cpp \ - $$REPORT_PATH/serializators/lrxmlwriter.cpp \ $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ @@ -74,11 +62,6 @@ SOURCES += \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ - $$REPORT_PATH/items/lrsimpletagparser.cpp \ - $$REPORT_PATH/items/lrimageitem.cpp \ - $$REPORT_PATH/items/lrtextitemeditor.cpp \ - $$REPORT_PATH/items/lrshapeitem.cpp \ - $$REPORT_PATH/items/lrtextitem.cpp \ $$REPORT_PATH/translationeditor/translationeditor.cpp \ $$REPORT_PATH/lrbanddesignintf.cpp \ $$REPORT_PATH/lrpageitemdesignintf.cpp \ @@ -89,58 +72,25 @@ SOURCES += \ $$REPORT_PATH/lrdatadesignintf.cpp \ $$REPORT_PATH/lrreportdesignwidget.cpp \ $$REPORT_PATH/lrbasedesignintf.cpp \ - $$REPORT_PATH/lrreportengine.cpp \ $$REPORT_PATH/lrdatasourcemanager.cpp \ $$REPORT_PATH/lrreportdesignwindow.cpp \ -# $$REPORT_PATH/lrreportrender.cpp \ $$REPORT_PATH/lrscriptenginemanager.cpp \ - $$REPORT_PATH/lrpreviewreportwindow.cpp \ - $$REPORT_PATH/lrpreviewreportwidget.cpp \ - $$REPORT_PATH/lrgraphicsviewzoom.cpp \ - $$REPORT_PATH/lrvariablesholder.cpp \ - $$REPORT_PATH/lrgroupfunctions.cpp \ - $$REPORT_PATH/lrsimplecrypt.cpp \ $$REPORT_PATH/lraboutdialog.cpp \ $$REPORT_PATH/lrsettingdialog.cpp \ $$REPORT_PATH/lritemscontainerdesignitf.cpp \ $$REPORT_PATH/lrcolorindicator.cpp \ - $$REPORT_PATH/items/lrchartitem.cpp \ - $$REPORT_PATH/items/lrchartitemeditor.cpp \ $$REPORT_PATH/lrreporttranslation.cpp \ $$REPORT_PATH/translationeditor/languageselectdialog.cpp - -contains(CONFIG, staticlib){ - SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp -} - -contains(CONFIG, zint){ - SOURCES += $$REPORT_PATH/items/lrbarcodeitem.cpp -} - + HEADERS += \ $$REPORT_PATH/base/lrsingleton.h \ $$REPORT_PATH/base/lrsimpleabstractfactory.h \ $$REPORT_PATH/base/lrattribsabstractfactory.h \ - $$REPORT_PATH/bands/lrpageheader.h \ - $$REPORT_PATH/bands/lrpagefooter.h \ - $$REPORT_PATH/bands/lrreportheader.h \ - $$REPORT_PATH/bands/lrreportfooter.h \ - $$REPORT_PATH/bands/lrdataband.h \ - $$REPORT_PATH/bands/lrtearoffband.h \ - $$REPORT_PATH/bands/lrsubdetailband.h \ - $$REPORT_PATH/bands/lrgroupbands.h \ $$REPORT_PATH/databrowser/lrdatabrowser.h \ $$REPORT_PATH/databrowser/lrsqleditdialog.h \ $$REPORT_PATH/databrowser/lrconnectiondialog.h \ $$REPORT_PATH/databrowser/lrvariabledialog.h \ $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ - $$REPORT_PATH/serializators/lrserializatorintf.h \ - $$REPORT_PATH/serializators/lrstorageintf.h \ - $$REPORT_PATH/serializators/lrxmlqrectserializator.h \ - $$REPORT_PATH/serializators/lrxmlserializatorsfactory.h \ - $$REPORT_PATH/serializators/lrxmlbasetypesserializators.h \ - $$REPORT_PATH/serializators/lrxmlreader.h \ - $$REPORT_PATH/serializators/lrxmlwriter.h \ $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ @@ -181,69 +131,40 @@ HEADERS += \ $$REPORT_PATH/items/lralignpropitem.h \ $$REPORT_PATH/items/lrhorizontallayout.h \ $$REPORT_PATH/items/lrtextitemeditor.h \ - $$REPORT_PATH/items/lrshapeitem.h \ - $$REPORT_PATH/items/lrimageitem.h \ - $$REPORT_PATH/items/lrsimpletagparser.h \ $$REPORT_PATH/translationeditor/translationeditor.h \ - $$REPORT_PATH/lrfactoryinitializer.h \ $$REPORT_PATH/lrbanddesignintf.h \ $$REPORT_PATH/lrpageitemdesignintf.h \ $$REPORT_PATH/lrbandsmanager.h \ $$REPORT_PATH/lrglobal.h \ $$REPORT_PATH/lrdatadesignintf.h \ - $$REPORT_PATH/lrcollection.h \ $$REPORT_PATH/lrpagedesignintf.h \ $$REPORT_PATH/lrreportdesignwidget.h \ - $$REPORT_PATH/lrreportengine_p.h \ $$REPORT_PATH/lrdatasourcemanager.h \ $$REPORT_PATH/lrreportdesignwindow.h \ -# $$REPORT_PATH/lrreportrender.h \ - $$REPORT_PATH/lrpreviewreportwindow.h \ - $$REPORT_PATH/lrpreviewreportwidget.h \ - $$REPORT_PATH/lrpreviewreportwidget_p.h \ $$REPORT_PATH/lrgraphicsviewzoom.h \ $$REPORT_PATH/lrbasedesignintf.h \ $$REPORT_PATH/lritemdesignintf.h \ - $$REPORT_PATH/lrdesignelementsfactory.h \ $$REPORT_PATH/lrscriptenginemanager.h \ - $$REPORT_PATH/lrvariablesholder.h \ $$REPORT_PATH/lrgroupfunctions.h \ - $$REPORT_PATH/lrreportengine.h \ $$REPORT_PATH/lrdatasourcemanagerintf.h \ $$REPORT_PATH/lrscriptenginemanagerintf.h \ - $$REPORT_PATH/lrsimplecrypt.h \ $$REPORT_PATH/lraboutdialog.h \ $$REPORT_PATH/lrcallbackdatasourceintf.h \ $$REPORT_PATH/lrsettingdialog.h \ - $$REPORT_PATH/lrpreviewreportwidget_p.h \ $$REPORT_PATH/lritemscontainerdesignitf.h \ $$REPORT_PATH/lrcolorindicator.h \ - $$REPORT_PATH/items/lrchartitem.h \ - $$REPORT_PATH/items/lrchartitemeditor.h \ $$REPORT_PATH/lrreporttranslation.h \ $$REPORT_PATH/translationeditor/languageselectdialog.h -contains(CONFIG, staticlib){ - HEADERS += $$REPORT_PATH/lrfactoryinitializer.h -} - -contains(CONFIG,zint){ - HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h -} - FORMS += \ $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ $$REPORT_PATH/databrowser/lrdatabrowser.ui \ $$REPORT_PATH/databrowser/lrvariabledialog.ui \ $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ - $$REPORT_PATH/lrpreviewreportwindow.ui \ - $$REPORT_PATH/lrpreviewreportwidget.ui \ - $$REPORT_PATH/items/lrtextitemeditor.ui \ $$REPORT_PATH/lraboutdialog.ui \ $$REPORT_PATH/lrsettingdialog.ui \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ - $$REPORT_PATH/items/lrchartitemeditor.ui \ $$REPORT_PATH/translationeditor/translationeditor.ui \ $$REPORT_PATH/translationeditor/languageselectdialog.ui \ $$REPORT_PATH/scripteditor/lrscripteditor.ui diff --git a/designer_plugin/lrdesignerplugin.cpp b/designer_plugin/lrdesignerplugin.cpp index a957399..e832213 100644 --- a/designer_plugin/lrdesignerplugin.cpp +++ b/designer_plugin/lrdesignerplugin.cpp @@ -3,29 +3,15 @@ #include #include "lrreportdesignwindow.h" -DesignerFactoryPlugin::~DesignerFactoryPlugin() { +ReportDesignerFactoryPlugin::~ReportDesignerFactoryPlugin() { } -QString DesignerFactoryPlugin::getString() const { - return "Hello, Plugin!"; -} - -QVariant DesignerFactoryPlugin::getVar() const { - return QRect( 10, 10, 500, 500 ); -} - -QMainWindow* DesignerFactoryPlugin::getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget* parent, QSettings* settings) +LimeReport::ReportDesignWindowInterface* ReportDesignerFactoryPlugin::getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget* parent, QSettings* settings) { - LimeReport::ReportDesignWindow* designerWindow = new LimeReport::ReportDesignWindow(report, parent, settings); - - settings->beginGroup("DesignerWindow"); - designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); - designerWindow->setWindowIcon(QIcon(":report/images/logo32")); - designerWindow->setShowProgressDialog(settings->value("showProgressDialog").toBool()); - settings->endGroup(); - - return designerWindow; + return new LimeReport::ReportDesignWindow(report, parent, settings); } -//Q_EXPORT_PLUGIN2( LimeReportPluginInterface, DesignerFactoryPlugin ) +#if QT_VERSION < 0x050000 +Q_EXPORT_PLUGIN2( LimeReportPluginInterface, DesignerFactoryPlugin ) +#endif diff --git a/designer_plugin/lrdesignerplugin.h b/designer_plugin/lrdesignerplugin.h index d7064d5..0a7b8f3 100644 --- a/designer_plugin/lrdesignerplugin.h +++ b/designer_plugin/lrdesignerplugin.h @@ -4,17 +4,14 @@ #include #include -class DesignerFactoryPlugin : public QObject, public LimeReportPluginInterface { +class ReportDesignerFactoryPlugin : public QObject, public LimeReportPluginInterface { Q_OBJECT Q_PLUGIN_METADATA(IID "ru.limereport.DersignerFactoryInterface") Q_INTERFACES( LimeReportPluginInterface ) public: - ~DesignerFactoryPlugin(); - - QString getString() const; - QVariant getVar() const; - QMainWindow* getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget* parent, QSettings* settings); + ~ReportDesignerFactoryPlugin(); + LimeReport::ReportDesignWindowInterface* getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget* parent, QSettings* settings); }; #endif diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 444d2f4..03b5d91 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -39,6 +39,7 @@ #include "lrdatasourcemanagerintf.h" #include "lrscriptenginemanagerintf.h" #include "lrpreviewreportwidget.h" +#include "lrreportdesignwindowintrerface.h" class QPrinter; @@ -85,6 +86,7 @@ public: bool printToPDF(const QString& fileName); void previewReport(PreviewHints hints = PreviewBarsUserSetting); void designReport(); + ReportDesignWindowInterface* getDesignerWindow(); void setShowProgressDialog(bool value); IDataSourceManager* dataManager(); IScriptEngineManager* scriptManager(); diff --git a/limereport.pro b/limereport.pro index 0615e31..53d9b87 100644 --- a/limereport.pro +++ b/limereport.pro @@ -10,12 +10,18 @@ contains(CONFIG, zint){ } export($$CONFIG) -SUBDIRS += \ - limereport + +SUBDIRS += limereport CONFIG += ordered -SUBDIRS += demo_r1 demo_r2 designer designer_plugin +SUBDIRS += demo_r1 demo_r2 designer + +!contains(CONFIG, embedded_designer){ +!contains(CONFIG, static_build){ +SUBDIRS += designer_plugin +} +} diff --git a/limereport/items/editors/lrfonteditorwidget.cpp b/limereport/items/editors/lrfonteditorwidget.cpp index beef254..6787e90 100644 --- a/limereport/items/editors/lrfonteditorwidget.cpp +++ b/limereport/items/editors/lrfonteditorwidget.cpp @@ -31,28 +31,6 @@ namespace LimeReport{ -//#ifdef IS_REPORT_DESIGNER -//FontEditorWidget::FontEditorWidget(ReportDesignWidget *reportEditor, const QString &title, QWidget *parent) -// : ItemEditorWidget(reportEditor,title,parent), m_ignoreSlots(false) { -// initEditor(); -//} - -//FontEditorWidget::FontEditorWidget(ReportDesignWidget *reportEditor, QWidget *parent) -// :ItemEditorWidget(reportEditor,parent), m_ignoreSlots(false) { -// initEditor(); -//} -//#endif - -//FontEditorWidget::FontEditorWidget(PageDesignIntf *page, const QString &title, QWidget *parent) -// :ItemEditorWidget(page,title,parent), m_ignoreSlots(false) { -// initEditor(); -//} - -//FontEditorWidget::FontEditorWidget(LimeReport::PageDesignIntf *page, QWidget *parent) -// :ItemEditorWidget(page,parent), m_ignoreSlots(false){ -// initEditor(); -//} - FontEditorWidget::FontEditorWidget(const QString& title, QWidget* parent) :ItemEditorWidget(title, parent), m_ignoreSlots(false) { @@ -109,13 +87,6 @@ void FontEditorWidget::initEditor() connect(m_fontUnderline,SIGNAL(toggled(bool)),this,SLOT(slotFontAttribsChanged(bool))); addAction(m_fontUnderline); -//#ifdef IS_REPORT_DESIGNER -// if (reportEditor()){ -// connect(reportEditor(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), -// this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); -// } -//#endif - } void FontEditorWidget::updateValues(const QFont& font) @@ -135,7 +106,7 @@ bool FontEditorWidget::ignoreSlots() const } -void FontEditorWidget::slotFontChanged(const QFont &font) +void FontEditorWidget::slotFontChanged(const QFont /*&font*/) { // if (page()) page()->setFont(font); } @@ -143,28 +114,17 @@ void FontEditorWidget::slotFontChanged(const QFont &font) void FontEditorWidget::slotFontSizeChanged(const QString &value) { if (m_ignoreSlots) return; - m_resFont = fontNameEditor()->currentFont(); m_resFont.setPointSize(value.toInt()); -//#ifdef IS_REPORT_DESIGNER -// if (reportEditor()) reportEditor()->setFont(resFont); -//#endif -// if (page()) page()->setFont(resFont); } void FontEditorWidget::slotFontAttribsChanged(bool) { if (m_ignoreSlots) return; - m_resFont = m_fontNameEditor->currentFont(); m_resFont.setBold(m_fontBold->isChecked()); m_resFont.setItalic(m_fontItalic->isChecked()); m_resFont.setUnderline(m_fontUnderline->isChecked()); -//#ifdef IS_REPORT_DESIGNER -// if (reportEditor()) reportEditor()->setFont(resFont); -//#endif -// if (page()) page()->setFont(resFont); - } void FontEditorWidget::slotPropertyChanged(const QString &objectName, const QString &property, const QVariant& oldValue, const QVariant& newValue) @@ -194,7 +154,7 @@ void FontEditorWidgetForPage::slotFontAttribsChanged(bool value) m_page->setFont(resFont()); } -#ifdef IS_REPORT_DESIGNER +#ifdef HAVE_REPORT_DESIGNER void FontEditorWidgetForDesigner::initEditor() { FontEditorWidget::initEditor(); diff --git a/limereport/items/editors/lrfonteditorwidget.h b/limereport/items/editors/lrfonteditorwidget.h index 4269b3e..c5de288 100644 --- a/limereport/items/editors/lrfonteditorwidget.h +++ b/limereport/items/editors/lrfonteditorwidget.h @@ -35,7 +35,7 @@ #include #include -#ifdef IS_REPORT_DESIGNER +#ifdef HAVE_REPORT_DESIGNER #include "lrreportdesignwidget.h" #endif @@ -47,19 +47,13 @@ class FontEditorWidget :public ItemEditorWidget{ Q_OBJECT public: explicit FontEditorWidget(const QString &title, QWidget *parent = 0); -//#ifdef IS_REPORT_DESIGNER -// explicit FontEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); -// explicit FontEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); -//#endif -// explicit FontEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); -// explicit FontEditorWidget(PageDesignIntf* page, QWidget *parent = 0); bool ignoreSlots() const; protected: void setItemEvent(BaseDesignIntf *item); QFontComboBox* fontNameEditor(){return m_fontNameEditor;} virtual void initEditor(); protected slots: - virtual void slotFontChanged(const QFont& font); + virtual void slotFontChanged(const QFont); virtual void slotFontSizeChanged(const QString& value); virtual void slotFontAttribsChanged(bool); void slotPropertyChanged(const QString& objectName, const QString& property, const QVariant &oldValue, const QVariant &newValue); @@ -95,7 +89,7 @@ private: PageDesignIntf* m_page; }; -#ifdef IS_REPORT_DESIGNER +#ifdef HAVE_REPORT_DESIGNER class FontEditorWidgetForDesigner : public FontEditorWidget{ Q_OBJECT public: diff --git a/limereport/items/editors/lritemeditorwidget.cpp b/limereport/items/editors/lritemeditorwidget.cpp index 86287a7..d81af5e 100644 --- a/limereport/items/editors/lritemeditorwidget.cpp +++ b/limereport/items/editors/lritemeditorwidget.cpp @@ -31,36 +31,6 @@ namespace LimeReport{ -//#ifdef IS_REPORT_DESIGNER -//ItemEditorWidget::ItemEditorWidget(ReportDesignWidget* reportEditor, const QString& title, QWidget* parent) -// :QToolBar(title,parent), m_reportEditor(reportEditor), m_item(0), m_page(0) -//{ -//} - -//ItemEditorWidget::ItemEditorWidget(ReportDesignWidget* reportEditor, QWidget* parent) -// :QToolBar(parent), m_reportEditor(reportEditor), m_item(0), m_page(0) -//{ -//} -//#endif - -//ItemEditorWidget::ItemEditorWidget(PageDesignIntf* page, const QString& title, QWidget* parent) -// :QToolBar(title,parent), -//#ifdef IS_REPORT_DESIGNER -// m_reportEditor(0), -//#endif -// m_item(0), m_page(page) -//{ -//} - -//ItemEditorWidget::ItemEditorWidget(PageDesignIntf* page, QWidget* parent) -// :QToolBar(parent), -//#ifdef IS_REPORT_DESIGNER -// m_reportEditor(0), -//#endif -// m_item(0), m_page(page) -//{ -//} - void ItemEditorWidget::setItem(BaseDesignIntf* item) { if (m_item!=item){ diff --git a/limereport/items/editors/lritemeditorwidget.h b/limereport/items/editors/lritemeditorwidget.h index 7bf2404..733eac0 100644 --- a/limereport/items/editors/lritemeditorwidget.h +++ b/limereport/items/editors/lritemeditorwidget.h @@ -32,7 +32,7 @@ #include -#ifdef IS_REPORT_DESIGNER +#ifdef HAVE_REPORT_DESIGNER #include "lrreportdesignwidget.h" #endif #include "lrpagedesignintf.h" @@ -45,33 +45,16 @@ class ItemEditorWidget : public QToolBar public: explicit ItemEditorWidget(const QString &title, QWidget *parent = 0) : QToolBar(title, parent), m_item(0){} -//#ifdef IS_REPORT_DESIGNER -// explicit ItemEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); -// explicit ItemEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); -//#endif -// explicit ItemEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); -// explicit ItemEditorWidget(PageDesignIntf* page, QWidget *parent = 0); void setItem(BaseDesignIntf *item); -//#ifdef IS_REPORT_DESIGNER -// void setReportEditor(ReportDesignWidget* editor){m_reportEditor = editor;} -//#endif protected: virtual void setItemEvent(BaseDesignIntf*){} virtual void properyChangedEvent(const QString& propertName, const QVariant& oldValue, const QVariant& newValue); BaseDesignIntf* item(){return m_item;} -//#ifdef IS_REPORT_DESIGNER -// ReportDesignWidget* reportEditor(){return m_reportEditor;} -//#endif -// PageDesignIntf* page(){return m_page;} private slots: void slotItemDestroyed(QObject* item); void slotPropertyChanged(const QString& propertName, const QVariant& oldValue, const QVariant& newValue); private: -//#ifdef IS_REPORT_DESIGNER -// ReportDesignWidget* m_reportEditor; -//#endif BaseDesignIntf* m_item; -// PageDesignIntf* m_page; }; } // namespace LimeReport diff --git a/limereport/items/editors/lritemsborderseditorwidget.cpp b/limereport/items/editors/lritemsborderseditorwidget.cpp index 2a2f771..44cc897 100644 --- a/limereport/items/editors/lritemsborderseditorwidget.cpp +++ b/limereport/items/editors/lritemsborderseditorwidget.cpp @@ -31,19 +31,7 @@ #include namespace LimeReport{ -//#ifdef IS_REPORT_DESIGNER -//ItemsBordersEditorWidget::ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, const QString& title, QWidget* parent) -// : ItemEditorWidget(reportEditor,title,parent), m_changing(false) -//{ -// initEditor(); -//} -//ItemsBordersEditorWidget::ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, QWidget* parent) -// : ItemEditorWidget(reportEditor,parent), m_changing(false) -//{ -// initEditor(); -//} -//#endif void ItemsBordersEditorWidget::setItemEvent(BaseDesignIntf* item) { QVariant borders=item->property("borders"); @@ -65,10 +53,6 @@ void ItemsBordersEditorWidget::properyChangedEvent(const QString& property, cons void ItemsBordersEditorWidget::noBordesClicked() { -//#ifdef IS_REPORT_DESIGNER -// if (reportEditor()) -// reportEditor()->setBorders(0); -//#endif updateValues(0); } @@ -80,10 +64,6 @@ void ItemsBordersEditorWidget::allBordesClicked() BaseDesignIntf::BottomLine; updateValues((BaseDesignIntf::BorderLines)borders); -//#ifdef IS_REPORT_DESIGNER -// if (reportEditor()) -// reportEditor()->setBorders((BaseDesignIntf::BorderLines)borders); -//#endif } void ItemsBordersEditorWidget::buttonClicked(bool) @@ -159,7 +139,7 @@ bool ItemsBordersEditorWidget::changing() const return m_changing; } -#ifdef IS_REPORT_DESIGNER +#ifdef HAVE_REPORT_DESIGNER void ItemsBordersEditorWidgetForDesigner::buttonClicked(bool) { if (!changing()) diff --git a/limereport/items/editors/lritemsborderseditorwidget.h b/limereport/items/editors/lritemsborderseditorwidget.h index ff10d14..998251c 100644 --- a/limereport/items/editors/lritemsborderseditorwidget.h +++ b/limereport/items/editors/lritemsborderseditorwidget.h @@ -36,8 +36,6 @@ namespace LimeReport{ - - class ItemsBordersEditorWidget : public ItemEditorWidget { Q_OBJECT @@ -46,10 +44,6 @@ public: : ItemEditorWidget(title, parent), m_changing(false), m_borders(0){ initEditor(); } -//#ifdef IS_REPORT_DESIGNER -// explicit ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); -// explicit ItemsBordersEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); -//#endif bool changing() const; protected slots: virtual void noBordesClicked(); @@ -72,8 +66,7 @@ private: int m_borders; }; - -#ifdef IS_REPORT_DESIGNER +#ifdef HAVE_REPORT_DESIGNER class ItemsBordersEditorWidgetForDesigner : public ItemsBordersEditorWidget{ Q_OBJECT public: diff --git a/limereport/items/editors/lrtextalignmenteditorwidget.cpp b/limereport/items/editors/lrtextalignmenteditorwidget.cpp index 3ba282d..6fd833b 100644 --- a/limereport/items/editors/lrtextalignmenteditorwidget.cpp +++ b/limereport/items/editors/lrtextalignmenteditorwidget.cpp @@ -36,31 +36,6 @@ TextAlignmentEditorWidget::TextAlignmentEditorWidget(const QString& title, QWidg initEditor(); } -//#ifdef IS_REPORT_DESIGNER -//TextAlignmentEditorWidget::TextAlignmentEditorWidget(ReportDesignWidget *reportEditor, const QString &title, QWidget *parent) -// :ItemEditorWidget(reportEditor,title,parent), m_textAttibutesIsChanging(false) -//{ -// initEditor(); -//} - -//TextAlignmentEditorWidget::TextAlignmentEditorWidget(ReportDesignWidget *reportEditor, QWidget *parent) -// :ItemEditorWidget(reportEditor,parent), m_textAttibutesIsChanging(false) -//{ -// initEditor(); -//} -//#endif -//TextAlignmentEditorWidget::TextAlignmentEditorWidget(PageDesignIntf* page, const QString& title, QWidget* parent) -// :ItemEditorWidget(page,title,parent), m_textAttibutesIsChanging(false) -//{ -// initEditor(); -//} - -//TextAlignmentEditorWidget::TextAlignmentEditorWidget(PageDesignIntf* page, QWidget* parent) -// :ItemEditorWidget(page,parent), m_textAttibutesIsChanging(false) -//{ -// initEditor(); -//} - void TextAlignmentEditorWidget::setItemEvent(BaseDesignIntf *item) { QVariant align=item->property("alignment"); @@ -115,16 +90,6 @@ void TextAlignmentEditorWidget::initEditor() m_textAliginBottom->setCheckable(true); connect(m_textAliginBottom,SIGNAL(toggled(bool)),this,SLOT(slotTextVAttribsChanged(bool))); addAction(m_textAliginBottom); -//#ifdef IS_REPORT_DESIGNER -// if (reportEditor()){ -// connect(reportEditor(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), -// this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); -// } -//#endif -// if (page()){ -// connect(page(),SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), -// this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); -// } setEnabled(false); } @@ -169,13 +134,6 @@ void TextAlignmentEditorWidget::slotTextHAttribsChanged(bool) if (sender()==m_textAliginHCenter) m_flag |= Qt::AlignHCenter; if (sender()==m_textAliginRight) m_flag |= Qt::AlignRight; if (sender()==m_textAliginJustify) m_flag |= Qt::AlignJustify; -//#ifdef IS_REPORT_DESIGNER -// if (reportEditor()) reportEditor()->setTextAlign(true,Qt::AlignmentFlag(flag)); -//#endif -// if (page()) { -// //page()->setTextAlign(createAlignment()); -// page()->changeSelectedGrpoupTextAlignPropperty(true,Qt::AlignmentFlag(flag)); -// } m_textAttibutesIsChanging = false; } @@ -192,10 +150,6 @@ void TextAlignmentEditorWidget::slotTextVAttribsChanged(bool) if (sender()==m_textAliginTop) m_flag |= Qt::AlignTop; if (sender()==m_textAliginVCenter) m_flag |= Qt::AlignVCenter; if (sender()==m_textAliginBottom) m_flag |= Qt::AlignBottom; -//#ifdef IS_REPORT_DESIGNER -// if (reportEditor()) reportEditor()->setTextAlign(false,Qt::AlignmentFlag(flag)); -//#endif -// if (page()) page()->changeSelectedGrpoupTextAlignPropperty(false,Qt::AlignmentFlag(flag) ); m_textAttibutesIsChanging = false; } @@ -240,7 +194,7 @@ void TextAlignmentEditorWidgetForPage::slotTextVAttribsChanged(bool value) m_textAttibutesIsChanging = false; } -#ifdef IS_REPORT_DESIGNER +#ifdef HAVE_REPORT_DESIGNER void TextAlignmentEditorWidgetForDesigner::initEditor() { TextAlignmentEditorWidget::initEditor(); diff --git a/limereport/items/editors/lrtextalignmenteditorwidget.h b/limereport/items/editors/lrtextalignmenteditorwidget.h index 0934406..97f13f5 100644 --- a/limereport/items/editors/lrtextalignmenteditorwidget.h +++ b/limereport/items/editors/lrtextalignmenteditorwidget.h @@ -42,12 +42,6 @@ class TextAlignmentEditorWidget:public ItemEditorWidget Q_OBJECT public: explicit TextAlignmentEditorWidget(const QString &title, QWidget *parent = 0); -//#ifdef IS_REPORT_DESIGNER -// explicit TextAlignmentEditorWidget(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0); -// explicit TextAlignmentEditorWidget(ReportDesignWidget* reportEditor, QWidget *parent = 0); -//#endif -// explicit TextAlignmentEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); -// explicit TextAlignmentEditorWidget(PageDesignIntf* page, QWidget *parent = 0); int flag() const; protected: void setItemEvent(BaseDesignIntf *item); @@ -68,9 +62,7 @@ private: QAction* m_textAliginTop; QAction* m_textAliginBottom; QAction* m_textAliginVCenter; - int m_flag; - }; class TextAlignmentEditorWidgetForPage: public TextAlignmentEditorWidget{ @@ -87,7 +79,7 @@ private: PageDesignIntf* m_page; }; -#ifdef IS_REPORT_DESIGNER +#ifdef HAVE_REPORT_DESIGNER class TextAlignmentEditorWidgetForDesigner: public TextAlignmentEditorWidget{ Q_OBJECT public: diff --git a/limereport/limereport.pri b/limereport/limereport.pri index cf9c5af..92b2ac7 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -1,8 +1,10 @@ include(../common.pri) -#contains(CONFIG,dialogdesigner){ -# include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) -#} +contains(CONFIG, embedded_designer){ + contains(CONFIG,dialogdesigner){ + include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) + } +} DEFINES += INSPECT_BASEDESIGN @@ -11,10 +13,11 @@ INCLUDEPATH += \ $$REPORT_PATH/items \ $$REPORT_PATH/bands \ $$REPORT_PATH/base \ -# $$REPORT_PATH/objectinspector \ -# $$REPORT_PATH/databrowser \ $$REPORT_PATH/scripteditor -# $$REPORT_PATH/../designer_plugin +contains(CONFIG, embedded_designer){ + INCLUDEPATH += $$REPORT_PATH/objectinspector \ + $$REPORT_PATH/databrowser +} SOURCES += \ $$REPORT_PATH/bands/lrpageheader.cpp \ @@ -25,59 +28,23 @@ SOURCES += \ $$REPORT_PATH/bands/lrgroupbands.cpp \ $$REPORT_PATH/bands/lrsubdetailband.cpp \ $$REPORT_PATH/bands/lrtearoffband.cpp \ -# $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ -# $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ -# $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ -# $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ -# $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ $$REPORT_PATH/serializators/lrxmlreader.cpp \ $$REPORT_PATH/serializators/lrxmlwriter.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ -# $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.cpp \ -# $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ -# $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ -# $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ -# $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.cpp \ -# $$REPORT_PATH/objectinspector/editors/lrfonteditor.cpp \ -# $$REPORT_PATH/objectinspector/editors/lrimageeditor.cpp \ -# $$REPORT_PATH/objectinspector/editors/lrcoloreditor.cpp \ -# $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.cpp \ -# $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.cpp \ -# $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ -# $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ -# $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ -# $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ -# $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ $$REPORT_PATH/scripteditor/lrscripteditor.cpp \ $$REPORT_PATH/scripteditor/lrcodeeditor.cpp \ $$REPORT_PATH/scripteditor/lrscripthighlighter.cpp \ -# $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ -# $$REPORT_PATH/items/lralignpropitem.cpp \ $$REPORT_PATH/items/lrhorizontallayout.cpp \ $$REPORT_PATH/items/editors/lritemeditorwidget.cpp \ $$REPORT_PATH/items/editors/lrfonteditorwidget.cpp \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ -# $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ -# $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ + $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ $$REPORT_PATH/items/lrsimpletagparser.cpp \ $$REPORT_PATH/items/lrimageitem.cpp \ $$REPORT_PATH/items/lrtextitemeditor.cpp \ $$REPORT_PATH/items/lrshapeitem.cpp \ $$REPORT_PATH/items/lrtextitem.cpp \ -# $$REPORT_PATH/translationeditor/translationeditor.cpp \ $$REPORT_PATH/lrbanddesignintf.cpp \ $$REPORT_PATH/lrpageitemdesignintf.cpp \ $$REPORT_PATH/lrpagedesignintf.cpp \ @@ -85,11 +52,9 @@ SOURCES += \ $$REPORT_PATH/lrglobal.cpp \ $$REPORT_PATH/lritemdesignintf.cpp \ $$REPORT_PATH/lrdatadesignintf.cpp \ -# $$REPORT_PATH/lrreportdesignwidget.cpp \ $$REPORT_PATH/lrbasedesignintf.cpp \ $$REPORT_PATH/lrreportengine.cpp \ $$REPORT_PATH/lrdatasourcemanager.cpp \ -# $$REPORT_PATH/lrreportdesignwindow.cpp \ $$REPORT_PATH/lrreportrender.cpp \ $$REPORT_PATH/lrscriptenginemanager.cpp \ $$REPORT_PATH/lrpreviewreportwindow.cpp \ @@ -97,16 +62,58 @@ SOURCES += \ $$REPORT_PATH/lrgraphicsviewzoom.cpp \ $$REPORT_PATH/lrvariablesholder.cpp \ $$REPORT_PATH/lrgroupfunctions.cpp \ - $$REPORT_PATH/lrsimplecrypt.cpp \ + $$REPORT_PATH/lrsimplecrypt.cpp \ $$REPORT_PATH/lraboutdialog.cpp \ $$REPORT_PATH/lrsettingdialog.cpp \ $$REPORT_PATH/lritemscontainerdesignitf.cpp \ $$REPORT_PATH/lrcolorindicator.cpp \ $$REPORT_PATH/items/lrchartitem.cpp \ $$REPORT_PATH/items/lrchartitemeditor.cpp \ - $$REPORT_PATH/lrreporttranslation.cpp \ -# $$REPORT_PATH/translationeditor/languageselectdialog.cpp - + $$REPORT_PATH/lrreporttranslation.cpp + +contains(CONFIG, embedded_designer){ +SOURCES += \ + $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ + $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ + $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ + $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ + $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.cpp \ + $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrfonteditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrimageeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcoloreditor.cpp \ + $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.cpp \ + $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.cpp \ + $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ + $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ + $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ + $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ + $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ + $$REPORT_PATH/items/lralignpropitem.cpp \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ + $$REPORT_PATH/translationeditor/translationeditor.cpp \ + $$REPORT_PATH/translationeditor/languageselectdialog.cpp \ + $$REPORT_PATH/lrreportdesignwidget.cpp \ + $$REPORT_PATH/lrreportdesignwindow.cpp +} + contains(CONFIG, staticlib){ SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp } @@ -127,11 +134,6 @@ HEADERS += \ $$REPORT_PATH/bands/lrtearoffband.h \ $$REPORT_PATH/bands/lrsubdetailband.h \ $$REPORT_PATH/bands/lrgroupbands.h \ -# $$REPORT_PATH/databrowser/lrdatabrowser.h \ -# $$REPORT_PATH/databrowser/lrsqleditdialog.h \ -# $$REPORT_PATH/databrowser/lrconnectiondialog.h \ -# $$REPORT_PATH/databrowser/lrvariabledialog.h \ -# $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ $$REPORT_PATH/serializators/lrserializatorintf.h \ $$REPORT_PATH/serializators/lrstorageintf.h \ $$REPORT_PATH/serializators/lrxmlqrectserializator.h \ @@ -139,51 +141,17 @@ HEADERS += \ $$REPORT_PATH/serializators/lrxmlbasetypesserializators.h \ $$REPORT_PATH/serializators/lrxmlreader.h \ $$REPORT_PATH/serializators/lrxmlwriter.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ -# $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ -# $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ -# $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ -# $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ -# $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.h \ -# $$REPORT_PATH/objectinspector/editors/lrimageeditor.h \ -# $$REPORT_PATH/objectinspector/editors/lrcoloreditor.h \ -# $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ -# $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.h \ -# $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.h \ -# $$REPORT_PATH/objectinspector/lrobjectitemmodel.h \ -# $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ -# $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ -# $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ -# $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ $$REPORT_PATH/scripteditor/lrscripteditor.h \ $$REPORT_PATH/scripteditor/lrcodeeditor.h \ $$REPORT_PATH/scripteditor/lrscripthighlighter.h \ $$REPORT_PATH/items/editors/lritemeditorwidget.h \ $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ - $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ -# $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ -# $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ $$REPORT_PATH/items/lrtextitem.h \ -# $$REPORT_PATH/items/lrsubitemparentpropitem.h \ -# $$REPORT_PATH/items/lralignpropitem.h \ $$REPORT_PATH/items/lrhorizontallayout.h \ $$REPORT_PATH/items/lrtextitemeditor.h \ $$REPORT_PATH/items/lrshapeitem.h \ $$REPORT_PATH/items/lrimageitem.h \ $$REPORT_PATH/items/lrsimpletagparser.h \ -# $$REPORT_PATH/translationeditor/translationeditor.h \ - $$REPORT_PATH/lrfactoryinitializer.h \ $$REPORT_PATH/lrbanddesignintf.h \ $$REPORT_PATH/lrpageitemdesignintf.h \ $$REPORT_PATH/lrbandsmanager.h \ @@ -191,10 +159,8 @@ HEADERS += \ $$REPORT_PATH/lrdatadesignintf.h \ $$REPORT_PATH/lrcollection.h \ $$REPORT_PATH/lrpagedesignintf.h \ -# $$REPORT_PATH/lrreportdesignwidget.h \ $$REPORT_PATH/lrreportengine_p.h \ - $$REPORT_PATH/lrdatasourcemanager.h \ -# $$REPORT_PATH/lrreportdesignwindow.h \ + $$REPORT_PATH/lrdatasourcemanager.h \ $$REPORT_PATH/lrreportrender.h \ $$REPORT_PATH/lrpreviewreportwindow.h \ $$REPORT_PATH/lrpreviewreportwidget.h \ @@ -209,7 +175,7 @@ HEADERS += \ $$REPORT_PATH/lrreportengine.h \ $$REPORT_PATH/lrdatasourcemanagerintf.h \ $$REPORT_PATH/lrscriptenginemanagerintf.h \ - $$REPORT_PATH/lrsimplecrypt.h \ + $$REPORT_PATH/lrsimplecrypt.h \ $$REPORT_PATH/lraboutdialog.h \ $$REPORT_PATH/lrcallbackdatasourceintf.h \ $$REPORT_PATH/lrsettingdialog.h \ @@ -217,10 +183,55 @@ HEADERS += \ $$REPORT_PATH/lritemscontainerdesignitf.h \ $$REPORT_PATH/lrcolorindicator.h \ $$REPORT_PATH/items/lrchartitem.h \ - $$REPORT_PATH/items/lrchartitemeditor.h -# $$REPORT_PATH/lrreporttranslation.h \ -# $$REPORT_PATH/translationeditor/languageselectdialog.h - + $$REPORT_PATH/items/lrchartitemeditor.h \ + $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ + $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ + $$REPORT_PATH/lrreporttranslation.h \ + $$REPORT_PATH/lrreportdesignwindowintrerface.h + +contains(CONFIG, embedded_designer){ +HEADERS += \ + $$REPORT_PATH/databrowser/lrdatabrowser.h \ + $$REPORT_PATH/databrowser/lrsqleditdialog.h \ + $$REPORT_PATH/databrowser/lrconnectiondialog.h \ + $$REPORT_PATH/databrowser/lrvariabledialog.h \ + $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ + $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrimageeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcoloreditor.h \ + $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ + $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.h \ + $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.h \ + $$REPORT_PATH/objectinspector/lrobjectitemmodel.h \ + $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ + $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ + $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ + $$REPORT_PATH/translationeditor/translationeditor.h \ + $$REPORT_PATH/translationeditor/languageselectdialog.h \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ + $$REPORT_PATH/items/lrsubitemparentpropitem.h \ + $$REPORT_PATH/items/lralignpropitem.h \ + $$REPORT_PATH/lrreportdesignwidget.h \ + $$REPORT_PATH/lrreportdesignwindow.h +} + contains(CONFIG, staticlib){ HEADERS += $$REPORT_PATH/lrfactoryinitializer.h } @@ -230,26 +241,32 @@ contains(CONFIG,zint){ } FORMS += \ -# $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ -# $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ -# $$REPORT_PATH/databrowser/lrdatabrowser.ui \ -# $$REPORT_PATH/databrowser/lrvariabledialog.ui \ -# $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ $$REPORT_PATH/lrpreviewreportwindow.ui \ $$REPORT_PATH/lrpreviewreportwidget.ui \ $$REPORT_PATH/items/lrtextitemeditor.ui \ $$REPORT_PATH/lraboutdialog.ui \ $$REPORT_PATH/lrsettingdialog.ui \ -# $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ $$REPORT_PATH/items/lrchartitemeditor.ui \ -# $$REPORT_PATH/translationeditor/translationeditor.ui \ -# $$REPORT_PATH/translationeditor/languageselectdialog.ui \ $$REPORT_PATH/scripteditor/lrscripteditor.ui +contains(CONFIG, embedded_designer){ +FORMS += \ + $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ + $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ + $$REPORT_PATH/databrowser/lrdatabrowser.ui \ + $$REPORT_PATH/databrowser/lrvariabledialog.ui \ + $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ + $$REPORT_PATH/translationeditor/translationeditor.ui \ + $$REPORT_PATH/translationeditor/languageselectdialog.ui +} RESOURCES += \ -# $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ -# $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ $$REPORT_PATH/report.qrc \ $$REPORT_PATH/items/items.qrc -# $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \ -# $$REPORT_PATH/translationeditor/translationeditor.qrc +contains(CONFIG, embedded_designer){ +RESOURCES += \ + $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ + $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \ + $$REPORT_PATH/translationeditor/translationeditor.qrc +} diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 815fc72..75bca99 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -28,7 +28,7 @@ DEFINES += LIMEREPORT_EXPORTS contains(CONFIG, staticlib){ DEFINES += HAVE_STATIC_BUILD - message(STATIC_BUILD) + message(Static Build) DEFINES -= LIMEREPORT_EXPORTS } @@ -39,7 +39,8 @@ EXTRA_FILES += \ $$PWD/lrreportengine.h \ $$PWD/lrscriptenginemanagerintf.h \ $$PWD/lrcallbackdatasourceintf.h \ - $$PWD/lrpreviewreportwidget.h + $$PWD/lrpreviewreportwidget.h \ + $$PWD/lrreportdesignwindowintrerface.h include(limereport.pri) diff --git a/limereport/lrdesignerplugininterface.h b/limereport/lrdesignerplugininterface.h index b5b80a2..1587c39 100644 --- a/limereport/lrdesignerplugininterface.h +++ b/limereport/lrdesignerplugininterface.h @@ -5,6 +5,7 @@ #include #include +#include "lrreportdesignwindowintrerface.h" QT_BEGIN_NAMESPACE class QSettings; @@ -19,10 +20,7 @@ namespace LimeReport { class LimeReportPluginInterface { public: virtual ~LimeReportPluginInterface() { } - - virtual QString getString() const = 0; - virtual QVariant getVar() const = 0; - virtual QMainWindow* getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget *parent = 0, QSettings* settings=0) = 0; + virtual LimeReport::ReportDesignWindowInterface* getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget *parent = 0, QSettings* settings=0) = 0; }; Q_DECLARE_INTERFACE( LimeReportPluginInterface, "ru.limereport.LimeReport.DesignerPluginInterface/1.0" ) diff --git a/limereport/lrfactoryinitializer.cpp b/limereport/lrfactoryinitializer.cpp index 5aef43a..ef5eb18 100644 --- a/limereport/lrfactoryinitializer.cpp +++ b/limereport/lrfactoryinitializer.cpp @@ -15,9 +15,10 @@ #include "items/lrhorizontallayout.h" #include "items/lrimageitem.h" #include "items/lrshapeitem.h" +#include "items/lrchartitem.h" #include "lrdesignelementsfactory.h" - +#ifdef HAVE_REPORT_DESIGNER #include "objectinspector/lrobjectpropitem.h" #include "objectinspector/propertyItems/lrboolpropitem.h" #include "objectinspector/propertyItems/lrcolorpropitem.h" @@ -34,6 +35,7 @@ #include "objectinspector/propertyItems/lrstringpropitem.h" #include "items/lralignpropitem.h" #include "items/lrsubitemparentpropitem.h" +#endif #include "serializators/lrxmlbasetypesserializators.h" #include "serializators/lrxmlqrectserializator.h" @@ -41,10 +43,13 @@ void initResources(){ Q_INIT_RESOURCE(report); +#ifdef HAVE_REPORT_DESIGNER Q_INIT_RESOURCE(lobjectinspector); Q_INIT_RESOURCE(lrdatabrowser); Q_INIT_RESOURCE(items); Q_INIT_RESOURCE(lrscriptbrowser); + Q_INIT_RESOURCE(translationeditor); +#endif } namespace LimeReport{ @@ -106,14 +111,18 @@ BaseDesignIntf* createHLayout(QObject *owner, LimeReport::BaseDesignIntf *paren return new HorizontalLayout(owner, parent); } -BaseDesignIntf * createImageItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ +BaseDesignIntf* createImageItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ return new ImageItem(owner,parent); } -BaseDesignIntf * createShapeItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ +BaseDesignIntf* createShapeItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ return new ShapeItem(owner,parent); } +BaseDesignIntf* createChartItem(QObject* owner, LimeReport::BaseDesignIntf* parent){ + return new ChartItem(owner,parent); +} + void initReportItems(){ initResources(); DesignElementsFactory::instance().registerCreator( @@ -139,6 +148,9 @@ void initReportItems(){ DesignElementsFactory::instance().registerCreator( "ShapeItem", LimeReport::ItemAttribs(QObject::tr("Shape Item"),"Item"), createShapeItem ); + DesignElementsFactory::instance().registerCreator( + "ChartItem", LimeReport::ItemAttribs(QObject::tr("Chart Item"),"Item"), createChartItem + ); DesignElementsFactory::instance().registerCreator( "Data", LimeReport::ItemAttribs(QObject::tr("Data"),LimeReport::Const::bandTAG), @@ -198,6 +210,8 @@ void initReportItems(){ } +#ifdef HAVE_REPORT_DESIGNER + ObjectPropItem * createBoolPropItem( QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) { @@ -360,7 +374,7 @@ void initObjectInspectorProperties() ); } - +#endif SerializatorIntf * createIntSerializator(QDomDocument *doc, QDomElement *node){ return new LimeReport::XmlIntSerializator(doc,node); } diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index b0ca4be..98ad4b9 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -63,7 +63,7 @@ namespace LimeReport{ ReportDesignWindow* ReportDesignWindow::m_instance=0; ReportDesignWindow::ReportDesignWindow(ReportEnginePrivateInterface* report, QWidget *parent, QSettings* settings) : - QMainWindow(parent), m_textAttibutesIsChanging(false), m_settings(settings), m_ownedSettings(false), + ReportDesignWindowInterface(parent), m_textAttibutesIsChanging(false), m_settings(settings), m_ownedSettings(false), m_progressDialog(0), m_showProgressDialog(true), m_editorTabType(ReportDesignWidget::Page), m_reportItemIsLocked(false) { initReportEditor(report); diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index ef435f6..1abfcd8 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -43,6 +43,7 @@ #include "items/editors/lritemsaligneditorwidget.h" #include "items/editors/lritemsborderseditorwidget.h" #include "lrobjectitemmodel.h" +#include "lrreportdesignwindowintrerface.h" namespace LimeReport{ @@ -55,7 +56,7 @@ class BaseDesignIntf; class PageDesignIntf; class ObjectBrowser; -class ReportDesignWindow : public QMainWindow +class ReportDesignWindow : public ReportDesignWindowInterface { Q_OBJECT public: diff --git a/limereport/lrreportdesignwindowintrerface.h b/limereport/lrreportdesignwindowintrerface.h new file mode 100644 index 0000000..858881e --- /dev/null +++ b/limereport/lrreportdesignwindowintrerface.h @@ -0,0 +1,23 @@ +#ifndef LRREPORTDESIGNWINDOWINTRERFACE_H +#define LRREPORTDESIGNWINDOWINTRERFACE_H + +#include +#include + +namespace LimeReport { + +class ReportDesignWindowInterface: public QMainWindow{ +public: + ReportDesignWindowInterface(QWidget* parent = 0): QMainWindow(parent){} + virtual bool checkNeedToSave() = 0; + virtual void showModal() = 0; + virtual void showNonModal() = 0; + virtual void setSettings(QSettings* value) = 0; + virtual QSettings* settings() = 0; + virtual void restoreSetting() = 0; + virtual void setShowProgressDialog(bool value) = 0; +}; + +} // namespace LimeReport + +#endif // LRREPORTDESIGNWINDOWINTRERFACE_H diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 500223a..41c3f41 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -43,9 +43,11 @@ #include "lrpagedesignintf.h" #include "lrdatasourcemanager.h" -//#include "lrdatabrowser.h" -//#include "lrreportdesignwindow.h" +#ifdef HAVE_REPORT_DESIGNER +#include "lrdatabrowser.h" +#include "lrreportdesignwindow.h" +#endif #include "serializators/lrxmlwriter.h" #include "serializators/lrxmlreader.h" @@ -73,7 +75,9 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : #ifdef HAVE_STATIC_BUILD initResources(); initReportItems(); +#ifdef HAVE_REPORT_DESIGNER initObjectInspectorProperties(); +#endif initSerializators(); #endif m_datasources = new DataSourceManager(this); @@ -88,26 +92,19 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &))); - QDir pluginsDir( "../lib" ); - foreach( const QString& pluginName, pluginsDir.entryList( QDir::Files ) ) { - qDebug() << "==============================================================================="; - qDebug() << "Found:" << pluginName; + QDir pluginsDir( "./lib" ); + if (!pluginsDir.exists()){ + pluginsDir.setPath("../lib"); + } + foreach( const QString& pluginName, pluginsDir.entryList( QDir::Files ) ) { QPluginLoader loader( pluginsDir.absoluteFilePath( pluginName ) ); if( loader.load() ) { if( LimeReportPluginInterface* myPlugin = qobject_cast< LimeReportPluginInterface* >( loader.instance() ) ) { - qDebug() << "Testing: \n" << - "(1)" << myPlugin->getString() << "\n" << - "(2)" << myPlugin->getVar(); m_designerFactory = myPlugin; + break; } - //loader.unload(); - } else { - qDebug() << "Failed to load :("; - qDebug() << loader.errorString(); } - - qDebug() << ""; } } @@ -513,6 +510,29 @@ void ReportEnginePrivate::previewReport(PreviewHints hints) } } +ReportDesignWindowInterface*ReportEnginePrivate::getDesignerWindow() +{ + if (!m_designerWindow) { + if (m_designerFactory){ + m_designerWindow = m_designerFactory->getDesignerWindow(this,QApplication::activeWindow(),settings()); + m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); + m_designerWindow->setWindowIcon(QIcon(":report/images/logo32")); + m_designerWindow->setShowProgressDialog(m_showProgressDialog); + } else { +#ifdef HAVE_REPORT_DESIGNER + m_designerWindow = new LimeReport::ReportDesignWindow(this,QApplication::activeWindow(),settings()); + m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); + m_designerWindow->setWindowIcon(QIcon(":report/images/logo32")); + m_designerWindow->setShowProgressDialog(m_showProgressDialog); +#endif + } + } + if (m_designerWindow){ + m_datasources->updateDatasourceModel(); + } + return m_designerWindow; +} + PreviewReportWidget* ReportEnginePrivate::createPreviewWidget(QWidget* parent){ Q_Q(ReportEngine); @@ -645,33 +665,19 @@ PageDesignIntf* ReportEngine::createPreviewScene(QObject* parent){ void ReportEnginePrivate::designReport() { - if (!m_designerWindow) { -// Q_Q(ReportEngine); - if (m_designerFactory){ - settings()->beginGroup("DesignerWindow"); - settings()->setValue("showProgressDialog",m_showProgressDialog); - settings()->endGroup(); - m_designerWindow = m_designerFactory->getDesignerWindow(this,QApplication::activeWindow(),settings()); - //m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); - //m_designerWindow->setWindowIcon(QIcon(":report/images/logo32")); - //m_designerWindow->setShowProgressDialog(m_showProgressDialog); - } else { - //m_designerWindow = new LimeReport::ReportDesignWindow(this,QApplication::activeWindow(),settings()); - //m_designerWindow->setAttribute(Qt::WA_DeleteOnClose,true); - //m_designerWindow->setWindowIcon(QIcon(":report/images/logo32")); - //m_designerWindow->setShowProgressDialog(m_showProgressDialog); - } - } - m_datasources->updateDatasourceModel(); + ReportDesignWindowInterface* designerWindow = getDesignerWindow(); + if (designerWindow){ #ifdef Q_OS_WIN - m_designerWindow->setWindowModality(Qt::ApplicationModal); + designerWindow->setWindowModality(Qt::ApplicationModal); #endif -// if (QApplication::activeWindow()==0){ -// m_designerWindow->show();; -// } else { -// m_designerWindow->showModal(); -// } - m_designerWindow->show(); + if (QApplication::activeWindow()==0){ + designerWindow->show();; + } else { + designerWindow->showModal(); + } + } else { + qDebug()<<(tr("Designer not found!")); + } } void ReportEnginePrivate::setSettings(QSettings* value) @@ -1127,6 +1133,12 @@ void ReportEngine::designReport() d->designReport(); } +ReportDesignWindowInterface*ReportEngine::getDesignerWindow() +{ + Q_D(ReportEngine); + return d->getDesignerWindow(); +} + PreviewReportWidget* ReportEngine::createPreviewWidget(QWidget *parent) { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 444d2f4..03b5d91 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -39,6 +39,7 @@ #include "lrdatasourcemanagerintf.h" #include "lrscriptenginemanagerintf.h" #include "lrpreviewreportwidget.h" +#include "lrreportdesignwindowintrerface.h" class QPrinter; @@ -85,6 +86,7 @@ public: bool printToPDF(const QString& fileName); void previewReport(PreviewHints hints = PreviewBarsUserSetting); void designReport(); + ReportDesignWindowInterface* getDesignerWindow(); void setShowProgressDialog(bool value); IDataSourceManager* dataManager(); IScriptEngineManager* scriptManager(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 0dba7ad..4bf57cd 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -43,6 +43,7 @@ #include "lrscriptenginemanager.h" #include "lrreporttranslation.h" #include "lrdesignerplugininterface.h" +#include "lrreportdesignwindowintrerface.h" class QFileSystemWatcher; @@ -128,6 +129,8 @@ public: void printToFile(const QString& fileName); bool printToPDF(const QString& fileName); void previewReport(PreviewHints hints = PreviewBarsUserSetting); + + ReportDesignWindowInterface* getDesignerWindow(); void designReport(); void setSettings(QSettings* value); void setShowProgressDialog(bool value){m_showProgressDialog = value;} @@ -229,7 +232,7 @@ private: QMainWindow* m_activePreview; QIcon m_previewWindowIcon; QString m_previewWindowTitle; - QPointer m_designerWindow; + QPointer m_designerWindow; ReportSettings m_reportSettings; bool m_reportRendering; bool m_resultIsEditable; From ff55e10e9d8fdca4c387cc9648367711e5265241 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 30 Nov 2017 21:23:11 +0300 Subject: [PATCH 090/347] windows build fixed --- designer_plugin/lrdesignerplugin.cpp | 2 +- designer_plugin/lrdesignerplugin.h | 2 ++ include/lrreportdesignwindowintrerface.h | 23 +++++++++++++++++++ limereport/databrowser/lrdatabrowser.cpp | 2 +- limereport/databrowser/lrsqleditdialog.cpp | 2 +- limereport/items/lrtextitem.cpp | 1 - limereport/items/lrtextitemeditor.cpp | 2 +- limereport/lrpreviewreportwindow.cpp | 2 +- limereport/lrreportengine.cpp | 8 +++++-- limereport/lrreportrender.cpp | 3 +-- .../propertyItems/lrflagspropitem.cpp | 1 - 11 files changed, 37 insertions(+), 11 deletions(-) create mode 100644 include/lrreportdesignwindowintrerface.h diff --git a/designer_plugin/lrdesignerplugin.cpp b/designer_plugin/lrdesignerplugin.cpp index e832213..96b6f4a 100644 --- a/designer_plugin/lrdesignerplugin.cpp +++ b/designer_plugin/lrdesignerplugin.cpp @@ -12,6 +12,6 @@ LimeReport::ReportDesignWindowInterface* ReportDesignerFactoryPlugin::getDesigne } #if QT_VERSION < 0x050000 -Q_EXPORT_PLUGIN2( LimeReportPluginInterface, DesignerFactoryPlugin ) +Q_EXPORT_PLUGIN2(LimeReportPluginInterface, ReportDesignerFactoryPlugin) #endif diff --git a/designer_plugin/lrdesignerplugin.h b/designer_plugin/lrdesignerplugin.h index 0a7b8f3..7f17491 100644 --- a/designer_plugin/lrdesignerplugin.h +++ b/designer_plugin/lrdesignerplugin.h @@ -6,7 +6,9 @@ class ReportDesignerFactoryPlugin : public QObject, public LimeReportPluginInterface { Q_OBJECT +#if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "ru.limereport.DersignerFactoryInterface") +#endif Q_INTERFACES( LimeReportPluginInterface ) public: diff --git a/include/lrreportdesignwindowintrerface.h b/include/lrreportdesignwindowintrerface.h new file mode 100644 index 0000000..858881e --- /dev/null +++ b/include/lrreportdesignwindowintrerface.h @@ -0,0 +1,23 @@ +#ifndef LRREPORTDESIGNWINDOWINTRERFACE_H +#define LRREPORTDESIGNWINDOWINTRERFACE_H + +#include +#include + +namespace LimeReport { + +class ReportDesignWindowInterface: public QMainWindow{ +public: + ReportDesignWindowInterface(QWidget* parent = 0): QMainWindow(parent){} + virtual bool checkNeedToSave() = 0; + virtual void showModal() = 0; + virtual void showNonModal() = 0; + virtual void setSettings(QSettings* value) = 0; + virtual QSettings* settings() = 0; + virtual void restoreSetting() = 0; + virtual void setShowProgressDialog(bool value) = 0; +}; + +} // namespace LimeReport + +#endif // LRREPORTDESIGNWINDOWINTRERFACE_H diff --git a/limereport/databrowser/lrdatabrowser.cpp b/limereport/databrowser/lrdatabrowser.cpp index 4452df1..3dcd795 100644 --- a/limereport/databrowser/lrdatabrowser.cpp +++ b/limereport/databrowser/lrdatabrowser.cpp @@ -277,7 +277,7 @@ QSettings *DataBrowser::settings() if (m_settings){ return m_settings; } else { - m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_settings = new QSettings("LimeReport",QCoreApplication::applicationName()); m_ownedSettings = true; return m_settings; } diff --git a/limereport/databrowser/lrsqleditdialog.cpp b/limereport/databrowser/lrsqleditdialog.cpp index 05e3267..f74ae6c 100644 --- a/limereport/databrowser/lrsqleditdialog.cpp +++ b/limereport/databrowser/lrsqleditdialog.cpp @@ -78,7 +78,7 @@ QSettings *SQLEditDialog::settings(){ if (m_settings){ return m_settings; } else { - m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_settings = new QSettings("LimeReport",QCoreApplication::applicationName()); m_ownedSettings = true; return m_settings; } diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 4689ebb..5750988 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -483,7 +483,6 @@ TextItem::TextPtr TextItem::textDocument() const QTextOption to; to.setAlignment(m_alignment); to.setTextDirection(m_textLayoutDirection); - //to.setTextDirection(QApplication::layoutDirection()); if (m_autoWidth!=MaxStringLength) if (m_adaptFontToSize && (!(m_autoHeight || m_autoWidth))) diff --git a/limereport/items/lrtextitemeditor.cpp b/limereport/items/lrtextitemeditor.cpp index 37ac44d..8b2e28b 100644 --- a/limereport/items/lrtextitemeditor.cpp +++ b/limereport/items/lrtextitemeditor.cpp @@ -76,7 +76,7 @@ QSettings*TextItemEditor::settings() if (m_settings){ return m_settings; } else { - m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_settings = new QSettings("LimeReport",QCoreApplication::applicationName()); m_ownedSettings = true; return m_settings; } diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 32b0b5d..02dd372 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -183,7 +183,7 @@ QSettings*PreviewReportWindow::settings() if (m_settings){ return m_settings; } else { - m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_settings = new QSettings("LimeReport",QCoreApplication::applicationName()); m_ownedSettings = true; return m_settings; } diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 41c3f41..f5acdfb 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -92,11 +92,15 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &))); - QDir pluginsDir( "./lib" ); + QDir pluginsDir = QCoreApplication::applicationDirPath(); + pluginsDir.cd("../lib" ); if (!pluginsDir.exists()){ - pluginsDir.setPath("../lib"); + pluginsDir.cd("./lib"); + if (!pluginsDir.exists()) pluginsDir.setPath(QCoreApplication::applicationDirPath()); } + qDebug()< #include -#include #include "lrglobal.h" #include "lrreportrender.h" @@ -411,7 +410,7 @@ void ReportRender::replaceGroupsFunction(BandDesignIntf *band) BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesignIntf* bandData, ReportRender::DataRenderMode mode, bool isLast) { - QApplication::processEvents(); + QCoreApplication::processEvents(); if (patternBand){ BandDesignIntf* bandClone = 0; diff --git a/limereport/objectinspector/propertyItems/lrflagspropitem.cpp b/limereport/objectinspector/propertyItems/lrflagspropitem.cpp index 5b56e85..784d2ac 100644 --- a/limereport/objectinspector/propertyItems/lrflagspropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrflagspropitem.cpp @@ -35,7 +35,6 @@ #include #include #include -#include #include #include From 7e1b3374fe6e4c1321a68e9879fd97e289e4ca57 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 30 Nov 2017 21:23:51 +0300 Subject: [PATCH 091/347] windows build fixed --- designer_plugin/designer_plugin.pro | 4 +- designer_plugin/limereport.pri | 61 ++++++++++++++++++++++-- limereport/items/lrchartitemeditor.cpp | 2 +- limereport/lrbasedesignintf.cpp | 2 - limereport/scripteditor/lrcodeeditor.cpp | 1 - 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/designer_plugin/designer_plugin.pro b/designer_plugin/designer_plugin.pro index 9c0ebcb..cfcbb39 100644 --- a/designer_plugin/designer_plugin.pro +++ b/designer_plugin/designer_plugin.pro @@ -3,9 +3,9 @@ include(limereport.pri) QT += core gui contains(CONFIG,release) { - TARGET = LRDesigner_plugin + TARGET = designer_plugin } else { - TARGET = LRDesigner_plugind + TARGET = designer_plugind } TEMPLATE = lib diff --git a/designer_plugin/limereport.pri b/designer_plugin/limereport.pri index 72b19ba..a03de48 100644 --- a/designer_plugin/limereport.pri +++ b/designer_plugin/limereport.pri @@ -80,7 +80,30 @@ SOURCES += \ $$REPORT_PATH/lritemscontainerdesignitf.cpp \ $$REPORT_PATH/lrcolorindicator.cpp \ $$REPORT_PATH/lrreporttranslation.cpp \ - $$REPORT_PATH/translationeditor/languageselectdialog.cpp + $$REPORT_PATH/translationeditor/languageselectdialog.cpp \ + $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ + $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ + $$REPORT_PATH/serializators/lrxmlreader.cpp \ + $$REPORT_PATH/serializators/lrxmlwriter.cpp \ + $$REPORT_PATH/bands/lrpageheader.cpp \ + $$REPORT_PATH/bands/lrpagefooter.cpp \ + $$REPORT_PATH/bands/lrreportheader.cpp \ + $$REPORT_PATH/bands/lrreportfooter.cpp \ + $$REPORT_PATH/bands/lrdataband.cpp \ + $$REPORT_PATH/bands/lrgroupbands.cpp \ + $$REPORT_PATH/bands/lrsubdetailband.cpp \ + $$REPORT_PATH/bands/lrtearoffband.cpp \ + $$REPORT_PATH/lrgraphicsviewzoom.cpp \ + $$REPORT_PATH/lrvariablesholder.cpp \ + $$REPORT_PATH/lrgroupfunctions.cpp \ + $$REPORT_PATH/lrsimplecrypt.cpp \ + $$REPORT_PATH/items/lrsimpletagparser.cpp \ + $$REPORT_PATH/items/lrtextitem.cpp \ + $$REPORT_PATH/items/lrtextitemeditor.cpp \ + $$REPORT_PATH/lrreportengine.cpp \ + $$REPORT_PATH/lrpreviewreportwindow.cpp \ + $$REPORT_PATH/lrpreviewreportwidget.cpp \ + $$REPORT_PATH/lrreportrender.cpp HEADERS += \ $$REPORT_PATH/base/lrsingleton.h \ @@ -127,6 +150,7 @@ HEADERS += \ $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ $$REPORT_PATH/items/lrtextitem.h \ + $$REPORT_PATH/items/lrtextitemeditor.h \ $$REPORT_PATH/items/lrsubitemparentpropitem.h \ $$REPORT_PATH/items/lralignpropitem.h \ $$REPORT_PATH/items/lrhorizontallayout.h \ @@ -154,9 +178,37 @@ HEADERS += \ $$REPORT_PATH/lritemscontainerdesignitf.h \ $$REPORT_PATH/lrcolorindicator.h \ $$REPORT_PATH/lrreporttranslation.h \ - $$REPORT_PATH/translationeditor/languageselectdialog.h + $$REPORT_PATH/translationeditor/languageselectdialog.h \ + $$REPORT_PATH/serializators/lrserializatorintf.h \ + $$REPORT_PATH/serializators/lrstorageintf.h \ + $$REPORT_PATH/serializators/lrxmlqrectserializator.h \ + $$REPORT_PATH/serializators/lrxmlserializatorsfactory.h \ + $$REPORT_PATH/serializators/lrxmlbasetypesserializators.h \ + $$REPORT_PATH/serializators/lrxmlreader.h \ + $$REPORT_PATH/serializators/lrxmlwriter.h \ + $$REPORT_PATH/bands/lrpageheader.h \ + $$REPORT_PATH/bands/lrpagefooter.h \ + $$REPORT_PATH/bands/lrreportheader.h \ + $$REPORT_PATH/bands/lrreportfooter.h \ + $$REPORT_PATH/bands/lrdataband.h \ + $$REPORT_PATH/bands/lrtearoffband.h \ + $$REPORT_PATH/bands/lrsubdetailband.h \ + $$REPORT_PATH/bands/lrgroupbands.h \ + $$REPORT_PATH/lrvariablesholder.h \ + $$REPORT_PATH/lrgroupfunctions.h \ + $$REPORT_PATH/lrgraphicsviewzoom.h \ + $$REPORT_PATH/lrsimplecrypt.h \ + $$REPORT_PATH/items/lrsimpletagparser.h \ + $$REPORT_PATH/items/lrtextitem.h \ + $$REPORT_PATH/lrreportengine_p.h \ + $$REPORT_PATH/lrreportengine.h \ + $$REPORT_PATH/lrpreviewreportwindow.h \ + $$REPORT_PATH/lrpreviewreportwidget.h \ + $$REPORT_PATH/lrreportrender.h FORMS += \ + $$REPORT_PATH/items/lrtextitemeditor.ui \ + $$REPORT_PATH/items/lrchartitemeditor.ui \ $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ $$REPORT_PATH/databrowser/lrdatabrowser.ui \ @@ -167,8 +219,9 @@ FORMS += \ $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ $$REPORT_PATH/translationeditor/translationeditor.ui \ $$REPORT_PATH/translationeditor/languageselectdialog.ui \ - $$REPORT_PATH/scripteditor/lrscripteditor.ui - + $$REPORT_PATH/scripteditor/lrscripteditor.ui \ + $$REPORT_PATH/lrpreviewreportwindow.ui \ + $$REPORT_PATH/lrpreviewreportwidget.ui RESOURCES += \ $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ diff --git a/limereport/items/lrchartitemeditor.cpp b/limereport/items/lrchartitemeditor.cpp index cb13541..441400d 100644 --- a/limereport/items/lrchartitemeditor.cpp +++ b/limereport/items/lrchartitemeditor.cpp @@ -41,7 +41,7 @@ QSettings* ChartItemEditor::settings() if (m_settings){ return m_settings; } else { - m_settings = new QSettings("LimeReport",QApplication::applicationName()); + m_settings = new QSettings("LimeReport",QCoreApplication::applicationName()); m_ownedSettings = true; return m_settings; } diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index b4c0d5b..28c867b 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -365,11 +365,9 @@ void BaseDesignIntf::mousePressEvent(QGraphicsSceneMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_resizeDirectionFlags = resizeDirectionFlags(event->pos()); - //m_startScenePos = event->scenePos(); m_startPos = pos(); m_oldGeometry = geometry(); QGraphicsItem::mousePressEvent(event); - //QApplication::processEvents(); emit(itemSelected(this)); } else QGraphicsItem::mousePressEvent(event); diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index 57a9d69..4e524c1 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -8,7 +8,6 @@ #include #include #include -#include #include "lrscripthighlighter.h" From b6ea14747fea9a6495938cb4dd385b361e6ced25 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Dec 2017 00:44:58 +0300 Subject: [PATCH 092/347] pri file fixed --- designer_plugin/limereport.pri | 4 ---- 1 file changed, 4 deletions(-) diff --git a/designer_plugin/limereport.pri b/designer_plugin/limereport.pri index a03de48..fadd15b 100644 --- a/designer_plugin/limereport.pri +++ b/designer_plugin/limereport.pri @@ -154,7 +154,6 @@ HEADERS += \ $$REPORT_PATH/items/lrsubitemparentpropitem.h \ $$REPORT_PATH/items/lralignpropitem.h \ $$REPORT_PATH/items/lrhorizontallayout.h \ - $$REPORT_PATH/items/lrtextitemeditor.h \ $$REPORT_PATH/translationeditor/translationeditor.h \ $$REPORT_PATH/lrbanddesignintf.h \ $$REPORT_PATH/lrpageitemdesignintf.h \ @@ -195,11 +194,8 @@ HEADERS += \ $$REPORT_PATH/bands/lrsubdetailband.h \ $$REPORT_PATH/bands/lrgroupbands.h \ $$REPORT_PATH/lrvariablesholder.h \ - $$REPORT_PATH/lrgroupfunctions.h \ - $$REPORT_PATH/lrgraphicsviewzoom.h \ $$REPORT_PATH/lrsimplecrypt.h \ $$REPORT_PATH/items/lrsimpletagparser.h \ - $$REPORT_PATH/items/lrtextitem.h \ $$REPORT_PATH/lrreportengine_p.h \ $$REPORT_PATH/lrreportengine.h \ $$REPORT_PATH/lrpreviewreportwindow.h \ From 88422aedbb0d3004ac9d2815c3e1b321a1c13326 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 7 Dec 2017 21:30:32 +0300 Subject: [PATCH 093/347] redundant debug message has been deleted --- limereport.pro | 3 ++- limereport/lrreportengine.cpp | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/limereport.pro b/limereport.pro index 53d9b87..3ede347 100644 --- a/limereport.pro +++ b/limereport.pro @@ -11,9 +11,10 @@ contains(CONFIG, zint){ export($$CONFIG) + SUBDIRS += limereport -CONFIG += ordered +CONFIG += ordered SUBDIRS += demo_r1 demo_r2 designer diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index f5acdfb..59f5de2 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -92,6 +92,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &))); +#ifndef HAVE_REPORT_DESIGNER QDir pluginsDir = QCoreApplication::applicationDirPath(); pluginsDir.cd("../lib" ); if (!pluginsDir.exists()){ @@ -99,8 +100,6 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : if (!pluginsDir.exists()) pluginsDir.setPath(QCoreApplication::applicationDirPath()); } - qDebug()< Date: Fri, 8 Dec 2017 00:26:47 +0300 Subject: [PATCH 094/347] windows build fixed --- designer_plugin/limereport.pri | 8 ++++++++ limereport/lrreportdesignwidget.cpp | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/designer_plugin/limereport.pri b/designer_plugin/limereport.pri index fadd15b..be32632 100644 --- a/designer_plugin/limereport.pri +++ b/designer_plugin/limereport.pri @@ -62,6 +62,10 @@ SOURCES += \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ + $$REPORT_PATH/items/lrchartitem.cpp \ + $$REPORT_PATH/items/lrchartitemeditor.cpp \ + $$REPORT_PATH/items/lrshapeitem.cpp \ + $$REPORT_PATH/items/lrimageitem.cpp \ $$REPORT_PATH/translationeditor/translationeditor.cpp \ $$REPORT_PATH/lrbanddesignintf.cpp \ $$REPORT_PATH/lrpageitemdesignintf.cpp \ @@ -154,6 +158,10 @@ HEADERS += \ $$REPORT_PATH/items/lrsubitemparentpropitem.h \ $$REPORT_PATH/items/lralignpropitem.h \ $$REPORT_PATH/items/lrhorizontallayout.h \ + $$REPORT_PATH/items/lrchartitem.h \ + $$REPORT_PATH/items/lrchartitemeditor.h \ + $$REPORT_PATH/items/lrshapeitem.h \ + $$REPORT_PATH/items/lrimageitem.h \ $$REPORT_PATH/translationeditor/translationeditor.h \ $$REPORT_PATH/lrbanddesignintf.h \ $$REPORT_PATH/lrpageitemdesignintf.h \ diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 8b68570..2af7de9 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -365,7 +365,7 @@ void ReportDesignWidget::startEditMode() PageDesignIntf * ReportDesignWidget::activePage() { if (activeView()) - return qobject_cast(activeView()->scene()); + return dynamic_cast(activeView()->scene()); return 0; } From b8bafd08e97d3b8006aff1684606a1cec4156ab0 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 11 Dec 2017 00:29:36 +0300 Subject: [PATCH 095/347] translation updated --- limereport/items/lrchartitemeditor.cpp | 2 +- limereport/items/lrchartitemeditor.ui | 2 +- .../objectinspector/lrobjectitemmodel.cpp | 13 ++ .../propertyItems/lrenumpropitem.cpp | 9 + translations/limereport_ru.ts | 192 +++++++++++++----- 5 files changed, 168 insertions(+), 50 deletions(-) diff --git a/limereport/items/lrchartitemeditor.cpp b/limereport/items/lrchartitemeditor.cpp index cb13541..0c54821 100644 --- a/limereport/items/lrchartitemeditor.cpp +++ b/limereport/items/lrchartitemeditor.cpp @@ -95,7 +95,7 @@ void ChartItemEditor::init() ui->tableWidget->setColumnCount(1); ui->tableWidget->setRowCount(m_charItem->series().count()); ui->tableWidget->horizontalHeader()->setStretchLastSection(true); - ui->tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem("Series name")); + ui->tableWidget->setHorizontalHeaderItem(0,new QTableWidgetItem(tr("Series name"))); rebuildTable(); diff --git a/limereport/items/lrchartitemeditor.ui b/limereport/items/lrchartitemeditor.ui index f32e269..a745777 100644 --- a/limereport/items/lrchartitemeditor.ui +++ b/limereport/items/lrchartitemeditor.ui @@ -11,7 +11,7 @@ - Form + Series editor diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 080a7a2..07a8200 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -134,6 +134,19 @@ void QObjectPropertyModel::translatePropertyName() tr("condition"); tr("groupFieldName"); tr("keepGroupTogether"); + tr("endlessHeight"); + tr("extendedHeight"); + tr("isExtendedInDesignMode"); + tr("pageIsTOC"); + tr("setPageSizeToPrinter"); + tr("fillInSecondPass"); + tr("chartTitle"); + tr("chartType"); + tr("drawLegendBorder"); + tr("labelsField"); + tr("legendAlign"); + tr("series"); + tr("titleAlign"); } void QObjectPropertyModel::clearObjectsList() diff --git a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp index 36ebe26..6398f12 100644 --- a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp @@ -132,6 +132,15 @@ void EnumPropItem::translateEnumItemName() tr("Horizontal"); tr("Vertical"); tr("VerticalUniform"); + tr("Pie"); + tr("VerticalBar"); + tr("HorizontalBar"); + tr("LegendAlignTop"); + tr("LegendAlignCenter"); + tr("LegendAlignBottom"); + tr("TitleAlignLeft"); + tr("TitleAlignRight"); + tr("TitleAlignCenter"); } void EnumPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 3c64e9f..35ad19f 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -12,43 +12,51 @@ ChartItemEditor Form - Форма + Форма Series - + Серии Add - + Добавить Delete - + Удалить Name - Имя переменной + Наименование Values field - + Значения Color - + Цвет Type - Тип + Тип Labels field - + Подписи Ok - Ок + Ок + + + Series name + Серии + + + Series editor + Редактор серий @@ -75,18 +83,18 @@ Mandatory - + Обязательная LanguageSelectDialog Dialog - + Диалог Language - + Язык @@ -143,7 +151,7 @@ p, li { white-space: pre-wrap; } <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -390,15 +398,15 @@ p, li { white-space: pre-wrap; } Keep bottom space - + Сохранять отступ снизу Start from new page - + Начинать с новой страницы Start new page - + Начинать новую страницу @@ -746,15 +754,15 @@ p, li { white-space: pre-wrap; } NoneAutoWidth - Нет + Нет MaxWordLength - По ширине слова + По ширине слова MaxStringLength - По ширине строки + По ширине строки TransparentMode @@ -920,6 +928,42 @@ p, li { white-space: pre-wrap; } VerticalUniform Вертикально равномерно + + Pie + Круговая + + + VerticalBar + Вертикальные столбцы + + + HorizontalBar + Горизонтальные столбцы + + + LegendAlignTop + Сверху + + + LegendAlignCenter + По центру + + + LegendAlignBottom + Снизу + + + TitleAlignLeft + Слева + + + TitleAlignRight + Справа + + + TitleAlignCenter + По цетру + LimeReport::FlagsPropItem @@ -1712,6 +1756,58 @@ p, li { white-space: pre-wrap; } repeatOnEachRow Печатать на каждой странице + + endlessHeight + Бесконечная страница + + + extendedHeight + Дополнителная высота + + + isExtendedInDesignMode + Увеличенный размер в дизайнере + + + pageIsTOC + Оглавление + + + setPageSizeToPrinter + Отправлять размер страницы принтеру + + + fillInSecondPass + Заполнять на втором проходе + + + chartTitle + Заголовок диаграммы + + + chartType + Тип диаграммы + + + drawLegendBorder + Границы вокруг легенды + + + labelsField + + + + legendAlign + Расположение легенды + + + series + Серии + + + titleAlign + Расположение заголовка + LimeReport::RectMMPropItem @@ -1759,7 +1855,7 @@ p, li { white-space: pre-wrap; } Translations - + Переводы @@ -2059,7 +2155,7 @@ This preview is no longer valid. Language %1 already exists - + Перевод %1 уже существует! @@ -2249,15 +2345,15 @@ This preview is no longer valid. LimeReport::ScriptEditor Form - Форма + Форма Data - Данные + Данные Functions - Функции + Функции @@ -2347,35 +2443,35 @@ This preview is no longer valid. Datasource - Источник данных + Источник данных ValueField - + Поле значения KeyField - + Поле ключа KeyFieldValue - + Значение поля ключа Unique identifier - + Уникальный идентификатор Content - Содержимое + Содержимое Indent - + Отступ datasourceName - + Источника данных @@ -2551,47 +2647,47 @@ This preview is no longer valid. LimeReport::TranslationEditor Form - Форма + Форма Languages - + Языки ... - ... + ... Pages - + Страницы Strings - + Строки Source Text - + Исходный текст Translation - + Превод Checked - + Проверено Report Item - + Элемент отчета Property - + Свойство Source text - + Исходный текст @@ -2825,19 +2921,19 @@ This preview is no longer valid. Chart Item - + Диаграмма First - + Первая Second - + Вторая Thrid - + Третья From 13c6386af6eb90a65c857cb5d8a36a3a505eec2e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 11 Dec 2017 16:40:18 +0300 Subject: [PATCH 096/347] darktheme changed --- .../dark_style_sheet/qdarkstyle/style.qss | 80 ++++++++++--------- 1 file changed, 41 insertions(+), 39 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index e0a8fe1..2bb5005 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -24,10 +24,10 @@ QToolTip { border: 1px solid #2b2b2b; - background-color: rgb(90, 102, 117);; + background-color: #383838; color: white; padding: 5px; - opacity: 200; +\\ opacity: 200; } QWidget @@ -579,7 +579,7 @@ QStackedWidget QToolBar { border: 1px transparent #2b2b2b; - background: 1px solid #383838; +\\ background: 1px solid #383838; font-weight: bold; } @@ -964,7 +964,8 @@ QTreeView::branch:selected{ } QTreeView::branch:!selected:hover, QTreeView::item:!selected:hover{ - background-color: #287399; +\\ background-color: #287399; + background-color: #819a67; } QTreeView::branch:has-siblings:!adjoins-item { @@ -1036,7 +1037,7 @@ QSlider::handle:vertical { QToolButton { background-color: #383838; color : white; - border: 1px transparent #2b2b2b; + border: 1px solid #383838; border-radius: 2px; margin: 2px; padding: 2px; @@ -1059,42 +1060,43 @@ QToolButton:text{ QToolButton:disabled{ background-color: transparent; -} - -QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ - padding-right: 20px; /* make way for the popup button */ - border: 1px #2b2b2b; - border-radius: 5px; -} - -QToolButton[popupMode="2"] { /* only for InstantPopup */ - padding-right: 10px; /* make way for the popup button */ - border: 1px #2b2b2b; -} - -/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ -QToolButton::menu-indicator { - image: url(:/qss_icons/rc/down_arrow.png); - top: -7px; left: -2px; /* shift it a bit */ -} - -/* the subcontrols below are used only in the MenuButtonPopup mode */ -QToolButton::menu-button { border: 1px transparent #2b2b2b; - border-top-right-radius: 6px; - border-bottom-right-radius: 6px; - /* 16px width + 4px for border = 20px allocated above */ - width: 16px; - outline: none; -} - -QToolButton::menu-arrow { - image: url(:/qss_icons/rc/down_arrow.png); -} - -QToolButton::menu-arrow:open { - border: 1px solid #2b2b2b; } +\\ +\\QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ +\\ padding-right: 20px; /* make way for the popup button */ +\\ border: 1px #2b2b2b; +\\ border-radius: 5px; +\\} +\\ +\\QToolButton[popupMode="2"] { /* only for InstantPopup */ +\\ padding-right: 10px; /* make way for the popup button */ +\\ border: 1px #2b2b2b; +\\} +\\ +\\/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +\\QToolButton::menu-indicator { +\\ image: url(:/qss_icons/rc/down_arrow.png); +\\ top: -7px; left: -2px; /* shift it a bit */ +\\} +\\ +\\/* the subcontrols below are used only in the MenuButtonPopup mode */ +\\QToolButton::menu-button { +\\ border: 1px transparent #2b2b2b; +\\ border-top-right-radius: 6px; +\\ border-bottom-right-radius: 6px; +\\ /* 16px width + 4px for border = 20px allocated above */ +\\ width: 16px; +\\ outline: none; +\\} +\\ +\\QToolButton::menu-arrow { +\\ image: url(:/qss_icons/rc/down_arrow.png); +\\} +\\ +\\QToolButton::menu-arrow:open { +\\ border: 1px solid #2b2b2b; +\\} QPushButton::menu-indicator { subcontrol-origin: padding; From 435074064b20a997f14d055fbdfbef49bb50062b Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 11 Dec 2017 16:48:00 +0300 Subject: [PATCH 097/347] Dark theme has been added --- designer/designer.pro | 2 ++ include/lrglobal.h | 1 + .../editors/lrtextalignmenteditorwidget.cpp | 2 +- limereport/lrbasedesignintf.cpp | 10 +++++++++- limereport/lrdatasourcemanager.cpp | 2 +- limereport/lrglobal.h | 1 + limereport/lrreportdesignwidget.cpp | 19 ++++++++++++++++--- limereport/lrreportdesignwidget.h | 3 ++- limereport/lrreportengine.cpp | 14 ++++++++++++-- limereport/lrreportengine_p.h | 9 ++++++--- limereport/lrsettingdialog.cpp | 15 +++++++++++++++ limereport/lrsettingdialog.h | 2 ++ limereport/lrsettingdialog.ui | 7 +++++++ limereport/lrvariablesholder.h | 2 +- 14 files changed, 76 insertions(+), 13 deletions(-) diff --git a/designer/designer.pro b/designer/designer.pro index f8a22c3..4062e6f 100644 --- a/designer/designer.pro +++ b/designer/designer.pro @@ -13,6 +13,8 @@ SOURCES += main.cpp INCLUDEPATH += $$PWD/../include DEPENDPATH += $$PWD/../include +RESOURCES += $$PWD/../3rdparty/dark_style_sheet/qdarkstyle/style.qrc + DEST_DIR = $${DEST_BINS} REPORTS_DIR = $${DEST_DIR} diff --git a/include/lrglobal.h b/include/lrglobal.h index 74eeb00..13d8851 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -161,6 +161,7 @@ namespace Const{ Enums(){} Q_GADGET }; + typedef Enums::VariableDataType VariableDataType; } // namespace LimeReport diff --git a/limereport/items/editors/lrtextalignmenteditorwidget.cpp b/limereport/items/editors/lrtextalignmenteditorwidget.cpp index 6fd833b..8eb424b 100644 --- a/limereport/items/editors/lrtextalignmenteditorwidget.cpp +++ b/limereport/items/editors/lrtextalignmenteditorwidget.cpp @@ -95,7 +95,7 @@ void TextAlignmentEditorWidget::initEditor() void TextAlignmentEditorWidget::updateValues(const Qt::Alignment &align) { - m_textAttibutesIsChanging=true; + m_textAttibutesIsChanging=true; m_textAliginLeft->setChecked((align & Qt::AlignLeft)==Qt::AlignLeft); m_textAliginRight->setChecked((align & Qt::AlignRight)==Qt::AlignRight); m_textAliginHCenter->setChecked((align & Qt::AlignHCenter)==Qt::AlignHCenter); diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 0f2a8fd..0b41b05 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1139,8 +1139,16 @@ void BaseDesignIntf::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) } } +QWidget* findRootWidget(QWidget* widget){ + while (widget->parentWidget()) { + widget = widget->parentWidget(); + } + return widget; +} + void BaseDesignIntf::showEditorDialog(){ - QWidget *editor = defaultEditor(); + QWidget *editor = defaultEditor(); + editor->setStyleSheet(findRootWidget(scene()->views().at(0))->styleSheet()); if (editor) { #ifdef Q_OS_WIN diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 786ef14..6890b3e 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -1503,7 +1503,7 @@ VariableDataType DataSourceManager::variableDataType(const QString& name) { if (m_reportVariables.containsVariable(name)) return m_reportVariables.variableByName(name)->dataType(); - return VariableDataType::Undefined; + return Enums::Undefined; } void DataSourceManager::setVariableDataType(const QString& name, VariableDataType value) diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 74eeb00..13d8851 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -161,6 +161,7 @@ namespace Const{ Enums(){} Q_GADGET }; + typedef Enums::VariableDataType VariableDataType; } // namespace LimeReport diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 2af7de9..b336429 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -56,7 +56,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QMa #ifdef HAVE_QTDESIGNER_INTEGRATION m_dialogDesignerManager(new DialogDesignerManager(this)), #endif - m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), m_dialogChanged(false) + m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), m_dialogChanged(false), m_useDarkTheme(false) { #ifdef HAVE_QT4 m_tabWidget = new LimeReportTabWidget(this); @@ -189,6 +189,7 @@ void ReportDesignWidget::saveState(QSettings* settings) settings->setValue("vGridStep",m_verticalGridStep); settings->setValue("defaultFont",m_defaultFont); settings->setValue("useGrid",m_useGrid); + settings->setValue("useDarkTheme",m_useDarkTheme); settings->setValue("ScriptEditorState", m_scriptEditor->saveState()); settings->endGroup(); } @@ -199,6 +200,13 @@ void ReportDesignWidget::applySettings() m_report->pageAt(i)->pageItem()->setFont(m_defaultFont); } applyUseGrid(); + if (m_useDarkTheme) { + QFile theme(":/qdarkstyle/style.qss"); + theme.open(QIODevice::ReadOnly); + QString styleSheet = theme.readAll(); + parentWidget()->setStyleSheet(styleSheet); + m_report->setStyleSheet(styleSheet); + } else parentWidget()->setStyleSheet(""); } void ReportDesignWidget::loadState(QSettings* settings) @@ -223,6 +231,11 @@ void ReportDesignWidget::loadState(QSettings* settings) m_useGrid = v.toBool(); } + v = settings->value("useDarkTheme"); + if (v.isValid()){ + m_useDarkTheme = v.toBool(); + } + v = settings->value("ScriptEditorState"); if (v.isValid()){ m_scriptEditor->restoreState(v.toByteArray()); @@ -369,8 +382,6 @@ PageDesignIntf * ReportDesignWidget::activePage() return 0; } - - QList ReportDesignWidget::selectedItems(){ return activePage()->selectedItems(); } @@ -697,11 +708,13 @@ void ReportDesignWidget::editSetting() setting.setHorizontalGridStep(m_horizontalGridStep); setting.setDefaultFont(m_defaultFont); setting.setSuppressAbsentFieldsAndVarsWarnings(m_report->suppressFieldAndVarError()); + setting.setUseDarkTheme(m_useDarkTheme); if (setting.exec()){ m_horizontalGridStep = setting.horizontalGridStep(); m_verticalGridStep = setting.verticalGridStep(); m_defaultFont = setting.defaultFont(); + m_useDarkTheme = setting.userDarkTheme(); m_report->setSuppressFieldAndVarError(setting.suppressAbsentFieldsAndVarsWarnings()); applySettings(); } diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index e38338b..2887621 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -199,6 +199,7 @@ protected: #endif private: bool eventFilter(QObject *target, QEvent *event); + void prepareReport(); private: ReportEnginePrivateInterface* m_report; QGraphicsView *m_view; @@ -221,7 +222,7 @@ private: bool m_useGrid; bool m_useMagnet; bool m_dialogChanged; - void prepareReport(); + bool m_useDarkTheme; }; } // namespace LimeReport diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 59f5de2..d3646f8 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -502,7 +502,7 @@ void ReportEnginePrivate::previewReport(PreviewHints hints) } w->setHideResultEditButton(resultIsEditable()); - + w->setStyleSheet(m_styleSheet); m_activePreview = w; connect(w,SIGNAL(destroyed(QObject*)), this, SLOT(slotPreviewWindowDestroyed(QObject*))); w->exec(); @@ -932,10 +932,20 @@ void ReportEnginePrivate::activateLanguage(QLocale::Language language) } } +QString ReportEnginePrivate::styleSheet() const +{ + return m_styleSheet; +} + +void ReportEnginePrivate::setStyleSheet(const QString &styleSheet) +{ + m_styleSheet = styleSheet; +} + bool ReportEnginePrivate::setReportLanguage(QLocale::Language language){ m_reportLanguage = language; if (!m_translations.keys().contains(language)) return false; -// activateLanguage(language); + // activateLanguage(language); return true; } diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 4bf57cd..9dde434 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -53,8 +53,6 @@ class PageDesignIntf; class PrintRange; class ReportDesignWindow; -//TODO: Add on render callback - class ReportEnginePrivateInterface { public: virtual PageDesignIntf* appendPage(const QString& pageName="") = 0; @@ -84,7 +82,8 @@ public: virtual QString currentReportsDir() = 0; virtual bool suppressFieldAndVarError() const = 0; virtual void setSuppressFieldAndVarError(bool suppressFieldAndVarError) = 0; - + virtual void setStyleSheet(const QString& styleSheet) = 0; + virtual QString styleSheet() const = 0; }; class ReportEnginePrivate : public QObject, public ICollectionContainer, public ITranslationContainer, @@ -179,6 +178,9 @@ public: void clearSelection(); Qt::LayoutDirection previewLayoutDirection(); void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); + QString styleSheet() const; + void setStyleSheet(const QString &styleSheet); + signals: void pagesLoadFinished(); void datasourceCollectionLoadFinished(const QString& collectionName); @@ -243,6 +245,7 @@ private: void activateLanguage(QLocale::Language language); Qt::LayoutDirection m_previewLayoutDirection; LimeReportPluginInterface* m_designerFactory; + QString m_styleSheet; }; } diff --git a/limereport/lrsettingdialog.cpp b/limereport/lrsettingdialog.cpp index 0b929be..ee34440 100644 --- a/limereport/lrsettingdialog.cpp +++ b/limereport/lrsettingdialog.cpp @@ -1,5 +1,6 @@ #include "lrsettingdialog.h" #include "ui_lrsettingdialog.h" +#include namespace LimeReport{ @@ -8,6 +9,10 @@ SettingDialog::SettingDialog(QWidget *parent) : ui(new Ui::SettingDialog) { ui->setupUi(this); + QFile theme(":/qdarkstyle/style.qss"); + if (!theme.exists()){ + ui->cbbUseDarkTheme->setVisible(false); + } } SettingDialog::~SettingDialog() @@ -32,6 +37,11 @@ QFont SettingDialog::defaultFont() return result; } +bool SettingDialog::userDarkTheme() +{ + return ui->cbbUseDarkTheme->isChecked(); +} + bool SettingDialog::suppressAbsentFieldsAndVarsWarnings() { return ui->cbSuppressWarnings->isChecked(); @@ -57,4 +67,9 @@ void SettingDialog::setDefaultFont(const QFont &value) ui->defaultFontSize->setValue(value.pointSize()); } +void SettingDialog::setUseDarkTheme(bool value) +{ + ui->cbbUseDarkTheme->setChecked(value); +} + } // namespace LimeReport diff --git a/limereport/lrsettingdialog.h b/limereport/lrsettingdialog.h index e9a740d..db908f9 100644 --- a/limereport/lrsettingdialog.h +++ b/limereport/lrsettingdialog.h @@ -19,11 +19,13 @@ public: int verticalGridStep(); int horizontalGridStep(); QFont defaultFont(); + bool userDarkTheme(); bool suppressAbsentFieldsAndVarsWarnings(); void setSuppressAbsentFieldsAndVarsWarnings(bool value); void setHorizontalGridStep(int value); void setVerticalGridStep(int value); void setDefaultFont(const QFont& value); + void setUseDarkTheme(bool value); private: Ui::SettingDialog *ui; }; diff --git a/limereport/lrsettingdialog.ui b/limereport/lrsettingdialog.ui index d3a143a..b0dd1ed 100644 --- a/limereport/lrsettingdialog.ui +++ b/limereport/lrsettingdialog.ui @@ -108,6 +108,13 @@ + + + + Use dark theme + + + diff --git a/limereport/lrvariablesholder.h b/limereport/lrvariablesholder.h index 6756240..76446b5 100644 --- a/limereport/lrvariablesholder.h +++ b/limereport/lrvariablesholder.h @@ -45,7 +45,7 @@ class VarDesc : public QObject{ Q_PROPERTY(bool isMandatory READ isMandatory WRITE setMandatory) Q_PROPERTY(int dataType READ readDataTypeProperty WRITE setDataTypeProperty) public: - VarDesc() : m_dataType(VariableDataType::Undefined), m_mandatory(false){} + VarDesc() : m_dataType(Enums::Undefined), m_mandatory(false){} enum VarType {System, User, Report}; void setVarType(VarType value){m_varType=value;} VarType varType(){return m_varType;} From 91d1e313c40aeeed01afb92a47156068afabf713 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 11 Dec 2017 19:18:06 +0300 Subject: [PATCH 098/347] theme updated --- .../dark_style_sheet/qdarkstyle/style.qss | 126 +++--------------- 1 file changed, 21 insertions(+), 105 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 2bb5005..95d255e 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -82,63 +82,6 @@ QGroupBox::indicator margin-left: 2px; } -\\QCheckBox::indicator:unchecked -\\{ -\\ image: url(:/qss_icons/rc/checkbox_unchecked.png); -\\} - -\\QCheckBox::indicator:unchecked:hover, -\\QCheckBox::indicator:unchecked:focus, -\\QCheckBox::indicator:unchecked:pressed, -\\QGroupBox::indicator:unchecked:hover, -\\QGroupBox::indicator:unchecked:focus, -\\QGroupBox::indicator:unchecked:pressed -\\{ -\\ border: none; -\\ image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); -\\} - -\\QCheckBox::indicator:checked -\\{ -\\ image: url(:/qss_icons/rc/checkbox_checked.png); -\\} - -\\QCheckBox::indicator:checked:hover, -\\QCheckBox::indicator:checked:focus, -\\QCheckBox::indicator:checked:pressed, -\\QGroupBox::indicator:checked:hover, -\\QGroupBox::indicator:checked:focus, -\\QGroupBox::indicator:checked:pressed -\\{ -\\ border: none; -\\ image: url(:/qss_icons/rc/checkbox_checked_focus.png); -\\} - - -\\QCheckBox::indicator:indeterminate -\\{ -\\ image: url(:/qss_icons/rc/checkbox_indeterminate.png); -\\} - -\\QCheckBox::indicator:indeterminate:focus, -\\QCheckBox::indicator:indeterminate:hover, -\\QCheckBox::indicator:indeterminate:pressed -\\{ -\\ image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); -\\} - -\\QCheckBox::indicator:checked:disabled, -\\QGroupBox::indicator:checked:disabled -\\{ -\\ image: url(:/qss_icons/rc/checkbox_checked_disabled.png); -\\} - -\\QCheckBox::indicator:unchecked:disabled, -\\QGroupBox::indicator:unchecked:disabled -\\{ -\\ image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); -\\} - QRadioButton { spacing: 5px; @@ -157,52 +100,11 @@ QRadioButton::indicator height: 16px; } -\\QRadioButton::indicator:unchecked -\\{ -\\ image: url(:/qss_icons/rc/radio_unchecked.png); -\\} - - -\\QRadioButton::indicator:unchecked:hover, -\\QRadioButton::indicator:unchecked:focus, -\\QRadioButton::indicator:unchecked:pressed -\\{ -\\ border: none; -\\ outline: none; -\\ image: url(:/qss_icons/rc/radio_unchecked_focus.png); -\\} - -\\QRadioButton::indicator:checked -\\{ -\\ border: none; -\\ outline: none; -\\ image: url(:/qss_icons/rc/radio_checked.png); -\\} - -\\QRadioButton::indicator:checked:hover, -\\QRadioButton::indicator:checked:focus, -\\QRadioButton::indicator:checked:pressed -\\{ -\\ border: none; -\\ outline: none; -\\ image: url(:/qss_icons/rc/radio_checked_focus.png); -\\} - -\\QRadioButton::indicator:checked:disabled -\\{ -\\ outline: none; -\\ image: url(:/qss_icons/rc/radio_checked_disabled.png); -\\} - -\\QRadioButton::indicator:unchecked:disabled -\\{ -\\ image: url(:/qss_icons/rc/radio_unchecked_disabled.png); -\\} - QMenuBar { - background-color: #383838; + background-color: #2f2f2f; color: #eff0f1; + border-bottom: 1px solid #2b2b2b; } QMenuBar::item @@ -213,13 +115,15 @@ QMenuBar::item QMenuBar::item:selected { background: transparent; + background-color: #8fa876; border: 1px solid #2b2b2b; } QMenuBar::item:pressed { border: 1px solid #2b2b2b; - background-color: #2e2e2e; +\\ background-color: #2e2e2e; + background-color: #8fa876; color: #eff0f1; margin-bottom:-1px; padding-bottom:1px; @@ -328,7 +232,11 @@ QTabWidget:focus, QCheckBox:focus, QRadioButton:focus, QSlider:focus QLineEdit { background-color: #232629; - padding: 5px; + padding-right: 5px; + padding-left: 5px; + padding-top: 1px; + padding-bottom: 1px; + margin: 1px; border-style: solid; border: 1px solid #2b2b2b; border-radius: 2px; @@ -490,7 +398,6 @@ QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical background: none; } - QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { background: none; @@ -581,6 +488,7 @@ QToolBar { border: 1px transparent #2b2b2b; \\ background: 1px solid #383838; font-weight: bold; + border-bottom: 1px solid #2b2b2b; } QToolBar::handle:horizontal { @@ -648,7 +556,11 @@ QComboBox border-style: solid; border: 1px solid #2b2b2b; border-radius: 2px; - padding: 5px; + padding-right: 5px; + padding-left: 5px; + padding-top: 1px; + padding-bottom: 1px; + margin: 1px; min-width: 75px; } @@ -703,7 +615,11 @@ QComboBox::down-arrow:focus } QAbstractSpinBox { - padding: 5px; + padding-right: 5px; + padding-left: 5px; + padding-top: 1px; + padding-bottom: 1px; + margin: 1px; border: 1px solid #2b2b2b; background-color: #232629; color: #eff0f1; From 2a1b759f747e3cc701952f7fff8a2cbc475ecbd1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 11 Dec 2017 21:59:11 +0300 Subject: [PATCH 099/347] theme updated --- .../qdarkstyle/rc/checkbox_checked_focus.png | Bin 252 -> 252 bytes .../rc/checkbox_indeterminate_focus.png | Bin 249 -> 249 bytes .../rc/checkbox_unchecked_focus.png | Bin 240 -> 240 bytes .../qdarkstyle/rc/radio_checked_focus.png | Bin 846 -> 903 bytes .../qdarkstyle/rc/radio_unchecked_focus.png | Bin 646 -> 703 bytes .../dark_style_sheet/qdarkstyle/style.qss | 119 ++++++++++++++++-- 6 files changed, 112 insertions(+), 7 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_checked_focus.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_checked_focus.png index 671be273b06e2b721f494379ab61e527932ba69e..5b04d83c1159a47483fd9a22115b1538257ba8fb 100644 GIT binary patch delta 178 zcmV;j08Rh=0sH}wQhy8!5j!9m1r9I(0043|W1_y0d*{c6d7w6w4> z^f?m)BjbNe2hhQCY>t3CpnjFae-uSwFBqw5DK7Jwu)2`Smg6&%i5`~YGn;9ka{&vf zaYwD7A2cB_>VQ!Pj5=V{0izBWb-<_t2(|}k*+LqeQ9x-6h%40A6%#F*VWgNjcseF@ g>zdIxQ4c);01{3(_-3_jwg3PC07*qoM6N<$f-V(Cw*UYD delta 178 zcmV;j08Rh=0sH}wQhx;v3ONqX?GQl#0043|W1_y0em?fO^$Xldc$ zKrto;M#le`4xoeO*c<_OfbF`M|4|eLi8E5uQe5UUVRa#uEyrgj6Fn@)XExJ7=K>Z| zVQ!P5Nr?7vV}A_qkz&D5G$#zD<)br!$>i6@N`V* g)-|JXq8@qx0Ha+vWf_q%tQhy8!5jz+$2ez&N004$bL_t(o!((6=>3|W1_y0d*{c6d7w6w4> z^f?m)BjbNe2hhQCY>t3CpnjFae-uSwFBqw5DK7Jwu)2`Smg6&%i5`~YGn;9kbHS(s zMjgOHY`&#iHXKa@qYfB#z@RAyXjvvib005f%tQhx;v3OW&K$WC_v004$bL_t(o!((6=>3|W1_y0em?fO^$Xldc$ zKrto;M#le`4xoeO*c<_OfbF`M|4|eLi8E5uQe5UUVRa#uEyrgj6Fn@)XExJ7=YmlO zj5>gY*nCU3Y&e<*MjbHffI(9Z(6Uw>je=1J3~mQdyA~v5HYgK4s$zU*4xWw)-MVIU dD&U3=000PHIAu8!5W)Ze002ovPDHLkV1huOMAHBO diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_unchecked_focus.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/checkbox_unchecked_focus.png index e4258cc470f6e2b6a4855fd704fee2f7a8f6953f..c037864f1f6e213f1b6e12c8fe3f253500f403f5 100644 GIT binary patch delta 166 zcmV;X09pU=0q_BkQhy8!5jzk++&-KD004bSL_t(o!((6=>3|W1_y0d*{c6d7w6w4> z^f?m)BjbNe2hhQCY>t3CpnjFae-uSwFBqw5DK7Jwu)2`Smg6&%i5`~YGn;9kbHS(s zMjbHffKdmGI$+cRqYfB#z^DV52(?~m*)ql%0<>@hE;9#D#~*}lT{9Xs`-dg~0Jgp} UG+)jXf&c&j07*qoM6N<$g3~2KH~;_u delta 166 zcmV;X09pU=0q_BkQhx;v3OXyV#FxbY004bSL_t(o!((6=>3|W1_y0em?fO^$Xldc$ zKrto;M#le`4xoeO*c<_OfbF`M|4|eLi8E5uQe5UUVRa#uEyrgj6Fn@)XExJ7=YmlO zj5=V{0izBWb-<_tMjbHffKdl95o*2CvSo}j1Zd$1TxJfQjvoo#x@I(N_76<}0AD#X UG%Fwg#Q*>R07*qoM6N<$f<^d3lmGw# diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/radio_checked_focus.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/radio_checked_focus.png index 700c6b525e2ec946c10481451c42930537f63c01..bea316da9625ac701e10b4029d03ab9d031de23f 100644 GIT binary patch delta 834 zcmV-I1HJst28RcbQhy8!5)v^rwGVIr00R_BL_t(o!|j$aY?D_I$A9-;LO`ffwx2a>O zstU4DBcw`5NF+*d{Jrb)99gKgaR?LsPw#a1-uu71dv^zY^ndZPLwYejcO|}K=Wcrf z7zg6OuvgX8v1qK6)>ay&nTf^vwi7r%KlZ+=7J$9LEp^;9R%%{7tg45An20PJLncUu z-)#$luYY~VK7Ld$sOo3H59$cMc(1(FhU5VkX|3Obr2x4We<3_e=8!B*;IHDpm5{hP<`Ef1biTdm^ZD8 z$fbcnnavzoc;feFRP`$nIgw3;rJf1+g!@ZG{?4YtcLDO>kBvl;UI$`;1B^F!fDw_Z zF{FZISo0)qsOsMJ)o8R`Vw!dYe73*tB0bxDc@*h&5r5hLKYN?&SQP2}xhwG<0IGTh z*f+Gx9&dM#=@5Z&V5ymKjSW2w#8kDd*Szk{oxAO6fa!Gk4|UuIwnQKTYnr$rkx%F}%GM0qOvzi*#f& zzK%biHGc#??#;Xy1|IZGKpnpUhgx3p&9jC;43}Eu!$8#8~>hNHf=6C}gh+J8zT0eqs45Lg9P)e%}NAFr)64o;`b z_W|zSs|McvlV^@CY;3t3=H?Ow;Bz3DPM3?_>@QbN$=!R^Kn!16E5#rg2HpN_=Wh6L zBT&Z$ppctO{Fs|dyw#z3#g}Wz#ZIAyk zqdUMIU~)QLzV<>!vY}n}xR}k6Y@}r*``uV6Su0mN#k`L``gj`u0WBg*v`h4qsQ>@~ M07*qoM6N<$f?L0fivR!s delta 777 zcmV+k1NQuf2hIkNQhx;v3kf93(uGq100P@dL_t(o!|j&OOH@%5$3OS@7=<@&0uj;{ zMyqs&L5wygqnm+@GKe;{woPq9ZR#ILC;SK8nyVm2p(r=K!bQkbIvLUrR~o}?Lc&M9 zak{sKcVviW^l7d1ySj&a?t9<+J?EZt;0Q-J>`-BxTV8BNT7MeV6<`qP0$T0Xx;DIX z6xl*xvc*)i^v?+-JpZbO4A2gI&<4*@tlRBY4ShgNVAT;ubG`19e?s6|?q|d2O`Xwj z2Y9Xx>E%9msRqeJ*)S%G6!38MN09a}9oGknQNr^l;-3Gj`?Wv3*E4a?ABlVZuej%D z4y1sU{jtFCVt>+|0O*C?wUghQ` z%`<_{znrbCVAu&7WnfW zmGWAJX(Q5Xad@hW4pXoZt`faArQrMmE8|4geKr9 zvZClrcz=EZAnGtF+Xcte`Ir${ECy!M)`2eIjKFMY0)@b21y;+3F@X6VH*kaj;6qim z^T&Eg!^L7MTAErbDciihG&L|2nm{oXEom4LMJn$3BLKNxcfAmpv%qa_SO9#$*M^0N zaH|lQbNQtE4PgB1R@%xx{N}v7weKvBdw#|?mVc4G_)o2sROd_oo^4=b2X4pi?00ED z*7!gaqre=H&L`dXHJVqKmAyYAWL7qU`@6N{Fayb;hKImuZCDnCC$MG{;G}&q9l#f0 zIG=Q9|I0|$98s4=?Tln?RU_G3N0Du6VCFzEKf)0X9exA(uOU_0j}t)v0000t!@r! z#Z6!g$mF`c86QYnD{??PkpH@}nR%3+S3&+`I{}!-Z%9k@4RlT43$o3oJP){#d2IIq zxg$sS1EeEIz<-4OsgU$$Q{MeB_2Lxlv{noXNiv)A+|U4~;O2$oLpJ4Ij8frF!G5k4 zjX%DZTl@-B`dv2FenKmps4b=yw}7VFx|$9@8yRrF6PWQUxZNn%?M(x7KqP=xA$eVa zS@Q}w69wRyR)6|@FZ#4?V1)ue$Z(S~z=w(gu&fmgdw&Jcih5u<3cx$yTm@2a9(WrX zKuBERlvA+ns4qJOyA@~_lF`rr8|!6PNEXd(53MItSA_X_Em$!*5*lE*r?{mReL%aJ z?V&U`Tg;g7_x4|&D*M@4K~5&z()&a*eh9deNXCCoxTQC{`SO!(mIL%lOXRaxy@x^e z)=mza+i?!RJWv}u2;5C1<86s#yg1>ON`5*2va(tLu1QPe*FOKcJ^5lyS85^Y)QUXN zWX9{bkbE?)cHDGK3$Ot6=DNMnf3=czY+K11wyk87LgHF6ITDofs;a8$Z~X?*+szlf S)O_s#0000J&h1%?HXQhx;v3kf$)Y{ZQK00I+9L_t(o!|j&8Yg17a$G_)35aN9eaVUbR zL!~ZOu?7d%I!UcIg|7Y;Hqp8Z@~Wegqr1E|H*M9yiktYWSP==)!IV^l8tyY9E$<$e zD|AVk_ru9|)_V@;bAH`(fJ`#^--V(mAAZ<4L`RO!0w@D00e>jkrxw_}A>sIDXWRdE z?c{Fi0B${)V`dM)D1i51vrfWk+2Zzeesif$_i>~9=gL_hGmP)V6 zTIXyZ$O&2NtXW+z_u!pK3}Bsy`ITUPP#dXqMJgRirM;xi=cLl?)`ROYY^&C`9IFRx z!+j*8Pd_gYO@GA<;0ZI2@{e!hy&AJ;jcm7{U=uFH%^)-105C>{;hA1K{hFi0GK!cZ8qUZ zQUGQy0%%7EVDk#VWC|s?2;gO801}Q55~tmIFp=ORD}MnvMMTSy0nE;}Pee^N;hi|n z?|<1PySy4Xhn8YRAeElAi=`6Tw$@pYN*k&4)kFo9N_%#(R0fUQIuG+J!GYO3a9x`A z=bK=27l0>~ek_$f*RST)55J#+#BE2=;@(#CR+jDgK2NURglS37FQ?Zk`& zXaJb+PB`b6|IJBO7@h%%zbDzqzLV@V3CGVlwDkRwyO&+NnPf7k`~lLe=7icuXkh>V N002ovPDHLkV1g+b4Q~Jd diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 95d255e..b9852d1 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -59,11 +59,16 @@ QCheckBox outline: none; color: #eff0f1; margin-right: 2px; + +} + +QCheckBox::item{ + background-color: #404040; } QCheckBox:disabled { - color: #2b2b2b; + color: #494949; } QCheckBox::indicator{ @@ -72,6 +77,64 @@ QCheckBox::indicator{ color: #222222; } + +QCheckBox::indicator:unchecked +{ + image: url(:/qss_icons/rc/checkbox_unchecked.png); +} + +QCheckBox::indicator:unchecked:hover, +QCheckBox::indicator:unchecked:focus, +QCheckBox::indicator:unchecked:pressed, +QGroupBox::indicator:unchecked:hover, +QGroupBox::indicator:unchecked:focus, +QGroupBox::indicator:unchecked:pressed +{ + border: none; + image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); +} + +QCheckBox::indicator:checked +{ + image: url(:/qss_icons/rc/checkbox_checked.png); +} + +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:checked:focus, +QCheckBox::indicator:checked:pressed, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:checked:focus, +QGroupBox::indicator:checked:pressed +{ + border: none; + image: url(:/qss_icons/rc/checkbox_checked_focus.png); +} + + +QCheckBox::indicator:indeterminate +{ + image: url(:/qss_icons/rc/checkbox_indeterminate.png); +} + +QCheckBox::indicator:indeterminate:focus, +QCheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:indeterminate:pressed +{ + image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); +} + +QCheckBox::indicator:checked:disabled, +QGroupBox::indicator:checked:disabled +{ + image: url(:/qss_icons/rc/checkbox_checked_disabled.png); +} + +QCheckBox::indicator:unchecked:disabled, +QGroupBox::indicator:unchecked:disabled +{ + image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); +} + QGroupBox::indicator { width: 18px; @@ -94,12 +157,54 @@ QRadioButton:disabled { color: #2b2b2b; } + QRadioButton::indicator { width: 16px; height: 16px; } +QRadioButton::indicator:unchecked +{ + image: url(:/qss_icons/rc/radio_unchecked.png); +} + +QRadioButton::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:focus, +QRadioButton::indicator:unchecked:pressed +{ + border: none; + outline: none; + image: url(:/qss_icons/rc/radio_unchecked_focus.png); +} + +QRadioButton::indicator:checked +{ + border: none; + outline: none; + image: url(:/qss_icons/rc/radio_checked.png); +} + +QRadioButton::indicator:checked:hover, +QRadioButton::indicator:checked:focus, +QRadioButton::indicator:checked:pressed +{ + border: none; + outline: none; + image: url(:/qss_icons/rc/radio_checked_focus.png); +} + +QRadioButton::indicator:checked:disabled +{ + outline: none; + image: url(:/qss_icons/rc/radio_checked_disabled.png); +} + +QRadioButton::indicator:unchecked:disabled +{ + image: url(:/qss_icons/rc/radio_unchecked_disabled.png); +} + QMenuBar { background-color: #2f2f2f; @@ -207,8 +312,8 @@ QMenu::right-arrow { QWidget:disabled { - color: #454545; - background-color: #383838; + color: #7a7a7a; + background-color: #404040; } QAbstractItemView @@ -469,8 +574,8 @@ QFrame border-radius: 0px; border-top: 1px solid #2b2b2b; border-left: 1px solid #2b2b2b; - border-bottom: 1px solid #767676; - border-right: 1px solid #767676; + border-bottom: 1px solid #494949; + border-right: 1px solid #494949; } QFrame[frameShape="0"] @@ -866,8 +971,8 @@ QTreeView, QListView { border-top: 1px solid #2b2b2b; border-left: 1px solid #2b2b2b; - border-bottom: 1px solid #767676; - border-right: 1px solid #767676; + border-bottom: 1px solid #494949; + border-right: 1px solid #494949; background-color: #404040; } From 17cdb92f5c9a91b4c7acf3703f961863a551aec2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Dec 2017 21:30:26 +0300 Subject: [PATCH 100/347] ts updated --- translations/limereport_ar.ts | 331 ++++++++++- translations/limereport_fr.ts | 1046 ++++++++++++++++++++++++--------- translations/limereport_ru.ts | 8 + 3 files changed, 1108 insertions(+), 277 deletions(-) diff --git a/translations/limereport_ar.ts b/translations/limereport_ar.ts index db8ac9c..46272ae 100644 --- a/translations/limereport_ar.ts +++ b/translations/limereport_ar.ts @@ -35,7 +35,7 @@ ChartItemEditor Form - نموذج + نموذج Series @@ -73,6 +73,14 @@ Ok موافق + + Series editor + + + + Series name + + ConnectionDialog @@ -884,6 +892,256 @@ p, li { white-space: pre-wrap; } + + LimeReport::EnumPropItem + + Default + + + + Portrait + + + + Landscape + + + + NoneAutoWidth + + + + MaxWordLength + + + + MaxStringLength + + + + TransparentMode + + + + OpaqueMode + + + + Angle0 + + + + Angle90 + + + + Angle180 + + + + Angle270 + + + + Angle45 + + + + Angle315 + + + + DateTime + + + + Double + + + + NoBrush + + + + SolidPattern + + + + Dense1Pattern + + + + Dense2Pattern + + + + Dense3Pattern + + + + Dense4Pattern + + + + Dense5Pattern + + + + Dense6Pattern + + + + Dense7Pattern + + + + HorPattern + + + + VerPattern + + + + CrossPattern + + + + BDiagPattern + + + + FDiagPattern + + + + LeftToRight + + + + RightToLeft + + + + LayoutDirectionAuto + + + + LeftItemAlign + + + + RightItemAlign + + + + CenterItemAlign + + + + ParentWidthItemAlign + + + + DesignedItemAlign + + + + HorizontalLine + + + + VerticalLine + + + + Ellipse + + + + Rectangle + + + + Page + + + + Band + + + + Horizontal + + + + Vertical + + + + VerticalUniform + + + + Pie + + + + VerticalBar + + + + HorizontalBar + + + + LegendAlignTop + + + + LegendAlignCenter + + + + LegendAlignBottom + + + + TitleAlignLeft + + + + TitleAlignRight + + + + TitleAlignCenter + + + + + LimeReport::FlagsPropItem + + NoLine + + + + TopLine + خط علوي + + + BottomLine + خط سفلي + + + LeftLine + خط أيسر + + + RightLine + خط أيمن + + LimeReport::FontEditorWidget @@ -970,6 +1228,17 @@ p, li { white-space: pre-wrap; } صورة + + LimeReport::ItemLocationPropItem + + Band + + + + Page + + + LimeReport::ItemsAlignmentEditorWidget @@ -1656,6 +1925,58 @@ p, li { white-space: pre-wrap; } keepGroupTogether + + endlessHeight + + + + extendedHeight + + + + isExtendedInDesignMode + + + + pageIsTOC + + + + setPageSizeToPrinter + + + + fillInSecondPass + + + + chartTitle + + + + chartType + + + + drawLegendBorder + + + + labelsField + + + + legendAlign + + + + series + + + + titleAlign + + LimeReport::RectMMPropItem @@ -2017,6 +2338,10 @@ This preview is no longer valid. Language %1 already exists + + Designer not found! + + LimeReport::ReportFooter @@ -2372,6 +2697,10 @@ This preview is no longer valid. Suppress absent fields and variables warning + + Use dark theme + + LimeReport::SubDetailBand diff --git a/translations/limereport_fr.ts b/translations/limereport_fr.ts index f893b30..e0a2492 100644 --- a/translations/limereport_fr.ts +++ b/translations/limereport_fr.ts @@ -1,6 +1,72 @@ + + $ClassName$ + + + $ClassName$ + + + + + ChartItemEditor + + + Series editor + + + + + Series + + + + + Add + + + + + Delete + + + + + Name + Nom + + + + Values field + + + + + Color + + + + + Type + Type + + + + Labels field + + + + + Ok + + + + + Series name + + + LRVariableDialog @@ -9,26 +75,44 @@ Variable - + Name Nom - + Value Valeur - + Type Type - + + Mandatory + + + + Attention + + LanguageSelectDialog + + + Dialog + + + + + Language + + + LimeReport::AboutDialog @@ -254,112 +338,112 @@ p, li { white-space: pre-wrap; } LimeReport::BandDesignIntf - + DataBand bande de données - + DataHeaderBand En-tête de données - + DataFooterBand Bande de pied de données - + ReportHeader En-tête du rapport - + ReportFooter Pied du rapport - + PageHeader En-tête de page - + PageFooter Pied de page - + SubDetailBand Bande de sous-détails - + SubDetailHeaderBand En-tête de sous-détails - + SubDetailFooterBand Pied de sous-détails - + GroupBandHeader Bande de groupe d'en-tête - + GroupBandFooter Bande de groupe de pieds - + TearOffBand Bande détachable - + connected to Connecté à - + Bring to top Placer au premier-plan - + Send to back Placer en arrière-plan - - + + Auto height Hauteur automatique - - + + Splittable Divisible - - + + Keep bottom space Garder l'espace inférieur - - + + Start from new page Démarrer depuis une nouvelle page - - + + Start new page Démarrer une nouvelle page @@ -367,37 +451,37 @@ p, li { white-space: pre-wrap; } LimeReport::BaseDesignIntf - + Copy Copier - + Cut Couper - + Paste Coller - + Bring to top Placer au premier-plan - + Send to back Placer en arrière-plan - + No borders Aucune bordure - + All borders Toutes les bordures @@ -405,8 +489,8 @@ p, li { white-space: pre-wrap; } LimeReport::ConnectionDesc - - + + defaultConnection Connexion par défaut @@ -523,6 +607,12 @@ p, li { white-space: pre-wrap; } Data Données + + + + useAlternateBackgroundColor + Utiliser les couleurs de fond alternative + LimeReport::DataBrowser @@ -652,7 +742,7 @@ p, li { white-space: pre-wrap; } LimeReport::DataFooterBand - + DataFooter Pied de données @@ -660,7 +750,7 @@ p, li { white-space: pre-wrap; } LimeReport::DataHeaderBand - + DataHeader En-tête de données @@ -668,41 +758,41 @@ p, li { white-space: pre-wrap; } LimeReport::DataSourceManager - + Connection "%1" is not open La connexion "%1" n'est pas ouverte - + Variable "%1" not found! Variable "%1" introuvable! - - + + Datasource "%1" not found! Source de donnée "%1" introuvable! - + Connection with name "%1" already exists! La connexion avec le nom "%1" existe déja! - - - - + + + + Datasource with name "%1" already exists! La source de donnée avec le nom "%1" existe déja! - + Database "%1" not found Base de données "%1 introuvable - + invalid connection Connexion invalide @@ -725,6 +815,44 @@ p, li { white-space: pre-wrap; } Variables externe + + LimeReport::DialogDesignerManager + + + Edit Widgets + + + + + Widget Box + + + + + Object Inspector + Inspecteur d'objets + + + + Property Editor + + + + + Signals && Slots Editor + + + + + Resource Editor + + + + + Action Editor + + + LimeReport::EnumPropItem @@ -962,31 +1090,76 @@ p, li { white-space: pre-wrap; } VerticalUniform + + + Pie + + + + + VerticalBar + + + + + HorizontalBar + + + + + LegendAlignTop + + + + + LegendAlignCenter + + + + + LegendAlignBottom + + + + + TitleAlignLeft + + + + + TitleAlignRight + + + + + TitleAlignCenter + + LimeReport::FlagsPropItem - + NoLine - + TopLine Ligne supérieur - + BottomLine Ligne inférieur - + LeftLine Ligne gauche - + RightLine Ligne droite @@ -994,17 +1167,17 @@ p, li { white-space: pre-wrap; } LimeReport::FontEditorWidget - + Font bold Caractères en gras - + Font Italic Caractères en italique - + Font Underline Caractères Soulignées @@ -1163,32 +1336,32 @@ p, li { white-space: pre-wrap; } LimeReport::ItemsBordersEditorWidget - + Top line ligne plus haut - + Bottom line Ligne plus bas - + Left line Ligne gauche - + Right line Ligne droite - + No borders Aucune bordure - + All borders Toutes les bordures @@ -1196,12 +1369,12 @@ p, li { white-space: pre-wrap; } LimeReport::MasterDetailProxyModel - + Field: "%1" not found in "%2" child datasource Le champ: "%1"est introuvable dans la source de donnée enfant "%2" - + Field: "%1" not found in "%2" master datasource Le champ: "%1"est introuvable dans la source de donnée principale "%2" @@ -1209,7 +1382,7 @@ p, li { white-space: pre-wrap; } LimeReport::ModelToDataSource - + model is destroyed Le modèle a été supprimé @@ -1241,10 +1414,34 @@ p, li { white-space: pre-wrap; } LimeReport::PageItemDesignIntf - + Paste Coller + + + + Page is TOC + + + + + + Reset page number + + + + + + Full page + + + + + + Set page size to printer + + LimeReport::PreviewReportWidget @@ -1254,12 +1451,12 @@ p, li { white-space: pre-wrap; } Formulaire - + PDF file name Nom du fichier PDF - + Report file name Nom du fichier du rapport @@ -1393,22 +1590,22 @@ p, li { white-space: pre-wrap; } Afficher la barre d'outil - + Page: - + Font Police - + Text align Alignement de texte - + of %1 de %1 @@ -1416,7 +1613,7 @@ p, li { white-space: pre-wrap; } LimeReport::ProxyHolder - + Datasource has been invalidated La source de donnée n'a pas été validée @@ -1901,17 +2098,82 @@ p, li { white-space: pre-wrap; } Joindre avec le groupe - + + endlessHeight + + + + + extendedHeight + + + + + isExtendedInDesignMode + + + + + pageIsTOC + + + + + setPageSizeToPrinter + + + + + fillInSecondPass + + + + + chartTitle + + + + + chartType + + + + + drawLegendBorder + + + + + labelsField + + + + + legendAlign + + + + + series + + + + + titleAlign + + + + Property Name Nom de la propriété - + Property value Valeur de la propriété - + Warning Avertissement @@ -1949,22 +2211,27 @@ p, li { white-space: pre-wrap; } LimeReport::ReportDesignWidget - + Script Script - + + Translations + + + + Report file name Nom du rapport - + Error Erreur - + Wrong file format Format de fichier incorrect @@ -1972,303 +2239,344 @@ p, li { white-space: pre-wrap; } LimeReport::ReportDesignWindow - + New Report Nouveau rapport - + New Report Page Nouvelle page - + Delete Report Page Supprimer une page - + Edit Mode Mode d'édition - + Undo Annuler - + Redo Répéter - + Copy Copier - + Paste Coller - + Cut Couper - + Settings Paramètres - + Use grid Utiliser la grille - + Use magnet Utiliser l'aimant - + Text Item Elément de texte - + Save Report Enregistrer le rapport - + Save Report As Enregistrer le rapport sous - + Load Report Ouvrir un rapport - + Delete item Supprimer élément - + Zoom In Zoom avant - + Zoom Out Zoom arrière - + Render Report Afficher l'aperçu du rapport - + Edit layouts mode Modifier le mode de mise en forme - + Horizontal layout Mise en page horizontale - + About A propos - + Hide left panel Masquer le panneau de gauche - + Hide right panel Masquer le panneau de droite - + + Delete dialog + + + + + Add new dialog + + + + Report Tools Outils de rapport - + Main Tools Outils principales - + Font Police - + Text alignment Alignement de texte - + Items alignment Alignement des éléments - + Borders Bordures - + Report bands Bandesde rapport - + Report Header En-tête du rapport - + Report Footer Pied de rapport - + Page Header En-tête de page - + Page Footer Pied de page - + Data Données - + Data Header En-tête de données - + Data Footer Pied de données - + SubDetail Sous-détails - + SubDetailHeader En-tête de sous-détails - + SubDetailFooter Pied de sous-détails - + GroupHeader En-tête de groupe - + GroupFooter Pied de groupe - + Tear-off Band Bande détachable - + File Fichier - + Edit Edition - + Info - + Recent Files Fichiers récents - + + Object Inspector Inspecteur d'objets - + Report structure Structure du rapport - + + Widget Box + + + + + Property Editor + + + + + Action Editor + + + + + Resource Editor + + + + + SignalSlot Editor + + + + + Dialog Designer Tools + + + + Data Browser Navigateur de données - + Script Browser Navigateur de script - + Report has been modified! Do you want save the report? Le rapport a été modifié! Voulez-vous l'enregistrer? - - + + Report file name Nom du fichier du rapport - + Rendering report Afficher l'aperçu du rapport - + Abort Quitter - + page rendered du rendu de la page - + Warning Avertissement - + File "%1" not found! Fichier "%1" introuvable! @@ -2276,22 +2584,22 @@ p, li { white-space: pre-wrap; } LimeReport::ReportEnginePrivate - + Preview Aperçu avant impression - + Error Erreur - + Report File Change Nom du fichier changé - + The report file "%1" has changed names or been deleted. This preview is no longer valid. @@ -2299,6 +2607,16 @@ This preview is no longer valid. Cet aperçu n'est plus valide. + + + Designer not found! + + + + + Language %1 already exists + + LimeReport::ReportFooter @@ -2319,25 +2637,24 @@ Cet aperçu n'est plus valide. LimeReport::ReportRender - - - - + + + Error Erreur - + page index out of range Indice de la page dépassé - + Databand "%1" not found Bande de données "%1 introuvable - + Wrong using function %1 Utilisation incorrecte de la fonction "%1" @@ -2511,130 +2828,212 @@ Cet aperçu n'est plus valide. Nom - + NO CATEGORY AUCUNE CATEGORIE - - - + + + Error Erreur - + Dialog with name: %1 already exists Le dialogue avec le nom "%1" existe déja - + ui file must cointain QDialog instead QWidget or QMainWindow Le fichier ui doit contenir un QDialog au lieu de QWidget ou QMainWindow - + wrong file format Format de fichier incorrect + + LimeReport::ScriptEditor + + + Form + Formulaire + + + + Data + Données + + + + Functions + Fonctions + + LimeReport::ScriptEngineContext - + Dialog with name: %1 can`t be created Le dialogue avec le nom "%1" ne peut pas être crée + + + + Error + Erreur + LimeReport::ScriptEngineManager - + GROUP FUNCTIONS Fonctions de groupe - - - - - - - - + + + + + + + Value Valeur - - + + BandName Nom de la bande - + + Function manger with name "%1" already exists! + + + + + FieldName + + + + Variable %1 not found Variable "%1" introuvable - + + Field %1 not found in %2! + + + + SYSTEM Système - - - + + + NUMBER Nombre - - - - + + + + Format - + Precision Précision - - + + Locale Local - - - + - + + + DATE&TIME DATE&HEURE - + CurrencySymbol Symbolde de la monnaie - - - + + + + + + + GENERAL - - - + + + Name Nom + + + Datasource + Source de donnée + + + + ValueField + + + + + KeyField + + + + + KeyFieldValue + + + + + Unique identifier + + + + + Content + Contenu + + + + Indent + + + + + datasourceName + + LimeReport::SettingDialog @@ -2669,12 +3068,17 @@ Cet aperçu n'est plus valide. Grille horizontale - + + Use dark theme + + + + Report Setting Paramètres du rapport - + Suppress absent fields and variables warning Effacer les messages d'absences de champs et d'avertissement de variables @@ -2706,33 +3110,33 @@ Cet aperçu n'est plus valide. LimeReport::TextAlignmentEditorWidget - + Text align left Aligner le texte à gauche - - + + Text align center Aligner le texte au milieu - + Text align right Aligner le texte à droite - + Text align justify Justifier le texte - + Text align top Aligner le texte en haut - + Text align bottom Aligner le texte en bas @@ -2741,47 +3145,53 @@ Cet aperçu n'est plus valide. LimeReport::TextItem - + Edit Edition - + Auto height Hauteur automatique - + Allow HTML Interpréter HTML - + Allow HTML in fields Interpréter HTML dans les champs - + Stretch to max height Etirer à la hauteur maximale - + + + Transparent + + + + Error Erreur - + TextItem " %1 " already has folower " %2 " L'élément texte " %1 " a toujours un copain " %2 " - + TextItem " %1 " not found! Elément "%1" introuvable! @@ -2799,58 +3209,115 @@ Cet aperçu n'est plus valide. Contenu - Data - Données + Données - Functions - Fonctions + Fonctions - + Editor settings Paramètres de l'éditeur - + Editor font Police - + ... - + Ok - + Ctrl+Return Ctrl+Arrière - + Cancel Annuler - + Esc Echap + + LimeReport::TranslationEditor + + + Form + Formulaire + + + + Languages + + + + + + ... + + + + + Pages + + + + + Strings + + + + + Source Text + + + + + Translation + + + + + Checked + + + + + Report Item + + + + + Property + + + + + Source text + + + LimeReport::VariablesHolder - + variable with name La variable avec le nom @@ -2862,7 +3329,7 @@ Cet aperçu n'est plus valide. - + does not exists! n'existe pas! @@ -2872,45 +3339,45 @@ Cet aperçu n'est plus valide. - + Data Données - + DataHeader En-tête de données - + DataFooter Pied de données - + GroupHeader En-tête de groupe - + GroupFooter Pied de groupe - + Page Footer Pied de page - + Page Header En-tête de page @@ -2929,67 +3396,67 @@ Cet aperçu n'est plus valide. - + SubDetail Sous-détails - + SubDetailHeader En-tête de sous-détails - + SubDetailFooter Pied de sous-détails - + Tear-off Band Bande détachable - + alignment Alignement - + Barcode Item Elément de code barre - + HLayout - + Image Item - + Shape Item - + itemLocation - + Text Item @@ -3000,122 +3467,123 @@ Cet aperçu n'est plus valide. Connexion invalidé %1 - + Master datasource "%1" not found! Source de donnée principale "%1" introuvable! - + Master datasouce "%1" not found! Source de donnée principale "%1" introuvable! - + Child Enfant - + and child est enfant - + datasouce "%1" not found! Source de donnée "%1" introuvable! - + bool - + QColor - + content Contenu - - + + + datasource Source de donnée - - + + field Champ - + enum - - + + flags - + QFont - + QImage - + int - - + + qreal - + QRect - + QRectF - + geometry - + QString @@ -3131,39 +3599,65 @@ Cet aperçu n'est plus valide. Les éléments sélectionnés ont un parent différent - + Object with name %1 already exists! L'objet avec le nom "%1" existe déja! - + Function %1 not found or have wrong arguments La fonction %1 est introuvable ou contient des paramètres incorrects + + + Datasource manager not found + + mm - + Wrong file format Format de fichier incorrect - + File %1 not opened Fichier "%1" n'est pas ouvert - + Content string is empty Contenu vide - + Content is empty Contenu vide + + + + Chart Item + + + + + First + + + + + Second + + + + + Thrid + + diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 214aba9..e5de8e5 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -2157,6 +2157,10 @@ This preview is no longer valid. Language %1 already exists Перевод %1 уже существует! + + Designer not found! + Дезайнер не найден + LimeReport::ReportFooter @@ -2508,6 +2512,10 @@ This preview is no longer valid. Suppress absent fields and variables warning Скрывать предупреждения об отсутсвующих полях и переменных + + Use dark theme + Темная схема оформления + LimeReport::SubDetailBand From 41dec61d020f07366513ef23910a563c44ced049 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Dec 2017 21:30:54 +0300 Subject: [PATCH 101/347] ts updated --- translations/limereport_es_ES.ts | 333 ++++++++++++++++++++++++++++++- 1 file changed, 329 insertions(+), 4 deletions(-) diff --git a/translations/limereport_es_ES.ts b/translations/limereport_es_ES.ts index 9cca063..3e69d43 100644 --- a/translations/limereport_es_ES.ts +++ b/translations/limereport_es_ES.ts @@ -10,10 +10,6 @@ ChartItemEditor - - Form - - Series @@ -50,6 +46,14 @@ Ok + + Series editor + + + + Series name + + LRVariableDialog @@ -724,6 +728,256 @@ p, li { white-space: pre-wrap; } + + LimeReport::EnumPropItem + + Default + + + + Portrait + + + + Landscape + + + + NoneAutoWidth + + + + MaxWordLength + + + + MaxStringLength + + + + TransparentMode + + + + OpaqueMode + + + + Angle0 + + + + Angle90 + + + + Angle180 + + + + Angle270 + + + + Angle45 + + + + Angle315 + + + + DateTime + + + + Double + + + + NoBrush + + + + SolidPattern + + + + Dense1Pattern + + + + Dense2Pattern + + + + Dense3Pattern + + + + Dense4Pattern + + + + Dense5Pattern + + + + Dense6Pattern + + + + Dense7Pattern + + + + HorPattern + + + + VerPattern + + + + CrossPattern + + + + BDiagPattern + + + + FDiagPattern + + + + LeftToRight + + + + RightToLeft + + + + LayoutDirectionAuto + + + + LeftItemAlign + + + + RightItemAlign + + + + CenterItemAlign + + + + ParentWidthItemAlign + + + + DesignedItemAlign + + + + HorizontalLine + + + + VerticalLine + + + + Ellipse + + + + Rectangle + + + + Page + + + + Band + + + + Horizontal + + + + Vertical + + + + VerticalUniform + + + + Pie + + + + VerticalBar + + + + HorizontalBar + + + + LegendAlignTop + + + + LegendAlignCenter + + + + LegendAlignBottom + + + + TitleAlignLeft + + + + TitleAlignRight + + + + TitleAlignCenter + + + + + LimeReport::FlagsPropItem + + NoLine + + + + TopLine + + + + BottomLine + + + + LeftLine + + + + RightLine + + + LimeReport::FontEditorWidget @@ -810,6 +1064,17 @@ p, li { white-space: pre-wrap; } + + LimeReport::ItemLocationPropItem + + Band + + + + Page + + + LimeReport::ItemsAlignmentEditorWidget @@ -1473,6 +1738,58 @@ p, li { white-space: pre-wrap; } keepGroupTogether + + endlessHeight + + + + extendedHeight + + + + isExtendedInDesignMode + + + + pageIsTOC + + + + setPageSizeToPrinter + + + + fillInSecondPass + + + + chartTitle + + + + chartType + + + + drawLegendBorder + + + + labelsField + + + + legendAlign + + + + series + + + + titleAlign + + LimeReport::RectMMPropItem @@ -1818,6 +2135,10 @@ This preview is no longer valid. Language %1 already exists + + Designer not found! + + LimeReport::ReportFooter @@ -2161,6 +2482,10 @@ This preview is no longer valid. Suppress absent fields and variables warning + + Use dark theme + + LimeReport::SubDetailBand From 09754e6906258ad0d2a01b5a9923fb014bb05db3 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 14 Dec 2017 02:28:52 +0300 Subject: [PATCH 102/347] QJSEngine will be used if Qt version 5.6 and higher --- common.pri | 5 +- .../change_item_from_script.lrxml | 90 +++-- .../change_item_from_script.lrxml | 321 +++++++++++------- limereport/lrscriptenginemanager.cpp | 63 +++- limereport/lrscriptenginemanager.h | 20 +- limereport/scripteditor/lrscripteditor.cpp | 3 +- 6 files changed, 319 insertions(+), 183 deletions(-) diff --git a/common.pri b/common.pri index ce2a2c7..b8ea7a9 100644 --- a/common.pri +++ b/common.pri @@ -4,10 +4,13 @@ CONFIG *= build_translations CONFIG *= zint } -!contains(CONFIG, qtscriptengine){ +!contains(CONFIG, qtscriptengine): +greaterThan(QT_MAJOR_VERSION, 4): +greaterThan(QT_MINOR_VERSION, 5){ CONFIG *= qjsengine } + !contains(CONFIG, no_formdesigner){ CONFIG *= dialogdesigner } diff --git a/demo_r1/demo_reports/change_item_from_script.lrxml b/demo_r1/demo_reports/change_item_from_script.lrxml index 6d92ba8..301c326 100644 --- a/demo_r1/demo_reports/change_item_from_script.lrxml +++ b/demo_r1/demo_reports/change_item_from_script.lrxml @@ -1,27 +1,27 @@ - + - + page1 - + - + - + ReportPage1 - + - + DataBand1 - + - + TextItem2 - + @@ -51,7 +51,7 @@ if ($D{customers.CustomerID}=="ANTON"){ - + @@ -65,6 +65,13 @@ if ($D{customers.CustomerID}=="ANTON"){ + + + + + + + @@ -78,6 +85,7 @@ if ($D{customers.CustomerID}=="ANTON"){ + customers @@ -88,14 +96,16 @@ if ($D{customers.CustomerID}=="ANTON"){ + + - + ReportHeader1 - + - + TextItem1 - + @@ -107,10 +117,10 @@ if ($D{customers.CustomerID}=="ANTON"){ $S{ -var color = new QColor('#DEB887'); -var font = new QFont('Times New Roman',26,false,true); +var color = LimeReport.color('#DEB887'); +var font = LimeReport.font('Times New Roman',26,false,true); THIS.backgroundColor = color; -THIS.fontColor = QColor('red'); +THIS.fontColor = LimeReport.color('red'); THIS.font = font; 'Test'} @@ -118,7 +128,7 @@ THIS.font = font; - + @@ -132,10 +142,17 @@ THIS.font = font; + + + + + + + - + TextItem3 - + @@ -151,7 +168,7 @@ THIS.font = font; - + @@ -165,6 +182,13 @@ THIS.font = font; + + + + + + + @@ -178,8 +202,10 @@ THIS.font = font; + + @@ -197,13 +223,19 @@ THIS.font = font; + + + + + + - + datasources - + test QSQLITE @@ -212,10 +244,11 @@ THIS.font = font; + - + customers Select * from customers limit 5 @@ -225,18 +258,21 @@ THIS.font = font; - + TestName TestValue + + - + + diff --git a/demo_r2/demo_reports/change_item_from_script.lrxml b/demo_r2/demo_reports/change_item_from_script.lrxml index 2e79dbc..63d93d4 100644 --- a/demo_r2/demo_reports/change_item_from_script.lrxml +++ b/demo_r2/demo_reports/change_item_from_script.lrxml @@ -1,35 +1,37 @@ + - + - + page1 - - - - - - - + + + + + + + ReportPage1 - + - + DataBand1 - + - + TextItem2 - + - - + + DataBand1 - - - - - + + + + + + $S{ var selectedItemBegin = '<span style="background:black; color:red; font-weight:bold ">'; @@ -45,152 +47,208 @@ if ($D{customers.CustomerID}=="ANTON"){ '<span>Customer: </span>'+customer; } - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + ReportPage1 - - - - - + + + + + + - - + + + customers - - - - - - - + + + + + + + + + + - + ReportHeader1 - + - + TextItem1 - + - - + + ReportHeader1 - - - - - + + + + + + $S{ -var color = new QColor('#DEB887'); -var font = new QFont('Times New Roman',26,false,true); +var color = LimeReport.color('#DEB887'); +var font = LimeReport.font('Times New Roman',26,false,true); THIS.backgroundColor = color; -THIS.fontColor = QColor('red'); +THIS.fontColor = LimeReport.color('red'); THIS.font = font; 'Test'} - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - + TextItem3 - + - - + + ReportHeader1 - - - - - + + + + + + <p> <span>test1</span> <span style="background:red">test</span> </p> - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - + + ReportPage1 - - - - - + + + + + + - - - + + + + + - - + + - - - - - - - - - + + + + + + + + + + + + + + + + + + - + datasources - + test QSQLITE - ./demo_reports/northwind.db + /home/alex/Work/C++Projects/LimeReport/build/5.6.2/linux64/release/demo_r1/demo_reports/northwind.db - + - + + - + customers Select * from customers limit 5 @@ -200,12 +258,21 @@ THIS.font = font; - + TestName TestValue + + + + + + + + + diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 440fdfd..b5c1a8f 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -273,7 +273,10 @@ bool ScriptEngineManager::containsFunction(const QString& functionName){ } #ifndef USE_QJSENGINE -Q_DECL_DEPRECATED bool ScriptEngineManager::addFunction(const QString& name, +#if QT_VERSION > 0x050600 +Q_DECL_DEPRECATED +#endif +bool ScriptEngineManager::addFunction(const QString& name, QScriptEngine::FunctionSignature function, const QString& category, const QString& description) @@ -345,11 +348,6 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ addFunction(describer); } -// qDebug()<<"is script context exists before set datamanager is called"<< (m_context == 0); - -// ICallbackDatasource* tableOfContents = m_dataManager->createCallbackDatasource("tableofcontents"); -// connect(tableOfContents, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), -// m_tableOfContents, SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); } } } @@ -1548,11 +1546,7 @@ void ScriptFunctionsManager::clearTableOfContents() scriptEngineManager()->clearTableOfContents(); } - - -#ifdef USE_QJSENGINE - -QFont ScriptFunctionsManager::font(const QString &family, int pointSize, bool bold, bool italic, bool underLine) +QFont ScriptFunctionsManager::font(const QString &family, int pointSize, bool italic, bool bold, bool underLine) { QFont result (family, pointSize); result.setBold(bold); @@ -1561,6 +1555,8 @@ QFont ScriptFunctionsManager::font(const QString &family, int pointSize, bool bo return result; } +#ifdef USE_QJSENGINE + void ScriptFunctionsManager::addItemsToComboBox(QJSValue object, const QStringList &values) { QComboBox* comboBox = dynamic_cast(object.toQObject()); @@ -1599,7 +1595,48 @@ QJSValue ScriptFunctionsManager::createWrapper(QJSValue item) return QJSValue(); } +#else + +void ScriptFunctionsManager::addItemsToComboBox(QScriptValue object, const QStringList &values) +{ + QComboBox* comboBox = dynamic_cast(object.toQObject()); + if (comboBox){ + comboBox->addItems(values); + } +} + +void ScriptFunctionsManager::addItemToComboBox(QScriptValue object, const QString &value) +{ + QComboBox* comboBox = dynamic_cast(object.toQObject()); + if (comboBox){ + comboBox->addItem(value); + } +} + +QScriptValue ScriptFunctionsManager::createComboBoxWrapper(QScriptValue comboBox) +{ + QComboBox* item = dynamic_cast(comboBox.toQObject()); + if (item){ + ComboBoxWrapper* wrapper = new ComboBoxWrapper(item); + return m_scriptEngineManager->scriptEngine()->newQObject(wrapper); + } + return QScriptValue(); +} + +QScriptValue ScriptFunctionsManager::createWrapper(QScriptValue item) +{ + QObject* object = item.toQObject(); + if (object){ + IWrapperCreator* wrapper = m_wrappersFactory.value(object->metaObject()->className()); + if (wrapper){ + return m_scriptEngineManager->scriptEngine()->newQObject(wrapper->createWrapper(item.toQObject())); + } + } + return QScriptValue(); +} + #endif + QFont ScriptFunctionsManager::font(QVariantMap params){ if (!params.contains("family")){ return QFont(); @@ -1694,7 +1731,7 @@ void LimeReport::TableOfContents::clear(){ } -#ifdef USE_QJSENGINE +//#ifdef USE_QJSENGINE QObject* ComboBoxWrapperCreator::createWrapper(QObject *item) { @@ -1705,7 +1742,7 @@ QObject* ComboBoxWrapperCreator::createWrapper(QObject *item) return 0; } -#endif +//#endif #ifndef USE_QJSENGINE void ComboBoxPrototype::addItem(const QString &text) diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 2549890..1586068 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -263,7 +263,6 @@ private: QString m_scriptWrapper; }; - #ifndef USE_QJSENGINE class ComboBoxPrototype : public QObject, public QScriptable{ Q_OBJECT @@ -275,8 +274,6 @@ public slots: }; #endif -#ifdef USE_QJSENGINE - class IWrapperCreator{ public: virtual QObject* createWrapper(QObject* item) = 0; @@ -298,20 +295,15 @@ private: QObject* createWrapper(QObject* item); }; -#endif - class ScriptFunctionsManager : public QObject{ Q_OBJECT public: explicit ScriptFunctionsManager(QObject* parent = 0):QObject(parent){ -#ifdef USE_QJSENGINE m_wrappersFactory.insert("QComboBox",new ComboBoxWrapperCreator()); -#endif + } ~ScriptFunctionsManager(){ -#ifdef USE_QJSENGINE foreach(IWrapperCreator* wrapper, m_wrappersFactory.values()){ delete wrapper;} m_wrappersFactory.clear(); -#endif } Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName); Q_INVOKABLE QVariant line(const QString& bandName); @@ -331,13 +323,17 @@ public: Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} Q_INVOKABLE void addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent = 0); Q_INVOKABLE void clearTableOfContents(); - + Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); #ifdef USE_QJSENGINE - Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); Q_INVOKABLE void addItemsToComboBox(QJSValue object, const QStringList& values); Q_INVOKABLE void addItemToComboBox(QJSValue object, const QString& value); Q_INVOKABLE QJSValue createComboBoxWrapper(QJSValue comboBox); Q_INVOKABLE QJSValue createWrapper(QJSValue item); +#else + Q_INVOKABLE void addItemsToComboBox(QScriptValue object, const QStringList& values); + Q_INVOKABLE void addItemToComboBox(QScriptValue object, const QString& value); + Q_INVOKABLE QScriptValue createComboBoxWrapper(QScriptValue comboBox); + Q_INVOKABLE QScriptValue createWrapper(QScriptValue item); #endif Q_INVOKABLE QFont font(QVariantMap params); ScriptEngineManager *scriptEngineManager() const; @@ -345,9 +341,7 @@ public: static QColor createQColor(const QString& color){ return QColor(color);} private: ScriptEngineManager* m_scriptEngineManager; -#ifdef USE_QJSENGINE QMap m_wrappersFactory; -#endif }; class ScriptEngineManager : public QObject, public Singleton, public IScriptEngineManager diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 667a238..a661e1c 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -89,9 +89,8 @@ void ScriptEditor::initCompleter() if (m_page) dm = m_page->datasourceManager(); - ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); - #ifdef USE_QJSENGINE + ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); QJSValue globalObject = se.scriptEngine()->globalObject(); QJSValueIterator it(globalObject); while (it.hasNext()){ From 5191b26453f13f49750ef35016d11ad9e82e812c Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 14 Dec 2017 02:35:20 +0300 Subject: [PATCH 103/347] French translation has been updated --- translations/limereport_fr.ts | 298 +++++++++++++++++----------------- 1 file changed, 149 insertions(+), 149 deletions(-) diff --git a/translations/limereport_fr.ts b/translations/limereport_fr.ts index e0a2492..1fe39ec 100644 --- a/translations/limereport_fr.ts +++ b/translations/limereport_fr.ts @@ -6,7 +6,7 @@ $ClassName$ - + @@ -14,57 +14,57 @@ Series editor - + Editeur de séries Series - + Séries Add - + Ajouter Delete - + Supprimer Name - Nom + Nom Values field - + Valeur Color - + Couleur Type - Type + Type Labels field - + Libellés Ok - + Series name - + Nom des séries @@ -92,7 +92,7 @@ Mandatory - + Obligatoire @@ -105,12 +105,12 @@ Dialog - + Language - + Langue @@ -611,7 +611,7 @@ p, li { white-space: pre-wrap; } useAlternateBackgroundColor - Utiliser les couleurs de fond alternative + Utiliser les couleurs de fond alternative @@ -820,37 +820,37 @@ p, li { white-space: pre-wrap; } Edit Widgets - + Editeur de Widgets Widget Box - + Boite de Widget Object Inspector - Inspecteur d'objets + Inspecteur d'objet Property Editor - + Editeur de propriété Signals && Slots Editor - + Editeur de Signaux & Slots Resource Editor - + Editeur de ressource Action Editor - + Editeur d'action @@ -858,282 +858,282 @@ p, li { white-space: pre-wrap; } Default - + Défaut Portrait - + Landscape - + Paysage NoneAutoWidth - + Aucune largeur automatique MaxWordLength - + Longueur de mot maximale MaxStringLength - + Longueur de chaîne maximale TransparentMode - + Mode transparence OpaqueMode - + Mode opaque Angle0 - + Angle90 - + Angle180 - + Angle270 - + Angle45 - + Angle315 - + DateTime - + Date & Heure Double - + NoBrush - + Aucun motif SolidPattern - + Motif solide Dense1Pattern - + Motif dense 1 Dense2Pattern - + Motif dense 2 Dense3Pattern - + Motif dense 3 Dense4Pattern - + Motif dense 4 Dense5Pattern - + Motif dense 5 Dense6Pattern - + Motif dense 6 Dense7Pattern - + Motif dense 7 HorPattern - + Motif horizontal VerPattern - + Motif vertical CrossPattern - + Motif croisé BDiagPattern - + FDiagPattern - + LeftToRight - + De gauche droite RightToLeft - + De droite à gauche LayoutDirectionAuto - + Orientation de mise en page auto LeftItemAlign - + Aligner l'élement à gauche RightItemAlign - + Aligner l'élement à droite CenterItemAlign - + Aligner l'élement au centre ParentWidthItemAlign - + Aligner la largeur du parent DesignedItemAlign - + Aligner un objet stylé HorizontalLine - + Ligne horizontale VerticalLine - + Ligne verticale Ellipse - + Ellipse Rectangle - + Rectangle Page - + Page Band - + Bande Horizontal - + Horizontal Vertical - + Vertical VerticalUniform - + Uniforme verticale Pie - + Graphe VerticalBar - + Barre verticale HorizontalBar - + Barre horizontale LegendAlignTop - + Aligner la légende en haut LegendAlignCenter - + Aligner la légende au centre LegendAlignBottom - + Aligner la légende en bas TitleAlignLeft - + Aligner le titre à gauche TitleAlignRight - + Aligner le titre à droite TitleAlignCenter - + Aligner le titre au centre @@ -1141,27 +1141,27 @@ p, li { white-space: pre-wrap; } NoLine - + Aucune ligne TopLine - Ligne supérieur + Ligne supérieur BottomLine - Ligne inférieur + Ligne inférieur LeftLine - Ligne gauche + Ligne gauche RightLine - Ligne droite + Ligne droite @@ -1272,12 +1272,12 @@ p, li { white-space: pre-wrap; } Band - + Bande Page - + Page @@ -1422,25 +1422,25 @@ p, li { white-space: pre-wrap; } Page is TOC - + Table des contenus Reset page number - + Réinitialiser le numéro de page Full page - + Page entière Set page size to printer - + Définir la taille de la page à l'imprimante @@ -1759,7 +1759,7 @@ p, li { white-space: pre-wrap; } alignment - Alignement + Alignement @@ -2100,67 +2100,67 @@ p, li { white-space: pre-wrap; } endlessHeight - + Hauteur illimitée extendedHeight - + Hauteur étendue isExtendedInDesignMode - + Mode de style étendu pageIsTOC - + Table des contenus setPageSizeToPrinter - + Définir la taille de la page à l'imprimante fillInSecondPass - + Remplir le deuxieme passage chartTitle - + Titre du graphe chartType - + Type de graphe drawLegendBorder - + Dessiner les bordures de la légende labelsField - + Libellé legendAlign - + Alignement de la légende series - + Séries titleAlign - + Alignement du titre @@ -2218,7 +2218,7 @@ p, li { white-space: pre-wrap; } Translations - + Traductions @@ -2366,12 +2366,12 @@ p, li { white-space: pre-wrap; } Delete dialog - + Supprimer la boite du dialogue Add new dialog - + Ajouter une boite de dialogue @@ -2507,32 +2507,32 @@ p, li { white-space: pre-wrap; } Widget Box - + Boite de Widget Property Editor - + Editeur de propriété Action Editor - + Editeur d'action Resource Editor - + Editeur de ressource SignalSlot Editor - + Editeur de Signaux & Slots Dialog Designer Tools - + Boite à outils du Designer @@ -2610,12 +2610,12 @@ Cet aperçu n'est plus valide. Designer not found! - + Designer introuvable! Language %1 already exists - + La langue %1 existe déja @@ -2860,17 +2860,17 @@ Cet aperçu n'est plus valide. Form - Formulaire + Formulaire Data - Données + Données Functions - Fonctions + Fonctions @@ -2884,7 +2884,7 @@ Cet aperçu n'est plus valide. Error - Erreur + Erreur @@ -2914,12 +2914,12 @@ Cet aperçu n'est plus valide. Function manger with name "%1" already exists! - + La fonction "%1" existe déja! FieldName - + Nom du champ @@ -2929,7 +2929,7 @@ Cet aperçu n'est plus valide. Field %1 not found in %2! - + Champ "%1 introuvable dans %2! @@ -2997,42 +2997,42 @@ Cet aperçu n'est plus valide. Datasource - Source de donnée + Source de donnée ValueField - + Valeur KeyField - + Clé KeyFieldValue - + Valeur de la clé Unique identifier - + Identifiant unique Content - Contenu + Contenu Indent - + Indenter datasourceName - + Nom de source de donnée @@ -3070,7 +3070,7 @@ Cet aperçu n'est plus valide. Use dark theme - + Utiliser le thème sombre @@ -3177,7 +3177,7 @@ Cet aperçu n'est plus valide. Transparent - + Transparent @@ -3257,58 +3257,58 @@ Cet aperçu n'est plus valide. Form - Formulaire + Formulaire Languages - + Langues ... - + Pages - + Pages Strings - + Chaînes de caractère Source Text - + Texte source Translation - + Traduction Checked - + Vérifié Report Item - + Element du rapport Property - + Propriété Source text - + Texte source @@ -3422,7 +3422,7 @@ Cet aperçu n'est plus valide. alignment - Alignement + Alignement @@ -3611,7 +3611,7 @@ Cet aperçu n'est plus valide. Datasource manager not found - + Gestionnaire de source de donnée introuvable @@ -3642,22 +3642,22 @@ Cet aperçu n'est plus valide. Chart Item - + Elément du graphe First - + Prémier Second - + Second Thrid - + Troisième From be2b187d4f5561f337f0854bf27f441bbc173c71 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 15 Dec 2017 13:20:15 +0300 Subject: [PATCH 104/347] Russian translation updated --- translations/limereport_ru.ts | 619 +++++----------------------------- 1 file changed, 81 insertions(+), 538 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index e5de8e5..7d0f7ef 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1,64 +1,6 @@ - - $ClassName$ - - $ClassName$ - - - - - ChartItemEditor - - Form - Форма - - - Series - Серии - - - Add - Добавить - - - Delete - Удалить - - - Name - Наименование - - - Values field - Значения - - - Color - Цвет - - - Type - Тип - - - Labels field - Подписи - - - Ok - Ок - - - Series name - Серии - - - Series editor - Редактор серий - - LRVariableDialog @@ -67,7 +9,7 @@ Name - Имя переменной + Имя Value @@ -81,21 +23,6 @@ Attention Внимание - - Mandatory - Обязательная - - - - LanguageSelectDialog - - Dialog - Диалог - - - Language - Язык - LimeReport::AboutDialog @@ -348,10 +275,6 @@ p, li { white-space: pre-wrap; } PageFooter Нижний колонтитул - - Subdetail - Подчиненный - DataHeaderBand Заголовок данных @@ -360,18 +283,6 @@ p, li { white-space: pre-wrap; } DataFooterBand Завершение данных - - SubdetailBand - Подчиненные данные - - - SubdetailHeaderBand - Заголовок подчиненных данных - - - SubdetailFooterBand - Завершение подчиненных данных - GroupBandHeader Заголовок группы @@ -382,7 +293,7 @@ p, li { white-space: pre-wrap; } TearOffBand - Полоса для отрывания + Полоса отрыва SubDetailBand @@ -530,23 +441,12 @@ p, li { white-space: pre-wrap; } уже существует! - - LimeReport::ContentItemDesignIntf - - Variable %1 not found - Переменная %1 не найдена - - LimeReport::DataBand Data Данные - - useAlternateBackgroundColor - Использовать альтернативный цвет фона - LimeReport::DataBrowser @@ -602,17 +502,13 @@ p, li { white-space: pre-wrap; } System variables Системные переменные - - User variables - Пользовательские переменные - Error Ошибка ... - + ... Grab variable @@ -628,7 +524,7 @@ p, li { white-space: pre-wrap; } Do you really want to delete "%1" connection? - Вы действительно хотите удалить "%1" соединение? + Вы действительно хотите удалить соединение "%1"? Do you really want to delete "%1" datasource? @@ -643,7 +539,7 @@ p, li { white-space: pre-wrap; } LimeReport::DataFooterBand DataFooter - Подвал данных + Завершение данных @@ -669,20 +565,12 @@ p, li { white-space: pre-wrap; } Database "%1" not found - База данных "%1;" не найдена + База данных "%1" не найдена Datasource "%1" not found! Источник данных "%1" не найден! - - connection with name "%1" already exists! - соединение "%1" уже существует! - - - datasource with name "%1" already exists! - источник данных "%1" уже существует! - Connection with name "%1" already exists! Соединение "%1" уже существует! @@ -707,37 +595,6 @@ p, li { white-space: pre-wrap; } Внешние переменные - - LimeReport::DialogDesignerManager - - Edit Widgets - Редактировать виджеты - - - Widget Box - Панель виджетов - - - Object Inspector - Инспектор объектов - - - Property Editor - Редактор свойств - - - Signals && Slots Editor - Редактор сигналов и слотов - - - Resource Editor - Редактор ресурсов - - - Action Editor - Редактор действий - - LimeReport::EnumPropItem @@ -770,7 +627,7 @@ p, li { white-space: pre-wrap; } OpaqueMode - Заливка + Непрозрачный Angle0 @@ -806,71 +663,71 @@ p, li { white-space: pre-wrap; } NoBrush - Нет заливки + Нет заполнения SolidPattern - Сплошная заливка + Сплошное заполнение Dense1Pattern - + Плотное заполнение 1 Dense2Pattern - + Плотное заполнение 2 Dense3Pattern - + Плотное заполнение 3 Dense4Pattern - + Плотное заполнение 4 Dense5Pattern - + Плотное заполнение 5 Dense6Pattern - + Плотное заполнение 6 Dense7Pattern - + Плотное заполнение 7 HorPattern - + Горизонтальное заполнение VerPattern - + Вертикальное заполнение CrossPattern - + Перекрестное заполнение BDiagPattern - + Обратное диагональное заполнение FDiagPattern - + Прямое диагональное заполнение LeftToRight - Слева на право + Слева направо RightToLeft - С права на лево + Справа налево LayoutDirectionAuto - Авто + Автоматически LeftItemAlign @@ -902,7 +759,7 @@ p, li { white-space: pre-wrap; } Ellipse - Элипс + Эллипс Rectangle @@ -928,42 +785,6 @@ p, li { white-space: pre-wrap; } VerticalUniform Вертикально равномерно - - Pie - Круговая - - - VerticalBar - Вертикальные столбцы - - - HorizontalBar - Горизонтальные столбцы - - - LegendAlignTop - Сверху - - - LegendAlignCenter - По центру - - - LegendAlignBottom - Снизу - - - TitleAlignLeft - Слева - - - TitleAlignRight - Справа - - - TitleAlignCenter - По цетру - LimeReport::FlagsPropItem @@ -1030,7 +851,7 @@ p, li { white-space: pre-wrap; } LimeReport::GroupBandFooter GroupFooter - Подвал группы + Завершение группы @@ -1041,7 +862,7 @@ p, li { white-space: pre-wrap; } Group field not found - Поле группы не найдено + Поле для группировки не найдено Datasource "%1" not found! @@ -1064,7 +885,7 @@ p, li { white-space: pre-wrap; } Wrong script syntax "%1" - Неправильный синтаксис скрипта "%1" + Неверный синтаксис скрипта "%1" @@ -1200,22 +1021,6 @@ p, li { white-space: pre-wrap; } Paste Вставить - - Page is TOC - - - - Reset page number - - - - Full page - - - - Set page size to printer - - LimeReport::PreviewReportWidget @@ -1286,10 +1091,6 @@ p, li { white-space: pre-wrap; } First Page Первая страница - - First page - Первая страница - Last Page Последняя страница @@ -1308,7 +1109,7 @@ p, li { white-space: pre-wrap; } Preview - Предпросмотр + Предосмотр Ctrl+P @@ -1332,11 +1133,7 @@ p, li { white-space: pre-wrap; } Show Toolbar - Показывать Панель Инструментов - - - Show toolbar - Показывать Панель Инструментов + Показать панель инструментов Font @@ -1346,12 +1143,20 @@ p, li { white-space: pre-wrap; } Text align Выравнивание текста + + First page + Первая страница + + + Show toolbar + Показать панель инструментов + LimeReport::ProxyHolder Datasource has been invalidated - Источник данных находится в недействительном состоянии + Источник данных недействителен @@ -1360,10 +1165,6 @@ p, li { white-space: pre-wrap; } Property Name Свойство - - Property value - Значение - fullPage Страница целиком @@ -1680,14 +1481,6 @@ p, li { white-space: pre-wrap; } columnCount Количество столбцов - - alternateBackgroundMode - Альтернативный цвет фона - - - textIdent - Параграф - securityLevel Уровень безопасности @@ -1718,7 +1511,7 @@ p, li { white-space: pre-wrap; } barcodeWidth - + Ширина штрихкода foregroundColor @@ -1726,11 +1519,11 @@ p, li { white-space: pre-wrap; } inputMode - + Режим ввода pdf417CodeWords - + Слов pdf417 useAlternateBackgroundColor @@ -1757,56 +1550,8 @@ p, li { white-space: pre-wrap; } Печатать на каждой странице - endlessHeight - Бесконечная страница - - - extendedHeight - Дополнителная высота - - - isExtendedInDesignMode - Увеличенный размер в дизайнере - - - pageIsTOC - Оглавление - - - setPageSizeToPrinter - Отправлять размер страницы принтеру - - - fillInSecondPass - Заполнять на втором проходе - - - chartTitle - Заголовок диаграммы - - - chartType - Тип диаграммы - - - drawLegendBorder - Границы вокруг легенды - - - labelsField - - - - legendAlign - Расположение легенды - - - series - Серии - - - titleAlign - Расположение заголовка + Property value + Значение @@ -1837,10 +1582,6 @@ p, li { white-space: pre-wrap; } Report file name Файл отчета - - Page - Страница - Script Скрипт @@ -1853,10 +1594,6 @@ p, li { white-space: pre-wrap; } Wrong file format Неверный формат файла - - Translations - Переводы - LimeReport::ReportDesignWindow @@ -2034,7 +1771,7 @@ p, li { white-space: pre-wrap; } Tear-off Band - Полоса для отрывания + Полоса отрыва File @@ -2096,41 +1833,9 @@ p, li { white-space: pre-wrap; } File "%1" not found! Файл "%1" не найден! - - Delete dialog - Удалить диалог - - - Add new dialog - Добавить диалог - - - Widget Box - Панель виджетов - - - Property Editor - Редактор свойств - - - Action Editor - Редактор действий - - - Resource Editor - Редактор ресурсов - - - SignalSlot Editor - Редактор сигналов и слотов - - - Dialog Designer Tools - Инструменты создания диалогов - Report has been modified! Do you want save the report? - Отчет был изменен! Хотите его сохранить? + Отчет был изменен! Сохранить изменения? @@ -2153,14 +1858,6 @@ p, li { white-space: pre-wrap; } This preview is no longer valid. Файл отчета "%1" изменил имя или был удален. - - Language %1 already exists - Перевод %1 уже существует! - - - Designer not found! - Дезайнер не найден - LimeReport::ReportFooter @@ -2184,15 +1881,15 @@ This preview is no longer valid. Databand "%1" not found - Банд "%1" не найден + Раздел "%1" не найден Wrong using function %1 - Не правильное использование функции %1 + Неверное использование функции %1 page index out of range - номер страницы выходит за пределы дипазона + индекс страницы вышел за границы диапазона @@ -2253,10 +1950,6 @@ This preview is no longer valid. Error Ошибка - - Datasource with name %1 already exist - Источник данных с именем: "%1" уже существует - Attention Внимание @@ -2275,7 +1968,7 @@ This preview is no longer valid. ... - + ... Ok @@ -2287,7 +1980,7 @@ This preview is no longer valid. Datasource Name is empty! - Имя источника данных не заполнено! + Имя источника данных не указано! SQL is empty! @@ -2295,7 +1988,11 @@ This preview is no longer valid. Datasource with name: "%1" already exists! - Источник данных с именем: "%1" уже существует! + Источник данных %1 уже существует! + + + Datasource with name %1 already exist + Источник данных %1 уже существует @@ -2322,7 +2019,7 @@ This preview is no longer valid. Name - Имя переменной + Имя NO CATEGORY @@ -2332,10 +2029,6 @@ This preview is no longer valid. Error Ошибка - - Dialog with name: %1 already exists - Диалог с именем: %1 уже существует - ui file must cointain QDialog instead QWidget or QMainWindow файл ui должен содержать QDialog вместо QWidget или QMainWindow @@ -2344,42 +2037,23 @@ This preview is no longer valid. wrong file format неверный формат файла - - - LimeReport::ScriptEditor - Form - Форма - - - Data - Данные - - - Functions - Функции + Dialog with name: %1 already exists + Диалог %1 уже существует LimeReport::ScriptEngineContext Dialog with name: %1 can`t be created - Диалог с именем: %1 не может быть создан - - - Error - Ошибка + Диалог %1 не может быть создан LimeReport::ScriptEngineManager - - FieldName - Имя поля - BandName - Имя банда + Имя раздела Value @@ -2407,23 +2081,7 @@ This preview is no longer valid. Name - Имя переменной - - - Function manger with name "%1" already exists ! - Менеджер функций с именем "%1" уже существует! - - - Field %1 not found in %2 !!! - Поле %1 не найдено в %2 !!! - - - Function manger with name "%1" already exists! - Менеджер функций с именем "%1" уже существует! - - - Field %1 not found in %2! - Поле %1 не найдено в %2! + Имя GROUP FUNCTIONS @@ -2445,38 +2103,6 @@ This preview is no longer valid. GENERAL ОБЩИЕ - - Datasource - Источник данных - - - ValueField - Поле значения - - - KeyField - Поле ключа - - - KeyFieldValue - Значение поля ключа - - - Unique identifier - Уникальный идентификатор - - - Content - Содержимое - - - Indent - Отступ - - - datasourceName - Источника данных - LimeReport::SettingDialog @@ -2502,19 +2128,15 @@ This preview is no longer valid. Designer Setting - Настройки Дизайнера + Настройки дизайнера Report Setting - Настройки Отчета + Настройки отчета Suppress absent fields and variables warning - Скрывать предупреждения об отсутсвующих полях и переменных - - - Use dark theme - Темная схема оформления + Не выводить сообщения об отсутствии полей или переменных @@ -2535,7 +2157,7 @@ This preview is no longer valid. LimeReport::TearOffBand Tear-off Band - Полоса для отрывания + Полоса отрыва @@ -2593,15 +2215,11 @@ This preview is no longer valid. TextItem " %1 " already has folower " %2 " - Текстовый элемент "%1" уже следует за "%2" + Текстовый элемент %1 уже следует за %2 TextItem " %1 " not found! - Текстовый элемент "%1" не найден! - - - Transparent - Прозрачный + Текстовый элемент %1 не найден! @@ -2616,7 +2234,7 @@ This preview is no longer valid. Functions - Функции + Функции Editor settings @@ -2632,11 +2250,11 @@ This preview is no longer valid. Data - Данные + Данные ... - + ... Ok @@ -2648,54 +2266,7 @@ This preview is no longer valid. Esc - Esc - - - - LimeReport::TranslationEditor - - Form - Форма - - - Languages - Языки - - - ... - ... - - - Pages - Страницы - - - Strings - Строки - - - Source Text - Исходный текст - - - Translation - Превод - - - Checked - Проверено - - - Report Item - Элемент отчета - - - Property - Свойство - - - Source text - Исходный текст + @@ -2805,7 +2376,7 @@ This preview is no longer valid. datasouce "%1" not found! - источник данных "%1" не найден! + источник данных %1 не найден! Attention! @@ -2815,10 +2386,6 @@ This preview is no longer valid. Selected elements have different parent containers Выделенные элементы имеют различные родительские контейнеры - - Object with name %1 already exists - Объект с именем %1 уже существует - Function %1 not found or have wrong arguments Функция %1 не найдена или вызвана с неверными аргументами @@ -2855,17 +2422,13 @@ This preview is no longer valid. content содержимое - - Master datasource "%1" not found!!! - Главный источник данных "%1" не найден! - Master datasouce "%1" not found! - Главный источник данных "%1" не найден! + Главный источник данных %1 не найден! bool - + Логическое QColor @@ -2881,11 +2444,11 @@ This preview is no longer valid. int - + Целое qreal - + Дробь QRect @@ -2909,39 +2472,19 @@ This preview is no longer valid. Tear-off Band - Полоса для отрывания + Полоса отрыва Wrong file format - Неправильный формат файла - - - Datasource manager not found - Менеджер источников данных не найден + Неверный формат файла Master datasource "%1" not found! - Главный источник данных "%1" не найден! + Главный источник данных %1 не найден! Object with name %1 already exists! - Объект с именем %1 уже существует! - - - Chart Item - Диаграмма - - - First - Первая - - - Second - Вторая - - - Thrid - Третья + Объект %1 уже существует! From 7d634a950f6b20edcd76f1b803eeacfc6b358ff6 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 16 Dec 2017 18:02:13 +0300 Subject: [PATCH 105/347] CodeEditor fixed --- limereport/scripteditor/lrcodeeditor.cpp | 3 ++- limereport/scripteditor/lrscripthighlighter.cpp | 13 +++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index 4e524c1..75a86bc 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -188,6 +188,7 @@ bool CodeEditor::matchRightParenthesis(QTextBlock currentBlock, QChar parenthesi if (data){ QVector parentheses = data->parentheses(); int docPos = currentBlock.position(); + if (i == -2) i = parentheses.size()-1; for (; i > -1 && parentheses.size() > 0; --i) { ParenthesisInfo *info = parentheses.at(i); if (info->character == parenthesisType) { @@ -205,7 +206,7 @@ bool CodeEditor::matchRightParenthesis(QTextBlock currentBlock, QChar parenthesi currentBlock = currentBlock.previous(); if (currentBlock.isValid()) - return matchRightParenthesis(currentBlock, parenthesisType, 0, numRightParentheses); + return matchRightParenthesis(currentBlock, parenthesisType, -2, numRightParentheses); } return false; diff --git a/limereport/scripteditor/lrscripthighlighter.cpp b/limereport/scripteditor/lrscripthighlighter.cpp index d88e18f..1dac14b 100644 --- a/limereport/scripteditor/lrscripthighlighter.cpp +++ b/limereport/scripteditor/lrscripthighlighter.cpp @@ -110,7 +110,11 @@ void ScriptHighlighter::highlightBlock(const QString& text) } buffer.clear(); buffer += currentChar; - + break; + case String: + case String2: + buffer.clear(); + buffer += currentChar; break; case MayBeKeyWord: case MayBeNumber: @@ -160,17 +164,10 @@ void ScriptHighlighter::highlightBlock(const QString& text) TextBlockData *data = new TextBlockData; - for (int i = 0; i < PARENHEIS_COUNT; ++i){ createParentheisisInfo(parenthesisCharacters[LeftParenthesis][i].toLatin1(), data, text); createParentheisisInfo(parenthesisCharacters[RightParenthesis][i].toLatin1(), data, text); } -// createParentheisisInfo('(', data, text); -// createParentheisisInfo(')', data, text); -// createParentheisisInfo('{', data, text); -// createParentheisisInfo('}', data, text); -// createParentheisisInfo('[', data, text); -// createParentheisisInfo(']', data, text); setCurrentBlockUserData(data); } From 3867527c212803c8b5478160567ccace712a3087 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 18 Dec 2017 11:47:04 +0300 Subject: [PATCH 106/347] French translation updated --- translations/limereport_fr.ts | 70 +++++++++++++++++------------------ 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/translations/limereport_fr.ts b/translations/limereport_fr.ts index 1fe39ec..5abdcbd 100644 --- a/translations/limereport_fr.ts +++ b/translations/limereport_fr.ts @@ -64,7 +64,7 @@ Series name - Nom des séries + Séries @@ -350,7 +350,7 @@ p, li { white-space: pre-wrap; } DataFooterBand - Bande de pied de données + Pied de données @@ -375,7 +375,7 @@ p, li { white-space: pre-wrap; } SubDetailBand - Bande de sous-détails + Sous-détails @@ -390,12 +390,12 @@ p, li { white-space: pre-wrap; } GroupBandHeader - Bande de groupe d'en-tête + Groupe d'en-tête GroupBandFooter - Bande de groupe de pieds + Groupe de pieds @@ -433,7 +433,7 @@ p, li { white-space: pre-wrap; } Keep bottom space - Garder l'espace inférieur + Conserver l'espace inférieur @@ -611,7 +611,7 @@ p, li { white-space: pre-wrap; } useAlternateBackgroundColor - Utiliser les couleurs de fond alternative + Couleurs de fond alternative @@ -648,7 +648,7 @@ p, li { white-space: pre-wrap; } Add new datasource - Ajouter une nouvelle source de données + Ajouter une source de données @@ -706,7 +706,7 @@ p, li { white-space: pre-wrap; } Do you really want to delete "%1" connection? - Voulez-vous vraiment supprimer la connexion "%1"? + Voulez-vous vraiment supprimer la connexion %1? @@ -825,7 +825,7 @@ p, li { white-space: pre-wrap; } Widget Box - Boite de Widget + Widgets @@ -1008,7 +1008,7 @@ p, li { white-space: pre-wrap; } LeftToRight - De gauche droite + De gauche à droite @@ -1038,12 +1038,12 @@ p, li { white-space: pre-wrap; } ParentWidthItemAlign - Aligner la largeur du parent + Aligner à la largeur du parent DesignedItemAlign - Aligner un objet stylé + Alignement par défaut @@ -1093,7 +1093,7 @@ p, li { white-space: pre-wrap; } Pie - Graphe + Sphère @@ -1169,17 +1169,17 @@ p, li { white-space: pre-wrap; } Font bold - Caractères en gras + Gras Font Italic - Caractères en italique + Italique Font Underline - Caractères Soulignées + Souligné @@ -1241,12 +1241,12 @@ p, li { white-space: pre-wrap; } Field "%1" not found - Champ "%1 introuvable + Champ %1 introuvable Variable "%1" not found - Variable "%1" introuvable + Variable %1 introuvable @@ -1338,12 +1338,12 @@ p, li { white-space: pre-wrap; } Top line - ligne plus haut + ligne haute Bottom line - Ligne plus bas + Ligne basse @@ -1440,7 +1440,7 @@ p, li { white-space: pre-wrap; } Set page size to printer - Définir la taille de la page à l'imprimante + Adapterr la taille de la page à l'imprimante @@ -1481,7 +1481,7 @@ p, li { white-space: pre-wrap; } toolBar - Barre d'outil + Barre d'outils @@ -1557,7 +1557,7 @@ p, li { white-space: pre-wrap; } Last Page - Dernièr page + Dernière page @@ -1582,12 +1582,12 @@ p, li { white-space: pre-wrap; } Show Toolbar - Afficher la barre d'outil + Afficher la barre d'outils Show toolbar - Afficher la barre d'outil + Afficher la barre d'outils @@ -1698,7 +1698,7 @@ p, li { white-space: pre-wrap; } borderLineSize - Taille de la lignes de bordure + Taille de la ligne de bordure @@ -1719,7 +1719,7 @@ p, li { white-space: pre-wrap; } columnsFillDirection - Direction de remplissage des colonnes + Orientation de remplissage des colonnes @@ -1844,12 +1844,12 @@ p, li { white-space: pre-wrap; } shapeBrush - Brosse de forme + Forme du pinceau shapeBrushColor - Couleur de brosse de forme + Couleur du pinceau @@ -1885,7 +1885,7 @@ p, li { white-space: pre-wrap; } backgroundBrushStyle - Style de brosse de fond + Remplissage de la forme @@ -1900,7 +1900,7 @@ p, li { white-space: pre-wrap; } adaptFontToSize - Adapter la police à lataille + Adapter la police à la taille @@ -1935,7 +1935,7 @@ p, li { white-space: pre-wrap; } textLayoutDirection - Disposition du texte + Orientation du texte @@ -2050,7 +2050,7 @@ p, li { white-space: pre-wrap; } useAlternateBackgroundColor - Utiliser les couleurs de fond alternative + Couleurs de fond alternative @@ -2120,7 +2120,7 @@ p, li { white-space: pre-wrap; } setPageSizeToPrinter - Définir la taille de la page à l'imprimante + Adapterr la taille de la page à l'imprimante From 207d7daaa97271b8c0c03464f01c0b7789d60c80 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 18 Dec 2017 20:28:26 +0300 Subject: [PATCH 107/347] keepTopSpace property added to band --- limereport/lrbanddesignintf.cpp | 24 ++++++++++++++++++++++-- limereport/lrbanddesignintf.h | 7 ++++++- limereport/lritemscontainerdesignitf.cpp | 15 +++++++++++++-- limereport/lritemscontainerdesignitf.h | 1 + 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 4b5930b..a56cf9c 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -106,6 +106,7 @@ BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, Q m_dataSourceName(""), m_autoHeight(true), m_keepBottomSpace(false), + m_keepTopSpace(true), m_parentBand(0), m_parentBandName(""), m_bandMarker(0), @@ -821,6 +822,20 @@ void BandDesignIntf::slotPropertyObjectNameChanged(const QString &, const QStrin m_bandNameLabel->updateLabel(newName); } +bool BandDesignIntf::keepTopSpace() const +{ + return m_keepTopSpace; +} + +void BandDesignIntf::setKeepTopSpace(bool value) +{ + if (m_keepTopSpace != value){ + m_keepTopSpace = value; + if (!isLoading()) + notify("keepTopSpace",!value,value); + } +} + bool BandDesignIntf::repeatOnEachRow() const { return m_repeatOnEachRow; @@ -969,9 +984,14 @@ void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass p } restoreLinks(); snapshotItemsLayout(); - arrangeSubItems(pass, dataManager); + arrangeSubItems(pass, dataManager); if (autoHeight()){ - //if keepBottomSpace()&& height()setY(item->y() - minTop); + } + } setHeight(findMaxBottom()+spaceBorder); } if ((maxHeight>0)&&(height()>maxHeight)){ diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index aa1674d..6a0fb9a 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -100,6 +100,7 @@ class BandDesignIntf : public ItemsContainerDesignInft Q_PROPERTY(bool autoHeight READ autoHeight WRITE setAutoHeight ) Q_PROPERTY(int bandIndex READ bandIndex WRITE setBandIndex DESIGNABLE false ) Q_PROPERTY(bool keepBottomSpace READ keepBottomSpaceOption WRITE setKeepBottomSpaceOption ) + Q_PROPERTY(bool keepTopSpace READ keepTopSpace WRITE setKeepTopSpace) Q_PROPERTY(QString parentBand READ parentBandName WRITE setParentBandName DESIGNABLE false ) Q_PROPERTY(QColor backgroundColor READ backgroundColor WRITE setBackgroundColor) Q_PROPERTY(BrushStyle backgroundBrushStyle READ backgroundBrushStyle WRITE setBackgroundBrushStyle) @@ -155,6 +156,9 @@ public: void setKeepBottomSpaceOption(bool value); bool keepBottomSpaceOption() const {return m_keepBottomSpace;} + bool keepTopSpace() const; + void setKeepTopSpace(bool value); + void addChildBand(BandDesignIntf* band); bool hasChildren(){return !m_childBands.isEmpty();} void removeChildBand(BandDesignIntf* band); @@ -245,7 +249,7 @@ public: void copyBookmarks(BandDesignIntf* sourceBand); signals: - void bandRendered(BandDesignIntf* band); + void bandRendered(BandDesignIntf* band); void bandRegistred(); protected: void trimToMaxHeight(int maxHeight); @@ -279,6 +283,7 @@ private: QString m_dataSourceName; bool m_autoHeight; bool m_keepBottomSpace; + bool m_keepTopSpace; BandDesignIntf* m_parentBand; QString m_parentBandName; QList m_childBands; diff --git a/limereport/lritemscontainerdesignitf.cpp b/limereport/lritemscontainerdesignitf.cpp index 0e31eb8..ea5eafc 100644 --- a/limereport/lritemscontainerdesignitf.cpp +++ b/limereport/lritemscontainerdesignitf.cpp @@ -93,16 +93,27 @@ void ItemsContainerDesignInft::arrangeSubItems(RenderPass pass, DataSourceManage qreal ItemsContainerDesignInft::findMaxBottom() const { - qreal maxBottom=0; + qreal maxBottom = 0; foreach(QGraphicsItem* item,childItems()){ BaseDesignIntf* subItem = dynamic_cast(item); if(subItem) if ( subItem->isVisible() && (subItem->geometry().bottom()>maxBottom) ) - maxBottom=subItem->geometry().bottom(); + maxBottom = subItem->geometry().bottom(); } return maxBottom; } +qreal ItemsContainerDesignInft::findMinTop() const{ + qreal minTop = height(); + foreach(QGraphicsItem* item,childItems()){ + BaseDesignIntf* subItem = dynamic_cast(item); + if(subItem) + if ( subItem->isVisible() && (subItem->geometry().top()geometry().top(); + } + return minTop > 0 ? minTop : 0; +} + qreal ItemsContainerDesignInft::findMaxHeight() const { qreal maxHeight=0; diff --git a/limereport/lritemscontainerdesignitf.h b/limereport/lritemscontainerdesignitf.h index 1526ac7..ff5c2e2 100644 --- a/limereport/lritemscontainerdesignitf.h +++ b/limereport/lritemscontainerdesignitf.h @@ -46,6 +46,7 @@ protected: void arrangeSubItems(RenderPass pass, DataSourceManager *dataManager, ArrangeType type = AsNeeded); qreal findMaxBottom() const; qreal findMaxHeight() const; + qreal findMinTop() const; private: QVector m_containerItems; From ed8c4669dc7ed209ed0f3aae2d7fc4c0f15d50fa Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 18 Dec 2017 21:33:20 +0300 Subject: [PATCH 108/347] Keep top space action added to context menu --- limereport/lrbanddesignintf.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index a56cf9c..c9ab208 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -495,6 +495,10 @@ void BandDesignIntf::preparePopUpMenu(QMenu &menu) currAction->setCheckable(true); currAction->setChecked(keepBottomSpaceOption()); + currAction = menu.addAction(tr("Keep top space")); + currAction->setCheckable(true); + currAction->setChecked(keepTopSpace()); + currAction = menu.addAction(tr("Start from new page")); currAction->setCheckable(true); currAction->setChecked(startFromNewPage()); @@ -515,6 +519,9 @@ void BandDesignIntf::processPopUpAction(QAction *action) if (action->text().compare(tr("Keep bottom space")) == 0){ setProperty("keepBottomSpace",action->isChecked()); } + if (action->text().compare(tr("Keep top space")) == 0){ + setProperty("keepTopSpace",action->isChecked()); + } if (action->text().compare(tr("Start new page")) == 0){ setProperty("startNewPage",action->isChecked()); } From 609393169ce049f6988e49a6e090e7b730652803 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 18 Dec 2017 21:34:14 +0300 Subject: [PATCH 109/347] Create horizontal layout action added to context menu --- limereport/lrbasedesignintf.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 0b41b05..c9af1ab 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1194,11 +1194,12 @@ void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) QMenu menu; QAction* copyAction = menu.addAction(QIcon(":/report/images/copy.png"), tr("Copy")); copyAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_C)); - QAction* cutAction = menu.addAction(QIcon(":/report//images/cut"), tr("Cut")); + QAction* cutAction = menu.addAction(QIcon(":/report/images/cut"), tr("Cut")); cutAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_X)); QAction* pasteAction = menu.addAction(QIcon(":/report/images/paste.png"), tr("Paste")); pasteAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_V)); pasteAction->setEnabled(false); + QClipboard *clipboard = QApplication::clipboard(); ItemsReaderIntf::Ptr reader = StringXMLreader::create(clipboard->text()); if (reader->first() && reader->itemType() == "Object"){ @@ -1207,6 +1208,10 @@ void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) menu.addSeparator(); QAction* brinToTopAction = menu.addAction(QIcon(":/report//images/bringToTop"), tr("Bring to top")); QAction* sendToBackAction = menu.addAction(QIcon(":/report//images/sendToBack"), tr("Send to back")); + QAction* createHLayout = 0; + if( page->selectedItems().count()>1){ + createHLayout = menu.addAction(QIcon(":/report/images/hlayout"), tr("Create Horizontal Layout")); + } menu.addSeparator(); QAction* noBordersAction = menu.addAction(QIcon(":/report//images/noLines"), tr("No borders")); QAction* allBordersAction = menu.addAction(QIcon(":/report//images/allLines"), tr("All borders")); @@ -1230,6 +1235,8 @@ void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) page->setBorders(BaseDesignIntf::NoLine); if (a == allBordersAction) page->setBorders(BaseDesignIntf::AllLines); + if (a == createHLayout) + page->addHLayout(); processPopUpAction(a); } } From 6a0faa5a680ce0549661d95aab65466a43e79fea Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Dec 2017 12:43:17 +0300 Subject: [PATCH 110/347] Segmentation fault fixed --- limereport/lrbasedesignintf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index c9af1ab..6ef5a34 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1148,8 +1148,8 @@ QWidget* findRootWidget(QWidget* widget){ void BaseDesignIntf::showEditorDialog(){ QWidget *editor = defaultEditor(); - editor->setStyleSheet(findRootWidget(scene()->views().at(0))->styleSheet()); if (editor) { + editor->setStyleSheet(findRootWidget(scene()->views().at(0))->styleSheet()); #ifdef Q_OS_WIN editor->setAttribute(Qt::WA_DeleteOnClose); From 44d9f8cc1536c713a56a7b55920c2cddf050fc6b Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Dec 2017 12:56:02 +0300 Subject: [PATCH 111/347] Preview window layout direction fixed --- limereport/lrreportengine.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index d3646f8..0bfb025 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -70,7 +70,8 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_showProgressDialog(true), m_reportName(""), m_activePreview(0), m_previewWindowIcon(":/report/images/logo32"), m_previewWindowTitle(tr("Preview")), m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), - m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage), m_designerFactory(0) + m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage), + m_designerFactory(0), m_previewLayoutDirection(Qt::LeftToRight) { #ifdef HAVE_STATIC_BUILD initResources(); From 0ab24565a58b7d52481027a7321c6e61b80d1bbe Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Dec 2017 13:08:05 +0300 Subject: [PATCH 112/347] GroupBox style fixed --- 3rdparty/dark_style_sheet/qdarkstyle/style.qss | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index b9852d1..94cd694 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -358,15 +358,16 @@ QAbstractItemView QLineEdit } QGroupBox { - margin-top: 10px; + margin-top: 1.5em; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; - padding-left: 10px; - padding-right: 10px; - padding-top: 2px; + padding-left: 0px; + padding-right: 0px; + margin-top: 2px; + margin-bottom: 2px; } QAbstractScrollArea From 3b417ef801b9fd70875c6b44980bf8497210b2b5 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Dec 2017 13:17:15 +0300 Subject: [PATCH 113/347] Dark theme fixed --- 3rdparty/dark_style_sheet/qdarkstyle/style.qss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 94cd694..1642eca 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -34,7 +34,7 @@ QWidget { color: #eff0f1; background-color: #383838; - selection-background-color:#2e2e2e; + selection-background-color:#000; selection-color: #eff0f1; background-clip: border; border-image: none; From d44a579e921189b0968bf06acc5f58f6b1c506f3 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 14 Jan 2018 21:33:15 +0300 Subject: [PATCH 114/347] FontEditor has been fixed --- limereport/items/editors/lrfonteditorwidget.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/limereport/items/editors/lrfonteditorwidget.cpp b/limereport/items/editors/lrfonteditorwidget.cpp index 6787e90..28212f5 100644 --- a/limereport/items/editors/lrfonteditorwidget.cpp +++ b/limereport/items/editors/lrfonteditorwidget.cpp @@ -169,14 +169,18 @@ void FontEditorWidgetForDesigner::slotFontChanged(const QFont& font) void FontEditorWidgetForDesigner::slotFontSizeChanged(const QString& value) { - FontEditorWidget::slotFontSizeChanged(value); - m_reportEditor->setFont(resFont()); + if (!ignoreSlots()){ + FontEditorWidget::slotFontSizeChanged(value); + m_reportEditor->setFont(resFont()); + } } void FontEditorWidgetForDesigner::slotFontAttribsChanged(bool value) { - FontEditorWidget::slotFontAttribsChanged(value); - m_reportEditor->setFont(resFont()); + if (!ignoreSlots()){ + FontEditorWidget::slotFontAttribsChanged(value); + m_reportEditor->setFont(resFont()); + } } #endif From f861e32c451bf2c4d2ac98861a3fe78553fcc3e3 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Tue, 23 Jan 2018 21:48:12 +0300 Subject: [PATCH 115/347] Static build fixed --- limereport/lrfactoryinitializer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/limereport/lrfactoryinitializer.cpp b/limereport/lrfactoryinitializer.cpp index ef5eb18..8f11ec8 100644 --- a/limereport/lrfactoryinitializer.cpp +++ b/limereport/lrfactoryinitializer.cpp @@ -49,6 +49,7 @@ void initResources(){ Q_INIT_RESOURCE(items); Q_INIT_RESOURCE(lrscriptbrowser); Q_INIT_RESOURCE(translationeditor); + Q_INIT_RESOURCE(dialogdesigner); #endif } From b2278e4944fb33ab6cd792ae8f780b9d74cf0e95 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Tue, 23 Jan 2018 22:13:57 +0300 Subject: [PATCH 116/347] removed redundant showDefaultEditors() --- limereport/lrreportdesignwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 98ad4b9..d3c09a8 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -649,7 +649,7 @@ void ReportDesignWindow::startNewReport() m_newReportHeader->setEnabled(true); m_newReportFooter->setEnabled(true); m_editorTabType = ReportDesignWidget::Page; - showDefaultEditors(); + //showDefaultEditors(); showDefaultToolBars(); } @@ -1089,7 +1089,7 @@ void ReportDesignWindow::slotLoadReport() addRecentFile(fileName); m_editorTabType = ReportDesignWidget::Page; //showDefaultToolBars(); - showDefaultEditors(); + //showDefaultEditors(); } } From 02ad375017ed4e62f16f5d0ff326be64d11c24f0 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 24 Jan 2018 20:59:53 +0300 Subject: [PATCH 117/347] Hide & Show DocWidgets fixed --- limereport/lrreportdesignwindow.cpp | 45 +++++++++++++++++++++++++---- limereport/lrreportdesignwindow.h | 4 +++ 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index b4e7801..a969617 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -659,14 +659,24 @@ void ReportDesignWindow::writePosition() { settings()->beginGroup("DesignerWindow"); settings()->setValue("Geometry",saveGeometry()); - settings()->setValue("State",saveState()); +// settings()->setValue("State",saveState()); settings()->endGroup(); } +void ReportDesignWindow::setDocWidgetsVisibility(bool visible) +{ + if (!m_hideLeftPanel->isChecked()) + hideDockWidgets(Qt::LeftDockWidgetArea,!visible); + if (!m_hideRightPanel->isChecked()) + hideDockWidgets(Qt::RightDockWidgetArea,!visible); +} + void ReportDesignWindow::writeState() { settings()->beginGroup("DesignerWindow"); + setDocWidgetsVisibility(true); + m_editorsStates[m_editorTabType] = saveState(); settings()->setValue("PageEditorsState", m_editorsStates[ReportDesignWidget::Page]); settings()->setValue("DialogEditorsState", m_editorsStates[ReportDesignWidget::Dialog]); @@ -1297,6 +1307,8 @@ void ReportDesignWindow::slotActivePageChanged() #endif } + setDocWidgetsVisibility(true); + m_editorsStates[m_editorTabType] = saveState(); m_editorTabType = m_reportDesignWidget->activeTabType(); @@ -1307,6 +1319,7 @@ void ReportDesignWindow::slotActivePageChanged() showDefaultToolBars(); } + setDocWidgetsVisibility(false); } void ReportDesignWindow::renderStarted() @@ -1350,20 +1363,42 @@ bool ReportDesignWindow::isDockAreaVisible(Qt::DockWidgetArea area){ void ReportDesignWindow::hideDockWidgets(Qt::DockWidgetArea area, bool value){ QList dockWidgets = findChildren(); + QMap* currentDocState = 0; + + switch (area) { + case Qt::LeftDockWidgetArea: + if (value) + m_leftDocVisibleState.clear(); + currentDocState = &m_leftDocVisibleState; + break; + case Qt::RightDockWidgetArea: + if (value) + m_rightDocVisibleState.clear(); + currentDocState = &m_rightDocVisibleState; + default: + break; + } + foreach (QDockWidget* dw, dockWidgets) { - if (dockWidgetArea(dw) == area) - value ? dw->show(): dw->hide(); + if (dockWidgetArea(dw) == area){ + if (!value){ + if (currentDocState->value(dw)) dw->show(); + } else { + currentDocState->insert(dw, dw->isVisible()); + dw->hide(); + } + } } } void ReportDesignWindow::slotHideLeftPanel(bool value) { - hideDockWidgets(Qt::LeftDockWidgetArea,value); + hideDockWidgets(Qt::LeftDockWidgetArea,!value); } void ReportDesignWindow::slotHideRightPanel(bool value) { - hideDockWidgets(Qt::RightDockWidgetArea,value); + hideDockWidgets(Qt::RightDockWidgetArea,!value); } void ReportDesignWindow::slotEditSettings() diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 1abfcd8..6f3dba6 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -131,6 +131,8 @@ protected: void moveEvent(QMoveEvent *); void hideDockWidgets(Qt::DockWidgetArea area, bool value); bool isDockAreaVisible(Qt::DockWidgetArea area); + void setDocWidgetsVisibility(bool visible); + private: void initReportEditor(ReportEnginePrivate* report); void createActions(); @@ -268,6 +270,8 @@ private: QVector m_pageTools; QVector m_dialogTools; bool m_reportItemIsLocked; + QMap m_leftDocVisibleState; + QMap m_rightDocVisibleState; }; From 5b81a75d3cdb4cccb42be00bc1040af6366db3db Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 26 Jan 2018 18:04:58 +0300 Subject: [PATCH 118/347] ScriptEngineContext fixed --- limereport/lrscriptenginemanager.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 324bfeb..0e3c2b4 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1337,7 +1337,6 @@ void ScriptEngineContext::initDialogs(){ bool ScriptEngineContext::runInitScript(){ ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); - ScriptEngineManager::instance().clearTableOfContents(); ScriptEngineManager::instance().setContext(this); m_tableOfContents->clear(); From 04bf1dfbdb1410af19ca9686e84ea05e896d2e90 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 7 Feb 2018 22:43:31 +0300 Subject: [PATCH 119/347] Redundant saveToFile() has been removed --- include/lrreportengine.h | 1 - limereport/lrreportengine.cpp | 19 ++++--------------- limereport/lrreportengine.h | 1 - limereport/lrreportengine_p.h | 6 ++---- 4 files changed, 6 insertions(+), 21 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 03b5d91..589e359 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -95,7 +95,6 @@ public: bool loadFromString(const QString& data); QString reportFileName(); void setReportFileName(const QString& fileName); - bool saveToFile(); bool saveToFile(const QString& fileName); QByteArray saveToByteArray(); QString saveToString(); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 5a51a2f..977a7e8 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -755,9 +755,10 @@ bool ReportEnginePrivate::loadFromString(const QString &report, const QString &n bool ReportEnginePrivate::saveToFile(const QString &fileName) { - if (fileName.isEmpty()) return false; - QFileInfo fi(fileName); - QString fn = fileName; + if (fileName.isEmpty() & m_fileName.isEmpty()) return false; + QString fn = fileName.isEmpty() ? m_fileName : fileName; + QFileInfo fi(fn); + if (fi.suffix().isEmpty()) fn+=".lrxml"; @@ -833,12 +834,6 @@ bool ReportEnginePrivate::isNeedToSave() return false; } -bool ReportEnginePrivate::saveToFile() -{ - if (m_fileName.isEmpty()) return false; - return saveToFile(m_fileName); -} - QString ReportEnginePrivate::renderToString() { LimeReport::ReportRender render; @@ -1255,12 +1250,6 @@ void ReportEngine::setReportFileName(const QString &fileName) return d->setReportFileName(fileName); } -bool ReportEngine::saveToFile() -{ - Q_D(ReportEngine); - return d->saveToFile(); -} - bool ReportEngine::saveToFile(const QString &fileName) { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 03b5d91..589e359 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -95,7 +95,6 @@ public: bool loadFromString(const QString& data); QString reportFileName(); void setReportFileName(const QString& fileName); - bool saveToFile(); bool saveToFile(const QString& fileName); QByteArray saveToByteArray(); QString saveToString(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 9dde434..9f7ebf5 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -69,8 +69,7 @@ public: virtual void emitSaveFinished() = 0; virtual bool isNeedToSave() = 0; virtual void emitSaveReport() = 0; - virtual bool saveToFile() = 0; - virtual bool saveToFile(const QString& fileName) = 0; + virtual bool saveToFile(const QString& fileName = "") = 0; virtual bool isSaved() = 0; virtual QString reportName() = 0; virtual bool loadFromFile(const QString& fileName, bool autoLoadPreviewOnChange) = 0; @@ -139,8 +138,7 @@ public: bool loadFromString(const QString& report, const QString& name = ""); QString reportFileName(){return m_fileName;} void setReportFileName(const QString& reportFileName){ m_fileName = reportFileName;} - bool saveToFile(); - bool saveToFile(const QString& fileName); + bool saveToFile(const QString& fileName = ""); QByteArray saveToByteArray(); QString saveToString(); bool isNeedToSave(); From d1f4a153216ec74f0e22e0c3bb45d301c9ed3147 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 15 Feb 2018 02:21:00 +0300 Subject: [PATCH 120/347] ReportPage item propagate to script engine has been fixed Completer has been refactored --- include/lrglobal.h | 8 +- limereport/lrglobal.h | 8 +- limereport/lrreportdesignwindow.cpp | 2 - limereport/lrreportengine.cpp | 2 +- limereport/lrscriptenginemanager.cpp | 6 +- limereport/scripteditor/lrcodeeditor.cpp | 32 ++- limereport/scripteditor/lrscripteditor.cpp | 216 +++++++++++++++++---- limereport/scripteditor/lrscripteditor.h | 24 ++- 8 files changed, 241 insertions(+), 57 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index 13d8851..4829390 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -86,14 +86,16 @@ namespace Const{ const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*.\\w*\\s*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))\\)"; - const int DATASOURCE_INDEX = 3;//4; - const int VALUE_INDEX = 2; //2; - const int EXPRESSION_ARGUMENT_INDEX = 1;//3; + const int DATASOURCE_INDEX = 3; + const int VALUE_INDEX = 2; + const int EXPRESSION_ARGUMENT_INDEX = 1; const QString GROUP_FUNCTION_RX = "(%1\\s*"+GROUP_FUNCTION_PARAM_RX+")"; const QString GROUP_FUNCTION_NAME_RX = "%1\\s*\\((.*[^\\)])\\)"; const int SCENE_MARGIN = 50; const QString FUNCTION_MANAGER_NAME = "LimeReport"; + const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); + } QString extractClassName(QString className); QString escapeSimbols(const QString& value); diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 13d8851..4829390 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -86,14 +86,16 @@ namespace Const{ const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*.\\w*\\s*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))\\)"; - const int DATASOURCE_INDEX = 3;//4; - const int VALUE_INDEX = 2; //2; - const int EXPRESSION_ARGUMENT_INDEX = 1;//3; + const int DATASOURCE_INDEX = 3; + const int VALUE_INDEX = 2; + const int EXPRESSION_ARGUMENT_INDEX = 1; const QString GROUP_FUNCTION_RX = "(%1\\s*"+GROUP_FUNCTION_PARAM_RX+")"; const QString GROUP_FUNCTION_NAME_RX = "%1\\s*\\((.*[^\\)])\\)"; const int SCENE_MARGIN = 50; const QString FUNCTION_MANAGER_NAME = "LimeReport"; + const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); + } QString extractClassName(QString className); QString escapeSimbols(const QString& value); diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index a969617..fb2d073 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -1100,8 +1100,6 @@ void ReportDesignWindow::slotLoadReport() setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); addRecentFile(fileName); m_editorTabType = ReportDesignWidget::Page; - //showDefaultToolBars(); - //showDefaultEditors(); } } diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 977a7e8..9123426 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -71,7 +71,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_previewWindowIcon(":/report/images/logo32"), m_previewWindowTitle(tr("Preview")), m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage), - m_designerFactory(0), m_previewLayoutDirection(Qt::LeftToRight) + m_previewLayoutDirection(Qt::LeftToRight), m_designerFactory(0) { #ifdef HAVE_STATIC_BUILD initResources(); diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 0e3c2b4..2bc89a5 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1275,9 +1275,11 @@ void ScriptEngineContext::baseDesignIntfToScript(const QString& pageName, BaseDe #ifdef USE_QJSENGINE ScriptValueType sItem = getCppOwnedJSValue(*engine, item); - engine->globalObject().setProperty(pageName+"_"+item->patternName(), sItem); + QString on = item->patternName().compare(pageName) == 0 ? pageName : pageName+"_"+item->patternName(); + engine->globalObject().setProperty(on, sItem); #else - ScriptValueType sItem = engine->globalObject().property(pageName+"_"+item->patternName()); + QString on = item->patternName().compare(pageName) == 0 ? pageName : pageName+"_"+item->patternName(); + ScriptValueType sItem = engine->globalObject().property(on); if (sItem.isValid()){ engine->newQObject(sItem, item); } else { diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index 75a86bc..0b7af1a 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -10,6 +10,7 @@ #include #include "lrscripthighlighter.h" +#include "lrglobal.h" namespace LimeReport{ @@ -92,6 +93,10 @@ void CodeEditor::keyPressEvent(QKeyEvent *e) case Qt::Key_Escape: case Qt::Key_Tab: case Qt::Key_Backtab: + case Qt::Key_Right: + case Qt::Key_Left: + case Qt::Key_Up: + case Qt::Key_Down: e->ignore(); return; default: @@ -106,13 +111,14 @@ void CodeEditor::keyPressEvent(QKeyEvent *e) if (!m_compleater || (ctrlOrShift && e->text().isEmpty())) return; - static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; QString completionPrefix = textUnderCursor(); if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3 - || eow.contains(e->text().right(1)))) { + || Const::EOW.contains(e->text().right(1))) + ) + { m_compleater->popup()->hide(); return; } @@ -122,11 +128,22 @@ void CodeEditor::keyPressEvent(QKeyEvent *e) m_compleater->popup()->setCurrentIndex(m_compleater->completionModel()->index(0, 0)); } + QModelIndex ci = m_compleater->completionModel()->index(0,0); + if (ci.isValid() && m_compleater->completionModel()->data(ci).toString().compare(completionPrefix) == 0){ + m_compleater->popup()->hide(); + return; + } + QRect cr = cursorRect(); cr.setWidth(m_compleater->popup()->sizeHintForColumn(0) + m_compleater->popup()->verticalScrollBar()->sizeHint().width()); m_compleater->complete(cr); + if (!completionPrefix.isEmpty() && + completionPrefix.at(completionPrefix.length()-1) == '.') + { + m_compleater->popup(); + } } void CodeEditor::focusInEvent(QFocusEvent *e) @@ -145,8 +162,15 @@ void CodeEditor::resizeEvent(QResizeEvent* event) QString CodeEditor::textUnderCursor() const { QTextCursor tc = textCursor(); - tc.select(QTextCursor::WordUnderCursor); - return tc.selectedText(); + QString currentText; + tc.movePosition(QTextCursor::StartOfBlock,QTextCursor::KeepAnchor); + QString blockText = tc.selectedText(); + for(int i = blockText.length(); i>0; --i){ + if (!Const::EOW.contains(blockText.at(i-1))) + currentText = blockText.at(i-1) + currentText; + else break; + } + return currentText; } bool CodeEditor::matchLeftParenthesis(QTextBlock currentBlock, QChar parenthesisType, int i, int numLeftParentheses) diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index a661e1c..1b84f25 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -18,7 +18,7 @@ ScriptEditor::ScriptEditor(QWidget *parent) : { ui->setupUi(this); setFocusProxy(ui->textEdit); - m_completer = new QCompleter(this); + m_completer = new ReportStructureCompleater(this); ui->textEdit->setCompleter(m_completer); connect(ui->splitter, SIGNAL(splitterMoved(int,int)), this, SIGNAL(splitterMoved(int,int))); } @@ -81,47 +81,60 @@ void ScriptEditor::setPageBand(BandDesignIntf* band) void ScriptEditor::initCompleter() { - QStringList dataWords; +// QStringList dataWords; - DataSourceManager* dm = 0; +// DataSourceManager* dm = 0; +// if (m_reportEngine) +// dm = m_reportEngine->dataManager(); +// if (m_page) +// dm = m_page->datasourceManager(); + +//#ifdef USE_QJSENGINE +// ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); +// QJSValue globalObject = se.scriptEngine()->globalObject(); +// QJSValueIterator it(globalObject); +// while (it.hasNext()){ +// it.next(); +// if (it.value().isCallable() ){ +// dataWords << it.name(); +// } +// } +//#endif +// foreach(const QString &dsName,dm->dataSourceNames()){ +// dataWords << dsName; +// foreach(const QString &field, dm->fieldNames(dsName)){ +// dataWords<variableNames()) { +// dataWords << varName.remove("#"); +// } + +// if (m_reportEngine){ +// for ( int i = 0; i < m_reportEngine->pageCount(); ++i){ +// PageDesignIntf* page = m_reportEngine->pageAt(i); +// dataWords << page->pageItem()->objectName(); +// QMetaObject const * mo = page->pageItem()->metaObject(); +// for(int i = mo->methodOffset(); i < mo->methodCount(); ++i) +// { +// if (mo->method(i).methodType() == QMetaMethod::Signal) { +// dataWords << page->pageItem()->objectName() +"."+QString::fromLatin1(mo->method(i).name()); +// } +// } +// dataWords << page->pageItem()->objectName()+".beforeRender"; +// dataWords << page->pageItem()->objectName()+".afterRender"; +// foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ +// addItemToCompleater(page->pageItem()->objectName(), item, dataWords); +// } +// } +// } + +// dataWords.sort(); if (m_reportEngine) - dm = m_reportEngine->dataManager(); - if (m_page) - dm = m_page->datasourceManager(); - -#ifdef USE_QJSENGINE - ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); - QJSValue globalObject = se.scriptEngine()->globalObject(); - QJSValueIterator it(globalObject); - while (it.hasNext()){ - it.next(); - if (it.value().isCallable() ){ - dataWords << it.name(); - } - } -#endif - foreach(const QString &dsName,dm->dataSourceNames()){ - dataWords << dsName; - foreach(const QString &field, dm->fieldNames(dsName)){ - dataWords<variableNames()) { - dataWords << varName.remove("#"); - } - - if (m_reportEngine){ - for ( int i = 0; i < m_reportEngine->pageCount(); ++i){ - PageDesignIntf* page = m_reportEngine->pageAt(i); - dataWords << page->pageItem()->objectName(); - foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ - addItemToCompleater(page->pageItem()->objectName(), item, dataWords); - } - } - } - - m_completer->setModel(new QStringListModel(dataWords,m_completer)); + m_completer->updateCompleaterModel(m_reportEngine); + else + m_completer->updateCompleaterModel(m_page->datasourceManager()); } QByteArray ScriptEditor::saveState() @@ -206,6 +219,129 @@ void ScriptEditor::slotOnCurrentChanged(const QModelIndex &to, const QModelIndex } } + + +QString ReportStructureCompleater::pathFromIndex(const QModelIndex &index) const +{ + QStringList dataList; + for (QModelIndex i = index; i.isValid(); i = i.parent()) { + dataList.prepend(model()->data(i, Qt::DisplayRole).toString()); + } + return dataList.join("."); +} + +QStringList ReportStructureCompleater::splitPath(const QString &path) const +{ + return path.split("."); +} + +void ReportStructureCompleater::addAdditionalDatawords(DataSourceManager* dataManager){ + + foreach(const QString &dsName,dataManager->dataSourceNames()){ + QStandardItem* dsNode = new QStandardItem; + dsNode->setText(dsName); + foreach(const QString &field, dataManager->fieldNames(dsName)){ + QStandardItem* fieldNode = new QStandardItem; + fieldNode->setText(field); + dsNode->appendRow(fieldNode); + } + m_model.invisibleRootItem()->appendRow(dsNode); + } + + foreach (QString varName, dataManager->variableNames()) { + QStandardItem* varNode = new QStandardItem; + varNode->setText(varName.remove("#")); + m_model.invisibleRootItem()->appendRow(varNode); + } + +#ifdef USE_QJSENGINE + ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); + QJSValue globalObject = se.scriptEngine()->globalObject(); + QJSValueIterator it(globalObject); + while (it.hasNext()){ + it.next(); + if (it.value().isCallable() ){ + QStandardItem* itemNode = new QStandardItem; + itemNode->setText(it.name()); + m_model.invisibleRootItem()->appendRow(itemNode); + } + } +#endif + +} + +void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterface* report) +{ + if (report){ + m_model.clear(); + + addAdditionalDatawords(report->dataManager()); + + for ( int i = 0; i < report->pageCount(); ++i){ + PageDesignIntf* page = report->pageAt(i); + + QStandardItem* itemNode = new QStandardItem; + itemNode->setText(page->pageItem()->objectName()); + m_model.invisibleRootItem()->appendRow(itemNode); + + QStringList slotsNames = extractSlotNames(page->pageItem()); + foreach(QString slotName, slotsNames){ + QStandardItem* slotItem = new QStandardItem; + slotItem->setText(slotName); + itemNode->appendRow(slotItem); + } + foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ + addChildItem(item, itemNode->text(), m_model.invisibleRootItem()); + } + } + } +} + +void ReportStructureCompleater::updateCompleaterModel(DataSourceManager *dataManager) +{ + m_model.clear(); + addAdditionalDatawords(dataManager); +} + +QStringList ReportStructureCompleater::extractSlotNames(BaseDesignIntf *item) +{ + QStringList result; + if (!item) return result; + QMetaObject const * mo = item->metaObject(); + while (mo){ + for(int i = mo->methodOffset(); i < mo->methodCount(); ++i) + { + if (mo->method(i).methodType() == QMetaMethod::Signal) { + result.append(QString::fromLatin1(mo->method(i).name())); + } + } + mo = mo->superClass(); + } + result.sort(); + return result; +} + +void ReportStructureCompleater::addChildItem(BaseDesignIntf *item, const QString &pageName, QStandardItem *parent) +{ + if (!item) return; + + QStandardItem* itemNode = new QStandardItem; + itemNode->setText(pageName+"_"+item->objectName()); + parent->appendRow(itemNode); + QStringList slotNames = extractSlotNames(item); + foreach(QString slotName, slotNames){ + QStandardItem* slotItem = new QStandardItem; + slotItem->setText(slotName); + itemNode->appendRow(slotItem); + } + //BandDesignIntf* band = dynamic_cast(item); + //if (band){ + foreach (BaseDesignIntf* child, item->childBaseItems()){ + addChildItem(child, pageName, parent); + } + //} +} + } // namespace LimeReport diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index f9b8db7..666dbc9 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -6,6 +6,7 @@ #include #include #include +#include namespace LimeReport{ @@ -19,6 +20,26 @@ namespace Ui { class ScriptEditor; } +class ReportStructureCompleater : public QCompleter{ + Q_OBJECT +public: + explicit ReportStructureCompleater(QObject* parent = 0): QCompleter(parent){ setModel(&m_model);} + explicit ReportStructureCompleater(QAbstractItemModel* model, QObject* parent = 0) + :QCompleter(model, parent){ setModel(&m_model);} +public: + // QCompleter interface + QString pathFromIndex(const QModelIndex& index) const; + QStringList splitPath(const QString& path) const; + void updateCompleaterModel(ReportEnginePrivateInterface* report); + void updateCompleaterModel(DataSourceManager* dataManager); +protected: + QStringList extractSlotNames(BaseDesignIntf* item); + void addChildItem(BaseDesignIntf *item, const QString &pageName, QStandardItem *parent); + void addAdditionalDatawords(DataSourceManager *dataManager); +private: + QStandardItemModel m_model; +}; + class ScriptEditor : public QWidget { Q_OBJECT @@ -50,8 +71,7 @@ private: Ui::ScriptEditor *ui; ReportEnginePrivateInterface* m_reportEngine; PageDesignIntf* m_page; - QCompleter* m_completer; - + ReportStructureCompleater* m_completer; }; } // namespace LimeReport From 6ad35d63be77ebb56421f27b6bfc3c792b2f1437 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 28 Feb 2018 23:19:04 +0300 Subject: [PATCH 121/347] Easyprofiler added --- 3rdparty/easyprofiler/.gitignore | 2 + 3rdparty/easyprofiler/CMakeCache.txt | 322 ++ .../CMakeFiles/3.5.1/CMakeCXXCompiler.cmake | 68 + .../3.5.1/CMakeDetermineCompilerABI_CXX.bin | Bin 0 -> 8656 bytes .../CMakeFiles/3.5.1/CMakeSystem.cmake | 15 + .../CompilerIdCXX/CMakeCXXCompilerId.cpp | 533 +++ .../CMakeFiles/3.5.1/CompilerIdCXX/a.out | Bin 0 -> 8808 bytes .../CMakeDirectoryInformation.cmake | 16 + .../easyprofiler/CMakeFiles/CMakeOutput.log | 356 ++ .../CMakeFiles/CMakeRuleHashes.txt | 2 + .../CMakeFiles/TargetDirectories.txt | 36 + .../easyprofiler/CMakeFiles/cmake.check_cache | 1 + .../easyprofiler/CMakeFiles/feature_tests.bin | Bin 0 -> 12696 bytes .../easyprofiler/CMakeFiles/feature_tests.cxx | 405 +++ .../easyprofiler/CMakeFiles/progress.marks | 1 + 3rdparty/easyprofiler/CMakeLists.txt | 34 + 3rdparty/easyprofiler/LICENSE.APACHE | 177 + 3rdparty/easyprofiler/LICENSE.MIT | 18 + 3rdparty/easyprofiler/README.md | 224 ++ 3rdparty/easyprofiler/appveyor.bat | 6 + 3rdparty/easyprofiler/appveyor.yml | 19 + 3rdparty/easyprofiler/cmake_install.cmake | 53 + .../CMakeDirectoryInformation.cmake | 16 + .../easy_profilerTargets-release.cmake | 19 + .../easy_profiler/easy_profilerTargets.cmake | 95 + .../easy_profiler.dir/DependInfo.cmake | 37 + .../CMakeFiles/easy_profiler.dir/build.make | 275 ++ .../easy_profiler.dir/cmake_clean.cmake | 16 + .../CMakeFiles/easy_profiler.dir/depend.make | 2 + .../CMakeFiles/easy_profiler.dir/flags.make | 10 + .../CMakeFiles/easy_profiler.dir/link.txt | 1 + .../easy_profiler.dir/progress.make | 9 + .../CMakeFiles/progress.marks | 1 + .../easy_profiler_core/CMakeLists.txt | 309 ++ .../easy_profiler_core/LICENSE.APACHE | 177 + .../easy_profiler_core/LICENSE.MIT | 18 + .../easyprofiler/easy_profiler_core/block.cpp | 241 ++ .../easy_profiler_core/chunk_allocator.h | 509 +++ .../easy_profiler_core/cmake/config.cmake.in | 4 + .../easy_profiler_core/cmake_install.cmake | 104 + .../easy_profiler_core/current_thread.h | 79 + .../easy_profiler_core/current_time.h | 174 + .../easy_profiler_core/easy_socket.cpp | 431 +++ .../easy_profiler_core/event_trace_status.h | 27 + .../easy_profiler_core/event_trace_win.cpp | 550 +++ .../easy_profiler_core/event_trace_win.h | 129 + .../generated/easy_profilerConfig.cmake | 28 + .../easy_profilerConfigVersion.cmake | 46 + .../easy_profiler_core/hashed_cstr.h | 298 ++ .../include/easy/arbitrary_value.h | 308 ++ .../easy/details/arbitrary_value_aux.h | 130 + .../details/arbitrary_value_public_types.h | 102 + .../easy/details/easy_compiler_support.h | 224 ++ .../include/easy/details/profiler_aux.h | 214 ++ .../include/easy/details/profiler_colors.h | 413 +++ .../easy/details/profiler_public_types.h | 203 ++ .../include/easy/easy_net.h | 161 + .../include/easy/easy_socket.h | 130 + .../include/easy/profiler.h | 910 +++++ .../easy_profiler_core/include/easy/reader.h | 428 +++ .../include/easy/serialized_block.h | 289 ++ .../easy_profiler_core/include/easy/utility.h | 63 + .../easy_profiler_core/nonscoped_block.cpp | 92 + .../easy_profiler_core/nonscoped_block.h | 73 + .../easy_profiler_core/outstream.h | 115 + .../easy_profiler_core/profile_manager.cpp | 2015 +++++++++++ .../easy_profiler_core/profile_manager.h | 211 ++ .../easy_profiler_core/reader.cpp | 1030 ++++++ .../easy_profiler_core/resources.rc | 30 + .../easy_profiler_core/spin_lock.h | 126 + .../easy_profiler_core/stack_buffer.h | 140 + .../easy_profiler_core/thread_storage.cpp | 157 + .../easy_profiler_core/thread_storage.h | 134 + .../CMakeDirectoryInformation.cmake | 16 + .../profiler_gui.dir/DependInfo.cmake | 59 + .../CMakeFiles/profiler_gui.dir/build.make | 603 ++++ .../profiler_gui.dir/cmake_clean.cmake | 30 + .../CMakeFiles/profiler_gui.dir/depend.make | 2 + .../CMakeFiles/profiler_gui.dir/flags.make | 10 + .../CMakeFiles/profiler_gui.dir/link.txt | 1 + .../CMakeFiles/profiler_gui.dir/progress.make | 21 + .../AutogenInfo.cmake | 29 + .../profiler_gui_automoc.dir/DependInfo.cmake | 11 + .../profiler_gui_automoc.dir/build.make | 77 + .../cmake_clean.cmake | 10 + .../profiler_gui_automoc.dir/progress.make | 2 + .../profiler_gui/CMakeFiles/progress.marks | 1 + .../easyprofiler/profiler_gui/CMakeLists.txt | 70 + .../arbitrary_value_inspector.cpp | 1060 ++++++ .../profiler_gui/arbitrary_value_inspector.h | 299 ++ .../profiler_gui/blocks_graphics_view.cpp | 2509 ++++++++++++++ .../profiler_gui/blocks_graphics_view.h | 349 ++ .../profiler_gui/blocks_tree_widget.cpp | 1280 +++++++ .../profiler_gui/blocks_tree_widget.h | 219 ++ .../profiler_gui/cmake_install.cmake | 54 + .../profiler_gui/common_functions.cpp | 345 ++ .../profiler_gui/common_functions.h | 205 ++ .../easyprofiler/profiler_gui/common_types.h | 205 ++ .../profiler_gui/descriptors_tree_widget.cpp | 982 ++++++ .../profiler_gui/descriptors_tree_widget.h | 234 ++ .../profiler_gui/easy_chronometer_item.cpp | 396 +++ .../profiler_gui/easy_chronometer_item.h | 171 + .../profiler_gui/easy_frame_rate_viewer.cpp | 339 ++ .../profiler_gui/easy_frame_rate_viewer.h | 126 + .../profiler_gui/easy_graphics_item.cpp | 1460 ++++++++ .../profiler_gui/easy_graphics_item.h | 195 ++ .../profiler_gui/easy_graphics_scrollbar.cpp | 2078 ++++++++++++ .../profiler_gui/easy_graphics_scrollbar.h | 342 ++ .../easyprofiler/profiler_gui/easy_qtimer.cpp | 85 + .../easyprofiler/profiler_gui/easy_qtimer.h | 89 + .../easyprofiler/profiler_gui/globals.cpp | 122 + 3rdparty/easyprofiler/profiler_gui/globals.h | 273 ++ .../profiler_gui/globals_qobjects.cpp | 72 + .../profiler_gui/globals_qobjects.h | 95 + .../profiler_gui/images/attribution.txt | 43 + .../images/default/arrow-down-disabled.svg | 12 + .../images/default/arrow-down-hover.svg | 12 + .../images/default/arrow-down.svg | 12 + .../images/default/arrow-left.svg | 12 + .../images/default/arrow-right.svg | 12 + .../images/default/arrow-up-disabled.svg | 12 + .../images/default/arrow-up-hover.svg | 12 + .../profiler_gui/images/default/arrow-up.svg | 12 + .../images/default/check-disabled.svg | 8 + .../profiler_gui/images/default/check.svg | 8 + .../images/default/close-white-hover.svg | 12 + .../images/default/close-white-pressed.svg | 12 + .../images/default/close-white.svg | 12 + .../profiler_gui/images/default/collapse.svg | 16 + .../images/default/colors-black.svg | 31 + .../profiler_gui/images/default/colors.svg | 41 + .../images/default/delete-old.svg | 15 + .../profiler_gui/images/default/delete.svg | 10 + .../profiler_gui/images/default/expand.svg | 15 + .../profiler_gui/images/default/lan.svg | 25 + .../profiler_gui/images/default/lan_on.svg | 25 + .../profiler_gui/images/default/list.svg | 28 + .../images/default/maximize-white-hover.svg | 16 + .../images/default/maximize-white-pressed.svg | 16 + .../images/default/maximize-white.svg | 16 + .../images/default/minimize-white-hover.svg | 16 + .../images/default/minimize-white-pressed.svg | 16 + .../images/default/minimize-white.svg | 16 + .../profiler_gui/images/default/off.svg | 12 + .../images/default/open-folder.svg | 14 + .../images/default/open-folder2.svg | 16 + .../profiler_gui/images/default/play.svg | 11 + .../default/radio-indicator-disabled.svg | 7 + .../images/default/radio-indicator.svg | 7 + .../images/default/reload-folder2.svg | 24 + .../profiler_gui/images/default/reload.svg | 13 + .../profiler_gui/images/default/save.svg | 73 + .../images/default/search-next.svg | 23 + .../images/default/search-prev.svg | 23 + .../profiler_gui/images/default/settings.svg | 39 + .../images/default/statistics.svg | 14 + .../images/default/statistics2.svg | 16 + .../profiler_gui/images/default/stop.svg | 11 + .../profiler_gui/images/default/wifi.svg | 18 + .../profiler_gui/images/default/wifi_on.svg | 18 + .../easyprofiler/profiler_gui/images/logo.ico | Bin 0 -> 179025 bytes .../easyprofiler/profiler_gui/images/logo.svg | 18 + 3rdparty/easyprofiler/profiler_gui/main.cpp | 74 + .../easyprofiler/profiler_gui/main_window.cpp | 2982 +++++++++++++++++ .../easyprofiler/profiler_gui/main_window.h | 335 ++ .../easyprofiler/profiler_gui/resources.qrc | 51 + .../easyprofiler/profiler_gui/resources.rc | 33 + .../profiler_gui/themes/default.css | 358 ++ .../profiler_gui/themes/default.scss | 391 +++ .../profiler_gui/tree_widget_item.cpp | 431 +++ .../profiler_gui/tree_widget_item.h | 184 + .../profiler_gui/tree_widget_loader.cpp | 1031 ++++++ .../profiler_gui/tree_widget_loader.h | 134 + .../treeview_first_column_delegate.cpp | 33 + .../treeview_first_column_delegate.h | 23 + .../CMakeDirectoryInformation.cmake | 16 + .../profiler_reader.dir/DependInfo.cmake | 31 + .../CMakeFiles/profiler_reader.dir/build.make | 114 + .../profiler_reader.dir/cmake_clean.cmake | 10 + .../profiler_reader.dir/depend.make | 2 + .../CMakeFiles/profiler_reader.dir/flags.make | 10 + .../CMakeFiles/profiler_reader.dir/link.txt | 1 + .../profiler_reader.dir/progress.make | 3 + .../reader/CMakeFiles/progress.marks | 1 + 3rdparty/easyprofiler/reader/CMakeLists.txt | 3 + .../easyprofiler/reader/cmake_install.cmake | 34 + 3rdparty/easyprofiler/reader/main.cpp | 146 + .../CMakeDirectoryInformation.cmake | 16 + .../profiler_sample.dir/DependInfo.cmake | 31 + .../CMakeFiles/profiler_sample.dir/build.make | 114 + .../profiler_sample.dir/cmake_clean.cmake | 10 + .../profiler_sample.dir/depend.make | 2 + .../CMakeFiles/profiler_sample.dir/flags.make | 10 + .../CMakeFiles/profiler_sample.dir/link.txt | 1 + .../profiler_sample.dir/progress.make | 3 + .../DependInfo.cmake | 32 + .../build.make | 114 + .../cmake_clean.cmake | 10 + .../depend.make | 2 + .../flags.make | 10 + .../link.txt | 1 + .../progress.make | 3 + .../sample/CMakeFiles/progress.marks | 1 + 3rdparty/easyprofiler/sample/CMakeLists.txt | 16 + .../easyprofiler/sample/build_express_test.sh | 21 + .../easyprofiler/sample/cmake_install.cmake | 34 + .../easyprofiler/sample/express_sample.cpp | 83 + 3rdparty/easyprofiler/sample/main.cpp | 289 ++ 3rdparty/easyprofiler/sample/main_clock.cpp | 249 ++ .../scripts/context_switch_logger.stp | 37 + 3rdparty/easyprofiler/scripts/make_style.sh | 19 + 3rdparty/easyprofiler/scripts/test.sh | 57 + common.pri | 14 +- demo_r1/mainwindow.cpp | 12 + limereport/lrdatasourcemanager.cpp | 35 +- limereport/lrreportengine.cpp | 22 +- limereport/lrreportengine_p.h | 3 +- limereport/serializators/lrxmlreader.cpp | 7 + 218 files changed, 36639 insertions(+), 17 deletions(-) create mode 100644 3rdparty/easyprofiler/.gitignore create mode 100644 3rdparty/easyprofiler/CMakeCache.txt create mode 100644 3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake create mode 100755 3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin create mode 100644 3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeSystem.cmake create mode 100644 3rdparty/easyprofiler/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp create mode 100755 3rdparty/easyprofiler/CMakeFiles/3.5.1/CompilerIdCXX/a.out create mode 100644 3rdparty/easyprofiler/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/easyprofiler/CMakeFiles/CMakeOutput.log create mode 100644 3rdparty/easyprofiler/CMakeFiles/CMakeRuleHashes.txt create mode 100644 3rdparty/easyprofiler/CMakeFiles/TargetDirectories.txt create mode 100644 3rdparty/easyprofiler/CMakeFiles/cmake.check_cache create mode 100755 3rdparty/easyprofiler/CMakeFiles/feature_tests.bin create mode 100644 3rdparty/easyprofiler/CMakeFiles/feature_tests.cxx create mode 100644 3rdparty/easyprofiler/CMakeFiles/progress.marks create mode 100644 3rdparty/easyprofiler/CMakeLists.txt create mode 100644 3rdparty/easyprofiler/LICENSE.APACHE create mode 100644 3rdparty/easyprofiler/LICENSE.MIT create mode 100644 3rdparty/easyprofiler/README.md create mode 100644 3rdparty/easyprofiler/appveyor.bat create mode 100644 3rdparty/easyprofiler/appveyor.yml create mode 100644 3rdparty/easyprofiler/cmake_install.cmake create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets-release.cmake create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets.cmake create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/DependInfo.cmake create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/cmake_clean.cmake create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/depend.make create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/link.txt create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/progress.make create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/progress.marks create mode 100644 3rdparty/easyprofiler/easy_profiler_core/CMakeLists.txt create mode 100644 3rdparty/easyprofiler/easy_profiler_core/LICENSE.APACHE create mode 100644 3rdparty/easyprofiler/easy_profiler_core/LICENSE.MIT create mode 100644 3rdparty/easyprofiler/easy_profiler_core/block.cpp create mode 100644 3rdparty/easyprofiler/easy_profiler_core/chunk_allocator.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/cmake/config.cmake.in create mode 100644 3rdparty/easyprofiler/easy_profiler_core/cmake_install.cmake create mode 100644 3rdparty/easyprofiler/easy_profiler_core/current_thread.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/current_time.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/easy_socket.cpp create mode 100644 3rdparty/easyprofiler/easy_profiler_core/event_trace_status.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/event_trace_win.cpp create mode 100644 3rdparty/easyprofiler/easy_profiler_core/event_trace_win.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/generated/easy_profilerConfig.cmake create mode 100644 3rdparty/easyprofiler/easy_profiler_core/generated/easy_profilerConfigVersion.cmake create mode 100644 3rdparty/easyprofiler/easy_profiler_core/hashed_cstr.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/arbitrary_value.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_aux.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_public_types.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/details/easy_compiler_support.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_aux.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_colors.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_public_types.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/easy_net.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/easy_socket.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/profiler.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/reader.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/serialized_block.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/include/easy/utility.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/nonscoped_block.cpp create mode 100644 3rdparty/easyprofiler/easy_profiler_core/nonscoped_block.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/outstream.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/profile_manager.cpp create mode 100644 3rdparty/easyprofiler/easy_profiler_core/profile_manager.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/reader.cpp create mode 100644 3rdparty/easyprofiler/easy_profiler_core/resources.rc create mode 100644 3rdparty/easyprofiler/easy_profiler_core/spin_lock.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/stack_buffer.h create mode 100644 3rdparty/easyprofiler/easy_profiler_core/thread_storage.cpp create mode 100644 3rdparty/easyprofiler/easy_profiler_core/thread_storage.h create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/DependInfo.cmake create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/build.make create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/cmake_clean.cmake create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/depend.make create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/flags.make create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/link.txt create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/progress.make create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/AutogenInfo.cmake create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/DependInfo.cmake create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/build.make create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/cmake_clean.cmake create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/progress.make create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeFiles/progress.marks create mode 100644 3rdparty/easyprofiler/profiler_gui/CMakeLists.txt create mode 100644 3rdparty/easyprofiler/profiler_gui/arbitrary_value_inspector.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/arbitrary_value_inspector.h create mode 100644 3rdparty/easyprofiler/profiler_gui/blocks_graphics_view.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/blocks_graphics_view.h create mode 100644 3rdparty/easyprofiler/profiler_gui/blocks_tree_widget.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/blocks_tree_widget.h create mode 100644 3rdparty/easyprofiler/profiler_gui/cmake_install.cmake create mode 100644 3rdparty/easyprofiler/profiler_gui/common_functions.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/common_functions.h create mode 100644 3rdparty/easyprofiler/profiler_gui/common_types.h create mode 100644 3rdparty/easyprofiler/profiler_gui/descriptors_tree_widget.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/descriptors_tree_widget.h create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_chronometer_item.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_chronometer_item.h create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_frame_rate_viewer.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_frame_rate_viewer.h create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_graphics_item.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_graphics_item.h create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_graphics_scrollbar.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_graphics_scrollbar.h create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_qtimer.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/easy_qtimer.h create mode 100644 3rdparty/easyprofiler/profiler_gui/globals.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/globals.h create mode 100644 3rdparty/easyprofiler/profiler_gui/globals_qobjects.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/globals_qobjects.h create mode 100644 3rdparty/easyprofiler/profiler_gui/images/attribution.txt create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/arrow-down-disabled.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/arrow-down-hover.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/arrow-down.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/arrow-left.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/arrow-right.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/arrow-up-disabled.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/arrow-up-hover.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/arrow-up.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/check-disabled.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/check.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/close-white-hover.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/close-white-pressed.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/close-white.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/collapse.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/colors-black.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/colors.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/delete-old.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/delete.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/expand.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/lan.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/lan_on.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/list.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/maximize-white-hover.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/maximize-white-pressed.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/maximize-white.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/minimize-white-hover.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/minimize-white-pressed.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/minimize-white.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/off.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/open-folder.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/open-folder2.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/play.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/radio-indicator-disabled.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/radio-indicator.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/reload-folder2.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/reload.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/save.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/search-next.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/search-prev.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/settings.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/statistics.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/statistics2.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/stop.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/wifi.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/default/wifi_on.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/images/logo.ico create mode 100644 3rdparty/easyprofiler/profiler_gui/images/logo.svg create mode 100644 3rdparty/easyprofiler/profiler_gui/main.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/main_window.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/main_window.h create mode 100644 3rdparty/easyprofiler/profiler_gui/resources.qrc create mode 100644 3rdparty/easyprofiler/profiler_gui/resources.rc create mode 100644 3rdparty/easyprofiler/profiler_gui/themes/default.css create mode 100644 3rdparty/easyprofiler/profiler_gui/themes/default.scss create mode 100644 3rdparty/easyprofiler/profiler_gui/tree_widget_item.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/tree_widget_item.h create mode 100644 3rdparty/easyprofiler/profiler_gui/tree_widget_loader.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/tree_widget_loader.h create mode 100644 3rdparty/easyprofiler/profiler_gui/treeview_first_column_delegate.cpp create mode 100644 3rdparty/easyprofiler/profiler_gui/treeview_first_column_delegate.h create mode 100644 3rdparty/easyprofiler/reader/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/DependInfo.cmake create mode 100644 3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/build.make create mode 100644 3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/cmake_clean.cmake create mode 100644 3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/depend.make create mode 100644 3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/flags.make create mode 100644 3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/link.txt create mode 100644 3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/progress.make create mode 100644 3rdparty/easyprofiler/reader/CMakeFiles/progress.marks create mode 100644 3rdparty/easyprofiler/reader/CMakeLists.txt create mode 100644 3rdparty/easyprofiler/reader/cmake_install.cmake create mode 100644 3rdparty/easyprofiler/reader/main.cpp create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/CMakeDirectoryInformation.cmake create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/DependInfo.cmake create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/build.make create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/cmake_clean.cmake create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/depend.make create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/flags.make create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/link.txt create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/progress.make create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/DependInfo.cmake create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/build.make create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/cmake_clean.cmake create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/depend.make create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/flags.make create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/link.txt create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/progress.make create mode 100644 3rdparty/easyprofiler/sample/CMakeFiles/progress.marks create mode 100644 3rdparty/easyprofiler/sample/CMakeLists.txt create mode 100755 3rdparty/easyprofiler/sample/build_express_test.sh create mode 100644 3rdparty/easyprofiler/sample/cmake_install.cmake create mode 100644 3rdparty/easyprofiler/sample/express_sample.cpp create mode 100644 3rdparty/easyprofiler/sample/main.cpp create mode 100644 3rdparty/easyprofiler/sample/main_clock.cpp create mode 100644 3rdparty/easyprofiler/scripts/context_switch_logger.stp create mode 100755 3rdparty/easyprofiler/scripts/make_style.sh create mode 100755 3rdparty/easyprofiler/scripts/test.sh diff --git a/3rdparty/easyprofiler/.gitignore b/3rdparty/easyprofiler/.gitignore new file mode 100644 index 0000000..83ccc54 --- /dev/null +++ b/3rdparty/easyprofiler/.gitignore @@ -0,0 +1,2 @@ +/build/ +/bin/ diff --git a/3rdparty/easyprofiler/CMakeCache.txt b/3rdparty/easyprofiler/CMakeCache.txt new file mode 100644 index 0000000..b48fae6 --- /dev/null +++ b/3rdparty/easyprofiler/CMakeCache.txt @@ -0,0 +1,322 @@ +# This is the CMakeCache file. +# For build in directory: /home/alex/Work/C++Projects/easyprofiler +# It was generated by CMake: /usr/bin/cmake +# You can edit this file to change values found and used by cmake. +# If you do not want to change any of the values, simply exit the editor. +# If you do want to change a value, simply edit, save, and exit the editor. +# The syntax for the file is as follows: +# KEY:TYPE=VALUE +# KEY is the name of a variable in the cache. +# TYPE is a hint to GUIs for the type of VALUE, DO NOT EDIT TYPE!. +# VALUE is the current value for the KEY. + +######################## +# EXTERNAL cache entries +######################## + +//Build easy_profiler as shared library. +BUILD_SHARED_LIBS:BOOL=ON + +//Use std::chrono::high_resolution_clock as a timer +BUILD_WITH_CHRONO_HIGH_RESOLUTION_CLOCK:BOOL=OFF + +//Use std::chrono::steady_clock as a timer +BUILD_WITH_CHRONO_STEADY_CLOCK:BOOL=OFF + +//Path to a program. +CMAKE_AR:FILEPATH=/usr/bin/ar + +//Choose the type of build, options are: None(CMAKE_CXX_FLAGS or +// CMAKE_C_FLAGS used) Debug Release RelWithDebInfo MinSizeRel. +CMAKE_BUILD_TYPE:STRING=Release + +//Enable/Disable color output during build. +CMAKE_COLOR_MAKEFILE:BOOL=ON + +//CXX compiler +CMAKE_CXX_COMPILER:FILEPATH=/usr/bin/c++ + +//Flags used by the compiler during all build types. +CMAKE_CXX_FLAGS:STRING= + +//Flags used by the compiler during debug builds. +CMAKE_CXX_FLAGS_DEBUG:STRING=-g + +//Flags used by the compiler during release builds for minimum +// size. +CMAKE_CXX_FLAGS_MINSIZEREL:STRING=-Os -DNDEBUG + +//Flags used by the compiler during release builds. +CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG + +//Flags used by the compiler during release builds with debug info. +CMAKE_CXX_FLAGS_RELWITHDEBINFO:STRING=-O2 -g -DNDEBUG + +//Flags used by the linker. +CMAKE_EXE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_EXE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_EXE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Enable/Disable output of compile commands during generation. +CMAKE_EXPORT_COMPILE_COMMANDS:BOOL=OFF + +//Install path prefix, prepended onto install directories. +CMAKE_INSTALL_PREFIX:PATH=/usr/local + +//Path to a program. +CMAKE_LINKER:FILEPATH=/usr/bin/ld + +//Path to a program. +CMAKE_MAKE_PROGRAM:FILEPATH=/usr/bin/make + +//Flags used by the linker during the creation of modules. +CMAKE_MODULE_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_MODULE_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_MODULE_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_NM:FILEPATH=/usr/bin/nm + +//Path to a program. +CMAKE_OBJCOPY:FILEPATH=/usr/bin/objcopy + +//Path to a program. +CMAKE_OBJDUMP:FILEPATH=/usr/bin/objdump + +//Value Computed by CMake +CMAKE_PROJECT_NAME:STATIC=easy_profiler + +//Path to a program. +CMAKE_RANLIB:FILEPATH=/usr/bin/ranlib + +//Flags used by the linker during the creation of dll's. +CMAKE_SHARED_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_SHARED_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_SHARED_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//If set, runtime paths are not added when installing shared libraries, +// but are added when building. +CMAKE_SKIP_INSTALL_RPATH:BOOL=NO + +//If set, runtime paths are not added when using shared libraries. +CMAKE_SKIP_RPATH:BOOL=NO + +//Flags used by the linker during the creation of static libraries. +CMAKE_STATIC_LINKER_FLAGS:STRING= + +//Flags used by the linker during debug builds. +CMAKE_STATIC_LINKER_FLAGS_DEBUG:STRING= + +//Flags used by the linker during release minsize builds. +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL:STRING= + +//Flags used by the linker during release builds. +CMAKE_STATIC_LINKER_FLAGS_RELEASE:STRING= + +//Flags used by the linker during Release with Debug Info builds. +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO:STRING= + +//Path to a program. +CMAKE_STRIP:FILEPATH=/usr/bin/strip + +//If this value is on, makefiles will be generated without the +// .SILENT directive, and all commands will be echoed to the console +// during the make. This is useful for debugging only. With Visual +// Studio IDE projects all commands are done without /nologo. +CMAKE_VERBOSE_MAKEFILE:BOOL=FALSE + +//Default listening port +EASY_DEFAULT_PORT:STRING=28077 + +//Enable new threads registration when collecting context switch +// events +EASY_OPTION_IMPLICIT_THREAD_REGISTRATION:BOOL=ON + +//Enable automatic startListen on startup +EASY_OPTION_LISTEN:BOOL=OFF + +//Print errors to stderr +EASY_OPTION_LOG:BOOL=OFF + +//Use predefined set of colors (see profiler_colors.h). If you +// want to use your own colors palette you can turn this option +// OFF +EASY_OPTION_PREDEFINED_COLORS:BOOL=ON + +//Use pretty-printed function names with signature and argument +// types +EASY_OPTION_PRETTY_PRINT:BOOL=OFF + +//Enable self profiling (measure time for internal storage expand) +EASY_OPTION_PROFILE_SELF:BOOL=OFF + +//Storage expand default status (profiler::ON or profiler::OFF) +EASY_OPTION_PROFILE_SELF_BLOCKS_ON:BOOL=OFF + +//The directory containing a CMake configuration file for Qt5Core. +Qt5Core_DIR:PATH=/home/alex/Work/Qt/5.8/gcc_64/lib/cmake/Qt5Core + +//The directory containing a CMake configuration file for Qt5Gui. +Qt5Gui_DIR:PATH=/home/alex/Work/Qt/5.8/gcc_64/lib/cmake/Qt5Gui + +//The directory containing a CMake configuration file for Qt5Widgets. +Qt5Widgets_DIR:PATH=/home/alex/Work/Qt/5.8/gcc_64/lib/cmake/Qt5Widgets + +//Value Computed by CMake +easy_profiler_BINARY_DIR:STATIC=/home/alex/Work/C++Projects/easyprofiler + +//Dependencies for the target +easy_profiler_LIB_DEPENDS:STATIC=general;pthread; + +//Value Computed by CMake +easy_profiler_SOURCE_DIR:STATIC=/home/alex/Work/C++Projects/easyprofiler + + +######################## +# INTERNAL cache entries +######################## + +//ADVANCED property for variable: CMAKE_AR +CMAKE_AR-ADVANCED:INTERNAL=1 +//This is the directory where this CMakeCache.txt was created +CMAKE_CACHEFILE_DIR:INTERNAL=/home/alex/Work/C++Projects/easyprofiler +//Major version of cmake used to create the current loaded cache +CMAKE_CACHE_MAJOR_VERSION:INTERNAL=3 +//Minor version of cmake used to create the current loaded cache +CMAKE_CACHE_MINOR_VERSION:INTERNAL=5 +//Patch version of cmake used to create the current loaded cache +CMAKE_CACHE_PATCH_VERSION:INTERNAL=1 +//ADVANCED property for variable: CMAKE_COLOR_MAKEFILE +CMAKE_COLOR_MAKEFILE-ADVANCED:INTERNAL=1 +//Path to CMake executable. +CMAKE_COMMAND:INTERNAL=/usr/bin/cmake +//Path to cpack program executable. +CMAKE_CPACK_COMMAND:INTERNAL=/usr/bin/cpack +//Path to ctest program executable. +CMAKE_CTEST_COMMAND:INTERNAL=/usr/bin/ctest +//ADVANCED property for variable: CMAKE_CXX_COMPILER +CMAKE_CXX_COMPILER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS +CMAKE_CXX_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_DEBUG +CMAKE_CXX_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_MINSIZEREL +CMAKE_CXX_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELEASE +CMAKE_CXX_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_CXX_FLAGS_RELWITHDEBINFO +CMAKE_CXX_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//Executable file format +CMAKE_EXECUTABLE_FORMAT:INTERNAL=ELF +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS +CMAKE_EXE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_DEBUG +CMAKE_EXE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_MINSIZEREL +CMAKE_EXE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELEASE +CMAKE_EXE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_EXPORT_COMPILE_COMMANDS +CMAKE_EXPORT_COMPILE_COMMANDS-ADVANCED:INTERNAL=1 +//Name of external makefile project generator. +CMAKE_EXTRA_GENERATOR:INTERNAL= +//Name of generator. +CMAKE_GENERATOR:INTERNAL=Unix Makefiles +//Name of generator platform. +CMAKE_GENERATOR_PLATFORM:INTERNAL= +//Name of generator toolset. +CMAKE_GENERATOR_TOOLSET:INTERNAL= +//Source directory with the top level CMakeLists.txt file for this +// project +CMAKE_HOME_DIRECTORY:INTERNAL=/home/alex/Work/C++Projects/easyprofiler +//Install .so files without execute permission. +CMAKE_INSTALL_SO_NO_EXE:INTERNAL=1 +//ADVANCED property for variable: CMAKE_LINKER +CMAKE_LINKER-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MAKE_PROGRAM +CMAKE_MAKE_PROGRAM-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS +CMAKE_MODULE_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_DEBUG +CMAKE_MODULE_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL +CMAKE_MODULE_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELEASE +CMAKE_MODULE_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_MODULE_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_NM +CMAKE_NM-ADVANCED:INTERNAL=1 +//number of local generators +CMAKE_NUMBER_OF_MAKEFILES:INTERNAL=5 +//ADVANCED property for variable: CMAKE_OBJCOPY +CMAKE_OBJCOPY-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_OBJDUMP +CMAKE_OBJDUMP-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_RANLIB +CMAKE_RANLIB-ADVANCED:INTERNAL=1 +//Path to CMake installation. +CMAKE_ROOT:INTERNAL=/usr/share/cmake-3.5 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS +CMAKE_SHARED_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_DEBUG +CMAKE_SHARED_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL +CMAKE_SHARED_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELEASE +CMAKE_SHARED_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_INSTALL_RPATH +CMAKE_SKIP_INSTALL_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_SKIP_RPATH +CMAKE_SKIP_RPATH-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS +CMAKE_STATIC_LINKER_FLAGS-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_DEBUG +CMAKE_STATIC_LINKER_FLAGS_DEBUG-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL +CMAKE_STATIC_LINKER_FLAGS_MINSIZEREL-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELEASE +CMAKE_STATIC_LINKER_FLAGS_RELEASE-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO +CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO-ADVANCED:INTERNAL=1 +//ADVANCED property for variable: CMAKE_STRIP +CMAKE_STRIP-ADVANCED:INTERNAL=1 +//uname command +CMAKE_UNAME:INTERNAL=/bin/uname +//ADVANCED property for variable: CMAKE_VERBOSE_MAKEFILE +CMAKE_VERBOSE_MAKEFILE-ADVANCED:INTERNAL=1 + diff --git a/3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake b/3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake new file mode 100644 index 0000000..013ee92 --- /dev/null +++ b/3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeCXXCompiler.cmake @@ -0,0 +1,68 @@ +set(CMAKE_CXX_COMPILER "/usr/bin/c++") +set(CMAKE_CXX_COMPILER_ARG1 "") +set(CMAKE_CXX_COMPILER_ID "GNU") +set(CMAKE_CXX_COMPILER_VERSION "5.4.0") +set(CMAKE_CXX_COMPILER_WRAPPER "") +set(CMAKE_CXX_STANDARD_COMPUTED_DEFAULT "98") +set(CMAKE_CXX_COMPILE_FEATURES "cxx_template_template_parameters;cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates;cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") +set(CMAKE_CXX98_COMPILE_FEATURES "cxx_template_template_parameters") +set(CMAKE_CXX11_COMPILE_FEATURES "cxx_alias_templates;cxx_alignas;cxx_alignof;cxx_attributes;cxx_auto_type;cxx_constexpr;cxx_decltype;cxx_decltype_incomplete_return_types;cxx_default_function_template_args;cxx_defaulted_functions;cxx_defaulted_move_initializers;cxx_delegating_constructors;cxx_deleted_functions;cxx_enum_forward_declarations;cxx_explicit_conversions;cxx_extended_friend_declarations;cxx_extern_templates;cxx_final;cxx_func_identifier;cxx_generalized_initializers;cxx_inheriting_constructors;cxx_inline_namespaces;cxx_lambdas;cxx_local_type_template_args;cxx_long_long_type;cxx_noexcept;cxx_nonstatic_member_init;cxx_nullptr;cxx_override;cxx_range_for;cxx_raw_string_literals;cxx_reference_qualified_functions;cxx_right_angle_brackets;cxx_rvalue_references;cxx_sizeof_member;cxx_static_assert;cxx_strong_enums;cxx_thread_local;cxx_trailing_return_types;cxx_unicode_literals;cxx_uniform_initialization;cxx_unrestricted_unions;cxx_user_literals;cxx_variadic_macros;cxx_variadic_templates") +set(CMAKE_CXX14_COMPILE_FEATURES "cxx_aggregate_default_initializers;cxx_attribute_deprecated;cxx_binary_literals;cxx_contextual_conversions;cxx_decltype_auto;cxx_digit_separators;cxx_generic_lambdas;cxx_lambda_init_captures;cxx_relaxed_constexpr;cxx_return_type_deduction;cxx_variable_templates") + +set(CMAKE_CXX_PLATFORM_ID "Linux") +set(CMAKE_CXX_SIMULATE_ID "") +set(CMAKE_CXX_SIMULATE_VERSION "") + +set(CMAKE_AR "/usr/bin/ar") +set(CMAKE_RANLIB "/usr/bin/ranlib") +set(CMAKE_LINKER "/usr/bin/ld") +set(CMAKE_COMPILER_IS_GNUCXX 1) +set(CMAKE_CXX_COMPILER_LOADED 1) +set(CMAKE_CXX_COMPILER_WORKS TRUE) +set(CMAKE_CXX_ABI_COMPILED TRUE) +set(CMAKE_COMPILER_IS_MINGW ) +set(CMAKE_COMPILER_IS_CYGWIN ) +if(CMAKE_COMPILER_IS_CYGWIN) + set(CYGWIN 1) + set(UNIX 1) +endif() + +set(CMAKE_CXX_COMPILER_ENV_VAR "CXX") + +if(CMAKE_COMPILER_IS_MINGW) + set(MINGW 1) +endif() +set(CMAKE_CXX_COMPILER_ID_RUN 1) +set(CMAKE_CXX_IGNORE_EXTENSIONS inl;h;hpp;HPP;H;o;O;obj;OBJ;def;DEF;rc;RC) +set(CMAKE_CXX_SOURCE_FILE_EXTENSIONS C;M;c++;cc;cpp;cxx;mm;CPP) +set(CMAKE_CXX_LINKER_PREFERENCE 30) +set(CMAKE_CXX_LINKER_PREFERENCE_PROPAGATES 1) + +# Save compiler ABI information. +set(CMAKE_CXX_SIZEOF_DATA_PTR "8") +set(CMAKE_CXX_COMPILER_ABI "ELF") +set(CMAKE_CXX_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") + +if(CMAKE_CXX_SIZEOF_DATA_PTR) + set(CMAKE_SIZEOF_VOID_P "${CMAKE_CXX_SIZEOF_DATA_PTR}") +endif() + +if(CMAKE_CXX_COMPILER_ABI) + set(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_CXX_COMPILER_ABI}") +endif() + +if(CMAKE_CXX_LIBRARY_ARCHITECTURE) + set(CMAKE_LIBRARY_ARCHITECTURE "x86_64-linux-gnu") +endif() + +set(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX "") +if(CMAKE_CXX_CL_SHOWINCLUDES_PREFIX) + set(CMAKE_CL_SHOWINCLUDES_PREFIX "${CMAKE_CXX_CL_SHOWINCLUDES_PREFIX}") +endif() + + + + +set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "stdc++;m;c") +set(CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES "/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib") +set(CMAKE_CXX_IMPLICIT_LINK_FRAMEWORK_DIRECTORIES "") diff --git a/3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin b/3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeDetermineCompilerABI_CXX.bin new file mode 100755 index 0000000000000000000000000000000000000000..ccb7de9ede4cf8725175d46ca9e0c16ef6061c41 GIT binary patch literal 8656 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 RwC&nIyUg&`Y;kUF|KGJQj1d3; literal 0 HcmV?d00001 diff --git a/3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeSystem.cmake b/3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeSystem.cmake new file mode 100644 index 0000000..9b97c52 --- /dev/null +++ b/3rdparty/easyprofiler/CMakeFiles/3.5.1/CMakeSystem.cmake @@ -0,0 +1,15 @@ +set(CMAKE_HOST_SYSTEM "Linux-4.4.0-93-generic") +set(CMAKE_HOST_SYSTEM_NAME "Linux") +set(CMAKE_HOST_SYSTEM_VERSION "4.4.0-93-generic") +set(CMAKE_HOST_SYSTEM_PROCESSOR "x86_64") + + + +set(CMAKE_SYSTEM "Linux-4.4.0-93-generic") +set(CMAKE_SYSTEM_NAME "Linux") +set(CMAKE_SYSTEM_VERSION "4.4.0-93-generic") +set(CMAKE_SYSTEM_PROCESSOR "x86_64") + +set(CMAKE_CROSSCOMPILING "FALSE") + +set(CMAKE_SYSTEM_LOADED 1) diff --git a/3rdparty/easyprofiler/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp b/3rdparty/easyprofiler/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp new file mode 100644 index 0000000..e6d8536 --- /dev/null +++ b/3rdparty/easyprofiler/CMakeFiles/3.5.1/CompilerIdCXX/CMakeCXXCompilerId.cpp @@ -0,0 +1,533 @@ +/* This source file must have a .cpp extension so that all C++ compilers + recognize the extension without flags. Borland does not know .cxx for + example. */ +#ifndef __cplusplus +# error "A C compiler has been selected for C++." +#endif + + +/* Version number components: V=Version, R=Revision, P=Patch + Version date components: YYYY=Year, MM=Month, DD=Day */ + +#if defined(__COMO__) +# define COMPILER_ID "Comeau" + /* __COMO_VERSION__ = VRR */ +# define COMPILER_VERSION_MAJOR DEC(__COMO_VERSION__ / 100) +# define COMPILER_VERSION_MINOR DEC(__COMO_VERSION__ % 100) + +#elif defined(__INTEL_COMPILER) || defined(__ICC) +# define COMPILER_ID "Intel" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif + /* __INTEL_COMPILER = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__INTEL_COMPILER/100) +# define COMPILER_VERSION_MINOR DEC(__INTEL_COMPILER/10 % 10) +# if defined(__INTEL_COMPILER_UPDATE) +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER_UPDATE) +# else +# define COMPILER_VERSION_PATCH DEC(__INTEL_COMPILER % 10) +# endif +# if defined(__INTEL_COMPILER_BUILD_DATE) + /* __INTEL_COMPILER_BUILD_DATE = YYYYMMDD */ +# define COMPILER_VERSION_TWEAK DEC(__INTEL_COMPILER_BUILD_DATE) +# endif +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__PATHCC__) +# define COMPILER_ID "PathScale" +# define COMPILER_VERSION_MAJOR DEC(__PATHCC__) +# define COMPILER_VERSION_MINOR DEC(__PATHCC_MINOR__) +# if defined(__PATHCC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PATHCC_PATCHLEVEL__) +# endif + +#elif defined(__BORLANDC__) && defined(__CODEGEARC_VERSION__) +# define COMPILER_ID "Embarcadero" +# define COMPILER_VERSION_MAJOR HEX(__CODEGEARC_VERSION__>>24 & 0x00FF) +# define COMPILER_VERSION_MINOR HEX(__CODEGEARC_VERSION__>>16 & 0x00FF) +# define COMPILER_VERSION_PATCH DEC(__CODEGEARC_VERSION__ & 0xFFFF) + +#elif defined(__BORLANDC__) +# define COMPILER_ID "Borland" + /* __BORLANDC__ = 0xVRR */ +# define COMPILER_VERSION_MAJOR HEX(__BORLANDC__>>8) +# define COMPILER_VERSION_MINOR HEX(__BORLANDC__ & 0xFF) + +#elif defined(__WATCOMC__) && __WATCOMC__ < 1200 +# define COMPILER_ID "Watcom" + /* __WATCOMC__ = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(__WATCOMC__ / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__WATCOMC__) +# define COMPILER_ID "OpenWatcom" + /* __WATCOMC__ = VVRP + 1100 */ +# define COMPILER_VERSION_MAJOR DEC((__WATCOMC__ - 1100) / 100) +# define COMPILER_VERSION_MINOR DEC((__WATCOMC__ / 10) % 10) +# if (__WATCOMC__ % 10) > 0 +# define COMPILER_VERSION_PATCH DEC(__WATCOMC__ % 10) +# endif + +#elif defined(__SUNPRO_CC) +# define COMPILER_ID "SunPro" +# if __SUNPRO_CC >= 0x5100 + /* __SUNPRO_CC = 0xVRRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>12) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# else + /* __SUNPRO_CC = 0xVRP */ +# define COMPILER_VERSION_MAJOR HEX(__SUNPRO_CC>>8) +# define COMPILER_VERSION_MINOR HEX(__SUNPRO_CC>>4 & 0xF) +# define COMPILER_VERSION_PATCH HEX(__SUNPRO_CC & 0xF) +# endif + +#elif defined(__HP_aCC) +# define COMPILER_ID "HP" + /* __HP_aCC = VVRRPP */ +# define COMPILER_VERSION_MAJOR DEC(__HP_aCC/10000) +# define COMPILER_VERSION_MINOR DEC(__HP_aCC/100 % 100) +# define COMPILER_VERSION_PATCH DEC(__HP_aCC % 100) + +#elif defined(__DECCXX) +# define COMPILER_ID "Compaq" + /* __DECCXX_VER = VVRRTPPPP */ +# define COMPILER_VERSION_MAJOR DEC(__DECCXX_VER/10000000) +# define COMPILER_VERSION_MINOR DEC(__DECCXX_VER/100000 % 100) +# define COMPILER_VERSION_PATCH DEC(__DECCXX_VER % 10000) + +#elif defined(__IBMCPP__) && defined(__COMPILER_VER__) +# define COMPILER_ID "zOS" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ >= 800 +# define COMPILER_ID "XL" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__IBMCPP__) && !defined(__COMPILER_VER__) && __IBMCPP__ < 800 +# define COMPILER_ID "VisualAge" + /* __IBMCPP__ = VRP */ +# define COMPILER_VERSION_MAJOR DEC(__IBMCPP__/100) +# define COMPILER_VERSION_MINOR DEC(__IBMCPP__/10 % 10) +# define COMPILER_VERSION_PATCH DEC(__IBMCPP__ % 10) + +#elif defined(__PGI) +# define COMPILER_ID "PGI" +# define COMPILER_VERSION_MAJOR DEC(__PGIC__) +# define COMPILER_VERSION_MINOR DEC(__PGIC_MINOR__) +# if defined(__PGIC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__PGIC_PATCHLEVEL__) +# endif + +#elif defined(_CRAYC) +# define COMPILER_ID "Cray" +# define COMPILER_VERSION_MAJOR DEC(_RELEASE_MAJOR) +# define COMPILER_VERSION_MINOR DEC(_RELEASE_MINOR) + +#elif defined(__TI_COMPILER_VERSION__) +# define COMPILER_ID "TI" + /* __TI_COMPILER_VERSION__ = VVVRRRPPP */ +# define COMPILER_VERSION_MAJOR DEC(__TI_COMPILER_VERSION__/1000000) +# define COMPILER_VERSION_MINOR DEC(__TI_COMPILER_VERSION__/1000 % 1000) +# define COMPILER_VERSION_PATCH DEC(__TI_COMPILER_VERSION__ % 1000) + +#elif defined(__FUJITSU) || defined(__FCC_VERSION) || defined(__fcc_version) +# define COMPILER_ID "Fujitsu" + +#elif defined(__SCO_VERSION__) +# define COMPILER_ID "SCO" + +#elif defined(__clang__) && defined(__apple_build_version__) +# define COMPILER_ID "AppleClang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif +# define COMPILER_VERSION_TWEAK DEC(__apple_build_version__) + +#elif defined(__clang__) +# define COMPILER_ID "Clang" +# if defined(_MSC_VER) +# define SIMULATE_ID "MSVC" +# endif +# define COMPILER_VERSION_MAJOR DEC(__clang_major__) +# define COMPILER_VERSION_MINOR DEC(__clang_minor__) +# define COMPILER_VERSION_PATCH DEC(__clang_patchlevel__) +# if defined(_MSC_VER) + /* _MSC_VER = VVRR */ +# define SIMULATE_VERSION_MAJOR DEC(_MSC_VER / 100) +# define SIMULATE_VERSION_MINOR DEC(_MSC_VER % 100) +# endif + +#elif defined(__GNUC__) +# define COMPILER_ID "GNU" +# define COMPILER_VERSION_MAJOR DEC(__GNUC__) +# if defined(__GNUC_MINOR__) +# define COMPILER_VERSION_MINOR DEC(__GNUC_MINOR__) +# endif +# if defined(__GNUC_PATCHLEVEL__) +# define COMPILER_VERSION_PATCH DEC(__GNUC_PATCHLEVEL__) +# endif + +#elif defined(_MSC_VER) +# define COMPILER_ID "MSVC" + /* _MSC_VER = VVRR */ +# define COMPILER_VERSION_MAJOR DEC(_MSC_VER / 100) +# define COMPILER_VERSION_MINOR DEC(_MSC_VER % 100) +# if defined(_MSC_FULL_VER) +# if _MSC_VER >= 1400 + /* _MSC_FULL_VER = VVRRPPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 100000) +# else + /* _MSC_FULL_VER = VVRRPPPP */ +# define COMPILER_VERSION_PATCH DEC(_MSC_FULL_VER % 10000) +# endif +# endif +# if defined(_MSC_BUILD) +# define COMPILER_VERSION_TWEAK DEC(_MSC_BUILD) +# endif + +#elif defined(__VISUALDSPVERSION__) || defined(__ADSPBLACKFIN__) || defined(__ADSPTS__) || defined(__ADSP21000__) +# define COMPILER_ID "ADSP" +#if defined(__VISUALDSPVERSION__) + /* __VISUALDSPVERSION__ = 0xVVRRPP00 */ +# define COMPILER_VERSION_MAJOR HEX(__VISUALDSPVERSION__>>24) +# define COMPILER_VERSION_MINOR HEX(__VISUALDSPVERSION__>>16 & 0xFF) +# define COMPILER_VERSION_PATCH HEX(__VISUALDSPVERSION__>>8 & 0xFF) +#endif + +#elif defined(__IAR_SYSTEMS_ICC__ ) || defined(__IAR_SYSTEMS_ICC) +# define COMPILER_ID "IAR" + +#elif defined(__ARMCC_VERSION) +# define COMPILER_ID "ARMCC" +#if __ARMCC_VERSION >= 1000000 + /* __ARMCC_VERSION = VRRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/1000000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 100) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#else + /* __ARMCC_VERSION = VRPPPP */ + # define COMPILER_VERSION_MAJOR DEC(__ARMCC_VERSION/100000) + # define COMPILER_VERSION_MINOR DEC(__ARMCC_VERSION/10000 % 10) + # define COMPILER_VERSION_PATCH DEC(__ARMCC_VERSION % 10000) +#endif + + +#elif defined(_SGI_COMPILER_VERSION) || defined(_COMPILER_VERSION) +# define COMPILER_ID "MIPSpro" +# if defined(_SGI_COMPILER_VERSION) + /* _SGI_COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_SGI_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_SGI_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_SGI_COMPILER_VERSION % 10) +# else + /* _COMPILER_VERSION = VRP */ +# define COMPILER_VERSION_MAJOR DEC(_COMPILER_VERSION/100) +# define COMPILER_VERSION_MINOR DEC(_COMPILER_VERSION/10 % 10) +# define COMPILER_VERSION_PATCH DEC(_COMPILER_VERSION % 10) +# endif + + +/* These compilers are either not known or too old to define an + identification macro. Try to identify the platform and guess that + it is the native compiler. */ +#elif defined(__sgi) +# define COMPILER_ID "MIPSpro" + +#elif defined(__hpux) || defined(__hpua) +# define COMPILER_ID "HP" + +#else /* unknown compiler */ +# define COMPILER_ID "" +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_compiler = "INFO" ":" "compiler[" COMPILER_ID "]"; +#ifdef SIMULATE_ID +char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]"; +#endif + +#ifdef __QNXNTO__ +char const* qnxnto = "INFO" ":" "qnxnto[]"; +#endif + +#if defined(__CRAYXE) || defined(__CRAYXC) +char const *info_cray = "INFO" ":" "compiler_wrapper[CrayPrgEnv]"; +#endif + +#define STRINGIFY_HELPER(X) #X +#define STRINGIFY(X) STRINGIFY_HELPER(X) + +/* Identify known platforms by name. */ +#if defined(__linux) || defined(__linux__) || defined(linux) +# define PLATFORM_ID "Linux" + +#elif defined(__CYGWIN__) +# define PLATFORM_ID "Cygwin" + +#elif defined(__MINGW32__) +# define PLATFORM_ID "MinGW" + +#elif defined(__APPLE__) +# define PLATFORM_ID "Darwin" + +#elif defined(_WIN32) || defined(__WIN32__) || defined(WIN32) +# define PLATFORM_ID "Windows" + +#elif defined(__FreeBSD__) || defined(__FreeBSD) +# define PLATFORM_ID "FreeBSD" + +#elif defined(__NetBSD__) || defined(__NetBSD) +# define PLATFORM_ID "NetBSD" + +#elif defined(__OpenBSD__) || defined(__OPENBSD) +# define PLATFORM_ID "OpenBSD" + +#elif defined(__sun) || defined(sun) +# define PLATFORM_ID "SunOS" + +#elif defined(_AIX) || defined(__AIX) || defined(__AIX__) || defined(__aix) || defined(__aix__) +# define PLATFORM_ID "AIX" + +#elif defined(__sgi) || defined(__sgi__) || defined(_SGI) +# define PLATFORM_ID "IRIX" + +#elif defined(__hpux) || defined(__hpux__) +# define PLATFORM_ID "HP-UX" + +#elif defined(__HAIKU__) +# define PLATFORM_ID "Haiku" + +#elif defined(__BeOS) || defined(__BEOS__) || defined(_BEOS) +# define PLATFORM_ID "BeOS" + +#elif defined(__QNX__) || defined(__QNXNTO__) +# define PLATFORM_ID "QNX" + +#elif defined(__tru64) || defined(_tru64) || defined(__TRU64__) +# define PLATFORM_ID "Tru64" + +#elif defined(__riscos) || defined(__riscos__) +# define PLATFORM_ID "RISCos" + +#elif defined(__sinix) || defined(__sinix__) || defined(__SINIX__) +# define PLATFORM_ID "SINIX" + +#elif defined(__UNIX_SV__) +# define PLATFORM_ID "UNIX_SV" + +#elif defined(__bsdos__) +# define PLATFORM_ID "BSDOS" + +#elif defined(_MPRAS) || defined(MPRAS) +# define PLATFORM_ID "MP-RAS" + +#elif defined(__osf) || defined(__osf__) +# define PLATFORM_ID "OSF1" + +#elif defined(_SCO_SV) || defined(SCO_SV) || defined(sco_sv) +# define PLATFORM_ID "SCO_SV" + +#elif defined(__ultrix) || defined(__ultrix__) || defined(_ULTRIX) +# define PLATFORM_ID "ULTRIX" + +#elif defined(__XENIX__) || defined(_XENIX) || defined(XENIX) +# define PLATFORM_ID "Xenix" + +#elif defined(__WATCOMC__) +# if defined(__LINUX__) +# define PLATFORM_ID "Linux" + +# elif defined(__DOS__) +# define PLATFORM_ID "DOS" + +# elif defined(__OS2__) +# define PLATFORM_ID "OS2" + +# elif defined(__WINDOWS__) +# define PLATFORM_ID "Windows3x" + +# else /* unknown platform */ +# define PLATFORM_ID "" +# endif + +#else /* unknown platform */ +# define PLATFORM_ID "" + +#endif + +/* For windows compilers MSVC and Intel we can determine + the architecture of the compiler being used. This is because + the compilers do not have flags that can change the architecture, + but rather depend on which compiler is being used +*/ +#if defined(_WIN32) && defined(_MSC_VER) +# if defined(_M_IA64) +# define ARCHITECTURE_ID "IA64" + +# elif defined(_M_X64) || defined(_M_AMD64) +# define ARCHITECTURE_ID "x64" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# elif defined(_M_ARM) +# if _M_ARM == 4 +# define ARCHITECTURE_ID "ARMV4I" +# elif _M_ARM == 5 +# define ARCHITECTURE_ID "ARMV5I" +# else +# define ARCHITECTURE_ID "ARMV" STRINGIFY(_M_ARM) +# endif + +# elif defined(_M_MIPS) +# define ARCHITECTURE_ID "MIPS" + +# elif defined(_M_SH) +# define ARCHITECTURE_ID "SHx" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#elif defined(__WATCOMC__) +# if defined(_M_I86) +# define ARCHITECTURE_ID "I86" + +# elif defined(_M_IX86) +# define ARCHITECTURE_ID "X86" + +# else /* unknown architecture */ +# define ARCHITECTURE_ID "" +# endif + +#else +# define ARCHITECTURE_ID "" +#endif + +/* Convert integer to decimal digit literals. */ +#define DEC(n) \ + ('0' + (((n) / 10000000)%10)), \ + ('0' + (((n) / 1000000)%10)), \ + ('0' + (((n) / 100000)%10)), \ + ('0' + (((n) / 10000)%10)), \ + ('0' + (((n) / 1000)%10)), \ + ('0' + (((n) / 100)%10)), \ + ('0' + (((n) / 10)%10)), \ + ('0' + ((n) % 10)) + +/* Convert integer to hex digit literals. */ +#define HEX(n) \ + ('0' + ((n)>>28 & 0xF)), \ + ('0' + ((n)>>24 & 0xF)), \ + ('0' + ((n)>>20 & 0xF)), \ + ('0' + ((n)>>16 & 0xF)), \ + ('0' + ((n)>>12 & 0xF)), \ + ('0' + ((n)>>8 & 0xF)), \ + ('0' + ((n)>>4 & 0xF)), \ + ('0' + ((n) & 0xF)) + +/* Construct a string literal encoding the version number components. */ +#ifdef COMPILER_VERSION_MAJOR +char const info_version[] = { + 'I', 'N', 'F', 'O', ':', + 'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[', + COMPILER_VERSION_MAJOR, +# ifdef COMPILER_VERSION_MINOR + '.', COMPILER_VERSION_MINOR, +# ifdef COMPILER_VERSION_PATCH + '.', COMPILER_VERSION_PATCH, +# ifdef COMPILER_VERSION_TWEAK + '.', COMPILER_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct a string literal encoding the version number components. */ +#ifdef SIMULATE_VERSION_MAJOR +char const info_simulate_version[] = { + 'I', 'N', 'F', 'O', ':', + 's','i','m','u','l','a','t','e','_','v','e','r','s','i','o','n','[', + SIMULATE_VERSION_MAJOR, +# ifdef SIMULATE_VERSION_MINOR + '.', SIMULATE_VERSION_MINOR, +# ifdef SIMULATE_VERSION_PATCH + '.', SIMULATE_VERSION_PATCH, +# ifdef SIMULATE_VERSION_TWEAK + '.', SIMULATE_VERSION_TWEAK, +# endif +# endif +# endif + ']','\0'}; +#endif + +/* Construct the string literal in pieces to prevent the source from + getting matched. Store it in a pointer rather than an array + because some compilers will just produce instructions to fill the + array rather than assigning a pointer to a static array. */ +char const* info_platform = "INFO" ":" "platform[" PLATFORM_ID "]"; +char const* info_arch = "INFO" ":" "arch[" ARCHITECTURE_ID "]"; + + + + +const char* info_language_dialect_default = "INFO" ":" "dialect_default[" +#if __cplusplus >= 201402L + "14" +#elif __cplusplus >= 201103L + "11" +#else + "98" +#endif +"]"; + +/*--------------------------------------------------------------------------*/ + +int main(int argc, char* argv[]) +{ + int require = 0; + require += info_compiler[argc]; + require += info_platform[argc]; +#ifdef COMPILER_VERSION_MAJOR + require += info_version[argc]; +#endif +#ifdef SIMULATE_ID + require += info_simulate[argc]; +#endif +#ifdef SIMULATE_VERSION_MAJOR + require += info_simulate_version[argc]; +#endif +#if defined(__CRAYXE) || defined(__CRAYXC) + require += info_cray[argc]; +#endif + require += info_language_dialect_default[argc]; + (void)argv; + return require; +} diff --git a/3rdparty/easyprofiler/CMakeFiles/3.5.1/CompilerIdCXX/a.out b/3rdparty/easyprofiler/CMakeFiles/3.5.1/CompilerIdCXX/a.out new file mode 100755 index 0000000000000000000000000000000000000000..b6775083d86807553cd9859db738d65110e201c8 GIT binary patch literal 8808 zcmeHMeQaCR6~DIgRoXgEA#2*Q^$A)ju;t-|B)Fip&-vmOOqO;R*&f#xn^2Nb}pb*aQU2;z~|Ithv~hR7$R7WM~D>T6`Dp}i~g?G zVwnn|NCDz-tRA;yfsV=!Q;o)<6J;E-h-)TXGvSyn)4-VW{BUk~g~(sXsR4()hD7wp zdx4@Yw!tfA6#Fk=P)W5C+AcXEm@@8bfFlT5{Ac1J^$^9oQ(msq{Fo9e9!kW=I@=#g zL|YQ^WOlY?*4Nq6*{)_%YMY!l`bXRS1H&>B=TQL;$9xZ5xCT)F=W`GLGPC>1m-Z^J zzSVN|%DFGC7?} zlEe`EgMqGYqfKp7JHV6mU>z_@94F^9yFI=Ebzh-aYxSeDhtGzVg5;Y#mK>KW;<@Q_ z*Xs0>)!|Kw(4Sv2t5?4a8h!3!-37}c*D(aD-0l$E>vw9{UF z=yPjseg4YP9cR%S4yPe}4i&i-Fn&&k2w%WaOsLGiiTYvvdw-V>&fj){1AYFwetvbI z?zp7CecNozd)vs~>UWCp1uOouUwvbvB1E=f7=Wuu7+CmH^)Eo=_*6zZr?_!o`$V?- zqaOk;@9Yx<>#v?=Agg zV{0Y3G^{`KtWu*DEVov+yd?*3<-`Ak|8f6(&OhuA1yAk%b)5pqIMssmP+HDFz)0Btq(AIG z;x{fV6!QHktPAO{utel@;hUpm)v>fd0|R{rA01Ck&%_h4^a#9-;erl(C3@p%ES-s` zk|SQLb*R*7=Z-gQA!ZU0b0U?V9tq;tfrOFt_|ypXqwz>0Hf|cx*hD0oFh}mXSv+BfQEnufgXTV{S4?upcjF*!&BY_FAjc3usMzo3CFC*v13zh-GZam zgL3)X0r&@{g>|cJ5An$Ur?+xB1x?+aK6lfB`i16+am7JoO;<$7DszB2-`|*+vFYVtx?(AK|I$-TuwHTUj9~t4eS4TJC{PpX{Uyy zQ1ekd+)raW>(r2lyW}0}NupQ>U~967Xe7!6YY*9AyNZo}W7(ef3AjJUw$&nHmg2K~ zlz1LDL9~O0M-gt(~g3UG03pk}GZA)=qDycaJ@E8SjGC=W}WmKO4koML&1t*HfweM#1k@ zseF@ItmtR6Sgt5{=g)CU{nQJ7PfO(4l5Z7UR~KVk__ovgTq@rtl#2500?Sl;a|!-h6*La$R*6q? z1&P(e@1O&|F81-`_s=QZ!ejf6qGyy3+T<$9?cd!V>Ax^e90#^Ta5*aE^Ek-S|Dw(R z329&cTz(GnO7r@IwD$7w-y+K2yJw`l)HiYqZ^#JwyMnzKK_0P=XR>mB!U%-=;RuK`7wYfE zyoDlTiI^~A(TEvgNa0jg(~8ewA;Vy09npeq$$2g4GAUy!l8mCez(KHz#*;=i6N?I& z20o?YAUH0ZoTcScG0=`>G896d3rlb!lAO#&CgG8k9%TvRz)@p})(%44T;+E zJs`gcH3G*!?bM{@X%g`GtEIG1M-eLqpo29LJRI)t| zcdVHhFI<|GOCj`p7MH)<^LGR^So1KR_s>2m#A*o1<7YdjPlFz7DCRYauMu7$Jo+gf zKZynIi!i5*A0_-K;d!1M-#-862;W5xxelDIfJa|;{EHyNaq&DCDEa;)4( zIuBPdev$Btw)r!L|Bqt&BO891@XLhf@iN}dzih*=5PpU5@8jT#8pmbPtI$Ccoq!=idQreG#7Ps3vp@&2De!{|YuZe~!=fit;(}R{@Jt zWjxnq{J;1zI)}#3m*ev~I1Reu_*}oO;iRCky~P!Hmj443#rS-kM*$QD5@j6IH5;Dy z)e7OgcfhmwHgwPz&!6{~gM{ZeY)|Q6R=7ZbGJ71x+t(lCnKl%~&O3$9Pw1cx{|hT_ qHde;wwO?%aeH#C3^x(b(N*p84hrf&Xe)8Ol@m@L@o3uH%$Nx7ndvpo_ literal 0 HcmV?d00001 diff --git a/3rdparty/easyprofiler/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/easyprofiler/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..9ecfcf5 --- /dev/null +++ b/3rdparty/easyprofiler/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/alex/Work/C++Projects/easyprofiler") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/alex/Work/C++Projects/easyprofiler") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/easyprofiler/CMakeFiles/CMakeOutput.log b/3rdparty/easyprofiler/CMakeFiles/CMakeOutput.log new file mode 100644 index 0000000..d37f64b --- /dev/null +++ b/3rdparty/easyprofiler/CMakeFiles/CMakeOutput.log @@ -0,0 +1,356 @@ +The system is: Linux - 4.4.0-93-generic - x86_64 +Compiling the CXX compiler identification source file "CMakeCXXCompilerId.cpp" succeeded. +Compiler: /usr/bin/c++ +Build flags: +Id flags: + +The output was: +0 + + +Compilation of the CXX compiler identification source "CMakeCXXCompilerId.cpp" produced "a.out" + +The CXX compiler identification is GNU, found in "/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/3.5.1/CompilerIdCXX/a.out" + +Determining if the CXX compiler works passed with the following output: +Change Dir: /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_56b63/fast" +/usr/bin/make -f CMakeFiles/cmTC_56b63.dir/build.make CMakeFiles/cmTC_56b63.dir/build +make[1]: Entering directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_56b63.dir/testCXXCompiler.cxx.o +/usr/bin/c++ -o CMakeFiles/cmTC_56b63.dir/testCXXCompiler.cxx.o -c /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp/testCXXCompiler.cxx +Linking CXX executable cmTC_56b63 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_56b63.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_56b63.dir/testCXXCompiler.cxx.o -o cmTC_56b63 -rdynamic +make[1]: Leaving directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' + + +Detecting CXX compiler ABI info compiled with the following output: +Change Dir: /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_aa90b/fast" +/usr/bin/make -f CMakeFiles/cmTC_aa90b.dir/build.make CMakeFiles/cmTC_aa90b.dir/build +make[1]: Entering directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_aa90b.dir/CMakeCXXCompilerABI.cpp.o +/usr/bin/c++ -o CMakeFiles/cmTC_aa90b.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp +Linking CXX executable cmTC_aa90b +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_aa90b.dir/link.txt --verbose=1 +/usr/bin/c++ -v CMakeFiles/cmTC_aa90b.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_aa90b -rdynamic +Using built-in specs. +COLLECT_GCC=/usr/bin/c++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.6' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.6) +COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/ +LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/ +COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_aa90b' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64' + /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccL6oSX7.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_aa90b /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_aa90b.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o +make[1]: Leaving directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' + + +Parsed CXX implicit link information from above output: + link line regex: [^( *|.*[/\])(ld|([^/\]+-)?ld|collect2)[^/\]*( |$)] + ignore line: [Change Dir: /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp] + ignore line: [] + ignore line: [Run Build Command:"/usr/bin/make" "cmTC_aa90b/fast"] + ignore line: [/usr/bin/make -f CMakeFiles/cmTC_aa90b.dir/build.make CMakeFiles/cmTC_aa90b.dir/build] + ignore line: [make[1]: Entering directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp'] + ignore line: [Building CXX object CMakeFiles/cmTC_aa90b.dir/CMakeCXXCompilerABI.cpp.o] + ignore line: [/usr/bin/c++ -o CMakeFiles/cmTC_aa90b.dir/CMakeCXXCompilerABI.cpp.o -c /usr/share/cmake-3.5/Modules/CMakeCXXCompilerABI.cpp] + ignore line: [Linking CXX executable cmTC_aa90b] + ignore line: [/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_aa90b.dir/link.txt --verbose=1] + ignore line: [/usr/bin/c++ -v CMakeFiles/cmTC_aa90b.dir/CMakeCXXCompilerABI.cpp.o -o cmTC_aa90b -rdynamic ] + ignore line: [Using built-in specs.] + ignore line: [COLLECT_GCC=/usr/bin/c++] + ignore line: [COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] + ignore line: [Target: x86_64-linux-gnu] + ignore line: [Configured with: ../src/configure -v --with-pkgversion='Ubuntu 5.4.0-6ubuntu1~16.04.6' --with-bugurl=file:///usr/share/doc/gcc-5/README.Bugs --enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-5 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-5-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-5-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-5-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu] + ignore line: [Thread model: posix] + ignore line: [gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.6) ] + ignore line: [COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/] + ignore line: [LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/5/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/5/../../../:/lib/:/usr/lib/] + ignore line: [COLLECT_GCC_OPTIONS='-v' '-o' 'cmTC_aa90b' '-rdynamic' '-shared-libgcc' '-mtune=generic' '-march=x86-64'] + link line: [ /usr/lib/gcc/x86_64-linux-gnu/5/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper -plugin-opt=-fresolution=/tmp/ccL6oSX7.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o cmTC_aa90b /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/5 -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/5/../../.. CMakeFiles/cmTC_aa90b.dir/CMakeCXXCompilerABI.cpp.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/5/crtend.o /usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] + arg [/usr/lib/gcc/x86_64-linux-gnu/5/collect2] ==> ignore + arg [-plugin] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/liblto_plugin.so] ==> ignore + arg [-plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/5/lto-wrapper] ==> ignore + arg [-plugin-opt=-fresolution=/tmp/ccL6oSX7.res] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [-plugin-opt=-pass-through=-lc] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc_s] ==> ignore + arg [-plugin-opt=-pass-through=-lgcc] ==> ignore + arg [--sysroot=/] ==> ignore + arg [--build-id] ==> ignore + arg [--eh-frame-hdr] ==> ignore + arg [-m] ==> ignore + arg [elf_x86_64] ==> ignore + arg [--hash-style=gnu] ==> ignore + arg [--as-needed] ==> ignore + arg [-export-dynamic] ==> ignore + arg [-dynamic-linker] ==> ignore + arg [/lib64/ld-linux-x86-64.so.2] ==> ignore + arg [-zrelro] ==> ignore + arg [-o] ==> ignore + arg [cmTC_aa90b] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crti.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtbegin.o] ==> ignore + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] + arg [-L/lib/x86_64-linux-gnu] ==> dir [/lib/x86_64-linux-gnu] + arg [-L/lib/../lib] ==> dir [/lib/../lib] + arg [-L/usr/lib/x86_64-linux-gnu] ==> dir [/usr/lib/x86_64-linux-gnu] + arg [-L/usr/lib/../lib] ==> dir [/usr/lib/../lib] + arg [-L/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] + arg [CMakeFiles/cmTC_aa90b.dir/CMakeCXXCompilerABI.cpp.o] ==> ignore + arg [-lstdc++] ==> lib [stdc++] + arg [-lm] ==> lib [m] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [-lc] ==> lib [c] + arg [-lgcc_s] ==> lib [gcc_s] + arg [-lgcc] ==> lib [gcc] + arg [/usr/lib/gcc/x86_64-linux-gnu/5/crtend.o] ==> ignore + arg [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crtn.o] ==> ignore + remove lib [gcc_s] + remove lib [gcc] + remove lib [gcc_s] + remove lib [gcc] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5] ==> [/usr/lib/gcc/x86_64-linux-gnu/5] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../../../lib] ==> [/usr/lib] + collapse library dir [/lib/x86_64-linux-gnu] ==> [/lib/x86_64-linux-gnu] + collapse library dir [/lib/../lib] ==> [/lib] + collapse library dir [/usr/lib/x86_64-linux-gnu] ==> [/usr/lib/x86_64-linux-gnu] + collapse library dir [/usr/lib/../lib] ==> [/usr/lib] + collapse library dir [/usr/lib/gcc/x86_64-linux-gnu/5/../../..] ==> [/usr/lib] + implicit libs: [stdc++;m;c] + implicit dirs: [/usr/lib/gcc/x86_64-linux-gnu/5;/usr/lib/x86_64-linux-gnu;/usr/lib;/lib/x86_64-linux-gnu;/lib] + implicit fwks: [] + + + + +Detecting CXX [-std=c++14] compiler features compiled with the following output: +Change Dir: /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_46192/fast" +/usr/bin/make -f CMakeFiles/cmTC_46192.dir/build.make CMakeFiles/cmTC_46192.dir/build +make[1]: Entering directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_46192.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++14 -o CMakeFiles/cmTC_46192.dir/feature_tests.cxx.o -c /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_46192 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_46192.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_46192.dir/feature_tests.cxx.o -o cmTC_46192 -rdynamic +make[1]: Leaving directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:1cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:1cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:1cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:1cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:1cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:1cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:1cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:1cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:1cxx_relaxed_constexpr + Feature record: CXX_FEATURE:1cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:1cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++11] compiler features compiled with the following output: +Change Dir: /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_270c0/fast" +/usr/bin/make -f CMakeFiles/cmTC_270c0.dir/build.make CMakeFiles/cmTC_270c0.dir/build +make[1]: Entering directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_270c0.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++11 -o CMakeFiles/cmTC_270c0.dir/feature_tests.cxx.o -c /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_270c0 +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_270c0.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_270c0.dir/feature_tests.cxx.o -o cmTC_270c0 -rdynamic +make[1]: Leaving directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:1cxx_alias_templates + Feature record: CXX_FEATURE:1cxx_alignas + Feature record: CXX_FEATURE:1cxx_alignof + Feature record: CXX_FEATURE:1cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:1cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:1cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:1cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:1cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:1cxx_default_function_template_args + Feature record: CXX_FEATURE:1cxx_defaulted_functions + Feature record: CXX_FEATURE:1cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:1cxx_delegating_constructors + Feature record: CXX_FEATURE:1cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:1cxx_enum_forward_declarations + Feature record: CXX_FEATURE:1cxx_explicit_conversions + Feature record: CXX_FEATURE:1cxx_extended_friend_declarations + Feature record: CXX_FEATURE:1cxx_extern_templates + Feature record: CXX_FEATURE:1cxx_final + Feature record: CXX_FEATURE:1cxx_func_identifier + Feature record: CXX_FEATURE:1cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:1cxx_inheriting_constructors + Feature record: CXX_FEATURE:1cxx_inline_namespaces + Feature record: CXX_FEATURE:1cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:1cxx_local_type_template_args + Feature record: CXX_FEATURE:1cxx_long_long_type + Feature record: CXX_FEATURE:1cxx_noexcept + Feature record: CXX_FEATURE:1cxx_nonstatic_member_init + Feature record: CXX_FEATURE:1cxx_nullptr + Feature record: CXX_FEATURE:1cxx_override + Feature record: CXX_FEATURE:1cxx_range_for + Feature record: CXX_FEATURE:1cxx_raw_string_literals + Feature record: CXX_FEATURE:1cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:1cxx_right_angle_brackets + Feature record: CXX_FEATURE:1cxx_rvalue_references + Feature record: CXX_FEATURE:1cxx_sizeof_member + Feature record: CXX_FEATURE:1cxx_static_assert + Feature record: CXX_FEATURE:1cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:1cxx_thread_local + Feature record: CXX_FEATURE:1cxx_trailing_return_types + Feature record: CXX_FEATURE:1cxx_unicode_literals + Feature record: CXX_FEATURE:1cxx_uniform_initialization + Feature record: CXX_FEATURE:1cxx_unrestricted_unions + Feature record: CXX_FEATURE:1cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:1cxx_variadic_macros + Feature record: CXX_FEATURE:1cxx_variadic_templates + + +Detecting CXX [-std=c++98] compiler features compiled with the following output: +Change Dir: /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp + +Run Build Command:"/usr/bin/make" "cmTC_aba3e/fast" +/usr/bin/make -f CMakeFiles/cmTC_aba3e.dir/build.make CMakeFiles/cmTC_aba3e.dir/build +make[1]: Entering directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' +Building CXX object CMakeFiles/cmTC_aba3e.dir/feature_tests.cxx.o +/usr/bin/c++ -std=c++98 -o CMakeFiles/cmTC_aba3e.dir/feature_tests.cxx.o -c /home/alex/Work/C++Projects/easyprofiler/CMakeFiles/feature_tests.cxx +Linking CXX executable cmTC_aba3e +/usr/bin/cmake -E cmake_link_script CMakeFiles/cmTC_aba3e.dir/link.txt --verbose=1 +/usr/bin/c++ CMakeFiles/cmTC_aba3e.dir/feature_tests.cxx.o -o cmTC_aba3e -rdynamic +make[1]: Leaving directory '/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/CMakeTmp' + + + Feature record: CXX_FEATURE:0cxx_aggregate_default_initializers + Feature record: CXX_FEATURE:0cxx_alias_templates + Feature record: CXX_FEATURE:0cxx_alignas + Feature record: CXX_FEATURE:0cxx_alignof + Feature record: CXX_FEATURE:0cxx_attributes + Feature record: CXX_FEATURE:0cxx_attribute_deprecated + Feature record: CXX_FEATURE:0cxx_auto_type + Feature record: CXX_FEATURE:0cxx_binary_literals + Feature record: CXX_FEATURE:0cxx_constexpr + Feature record: CXX_FEATURE:0cxx_contextual_conversions + Feature record: CXX_FEATURE:0cxx_decltype + Feature record: CXX_FEATURE:0cxx_decltype_auto + Feature record: CXX_FEATURE:0cxx_decltype_incomplete_return_types + Feature record: CXX_FEATURE:0cxx_default_function_template_args + Feature record: CXX_FEATURE:0cxx_defaulted_functions + Feature record: CXX_FEATURE:0cxx_defaulted_move_initializers + Feature record: CXX_FEATURE:0cxx_delegating_constructors + Feature record: CXX_FEATURE:0cxx_deleted_functions + Feature record: CXX_FEATURE:0cxx_digit_separators + Feature record: CXX_FEATURE:0cxx_enum_forward_declarations + Feature record: CXX_FEATURE:0cxx_explicit_conversions + Feature record: CXX_FEATURE:0cxx_extended_friend_declarations + Feature record: CXX_FEATURE:0cxx_extern_templates + Feature record: CXX_FEATURE:0cxx_final + Feature record: CXX_FEATURE:0cxx_func_identifier + Feature record: CXX_FEATURE:0cxx_generalized_initializers + Feature record: CXX_FEATURE:0cxx_generic_lambdas + Feature record: CXX_FEATURE:0cxx_inheriting_constructors + Feature record: CXX_FEATURE:0cxx_inline_namespaces + Feature record: CXX_FEATURE:0cxx_lambdas + Feature record: CXX_FEATURE:0cxx_lambda_init_captures + Feature record: CXX_FEATURE:0cxx_local_type_template_args + Feature record: CXX_FEATURE:0cxx_long_long_type + Feature record: CXX_FEATURE:0cxx_noexcept + Feature record: CXX_FEATURE:0cxx_nonstatic_member_init + Feature record: CXX_FEATURE:0cxx_nullptr + Feature record: CXX_FEATURE:0cxx_override + Feature record: CXX_FEATURE:0cxx_range_for + Feature record: CXX_FEATURE:0cxx_raw_string_literals + Feature record: CXX_FEATURE:0cxx_reference_qualified_functions + Feature record: CXX_FEATURE:0cxx_relaxed_constexpr + Feature record: CXX_FEATURE:0cxx_return_type_deduction + Feature record: CXX_FEATURE:0cxx_right_angle_brackets + Feature record: CXX_FEATURE:0cxx_rvalue_references + Feature record: CXX_FEATURE:0cxx_sizeof_member + Feature record: CXX_FEATURE:0cxx_static_assert + Feature record: CXX_FEATURE:0cxx_strong_enums + Feature record: CXX_FEATURE:1cxx_template_template_parameters + Feature record: CXX_FEATURE:0cxx_thread_local + Feature record: CXX_FEATURE:0cxx_trailing_return_types + Feature record: CXX_FEATURE:0cxx_unicode_literals + Feature record: CXX_FEATURE:0cxx_uniform_initialization + Feature record: CXX_FEATURE:0cxx_unrestricted_unions + Feature record: CXX_FEATURE:0cxx_user_literals + Feature record: CXX_FEATURE:0cxx_variable_templates + Feature record: CXX_FEATURE:0cxx_variadic_macros + Feature record: CXX_FEATURE:0cxx_variadic_templates diff --git a/3rdparty/easyprofiler/CMakeFiles/CMakeRuleHashes.txt b/3rdparty/easyprofiler/CMakeFiles/CMakeRuleHashes.txt new file mode 100644 index 0000000..5275219 --- /dev/null +++ b/3rdparty/easyprofiler/CMakeFiles/CMakeRuleHashes.txt @@ -0,0 +1,2 @@ +# Hashes of file build rules. +74e55f76d310972c5aad534ac6b85d71 profiler_gui/CMakeFiles/profiler_gui_automoc diff --git a/3rdparty/easyprofiler/CMakeFiles/TargetDirectories.txt b/3rdparty/easyprofiler/CMakeFiles/TargetDirectories.txt new file mode 100644 index 0000000..afc5f57 --- /dev/null +++ b/3rdparty/easyprofiler/CMakeFiles/TargetDirectories.txt @@ -0,0 +1,36 @@ +/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/install.dir +/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/list_install_components.dir +/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/install/strip.dir +/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/install/local.dir +/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/rebuild_cache.dir +/home/alex/Work/C++Projects/easyprofiler/CMakeFiles/edit_cache.dir +/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/install.dir +/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/list_install_components.dir +/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/rebuild_cache.dir +/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir +/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/install/strip.dir +/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/install/local.dir +/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/edit_cache.dir +/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/install.dir +/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/list_install_components.dir +/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/rebuild_cache.dir +/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir +/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/install/strip.dir +/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/install/local.dir +/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/edit_cache.dir +/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir +/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/install.dir +/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/list_install_components.dir +/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/rebuild_cache.dir +/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/edit_cache.dir +/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir +/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/profiler_sample.dir +/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/install/strip.dir +/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/install/local.dir +/home/alex/Work/C++Projects/easyprofiler/reader/CMakeFiles/install.dir +/home/alex/Work/C++Projects/easyprofiler/reader/CMakeFiles/list_install_components.dir +/home/alex/Work/C++Projects/easyprofiler/reader/CMakeFiles/rebuild_cache.dir +/home/alex/Work/C++Projects/easyprofiler/reader/CMakeFiles/profiler_reader.dir +/home/alex/Work/C++Projects/easyprofiler/reader/CMakeFiles/install/local.dir +/home/alex/Work/C++Projects/easyprofiler/reader/CMakeFiles/install/strip.dir +/home/alex/Work/C++Projects/easyprofiler/reader/CMakeFiles/edit_cache.dir diff --git a/3rdparty/easyprofiler/CMakeFiles/cmake.check_cache b/3rdparty/easyprofiler/CMakeFiles/cmake.check_cache new file mode 100644 index 0000000..3dccd73 --- /dev/null +++ b/3rdparty/easyprofiler/CMakeFiles/cmake.check_cache @@ -0,0 +1 @@ +# This file is generated by cmake for dependency checking of the CMakeCache.txt file diff --git a/3rdparty/easyprofiler/CMakeFiles/feature_tests.bin b/3rdparty/easyprofiler/CMakeFiles/feature_tests.bin new file mode 100755 index 0000000000000000000000000000000000000000..9fe5cc8969376b49b19e03a00f2f5b48ae2b1220 GIT binary patch literal 12696 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 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_aggregate_default_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alias_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_alignof\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_attributes\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_attribute_deprecated\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_auto_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_binary_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_contextual_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_decltype\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_decltype_auto\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_decltype_incomplete_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_default_function_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_defaulted_move_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_delegating_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_deleted_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_digit_separators\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_enum_forward_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_explicit_conversions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_extended_friend_declarations\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_extern_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_final\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_func_identifier\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_generalized_initializers\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_generic_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_inheriting_constructors\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_inline_namespaces\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_lambdas\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_lambda_init_captures\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_local_type_template_args\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_long_long_type\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_noexcept\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_nonstatic_member_init\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_nullptr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_override\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_range_for\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 405 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_raw_string_literals\n" +"CXX_FEATURE:" +#if ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40801) && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_reference_qualified_functions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_relaxed_constexpr\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 409 && __cplusplus > 201103L +"1" +#else +"0" +#endif +"cxx_return_type_deduction\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_right_angle_brackets\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_rvalue_references\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_sizeof_member\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_static_assert\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_strong_enums\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && __cplusplus +"1" +#else +"0" +#endif +"cxx_template_template_parameters\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_thread_local\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_trailing_return_types\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unicode_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_uniform_initialization\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 406 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_unrestricted_unions\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 407 && __cplusplus >= 201103L +"1" +#else +"0" +#endif +"cxx_user_literals\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 500 && __cplusplus >= 201402L +"1" +#else +"0" +#endif +"cxx_variable_templates\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_macros\n" +"CXX_FEATURE:" +#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 404 && (__cplusplus >= 201103L || (defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__)) +"1" +#else +"0" +#endif +"cxx_variadic_templates\n" + +}; + +int main(int argc, char** argv) { (void)argv; return features[argc]; } diff --git a/3rdparty/easyprofiler/CMakeFiles/progress.marks b/3rdparty/easyprofiler/CMakeFiles/progress.marks new file mode 100644 index 0000000..8f92bfd --- /dev/null +++ b/3rdparty/easyprofiler/CMakeFiles/progress.marks @@ -0,0 +1 @@ +35 diff --git a/3rdparty/easyprofiler/CMakeLists.txt b/3rdparty/easyprofiler/CMakeLists.txt new file mode 100644 index 0000000..4fe44a4 --- /dev/null +++ b/3rdparty/easyprofiler/CMakeLists.txt @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 3.0) +project(easy_profiler CXX) + +set_property(GLOBAL PROPERTY USE_FOLDERS ON) + +set(EASY_PROGRAM_VERSION_MAJOR 1) +set(EASY_PROGRAM_VERSION_MINOR 3) +set(EASY_PROGRAM_VERSION_PATCH 0) +set(EASY_PRODUCT_VERSION_STRING "${EASY_PROGRAM_VERSION_MAJOR}.${EASY_PROGRAM_VERSION_MINOR}.${EASY_PROGRAM_VERSION_PATCH}") + +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) + +# set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_LIST_DIR}/sdk) + +macro(easy_define_target_option TARGET SOURCE_OPTION TARGET_DEFINITION) + if (${SOURCE_OPTION}) + set(_VALUE 1) + else () + set(_VALUE 0) + endif () + target_compile_options(${TARGET} PUBLIC -D${TARGET_DEFINITION}=${_VALUE}) +endmacro() + +SET(CMAKE_INSTALL_RPATH "$ORIGIN") + +add_subdirectory(easy_profiler_core) +add_subdirectory(profiler_gui) + +if (NOT EASY_PROFILER_NO_SAMPLES) + add_subdirectory(sample) + add_subdirectory(reader) +endif () diff --git a/3rdparty/easyprofiler/LICENSE.APACHE b/3rdparty/easyprofiler/LICENSE.APACHE new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/3rdparty/easyprofiler/LICENSE.APACHE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/3rdparty/easyprofiler/LICENSE.MIT b/3rdparty/easyprofiler/LICENSE.MIT new file mode 100644 index 0000000..3840145 --- /dev/null +++ b/3rdparty/easyprofiler/LICENSE.MIT @@ -0,0 +1,18 @@ +Copyright (c) 2017 Sergey Yagovtsev, Victor Zarubkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/3rdparty/easyprofiler/README.md b/3rdparty/easyprofiler/README.md new file mode 100644 index 0000000..634e463 --- /dev/null +++ b/3rdparty/easyprofiler/README.md @@ -0,0 +1,224 @@ +# easy_profiler [![1.3.0](https://img.shields.io/badge/version-1.3.0-009688.svg)](https://github.com/yse/easy_profiler/releases) + +[![Build Status](https://travis-ci.org/yse/easy_profiler.svg?branch=develop)](https://travis-ci.org/yse/easy_profiler) +[![Build Status](https://ci.appveyor.com/api/projects/status/github/yse/easy_profiler?branch=develop&svg=true)](https://ci.appveyor.com/project/yse/easy-profiler/branch/develop) + +[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT) +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0) + + +1. [About](#about) +2. [Key features](#key-features) +3. [Usage](#usage) + - [Prepare build system](#prepare-build-system) + - [General build system](#general) + - [CMake](#build-with-cmake) + - [Add profiling blocks](#add-profiling-blocks) + - [Collect blocks](#collect-blocks) + - [Collect via network](#collect-via-network) + - [Collect via file](#collect-via-file) + - [Note about context-switch](#note-about-context-switch) +4. [Build](#build) + - [Linux](#linux) + - [Windows](#windows) +5. [License](#license) + +# About +Lightweight cross-platform profiler library for c++ + +You can profile any function in you code. Furthermore this library provide measuring time of any block of code. +For example, information for 12 millions of blocks is using less than 300Mb of memory. +Working profiler slows your application execution for only 1-2%. + +![Block time](https://hsto.org/files/3e4/afe/8b7/3e4afe8b77ac4ad3a6f8c805be4b7f13.png) +_Average overhead per block is about 15ns/block (tested on Intel Core i7-5930K 3.5GHz, Win7)_ + +Disabled profiler will not affect your application execution in any way. You can leave it in your Release build +and enable it at run-time at any moment during application launch to see what is happening at the moment. + +Also the library can capture system's context switch events between threads. Context switch information includes +duration, target thread id, thread owner process id, thread owner process name. + +You can see the results of measuring in simple GUI application which provides full statistics and renders beautiful time-line. + +![GUI screenshot](https://cloud.githubusercontent.com/assets/1775230/24852044/a0b1edd0-1dde-11e7-8736-7052b840ad06.png) +_Profiling CryEngine SDK example_ + +# Key features + +- Extremely low overhead +- Low additional memory usage +- Cross-platform +- Measuring over network +- Capture thread context-switch events +- Fully remove integration via defines +- GUI could be connected to an application which is already profiling (so you can profile initialization of your application) +- Monitor main thread fps at real-time in GUI even if profiling is disabled or draw your own HUD/fps-plot directly in your application using data provided by profiler +- Configurable timer type with CMakeLists or defines + +# Usage + +## Prepare build system + +### General + +First of all you can specify path to include directory which contains `include/profiler` directory and define macro `BUILD_WITH_EASY_PROFILER`. +For linking with easy_profiler you can specify path to library. + +### Build with cmake + +If you are using `cmake` set `CMAKE_PREFIX_PATH` to `lib/cmake/easy_profiler` directory (from [release](https://github.com/yse/easy_profiler/releases) package) and use function `find_package(easy_profiler)` with `target_link_libraries(... easy_profiler)`. Example: + +``` cmake +project(app_for_profiling) + +set(SOURCES + main.cpp +) + +#CMAKE_PREFIX_PATH should be set to /lib/cmake/easy_profiler +find_package(easy_profiler REQUIRED) + +add_executable(app_for_profiling ${SOURCES}) + +target_link_libraries(app_for_profiling easy_profiler) +``` + +## Add profiling blocks + +Example of usage. + +This code snippet will generate block with function name and Magenta color: +```cpp +#include + +void frame() { + EASY_FUNCTION(profiler::colors::Magenta); // Magenta block with name "frame" + prepareRender(); + calculatePhysics(); +} +``` + +To profile any block you may do this as following. +You can specify these blocks also with Google material design colors or just set name of the block +(in this case it will have default color which is `Amber100`): +```cpp +#include + +void foo() { + // some code + EASY_BLOCK("Calculating sum"); // Block with default color + int sum = 0; + for (int i = 0; i < 10; ++i) { + EASY_BLOCK("Addition", profiler::colors::Red); // Scoped red block (no EASY_END_BLOCK needed) + sum += i; + } + EASY_END_BLOCK; // This ends "Calculating sum" block + + EASY_BLOCK("Calculating multiplication", profiler::colors::Blue500); // Blue block + int mul = 1; + for (int i = 1; i < 11; ++i) + mul *= i; + //EASY_END_BLOCK; // This is not needed because all blocks are ended on destructor when closing braces met +} +``` + +You can also use your own colors. easy_profiler is using standard 32-bit ARGB color format. +Example: +```cpp +#include + +void bar() { + EASY_FUNCTION(0xfff080aa); // Function block with custom color + // some code +} +``` +## Collect blocks + +There are two ways to cature blocks + +### Collect via network + +It's most prefered and convenient approach in many case. + +1. Initialize listening by `profiler::startListen()`. It's start new thread to listen on `28077` port the start-capture-signal from gui-application. +2. To stop listening you can call `profiler::stopListen()` function. + +### Collect via file + +1. Enable profiler by `EASY_PROFILER_ENABLE` macro +2. Dump blocks to file in any place you want by `profiler::dumpBlocksToFile("test_profile.prof")` function + +Example: +```cpp +int main() +{ + EASY_PROFILER_ENABLE; + /* do work*/ + profiler::dumpBlocksToFile("test_profile.prof"); +} +``` + +### Note about context-switch + +To capture a thread context-switch event you need: + +- On Windows: run profiling application "as administrator" +- On linux: you can run special `systemtap` script with root privileges as follow (example on Fedora): +```bash +#stap -o /tmp/cs_profiling_info.log scripts/context_switch_logger.stp name APPLICATION_NAME +``` +APPLICATION_NAME - name of profiling application + +# Build + +## Prerequisites + +* CMake 3.0 or higher +* Compiler with c++11 support + * for Unix systems: compiler with `thread_local` support is **highly recommended**: _GCC >=4.8_, _Clang >=3.3_ + +Additional requirements for GUI: +* Qt 5.3.0 or higher + +## Linux + +```bash +$ mkdir build +$ cd build +$ cmake -DCMAKE_BUILD_TYPE="Release" .. +$ make +``` + +## Windows + +If you are using QtCreator IDE you can just open `CMakeLists.txt` file in root directory. +If you are using Visual Studio you can generate solution by cmake generator command. +Examples shows how to generate Win64 solution for Visual Studio 2013. To generate for another version use proper cmake generator (-G "name of generator"). + +### Way 1 +Specify path to cmake scripts in Qt5 dir (usually in lib/cmake subdir) and execute cmake generator command, +for example: +```batch +$ mkdir build +$ cd build +$ cmake -DCMAKE_PREFIX_PATH="C:\Qt\5.3\msvc2013_64\lib\cmake" .. -G "Visual Studio 12 2013 Win64" +``` + +### Way 2 +Create system variable "Qt5Widgets_DIR" and set it's value to "[path-to-Qt5-binaries]\lib\cmake\Qt5Widgets". +For example, "C:\Qt\5.3\msvc2013_64\lib\cmake\Qt5Widgets". +And then run cmake generator as follows: +```batch +$ mkdir build +$ cd build +$ cmake .. -G "Visual Studio 12 2013 Win64" +``` + +# License + +Licensed under either of +- MIT license ([LICENSE.MIT](LICENSE.MIT) or http://opensource.org/licenses/MIT) +- Apache License, Version 2.0, ([LICENSE.APACHE](LICENSE.APACHE) or http://www.apache.org/licenses/LICENSE-2.0) + +at your option. diff --git a/3rdparty/easyprofiler/appveyor.bat b/3rdparty/easyprofiler/appveyor.bat new file mode 100644 index 0000000..5f78678 --- /dev/null +++ b/3rdparty/easyprofiler/appveyor.bat @@ -0,0 +1,6 @@ +mkdir build_msvc +cd build_msvc +cmake -G "%GENERATOR%" ../ +cmake --build . --config Release + +goto :EOF diff --git a/3rdparty/easyprofiler/appveyor.yml b/3rdparty/easyprofiler/appveyor.yml new file mode 100644 index 0000000..6a7708f --- /dev/null +++ b/3rdparty/easyprofiler/appveyor.yml @@ -0,0 +1,19 @@ +platform: + - Win64 + +configuration: + - Release + +environment: + matrix: + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + Qt5Widgets_DIR: "C:\\Qt\\5.5\\msvc2013_64\\lib\\cmake\\Qt5Widgets" + GENERATOR: "Visual Studio 12 2013 Win64" + +test: off + +build_script: + - CALL appveyor.bat + +skip_commits: + message: /.*\[skip appveyor\].*/ diff --git a/3rdparty/easyprofiler/cmake_install.cmake b/3rdparty/easyprofiler/cmake_install.cmake new file mode 100644 index 0000000..94c87df --- /dev/null +++ b/3rdparty/easyprofiler/cmake_install.cmake @@ -0,0 +1,53 @@ +# Install script for directory: /home/alex/Work/C++Projects/easyprofiler + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_LOCAL_ONLY) + # Include the install script for each subdirectory. + include("/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/cmake_install.cmake") + include("/home/alex/Work/C++Projects/easyprofiler/profiler_gui/cmake_install.cmake") + include("/home/alex/Work/C++Projects/easyprofiler/sample/cmake_install.cmake") + include("/home/alex/Work/C++Projects/easyprofiler/reader/cmake_install.cmake") + +endif() + +if(CMAKE_INSTALL_COMPONENT) + set(CMAKE_INSTALL_MANIFEST "install_manifest_${CMAKE_INSTALL_COMPONENT}.txt") +else() + set(CMAKE_INSTALL_MANIFEST "install_manifest.txt") +endif() + +string(REPLACE ";" "\n" CMAKE_INSTALL_MANIFEST_CONTENT + "${CMAKE_INSTALL_MANIFEST_FILES}") +file(WRITE "/home/alex/Work/C++Projects/easyprofiler/${CMAKE_INSTALL_MANIFEST}" + "${CMAKE_INSTALL_MANIFEST_CONTENT}") diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..9ecfcf5 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/alex/Work/C++Projects/easyprofiler") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/alex/Work/C++Projects/easyprofiler") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets-release.cmake b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets-release.cmake new file mode 100644 index 0000000..09cbb89 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets-release.cmake @@ -0,0 +1,19 @@ +#---------------------------------------------------------------- +# Generated CMake target import file for configuration "Release". +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Import target "easy_profiler" for configuration "Release" +set_property(TARGET easy_profiler APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE) +set_target_properties(easy_profiler PROPERTIES + IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/bin/libeasy_profiler.so" + IMPORTED_SONAME_RELEASE "libeasy_profiler.so" + ) + +list(APPEND _IMPORT_CHECK_TARGETS easy_profiler ) +list(APPEND _IMPORT_CHECK_FILES_FOR_easy_profiler "${_IMPORT_PREFIX}/bin/libeasy_profiler.so" ) + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets.cmake b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets.cmake new file mode 100644 index 0000000..5f95653 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets.cmake @@ -0,0 +1,95 @@ +# Generated by CMake 3.5.1 + +if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.5) + message(FATAL_ERROR "CMake >= 2.6.0 required") +endif() +cmake_policy(PUSH) +cmake_policy(VERSION 2.6) +#---------------------------------------------------------------- +# Generated CMake target import file. +#---------------------------------------------------------------- + +# Commands may need to know the format version. +set(CMAKE_IMPORT_FILE_VERSION 1) + +# Protect against multiple inclusion, which would fail when already imported targets are added once more. +set(_targetsDefined) +set(_targetsNotDefined) +set(_expectedTargets) +foreach(_expectedTarget easy_profiler) + list(APPEND _expectedTargets ${_expectedTarget}) + if(NOT TARGET ${_expectedTarget}) + list(APPEND _targetsNotDefined ${_expectedTarget}) + endif() + if(TARGET ${_expectedTarget}) + list(APPEND _targetsDefined ${_expectedTarget}) + endif() +endforeach() +if("${_targetsDefined}" STREQUAL "${_expectedTargets}") + set(CMAKE_IMPORT_FILE_VERSION) + cmake_policy(POP) + return() +endif() +if(NOT "${_targetsDefined}" STREQUAL "") + message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_targetsDefined}\nTargets not yet defined: ${_targetsNotDefined}\n") +endif() +unset(_targetsDefined) +unset(_targetsNotDefined) +unset(_expectedTargets) + + +# Compute the installation prefix relative to this file. +get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) +get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH) + +# Create imported target easy_profiler +add_library(easy_profiler SHARED IMPORTED) + +set_target_properties(easy_profiler PROPERTIES + INTERFACE_COMPILE_DEFINITIONS "EASY_PROFILER_VERSION_MAJOR=1;EASY_PROFILER_VERSION_MINOR=3;EASY_PROFILER_VERSION_PATCH=0;EASY_DEFAULT_PORT=28077;BUILD_WITH_EASY_PROFILER=1" + INTERFACE_COMPILE_OPTIONS "-DEASY_CHRONO_STEADY_CLOCK=0;-DEASY_CHRONO_HIGHRES_CLOCK=0;-DEASY_OPTION_START_LISTEN_ON_STARTUP=0;-DEASY_OPTION_MEASURE_STORAGE_EXPAND=0;-DEASY_OPTION_STORAGE_EXPAND_BLOCKS_ON=0;-DEASY_OPTION_IMPLICIT_THREAD_REGISTRATION=1;-DEASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS=0;-DEASY_OPTION_LOG_ENABLED=0;-DEASY_OPTION_PRETTY_PRINT_FUNCTIONS=0;-DEASY_OPTION_BUILTIN_COLORS=1;-std=gnu++11" + INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include" + INTERFACE_LINK_LIBRARIES "pthread" +) + +if(CMAKE_VERSION VERSION_LESS 2.8.12) + message(FATAL_ERROR "This file relies on consumers using CMake 2.8.12 or greater.") +endif() + +# Load information for each installed configuration. +get_filename_component(_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) +file(GLOB CONFIG_FILES "${_DIR}/easy_profilerTargets-*.cmake") +foreach(f ${CONFIG_FILES}) + include(${f}) +endforeach() + +# Cleanup temporary variables. +set(_IMPORT_PREFIX) + +# Loop over all imported files and verify that they actually exist +foreach(target ${_IMPORT_CHECK_TARGETS} ) + foreach(file ${_IMPORT_CHECK_FILES_FOR_${target}} ) + if(NOT EXISTS "${file}" ) + message(FATAL_ERROR "The imported target \"${target}\" references the file + \"${file}\" +but this file does not exist. Possible reasons include: +* The file was deleted, renamed, or moved to another location. +* An install or uninstall procedure did not complete successfully. +* The installation package was faulty and contained + \"${CMAKE_CURRENT_LIST_FILE}\" +but not all the files it references. +") + endif() + endforeach() + unset(_IMPORT_CHECK_FILES_FOR_${target}) +endforeach() +unset(_IMPORT_CHECK_TARGETS) + +# This file does not depend on other imported targets which have +# been exported from the same project but in a separate export set. + +# Commands beyond this point should not need to know the version. +set(CMAKE_IMPORT_FILE_VERSION) +cmake_policy(POP) diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/DependInfo.cmake b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/DependInfo.cmake new file mode 100644 index 0000000..56e0950 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/DependInfo.cmake @@ -0,0 +1,37 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/block.cpp" "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/easy_socket.cpp" "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/event_trace_win.cpp" "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/nonscoped_block.cpp" "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/profile_manager.cpp" "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/reader.cpp" "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/thread_storage.cpp" "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "BUILD_WITH_EASY_PROFILER=1" + "EASY_DEFAULT_PORT=28077" + "EASY_PROFILER_VERSION_MAJOR=1" + "EASY_PROFILER_VERSION_MINOR=3" + "EASY_PROFILER_VERSION_PATCH=0" + "_BUILD_PROFILER=1" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "easy_profiler_core/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make new file mode 100644 index 0000000..2b3b823 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make @@ -0,0 +1,275 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/alex/Work/C++Projects/easyprofiler + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/alex/Work/C++Projects/easyprofiler + +# Include any dependencies generated for this target. +include easy_profiler_core/CMakeFiles/easy_profiler.dir/depend.make + +# Include the progress variables for this target. +include easy_profiler_core/CMakeFiles/easy_profiler.dir/progress.make + +# Include the compile flags for this target's objects. +include easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make + +easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o: easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make +easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o: easy_profiler_core/block.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/easy_profiler.dir/block.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/block.cpp + +easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/easy_profiler.dir/block.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/block.cpp > CMakeFiles/easy_profiler.dir/block.cpp.i + +easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/easy_profiler.dir/block.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/block.cpp -o CMakeFiles/easy_profiler.dir/block.cpp.s + +easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o.requires: + +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o.requires + +easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o.provides: easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o.requires + $(MAKE) -f easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o.provides.build +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o.provides + +easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o.provides.build: easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o + + +easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o: easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make +easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o: easy_profiler_core/easy_socket.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/easy_profiler.dir/easy_socket.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/easy_socket.cpp + +easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/easy_profiler.dir/easy_socket.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/easy_socket.cpp > CMakeFiles/easy_profiler.dir/easy_socket.cpp.i + +easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/easy_profiler.dir/easy_socket.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/easy_socket.cpp -o CMakeFiles/easy_profiler.dir/easy_socket.cpp.s + +easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o.requires: + +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o.requires + +easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o.provides: easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o.requires + $(MAKE) -f easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o.provides.build +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o.provides + +easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o.provides.build: easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o + + +easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o: easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make +easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o: easy_profiler_core/event_trace_win.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/event_trace_win.cpp + +easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/easy_profiler.dir/event_trace_win.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/event_trace_win.cpp > CMakeFiles/easy_profiler.dir/event_trace_win.cpp.i + +easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/easy_profiler.dir/event_trace_win.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/event_trace_win.cpp -o CMakeFiles/easy_profiler.dir/event_trace_win.cpp.s + +easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o.requires: + +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o.requires + +easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o.provides: easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o.requires + $(MAKE) -f easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o.provides.build +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o.provides + +easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o.provides.build: easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o + + +easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o: easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make +easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o: easy_profiler_core/nonscoped_block.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/nonscoped_block.cpp + +easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/nonscoped_block.cpp > CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.i + +easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/nonscoped_block.cpp -o CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.s + +easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o.requires: + +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o.requires + +easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o.provides: easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o.requires + $(MAKE) -f easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o.provides.build +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o.provides + +easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o.provides.build: easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o + + +easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o: easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make +easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o: easy_profiler_core/profile_manager.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/easy_profiler.dir/profile_manager.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/profile_manager.cpp + +easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/easy_profiler.dir/profile_manager.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/profile_manager.cpp > CMakeFiles/easy_profiler.dir/profile_manager.cpp.i + +easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/easy_profiler.dir/profile_manager.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/profile_manager.cpp -o CMakeFiles/easy_profiler.dir/profile_manager.cpp.s + +easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o.requires: + +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o.requires + +easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o.provides: easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o.requires + $(MAKE) -f easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o.provides.build +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o.provides + +easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o.provides.build: easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o + + +easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o: easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make +easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o: easy_profiler_core/reader.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/easy_profiler.dir/reader.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/reader.cpp + +easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/easy_profiler.dir/reader.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/reader.cpp > CMakeFiles/easy_profiler.dir/reader.cpp.i + +easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/easy_profiler.dir/reader.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/reader.cpp -o CMakeFiles/easy_profiler.dir/reader.cpp.s + +easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o.requires: + +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o.requires + +easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o.provides: easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o.requires + $(MAKE) -f easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o.provides.build +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o.provides + +easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o.provides.build: easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o + + +easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o: easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make +easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o: easy_profiler_core/thread_storage.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/easy_profiler.dir/thread_storage.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/thread_storage.cpp + +easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/easy_profiler.dir/thread_storage.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/thread_storage.cpp > CMakeFiles/easy_profiler.dir/thread_storage.cpp.i + +easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/easy_profiler.dir/thread_storage.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/thread_storage.cpp -o CMakeFiles/easy_profiler.dir/thread_storage.cpp.s + +easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o.requires: + +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o.requires + +easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o.provides: easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o.requires + $(MAKE) -f easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o.provides.build +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o.provides + +easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o.provides.build: easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o + + +# Object files for target easy_profiler +easy_profiler_OBJECTS = \ +"CMakeFiles/easy_profiler.dir/block.cpp.o" \ +"CMakeFiles/easy_profiler.dir/easy_socket.cpp.o" \ +"CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o" \ +"CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o" \ +"CMakeFiles/easy_profiler.dir/profile_manager.cpp.o" \ +"CMakeFiles/easy_profiler.dir/reader.cpp.o" \ +"CMakeFiles/easy_profiler.dir/thread_storage.cpp.o" + +# External object files for target easy_profiler +easy_profiler_EXTERNAL_OBJECTS = + +bin/libeasy_profiler.so: easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o +bin/libeasy_profiler.so: easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o +bin/libeasy_profiler.so: easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o +bin/libeasy_profiler.so: easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o +bin/libeasy_profiler.so: easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o +bin/libeasy_profiler.so: easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o +bin/libeasy_profiler.so: easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o +bin/libeasy_profiler.so: easy_profiler_core/CMakeFiles/easy_profiler.dir/build.make +bin/libeasy_profiler.so: easy_profiler_core/CMakeFiles/easy_profiler.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Linking CXX shared library ../bin/libeasy_profiler.so" + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/easy_profiler.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +easy_profiler_core/CMakeFiles/easy_profiler.dir/build: bin/libeasy_profiler.so + +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/build + +easy_profiler_core/CMakeFiles/easy_profiler.dir/requires: easy_profiler_core/CMakeFiles/easy_profiler.dir/block.cpp.o.requires +easy_profiler_core/CMakeFiles/easy_profiler.dir/requires: easy_profiler_core/CMakeFiles/easy_profiler.dir/easy_socket.cpp.o.requires +easy_profiler_core/CMakeFiles/easy_profiler.dir/requires: easy_profiler_core/CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o.requires +easy_profiler_core/CMakeFiles/easy_profiler.dir/requires: easy_profiler_core/CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o.requires +easy_profiler_core/CMakeFiles/easy_profiler.dir/requires: easy_profiler_core/CMakeFiles/easy_profiler.dir/profile_manager.cpp.o.requires +easy_profiler_core/CMakeFiles/easy_profiler.dir/requires: easy_profiler_core/CMakeFiles/easy_profiler.dir/reader.cpp.o.requires +easy_profiler_core/CMakeFiles/easy_profiler.dir/requires: easy_profiler_core/CMakeFiles/easy_profiler.dir/thread_storage.cpp.o.requires + +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/requires + +easy_profiler_core/CMakeFiles/easy_profiler.dir/clean: + cd /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core && $(CMAKE_COMMAND) -P CMakeFiles/easy_profiler.dir/cmake_clean.cmake +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/clean + +easy_profiler_core/CMakeFiles/easy_profiler.dir/depend: + cd /home/alex/Work/C++Projects/easyprofiler && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : easy_profiler_core/CMakeFiles/easy_profiler.dir/depend + diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/cmake_clean.cmake b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/cmake_clean.cmake new file mode 100644 index 0000000..27eab83 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/cmake_clean.cmake @@ -0,0 +1,16 @@ +file(REMOVE_RECURSE + "CMakeFiles/easy_profiler.dir/block.cpp.o" + "CMakeFiles/easy_profiler.dir/easy_socket.cpp.o" + "CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o" + "CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o" + "CMakeFiles/easy_profiler.dir/profile_manager.cpp.o" + "CMakeFiles/easy_profiler.dir/reader.cpp.o" + "CMakeFiles/easy_profiler.dir/thread_storage.cpp.o" + "../bin/libeasy_profiler.pdb" + "../bin/libeasy_profiler.so" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/easy_profiler.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/depend.make b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/depend.make new file mode 100644 index 0000000..be24553 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for easy_profiler. +# This may be replaced when dependencies are built. diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make new file mode 100644 index 0000000..a91ba6d --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -O3 -DNDEBUG -fPIC -DEASY_CHRONO_STEADY_CLOCK=0 -DEASY_CHRONO_HIGHRES_CLOCK=0 -DEASY_OPTION_START_LISTEN_ON_STARTUP=0 -DEASY_OPTION_MEASURE_STORAGE_EXPAND=0 -DEASY_OPTION_STORAGE_EXPAND_BLOCKS_ON=0 -DEASY_OPTION_IMPLICIT_THREAD_REGISTRATION=1 -DEASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS=0 -DEASY_OPTION_LOG_ENABLED=0 -DEASY_OPTION_PRETTY_PRINT_FUNCTIONS=0 -DEASY_OPTION_BUILTIN_COLORS=1 -Wall -Wno-long-long -Wno-reorder -Wno-braced-scalar-init -pedantic -std=gnu++11 -std=gnu++11 + +CXX_DEFINES = -DBUILD_WITH_EASY_PROFILER=1 -DEASY_DEFAULT_PORT=28077 -DEASY_PROFILER_VERSION_MAJOR=1 -DEASY_PROFILER_VERSION_MINOR=3 -DEASY_PROFILER_VERSION_PATCH=0 -D_BUILD_PROFILER=1 -Deasy_profiler_EXPORTS + +CXX_INCLUDES = -I/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include + diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/link.txt b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/link.txt new file mode 100644 index 0000000..55b5e85 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -fPIC -O3 -DNDEBUG -shared -Wl,-soname,libeasy_profiler.so -o ../bin/libeasy_profiler.so CMakeFiles/easy_profiler.dir/block.cpp.o CMakeFiles/easy_profiler.dir/easy_socket.cpp.o CMakeFiles/easy_profiler.dir/event_trace_win.cpp.o CMakeFiles/easy_profiler.dir/nonscoped_block.cpp.o CMakeFiles/easy_profiler.dir/profile_manager.cpp.o CMakeFiles/easy_profiler.dir/reader.cpp.o CMakeFiles/easy_profiler.dir/thread_storage.cpp.o -lpthread -Wl,-rpath,::::::: diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/progress.make b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/progress.make new file mode 100644 index 0000000..5b29368 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/progress.make @@ -0,0 +1,9 @@ +CMAKE_PROGRESS_1 = 1 +CMAKE_PROGRESS_2 = 2 +CMAKE_PROGRESS_3 = 3 +CMAKE_PROGRESS_4 = 4 +CMAKE_PROGRESS_5 = 5 +CMAKE_PROGRESS_6 = 6 +CMAKE_PROGRESS_7 = 7 +CMAKE_PROGRESS_8 = 8 + diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/progress.marks b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/progress.marks new file mode 100644 index 0000000..45a4fb7 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeFiles/progress.marks @@ -0,0 +1 @@ +8 diff --git a/3rdparty/easyprofiler/easy_profiler_core/CMakeLists.txt b/3rdparty/easyprofiler/easy_profiler_core/CMakeLists.txt new file mode 100644 index 0000000..e41a7d9 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/CMakeLists.txt @@ -0,0 +1,309 @@ +message(STATUS "") +message(STATUS "EASY_PROFILER.Core version = ${EASY_PRODUCT_VERSION_STRING}") +message(STATUS "") + + + +##################################################################### +# Checking c++11 thread_local support +if (NOT WIN32) + if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8") + set(NO_CXX11_THREAD_LOCAL_SUPPORT TRUE) + endif () + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "3.3") + set(NO_CXX11_THREAD_LOCAL_SUPPORT TRUE) + endif () + elseif (CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8.0") + set(NO_CXX11_THREAD_LOCAL_SUPPORT TRUE) + endif () + endif () + + # TODO: Check thread_local keyword support for other compilers for Unix + + if (NO_CXX11_THREAD_LOCAL_SUPPORT) + message(WARNING " Your compiler does not support C++11 thread_local feature.") + message(WARNING " Without C++11 thread_local feature you may face to possible memory leak or application crash if using implicit thread registration and using EASY_THREAD instead of EASY_THREAD_SCOPE.") + endif () +endif () +##################################################################### + + + +########################################################### +# EasyProfiler options: +set(EASY_OPTION_IMPLICIT_THREAD_REGISTER_TEXT "Enable new threads registration when collecting context switch events") +set(EASY_DEFAULT_PORT 28077 CACHE STRING "Default listening port") +set(EASY_OPTION_LISTEN OFF CACHE BOOL "Enable automatic startListen on startup") +set(EASY_OPTION_PROFILE_SELF OFF CACHE BOOL "Enable self profiling (measure time for internal storage expand)") +set(EASY_OPTION_PROFILE_SELF_BLOCKS_ON OFF CACHE BOOL "Storage expand default status (profiler::ON or profiler::OFF)") +set(EASY_OPTION_LOG OFF CACHE BOOL "Print errors to stderr") +set(EASY_OPTION_PRETTY_PRINT OFF CACHE BOOL "Use pretty-printed function names with signature and argument types") +set(EASY_OPTION_PREDEFINED_COLORS ON CACHE BOOL "Use predefined set of colors (see profiler_colors.h). If you want to use your own colors palette you can turn this option OFF") +set(BUILD_SHARED_LIBS ON CACHE BOOL "Build easy_profiler as shared library.") +if (WIN32) + set(EASY_OPTION_IMPLICIT_THREAD_REGISTRATION ON CACHE BOOL ${EASY_OPTION_IMPLICIT_THREAD_REGISTER_TEXT}) + set(EASY_OPTION_EVENT_TRACING ON CACHE BOOL "Enable event tracing by default") + set(EASY_OPTION_LOW_PRIORITY_EVENT_TRACING ON CACHE BOOL "Set low priority for event tracing thread") +else () + if (NO_CXX11_THREAD_LOCAL_SUPPORT) + set(EASY_OPTION_IMPLICIT_THREAD_REGISTRATION OFF CACHE BOOL ${EASY_OPTION_IMPLICIT_THREAD_REGISTER_TEXT}) + set(EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS OFF CACHE BOOL "Enable easy_profiler to remove empty unguarded threads. This fixes potential memory leak on Unix systems, but may lead to an application crash! This is used when C++11 thread_local is unavailable.") + else () + set(EASY_OPTION_IMPLICIT_THREAD_REGISTRATION ON CACHE BOOL ${EASY_OPTION_IMPLICIT_THREAD_REGISTER_TEXT}) + endif () +endif () +set(BUILD_WITH_CHRONO_STEADY_CLOCK OFF CACHE BOOL "Use std::chrono::steady_clock as a timer" ) +set(BUILD_WITH_CHRONO_HIGH_RESOLUTION_CLOCK OFF CACHE BOOL "Use std::chrono::high_resolution_clock as a timer") +# End EasyProfiler options. +########################################################### + + + +##################################################################### +# Print EasyProfiler options status: +message(STATUS "-------- EASY_PROFILER OPTIONS: --------") +if (BUILD_WITH_CHRONO_STEADY_CLOCK) + message(STATUS " Use std::chrono::steady_clock as a timer") +elseif (BUILD_WITH_CHRONO_HIGH_RESOLUTION_CLOCK) + message(STATUS " Use std::chrono::high_resolution_clock as a timer") +else () + if (WIN32) + message(STATUS " Use QueryPerformanceCounter as a timer") + else () + message(STATUS " Use rtdsc as a timer") + endif () +endif () + +message(STATUS " Default listening port = ${EASY_DEFAULT_PORT}") +message(STATUS " Auto-start listening = ${EASY_OPTION_LISTEN}") +message(STATUS " Profile self = ${EASY_OPTION_PROFILE_SELF}") +message(STATUS " Profile self blocks initial status = ${EASY_OPTION_PROFILE_SELF_BLOCKS_ON}") +message(STATUS " Implicit thread registration = ${EASY_OPTION_IMPLICIT_THREAD_REGISTRATION}") +if (WIN32) + message(STATUS " Event tracing = ${EASY_OPTION_EVENT_TRACING}") + message(STATUS " Event tracing has low priority = ${EASY_OPTION_LOW_PRIORITY_EVENT_TRACING}") +elseif (NO_CXX11_THREAD_LOCAL_SUPPORT) + if (EASY_OPTION_IMPLICIT_THREAD_REGISTRATION) + message(STATUS " WARNING! Implicit thread registration for Unix systems can lead to memory leak") + message(STATUS " because there is no possibility to check if thread is alive and remove dead threads.") + endif () + message(STATUS " Removing empty unguarded threads = ${EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS}") + if (EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS) + message(STATUS " WARNING! Removing empty unguarded threads may lead to an application crash!") + message(STATUS " But fixes potential memory leak on Unix systems.") + else () + message(STATUS " WARNING! There is a possibility of memory leak without removing empty unguarded threads.") + endif () +endif () +message(STATUS " Log messages = ${EASY_OPTION_LOG}") +message(STATUS " Function names pretty-print = ${EASY_OPTION_PRETTY_PRINT}") +message(STATUS " Use EasyProfiler colors palette = ${EASY_OPTION_PREDEFINED_COLORS}") +message(STATUS " Shared library: ${BUILD_SHARED_LIBS}") +message(STATUS "------ END EASY_PROFILER OPTIONS -------") +message(STATUS "") +# End printing EasyProfiler options status. +##################################################################### + + + +################################################# +# Add source files: +set(CPP_FILES + block.cpp + easy_socket.cpp + event_trace_win.cpp + nonscoped_block.cpp + profile_manager.cpp + reader.cpp + thread_storage.cpp +) + +set(H_FILES + chunk_allocator.h + current_time.h + current_thread.h + event_trace_win.h + nonscoped_block.h + profile_manager.h + thread_storage.h + spin_lock.h + stack_buffer.h +) + +set(INCLUDE_FILES + include/easy/arbitrary_value.h + include/easy/easy_net.h + include/easy/easy_socket.h + include/easy/profiler.h + include/easy/reader.h + include/easy/serialized_block.h + include/easy/details/arbitrary_value_aux.h + include/easy/details/arbitrary_value_public_types.h + include/easy/details/easy_compiler_support.h + include/easy/details/profiler_aux.h + include/easy/details/profiler_colors.h + include/easy/details/profiler_public_types.h +) + +source_group(include FILES ${INCLUDE_FILES}) + +set(SOURCES + ${CPP_FILES} + ${H_FILES} + ${INCLUDE_FILES} +) + +add_library(easy_profiler ${SOURCES} resources.rc) +# End adding source files. +################################################# + + + +target_include_directories(easy_profiler PUBLIC + $ + $ # /include +) +target_compile_definitions(easy_profiler PRIVATE + -D_BUILD_PROFILER=1 + #-DEASY_PROFILER_API_DISABLED # uncomment this to disable profiler api only (you will have to rebuild only easy_profiler) +) +if (NOT BUILD_SHARED_LIBS) + target_compile_definitions(easy_profiler PUBLIC -DEASY_PROFILER_STATIC=1) +endif () +target_compile_definitions(easy_profiler PUBLIC + -DEASY_PROFILER_VERSION_MAJOR=${EASY_PROGRAM_VERSION_MAJOR} + -DEASY_PROFILER_VERSION_MINOR=${EASY_PROGRAM_VERSION_MINOR} + -DEASY_PROFILER_VERSION_PATCH=${EASY_PROGRAM_VERSION_PATCH} + -DEASY_DEFAULT_PORT=${EASY_DEFAULT_PORT} + -DBUILD_WITH_EASY_PROFILER=1 +) + + + +##################################################################### +# Add EasyProfiler options definitions: +easy_define_target_option(easy_profiler BUILD_WITH_CHRONO_STEADY_CLOCK EASY_CHRONO_STEADY_CLOCK) +easy_define_target_option(easy_profiler BUILD_WITH_CHRONO_HIGH_RESOLUTION_CLOCK EASY_CHRONO_HIGHRES_CLOCK) +easy_define_target_option(easy_profiler EASY_OPTION_LISTEN EASY_OPTION_START_LISTEN_ON_STARTUP) +easy_define_target_option(easy_profiler EASY_OPTION_PROFILE_SELF EASY_OPTION_MEASURE_STORAGE_EXPAND) +easy_define_target_option(easy_profiler EASY_OPTION_PROFILE_SELF_BLOCKS_ON EASY_OPTION_STORAGE_EXPAND_BLOCKS_ON) +easy_define_target_option(easy_profiler EASY_OPTION_IMPLICIT_THREAD_REGISTRATION EASY_OPTION_IMPLICIT_THREAD_REGISTRATION) +if (WIN32) + easy_define_target_option(easy_profiler EASY_OPTION_EVENT_TRACING EASY_OPTION_EVENT_TRACING_ENABLED) + easy_define_target_option(easy_profiler EASY_OPTION_LOW_PRIORITY_EVENT_TRACING EASY_OPTION_LOW_PRIORITY_EVENT_TRACING) +else () + easy_define_target_option(easy_profiler EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS) +endif () +easy_define_target_option(easy_profiler EASY_OPTION_LOG EASY_OPTION_LOG_ENABLED) +easy_define_target_option(easy_profiler EASY_OPTION_PRETTY_PRINT EASY_OPTION_PRETTY_PRINT_FUNCTIONS) +easy_define_target_option(easy_profiler EASY_OPTION_PREDEFINED_COLORS EASY_OPTION_BUILTIN_COLORS) +# End adding EasyProfiler options definitions. +##################################################################### + + + +############################################################################### +# Add platform specific compile options: +if (UNIX) + target_compile_options(easy_profiler PRIVATE -Wall -Wno-long-long -Wno-reorder -Wno-braced-scalar-init -pedantic) + target_link_libraries(easy_profiler pthread) +elseif (WIN32) + target_compile_definitions(easy_profiler PRIVATE -D_WIN32_WINNT=0x0600 -D_CRT_SECURE_NO_WARNINGS -D_WINSOCK_DEPRECATED_NO_WARNINGS) + target_link_libraries(easy_profiler ws2_32 psapi) +endif () + +if (MINGW) + target_compile_definitions(easy_profiler PRIVATE -DSTRSAFE_NO_DEPRECATE) +endif () + +if (MSVC) + target_compile_options(easy_profiler PRIVATE /WX) +endif () + +if (APPLE) + target_compile_options(easy_profiler PUBLIC -std=gnu++11) +else () + if (CMAKE_VERSION VERSION_LESS "3.1") + if (NOT MSVC) + target_compile_options(easy_profiler PUBLIC $<$:-std=gnu++11>) + endif () + else () + if (NOT MSVC) + target_compile_options(easy_profiler PUBLIC -std=gnu++11) + endif () + set_target_properties(easy_profiler PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON) + endif () +endif () +# End adding platform specific compile options. +############################################################################### + + + +######################################################################################### +# Installation: +set(config_install_dir "lib/cmake/${PROJECT_NAME}") +set(include_install_dir "include") + +set(generated_dir "${CMAKE_CURRENT_BINARY_DIR}/generated") + +# Configuration +set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") +set(project_config "${generated_dir}/${PROJECT_NAME}Config.cmake") +set(targets_export_name "${PROJECT_NAME}Targets") + +include(CMakePackageConfigHelpers) +include(InstallRequiredSystemLibraries) + +write_basic_package_version_file( + "${version_config}" + VERSION + ${EASY_PRODUCT_VERSION_STRING} + COMPATIBILITY + SameMajorVersion +) + +configure_package_config_file( + "cmake/config.cmake.in" + "${project_config}" + INSTALL_DESTINATION "${config_install_dir}" +) + +install( + FILES "${project_config}" "${version_config}" + DESTINATION "${config_install_dir}" +) + +install( + FILES + ${INCLUDE_FILES} + DESTINATION + include/easy +) + +install( + FILES + LICENSE.MIT + LICENSE.APACHE + DESTINATION + . +) + +install( + TARGETS + easy_profiler + EXPORT + ${targets_export_name} + DESTINATION + bin + INCLUDES DESTINATION "${include_install_dir}" +) + +install( + EXPORT "${targets_export_name}" + DESTINATION "${config_install_dir}" +) + +target_compile_definitions(easy_profiler PUBLIC ) diff --git a/3rdparty/easyprofiler/easy_profiler_core/LICENSE.APACHE b/3rdparty/easyprofiler/easy_profiler_core/LICENSE.APACHE new file mode 100644 index 0000000..f433b1a --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/LICENSE.APACHE @@ -0,0 +1,177 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/3rdparty/easyprofiler/easy_profiler_core/LICENSE.MIT b/3rdparty/easyprofiler/easy_profiler_core/LICENSE.MIT new file mode 100644 index 0000000..3840145 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/LICENSE.MIT @@ -0,0 +1,18 @@ +Copyright (c) 2017 Sergey Yagovtsev, Victor Zarubkin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/3rdparty/easyprofiler/easy_profiler_core/block.cpp b/3rdparty/easyprofiler/easy_profiler_core/block.cpp new file mode 100644 index 0000000..de0b7b7 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/block.cpp @@ -0,0 +1,241 @@ +/************************************************************************ +* file name : block.cpp +* ----------------- : +* creation time : 2016/02/16 +* authors : Sergey Yagovtsev, Victor Zarubkin +* emails : yse.sey@gmail.com, v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of profiling blocks +* : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include "profile_manager.h" +#include "current_time.h" + +using namespace profiler; + +#ifndef EASY_PROFILER_API_DISABLED +Event::Event(timestamp_t _begin_time) EASY_NOEXCEPT : m_begin(_begin_time), m_end(0) +{ + +} + +Event::Event(timestamp_t _begin_time, timestamp_t _end_time) EASY_NOEXCEPT : m_begin(_begin_time), m_end(_end_time) +{ + +} + +BaseBlockData::BaseBlockData(timestamp_t _begin_time, block_id_t _descriptor_id) EASY_NOEXCEPT + : Event(_begin_time) + , m_id(_descriptor_id) +{ + +} + +BaseBlockData::BaseBlockData(timestamp_t _begin_time, timestamp_t _end_time, block_id_t _descriptor_id) EASY_NOEXCEPT + : Event(_begin_time, _end_time) + , m_id(_descriptor_id) +{ + +} + +Block::Block(Block&& that) EASY_NOEXCEPT + : BaseBlockData(that.m_begin, that.m_id) + , m_name(that.m_name) + , m_status(that.m_status) + , m_isScoped(that.m_isScoped) +{ + m_end = that.m_end; + that.m_end = that.m_begin; +} + +Block::Block(timestamp_t _begin_time, block_id_t _descriptor_id, const char* _runtimeName) EASY_NOEXCEPT + : BaseBlockData(_begin_time, _descriptor_id) + , m_name(_runtimeName) + , m_status(::profiler::ON) + , m_isScoped(true) +{ + +} + +Block::Block(timestamp_t _begin_time, timestamp_t _end_time, block_id_t _descriptor_id, const char* _runtimeName) EASY_NOEXCEPT + : BaseBlockData(_begin_time, _end_time, _descriptor_id) + , m_name(_runtimeName) + , m_status(::profiler::ON) + , m_isScoped(true) +{ + +} + +Block::Block(const BaseBlockDescriptor* _descriptor, const char* _runtimeName, bool _scoped) EASY_NOEXCEPT + : BaseBlockData(1ULL, _descriptor->id()) + , m_name(_runtimeName) + , m_status(_descriptor->status()) + , m_isScoped(_scoped) +{ + +} + +void Block::start() +{ + m_begin = getCurrentTime(); +} + +void Block::start(timestamp_t _time) EASY_NOEXCEPT +{ + m_begin = _time; +} + +void Block::finish() +{ + m_end = getCurrentTime(); +} + +void Block::finish(timestamp_t _time) EASY_NOEXCEPT +{ + m_end = _time; +} + +Block::~Block() +{ + if (!finished()) + ::profiler::endBlock(); +} +#else +Event::Event(timestamp_t) EASY_NOEXCEPT : m_begin(0), m_end(0) +{ + +} + +Event::Event(timestamp_t, timestamp_t) EASY_NOEXCEPT : m_begin(0), m_end(0) +{ + +} + +BaseBlockData::BaseBlockData(timestamp_t, block_id_t) EASY_NOEXCEPT + : Event(0, 0) + , m_id(~0U) +{ + +} + +BaseBlockData::BaseBlockData(timestamp_t, timestamp_t, block_id_t) EASY_NOEXCEPT + : Event(0, 0) + , m_id(~0U) +{ + +} + +Block::Block(Block&& that) EASY_NOEXCEPT + : BaseBlockData(0, ~0U) + , m_name("") + , m_status(::profiler::OFF) + , m_isScoped(that.m_isScoped) +{ +} + +Block::Block(timestamp_t, block_id_t, const char*) EASY_NOEXCEPT + : BaseBlockData(0, ~0U) + , m_name("") + , m_status(::profiler::OFF) + , m_isScoped(true) +{ + +} + +Block::Block(timestamp_t, timestamp_t, block_id_t, const char*) EASY_NOEXCEPT + : BaseBlockData(0, ~0U) + , m_name("") + , m_status(::profiler::OFF) + , m_isScoped(true) +{ + +} + +Block::Block(const BaseBlockDescriptor*, const char*, bool _scoped) EASY_NOEXCEPT + : BaseBlockData(0, ~0U) + , m_name("") + , m_status(::profiler::OFF) + , m_isScoped(_scoped) +{ + +} + +void Block::start() +{ +} + +void Block::start(timestamp_t) EASY_NOEXCEPT +{ +} + +void Block::finish() +{ +} + +void Block::finish(timestamp_t) EASY_NOEXCEPT +{ +} + +Block::~Block() +{ +} +#endif + +////////////////////////////////////////////////////////////////////////// + +CSwitchEvent::CSwitchEvent(timestamp_t _begin_time, thread_id_t _tid) EASY_NOEXCEPT + : Event(_begin_time) + , m_thread_id(_tid) +{ + +} + +CSwitchBlock::CSwitchBlock(timestamp_t _begin_time, thread_id_t _tid, const char* _runtimeName) EASY_NOEXCEPT + : CSwitchEvent(_begin_time, _tid) + , m_name(_runtimeName) +{ + +} + +////////////////////////////////////////////////////////////////////////// diff --git a/3rdparty/easyprofiler/easy_profiler_core/chunk_allocator.h b/3rdparty/easyprofiler/easy_profiler_core/chunk_allocator.h new file mode 100644 index 0000000..c189cf3 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/chunk_allocator.h @@ -0,0 +1,509 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_CHUNK_ALLOCATOR_H +#define EASY_PROFILER_CHUNK_ALLOCATOR_H + +#include +#include +#include +#include +#include "outstream.h" + +////////////////////////////////////////////////////////////////////////// + +#ifndef EASY_ENABLE_ALIGNMENT +# define EASY_ENABLE_ALIGNMENT 0 +#endif + +#ifndef EASY_ALIGNMENT_SIZE +# define EASY_ALIGNMENT_SIZE alignof(std::max_align_t) +#endif + +#if EASY_ENABLE_ALIGNMENT == 0 +# define EASY_ALIGNED(TYPE, VAR, A) TYPE VAR +# define EASY_MALLOC(MEMSIZE, A) malloc(MEMSIZE) +# define EASY_FREE(MEMPTR) free(MEMPTR) +#else +// MSVC and GNUC aligned versions of malloc are defined in malloc.h +# include +# if defined(_MSC_VER) +# define EASY_ALIGNED(TYPE, VAR, A) __declspec(align(A)) TYPE VAR +# define EASY_MALLOC(MEMSIZE, A) _aligned_malloc(MEMSIZE, A) +# define EASY_FREE(MEMPTR) _aligned_free(MEMPTR) +# elif defined(__GNUC__) +# define EASY_ALIGNED(TYPE, VAR, A) TYPE VAR __attribute__((aligned(A))) +# define EASY_MALLOC(MEMSIZE, A) memalign(A, MEMSIZE) +# define EASY_FREE(MEMPTR) free(MEMPTR) +# else +# define EASY_ALIGNED(TYPE, VAR, A) TYPE VAR +# define EASY_MALLOC(MEMSIZE, A) malloc(MEMSIZE) +# define EASY_FREE(MEMPTR) free(MEMPTR) +# endif +#endif + +////////////////////////////////////////////////////////////////////////// + +//! Checks if a pointer is aligned. +//! \param ptr The pointer to check. +//! \param alignment The alignement (must be a power of 2) +//! \returns true if the memory is aligned. +//! +template +EASY_FORCE_INLINE bool is_aligned(void* ptr) +{ + static_assert(ALIGNMENT % 2 == 0, "Alignment must be a power of two."); + return ((uintptr_t)ptr & (ALIGNMENT-1)) == 0; +} + +EASY_FORCE_INLINE void unaligned_zero16(void* ptr) +{ +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + *(uint16_t*)ptr = 0; +#else + ((char*)ptr)[0] = 0; + ((char*)ptr)[1] = 0; +#endif +} + +EASY_FORCE_INLINE void unaligned_zero32(void* ptr) +{ +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + *(uint32_t*)ptr = 0; +#else + ((char*)ptr)[0] = 0; + ((char*)ptr)[1] = 0; + ((char*)ptr)[2] = 0; + ((char*)ptr)[3] = 0; +#endif +} + +EASY_FORCE_INLINE void unaligned_zero64(void* ptr) +{ +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + *(uint64_t*)ptr = 0; +#else + // Assume unaligned is more common. + if (!is_aligned(ptr)) { + ((char*)ptr)[0] = 0; + ((char*)ptr)[1] = 0; + ((char*)ptr)[2] = 0; + ((char*)ptr)[3] = 0; + ((char*)ptr)[4] = 0; + ((char*)ptr)[5] = 0; + ((char*)ptr)[6] = 0; + ((char*)ptr)[7] = 0; + } + else { + *(uint64_t*)ptr = 0; + } +#endif +} + +template +EASY_FORCE_INLINE void unaligned_store16(void* ptr, T val) +{ + static_assert(sizeof(T) == 2, "16 bit type required."); +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + *(T*)ptr = val; +#else + const char* const temp = (char*)&val; + ((char*)ptr)[0] = temp[0]; + ((char*)ptr)[1] = temp[1]; +#endif +} + +template +EASY_FORCE_INLINE void unaligned_store32(void* ptr, T val) +{ + static_assert(sizeof(T) == 4, "32 bit type required."); +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + *(T*)ptr = val; +#else + const char* const temp = (char*)&val; + ((char*)ptr)[0] = temp[0]; + ((char*)ptr)[1] = temp[1]; + ((char*)ptr)[2] = temp[2]; + ((char*)ptr)[3] = temp[3]; +#endif +} + +template +EASY_FORCE_INLINE void unaligned_store64(void* ptr, T val) +{ + static_assert(sizeof(T) == 8, "64 bit type required."); +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + *(T*)ptr = val; +#else + const char* const temp = (char*)&val; + // Assume unaligned is more common. + if (!is_aligned(ptr)) { + ((char*)ptr)[0] = temp[0]; + ((char*)ptr)[1] = temp[1]; + ((char*)ptr)[2] = temp[2]; + ((char*)ptr)[3] = temp[3]; + ((char*)ptr)[4] = temp[4]; + ((char*)ptr)[5] = temp[5]; + ((char*)ptr)[6] = temp[6]; + ((char*)ptr)[7] = temp[7]; + } + else { + *(T*)ptr = val; + } +#endif +} + +template +EASY_FORCE_INLINE T unaligned_load16(const void* ptr) +{ + static_assert(sizeof(T) == 2, "16 bit type required."); +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + return *(T*)ptr; +#else + T value; + ((char*)&value)[0] = ((char*)ptr)[0]; + ((char*)&value)[1] = ((char*)ptr)[1]; + return value; +#endif +} + +template +EASY_FORCE_INLINE T unaligned_load16(const void* ptr, T* val) +{ + static_assert(sizeof(T) == 2, "16 bit type required."); +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + *val = *(T*)ptr; + return *val; +#else + ((char*)val)[0] = ((char*)ptr)[0]; + ((char*)val)[1] = ((char*)ptr)[1]; + return *val; +#endif +} + +template +EASY_FORCE_INLINE T unaligned_load32(const void* ptr) +{ + static_assert(sizeof(T) == 4, "32 bit type required."); +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + return *(T*)ptr; +#else + T value; + ((char*)&value)[0] = ((char*)ptr)[0]; + ((char*)&value)[1] = ((char*)ptr)[1]; + ((char*)&value)[2] = ((char*)ptr)[2]; + ((char*)&value)[3] = ((char*)ptr)[3]; + return value; +#endif +} + +template +EASY_FORCE_INLINE T unaligned_load32(const void* ptr, T* val) +{ + static_assert(sizeof(T) == 4, "32 bit type required."); +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + *val = *(T*)ptr; +#else + ((char*)&val)[0] = ((char*)ptr)[0]; + ((char*)&val)[1] = ((char*)ptr)[1]; + ((char*)&val)[2] = ((char*)ptr)[2]; + ((char*)&val)[3] = ((char*)ptr)[3]; + return *val; +#endif +} + +template +EASY_FORCE_INLINE T unaligned_load64(const void* ptr) +{ + static_assert(sizeof(T) == 8, "64 bit type required."); +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + return *(T*)ptr; +#else + if (!is_aligned(ptr)) { + T value; + ((char*)&value)[0] = ((char*)ptr)[0]; + ((char*)&value)[1] = ((char*)ptr)[1]; + ((char*)&value)[2] = ((char*)ptr)[2]; + ((char*)&value)[3] = ((char*)ptr)[3]; + ((char*)&value)[4] = ((char*)ptr)[4]; + ((char*)&value)[5] = ((char*)ptr)[5]; + ((char*)&value)[6] = ((char*)ptr)[6]; + ((char*)&value)[7] = ((char*)ptr)[7]; + return value; + } + else { + return *(T*)ptr; + } +#endif +} + +template +EASY_FORCE_INLINE T unaligned_load64(const void* ptr, T* val) +{ + static_assert(sizeof(T) == 8, "64 bit type required."); +#ifndef EASY_ENABLE_STRICT_ALIGNMENT + *val = *(T*)ptr; +#else + if (!is_aligned(ptr)) { + ((char*)&val)[0] = ((char*)ptr)[0]; + ((char*)&val)[1] = ((char*)ptr)[1]; + ((char*)&val)[2] = ((char*)ptr)[2]; + ((char*)&val)[3] = ((char*)ptr)[3]; + ((char*)&val)[4] = ((char*)ptr)[4]; + ((char*)&val)[5] = ((char*)ptr)[5]; + ((char*)&val)[6] = ((char*)ptr)[6]; + ((char*)&val)[7] = ((char*)ptr)[7]; + return *val; + } + else { + *val = *(T*)ptr; + return *val; + } +#endif +} + +////////////////////////////////////////////////////////////////////////// + +template +class chunk_allocator +{ + struct chunk { EASY_ALIGNED(char, data[N], EASY_ALIGNMENT_SIZE); chunk* prev = nullptr; }; + + struct chunk_list + { + chunk* last; + + chunk_list() : last(nullptr) + { + static_assert(sizeof(char) == 1, "easy_profiler logic error: sizeof(char) != 1 for this platform! Please, contact easy_profiler authors to resolve your problem."); + emplace_back(); + } + + ~chunk_list() + { + do free_last(); while (last != nullptr); + } + + void clear_all_except_last() + { + while (last->prev != nullptr) + free_last(); + zero_last_chunk_size(); + } + + void emplace_back() + { + auto prev = last; + last = ::new (EASY_MALLOC(sizeof(chunk), EASY_ALIGNMENT_SIZE)) chunk(); + last->prev = prev; + zero_last_chunk_size(); + } + + /** Invert current chunks list to enable to iterate over chunks list in direct order. + + This method is used by serialize(). + */ + void invert() + { + chunk* next = nullptr; + + while (last->prev != nullptr) { + auto p = last->prev; + last->prev = next; + next = last; + last = p; + } + + last->prev = next; + } + + private: + + chunk_list(const chunk_list&) = delete; + chunk_list(chunk_list&&) = delete; + + void free_last() + { + auto p = last; + last = last->prev; + EASY_FREE(p); + } + + void zero_last_chunk_size() + { + // Although there is no need for unaligned access stuff b/c a new chunk will + // usually be at least 8 byte aligned (and we only need 2 byte alignment), + // this is the only way I have been able to get rid of the GCC strict-aliasing warning + // without using std::memset. It's an extra line, but is just as fast as *(uint16_t*)last->data = 0; + char* const data = last->data; + *(uint16_t*)data = (uint16_t)0; + } + }; + + // Used in serialize(): workaround for no constexpr support in MSVC 2013. + static const int_fast32_t MAX_CHUNK_OFFSET = N - sizeof(uint16_t); + static const uint16_t N_MINUS_ONE = N - 1; + + chunk_list m_chunks; ///< List of chunks. + uint32_t m_size; ///< Number of elements stored(# of times allocate() has been called.) + uint16_t m_chunkOffset; ///< Number of bytes used in the current chunk. + +public: + + chunk_allocator() : m_size(0), m_chunkOffset(0) + { + } + + /** Allocate n bytes. + + Automatically checks if there is enough preserved memory to store additional n bytes + and allocates additional buffer if needed. + */ + void* allocate(uint16_t n) + { + ++m_size; + + if (!need_expand(n)) + { + // Temp to avoid extra load due to this* aliasing. + uint16_t chunkOffset = m_chunkOffset; + char* data = m_chunks.last->data + chunkOffset; + chunkOffset += n + sizeof(uint16_t); + m_chunkOffset = chunkOffset; + + unaligned_store16(data, n); + data += sizeof(uint16_t); + + // If there is enough space for at least another payload size, + // set it to zero. + if (chunkOffset < N_MINUS_ONE) + unaligned_zero16(data + n); + + return data; + } + + m_chunkOffset = n + sizeof(uint16_t); + m_chunks.emplace_back(); + + char* data = m_chunks.last->data; + unaligned_store16(data, n); + data += sizeof(uint16_t); + + // We assume here that it takes more than one element to fill a chunk. + unaligned_zero16(data + n); + + return data; + } + + /** Check if current storage is not enough to store additional n bytes. + */ + bool need_expand(uint16_t n) const + { + return (m_chunkOffset + n + sizeof(uint16_t)) > N; + } + + uint32_t size() const + { + return m_size; + } + + bool empty() const + { + return m_size == 0; + } + + void clear() + { + m_size = 0; + m_chunkOffset = 0; + m_chunks.clear_all_except_last(); // There is always at least one chunk + } + + /** Serialize data to stream. + + \warning Data will be cleared after serialization. + */ + void serialize(profiler::OStream& _outputStream) + { + // Chunks are stored in reversed order (stack). + // To be able to iterate them in direct order we have to invert the chunks list. + m_chunks.invert(); + + // Each chunk is an array of N bytes that can hold between + // 1(if the list isn't empty) and however many elements can fit in a chunk, + // where an element consists of a payload size + a payload as follows: + // elementStart[0..1]: size as a uint16_t + // elementStart[2..size-1]: payload. + + // The maximum chunk offset is N-sizeof(uint16_t) b/c, if we hit that (or go past), + // there is either no space left, 1 byte left, or 2 bytes left, all of which are + // too small to cary more than a zero-sized element. + + chunk* current = m_chunks.last; + do { + const char* data = current->data; + int_fast32_t chunkOffset = 0; // signed int so overflow is not checked. + uint16_t payloadSize = unaligned_load16(data); + while (chunkOffset < MAX_CHUNK_OFFSET && payloadSize != 0) { + const uint16_t chunkSize = sizeof(uint16_t) + payloadSize; + _outputStream.write(data, chunkSize); + data += chunkSize; + chunkOffset += chunkSize; + unaligned_load16(data, &payloadSize); + } + + current = current->prev; + } while (current != nullptr); + + clear(); + } + +private: + + chunk_allocator(const chunk_allocator&) = delete; + chunk_allocator(chunk_allocator&&) = delete; + +}; // END of class chunk_allocator. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER_CHUNK_ALLOCATOR_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/cmake/config.cmake.in b/3rdparty/easyprofiler/easy_profiler_core/cmake/config.cmake.in new file mode 100644 index 0000000..9b4c9ee --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/cmake/config.cmake.in @@ -0,0 +1,4 @@ +@PACKAGE_INIT@ + +include("${CMAKE_CURRENT_LIST_DIR}/@targets_export_name@.cmake") +check_required_components("@PROJECT_NAME@") diff --git a/3rdparty/easyprofiler/easy_profiler_core/cmake_install.cmake b/3rdparty/easyprofiler/easy_profiler_core/cmake_install.cmake new file mode 100644 index 0000000..89b2d40 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/cmake_install.cmake @@ -0,0 +1,104 @@ +# Install script for directory: /home/alex/Work/C++Projects/easyprofiler/easy_profiler_core + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/easy_profiler" TYPE FILE FILES + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/generated/easy_profilerConfig.cmake" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/generated/easy_profilerConfigVersion.cmake" + ) +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/include/easy" TYPE FILE FILES + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/arbitrary_value.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/easy_net.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/easy_socket.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/profiler.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/reader.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/serialized_block.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_aux.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_public_types.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/details/easy_compiler_support.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/details/profiler_aux.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/details/profiler_colors.h" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include/easy/details/profiler_public_types.h" + ) +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/." TYPE FILE FILES + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/LICENSE.MIT" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/LICENSE.APACHE" + ) +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/libeasy_profiler.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/libeasy_profiler.so") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/libeasy_profiler.so" + RPATH "$ORIGIN") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE SHARED_LIBRARY FILES "/home/alex/Work/C++Projects/easyprofiler/bin/libeasy_profiler.so") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/libeasy_profiler.so" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/libeasy_profiler.so") + file(RPATH_CHANGE + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/libeasy_profiler.so" + OLD_RPATH ":::::::" + NEW_RPATH "$ORIGIN") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/libeasy_profiler.so") + endif() + endif() +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/easy_profiler/easy_profilerTargets.cmake") + file(DIFFERENT EXPORT_FILE_CHANGED FILES + "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/easy_profiler/easy_profilerTargets.cmake" + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets.cmake") + if(EXPORT_FILE_CHANGED) + file(GLOB OLD_CONFIG_FILES "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/easy_profiler/easy_profilerTargets-*.cmake") + if(OLD_CONFIG_FILES) + message(STATUS "Old export file \"$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/lib/cmake/easy_profiler/easy_profilerTargets.cmake\" will be replaced. Removing files [${OLD_CONFIG_FILES}].") + file(REMOVE ${OLD_CONFIG_FILES}) + endif() + endif() + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/easy_profiler" TYPE FILE FILES "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets.cmake") + if("${CMAKE_INSTALL_CONFIG_NAME}" MATCHES "^([Rr][Ee][Ll][Ee][Aa][Ss][Ee])$") + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/cmake/easy_profiler" TYPE FILE FILES "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/Export/lib/cmake/easy_profiler/easy_profilerTargets-release.cmake") + endif() +endif() + diff --git a/3rdparty/easyprofiler/easy_profiler_core/current_thread.h b/3rdparty/easyprofiler/easy_profiler_core/current_thread.h new file mode 100644 index 0000000..816979c --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/current_thread.h @@ -0,0 +1,79 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_CURRENT_THREAD_H +#define EASY_PROFILER_CURRENT_THREAD_H + +#include + +#ifdef _WIN32 +# include +#elif defined(__APPLE__) +# include +# include +#else +# include +# include +# include +#endif + +inline profiler::thread_id_t getCurrentThreadId() +{ +#ifdef _WIN32 + return (profiler::thread_id_t)::GetCurrentThreadId(); +#elif defined(__APPLE__) +# if (defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_6) || \ + (defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0) + EASY_THREAD_LOCAL static uint64_t _id = 0; + if (!_id) + pthread_threadid_np(NULL, &_id); + return (profiler::thread_id_t)_id; +# else + return (profiler::thread_id_t)pthread_self(); +# endif +#else + EASY_THREAD_LOCAL static const profiler::thread_id_t _id = (profiler::thread_id_t)syscall(__NR_gettid); + return _id; +#endif +} + +#endif // EASY_PROFILER_CURRENT_THREAD_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/current_time.h b/3rdparty/easyprofiler/easy_profiler_core/current_time.h new file mode 100644 index 0000000..b08224e --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/current_time.h @@ -0,0 +1,174 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_CURRENT_TIME_H +#define EASY_PROFILER_CURRENT_TIME_H + +#include + +#if defined(_MSC_VER) && _MSC_VER <= 1800 +// std::chrono for MSVC2013 is broken - it has very low resolution of 16ms +// restrict usage of std::chrono +# if EASY_CHRONO_HIGHRES_CLOCK +# undef EASY_CHRONO_HIGHRES_CLOCK +# endif +# if EASY_CHRONO_STEADY_CLOCK +# undef EASY_CHRONO_STEADY_CLOCK +# endif +#endif + +#if EASY_CHRONO_HIGHRES_CLOCK +# include +# define EASY_CHRONO_CLOCK std::chrono::high_resolution_clock +#elif EASY_CHRONO_STEADY_CLOCK +# include +# define EASY_CHRONO_CLOCK std::chrono::steady_clock +#elif defined(_WIN32) +# include +#else +# include +# include +# ifdef __ARM_ARCH +# include +# endif//__ARM_ARCH +#endif + +static inline profiler::timestamp_t getCurrentTime() +{ +#if EASY_CHRONO_HIGHRES_CLOCK || EASY_CHRONO_STEADY_CLOCK + return (profiler::timestamp_t)EASY_CHRONO_CLOCK::now().time_since_epoch().count(); +#elif defined(_WIN32) + //see https://msdn.microsoft.com/library/windows/desktop/dn553408(v=vs.85).aspx + LARGE_INTEGER elapsedMicroseconds; + if (!QueryPerformanceCounter(&elapsedMicroseconds)) + return 0; + return (profiler::timestamp_t)elapsedMicroseconds.QuadPart; +#else// not _WIN32 + +#if (defined(__GNUC__) || defined(__ICC)) + + // part of code from google/benchmark library (Licensed under the Apache License, Version 2.0) + // see https://github.com/google/benchmark/blob/master/src/cycleclock.h#L111 + #if defined(__i386__) + int64_t ret; + __asm__ volatile("rdtsc" : "=A"(ret)); + return ret; + #elif defined(__x86_64__) || defined(__amd64__) + uint64_t low, high; + __asm__ volatile("rdtsc" : "=a"(low), "=d"(high)); + return (high << 32) | low; + #elif defined(__powerpc__) || defined(__ppc__) + // This returns a time-base, which is not always precisely a cycle-count. + int64_t tbl, tbu0, tbu1; + asm("mftbu %0" : "=r"(tbu0)); + asm("mftb %0" : "=r"(tbl)); + asm("mftbu %0" : "=r"(tbu1)); + tbl &= -static_cast(tbu0 == tbu1); + // high 32 bits in tbu1; low 32 bits in tbl (tbu0 is garbage) + return (tbu1 << 32) | tbl; + #elif defined(__sparc__) + int64_t tick; + asm(".byte 0x83, 0x41, 0x00, 0x00"); + asm("mov %%g1, %0" : "=r"(tick)); + return tick; + #elif defined(__ia64__) + int64_t itc; + asm("mov %0 = ar.itc" : "=r"(itc)); + return itc; + #elif defined(COMPILER_MSVC) && defined(_M_IX86) + // Older MSVC compilers (like 7.x) don't seem to support the + // __rdtsc intrinsic properly, so I prefer to use _asm instead + // when I know it will work. Otherwise, I'll use __rdtsc and hope + // the code is being compiled with a non-ancient compiler. + _asm rdtsc + #elif defined(COMPILER_MSVC) + return __rdtsc(); + #elif defined(__aarch64__) + // System timer of ARMv8 runs at a different frequency than the CPU's. + // The frequency is fixed, typically in the range 1-50MHz. It can be + // read at CNTFRQ special register. We assume the OS has set up + // the virtual timer properly. + int64_t virtual_timer_value; + asm volatile("mrs %0, cntvct_el0" : "=r"(virtual_timer_value)); + return virtual_timer_value; + #elif defined(__ARM_ARCH) + #if (__ARM_ARCH >= 6) // V6 is the earliest arch that has a standard cyclecount + uint32_t pmccntr; + uint32_t pmuseren; + uint32_t pmcntenset; + // Read the user mode perf monitor counter access permissions. + asm volatile("mrc p15, 0, %0, c9, c14, 0" : "=r"(pmuseren)); + if (pmuseren & 1) { // Allows reading perfmon counters for user mode code. + asm volatile("mrc p15, 0, %0, c9, c12, 1" : "=r"(pmcntenset)); + if (pmcntenset & 0x80000000ul) { // Is it counting? + asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(pmccntr)); + // The counter is set up to count every 64th cycle + return static_cast(pmccntr) * 64; // Should optimize to << 6 + } + } + #endif + struct timeval tv; + gettimeofday(&tv, nullptr); + return static_cast(tv.tv_sec) * 1000000 + tv.tv_usec; + #elif defined(__mips__) + // mips apparently only allows rdtsc for superusers, so we fall + // back to gettimeofday. It's possible clock_gettime would be better. + struct timeval tv; + gettimeofday(&tv, nullptr); + return static_cast(tv.tv_sec) * 1000000 + tv.tv_usec; + #else + #warning You need to define fast getCurrentTime() for your OS and CPU + return std::chrono::high_resolution_clock::now().time_since_epoch().count(); + #define EASY_CHRONO_CLOCK std::chrono::high_resolution_clock + #endif + +#else // not _WIN32, __GNUC__, __ICC + #warning You need to define fast getCurrentTime() for your OS and CPU + return std::chrono::high_resolution_clock::now().time_since_epoch().count(); + #define EASY_CHRONO_CLOCK std::chrono::high_resolution_clock +#endif + +#endif +} + + +#endif // EASY_PROFILER_CURRENT_TIME_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/easy_socket.cpp b/3rdparty/easyprofiler/easy_profiler_core/easy_socket.cpp new file mode 100644 index 0000000..05f6308 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/easy_socket.cpp @@ -0,0 +1,431 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of +* MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); +You may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +**/ + +#include +#include +#include +#include + +#if defined(_WIN32) +# pragma comment (lib, "Ws2_32.lib") +# pragma comment (lib, "Mswsock.lib") +# pragma comment (lib, "AdvApi32.lib") +# ifdef max +# undef max +# endif +#else +# include +# include +#endif + +///////////////////////////////////////////////////////////////// + +#if defined(_WIN32) +const int SOCK_ABORTED = WSAECONNABORTED; +const int SOCK_RESET = WSAECONNRESET; +const int SOCK_IN_PROGRESS = WSAEINPROGRESS; +#else +const int SOCK_ABORTED = ECONNABORTED; +const int SOCK_RESET = ECONNRESET; +const int SOCK_IN_PROGRESS = EINPROGRESS; +const int SOCK_BROKEN_PIPE = EPIPE; +const int SOCK_ENOENT = ENOENT; +#endif + +const int SEND_BUFFER_SIZE = 64 * 1024 * 1024; + +///////////////////////////////////////////////////////////////// + +static int closeSocket(EasySocket::socket_t s) +{ +#if defined(_WIN32) + return ::closesocket(s); +#else + return ::close(s); +#endif +} + +///////////////////////////////////////////////////////////////// + +bool EasySocket::checkSocket(socket_t s) const +{ + return s > 0; +} + +void EasySocket::setBlocking(EasySocket::socket_t s, bool blocking) +{ +#if defined(_WIN32) + u_long iMode = blocking ? 0 : 1;//0 - blocking, 1 - non blocking + ::ioctlsocket(s, FIONBIO, &iMode); +#else + int iMode = blocking ? 0 : 1;//0 - blocking, 1 - non blocking + ::ioctl(s, FIONBIO, (char*)&iMode); +#endif +} + +int EasySocket::bind(uint16_t port) +{ + if (!checkSocket(m_socket)) + return -1; + + struct sockaddr_in serv_addr; + memset(&serv_addr, 0, sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = INADDR_ANY; + serv_addr.sin_port = htons(port); + auto res = ::bind(m_socket, (struct sockaddr*)&serv_addr, sizeof(serv_addr)); + + return res; +} + +void EasySocket::flush() +{ + if (m_socket) + closeSocket(m_socket); + + if (m_replySocket != m_socket) + closeSocket(m_replySocket); + +#if defined(_WIN32) + m_socket = 0; + m_replySocket = 0; +#else + m_wsaret = 0; +#endif +} + +void EasySocket::checkResult(int result) +{ + if (result >= 0) + { + m_state = ConnectionState::Connected; + return; + } + + if (result == -1) // is this check necessary? + { +#if defined(_WIN32) + const int error_code = WSAGetLastError(); +#else + const int error_code = errno; +#endif + + switch (error_code) + { + case SOCK_ABORTED: + case SOCK_RESET: +#if !defined(_WIN32) + case SOCK_BROKEN_PIPE: + case SOCK_ENOENT: +#endif + m_state = ConnectionState::Disconnected; + break; + + case SOCK_IN_PROGRESS: + m_state = ConnectionState::Connecting; + break; + + default: + break; + } + } +} + +void EasySocket::init() +{ + if (m_wsaret != 0) + return; + +#if !defined(_WIN32) + const int protocol = 0; +#else + const int protocol = IPPROTO_TCP; +#endif + + m_socket = ::socket(AF_INET, SOCK_STREAM, protocol); + if (!checkSocket(m_socket)) + return; + + setBlocking(m_socket, true); + +#if !defined(_WIN32) + m_wsaret = 1; +#endif + + const int opt = 1; + ::setsockopt(m_socket, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(int)); +} + +EasySocket::ConnectionState EasySocket::state() const +{ + return m_state; +} + +bool EasySocket::isDisconnected() const +{ + return static_cast(m_state) <= 0; +} + +bool EasySocket::isConnected() const +{ + return m_state == ConnectionState::Connected; +} + +EasySocket::EasySocket() +{ +#if defined(_WIN32) + WSADATA wsaData; + m_wsaret = WSAStartup(0x101, &wsaData); +#else + m_wsaret = 0; +#endif + + init(); +} + +EasySocket::~EasySocket() +{ + flush(); + +#if defined(_WIN32) + if (m_wsaret == 0) + WSACleanup(); +#endif +} + +void EasySocket::setReceiveTimeout(int milliseconds) +{ + if (!isConnected() || !checkSocket(m_replySocket)) + return; + + if (milliseconds <= 0) + milliseconds = std::numeric_limits::max() / 1000; + +#if defined(_WIN32) + const DWORD timeout = static_cast(milliseconds); + ::setsockopt(m_replySocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(DWORD)); +#else + struct timeval tv; + if (milliseconds >= 1000) + { + const int s = milliseconds / 1000; + const int us = (milliseconds - s * 1000) * 1000; + tv.tv_sec = s; + tv.tv_usec = us; + } + else + { + tv.tv_sec = 0; + tv.tv_usec = milliseconds * 1000; + } + + ::setsockopt(m_replySocket, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof (struct timeval)); +#endif +} + +int EasySocket::send(const void* buffer, size_t nbytes) +{ + if (!checkSocket(m_replySocket)) + return -1; + +#if defined(_WIN32) || defined(__APPLE__) + const int res = ::send(m_replySocket, (const char*)buffer, (int)nbytes, 0); +#else + const int res = (int)::send(m_replySocket, buffer, nbytes, MSG_NOSIGNAL); +#endif + + checkResult(res); + + return res; +} + +int EasySocket::receive(void* buffer, size_t nbytes) +{ + if (!checkSocket(m_replySocket)) + return -1; + +#if defined(_WIN32) + const int res = ::recv(m_replySocket, (char*)buffer, (int)nbytes, 0); +#else + const int res = (int)::read(m_replySocket, buffer, nbytes); +#endif + + checkResult(res); + if (res == 0) + m_state = ConnectionState::Disconnected; + + return res; +} + +int EasySocket::listen(int count) +{ + if (!checkSocket(m_socket)) + return -1; + + const int res = ::listen(m_socket, count); + checkResult(res); + + return res; +} + +int EasySocket::accept() +{ + if (!checkSocket(m_socket)) + return -1; + + fd_set fdread; + FD_ZERO (&fdread); + FD_SET (m_socket, &fdread); + + fd_set fdwrite = fdread; + fd_set fdexcl = fdread; + + struct timeval tv { 0, 500 }; + const int rc = ::select((int)m_socket + 1, &fdread, &fdwrite, &fdexcl, &tv); + if (rc <= 0) + return -1; // there is no connection for accept + + m_replySocket = ::accept(m_socket, nullptr, nullptr); + checkResult((int)m_replySocket); + + if (checkSocket(m_replySocket)) + { + ::setsockopt(m_replySocket, SOL_SOCKET, SO_SNDBUF, (char*)&SEND_BUFFER_SIZE, sizeof(int)); + + //const int flag = 1; + //const int result = setsockopt(m_replySocket,IPPROTO_TCP,TCP_NODELAY,(char *)&flag,sizeof(int)); + +#if defined(__APPLE__) + // Apple doesn't have MSG_NOSIGNAL, work around it + const int value = 1; + ::setsockopt(m_replySocket, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value)); +#endif + + //setBlocking(m_replySocket,true); + } + + return (int)m_replySocket; +} + +bool EasySocket::setAddress(const char* address, uint16_t port) +{ + m_server = ::gethostbyname(address); + if (m_server == nullptr) + return false; + + memset((char*)&m_serverAddress, 0, sizeof(m_serverAddress)); + m_serverAddress.sin_family = AF_INET; + memcpy((char*)&m_serverAddress.sin_addr.s_addr, (char*)m_server->h_addr, (size_t)m_server->h_length); + + m_serverAddress.sin_port = htons(port); + + return true; +} + +int EasySocket::connect() +{ + if (m_server == nullptr || m_socket <= 0) + return -1; + + int res = 0; + //TODO: more intelligence +#if !defined(_WIN32) + setBlocking(m_socket, false); + + const int sleepMs = 20; + const int waitSec = 1; + const int waitMs = waitSec * 1000 / sleepMs; + + for (int counter = 0; counter++ < waitMs;) + { + res = ::connect(m_socket, (struct sockaddr*)&m_serverAddress, sizeof(m_serverAddress)); + +#if defined(__APPLE__) + // on Apple, treat EISCONN error as success + if (res == -1 && errno == EISCONN) + { + res = 0; + break; + } +#endif + + checkResult(res); + if (res == 0) + { + break; + } + + if (m_state == ConnectionState::Connecting) + { + std::this_thread::sleep_for(std::chrono::milliseconds(sleepMs)); + continue; + } + + if (isDisconnected()) + { + break; + } + } + + setBlocking(m_socket, true); +#else + res = ::connect(m_socket, (struct sockaddr*)&m_serverAddress, sizeof(m_serverAddress)); + checkResult(res); +#endif + + if (res == 0) + { + struct timeval tv; + tv.tv_sec = 1; + tv.tv_usec = 0; + ::setsockopt(m_socket, SOL_SOCKET, SO_RCVTIMEO, (char*)&tv, sizeof(struct timeval)); + +#if defined(__APPLE__) + // Apple doesn't have MSG_NOSIGNAL, work around it + const int value = 1; + setsockopt(m_socket, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value)); +#endif + + m_replySocket = m_socket; + } + + return res; +} diff --git a/3rdparty/easyprofiler/easy_profiler_core/event_trace_status.h b/3rdparty/easyprofiler/easy_profiler_core/event_trace_status.h new file mode 100644 index 0000000..12c4476 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/event_trace_status.h @@ -0,0 +1,27 @@ + + + +#ifndef EASY_PROFILER__EVENT_TRACE_STATUS__H_ +#define EASY_PROFILER__EVENT_TRACE_STATUS__H_ + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +namespace profiler { + + enum EventTracingEnableStatus : unsigned char + { + EVENT_TRACING_LAUNCHED_SUCCESSFULLY = 0, + EVENT_TRACING_NOT_ENOUGH_ACCESS_RIGHTS, + EVENT_TRACING_WAS_LAUNCHED_BY_SOMEBODY_ELSE, + EVENT_TRACING_BAD_PROPERTIES_SIZE, + EVENT_TRACING_OPEN_TRACE_ERROR, + EVENT_TRACING_MISTERIOUS_ERROR, + }; + +} // END of namespace profiler. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER__EVENT_TRACE_STATUS__H_ diff --git a/3rdparty/easyprofiler/easy_profiler_core/event_trace_win.cpp b/3rdparty/easyprofiler/easy_profiler_core/event_trace_win.cpp new file mode 100644 index 0000000..871a797 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/event_trace_win.cpp @@ -0,0 +1,550 @@ +/************************************************************************ +* file name : event_trace_win.cpp +* ----------------- : +* creation time : 2016/09/04 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of EasyEventTracer class used for tracing +* : Windows system events to get context switches. +* ----------------- : +* change log : * 2016/09/04 Victor Zarubkin: initial commit. +* : +* : * 2016/09/13 Victor Zarubkin: get process id and process name +* : of the owner of thread with id == CSwitch::NewThreadId. +* : +* : * 2016/09/17 Victor Zarubkin: added log messages printing. +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifdef _WIN32 +#include +#include +#include +#include +#include "profile_manager.h" +#include "current_time.h" + +#include "event_trace_win.h" +#include + +#ifdef __MINGW32__ +#include +#endif + +//#include + +#if EASY_OPTION_LOG_ENABLED != 0 +# include + +# ifndef EASY_ERRORLOG +# define EASY_ERRORLOG ::std::cerr +# endif + +# ifndef EASY_LOG +# define EASY_LOG ::std::cerr +# endif + +# ifndef EASY_ERROR +# define EASY_ERROR(LOG_MSG) EASY_ERRORLOG << "EasyProfiler ERROR: " << LOG_MSG +# endif + +# ifndef EASY_WARNING +# define EASY_WARNING(LOG_MSG) EASY_ERRORLOG << "EasyProfiler WARNING: " << LOG_MSG +# endif + +# ifndef EASY_LOGMSG +# define EASY_LOGMSG(LOG_MSG) EASY_LOG << "EasyProfiler INFO: " << LOG_MSG +# endif + +# ifndef EASY_LOG_ONLY +# define EASY_LOG_ONLY(CODE) CODE +# endif + +#else + +# ifndef EASY_ERROR +# define EASY_ERROR(LOG_MSG) +# endif + +# ifndef EASY_WARNING +# define EASY_WARNING(LOG_MSG) +# endif + +# ifndef EASY_LOGMSG +# define EASY_LOGMSG(LOG_MSG) +# endif + +# ifndef EASY_LOG_ONLY +# define EASY_LOG_ONLY(CODE) +# endif + +#endif + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +//extern ProfileManager& MANAGER; +#define MANAGER ProfileManager::instance() + +extern const ::profiler::color_t EASY_COLOR_INTERNAL_EVENT; + +#ifdef __MINGW32__ +::std::atomic TRACING_END_TIME = ATOMIC_VAR_INIT(~0ULL); +char KERNEL_LOGGER[] = KERNEL_LOGGER_NAME; +#else +::std::atomic_uint64_t TRACING_END_TIME = ATOMIC_VAR_INIT(~0ULL); +#endif + +namespace profiler { + + const decltype(EVENT_DESCRIPTOR::Opcode) SWITCH_CONTEXT_OPCODE = 36; + const int RAW_TIMESTAMP_TIME_TYPE = 1; + + ////////////////////////////////////////////////////////////////////////// + + struct ProcessInfo { + std::string name; + processid_t id = 0; + int8_t valid = 0; + }; + + ////////////////////////////////////////////////////////////////////////// + + // CSwitch class + // See https://msdn.microsoft.com/en-us/library/windows/desktop/aa964744(v=vs.85).aspx + // EventType = 36 + struct CSwitch + { + uint32_t NewThreadId; + uint32_t OldThreadId; + int8_t NewThreadPriority; + int8_t OldThreadPriority; + uint8_t PreviousCState; + int8_t SpareByte; + int8_t OldThreadWaitReason; + int8_t OldThreadWaitMode; + int8_t OldThreadState; + int8_t OldThreadWaitIdealProcessor; + uint32_t NewThreadWaitTime; + uint32_t Reserved; + }; + + ////////////////////////////////////////////////////////////////////////// + + struct do_not_calc_hash { + template inline size_t operator()(T _value) const { + return static_cast(_value); + } + }; + + typedef ::std::unordered_map thread_process_info_map; + typedef ::std::unordered_map process_info_map; + + // Using static is safe because processTraceEvent() is called from one thread + process_info_map PROCESS_INFO_TABLE; + thread_process_info_map THREAD_PROCESS_INFO_TABLE = ([](){ thread_process_info_map initial; initial[0U] = nullptr; return ::std::move(initial); })(); + + ////////////////////////////////////////////////////////////////////////// + + void WINAPI processTraceEvent(PEVENT_RECORD _traceEvent) + { + if (_traceEvent->EventHeader.EventDescriptor.Opcode != SWITCH_CONTEXT_OPCODE) + return; + + if (sizeof(CSwitch) != _traceEvent->UserDataLength) + return; + + EASY_FUNCTION(EASY_COLOR_INTERNAL_EVENT, ::profiler::OFF); + + auto _contextSwitchEvent = reinterpret_cast(_traceEvent->UserData); + const auto time = static_cast<::profiler::timestamp_t>(_traceEvent->EventHeader.TimeStamp.QuadPart); + if (time > TRACING_END_TIME.load(::std::memory_order_acquire)) + return; + + DWORD pid = 0; + const char* process_name = ""; + + // Trying to get target process name and id + auto it = THREAD_PROCESS_INFO_TABLE.find(_contextSwitchEvent->NewThreadId); + if (it == THREAD_PROCESS_INFO_TABLE.end()) + { + auto hThread = OpenThread(THREAD_QUERY_LIMITED_INFORMATION, FALSE, _contextSwitchEvent->NewThreadId); + if (hThread != nullptr) + { + pid = GetProcessIdOfThread(hThread); + auto pinfo = &PROCESS_INFO_TABLE[pid]; + + if (pinfo->valid == 0) + { + if (pinfo->name.empty()) + { + static char numbuf[128] = {}; + sprintf(numbuf, "%u", pid); + pinfo->name = numbuf; + pinfo->id = pid; + } + + /* + According to documentation, using GetModuleBaseName() requires + PROCESS_QUERY_INFORMATION | PROCESS_VM_READ access rights. + But it works fine with PROCESS_QUERY_LIMITED_INFORMATION instead of PROCESS_QUERY_INFORMATION. + + See https://msdn.microsoft.com/en-us/library/windows/desktop/ms683196(v=vs.85).aspx + */ + + //auto hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid); + //if (hProc == nullptr) + auto hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION | PROCESS_VM_READ, FALSE, pid); + if (hProc != nullptr) + { + static TCHAR buf[MAX_PATH] = {}; // Using static is safe because processTraceEvent() is called from one thread + auto len = GetModuleBaseName(hProc, 0, buf, MAX_PATH); + + if (len != 0) + { + pinfo->name.reserve(pinfo->name.size() + 2 + len); + pinfo->name.append(" ", 1); + pinfo->name.append(buf, len); + pinfo->valid = 1; + } + + CloseHandle(hProc); + } + else + { + //auto err = GetLastError(); + //printf("OpenProcess(%u) fail: GetLastError() == %u\n", pid, err); + pinfo->valid = -1; + + if (pid == 4) { + pinfo->name.reserve(pinfo->name.size() + 8); + pinfo->name.append(" System", 7); + } + } + } + + process_name = pinfo->name.c_str(); + THREAD_PROCESS_INFO_TABLE[_contextSwitchEvent->NewThreadId] = pinfo; + + CloseHandle(hThread); + } + else + { + //printf("Can not OpenThread(%u);\n", _contextSwitchEvent->NewThreadId); + THREAD_PROCESS_INFO_TABLE[_contextSwitchEvent->NewThreadId] = nullptr; + } + } + else + { + auto pinfo = it->second; + if (pinfo != nullptr) + process_name = pinfo->name.c_str(); + else if (it->first == 0) + process_name = "System Idle"; + else if (it->first == 4) + process_name = "System"; + } + + MANAGER.beginContextSwitch(_contextSwitchEvent->OldThreadId, time, _contextSwitchEvent->NewThreadId, process_name); + MANAGER.endContextSwitch(_contextSwitchEvent->NewThreadId, pid, time); + } + + ////////////////////////////////////////////////////////////////////////// + +#ifndef EASY_MAGIC_STATIC_AVAILABLE + class EasyEventTracerInstance { + friend EasyEventTracer; + EasyEventTracer instance; + } EASY_EVENT_TRACER; +#endif + + EasyEventTracer& EasyEventTracer::instance() + { +#ifndef EASY_MAGIC_STATIC_AVAILABLE + return EASY_EVENT_TRACER.instance; +#else + static EasyEventTracer tracer; + return tracer; +#endif + } + + EasyEventTracer::EasyEventTracer() + { + m_lowPriority = ATOMIC_VAR_INIT(EASY_OPTION_LOW_PRIORITY_EVENT_TRACING); + } + + EasyEventTracer::~EasyEventTracer() + { + disable(); + } + + bool EasyEventTracer::isLowPriority() const + { + return m_lowPriority.load(::std::memory_order_acquire); + } + + void EasyEventTracer::setLowPriority(bool _value) + { + m_lowPriority.store(_value, ::std::memory_order_release); + } + + bool setPrivilege(HANDLE hToken, LPCSTR _privelegeName) + { + bool success = false; + + if (hToken) + { + LUID privilegyId; + if (LookupPrivilegeValue(NULL, _privelegeName, &privilegyId)) + { + TOKEN_PRIVILEGES tokenPrivilege; + tokenPrivilege.PrivilegeCount = 1; + tokenPrivilege.Privileges[0].Luid = privilegyId; + tokenPrivilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + success = AdjustTokenPrivileges(hToken, FALSE, &tokenPrivilege, sizeof(TOKEN_PRIVILEGES), NULL, NULL) != FALSE; + } + } + + EASY_LOG_ONLY( + if (!success) + EASY_WARNING("Failed to set " << _privelegeName << " privelege for the application.\n"); + ) + + return success; + } + + void EasyEventTracer::setProcessPrivileges() + { + static bool alreadySet = false; + if (alreadySet) + return; + + alreadySet = true; + + HANDLE hToken = nullptr; + if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) + { +#if EASY_OPTION_LOG_ENABLED != 0 + const bool success = setPrivilege(hToken, SE_DEBUG_NAME); + if (!success) + EASY_WARNING("Some context switch events could not get process name.\n"); +#else + setPrivilege(hToken, SE_DEBUG_NAME); +#endif + + CloseHandle(hToken); + } + EASY_LOG_ONLY( + else { + EASY_WARNING("Failed to open process to adjust priveleges.\n"); + } + ) + } + + ::profiler::EventTracingEnableStatus EasyEventTracer::startTrace(bool _force, int _step) + { + auto startTraceResult = StartTrace(&m_sessionHandle, KERNEL_LOGGER_NAME, props()); + switch (startTraceResult) + { + case ERROR_SUCCESS: + return EVENT_TRACING_LAUNCHED_SUCCESSFULLY; + + case ERROR_ALREADY_EXISTS: + { + if (_force) + { + // Try to stop another event tracing session to force launch self session. + + if (_step == 0) + { + /* + According to https://msdn.microsoft.com/en-us/library/windows/desktop/aa363696(v=vs.85).aspx + SessionHandle is ignored (and could be NULL) if SessionName is not NULL, + and you only need to set the Wnode.BufferSize, Wnode.Guid, LoggerNameOffset, and LogFileNameOffset + in EVENT_TRACE_PROPERTIES structure if ControlCode is EVENT_TRACE_CONTROL_STOP. + All data is already set for m_properties to the moment. Simply copy m_properties and use the copy. + + This method supposed to be faster than launching console window and executing shell command, + but if that would not work, return to using shell command "logman stop". + */ + + // static is safe because we are guarded by spin-lock m_spin + static Properties p = ([]{ Properties prp; strncpy(prp.sessionName, KERNEL_LOGGER_NAME, sizeof(prp.sessionName)); return prp; })(); + p.base = m_properties.base; // Use copy of m_properties to make sure m_properties will not be changed + + // Stop another session + ControlTrace((TRACEHANDLE)NULL, KERNEL_LOGGER_NAME, reinterpret_cast(&p), EVENT_TRACE_CONTROL_STOP); + + // Console window variant: + //if (32 >= (int)ShellExecute(NULL, NULL, "logman", "stop \"" KERNEL_LOGGER_NAME "\" -ets", NULL, SW_HIDE)) + // return EVENT_TRACING_WAS_LAUNCHED_BY_SOMEBODY_ELSE; + } + + if (_step < 4) + { + // Command executed successfully. Wait for a few time until tracing session finish. + ::std::this_thread::sleep_for(::std::chrono::milliseconds(500)); + return startTrace(true, ++_step); + } + } + + EASY_ERROR("Event tracing not launched: ERROR_ALREADY_EXISTS. To stop another session execute cmd: logman stop \"" << KERNEL_LOGGER_NAME << "\" -ets\n"); + return EVENT_TRACING_WAS_LAUNCHED_BY_SOMEBODY_ELSE; + } + + case ERROR_ACCESS_DENIED: + EASY_ERROR("Event tracing not launched: ERROR_ACCESS_DENIED. Try to launch your application as Administrator.\n"); + return EVENT_TRACING_NOT_ENOUGH_ACCESS_RIGHTS; + + case ERROR_BAD_LENGTH: + EASY_ERROR("Event tracing not launched: ERROR_BAD_LENGTH. It seems that your KERNEL_LOGGER_NAME differs from \"" << m_properties.sessionName << "\". Try to re-compile easy_profiler or contact EasyProfiler developers.\n"); + return EVENT_TRACING_BAD_PROPERTIES_SIZE; + } + + EASY_ERROR("Event tracing not launched: StartTrace() returned " << startTraceResult << ::std::endl); + + return EVENT_TRACING_MISTERIOUS_ERROR; + } + + ::profiler::EventTracingEnableStatus EasyEventTracer::enable(bool _force) + { + ::profiler::guard_lock<::profiler::spin_lock> lock(m_spin); + if (m_bEnabled) + return EVENT_TRACING_LAUNCHED_SUCCESSFULLY; + + /* + Trying to set debug privilege for current process + to be able to get other process information (process name). + */ + EasyEventTracer::setProcessPrivileges(); + + // Clear properties + memset(&m_properties, 0, sizeof(m_properties)); + m_properties.base.Wnode.BufferSize = sizeof(m_properties); + m_properties.base.Wnode.Flags = WNODE_FLAG_TRACED_GUID; + m_properties.base.Wnode.ClientContext = RAW_TIMESTAMP_TIME_TYPE; + m_properties.base.Wnode.Guid = SystemTraceControlGuid; + m_properties.base.LoggerNameOffset = sizeof(m_properties.base); + m_properties.base.EnableFlags = EVENT_TRACE_FLAG_CSWITCH; + m_properties.base.LogFileMode = EVENT_TRACE_REAL_TIME_MODE; + + // Start event tracing + auto res = startTrace(_force); + if (res != EVENT_TRACING_LAUNCHED_SUCCESSFULLY) + return res; + + memset(&m_trace, 0, sizeof(m_trace)); +#ifdef __MINGW32__ + m_trace.LoggerName = KERNEL_LOGGER; +#else + m_trace.LoggerName = KERNEL_LOGGER_NAME; +#endif + m_trace.ProcessTraceMode = PROCESS_TRACE_MODE_REAL_TIME | PROCESS_TRACE_MODE_EVENT_RECORD | PROCESS_TRACE_MODE_RAW_TIMESTAMP; + m_trace.EventRecordCallback = ::profiler::processTraceEvent; + + m_openedHandle = OpenTrace(&m_trace); + if (m_openedHandle == INVALID_PROCESSTRACE_HANDLE) + { + EASY_ERROR("Event tracing not launched: OpenTrace() returned invalid handle.\n"); + return EVENT_TRACING_OPEN_TRACE_ERROR; + } + + /* + Have to launch a thread to process events because according to MSDN documentation: + + The ProcessTrace function blocks the thread until it delivers all events, the BufferCallback function returns FALSE, + or you call CloseTrace. If the consumer is consuming events in real time, the ProcessTrace function returns after + the controller stops the trace session. (Note that there may be a several-second delay before the function returns.) + + https://msdn.microsoft.com/en-us/library/windows/desktop/aa364093(v=vs.85).aspx + */ + m_processThread = ::std::thread([this](bool _lowPriority) + { + if (_lowPriority) // Set low priority for event tracing thread + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); + EASY_THREAD_SCOPE("EasyProfiler.ETW"); + ProcessTrace(&m_openedHandle, 1, 0, 0); + + }, m_lowPriority.load(::std::memory_order_acquire)); + + m_bEnabled = true; + + EASY_LOGMSG("Event tracing launched\n"); + return EVENT_TRACING_LAUNCHED_SUCCESSFULLY; + } + + void EasyEventTracer::disable() + { + ::profiler::guard_lock<::profiler::spin_lock> lock(m_spin); + if (!m_bEnabled) + return; + + EASY_LOGMSG("Event tracing is stopping...\n"); + + TRACING_END_TIME.store(getCurrentTime(), ::std::memory_order_release); + + ControlTrace(m_openedHandle, KERNEL_LOGGER_NAME, props(), EVENT_TRACE_CONTROL_STOP); + CloseTrace(m_openedHandle); + + // Wait for ProcessTrace to finish to make sure no processTraceEvent() will be called later. + if (m_processThread.joinable()) + m_processThread.join(); + + m_bEnabled = false; + + // processTraceEvent() is not called anymore. Clean static maps is safe. + PROCESS_INFO_TABLE.clear(); + THREAD_PROCESS_INFO_TABLE.clear(); + THREAD_PROCESS_INFO_TABLE[0U] = nullptr; + + TRACING_END_TIME.store(~0ULL, ::std::memory_order_release); + + EASY_LOGMSG("Event tracing stopped\n"); + } + +} // END of namespace profiler. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // _WIN32 diff --git a/3rdparty/easyprofiler/easy_profiler_core/event_trace_win.h b/3rdparty/easyprofiler/easy_profiler_core/event_trace_win.h new file mode 100644 index 0000000..cb3c01b --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/event_trace_win.h @@ -0,0 +1,129 @@ +/************************************************************************ +* file name : event_trace_win.h +* ----------------- : +* creation time : 2016/09/04 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of EasyEventTracer class used for tracing +* : Windows system events to get context switches. +* ----------------- : +* change log : * 2016/09/04 Victor Zarubkin: initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER_EVENT_TRACE_WINDOWS_H +#define EASY_PROFILER_EVENT_TRACE_WINDOWS_H +#ifdef _WIN32 + +#define INITGUID // This is to enable using SystemTraceControlGuid in evntrace.h. +#include +#include +#include +#include +#include +#include +#include +#include "event_trace_status.h" +#include "spin_lock.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +namespace profiler { + + class EasyEventTracer EASY_FINAL + { +#ifndef EASY_MAGIC_STATIC_AVAILABLE + friend class EasyEventTracerInstance; +#endif + +#pragma pack(push, 1) + struct Properties { + EVENT_TRACE_PROPERTIES base; + char sessionName[sizeof(KERNEL_LOGGER_NAME)]; + }; +#pragma pack(pop) + + ::std::thread m_processThread; + Properties m_properties; + EVENT_TRACE_LOGFILE m_trace; + ::profiler::spin_lock m_spin; + ::std::atomic_bool m_lowPriority; + TRACEHANDLE m_sessionHandle = INVALID_PROCESSTRACE_HANDLE; + TRACEHANDLE m_openedHandle = INVALID_PROCESSTRACE_HANDLE; + bool m_bEnabled = false; + + public: + + static EasyEventTracer& instance(); + ~EasyEventTracer(); + + bool isLowPriority() const; + + ::profiler::EventTracingEnableStatus enable(bool _force = false); + void disable(); + void setLowPriority(bool _value); + static void setProcessPrivileges(); + + private: + + EasyEventTracer(); + + inline EVENT_TRACE_PROPERTIES* props() + { + return reinterpret_cast(&m_properties); + } + + ::profiler::EventTracingEnableStatus startTrace(bool _force, int _step = 0); + + }; // END of class EasyEventTracer. + +} // END of namespace profiler. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // _WIN32 +#endif // EASY_PROFILER_EVENT_TRACE_WINDOWS_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/generated/easy_profilerConfig.cmake b/3rdparty/easyprofiler/easy_profiler_core/generated/easy_profilerConfig.cmake new file mode 100644 index 0000000..75ba62d --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/generated/easy_profilerConfig.cmake @@ -0,0 +1,28 @@ + +####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() ####### +####### Any changes to this file will be overwritten by the next CMake run #### +####### The input file was config.cmake.in ######## + +get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE) + +macro(set_and_check _var _file) + set(${_var} "${_file}") + if(NOT EXISTS "${_file}") + message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !") + endif() +endmacro() + +macro(check_required_components _NAME) + foreach(comp ${${_NAME}_FIND_COMPONENTS}) + if(NOT ${_NAME}_${comp}_FOUND) + if(${_NAME}_FIND_REQUIRED_${comp}) + set(${_NAME}_FOUND FALSE) + endif() + endif() + endforeach() +endmacro() + +#################################################################################### + +include("${CMAKE_CURRENT_LIST_DIR}/easy_profilerTargets.cmake") +check_required_components("easy_profiler") diff --git a/3rdparty/easyprofiler/easy_profiler_core/generated/easy_profilerConfigVersion.cmake b/3rdparty/easyprofiler/easy_profiler_core/generated/easy_profilerConfigVersion.cmake new file mode 100644 index 0000000..4f2f941 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/generated/easy_profilerConfigVersion.cmake @@ -0,0 +1,46 @@ +# This is a basic version file for the Config-mode of find_package(). +# It is used by write_basic_package_version_file() as input file for configure_file() +# to create a version-file which can be installed along a config.cmake file. +# +# The created file sets PACKAGE_VERSION_EXACT if the current version string and +# the requested version string are exactly the same and it sets +# PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version, +# but only if the requested major version is the same as the current one. +# The variable CVF_VERSION must be set before calling configure_file(). + + +set(PACKAGE_VERSION "1.3.0") + +if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION) + set(PACKAGE_VERSION_COMPATIBLE FALSE) +else() + + if("1.3.0" MATCHES "^([0-9]+)\\.") + set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}") + else() + set(CVF_VERSION_MAJOR "1.3.0") + endif() + + if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR) + set(PACKAGE_VERSION_COMPATIBLE TRUE) + else() + set(PACKAGE_VERSION_COMPATIBLE FALSE) + endif() + + if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION) + set(PACKAGE_VERSION_EXACT TRUE) + endif() +endif() + + +# if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it: +if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "") + return() +endif() + +# check that the installed version has the same 32/64bit-ness as the one which is currently searching: +if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8") + math(EXPR installedBits "8 * 8") + set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)") + set(PACKAGE_VERSION_UNSUITABLE TRUE) +endif() diff --git a/3rdparty/easyprofiler/easy_profiler_core/hashed_cstr.h b/3rdparty/easyprofiler/easy_profiler_core/hashed_cstr.h new file mode 100644 index 0000000..075f2b1 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/hashed_cstr.h @@ -0,0 +1,298 @@ +/************************************************************************ +* file name : hashed_str.h +* ----------------- : +* creation time : 2016/09/11 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains definition of C-strings with calculated hash-code. +* : These strings may be used as optimized keys for std::unordered_map. +* ----------------- : +* change log : * 2016/09/11 Victor Zarubkin: Initial commit. Moved sources from reader.cpp +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER__HASHED_CSTR__H_ +#define EASY_PROFILER__HASHED_CSTR__H_ + +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#if 0 == 1//defined(_MSC_VER)// && _MSC_VER >= 1800 +# define EASY_PROFILER_HASHED_CSTR_DEFINED + +namespace profiler { + + /** \brief Simple C-string pointer with length. + + It is used as base class for a key in std::unordered_map. + It is used to get better performance than std::string. + It simply stores a pointer and a length, there is no + any memory allocation and copy. + + \warning Make sure you know what you are doing. You have to be sure that + pointed C-string will exist until you finish using this cstring. + + \ingroup profiler + */ + class cstring + { + protected: + + const char* m_str; + size_t m_len; + + public: + + cstring(const char* _str) : m_str(_str), m_len(strlen(_str)) + { + } + + cstring(const char* _str, size_t _len) : m_str(_str), m_len(_len) + { + } + + cstring(const cstring&) = default; + cstring& operator = (const cstring&) = default; + + inline bool operator == (const cstring& _other) const + { + return m_len == _other.m_len && !strncmp(m_str, _other.m_str, m_len); + } + + inline bool operator != (const cstring& _other) const + { + return !operator == (_other); + } + + inline bool operator < (const cstring& _other) const + { + if (m_len == _other.m_len) + { + return strncmp(m_str, _other.m_str, m_len) < 0; + } + + return m_len < _other.m_len; + } + + inline const char* c_str() const + { + return m_str; + } + + inline size_t size() const + { + return m_len; + } + + }; // END of class cstring. + + /** \brief cstring with precalculated hash. + + This is used to calculate hash for C-string and to cache it + to be used in the future without recurring hash calculatoin. + + \note This class is used as a key in std::unordered_map. + + \ingroup profiler + */ + class hashed_cstr : public cstring + { + typedef cstring Parent; + + size_t m_hash; + + public: + + hashed_cstr(const char* _str) : Parent(_str), m_hash(0) + { + m_hash = ::std::_Hash_seq((const unsigned char *)m_str, m_len); + } + + hashed_cstr(const char* _str, size_t _hash_code) : Parent(_str), m_hash(_hash_code) + { + } + + hashed_cstr(const char* _str, size_t _len, size_t _hash_code) : Parent(_str, _len), m_hash(_hash_code) + { + } + + hashed_cstr(const hashed_cstr&) = default; + hashed_cstr& operator = (const hashed_cstr&) = default; + + inline bool operator == (const hashed_cstr& _other) const + { + return m_hash == _other.m_hash && Parent::operator == (_other); + } + + inline bool operator != (const hashed_cstr& _other) const + { + return !operator == (_other); + } + + inline size_t hcode() const + { + return m_hash; + } + + }; // END of class hashed_cstr. + +} // END of namespace profiler. + +namespace std { + + /** \brief Simply returns precalculated hash of a C-string. */ + template <> struct hash<::profiler::hashed_cstr> { + typedef ::profiler::hashed_cstr argument_type; + typedef size_t result_type; + inline size_t operator () (const ::profiler::hashed_cstr& _str) const { + return _str.hcode(); + } + }; + +} // END of namespace std. + +#else //////////////////////////////////////////////////////////////////// + +// TODO: Create hashed_cstr for Linux (need to use Linux version of std::_Hash_seq) + +#endif + +namespace profiler { + + class hashed_stdstring + { + ::std::string m_str; + size_t m_hash; + + public: + + hashed_stdstring(const char* _str) : m_str(_str), m_hash(::std::hash<::std::string>()(m_str)) + { + } + + hashed_stdstring(const ::std::string& _str) : m_str(_str), m_hash(::std::hash<::std::string>()(m_str)) + { + } + + hashed_stdstring(::std::string&& _str) : m_str(::std::forward<::std::string&&>(_str)), m_hash(::std::hash<::std::string>()(m_str)) + { + } + + hashed_stdstring(hashed_stdstring&& _other) : m_str(::std::move(_other.m_str)), m_hash(_other.m_hash) + { + } + + hashed_stdstring(const char* _str, size_t _hash_code) : m_str(_str), m_hash(_hash_code) + { + } + + hashed_stdstring(const ::std::string& _str, size_t _hash_code) : m_str(_str), m_hash(_hash_code) + { + } + + hashed_stdstring(::std::string&& _str, size_t _hash_code) : m_str(::std::forward<::std::string&&>(_str)), m_hash(_hash_code) + { + } + + hashed_stdstring(const hashed_stdstring&) = default; + hashed_stdstring& operator = (const hashed_stdstring&) = default; + + hashed_stdstring& operator = (hashed_stdstring&& _other) + { + m_str = ::std::move(_other.m_str); + m_hash = _other.m_hash; + return *this; + } + + inline bool operator == (const hashed_stdstring& _other) const + { + return m_hash == _other.m_hash && m_str == _other.m_str; + } + + inline bool operator != (const hashed_stdstring& _other) const + { + return !operator == (_other); + } + + inline size_t hcode() const + { + return m_hash; + } + + inline const char* c_str() const + { + return m_str.c_str(); + } + + inline size_t size() const + { + return m_str.size(); + } + + }; // END of class hashed_stdstring. + +} // END of namespace profiler. + +namespace std { + + /** \brief Simply returns precalculated hash of a std::string. */ + template <> struct hash<::profiler::hashed_stdstring> { + typedef ::profiler::hashed_stdstring argument_type; + typedef size_t result_type; + inline size_t operator () (const ::profiler::hashed_stdstring& _str) const { + return _str.hcode(); + } + }; + +} // END of namespace std. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER__HASHED_CSTR__H_ diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/arbitrary_value.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/arbitrary_value.h new file mode 100644 index 0000000..9e1305b --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/arbitrary_value.h @@ -0,0 +1,308 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_ARBITRARY_VALUE_H +#define EASY_PROFILER_ARBITRARY_VALUE_H + +#include + +#if defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" +#endif + +#ifdef USING_EASY_PROFILER + +/** Macro used to create a unique Value Identification Number. + +Use this if you want to change the same value from different places in your code. +Otherwise do not mind. + +\code +struct A { + int someCount; +}; + +void foo(const A& a) { + EASY_VALUE("foo count", a.someCount); // Value ID is automatically set to (uint64_t)&a.someCount + + // This notation is completely the same as EASY_VALUE("foo count", a.someCount, EASY_VIN(a.someCount)); +} + +void bar(const A& b) { + EASY_VALUE("bar count", b.someCount); // Same ID as for "foo count" if &b == &a (and different ID otherwise) +} + +void baz(const A& c) { + EASY_VALUE("baz count", c.someCount, EASY_VIN(EASY_FUNC_NAME)); // Different ID from "foo count" and "bar count" + EASY_VALUE("qux count", 100500, EASY_VIN(EASY_FUNC_NAME)); // Same ID as for "baz count" +} +\endcode + +\ingroup profiler +*/ +# define EASY_VIN(member) ::profiler::ValueId(member) + +/** Macro used to identify global value which would be recognized by it's name in GUI. + +\code +struct A { + int someCount; +}; + +struct B { + int someOtherCount; +}; + +void foo(const A& a) { + EASY_VALUE("Count", a.someCount, EASY_GLOBAL_VIN); +} + +void bar(const B& b) { + EASY_VALUE("Count", b.someOtherCount, EASY_GLOBAL_VIN); // Same ID as for foo::"Count" despite of &b != &a +} +\endcode + +\ingroup profiler +*/ +# define EASY_GLOBAL_VIN ::profiler::ValueId() + +/** Macro used to identify unique value. + +\code +struct A { + int someCount; +}; + +void foo(const A& a) { + // All these values would have different IDs despite of names, pointers and values are the same + EASY_VALUE("foo count", a.someCount, EASY_UNIQUE_VIN); + EASY_VALUE("foo count", a.someCount, EASY_UNIQUE_VIN); + EASY_VALUE("foo count", a.someCount, EASY_UNIQUE_VIN); +} +\endcode + +\ingroup profiler +*/ +# define EASY_UNIQUE_VIN ::profiler::ValueId(EASY_UNIQUE_DESC(__LINE__)) + +/** Macro used to store single arbitrary value. + +\note Also stores a time-stamp of it's occurrence like an Event. + +\note To store an array, please, use EASY_ARRAY macro. + +\note Currently arbitrary values support only compile-time names. + +\sa EASY_ARRAY, EASY_TEXT, EASY_STRING + +\ingroup profiler +*/ +# define EASY_VALUE(name, value, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), ::profiler::registerDescription(\ + ::profiler::extract_enable_flag(__VA_ARGS__), EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name),\ + __FILE__, __LINE__, ::profiler::BlockType::Value, ::profiler::extract_color(__VA_ARGS__), false));\ + ::profiler::setValue(EASY_UNIQUE_DESC(__LINE__), value, ::profiler::extract_value_id(value, ## __VA_ARGS__)); + +/** Macro used to store an array of arbitrary values. + +\note Also stores a time-stamp of it's occurrence like an Event. + +\note Currently arbitrary values support only compile-time names. + +\sa EASY_VALUE, EASY_TEXT, EASY_STRING + +\ingroup profiler +*/ +# define EASY_ARRAY(name, value, size, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), ::profiler::registerDescription(\ + ::profiler::extract_enable_flag(__VA_ARGS__), EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name),\ + __FILE__, __LINE__, ::profiler::BlockType::Value, ::profiler::extract_color(__VA_ARGS__), false));\ + ::profiler::setValue(EASY_UNIQUE_DESC(__LINE__), value, ::profiler::extract_value_id(value, ## __VA_ARGS__), size); + +/** Macro used to store custom text. + +Could be C-string or std::string. + +\note Also stores a time-stamp of it's occurrence like an Event. + +\note Currently arbitrary values support only compile-time names. + +\sa EASY_VALUE, EASY_ARRAY, EASY_STRING + +\ingroup profiler +*/ +# define EASY_TEXT(name, text, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), ::profiler::registerDescription(\ + ::profiler::extract_enable_flag(__VA_ARGS__), EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name),\ + __FILE__, __LINE__, ::profiler::BlockType::Value, ::profiler::extract_color(__VA_ARGS__), false));\ + ::profiler::setText(EASY_UNIQUE_DESC(__LINE__), text, ::profiler::extract_value_id(text , ## __VA_ARGS__)); + +/** Macro used to store custom text of specified length. + +Same as EASY_TEXT, but with explicitly specified length. +Use this for C-strings of known length (compile-time or run-time). + +\note Recommendation (not a requirement): Take into account a zero-terminator '\0' symbol (e.g. strlen("BlaBla") + 1). + +\note Also stores a time-stamp of it's occurrence like an Event. + +\note Currently arbitrary values support only compile-time names. + +\sa EASY_VALUE, EASY_ARRAY, EASY_TEXT + +\ingroup profiler +*/ +# define EASY_STRING(name, text, size, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), ::profiler::registerDescription(\ + ::profiler::extract_enable_flag(__VA_ARGS__), EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name),\ + __FILE__, __LINE__, ::profiler::BlockType::Value, ::profiler::extract_color(__VA_ARGS__), false));\ + ::profiler::setText(EASY_UNIQUE_DESC(__LINE__), text, ::profiler::extract_value_id(text, ## __VA_ARGS__), size); + +namespace profiler +{ + + EASY_CONSTEXPR uint16_t MaxArbitraryValuesArraySize = 65535; + + extern "C" PROFILER_API void storeValue(const BaseBlockDescriptor* _desc, DataType _type, const void* _data, + size_t _size, bool _isArray, ValueId _vin); + + template + inline void setValue(const BaseBlockDescriptor* _desc, T _value, ValueId _vin) + { + static_assert(!::std::is_pointer::value, + "You should not pass pointers into EASY_VALUE. Pass a reference instead."); + + using Type = typename ::std::remove_reference::type>::type; + + static_assert(StdToDataType::data_type != DataType::TypesCount, + "You should use standard builtin scalar types as profiler::Value type!"); + + storeValue(_desc, StdToDataType::data_type, &_value, sizeof(Type), false, _vin); + } + + template + inline void setValue(const BaseBlockDescriptor* _desc, const T* _valueArray, ValueId _vin, uint16_t _arraySize) + { + static_assert(StdToDataType::data_type != DataType::TypesCount, + "You should use standard builtin scalar types as profiler::Value type!"); + + storeValue(_desc, StdToDataType::data_type, _valueArray, sizeof(T) * _arraySize, true, _vin); + } + + template + inline void setValue(const BaseBlockDescriptor* _desc, const T (&_value)[N], ValueId _vin) + { + static_assert(StdToDataType::data_type != DataType::TypesCount, + "You should use standard builtin scalar types as profiler::Value type!"); + + static_assert(N <= MaxArbitraryValuesArraySize, "Maximum arbitrary values array size is 65535."); + + storeValue(_desc, StdToDataType::data_type, _value, sizeof(_value), true, _vin); + } + + inline void setText(const BaseBlockDescriptor* _desc, const char* _text, ValueId _vin, uint16_t _textLength) + { + storeValue(_desc, DataType::String, _text, _textLength, true, _vin); + } + + inline void setText(const BaseBlockDescriptor* _desc, const char* _text, ValueId _vin) + { + storeValue(_desc, DataType::String, _text, strlen(_text) + 1, true, _vin); + } + + inline void setText(const BaseBlockDescriptor* _desc, const ::std::string& _text, ValueId _vin) + { + storeValue(_desc, DataType::String, _text.c_str(), _text.size() + 1, true, _vin); + } + + template + inline void setText(const BaseBlockDescriptor* _desc, const char (&_text)[N], ValueId _vin) + { + static_assert(N <= MaxArbitraryValuesArraySize, "Maximum arbitrary values array size is 65535."); + storeValue(_desc, DataType::String, &_text[0], N, true, _vin); + } + +} // end of namespace profiler. + +#else + +# define EASY_GLOBAL_VIN +# define EASY_UNIQUE_VIN +# define EASY_VIN(member) +# define EASY_VALUE(...) +# define EASY_ARRAY(...) +# define EASY_TEXT(...) +# define EASY_STRING(...) + +namespace profiler +{ + + inline void storeValue(const BaseBlockDescriptor*, DataType, const void*, size_t, bool, ValueId) {} + + template + inline void setValue(const BaseBlockDescriptor*, T, ValueId) {} + + template + inline void setValue(const BaseBlockDescriptor*, const T*, ValueId, uint16_t) {} + + template + inline void setValue(const BaseBlockDescriptor*, const T (&)[N], ValueId) {} + + inline void setText(const BaseBlockDescriptor*, const char*, ValueId, uint16_t) {} + + inline void setText(const BaseBlockDescriptor*, const char*, ValueId) {} + + inline void setText(const BaseBlockDescriptor*, const ::std::string&, ValueId) {} + + template + inline void setText(const BaseBlockDescriptor*, const char (&)[N], ValueId) {} + +} // end of namespace profiler. + +#endif // USING_EASY_PROFILER + +#if defined(__clang__) +# pragma clang diagnostic pop +#endif + +#endif // EASY_PROFILER_ARBITRARY_VALUE_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_aux.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_aux.h new file mode 100644 index 0000000..2f8506e --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_aux.h @@ -0,0 +1,130 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_ARBITRARY_VALUE_AUX_H +#define EASY_PROFILER_ARBITRARY_VALUE_AUX_H + +#include +#include + +namespace profiler +{ + + using vin_t = uint64_t; + + class ValueId EASY_FINAL + { + friend ::ThreadStorage; + vin_t m_id; + + public: + +#if defined(_MSC_VER) && _MSC_VER <= 1800 + inline EASY_CONSTEXPR_FCN ValueId(const ValueId& _another) : m_id(_another.m_id) {} + inline EASY_CONSTEXPR_FCN ValueId(ValueId&& _another) : m_id(_another.m_id) {} +#else + inline EASY_CONSTEXPR_FCN ValueId(const ValueId&) = default; + inline EASY_CONSTEXPR_FCN ValueId(ValueId&&) = default; +#endif + + explicit inline EASY_CONSTEXPR_FCN ValueId() : m_id(0) {} + explicit inline EASY_CONSTEXPR_FCN ValueId(const void* _member) : m_id(reinterpret_cast(_member)) {} + + template + explicit inline EASY_CONSTEXPR_FCN ValueId(const T& _member) : m_id(reinterpret_cast(&_member)) {} + + template + explicit inline EASY_CONSTEXPR_FCN ValueId(const T (&_member)[N]) : m_id(reinterpret_cast((void*)_member)) {} + + ValueId& operator = (const ValueId&) = delete; + ValueId& operator = (ValueId&&) = delete; + }; + + namespace { + template + inline EASY_CONSTEXPR_FCN bool subextract_value_id(TArgs...); + + template <> + inline EASY_CONSTEXPR_FCN bool subextract_value_id<>() { return false; } + + template + inline EASY_CONSTEXPR_FCN bool subextract_value_id(T) { return false; } + + inline EASY_CONSTEXPR_FCN ValueId subextract_value_id(ValueId _value) { return _value; } + + template + inline EASY_CONSTEXPR_FCN ValueId subextract_value_id(ValueId _value, TArgs...) { return _value; } + + template + inline EASY_CONSTEXPR_FCN auto subextract_value_id(T, TArgs... _args) -> decltype(subextract_value_id(_args...)) { + return subextract_value_id(_args...); + } + + struct GetFirst { + template + static EASY_CONSTEXPR_FCN ValueId get(const T& _first, TArgs...) { return ValueId(_first); } + + template + static EASY_CONSTEXPR_FCN ValueId get(const T (&_first)[N], TArgs...) { return ValueId(_first); } + }; + + struct GetRest { + template + static EASY_CONSTEXPR_FCN ValueId get(const T&, TArgs... _args) { return subextract_value_id(_args...); } + }; + } // end of noname namespace. + + template + inline EASY_CONSTEXPR_FCN ValueId extract_value_id(const T& _first, TArgs... _args) { + return ::std::conditional<::std::is_same::value, GetRest, GetFirst> + ::type::get(_first, _args...); + } + + template + inline EASY_CONSTEXPR_FCN ValueId extract_value_id(const T (&_first)[N], TArgs... _args) { + return ::std::conditional<::std::is_same::value, GetRest, GetFirst> + ::type::get(_first, _args...); + } + +} // end of namespace profiler. + +#endif // EASY_PROFILER_ARBITRARY_VALUE_AUX_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_public_types.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_public_types.h new file mode 100644 index 0000000..c2851cb --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/arbitrary_value_public_types.h @@ -0,0 +1,102 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_ARBITRARY_VALUE_PUBLIC_TYPES_H +#define EASY_PROFILER_ARBITRARY_VALUE_PUBLIC_TYPES_H + +#include +#include +#include + +namespace profiler +{ + + enum class DataType : uint8_t + { + Bool = 0, + Char, + Int8, + Uint8, + Int16, + Uint16, + Int32, + Uint32, + Int64, + Uint64, + Float, + Double, + String, + + TypesCount + }; // end of enum class DataType. + + template struct StdType; + + template struct StdToDataType EASY_FINAL { + EASY_STATIC_CONSTEXPR auto data_type = DataType::TypesCount; + }; + +# define EASY_DATATYPE_CONVERSION(DataTypeName, StdTypeName)\ + template <> struct StdType EASY_FINAL { using value_type = StdTypeName; };\ + template <> struct StdToDataType EASY_FINAL { EASY_STATIC_CONSTEXPR auto data_type = DataTypeName; } + + EASY_DATATYPE_CONVERSION(DataType::Bool , bool ); + EASY_DATATYPE_CONVERSION(DataType::Char , char ); + EASY_DATATYPE_CONVERSION(DataType::Int8 , int8_t ); + EASY_DATATYPE_CONVERSION(DataType::Uint8 , uint8_t ); + EASY_DATATYPE_CONVERSION(DataType::Int16 , int16_t ); + EASY_DATATYPE_CONVERSION(DataType::Uint16, uint16_t); + EASY_DATATYPE_CONVERSION(DataType::Int32 , int32_t ); + EASY_DATATYPE_CONVERSION(DataType::Uint32, uint32_t); + EASY_DATATYPE_CONVERSION(DataType::Int64 , int64_t ); + EASY_DATATYPE_CONVERSION(DataType::Uint64, uint64_t); + EASY_DATATYPE_CONVERSION(DataType::Float , float ); + EASY_DATATYPE_CONVERSION(DataType::Double, double ); + +# undef EASY_DATATYPE_CONVERSION + + template <> struct StdType EASY_FINAL { using value_type = char; }; + template <> struct StdToDataType EASY_FINAL { EASY_STATIC_CONSTEXPR auto data_type = DataType::String; }; + +} // end of namespace profiler. + +#endif //EASY_PROFILER_ARBITRARY_VALUE_PUBLIC_TYPES_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/easy_compiler_support.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/easy_compiler_support.h new file mode 100644 index 0000000..6d9fe8d --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/easy_compiler_support.h @@ -0,0 +1,224 @@ +/************************************************************************ +* file name : easy_compiler_support.h +* ----------------- : +* creation time : 2016/09/22 +* authors : Victor Zarubkin, Sergey Yagovtsev +* emails : v.s.zarubkin@gmail.com, yse.sey@gmail.com +* ----------------- : +* description : This file contains auxiliary profiler macros for different compiler support. +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER_COMPILER_SUPPORT_H +#define EASY_PROFILER_COMPILER_SUPPORT_H + +#include + +#if defined(_WIN32) && !defined(EASY_PROFILER_STATIC) +// Visual Studio and MinGW +# ifdef _BUILD_PROFILER +# define PROFILER_API __declspec(dllexport) +# else +# define PROFILER_API __declspec(dllimport) +# endif +#endif + + + +#if defined(_MSC_VER) +////////////////////////////////////////////////////////////////////////// +// Visual Studio + +# if defined(EASY_OPTION_PRETTY_PRINT_FUNCTIONS) && EASY_OPTION_PRETTY_PRINT_FUNCTIONS != 0 +# define EASY_FUNC_NAME __FUNCSIG__ +# else +# define EASY_FUNC_NAME __FUNCTION__ +# endif + +# if _MSC_VER <= 1800 +// There is no support for C++11 thread_local keyword prior to Visual Studio 2015. Use __declspec(thread) instead. +// There is also no support for C++11 magic statics feature :( So it becomes slightly harder to initialize static vars - additional "if" for each profiler block. +# define EASY_THREAD_LOCAL __declspec(thread) +# define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer)\ + __declspec(thread) static VarType VarName = 0;\ + if (!VarName)\ + VarName = VarInitializer + +// No constexpr support before Visual Studio 2015 +# define EASY_CONSTEXPR const +# define EASY_STATIC_CONSTEXPR static const +# define EASY_CONSTEXPR_FCN + +// No noexcept support before Visual Studio 2015 +# define EASY_NOEXCEPT throw() +# endif + +# define EASY_FORCE_INLINE __forceinline + +#elif defined(__clang__) +////////////////////////////////////////////////////////////////////////// +// Clang Compiler + +# define EASY_COMPILER_VERSION (__clang_major__ * 10 + __clang_minor__) + +# if EASY_COMPILER_VERSION < 33 || (defined(__APPLE_CC__) && __APPLE_CC__ < 8000) +// There is no support for C++11 thread_local keyword prior to Clang v3.3 and Apple LLVM clang 8.0. Use __thread instead. +# define EASY_THREAD_LOCAL __thread +# endif + +# if EASY_COMPILER_VERSION < 31 +// No constexpr support before Clang v3.1 +# define EASY_CONSTEXPR const +# define EASY_STATIC_CONSTEXPR static const +# define EASY_CONSTEXPR_FCN +# endif + +# if EASY_COMPILER_VERSION < 29 +// There is no support for C++11 magic statics feature prior to clang 2.9. It becomes slightly harder to initialize static vars - additional "if" for each profiler block. +# define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer)\ + EASY_THREAD_LOCAL static VarType VarName = 0;\ + if (!VarName)\ + VarName = VarInitializer + +// There is no support for C++11 final keyword prior to Clang v2.9 +# define EASY_FINAL +# endif + +# define EASY_FORCE_INLINE inline __attribute__((always_inline)) +# undef EASY_COMPILER_VERSION + +#elif defined(__GNUC__) +////////////////////////////////////////////////////////////////////////// +// GNU Compiler + +# define EASY_COMPILER_VERSION (__GNUC__ * 10 + __GNUC_MINOR__) + +# if EASY_COMPILER_VERSION < 48 +// There is no support for C++11 thread_local keyword prior to gcc 4.8. Use __thread instead. +# define EASY_THREAD_LOCAL __thread +# endif + +# if EASY_COMPILER_VERSION < 46 +// No constexpr support before GCC v4.6 +# define EASY_CONSTEXPR const +# define EASY_STATIC_CONSTEXPR static const +# define EASY_CONSTEXPR_FCN + +// No noexcept support before GCC v4.6 +# define EASY_NOEXCEPT throw() +# endif + +# if EASY_COMPILER_VERSION < 43 +// There is no support for C++11 magic statics feature prior to gcc 4.3. It becomes slightly harder to initialize static vars - additional "if" for each profiler block. +# define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer)\ + EASY_THREAD_LOCAL static VarType VarName = 0;\ + if (!VarName)\ + VarName = VarInitializer +# endif + +# if EASY_COMPILER_VERSION < 47 +// There is no support for C++11 final keyword prior to gcc 4.7 +# define EASY_FINAL +# endif + +# define EASY_FORCE_INLINE inline __attribute__((always_inline)) +# undef EASY_COMPILER_VERSION + +#else +////////////////////////////////////////////////////////////////////////// +// TODO: Add other compilers support + +static_assert(false, "EasyProfiler is not configured for using your compiler type. Please, contact developers."); +#endif +// END +////////////////////////////////////////////////////////////////////////// + + + +////////////////////////////////////////////////////////////////////////// +// Default values + +#ifndef EASY_FUNC_NAME +# if defined(EASY_OPTION_PRETTY_PRINT_FUNCTIONS) && EASY_OPTION_PRETTY_PRINT_FUNCTIONS != 0 +# define EASY_FUNC_NAME __PRETTY_FUNCTION__ +# else +# define EASY_FUNC_NAME __func__ +# endif +#endif + +#ifndef EASY_THREAD_LOCAL +# define EASY_THREAD_LOCAL thread_local +# define EASY_CXX11_TLS_AVAILABLE +#endif + +#ifndef EASY_LOCAL_STATIC_PTR +# define EASY_LOCAL_STATIC_PTR(VarType, VarName, VarInitializer) static VarType VarName = VarInitializer +# define EASY_MAGIC_STATIC_AVAILABLE +#endif + +#ifndef EASY_FINAL +# define EASY_FINAL final +#endif + +#ifndef EASY_FORCE_INLINE +# define EASY_FORCE_INLINE inline +#endif + +#ifndef EASY_CONSTEXPR +# define EASY_CONSTEXPR constexpr +# define EASY_STATIC_CONSTEXPR static constexpr +# define EASY_CONSTEXPR_FCN constexpr +# define EASY_CONSTEXPR_AVAILABLE +#endif + +#ifndef EASY_NOEXCEPT +# define EASY_NOEXCEPT noexcept +# define EASY_NOEXCEPT_AVAILABLE +#endif + +#ifndef PROFILER_API +# define PROFILER_API +#endif + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER_COMPILER_SUPPORT_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_aux.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_aux.h new file mode 100644 index 0000000..9b8da6c --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_aux.h @@ -0,0 +1,214 @@ +/************************************************************************ +* file name : profiler_aux.h +* ----------------- : +* creation time : 2016/06/11 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : This file contains auxiliary profiler macros and funcitons. +* ----------------- : +* change log : * 2016/06/11 Victor Zarubkin: Moved sources from profiler.h +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER_AUX_H +#define EASY_PROFILER_AUX_H + +#include + +#include +#include + +////////////////////////////////////////////////////////////////////////// + +namespace profiler { + + enum EasyBlockStatus : uint8_t { + OFF = 0, ///< The block is OFF + ON = 1, ///< The block is ON (but if it's parent block is off recursively then this block will be off too) + FORCE_ON = ON | 2, ///< The block is ALWAYS ON (even if it's parent has turned off all children) + OFF_RECURSIVE = 4, ///< The block is OFF and all of it's children by call-stack are also OFF. + ON_WITHOUT_CHILDREN = ON | OFF_RECURSIVE, ///< The block is ON but all of it's children are OFF. + FORCE_ON_WITHOUT_CHILDREN = FORCE_ON | OFF_RECURSIVE, ///< The block is ALWAYS ON but all of it's children are OFF. + }; + +} + +////////////////////////////////////////////////////////////////////////// + +#include +#include + +# define EASY_STRINGIFY(a) #a +# define EASY_STRINGIFICATION(a) EASY_STRINGIFY(a) +# define EASY_TOKEN_JOIN(x, y) x ## y +# define EASY_TOKEN_CONCATENATE(x, y) EASY_TOKEN_JOIN(x, y) +# define EASY_UNIQUE_BLOCK(x) EASY_TOKEN_CONCATENATE(unique_profiler_mark_name_, x) +# define EASY_UNIQUE_FRAME_COUNTER(x) EASY_TOKEN_CONCATENATE(unique_profiler_frame_mark_name_, x) +# define EASY_UNIQUE_DESC(x) EASY_TOKEN_CONCATENATE(unique_profiler_descriptor_, x) + +#ifdef BUILD_WITH_EASY_PROFILER + +namespace profiler { + + template struct NameSwitch; + + class ForceConstStr EASY_FINAL { + friend NameSwitch; + friend NameSwitch; + + const char* c_str; + + public: + + ForceConstStr() = delete; + ForceConstStr(const ForceConstStr&) = delete; + ForceConstStr(ForceConstStr&&) = delete; + ForceConstStr& operator = (const ForceConstStr&) = delete; + ForceConstStr& operator = (ForceConstStr&&) = delete; + + explicit EASY_CONSTEXPR_FCN ForceConstStr(const char* _str) : c_str(_str) {} + explicit ForceConstStr(const ::std::string& _str) : c_str(_str.c_str()) {} + }; + + template struct NameSwitch EASY_FINAL { + static const char* runtime_name(const char* name) { return name; } + static const char* runtime_name(const ::std::string& name) { return name.c_str(); } + static EASY_CONSTEXPR_FCN const char* runtime_name(const ForceConstStr&) { return ""; } + + template + static EASY_CONSTEXPR_FCN const char* compiletime_name(const T&, const char* autoGeneratedName) { return autoGeneratedName; } + static EASY_CONSTEXPR_FCN const char* compiletime_name(const char*, const char* autoGeneratedName) { return autoGeneratedName; } + static EASY_CONSTEXPR_FCN const char* compiletime_name(const ForceConstStr& name, const char*) { return name.c_str; } + }; + + template <> struct NameSwitch EASY_FINAL { + static EASY_CONSTEXPR_FCN const char* runtime_name(const char*) { return ""; } + static EASY_CONSTEXPR_FCN const char* runtime_name(const ForceConstStr&) { return ""; } + static const char* runtime_name(const ::std::string& name) { return name.c_str(); } + + template + static EASY_CONSTEXPR_FCN const char* compiletime_name(const T&, const char* autoGeneratedName) { return autoGeneratedName; } + static EASY_CONSTEXPR_FCN const char* compiletime_name(const char* name, const char*) { return name; } + static EASY_CONSTEXPR_FCN const char* compiletime_name(const ForceConstStr& name, const char*) { return name.c_str; } + }; + + //*********************************************** + + template + inline EASY_CONSTEXPR_FCN color_t extract_color(TArgs...); + + template <> + inline EASY_CONSTEXPR_FCN color_t extract_color<>() { + return ::profiler::colors::Default; + } + + template + inline EASY_CONSTEXPR_FCN color_t extract_color(T) { + return ::profiler::colors::Default; + } + + template <> + inline EASY_CONSTEXPR_FCN color_t extract_color(color_t _color) { + return _color; + } + + template + inline EASY_CONSTEXPR_FCN color_t extract_color(color_t _color, TArgs...) { + return _color; + } + + template + inline EASY_CONSTEXPR_FCN color_t extract_color(T, TArgs... _args) { + return extract_color(_args...); + } + + //*********************************************** + + template + inline EASY_CONSTEXPR_FCN EasyBlockStatus extract_enable_flag(TArgs...); + + template <> + inline EASY_CONSTEXPR_FCN EasyBlockStatus extract_enable_flag<>() { + return ::profiler::ON; + } + + template + inline EASY_CONSTEXPR_FCN EasyBlockStatus extract_enable_flag(T) { + return ::profiler::ON; + } + + template <> + inline EASY_CONSTEXPR_FCN EasyBlockStatus extract_enable_flag(EasyBlockStatus _flag) { + return _flag; + } + + template + inline EASY_CONSTEXPR_FCN EasyBlockStatus extract_enable_flag(EasyBlockStatus _flag, TArgs...) { + return _flag; + } + + template + inline EASY_CONSTEXPR_FCN EasyBlockStatus extract_enable_flag(T, TArgs... _args) { + return extract_enable_flag(_args...); + } + + //*********************************************** + +} // END of namespace profiler. + +# define EASY_UNIQUE_LINE_ID __FILE__ ":" EASY_STRINGIFICATION(__LINE__) +# define EASY_COMPILETIME_NAME(name) ::profiler::NameSwitch<::std::is_reference::value>::compiletime_name(name, EASY_UNIQUE_LINE_ID) +# define EASY_RUNTIME_NAME(name) ::profiler::NameSwitch<::std::is_reference::value>::runtime_name(name) +# define EASY_CONST_NAME(name) ::profiler::ForceConstStr(name) + +#else + +# define EASY_CONST_NAME(name) + +#endif // BUILD_WITH_EASY_PROFILER + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER_AUX_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_colors.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_colors.h new file mode 100644 index 0000000..61e8b5b --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_colors.h @@ -0,0 +1,413 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_COLORS_H +#define EASY_PROFILER_COLORS_H + +#include +#include + +////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// + +namespace profiler { + + using color_t = uint32_t; // Standard four-byte ARGB color format + + namespace colors { + + ///< Change alpha for color. Only 8 major bytes (0xff000000) used from alpha. + inline EASY_CONSTEXPR_FCN color_t modify_alpha32(color_t _color, color_t _alpha) { + return (_alpha & 0xff000000) | (_color & 0x00ffffff); + } + + ///< Change alpha for color. + inline EASY_CONSTEXPR_FCN color_t modify_alpha8(color_t _color, uint8_t _alpha) { + return (static_cast(_alpha) << 24) | (_color & 0x00ffffff); + } + + ///< Create color from ARGB components. + inline EASY_CONSTEXPR_FCN color_t color(uint8_t _red, uint8_t _green, uint8_t _blue, uint8_t _alpha = 0xff) { + return (static_cast(_alpha) << 24) | (static_cast(_red) << 16) | (static_cast(_green) << 8) | static_cast(_blue); + } + +#if !defined(EASY_OPTION_BUILTIN_COLORS) || EASY_OPTION_BUILTIN_COLORS != 0 + // Google Material Design colors + // See https://material.google.com/style/color.html + + EASY_CONSTEXPR color_t Red50 = 0xffffebee; + EASY_CONSTEXPR color_t Red100 = 0xffffcdd2; + EASY_CONSTEXPR color_t Red200 = 0xffef9a9a; + EASY_CONSTEXPR color_t Red300 = 0xffe57373; + EASY_CONSTEXPR color_t Red400 = 0xffef5350; + EASY_CONSTEXPR color_t Red500 = 0xfff44336; + EASY_CONSTEXPR color_t Red600 = 0xffe53935; + EASY_CONSTEXPR color_t Red700 = 0xffd32f2f; + EASY_CONSTEXPR color_t Red800 = 0xffc62828; + EASY_CONSTEXPR color_t Red900 = 0xffb71c1c; + EASY_CONSTEXPR color_t RedA100 = 0xffff8a80; + EASY_CONSTEXPR color_t RedA200 = 0xffff5252; + EASY_CONSTEXPR color_t RedA400 = 0xffff1744; + EASY_CONSTEXPR color_t RedA700 = 0xffd50000; + + EASY_CONSTEXPR color_t Pink50 = 0xfffce4ec; + EASY_CONSTEXPR color_t Pink100 = 0xfff8bbd0; + EASY_CONSTEXPR color_t Pink200 = 0xfff48fb1; + EASY_CONSTEXPR color_t Pink300 = 0xfff06292; + EASY_CONSTEXPR color_t Pink400 = 0xffec407a; + EASY_CONSTEXPR color_t Pink500 = 0xffe91e63; + EASY_CONSTEXPR color_t Pink600 = 0xffd81b60; + EASY_CONSTEXPR color_t Pink700 = 0xffc2185b; + EASY_CONSTEXPR color_t Pink800 = 0xffad1457; + EASY_CONSTEXPR color_t Pink900 = 0xff880e4f; + EASY_CONSTEXPR color_t PinkA100 = 0xffff80ab; + EASY_CONSTEXPR color_t PinkA200 = 0xffff4081; + EASY_CONSTEXPR color_t PinkA400 = 0xfff50057; + EASY_CONSTEXPR color_t PinkA700 = 0xffc51162; + + EASY_CONSTEXPR color_t Purple50 = 0xfff3e5f5; + EASY_CONSTEXPR color_t Purple100 = 0xffe1bee7; + EASY_CONSTEXPR color_t Purple200 = 0xffce93d8; + EASY_CONSTEXPR color_t Purple300 = 0xffba68c8; + EASY_CONSTEXPR color_t Purple400 = 0xffab47bc; + EASY_CONSTEXPR color_t Purple500 = 0xff9c27b0; + EASY_CONSTEXPR color_t Purple600 = 0xff8e24aa; + EASY_CONSTEXPR color_t Purple700 = 0xff7b1fa2; + EASY_CONSTEXPR color_t Purple800 = 0xff6a1b9a; + EASY_CONSTEXPR color_t Purple900 = 0xff4a148c; + EASY_CONSTEXPR color_t PurpleA100 = 0xffea80fc; + EASY_CONSTEXPR color_t PurpleA200 = 0xffe040fb; + EASY_CONSTEXPR color_t PurpleA400 = 0xffd500f9; + EASY_CONSTEXPR color_t PurpleA700 = 0xffaa00ff; + + EASY_CONSTEXPR color_t DeepPurple50 = 0xffede7f6; + EASY_CONSTEXPR color_t DeepPurple100 = 0xffd1c4e9; + EASY_CONSTEXPR color_t DeepPurple200 = 0xffb39ddb; + EASY_CONSTEXPR color_t DeepPurple300 = 0xff9575cd; + EASY_CONSTEXPR color_t DeepPurple400 = 0xff7e57c2; + EASY_CONSTEXPR color_t DeepPurple500 = 0xff673ab7; + EASY_CONSTEXPR color_t DeepPurple600 = 0xff5e35b1; + EASY_CONSTEXPR color_t DeepPurple700 = 0xff512da8; + EASY_CONSTEXPR color_t DeepPurple800 = 0xff4527a0; + EASY_CONSTEXPR color_t DeepPurple900 = 0xff311b92; + EASY_CONSTEXPR color_t DeepPurpleA100 = 0xffb388ff; + EASY_CONSTEXPR color_t DeepPurpleA200 = 0xff7c4dff; + EASY_CONSTEXPR color_t DeepPurpleA400 = 0xff651fff; + EASY_CONSTEXPR color_t DeepPurpleA700 = 0xff6200ea; + + EASY_CONSTEXPR color_t Indigo50 = 0xffe8eaf6; + EASY_CONSTEXPR color_t Indigo100 = 0xffc5cae9; + EASY_CONSTEXPR color_t Indigo200 = 0xff9fa8da; + EASY_CONSTEXPR color_t Indigo300 = 0xff7986cb; + EASY_CONSTEXPR color_t Indigo400 = 0xff5c6bc0; + EASY_CONSTEXPR color_t Indigo500 = 0xff3f51b5; + EASY_CONSTEXPR color_t Indigo600 = 0xff3949ab; + EASY_CONSTEXPR color_t Indigo700 = 0xff303f9f; + EASY_CONSTEXPR color_t Indigo800 = 0xff283593; + EASY_CONSTEXPR color_t Indigo900 = 0xff1a237e; + EASY_CONSTEXPR color_t IndigoA100 = 0xff8c9eff; + EASY_CONSTEXPR color_t IndigoA200 = 0xff536dfe; + EASY_CONSTEXPR color_t IndigoA400 = 0xff3d5afe; + EASY_CONSTEXPR color_t IndigoA700 = 0xff304ffe; + + EASY_CONSTEXPR color_t Blue50 = 0xffe3f2fd; + EASY_CONSTEXPR color_t Blue100 = 0xffbbdefb; + EASY_CONSTEXPR color_t Blue200 = 0xff90caf9; + EASY_CONSTEXPR color_t Blue300 = 0xff64b5f6; + EASY_CONSTEXPR color_t Blue400 = 0xff42a5f5; + EASY_CONSTEXPR color_t Blue500 = 0xff2196f3; + EASY_CONSTEXPR color_t Blue600 = 0xff1e88e5; + EASY_CONSTEXPR color_t Blue700 = 0xff1976d2; + EASY_CONSTEXPR color_t Blue800 = 0xff1565c0; + EASY_CONSTEXPR color_t Blue900 = 0xff0d47a1; + EASY_CONSTEXPR color_t BlueA100 = 0xff82b1ff; + EASY_CONSTEXPR color_t BlueA200 = 0xff448aff; + EASY_CONSTEXPR color_t BlueA400 = 0xff2979ff; + EASY_CONSTEXPR color_t BlueA700 = 0xff2962ff; + + EASY_CONSTEXPR color_t LightBlue50 = 0xffe1f5fe; + EASY_CONSTEXPR color_t LightBlue100 = 0xffb3e5fc; + EASY_CONSTEXPR color_t LightBlue200 = 0xff81d4fa; + EASY_CONSTEXPR color_t LightBlue300 = 0xff4fc3f7; + EASY_CONSTEXPR color_t LightBlue400 = 0xff29b6f6; + EASY_CONSTEXPR color_t LightBlue500 = 0xff03a9f4; + EASY_CONSTEXPR color_t LightBlue600 = 0xff039be5; + EASY_CONSTEXPR color_t LightBlue700 = 0xff0288d1; + EASY_CONSTEXPR color_t LightBlue800 = 0xff0277bd; + EASY_CONSTEXPR color_t LightBlue900 = 0xff01579b; + EASY_CONSTEXPR color_t LightBlueA100 = 0xff80d8ff; + EASY_CONSTEXPR color_t LightBlueA200 = 0xff40c4ff; + EASY_CONSTEXPR color_t LightBlueA400 = 0xff00b0ff; + EASY_CONSTEXPR color_t LightBlueA700 = 0xff0091ea; + + EASY_CONSTEXPR color_t Cyan50 = 0xffe0f7fa; + EASY_CONSTEXPR color_t Cyan100 = 0xffb2ebf2; + EASY_CONSTEXPR color_t Cyan200 = 0xff80deea; + EASY_CONSTEXPR color_t Cyan300 = 0xff4dd0e1; + EASY_CONSTEXPR color_t Cyan400 = 0xff26c6da; + EASY_CONSTEXPR color_t Cyan500 = 0xff00bcd4; + EASY_CONSTEXPR color_t Cyan600 = 0xff00acc1; + EASY_CONSTEXPR color_t Cyan700 = 0xff0097a7; + EASY_CONSTEXPR color_t Cyan800 = 0xff00838f; + EASY_CONSTEXPR color_t Cyan900 = 0xff006064; + EASY_CONSTEXPR color_t CyanA100 = 0xff84ffff; + EASY_CONSTEXPR color_t CyanA200 = 0xff18ffff; + EASY_CONSTEXPR color_t CyanA400 = 0xff00e5ff; + EASY_CONSTEXPR color_t CyanA700 = 0xff00b8d4; + + EASY_CONSTEXPR color_t Teal50 = 0xffe0f2f1; + EASY_CONSTEXPR color_t Teal100 = 0xffb2dfdb; + EASY_CONSTEXPR color_t Teal200 = 0xff80cbc4; + EASY_CONSTEXPR color_t Teal300 = 0xff4db6ac; + EASY_CONSTEXPR color_t Teal400 = 0xff26a69a; + EASY_CONSTEXPR color_t Teal500 = 0xff009688; + EASY_CONSTEXPR color_t Teal600 = 0xff00897b; + EASY_CONSTEXPR color_t Teal700 = 0xff00796b; + EASY_CONSTEXPR color_t Teal800 = 0xff00695c; + EASY_CONSTEXPR color_t Teal900 = 0xff004d40; + EASY_CONSTEXPR color_t TealA100 = 0xffa7ffeb; + EASY_CONSTEXPR color_t TealA200 = 0xff64ffda; + EASY_CONSTEXPR color_t TealA400 = 0xff1de9b6; + EASY_CONSTEXPR color_t TealA700 = 0xff00bfa5; + + EASY_CONSTEXPR color_t Green50 = 0xffe8f5e9; + EASY_CONSTEXPR color_t Green100 = 0xffc8e6c9; + EASY_CONSTEXPR color_t Green200 = 0xffa5d6a7; + EASY_CONSTEXPR color_t Green300 = 0xff81c784; + EASY_CONSTEXPR color_t Green400 = 0xff66bb6a; + EASY_CONSTEXPR color_t Green500 = 0xff4caf50; + EASY_CONSTEXPR color_t Green600 = 0xff43a047; + EASY_CONSTEXPR color_t Green700 = 0xff388e3c; + EASY_CONSTEXPR color_t Green800 = 0xff2e7d32; + EASY_CONSTEXPR color_t Green900 = 0xff1b5e20; + EASY_CONSTEXPR color_t GreenA100 = 0xffb9f6ca; + EASY_CONSTEXPR color_t GreenA200 = 0xff69f0ae; + EASY_CONSTEXPR color_t GreenA400 = 0xff00e676; + EASY_CONSTEXPR color_t GreenA700 = 0xff00c853; + + EASY_CONSTEXPR color_t LightGreen50 = 0xfff1f8e9; + EASY_CONSTEXPR color_t LightGreen100 = 0xffdcedc8; + EASY_CONSTEXPR color_t LightGreen200 = 0xffc5e1a5; + EASY_CONSTEXPR color_t LightGreen300 = 0xffaed581; + EASY_CONSTEXPR color_t LightGreen400 = 0xff9ccc65; + EASY_CONSTEXPR color_t LightGreen500 = 0xff8bc34a; + EASY_CONSTEXPR color_t LightGreen600 = 0xff7cb342; + EASY_CONSTEXPR color_t LightGreen700 = 0xff689f38; + EASY_CONSTEXPR color_t LightGreen800 = 0xff558b2f; + EASY_CONSTEXPR color_t LightGreen900 = 0xff33691e; + EASY_CONSTEXPR color_t LightGreenA100 = 0xffccff90; + EASY_CONSTEXPR color_t LightGreenA200 = 0xffb2ff59; + EASY_CONSTEXPR color_t LightGreenA400 = 0xff76ff03; + EASY_CONSTEXPR color_t LightGreenA700 = 0xff64dd17; + + EASY_CONSTEXPR color_t Lime50 = 0xfff9ebe7; + EASY_CONSTEXPR color_t Lime100 = 0xfff0f4c3; + EASY_CONSTEXPR color_t Lime200 = 0xffe6ee9c; + EASY_CONSTEXPR color_t Lime300 = 0xffdce775; + EASY_CONSTEXPR color_t Lime400 = 0xffd4e157; + EASY_CONSTEXPR color_t Lime500 = 0xffcddc39; + EASY_CONSTEXPR color_t Lime600 = 0xffc0ca33; + EASY_CONSTEXPR color_t Lime700 = 0xffafb42b; + EASY_CONSTEXPR color_t Lime800 = 0xff9e9d24; + EASY_CONSTEXPR color_t Lime900 = 0xff827717; + EASY_CONSTEXPR color_t LimeA100 = 0xfff4ff81; + EASY_CONSTEXPR color_t LimeA200 = 0xffeeff41; + EASY_CONSTEXPR color_t LimeA400 = 0xffc6ff00; + EASY_CONSTEXPR color_t LimeA700 = 0xffaeea00; + + EASY_CONSTEXPR color_t Yellow50 = 0xfffffde7; + EASY_CONSTEXPR color_t Yellow100 = 0xfffff9c4; + EASY_CONSTEXPR color_t Yellow200 = 0xfffff59d; + EASY_CONSTEXPR color_t Yellow300 = 0xfffff176; + EASY_CONSTEXPR color_t Yellow400 = 0xffffee58; + EASY_CONSTEXPR color_t Yellow500 = 0xffffeb3b; + EASY_CONSTEXPR color_t Yellow600 = 0xfffdd835; + EASY_CONSTEXPR color_t Yellow700 = 0xfffbc02d; + EASY_CONSTEXPR color_t Yellow800 = 0xfff9a825; + EASY_CONSTEXPR color_t Yellow900 = 0xfff57f17; + EASY_CONSTEXPR color_t YellowA100 = 0xffffff8d; + EASY_CONSTEXPR color_t YellowA200 = 0xffffff00; + EASY_CONSTEXPR color_t YellowA400 = 0xffffea00; + EASY_CONSTEXPR color_t YellowA700 = 0xffffd600; + + EASY_CONSTEXPR color_t Amber50 = 0xfffff8e1; + EASY_CONSTEXPR color_t Amber100 = 0xffffecb3; + EASY_CONSTEXPR color_t Amber200 = 0xffffe082; + EASY_CONSTEXPR color_t Amber300 = 0xffffd54f; + EASY_CONSTEXPR color_t Amber400 = 0xffffca28; + EASY_CONSTEXPR color_t Amber500 = 0xffffc107; + EASY_CONSTEXPR color_t Amber600 = 0xffffb300; + EASY_CONSTEXPR color_t Amber700 = 0xffffa000; + EASY_CONSTEXPR color_t Amber800 = 0xffff8f00; + EASY_CONSTEXPR color_t Amber900 = 0xffff6f00; + EASY_CONSTEXPR color_t AmberA100 = 0xffffe57f; + EASY_CONSTEXPR color_t AmberA200 = 0xffffd740; + EASY_CONSTEXPR color_t AmberA400 = 0xffffc400; + EASY_CONSTEXPR color_t AmberA700 = 0xffffab00; + + EASY_CONSTEXPR color_t Orange50 = 0xfffff3e0; + EASY_CONSTEXPR color_t Orange100 = 0xffffe0b2; + EASY_CONSTEXPR color_t Orange200 = 0xffffcc80; + EASY_CONSTEXPR color_t Orange300 = 0xffffb74d; + EASY_CONSTEXPR color_t Orange400 = 0xffffa726; + EASY_CONSTEXPR color_t Orange500 = 0xffff9800; + EASY_CONSTEXPR color_t Orange600 = 0xfffb8c00; + EASY_CONSTEXPR color_t Orange700 = 0xfff57c00; + EASY_CONSTEXPR color_t Orange800 = 0xffef6c00; + EASY_CONSTEXPR color_t Orange900 = 0xffe65100; + EASY_CONSTEXPR color_t OrangeA100 = 0xffffd180; + EASY_CONSTEXPR color_t OrangeA200 = 0xffffab40; + EASY_CONSTEXPR color_t OrangeA400 = 0xffff9100; + EASY_CONSTEXPR color_t OrangeA700 = 0xffff6d00; + + EASY_CONSTEXPR color_t DeepOrange50 = 0xfffbe9e7; + EASY_CONSTEXPR color_t DeepOrange100 = 0xffffccbc; + EASY_CONSTEXPR color_t DeepOrange200 = 0xffffab91; + EASY_CONSTEXPR color_t DeepOrange300 = 0xffff8a65; + EASY_CONSTEXPR color_t DeepOrange400 = 0xffff7043; + EASY_CONSTEXPR color_t DeepOrange500 = 0xffff5722; + EASY_CONSTEXPR color_t DeepOrange600 = 0xfff4511e; + EASY_CONSTEXPR color_t DeepOrange700 = 0xffe64a19; + EASY_CONSTEXPR color_t DeepOrange800 = 0xffd84315; + EASY_CONSTEXPR color_t DeepOrange900 = 0xffbf360c; + EASY_CONSTEXPR color_t DeepOrangeA100 = 0xffff9e80; + EASY_CONSTEXPR color_t DeepOrangeA200 = 0xffff6e40; + EASY_CONSTEXPR color_t DeepOrangeA400 = 0xffff3d00; + EASY_CONSTEXPR color_t DeepOrangeA700 = 0xffdd2c00; + + EASY_CONSTEXPR color_t Brown50 = 0xffefebe9; + EASY_CONSTEXPR color_t Brown100 = 0xffd7ccc8; + EASY_CONSTEXPR color_t Brown200 = 0xffbcaaa4; + EASY_CONSTEXPR color_t Brown300 = 0xffa1887f; + EASY_CONSTEXPR color_t Brown400 = 0xff8d6e63; + EASY_CONSTEXPR color_t Brown500 = 0xff795548; + EASY_CONSTEXPR color_t Brown600 = 0xff6d4c41; + EASY_CONSTEXPR color_t Brown700 = 0xff5d4037; + EASY_CONSTEXPR color_t Brown800 = 0xff4e342e; + EASY_CONSTEXPR color_t Brown900 = 0xff3e2723; + + EASY_CONSTEXPR color_t Grey50 = 0xfffafafa; + EASY_CONSTEXPR color_t Grey100 = 0xfff5f5f5; + EASY_CONSTEXPR color_t Grey200 = 0xffeeeeee; + EASY_CONSTEXPR color_t Grey300 = 0xffe0e0e0; + EASY_CONSTEXPR color_t Grey400 = 0xffbdbdbd; + EASY_CONSTEXPR color_t Grey500 = 0xff9e9e9e; + EASY_CONSTEXPR color_t Grey600 = 0xff757575; + EASY_CONSTEXPR color_t Grey700 = 0xff616161; + EASY_CONSTEXPR color_t Grey800 = 0xff424242; + EASY_CONSTEXPR color_t Grey900 = 0xff212121; + + EASY_CONSTEXPR color_t BlueGrey50 = 0xffeceff1; + EASY_CONSTEXPR color_t BlueGrey100 = 0xffcfd8dc; + EASY_CONSTEXPR color_t BlueGrey200 = 0xffb0bec5; + EASY_CONSTEXPR color_t BlueGrey300 = 0xff90a4ae; + EASY_CONSTEXPR color_t BlueGrey400 = 0xff78909c; + EASY_CONSTEXPR color_t BlueGrey500 = 0xff607d8b; + EASY_CONSTEXPR color_t BlueGrey600 = 0xff546e7a; + EASY_CONSTEXPR color_t BlueGrey700 = 0xff455a64; + EASY_CONSTEXPR color_t BlueGrey800 = 0xff37474f; + EASY_CONSTEXPR color_t BlueGrey900 = 0xff263238; + + EASY_CONSTEXPR color_t Black = 0xff000000; + EASY_CONSTEXPR color_t White = 0xffffffff; + EASY_CONSTEXPR color_t Null = 0x00000000; + + + EASY_CONSTEXPR color_t Red = Red500; + EASY_CONSTEXPR color_t DarkRed = Red900; + EASY_CONSTEXPR color_t Coral = Red200; + EASY_CONSTEXPR color_t RichRed = 0xffff0000; + EASY_CONSTEXPR color_t Pink = Pink500; + EASY_CONSTEXPR color_t Rose = PinkA100; + EASY_CONSTEXPR color_t Purple = Purple500; + EASY_CONSTEXPR color_t Magenta = PurpleA200; + EASY_CONSTEXPR color_t DarkMagenta = PurpleA700; + EASY_CONSTEXPR color_t DeepPurple = DeepPurple500; + EASY_CONSTEXPR color_t Indigo = Indigo500; + EASY_CONSTEXPR color_t Blue = Blue500; + EASY_CONSTEXPR color_t DarkBlue = Blue900; + EASY_CONSTEXPR color_t RichBlue = 0xff0000ff; + EASY_CONSTEXPR color_t LightBlue = LightBlue500; + EASY_CONSTEXPR color_t SkyBlue = LightBlueA100; + EASY_CONSTEXPR color_t Navy = LightBlue800; + EASY_CONSTEXPR color_t Cyan = Cyan500; + EASY_CONSTEXPR color_t DarkCyan = Cyan900; + EASY_CONSTEXPR color_t Teal = Teal500; + EASY_CONSTEXPR color_t DarkTeal = Teal900; + EASY_CONSTEXPR color_t Green = Green500; + EASY_CONSTEXPR color_t DarkGreen = Green900; + EASY_CONSTEXPR color_t RichGreen = 0xff00ff00; + EASY_CONSTEXPR color_t LightGreen = LightGreen500; + EASY_CONSTEXPR color_t Mint = LightGreen900; + EASY_CONSTEXPR color_t Lime = Lime500; + EASY_CONSTEXPR color_t Olive = Lime900; + EASY_CONSTEXPR color_t Yellow = Yellow500; + EASY_CONSTEXPR color_t RichYellow = YellowA200; + EASY_CONSTEXPR color_t Amber = Amber500; + EASY_CONSTEXPR color_t Gold = Amber300; + EASY_CONSTEXPR color_t PaleGold = AmberA100; + EASY_CONSTEXPR color_t Orange = Orange500; + EASY_CONSTEXPR color_t Skin = Orange100; + EASY_CONSTEXPR color_t DeepOrange = DeepOrange500; + EASY_CONSTEXPR color_t Brick = DeepOrange900; + EASY_CONSTEXPR color_t Brown = Brown500; + EASY_CONSTEXPR color_t DarkBrown = Brown900; + EASY_CONSTEXPR color_t CreamWhite = Orange50; + EASY_CONSTEXPR color_t Wheat = Amber100; + EASY_CONSTEXPR color_t Grey = Grey500; + EASY_CONSTEXPR color_t Dark = Grey900; + EASY_CONSTEXPR color_t Silver = Grey300; + EASY_CONSTEXPR color_t BlueGrey = BlueGrey500; + + EASY_CONSTEXPR color_t Default = Wheat; +#else + EASY_CONSTEXPR color_t Default = 0xffffecb3; +#endif // #if !defined(EASY_OPTION_BUILTIN_COLORS) || EASY_OPTION_BUILTIN_COLORS == 0 + + } // END of namespace colors. + +} // END of namespace profiler. + +////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER_COLORS_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_public_types.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_public_types.h new file mode 100644 index 0000000..d19af70 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/details/profiler_public_types.h @@ -0,0 +1,203 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_PUBLIC_TYPES_H +#define EASY_PROFILER_PUBLIC_TYPES_H + +#include + +class NonscopedBlock; +class ProfileManager; +struct ThreadStorage; + +namespace profiler { + + using timestamp_t = uint64_t; + using thread_id_t = uint64_t; + using block_id_t = uint32_t; + + enum class BlockType : uint8_t + { + Event = 0, + Block, + Value, + + TypesCount + }; + using block_type_t = BlockType; + + enum Duration : uint8_t + { + TICKS = 0, ///< CPU ticks + MICROSECONDS ///< Microseconds + }; + + //*********************************************** + +#pragma pack(push,1) + class PROFILER_API BaseBlockDescriptor + { + friend ::ProfileManager; + friend ::ThreadStorage; + + protected: + + block_id_t m_id; ///< This descriptor id (We can afford this spending because there are much more blocks than descriptors) + int32_t m_line; ///< Line number in the source file + color_t m_color; ///< Color of the block packed into 1-byte structure + block_type_t m_type; ///< Type of the block (See BlockType) + EasyBlockStatus m_status; ///< If false then blocks with such id() will not be stored by profiler during profile session + + explicit BaseBlockDescriptor(block_id_t _id, EasyBlockStatus _status, int _line, block_type_t _block_type, color_t _color) EASY_NOEXCEPT; + + public: + + BaseBlockDescriptor() = delete; + + inline block_id_t id() const EASY_NOEXCEPT { return m_id; } + inline int32_t line() const EASY_NOEXCEPT { return m_line; } + inline color_t color() const EASY_NOEXCEPT { return m_color; } + inline block_type_t type() const EASY_NOEXCEPT { return m_type; } + inline EasyBlockStatus status() const EASY_NOEXCEPT { return m_status; } + + }; // END of class BaseBlockDescriptor. + + //*********************************************** + + class PROFILER_API Event + { + friend ::ProfileManager; + + protected: + + timestamp_t m_begin; + timestamp_t m_end; + + public: + + Event() = delete; + + Event(const Event&) = default; + explicit Event(timestamp_t _begin_time) EASY_NOEXCEPT; + explicit Event(timestamp_t _begin_time, timestamp_t _end_time) EASY_NOEXCEPT; + + inline timestamp_t begin() const EASY_NOEXCEPT { return m_begin; } + inline timestamp_t end() const EASY_NOEXCEPT { return m_end; } + inline timestamp_t duration() const EASY_NOEXCEPT { return m_end - m_begin; } + + }; // END class Event. + + class PROFILER_API BaseBlockData : public Event + { + friend ::ProfileManager; + + protected: + + block_id_t m_id; + + public: + + BaseBlockData() = delete; + + BaseBlockData(const BaseBlockData&) = default; + explicit BaseBlockData(timestamp_t _begin_time, block_id_t _id) EASY_NOEXCEPT; + explicit BaseBlockData(timestamp_t _begin_time, timestamp_t _end_time, block_id_t _id) EASY_NOEXCEPT; + + inline block_id_t id() const EASY_NOEXCEPT { return m_id; } + inline void setId(block_id_t _id) EASY_NOEXCEPT { m_id = _id; } + + }; // END of class BaseBlockData. +#pragma pack(pop) + + //*********************************************** + + class PROFILER_API Block : public BaseBlockData + { + friend ::ProfileManager; + friend ::ThreadStorage; + friend ::NonscopedBlock; + + const char* m_name; + EasyBlockStatus m_status; + bool m_isScoped; + + private: + + void start(); + void start(timestamp_t _time) EASY_NOEXCEPT; + void finish(); + void finish(timestamp_t _time) EASY_NOEXCEPT; + inline bool finished() const EASY_NOEXCEPT { return m_end >= m_begin; } + inline EasyBlockStatus status() const EASY_NOEXCEPT { return m_status; } + inline void setStatus(EasyBlockStatus _status) EASY_NOEXCEPT { m_status = _status; } + + public: + + Block(const Block&) = delete; + Block& operator = (const Block&) = delete; + + Block(Block&& that) EASY_NOEXCEPT; + Block(const BaseBlockDescriptor* _desc, const char* _runtimeName, bool _scoped = true) EASY_NOEXCEPT; + Block(timestamp_t _begin_time, block_id_t _id, const char* _runtimeName) EASY_NOEXCEPT; + Block(timestamp_t _begin_time, timestamp_t _end_time, block_id_t _id, const char* _runtimeName) EASY_NOEXCEPT; + ~Block(); + + inline const char* name() const EASY_NOEXCEPT { return m_name; } + + }; // END of class Block. + + //*********************************************** + + class PROFILER_API ThreadGuard EASY_FINAL + { + friend ::ProfileManager; + thread_id_t m_id = 0; + + public: + + ~ThreadGuard(); + + }; // END of class ThreadGuard. + +} // END of namespace profiler. + +#endif // EASY_PROFILER_PUBLIC_TYPES_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/easy_net.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/easy_net.h new file mode 100644 index 0000000..cf2d092 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/easy_net.h @@ -0,0 +1,161 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_NET_H +#define EASY_NET_H + +#include +#include + +namespace profiler { namespace net { + +EASY_CONSTEXPR uint32_t EASY_MESSAGE_SIGN = 20160909; + +#pragma pack(push,1) + +enum class MessageType : uint8_t +{ + Undefined = 0, + + Request_Start_Capture, + Reply_Capturing_Started, + Request_Stop_Capture, + + Reply_Blocks, + Reply_Blocks_End, + + Connection_Accepted, + + Request_Blocks_Description, + Reply_Blocks_Description, + Reply_Blocks_Description_End, + + Change_Block_Status, + Change_Event_Tracing_Status, + Change_Event_Tracing_Priority, + + Ping, + + Request_MainThread_FPS, + Reply_MainThread_FPS, +}; + +struct Message +{ + uint32_t magic_number = EASY_MESSAGE_SIGN; + MessageType type = MessageType::Undefined; + + bool isEasyNetMessage() const EASY_NOEXCEPT { + return EASY_MESSAGE_SIGN == magic_number; + } + + explicit Message(MessageType _t) EASY_NOEXCEPT : type(_t) { } + + Message() = default; +}; + +struct DataMessage : public Message +{ + uint32_t size = 0; // bytes + + explicit DataMessage(MessageType _t = MessageType::Reply_Blocks) : Message(_t) {} + explicit DataMessage(uint32_t _s, MessageType _t = MessageType::Reply_Blocks) : Message(_t), size(_s) {} + + const char* data() const { return reinterpret_cast(this) + sizeof(DataMessage); } +}; + +struct BlockStatusMessage : public Message +{ + uint32_t id; + uint8_t status; + + explicit BlockStatusMessage(uint32_t _id, uint8_t _status) + : Message(MessageType::Change_Block_Status), id(_id), status(_status) { } + + BlockStatusMessage() = delete; +}; + +struct EasyProfilerStatus : public Message +{ + bool isProfilerEnabled; + bool isEventTracingEnabled; + bool isLowPriorityEventTracing; + + explicit EasyProfilerStatus(bool _enabled, bool _ETenabled, bool _ETlowp) + : Message(MessageType::Connection_Accepted) + , isProfilerEnabled(_enabled) + , isEventTracingEnabled(_ETenabled) + , isLowPriorityEventTracing(_ETlowp) + { + } + + EasyProfilerStatus() = delete; +}; + +struct BoolMessage : public Message +{ + bool flag = false; + + explicit BoolMessage(MessageType _t, bool _flag = false) + : Message(_t), flag(_flag) { } + + BoolMessage() = default; +}; + +struct TimestampMessage : public Message +{ + uint32_t maxValue = 0; + uint32_t avgValue = 0; + + explicit TimestampMessage(MessageType _t, uint32_t _maxValue, uint32_t _avgValue) + : Message(_t), maxValue(_maxValue), avgValue(_avgValue) { } + + TimestampMessage() = default; +}; + +#pragma pack(pop) + +}//net + +}//profiler + +#endif // EASY_NET_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/easy_socket.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/easy_socket.h new file mode 100644 index 0000000..064ba6a --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/easy_socket.h @@ -0,0 +1,130 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ +#ifndef EASY_PROFILER_SOCKET_H +#define EASY_PROFILER_SOCKET_H + +#include +#include + +#ifndef _WIN32 + +// Unix +# include +# include +# include +# include +# include +# include +# include //for android-build + +#else + +// Windows +# define WIN32_LEAN_AND_MEAN +# include +# include +# include +# include + +#endif + +class PROFILER_API EasySocket EASY_FINAL +{ +public: + +#ifdef _WIN32 + typedef SOCKET socket_t; +#else + typedef int socket_t; +#endif + + enum class ConnectionState : int8_t + { + Disconnected = -1, + Unknown, + Connected, + Connecting + }; + +private: + + socket_t m_socket = 0; + socket_t m_replySocket = 0; + int m_wsaret = -1; + + struct hostent* m_server = nullptr; + struct sockaddr_in m_serverAddress; + + ConnectionState m_state = ConnectionState::Unknown; + +public: + + EasySocket(); + ~EasySocket(); + + void setReceiveTimeout(int milliseconds); + + int send(const void* buf, size_t nbyte); + int receive(void* buf, size_t nbyte); + int listen(int count = 5); + int accept(); + int bind(uint16_t portno); + + bool setAddress(const char* serv, uint16_t port); + int connect(); + + void flush(); + void init(); + + ConnectionState state() const; + bool isDisconnected() const; + bool isConnected() const; + +private: + + void checkResult(int result); + bool checkSocket(socket_t s) const; + void setBlocking(socket_t s, bool blocking); + +}; // end of class EasySocket. + +#endif // EASY_PROFILER_SOCKET_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/profiler.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/profiler.h new file mode 100644 index 0000000..dffc525 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/profiler.h @@ -0,0 +1,910 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_H +#define EASY_PROFILER_H + +#include + +#if defined ( __clang__ ) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments" +#endif + +// +// BUILD_WITH_EASY_PROFILER is defined in CMakeLists.txt if your project is linked to easy_profiler. +// + +// +// DISABLE_EASY_PROFILER may be defined manually in source-file before #include +// to disable profiler for certain source-file or project. +// + +#if defined(BUILD_WITH_EASY_PROFILER) && !defined(DISABLE_EASY_PROFILER) + +/** +\defgroup profiler EasyProfiler +*/ + + +/** Indicates that EasyProfiler is used. + +\ingroup profiler +*/ +#define USING_EASY_PROFILER + + +// EasyProfiler core API: + +/** Macro for beginning of a scoped block with custom name and color. + +\code + #include + void foo() + { + // some code ... + + EASY_BLOCK("Check something", profiler::OFF); // Disabled block (There is possibility to enable this block later via GUI) + if(something){ + EASY_BLOCK("Calling bar()"); // Block with default color + bar(); + } + else{ + EASY_BLOCK("Calling baz()", profiler::colors::Red); // Red block + baz(); + } + EASY_END_BLOCK; // End of "Check something" block (Even if "Check something" is disabled, this EASY_END_BLOCK will not end any other block). + + EASY_BLOCK("Some another block", profiler::colors::Blue, profiler::ON_WITHOUT_CHILDREN); // Block with Blue color without + // some another code... + EASY_BLOCK("Calculate sum"); // This block will not be profiled because it's parent is ON_WITHOUT_CHILDREN + int sum = 0; + for (int i = 0; i < 10; ++i) + sum += i; + EASY_END_BLOCK; // End of "Calculate sum" block + } +\endcode + +Block will be automatically completed by destructor. + +\ingroup profiler +*/ +# define EASY_BLOCK(name, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), ::profiler::registerDescription(::profiler::extract_enable_flag(__VA_ARGS__),\ + EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name), __FILE__, __LINE__, ::profiler::BlockType::Block, ::profiler::extract_color(__VA_ARGS__),\ + ::std::is_base_of<::profiler::ForceConstStr, decltype(name)>::value));\ + ::profiler::Block EASY_UNIQUE_BLOCK(__LINE__)(EASY_UNIQUE_DESC(__LINE__), EASY_RUNTIME_NAME(name));\ + ::profiler::beginBlock(EASY_UNIQUE_BLOCK(__LINE__)); + +/** Macro for beginning of a non-scoped block with custom name and color. + +You must end such block manually with EASY_END_BLOCK. + +\code + #include + void foo() { + EASY_NONSCOPED_BLOCK("Callback"); // Begin block which would not be finished when function returns. + + // some code ... + } + + void bar() { + // some another code... + + EASY_END_BLOCK; // This, as always, ends last opened block. You have to take care about blocks order by yourself. + } + + void baz() { + foo(); // non-scoped block begins here + + // some code... + + bar(); // non-scoped block ends here + } +\endcode + +Block will be automatically completed by destructor. + +\ingroup profiler +*/ +#define EASY_NONSCOPED_BLOCK(name, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), ::profiler::registerDescription(::profiler::extract_enable_flag(__VA_ARGS__),\ + EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name), __FILE__, __LINE__, ::profiler::BlockType::Block, ::profiler::extract_color(__VA_ARGS__),\ + ::std::is_base_of<::profiler::ForceConstStr, decltype(name)>::value));\ + ::profiler::beginNonScopedBlock(EASY_UNIQUE_DESC(__LINE__), EASY_RUNTIME_NAME(name)); + +/** Macro for beginning of a block with function name and custom color. + +\code + #include + void foo(){ + EASY_FUNCTION(); // Block with name="foo" and default color + //some code... + } + + void bar(){ + EASY_FUNCTION(profiler::colors::Green); // Green block with name="bar" + //some code... + } + + void baz(){ + EASY_FUNCTION(profiler::FORCE_ON); // Force enabled block with name="baz" and default color (This block will be profiled even if it's parent is OFF_RECURSIVE) + // som code... + } +\endcode + +Name of the block automatically created with function name. + +\ingroup profiler +*/ +# define EASY_FUNCTION(...) EASY_BLOCK(EASY_FUNC_NAME, ## __VA_ARGS__) + +/** Macro for completion of last opened block explicitly. + +\code +#include +int foo() +{ + // some code ... + + int sum = 0; + EASY_BLOCK("Calculating sum"); + for (int i = 0; i < 10; ++i){ + sum += i; + } + EASY_END_BLOCK; + + // some antoher code here ... + + return sum; +} +\endcode + +\ingroup profiler +*/ +# define EASY_END_BLOCK ::profiler::endBlock(); + +/** Macro for creating event marker with custom name and color. + +Event marker is a block with zero duration and special type. + +\warning Event marker ends immidiately and calling EASY_END_BLOCK after EASY_EVENT +will end previously opened EASY_BLOCK or EASY_FUNCTION. + +\ingroup profiler +*/ +# define EASY_EVENT(name, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), ::profiler::registerDescription(\ + ::profiler::extract_enable_flag(__VA_ARGS__), EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name),\ + __FILE__, __LINE__, ::profiler::BlockType::Event, ::profiler::extract_color(__VA_ARGS__),\ + ::std::is_base_of<::profiler::ForceConstStr, decltype(name)>::value));\ + ::profiler::storeEvent(EASY_UNIQUE_DESC(__LINE__), EASY_RUNTIME_NAME(name)); + +/** Macro for enabling profiler. + +\ingroup profiler +*/ +# define EASY_PROFILER_ENABLE ::profiler::setEnabled(true); + +/** Macro for disabling profiler. + +\ingroup profiler +*/ +# define EASY_PROFILER_DISABLE ::profiler::setEnabled(false); + +/** Macro for current thread registration. + +\note If this thread has been already registered then nothing happens. + +\ingroup profiler +*/ +# define EASY_THREAD(name)\ + EASY_THREAD_LOCAL static const char* EASY_TOKEN_CONCATENATE(unique_profiler_thread_name, __LINE__) = 0;\ + if (!EASY_TOKEN_CONCATENATE(unique_profiler_thread_name, __LINE__))\ + EASY_TOKEN_CONCATENATE(unique_profiler_thread_name, __LINE__) = ::profiler::registerThread(name); + +/** Macro for current thread registration and creating a thread guard object. + +\note If this thread has been already registered then nothing happens. + +\note Also creates thread guard which marks thread as "expired" on it's destructor +and creates "ThreadFinished" profiler event. + +\ingroup profiler +*/ +# define EASY_THREAD_SCOPE(name)\ + EASY_THREAD_LOCAL static const char* EASY_TOKEN_CONCATENATE(unique_profiler_thread_name, __LINE__) = 0;\ + ::profiler::ThreadGuard EASY_TOKEN_CONCATENATE(unique_profiler_thread_guard, __LINE__);\ + if (!EASY_TOKEN_CONCATENATE(unique_profiler_thread_name, __LINE__))\ + EASY_TOKEN_CONCATENATE(unique_profiler_thread_name, __LINE__) = ::profiler::registerThreadScoped(name,\ + EASY_TOKEN_CONCATENATE(unique_profiler_thread_guard, __LINE__)); + +/** Macro for main thread registration. + +This is just for user's comfort. There is no difference for EasyProfiler GUI between different threads. + +\ingroup profiler +*/ +# define EASY_MAIN_THREAD EASY_THREAD("Main") + +/** Enable or disable event tracing (context switch events). + +\note Default value is controlled by EASY_OPTION_EVENT_TRACING_ENABLED macro. + +\note Change will take effect on the next call to EASY_PROFILER_ENABLE. + +\sa EASY_PROFILER_ENABLE, EASY_OPTION_EVENT_TRACING_ENABLED + +\ingroup profiler +*/ +# define EASY_SET_EVENT_TRACING_ENABLED(isEnabled) ::profiler::setEventTracingEnabled(isEnabled); + +/** Set event tracing thread priority (low or normal). + +Event tracing with low priority will affect your application performance much more less, but +it can be late to gather information about thread/process (thread could be finished to the moment +when event tracing thread will be awaken) and you will not see process name and process id +information in GUI for such threads. You will still be able to see all context switch events. + +Event tracing with normal priority could gather more information about processes but potentially +it could affect performance as it has more work to do. Usually you will not notice any performance +breakdown, but if you care about that then you change set event tracing priority level to low. + +\sa EASY_OPTION_LOW_PRIORITY_EVENT_TRACING + +\ingroup profiler +*/ +# define EASY_SET_LOW_PRIORITY_EVENT_TRACING(isLowPriority) ::profiler::setLowPriorityEventTracing(isLowPriority); + +/** Macro for setting temporary log-file path for Unix event tracing system. + +\note Default value is "/tmp/cs_profiling_info.log". + +\ingroup profiler +*/ +# define EASY_EVENT_TRACING_SET_LOG(filename) ::profiler::setContextSwitchLogFilename(filename); + +/** Macro returning current path to the temporary log-file for Unix event tracing system. + +\ingroup profiler +*/ +# define EASY_EVENT_TRACING_LOG ::profiler::getContextSwitchLogFilename(); + +// EasyProfiler settings: + +/** If != 0 then EasyProfiler will measure time for blocks storage expansion. +If 0 then EasyProfiler will be compiled without blocks of code responsible +for measuring these events. + +These are "EasyProfiler.ExpandStorage" blocks on a diagram. + +\ingroup profiler +*/ +# ifndef EASY_OPTION_MEASURE_STORAGE_EXPAND +# define EASY_OPTION_MEASURE_STORAGE_EXPAND 0 +# endif + +# if EASY_OPTION_MEASURE_STORAGE_EXPAND != 0 +/** If true then "EasyProfiler.ExpandStorage" blocks are enabled by default and will be +writed to output file or translated over the net. +If false then you need to enable these blocks via GUI if you want to see them. + +\ingroup profiler +*/ +# ifndef EASY_OPTION_STORAGE_EXPAND_BLOCKS_ON +# define EASY_OPTION_STORAGE_EXPAND_BLOCKS_ON true +# endif + +# endif // EASY_OPTION_MEASURE_STORAGE_EXPAND != 0 + +/** If true then EasyProfiler event tracing is enabled by default +and will be turned on and off when you call profiler::setEnabled(). +Otherwise, it have to be turned on via GUI and then it will be +turned on/off with next calls of profiler::setEnabled(). + +\ingroup profiler +*/ +# ifndef EASY_OPTION_EVENT_TRACING_ENABLED +# define EASY_OPTION_EVENT_TRACING_ENABLED true +# endif + +/** If true then EasyProfiler.ETW thread (Event tracing for Windows) will have low priority by default. + +\sa EASY_SET_LOW_PRIORITY_EVENT_TRACING + +\note You can always change priority level via GUI or API while profiling session is not launched. +You don't need to rebuild or restart your application for that. + +\ingroup profiler +*/ +# ifndef EASY_OPTION_LOW_PRIORITY_EVENT_TRACING +# define EASY_OPTION_LOW_PRIORITY_EVENT_TRACING true +# endif + + +/** If != 0 then EasyProfiler will print error messages into stderr. +Otherwise, no log messages will be printed. + +\ingroup profiler +*/ +# ifndef EASY_OPTION_LOG_ENABLED +# define EASY_OPTION_LOG_ENABLED 0 +# endif + +/** If != 0 then EasyProfiler will start listening thread immidiately on ProfileManager initialization. + +\sa startListen + +\ingroup profiler +*/ +# ifndef EASY_OPTION_START_LISTEN_ON_STARTUP +# define EASY_OPTION_START_LISTEN_ON_STARTUP 0 +# endif + +#else // #ifdef BUILD_WITH_EASY_PROFILER + +# define EASY_BLOCK(...) +# define EASY_NONSCOPED_BLOCK(...) +# define EASY_FUNCTION(...) +# define EASY_END_BLOCK +# define EASY_PROFILER_ENABLE +# define EASY_PROFILER_DISABLE +# define EASY_EVENT(...) +# define EASY_THREAD(...) +# define EASY_THREAD_SCOPE(...) +# define EASY_MAIN_THREAD +# define EASY_SET_EVENT_TRACING_ENABLED(isEnabled) +# define EASY_SET_LOW_PRIORITY_EVENT_TRACING(isLowPriority) + +# ifndef _WIN32 +# define EASY_EVENT_TRACING_SET_LOG(filename) +# define EASY_EVENT_TRACING_LOG "" +# endif + +# ifndef EASY_OPTION_MEASURE_STORAGE_EXPAND +# define EASY_OPTION_MEASURE_STORAGE_EXPAND 0 +# endif + +# ifndef EASY_OPTION_EVENT_TRACING_ENABLED +# define EASY_OPTION_EVENT_TRACING_ENABLED false +# endif + +# ifndef EASY_OPTION_LOW_PRIORITY_EVENT_TRACING +# define EASY_OPTION_LOW_PRIORITY_EVENT_TRACING true +# endif + +# ifndef EASY_OPTION_LOG_ENABLED +# define EASY_OPTION_LOG_ENABLED 0 +# endif + +# ifndef EASY_OPTION_START_LISTEN_ON_STARTUP +# define EASY_OPTION_START_LISTEN_ON_STARTUP 0 +# endif + +#endif // #ifndef BUILD_WITH_EASY_PROFILER + +# ifndef EASY_DEFAULT_PORT +# define EASY_DEFAULT_PORT 28077 +# endif + +/** Alias for EASY_PROFILER_ENABLE. + +Added for clarification. + +\sa EASY_PROFILER_ENABLE + +\ingroup profiler +*/ +#define EASY_START_CAPTURE EASY_PROFILER_ENABLE + +/** Alias for EASY_PROFILER_DISABLE. + +Added for clarification. + +\sa EASY_PROFILER_DISABLE + +\ingroup profiler +*/ +#define EASY_STOP_CAPTURE EASY_PROFILER_DISABLE + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +namespace profiler { + + EASY_CONSTEXPR uint16_t DEFAULT_PORT = EASY_DEFAULT_PORT; + + ////////////////////////////////////////////////////////////////////// + // Core API + // Note: It is better to use macros defined above than a direct calls to API. + // But some API functions does not have macro wrappers... + +#ifdef USING_EASY_PROFILER + extern "C" { + + /** Returns current time in ticks. + + You can use it if you want to store block explicitly. + + \retval Current CPU time in ticks. + + \ingroup profiler + */ + PROFILER_API timestamp_t currentTime(); + + /** Convert ticks to nanoseconds. + + \retval _ticks converted to nanoseconds. + + \ingroup profiler + */ + PROFILER_API timestamp_t toNanoseconds(timestamp_t _ticks); + + /** Convert ticks to microseconds. + + \retval _ticks converted to microseconds. + + \ingroup profiler + */ + PROFILER_API timestamp_t toMicroseconds(timestamp_t _ticks); + + /** Registers static description of a block. + + It is general information which is common for all such blocks. + Includes color, block type (see BlockType), file-name, line-number, compile-time name of a block and enable-flag. + + \note This API function is used by EASY_EVENT, EASY_BLOCK, EASY_FUNCTION macros. + There is no need to invoke this function explicitly. + + \retval Pointer to registered block description. + + \ingroup profiler + */ + PROFILER_API const BaseBlockDescriptor* registerDescription(EasyBlockStatus _status, const char* _autogenUniqueId, const char* _compiletimeName, const char* _filename, int _line, block_type_t _block_type, color_t _color, bool _copyName = false); + + /** Stores event in the blocks list. + + An event ends instantly and has zero duration. + + \note There is no need to invoke this function explicitly - use EASY_EVENT macro instead. + + \param _desc Reference to the previously registered description. + \param _runtimeName Standard zero-terminated string which will be copied to the events buffer. + + \note _runtimeName must be an empty string ("") if you do not want to set name to the event at run-time. + + \ingroup profiler + */ + PROFILER_API void storeEvent(const BaseBlockDescriptor* _desc, const char* _runtimeName = ""); + + /** Stores block explicitly in the blocks list. + + Use this function for additional flexibility if you want to set block duration manually. + + \param _desc Reference to the previously registered description. + \param _runtimeName Standard zero-terminated string which will be copied to the events buffer. + \param _beginTime begin time of the block + \param _endTime end time of the block + + \note _runtimeName must be an empty string ("") if you do not want to set name to the block at run-time. + + \ingroup profiler + */ + PROFILER_API void storeBlock(const BaseBlockDescriptor* _desc, const char* _runtimeName, timestamp_t _beginTime, timestamp_t _endTime); + + /** Begins scoped block. + + \ingroup profiler + */ + PROFILER_API void beginBlock(Block& _block); + + /** Begins non-scoped block. + + \param _desc Reference to the previously registered description (see registerDescription). + \param _runtimeName Standard zero-terminated string which will be copied to the block buffer when block will end. + + \note There is no need to invoke this function explicitly - use EASY_NONSCOPED_BLOCK macro instead. + EASY_NONSCOPED_BLOCK macro could be used for higher flexibility if you have to begin block in one + function and end it in another one. + + \note _runtimeName must be an empty string ("") if you do not want to set name to the block at run-time. + \note _runtimeName is copied only when block ends so you must ensure it's validity until block end. + + \warning You have to end this block explicitly. + + \ingroup profiler + */ + PROFILER_API void beginNonScopedBlock(const BaseBlockDescriptor* _desc, const char* _runtimeName = ""); + + /** Ends last started block. + + Use this only if you want to finish block explicitly. + + \ingroup profiler + */ + PROFILER_API void endBlock(); + + /** Enable or disable profiler. + + AKA start or stop profiling (capturing blocks). + + \ingroup profiler + */ + PROFILER_API void setEnabled(bool _isEnable); + PROFILER_API bool isEnabled(); + + /** Save all gathered blocks into file. + + \note This also disables profiler. + + \retval Number of saved blocks. If 0 then nothing was profiled or an error occured. + + \ingroup profiler + */ + PROFILER_API uint32_t dumpBlocksToFile(const char* _filename); + + /** Register current thread and give it a name. + + Also creates a scoped ThreadGuard which would unregister thread on it's destructor. + This helps for memory management while using an old compiler whitout thread_local support. + + \note Only first call of registerThread() for the current thread will have an effect. + + \note Use this function if you want to build your source code with an old compiler (MSVC < 2013, GCC < 4.8, Clang < 3.3). + Otherwise there is no need in this function because a thread_local ThreadGuard created inside. + + \retval Registered name of the thread. It may differ from _name if the thread was registered before. + + \sa registerThread, ThreadGuard + + \ingroup profiler + */ + PROFILER_API const char* registerThreadScoped(const char* _name, ThreadGuard&); + + /** Register current thread and give it a name. + + \note Only first call of registerThread() for the current thread will have an effect. + + \retval Registered name of the thread. It may differ from _name if the thread was registered before. + + \ingroup profiler + */ + PROFILER_API const char* registerThread(const char* _name); + + /** Enable or disable event tracing. + + \note This change will take an effect on the next call of setEnabled(true); + + \sa setEnabled, EASY_SET_EVENT_TRACING_ENABLED + + \ingroup profiler + */ + PROFILER_API void setEventTracingEnabled(bool _isEnable); + PROFILER_API bool isEventTracingEnabled(); + + /** Set event tracing thread priority (low or normal). + + \note This change will take effect on the next call of setEnabled(true); + + \sa setEnabled, EASY_SET_LOW_PRIORITY_EVENT_TRACING + + \ingroup profiler + */ + PROFILER_API void setLowPriorityEventTracing(bool _isLowPriority); + PROFILER_API bool isLowPriorityEventTracing(); + + /** Set temporary log-file path for Unix event tracing system. + + \note Default value is "/tmp/cs_profiling_info.log". + + \ingroup profiler + */ + PROFILER_API void setContextSwitchLogFilename(const char* _name); + + /** Returns current path to the temporary log-file for Unix event tracing system. + + \ingroup profiler + */ + PROFILER_API const char* getContextSwitchLogFilename(); + + /** Start listening for network commands. + + Launches a separate listening thread which would listen to the network commands (start, stop, etc.). + The listening thread sends all profiled blocks via network after receiving network command 'stop'. + + \ingroup profiler + */ + PROFILER_API void startListen(uint16_t _port = ::profiler::DEFAULT_PORT); + + /** Stops listening thread. + + \note This would be invoked automatically on application exit. + + \note Does not send any messages to the network, just stops thread. + + \ingroup profiler + */ + PROFILER_API void stopListen(); + + /** Check if listening thread launched. + + \ingroup profiler + */ + PROFILER_API bool isListening(); + + /** Returns current major version. + + \ingroup profiler + */ + PROFILER_API uint8_t versionMajor(); + + /** Returns current minor version. + + \ingroup profiler + */ + PROFILER_API uint8_t versionMinor(); + + /** Returns current version patch. + + \ingroup profiler + */ + PROFILER_API uint16_t versionPatch(); + + /** Returns current version in 32-bit integer format. + + \note Format is: 0x MAJ-MAJ MIN-MIN PATCH-PATCH-PATCH-PATCH + For example v1.3.0 is: 0x01030000 + + \ingroup profiler + */ + PROFILER_API uint32_t version(); + + /** Returns current version string. + + Example: "v1.3.0" + + \ingroup profiler + */ + PROFILER_API const char* versionName(); + + /** Returns true if current thread has been marked as Main. + Otherwise, returns false. + + \ingroup profiler + */ + PROFILER_API bool isMainThread(); + + /** Returns last frame duration for current thread. + + \param _durationCast desired duration units (could be cpu-ticks or microseconds) + + \ingroup profiler + */ + PROFILER_API timestamp_t this_thread_frameTime(Duration _durationCast = ::profiler::MICROSECONDS); + + /** Returns local max of frame duration for current thread. + + Local max is maximum frame duration since last frameTimeLocalMax() call. + + \param _durationCast desired duration units (could be cpu-ticks or microseconds) + + \ingroup profiler + */ + PROFILER_API timestamp_t this_thread_frameTimeLocalMax(Duration _durationCast = ::profiler::MICROSECONDS); + + /** Returns local average of frame duration for current thread. + + Local average is average frame duration since last frameTimeLocalAvg() call. + + \param _durationCast desired duration units (could be cpu-ticks or microseconds) + + \ingroup profiler + */ + PROFILER_API timestamp_t this_thread_frameTimeLocalAvg(Duration _durationCast = ::profiler::MICROSECONDS); + + /** Returns last frame duration for main thread. + + \param _durationCast desired duration units (could be cpu-ticks or microseconds) + + \ingroup profiler + */ + PROFILER_API timestamp_t main_thread_frameTime(Duration _durationCast = ::profiler::MICROSECONDS); + + /** Returns local max of frame duration for main thread. + + Local max is maximum frame duration since last frameTimeLocalMax() call. + + \param _durationCast desired duration units (could be cpu-ticks or microseconds) + + \ingroup profiler + */ + PROFILER_API timestamp_t main_thread_frameTimeLocalMax(Duration _durationCast = ::profiler::MICROSECONDS); + + /** Returns local average of frame duration for main thread. + + Local average is average frame duration since last frameTimeLocalAvg() call. + + \param _durationCast desired duration units (could be cpu-ticks or microseconds) + + \ingroup profiler + */ + PROFILER_API timestamp_t main_thread_frameTimeLocalAvg(Duration _durationCast = ::profiler::MICROSECONDS); + + } +#else + inline timestamp_t currentTime() { return 0; } + inline timestamp_t toNanoseconds(timestamp_t) { return 0; } + inline timestamp_t toMicroseconds(timestamp_t) { return 0; } + inline const BaseBlockDescriptor* registerDescription(EasyBlockStatus, const char*, const char*, const char*, int, block_type_t, color_t, bool = false) + { return reinterpret_cast(0xbad); } + inline void endBlock() { } + inline void setEnabled(bool) { } + inline bool isEnabled() { return false; } + inline void storeEvent(const BaseBlockDescriptor*, const char* = "") { } + inline void storeBlock(const BaseBlockDescriptor*, const char*, timestamp_t, timestamp_t) { } + inline void beginBlock(Block&) { } + inline void beginNonScopedBlock(const BaseBlockDescriptor*, const char* = "") { } + inline uint32_t dumpBlocksToFile(const char*) { return 0; } + inline const char* registerThreadScoped(const char*, ThreadGuard&) { return ""; } + inline const char* registerThread(const char*) { return ""; } + inline void setEventTracingEnabled(bool) { } + inline bool isEventTracingEnabled() { return false; } + inline void setLowPriorityEventTracing(bool) { } + inline bool isLowPriorityEventTracing() { return false; } + inline void setContextSwitchLogFilename(const char*) { } + inline const char* getContextSwitchLogFilename() { return ""; } + inline void startListen(uint16_t = ::profiler::DEFAULT_PORT) { } + inline void stopListen() { } + inline bool isListening() { return false; } + inline uint8_t versionMajor() { return 0; } + inline uint8_t versionMinor() { return 0; } + inline uint16_t versionPatch() { return 0; } + inline uint32_t version() { return 0; } + inline const char* versionName() { return "v0.0.0_disabled"; } + inline bool isMainThread() { return false; } + inline timestamp_t this_thread_frameTime(Duration = ::profiler::MICROSECONDS) { return 0; } + inline timestamp_t this_thread_frameTimeLocalMax(Duration = ::profiler::MICROSECONDS) { return 0; } + inline timestamp_t this_thread_frameTimeLocalAvg(Duration = ::profiler::MICROSECONDS) { return 0; } + inline timestamp_t main_thread_frameTime(Duration = ::profiler::MICROSECONDS) { return 0; } + inline timestamp_t main_thread_frameTimeLocalMax(Duration = ::profiler::MICROSECONDS) { return 0; } + inline timestamp_t main_thread_frameTimeLocalAvg(Duration = ::profiler::MICROSECONDS) { return 0; } +#endif + + /** API functions binded to current thread. + + \ingroup profiler + */ + namespace this_thread { + + inline const char* registrate(const char* _name) { + return ::profiler::registerThread(_name); + } + + inline const char* registrate(const char* _name, ThreadGuard& _threadGuard) { + return ::profiler::registerThreadScoped(_name, _threadGuard); + } + + inline timestamp_t frameTime(Duration _durationCast = ::profiler::MICROSECONDS) { + return ::profiler::this_thread_frameTime(_durationCast); + } + + inline timestamp_t frameTimeLocalMax(Duration _durationCast = ::profiler::MICROSECONDS) { + return ::profiler::this_thread_frameTimeLocalMax(_durationCast); + } + + inline timestamp_t frameTimeLocalAvg(Duration _durationCast = ::profiler::MICROSECONDS) { + return ::profiler::this_thread_frameTimeLocalAvg(_durationCast); + } + + inline bool isMain() { + return ::profiler::isMainThread(); + } + + } // END of namespace this_thread. + + /** API functions binded to main thread. + + Could be called from any thread. + + \ingroup profiler + */ + namespace main_thread { + + inline timestamp_t frameTime(Duration _durationCast = ::profiler::MICROSECONDS) { + return ::profiler::main_thread_frameTime(_durationCast); + } + + inline timestamp_t frameTimeLocalMax(Duration _durationCast = ::profiler::MICROSECONDS) { + return ::profiler::main_thread_frameTimeLocalMax(_durationCast); + } + + inline timestamp_t frameTimeLocalAvg(Duration _durationCast = ::profiler::MICROSECONDS) { + return ::profiler::main_thread_frameTimeLocalAvg(_durationCast); + } + + /** Always returns true. + */ + inline EASY_CONSTEXPR_FCN bool isMain() { + return true; + } + + } // END of namespace main_thread. + + /** Alias for isEnabled(). + + Added for clarification. + + \sa isEnabled + + \ingroup profiler + */ + EASY_FORCE_INLINE bool isCapturing() { return isEnabled(); } + + /** Alias for EASY_PROFILER_ENABLE. + + Added for clarification. + + \sa EASY_PROFILER_ENABLE + + \ingroup profiler + */ + EASY_FORCE_INLINE void startCapture() { EASY_PROFILER_ENABLE; } + + /** Alias for EASY_PROFILER_DISABLE. + + Added for clarification. + + \sa EASY_PROFILER_DISABLE + + \ingroup profiler + */ + EASY_FORCE_INLINE void stopCapture() { EASY_PROFILER_DISABLE; } + + ////////////////////////////////////////////////////////////////////// + +} // END of namespace profiler. + +#if defined ( __clang__ ) +# pragma clang diagnostic pop +#endif + +#endif // EASY_PROFILER_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/reader.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/reader.h new file mode 100644 index 0000000..cbfe414 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/reader.h @@ -0,0 +1,428 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef PROFILER_READER____H +#define PROFILER_READER____H + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#include +#include +#include +#include +#include +#include +#include + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace profiler { + + using calls_number_t = uint32_t; + using block_index_t = uint32_t; + +#pragma pack(push, 1) + struct BlockStatistics EASY_FINAL + { + ::profiler::timestamp_t total_duration; ///< Total duration of all block calls + ::profiler::timestamp_t total_children_duration; ///< Total duration of all children of all block calls + ::profiler::block_index_t min_duration_block; ///< Will be used in GUI to jump to the block with min duration + ::profiler::block_index_t max_duration_block; ///< Will be used in GUI to jump to the block with max duration + ::profiler::block_index_t parent_block; ///< Index of block which is "parent" for "per_parent_stats" or "frame" for "per_frame_stats" or thread-id for "per_thread_stats" + ::profiler::calls_number_t calls_number; ///< Block calls number + + explicit BlockStatistics(::profiler::timestamp_t _duration, ::profiler::block_index_t _block_index, ::profiler::block_index_t _parent_index) + : total_duration(_duration) + , total_children_duration(0) + , min_duration_block(_block_index) + , max_duration_block(_block_index) + , parent_block(_parent_index) + , calls_number(1) + { + } + + //BlockStatistics() = default; + + inline ::profiler::timestamp_t average_duration() const + { + return total_duration / calls_number; + } + + }; // END of struct BlockStatistics. +#pragma pack(pop) + + extern "C" PROFILER_API void release_stats(BlockStatistics*& _stats); + + ////////////////////////////////////////////////////////////////////////// + + class BlocksTree EASY_FINAL + { + using This = BlocksTree; + + public: + + using blocks_t = ::std::vector; + using children_t = ::std::vector<::profiler::block_index_t>; + + children_t children; ///< List of children blocks. May be empty. + + union { + ::profiler::SerializedBlock* node; ///< Pointer to serialized data for regular block (id, name, begin, end etc.) + ::profiler::SerializedCSwitch* cs; ///< Pointer to serialized data for context switch (thread_id, name, begin, end etc.) + ::profiler::ArbitraryValue* value; ///< Pointer to serialized data for arbitrary value + }; + + ::profiler::BlockStatistics* per_parent_stats; ///< Pointer to statistics for this block within the parent (may be nullptr for top-level blocks) + ::profiler::BlockStatistics* per_frame_stats; ///< Pointer to statistics for this block within the frame (may be nullptr for top-level blocks) + ::profiler::BlockStatistics* per_thread_stats; ///< Pointer to statistics for this block within the bounds of all frames per current thread + uint8_t depth; ///< Maximum number of sublevels (maximum children depth) + + BlocksTree(const This&) = delete; + This& operator = (const This&) = delete; + + BlocksTree() EASY_NOEXCEPT + : node(nullptr) + , per_parent_stats(nullptr) + , per_frame_stats(nullptr) + , per_thread_stats(nullptr) + , depth(0) + { + + } + + BlocksTree(This&& that) EASY_NOEXCEPT + : BlocksTree() + { + make_move(::std::forward(that)); + } + + This& operator = (This&& that) EASY_NOEXCEPT + { + make_move(::std::forward(that)); + return *this; + } + + ~BlocksTree() EASY_NOEXCEPT + { + release_stats(per_thread_stats); + release_stats(per_parent_stats); + release_stats(per_frame_stats); + } + + bool operator < (const This& other) const EASY_NOEXCEPT + { + if (node == nullptr || other.node == nullptr) + return false; + return node->begin() < other.node->begin(); + } + + void shrink_to_fit() EASY_NOEXCEPT + { + //for (auto& child : children) + // child.shrink_to_fit(); + + // shrink version 1: + //children.shrink_to_fit(); + + // shrink version 2: + //children_t new_children; + //new_children.reserve(children.size()); + //::std::move(children.begin(), children.end(), ::std::back_inserter(new_children)); + //new_children.swap(children); + } + + private: + + void make_move(This&& that) EASY_NOEXCEPT + { + if (per_thread_stats != that.per_thread_stats) + release_stats(per_thread_stats); + + if (per_parent_stats != that.per_parent_stats) + release_stats(per_parent_stats); + + if (per_frame_stats != that.per_frame_stats) + release_stats(per_frame_stats); + + children = ::std::move(that.children); + node = that.node; + per_parent_stats = that.per_parent_stats; + per_frame_stats = that.per_frame_stats; + per_thread_stats = that.per_thread_stats; + depth = that.depth; + + that.node = nullptr; + that.per_parent_stats = nullptr; + that.per_frame_stats = nullptr; + that.per_thread_stats = nullptr; + } + + }; // END of class BlocksTree. + + ////////////////////////////////////////////////////////////////////////// + + class BlocksTreeRoot EASY_FINAL + { + using This = BlocksTreeRoot; + + public: + + BlocksTree::children_t children; ///< List of children indexes + BlocksTree::children_t sync; ///< List of context-switch events + BlocksTree::children_t events; ///< List of events indexes + std::string thread_name; ///< Name of this thread + ::profiler::timestamp_t profiled_time; ///< Profiled time of this thread (sum of all children duration) + ::profiler::timestamp_t wait_time; ///< Wait time of this thread (sum of all context switches) + ::profiler::thread_id_t thread_id; ///< System Id of this thread + ::profiler::block_index_t frames_number; ///< Total frames number (top-level blocks) + ::profiler::block_index_t blocks_number; ///< Total blocks number including their children + uint8_t depth; ///< Maximum stack depth (number of levels) + + BlocksTreeRoot(const This&) = delete; + This& operator = (const This&) = delete; + + BlocksTreeRoot() EASY_NOEXCEPT + : profiled_time(0), wait_time(0), thread_id(0), frames_number(0), blocks_number(0), depth(0) + { + } + + BlocksTreeRoot(This&& that) EASY_NOEXCEPT + : children(::std::move(that.children)) + , sync(::std::move(that.sync)) + , events(::std::move(that.events)) + , thread_name(::std::move(that.thread_name)) + , profiled_time(that.profiled_time) + , wait_time(that.wait_time) + , thread_id(that.thread_id) + , frames_number(that.frames_number) + , blocks_number(that.blocks_number) + , depth(that.depth) + { + } + + This& operator = (This&& that) EASY_NOEXCEPT + { + children = ::std::move(that.children); + sync = ::std::move(that.sync); + events = ::std::move(that.events); + thread_name = ::std::move(that.thread_name); + profiled_time = that.profiled_time; + wait_time = that.wait_time; + thread_id = that.thread_id; + frames_number = that.frames_number; + blocks_number = that.blocks_number; + depth = that.depth; + return *this; + } + + inline bool got_name() const EASY_NOEXCEPT + { + return !thread_name.empty(); + } + + inline const char* name() const EASY_NOEXCEPT + { + return thread_name.c_str(); + } + + bool operator < (const This& other) const EASY_NOEXCEPT + { + return thread_id < other.thread_id; + } + + }; // END of class BlocksTreeRoot. + + using blocks_t = ::profiler::BlocksTree::blocks_t; + using thread_blocks_tree_t = ::std::unordered_map<::profiler::thread_id_t, ::profiler::BlocksTreeRoot, ::estd::hash<::profiler::thread_id_t> >; + + ////////////////////////////////////////////////////////////////////////// + + class PROFILER_API SerializedData EASY_FINAL + { + char* m_data; + size_t m_size; + + public: + + SerializedData(const SerializedData&) = delete; + SerializedData& operator = (const SerializedData&) = delete; + + SerializedData() : m_data(nullptr), m_size(0) + { + } + + SerializedData(SerializedData&& that) : m_data(that.m_data), m_size(that.m_size) + { + that.m_data = nullptr; + that.m_size = 0; + } + + ~SerializedData() + { + clear(); + } + + void set(uint64_t _size); + void extend(uint64_t _size); + + SerializedData& operator = (SerializedData&& that) + { + set(that.m_data, that.m_size); + that.m_data = nullptr; + that.m_size = 0; + return *this; + } + + char* operator [] (uint64_t i) + { + return m_data + i; + } + + const char* operator [] (uint64_t i) const + { + return m_data + i; + } + + bool empty() const + { + return m_size == 0; + } + + uint64_t size() const + { + return m_size; + } + + char* data() + { + return m_data; + } + + const char* data() const + { + return m_data; + } + + void clear() + { + set(nullptr, 0); + } + + void swap(SerializedData& other) + { + char* d = other.m_data; + uint64_t sz = other.m_size; + + other.m_data = m_data; + other.m_size = m_size; + + m_data = d; + m_size = (size_t)sz; + } + + private: + + void set(char* _data, uint64_t _size); + + }; // END of class SerializedData. + + ////////////////////////////////////////////////////////////////////////// + + using descriptors_list_t = ::std::vector; + +} // END of namespace profiler. + +extern "C" { + + PROFILER_API ::profiler::block_index_t fillTreesFromFile(::std::atomic& progress, const char* filename, + ::profiler::SerializedData& serialized_blocks, + ::profiler::SerializedData& serialized_descriptors, + ::profiler::descriptors_list_t& descriptors, + ::profiler::blocks_t& _blocks, + ::profiler::thread_blocks_tree_t& threaded_trees, + uint32_t& total_descriptors_number, + uint32_t& version, + bool gather_statistics, + ::std::stringstream& _log); + + PROFILER_API ::profiler::block_index_t fillTreesFromStream(::std::atomic& progress, ::std::stringstream& str, + ::profiler::SerializedData& serialized_blocks, + ::profiler::SerializedData& serialized_descriptors, + ::profiler::descriptors_list_t& descriptors, + ::profiler::blocks_t& _blocks, + ::profiler::thread_blocks_tree_t& threaded_trees, + uint32_t& total_descriptors_number, + uint32_t& version, + bool gather_statistics, + ::std::stringstream& _log); + + PROFILER_API bool readDescriptionsFromStream(::std::atomic& progress, ::std::stringstream& str, + ::profiler::SerializedData& serialized_descriptors, + ::profiler::descriptors_list_t& descriptors, + ::std::stringstream& _log); +} + +inline ::profiler::block_index_t fillTreesFromFile(const char* filename, ::profiler::SerializedData& serialized_blocks, + ::profiler::SerializedData& serialized_descriptors, + ::profiler::descriptors_list_t& descriptors, ::profiler::blocks_t& _blocks, + ::profiler::thread_blocks_tree_t& threaded_trees, + uint32_t& total_descriptors_number, + uint32_t& version, + bool gather_statistics, + ::std::stringstream& _log) +{ + ::std::atomic progress = ATOMIC_VAR_INIT(0); + return fillTreesFromFile(progress, filename, serialized_blocks, serialized_descriptors, descriptors, _blocks, threaded_trees, total_descriptors_number, version, gather_statistics, _log); +} + +inline bool readDescriptionsFromStream(::std::stringstream& str, + ::profiler::SerializedData& serialized_descriptors, + ::profiler::descriptors_list_t& descriptors, + ::std::stringstream& _log) +{ + ::std::atomic progress = ATOMIC_VAR_INIT(0); + return readDescriptionsFromStream(progress, str, serialized_descriptors, descriptors, _log); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +#endif // PROFILER_READER____H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/serialized_block.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/serialized_block.h new file mode 100644 index 0000000..dd07711 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/serialized_block.h @@ -0,0 +1,289 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_SERIALIZED_BLOCK_H +#define EASY_PROFILER_SERIALIZED_BLOCK_H + +#include +#include + +class CSwitchBlock; + +namespace profiler { + + template + struct Value; + + template + struct Value; + + ////////////////////////////////////////////////////////////////////////// + + class PROFILER_API SerializedBlock EASY_FINAL : public BaseBlockData + { + friend ::ProfileManager; + friend ::ThreadStorage; + + public: + + inline const char* data() const { return reinterpret_cast(this); } + + ///< Run-time block name is stored right after main BaseBlockData data + inline const char* name() const { return data() + sizeof(BaseBlockData); } + + SerializedBlock(const SerializedBlock&) = delete; + SerializedBlock& operator = (const SerializedBlock&) = delete; + SerializedBlock(SerializedBlock&&) = delete; + SerializedBlock& operator = (SerializedBlock&&) = delete; + ~SerializedBlock() = delete; + + private: + + explicit SerializedBlock(const Block& block, uint16_t name_length); + + }; // END of SerializedBlock. + + ////////////////////////////////////////////////////////////////////////// + +#pragma pack(push, 1) + class PROFILER_API CSwitchEvent : public Event + { + thread_id_t m_thread_id; + + public: + + CSwitchEvent() = default; + CSwitchEvent(const CSwitchEvent&) = default; + explicit CSwitchEvent(timestamp_t _begin_time, thread_id_t _tid) EASY_NOEXCEPT; + + inline thread_id_t tid() const EASY_NOEXCEPT { return m_thread_id; } + + }; // END of class CSwitchEvent. +#pragma pack(pop) + + class PROFILER_API SerializedCSwitch EASY_FINAL : public CSwitchEvent + { + friend ::ProfileManager; + friend ::ThreadStorage; + + public: + + inline const char* data() const { return reinterpret_cast(this); } + + ///< Run-time block name is stored right after main CSwitchEvent data + inline const char* name() const { return data() + sizeof(CSwitchEvent); } + + SerializedCSwitch(const SerializedCSwitch&) = delete; + SerializedCSwitch& operator = (const SerializedCSwitch&) = delete; + SerializedCSwitch(SerializedCSwitch&&) = delete; + SerializedCSwitch& operator = (SerializedCSwitch&&) = delete; + ~SerializedCSwitch() = delete; + + private: + + explicit SerializedCSwitch(const CSwitchBlock& block, uint16_t name_length); + + }; // END of SerializedCSwitch. + + ////////////////////////////////////////////////////////////////////////// + +#pragma pack(push, 1) + class PROFILER_API SerializedBlockDescriptor EASY_FINAL : public BaseBlockDescriptor + { + uint16_t m_nameLength; ///< Length of the name including trailing '\0' sybmol + + public: + + inline const char* data() const { + return reinterpret_cast(this); + } + + ///< Name is stored right after m_nameLength + inline const char* name() const { + static const auto shift = sizeof(BaseBlockDescriptor) + sizeof(decltype(m_nameLength)); + return data() + shift; + } + + ///< File name is stored right after the name + inline const char* file() const { + return name() + m_nameLength; + } + + inline void setStatus(EasyBlockStatus _status) EASY_NOEXCEPT { + m_status = _status; + } + + // Instances of this class can not be created or destroyed directly + SerializedBlockDescriptor() = delete; + SerializedBlockDescriptor(const SerializedBlockDescriptor&) = delete; + SerializedBlockDescriptor& operator = (const SerializedBlockDescriptor&) = delete; + SerializedBlockDescriptor(SerializedBlockDescriptor&&) = delete; + SerializedBlockDescriptor& operator = (SerializedBlockDescriptor&&) = delete; + ~SerializedBlockDescriptor() = delete; + + }; // END of SerializedBlockDescriptor. +//#pragma pack(pop) + + ////////////////////////////////////////////////////////////////////////// + +//#pragma pack(push, 1) + class PROFILER_API ArbitraryValue : protected BaseBlockData + { + friend ::ThreadStorage; + + protected: + + char m_nameStub; ///< Artificial padding which is used to imitate SerializedBlock::name() == 0 behavior + char m_padding; ///< Padding to the bound of 2 bytes + uint16_t m_size; + DataType m_type; + bool m_isArray; + vin_t m_value_id; + + explicit ArbitraryValue(timestamp_t _timestamp, vin_t _vin, block_id_t _id, + uint16_t _size, DataType _type, bool _isArray) + : BaseBlockData(_timestamp, _timestamp, _id) + , m_nameStub(0) + , m_padding(0) + , m_size(_size) + , m_type(_type) + , m_isArray(_isArray) + , m_value_id(_vin) + { + } + + public: + + using BaseBlockData::id; + using Event::begin; + + ~ArbitraryValue() = delete; + + const char* data() const { + return reinterpret_cast(this) + sizeof(ArbitraryValue); + } + + vin_t value_id() const { + return m_value_id; + } + + DataType type() const { + return m_type; + } + + bool isArray() const { + return m_isArray; + } + + template + const Value* toValue() const { + return m_type == dataType ? static_cast*>(this) : nullptr; + } + + template + const Value::data_type, false>* toValue() const { + static_assert(StdToDataType::data_type != DataType::TypesCount, + "You should use standard builtin scalar types as profiler::Value type!"); + return toValue::data_type>(); + } + + template + const Value* toArray() const { + return m_isArray && m_type == dataType ? static_cast*>(this) : nullptr; + } + + template + const Value::data_type, true>* toArray() const { + static_assert(StdToDataType::data_type != DataType::TypesCount, + "You should use standard builtin scalar types as profiler::Value type!"); + return toArray::data_type>(); + } + }; // end of class ArbitraryValue. +#pragma pack(pop) + + ////////////////////////////////////////////////////////////////////////// + + template + struct Value EASY_FINAL : public ArbitraryValue { + using value_type = typename StdType::value_type; + value_type value() const { return *reinterpret_cast(data()); } + ~Value() = delete; + }; + + + template + struct Value EASY_FINAL : public ArbitraryValue { + using value_type = typename StdType::value_type; + const value_type* value() const { return reinterpret_cast(data()); } + uint16_t size() const { return m_size / sizeof(value_type); } + value_type operator [] (int i) const { return value()[i]; } + value_type at(int i) const { return value()[i]; } + ~Value() = delete; + }; + + + template <> + struct Value EASY_FINAL : public ArbitraryValue { + using value_type = char; + const char* value() const { return data(); } + uint16_t size() const { return m_size; } + char operator [] (int i) const { return data()[i]; } + char at(int i) const { return data()[i]; } + const char* c_str() const { return data(); } + ~Value() = delete; + }; + + ////////////////////////////////////////////////////////////////////////// + + template + using SingleValue = Value; + + template + using ArrayValue = Value; + + using StringValue = Value; + + ////////////////////////////////////////////////////////////////////////// + +} // END of namespace profiler. + +#endif // EASY_PROFILER_SERIALIZED_BLOCK_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/include/easy/utility.h b/3rdparty/easyprofiler/easy_profiler_core/include/easy/utility.h new file mode 100644 index 0000000..167e17d --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/include/easy/utility.h @@ -0,0 +1,63 @@ + + +#ifndef EASY_PROFILER_UTILITY_H +#define EASY_PROFILER_UTILITY_H + +#include +#include +#include +#include + +namespace estd { + +////////////////////////////////////////////////////////////////////////// + + namespace detail { + template struct hasher { + using type = const T&; + EASY_FORCE_INLINE size_t operator () (type value) const { return ::std::hash {}(value); } }; + + template struct hasher { + using type = T; + EASY_FORCE_INLINE size_t operator () (type value) const { return static_cast(value); } }; + } + + template struct hash EASY_FINAL : public ::estd::detail::hasher sizeof(void*))> { + using ::estd::detail::hasher sizeof(void*))>::operator(); + }; + + template struct hash EASY_FINAL { + EASY_FORCE_INLINE size_t operator () (const T* value) const { return reinterpret_cast(value); } }; + + template struct hash EASY_FINAL { + EASY_FORCE_INLINE size_t operator () (const T* value) const { return reinterpret_cast(value); } }; + +////////////////////////////////////////////////////////////////////////// + + template + inline EASY_CONSTEXPR_FCN Q clamp(T min_value, Q value, W max_value) { + return static_cast(min_value < value ? (value < max_value ? value : max_value) : min_value); + } + + template + EASY_FORCE_INLINE EASY_CONSTEXPR_FCN T sqr(T value) { + return value * value; + } + + template + EASY_FORCE_INLINE EASY_CONSTEXPR_FCN int sign(T value) { return value < 0 ? -1 : 1; } + + template + inline EASY_CONSTEXPR_FCN T absmin(T a, T b) { return abs(a) < abs(b) ? a : b; } + + template + inline T logn(T value) { + EASY_STATIC_CONSTEXPR double div = 1.0 / log2((double)N); + return log2(value) * div; + } + +////////////////////////////////////////////////////////////////////////// + +} // end of namespace estd. + +#endif // EASY_PROFILER_UTILITY_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/nonscoped_block.cpp b/3rdparty/easyprofiler/easy_profiler_core/nonscoped_block.cpp new file mode 100644 index 0000000..6fa5d77 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/nonscoped_block.cpp @@ -0,0 +1,92 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#include "nonscoped_block.h" +#include +#include + +NonscopedBlock::NonscopedBlock(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, bool) + : profiler::Block(_desc, _runtimeName, false), m_runtimeName(nullptr) +{ + +} + +NonscopedBlock::~NonscopedBlock() +{ + // Actually destructor should not be invoked because StackBuffer do manual memory management + + m_end = m_begin; // to restrict profiler::Block to invoke profiler::endBlock() on destructor. + free(m_runtimeName); +} + +void NonscopedBlock::copyname() +{ + // Here we need to copy m_name to m_runtimeName to ensure that + // it would be alive to the moment we will serialize the block + + if ((m_status & profiler::ON) == 0) + return; + + if (*m_name != 0) + { + auto len = strlen(m_name); + m_runtimeName = static_cast(malloc(len + 1)); + + // memcpy should be faster than strncpy because we know + // actual bytes number and both strings have the same size + memcpy(m_runtimeName, m_name, len); + + m_runtimeName[len] = 0; + m_name = m_runtimeName; + } + else + { + m_name = ""; + } +} + +void NonscopedBlock::destroy() +{ + // free memory used by m_runtimeName + free(m_runtimeName); + m_name = ""; +} diff --git a/3rdparty/easyprofiler/easy_profiler_core/nonscoped_block.h b/3rdparty/easyprofiler/easy_profiler_core/nonscoped_block.h new file mode 100644 index 0000000..5655f5a --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/nonscoped_block.h @@ -0,0 +1,73 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_NONSCOPED_BLOCK_H +#define EASY_PROFILER_NONSCOPED_BLOCK_H + +#include + +class NonscopedBlock : public profiler::Block +{ + char* m_runtimeName; ///< A copy of _runtimeName to make it safe to begin block in one function and end it in another + +public: + + NonscopedBlock() = delete; + NonscopedBlock(const NonscopedBlock&) = delete; + NonscopedBlock(NonscopedBlock&&) = delete; + NonscopedBlock& operator = (const NonscopedBlock&) = delete; + NonscopedBlock& operator = (NonscopedBlock&&) = delete; + + NonscopedBlock(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, bool = false); + ~NonscopedBlock(); + + /** Copy string from m_name to m_runtimeName to make it safe to end block in another function. + + Performs any work if block is ON and m_name != "" + */ + void copyname(); + + void destroy(); + +}; // END of class NonscopedBlock. + +#endif // EASY_PROFILER_NONSCOPED_BLOCK_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/outstream.h b/3rdparty/easyprofiler/easy_profiler_core/outstream.h new file mode 100644 index 0000000..f27762d --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/outstream.h @@ -0,0 +1,115 @@ +/************************************************************************ +* file name : outstream.h +* ----------------- : +* creation time : 2016/09/11 +* authors : Sergey Yagovtsev, Victor Zarubkin +* emails : yse.sey@gmail.com, v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains definition of output stream helpers. +* ----------------- : +* change log : * 2016/09/11 Victor Zarubkin: Initial commit. Moved sources from profiler_manager.h/.cpp +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER__OUTPUT_STREAM__H_ +#define EASY_PROFILER__OUTPUT_STREAM__H_ + +#include +#include + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +namespace profiler { + + class OStream + { + ::std::stringstream m_stream; + + public: + + explicit OStream() : m_stream(std::ios_base::out | std::ios_base::binary) + { + + } + + template void write(const char* _data, T _size) + { + m_stream.write(_data, _size); + } + + template void write(const T& _data) + { + m_stream.write((const char*)&_data, sizeof(T)); + } + + ::std::stringstream& stream() + { + return m_stream; + } + + const ::std::stringstream& stream() const + { + return m_stream; + } + + void clear() + { +#if defined(__GNUC__) && __GNUC__ < 5 + // gcc 4 has a known bug which has been solved in gcc 5: + // std::stringstream has no swap() method :( + m_stream.str(::std::string()); +#else + ::std::stringstream().swap(m_stream); +#endif + } + + }; // END of class OStream. + +} // END of namespace profiler. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER__OUTPUT_STREAM__H_ diff --git a/3rdparty/easyprofiler/easy_profiler_core/profile_manager.cpp b/3rdparty/easyprofiler/easy_profiler_core/profile_manager.cpp new file mode 100644 index 0000000..d61246d --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/profile_manager.cpp @@ -0,0 +1,2015 @@ +/************************************************************************ +* file name : profile_manager.cpp +* ----------------- : +* creation time : 2016/02/16 +* authors : Sergey Yagovtsev, Victor Zarubkin +* emails : yse.sey@gmail.com, v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of Profile manager and implement access c-function +* : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include +#include "profile_manager.h" + +#include +#include +#include +#include + +#ifndef _WIN32 +# include +#endif + +#include "event_trace_win.h" +#include "current_time.h" +#include "current_thread.h" + +#ifdef __APPLE__ +#include +#include +#endif + +#if EASY_OPTION_LOG_ENABLED != 0 +# include + +# ifndef EASY_ERRORLOG +# define EASY_ERRORLOG ::std::cerr +# endif + +# ifndef EASY_LOG +# define EASY_LOG ::std::cerr +# endif + +# ifndef EASY_ERROR +# define EASY_ERROR(LOG_MSG) EASY_ERRORLOG << "EasyProfiler ERROR: " << LOG_MSG +# endif + +# ifndef EASY_WARNING +# define EASY_WARNING(LOG_MSG) EASY_ERRORLOG << "EasyProfiler WARNING: " << LOG_MSG +# endif + +# ifndef EASY_LOGMSG +# define EASY_LOGMSG(LOG_MSG) EASY_LOG << "EasyProfiler INFO: " << LOG_MSG +# endif + +# ifndef EASY_LOG_ONLY +# define EASY_LOG_ONLY(CODE) CODE +# endif + +#else + +# ifndef EASY_ERROR +# define EASY_ERROR(LOG_MSG) +# endif + +# ifndef EASY_WARNING +# define EASY_WARNING(LOG_MSG) +# endif + +# ifndef EASY_LOGMSG +# define EASY_LOGMSG(LOG_MSG) +# endif + +# ifndef EASY_LOG_ONLY +# define EASY_LOG_ONLY(CODE) +# endif + +#endif + +#ifdef min +# undef min +#endif + +#ifndef EASY_ENABLE_BLOCK_STATUS +# define EASY_ENABLE_BLOCK_STATUS 1 +#endif + +#if !defined(_WIN32) && !defined(EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS) +# define EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS 0 +#endif + +#ifndef EASY_OPTION_IMPLICIT_THREAD_REGISTRATION +# define EASY_OPTION_IMPLICIT_THREAD_REGISTRATION 0 +#endif + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +using namespace profiler; + +////////////////////////////////////////////////////////////////////////// + +#if !defined(EASY_PROFILER_VERSION_MAJOR) || !defined(EASY_PROFILER_VERSION_MINOR) || !defined(EASY_PROFILER_VERSION_PATCH) +# ifdef _WIN32 +# error EASY_PROFILER_VERSION_MAJOR and EASY_PROFILER_VERSION_MINOR and EASY_PROFILER_VERSION_PATCH macros must be defined +# else +# error "EASY_PROFILER_VERSION_MAJOR and EASY_PROFILER_VERSION_MINOR and EASY_PROFILER_VERSION_PATCH macros must be defined" +# endif +#endif + +# define EASY_PROFILER_PRODUCT_VERSION "v" EASY_STRINGIFICATION(EASY_PROFILER_VERSION_MAJOR) "." \ + EASY_STRINGIFICATION(EASY_PROFILER_VERSION_MINOR) "." \ + EASY_STRINGIFICATION(EASY_PROFILER_VERSION_PATCH) + +# define EASY_VERSION_INT(v_major, v_minor, v_patch) ((static_cast(v_major) << 24) | (static_cast(v_minor) << 16) | static_cast(v_patch)) +extern const uint32_t PROFILER_SIGNATURE = ('E' << 24) | ('a' << 16) | ('s' << 8) | 'y'; +extern const uint32_t EASY_CURRENT_VERSION = EASY_VERSION_INT(EASY_PROFILER_VERSION_MAJOR, EASY_PROFILER_VERSION_MINOR, EASY_PROFILER_VERSION_PATCH); +# undef EASY_VERSION_INT + +////////////////////////////////////////////////////////////////////////// + +# define EASY_PROF_DISABLED 0 +# define EASY_PROF_ENABLED 1 +# define EASY_PROF_DUMP 2 + +////////////////////////////////////////////////////////////////////////// + +//auto& MANAGER = ProfileManager::instance(); +# define MANAGER ProfileManager::instance() +EASY_CONSTEXPR uint8_t FORCE_ON_FLAG = profiler::FORCE_ON & ~profiler::ON; + +#if defined(EASY_CHRONO_CLOCK) +#include +const int64_t CPU_FREQUENCY = EASY_CHRONO_CLOCK::period::den / EASY_CHRONO_CLOCK::period::num; +# define TICKS_TO_US(ticks) ticks * 1000000LL / CPU_FREQUENCY +#elif defined(_WIN32) +const decltype(LARGE_INTEGER::QuadPart) CPU_FREQUENCY = ([](){ LARGE_INTEGER freq; QueryPerformanceFrequency(&freq); return freq.QuadPart; })(); +# define TICKS_TO_US(ticks) ticks * 1000000LL / CPU_FREQUENCY +#else +# ifndef __APPLE__ +# include +# endif +int64_t calculate_cpu_frequency() +{ + double g_TicksPerNanoSec; + uint64_t begin = 0, end = 0; +#ifdef __APPLE__ + clock_serv_t cclock; + mach_timespec_t begints, endts; + host_get_clock_service(mach_host_self(), SYSTEM_CLOCK, &cclock); + clock_get_time(cclock, &begints); +#else + struct timespec begints, endts; + clock_gettime(CLOCK_MONOTONIC, &begints); +#endif + begin = getCurrentTime(); + volatile uint64_t i; + for (i = 0; i < 100000000; i++); /* must be CPU intensive */ + end = getCurrentTime(); +#ifdef __APPLE__ + clock_get_time(cclock, &endts); + mach_port_deallocate(mach_task_self(), cclock); +#else + clock_gettime(CLOCK_MONOTONIC, &endts); +#endif + struct timespec tmpts; + const int NANO_SECONDS_IN_SEC = 1000000000; + tmpts.tv_sec = endts.tv_sec - begints.tv_sec; + tmpts.tv_nsec = endts.tv_nsec - begints.tv_nsec; + if (tmpts.tv_nsec < 0) + { + tmpts.tv_sec--; + tmpts.tv_nsec += NANO_SECONDS_IN_SEC; + } + + uint64_t nsecElapsed = tmpts.tv_sec * 1000000000LL + tmpts.tv_nsec; + g_TicksPerNanoSec = (double)(end - begin) / (double)nsecElapsed; + + int64_t cpu_frequency = int(g_TicksPerNanoSec * 1000000); + + return cpu_frequency; +} + +static std::atomic CPU_FREQUENCY = ATOMIC_VAR_INIT(1); +# define TICKS_TO_US(ticks) ticks * 1000 / CPU_FREQUENCY.load(std::memory_order_acquire) +#endif + +extern const profiler::color_t EASY_COLOR_INTERNAL_EVENT = 0xffffffff; // profiler::colors::White +EASY_CONSTEXPR profiler::color_t EASY_COLOR_THREAD_END = 0xff212121; // profiler::colors::Dark +EASY_CONSTEXPR profiler::color_t EASY_COLOR_START = 0xff4caf50; // profiler::colors::Green +EASY_CONSTEXPR profiler::color_t EASY_COLOR_END = 0xfff44336; // profiler::colors::Red + +////////////////////////////////////////////////////////////////////////// + +EASY_THREAD_LOCAL static ::ThreadStorage* THIS_THREAD = nullptr; +EASY_THREAD_LOCAL static bool THIS_THREAD_IS_MAIN = false; + +EASY_THREAD_LOCAL static profiler::timestamp_t THIS_THREAD_FRAME_T_MAX = 0ULL; +EASY_THREAD_LOCAL static profiler::timestamp_t THIS_THREAD_FRAME_T_CUR = 0ULL; +EASY_THREAD_LOCAL static profiler::timestamp_t THIS_THREAD_FRAME_T_ACC = 0ULL; +EASY_THREAD_LOCAL static uint32_t THIS_THREAD_N_FRAMES = 0; +EASY_THREAD_LOCAL static bool THIS_THREAD_FRAME_T_RESET_MAX = false; +EASY_THREAD_LOCAL static bool THIS_THREAD_FRAME_T_RESET_AVG = false; + +#ifdef EASY_CXX11_TLS_AVAILABLE +thread_local static profiler::ThreadGuard THIS_THREAD_GUARD; // thread guard for monitoring thread life time +#endif + +////////////////////////////////////////////////////////////////////////// + +#ifdef BUILD_WITH_EASY_PROFILER +# define EASY_EVENT_RES(res, name, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), MANAGER.addBlockDescriptor(\ + ::profiler::extract_enable_flag(__VA_ARGS__), EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name),\ + __FILE__, __LINE__, ::profiler::BlockType::Event, ::profiler::extract_color(__VA_ARGS__)));\ + res = MANAGER.storeBlock(EASY_UNIQUE_DESC(__LINE__), EASY_RUNTIME_NAME(name)) + +# define EASY_FORCE_EVENT(timestamp, name, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), addBlockDescriptor(\ + ::profiler::extract_enable_flag(__VA_ARGS__), EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name),\ + __FILE__, __LINE__, ::profiler::BlockType::Event, ::profiler::extract_color(__VA_ARGS__)));\ + storeBlockForce(EASY_UNIQUE_DESC(__LINE__), EASY_RUNTIME_NAME(name), timestamp) + +# define EASY_FORCE_EVENT2(timestamp, name, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), addBlockDescriptor(\ + ::profiler::extract_enable_flag(__VA_ARGS__), EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name),\ + __FILE__, __LINE__, ::profiler::BlockType::Event, ::profiler::extract_color(__VA_ARGS__)));\ + storeBlockForce2(EASY_UNIQUE_DESC(__LINE__), EASY_RUNTIME_NAME(name), timestamp) + +# define EASY_FORCE_EVENT3(ts, timestamp, name, ...)\ + EASY_LOCAL_STATIC_PTR(const ::profiler::BaseBlockDescriptor*, EASY_UNIQUE_DESC(__LINE__), addBlockDescriptor(\ + ::profiler::extract_enable_flag(__VA_ARGS__), EASY_UNIQUE_LINE_ID, EASY_COMPILETIME_NAME(name),\ + __FILE__, __LINE__, ::profiler::BlockType::Event, ::profiler::extract_color(__VA_ARGS__)));\ + storeBlockForce2(ts, EASY_UNIQUE_DESC(__LINE__), EASY_RUNTIME_NAME(name), timestamp) +#else +# ifndef EASY_PROFILER_API_DISABLED +# define EASY_PROFILER_API_DISABLED +# endif +# define EASY_EVENT_RES(res, name, ...) +# define EASY_FORCE_EVENT(timestamp, name, ...) +# define EASY_FORCE_EVENT2(timestamp, name, ...) +# define EASY_FORCE_EVENT3(ts, timestamp, name, ...) +#endif + +////////////////////////////////////////////////////////////////////////// + +extern "C" { + +#if !defined(EASY_PROFILER_API_DISABLED) + PROFILER_API timestamp_t currentTime() + { + return getCurrentTime(); + } + + PROFILER_API timestamp_t toNanoseconds(timestamp_t _ticks) + { +#if defined(EASY_CHRONO_CLOCK) || defined(_WIN32) + return _ticks * 1000000000LL / CPU_FREQUENCY; +#else + return _ticks / CPU_FREQUENCY.load(std::memory_order_acquire); +#endif + } + + PROFILER_API timestamp_t toMicroseconds(timestamp_t _ticks) + { + return TICKS_TO_US(_ticks); + } + + PROFILER_API const BaseBlockDescriptor* registerDescription(EasyBlockStatus _status, const char* _autogenUniqueId, const char* _name, const char* _filename, int _line, block_type_t _block_type, color_t _color, bool _copyName) + { + return MANAGER.addBlockDescriptor(_status, _autogenUniqueId, _name, _filename, _line, _block_type, _color, _copyName); + } + + PROFILER_API void endBlock() + { + MANAGER.endBlock(); + } + + PROFILER_API void setEnabled(bool isEnable) + { + MANAGER.setEnabled(isEnable); + } + + PROFILER_API bool isEnabled() + { + return MANAGER.isEnabled(); + } + + PROFILER_API void storeValue(const BaseBlockDescriptor* _desc, DataType _type, const void* _data, size_t _size, bool _isArray, ValueId _vin) + { + MANAGER.storeValue(_desc, _type, _data, _size, _isArray, _vin); + } + + PROFILER_API void storeEvent(const BaseBlockDescriptor* _desc, const char* _runtimeName) + { + MANAGER.storeBlock(_desc, _runtimeName); + } + + PROFILER_API void storeBlock(const BaseBlockDescriptor* _desc, const char* _runtimeName, timestamp_t _beginTime, timestamp_t _endTime) + { + MANAGER.storeBlock(_desc, _runtimeName, _beginTime, _endTime); + } + + PROFILER_API void beginBlock(Block& _block) + { + MANAGER.beginBlock(_block); + } + + PROFILER_API void beginNonScopedBlock(const BaseBlockDescriptor* _desc, const char* _runtimeName) + { + MANAGER.beginNonScopedBlock(_desc, _runtimeName); + } + + PROFILER_API uint32_t dumpBlocksToFile(const char* filename) + { + return MANAGER.dumpBlocksToFile(filename); + } + + PROFILER_API const char* registerThreadScoped(const char* name, ThreadGuard& threadGuard) + { + return MANAGER.registerThread(name, threadGuard); + } + + PROFILER_API const char* registerThread(const char* name) + { + return MANAGER.registerThread(name); + } + + PROFILER_API void setEventTracingEnabled(bool _isEnable) + { + MANAGER.setEventTracingEnabled(_isEnable); + } + + PROFILER_API bool isEventTracingEnabled() + { + return MANAGER.isEventTracingEnabled(); + } + +# ifdef _WIN32 + PROFILER_API void setLowPriorityEventTracing(bool _isLowPriority) + { + EasyEventTracer::instance().setLowPriority(_isLowPriority); + } + + PROFILER_API bool isLowPriorityEventTracing() + { + return EasyEventTracer::instance().isLowPriority(); + } +# else + PROFILER_API void setLowPriorityEventTracing(bool) { } + PROFILER_API bool isLowPriorityEventTracing() { return false; } +# endif + + PROFILER_API void setContextSwitchLogFilename(const char* name) + { + return MANAGER.setContextSwitchLogFilename(name); + } + + PROFILER_API const char* getContextSwitchLogFilename() + { + return MANAGER.getContextSwitchLogFilename(); + } + + PROFILER_API void startListen(uint16_t _port) + { + return MANAGER.startListen(_port); + } + + PROFILER_API void stopListen() + { + return MANAGER.stopListen(); + } + + PROFILER_API bool isListening() + { + return MANAGER.isListening(); + } + + PROFILER_API bool isMainThread() + { + return THIS_THREAD_IS_MAIN; + } + + PROFILER_API timestamp_t this_thread_frameTime(Duration _durationCast) + { + if (_durationCast == profiler::TICKS) + return THIS_THREAD_FRAME_T_CUR; + return TICKS_TO_US(THIS_THREAD_FRAME_T_CUR); + } + + PROFILER_API timestamp_t this_thread_frameTimeLocalMax(Duration _durationCast) + { + THIS_THREAD_FRAME_T_RESET_MAX = true; + if (_durationCast == profiler::TICKS) + return THIS_THREAD_FRAME_T_MAX; + return TICKS_TO_US(THIS_THREAD_FRAME_T_MAX); + } + + PROFILER_API timestamp_t this_thread_frameTimeLocalAvg(Duration _durationCast) + { + THIS_THREAD_FRAME_T_RESET_AVG = true; + auto avgDuration = THIS_THREAD_N_FRAMES > 0 ? THIS_THREAD_FRAME_T_ACC / THIS_THREAD_N_FRAMES : 0; + if (_durationCast == profiler::TICKS) + return avgDuration; + return TICKS_TO_US(avgDuration); + } + + PROFILER_API timestamp_t main_thread_frameTime(Duration _durationCast) + { + const auto ticks = THIS_THREAD_IS_MAIN ? THIS_THREAD_FRAME_T_CUR : MANAGER.curFrameDuration(); + if (_durationCast == profiler::TICKS) + return ticks; + return TICKS_TO_US(ticks); + } + + PROFILER_API timestamp_t main_thread_frameTimeLocalMax(Duration _durationCast) + { + if (THIS_THREAD_IS_MAIN) + { + THIS_THREAD_FRAME_T_RESET_MAX = true; + if (_durationCast == profiler::TICKS) + return THIS_THREAD_FRAME_T_MAX; + return TICKS_TO_US(THIS_THREAD_FRAME_T_MAX); + } + + if (_durationCast == profiler::TICKS) + return MANAGER.maxFrameDuration(); + return TICKS_TO_US(MANAGER.maxFrameDuration()); + } + + PROFILER_API timestamp_t main_thread_frameTimeLocalAvg(Duration _durationCast) + { + if (THIS_THREAD_IS_MAIN) + { + THIS_THREAD_FRAME_T_RESET_AVG = true; + auto avgDuration = THIS_THREAD_N_FRAMES > 0 ? THIS_THREAD_FRAME_T_ACC / THIS_THREAD_N_FRAMES : 0; + if (_durationCast == profiler::TICKS) + return avgDuration; + return TICKS_TO_US(avgDuration); + } + + if (_durationCast == profiler::TICKS) + return MANAGER.avgFrameDuration(); + return TICKS_TO_US(MANAGER.avgFrameDuration()); + } + +#else + PROFILER_API timestamp_t currentTime() { return 0; } + PROFILER_API timestamp_t toNanoseconds(timestamp_t) { return 0; } + PROFILER_API timestamp_t toMicroseconds(timestamp_t) { return 0; } + PROFILER_API const BaseBlockDescriptor* registerDescription(EasyBlockStatus, const char*, const char*, const char*, int, block_type_t, color_t, bool) { return reinterpret_cast(0xbad); } + PROFILER_API void endBlock() { } + PROFILER_API void setEnabled(bool) { } + PROFILER_API bool isEnabled() { return false; } + PROFILER_API void storeValue(const BaseBlockDescriptor*, DataType, const void*, size_t, bool, ValueId) {} + PROFILER_API void storeEvent(const BaseBlockDescriptor*, const char*) { } + PROFILER_API void storeBlock(const BaseBlockDescriptor*, const char*, timestamp_t, timestamp_t) { } + PROFILER_API void beginBlock(Block&) { } + PROFILER_API void beginNonScopedBlock(const BaseBlockDescriptor*, const char*) { } + PROFILER_API uint32_t dumpBlocksToFile(const char*) { return 0; } + PROFILER_API const char* registerThreadScoped(const char*, ThreadGuard&) { return ""; } + PROFILER_API const char* registerThread(const char*) { return ""; } + PROFILER_API void setEventTracingEnabled(bool) { } + PROFILER_API bool isEventTracingEnabled() { return false; } + PROFILER_API void setLowPriorityEventTracing(bool) { } + PROFILER_API bool isLowPriorityEventTracing(bool) { return false; } + PROFILER_API void setContextSwitchLogFilename(const char*) { } + PROFILER_API const char* getContextSwitchLogFilename() { return ""; } + PROFILER_API void startListen(uint16_t) { } + PROFILER_API void stopListen() { } + PROFILER_API bool isListening() { return false; } + + PROFILER_API bool isMainThread() { return false; } + PROFILER_API timestamp_t this_thread_frameTime(Duration) { return 0; } + PROFILER_API timestamp_t this_thread_frameTimeLocalMax(Duration) { return 0; } + PROFILER_API timestamp_t this_thread_frameTimeLocalAvg(Duration) { return 0; } + PROFILER_API timestamp_t main_thread_frameTime(Duration) { return 0; } + PROFILER_API timestamp_t main_thread_frameTimeLocalMax(Duration) { return 0; } + PROFILER_API timestamp_t main_thread_frameTimeLocalAvg(Duration) { return 0; } +#endif + + PROFILER_API uint8_t versionMajor() + { + static_assert(0 <= EASY_PROFILER_VERSION_MAJOR && EASY_PROFILER_VERSION_MAJOR <= 255, "EASY_PROFILER_VERSION_MAJOR must be defined in range [0, 255]"); + return EASY_PROFILER_VERSION_MAJOR; + } + + PROFILER_API uint8_t versionMinor() + { + static_assert(0 <= EASY_PROFILER_VERSION_MINOR && EASY_PROFILER_VERSION_MINOR <= 255, "EASY_PROFILER_VERSION_MINOR must be defined in range [0, 255]"); + return EASY_PROFILER_VERSION_MINOR; + } + + PROFILER_API uint16_t versionPatch() + { + static_assert(0 <= EASY_PROFILER_VERSION_PATCH && EASY_PROFILER_VERSION_PATCH <= 65535, "EASY_PROFILER_VERSION_PATCH must be defined in range [0, 65535]"); + return EASY_PROFILER_VERSION_PATCH; + } + + PROFILER_API uint32_t version() + { + return EASY_CURRENT_VERSION; + } + + PROFILER_API const char* versionName() + { + return EASY_PROFILER_PRODUCT_VERSION +#ifdef EASY_PROFILER_API_DISABLED + "_disabled" +#endif + ; + } + +} + +////////////////////////////////////////////////////////////////////////// + +SerializedBlock::SerializedBlock(const Block& block, uint16_t name_length) + : BaseBlockData(block) +{ + char* pName = const_cast(name()); + if (name_length) strncpy(pName, block.name(), name_length); + pName[name_length] = 0; +} + +SerializedCSwitch::SerializedCSwitch(const CSwitchBlock& block, uint16_t name_length) + : CSwitchEvent(block) +{ + char* pName = const_cast(name()); + if (name_length) strncpy(pName, block.name(), name_length); + pName[name_length] = 0; +} + +////////////////////////////////////////////////////////////////////////// + +BaseBlockDescriptor::BaseBlockDescriptor(block_id_t _id, EasyBlockStatus _status, int _line, + block_type_t _block_type, color_t _color) EASY_NOEXCEPT + : m_id(_id) + , m_line(_line) + , m_type(_block_type) + , m_color(_color) + , m_status(_status) +{ + +} + +////////////////////////////////////////////////////////////////////////// + +#ifndef EASY_BLOCK_DESC_FULL_COPY +# define EASY_BLOCK_DESC_FULL_COPY 1 +#endif + +#if EASY_BLOCK_DESC_FULL_COPY == 0 +# define EASY_BLOCK_DESC_STRING const char* +# define EASY_BLOCK_DESC_STRING_LEN(s) static_cast(strlen(s) + 1) +# define EASY_BLOCK_DESC_STRING_VAL(s) s +#else +# define EASY_BLOCK_DESC_STRING std::string +# define EASY_BLOCK_DESC_STRING_LEN(s) static_cast(s.size() + 1) +# define EASY_BLOCK_DESC_STRING_VAL(s) s.c_str() +#endif + +class BlockDescriptor : public BaseBlockDescriptor +{ + friend ProfileManager; + + EASY_BLOCK_DESC_STRING m_filename; ///< Source file name where this block is declared + EASY_BLOCK_DESC_STRING m_name; ///< Static name of all blocks of the same type (blocks can have dynamic name) which is, in pair with descriptor id, a unique block identifier + +public: + + BlockDescriptor(block_id_t _id, EasyBlockStatus _status, const char* _name, const char* _filename, int _line, block_type_t _block_type, color_t _color) + : BaseBlockDescriptor(_id, _status, _line, _block_type, _color) + , m_filename(_filename) + , m_name(_name) + { + } + + const char* name() const { + return EASY_BLOCK_DESC_STRING_VAL(m_name); + } + + const char* filename() const { + return EASY_BLOCK_DESC_STRING_VAL(m_filename); + } + + uint16_t nameSize() const { + return EASY_BLOCK_DESC_STRING_LEN(m_name); + } + + uint16_t filenameSize() const { + return EASY_BLOCK_DESC_STRING_LEN(m_filename); + } + +}; // END of class BlockDescriptor. + +////////////////////////////////////////////////////////////////////////// + +ThreadGuard::~ThreadGuard() +{ +#ifndef EASY_PROFILER_API_DISABLED + if (m_id != 0 && THIS_THREAD != nullptr && THIS_THREAD->id == m_id) + { + bool isMarked = false; + EASY_EVENT_RES(isMarked, "ThreadFinished", EASY_COLOR_THREAD_END, ::profiler::FORCE_ON); + THIS_THREAD->profiledFrameOpened.store(false, std::memory_order_release); + THIS_THREAD->expired.store(isMarked ? 2 : 1, std::memory_order_release); + THIS_THREAD = nullptr; + } +#endif +} + +////////////////////////////////////////////////////////////////////////// + +ProfileManager::ProfileManager() : +#ifdef _WIN32 + m_processId(GetProcessId(GetCurrentProcess())) +#else + m_processId((processid_t)getpid()) +#endif + , m_usedMemorySize(0) + , m_beginTime(0) + , m_endTime(0) +{ + m_profilerStatus = ATOMIC_VAR_INIT(EASY_PROF_DISABLED); + m_isEventTracingEnabled = ATOMIC_VAR_INIT(EASY_OPTION_EVENT_TRACING_ENABLED); + m_isAlreadyListening = ATOMIC_VAR_INIT(false); + m_stopDumping = ATOMIC_VAR_INIT(false); + m_stopListen = ATOMIC_VAR_INIT(false); + + m_mainThreadId = ATOMIC_VAR_INIT(0); + m_frameMax = ATOMIC_VAR_INIT(0); + m_frameAvg = ATOMIC_VAR_INIT(0); + m_frameCur = ATOMIC_VAR_INIT(0); + m_frameMaxReset = ATOMIC_VAR_INIT(false); + m_frameAvgReset = ATOMIC_VAR_INIT(false); + +#if !defined(EASY_PROFILER_API_DISABLED) && EASY_OPTION_START_LISTEN_ON_STARTUP != 0 + startListen(profiler::DEFAULT_PORT); +#endif + +#if !defined(EASY_PROFILER_API_DISABLED) && !defined(EASY_CHRONO_CLOCK) && !defined(_WIN32) + const int64_t cpu_frequency = calculate_cpu_frequency(); + CPU_FREQUENCY.store(cpu_frequency, std::memory_order_release); +#endif +} + +ProfileManager::~ProfileManager() +{ +#ifndef EASY_PROFILER_API_DISABLED + stopListen(); +#endif + + for (auto desc : m_descriptors) { +#if EASY_BLOCK_DESC_FULL_COPY == 0 + if (desc) + desc->~BlockDescriptor(); + free(desc); +#else + delete desc; +#endif + } +} + +#ifndef EASY_MAGIC_STATIC_AVAILABLE +class ProfileManagerInstance { + friend ProfileManager; + ProfileManager instance; +} PROFILE_MANAGER; +#endif + +////////////////////////////////////////////////////////////////////////// + +ProfileManager& ProfileManager::instance() +{ +#ifndef EASY_MAGIC_STATIC_AVAILABLE + return PROFILE_MANAGER.instance; +#else + ///C++11 makes possible to create Singleton without any warry about thread-safeness + ///http://preshing.com/20130930/double-checked-locking-is-fixed-in-cpp11/ + static ProfileManager profileManager; + return profileManager; +#endif +} + +////////////////////////////////////////////////////////////////////////// + +ThreadStorage& ProfileManager::_threadStorage(profiler::thread_id_t _thread_id) +{ + return m_threads[_thread_id]; +} + +ThreadStorage* ProfileManager::_findThreadStorage(profiler::thread_id_t _thread_id) +{ + auto it = m_threads.find(_thread_id); + return it != m_threads.end() ? &it->second : nullptr; +} + +////////////////////////////////////////////////////////////////////////// + +const BaseBlockDescriptor* ProfileManager::addBlockDescriptor(EasyBlockStatus _defaultStatus, + const char* _autogenUniqueId, + const char* _name, + const char* _filename, + int _line, + block_type_t _block_type, + color_t _color, + bool _copyName) +{ + guard_lock_t lock(m_storedSpin); + + descriptors_map_t::key_type key(_autogenUniqueId); + auto it = m_descriptorsMap.find(key); + if (it != m_descriptorsMap.end()) + return m_descriptors[it->second]; + + const auto nameLen = strlen(_name); + m_usedMemorySize += sizeof(profiler::SerializedBlockDescriptor) + nameLen + strlen(_filename) + 2; + +#if EASY_BLOCK_DESC_FULL_COPY == 0 + BlockDescriptor* desc = nullptr; + + if (_copyName) + { + void* data = malloc(sizeof(BlockDescriptor) + nameLen + 1); + char* name = reinterpret_cast(data) + sizeof(BlockDescriptor); + strncpy(name, _name, nameLen); + desc = ::new (data)BlockDescriptor(static_cast(m_descriptors.size()), _defaultStatus, name, _filename, _line, _block_type, _color); + } + else + { + void* data = malloc(sizeof(BlockDescriptor)); + desc = ::new (data)BlockDescriptor(static_cast(m_descriptors.size()), _defaultStatus, _name, _filename, _line, _block_type, _color); + } +#else + auto desc = new BlockDescriptor(static_cast(m_descriptors.size()), _defaultStatus, _name, _filename, _line, _block_type, _color); +#endif + + m_descriptors.emplace_back(desc); + m_descriptorsMap.emplace(key, desc->id()); + + return desc; +} + +////////////////////////////////////////////////////////////////////////// + +void ProfileManager::storeValue(const BaseBlockDescriptor* _desc, DataType _type, const void* _data, size_t _size, bool _isArray, ValueId _vin) +{ + const auto state = m_profilerStatus.load(std::memory_order_acquire); + if (state != EASY_PROF_ENABLED || (_desc->m_status & profiler::ON) == 0) + return; + + if (THIS_THREAD == nullptr) + registerThread(); + +#if EASY_ENABLE_BLOCK_STATUS != 0 + if (!THIS_THREAD->allowChildren && (_desc->m_status & FORCE_ON_FLAG) == 0) + return; +#endif + + THIS_THREAD->storeValue(getCurrentTime(), _desc->id(), _type, _data, _size, _isArray, _vin); +} + +////////////////////////////////////////////////////////////////////////// + +bool ProfileManager::storeBlock(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName) +{ + const auto state = m_profilerStatus.load(std::memory_order_acquire); + if (state == EASY_PROF_DISABLED || (_desc->m_status & profiler::ON) == 0) + return false; + + if (state == EASY_PROF_DUMP) + { + if (THIS_THREAD == nullptr || THIS_THREAD->halt) + return false; + } + else if (THIS_THREAD == nullptr) + { + registerThread(); + } + +#if EASY_ENABLE_BLOCK_STATUS != 0 + if (!THIS_THREAD->allowChildren && (_desc->m_status & FORCE_ON_FLAG) == 0) + return false; +#endif + + const auto time = getCurrentTime(); + THIS_THREAD->storeBlock(profiler::Block(time, time, _desc->id(), _runtimeName)); + + return true; +} + +bool ProfileManager::storeBlock(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, profiler::timestamp_t _beginTime, profiler::timestamp_t _endTime) +{ + const auto state = m_profilerStatus.load(std::memory_order_acquire); + if (state == EASY_PROF_DISABLED || (_desc->m_status & profiler::ON) == 0) + return false; + + if (state == EASY_PROF_DUMP) + { + if (THIS_THREAD == nullptr || THIS_THREAD->halt) + return false; + } + else if (THIS_THREAD == nullptr) + { + registerThread(); + } + +#if EASY_ENABLE_BLOCK_STATUS != 0 + if (!THIS_THREAD->allowChildren && (_desc->m_status & FORCE_ON_FLAG) == 0) + return false; +#endif + + profiler::Block b(_beginTime, _endTime, _desc->id(), _runtimeName); + THIS_THREAD->storeBlock(b); + b.m_end = b.m_begin; + + return true; +} + +////////////////////////////////////////////////////////////////////////// + +void ProfileManager::storeBlockForce(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, ::profiler::timestamp_t& _timestamp) +{ + if ((_desc->m_status & profiler::ON) == 0) + return; + + if (THIS_THREAD == nullptr) + registerThread(); + +#if EASY_ENABLE_BLOCK_STATUS != 0 + if (!THIS_THREAD->allowChildren && (_desc->m_status & FORCE_ON_FLAG) == 0) + return; +#endif + + _timestamp = getCurrentTime(); + THIS_THREAD->storeBlock(profiler::Block(_timestamp, _timestamp, _desc->id(), _runtimeName)); +} + +void ProfileManager::storeBlockForce2(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, ::profiler::timestamp_t _timestamp) +{ + if ((_desc->m_status & profiler::ON) == 0) + return; + + if (THIS_THREAD == nullptr) + registerThread(); + +#if EASY_ENABLE_BLOCK_STATUS != 0 + if (!THIS_THREAD->allowChildren && (_desc->m_status & FORCE_ON_FLAG) == 0) + return; +#endif + + THIS_THREAD->storeBlock(profiler::Block(_timestamp, _timestamp, _desc->id(), _runtimeName)); +} + +void ProfileManager::storeBlockForce2(ThreadStorage& _registeredThread, const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, ::profiler::timestamp_t _timestamp) +{ + _registeredThread.storeBlock(profiler::Block(_timestamp, _timestamp, _desc->id(), _runtimeName)); +} + +////////////////////////////////////////////////////////////////////////// + +void ProfileManager::beginBlock(Block& _block) +{ + if (THIS_THREAD == nullptr) + registerThread(); + + if (++THIS_THREAD->stackSize > 1) + { + _block.m_status = profiler::OFF; + THIS_THREAD->blocks.openedList.emplace_back(_block); + return; + } + + bool empty = true; + const auto state = m_profilerStatus.load(std::memory_order_acquire); + switch (state) + { + case EASY_PROF_DISABLED: + { + _block.m_status = profiler::OFF; + THIS_THREAD->halt = false; + THIS_THREAD->blocks.openedList.emplace_back(_block); + beginFrame(); + return; + } + + case EASY_PROF_DUMP: + { + const bool halt = THIS_THREAD->halt; + if (halt || THIS_THREAD->blocks.openedList.empty()) + { + _block.m_status = profiler::OFF; + THIS_THREAD->blocks.openedList.emplace_back(_block); + + if (!halt) + { + THIS_THREAD->halt = true; + beginFrame(); + } + + return; + } + + empty = false; + break; + } + + default: + { + empty = THIS_THREAD->blocks.openedList.empty(); + break; + } + } + + THIS_THREAD->stackSize = 0; + THIS_THREAD->halt = false; + + auto blockStatus = _block.m_status; +#if EASY_ENABLE_BLOCK_STATUS != 0 + if (THIS_THREAD->allowChildren) + { +#endif + if (blockStatus & profiler::ON) + _block.start(); +#if EASY_ENABLE_BLOCK_STATUS != 0 + THIS_THREAD->allowChildren = ((blockStatus & profiler::OFF_RECURSIVE) == 0); + } + else if (blockStatus & FORCE_ON_FLAG) + { + _block.start(); + _block.m_status = profiler::FORCE_ON_WITHOUT_CHILDREN; + } + else + { + _block.m_status = profiler::OFF_RECURSIVE; + } +#endif + + if (empty) + { + beginFrame(); + THIS_THREAD->profiledFrameOpened.store(true, std::memory_order_release); + } + + THIS_THREAD->blocks.openedList.emplace_back(_block); +} + +void ProfileManager::beginNonScopedBlock(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName) +{ + if (THIS_THREAD == nullptr) + registerThread(); + + NonscopedBlock& b = THIS_THREAD->nonscopedBlocks.push(_desc, _runtimeName, false); + beginBlock(b); + b.copyname(); +} + +void ProfileManager::beginContextSwitch(profiler::thread_id_t _thread_id, profiler::timestamp_t _time, profiler::thread_id_t _target_thread_id, const char* _target_process, bool _lockSpin) +{ + auto ts = _lockSpin ? findThreadStorage(_thread_id) : _findThreadStorage(_thread_id); + if (ts != nullptr) + // Dirty hack: _target_thread_id will be written to the field "block_id_t m_id" + // and will be available calling method id(). + ts->sync.openedList.emplace_back(_time, _target_thread_id, _target_process); +} + +////////////////////////////////////////////////////////////////////////// + +void ProfileManager::endBlock() +{ + if (--THIS_THREAD->stackSize > 0) + { + THIS_THREAD->popSilent(); + return; + } + + THIS_THREAD->stackSize = 0; + if (THIS_THREAD->halt || m_profilerStatus.load(std::memory_order_acquire) == EASY_PROF_DISABLED) + { + THIS_THREAD->popSilent(); + endFrame(); + return; + } + + if (THIS_THREAD->blocks.openedList.empty()) + return; + + Block& top = THIS_THREAD->blocks.openedList.back(); + if (top.m_status & profiler::ON) + { + if (!top.finished()) + top.finish(); + THIS_THREAD->storeBlock(top); + } + else + { + top.m_end = top.m_begin; // this is to restrict endBlock() call inside ~Block() + } + + if (!top.m_isScoped) + THIS_THREAD->nonscopedBlocks.pop(); + + THIS_THREAD->blocks.openedList.pop_back(); + const bool empty = THIS_THREAD->blocks.openedList.empty(); + if (empty) + { + THIS_THREAD->profiledFrameOpened.store(false, std::memory_order_release); + endFrame(); +#if EASY_ENABLE_BLOCK_STATUS != 0 + THIS_THREAD->allowChildren = true; + } + else + { + THIS_THREAD->allowChildren = + ((THIS_THREAD->blocks.openedList.back().get().m_status & profiler::OFF_RECURSIVE) == 0); + } +#else + } +#endif +} + +void ProfileManager::endContextSwitch(profiler::thread_id_t _thread_id, processid_t _process_id, profiler::timestamp_t _endtime, bool _lockSpin) +{ + ThreadStorage* ts = nullptr; + if (_process_id == m_processId) + { + // Implicit thread registration. + // If thread owned by current process then create new ThreadStorage if there is no one +#if EASY_OPTION_IMPLICIT_THREAD_REGISTRATION != 0 + ts = _lockSpin ? &threadStorage(_thread_id) : &_threadStorage(_thread_id); +# if !defined(_WIN32) && !defined(EASY_CXX11_TLS_AVAILABLE) +# if EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS != 0 +# pragma message "Warning: Implicit thread registration together with removing empty unguarded threads may cause application crash because there is no possibility to check thread state (dead or alive) for pthreads and removed ThreadStorage may be reused if thread is still alive." +# else +# pragma message "Warning: Implicit thread registration without removing empty unguarded threads may lead to memory leak because there is no possibility to check thread state (dead or alive) for pthreads." +# endif +# endif +#endif + } + else + { + // If thread owned by another process OR _process_id IS UNKNOWN then do not create ThreadStorage for this + ts = _lockSpin ? findThreadStorage(_thread_id) : _findThreadStorage(_thread_id); + } + + if (ts == nullptr || ts->sync.openedList.empty()) + return; + + CSwitchBlock& lastBlock = ts->sync.openedList.back(); + lastBlock.m_end = _endtime; + + ts->storeCSwitch(lastBlock); + ts->sync.openedList.pop_back(); +} + +////////////////////////////////////////////////////////////////////////// + +void ProfileManager::beginFrame() +{ + THIS_THREAD->beginFrame(); +} + +void ProfileManager::endFrame() +{ + if (!THIS_THREAD->frameOpened) + return; + + const profiler::timestamp_t duration = THIS_THREAD->endFrame(); + + if (THIS_THREAD_FRAME_T_RESET_MAX) THIS_THREAD_FRAME_T_MAX = 0; + THIS_THREAD_FRAME_T_RESET_MAX = false; + + THIS_THREAD_FRAME_T_CUR = duration; + if (duration > THIS_THREAD_FRAME_T_MAX) + THIS_THREAD_FRAME_T_MAX = duration; + + THIS_THREAD_FRAME_T_RESET_AVG = THIS_THREAD_FRAME_T_RESET_AVG || THIS_THREAD_N_FRAMES > 10000; + + if (THIS_THREAD_IS_MAIN) + { + if (m_frameAvgReset.exchange(false, std::memory_order_release) || THIS_THREAD_FRAME_T_RESET_AVG) + { + if (THIS_THREAD_N_FRAMES > 0) + m_frameAvg.store(THIS_THREAD_FRAME_T_ACC / THIS_THREAD_N_FRAMES, std::memory_order_release); + THIS_THREAD_FRAME_T_RESET_AVG = false; + THIS_THREAD_FRAME_T_ACC = duration; + THIS_THREAD_N_FRAMES = 1; + } + else + { + THIS_THREAD_FRAME_T_ACC += duration; + ++THIS_THREAD_N_FRAMES; + m_frameAvg.store(THIS_THREAD_FRAME_T_ACC / THIS_THREAD_N_FRAMES, std::memory_order_release); + } + + const auto maxDuration = m_frameMax.load(std::memory_order_acquire); + if (m_frameMaxReset.exchange(false, std::memory_order_release) || duration > maxDuration) + m_frameMax.store(duration, std::memory_order_release); + + m_frameCur.store(duration, std::memory_order_release); + + return; + } + + const auto reset = (uint32_t)!THIS_THREAD_FRAME_T_RESET_AVG; + THIS_THREAD_FRAME_T_RESET_AVG = false; + THIS_THREAD_N_FRAMES = 1 + reset * THIS_THREAD_N_FRAMES; + THIS_THREAD_FRAME_T_ACC = duration + reset * THIS_THREAD_FRAME_T_ACC; +} + +profiler::timestamp_t ProfileManager::maxFrameDuration() +{ + auto duration = m_frameMax.load(std::memory_order_acquire); + m_frameMaxReset.store(true, std::memory_order_release); + return duration; +} + +profiler::timestamp_t ProfileManager::avgFrameDuration() +{ + auto duration = m_frameAvg.load(std::memory_order_acquire); + m_frameAvgReset.store(true, std::memory_order_release); + return duration; +} + +profiler::timestamp_t ProfileManager::curFrameDuration() const +{ + return m_frameCur.load(std::memory_order_acquire); +} + +////////////////////////////////////////////////////////////////////////// + +void ProfileManager::enableEventTracer() +{ +#ifdef _WIN32 + if (m_isEventTracingEnabled.load(std::memory_order_acquire)) + EasyEventTracer::instance().enable(true); +#endif +} + +void ProfileManager::disableEventTracer() +{ +#ifdef _WIN32 + EasyEventTracer::instance().disable(); +#endif +} + +void ProfileManager::setEnabled(bool isEnable) +{ + guard_lock_t lock(m_dumpSpin); + + auto time = getCurrentTime(); + const auto status = isEnable ? EASY_PROF_ENABLED : EASY_PROF_DISABLED; + const auto prev = m_profilerStatus.exchange(status, std::memory_order_release); + if (prev == status) + return; + + if (isEnable) + { + EASY_LOGMSG("Enabled profiling\n"); + enableEventTracer(); + m_beginTime = time; + } + else + { + EASY_LOGMSG("Disabled profiling\n"); + disableEventTracer(); + m_endTime = time; + } +} + +bool ProfileManager::isEnabled() const +{ + return m_profilerStatus.load(std::memory_order_acquire) == EASY_PROF_ENABLED; +} + +void ProfileManager::setEventTracingEnabled(bool _isEnable) +{ + m_isEventTracingEnabled.store(_isEnable, std::memory_order_release); +} + +bool ProfileManager::isEventTracingEnabled() const +{ + return m_isEventTracingEnabled.load(std::memory_order_acquire); +} + +////////////////////////////////////////////////////////////////////////// + +char ProfileManager::checkThreadExpired(ThreadStorage& _registeredThread) +{ + const char val = _registeredThread.expired.load(std::memory_order_acquire); + if (val != 0) + return val; + + if (_registeredThread.guarded) + return 0; + +#ifdef _WIN32 + // Check thread state for Windows + + DWORD exitCode = 0; + auto hThread = OpenThread(THREAD_QUERY_LIMITED_INFORMATION, FALSE, (DWORD)_registeredThread.id); + if (hThread == nullptr || GetExitCodeThread(hThread, &exitCode) == FALSE || exitCode != STILL_ACTIVE) + { + // Thread has been expired + _registeredThread.expired.store(1, std::memory_order_release); + if (hThread != nullptr) + CloseHandle(hThread); + return 1; + } + + if (hThread != nullptr) + CloseHandle(hThread); + + return 0; +#else + // Check thread state for Linux and MacOS/iOS + + // This would drop the application if pthread already died + //return pthread_kill(_registeredThread.pthread_id, 0) != 0 ? 1 : 0; + + // There is no function to check external pthread state in Linux! :(( + +#ifndef EASY_CXX11_TLS_AVAILABLE +#pragma message "Warning: Your compiler does not support thread_local C++11 feature. Please use EASY_THREAD_SCOPE as much as possible. Otherwise, there is a possibility of memory leak if there are a lot of rapidly created and destroyed threads." +#endif + + return 0; +#endif +} + +////////////////////////////////////////////////////////////////////////// + +uint32_t ProfileManager::dumpBlocksToStream(profiler::OStream& _outputStream, bool _lockSpin, bool _async) +{ + EASY_LOGMSG("dumpBlocksToStream(_lockSpin = " << _lockSpin << ")...\n"); + + if (_lockSpin) + m_dumpSpin.lock(); + + const auto state = m_profilerStatus.load(std::memory_order_acquire); + +#ifndef _WIN32 + const bool eventTracingEnabled = m_isEventTracingEnabled.load(std::memory_order_acquire); +#endif + + if (state == EASY_PROF_ENABLED) { + m_profilerStatus.store(EASY_PROF_DUMP, std::memory_order_release); + disableEventTracer(); + m_endTime = getCurrentTime(); + } + + + // This is to make sure that no new descriptors or new threads will be + // added until we finish sending data. + //m_spin.lock(); + // This is the only place using both spins, so no dead-lock will occur + + if (_async && m_stopDumping.load(std::memory_order_acquire)) + { + if (_lockSpin) + m_dumpSpin.unlock(); + return 0; + } + + // Wait for some time to be sure that all operations which began before setEnabled(false) will be finished. + // This is much better than inserting spin-lock or atomic variable check into each store operation. + std::this_thread::sleep_for(std::chrono::milliseconds(20)); + + // wait for all threads finish opened frames + EASY_LOG_ONLY(bool logged = false); + for (auto thread_it = m_threads.begin(), end = m_threads.end(); thread_it != end;) + { + if (_async && m_stopDumping.load(std::memory_order_acquire)) + { + if (_lockSpin) + m_dumpSpin.unlock(); + return 0; + } + + if (!thread_it->second.profiledFrameOpened.load(std::memory_order_acquire)) + { + ++thread_it; + EASY_LOG_ONLY(logged = false); + } + else + { + EASY_LOG_ONLY( + if (!logged) + { + logged = true; + if (thread_it->second.named) + EASY_WARNING("Waiting for thread \"" << thread_it->second.name << "\" finish opened frame (which is top EASY_BLOCK for this thread)...\n"); + else + EASY_WARNING("Waiting for thread " << thread_it->first << " finish opened frame (which is top EASY_BLOCK for this thread)...\n"); + } + ); + + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + } + + m_profilerStatus.store(EASY_PROF_DISABLED, std::memory_order_release); + + EASY_LOGMSG("All threads have closed frames\n"); + EASY_LOGMSG("Disabled profiling\n"); + + m_spin.lock(); + m_storedSpin.lock(); + // TODO: think about better solution because this one is not 100% safe... + + const profiler::timestamp_t now = getCurrentTime(); + const profiler::timestamp_t endtime = m_endTime == 0 ? now : std::min(now, m_endTime); + +#ifndef _WIN32 + if (eventTracingEnabled) + { + // Read thread context switch events from temporary file + + if (_async && m_stopDumping.load(std::memory_order_acquire)) + { + m_spin.unlock(); + m_storedSpin.unlock(); + if (_lockSpin) + m_dumpSpin.unlock(); + return 0; + } + + EASY_LOGMSG("Writing context switch events...\n"); + + uint64_t timestamp = 0; + profiler::thread_id_t thread_from = 0, thread_to = 0; + + std::ifstream infile(m_csInfoFilename.c_str()); + if(infile.is_open()) + { + EASY_LOG_ONLY(uint32_t num = 0); + std::string next_task_name; + pid_t process_to = 0; + while (infile >> timestamp >> thread_from >> thread_to >> next_task_name >> process_to) + { + if (_async && m_stopDumping.load(std::memory_order_acquire)) + { + m_spin.unlock(); + m_storedSpin.unlock(); + if (_lockSpin) + m_dumpSpin.unlock(); + return 0; + } + + beginContextSwitch(thread_from, timestamp, thread_to, next_task_name.c_str(), false); + endContextSwitch(thread_to, (processid_t)process_to, timestamp, false); + EASY_LOG_ONLY(++num); + } + + EASY_LOGMSG("Done, " << num << " context switch events wrote\n"); + } + EASY_LOG_ONLY( + else { + EASY_ERROR("Can not open context switch log-file \"" << m_csInfoFilename << "\"\n"); + } + ) + } +#endif + + bool mainThreadExpired = false; + + // Calculate used memory total size and total blocks number + uint64_t usedMemorySize = 0; + uint32_t blocks_number = 0; + for (auto thread_it = m_threads.begin(), end = m_threads.end(); thread_it != end;) + { + if (_async && m_stopDumping.load(std::memory_order_acquire)) + { + m_spin.unlock(); + m_storedSpin.unlock(); + if (_lockSpin) + m_dumpSpin.unlock(); + return 0; + } + + auto& thread = thread_it->second; + uint32_t num = static_cast(thread.blocks.closedList.size()) + static_cast(thread.sync.closedList.size()); + const char expired = ProfileManager::checkThreadExpired(thread); + +#ifdef _WIN32 + if (num == 0 && expired != 0) +#elif defined(EASY_CXX11_TLS_AVAILABLE) + // Removing !guarded thread when thread_local feature is supported is safe. + if (num == 0 && (expired != 0 || !thread.guarded)) +#elif EASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS != 0 +# pragma message "Warning: Removing !guarded thread without thread_local support may cause an application crash, but fixes potential memory leak when using pthreads." + // Removing !guarded thread may cause an application crash if a thread would start to write blocks after ThreadStorage remove. + // TODO: Find solution to check thread state for pthread or to nullify THIS_THREAD pointer for removed ThreadStorage + if (num == 0 && (expired != 0 || !t.guarded)) +#else +# pragma message "Warning: Can not check pthread state (dead or alive). This may cause memory leak because ThreadStorage-s would not be removed ever during an application launched." + if (num == 0 && expired != 0) +#endif + { + // Remove thread if it contains no profiled information and has been finished (or is not guarded --deprecated). + profiler::thread_id_t id = thread_it->first; + if (!mainThreadExpired && m_mainThreadId.compare_exchange_weak(id, 0, std::memory_order_release, std::memory_order_acquire)) + mainThreadExpired = true; + m_threads.erase(thread_it++); + continue; + } + + if (expired == 1) + { + EASY_FORCE_EVENT3(thread, endtime, "ThreadExpired", EASY_COLOR_THREAD_END); + ++num; + } + + usedMemorySize += thread.blocks.usedMemorySize + thread.sync.usedMemorySize; + blocks_number += num; + ++thread_it; + } + + // Write profiler signature and version + _outputStream.write(PROFILER_SIGNATURE); + _outputStream.write(EASY_CURRENT_VERSION); + _outputStream.write(m_processId); + + // Write CPU frequency to let GUI calculate real time value from CPU clocks +#if defined(EASY_CHRONO_CLOCK) || defined(_WIN32) + _outputStream.write(CPU_FREQUENCY); +#else + EASY_LOGMSG("Calculating CPU frequency\n"); + const int64_t cpu_frequency = calculate_cpu_frequency(); + _outputStream.write(cpu_frequency * 1000LL); + EASY_LOGMSG("Done calculating CPU frequency\n"); + + CPU_FREQUENCY.store(cpu_frequency, std::memory_order_release); +#endif + + // Write begin and end time + _outputStream.write(m_beginTime); + _outputStream.write(m_endTime); + + // Write blocks number and used memory size + _outputStream.write(blocks_number); + _outputStream.write(usedMemorySize); + _outputStream.write(static_cast(m_descriptors.size())); + _outputStream.write(m_usedMemorySize); + + // Write block descriptors + for (const auto descriptor : m_descriptors) + { + const auto name_size = descriptor->nameSize(); + const auto filename_size = descriptor->filenameSize(); + const auto size = static_cast(sizeof(profiler::SerializedBlockDescriptor) + name_size + filename_size); + + _outputStream.write(size); + _outputStream.write(*descriptor); + _outputStream.write(name_size); + _outputStream.write(descriptor->name(), name_size); + _outputStream.write(descriptor->filename(), filename_size); + } + + // Write blocks and context switch events for each thread + for (auto thread_it = m_threads.begin(), end = m_threads.end(); thread_it != end;) + { + if (_async && m_stopDumping.load(std::memory_order_acquire)) + { + m_spin.unlock(); + m_storedSpin.unlock(); + if (_lockSpin) + m_dumpSpin.unlock(); + return 0; + } + + auto& thread = thread_it->second; + + _outputStream.write(thread_it->first); + + const auto name_size = static_cast(thread.name.size() + 1); + _outputStream.write(name_size); + _outputStream.write(name_size > 1 ? thread.name.c_str() : "", name_size); + + _outputStream.write(thread.sync.closedList.size()); + if (!thread.sync.closedList.empty()) + thread.sync.closedList.serialize(_outputStream); + + _outputStream.write(thread.blocks.closedList.size()); + if (!thread.blocks.closedList.empty()) + thread.blocks.closedList.serialize(_outputStream); + + thread.clearClosed(); + //t.blocks.openedList.clear(); + thread.sync.openedList.clear(); + + if (thread.expired.load(std::memory_order_acquire) != 0) + { + // Remove expired thread after writing all profiled information + profiler::thread_id_t id = thread_it->first; + if (!mainThreadExpired && m_mainThreadId.compare_exchange_weak(id, 0, std::memory_order_release, std::memory_order_acquire)) + mainThreadExpired = true; + m_threads.erase(thread_it++); + } + else + { + ++thread_it; + } + } + + m_storedSpin.unlock(); + m_spin.unlock(); + + if (_lockSpin) + m_dumpSpin.unlock(); + + EASY_LOGMSG("Done dumpBlocksToStream(). Dumped " << blocks_number << " blocks\n"); + + return blocks_number; +} + +uint32_t ProfileManager::dumpBlocksToFile(const char* _filename) +{ + EASY_LOGMSG("dumpBlocksToFile(\"" << _filename << "\")...\n"); + + std::ofstream outputFile(_filename, std::fstream::binary); + if (!outputFile.is_open()) + { + EASY_ERROR("Can not open \"" << _filename << "\" for writing\n"); + return 0; + } + + profiler::OStream outputStream; + + // Replace outputStream buffer to outputFile buffer to avoid redundant copying + typedef ::std::basic_iostream stringstream_parent; + stringstream_parent& s = outputStream.stream(); + auto oldbuf = s.rdbuf(outputFile.rdbuf()); + + // Write data directly to file + const auto blocksNumber = dumpBlocksToStream(outputStream, true, false); + + // Restore old outputStream buffer to avoid possible second memory free on stringstream destructor + s.rdbuf(oldbuf); + + EASY_LOGMSG("Done dumpBlocksToFile()\n"); + + return blocksNumber; +} + +void ProfileManager::registerThread() +{ + THIS_THREAD = &threadStorage(getCurrentThreadId()); + +#ifdef EASY_CXX11_TLS_AVAILABLE + THIS_THREAD->guarded = true; + THIS_THREAD_GUARD.m_id = THIS_THREAD->id; +#endif +} + +const char* ProfileManager::registerThread(const char* name, ThreadGuard& threadGuard) +{ + if (THIS_THREAD == nullptr) + THIS_THREAD = &threadStorage(getCurrentThreadId()); + + THIS_THREAD->guarded = true; + if (!THIS_THREAD->named) + { + THIS_THREAD->named = true; + THIS_THREAD->name = name; + + if (THIS_THREAD->name == "Main") + { + profiler::thread_id_t id = 0; + THIS_THREAD_IS_MAIN = m_mainThreadId.compare_exchange_weak(id, THIS_THREAD->id, std::memory_order_release, std::memory_order_acquire); + } + +#ifdef EASY_CXX11_TLS_AVAILABLE + THIS_THREAD_GUARD.m_id = THIS_THREAD->id; + } + + (void)threadGuard; // this is just to prevent from warning about unused variable +#else + } + + threadGuard.m_id = THIS_THREAD->id; +#endif + + return THIS_THREAD->name.c_str(); +} + +const char* ProfileManager::registerThread(const char* name) +{ + if (THIS_THREAD == nullptr) + THIS_THREAD = &threadStorage(getCurrentThreadId()); + + if (!THIS_THREAD->named) + { + THIS_THREAD->named = true; + THIS_THREAD->name = name; + + if (THIS_THREAD->name == "Main") + { + profiler::thread_id_t id = 0; + THIS_THREAD_IS_MAIN = m_mainThreadId.compare_exchange_weak(id, THIS_THREAD->id, std::memory_order_release, std::memory_order_acquire); + } + +#ifdef EASY_CXX11_TLS_AVAILABLE + THIS_THREAD->guarded = true; + THIS_THREAD_GUARD.m_id = THIS_THREAD->id; +#endif + } + + return THIS_THREAD->name.c_str(); +} + +void ProfileManager::setBlockStatus(block_id_t _id, EasyBlockStatus _status) +{ + if (m_profilerStatus.load(std::memory_order_acquire) != EASY_PROF_DISABLED) + return; // Changing blocks statuses is restricted while profile session is active + + guard_lock_t lock(m_storedSpin); + if (_id < m_descriptors.size()) + { + auto desc = m_descriptors[_id]; + lock.unlock(); + desc->m_status = _status; + } +} + +void ProfileManager::startListen(uint16_t _port) +{ + if (!m_isAlreadyListening.exchange(true, std::memory_order_release)) + { + m_stopListen.store(false, std::memory_order_release); + m_listenThread = std::thread(&ProfileManager::listen, this, _port); + } +} + +void ProfileManager::stopListen() +{ + m_stopListen.store(true, std::memory_order_release); + if (m_listenThread.joinable()) + m_listenThread.join(); + m_isAlreadyListening.store(false, std::memory_order_release); + + EASY_LOGMSG("Listening stopped\n"); +} + +bool ProfileManager::isListening() const +{ + return m_isAlreadyListening.load(std::memory_order_acquire); +} + +////////////////////////////////////////////////////////////////////////// + +template +inline void join(std::future& futureResult) +{ + if (futureResult.valid()) + futureResult.get(); +} + +void ProfileManager::listen(uint16_t _port) +{ + EASY_THREAD_SCOPE("EasyProfiler.Listen"); + + EASY_LOGMSG("Listening started\n"); + + profiler::OStream os; + std::future dumpingResult; + bool dumping = false; + + const auto stopDumping = [this, &dumping, &dumpingResult, &os] + { + dumping = false; + m_stopDumping.store(true, std::memory_order_release); + join(dumpingResult); + os.clear(); + }; + + EasySocket socket; + profiler::net::Message replyMessage(profiler::net::MessageType::Reply_Capturing_Started); + + socket.bind(_port); + int bytes = 0; + while (!m_stopListen.load(std::memory_order_acquire)) + { + if (dumping) + stopDumping(); + + socket.listen(); + socket.accept(); + + bool hasConnect = true; + + // Send reply + { + const bool wasLowPriorityET = +#ifdef _WIN32 + EasyEventTracer::instance().isLowPriority(); +#else + false; +#endif + const profiler::net::EasyProfilerStatus connectionReply( + m_profilerStatus.load(std::memory_order_acquire) == EASY_PROF_ENABLED, + m_isEventTracingEnabled.load(std::memory_order_acquire), wasLowPriorityET); + + bytes = socket.send(&connectionReply, sizeof(profiler::net::EasyProfilerStatus)); + hasConnect = bytes > 0; + } + + while (hasConnect && !m_stopListen.load(std::memory_order_acquire)) + { + if (dumping) + { + if (!dumpingResult.valid()) + { + dumping = false; + socket.setReceiveTimeout(0); + os.clear(); + } + else if (dumpingResult.wait_for(std::chrono::milliseconds(0)) == std::future_status::ready) + { + dumping = false; + dumpingResult.get(); + + const auto size = os.stream().tellp(); + static const decltype(size) badSize = -1; + if (size != badSize) + { + const profiler::net::DataMessage dm(static_cast(size), + profiler::net::MessageType::Reply_Blocks); + + const size_t packet_size = sizeof(dm) + dm.size; + std::string sendbuf; + sendbuf.reserve(packet_size + 1); + + if (sendbuf.capacity() >= packet_size) // check if there is enough memory + { + sendbuf.append((const char*) &dm, sizeof(dm)); + sendbuf += os.stream().str(); // TODO: Avoid double-coping data from stringstream! + os.clear(); + + bytes = socket.send(sendbuf.c_str(), packet_size); + hasConnect = bytes > 0; + if (!hasConnect) + break; + } + else + { + EASY_ERROR("Can not send blocks. Not enough memory for allocating " << packet_size + << " bytes"); + os.clear(); + } + } + else + { + EASY_ERROR("Can not send blocks. Bad std::stringstream.tellp() == -1"); + os.clear(); + } + + replyMessage.type = profiler::net::MessageType::Reply_Blocks_End; + bytes = socket.send(&replyMessage, sizeof(replyMessage)); + hasConnect = bytes > 0; + if (!hasConnect) + break; + + socket.setReceiveTimeout(0); + } + } + + char buffer[256] = {}; + bytes = socket.receive(buffer, 255); + + hasConnect = socket.isConnected(); + if (!hasConnect || bytes < static_cast(sizeof(profiler::net::Message))) + continue; + + auto message = (const profiler::net::Message*)buffer; + if (!message->isEasyNetMessage()) + continue; + + switch (message->type) + { + case profiler::net::MessageType::Ping: + { + EASY_LOGMSG("receive MessageType::Ping\n"); + break; + } + + case profiler::net::MessageType::Request_MainThread_FPS: + { + profiler::timestamp_t maxDuration = maxFrameDuration(), avgDuration = avgFrameDuration(); + + maxDuration = TICKS_TO_US(maxDuration); + avgDuration = TICKS_TO_US(avgDuration); + + const profiler::net::TimestampMessage reply(profiler::net::MessageType::Reply_MainThread_FPS, + (uint32_t)maxDuration, (uint32_t)avgDuration); + + bytes = socket.send(&reply, sizeof(profiler::net::TimestampMessage)); + hasConnect = bytes > 0; + + break; + } + + case profiler::net::MessageType::Request_Start_Capture: + { + EASY_LOGMSG("receive MessageType::Request_Start_Capture\n"); + + ::profiler::timestamp_t t = 0; + EASY_FORCE_EVENT(t, "StartCapture", EASY_COLOR_START, profiler::OFF); + + m_dumpSpin.lock(); + const auto prev = m_profilerStatus.exchange(EASY_PROF_ENABLED, std::memory_order_release); + if (prev != EASY_PROF_ENABLED) { + enableEventTracer(); + m_beginTime = t; + } + m_dumpSpin.unlock(); + + replyMessage.type = profiler::net::MessageType::Reply_Capturing_Started; + bytes = socket.send(&replyMessage, sizeof(replyMessage)); + hasConnect = bytes > 0; + + break; + } + + case profiler::net::MessageType::Request_Stop_Capture: + { + EASY_LOGMSG("receive MessageType::Request_Stop_Capture\n"); + + if (dumping) + break; + + m_dumpSpin.lock(); + auto time = getCurrentTime(); + const auto prev = m_profilerStatus.exchange(EASY_PROF_DUMP, std::memory_order_release); + if (prev == EASY_PROF_ENABLED) { + disableEventTracer(); + m_endTime = time; + } + EASY_FORCE_EVENT2(m_endTime, "StopCapture", EASY_COLOR_END, profiler::OFF); + + dumping = true; + socket.setReceiveTimeout(500); // We have to check if dumping ready or not + + m_stopDumping.store(false, std::memory_order_release); + dumpingResult = std::async(std::launch::async, [this, &os] + { + auto result = dumpBlocksToStream(os, false, true); + m_dumpSpin.unlock(); + return result; + }); + + break; + } + + case profiler::net::MessageType::Request_Blocks_Description: + { + EASY_LOGMSG("receive MessageType::Request_Blocks_Description\n"); + + if (dumping) + stopDumping(); + + // Write profiler signature and version + os.write(PROFILER_SIGNATURE); + os.write(EASY_CURRENT_VERSION); + + // Write block descriptors + m_storedSpin.lock(); + os.write(static_cast(m_descriptors.size())); + os.write(m_usedMemorySize); + for (const auto descriptor : m_descriptors) + { + const auto name_size = descriptor->nameSize(); + const auto filename_size = descriptor->filenameSize(); + const auto size = static_cast(sizeof(profiler::SerializedBlockDescriptor) + + name_size + filename_size); + + os.write(size); + os.write(*descriptor); + os.write(name_size); + os.write(descriptor->name(), name_size); + os.write(descriptor->filename(), filename_size); + } + m_storedSpin.unlock(); + // END of Write block descriptors. + + const auto size = os.stream().tellp(); + static const decltype(size) badSize = -1; + if (size != badSize) + { + const profiler::net::DataMessage dm(static_cast(size), + profiler::net::MessageType::Reply_Blocks_Description); + + const size_t packet_size = sizeof(dm) + dm.size; + std::string sendbuf; + sendbuf.reserve(packet_size + 1); + + if (sendbuf.capacity() >= packet_size) // check if there is enough memory + { + sendbuf.append((const char*)&dm, sizeof(dm)); + sendbuf += os.stream().str(); // TODO: Avoid double-coping data from stringstream! + os.clear(); + + bytes = socket.send(sendbuf.c_str(), packet_size); + //hasConnect = bytes > 0; + } + else + { + EASY_ERROR("Can not send block descriptions. Not enough memory for allocating " << packet_size << " bytes"); + } + } + else + { + EASY_ERROR("Can not send block descriptions. Bad std::stringstream.tellp() == -1"); + } + + replyMessage.type = profiler::net::MessageType::Reply_Blocks_Description_End + ; + bytes = socket.send(&replyMessage, sizeof(replyMessage)); + hasConnect = bytes > 0; + + break; + } + + case profiler::net::MessageType::Change_Block_Status: + { + auto data = reinterpret_cast(message); + + EASY_LOGMSG("receive MessageType::ChangeBLock_Status id=" << data->id << " status=" << data->status << std::endl); + + setBlockStatus(data->id, static_cast<::profiler::EasyBlockStatus>(data->status)); + + break; + } + + case profiler::net::MessageType::Change_Event_Tracing_Status: + { + auto data = reinterpret_cast(message); + + EASY_LOGMSG("receive MessageType::Change_Event_Tracing_Status on=" << data->flag << std::endl); + + m_isEventTracingEnabled.store(data->flag, std::memory_order_release); + break; + } + + case profiler::net::MessageType::Change_Event_Tracing_Priority: + { +#if defined(_WIN32) || EASY_OPTION_LOG_ENABLED != 0 + auto data = reinterpret_cast(message); +#endif + + EASY_LOGMSG("receive MessageType::Change_Event_Tracing_Priority low=" << data->flag << std::endl); + +#if defined(_WIN32) + EasyEventTracer::instance().setLowPriority(data->flag); +#endif + break; + } + + default: + break; + } + } + } + + if (dumping) + { + m_stopDumping.store(true, std::memory_order_release); + join(dumpingResult); + } +} + +////////////////////////////////////////////////////////////////////////// + diff --git a/3rdparty/easyprofiler/easy_profiler_core/profile_manager.h b/3rdparty/easyprofiler/easy_profiler_core/profile_manager.h new file mode 100644 index 0000000..963f9da --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/profile_manager.h @@ -0,0 +1,211 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_MANAGER_H +#define EASY_PROFILER_MANAGER_H + +#include + +#ifdef _WIN32 +// Do not move this include to other place! +// It should be included before Windows.h which is included in spin_lock.h +# include +#endif // _WIN32 + +#include "spin_lock.h" +#include "outstream.h" +#include "hashed_cstr.h" +#include "thread_storage.h" + +#include +#include +#include +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// + +typedef uint64_t processid_t; + +class BlockDescriptor; + +namespace profiler { class ValueId; } + +class ProfileManager +{ +#ifndef EASY_MAGIC_STATIC_AVAILABLE + friend class ProfileManagerInstance; +#endif + + ProfileManager(); + + typedef profiler::guard_lock guard_lock_t; + typedef std::map map_of_threads_stacks; + typedef std::vector block_descriptors_t; + +#ifdef EASY_PROFILER_HASHED_CSTR_DEFINED + typedef std::unordered_map descriptors_map_t; +#else + typedef std::unordered_map descriptors_map_t; +#endif + + const processid_t m_processId; + + map_of_threads_stacks m_threads; + block_descriptors_t m_descriptors; + descriptors_map_t m_descriptorsMap; + uint64_t m_usedMemorySize; + profiler::timestamp_t m_beginTime; + profiler::timestamp_t m_endTime; + std::atomic m_frameMax; + std::atomic m_frameAvg; + std::atomic m_frameCur; + profiler::spin_lock m_spin; + profiler::spin_lock m_storedSpin; + profiler::spin_lock m_dumpSpin; + std::atomic m_mainThreadId; + std::atomic m_profilerStatus; + std::atomic_bool m_isEventTracingEnabled; + std::atomic_bool m_isAlreadyListening; + std::atomic_bool m_frameMaxReset; + std::atomic_bool m_frameAvgReset; + std::atomic_bool m_stopDumping; + + std::string m_csInfoFilename = "/tmp/cs_profiling_info.log"; + + uint32_t dumpBlocksToStream(profiler::OStream& _outputStream, bool _lockSpin, bool _async); + void setBlockStatus(profiler::block_id_t _id, profiler::EasyBlockStatus _status); + + std::thread m_listenThread; + void listen(uint16_t _port); + + std::atomic_bool m_stopListen; + +public: + + ProfileManager(const ProfileManager&) = delete; + ProfileManager(ProfileManager&&) = delete; + ProfileManager& operator = (const ProfileManager&) = delete; + ProfileManager& operator = (ProfileManager&&) = delete; + + static ProfileManager& instance(); + ~ProfileManager(); + + const profiler::BaseBlockDescriptor* addBlockDescriptor(profiler::EasyBlockStatus _defaultStatus, + const char* _autogenUniqueId, + const char* _name, + const char* _filename, + int _line, + profiler::block_type_t _block_type, + profiler::color_t _color, + bool _copyName = false); + + void storeValue(const profiler::BaseBlockDescriptor* _desc, profiler::DataType _type, const void* _data, size_t _size, bool _isArray, profiler::ValueId _vin); + bool storeBlock(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName); + bool storeBlock(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, profiler::timestamp_t _beginTime, profiler::timestamp_t _endTime); + void beginBlock(profiler::Block& _block); + void beginNonScopedBlock(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName); + void endBlock(); + profiler::timestamp_t maxFrameDuration(); + profiler::timestamp_t avgFrameDuration(); + profiler::timestamp_t curFrameDuration() const; + void setEnabled(bool isEnable); + bool isEnabled() const; + void setEventTracingEnabled(bool _isEnable); + bool isEventTracingEnabled() const; + uint32_t dumpBlocksToFile(const char* filename); + const char* registerThread(const char* name, profiler::ThreadGuard& threadGuard); + const char* registerThread(const char* name); + + void setContextSwitchLogFilename(const char* name) + { + m_csInfoFilename = name; + } + + const char* getContextSwitchLogFilename() const + { + return m_csInfoFilename.c_str(); + } + + void beginContextSwitch(profiler::thread_id_t _thread_id, profiler::timestamp_t _time, profiler::thread_id_t _target_thread_id, const char* _target_process, bool _lockSpin = true); + void endContextSwitch(profiler::thread_id_t _thread_id, processid_t _process_id, profiler::timestamp_t _endtime, bool _lockSpin = true); + void startListen(uint16_t _port); + void stopListen(); + bool isListening() const; + +private: + + void registerThread(); + + void beginFrame(); + void endFrame(); + + void enableEventTracer(); + void disableEventTracer(); + + static char checkThreadExpired(ThreadStorage& _registeredThread); + + void storeBlockForce(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, ::profiler::timestamp_t& _timestamp); + void storeBlockForce2(const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, ::profiler::timestamp_t _timestamp); + void storeBlockForce2(ThreadStorage& _registeredThread, const profiler::BaseBlockDescriptor* _desc, const char* _runtimeName, ::profiler::timestamp_t _timestamp); + + ThreadStorage& _threadStorage(profiler::thread_id_t _thread_id); + ThreadStorage* _findThreadStorage(profiler::thread_id_t _thread_id); + + inline ThreadStorage& threadStorage(profiler::thread_id_t _thread_id) + { + guard_lock_t lock(m_spin); + return _threadStorage(_thread_id); + } + + inline ThreadStorage* findThreadStorage(profiler::thread_id_t _thread_id) + { + guard_lock_t lock(m_spin); + return _findThreadStorage(_thread_id); + } + +}; // END of class ProfileManager. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER_MANAGER_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/reader.cpp b/3rdparty/easyprofiler/easy_profiler_core/reader.cpp new file mode 100644 index 0000000..4676374 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/reader.cpp @@ -0,0 +1,1030 @@ +/************************************************************************ +* file name : reader.cpp +* ----------------- : +* creation time : 2016/06/19 +* authors : Sergey Yagovtsev, Victor Zarubkin +* emails : yse.sey@gmail.com, v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of fillTreesFromFile function +* : which reads profiler file and fill profiler blocks tree. +* ----------------- : +* change log : * 2016/06/19 Sergey Yagovtsev: First fillTreesFromFile implementation. +* : +* : * 2016/06/25 Victor Zarubkin: Removed unnecessary memory allocation and copy +* : when creating and inserting blocks into the tree. +* : +* : * 2016/06/26 Victor Zarubkin: Added statistics gathering (min, max, average duration, +* : number of block calls). +* : * 2016/06/26 Victor Zarubkin, Sergey Yagovtsev: Added statistics gathering for root +* : blocks in the tree. +* : +* : * 2016/06/29 Victor Zarubkin: Added calculaton of total children number for blocks. +* : +* : * 2016/06/30 Victor Zarubkin: Added this header. +* : Added tree depth calculation. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include + +#include "hashed_cstr.h" + +#include +#include +#include +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// + +typedef uint64_t processid_t; + +extern const uint32_t PROFILER_SIGNATURE; +extern const uint32_t EASY_CURRENT_VERSION; + +# define EASY_VERSION_INT(v_major, v_minor, v_patch) ((static_cast(v_major) << 24) | (static_cast(v_minor) << 16) | static_cast(v_patch)) +const uint32_t MIN_COMPATIBLE_VERSION = EASY_VERSION_INT(0, 1, 0); ///< minimal compatible version (.prof file format was not changed seriously since this version) +const uint32_t EASY_V_100 = EASY_VERSION_INT(1, 0, 0); ///< in v1.0.0 some additional data were added into .prof file +const uint32_t EASY_V_130 = EASY_VERSION_INT(1, 3, 0); ///< in v1.3.0 changed sizeof(thread_id_t) uint32_t -> uint64_t +# undef EASY_VERSION_INT + +const uint64_t TIME_FACTOR = 1000000000ULL; + +// TODO: use 128 bit integer operations for better accuracy +#define EASY_USE_FLOATING_POINT_CONVERSION + +#ifdef EASY_USE_FLOATING_POINT_CONVERSION + +// Suppress warnings about double to uint64 conversion +# ifdef _MSC_VER +# pragma warning(disable:4244) +# elif defined(__GNUC__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wconversion" +# pragma GCC diagnostic ignored "-Wsign-conversion" +# elif defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wconversion" +# pragma clang diagnostic ignored "-Wsign-conversion" +# endif + +# define EASY_CONVERT_TO_NANO(t, freq, factor) t *= factor + +#else + +# define EASY_CONVERT_TO_NANO(t, freq, factor) t *= TIME_FACTOR; t /= freq + +#endif + +////////////////////////////////////////////////////////////////////////// + +inline bool isCompatibleVersion(uint32_t _version) +{ + return _version >= MIN_COMPATIBLE_VERSION; +} + +inline void write(::std::stringstream& _stream, const char* _value, size_t _size) +{ + _stream.write(_value, _size); +} + +template +inline void write(::std::stringstream& _stream, const T& _value) +{ + _stream.write((const char*)&_value, sizeof(T)); +} + +////////////////////////////////////////////////////////////////////////// + +namespace profiler { + + void SerializedData::set(char* _data, uint64_t _size) + { + delete [] m_data; + m_data = _data; + m_size = _size; + } + + void SerializedData::set(uint64_t _size) + { + if (_size != 0) + set(new char[_size], _size); + else + set(nullptr, 0); + } + + void SerializedData::extend(uint64_t _size) + { + auto olddata = m_data; + auto oldsize = m_size; + + m_size = oldsize + _size; + m_data = new char[m_size]; + + if (olddata != nullptr) { + memcpy(m_data, olddata, oldsize); + delete [] olddata; + } + } + + extern "C" PROFILER_API void release_stats(BlockStatistics*& _stats) + { + if (_stats == nullptr) + return; + + if (--_stats->calls_number == 0) + delete _stats; + + _stats = nullptr; + } + +} + +////////////////////////////////////////////////////////////////////////// + +#ifdef EASY_PROFILER_HASHED_CSTR_DEFINED + +using StatsMap = ::std::unordered_map<::profiler::block_id_t, ::profiler::BlockStatistics*, ::estd::hash<::profiler::block_id_t> >; + +/** \note It is absolutely safe to use hashed_cstr (which simply stores pointer) because std::unordered_map, +which uses it as a key, exists only inside fillTreesFromFile function. */ +using IdMap = ::std::unordered_map<::profiler::hashed_cstr, ::profiler::block_id_t>; + +using CsStatsMap = ::std::unordered_map<::profiler::hashed_cstr, ::profiler::BlockStatistics*>; + +#else + +// TODO: Create optimized version of profiler::hashed_cstr for Linux too. +using StatsMap = ::std::unordered_map<::profiler::block_id_t, ::profiler::BlockStatistics*, ::estd::hash<::profiler::block_id_t> >; +using IdMap = ::std::unordered_map<::profiler::hashed_stdstring, ::profiler::block_id_t>; +using CsStatsMap = ::std::unordered_map<::profiler::hashed_stdstring, ::profiler::BlockStatistics*>; + +#endif + +////////////////////////////////////////////////////////////////////////// + +/** \brief Updates statistics for a profiler block. + +\param _stats_map Storage of statistics for blocks. +\param _current Pointer to the current block. +\param _stats Reference to the variable where pointer to the block statistics must be written. + +\note All blocks with similar name have the same pointer to statistics information. + +\note As all profiler block keeps a pointer to it's statistics, all similar blocks +automatically receive statistics update. + +*/ +::profiler::BlockStatistics* update_statistics(StatsMap& _stats_map, const ::profiler::BlocksTree& _current, ::profiler::block_index_t _current_index, ::profiler::block_index_t _parent_index, const ::profiler::blocks_t& _blocks, bool _calculate_children = true) +{ + auto duration = _current.node->duration(); + //StatsMap::key_type key(_current.node->name()); + //auto it = _stats_map.find(key); + auto it = _stats_map.find(_current.node->id()); + if (it != _stats_map.end()) + { + // Update already existing statistics + + auto stats = it->second; // write pointer to statistics into output (this is BlocksTree:: per_thread_stats or per_parent_stats or per_frame_stats) + + ++stats->calls_number; // update calls number of this block + stats->total_duration += duration; // update summary duration of all block calls + + if (_calculate_children) + { + for (auto i : _current.children) + stats->total_children_duration += _blocks[i].node->duration(); + } + + if (duration > _blocks[stats->max_duration_block].node->duration()) + { + // update max duration + stats->max_duration_block = _current_index; + //stats->max_duration = duration; + } + + if (duration < _blocks[stats->min_duration_block].node->duration()) + { + // update min duraton + stats->min_duration_block = _current_index; + //stats->min_duration = duration; + } + + // average duration is calculated inside average_duration() method by dividing total_duration to the calls_number + + return stats; + } + + // This is first time the block appear in the file. + // Create new statistics. + auto stats = new ::profiler::BlockStatistics(duration, _current_index, _parent_index); + //_stats_map.emplace(key, stats); + _stats_map.emplace(_current.node->id(), stats); + + if (_calculate_children) + { + for (auto i : _current.children) + stats->total_children_duration += _blocks[i].node->duration(); + } + + return stats; +} + +::profiler::BlockStatistics* update_statistics(CsStatsMap& _stats_map, const ::profiler::BlocksTree& _current, ::profiler::block_index_t _current_index, ::profiler::block_index_t _parent_index, const ::profiler::blocks_t& _blocks, bool _calculate_children = true) +{ + auto duration = _current.node->duration(); + CsStatsMap::key_type key(_current.node->name()); + auto it = _stats_map.find(key); + if (it != _stats_map.end()) + { + // Update already existing statistics + + auto stats = it->second; // write pointer to statistics into output (this is BlocksTree:: per_thread_stats or per_parent_stats or per_frame_stats) + + ++stats->calls_number; // update calls number of this block + stats->total_duration += duration; // update summary duration of all block calls + + if (_calculate_children) + { + for (auto i : _current.children) + stats->total_children_duration += _blocks[i].node->duration(); + } + + if (duration > _blocks[stats->max_duration_block].node->duration()) + { + // update max duration + stats->max_duration_block = _current_index; + //stats->max_duration = duration; + } + + if (duration < _blocks[stats->min_duration_block].node->duration()) + { + // update min duraton + stats->min_duration_block = _current_index; + //stats->min_duration = duration; + } + + // average duration is calculated inside average_duration() method by dividing total_duration to the calls_number + + return stats; + } + + // This is first time the block appear in the file. + // Create new statistics. + auto stats = new ::profiler::BlockStatistics(duration, _current_index, _parent_index); + _stats_map.emplace(key, stats); + + if (_calculate_children) + { + for (auto i : _current.children) + stats->total_children_duration += _blocks[i].node->duration(); + } + + return stats; +} + +////////////////////////////////////////////////////////////////////////// + +void update_statistics_recursive(StatsMap& _stats_map, ::profiler::BlocksTree& _current, ::profiler::block_index_t _current_index, ::profiler::block_index_t _parent_index, ::profiler::blocks_t& _blocks) +{ + _current.per_frame_stats = update_statistics(_stats_map, _current, _current_index, _parent_index, _blocks, false); + for (auto i : _current.children) + { + _current.per_frame_stats->total_children_duration += _blocks[i].node->duration(); + update_statistics_recursive(_stats_map, _blocks[i], i, _parent_index, _blocks); + } +} + +////////////////////////////////////////////////////////////////////////// + +/*void validate_pointers(::std::atomic& _progress, const char* _oldbase, ::profiler::SerializedData& _serialized_blocks, ::profiler::blocks_t& _blocks, size_t _size) +{ + if (_oldbase == nullptr) + { + _progress.store(25, ::std::memory_order_release); + return; + } + + for (size_t i = 0; i < _size; ++i) + { + auto& tree = _blocks[i]; + auto dist = ::std::distance(_oldbase, reinterpret_cast(tree.node)); + tree.node = reinterpret_cast<::profiler::SerializedBlock*>(_serialized_blocks.data() + dist); + _progress.store(20 + static_cast(5 * i / _size), ::std::memory_order_release); + } +} + +void validate_pointers(::std::atomic& _progress, const char* _oldbase, ::profiler::SerializedData& _serialized_descriptors, ::profiler::descriptors_list_t& _descriptors, size_t _size) +{ + if (_oldbase == nullptr) + { + _progress.store(5, ::std::memory_order_release); + return; + } + + for (size_t i = 0; i < _size; ++i) + { + auto dist = ::std::distance(_oldbase, reinterpret_cast(_descriptors[i])); + _descriptors[i] = reinterpret_cast<::profiler::SerializedBlockDescriptor*>(_serialized_descriptors.data() + dist); + _progress.store(static_cast(5 * i / _size)); + } +}*/ + +////////////////////////////////////////////////////////////////////////// + +extern "C" { + + PROFILER_API ::profiler::block_index_t fillTreesFromFile(::std::atomic& progress, const char* filename, + ::profiler::SerializedData& serialized_blocks, + ::profiler::SerializedData& serialized_descriptors, + ::profiler::descriptors_list_t& descriptors, + ::profiler::blocks_t& blocks, + ::profiler::thread_blocks_tree_t& threaded_trees, + uint32_t& total_descriptors_number, + uint32_t& version, + bool gather_statistics, + ::std::stringstream& _log) + { + auto oldprogress = progress.exchange(0, ::std::memory_order_release); + if (oldprogress < 0) + { + _log << "Reading was interrupted"; + return 0; + } + + ::std::ifstream inFile(filename, ::std::fstream::binary); + if (!inFile.is_open()) + { + _log << "Can not open file " << filename; + return 0; + } + + ::std::stringstream str; + + // Replace str buffer to inFile buffer to avoid redundant copying + typedef ::std::basic_iostream<::std::stringstream::char_type, ::std::stringstream::traits_type> stringstream_parent; + stringstream_parent& s = str; + auto oldbuf = s.rdbuf(inFile.rdbuf()); + + // Read data from file + auto result = fillTreesFromStream(progress, str, serialized_blocks, serialized_descriptors, descriptors, blocks, + threaded_trees, total_descriptors_number, version, gather_statistics, _log); + + // Restore old str buffer to avoid possible second memory free on stringstream destructor + s.rdbuf(oldbuf); + + return result; + } + + ////////////////////////////////////////////////////////////////////////// + + PROFILER_API ::profiler::block_index_t fillTreesFromStream(::std::atomic& progress, ::std::stringstream& inFile, + ::profiler::SerializedData& serialized_blocks, + ::profiler::SerializedData& serialized_descriptors, + ::profiler::descriptors_list_t& descriptors, + ::profiler::blocks_t& blocks, + ::profiler::thread_blocks_tree_t& threaded_trees, + uint32_t& total_descriptors_number, + uint32_t& version, + bool gather_statistics, + ::std::stringstream& _log) + { + EASY_FUNCTION(::profiler::colors::Cyan); + + auto oldprogress = progress.exchange(0, ::std::memory_order_release); + if (oldprogress < 0) + { + _log << "Reading was interrupted"; + return 0; + } + + uint32_t signature = 0; + inFile.read((char*)&signature, sizeof(uint32_t)); + if (signature != PROFILER_SIGNATURE) + { + _log << "Wrong signature " << signature << "\nThis is not EasyProfiler file/stream."; + return 0; + } + + version = 0; + inFile.read((char*)&version, sizeof(uint32_t)); + if (!isCompatibleVersion(version)) + { + _log << "Incompatible version: v" << (version >> 24) << "." << ((version & 0x00ff0000) >> 16) << "." << (version & 0x0000ffff); + return 0; + } + + processid_t pid = 0; + if (version > EASY_V_100) + { + if (version < EASY_V_130) + { + uint32_t old_pid = 0; + inFile.read((char*)&old_pid, sizeof(uint32_t)); + pid = old_pid; + } + else + { + inFile.read((char*)&pid, sizeof(processid_t)); + } + } + + int64_t file_cpu_frequency = 0LL; + inFile.read((char*)&file_cpu_frequency, sizeof(int64_t)); + uint64_t cpu_frequency = file_cpu_frequency; + const double conversion_factor = static_cast(TIME_FACTOR) / static_cast(cpu_frequency); + + ::profiler::timestamp_t begin_time = 0ULL; + ::profiler::timestamp_t end_time = 0ULL; + inFile.read((char*)&begin_time, sizeof(::profiler::timestamp_t)); + inFile.read((char*)&end_time, sizeof(::profiler::timestamp_t)); + if (cpu_frequency != 0) + { + EASY_CONVERT_TO_NANO(begin_time, cpu_frequency, conversion_factor); + EASY_CONVERT_TO_NANO(end_time, cpu_frequency, conversion_factor); + } + + uint32_t total_blocks_number = 0; + inFile.read((char*)&total_blocks_number, sizeof(uint32_t)); + if (total_blocks_number == 0) + { + _log << "Profiled blocks number == 0"; + return 0; + } + + uint64_t memory_size = 0; + inFile.read((char*)&memory_size, sizeof(decltype(memory_size))); + if (memory_size == 0) + { + _log << "Wrong memory size == 0 for " << total_blocks_number << " blocks"; + return 0; + } + + total_descriptors_number = 0; + inFile.read((char*)&total_descriptors_number, sizeof(uint32_t)); + if (total_descriptors_number == 0) + { + _log << "Blocks description number == 0"; + return 0; + } + + uint64_t descriptors_memory_size = 0; + inFile.read((char*)&descriptors_memory_size, sizeof(decltype(descriptors_memory_size))); + if (descriptors_memory_size == 0) + { + _log << "Wrong memory size == 0 for " << total_descriptors_number << " blocks descriptions"; + return 0; + } + + descriptors.reserve(total_descriptors_number); + //const char* olddata = append_regime ? serialized_descriptors.data() : nullptr; + serialized_descriptors.set(descriptors_memory_size); + //validate_pointers(progress, olddata, serialized_descriptors, descriptors, descriptors.size()); + + uint64_t i = 0; + while (!inFile.eof() && descriptors.size() < total_descriptors_number) + { + uint16_t sz = 0; + inFile.read((char*)&sz, sizeof(sz)); + if (sz == 0) + { + descriptors.push_back(nullptr); + continue; + } + + //if (i + sz > descriptors_memory_size) { + // printf("FILE CORRUPTED\n"); + // return 0; + //} + + char* data = serialized_descriptors[i]; + inFile.read(data, sz); + auto descriptor = reinterpret_cast<::profiler::SerializedBlockDescriptor*>(data); + descriptors.push_back(descriptor); + + i += sz; + oldprogress = progress.exchange(static_cast(15 * i / descriptors_memory_size), ::std::memory_order_release); + if (oldprogress < 0) + { + _log << "Reading was interrupted"; + return 0; // Loading interrupted + } + } + + using PerThreadStats = ::std::unordered_map<::profiler::thread_id_t, StatsMap, ::estd::hash<::profiler::thread_id_t> >; + PerThreadStats parent_statistics, frame_statistics; + IdMap identification_table; + + blocks.reserve(total_blocks_number); + //olddata = append_regime ? serialized_blocks.data() : nullptr; + serialized_blocks.set(memory_size); + //validate_pointers(progress, olddata, serialized_blocks, blocks, blocks.size()); + + i = 0; + uint32_t read_number = 0; + ::profiler::block_index_t blocks_counter = 0; + ::std::vector name; + + const size_t thread_id_t_size = version < EASY_V_130 ? sizeof(uint32_t) : sizeof(::profiler::thread_id_t); + + while (!inFile.eof()) + { + EASY_BLOCK("Read thread data", ::profiler::colors::DarkGreen); + + ::profiler::thread_id_t thread_id = 0; + inFile.read((char*)&thread_id, thread_id_t_size); + if (inFile.eof()) + break; + + auto& root = threaded_trees[thread_id]; + + uint16_t name_size = 0; + inFile.read((char*)&name_size, sizeof(uint16_t)); + if (name_size != 0) + { + name.resize(name_size); + inFile.read(name.data(), name_size); + root.thread_name = name.data(); + } + + CsStatsMap per_thread_statistics_cs; + + uint32_t blocks_number_in_thread = 0; + inFile.read((char*)&blocks_number_in_thread, sizeof(decltype(blocks_number_in_thread))); + auto threshold = read_number + blocks_number_in_thread; + while (!inFile.eof() && read_number < threshold) + { + EASY_BLOCK("Read context switch", ::profiler::colors::Green); + + ++read_number; + + uint16_t sz = 0; + inFile.read((char*)&sz, sizeof(sz)); + if (sz == 0) + { + _log << "Bad CSwitch block size == 0"; + return 0; + } + + char* data = serialized_blocks[i]; + inFile.read(data, sz); + i += sz; + auto baseData = reinterpret_cast<::profiler::SerializedCSwitch*>(data); + auto t_begin = reinterpret_cast<::profiler::timestamp_t*>(data); + auto t_end = t_begin + 1; + + if (cpu_frequency != 0) + { + EASY_CONVERT_TO_NANO(*t_begin, cpu_frequency, conversion_factor); + EASY_CONVERT_TO_NANO(*t_end, cpu_frequency, conversion_factor); + } + + if (*t_end > begin_time) + { + if (*t_begin < begin_time) + *t_begin = begin_time; + + blocks.emplace_back(); + ::profiler::BlocksTree& tree = blocks.back(); + tree.cs = baseData; + const auto block_index = blocks_counter++; + + root.wait_time += baseData->duration(); + root.sync.emplace_back(block_index); + + if (gather_statistics) + { + EASY_BLOCK("Gather per thread statistics", ::profiler::colors::Coral); + tree.per_thread_stats = update_statistics(per_thread_statistics_cs, tree, block_index, ~0U, blocks);//, thread_id, blocks); + } + } + + oldprogress = progress.exchange(20 + static_cast(70 * i / memory_size), ::std::memory_order_release); + if (oldprogress < 0) + { + _log << "Reading was interrupted"; + return 0; // Loading interrupted + } + } + + if (inFile.eof()) + break; + + StatsMap per_thread_statistics; + + blocks_number_in_thread = 0; + inFile.read((char*)&blocks_number_in_thread, sizeof(decltype(blocks_number_in_thread))); + threshold = read_number + blocks_number_in_thread; + while (!inFile.eof() && read_number < threshold) + { + EASY_BLOCK("Read block", ::profiler::colors::Green); + + ++read_number; + + uint16_t sz = 0; + inFile.read((char*)&sz, sizeof(sz)); + if (sz == 0) + { + _log << "Bad block size == 0"; + return 0; + } + + char* data = serialized_blocks[i]; + inFile.read(data, sz); + i += sz; + auto baseData = reinterpret_cast<::profiler::SerializedBlock*>(data); + if (baseData->id() >= total_descriptors_number) + { + _log << "Bad block id == " << baseData->id(); + return 0; + } + + auto desc = descriptors[baseData->id()]; + if (desc == nullptr) + { + _log << "Bad block id == " << baseData->id() << ". Description is null."; + return 0; + } + + auto t_begin = reinterpret_cast<::profiler::timestamp_t*>(data); + auto t_end = t_begin + 1; + + if (cpu_frequency != 0) + { + EASY_CONVERT_TO_NANO(*t_begin, cpu_frequency, conversion_factor); + EASY_CONVERT_TO_NANO(*t_end, cpu_frequency, conversion_factor); + } + + if (*t_end >= begin_time) + { + if (*t_begin < begin_time) + *t_begin = begin_time; + + blocks.emplace_back(); + ::profiler::BlocksTree& tree = blocks.back(); + tree.node = baseData; + const auto block_index = blocks_counter++; + + if (*tree.node->name() != 0) + { + // If block has runtime name then generate new id for such block. + // Blocks with the same name will have same id. + + IdMap::key_type key(tree.node->name()); + auto it = identification_table.find(key); + if (it != identification_table.end()) + { + // There is already block with such name, use it's id + baseData->setId(it->second); + } + else + { + // There were no blocks with such name, generate new id and save it in the table for further usage. + auto id = static_cast<::profiler::block_id_t>(descriptors.size()); + identification_table.emplace(key, id); + if (descriptors.capacity() == descriptors.size()) + descriptors.reserve((descriptors.size() * 3) >> 1); + descriptors.push_back(descriptors[baseData->id()]); + baseData->setId(id); + } + } + + if (!root.children.empty()) + { + auto& back = blocks[root.children.back()]; + auto t1 = back.node->end(); + auto mt0 = tree.node->begin(); + if (mt0 < t1)//parent - starts earlier than last ends + { + //auto lower = ::std::lower_bound(root.children.begin(), root.children.end(), tree); + /**/ + EASY_BLOCK("Find children", ::profiler::colors::Blue); + auto rlower1 = ++root.children.rbegin(); + for (; rlower1 != root.children.rend() && !(mt0 > blocks[*rlower1].node->begin()); ++rlower1); + auto lower = rlower1.base(); + ::std::move(lower, root.children.end(), ::std::back_inserter(tree.children)); + + root.children.erase(lower, root.children.end()); + EASY_END_BLOCK; + + if (gather_statistics) + { + EASY_BLOCK("Gather statistic within parent", ::profiler::colors::Magenta); + auto& per_parent_statistics = parent_statistics[thread_id]; + per_parent_statistics.clear(); + + //per_parent_statistics.reserve(tree.children.size()); // this gives slow-down on Windows + //per_parent_statistics.reserve(tree.children.size() * 2); // this gives no speed-up on Windows + // TODO: check this behavior on Linux + + for (auto i : tree.children) + { + auto& child = blocks[i]; + child.per_parent_stats = update_statistics(per_parent_statistics, child, i, block_index, blocks); + if (tree.depth < child.depth) + tree.depth = child.depth; + } + } + else + { + for (auto i : tree.children) + { + const auto& child = blocks[i]; + if (tree.depth < child.depth) + tree.depth = child.depth; + } + } + + if (tree.depth == 254) + { + // 254 because we need 1 additional level for root (thread). + // In other words: real stack depth = 1 root block + 254 children + + if (*tree.node->name() != 0) + _log << "Stack depth exceeded value of 254\nfor block \"" << desc->name() << "\""; + else + _log << "Stack depth exceeded value of 254\nfor block \"" << desc->name() << "\"\nfrom file \"" << desc->file() << "\":" << desc->line(); + + return 0; + } + + ++tree.depth; + } + } + + ++root.blocks_number; + root.children.emplace_back(block_index);// ::std::move(tree)); + if (desc->type() != ::profiler::BlockType::Block) + root.events.emplace_back(block_index); + + + if (gather_statistics) + { + EASY_BLOCK("Gather per thread statistics", ::profiler::colors::Coral); + tree.per_thread_stats = update_statistics(per_thread_statistics, tree, block_index, ~0U, blocks);//, thread_id, blocks); + } + } + + oldprogress = progress.exchange(20 + static_cast(70 * i / memory_size), ::std::memory_order_release); + if (oldprogress < 0) + { + _log << "Reading was interrupted"; + return 0; // Loading interrupted + } + } + } + + oldprogress = progress.exchange(90, ::std::memory_order_release); + if (oldprogress < 0) + { + _log << "Reading was interrupted"; + return 0; // Loading interrupted + } + + EASY_BLOCK("Gather statistics for roots", ::profiler::colors::Purple); + if (gather_statistics) + { + ::std::vector<::std::thread> statistics_threads; + statistics_threads.reserve(threaded_trees.size()); + + for (auto& it : threaded_trees) + { + auto& root = it.second; + root.thread_id = it.first; + //root.tree.shrink_to_fit(); + + auto& per_frame_statistics = frame_statistics[root.thread_id]; + auto& per_parent_statistics = parent_statistics[it.first]; + per_parent_statistics.clear(); + + statistics_threads.emplace_back(::std::thread([&per_parent_statistics, &per_frame_statistics, &blocks, &descriptors](::profiler::BlocksTreeRoot& root) + { + //::std::sort(root.sync.begin(), root.sync.end(), [&blocks](::profiler::block_index_t left, ::profiler::block_index_t right) + //{ + // return blocks[left].node->begin() < blocks[right].node->begin(); + //}); + + ::profiler::block_index_t cs_index = 0; + for (auto i : root.children) + { + auto& frame = blocks[i]; + + if (descriptors[frame.node->id()]->type() == ::profiler::BlockType::Block) + ++root.frames_number; + + frame.per_parent_stats = update_statistics(per_parent_statistics, frame, i, ~0U, blocks);//, root.thread_id, blocks); + + per_frame_statistics.clear(); + update_statistics_recursive(per_frame_statistics, frame, i, i, blocks); + + if (cs_index < root.sync.size()) + { + CsStatsMap frame_stats_cs; + do { + + auto j = root.sync[cs_index]; + auto& cs = blocks[j]; + if (cs.node->end() < frame.node->begin()) + continue; + if (cs.node->begin() > frame.node->end()) + break; + cs.per_frame_stats = update_statistics(frame_stats_cs, cs, cs_index, i, blocks); + + } while (++cs_index < root.sync.size()); + } + + if (root.depth < frame.depth) + root.depth = frame.depth; + + root.profiled_time += frame.node->duration(); + } + + ++root.depth; + }, ::std::ref(root))); + } + + int j = 0, n = static_cast(statistics_threads.size()); + for (auto& t : statistics_threads) + { + t.join(); + progress.store(90 + (10 * ++j) / n, ::std::memory_order_release); + } + } + else + { + int j = 0, n = static_cast(threaded_trees.size()); + for (auto& it : threaded_trees) + { + auto& root = it.second; + root.thread_id = it.first; + + //::std::sort(root.sync.begin(), root.sync.end(), [&blocks](::profiler::block_index_t left, ::profiler::block_index_t right) + //{ + // return blocks[left].node->begin() < blocks[right].node->begin(); + //}); + + //root.tree.shrink_to_fit(); + for (auto i : root.children) + { + auto& frame = blocks[i]; + + if (descriptors[frame.node->id()]->type() == ::profiler::BlockType::Block) + ++root.frames_number; + + if (root.depth < frame.depth) + root.depth = frame.depth; + + root.profiled_time += frame.node->duration(); + } + + ++root.depth; + + progress.store(90 + (10 * ++j) / n, ::std::memory_order_release); + } + } + // No need to delete BlockStatistics instances - they will be deleted inside BlocksTree destructors + + progress.store(100, ::std::memory_order_release); + return blocks_counter; + } + + ////////////////////////////////////////////////////////////////////////// + + PROFILER_API bool readDescriptionsFromStream(::std::atomic& progress, ::std::stringstream& inFile, + ::profiler::SerializedData& serialized_descriptors, + ::profiler::descriptors_list_t& descriptors, + ::std::stringstream& _log) + { + EASY_FUNCTION(::profiler::colors::Cyan); + + progress.store(0); + + uint32_t signature = 0; + inFile.read((char*)&signature, sizeof(uint32_t)); + if (signature != PROFILER_SIGNATURE) + { + _log << "Wrong file signature.\nThis is not EasyProfiler file/stream."; + return false; + } + + uint32_t version = 0; + inFile.read((char*)&version, sizeof(uint32_t)); + if (!isCompatibleVersion(version)) + { + _log << "Incompatible version: v" << (version >> 24) << "." << ((version & 0x00ff0000) >> 16) << "." << (version & 0x0000ffff); + return false; + } + + uint32_t total_descriptors_number = 0; + inFile.read((char*)&total_descriptors_number, sizeof(decltype(total_descriptors_number))); + if (total_descriptors_number == 0) + { + _log << "Blocks description number == 0"; + return false; + } + + uint64_t descriptors_memory_size = 0; + inFile.read((char*)&descriptors_memory_size, sizeof(decltype(descriptors_memory_size))); + if (descriptors_memory_size == 0) + { + _log << "Wrong memory size == 0 for " << total_descriptors_number << " blocks descriptions"; + return false; + } + + descriptors.reserve(total_descriptors_number); + //const char* olddata = append_regime ? serialized_descriptors.data() : nullptr; + serialized_descriptors.set(descriptors_memory_size); + //validate_pointers(progress, olddata, serialized_descriptors, descriptors, descriptors.size()); + + uint64_t i = 0; + while (!inFile.eof() && descriptors.size() < total_descriptors_number) + { + uint16_t sz = 0; + inFile.read((char*)&sz, sizeof(sz)); + if (sz == 0) + { + descriptors.push_back(nullptr); + continue; + } + + //if (i + sz > descriptors_memory_size) { + // printf("FILE CORRUPTED\n"); + // return 0; + //} + + char* data = serialized_descriptors[i]; + inFile.read(data, sz); + auto descriptor = reinterpret_cast<::profiler::SerializedBlockDescriptor*>(data); + descriptors.push_back(descriptor); + + i += sz; + auto oldprogress = progress.exchange(static_cast(100 * i / descriptors_memory_size), ::std::memory_order_release); + if (oldprogress < 0) + { + _log << "Reading was interrupted"; + return false; // Loading interrupted + } + } + + return !descriptors.empty(); + } + + ////////////////////////////////////////////////////////////////////////// + +} + +#undef EASY_CONVERT_TO_NANO + +#ifdef EASY_USE_FLOATING_POINT_CONVERSION +# ifdef _MSC_VER +# pragma warning(default:4244) +# elif defined(__GNUC__) +# pragma GCC diagnostic pop +# elif defined(__clang__) +# pragma clang diagnostic pop +# endif +# undef EASY_USE_FLOATING_POINT_CONVERSION +#endif diff --git a/3rdparty/easyprofiler/easy_profiler_core/resources.rc b/3rdparty/easyprofiler/easy_profiler_core/resources.rc new file mode 100644 index 0000000..e68eb4d --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/resources.rc @@ -0,0 +1,30 @@ +1 VERSIONINFO + +# define EASY_STRINGIFY(a) #a +# define EASY_STRINGIFICATION(a) EASY_STRINGIFY(a) + +#define EASY_PROFILER_PRODUCT_VERSION "v" EASY_STRINGIFICATION(EASY_PROFILER_VERSION_MAJOR) "." \ + EASY_STRINGIFICATION(EASY_PROFILER_VERSION_MINOR) "." \ + EASY_STRINGIFICATION(EASY_PROFILER_VERSION_PATCH) + +FILEVERSION EASY_PROFILER_VERSION_MAJOR, EASY_PROFILER_VERSION_MINOR, EASY_PROFILER_VERSION_PATCH +PRODUCTVERSION EASY_PROFILER_VERSION_MAJOR, EASY_PROFILER_VERSION_MINOR, EASY_PROFILER_VERSION_PATCH +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "080904b0" + BEGIN + VALUE "CompanyName", "EasySolutions" + VALUE "FileDescription", "Lightweight profiler library for c++" + VALUE "LegalCopyright", "Copyright (C) 2016-2017 Victor Zarubkin, Sergey Yagovtsev" + VALUE "LegalTrademarks1", "All Rights Reserved" + VALUE "LegalTrademarks2", "All Rights Reserved" + VALUE "ProductName", "easy_profiler lib" + VALUE "ProductVersion", EASY_PROFILER_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x809, 1200 + END +END diff --git a/3rdparty/easyprofiler/easy_profiler_core/spin_lock.h b/3rdparty/easyprofiler/easy_profiler_core/spin_lock.h new file mode 100644 index 0000000..705540d --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/spin_lock.h @@ -0,0 +1,126 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_SPIN_LOCK_H +#define EASY_PROFILER_SPIN_LOCK_H + +#define EASY_USE_CRITICAL_SECTION // Use CRITICAL_SECTION instead of std::atomic_flag + +#if defined(_WIN32) && defined(EASY_USE_CRITICAL_SECTION) +#include +#else +#include +#endif + +namespace profiler { + +#if defined(_WIN32) && defined(EASY_USE_CRITICAL_SECTION) + // std::atomic_flag on Windows works slower than critical section, so we will use it instead of std::atomic_flag... + // By the way, Windows critical sections are slower than std::atomic_flag on Unix. + class spin_lock { CRITICAL_SECTION m_lock; public: + + void lock() { + EnterCriticalSection(&m_lock); + } + + void unlock() { + LeaveCriticalSection(&m_lock); + } + + spin_lock() { + InitializeCriticalSection(&m_lock); + } + + ~spin_lock() { + DeleteCriticalSection(&m_lock); + } + }; +#else + // std::atomic_flag on Unix works fine and very fast (almost instant!) + class spin_lock { ::std::atomic_flag m_lock; public: + + void lock() { + while (m_lock.test_and_set(::std::memory_order_acquire)); + } + + void unlock() { + m_lock.clear(::std::memory_order_release); + } + + spin_lock() { + m_lock.clear(); + } + }; +#endif + + template + class guard_lock + { + T& m_lock; + bool m_isLocked = false; + + public: + + explicit guard_lock(T& m) : m_lock(m) { + m_lock.lock(); + m_isLocked = true; + } + + ~guard_lock() { + unlock(); + } + + inline void unlock() { + if (m_isLocked) { + m_lock.unlock(); + m_isLocked = false; + } + } + }; + +} // END of namespace profiler. + +#ifdef EASY_USE_CRITICAL_SECTION +# undef EASY_USE_CRITICAL_SECTION +#endif + +#endif // EASY_PROFILER_SPIN_LOCK_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/stack_buffer.h b/3rdparty/easyprofiler/easy_profiler_core/stack_buffer.h new file mode 100644 index 0000000..a59ad06 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/stack_buffer.h @@ -0,0 +1,140 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_STACK_BUFFER_H +#define EASY_PROFILER_STACK_BUFFER_H + +#include "nonscoped_block.h" +#include +#include +#include + +#ifdef max +#undef max +#endif + +template +inline void destroy_elem(T*) +{ + +} + +inline void destroy_elem(NonscopedBlock* _elem) +{ + _elem->destroy(); +} + +template +class StackBuffer +{ + struct chunk { int8_t data[sizeof(T)]; }; + + std::list m_overflow; ///< List of additional stack elements if current capacity of buffer is not enough + T* m_buffer; ///< Contiguous buffer used for stack + uint32_t m_size; ///< Current size of stack + uint32_t m_capacity; ///< Current capacity of m_buffer + uint32_t m_maxcapacity; ///< Maximum used capacity including m_buffer and m_overflow + +public: + + StackBuffer() = delete; + StackBuffer(const StackBuffer&) = delete; + StackBuffer(StackBuffer&&) = delete; + + explicit StackBuffer(uint32_t N) + : m_buffer(static_cast(malloc(N * sizeof(T)))) + , m_size(0) + , m_capacity(N) + , m_maxcapacity(N) + { + } + + ~StackBuffer() + { + for (uint32_t i = 0; i < m_size; ++i) + destroy_elem(m_buffer + i); + + free(m_buffer); + + for (auto& elem : m_overflow) + destroy_elem(reinterpret_cast(elem.data + 0)); + } + + template + T& push(TArgs ... _args) + { + if (m_size < m_capacity) + return *(::new (m_buffer + m_size++) T(_args...)); + + m_overflow.emplace_back(); + const uint32_t cap = m_capacity + static_cast(m_overflow.size()); + if (m_maxcapacity < cap) + m_maxcapacity = cap; + + return *(::new (m_overflow.back().data + 0) T(_args...)); + } + + void pop() + { + if (m_overflow.empty()) + { + // m_size should not be equal to 0 here because ProfileManager behavior does not allow such situation + destroy_elem(m_buffer + --m_size); + + if (m_size == 0 && m_maxcapacity > m_capacity) + { + // When stack gone empty we can resize buffer to use enough space in the future + free(m_buffer); + m_maxcapacity = m_capacity = std::max(m_maxcapacity, m_capacity << 1); + m_buffer = static_cast(malloc(m_capacity * sizeof(T))); + } + + return; + } + + destroy_elem(reinterpret_cast(m_overflow.back().data + 0)); + m_overflow.pop_back(); + } + +}; // END of class StackBuffer. + +#endif // EASY_PROFILER_STACK_BUFFER_H diff --git a/3rdparty/easyprofiler/easy_profiler_core/thread_storage.cpp b/3rdparty/easyprofiler/easy_profiler_core/thread_storage.cpp new file mode 100644 index 0000000..beb6839 --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/thread_storage.cpp @@ -0,0 +1,157 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#include "thread_storage.h" +#include "current_thread.h" +#include "current_time.h" + +ThreadStorage::ThreadStorage() + : nonscopedBlocks(16) + , frameStartTime(0) + , id(getCurrentThreadId()) + , stackSize(0) + , allowChildren(true) + , named(false) + , guarded(false) + , frameOpened(false) + , halt(false) +{ + expired = ATOMIC_VAR_INIT(0); + profiledFrameOpened = ATOMIC_VAR_INIT(false); +} + +void ThreadStorage::storeValue(profiler::timestamp_t _timestamp, profiler::block_id_t _id, profiler::DataType _type, const void* _data, size_t _size, bool _isArray, profiler::ValueId _vin) +{ + const uint16_t serializedDataSize = static_cast(sizeof(profiler::ArbitraryValue) + _size); + void* data = blocks.closedList.allocate(serializedDataSize); + + ::new (data) profiler::ArbitraryValue(_timestamp, _vin.m_id, _id, static_cast(_size), _type, _isArray); + + char* cdata = reinterpret_cast(data); + memcpy(cdata + sizeof(profiler::ArbitraryValue), _data, _size); + + blocks.usedMemorySize += serializedDataSize; +} + +void ThreadStorage::storeBlock(const profiler::Block& block) +{ +#if EASY_OPTION_MEASURE_STORAGE_EXPAND != 0 + EASY_LOCAL_STATIC_PTR(const BaseBlockDescriptor*, desc, \ + MANAGER.addBlockDescriptor(EASY_OPTION_STORAGE_EXPAND_BLOCKS_ON ? profiler::ON : profiler::OFF, EASY_UNIQUE_LINE_ID, "EasyProfiler.ExpandStorage", \ + __FILE__, __LINE__, profiler::BlockType::Block, EASY_COLOR_INTERNAL_EVENT)); + + EASY_THREAD_LOCAL static profiler::timestamp_t beginTime = 0ULL; + EASY_THREAD_LOCAL static profiler::timestamp_t endTime = 0ULL; +#endif + + uint16_t nameLength = static_cast(strlen(block.name())); + uint16_t serializedDataSize = static_cast(sizeof(profiler::BaseBlockData) + nameLength + 1); + +#if EASY_OPTION_MEASURE_STORAGE_EXPAND != 0 + const bool expanded = (desc->m_status & profiler::ON) && blocks.closedList.need_expand(serializedDataSize); + if (expanded) beginTime = getCurrentTime(); +#endif + + void* data = blocks.closedList.allocate(serializedDataSize); + +#if EASY_OPTION_MEASURE_STORAGE_EXPAND != 0 + if (expanded) endTime = getCurrentTime(); +#endif + + ::new (data) profiler::SerializedBlock(block, nameLength); + blocks.usedMemorySize += serializedDataSize; + +#if EASY_OPTION_MEASURE_STORAGE_EXPAND != 0 + if (expanded) + { + profiler::Block b(beginTime, desc->id(), ""); + b.finish(endTime); + + serializedDataSize = static_cast(sizeof(profiler::BaseBlockData) + 1); + data = blocks.closedList.allocate(serializedDataSize); + ::new (data) profiler::SerializedBlock(b, 0); + blocks.usedMemorySize += serializedDataSize; + } +#endif +} + +void ThreadStorage::storeCSwitch(const CSwitchBlock& block) +{ + uint16_t nameLength = static_cast(strlen(block.name())); + uint16_t serializedDataSize = static_cast(sizeof(profiler::CSwitchEvent) + nameLength + 1); + void* data = sync.closedList.allocate(serializedDataSize); + ::new (data) profiler::SerializedCSwitch(block, nameLength); + sync.usedMemorySize += serializedDataSize; +} + +void ThreadStorage::clearClosed() +{ + blocks.clearClosed(); + sync.clearClosed(); +} + +void ThreadStorage::popSilent() +{ + if (!blocks.openedList.empty()) + { + profiler::Block& top = blocks.openedList.back(); + top.m_end = top.m_begin; + if (!top.m_isScoped) + nonscopedBlocks.pop(); + blocks.openedList.pop_back(); + } +} + +void ThreadStorage::beginFrame() +{ + if (!frameOpened) + { + frameStartTime = getCurrentTime(); + frameOpened = true; + } +} + +profiler::timestamp_t ThreadStorage::endFrame() +{ + frameOpened = false; + return getCurrentTime() - frameStartTime; +} diff --git a/3rdparty/easyprofiler/easy_profiler_core/thread_storage.h b/3rdparty/easyprofiler/easy_profiler_core/thread_storage.h new file mode 100644 index 0000000..bdfc08f --- /dev/null +++ b/3rdparty/easyprofiler/easy_profiler_core/thread_storage.h @@ -0,0 +1,134 @@ +/** +Lightweight profiler library for c++ +Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin + +Licensed under either of + * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) + * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +at your option. + +The MIT License + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is furnished + to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + USE OR OTHER DEALINGS IN THE SOFTWARE. + + +The Apache License, Version 2.0 (the "License"); + You may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +**/ + +#ifndef EASY_PROFILER_THREAD_STORAGE_H +#define EASY_PROFILER_THREAD_STORAGE_H + +#include +#include +#include +#include +#include +#include +#include +#include "stack_buffer.h" +#include "chunk_allocator.h" + +////////////////////////////////////////////////////////////////////////// + +template +struct BlocksList +{ + BlocksList() = default; + + std::vector openedList; + chunk_allocator closedList; + uint64_t usedMemorySize = 0; + + void clearClosed() { + //closedList.clear(); + usedMemorySize = 0; + } + +private: + + BlocksList(const BlocksList&) = delete; + BlocksList(BlocksList&&) = delete; + +}; // END of struct BlocksList. + +////////////////////////////////////////////////////////////////////////// + +class CSwitchBlock : public profiler::CSwitchEvent +{ + const char* m_name; + +public: + + CSwitchBlock(profiler::timestamp_t _begin_time, profiler::thread_id_t _tid, const char* _runtimeName) EASY_NOEXCEPT; + inline const char* name() const EASY_NOEXCEPT { return m_name; } +}; + +////////////////////////////////////////////////////////////////////////// + +const uint16_t SIZEOF_BLOCK = sizeof(profiler::BaseBlockData) + 1 + sizeof(uint16_t); // SerializedBlock stores BaseBlockData + at least 1 character for name ('\0') + 2 bytes for size of serialized data +const uint16_t SIZEOF_CSWITCH = sizeof(profiler::CSwitchEvent) + 1 + sizeof(uint16_t); // SerializedCSwitch also stores additional 4 bytes to be able to save 64-bit thread_id + +struct ThreadStorage EASY_FINAL +{ + StackBuffer nonscopedBlocks; + BlocksList, SIZEOF_BLOCK * (uint16_t)128U> blocks; + BlocksList sync; + + std::string name; ///< Thread name + profiler::timestamp_t frameStartTime; ///< Current frame start time. Used to calculate FPS. + const profiler::thread_id_t id; ///< Thread ID + std::atomic expired; ///< Is thread expired + std::atomic_bool profiledFrameOpened; ///< Is new profiled frame opened (this is true when profiling is enabled and there is an opened frame) \sa frameOpened + int32_t stackSize; ///< Current thread stack depth. Used when switching profiler state to begin collecting blocks only when new frame would be opened. + bool allowChildren; ///< False if one of previously opened blocks has OFF_RECURSIVE or ON_WITHOUT_CHILDREN status + bool named; ///< True if thread name was set + bool guarded; ///< True if thread has been registered using ThreadGuard + bool frameOpened; ///< Is new frame opened (this does not depend on profiling status) \sa profiledFrameOpened + bool halt; ///< This is set to true when new frame started while dumping blocks. Used to restrict collecting blocks during dumping process. + + void storeValue(profiler::timestamp_t _timestamp, profiler::block_id_t _id, profiler::DataType _type, const void* _data, size_t _size, bool _isArray, profiler::ValueId _vin); + void storeBlock(const profiler::Block& _block); + void storeCSwitch(const CSwitchBlock& _block); + void clearClosed(); + void popSilent(); + + void beginFrame(); + profiler::timestamp_t endFrame(); + + ThreadStorage(); + +private: + + ThreadStorage(const ThreadStorage&) = delete; + ThreadStorage(ThreadStorage&&) = delete; + +}; // END of struct ThreadStorage. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER_THREAD_STORAGE_H diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..9ecfcf5 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/alex/Work/C++Projects/easyprofiler") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/alex/Work/C++Projects/easyprofiler") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/DependInfo.cmake b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/DependInfo.cmake new file mode 100644 index 0000000..6d9b6e3 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/DependInfo.cmake @@ -0,0 +1,59 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/qrc_resources.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/arbitrary_value_inspector.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_graphics_view.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_tree_widget.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/common_functions.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/descriptors_tree_widget.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_chronometer_item.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_frame_rate_viewer.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_item.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_scrollbar.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_qtimer.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals_qobjects.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/main.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/main_window.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/profiler_gui_automoc.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_item.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_loader.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o" + "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/treeview_first_column_delegate.cpp" "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "BUILD_WITH_EASY_PROFILER=1" + "EASY_DEFAULT_PORT=28077" + "EASY_PROFILER_VERSION_MAJOR=1" + "EASY_PROFILER_VERSION_MINOR=3" + "EASY_PROFILER_VERSION_PATCH=0" + "QT_CORE_LIB" + "QT_GUI_LIB" + "QT_NO_DEBUG" + "QT_WIDGETS_LIB" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "profiler_gui" + "/home/alex/Work/Qt/5.8/gcc_64/include" + "/home/alex/Work/Qt/5.8/gcc_64/include/QtWidgets" + "/home/alex/Work/Qt/5.8/gcc_64/include/QtGui" + "/home/alex/Work/Qt/5.8/gcc_64/include/QtCore" + "/home/alex/Work/Qt/5.8/gcc_64/./mkspecs/linux-g++" + "easy_profiler_core/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/build.make b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/build.make new file mode 100644 index 0000000..8554a13 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/build.make @@ -0,0 +1,603 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/alex/Work/C++Projects/easyprofiler + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/alex/Work/C++Projects/easyprofiler + +# Include any dependencies generated for this target. +include profiler_gui/CMakeFiles/profiler_gui.dir/depend.make + +# Include the progress variables for this target. +include profiler_gui/CMakeFiles/profiler_gui.dir/progress.make + +# Include the compile flags for this target's objects. +include profiler_gui/CMakeFiles/profiler_gui.dir/flags.make + +profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o: profiler_gui/main.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/main.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/main.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/main.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/main.cpp > CMakeFiles/profiler_gui.dir/main.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/main.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/main.cpp -o CMakeFiles/profiler_gui.dir/main.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o: profiler_gui/arbitrary_value_inspector.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/arbitrary_value_inspector.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/arbitrary_value_inspector.cpp > CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/arbitrary_value_inspector.cpp -o CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o: profiler_gui/blocks_graphics_view.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_3) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_graphics_view.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_graphics_view.cpp > CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_graphics_view.cpp -o CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o: profiler_gui/blocks_tree_widget.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_4) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_tree_widget.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_tree_widget.cpp > CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_tree_widget.cpp -o CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o: profiler_gui/common_functions.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_5) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/common_functions.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/common_functions.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/common_functions.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/common_functions.cpp > CMakeFiles/profiler_gui.dir/common_functions.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/common_functions.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/common_functions.cpp -o CMakeFiles/profiler_gui.dir/common_functions.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o: profiler_gui/descriptors_tree_widget.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_6) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/descriptors_tree_widget.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/descriptors_tree_widget.cpp > CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/descriptors_tree_widget.cpp -o CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o: profiler_gui/easy_chronometer_item.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_7) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_chronometer_item.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_chronometer_item.cpp > CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_chronometer_item.cpp -o CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o: profiler_gui/easy_frame_rate_viewer.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_8) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_frame_rate_viewer.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_frame_rate_viewer.cpp > CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_frame_rate_viewer.cpp -o CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o: profiler_gui/easy_graphics_item.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_9) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_item.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_item.cpp > CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_item.cpp -o CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o: profiler_gui/easy_graphics_scrollbar.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_10) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_scrollbar.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_scrollbar.cpp > CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_scrollbar.cpp -o CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o: profiler_gui/easy_qtimer.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_11) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_qtimer.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_qtimer.cpp > CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_qtimer.cpp -o CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o: profiler_gui/globals.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_12) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/globals.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/globals.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals.cpp > CMakeFiles/profiler_gui.dir/globals.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/globals.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals.cpp -o CMakeFiles/profiler_gui.dir/globals.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o: profiler_gui/globals_qobjects.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_13) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals_qobjects.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals_qobjects.cpp > CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals_qobjects.cpp -o CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o: profiler_gui/main_window.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_14) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/main_window.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/main_window.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/main_window.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/main_window.cpp > CMakeFiles/profiler_gui.dir/main_window.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/main_window.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/main_window.cpp -o CMakeFiles/profiler_gui.dir/main_window.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o: profiler_gui/tree_widget_item.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_15) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_item.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_item.cpp > CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_item.cpp -o CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o: profiler_gui/tree_widget_loader.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_16) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_loader.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_loader.cpp > CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_loader.cpp -o CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o: profiler_gui/treeview_first_column_delegate.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_17) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/treeview_first_column_delegate.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/treeview_first_column_delegate.cpp > CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/treeview_first_column_delegate.cpp -o CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o: profiler_gui/profiler_gui_automoc.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_18) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/profiler_gui_automoc.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/profiler_gui_automoc.cpp > CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/profiler_gui_automoc.cpp -o CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o + + +profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/flags.make +profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o: profiler_gui/CMakeFiles/profiler_gui.dir/qrc_resources.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_19) "Building CXX object profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/qrc_resources.cpp + +profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/qrc_resources.cpp > CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.i + +profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/qrc_resources.cpp -o CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.s + +profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o.requires: + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o.requires + +profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o.provides: profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o.requires + $(MAKE) -f profiler_gui/CMakeFiles/profiler_gui.dir/build.make profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o.provides.build +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o.provides + +profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o.provides.build: profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o + + +# Object files for target profiler_gui +profiler_gui_OBJECTS = \ +"CMakeFiles/profiler_gui.dir/main.cpp.o" \ +"CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o" \ +"CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o" \ +"CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o" \ +"CMakeFiles/profiler_gui.dir/common_functions.cpp.o" \ +"CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o" \ +"CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o" \ +"CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o" \ +"CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o" \ +"CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o" \ +"CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o" \ +"CMakeFiles/profiler_gui.dir/globals.cpp.o" \ +"CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o" \ +"CMakeFiles/profiler_gui.dir/main_window.cpp.o" \ +"CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o" \ +"CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o" \ +"CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o" \ +"CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o" \ +"CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o" + +# External object files for target profiler_gui +profiler_gui_EXTERNAL_OBJECTS = + +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/build.make +bin/profiler_gui: /home/alex/Work/Qt/5.8/gcc_64/lib/libQt5Widgets.so.5.8.0 +bin/profiler_gui: bin/libeasy_profiler.so +bin/profiler_gui: /home/alex/Work/Qt/5.8/gcc_64/lib/libQt5Gui.so.5.8.0 +bin/profiler_gui: /home/alex/Work/Qt/5.8/gcc_64/lib/libQt5Core.so.5.8.0 +bin/profiler_gui: profiler_gui/CMakeFiles/profiler_gui.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_20) "Linking CXX executable ../bin/profiler_gui" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/profiler_gui.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +profiler_gui/CMakeFiles/profiler_gui.dir/build: bin/profiler_gui + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/build + +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/main.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/common_functions.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/globals.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/main_window.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o.requires +profiler_gui/CMakeFiles/profiler_gui.dir/requires: profiler_gui/CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o.requires + +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/requires + +profiler_gui/CMakeFiles/profiler_gui.dir/clean: + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && $(CMAKE_COMMAND) -P CMakeFiles/profiler_gui.dir/cmake_clean.cmake +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/clean + +profiler_gui/CMakeFiles/profiler_gui.dir/depend: + cd /home/alex/Work/C++Projects/easyprofiler && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/profiler_gui /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/profiler_gui /home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : profiler_gui/CMakeFiles/profiler_gui.dir/depend + diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/cmake_clean.cmake b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/cmake_clean.cmake new file mode 100644 index 0000000..bdaff9d --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/cmake_clean.cmake @@ -0,0 +1,30 @@ +file(REMOVE_RECURSE + "profiler_gui_automoc.cpp" + "CMakeFiles/profiler_gui.dir/qrc_resources.cpp" + "CMakeFiles/profiler_gui.dir/main.cpp.o" + "CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o" + "CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o" + "CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o" + "CMakeFiles/profiler_gui.dir/common_functions.cpp.o" + "CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o" + "CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o" + "CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o" + "CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o" + "CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o" + "CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o" + "CMakeFiles/profiler_gui.dir/globals.cpp.o" + "CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o" + "CMakeFiles/profiler_gui.dir/main_window.cpp.o" + "CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o" + "CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o" + "CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o" + "CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o" + "CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o" + "../bin/profiler_gui.pdb" + "../bin/profiler_gui" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/profiler_gui.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/depend.make b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/depend.make new file mode 100644 index 0000000..cc4c540 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for profiler_gui. +# This may be replaced when dependencies are built. diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/flags.make b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/flags.make new file mode 100644 index 0000000..f9e76bf --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -O3 -DNDEBUG -fPIC -DEASY_CHRONO_STEADY_CLOCK=0 -DEASY_CHRONO_HIGHRES_CLOCK=0 -DEASY_OPTION_START_LISTEN_ON_STARTUP=0 -DEASY_OPTION_MEASURE_STORAGE_EXPAND=0 -DEASY_OPTION_STORAGE_EXPAND_BLOCKS_ON=0 -DEASY_OPTION_IMPLICIT_THREAD_REGISTRATION=1 -DEASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS=0 -DEASY_OPTION_LOG_ENABLED=0 -DEASY_OPTION_PRETTY_PRINT_FUNCTIONS=0 -DEASY_OPTION_BUILTIN_COLORS=1 -std=gnu++11 -std=gnu++11 + +CXX_DEFINES = -DBUILD_WITH_EASY_PROFILER=1 -DEASY_DEFAULT_PORT=28077 -DEASY_PROFILER_VERSION_MAJOR=1 -DEASY_PROFILER_VERSION_MINOR=3 -DEASY_PROFILER_VERSION_PATCH=0 -DQT_CORE_LIB -DQT_GUI_LIB -DQT_NO_DEBUG -DQT_WIDGETS_LIB + +CXX_INCLUDES = -I/home/alex/Work/C++Projects/easyprofiler/profiler_gui -isystem /home/alex/Work/Qt/5.8/gcc_64/include -isystem /home/alex/Work/Qt/5.8/gcc_64/include/QtWidgets -isystem /home/alex/Work/Qt/5.8/gcc_64/include/QtGui -isystem /home/alex/Work/Qt/5.8/gcc_64/include/QtCore -isystem /home/alex/Work/Qt/5.8/gcc_64/./mkspecs/linux-g++ -I/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include + diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/link.txt b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/link.txt new file mode 100644 index 0000000..cd1eaaf --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/profiler_gui.dir/main.cpp.o CMakeFiles/profiler_gui.dir/arbitrary_value_inspector.cpp.o CMakeFiles/profiler_gui.dir/blocks_graphics_view.cpp.o CMakeFiles/profiler_gui.dir/blocks_tree_widget.cpp.o CMakeFiles/profiler_gui.dir/common_functions.cpp.o CMakeFiles/profiler_gui.dir/descriptors_tree_widget.cpp.o CMakeFiles/profiler_gui.dir/easy_chronometer_item.cpp.o CMakeFiles/profiler_gui.dir/easy_frame_rate_viewer.cpp.o CMakeFiles/profiler_gui.dir/easy_graphics_item.cpp.o CMakeFiles/profiler_gui.dir/easy_graphics_scrollbar.cpp.o CMakeFiles/profiler_gui.dir/easy_qtimer.cpp.o CMakeFiles/profiler_gui.dir/globals.cpp.o CMakeFiles/profiler_gui.dir/globals_qobjects.cpp.o CMakeFiles/profiler_gui.dir/main_window.cpp.o CMakeFiles/profiler_gui.dir/tree_widget_item.cpp.o CMakeFiles/profiler_gui.dir/tree_widget_loader.cpp.o CMakeFiles/profiler_gui.dir/treeview_first_column_delegate.cpp.o CMakeFiles/profiler_gui.dir/profiler_gui_automoc.cpp.o CMakeFiles/profiler_gui.dir/CMakeFiles/profiler_gui.dir/qrc_resources.cpp.o -o ../bin/profiler_gui -rdynamic /home/alex/Work/Qt/5.8/gcc_64/lib/libQt5Widgets.so.5.8.0 ../bin/libeasy_profiler.so /home/alex/Work/Qt/5.8/gcc_64/lib/libQt5Gui.so.5.8.0 /home/alex/Work/Qt/5.8/gcc_64/lib/libQt5Core.so.5.8.0 -lpthread -Wl,-rpath,/home/alex/Work/Qt/5.8/gcc_64/lib:/home/alex/Work/C++Projects/easyprofiler/bin: diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/progress.make b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/progress.make new file mode 100644 index 0000000..c417330 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui.dir/progress.make @@ -0,0 +1,21 @@ +CMAKE_PROGRESS_1 = 9 +CMAKE_PROGRESS_2 = 10 +CMAKE_PROGRESS_3 = 11 +CMAKE_PROGRESS_4 = 12 +CMAKE_PROGRESS_5 = 13 +CMAKE_PROGRESS_6 = 14 +CMAKE_PROGRESS_7 = 15 +CMAKE_PROGRESS_8 = 16 +CMAKE_PROGRESS_9 = 17 +CMAKE_PROGRESS_10 = 18 +CMAKE_PROGRESS_11 = 19 +CMAKE_PROGRESS_12 = 20 +CMAKE_PROGRESS_13 = 21 +CMAKE_PROGRESS_14 = 22 +CMAKE_PROGRESS_15 = 23 +CMAKE_PROGRESS_16 = 24 +CMAKE_PROGRESS_17 = 25 +CMAKE_PROGRESS_18 = 26 +CMAKE_PROGRESS_19 = 27 +CMAKE_PROGRESS_20 = 28 + diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/AutogenInfo.cmake b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/AutogenInfo.cmake new file mode 100644 index 0000000..3f8c232 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/AutogenInfo.cmake @@ -0,0 +1,29 @@ +set(AM_SOURCES "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/main.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/arbitrary_value_inspector.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_graphics_view.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_tree_widget.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/common_functions.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/descriptors_tree_widget.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_chronometer_item.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_frame_rate_viewer.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_item.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_scrollbar.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_qtimer.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals_qobjects.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/main_window.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_item.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_loader.cpp;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/treeview_first_column_delegate.cpp" ) +set(AM_RCC_SOURCES "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/resources.qrc" ) +set(AM_RCC_INPUTS "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/logo.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/arrow-up-hover.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/radio-indicator.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/settings.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/reload.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/open-folder2.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/arrow-up-disabled.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/statistics.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/lan_on.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/wifi.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/check-disabled.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/close-white.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/maximize-white-pressed.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/save.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/play.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/close-white-hover.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/collapse.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/reload-folder2.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/list.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/search-prev.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/off.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/arrow-down-disabled.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/radio-indicator-disabled.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/search-next.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/arrow-up.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/maximize-white.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/check.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/lan.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/maximize-white-hover.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/lan.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/minimize-white.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/stop.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/minimize-white-pressed.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/delete.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/arrow-down.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/wifi_on.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/lan_on.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/expand.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/close-white-pressed.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/arrow-down-hover.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/minimize-white-hover.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/images/default/statistics2.svg@list_sep@/home/alex/Work/C++Projects/easyprofiler/profiler_gui/themes/default.css") +set(AM_SKIP_MOC "" ) +set(AM_SKIP_UIC ) +set(AM_HEADERS "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/arbitrary_value_inspector.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_graphics_view.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/blocks_tree_widget.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/common_functions.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/common_types.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/descriptors_tree_widget.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_chronometer_item.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_frame_rate_viewer.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_item.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_graphics_scrollbar.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/easy_qtimer.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/globals.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/main_window.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_item.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/tree_widget_loader.h;/home/alex/Work/C++Projects/easyprofiler/profiler_gui/treeview_first_column_delegate.h" ) +set(AM_MOC_COMPILE_DEFINITIONS "BUILD_WITH_EASY_PROFILER=1;EASY_DEFAULT_PORT=28077;EASY_PROFILER_VERSION_MAJOR=1;EASY_PROFILER_VERSION_MINOR=3;EASY_PROFILER_VERSION_PATCH=0;QT_CORE_LIB;QT_GUI_LIB;QT_NO_DEBUG;QT_WIDGETS_LIB") +set(AM_MOC_INCLUDES "/home/alex/Work/C++Projects/easyprofiler/profiler_gui;/home/alex/Work/Qt/5.8/gcc_64/include;/home/alex/Work/Qt/5.8/gcc_64/include/QtWidgets;/home/alex/Work/Qt/5.8/gcc_64/include/QtGui;/home/alex/Work/Qt/5.8/gcc_64/include/QtCore;/home/alex/Work/Qt/5.8/gcc_64/./mkspecs/linux-g++;/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include;/usr/include") +set(AM_MOC_OPTIONS "") +set(AM_CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE "") +set(AM_CMAKE_BINARY_DIR "/home/alex/Work/C++Projects/easyprofiler/") +set(AM_CMAKE_SOURCE_DIR "/home/alex/Work/C++Projects/easyprofiler/") +set(AM_QT_MOC_EXECUTABLE "/home/alex/Work/Qt/5.8/gcc_64/bin/moc") +set(AM_QT_UIC_EXECUTABLE "") +set(AM_QT_RCC_EXECUTABLE "/home/alex/Work/Qt/5.8/gcc_64/bin/rcc") +if(DEFINED ENV{DEB_BUILD_MULTIARCH} AND DEFINED ENV{DEB_HOST_MULTIARCH} AND "/home/alex/Work/Qt/5.8/gcc_64/bin/moc" MATCHES "/usr/lib/$ENV{DEB_HOST_MULTIARCH}/qt5/bin/moc") + set(AM_QT_MOC_EXECUTABLE "/usr/lib/$ENV{DEB_BUILD_MULTIARCH}/qt5/bin/moc") +endif() +set(AM_CMAKE_CURRENT_SOURCE_DIR "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/") +set(AM_CMAKE_CURRENT_BINARY_DIR "/home/alex/Work/C++Projects/easyprofiler/profiler_gui/") +set(AM_QT_VERSION_MAJOR "5") +set(AM_TARGET_NAME "profiler_gui_automoc") +set(AM_ORIGIN_TARGET_NAME "profiler_gui") +set(AM_RELAXED_MODE "FALSE") +set(AM_UIC_TARGET_OPTIONS ) +set(AM_UIC_OPTIONS_FILES ) +set(AM_UIC_OPTIONS_OPTIONS ) +set(AM_RCC_OPTIONS_FILES "") +set(AM_RCC_OPTIONS_OPTIONS "") diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/DependInfo.cmake b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/DependInfo.cmake new file mode 100644 index 0000000..19fab21 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/DependInfo.cmake @@ -0,0 +1,11 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + ) +# The set of files for implicit dependencies of each language: + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/build.make b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/build.make new file mode 100644 index 0000000..8b445e6 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/build.make @@ -0,0 +1,77 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/alex/Work/C++Projects/easyprofiler + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/alex/Work/C++Projects/easyprofiler + +# Utility rule file for profiler_gui_automoc. + +# Include the progress variables for this target. +include profiler_gui/CMakeFiles/profiler_gui_automoc.dir/progress.make + +profiler_gui/CMakeFiles/profiler_gui_automoc: + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Automatic moc and rcc for target profiler_gui" + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && /usr/bin/cmake -E cmake_autogen /home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/ Release + +profiler_gui_automoc: profiler_gui/CMakeFiles/profiler_gui_automoc +profiler_gui_automoc: profiler_gui/CMakeFiles/profiler_gui_automoc.dir/build.make + +.PHONY : profiler_gui_automoc + +# Rule to build all files generated by this target. +profiler_gui/CMakeFiles/profiler_gui_automoc.dir/build: profiler_gui_automoc + +.PHONY : profiler_gui/CMakeFiles/profiler_gui_automoc.dir/build + +profiler_gui/CMakeFiles/profiler_gui_automoc.dir/clean: + cd /home/alex/Work/C++Projects/easyprofiler/profiler_gui && $(CMAKE_COMMAND) -P CMakeFiles/profiler_gui_automoc.dir/cmake_clean.cmake +.PHONY : profiler_gui/CMakeFiles/profiler_gui_automoc.dir/clean + +profiler_gui/CMakeFiles/profiler_gui_automoc.dir/depend: + cd /home/alex/Work/C++Projects/easyprofiler && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/profiler_gui /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/profiler_gui /home/alex/Work/C++Projects/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : profiler_gui/CMakeFiles/profiler_gui_automoc.dir/depend + diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/cmake_clean.cmake b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/cmake_clean.cmake new file mode 100644 index 0000000..186b8e5 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +file(REMOVE_RECURSE + "profiler_gui_automoc.cpp" + "CMakeFiles/profiler_gui.dir/qrc_resources.cpp" + "CMakeFiles/profiler_gui_automoc" +) + +# Per-language clean rules from dependency scanning. +foreach(lang ) + include(CMakeFiles/profiler_gui_automoc.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/progress.make b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/progress.make new file mode 100644 index 0000000..c7c4328 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/profiler_gui_automoc.dir/progress.make @@ -0,0 +1,2 @@ +CMAKE_PROGRESS_1 = 29 + diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeFiles/progress.marks b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/progress.marks new file mode 100644 index 0000000..f04c001 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeFiles/progress.marks @@ -0,0 +1 @@ +29 diff --git a/3rdparty/easyprofiler/profiler_gui/CMakeLists.txt b/3rdparty/easyprofiler/profiler_gui/CMakeLists.txt new file mode 100644 index 0000000..e78c964 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/CMakeLists.txt @@ -0,0 +1,70 @@ +#set(CMAKE_PREFIX_PATH f:/qt/5.5/5.6/msvc2013_64/lib/cmake) + +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +find_package(Qt5Widgets) + +if (Qt5Widgets_FOUND) + if (NOT("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") AND WIN32) + set(APPLICATION_PLATFORM WIN32) + endif () + add_executable(profiler_gui ${APPLICATION_PLATFORM} + main.cpp + arbitrary_value_inspector.h + arbitrary_value_inspector.cpp + blocks_graphics_view.h + blocks_graphics_view.cpp + blocks_tree_widget.h + blocks_tree_widget.cpp + common_functions.h + common_functions.cpp + common_types.h + descriptors_tree_widget.h + descriptors_tree_widget.cpp + easy_chronometer_item.h + easy_chronometer_item.cpp + easy_frame_rate_viewer.h + easy_frame_rate_viewer.cpp + easy_graphics_item.h + easy_graphics_item.cpp + easy_graphics_scrollbar.h + easy_graphics_scrollbar.cpp + easy_qtimer.h + easy_qtimer.cpp + globals.h + globals.cpp + globals_qobjects.cpp + main_window.h + main_window.cpp + tree_widget_item.h + tree_widget_item.cpp + tree_widget_loader.h + tree_widget_loader.cpp + treeview_first_column_delegate.h + treeview_first_column_delegate.cpp + resources.qrc + resources.rc + ) + target_link_libraries(profiler_gui Qt5::Widgets easy_profiler) + if (WIN32) + target_compile_definitions(profiler_gui PRIVATE -D_WIN32_WINNT=0x0600) + endif () + if (MINGW) + target_compile_definitions(profiler_gui PRIVATE -DSTRSAFE_NO_DEPRECATE) + endif () + + install( + TARGETS + profiler_gui + RUNTIME + DESTINATION + bin + ) + + set_property(TARGET profiler_gui PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE) +else () + message(STATUS "INFO\n\n\tQt5 not found! Generating EasyProfiler projects without GUI.\n") +endif () + diff --git a/3rdparty/easyprofiler/profiler_gui/arbitrary_value_inspector.cpp b/3rdparty/easyprofiler/profiler_gui/arbitrary_value_inspector.cpp new file mode 100644 index 0000000..2655827 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/arbitrary_value_inspector.cpp @@ -0,0 +1,1060 @@ +/************************************************************************ +* file name : arbitrary_value_inspector.cpp +* ----------------- : +* creation time : 2017/11/30 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of . +* ----------------- : +* change log : * 2017/11/30 Victor Zarubkin: initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "arbitrary_value_inspector.h" +#include "treeview_first_column_delegate.h" +#include "globals.h" + +////////////////////////////////////////////////////////////////////////// + +void getChartPoints(const ArbitraryValuesCollection& _collection, Points& _points, qreal& _minValue, qreal& _maxValue) +{ + _minValue = 1e300; + _maxValue = -1e300; + + const auto size = _collection.size(); + _points.clear(); + _points.reserve(size); + + if (size == 0) + return; + + const auto& valuesByThread = _collection.valuesMap(); + + if (valuesByThread.size() == 1) + { + const auto& values = valuesByThread.begin()->second; + for (auto value : values) + { + const qreal x = sceneX(value->begin()); + const qreal y = profiler_gui::value2real(*value); + _points.emplace_back(x, y); + + if (y > _maxValue) + _maxValue = y; + if (y < _minValue) + _minValue = y; + } + } + else + { + std::list threadIds; + for (const auto& it : valuesByThread) + threadIds.push_back(it.first); + + size_t i = 0; + while (!threadIds.empty()) + { + for (auto it = threadIds.begin(); it != threadIds.end();) + { + const auto& values = valuesByThread.at(*it); + if (i >= values.size()) + { + it = threadIds.erase(it); + continue; + } + + const qreal x = sceneX(values[i]->begin()); + const qreal y = profiler_gui::value2real(*values[i]); + _points.emplace_back(x, y); + + if (y > _maxValue) + _maxValue = y; + if (y < _minValue) + _minValue = y; + + ++it; + } + } + + std::sort(_points.begin(), _points.end(), [](const QPointF& lhs, const QPointF& rhs) -> bool { + return lhs.x() < rhs.x(); + }); + } +} + +////////////////////////////////////////////////////////////////////////// + +ArbitraryValuesCollection::ArbitraryValuesCollection() + : m_beginTime(0) + , m_minValue(1e300) + , m_maxValue(-1e300) + , m_jobType(0) +{ + m_status = ATOMIC_VAR_INIT(Idle); + m_bInterrupt = ATOMIC_VAR_INIT(false); +} + +ArbitraryValuesCollection::~ArbitraryValuesCollection() +{ + interrupt(); +} + +const ArbitraryValuesMap& ArbitraryValuesCollection::valuesMap() const +{ + return m_values; +} + +const Points& ArbitraryValuesCollection::points() const +{ + return m_points; +} + +ArbitraryValuesCollection::JobStatus ArbitraryValuesCollection::status() const +{ + return static_cast(m_status.load(std::memory_order_acquire)); +} + +size_t ArbitraryValuesCollection::size() const +{ + size_t totalSize = 0; + for (const auto& it : m_values) + totalSize += it.second.size(); + return totalSize; +} + +qreal ArbitraryValuesCollection::minValue() const +{ + return m_minValue; +} + +qreal ArbitraryValuesCollection::maxValue() const +{ + return m_maxValue; +} + +void ArbitraryValuesCollection::collectValues(profiler::thread_id_t _threadId, profiler::vin_t _valueId, const char* _valueName) +{ + interrupt(); + + setStatus(InProgress); + m_points.clear(); + m_jobType = ValuesJob; + + if (_valueId == 0) + m_collectorThread = std::thread(&This::collectByName, this, _threadId, _valueName); + else + m_collectorThread = std::thread(&This::collectById, this, _threadId, _valueId); +} + +void ArbitraryValuesCollection::collectValues(profiler::thread_id_t _threadId, profiler::vin_t _valueId, const char* _valueName, profiler::timestamp_t _beginTime) +{ + interrupt(); + + setStatus(InProgress); + m_points.clear(); + m_beginTime = _beginTime; + m_minValue = 1e300; + m_maxValue = -1e300; + m_jobType = ValuesJob | PointsJob; + + if (_valueId == 0) + m_collectorThread = std::thread(&This::collectByName, this, _threadId, _valueName); + else + m_collectorThread = std::thread(&This::collectById, this, _threadId, _valueId); +} + +bool ArbitraryValuesCollection::calculatePoints(profiler::timestamp_t _beginTime) +{ + if (status() != Ready || m_values.empty()) + return false; + + if (m_collectorThread.joinable()) + m_collectorThread.join(); + + setStatus(InProgress); + m_points.clear(); + m_beginTime = _beginTime; + m_minValue = 1e300; + m_maxValue = -1e300; + m_jobType = PointsJob; + + m_collectorThread = std::thread([this] + { + getChartPoints(*this, m_points, m_minValue, m_maxValue); + setStatus(Ready); + }); + + return true; +} + +void ArbitraryValuesCollection::interrupt() +{ + if (!m_collectorThread.joinable()) + return; + + m_bInterrupt.store(true, std::memory_order_release); + m_collectorThread.join(); + m_bInterrupt.store(false, std::memory_order_release); + + setStatus(Idle); + m_jobType = None; + m_values.clear(); +} + +void ArbitraryValuesCollection::setStatus(JobStatus _status) +{ + m_status.store(static_cast(_status), std::memory_order_release); +} + +void ArbitraryValuesCollection::collectById(profiler::thread_id_t _threadId, profiler::vin_t _valueId) +{ + if (_threadId == 0) + { + const auto threadsCount = EASY_GLOBALS.profiler_blocks.size(); + const bool calculatePointsInner = (m_jobType & PointsJob) != 0 && threadsCount == 1; + + for (const auto& it : EASY_GLOBALS.profiler_blocks) + { + if (!collectByIdForThread(it.second, _valueId, calculatePointsInner)) + return; + } + + if ((m_jobType & PointsJob) != 0 && threadsCount > 1) + getChartPoints(*this, m_points, m_minValue, m_maxValue); + } + else + { + const auto t = EASY_GLOBALS.profiler_blocks.find(_threadId); + if (t != EASY_GLOBALS.profiler_blocks.end() && !collectByIdForThread(t->second, _valueId, (m_jobType & PointsJob) != 0)) + return; + } + + setStatus(Ready); +} + +bool ArbitraryValuesCollection::collectByIdForThread(const profiler::BlocksTreeRoot& _threadRoot, + profiler::vin_t _valueId, bool _calculatePoints) +{ + auto& valuesList = m_values[_threadRoot.thread_id]; + + for (auto i : _threadRoot.events) + { + if (m_bInterrupt.load(std::memory_order_acquire)) + return false; + + const auto& block = easyBlock(i).tree; + const auto& desc = easyDescriptor(block.node->id()); + if (desc.type() != profiler::BlockType::Value) + continue; + + const auto value = block.value; + if (value->value_id() != _valueId) + continue; + + valuesList.push_back(value); + + if (_calculatePoints) + { + const auto p = point(*block.value); + + if (p.y() > m_maxValue) + m_maxValue = p.y(); + if (p.y() < m_minValue) + m_minValue = p.y(); + + m_points.push_back(p); + } + } + + return true; +} + +void ArbitraryValuesCollection::collectByName(profiler::thread_id_t _threadId, const std::string _valueName) +{ + if (_threadId == 0) + { + const auto threadsCount = EASY_GLOBALS.profiler_blocks.size(); + const bool calculatePointsInner = (m_jobType & PointsJob) != 0 && threadsCount == 1; + + for (const auto& it : EASY_GLOBALS.profiler_blocks) + { + if (!collectByNameForThread(it.second, _valueName, calculatePointsInner)) + return; + } + + if ((m_jobType & PointsJob) != 0 && threadsCount > 1) + getChartPoints(*this, m_points, m_minValue, m_maxValue); + } + else + { + const auto t = EASY_GLOBALS.profiler_blocks.find(_threadId); + if (t != EASY_GLOBALS.profiler_blocks.end() && !collectByNameForThread(t->second, _valueName, (m_jobType & PointsJob) != 0)) + return; + } + + setStatus(Ready); +} + +bool ArbitraryValuesCollection::collectByNameForThread(const profiler::BlocksTreeRoot& _threadRoot, + const std::string& _valueName, bool _calculatePoints) +{ + auto& valuesList = m_values[_threadRoot.thread_id]; + + for (auto i : _threadRoot.events) + { + if (m_bInterrupt.load(std::memory_order_acquire)) + return false; + + const auto& block = easyBlock(i).tree; + const auto& desc = easyDescriptor(block.node->id()); + if (desc.type() != profiler::BlockType::Value || _valueName != desc.name()) + continue; + + valuesList.push_back(block.value); + + if (_calculatePoints) + { + const auto p = point(*block.value); + + if (p.y() > m_maxValue) + m_maxValue = p.y(); + if (p.y() < m_minValue) + m_minValue = p.y(); + + m_points.push_back(p); + } + } + + return true; +} + +QPointF ArbitraryValuesCollection::point(const profiler::ArbitraryValue& _value) const +{ + const qreal x = PROF_MICROSECONDS(qreal(_value.begin() - m_beginTime)); + const qreal y = profiler_gui::value2real(_value); + return {x, y}; +} + +////////////////////////////////////////////////////////////////////////// + +EasyArbitraryValuesChartItem::EasyArbitraryValuesChartItem() + : Parent(nullptr) +{ +} + +EasyArbitraryValuesChartItem::~EasyArbitraryValuesChartItem() +{ + +} + +void EasyArbitraryValuesChartItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*, QWidget*) +{ + if (m_collections.empty()) + return; + + const auto& chart = *reinterpret_cast(scene()->parent()); + const auto scale = chart.xscale(); + + qreal minValue = 1e300, maxValue = -1e300; + for (const auto& c : m_collections) + { + const auto& collection = *c.ptr; + if (minValue > collection.minValue()) + minValue = collection.minValue(); + if (maxValue < collection.maxValue()) + maxValue = collection.maxValue(); + } + + const qreal height = std::max(maxValue - minValue, 1.); + + auto r = scene()->sceneRect(); + + + _painter->save(); + + for (const auto& c : m_collections) + { + const auto& points = c.ptr->points(); + if (points.empty()) + continue; + + if (c.selected) + { + auto pen = _painter->pen(); + pen.setColor(QColor::fromRgba(c.color)); + pen.setWidth(3); + _painter->setPen(pen); + } + else + { + _painter->setPen(QColor::fromRgba(c.color)); + } + + if (points.size() == 1) + _painter->drawPoint(points.front()); + else + { + auto gety = [&r, &minValue, &maxValue, &height] (qreal y) + { + y = maxValue - y; + y /= height; + y *= r.height() - 10; + y += r.top() + 5; + return y; + }; + + if (c.chartType == ChartType::Points) + { + for (const auto& p : points) + _painter->drawPoint(QPointF {p.x() * scale, gety(p.y())}); + } + else + { + QPointF p1 = points.front(); + for (int i = 1; i < points.size(); ++i) + { + const auto& p2 = points[i]; + _painter->drawLine(QPointF {p1.x() * scale, gety(p1.y())}, QPointF {p2.x() * scale, gety(p2.y())}); + p1 = p2; + } + } + //_painter->drawPolyline(points.data(), static_cast(points.size())); + } + } + + _painter->restore(); +} + +QRectF EasyArbitraryValuesChartItem::boundingRect() const +{ + return m_boundingRect; +} + +void EasyArbitraryValuesChartItem::setBoundingRect(const QRectF& _rect) +{ + m_boundingRect = _rect; +} + +void EasyArbitraryValuesChartItem::setBoundingRect(qreal _left, qreal _top, qreal _width, qreal _height) +{ + m_boundingRect.setRect(_left, _top, _width, _height); +} + +void EasyArbitraryValuesChartItem::update(Collections _collections) +{ + m_collections = std::move(_collections); +} + +void EasyArbitraryValuesChartItem::update(const ArbitraryValuesCollection* _selected) +{ + for (auto& collection : m_collections) + collection.selected = collection.ptr == _selected; +} + +////////////////////////////////////////////////////////////////////////// + +EasyGraphicsChart::EasyGraphicsChart(QWidget* _parent) + : Parent(_parent) + , m_chartItem(new EasyArbitraryValuesChartItem()) + , m_left(0) + , m_right(100) + , m_offset(0) + , m_xscale(1) + , m_visibleRegionWidth(100) + , m_bBindMode(false) +{ + setCacheMode(QGraphicsView::CacheNone); + setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + //setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); + setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + setOptimizationFlag(QGraphicsView::DontSavePainterState, true); + + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + setContentsMargins(0, 0, 0, 0); + + setScene(new QGraphicsScene(this)); + scene()->setSceneRect(0, -250, 500, 500); + scene()->addItem(m_chartItem); + + connect(&EASY_GLOBALS.events, &profiler_gui::EasyGlobalSignals::sceneSizeChanged, + this, &This::onSceneSizeChanged, Qt::QueuedConnection); + + onSceneSizeChanged(); +} + +EasyGraphicsChart::~EasyGraphicsChart() +{ + +} + +void EasyGraphicsChart::onSceneSizeChanged() +{ + setRange(EASY_GLOBALS.scene_left, EASY_GLOBALS.scene_right); +} + +void EasyGraphicsChart::resizeEvent(QResizeEvent* _event) +{ + auto size = _event->size(); + onWindowSizeChanged(size.width(), size.height()); + scene()->update(); +} + +void EasyGraphicsChart::clear() +{ + m_chartItem->update(Collections {}); +} + +bool EasyGraphicsChart::bindMode() const +{ + return m_bBindMode; +} + +qreal EasyGraphicsChart::xscale() const +{ + return m_xscale; +} + +qreal EasyGraphicsChart::left() const +{ + return m_left; +} + +qreal EasyGraphicsChart::right() const +{ + return m_right; +} + +qreal EasyGraphicsChart::range() const +{ + return m_right - m_left; +} + +qreal EasyGraphicsChart::offset() const +{ + return m_bBindMode ? m_offset : 0; +} + +qreal EasyGraphicsChart::region() const +{ + return m_bBindMode ? m_visibleRegionWidth : range(); +} + +void EasyGraphicsChart::setOffset(qreal _offset) +{ + m_offset = std::min(std::max(m_left, m_offset), m_right - m_visibleRegionWidth); +} + +void EasyGraphicsChart::setRange(qreal _left, qreal _right) +{ + const auto oldRange = range(); + const auto oldOffsetPart = oldRange < 1e-3 ? 0.0 : m_offset / oldRange; + + m_left = _left; + m_right = _right; + + if (m_left > m_right) + std::swap(m_left, m_right); + + const auto sceneRange = range(); + //scene()->setSceneRect(m_left, -(height() >> 1), sceneRange, height()); + //m_chartItem->setBoundingRect(scene()->sceneRect()); + + m_offset = m_left + oldOffsetPart * sceneRange; + m_visibleRegionWidth = std::min(m_visibleRegionWidth, sceneRange); + + //const auto oldXScale = m_xscale; + m_xscale = sceneRange < 1e-3 ? 1.0 : width() / sceneRange; + //scale(m_xscale / oldXScale, 1); + + scene()->update(); +} + +void EasyGraphicsChart::setRegion(qreal _visibleRegionWidth) +{ + m_visibleRegionWidth = std::min(_visibleRegionWidth, range()); + setOffset(m_offset); +} + +void EasyGraphicsChart::onWindowSizeChanged(qreal _width, qreal _height) +{ + //const auto oldXScale = m_xscale; + const auto sceneRange = range(); + + m_xscale = sceneRange < 1e-3 ? 1.0 : _width / sceneRange; + + scene()->setSceneRect(0, -_height * 0.5, _width, _height); + //scene()->setSceneRect(m_left, -_height * 0.5, sceneRange, _height); + m_chartItem->setBoundingRect(scene()->sceneRect()); + //scale(m_xscale / oldXScale, 1); +} + +void EasyGraphicsChart::update(Collections _collections) +{ + m_chartItem->update(std::move(_collections)); + scene()->update(); +} + +void EasyGraphicsChart::update(const ArbitraryValuesCollection* _selected) +{ + m_chartItem->update(_selected); + scene()->update(); +} + +////////////////////////////////////////////////////////////////////////// + +enum class ArbitraryColumns : uint8_t +{ + Name = 0, + Type, + Value, + Vin, + + Count +}; + +EASY_CONSTEXPR auto CheckColumn = int_cast(ArbitraryColumns::Name); +EASY_CONSTEXPR auto StdItemType = QTreeWidgetItem::UserType; +EASY_CONSTEXPR auto ValueItemType = QTreeWidgetItem::UserType + 1; + +struct UsedValueTypes { + EasyArbitraryTreeWidgetItem* items[int_cast(profiler::DataType::TypesCount)]; + UsedValueTypes(int = 0) { memset(items, 0, sizeof(items)); } +}; + +////////////////////////////////////////////////////////////////////////// + +EasyArbitraryTreeWidgetItem::EasyArbitraryTreeWidgetItem(QTreeWidgetItem* _parent, profiler::color_t _color, profiler::vin_t _vin) + : Parent(_parent, ValueItemType) + , m_vin(_vin) + , m_color(_color) + , m_widthHint(0) +{ + setFlags(flags() | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable); + setCheckState(CheckColumn, Qt::Unchecked); +} + +EasyArbitraryTreeWidgetItem::~EasyArbitraryTreeWidgetItem() +{ + +} + +QVariant EasyArbitraryTreeWidgetItem::data(int _column, int _role) const +{ + if (_column == CheckColumn && _role == Qt::SizeHintRole) + return QSize(m_widthHint, 26); + return Parent::data(_column, _role); +} + +void EasyArbitraryTreeWidgetItem::setWidthHint(int _width) +{ + m_widthHint = _width; +} + +const ArbitraryValuesCollection* EasyArbitraryTreeWidgetItem::collection() const +{ + return m_collection.get(); +} + +void EasyArbitraryTreeWidgetItem::collectValues(profiler::thread_id_t _threadId) +{ + if (!m_collection) + m_collection = CollectionPtr(new ArbitraryValuesCollection); + else + m_collection->interrupt(); + + m_collection->collectValues(_threadId, m_vin, text(int_cast(ArbitraryColumns::Name)).toStdString().c_str(), EASY_GLOBALS.begin_time); +} + +void EasyArbitraryTreeWidgetItem::interrupt() +{ + if (!m_collection) + return; + + m_collection->interrupt(); + m_collection.release(); +} + +profiler::color_t EasyArbitraryTreeWidgetItem::color() const +{ + return m_color; +} + +////////////////////////////////////////////////////////////////////////// + +EasyArbitraryValuesWidget::EasyArbitraryValuesWidget(QWidget* _parent) + : Parent(_parent) + , m_treeWidget(new QTreeWidget(this)) + , m_chart(new EasyGraphicsChart(this)) +{ + auto layout = new QHBoxLayout(this); + layout->setContentsMargins(0, 0, 0, 0); + layout->addWidget(m_treeWidget); + layout->addWidget(m_chart); + layout->setStretch(0, 1); + layout->setStretch(1, 1); + + m_treeWidget->setAutoFillBackground(false); + m_treeWidget->setAlternatingRowColors(true); + m_treeWidget->setItemsExpandable(true); + m_treeWidget->setAnimated(true); + //m_treeWidget->setSortingEnabled(false); + m_treeWidget->setColumnCount(int_cast(ArbitraryColumns::Count)); + m_treeWidget->setSelectionBehavior(QAbstractItemView::SelectRows); + m_treeWidget->setItemDelegateForColumn(0, new EasyTreeViewFirstColumnItemDelegate(this)); + + auto headerItem = new QTreeWidgetItem(); + headerItem->setText(int_cast(ArbitraryColumns::Type), "Type"); + headerItem->setText(int_cast(ArbitraryColumns::Name), "Name"); + headerItem->setText(int_cast(ArbitraryColumns::Value), "Value"); + headerItem->setText(int_cast(ArbitraryColumns::Vin), "ID"); + m_treeWidget->setHeaderItem(headerItem); + +// auto mainLayout = new QVBoxLayout(this); +// mainLayout->setContentsMargins(1, 1, 1, 1); +// mainLayout->addWidget(m_treeWidget); + + connect(&m_timer, &QTimer::timeout, this, &This::rebuild); + connect(&m_collectionsTimer, &QTimer::timeout, this, &This::onCollectionsTimeout); + + connect(m_treeWidget, &QTreeWidget::itemDoubleClicked, this, &This::onItemDoubleClicked); + connect(m_treeWidget, &QTreeWidget::itemChanged, this, &This::onItemChanged); + connect(m_treeWidget, &QTreeWidget::currentItemChanged, this, &This::onCurrentItemChanged); + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedThreadChanged, this, &This::onSelectedThreadChanged); + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedBlockChanged, this, &This::onSelectedBlockChanged); + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedBlockIdChanged, this, &This::onSelectedBlockIdChanged); +} + +EasyArbitraryValuesWidget::~EasyArbitraryValuesWidget() +{ + +} + +void EasyArbitraryValuesWidget::clear() +{ + if (m_collectionsTimer.isActive()) + m_collectionsTimer.stop(); + if (m_timer.isActive()) + m_timer.stop(); + m_checkedItems.clear(); + m_treeWidget->clear(); +} + +void EasyArbitraryValuesWidget::onSelectedThreadChanged(::profiler::thread_id_t) +{ + if (!m_timer.isActive()) + m_timer.start(100); +} + +void EasyArbitraryValuesWidget::onSelectedBlockChanged(uint32_t) +{ + if (!m_timer.isActive()) + m_timer.start(100); +} + +void EasyArbitraryValuesWidget::onSelectedBlockIdChanged(::profiler::block_id_t) +{ + if (!m_timer.isActive()) + m_timer.start(100); +} + +void EasyArbitraryValuesWidget::onItemDoubleClicked(QTreeWidgetItem* _item, int) +{ + if (_item == nullptr || _item->type() != ValueItemType) + return; + + _item->setCheckState(CheckColumn, _item->checkState(CheckColumn) == Qt::Checked ? Qt::Unchecked : Qt::Checked); +} + +void EasyArbitraryValuesWidget::onItemChanged(QTreeWidgetItem* _item, int _column) +{ + if (_item == nullptr || _item->type() != ValueItemType || _column != CheckColumn) + return; + + auto item = static_cast(_item); + + if (item->checkState(CheckColumn) == Qt::Checked) + { + m_checkedItems.push_back(item); + item->collectValues(EASY_GLOBALS.selected_thread); + if (!m_collectionsTimer.isActive()) + m_collectionsTimer.start(100); + } + else + { + m_checkedItems.removeOne(item); + item->interrupt(); + onCollectionsTimeout(); + } +} + +void EasyArbitraryValuesWidget::onCurrentItemChanged(QTreeWidgetItem* _current, QTreeWidgetItem*) +{ + if (_current == nullptr || _current->type() != ValueItemType) + { + m_chart->update(nullptr); + return; + } + + auto item = static_cast(_current); + m_chart->update(item->collection()); +} + +void EasyArbitraryValuesWidget::rebuild() +{ + clear(); + + buildTree(EASY_GLOBALS.selected_thread, EASY_GLOBALS.selected_block, EASY_GLOBALS.selected_block_id); + + m_treeWidget->expandAll(); + for (int i = 0, columns = m_treeWidget->columnCount(); i < columns; ++i) + m_treeWidget->resizeColumnToContents(i); +} + +void EasyArbitraryValuesWidget::onCollectionsTimeout() +{ + if (m_checkedItems.isEmpty()) + { + if (m_collectionsTimer.isActive()) + m_collectionsTimer.stop(); + m_chart->update(Collections {}); + return; + } + + Collections collections; + collections.reserve(m_checkedItems.size()); + for (auto item : m_checkedItems) + { + if (item->collection()->status() != ArbitraryValuesCollection::InProgress) + { + collections.push_back(EasyCollectionPaintData {item->collection(), item->color(), + ChartType::Line, item == m_treeWidget->currentItem()}); + } + } + + if (collections.size() == m_checkedItems.size()) + { + if (m_collectionsTimer.isActive()) + m_collectionsTimer.stop(); + m_chart->update(std::move(collections)); + } +} + +void EasyArbitraryValuesWidget::buildTree(profiler::thread_id_t _threadId, profiler::block_index_t _blockIndex, profiler::block_id_t _blockId) +{ + m_treeWidget->clear(); + m_treeWidget->setColumnHidden(int_cast(ArbitraryColumns::Value), profiler_gui::is_max(_blockIndex)); + + if (_threadId != 0) + { + auto it = EASY_GLOBALS.profiler_blocks.find(_threadId); + if (it != EASY_GLOBALS.profiler_blocks.end()) + { + auto threadItem = buildTreeForThread(it->second, _blockIndex, _blockId); + m_treeWidget->addTopLevelItem(threadItem); + } + } + else + { + for (const auto& it : EASY_GLOBALS.profiler_blocks) + { + auto threadItem = buildTreeForThread(it.second, _blockIndex, _blockId); + m_treeWidget->addTopLevelItem(threadItem); + } + } +} + +QTreeWidgetItem* EasyArbitraryValuesWidget::buildTreeForThread(const profiler::BlocksTreeRoot& _threadRoot, profiler::block_index_t _blockIndex, profiler::block_id_t _blockId) +{ + auto fm = m_treeWidget->fontMetrics(); + + auto rootItem = new QTreeWidgetItem(StdItemType); + rootItem->setText(int_cast(ArbitraryColumns::Type), QStringLiteral("Thread")); + rootItem->setText(int_cast(ArbitraryColumns::Name), + profiler_gui::decoratedThreadName(EASY_GLOBALS.use_decorated_thread_name, _threadRoot, EASY_GLOBALS.hex_thread_id)); + + const bool hasConcreteBlock = !profiler_gui::is_max(_blockIndex); + if (hasConcreteBlock) + { + const auto& block = easyBlocksTree(_blockIndex); + const auto& desc = easyDescriptor(block.node->id()); + if (desc.type() == profiler::BlockType::Value) + { + auto valueItem = new EasyArbitraryTreeWidgetItem(rootItem, desc.color(), block.value->value_id()); + valueItem->setText(int_cast(ArbitraryColumns::Type), profiler_gui::valueTypeString(*block.value)); + valueItem->setText(int_cast(ArbitraryColumns::Name), desc.name()); + valueItem->setText(int_cast(ArbitraryColumns::Vin), QString("0x%1").arg(block.value->value_id(), 0, 16)); + valueItem->setText(int_cast(ArbitraryColumns::Value), profiler_gui::valueString(*block.value)); + + const auto sizeHintWidth = valueItem->sizeHint(CheckColumn).width(); + valueItem->setWidthHint(std::max(sizeHintWidth, fm.width(valueItem->text(CheckColumn))) + 32); + + return rootItem; + } + + _blockId = block.node->id(); + } + + const bool noId = profiler_gui::is_max(_blockId); + QTreeWidgetItem* blockItem = nullptr; + if (!noId) + { + blockItem = new QTreeWidgetItem(rootItem, StdItemType); + blockItem->setText(int_cast(ArbitraryColumns::Type), QStringLiteral("Block")); + if (hasConcreteBlock) + blockItem->setText(int_cast(ArbitraryColumns::Name), easyBlockName(_blockIndex)); + else + blockItem->setText(int_cast(ArbitraryColumns::Name), easyDescriptor(_blockId).name()); + } + + std::unordered_map > blocks; + std::unordered_map > vins; + std::unordered_map names; + + std::vector stack; + for (auto childIndex : _threadRoot.children) + { + stack.push_back(childIndex); + while (!stack.empty()) + { + const auto i = stack.back(); + stack.pop_back(); + + const auto& block = easyBlocksTree(i); + if (noId || block.node->id() == _blockId || easyDescriptor(block.node->id()).id() == _blockId) + { + for (auto c : block.children) + { + if (noId) + stack.push_back(c); + + const auto& child = easyBlocksTree(c); + const auto& desc = easyDescriptor(child.node->id()); + if (desc.type() != profiler::BlockType::Value) + continue; + + if (blockItem == nullptr) + { + const auto id = block.node->id(); + auto it = blocks.find(id); + if (it != blocks.end()) + { + blockItem = it->second; + } + else + { + blockItem = new QTreeWidgetItem(rootItem, StdItemType); + blockItem->setText(int_cast(ArbitraryColumns::Type), QStringLiteral("Block")); + blockItem->setText(int_cast(ArbitraryColumns::Name), easyBlockName(block)); + blocks.emplace(id, blockItem); + } + } + + const auto typeIndex = int_cast(child.value->type()); + auto vin = child.value->value_id(); + + EasyArbitraryTreeWidgetItem** usedItems = nullptr; + EasyArbitraryTreeWidgetItem* valueItem = nullptr; + if (vin == 0) + { + auto result = names.emplace(desc.name(), 0); + usedItems = result.first->second.items; + if (!result.second && (valueItem = *(usedItems + typeIndex))) + { + if (i == _blockIndex) + valueItem->setText(int_cast(ArbitraryColumns::Value), profiler_gui::valueString(*child.value)); + continue; // already in set + } + } + else + { + auto result = vins.emplace(vin, 0); + usedItems = result.first->second.items; + if (!result.second && (valueItem = *(usedItems + typeIndex))) + { + if (i == _blockIndex) + valueItem->setText(int_cast(ArbitraryColumns::Value), profiler_gui::valueString(*child.value)); + continue; // already in set + } + } + + valueItem = new EasyArbitraryTreeWidgetItem(blockItem, desc.color(), vin); + valueItem->setText(int_cast(ArbitraryColumns::Type), profiler_gui::valueTypeString(*child.value)); + valueItem->setText(int_cast(ArbitraryColumns::Name), desc.name()); + valueItem->setText(int_cast(ArbitraryColumns::Vin), QString("0x%1").arg(vin, 0, 16)); + + if (i == _blockIndex) + valueItem->setText(int_cast(ArbitraryColumns::Value), profiler_gui::valueString(*child.value)); + + const auto sizeHintWidth = valueItem->sizeHint(CheckColumn).width(); + valueItem->setWidthHint(std::max(sizeHintWidth, fm.width(valueItem->text(CheckColumn))) + 32); + + *(usedItems + typeIndex) = valueItem; + } + + if (noId) + blockItem = nullptr; + } + else + { + for (auto c : block.children) + stack.push_back(c); + } + } + } + + return rootItem; +} + diff --git a/3rdparty/easyprofiler/profiler_gui/arbitrary_value_inspector.h b/3rdparty/easyprofiler/profiler_gui/arbitrary_value_inspector.h new file mode 100644 index 0000000..01779d4 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/arbitrary_value_inspector.h @@ -0,0 +1,299 @@ +/************************************************************************ +* file name : arbitrary_value_inspector.h +* ----------------- : +* creation time : 2017/11/30 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of . +* ----------------- : +* change log : * 2017/11/30 Victor Zarubkin: initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER_GUI_ARBITRARY_VALUE_INSPECTOR_H +#define EASY_PROFILER_GUI_ARBITRARY_VALUE_INSPECTOR_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// + +using Points = std::vector; +using ArbitraryValues = std::vector; +using ArbitraryValuesMap = std::unordered_map >; + +class ArbitraryValuesCollection EASY_FINAL +{ +public: + + enum JobStatus : uint8_t { Idle = 0, Ready, InProgress }; + enum JobType : uint8_t { None = 0, ValuesJob = 1 << 0, PointsJob = 1 << 1 }; + +private: + + using This = ArbitraryValuesCollection; + + ArbitraryValuesMap m_values; + Points m_points; + std::thread m_collectorThread; + profiler::timestamp_t m_beginTime; + qreal m_minValue; + qreal m_maxValue; + std::atomic m_status; + std::atomic_bool m_bInterrupt; + uint8_t m_jobType; + +public: + + explicit ArbitraryValuesCollection(); + ~ArbitraryValuesCollection(); + + const ArbitraryValuesMap& valuesMap() const; + const Points& points() const; + JobStatus status() const; + size_t size() const; + + qreal minValue() const; + qreal maxValue() const; + + void collectValues(profiler::thread_id_t _threadId, profiler::vin_t _valueId, const char* _valueName); + void collectValues(profiler::thread_id_t _threadId, profiler::vin_t _valueId, const char* _valueName, profiler::timestamp_t _beginTime); + bool calculatePoints(profiler::timestamp_t _beginTime); + void interrupt(); + +private: + + void setStatus(JobStatus _status); + void collectById(profiler::thread_id_t _threadId, profiler::vin_t _valueId); + void collectByName(profiler::thread_id_t _threadId, const std::string _valueName); + bool collectByIdForThread(const profiler::BlocksTreeRoot& _threadRoot, profiler::vin_t _valueId, bool _calculatePoints); + bool collectByNameForThread(const profiler::BlocksTreeRoot& _threadRoot, const std::string& _valueName, bool _calculatePoints); + + QPointF point(const profiler::ArbitraryValue& _value) const; + +}; // end of class ArbitraryValuesCollection. + +enum class ChartType : uint8_t +{ + Line = 0, + Points +}; + +struct EasyCollectionPaintData EASY_FINAL +{ + const ArbitraryValuesCollection* ptr; + QRgb color; + ChartType chartType; + bool selected; +}; + +using Collections = std::vector; + +////////////////////////////////////////////////////////////////////////// + +class EasyArbitraryValuesChartItem : public QGraphicsItem +{ + using Parent = QGraphicsItem; + using This = EasyArbitraryValuesChartItem; + + Collections m_collections; + QRectF m_boundingRect; + +public: + + explicit EasyArbitraryValuesChartItem(); + ~EasyArbitraryValuesChartItem() override; + + void paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget = nullptr) override; + + QRectF boundingRect() const override; + void setBoundingRect(const QRectF& _rect); + void setBoundingRect(qreal _left, qreal _top, qreal _width, qreal _height); + + void update(Collections _collections); + void update(const ArbitraryValuesCollection* _selected); + +}; // end of class EasyArbitraryValuesChartItem. + +class EasyGraphicsChart : public QGraphicsView +{ + Q_OBJECT + +private: + + using Parent = QGraphicsView; + using This = EasyGraphicsChart; + + EasyArbitraryValuesChartItem* m_chartItem; + qreal m_left; + qreal m_right; + qreal m_offset; + qreal m_xscale; + qreal m_visibleRegionWidth; + bool m_bBindMode; + +public: + + explicit EasyGraphicsChart(QWidget* _parent = nullptr); + ~EasyGraphicsChart() override; + + void resizeEvent(QResizeEvent* _event) override; + + void clear(); + + bool bindMode() const; + qreal xscale() const; + + qreal left() const; + qreal right() const; + qreal range() const; + qreal offset() const; + qreal region() const; + + void setOffset(qreal _offset); + void setRange(qreal _left, qreal _right); + void setRegion(qreal _visibleRegionWidth); + + void update(Collections _collections); + void update(const ArbitraryValuesCollection* _selected); + +private slots: + + void onSceneSizeChanged(); + void onWindowSizeChanged(qreal _width, qreal _height); + +}; // end of class EasyGraphicsChart. + +////////////////////////////////////////////////////////////////////////// + +class EasyArbitraryTreeWidgetItem : public QTreeWidgetItem +{ + using Parent = QTreeWidgetItem; + using This = EasyArbitraryTreeWidgetItem; + using CollectionPtr = std::unique_ptr; + + CollectionPtr m_collection; + profiler::vin_t m_vin; + profiler::color_t m_color; + int m_widthHint; + +public: + + explicit EasyArbitraryTreeWidgetItem(QTreeWidgetItem* _parent, profiler::color_t _color, profiler::vin_t _vin = 0); + ~EasyArbitraryTreeWidgetItem() override; + + QVariant data(int _column, int _role) const override; + + void setWidthHint(int _width); + + const ArbitraryValuesCollection* collection() const; + void collectValues(profiler::thread_id_t _threadId); + void interrupt(); + + profiler::color_t color() const; + +}; // end of class EasyArbitraryTreeWidgetItem. + +////////////////////////////////////////////////////////////////////////// + +class EasyArbitraryValuesWidget : public QWidget +{ + Q_OBJECT + + using Parent = QWidget; + using This = EasyArbitraryValuesWidget; + + QTimer m_timer; + QTimer m_collectionsTimer; + QList m_checkedItems; + QTreeWidget* m_treeWidget; + EasyGraphicsChart* m_chart; + +public: + + explicit EasyArbitraryValuesWidget(QWidget* _parent = nullptr); + ~EasyArbitraryValuesWidget() override; + + void clear(); + +public slots: + + void rebuild(); + +private slots: + + void onSelectedThreadChanged(profiler::thread_id_t _id); + void onSelectedBlockChanged(uint32_t _block_index); + void onSelectedBlockIdChanged(profiler::block_id_t _id); + void onItemDoubleClicked(QTreeWidgetItem* _item, int _column); + void onItemChanged(QTreeWidgetItem* _item, int _column); + void onCurrentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*); + void onCollectionsTimeout(); + +private: + + void buildTree(profiler::thread_id_t _threadId, profiler::block_index_t _blockIndex, profiler::block_id_t _blockId); + QTreeWidgetItem* buildTreeForThread(const profiler::BlocksTreeRoot& _threadRoot, profiler::block_index_t _blockIndex, profiler::block_id_t _blockId); + +}; // end of class EasyArbitraryValuesWidget. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER_GUI_ARBITRARY_VALUE_INSPECTOR_H diff --git a/3rdparty/easyprofiler/profiler_gui/blocks_graphics_view.cpp b/3rdparty/easyprofiler/profiler_gui/blocks_graphics_view.cpp new file mode 100644 index 0000000..1639bac --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/blocks_graphics_view.cpp @@ -0,0 +1,2509 @@ +/************************************************************************ +* file name : blocks_graphics_view.cpp +* ----------------- : +* creation time : 2016/06/26 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of GraphicsScene and GraphicsView and +* : it's auxiliary classes for displyaing easy_profiler blocks tree. +* ----------------- : +* change log : * 2016/06/26 Victor Zarubkin: Moved sources from graphics_view.h +* : and renamed classes from My* to Prof*. +* : +* : * 2016/06/27 Victor Zarubkin: Added text shifting relatively to it's parent item. +* : Disabled border lines painting because of vertical lines painting bug. +* : Changed height of blocks. Variable thread-block height. +* : +* : * 2016/06/29 Victor Zarubkin: Highly optimized painting performance and memory consumption. +* : +* : * 2016/06/30 Victor Zarubkin: Replaced doubles with floats (in ProfBlockItem) for less memory consumption. +* : +* : * 2016/09/15 Victor Zarubkin: Moved sources of EasyGraphicsItem and EasyChronometerItem to separate files. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "blocks_graphics_view.h" +#include "easy_graphics_item.h" +#include "easy_chronometer_item.h" +#include "easy_graphics_scrollbar.h" +#include "globals.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +const qreal MIN_SCALE = pow(::profiler_gui::SCALING_COEFFICIENT_INV, 70); // Up to 1000 sec scale +const qreal MAX_SCALE = pow(::profiler_gui::SCALING_COEFFICIENT, 45); // ~23000 --- Up to 10 ns scale +const qreal BASE_SCALE = pow(::profiler_gui::SCALING_COEFFICIENT_INV, 25); // ~0.003 + +EASY_CONSTEXPR uint16_t TIMELINE_ROW_SIZE = 24; + +EASY_CONSTEXPR QRgb BACKGROUND_1 = 0xffe4e4ec; +EASY_CONSTEXPR QRgb BACKGROUND_2 = ::profiler::colors::White; +EASY_CONSTEXPR QRgb TIMELINE_BACKGROUND = 0x20000000 | (::profiler::colors::Grey800 & 0x00ffffff);// 0x20303030; +EASY_CONSTEXPR QRgb TIMELINE_BORDER = 0xffa8a0a0; + +EASY_CONSTEXPR int IDLE_TIMER_INTERVAL = 200; // 5Hz +EASY_CONSTEXPR uint64_t IDLE_TIME = 400; + +EASY_CONSTEXPR int FLICKER_INTERVAL = 10; // 100Hz +EASY_CONSTEXPR qreal FLICKER_FACTOR = 16.0 / FLICKER_INTERVAL; + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +using estd::clamp; + +////////////////////////////////////////////////////////////////////////// + +EasyBoldLabel::EasyBoldLabel(const QString& _text, QWidget* _parent) : QLabel(_text, _parent) +{ + auto f = font(); + f.setBold(true); + setFont(f); +} + +EasyBoldLabel::~EasyBoldLabel() +{ + +} + +////////////////////////////////////////////////////////////////////////// + +void EasyBackgroundItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*, QWidget*) +{ + auto const sceneView = static_cast(scene()->parent()); + const auto visibleSceneRect = sceneView->visibleSceneRect(); + const auto currentScale = sceneView->scale(); + const auto offset = sceneView->offset(); + const auto left = offset * currentScale; + const auto h = visibleSceneRect.height(); + const auto visibleBottom = h - 1; + const auto borderColor = QColor::fromRgb(TIMELINE_BORDER); + const auto textShiftY = h + TIMELINE_ROW_SIZE - 5; + + QRectF rect; + + _painter->save(); + _painter->setTransform(QTransform::fromTranslate(-x(), -y())); + + const auto& items = sceneView->getItems(); + if (!items.empty()) + { + static const uint16_t OVERLAP = ::profiler_gui::THREADS_ROW_SPACING >> 1; + static const QBrush brushes[2] = {QColor::fromRgb(BACKGROUND_1), QColor::fromRgb(BACKGROUND_2)}; + int i = -1; + + // Draw background + _painter->setPen(::profiler_gui::SYSTEM_BORDER_COLOR); + for (auto item : items) + { + ++i; + + auto br = item->boundingRect(); + auto top = item->y() + br.top() - visibleSceneRect.top(); + auto bottom = top + br.height(); + + if (top > h || bottom < 0) + continue; + + if (item->threadId() == EASY_GLOBALS.selected_thread) + _painter->setBrush(QBrush(QColor::fromRgb(::profiler_gui::SELECTED_THREAD_BACKGROUND))); + else + _painter->setBrush(brushes[i & 1]); + + rect.setRect(0, top - OVERLAP, visibleSceneRect.width(), br.height() + ::profiler_gui::THREADS_ROW_SPACING); + const auto dh = rect.bottom() - visibleBottom; + if (dh > 0) + rect.setHeight(rect.height() - dh); + + if (rect.top() < 0) + rect.setTop(0); + + _painter->drawRect(rect); + } + } + + // Draw timeline scale marks ---------------- + _painter->setBrush(QColor::fromRgba(TIMELINE_BACKGROUND)); + + const auto sceneStep = sceneView->timelineStep(); + const auto factor = ::profiler_gui::timeFactor(sceneStep); + const auto step = sceneStep * currentScale; + auto first = static_cast(offset / sceneStep); + const int odd = first & 1; + const auto nsteps = (1 + odd) * 2 + static_cast(visibleSceneRect.width() / step); + first -= odd; + + QPen pen(borderColor); + pen.setWidth(2); + _painter->setPen(pen); + _painter->drawLine(QPointF(0, h), QPointF(visibleSceneRect.width(), h)); + _painter->setPen(borderColor); + + QLineF marks[20]; + qreal first_x = first * sceneStep; + const auto textWidth = QFontMetricsF(_painter->font(), sceneView).width(QString::number(static_cast(0.5 + first_x * factor))) * ::profiler_gui::FONT_METRICS_FACTOR + 10; + const int n = 1 + static_cast(textWidth / step); + int next = first % n; + if (next) + next = n - next; + + first_x *= currentScale; + for (int i = 0; i < nsteps; ++i, --next) + { + auto current = first_x - left + step * i; + + if ((i & 1) == 0) + { + rect.setRect(current, 0, step, h); + _painter->drawRect(rect); + + for (int j = 0; j < 20; ++j) + { + auto xmark = current + j * step * 0.1; + marks[j].setLine(xmark, h, xmark, h + ((j % 5) ? 4 : 8)); + } + + _painter->drawLines(marks, 20); + } + + if (next <= 0) + { + next = n; + _painter->setPen(::profiler_gui::TEXT_COLOR); + _painter->drawText(QPointF(current + 1, textShiftY), + QString::number(static_cast(0.5 + (current + left) * factor / currentScale))); + _painter->setPen(borderColor); + } + + // TEST + // this is for testing (order of lines will be painted): + //_painter->setPen(Qt::black); + //_painter->drawText(QPointF(current + step * 0.4, h - 20), QString::number(i)); + //_painter->setPen(Qt::gray); + // TEST + } + // END Draw timeline scale marks ~~~~~~~~~~~~ + + _painter->restore(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTimelineIndicatorItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*, QWidget*) +{ + const auto sceneView = static_cast(scene()->parent()); + const auto visibleSceneRect = sceneView->visibleSceneRect(); + const auto step = sceneView->timelineStep() * sceneView->scale(); + const QString text = ::profiler_gui::autoTimeStringInt(units2microseconds(sceneView->timelineStep())); // Displayed text + + // Draw scale indicator + _painter->save(); + _painter->setTransform(QTransform::fromTranslate(-x(), -y())); + //_painter->setCompositionMode(QPainter::CompositionMode_Difference); + _painter->setBrush(Qt::NoBrush); + + QPen pen(Qt::black); + pen.setWidth(3); + _painter->setPen(pen); + + _painter->drawLine(QLineF(visibleSceneRect.width() - 9 - step, visibleSceneRect.height() - 10, visibleSceneRect.width() - 11, visibleSceneRect.height() - 10)); + + _painter->setPen(Qt::black); + _painter->drawLine(QLineF(visibleSceneRect.width() - 10 - step, visibleSceneRect.height() - 6, visibleSceneRect.width() - 10 - step, visibleSceneRect.height() - 14)); + _painter->drawLine(QLineF(visibleSceneRect.width() - 10, visibleSceneRect.height() - 6, visibleSceneRect.width() - 10, visibleSceneRect.height() - 14)); + + _painter->setPen(Qt::black); + _painter->setFont(EASY_GLOBALS.bg_font); + _painter->drawText(QRectF(visibleSceneRect.width() - 10 - step, visibleSceneRect.height() - 63, step, 50), Qt::AlignRight | Qt::AlignBottom | Qt::TextDontClip, text); + + _painter->restore(); +} + +////////////////////////////////////////////////////////////////////////// + +EasyGraphicsView::EasyGraphicsView(QWidget* _parent) + : Parent(_parent) + , m_beginTime(::std::numeric_limits::max()) + , m_sceneWidth(0) + , m_scale(1) + , m_offset(0) + , m_timelineStep(0) + , m_idleTime(0) + , m_mouseButtons(Qt::NoButton) + , m_pScrollbar(nullptr) + , m_chronometerItem(nullptr) + , m_chronometerItemAux(nullptr) + , m_popupWidget(nullptr) + , m_flickerSpeedX(0) + , m_flickerSpeedY(0) + , m_flickerCounterX(0) + , m_flickerCounterY(0) + , m_bDoubleClick(false) + , m_bUpdatingRect(false) + , m_bEmpty(true) +{ + initMode(); + setScene(new QGraphicsScene(this)); + updateVisibleSceneRect(); +} + +EasyGraphicsView::~EasyGraphicsView() +{ +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::removePopup(bool _removeFromScene) +{ + if (m_popupWidget != nullptr) + { + auto widget = m_popupWidget->widget(); + widget->setParent(nullptr); + m_popupWidget->setWidget(nullptr); + delete widget; + + if (_removeFromScene) + scene()->removeItem(m_popupWidget); + + m_popupWidget = nullptr; + } +} + +////////////////////////////////////////////////////////////////////////// + +qreal EasyGraphicsView::sceneWidth() const +{ + return m_sceneWidth; +} + +qreal EasyGraphicsView::chronoTime() const +{ + return m_chronometerItem->width(); +} + +qreal EasyGraphicsView::chronoTimeAux() const +{ + return m_chronometerItemAux->width(); +} + +////////////////////////////////////////////////////////////////////////// + +EasyChronometerItem* EasyGraphicsView::createChronometer(bool _main) +{ + auto chronoItem = new EasyChronometerItem(_main); + chronoItem->setColor(_main ? ::profiler_gui::CHRONOMETER_COLOR : ::profiler_gui::CHRONOMETER_COLOR2); + chronoItem->setBoundingRect(sceneRect()); + chronoItem->hide(); + scene()->addItem(chronoItem); + + return chronoItem; +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::clear() +{ + const QSignalBlocker blocker(this), sceneBlocker(scene()); // block all scene signals (otherwise clear() would be extremely slow!) + + // Stop flicking + m_flickerTimer.stop(); + m_flickerSpeedX = 0; + m_flickerSpeedY = 0; + m_flickerCounterX = 0; + m_flickerCounterY = 0; + + // Clear all items + removePopup(); + scene()->clear(); + m_items.clear(); + m_selectedBlocks.clear(); + + m_beginTime = ::std::numeric_limits::max(); // reset begin time + m_scale = 1; // scale back to initial 100% scale + m_timelineStep = 1; + m_offset = 0; // scroll back to the beginning of the scene + + m_idleTimer.stop(); + m_idleTime = 0; + + // Reset necessary flags + m_bEmpty = true; + + m_sceneWidth = 10; + setSceneRect(0, 0, 10, 10); + + // notify ProfTreeWidget that selection was reset + emit intervalChanged(m_selectedBlocks, m_beginTime, 0, 0, false); +} + +void EasyGraphicsView::setTree(const ::profiler::thread_blocks_tree_t& _blocksTree) +{ + // clear scene + clear(); + + if (_blocksTree.empty()) + { + return; + } + + auto bgItem = new EasyBackgroundItem(); + scene()->addItem(bgItem); + + // set new blocks tree + // calculate scene size and fill it with items + + // Calculating start and end time + ::profiler::timestamp_t finish = 0, busyTime = 0; + ::profiler::thread_id_t longestTree = 0, mainTree = 0; + for (const auto& threadTree : _blocksTree) + { + const auto& t = threadTree.second; + + auto timestart = m_beginTime; + auto timefinish = finish; + + if (!t.children.empty()) + timestart = easyBlocksTree(t.children.front()).node->begin(); + if (!t.sync.empty()) + timestart = ::std::min(timestart, easyBlocksTree(t.sync.front()).node->begin()); + + if (!t.children.empty()) + timefinish = easyBlocksTree(t.children.back()).node->end(); + if (!t.sync.empty()) + timefinish = ::std::max(timefinish, easyBlocksTree(t.sync.back()).node->end()); + + if (m_beginTime > timestart) + m_beginTime = timestart; + + if (finish < timefinish) + finish = timefinish; + + if (t.profiled_time > busyTime) { + busyTime = t.profiled_time; + longestTree = threadTree.first; + } + + if (mainTree == 0 && strcmp(t.name(), "Main") == 0) + mainTree = threadTree.first; + } + + const decltype(m_beginTime) additional_offset = (finish - m_beginTime) / 20; // Additional 5% before first block and after last block + finish += additional_offset; + m_beginTime -= ::std::min(m_beginTime, additional_offset); + EASY_GLOBALS.begin_time = m_beginTime; + + // Sort threads by name + ::std::vector<::std::reference_wrapper > sorted_roots; + sorted_roots.reserve(_blocksTree.size()); + for (const auto& threadTree : _blocksTree) + sorted_roots.push_back(threadTree.second); + ::std::sort(sorted_roots.begin(), sorted_roots.end(), [](const ::profiler::BlocksTreeRoot& _a, const ::profiler::BlocksTreeRoot& _b) { + return _a.thread_name < _b.thread_name; + }); + + // Filling scene with items + m_items.reserve(_blocksTree.size()); + qreal y = TIMELINE_ROW_SIZE; + const EasyGraphicsItem *longestItem = nullptr, *mainThreadItem = nullptr; + for (const ::profiler::BlocksTreeRoot& t : sorted_roots) + { + if (m_items.size() == 0xff) + { + qWarning() << "Warning: Maximum threads number (255 threads) exceeded! See EasyGraphicsView::setTree() : " << __LINE__ << " in file " << __FILE__; + break; + } + + // fill scene with new items + qreal h = 0, x = 0; + + if (!t.children.empty()) + x = time2position(easyBlocksTree(t.children.front()).node->begin()); + else if (!t.sync.empty()) + x = time2position(easyBlocksTree(t.sync.front()).node->begin()); + + auto item = new EasyGraphicsItem(static_cast(m_items.size()), t); + if (t.depth) + item->setLevels(t.depth); + item->setPos(0, y); + + qreal children_duration = 0; + + if (!t.children.empty()) + { + uint32_t dummy = 0; + children_duration = setTree(item, t.children, h, dummy, y, 0); + } + else + { + if (!t.sync.empty()) + children_duration = time2position(easyBlocksTree(t.sync.back()).node->end()) - x; + h = ::profiler_gui::GRAPHICS_ROW_SIZE; + } + + item->setBoundingRect(0, 0, children_duration + x, h); + m_items.push_back(item); + scene()->addItem(item); + + y += h + ::profiler_gui::THREADS_ROW_SPACING; + + if (longestTree == t.thread_id) + longestItem = item; + + if (mainTree == t.thread_id) + mainThreadItem = item; + } + + // Calculating scene rect + m_sceneWidth = time2position(finish); + setSceneRect(0, 0, m_sceneWidth, y + TIMELINE_ROW_SIZE); + + EASY_GLOBALS.scene_left = 0; + EASY_GLOBALS.scene_right = m_sceneWidth; + emit EASY_GLOBALS.events.sceneSizeChanged(); + + // Center view on the beginning of the scene + updateVisibleSceneRect(); + setScrollbar(m_pScrollbar); + + // Create new chronometer item (previous item was destroyed by scene on scene()->clear()). + // It will be shown on mouse right button click. + m_chronometerItemAux = createChronometer(false); + m_chronometerItem = createChronometer(true); + + bgItem->setBoundingRect(0, 0, m_sceneWidth, y); + auto indicator = new EasyTimelineIndicatorItem(); + indicator->setBoundingRect(0, 0, m_sceneWidth, y); + scene()->addItem(indicator); + + // Setting flags + m_bEmpty = false; + + scaleTo(BASE_SCALE); + + + emit treeChanged(); + + if (mainThreadItem != nullptr) + { + longestItem = mainThreadItem; + } + + if (longestItem != nullptr) + { + EASY_GLOBALS.selected_thread = longestItem->threadId(); + emit EASY_GLOBALS.events.selectedThreadChanged(longestItem->threadId()); + + scrollTo(longestItem); + m_pScrollbar->setHistogramSource(longestItem->threadId(), longestItem->items(0)); + if (!longestItem->items(0).empty()) + m_pScrollbar->setValue(longestItem->items(0).front().left() - m_pScrollbar->sliderWidth() * 0.25); + } + + m_idleTimer.start(IDLE_TIMER_INTERVAL); +} + +const EasyGraphicsView::Items &EasyGraphicsView::getItems() const +{ + return m_items; +} + +qreal EasyGraphicsView::setTree(EasyGraphicsItem* _item, const ::profiler::BlocksTree::children_t& _children, qreal& _height, uint32_t& _maxDepthChild, qreal _y, short _level) +{ + if (_children.empty()) + { + return 0; + } + + const auto level = static_cast(_level); + const auto n = static_cast(_children.size()); + _item->reserve(level, n); + + _maxDepthChild = 0; + uint8_t maxDepth = 0; + const short next_level = _level + 1; + bool warned = false; + qreal total_duration = 0, prev_end = 0, maxh = 0; + qreal start_time = -1; + uint32_t j = 0; + for (auto child_index : _children) + { + auto& gui_block = easyBlock(child_index); + const auto& child = gui_block.tree; + if (child.depth > maxDepth) + { + maxDepth = child.depth; + _maxDepthChild = j; + } + + auto xbegin = time2position(child.node->begin()); + if (start_time < 0) + { + start_time = xbegin; + } + + auto duration = time2position(child.node->end()) - xbegin; + + //const auto dt = xbegin - prev_end; + //if (dt < 0) + //{ + // duration += dt; + // xbegin -= dt; + //} + + //static const qreal MIN_DURATION = 0.25; + //if (duration < MIN_DURATION) + // duration = MIN_DURATION; + + const auto i = _item->addItem(level); + auto& b = _item->getItem(level, i); + + gui_block.graphics_item = _item->index(); + gui_block.graphics_item_level = level; + gui_block.graphics_item_index = i; + + if (next_level < 256 && next_level < _item->levels() && !child.children.empty()) + { + b.children_begin = static_cast(_item->items(static_cast(next_level)).size()); + } + else + { + ::profiler_gui::set_max(b.children_begin); + } + + qreal h = 0; + qreal children_duration = 0; + uint32_t maxDepthChild = 0; + + if (next_level < 256) + { + children_duration = setTree(_item, child.children, h, maxDepthChild, _y + ::profiler_gui::GRAPHICS_ROW_SIZE_FULL, next_level); + } + else if (!child.children.empty() && !warned) + { + warned = true; + qWarning() << "Warning: Maximum blocks depth (255) exceeded! See EasyGraphicsView::setTree() : " << __LINE__ << " in file " << __FILE__; + } + + if (duration < children_duration) + { + duration = children_duration; + } + + if (h > maxh) + { + maxh = h; + } + + b.block = child_index;// &child; + +#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + b.neighbours = n; + b.state = j > 0 || level == 0 ? 0 : -1; +#else + b.max_depth_child = maxDepthChild; +#endif + + b.setPos(xbegin, duration); + //b.totalHeight = ::profiler_gui::GRAPHICS_ROW_SIZE + h; + + prev_end = xbegin + duration; + total_duration = prev_end - start_time; + + ++j; + } + + _height += ::profiler_gui::GRAPHICS_ROW_SIZE_FULL + maxh; + + return total_duration; +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::setScrollbar(EasyGraphicsScrollbar* _scrollbar) +{ + auto const prevScrollbar = m_pScrollbar; + const bool makeConnect = prevScrollbar == nullptr || prevScrollbar != _scrollbar; + + if (prevScrollbar != nullptr && prevScrollbar != _scrollbar) + { + disconnect(prevScrollbar, &EasyGraphicsScrollbar::valueChanged, this, &This::onGraphicsScrollbarValueChange); + disconnect(prevScrollbar, &EasyGraphicsScrollbar::wheeled, this, &This::onGraphicsScrollbarWheel); + } + + m_pScrollbar = _scrollbar; + m_pScrollbar->clear(); + m_pScrollbar->setRange(0, m_sceneWidth); + + auto vbar = verticalScrollBar(); + const int vbar_width = (vbar != nullptr && vbar->isVisible() ? vbar->width() + 2 : 0); + m_pScrollbar->setSliderWidth(m_visibleSceneRect.width() + vbar_width); + + if (makeConnect) + { + connect(m_pScrollbar, &EasyGraphicsScrollbar::valueChanged, this, &This::onGraphicsScrollbarValueChange); + connect(m_pScrollbar, &EasyGraphicsScrollbar::wheeled, this, &This::onGraphicsScrollbarWheel); + } + + EASY_GLOBALS.selected_thread = 0; + emit EASY_GLOBALS.events.selectedThreadChanged(0); +} + +////////////////////////////////////////////////////////////////////////// + +int EasyGraphicsView::updateVisibleSceneRect() +{ + m_visibleSceneRect = mapToScene(rect()).boundingRect(); + + auto vbar = verticalScrollBar(); + int vbar_width = 0; + if (vbar != nullptr && vbar->isVisible()) + vbar_width = vbar->width() + 2; + + m_visibleSceneRect.setWidth(m_visibleSceneRect.width() - vbar_width); + m_visibleSceneRect.setHeight(m_visibleSceneRect.height() - TIMELINE_ROW_SIZE); + + return vbar_width; +} + +void EasyGraphicsView::updateTimelineStep(qreal _windowWidth) +{ + const auto time = units2microseconds(_windowWidth); + if (time < 100) + m_timelineStep = 1e-2; + else if (time < 10e3) + m_timelineStep = 1; + else if (time < 10e6) + m_timelineStep = 1e3; + else + m_timelineStep = 1e6; + + const auto optimal_steps = static_cast(40 * m_visibleSceneRect.width() / 1500); + auto steps = time / m_timelineStep; + while (steps > optimal_steps) { + m_timelineStep *= 10; + steps *= 0.1; + } + + m_timelineStep = microseconds2units(m_timelineStep); +} + +void EasyGraphicsView::repaintScene() +{ + scene()->update(m_visibleSceneRect); + emit sceneUpdated(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::scaleTo(qreal _scale) +{ + if (m_bEmpty) + { + return; + } + + // have to limit scale because of Qt's QPainter feature: it doesn't draw text + // with very big coordinates (but it draw rectangles with the same coordinates good). + m_scale = clamp(MIN_SCALE, _scale, MAX_SCALE); + const int vbar_width = updateVisibleSceneRect(); + + // Update slider width for scrollbar + const auto windowWidth = (m_visibleSceneRect.width() + vbar_width) / m_scale; + m_pScrollbar->setSliderWidth(windowWidth); + + updateTimelineStep(windowWidth); + repaintScene(); +} + +void EasyGraphicsView::wheelEvent(QWheelEvent* _event) +{ + m_idleTime = 0; + + if (!m_bEmpty) + onWheel(mapToScene(_event->pos()).x(), _event->delta()); + _event->accept(); +} + +void EasyGraphicsView::onGraphicsScrollbarWheel(qreal _mouseX, int _wheelDelta) +{ + m_idleTime = 0; + + for (auto item : m_items) + { + if (item->threadId() == EASY_GLOBALS.selected_thread) + { + scrollTo(item); + break; + } + } + + onWheel(_mouseX, _wheelDelta); +} + +void EasyGraphicsView::scrollTo(const EasyGraphicsItem* _item) +{ + m_bUpdatingRect = true; + auto vbar = verticalScrollBar(); + vbar->setValue(_item->y() + (_item->boundingRect().height() - vbar->pageStep()) * 0.5); + m_bUpdatingRect = false; +} + +void EasyGraphicsView::onWheel(qreal _mouseX, int _wheelDelta) +{ + const decltype(m_scale) scaleCoeff = _wheelDelta > 0 ? ::profiler_gui::SCALING_COEFFICIENT : ::profiler_gui::SCALING_COEFFICIENT_INV; + + // Remember current mouse position + _mouseX = clamp(0., _mouseX, m_sceneWidth); + const auto mousePosition = m_offset + _mouseX / m_scale; + + // have to limit scale because of Qt's QPainter feature: it doesn't draw text + // with very big coordinates (but it draw rectangles with the same coordinates good). + m_scale = clamp(MIN_SCALE, m_scale * scaleCoeff, MAX_SCALE); + + //updateVisibleSceneRect(); // Update scene rect + + // Update slider width for scrollbar + auto vbar = verticalScrollBar(); + const int vbar_width = (vbar != nullptr && vbar->isVisible() ? vbar->width() + 2 : 0); + const auto windowWidth = (m_visibleSceneRect.width() + vbar_width) / m_scale; + m_pScrollbar->setSliderWidth(windowWidth); + + // Calculate new offset to simulate QGraphicsView::AnchorUnderMouse scaling behavior + m_offset = clamp(0., mousePosition - _mouseX / m_scale, m_sceneWidth - windowWidth); + + // Update slider position + m_bUpdatingRect = true; // To be sure that updateVisibleSceneRect will not be called by scrollbar change + m_pScrollbar->setValue(m_offset); + m_bUpdatingRect = false; + + updateVisibleSceneRect(); // Update scene rect + updateTimelineStep(windowWidth); + repaintScene(); // repaint scene +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::mousePressEvent(QMouseEvent* _event) +{ + m_idleTime = 0; + + if (m_bEmpty) + { + _event->accept(); + return; + } + + m_mouseButtons = _event->buttons(); + m_mousePressPos = _event->pos(); + + if (m_mouseButtons & Qt::LeftButton) + { + if (m_chronometerItemAux->isVisible() && (m_chronometerItemAux->hoverLeft() || m_chronometerItemAux->hoverRight())) + { + m_chronometerItemAux->setReverse(m_chronometerItemAux->hoverLeft()); + m_bDoubleClick = true; + } + else if (m_chronometerItem->isVisible() && (m_chronometerItem->hoverLeft() || m_chronometerItem->hoverRight())) + { + m_chronometerItem->setReverse(m_chronometerItem->hoverLeft()); + m_mouseButtons = Qt::RightButton; + return; + } + } + + if (m_mouseButtons & Qt::RightButton) + { + if (m_chronometerItem->isVisible() && (m_chronometerItem->hoverLeft() || m_chronometerItem->hoverRight())) + { + m_chronometerItem->setReverse(m_chronometerItem->hoverLeft()); + } + else + { + const auto mouseX = m_offset + mapToScene(m_mousePressPos).x() / m_scale; + m_chronometerItem->setLeftRight(mouseX, mouseX); + m_chronometerItem->hide(); + m_pScrollbar->hideChrono(); + } + } + + _event->accept(); +} + +void EasyGraphicsView::mouseDoubleClickEvent(QMouseEvent* _event) +{ + m_idleTime = 0; + + if (m_bEmpty) + { + _event->accept(); + return; + } + + m_mouseButtons = _event->buttons(); + m_mousePressPos = _event->pos(); + m_bDoubleClick = true; + + if (m_mouseButtons & Qt::LeftButton) + { + const auto mouseX = m_offset + mapToScene(m_mousePressPos).x() / m_scale; + m_chronometerItemAux->setLeftRight(mouseX, mouseX); + m_chronometerItemAux->hide(); + emit sceneUpdated(); + } + + _event->accept(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::mouseReleaseEvent(QMouseEvent* _event) +{ + m_idleTime = 0; + + if (m_bEmpty) + { + _event->accept(); + return; + } + + bool chronoHidden = false; + bool changedSelection = false, changedSelectedItem = false; + if (m_mouseButtons & Qt::RightButton) + { + if (m_chronometerItem->isVisible() && m_chronometerItem->width() < 1e-6) + { + m_chronometerItem->hide(); + m_pScrollbar->hideChrono(); + } + + if (!m_selectedBlocks.empty()) + { + changedSelection = true; + m_selectedBlocks.clear(); + } + + if (m_chronometerItem->isVisible()) + { + //printf("INTERVAL: {%lf, %lf} ms\n", m_chronometerItem->left(), m_chronometerItem->right()); + + for (auto item : m_items) + { + if (!EASY_GLOBALS.only_current_thread_hierarchy || item->threadId() == EASY_GLOBALS.selected_thread) + item->getBlocks(m_chronometerItem->left(), m_chronometerItem->right(), m_selectedBlocks); + } + + if (!m_selectedBlocks.empty()) + { + changedSelection = true; + } + } + } + + const ::profiler_gui::EasyBlock* selectedBlock = nullptr; + ::profiler::thread_id_t selectedBlockThread = 0; + const auto previouslySelectedBlock = EASY_GLOBALS.selected_block; + if (m_mouseButtons & Qt::LeftButton) + { + bool clicked = false; + + if (m_chronometerItemAux->isVisible() && m_chronometerItemAux->width() < 1e-6) + { + chronoHidden = true; + m_chronometerItemAux->hide(); + } + else if (m_chronometerItem->isVisible() && m_chronometerItem->hoverIndicator()) + { + // Jump to selected zone + clicked = true; + m_flickerSpeedX = m_flickerSpeedY = 0; + m_pScrollbar->setValue(m_chronometerItem->left() + m_chronometerItem->width() * 0.5 - m_pScrollbar->sliderHalfWidth()); + } + + if (!clicked && m_mouseMovePath.manhattanLength() < 5) + { + // Handle Click + + //clicked = true; + auto mouseClickPos = mapToScene(m_mousePressPos); + if (mouseClickPos.x() >= 0) + { + mouseClickPos.setX(m_offset + mouseClickPos.x() / m_scale); + + // Try to select one of item blocks + for (auto item : m_items) + { + ::profiler::block_index_t i = ~0U; + auto block = item->intersect(mouseClickPos, i); + if (block) + { + changedSelectedItem = true; + selectedBlock = block; + selectedBlockThread = item->threadId(); + EASY_GLOBALS.selected_block = i; + EASY_GLOBALS.selected_block_id = easyBlock(i).tree.node->id(); + break; + } + } + + if (!changedSelectedItem && !::profiler_gui::is_max(EASY_GLOBALS.selected_block)) + { + changedSelectedItem = true; + ::profiler_gui::set_max(EASY_GLOBALS.selected_block); + ::profiler_gui::set_max(EASY_GLOBALS.selected_block_id); + } + } + } + } + + m_bDoubleClick = false; + m_mouseButtons = _event->buttons(); + m_mouseMovePath = QPoint(); + _event->accept(); + + if (changedSelection) + { + emit intervalChanged(m_selectedBlocks, m_beginTime, position2time(m_chronometerItem->left()), position2time(m_chronometerItem->right()), m_chronometerItem->reverse()); + } + + if (changedSelectedItem) + { + m_bUpdatingRect = true; + if (selectedBlock != nullptr && previouslySelectedBlock == EASY_GLOBALS.selected_block && !selectedBlock->tree.children.empty()) + { + EASY_GLOBALS.gui_blocks[previouslySelectedBlock].expanded = !EASY_GLOBALS.gui_blocks[previouslySelectedBlock].expanded; + emit EASY_GLOBALS.events.itemsExpandStateChanged(); + } + emit EASY_GLOBALS.events.selectedBlockChanged(EASY_GLOBALS.selected_block); + + if (EASY_GLOBALS.selecting_block_changes_thread && selectedBlock != nullptr && EASY_GLOBALS.selected_thread != selectedBlockThread) + { + EASY_GLOBALS.selected_thread = selectedBlockThread; + + m_pScrollbar->lock(); + emit EASY_GLOBALS.events.selectedThreadChanged(EASY_GLOBALS.selected_thread); + m_pScrollbar->unlock(); + } + m_bUpdatingRect = false; + + if (selectedBlock != nullptr && selectedBlockThread == EASY_GLOBALS.selected_thread) + m_pScrollbar->setHistogramSource(EASY_GLOBALS.selected_thread, EASY_GLOBALS.selected_block_id); + else + { + for (auto item : m_items) + { + if (item->threadId() == EASY_GLOBALS.selected_thread) + { + m_pScrollbar->setHistogramSource(EASY_GLOBALS.selected_thread, item->items(0)); + break; + } + } + } + + repaintScene(); + } + else if (chronoHidden) + { + emit sceneUpdated(); + } +} + +////////////////////////////////////////////////////////////////////////// + +bool EasyGraphicsView::moveChrono(EasyChronometerItem* _chronometerItem, qreal _mouseX) +{ + if (_chronometerItem->reverse()) + { + if (_mouseX > _chronometerItem->right()) + { + _chronometerItem->setReverse(false); + _chronometerItem->setLeftRight(_chronometerItem->right(), _mouseX); + + if (_chronometerItem->hoverLeft()) + { + _chronometerItem->setHoverLeft(false); + _chronometerItem->setHoverRight(true); + } + } + else + { + _chronometerItem->setLeftRight(_mouseX, _chronometerItem->right()); + } + } + else + { + if (_mouseX < _chronometerItem->left()) + { + _chronometerItem->setReverse(true); + _chronometerItem->setLeftRight(_mouseX, _chronometerItem->left()); + + if (_chronometerItem->hoverRight()) + { + _chronometerItem->setHoverLeft(true); + _chronometerItem->setHoverRight(false); + } + } + else + { + _chronometerItem->setLeftRight(_chronometerItem->left(), _mouseX); + } + } + + if (!_chronometerItem->isVisible() && _chronometerItem->width() > 1e-6) + { + _chronometerItem->show(); + return true; + } + + return false; +} + +void EasyGraphicsView::mouseMoveEvent(QMouseEvent* _event) +{ + m_idleTime = 0; + + if (m_bEmpty || (m_mouseButtons == 0 && !m_chronometerItem->isVisible() && !m_chronometerItemAux->isVisible())) + { + _event->accept(); + return; + } + + bool needUpdate = false; + const auto pos = _event->pos(); + const auto delta = pos - m_mousePressPos; + m_mousePressPos = pos; + + if (m_mouseButtons != 0) + { + m_mouseMovePath.setX(m_mouseMovePath.x() + qAbs(delta.x())); + m_mouseMovePath.setY(m_mouseMovePath.y() + qAbs(delta.y())); + } + + auto mouseScenePos = mapToScene(m_mousePressPos); + mouseScenePos.setX(m_offset + mouseScenePos.x() / m_scale); + const auto x = clamp(0., mouseScenePos.x(), m_sceneWidth); + + if (m_mouseButtons & Qt::RightButton) + { + bool showItem = moveChrono(m_chronometerItem, x); + m_pScrollbar->setChronoPos(m_chronometerItem->left(), m_chronometerItem->right()); + + if (showItem) + { + m_pScrollbar->showChrono(); + } + + needUpdate = true; + } + + if (m_mouseButtons & Qt::LeftButton) + { + if (m_bDoubleClick) + { + moveChrono(m_chronometerItemAux, x); + } + else + { + auto vbar = verticalScrollBar(); + + m_bUpdatingRect = true; // Block scrollbars from updating scene rect to make it possible to do it only once + vbar->setValue(vbar->value() - delta.y()); + m_pScrollbar->setValue(m_pScrollbar->value() - delta.x() / m_scale); + m_bUpdatingRect = false; + // Seems like an ugly stub, but QSignalBlocker is also a bad decision + // because if scrollbar does not emit valueChanged signal then viewport does not move + + updateVisibleSceneRect(); // Update scene visible rect only once + + // Update flicker speed + m_flickerSpeedX += delta.x() >> 1; + m_flickerSpeedY += delta.y(); + if (!m_flickerTimer.isActive()) + { + // If flicker timer is not started, then start it + m_flickerTimer.start(FLICKER_INTERVAL); + } + } + + needUpdate = true; + } + + if (m_mouseButtons == 0) + { + if (m_chronometerItem->isVisible()) + { + auto prevValue = m_chronometerItem->hoverIndicator(); + m_chronometerItem->setHoverIndicator(m_chronometerItem->indicatorContains(mouseScenePos)); + needUpdate = needUpdate || (prevValue != m_chronometerItem->hoverIndicator()); + + prevValue = m_chronometerItem->hoverLeft(); + m_chronometerItem->setHoverLeft(m_chronometerItem->hoverLeft(mouseScenePos.x())); + needUpdate = needUpdate || (prevValue != m_chronometerItem->hoverLeft()); + + if (!m_chronometerItem->hoverLeft()) + { + prevValue = m_chronometerItem->hoverRight(); + m_chronometerItem->setHoverRight(m_chronometerItem->hoverRight(mouseScenePos.x())); + needUpdate = needUpdate || (prevValue != m_chronometerItem->hoverRight()); + } + } + + if (m_chronometerItemAux->isVisible()) + { + auto prevValue = m_chronometerItemAux->hoverLeft(); + m_chronometerItemAux->setHoverLeft(m_chronometerItemAux->hoverLeft(mouseScenePos.x())); + needUpdate = needUpdate || (prevValue != m_chronometerItemAux->hoverLeft()); + + if (!m_chronometerItemAux->hoverLeft()) + { + prevValue = m_chronometerItemAux->hoverRight(); + m_chronometerItemAux->setHoverRight(m_chronometerItemAux->hoverRight(mouseScenePos.x())); + needUpdate = needUpdate || (prevValue != m_chronometerItemAux->hoverRight()); + } + } + } + + if (needUpdate) + { + repaintScene(); // repaint scene + } + + _event->accept(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::keyPressEvent(QKeyEvent* _event) +{ + static const int KeyStep = 100; + + const int key = _event->key(); + m_idleTime = 0; + + switch (key) + { + case Qt::Key_Right: + case Qt::Key_6: + { + m_pScrollbar->setValue(m_pScrollbar->value() + KeyStep / m_scale); + break; + } + + case Qt::Key_Left: + case Qt::Key_4: + { + m_pScrollbar->setValue(m_pScrollbar->value() - KeyStep / m_scale); + break; + } + + case Qt::Key_Up: + case Qt::Key_8: + { + auto vbar = verticalScrollBar(); + vbar->setValue(vbar->value() - KeyStep); + break; + } + + case Qt::Key_Down: + case Qt::Key_2: + { + auto vbar = verticalScrollBar(); + vbar->setValue(vbar->value() + KeyStep); + break; + } + + case Qt::Key_Plus: + case Qt::Key_Equal: + { + onWheel(mapToScene(mapFromGlobal(QCursor::pos())).x(), KeyStep); + break; + } + + case Qt::Key_Minus: + { + onWheel(mapToScene(mapFromGlobal(QCursor::pos())).x(), -KeyStep); + break; + } + } + + //m_keys.insert(key); + _event->accept(); +} + +void EasyGraphicsView::keyReleaseEvent(QKeyEvent* _event) +{ + //const int key = _event->key(); + m_idleTime = 0; + + //m_keys.erase(key); + _event->accept(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::resizeEvent(QResizeEvent* _event) +{ + Parent::resizeEvent(_event); + + const QRectF previousRect = m_visibleSceneRect; + const int vbar_width = updateVisibleSceneRect(); // Update scene visible rect only once + + // Update slider width for scrollbar + const auto windowWidth = (m_visibleSceneRect.width() + vbar_width) / m_scale; + m_pScrollbar->setSliderWidth(windowWidth); + + // Calculate new offset to save old screen center + const auto deltaWidth = m_visibleSceneRect.width() - previousRect.width(); + m_offset = clamp(0., m_offset - deltaWidth * 0.5 / m_scale, m_sceneWidth - windowWidth); + + // Update slider position + m_bUpdatingRect = true; // To be sure that updateVisibleSceneRect will not be called by scrollbar change + m_pScrollbar->setValue(m_offset); + m_bUpdatingRect = false; + + repaintScene(); // repaint scene +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::initMode() +{ + // TODO: find mode with least number of bugs :) + // There are always some display bugs... + + setCacheMode(QGraphicsView::CacheNone); + setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + setOptimizationFlag(QGraphicsView::DontSavePainterState, true); + + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + connect(verticalScrollBar(), &QScrollBar::valueChanged, this, &This::onScrollbarValueChange); + connect(&m_flickerTimer, &QTimer::timeout, this, &This::onFlickerTimeout); + connect(&m_idleTimer, &QTimer::timeout, this, &This::onIdleTimeout); + + auto globalSignals = &EASY_GLOBALS.events; + connect(globalSignals, &::profiler_gui::EasyGlobalSignals::hierarchyFlagChanged, this, &This::onHierarchyFlagChange); + connect(globalSignals, &::profiler_gui::EasyGlobalSignals::selectedThreadChanged, this, &This::onSelectedThreadChange); + connect(globalSignals, &::profiler_gui::EasyGlobalSignals::selectedBlockChanged, this, &This::onSelectedBlockChange); + connect(globalSignals, &::profiler_gui::EasyGlobalSignals::itemsExpandStateChanged, this, &This::onRefreshRequired); + connect(globalSignals, &::profiler_gui::EasyGlobalSignals::refreshRequired, this, &This::onRefreshRequired); + + connect(globalSignals, &::profiler_gui::EasyGlobalSignals::selectedBlockIdChanged, [this](::profiler::block_id_t) + { + if (::profiler_gui::is_max(EASY_GLOBALS.selected_block_id)) + { + if (EASY_GLOBALS.selected_thread != 0) + { + for (auto item : m_items) + { + if (item->threadId() == EASY_GLOBALS.selected_thread) + { + m_pScrollbar->setHistogramSource(EASY_GLOBALS.selected_thread, item->items(0)); + break; + } + } + } + else + { + m_pScrollbar->setHistogramSource(0, nullptr); + } + } + else + m_pScrollbar->setHistogramSource(EASY_GLOBALS.selected_thread, EASY_GLOBALS.selected_block_id); + onRefreshRequired(); + }); + + connect(globalSignals, &::profiler_gui::EasyGlobalSignals::threadNameDecorationChanged, this, &This::onThreadViewChanged); + connect(globalSignals, &::profiler_gui::EasyGlobalSignals::hexThreadIdChanged, this, &This::onThreadViewChanged); + + connect(globalSignals, &::profiler_gui::EasyGlobalSignals::blocksTreeModeChanged, [this]() + { + if (!m_selectedBlocks.empty()) + emit intervalChanged(m_selectedBlocks, m_beginTime, position2time(m_chronometerItem->left()), position2time(m_chronometerItem->right()), m_chronometerItem->reverse()); + }); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::onThreadViewChanged() +{ + if (m_bEmpty) + return; + + for (auto item : m_items) + item->validateName(); + + emit treeChanged(); + + updateVisibleSceneRect(); + onHierarchyFlagChange(EASY_GLOBALS.only_current_thread_hierarchy); + + repaintScene(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::onScrollbarValueChange(int) +{ + if (!m_bUpdatingRect && !m_bEmpty) + updateVisibleSceneRect(); +} + +void EasyGraphicsView::onGraphicsScrollbarValueChange(qreal _value) +{ + if (!m_bEmpty) + { + m_offset = _value; + if (!m_bUpdatingRect) + { + updateVisibleSceneRect(); + repaintScene(); + } + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::onFlickerTimeout() +{ + ++m_flickerCounterX; + ++m_flickerCounterY; + + if (m_mouseButtons & Qt::LeftButton) + { + // Fast slow-down and stop if mouse button is pressed, no flicking. + m_flickerSpeedX >>= 1; + m_flickerSpeedY >>= 1; + if (m_flickerSpeedX == -1) m_flickerSpeedX = 0; + if (m_flickerSpeedY == -1) m_flickerSpeedY = 0; + } + else + { + // Flick when mouse button is not pressed + + using estd::sign; + using estd::absmin; + + auto vbar = verticalScrollBar(); + + m_bUpdatingRect = true; // Block scrollbars from updating scene rect to make it possible to do it only once + m_pScrollbar->setValue(m_pScrollbar->value() - m_flickerSpeedX / m_scale); + vbar->setValue(vbar->value() - m_flickerSpeedY); + m_bUpdatingRect = false; + // Seems like an ugly stub, but QSignalBlocker is also a bad decision + // because if scrollbar does not emit valueChanged signal then viewport does not move + + updateVisibleSceneRect(); // Update scene visible rect only once + repaintScene(); // repaint scene + + const int dx = static_cast(sign(m_flickerSpeedX) * m_flickerCounterX / FLICKER_FACTOR); + const int dy = static_cast(sign(m_flickerSpeedY) * m_flickerCounterY / FLICKER_FACTOR); + + if (abs(dx) > 0) + { + m_flickerSpeedX -= absmin(dx, m_flickerSpeedX); + m_flickerCounterX = 0; + } + + if (abs(dy) > 0) + { + m_flickerSpeedY -= absmin(dy, m_flickerSpeedY); + m_flickerCounterY = 0; + } + } + + if (m_flickerSpeedX == 0 && m_flickerSpeedY == 0) + { + // Flicker stopped, no timer needed. + m_flickerTimer.stop(); + m_flickerSpeedX = 0; + m_flickerSpeedY = 0; + m_flickerCounterX = 0; + m_flickerCounterY = 0; + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::onIdleTimeout() +{ + m_idleTime += IDLE_TIMER_INTERVAL; + + if (m_idleTime < IDLE_TIME) + { + removePopup(true); + return; + } + + if (m_popupWidget != nullptr) + return; + + auto scenePos = mapToScene(mapFromGlobal(QCursor::pos())); + + if (scenePos.x() < m_visibleSceneRect.left() || scenePos.x() > m_visibleSceneRect.right()) + return; + + if (scenePos.y() < m_visibleSceneRect.top() || scenePos.y() > m_visibleSceneRect.bottom()) + return; + + decltype(scenePos) pos(m_offset + scenePos.x() / m_scale, scenePos.y()); + + // Try to select one of context switches or items + for (auto item : m_items) + { + auto cse = item->intersectEvent(pos); + if (cse != nullptr) + { + const auto& itemBlock = cse->tree; + + auto widget = new QWidget(nullptr, Qt::FramelessWindowHint); + if (widget == nullptr) + return; + + widget->setAttribute(Qt::WA_ShowWithoutActivating, true); + widget->setFocusPolicy(Qt::NoFocus); + + auto lay = new QGridLayout(widget); + if (lay == nullptr) + return; + + int row = 0; + lay->addWidget(new EasyBoldLabel("Context switch event", widget), row, 0, 1, 3, Qt::AlignHCenter); + ++row; + + lay->addWidget(new QLabel("Thread:", widget), row, 0, Qt::AlignRight); + + const char* process_name = ""; + ::profiler::thread_id_t tid = 0; + if (EASY_GLOBALS.version < ::profiler_gui::V130) + { + tid = cse->tree.node->id(); + process_name = cse->tree.node->name(); + } + else + { + tid = cse->tree.cs->tid(); + process_name = cse->tree.cs->name(); + } + + auto it = EASY_GLOBALS.profiler_blocks.find(tid); + + if (it != EASY_GLOBALS.profiler_blocks.end()) + { + if (EASY_GLOBALS.hex_thread_id) + lay->addWidget(new QLabel(QString("0x%1 %2").arg(tid, 0, 16).arg(it->second.name()), widget), row, 1, 1, 2, Qt::AlignLeft); + else + lay->addWidget(new QLabel(QString("%1 %2").arg(tid).arg(it->second.name()), widget), row, 1, 1, 2, Qt::AlignLeft); + } + else if (EASY_GLOBALS.hex_thread_id) + lay->addWidget(new QLabel(QString("0x%1").arg(tid, 0, 16), widget), row, 1, 1, 2, Qt::AlignLeft); + else + lay->addWidget(new QLabel(QString::number(tid), widget), row, 1, 1, 2, Qt::AlignLeft); + ++row; + + lay->addWidget(new QLabel("Process:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(process_name, widget), row, 1, 1, 2, Qt::AlignLeft); + ++row; + + const auto duration = itemBlock.node->duration(); + lay->addWidget(new QLabel("Duration:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, duration, 3), widget), row, 1, 1, 2, Qt::AlignLeft); + ++row; + + if (itemBlock.per_thread_stats) + { + lay->addWidget(new QLabel("Sum:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, itemBlock.per_thread_stats->total_duration, 3), widget), row, 1, 1, 2, Qt::AlignLeft); + ++row; + + lay->addWidget(new EasyBoldLabel("-------- Statistics --------", widget), row, 0, 1, 3, Qt::AlignHCenter); + lay->addWidget(new QLabel("per ", widget), row + 1, 0, Qt::AlignRight); + lay->addWidget(new QLabel("This %:", widget), row + 2, 0, Qt::AlignRight); + lay->addWidget(new QLabel("Sum %:", widget), row + 3, 0, Qt::AlignRight); + lay->addWidget(new QLabel("N Calls:", widget), row + 4, 0, Qt::AlignRight); + + lay->addWidget(new QLabel("Thread", widget), row + 1, 1, Qt::AlignHCenter); + + auto percent = ::profiler_gui::percentReal(duration, item->root()->profiled_time); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 2, 1, Qt::AlignHCenter); + + lay->addWidget(new QLabel(QString::number(::profiler_gui::percent(itemBlock.per_thread_stats->total_duration, item->root()->profiled_time)), widget), row + 3, 1, Qt::AlignHCenter); + + lay->addWidget(new QLabel(QString::number(itemBlock.per_thread_stats->calls_number), widget), row + 4, 1, Qt::AlignHCenter); + + if (itemBlock.per_frame_stats && !::profiler_gui::is_max(itemBlock.per_frame_stats->parent_block)) + { + int col = 2; + auto frame_duration = easyBlocksTree(itemBlock.per_frame_stats->parent_block).node->duration(); + + lay->addWidget(new QLabel("Frame", widget), row + 1, col, Qt::AlignHCenter); + + percent = ::profiler_gui::percentReal(duration, frame_duration); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 2, col, Qt::AlignHCenter); + + percent = ::profiler_gui::percentReal(itemBlock.per_frame_stats->total_duration, frame_duration); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 3, col, Qt::AlignHCenter); + + lay->addWidget(new QLabel(QString::number(itemBlock.per_frame_stats->calls_number), widget), row + 4, col, Qt::AlignHCenter); + } + } + + m_popupWidget = new QGraphicsProxyWidget(); + m_popupWidget->setWidget(widget); + + break; + } + + ::profiler::block_index_t i = ~0U; + auto block = item->intersect(pos, i); + if (block != nullptr) + { + const auto& itemBlock = block->tree; + const auto& itemDesc = easyDescriptor(itemBlock.node->id()); + + auto widget = new QWidget(nullptr, Qt::FramelessWindowHint); + if (widget == nullptr) + return; + + widget->setObjectName(QStringLiteral("DiagramPopup")); + widget->setAttribute(Qt::WA_ShowWithoutActivating, true); + widget->setFocusPolicy(Qt::NoFocus); + + auto lay = new QGridLayout(widget); + if (lay == nullptr) + return; + + lay->setSpacing(2); + + int row = 0; + switch (itemDesc.type()) + { + case ::profiler::BlockType::Block: + { + const auto name = *itemBlock.node->name() != 0 ? itemBlock.node->name() : itemDesc.name(); + + //lay->addWidget(new QLabel("Name:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new EasyBoldLabel(::profiler_gui::toUnicode(name), widget), row, 0, 1, 5, + Qt::AlignHCenter); + ++row; + + const auto duration = itemBlock.node->duration(); + lay->addWidget(new QLabel("Duration:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, duration, 3), + widget), row, 1, 1, 3, Qt::AlignLeft); + ++row; + + ::profiler::timestamp_t children_duration = 0; + for (auto child : itemBlock.children) + children_duration += easyBlock(child).tree.node->duration(); + + const auto self_duration = duration - children_duration; + const auto self_percent = + duration == 0 ? 100. : ::profiler_gui::percentReal(self_duration, duration); + lay->addWidget(new QLabel("Self:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(QString("%1 (%2%)") + .arg(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, + self_duration, 3)) + .arg(QString::number(self_percent, 'g', 3)), widget), + row, 1, 1, 3, Qt::AlignLeft); + ++row; + + break; + } + + case ::profiler::BlockType::Event: + { + const auto name = *itemBlock.node->name() != 0 ? itemBlock.node->name() : itemDesc.name(); + + lay->addWidget(new EasyBoldLabel("User defined event", widget), row, 0, 1, 2, Qt::AlignHCenter); + ++row; + + lay->addWidget(new QLabel("Name:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(::profiler_gui::toUnicode(name), widget), row, 1, Qt::AlignLeft); + ++row; + + break; + } + + case ::profiler::BlockType::Value: + { + lay->addWidget(new EasyBoldLabel("Arbitrary Value", widget), row, 0, 1, 2, Qt::AlignHCenter); + ++row; + + lay->addWidget(new QLabel("Name:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(::profiler_gui::toUnicode(itemDesc.name()), widget), row, 1, Qt::AlignLeft); + ++row; + + lay->addWidget(new QLabel("Value:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(::profiler_gui::valueString(*itemBlock.value), widget), row, 1, Qt::AlignLeft); + ++row; + + lay->addWidget(new QLabel("VIN:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(QString("0x%1").arg(itemBlock.value->value_id(), 0, 16), widget), row, 1, Qt::AlignLeft); + ++row; + + break; + } + + default: + { + delete widget; + return; + } + } + + if (itemBlock.per_thread_stats != nullptr) + { + if (itemDesc.type() == ::profiler::BlockType::Block) + { + const auto duration = itemBlock.node->duration(); + + lay->addWidget(new QLabel("Average:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, itemBlock.per_thread_stats->average_duration(), 3), widget), row, 1, 1, 3, Qt::AlignLeft); + ++row; + + // Calculate idle/active time + { + auto threadRoot = item->root(); + + ::profiler::block_index_t ind = 0; + auto it = ::std::lower_bound(threadRoot->sync.begin(), threadRoot->sync.end(), itemBlock.node->begin(), [](::profiler::block_index_t _cs_index, ::profiler::timestamp_t _val) + { + return EASY_GLOBALS.gui_blocks[_cs_index].tree.node->begin() < _val; + }); + + if (it != threadRoot->sync.end()) + { + ind = static_cast<::profiler::block_index_t>(it - threadRoot->sync.begin()); + if (ind > 0) + --ind; + } + else + { + ind = static_cast<::profiler::block_index_t>(threadRoot->sync.size()); + } + + ::profiler::timestamp_t idleTime = 0; + for (auto ncs = static_cast<::profiler::block_index_t>(threadRoot->sync.size()); ind < ncs; ++ind) + { + auto cs_index = threadRoot->sync[ind]; + const auto cs = EASY_GLOBALS.gui_blocks[cs_index].tree.node; + + if (cs->begin() > itemBlock.node->end()) + break; + + if (itemBlock.node->begin() <= cs->begin() && cs->end() <= itemBlock.node->end()) + idleTime += cs->duration(); + } + + const auto active_time = duration - idleTime; + const auto active_percent = duration == 0 ? 100. : ::profiler_gui::percentReal(active_time, duration); + lay->addWidget(new QLabel("Active time:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(QString("%1 (%2%)").arg(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, active_time, 3)).arg(QString::number(active_percent, 'g', 3)), widget), row, 1, 1, 3, Qt::AlignLeft); + ++row; + } + + lay->addWidget(new EasyBoldLabel("-------- Statistics --------", widget), row, 0, 1, 5, Qt::AlignHCenter); + lay->addWidget(new QLabel("per ", widget), row + 1, 0, Qt::AlignRight); + lay->addWidget(new QLabel("This %:", widget), row + 2, 0, Qt::AlignRight); + lay->addWidget(new QLabel("Sum %:", widget), row + 3, 0, Qt::AlignRight); + lay->addWidget(new QLabel("Sum self %:", widget), row + 4, 0, Qt::AlignRight); + lay->addWidget(new QLabel("N Calls:", widget), row + 5, 0, Qt::AlignRight); + + lay->addWidget(new QLabel("Thread", widget), row + 1, 1, Qt::AlignHCenter); + + auto percent = ::profiler_gui::percentReal(duration, item->root()->profiled_time); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 2, 1, Qt::AlignHCenter); + + lay->addWidget(new QLabel(QString::number(::profiler_gui::percent(itemBlock.per_thread_stats->total_duration, item->root()->profiled_time)), widget), row + 3, 1, Qt::AlignHCenter); + + lay->addWidget(new QLabel(QString::number(::profiler_gui::percent(itemBlock.per_thread_stats->total_duration - itemBlock.per_thread_stats->total_children_duration, item->root()->profiled_time)), widget), row + 4, 1, Qt::AlignHCenter); + + lay->addWidget(new QLabel(QString::number(itemBlock.per_thread_stats->calls_number), widget), row + 5, 1, Qt::AlignHCenter); + + int col = 1; + + if (itemBlock.per_frame_stats->parent_block != i && !::profiler_gui::is_max(itemBlock.per_frame_stats->parent_block)) + { + ++col; + auto frame_duration = easyBlocksTree(itemBlock.per_frame_stats->parent_block).node->duration(); + + lay->addWidget(new QLabel("Frame", widget), row + 1, col, Qt::AlignHCenter); + + percent = ::profiler_gui::percentReal(duration, frame_duration); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 2, col, Qt::AlignHCenter); + + percent = ::profiler_gui::percentReal(itemBlock.per_frame_stats->total_duration, frame_duration); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 3, col, Qt::AlignHCenter); + + percent = ::profiler_gui::percentReal(itemBlock.per_frame_stats->total_duration - itemBlock.per_frame_stats->total_children_duration, frame_duration); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 4, col, Qt::AlignHCenter); + + lay->addWidget(new QLabel(QString::number(itemBlock.per_frame_stats->calls_number), widget), row + 5, col, Qt::AlignHCenter); + } + + if (!::profiler_gui::is_max(itemBlock.per_parent_stats->parent_block))// != item->threadId()) + { + ++col; + auto parent_duration = easyBlocksTree(itemBlock.per_parent_stats->parent_block).node->duration(); + + lay->addWidget(new QLabel("Parent", widget), row + 1, col, Qt::AlignHCenter); + + percent = ::profiler_gui::percentReal(duration, parent_duration); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 2, col, Qt::AlignHCenter); + + percent = ::profiler_gui::percentReal(itemBlock.per_parent_stats->total_duration, parent_duration); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 3, col, Qt::AlignHCenter); + + percent = ::profiler_gui::percentReal(itemBlock.per_parent_stats->total_duration - itemBlock.per_parent_stats->total_children_duration, parent_duration); + lay->addWidget(new QLabel(0.005 < percent && percent < 0.5001 ? QString::number(percent, 'f', 2) : QString::number(static_cast(0.5 + percent)), widget), row + 4, col, Qt::AlignHCenter); + + lay->addWidget(new QLabel(QString::number(itemBlock.per_parent_stats->calls_number), widget), row + 5, col, Qt::AlignHCenter); + + ++col; + } + } + else + { + lay->addWidget(new QLabel("N calls/Thread:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(QString::number(itemBlock.per_thread_stats->calls_number), widget), row, 1, Qt::AlignLeft); + } + } + + m_popupWidget = new QGraphicsProxyWidget(); + m_popupWidget->setWidget(widget); + + break; + } + } + + if (m_popupWidget != nullptr) + { + auto effect = new QGraphicsDropShadowEffect(); + effect->setBlurRadius(5); + effect->setOffset(3, 3); + m_popupWidget->setGraphicsEffect(effect); + + scene()->addItem(m_popupWidget); + + auto br = m_popupWidget->boundingRect(); + if (scenePos.y() + br.height() > m_visibleSceneRect.bottom()) + scenePos.setY(::std::max(scenePos.y() - br.height(), m_visibleSceneRect.top())); + + if (scenePos.x() + br.width() > m_visibleSceneRect.right()) + scenePos.setX(::std::max(scenePos.x() - br.width(), m_visibleSceneRect.left())); + + m_popupWidget->setPos(scenePos); + m_popupWidget->setOpacity(0.95); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::onHierarchyFlagChange(bool) +{ + bool changedSelection = false; + + if (!m_selectedBlocks.empty()) + { + changedSelection = true; + m_selectedBlocks.clear(); + } + + if (m_chronometerItem->isVisible()) + { + for (auto item : m_items) + { + if (!EASY_GLOBALS.only_current_thread_hierarchy || item->threadId() == EASY_GLOBALS.selected_thread) + item->getBlocks(m_chronometerItem->left(), m_chronometerItem->right(), m_selectedBlocks); + } + + if (!m_selectedBlocks.empty()) + { + changedSelection = true; + } + } + + if (changedSelection) + { + emit intervalChanged(m_selectedBlocks, m_beginTime, position2time(m_chronometerItem->left()), position2time(m_chronometerItem->right()), m_chronometerItem->reverse()); + } +} + +void EasyGraphicsView::onSelectedThreadChange(::profiler::thread_id_t _id) +{ + if (m_pScrollbar == nullptr || m_pScrollbar->hystThread() == _id) + { + return; + } + + if (_id == 0) + { + m_pScrollbar->setHistogramSource(0, nullptr); + return; + } + + for (auto item : m_items) + { + if (item->threadId() == _id) + { + m_pScrollbar->setHistogramSource(_id, item->items(0)); + + bool changedSelection = false; + if (EASY_GLOBALS.only_current_thread_hierarchy) + { + if (!m_selectedBlocks.empty()) + { + changedSelection = true; + m_selectedBlocks.clear(); + } + + if (m_chronometerItem->isVisible()) + { + item->getBlocks(m_chronometerItem->left(), m_chronometerItem->right(), m_selectedBlocks); + if (!m_selectedBlocks.empty()) + changedSelection = true; + } + } + + if (changedSelection) + { + emit intervalChanged(m_selectedBlocks, m_beginTime, position2time(m_chronometerItem->left()), position2time(m_chronometerItem->right()), m_chronometerItem->reverse()); + } + + repaintScene(); + return; + } + } + + m_pScrollbar->setHistogramSource(0, nullptr); + repaintScene(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::onSelectedBlockChange(unsigned int _block_index) +{ + if (!m_bUpdatingRect) + { + if (_block_index < EASY_GLOBALS.gui_blocks.size()) + { + // Scroll to item + + const auto& guiblock = EASY_GLOBALS.gui_blocks[_block_index]; + const auto thread_item = m_items[guiblock.graphics_item]; + const auto& item = thread_item->items(guiblock.graphics_item_level)[guiblock.graphics_item_index]; + + m_flickerSpeedX = m_flickerSpeedY = 0; + + m_bUpdatingRect = true; + verticalScrollBar()->setValue(static_cast(thread_item->levelY(guiblock.graphics_item_level) - m_visibleSceneRect.height() * 0.5)); + m_pScrollbar->setValue(item.left() + item.width() * 0.5 - m_pScrollbar->sliderHalfWidth()); + + if (EASY_GLOBALS.selecting_block_changes_thread && EASY_GLOBALS.selected_thread != thread_item->threadId()) + { + EASY_GLOBALS.selected_thread = thread_item->threadId(); + + m_pScrollbar->lock(); + emit EASY_GLOBALS.events.selectedThreadChanged(EASY_GLOBALS.selected_thread); + m_pScrollbar->unlock(); + } + + m_pScrollbar->setHistogramSource(EASY_GLOBALS.selected_thread, guiblock.tree.node->id()); + + m_bUpdatingRect = false; + } + else if (EASY_GLOBALS.selected_thread != 0) + { + for (auto item : m_items) + { + if (item->threadId() == EASY_GLOBALS.selected_thread) + { + m_pScrollbar->setHistogramSource(EASY_GLOBALS.selected_thread, item->items(0)); + break; + } + } + } + else + { + m_pScrollbar->setHistogramSource(0, nullptr); + } + + updateVisibleSceneRect(); + repaintScene(); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsView::onRefreshRequired() +{ + if (!m_bUpdatingRect) + { + repaintScene(); + } +} + +////////////////////////////////////////////////////////////////////////// + +EasyGraphicsViewWidget::EasyGraphicsViewWidget(QWidget* _parent) + : QWidget(_parent) + , m_scrollbar(new EasyGraphicsScrollbar(this)) + , m_view(new EasyGraphicsView(this)) + , m_threadNamesWidget(new EasyThreadNamesWidget(m_view, m_scrollbar->height(), this)) +{ + initWidget(); +} + +void EasyGraphicsViewWidget::initWidget() +{ + auto lay = new QGridLayout(this); + lay->setContentsMargins(0, 0, 0, 0); + lay->setSpacing(1); + lay->addWidget(m_threadNamesWidget, 0, 0, 2, 1); + lay->addWidget(m_view, 0, 1); + lay->addWidget(m_scrollbar, 1, 1); + setLayout(lay); + + m_view->setScrollbar(m_scrollbar); +} + +EasyGraphicsViewWidget::~EasyGraphicsViewWidget() +{ + +} + +EasyGraphicsView* EasyGraphicsViewWidget::view() +{ + return m_view; +} + +void EasyGraphicsViewWidget::clear() +{ + m_scrollbar->clear(); + m_threadNamesWidget->clear(); + m_view->clear(); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +void EasyThreadNameItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*, QWidget*) +{ + auto const parentView = static_cast(scene()->parent()); + const auto view = parentView->view(); + const auto& items = view->getItems(); + if (items.empty()) + return; + + const auto visibleSceneRect = view->visibleSceneRect(); + const auto h = visibleSceneRect.height() + TIMELINE_ROW_SIZE - 2; + const auto w = parentView->width();//parentView->sceneRect().width(); + + EASY_STATIC_CONSTEXPR uint16_t OVERLAP = ::profiler_gui::THREADS_ROW_SPACING >> 1; + static const QBrush brushes[2] = {QColor::fromRgb(BACKGROUND_1), QColor::fromRgb(BACKGROUND_2)}; + int i = -1; + + QRectF rect; + + _painter->resetTransform(); + + // Draw thread names + auto default_font = _painter->font(); + _painter->setFont(EASY_GLOBALS.bg_font); + for (auto item : items) + { + ++i; + + auto br = item->boundingRect(); + auto top = item->y() + br.top() - visibleSceneRect.top() - OVERLAP; + auto hgt = br.height() + ::profiler_gui::THREADS_ROW_SPACING; + auto bottom = top + hgt; + + if (top > h || bottom < 0) + continue; + + if (item->threadId() == EASY_GLOBALS.selected_thread) + _painter->setBrush(QBrush(QColor::fromRgb(::profiler_gui::SELECTED_THREAD_BACKGROUND))); + else + _painter->setBrush(brushes[i & 1]); + + if (top < 0) + { + hgt += top; + top = 0; + } + + const auto dh = top + hgt - h; + if (dh > 0) + hgt -= dh; + + rect.setRect(0, top, w, hgt); + + _painter->setPen(::profiler_gui::SYSTEM_BORDER_COLOR); + _painter->drawRect(rect); + + rect.translate(-5, 0); + _painter->setPen(::profiler_gui::TEXT_COLOR); + _painter->drawText(rect, Qt::AlignRight | Qt::AlignVCenter, item->threadName()); + } + + const auto rect_bottom = rect.bottom(); + if (rect_bottom < h) + { + ++i; + rect.translate(5, rect.height()); + rect.setHeight(h - rect_bottom); + _painter->setBrush(brushes[i & 1]); + _painter->setPen(::profiler_gui::SYSTEM_BORDER_COLOR); + _painter->drawRect(rect); + } + + // Draw separator between thread names area and information area + _painter->setPen(::profiler_gui::SYSTEM_BORDER_COLOR); + _painter->drawLine(QLineF(0, h, w, h)); + _painter->drawLine(QLineF(0, h + 2, w, h + 2)); + + // Draw information + _painter->setFont(EASY_GLOBALS.chronometer_font); + QFontMetricsF fm(EASY_GLOBALS.chronometer_font, parentView); + const qreal th = fm.height(); // Calculate displayed text height + const qreal time1 = view->chronoTime(); + const qreal time2 = view->chronoTimeAux(); + + auto y = h + 2; + + auto drawTimeText = [&rect, &w, &y, &fm, &_painter](qreal time, qreal th, QRgb color) + { + if (time > 0) + { + const QString text = ::profiler_gui::autoTimeStringReal(time); // Displayed text + rect.setRect(0, y, w, th); + + _painter->setPen(color); + _painter->drawText(rect, Qt::AlignCenter, text); + + y += th; + } + }; + + drawTimeText(time1, th, ::profiler_gui::CHRONOMETER_COLOR.rgb() & 0x00ffffff); + drawTimeText(time2, th, ::profiler_gui::CHRONOMETER_COLOR2.rgb() & 0x00ffffff); +} + +////////////////////////////////////////////////////////////////////////// + +EasyThreadNamesWidget::EasyThreadNamesWidget(EasyGraphicsView* _view, int _additionalHeight, QWidget* _parent) + : Parent(_parent) + , m_idleTime(0) + , m_view(_view) + , m_popupWidget(nullptr) + , m_maxLength(100) + , m_additionalHeight(_additionalHeight + 1) +{ + setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Ignored); + + setScene(new QGraphicsScene(this)); + + setCacheMode(QGraphicsView::CacheNone); + setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setFixedWidth(m_maxLength); + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedThreadChanged, [this](::profiler::thread_id_t){ repaintScene(); }); + connect(m_view, &EasyGraphicsView::treeChanged, this, &This::onTreeChange); + connect(m_view, &EasyGraphicsView::sceneUpdated, this, &This::repaintScene); + connect(m_view->verticalScrollBar(), &QScrollBar::valueChanged, verticalScrollBar(), &QScrollBar::setValue); + connect(m_view->verticalScrollBar(), &QScrollBar::rangeChanged, this, &This::setVerticalScrollbarRange); + connect(&m_idleTimer, &QTimer::timeout, this, &This::onIdleTimeout); +} + +EasyThreadNamesWidget::~EasyThreadNamesWidget() +{ + +} + +void EasyThreadNamesWidget::removePopup(bool _removeFromScene) +{ + if (m_popupWidget != nullptr) + { + auto widget = m_popupWidget->widget(); + widget->setParent(nullptr); + m_popupWidget->setWidget(nullptr); + delete widget; + + if (_removeFromScene) + scene()->removeItem(m_popupWidget); + + m_popupWidget = nullptr; + } +} + +void EasyThreadNamesWidget::clear() +{ + const QSignalBlocker b(this); + removePopup(); + scene()->clear(); + + m_maxLength = 100; + setFixedWidth(m_maxLength); + + m_idleTimer.stop(); + m_idleTime = 0; +} + +void EasyThreadNamesWidget::setVerticalScrollbarRange(int _minValue, int _maxValue) +{ + verticalScrollBar()->setRange(_minValue, _maxValue + m_additionalHeight); +} + +void EasyThreadNamesWidget::onTreeChange() +{ + const QSignalBlocker b(this); + removePopup(); + scene()->clear(); + + m_idleTimer.stop(); + m_idleTime = 0; + + QFontMetricsF fm(EASY_GLOBALS.bg_font, this); + qreal maxLength = 100; + const auto& graphicsItems = m_view->getItems(); + for (auto graphicsItem : graphicsItems) + maxLength = ::std::max(maxLength, (10 + fm.width(graphicsItem->threadName())) * ::profiler_gui::FONT_METRICS_FACTOR); + + auto vbar = verticalScrollBar(); + auto viewBar = m_view->verticalScrollBar(); + + setVerticalScrollbarRange(viewBar->minimum(), viewBar->maximum()); + vbar->setSingleStep(viewBar->singleStep()); + vbar->setPageStep(viewBar->pageStep()); + + auto r = m_view->sceneRect(); + setSceneRect(0, r.top(), maxLength, r.height() + m_additionalHeight); + + auto item = new EasyThreadNameItem(); + item->setPos(0, 0); + item->setBoundingRect(sceneRect()); + scene()->addItem(item); + + m_maxLength = static_cast(maxLength); + setFixedWidth(m_maxLength); + + m_idleTimer.start(IDLE_TIMER_INTERVAL); +} + +void EasyThreadNamesWidget::onIdleTimeout() +{ + static const uint16_t OVERLAP = ::profiler_gui::THREADS_ROW_SPACING >> 1; + + m_idleTime += IDLE_TIMER_INTERVAL; + + if (m_idleTime < IDLE_TIME) + { + removePopup(true); + return; + } + + if (m_popupWidget != nullptr) + return; + + auto visibleSceneRect = mapToScene(rect()).boundingRect(); + auto scenePos = mapToScene(mapFromGlobal(QCursor::pos())); + + if (scenePos.x() < visibleSceneRect.left() || scenePos.x() > visibleSceneRect.right()) + { + if (m_idleTime > 3000) + setFixedWidth(m_maxLength); + return; + } + + if (scenePos.y() < visibleSceneRect.top() || scenePos.y() > visibleSceneRect.bottom()) + { + if (m_idleTime > 3000) + setFixedWidth(m_maxLength); + return; + } + + auto const parentView = static_cast(scene()->parent()); + const auto view = parentView->view(); + + if (scenePos.y() > view->visibleSceneRect().bottom()) + { + if (m_idleTime > 3000) + setFixedWidth(m_maxLength); + return; + } + + const qreal y = scenePos.y() - visibleSceneRect.top(); + + const auto& items = view->getItems(); + if (items.empty()) + { + if (m_idleTime > 3000) + setFixedWidth(m_maxLength); + return; + } + + EasyGraphicsItem* intersectingItem = nullptr; + for (auto item : items) + { + auto br = item->boundingRect(); + auto top = item->y() + br.top() - visibleSceneRect.top() - OVERLAP; + auto hgt = br.height() + ::profiler_gui::THREADS_ROW_SPACING; + auto bottom = top + hgt; + + if (bottom < y || y < top) + continue; + + intersectingItem = item; + + break; + } + + if (intersectingItem != nullptr) + { + auto widget = new QWidget(nullptr, Qt::FramelessWindowHint); + if (widget == nullptr) + return; + + widget->setObjectName(QStringLiteral("ThreadsPopup")); + widget->setAttribute(Qt::WA_ShowWithoutActivating, true); + widget->setFocusPolicy(Qt::NoFocus); + + auto lay = new QGridLayout(widget); + if (lay == nullptr) + return; + + int row = 0; + + lay->setSpacing(2); + lay->addWidget(new EasyBoldLabel(intersectingItem->threadName(), widget), row, 0, 1, 2, Qt::AlignHCenter); + ++row; + + ::profiler::timestamp_t duration = 0; + const auto& root = *intersectingItem->root(); + if (!root.children.empty()) + duration = easyBlock(root.children.back()).tree.node->end() - easyBlock(root.children.front()).tree.node->begin(); + + lay->addWidget(new QLabel("Duration:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, duration, 3), widget), row, 1, Qt::AlignLeft); + ++row; + + lay->addWidget(new QLabel("Profiled:", widget), row, 0, Qt::AlignRight); + if (duration) + { + lay->addWidget(new QLabel(QString("%1 (%2%)").arg(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, root.profiled_time, 3)) + .arg(QString::number(100. * (double)root.profiled_time / (double)duration, 'f', 2)), widget), row, 1, Qt::AlignLeft); + } + else + { + lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, root.profiled_time, 3), widget), row, 1, Qt::AlignLeft); + } + ++row; + + lay->addWidget(new QLabel("Wait:", widget), row, 0, Qt::AlignRight); + if (duration) + { + lay->addWidget(new QLabel(QString("%1 (%2%)").arg(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, root.wait_time, 3)) + .arg(QString::number(100. * (double)root.wait_time / (double)duration, 'f', 2)), widget), row, 1, Qt::AlignLeft); + } + else + { + lay->addWidget(new QLabel(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, root.wait_time, 3), widget), row, 1, Qt::AlignLeft); + } + ++row; + + const auto eventsSize = root.events.size(); + + lay->addWidget(new QLabel("Frames:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(QString::number(root.frames_number), widget), row, 1, Qt::AlignLeft); + ++row; + + lay->addWidget(new QLabel("Blocks:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(QString::number(root.blocks_number - eventsSize), widget), row, 1, Qt::AlignLeft); + ++row; + + lay->addWidget(new QLabel("Markers:", widget), row, 0, Qt::AlignRight); + lay->addWidget(new QLabel(QString::number(eventsSize), widget), row, 1, Qt::AlignLeft); + ++row; + + m_popupWidget = new QGraphicsProxyWidget(); + if (m_popupWidget != nullptr) + { + auto effect = new QGraphicsDropShadowEffect(); + effect->setBlurRadius(5); + effect->setOffset(3, 3); + m_popupWidget->setGraphicsEffect(effect); + + m_popupWidget->setWidget(widget); + scene()->addItem(m_popupWidget); + + auto br = m_popupWidget->boundingRect(); + + if (maximumWidth() < br.width()) + { + setFixedWidth(static_cast(br.width())); + visibleSceneRect.setWidth(br.width()); + } + + if (scenePos.y() + br.height() > visibleSceneRect.bottom()) + scenePos.setY(::std::max(scenePos.y() - br.height(), visibleSceneRect.top())); + + if (scenePos.x() + br.width() > visibleSceneRect.right()) + scenePos.setX(::std::max(scenePos.x() - br.width(), visibleSceneRect.left())); + + m_popupWidget->setPos(scenePos); + m_popupWidget->setOpacity(0.95); + } + } +} + +void EasyThreadNamesWidget::repaintScene() +{ + scene()->update(); +} + +void EasyThreadNamesWidget::mousePressEvent(QMouseEvent* _event) +{ + m_idleTime = 0; + + QMouseEvent e(_event->type(), _event->pos() - QPointF(sceneRect().width(), 0), _event->button(), _event->buttons() & ~Qt::RightButton, _event->modifiers()); + m_view->mousePressEvent(&e); + _event->accept(); +} + +void EasyThreadNamesWidget::mouseDoubleClickEvent(QMouseEvent* _event) +{ + static const auto OVERLAP = ::profiler_gui::THREADS_ROW_SPACING >> 1; + + m_idleTime = 0; + + auto y = mapToScene(_event->pos()).y(); + const auto& items = m_view->getItems(); + for (auto item : items) + { + auto br = item->boundingRect(); + auto top = item->y() + br.top() - OVERLAP; + auto bottom = top + br.height() + OVERLAP; + + if (y < top || y > bottom) + continue; + + const auto thread_id = item->threadId(); + if (thread_id != EASY_GLOBALS.selected_thread) + { + EASY_GLOBALS.selected_thread = thread_id; + emit EASY_GLOBALS.events.selectedThreadChanged(thread_id); + } + + break; + } + + _event->accept(); +} + +void EasyThreadNamesWidget::mouseReleaseEvent(QMouseEvent* _event) +{ + m_idleTime = 0; + + QMouseEvent e(_event->type(), _event->pos() - QPointF(sceneRect().width(), 0), _event->button(), _event->buttons() & ~Qt::RightButton, _event->modifiers()); + m_view->mouseReleaseEvent(&e); + _event->accept(); +} + +void EasyThreadNamesWidget::mouseMoveEvent(QMouseEvent* _event) +{ + m_idleTime = 0; + + QMouseEvent e(_event->type(), _event->pos() - QPointF(sceneRect().width(), 0), _event->button(), _event->buttons() & ~Qt::RightButton, _event->modifiers()); + m_view->mouseMoveEvent(&e); + _event->accept(); +} + +void EasyThreadNamesWidget::keyPressEvent(QKeyEvent* _event) +{ + m_idleTime = 0; + m_view->keyPressEvent(_event); +} + +void EasyThreadNamesWidget::keyReleaseEvent(QKeyEvent* _event) +{ + m_idleTime = 0; + m_view->keyReleaseEvent(_event); +} + +void EasyThreadNamesWidget::wheelEvent(QWheelEvent* _event) +{ + m_idleTime = 0; + + auto vbar = m_view->verticalScrollBar(); + if (vbar != nullptr) + { + _event->accept(); + vbar->setValue(vbar->value() - _event->delta()); + } +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + diff --git a/3rdparty/easyprofiler/profiler_gui/blocks_graphics_view.h b/3rdparty/easyprofiler/profiler_gui/blocks_graphics_view.h new file mode 100644 index 0000000..255862b --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/blocks_graphics_view.h @@ -0,0 +1,349 @@ +/************************************************************************ +* file name : blocks_graphics_view.h +* ----------------- : +* creation time : 2016/06/26 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of GraphicsScene and GraphicsView and +* : it's auxiliary classes for displyaing easy_profiler blocks tree. +* ----------------- : +* change log : * 2016/06/26 Victor Zarubkin: moved sources from graphics_view.h +* : and renamed classes from My* to Prof*. +* : +* : * 2016/06/29 Victor Zarubkin: Highly optimized painting performance and memory consumption. +* : +* : * 2016/06/30 Victor Zarubkin: Replaced doubles with floats (in ProfBlockItem) for less memory consumption. +* : +* : * 2016/09/15 Victor Zarubkin: Moved sources of EasyGraphicsItem and EasyChronometerItem to separate files. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_GRAPHICS_VIEW_H +#define EASY_GRAPHICS_VIEW_H + +#include +#include + +#include +#include +#include +#include +#include +#include + +#include + +#include "common_functions.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +class QGraphicsProxyWidget; +class EasyGraphicsView; +class EasyGraphicsItem; +class EasyGraphicsScrollbar; +class EasyChronometerItem; + +////////////////////////////////////////////////////////////////////////// + +#define EASY_QGRAPHICSITEM(ClassName) \ +class ClassName : public QGraphicsItem { \ + QRectF m_boundingRect; \ +public: \ + ClassName() : QGraphicsItem() {} \ + virtual ~ClassName() {} \ + void paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget = nullptr) override; \ + QRectF boundingRect() const override { return m_boundingRect; } \ + void setBoundingRect(qreal x, qreal y, qreal w, qreal h) { m_boundingRect.setRect(x, y, w, h); } \ + void setBoundingRect(const QRectF& _rect) { m_boundingRect = _rect; } \ +} + +EASY_QGRAPHICSITEM(EasyBackgroundItem); +EASY_QGRAPHICSITEM(EasyTimelineIndicatorItem); +EASY_QGRAPHICSITEM(EasyThreadNameItem); + +#undef EASY_QGRAPHICSITEM + +////////////////////////////////////////////////////////////////////////// + +struct EasyBoldLabel : public QLabel { + EasyBoldLabel(const QString& _text, QWidget* _parent = nullptr); + virtual ~EasyBoldLabel(); +}; + +////////////////////////////////////////////////////////////////////////// + +class EasyGraphicsView : public QGraphicsView +{ + Q_OBJECT + +private: + + using Parent = QGraphicsView; + using This = EasyGraphicsView; + using Items = ::std::vector; + //using Keys = ::std::unordered_set >; + + Items m_items; ///< Array of all EasyGraphicsItem items + //Keys m_keys; ///< Pressed keyboard keys + ::profiler_gui::TreeBlocks m_selectedBlocks; ///< Array of items which were selected by selection zone (EasyChronometerItem) + QTimer m_flickerTimer; ///< Timer for flicking behavior + QTimer m_idleTimer; ///< + QRectF m_visibleSceneRect; ///< Visible scene rectangle + ::profiler::timestamp_t m_beginTime; ///< Begin time of profiler session. Used to reduce values of all begin and end times of profiler blocks. + qreal m_sceneWidth; ///< + qreal m_scale; ///< Current scale + qreal m_offset; ///< Have to use manual offset for all scene content instead of using scrollbars because QScrollBar::value is 32-bit integer :( + qreal m_timelineStep; ///< + uint64_t m_idleTime; ///< + QPoint m_mousePressPos; ///< Last mouse global position (used by mousePressEvent and mouseMoveEvent) + QPoint m_mouseMovePath; ///< Mouse move path between press and release of any button + Qt::MouseButtons m_mouseButtons; ///< Pressed mouse buttons + EasyGraphicsScrollbar* m_pScrollbar; ///< Pointer to the graphics scrollbar widget + EasyChronometerItem* m_chronometerItem; ///< Pointer to the EasyChronometerItem which is displayed when you press right mouse button and move mouse left or right. This item is used to select blocks to display in tree widget. + EasyChronometerItem* m_chronometerItemAux; ///< Pointer to the EasyChronometerItem which is displayed when you double click left mouse button and move mouse left or right. This item is used only to measure time. + QGraphicsProxyWidget* m_popupWidget; ///< + int m_flickerSpeedX; ///< Current flicking speed x + int m_flickerSpeedY; ///< Current flicking speed y + int m_flickerCounterX; + int m_flickerCounterY; + bool m_bDoubleClick; ///< Is mouse buttons double clicked + bool m_bUpdatingRect; ///< Stub flag which is used to avoid excess calculations on some scene update (flicking, scaling and so on) + bool m_bEmpty; ///< Indicates whether scene is empty and has no items + +public: + + explicit EasyGraphicsView(QWidget* _parent = nullptr); + virtual ~EasyGraphicsView(); + + // Public virtual methods + + void wheelEvent(QWheelEvent* _event) override; + void mousePressEvent(QMouseEvent* _event) override; + void mouseDoubleClickEvent(QMouseEvent* _event) override; + void mouseReleaseEvent(QMouseEvent* _event) override; + void mouseMoveEvent(QMouseEvent* _event) override; + void keyPressEvent(QKeyEvent* _event) override; + void keyReleaseEvent(QKeyEvent* _event) override; + void resizeEvent(QResizeEvent* _event) override; + + void dragEnterEvent(QDragEnterEvent*) override {} + +public: + + // Public non-virtual methods + + qreal sceneWidth() const; + qreal chronoTime() const; + qreal chronoTimeAux() const; + + void setScrollbar(EasyGraphicsScrollbar* _scrollbar); + void clear(); + + void setTree(const ::profiler::thread_blocks_tree_t& _blocksTree); + + const Items& getItems() const; + +signals: + + // Signals + + void sceneUpdated(); + void treeChanged(); + void intervalChanged(const ::profiler_gui::TreeBlocks& _blocks, ::profiler::timestamp_t _session_begin_time, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict); + +private: + + // Private non-virtual methods + + void removePopup(bool _removeFromScene = false); + + EasyChronometerItem* createChronometer(bool _main = true); + bool moveChrono(EasyChronometerItem* _chronometerItem, qreal _mouseX); + void initMode(); + int updateVisibleSceneRect(); + void updateTimelineStep(qreal _windowWidth); + void scaleTo(qreal _scale); + void scrollTo(const EasyGraphicsItem* _item); + void onWheel(qreal _mouseX, int _wheelDelta); + qreal setTree(EasyGraphicsItem* _item, const ::profiler::BlocksTree::children_t& _children, qreal& _height, uint32_t& _maxDepthChild, qreal _y, short _level); + +private slots: + + // Private Slots + + void repaintScene(); + void onGraphicsScrollbarWheel(qreal _mouseX, int _wheelDelta); + void onScrollbarValueChange(int); + void onGraphicsScrollbarValueChange(qreal); + void onFlickerTimeout(); + void onIdleTimeout(); + void onHierarchyFlagChange(bool _value); + void onSelectedThreadChange(::profiler::thread_id_t _id); + void onSelectedBlockChange(unsigned int _block_index); + void onRefreshRequired(); + void onThreadViewChanged(); + +public: + + // Public inline methods + + inline qreal scale() const + { + return m_scale; + } + + inline qreal offset() const + { + return m_offset; + } + + inline const QRectF& visibleSceneRect() const + { + return m_visibleSceneRect; + } + + inline qreal timelineStep() const + { + return m_timelineStep; + } + + inline qreal time2position(const profiler::timestamp_t& _time) const + { + return PROF_MICROSECONDS(qreal(_time - m_beginTime)); + //return PROF_MILLISECONDS(qreal(_time - m_beginTime)); + } + + inline ::profiler::timestamp_t position2time(qreal _pos) const + { + return PROF_FROM_MICROSECONDS(_pos); + //return PROF_FROM_MILLISECONDS(_pos); + } + +}; // END of class EasyGraphicsView. + +////////////////////////////////////////////////////////////////////////// + +class EasyThreadNamesWidget : public QGraphicsView +{ + Q_OBJECT + +private: + + typedef QGraphicsView Parent; + typedef EasyThreadNamesWidget This; + + QTimer m_idleTimer; ///< + uint64_t m_idleTime; ///< + EasyGraphicsView* m_view; ///< + QGraphicsProxyWidget* m_popupWidget; ///< + int m_maxLength; ///< + const int m_additionalHeight; ///< + +public: + + explicit EasyThreadNamesWidget(EasyGraphicsView* _view, int _additionalHeight, QWidget* _parent = nullptr); + virtual ~EasyThreadNamesWidget(); + + void mousePressEvent(QMouseEvent* _event) override; + void mouseDoubleClickEvent(QMouseEvent* _event) override; + void mouseReleaseEvent(QMouseEvent* _event) override; + void mouseMoveEvent(QMouseEvent* _event) override; + void keyPressEvent(QKeyEvent* _event) override; + void keyReleaseEvent(QKeyEvent* _event) override; + void wheelEvent(QWheelEvent* _event) override; + + void dragEnterEvent(QDragEnterEvent*) override {} + + void clear(); + + const EasyGraphicsView* view() const + { + return m_view; + } + +private: + + void removePopup(bool _removeFromScene = false); + +private slots: + + void setVerticalScrollbarRange(int _minValue, int _maxValue); + void onTreeChange(); + void onIdleTimeout(); + void repaintScene(); + +}; // END of class EasyThreadNamesWidget. + +////////////////////////////////////////////////////////////////////////// + +class EasyGraphicsViewWidget : public QWidget +{ + Q_OBJECT + +private: + + EasyGraphicsScrollbar* m_scrollbar; + EasyGraphicsView* m_view; + EasyThreadNamesWidget* m_threadNamesWidget; + +public: + + explicit EasyGraphicsViewWidget(QWidget* _parent = nullptr); + virtual ~EasyGraphicsViewWidget(); + + EasyGraphicsView* view(); + void clear(); + +private: + + void initWidget(); + +}; // END of class EasyGraphicsViewWidget. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_GRAPHICS_VIEW_H diff --git a/3rdparty/easyprofiler/profiler_gui/blocks_tree_widget.cpp b/3rdparty/easyprofiler/profiler_gui/blocks_tree_widget.cpp new file mode 100644 index 0000000..45e7858 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/blocks_tree_widget.cpp @@ -0,0 +1,1280 @@ +/************************************************************************ +* file name : blocks_tree_widget.cpp +* ----------------- : +* creation time : 2016/06/26 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of EasyTreeWidget and it's auxiliary classes +* : for displyaing easy_profiler blocks tree. +* ----------------- : +* change log : * 2016/06/26 Victor Zarubkin: Moved sources from tree_view.h +* : and renamed classes from My* to Prof*. +* : +* : * 2016/06/27 Victor Zarubkin: Added possibility to colorize rows +* : with profiler blocks' colors. +* : Also added displaying frame statistics for blocks. +* : Disabled sorting by name to save order of threads displayed on graphics view. +* : +* : * 2016/06/29 Victor Zarubkin: Added clearSilent() method. +* : +* : * 2016/08/18 Victor Zarubkin: Moved sources of TreeWidgetItem into tree_widget_item.h/.cpp +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "blocks_tree_widget.h" +#include "globals.h" + +#ifdef _WIN32 +#include + +#ifdef __MINGW32__ +#include +#endif + +#endif + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +////////////////////////////////////////////////////////////////////////// + +const int HIERARCHY_BUILDER_TIMER_INTERVAL = 40; + +const bool SIMPLIFIED_REGIME_COLUMNS[COL_COLUMNS_NUMBER] = { + true, //COL_NAME, + true, //COL_BEGIN, + true, //COL_DURATION, + true, //COL_SELF_DURATION, + false, //COL_DURATION_SUM_PER_PARENT, + false, //COL_DURATION_SUM_PER_FRAME, + true, //COL_DURATION_SUM_PER_THREAD, + true, //COL_SELF_DURATION_PERCENT, + false, //COL_PERCENT_PER_PARENT, + true, //COL_PERCENT_PER_FRAME, + false, //COL_PERCENT_SUM_PER_PARENT, + false, //COL_PERCENT_SUM_PER_FRAME, + true, //COL_PERCENT_SUM_PER_THREAD, + true, //COL_END, + true, //COL_MIN_PER_FRAME, + true, //COL_MAX_PER_FRAME, + true, //COL_AVERAGE_PER_FRAME, + true, //COL_NCALLS_PER_FRAME, + true, //COL_MIN_PER_THREAD, + true, //COL_MAX_PER_THREAD, + true, //COL_AVERAGE_PER_THREAD, + true, //COL_NCALLS_PER_THREAD, + false, //COL_MIN_PER_PARENT, + false, //COL_MAX_PER_PARENT, + false, //COL_AVERAGE_PER_PARENT, + false, //COL_NCALLS_PER_PARENT, + true, //COL_ACTIVE_TIME, + true //COL_ACTIVE_PERCENT, +}; + +////////////////////////////////////////////////////////////////////////// + +EasyTreeWidget::EasyTreeWidget(QWidget* _parent) + : Parent(_parent) + , m_beginTime(::std::numeric_limits::max()) + , m_lastFound(nullptr) + , m_progress(nullptr) + , m_hintLabel(nullptr) + , m_mode(EasyTreeMode_Plain) + , m_bLocked(false) + , m_bSilentExpandCollapse(false) +{ + memset(m_columnsHiddenStatus, 0, sizeof(m_columnsHiddenStatus)); + + setAutoFillBackground(false); + setAlternatingRowColors(true); + setItemsExpandable(true); + setAnimated(true); + setSortingEnabled(false); + setColumnCount(COL_COLUMNS_NUMBER); + setSelectionBehavior(QAbstractItemView::SelectRows); + + auto header_item = new QTreeWidgetItem(); + auto f = header()->font(); + f.setBold(true); + header()->setFont(f);// ::profiler_gui::EFont("Helvetica", 9, QFont::Bold)); + + header_item->setText(COL_NAME, "Name"); + + header_item->setText(COL_BEGIN, "Begin, ms"); + + header_item->setText(COL_DURATION, "Duration"); + header_item->setText(COL_SELF_DURATION, "Self dur."); + //header_item->setToolTip(COL_SELF_DURATION, ""); + header_item->setText(COL_DURATION_SUM_PER_PARENT, "Total / Parent"); + header_item->setText(COL_DURATION_SUM_PER_FRAME, "Total / Frame"); + header_item->setText(COL_DURATION_SUM_PER_THREAD, "Total / Thread"); + + header_item->setText(COL_SELF_DURATION_PERCENT, "Self %"); + header_item->setText(COL_PERCENT_PER_PARENT, "% / Parent"); + header_item->setText(COL_PERCENT_PER_FRAME, "% / Frame"); + header_item->setText(COL_PERCENT_SUM_PER_FRAME, "Sum % / Frame"); + header_item->setText(COL_PERCENT_SUM_PER_PARENT, "Sum % / Parent"); + header_item->setText(COL_PERCENT_SUM_PER_THREAD, "Sum % / Thread"); + + header_item->setText(COL_END, "End, ms"); + + header_item->setText(COL_MIN_PER_FRAME, "Min / Frame"); + header_item->setText(COL_MAX_PER_FRAME, "Max / Frame"); + header_item->setText(COL_AVERAGE_PER_FRAME, "Avg / Frame"); + header_item->setText(COL_NCALLS_PER_FRAME, "N Calls / Frame"); + + header_item->setText(COL_MIN_PER_PARENT, "Min / Parent"); + header_item->setText(COL_MAX_PER_PARENT, "Max / Parent"); + header_item->setText(COL_AVERAGE_PER_PARENT, "Avg / Parent"); + header_item->setText(COL_NCALLS_PER_PARENT, "N Calls / Parent"); + + header_item->setText(COL_MIN_PER_THREAD, "Min / Thread"); + header_item->setText(COL_MAX_PER_THREAD, "Max / Thread"); + header_item->setText(COL_AVERAGE_PER_THREAD, "Avg / Thread"); + header_item->setText(COL_NCALLS_PER_THREAD, "N Calls / Thread"); + + header_item->setText(COL_ACTIVE_TIME, "Active time"); + header_item->setText(COL_ACTIVE_PERCENT, "Active %"); + + auto color = QColor::fromRgb(::profiler::colors::DeepOrange900); + header_item->setForeground(COL_MIN_PER_THREAD, color); + header_item->setForeground(COL_MAX_PER_THREAD, color); + header_item->setForeground(COL_AVERAGE_PER_THREAD, color); + header_item->setForeground(COL_NCALLS_PER_THREAD, color); + header_item->setForeground(COL_PERCENT_SUM_PER_THREAD, color); + header_item->setForeground(COL_DURATION_SUM_PER_THREAD, color); + + color = QColor::fromRgb(::profiler::colors::Blue900); + header_item->setForeground(COL_MIN_PER_FRAME, color); + header_item->setForeground(COL_MAX_PER_FRAME, color); + header_item->setForeground(COL_AVERAGE_PER_FRAME, color); + header_item->setForeground(COL_NCALLS_PER_FRAME, color); + header_item->setForeground(COL_PERCENT_SUM_PER_FRAME, color); + header_item->setForeground(COL_DURATION_SUM_PER_FRAME, color); + header_item->setForeground(COL_PERCENT_PER_FRAME, color); + + color = QColor::fromRgb(::profiler::colors::Teal900); + header_item->setForeground(COL_MIN_PER_PARENT, color); + header_item->setForeground(COL_MAX_PER_PARENT, color); + header_item->setForeground(COL_AVERAGE_PER_PARENT, color); + header_item->setForeground(COL_NCALLS_PER_PARENT, color); + header_item->setForeground(COL_PERCENT_SUM_PER_PARENT, color); + header_item->setForeground(COL_DURATION_SUM_PER_PARENT, color); + header_item->setForeground(COL_PERCENT_PER_PARENT, color); + + setHeaderItem(header_item); + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedThreadChanged, this, &This::onSelectedThreadChange, Qt::QueuedConnection); + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedBlockChanged, this, &This::onSelectedBlockChange, Qt::QueuedConnection); + connect(&m_fillTimer, &QTimer::timeout, this, &This::onFillTimerTimeout); + + loadSettings(); + + m_columnsHiddenStatus[0] = 0; + setColumnHidden(0, false); + + if (m_mode == EasyTreeMode_Full) + { + for (int i = 1; i < COL_COLUMNS_NUMBER; ++i) + m_columnsHiddenStatus[i] = isColumnHidden(i) ? 1 : 0; + } + else + { + for (int i = 1; i < COL_COLUMNS_NUMBER; ++i) + { + if (SIMPLIFIED_REGIME_COLUMNS[i]) + { + if (isColumnHidden(i)) + m_columnsHiddenStatus[i] = 1; + } + else if (!isColumnHidden(i)) + { + setColumnHidden(i, true); + } + } + } + + m_hintLabel = new QLabel("Use Right Mouse Button on the Diagram to build a hierarchy...\nPress and hold, move, release", this); + m_hintLabel->setAlignment(Qt::AlignCenter); + m_hintLabel->setStyleSheet("QLabel { color: gray; font: 12pt; }"); + + QTimer::singleShot(1500, this, &This::alignProgressBar); + + setItemDelegateForColumn(0, new EasyItemDelegate(this)); +} + +EasyTreeWidget::~EasyTreeWidget() +{ + saveSettings(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::onFillTimerTimeout() +{ + if (m_hierarchyBuilder.done()) + { + m_fillTimer.stop(); + + ThreadedItems toplevelitems; + m_hierarchyBuilder.takeItems(m_items); + m_hierarchyBuilder.takeTopLevelItems(toplevelitems); + m_hierarchyBuilder.interrupt(); + { + const QSignalBlocker b(this); + for (auto& item : toplevelitems) + { + addTopLevelItem(item.second); + m_roots[item.first] = item.second; + } + } + + destroyProgressDialog(); + + m_bLocked = false; + m_inputBlocks.clear(); + + setSortingEnabled(true); + + sortByColumn(COL_BEGIN, Qt::AscendingOrder); // sort by begin time + if (m_mode == EasyTreeMode_Plain) // and after that, sort by frame % + sortByColumn(COL_PERCENT_PER_FRAME, Qt::DescendingOrder); + + //resizeColumnToContents(COL_NAME); + resizeColumnsToContents(); + + connect(this, &Parent::itemExpanded, this, &This::onItemExpand); + connect(this, &Parent::itemCollapsed, this, &This::onItemCollapse); + connect(this, &Parent::currentItemChanged, this, &This::onCurrentItemChange); + onSelectedThreadChange(EASY_GLOBALS.selected_thread); + onSelectedBlockChange(EASY_GLOBALS.selected_block); + } + else if (m_progress != nullptr) + { + m_progress->setValue(m_hierarchyBuilder.progress()); + } +} + +void EasyTreeWidget::setTree(const unsigned int _blocksNumber, const ::profiler::thread_blocks_tree_t& _blocksTree) +{ + clearSilent(); + + if (!_blocksTree.empty()) + { + m_bLocked = true; + m_hintLabel->hide(); + createProgressDialog(); + m_hierarchyBuilder.fillTree(m_beginTime, _blocksNumber, _blocksTree, m_mode); + m_fillTimer.start(HIERARCHY_BUILDER_TIMER_INTERVAL); + } + + //StubLocker l; + //ThreadedItems toplevelitems; + //FillTreeClass::setTreeInternal1(l, m_items, toplevelitems, m_beginTime, _blocksNumber, _blocksTree, m_bColorRows); + //{ + // const QSignalBlocker b(this); + // for (auto& item : toplevelitems) + // { + // addTopLevelItem(item.second); + // m_roots[item.first] = item.second; + // if (item.first == EASY_GLOBALS.selected_thread) + // item.second->setMain(true); + // } + //} +} + +void EasyTreeWidget::setTreeBlocks(const ::profiler_gui::TreeBlocks& _blocks, ::profiler::timestamp_t _session_begin_time, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict) +{ + clearSilent(); + + m_beginTime = _session_begin_time; + _left += m_beginTime;// - ::std::min(m_beginTime, 1000ULL); + _right += m_beginTime;// + 1000; + + m_inputBlocks = _blocks; + if (!m_inputBlocks.empty()) + { + m_bLocked = true; + m_hintLabel->hide(); + createProgressDialog(); + m_hierarchyBuilder.fillTreeBlocks(m_inputBlocks, _session_begin_time, _left, _right, _strict, m_mode); + m_fillTimer.start(HIERARCHY_BUILDER_TIMER_INTERVAL); + } + + //StubLocker l; + //ThreadedItems toplevelitems; + //FillTreeClass::setTreeInternal2(l, m_items, toplevelitems, m_beginTime, _blocks, _left, _right, _strict, m_bColorRows); + //{ + // const QSignalBlocker b(this); + // for (auto& item : toplevelitems) + // { + // addTopLevelItem(item.second); + // m_roots[item.first] = item.second; + // if (item.first == EASY_GLOBALS.selected_thread) + // item.second->setMain(true); + // } + //} + + //setSortingEnabled(true); + //sortByColumn(COL_BEGIN, Qt::AscendingOrder); + //resizeColumnToContents(COL_NAME); + + //connect(this, &Parent::itemExpanded, this, &This::onItemExpand); + //connect(this, &Parent::itemCollapsed, this, &This::onItemCollapse); + //onSelectedBlockChange(EASY_GLOBALS.selected_block); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::clearSilent(bool _global) +{ + const QSignalBlocker b(this); + + m_hierarchyBuilder.interrupt(); + destroyProgressDialog(); + m_hintLabel->show(); + + m_bLocked = false; + m_beginTime = ::std::numeric_limits::max(); + + setSortingEnabled(false); + disconnect(this, &Parent::itemExpanded, this, &This::onItemExpand); + disconnect(this, &Parent::itemCollapsed, this, &This::onItemCollapse); + disconnect(this, &Parent::currentItemChanged, this, &This::onCurrentItemChange); + m_lastFound = nullptr; + m_lastSearch.clear(); + + if (!_global) + { + if (EASY_GLOBALS.collapse_items_on_tree_close) +#ifdef EASY_TREE_WIDGET__USE_VECTOR + for (auto item : m_items) +#else + for (auto& item : m_items) +#endif + { +#ifdef EASY_TREE_WIDGET__USE_VECTOR + auto& gui_block = item->guiBlock(); + gui_block.expanded = false; + ::profiler_gui::set_max(gui_block.tree_item); +#else + item.second->guiBlock().expanded = false; +#endif + } +#ifdef EASY_TREE_WIDGET__USE_VECTOR + else for (auto item : m_items) + { + ::profiler_gui::set_max(item->guiBlock().tree_item); + } +#endif + } + + m_items.clear(); + m_roots.clear(); + + ::std::vector topLevelItems; + topLevelItems.reserve(static_cast(topLevelItemCount())); + for (int i = topLevelItemCount() - 1; i >= 0; --i) + topLevelItems.push_back(takeTopLevelItem(i)); + + auto deleter_thread = ::std::thread([](decltype(topLevelItems) _items) + { +#ifdef _WIN32 + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); +#endif + + for (auto item : _items) + delete item; + + }, ::std::move(topLevelItems)); + + deleter_thread.detach(); + + //clear(); + + if (!_global) + emit EASY_GLOBALS.events.itemsExpandStateChanged(); +} + +////////////////////////////////////////////////////////////////////////// + +int EasyTreeWidget::findNext(const QString& _str, Qt::MatchFlags _flags) +{ + if (m_bLocked || _str.isEmpty()) + return 0; + + const bool isNewSearch = (m_lastSearch != _str); + auto itemsList = findItems(_str, Qt::MatchContains | Qt::MatchRecursive | _flags, COL_NAME); + + if (!isNewSearch) + { + if (!itemsList.empty()) + { + bool stop = false; + decltype(m_lastFound) next = nullptr; + for (auto item : itemsList) + { + if (item->parent() == nullptr) + continue; + + if (stop) + { + next = item; + break; + } + + stop = item == m_lastFound; + } + + m_lastFound = next == nullptr ? itemsList.front() : next; + } + else + { + m_lastFound = nullptr; + } + } + else + { + m_lastSearch = _str; + m_lastFound = !itemsList.empty() ? itemsList.front() : nullptr; + } + + if (m_lastFound != nullptr) + { + scrollToItem(m_lastFound, QAbstractItemView::PositionAtCenter); + setCurrentItem(m_lastFound); + } + + return itemsList.size(); +} + +int EasyTreeWidget::findPrev(const QString& _str, Qt::MatchFlags _flags) +{ + if (m_bLocked || _str.isEmpty()) + return 0; + + const bool isNewSearch = (m_lastSearch != _str); + auto itemsList = findItems(_str, Qt::MatchContains | Qt::MatchRecursive | _flags, COL_NAME); + + if (!isNewSearch) + { + if (!itemsList.empty()) + { + decltype(m_lastFound) prev = nullptr; + for (auto item : itemsList) + { + if (item->parent() == nullptr) + continue; + + if (item == m_lastFound) + break; + + prev = item; + } + + m_lastFound = prev == nullptr ? itemsList.back() : prev; + } + else + { + m_lastFound = nullptr; + } + } + else + { + m_lastSearch = _str; + m_lastFound = !itemsList.empty() ? itemsList.front() : nullptr; + } + + if (m_lastFound != nullptr) + { + scrollToItem(m_lastFound, QAbstractItemView::PositionAtCenter); + setCurrentItem(m_lastFound); + } + + return itemsList.size(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::contextMenuEvent(QContextMenuEvent* _event) +{ + if (m_bLocked) + { + _event->accept(); + return; + } + + const auto col = currentColumn(); + auto item = static_cast(currentItem()); + QMenu menu; + menu.setToolTipsVisible(true); + QAction* action = nullptr; + + if (!m_items.empty()) + { + action = menu.addAction("Expand all"); + connect(action, &QAction::triggered, this, &This::onExpandAllClicked); + action->setIcon(QIcon(imagePath("expand"))); + + action = menu.addAction("Collapse all"); + connect(action, &QAction::triggered, this, &This::onCollapseAllClicked); + action->setIcon(QIcon(imagePath("collapse"))); + + if (item != nullptr && col >= 0) + { + menu.addSeparator(); + + action = menu.addAction("Expand all children"); + connect(action, &QAction::triggered, this, &This::onExpandAllChildrenClicked); + action->setIcon(QIcon(imagePath("expand"))); + + action = menu.addAction("Collapse all children"); + connect(action, &QAction::triggered, this, &This::onCollapseAllChildrenClicked); + action->setIcon(QIcon(imagePath("collapse"))); + } + + menu.addSeparator(); + } + + auto actionGroup = new QActionGroup(&menu); + actionGroup->setExclusive(true); + + auto actionHierarchy = new QAction("Hierarchy mode", actionGroup); + actionHierarchy->setCheckable(true); + actionHierarchy->setChecked(m_mode == EasyTreeMode_Full); + actionHierarchy->setToolTip("Display full blocks hierarchy"); + actionHierarchy->setData((quint32)EasyTreeMode_Full); + menu.addAction(actionHierarchy); + + auto actionPlain = new QAction("Plain mode", actionGroup); + actionPlain->setCheckable(true); + actionPlain->setChecked(m_mode == EasyTreeMode_Plain); + actionPlain->setToolTip("Display plain list of blocks per frame.\nSome columns are disabled with this mode."); + actionPlain->setData((quint32)EasyTreeMode_Plain); + menu.addAction(actionPlain); + + connect(actionHierarchy, &QAction::triggered, this, &This::onModeChange); + connect(actionPlain, &QAction::triggered, this, &This::onModeChange); + + menu.addSeparator(); + + if (item != nullptr && item->parent() != nullptr) + { + if (col >= 0) + { + switch (col) + { + case COL_MIN_PER_THREAD: + case COL_MIN_PER_PARENT: + case COL_MIN_PER_FRAME: + case COL_MAX_PER_THREAD: + case COL_MAX_PER_PARENT: + case COL_MAX_PER_FRAME: + { + auto& block = item->block(); + auto i = ::profiler_gui::numeric_max(); + switch (col) + { + case COL_MIN_PER_THREAD: i = block.per_thread_stats->min_duration_block; break; + case COL_MIN_PER_PARENT: i = block.per_parent_stats->min_duration_block; break; + case COL_MIN_PER_FRAME: i = block.per_frame_stats->min_duration_block; break; + case COL_MAX_PER_THREAD: i = block.per_thread_stats->max_duration_block; break; + case COL_MAX_PER_PARENT: i = block.per_parent_stats->max_duration_block; break; + case COL_MAX_PER_FRAME: i = block.per_frame_stats->max_duration_block; break; + } + + if (i != ::profiler_gui::numeric_max(i)) + { + menu.addSeparator(); + auto itemAction = new QAction("Jump to such item", nullptr); + itemAction->setData(i); + itemAction->setToolTip("Jump to item with min/max duration (depending on clicked column)"); + connect(itemAction, &QAction::triggered, this, &This::onJumpToItemClicked); + menu.addAction(itemAction); + } + + break; + } + + default: + break; + } + } + + const auto& desc = easyDescriptor(item->block().node->id()); + auto submenu = menu.addMenu("Block status"); + submenu->setToolTipsVisible(true); + +#define ADD_STATUS_ACTION(NameValue, StatusValue, ToolTipValue)\ + action = submenu->addAction(NameValue);\ + action->setCheckable(true);\ + action->setChecked(desc.status() == StatusValue);\ + action->setData(static_cast(StatusValue));\ + action->setToolTip(ToolTipValue);\ + connect(action, &QAction::triggered, this, &This::onBlockStatusChangeClicked) + + ADD_STATUS_ACTION("Off", ::profiler::OFF, "Do not profile this block."); + ADD_STATUS_ACTION("On", ::profiler::ON, "Profile this block\nif parent enabled children."); + ADD_STATUS_ACTION("Force-On", ::profiler::FORCE_ON, "Always profile this block even\nif it's parent disabled children."); + ADD_STATUS_ACTION("Off-recursive", ::profiler::OFF_RECURSIVE, "Do not profile neither this block\nnor it's children."); + ADD_STATUS_ACTION("On-without-children", ::profiler::ON_WITHOUT_CHILDREN, "Profile this block, but\ndo not profile it's children."); + ADD_STATUS_ACTION("Force-On-without-children", ::profiler::FORCE_ON_WITHOUT_CHILDREN, "Always profile this block, but\ndo not profile it's children."); +#undef ADD_STATUS_ACTION + + submenu->setEnabled(EASY_GLOBALS.connected); + if (!EASY_GLOBALS.connected) + submenu->setTitle(QString("%1 (connection needed)").arg(submenu->title())); + } + + auto hidemenu = menu.addMenu("Select columns"); + auto hdr = headerItem(); + + for (int i = 1; i < COL_COLUMNS_NUMBER; ++i) + { + auto columnAction = new QAction(hdr->text(i), nullptr); + columnAction->setData(i); + columnAction->setCheckable(true); + columnAction->setChecked(m_columnsHiddenStatus[i] == 0); + if ((m_mode == EasyTreeMode_Full || SIMPLIFIED_REGIME_COLUMNS[i])) + connect(columnAction, &QAction::triggered, this, &This::onHideShowColumn); + else + columnAction->setEnabled(false); + hidemenu->addAction(columnAction); + } + + menu.exec(QCursor::pos()); + + _event->accept(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::resizeEvent(QResizeEvent* _event) +{ + Parent::resizeEvent(_event); + alignProgressBar(); +} + +void EasyTreeWidget::moveEvent(QMoveEvent* _event) +{ + Parent::moveEvent(_event); + alignProgressBar(); +} + +void EasyTreeWidget::alignProgressBar() +{ + auto center = rect().center(); + auto pos = mapToGlobal(center); + + if (m_progress != nullptr) + m_progress->move(pos.x() - (m_progress->width() >> 1), pos.y() - (m_progress->height() >> 1)); + + m_hintLabel->move(center.x() - (m_hintLabel->width() >> 1), std::max(center.y() - (m_hintLabel->height() >> 1), header()->height())); +} + +void EasyTreeWidget::destroyProgressDialog() +{ + if (m_progress != nullptr) + { + m_progress->setValue(100); + m_progress->deleteLater(); + m_progress = nullptr; + } +} + +void EasyTreeWidget::createProgressDialog() +{ + destroyProgressDialog(); + + m_progress = new QProgressDialog("Building blocks hierarchy...", "", 0, 100, this, Qt::FramelessWindowHint); + m_progress->setAttribute(Qt::WA_TranslucentBackground); + m_progress->setCancelButton(nullptr); + m_progress->setValue(0); + m_progress->show(); + + alignProgressBar(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::onJumpToItemClicked(bool) +{ + auto action = qobject_cast(sender()); + if (action == nullptr) + return; + + auto block_index = action->data().toUInt(); + EASY_GLOBALS.selected_block = block_index; + if (block_index < EASY_GLOBALS.gui_blocks.size()) + EASY_GLOBALS.selected_block_id = easyBlock(block_index).tree.node->id(); + else + ::profiler_gui::set_max(EASY_GLOBALS.selected_block_id); + emit EASY_GLOBALS.events.selectedBlockChanged(block_index); +} + +void EasyTreeWidget::onCollapseAllClicked(bool) +{ + const QSignalBlocker b(this); + + m_bSilentExpandCollapse = true; + collapseAll(); + m_bSilentExpandCollapse = false; + + if (EASY_GLOBALS.bind_scene_and_tree_expand_status) + { +#ifdef EASY_TREE_WIDGET__USE_VECTOR + for (auto item : m_items) + item->guiBlock().expanded = false; +#else + for (auto& item : m_items) + item.second->guiBlock().expanded = false; +#endif + emit EASY_GLOBALS.events.itemsExpandStateChanged(); + } +} + +void EasyTreeWidget::onExpandAllClicked(bool) +{ + const QSignalBlocker b(this); + + m_bSilentExpandCollapse = true; + expandAll(); + resizeColumnsToContents(); + m_bSilentExpandCollapse = false; + + if (EASY_GLOBALS.bind_scene_and_tree_expand_status) + { +#ifdef EASY_TREE_WIDGET__USE_VECTOR + for (auto item : m_items){ + auto& b = item->guiBlock(); +#else + for (auto& item : m_items){ + auto& b = item.second->guiBlock(); +#endif + b.expanded = !b.tree.children.empty(); + } + + emit EASY_GLOBALS.events.itemsExpandStateChanged(); + } +} + +void EasyTreeWidget::onCollapseAllChildrenClicked(bool) +{ + auto current = static_cast(currentItem()); + if (current != nullptr) + { + const QSignalBlocker b(this); + + m_bSilentExpandCollapse = true; + current->collapseAll(); + m_bSilentExpandCollapse = false; + + emit EASY_GLOBALS.events.itemsExpandStateChanged(); + } +} + +void EasyTreeWidget::onExpandAllChildrenClicked(bool) +{ + auto current = static_cast(currentItem()); + if (current != nullptr) + { + const QSignalBlocker b(this); + + m_bSilentExpandCollapse = true; + current->expandAll(); + resizeColumnsToContents(); + m_bSilentExpandCollapse = false; + + emit EASY_GLOBALS.events.itemsExpandStateChanged(); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::onBlockStatusChangeClicked(bool _checked) +{ + if (!_checked) + return; + + auto item = static_cast(currentItem()); + if (item == nullptr) + return; + + auto action = qobject_cast(sender()); + if (action != nullptr) + { + auto& desc = easyDescriptor(item->block().node->id()); + desc.setStatus(static_cast<::profiler::EasyBlockStatus>(action->data().toUInt())); + emit EASY_GLOBALS.events.blockStatusChanged(desc.id(), desc.status()); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::onItemExpand(QTreeWidgetItem* _item) +{ + if (!EASY_GLOBALS.bind_scene_and_tree_expand_status || _item->parent() == nullptr) + { + resizeColumnsToContents(); + return; + } + + static_cast(_item)->guiBlock().expanded = true; + + if (!m_bSilentExpandCollapse) + { + resizeColumnsToContents(); + emit EASY_GLOBALS.events.itemsExpandStateChanged(); + } +} + +void EasyTreeWidget::onItemCollapse(QTreeWidgetItem* _item) +{ + if (!EASY_GLOBALS.bind_scene_and_tree_expand_status || _item->parent() == nullptr) + return; + + static_cast(_item)->guiBlock().expanded = false; + + if (!m_bSilentExpandCollapse) + emit EASY_GLOBALS.events.itemsExpandStateChanged(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::onCurrentItemChange(QTreeWidgetItem* _item, QTreeWidgetItem* _previous) +{ + if (_previous != nullptr) + static_cast(_previous)->setBold(false); + + if (_item == nullptr) + { + ::profiler_gui::set_max(EASY_GLOBALS.selected_block); + ::profiler_gui::set_max(EASY_GLOBALS.selected_block_id); + } + else + { + auto item = static_cast(_item); + item->setBold(true); + + EASY_GLOBALS.selected_block = item->block_index(); + if (EASY_GLOBALS.selected_block < EASY_GLOBALS.gui_blocks.size()) + EASY_GLOBALS.selected_block_id = easyBlock(EASY_GLOBALS.selected_block).tree.node->id(); + else + ::profiler_gui::set_max(EASY_GLOBALS.selected_block_id); + } + + disconnect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedBlockChanged, this, &This::onSelectedBlockChange); + emit EASY_GLOBALS.events.selectedBlockChanged(EASY_GLOBALS.selected_block); + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedBlockChanged, this, &This::onSelectedBlockChange); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::onSelectedThreadChange(::profiler::thread_id_t _id) +{ + for (auto& it : m_roots) + { + auto item = it.second; + item->setMain(it.first == _id); + } + + // Calling update() or repaint() (or both!) does not work even if setUpdatesEnabled(true) have been set in constructor. + // Have to set focus to this widget to force update/repaint. :( + // TODO: Find valid solution instead of this workaround. + auto f = qApp->focusWidget(); + setFocus(); + if (f != nullptr) + f->setFocus(); +} + +void EasyTreeWidget::onSelectedBlockChange(uint32_t _block_index) +{ + disconnect(this, &Parent::currentItemChanged, this, &This::onCurrentItemChange); + + EasyTreeWidgetItem* item = nullptr; + + if (_block_index < EASY_GLOBALS.gui_blocks.size()) + { +#ifdef EASY_TREE_WIDGET__USE_VECTOR + const auto i = easyBlock(_block_index).tree_item; + if (i < m_items.size()) + item = m_items[i]; +#else + auto it = m_items.find(_block_index); + if (it != m_items.end()) + item = it->second; +#endif + } + + auto previous = static_cast(currentItem()); + if (previous != nullptr) + previous->setBold(false); + + if (item != nullptr) + { + //const QSignalBlocker b(this); + + if (EASY_GLOBALS.bind_scene_and_tree_expand_status) + { + m_bSilentExpandCollapse = true; + setCurrentItem(item); + scrollToItem(item, QAbstractItemView::PositionAtCenter); + if (item->guiBlock().expanded) + expandItem(item); + else + collapseItem(item); + resizeColumnsToContents(); + m_bSilentExpandCollapse = false; + + emit EASY_GLOBALS.events.itemsExpandStateChanged(); + } + else + { + disconnect(this, &Parent::itemExpanded, this, &This::onItemExpand); + setCurrentItem(item); + scrollToItem(item, QAbstractItemView::PositionAtCenter); + resizeColumnsToContents(); + connect(this, &Parent::itemExpanded, this, &This::onItemExpand); + } + + item->setBold(true); + } + else + { + setCurrentItem(item); + } + + connect(this, &Parent::currentItemChanged, this, &This::onCurrentItemChange); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::resizeColumnsToContents() +{ + for (int i = 0; i < COL_COLUMNS_NUMBER; ++i) + { + resizeColumnToContents(i); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::onHideShowColumn(bool) +{ + auto action = qobject_cast(sender()); + if (action == nullptr) + return; + + const auto col = action->data().toInt(); + const bool hideCol = m_columnsHiddenStatus[col] == 0; + setColumnHidden(col, hideCol); + m_columnsHiddenStatus[col] = hideCol ? 1 : 0; +} + +void EasyTreeWidget::onModeChange(bool) +{ + auto action = qobject_cast(sender()); + if (action == nullptr) + return; + + const auto prev = m_mode; + m_mode = static_cast(action->data().toUInt()); + + if (m_mode == prev) + return; + + if (m_mode == EasyTreeMode_Full) + { + for (int i = 1; i < COL_COLUMNS_NUMBER; ++i) + setColumnHidden(i, m_columnsHiddenStatus[i] != 0); + } + else + { + for (int i = 1; i < COL_COLUMNS_NUMBER; ++i) + setColumnHidden(i, m_columnsHiddenStatus[i] != 0 || !SIMPLIFIED_REGIME_COLUMNS[i]); + } + + emit EASY_GLOBALS.events.blocksTreeModeChanged(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidget::loadSettings() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("tree_widget"); + + auto val = settings.value("regime"); + if (!val.isNull()) + m_mode = static_cast(val.toUInt()); + + val = settings.value("columns"); + if (!val.isNull()) + { + auto byteArray = val.toByteArray(); + memcpy(m_columnsHiddenStatus, byteArray.constData(), ::std::min(sizeof(m_columnsHiddenStatus), (size_t)byteArray.size())); + } + + auto state = settings.value("headerState").toByteArray(); + if (!state.isEmpty()) + header()->restoreState(state); + + settings.endGroup(); +} + +void EasyTreeWidget::saveSettings() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("tree_widget"); + settings.setValue("regime", static_cast(m_mode)); + settings.setValue("columns", QByteArray(m_columnsHiddenStatus, COL_COLUMNS_NUMBER)); + settings.setValue("headerState", header()->saveState()); + settings.endGroup(); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +EasyHierarchyWidget::EasyHierarchyWidget(QWidget* _parent) : Parent(_parent) + , m_tree(new EasyTreeWidget(this)) + , m_searchBox(new QLineEdit(this)) + , m_foundNumber(new QLabel("Found 0 matches", this)) + , m_searchButton(nullptr) + , m_bCaseSensitiveSearch(false) +{ + loadSettings(); + + m_searchBox->setFixedWidth(300); + m_searchBox->setContentsMargins(5, 0, 0, 0); + + auto menu = new QMenu(this); + m_searchButton = menu->menuAction(); + m_searchButton->setText("Find next"); + m_searchButton->setIcon(QIcon(imagePath("find-next"))); + m_searchButton->setData(true); + connect(m_searchButton, &QAction::triggered, this, &This::findNext); + + auto actionGroup = new QActionGroup(this); + actionGroup->setExclusive(true); + + auto a = new QAction(tr("Find next"), actionGroup); + a->setCheckable(true); + a->setChecked(true); + connect(a, &QAction::triggered, this, &This::findNextFromMenu); + menu->addAction(a); + + a = new QAction(tr("Find previous"), actionGroup); + a->setCheckable(true); + connect(a, &QAction::triggered, this, &This::findPrevFromMenu); + menu->addAction(a); + + a = menu->addAction("Case sensitive"); + a->setCheckable(true); + a->setChecked(m_bCaseSensitiveSearch); + connect(a, &QAction::triggered, [this](bool _checked){ m_bCaseSensitiveSearch = _checked; }); + menu->addAction(a); + + auto tb = new QToolBar(this); + tb->setIconSize(::profiler_gui::ICONS_SIZE); + tb->setContentsMargins(0, 0, 0, 0); + tb->addAction(m_searchButton); + tb->addWidget(m_searchBox); + + auto searchbox = new QHBoxLayout(); + searchbox->setContentsMargins(0, 0, 5, 0); + searchbox->addWidget(tb); + searchbox->addStretch(100); + searchbox->addWidget(m_foundNumber, Qt::AlignRight); + + auto lay = new QVBoxLayout(this); + lay->setContentsMargins(1, 1, 1, 1); + lay->addLayout(searchbox); + lay->addWidget(m_tree); + + connect(m_searchBox, &QLineEdit::returnPressed, this, &This::onSeachBoxReturnPressed); +} + +EasyHierarchyWidget::~EasyHierarchyWidget() +{ + saveSettings(); +} + +void EasyHierarchyWidget::loadSettings() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("EasyHierarchyWidget"); + + auto val = settings.value("case_sensitive"); + if (!val.isNull()) + m_bCaseSensitiveSearch = val.toBool(); + + settings.endGroup(); +} + +void EasyHierarchyWidget::saveSettings() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("EasyHierarchyWidget"); + settings.setValue("case_sensitive", m_bCaseSensitiveSearch); + settings.endGroup(); +} + +void EasyHierarchyWidget::keyPressEvent(QKeyEvent* _event) +{ + if (_event->key() == Qt::Key_F3) + { + if (_event->modifiers() & Qt::ShiftModifier) + findPrev(true); + else + findNext(true); + } + + _event->accept(); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void EasyHierarchyWidget::contextMenuEvent(QContextMenuEvent* _event) +{ + m_tree->contextMenuEvent(_event); +} + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +EasyTreeWidget* EasyHierarchyWidget::tree() +{ + return m_tree; +} + +void EasyHierarchyWidget::clear(bool _global) +{ + m_tree->clearSilent(_global); + m_foundNumber->setText(QString("Found 0 matches")); +} + +void EasyHierarchyWidget::onSeachBoxReturnPressed() +{ + if (m_searchButton->data().toBool() == true) + findNext(true); + else + findPrev(true); +} + +void EasyHierarchyWidget::findNext(bool) +{ + auto matches = m_tree->findNext(m_searchBox->text(), m_bCaseSensitiveSearch ? Qt::MatchCaseSensitive : Qt::MatchFlags()); + + if (matches == 1) + m_foundNumber->setText(QString("Found 1 match")); + else + m_foundNumber->setText(QString("Found %1 matches").arg(matches)); +} + +void EasyHierarchyWidget::findPrev(bool) +{ + auto matches = m_tree->findPrev(m_searchBox->text(), m_bCaseSensitiveSearch ? Qt::MatchCaseSensitive : Qt::MatchFlags()); + + if (matches == 1) + m_foundNumber->setText(QString("Found 1 match")); + else + m_foundNumber->setText(QString("Found %1 matches").arg(matches)); +} + +void EasyHierarchyWidget::findNextFromMenu(bool _checked) +{ + if (!_checked) + return; + + if (m_searchButton->data().toBool() == false) + { + m_searchButton->setData(true); + m_searchButton->setText(tr("Find next")); + m_searchButton->setIcon(QIcon(imagePath("find-next"))); + disconnect(m_searchButton, &QAction::triggered, this, &This::findPrev); + connect(m_searchButton, &QAction::triggered, this, &This::findNext); + } + + findNext(true); +} + +void EasyHierarchyWidget::findPrevFromMenu(bool _checked) +{ + if (!_checked) + return; + + if (m_searchButton->data().toBool() == true) + { + m_searchButton->setData(false); + m_searchButton->setText(tr("Find prev")); + m_searchButton->setIcon(QIcon(imagePath("find-prev"))); + disconnect(m_searchButton, &QAction::triggered, this, &This::findNext); + connect(m_searchButton, &QAction::triggered, this, &This::findPrev); + } + + findPrev(true); +} + +////////////////////////////////////////////////////////////////////////// diff --git a/3rdparty/easyprofiler/profiler_gui/blocks_tree_widget.h b/3rdparty/easyprofiler/profiler_gui/blocks_tree_widget.h new file mode 100644 index 0000000..f5d484e --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/blocks_tree_widget.h @@ -0,0 +1,219 @@ +/************************************************************************ +* file name : blocks_tree_widget.h +* ----------------- : +* creation time : 2016/06/26 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of EasyTreeWidget and it's auxiliary classes +* : for displyaing EasyProfiler blocks tree. +* ----------------- : +* change log : * 2016/06/26 Victor Zarubkin: moved sources from tree_view.h +* : and renamed classes from My* to Prof*. +* : +* : * 2016/06/27 Victor Zarubkin: Added possibility to colorize rows +* : with profiler blocks' colors. +* : +* : * 2016/06/29 Victor Zarubkin: Added clearSilent() method. +* : +* : * 2016/08/18 Victor Zarubkin: Added loading blocks hierarchy in separate thread; +* : Moved sources of TreeWidgetItem into tree_widget_item.h/.cpp +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_TREE_WIDGET_H +#define EASY_TREE_WIDGET_H + +#include +#include + +#include "tree_widget_loader.h" +#include "tree_widget_item.h" + +#include + +////////////////////////////////////////////////////////////////////////// + +class EasyTreeWidget : public QTreeWidget +{ + Q_OBJECT + + typedef QTreeWidget Parent; + typedef EasyTreeWidget This; + +protected: + + EasyTreeWidgetLoader m_hierarchyBuilder; + Items m_items; + RootsMap m_roots; + ::profiler_gui::TreeBlocks m_inputBlocks; + QTimer m_fillTimer; + QString m_lastSearch; + QTreeWidgetItem* m_lastFound; + ::profiler::timestamp_t m_beginTime; + class QProgressDialog* m_progress; + class QLabel* m_hintLabel; + EasyTreeMode m_mode; + bool m_bLocked; + bool m_bSilentExpandCollapse; + char m_columnsHiddenStatus[COL_COLUMNS_NUMBER]; + +public: + + explicit EasyTreeWidget(QWidget* _parent = nullptr); + virtual ~EasyTreeWidget(); + + void contextMenuEvent(QContextMenuEvent* _event) override; + + void clearSilent(bool _global = false); + int findNext(const QString& _str, Qt::MatchFlags _flags); + int findPrev(const QString& _str, Qt::MatchFlags _flags); + +public slots: + + void setTree(const unsigned int _blocksNumber, const ::profiler::thread_blocks_tree_t& _blocksTree); + + void setTreeBlocks(const ::profiler_gui::TreeBlocks& _blocks, ::profiler::timestamp_t _session_begin_time, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict); + +protected: + + void resizeEvent(QResizeEvent* _event) override; + void moveEvent(QMoveEvent* _event) override; + +private slots: + + void onJumpToItemClicked(bool); + + void onCollapseAllClicked(bool); + + void onExpandAllClicked(bool); + + void onCollapseAllChildrenClicked(bool); + + void onExpandAllChildrenClicked(bool); + + void onItemExpand(QTreeWidgetItem* _item); + void onItemCollapse(QTreeWidgetItem* _item); + void onCurrentItemChange(QTreeWidgetItem* _item, QTreeWidgetItem*); + + void onSelectedThreadChange(::profiler::thread_id_t _id); + + void onSelectedBlockChange(uint32_t _block_index); + + void onBlockStatusChangeClicked(bool); + + void resizeColumnsToContents(); + + void onHideShowColumn(bool); + void onModeChange(bool); + + void onFillTimerTimeout(); + +protected: + + void loadSettings(); + void saveSettings(); + void alignProgressBar(); + +private: + + void destroyProgressDialog(); + void createProgressDialog(); + +}; // END of class EasyTreeWidget. + +////////////////////////////////////////////////////////////////////////// + +class EasyHierarchyWidget : public QWidget +{ + Q_OBJECT + + typedef QWidget Parent; + typedef EasyHierarchyWidget This; + +private: + + EasyTreeWidget* m_tree; + class QLineEdit* m_searchBox; + class QLabel* m_foundNumber; + class QAction* m_searchButton; + bool m_bCaseSensitiveSearch; + +public: + + // Public virtual methods + + explicit EasyHierarchyWidget(QWidget* _parent = nullptr); + virtual ~EasyHierarchyWidget(); + void keyPressEvent(QKeyEvent* _event) override; + void contextMenuEvent(QContextMenuEvent* _event) override; + +public: + + // Public non-virtual methods + + EasyTreeWidget* tree(); + void clear(bool _global = false); + +private slots: + + // Private slots + + void onSeachBoxReturnPressed(); + void findNext(bool); + void findPrev(bool); + void findNextFromMenu(bool); + void findPrevFromMenu(bool); + +private: + + // Private non-virtual methods + + void loadSettings(); + void saveSettings(); + +}; // END of class EasyHierarchyWidget. + + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_TREE_WIDGET_H diff --git a/3rdparty/easyprofiler/profiler_gui/cmake_install.cmake b/3rdparty/easyprofiler/profiler_gui/cmake_install.cmake new file mode 100644 index 0000000..b537650 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/cmake_install.cmake @@ -0,0 +1,54 @@ +# Install script for directory: /home/alex/Work/C++Projects/easyprofiler/profiler_gui + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + +if(NOT CMAKE_INSTALL_COMPONENT OR "${CMAKE_INSTALL_COMPONENT}" STREQUAL "Unspecified") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/profiler_gui" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/profiler_gui") + file(RPATH_CHECK + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/profiler_gui" + RPATH "$ORIGIN:/home/alex/Work/Qt/5.8/gcc_64/lib") + endif() + file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/bin" TYPE EXECUTABLE FILES "/home/alex/Work/C++Projects/easyprofiler/bin/profiler_gui") + if(EXISTS "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/profiler_gui" AND + NOT IS_SYMLINK "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/profiler_gui") + file(RPATH_CHANGE + FILE "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/profiler_gui" + OLD_RPATH "/home/alex/Work/Qt/5.8/gcc_64/lib:/home/alex/Work/C++Projects/easyprofiler/bin:" + NEW_RPATH "$ORIGIN:/home/alex/Work/Qt/5.8/gcc_64/lib") + if(CMAKE_INSTALL_DO_STRIP) + execute_process(COMMAND "/usr/bin/strip" "$ENV{DESTDIR}${CMAKE_INSTALL_PREFIX}/bin/profiler_gui") + endif() + endif() +endif() + diff --git a/3rdparty/easyprofiler/profiler_gui/common_functions.cpp b/3rdparty/easyprofiler/profiler_gui/common_functions.cpp new file mode 100644 index 0000000..9e337d9 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/common_functions.cpp @@ -0,0 +1,345 @@ +/************************************************************************ +* file name : common_functions.cpp +* ----------------- : +* creation time : 2017/12/06 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementaion of common functions used by different UI widgets. +* ----------------- : +* change log : * 2017/12/06 Victor Zarubkin: Initial commit. Moved sources from common_types.h +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include "common_functions.h" + +namespace profiler_gui { + + ////////////////////////////////////////////////////////////////////////// + + qreal timeFactor(qreal _interval) + { + if (_interval < 1) // interval in nanoseconds + return 1e3; + + if (_interval < 1e3) // interval in microseconds + return 1; + + if (_interval < 1e6) // interval in milliseconds + return 1e-3; + + // interval in seconds + return 1e-6; + } + + ////////////////////////////////////////////////////////////////////////// + + QString autoTimeStringReal(qreal _interval, int _precision) + { + if (_interval < 1) // interval in nanoseconds + return QString("%1 ns").arg(static_cast(_interval * 1e3)); + + if (_interval < 1e3) // interval in microseconds + return QString("%1 us").arg(_interval, 0, 'f', _precision); + + if (_interval < 1e6) // interval in milliseconds + return QString("%1 ms").arg(_interval * 1e-3, 0, 'f', _precision); + + // interval in seconds + return QString("%1 s").arg(_interval * 1e-6, 0, 'f', _precision); + } + + QString autoTimeStringInt(qreal _interval) + { + if (_interval < 1) // interval in nanoseconds + return QString("%1 ns").arg(static_cast(_interval * 1e3 + 0.5)); + + if (_interval < 1e3) // interval in microseconds + return QString("%1 us").arg(static_cast(_interval + 0.5)); + + if (_interval < 1e6) // interval in milliseconds + return QString("%1 ms").arg(static_cast(_interval * 1e-3 + 0.5)); + + // interval in seconds + return QString("%1 s").arg(static_cast(_interval * 1e-6 + 0.5)); + } + + QString autoTimeStringRealNs(::profiler::timestamp_t _interval, int _precision) + { + if (_interval < 1000) // interval in nanoseconds + return QString("%1 ns").arg(_interval); + + if (_interval < 1000000) // interval in microseconds + return QString("%1 us").arg(_interval * 1e-3, 0, 'f', _precision); + + if (_interval < 1000000000U) // interval in milliseconds + return QString("%1 ms").arg(_interval * 1e-6, 0, 'f', _precision); + + // interval in seconds + return QString("%1 s").arg(_interval * 1e-9, 0, 'f', _precision); + } + + QString autoTimeStringIntNs(::profiler::timestamp_t _interval) + { + if (_interval < 1000) // interval in nanoseconds + return QString("%1 ns").arg(_interval); + + if (_interval < 1000000) // interval in microseconds + return QString("%1 us").arg(static_cast(_interval * 1e-3 + 0.5)); + + if (_interval < 1000000000U) // interval in milliseconds + return QString("%1 ms").arg(static_cast(_interval * 1e-6 + 0.5)); + + // interval in seconds + return QString("%1 s").arg(static_cast(_interval * 1e-9 + 0.5)); + } + + ////////////////////////////////////////////////////////////////////////// + + QString timeStringReal(TimeUnits _units, qreal _interval, int _precision) + { + switch (_units) + { + case TimeUnits_ms:{ + const char fmt = _interval <= 1 ? 'g' : 'f'; + return QString("%1 ms").arg(_interval * 1e-3, 0, fmt, _precision); + } + + case TimeUnits_us: + return QString("%1 us").arg(_interval, 0, 'f', _precision); + + case TimeUnits_ns: + return QString("%1 ns").arg(static_cast(_interval * 1e3 + 0.5)); + + case TimeUnits_auto: + default: + return autoTimeStringReal(_interval, _precision); + } + } + + QString timeStringRealNs(TimeUnits _units, ::profiler::timestamp_t _interval, int _precision) + { + switch (_units) + { + case TimeUnits_ms:{ + const char fmt = _interval <= 1000 ? 'g' : 'f'; + return QString("%1 ms").arg(_interval * 1e-6, 0, fmt, _precision); + } + + case TimeUnits_us: + return QString("%1 us").arg(_interval * 1e-3, 0, 'f', _precision); + + case TimeUnits_ns: + return QString("%1 ns").arg(_interval); + + case TimeUnits_auto: + default: + return autoTimeStringRealNs(_interval, _precision); + } + } + + QString timeStringInt(TimeUnits _units, qreal _interval) + { + switch (_units) + { + case TimeUnits_ms: + return QString("%1 ms").arg(static_cast(_interval * 1e-3 + 0.5)); + + case TimeUnits_us: + return QString("%1 us").arg(static_cast(_interval + 0.5)); + + case TimeUnits_ns: + return QString("%1 ns").arg(static_cast(_interval * 1e3 + 0.5)); + + case TimeUnits_auto: + default: + return autoTimeStringInt(_interval); + } + } + + QString timeStringIntNs(TimeUnits _units, ::profiler::timestamp_t _interval) + { + switch (_units) + { + case TimeUnits_ms: + return QString("%1 ms").arg(static_cast(_interval * 1e-6 + 0.5)); + + case TimeUnits_us: + return QString("%1 us").arg(static_cast(_interval * 1e-3 + 0.5)); + + case TimeUnits_ns: + return QString("%1 ns").arg(_interval); + + case TimeUnits_auto: + default: + return autoTimeStringIntNs(_interval); + } + } + + ////////////////////////////////////////////////////////////////////////// + + QFont EFont(QFont::StyleHint _hint, const char* _family, int _size, int _weight) + { + QFont f; + f.setStyleHint(_hint, QFont::PreferMatch); + f.setFamily(_family); + f.setPointSize(_size); + f.setWeight(_weight); + return f; + } + + ////////////////////////////////////////////////////////////////////////// + + QString valueTypeString(::profiler::DataType _dataType) + { + switch (_dataType) + { + case ::profiler::DataType::Bool: return QStringLiteral("bool"); + case ::profiler::DataType::Char: return QStringLiteral("char"); + case ::profiler::DataType::Int8: return QStringLiteral("int8"); + case ::profiler::DataType::Uint8: return QStringLiteral("unsigned int8"); + case ::profiler::DataType::Int16: return QStringLiteral("int16"); + case ::profiler::DataType::Uint16: return QStringLiteral("unsigned int16"); + case ::profiler::DataType::Int32: return QStringLiteral("int32"); + case ::profiler::DataType::Uint32: return QStringLiteral("unsigned int32"); + case ::profiler::DataType::Int64: return QStringLiteral("int64"); + case ::profiler::DataType::Uint64: return QStringLiteral("unsigned int64"); + case ::profiler::DataType::Float: return QStringLiteral("float"); + case ::profiler::DataType::Double: return QStringLiteral("double"); + case ::profiler::DataType::String: return QStringLiteral("string"); + default: return QStringLiteral("unknown"); + } + } + + QString valueTypeString(const ::profiler::ArbitraryValue& _serializedValue) + { + const auto type = _serializedValue.type(); + if (_serializedValue.isArray() && type != ::profiler::DataType::String) + return valueTypeString(type) + QStringLiteral("[]"); + return valueTypeString(type); + } + + QString valueString(const ::profiler::ArbitraryValue& _serializedValue) + { + if (_serializedValue.isArray()) + { + if (_serializedValue.type() == ::profiler::DataType::String) + return _serializedValue.data(); + return QStringLiteral("[...] array"); + } + + switch (_serializedValue.type()) + { + case ::profiler::DataType::Bool: return _serializedValue.toValue()->value() ? QStringLiteral("true") : QStringLiteral("false"); + case ::profiler::DataType::Char: return QChar(_serializedValue.toValue()->value()); + case ::profiler::DataType::Int8: return QChar(_serializedValue.toValue()->value()); + case ::profiler::DataType::Uint8: return QString::number(_serializedValue.toValue()->value()); + case ::profiler::DataType::Int16: return QString::number(_serializedValue.toValue()->value()); + case ::profiler::DataType::Uint16: return QString::number(_serializedValue.toValue()->value()); + case ::profiler::DataType::Int32: return QString::number(_serializedValue.toValue()->value()); + case ::profiler::DataType::Uint32: return QString::number(_serializedValue.toValue()->value()); + case ::profiler::DataType::Int64: return QString::number(_serializedValue.toValue()->value()); + case ::profiler::DataType::Uint64: return QString::number(_serializedValue.toValue()->value()); + case ::profiler::DataType::Float: return QString::number(_serializedValue.toValue()->value()); + case ::profiler::DataType::Double: return QString::number(_serializedValue.toValue()->value()); + case ::profiler::DataType::String: return _serializedValue.data(); + default: return QStringLiteral("Unknown"); + } + } + + double value2real(const ::profiler::ArbitraryValue& _serializedValue, int _index) + { + if (_serializedValue.isArray()) + { + switch (_serializedValue.type()) + { + case ::profiler::DataType::Bool: + { + const auto value = _serializedValue.toArray()->at(_index); + return value ? 1 : 0; + } + + case ::profiler::DataType::Char: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Int8: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Uint8: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Int16: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Uint16: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Int32: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Uint32: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Int64: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Uint64: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Float: return static_cast(_serializedValue.toArray()->at(_index)); + case ::profiler::DataType::Double: return _serializedValue.toArray()->at(_index); + case ::profiler::DataType::String: return static_cast(_serializedValue.data()[_index]); + default: return 0; + } + } + + switch (_serializedValue.type()) + { + case ::profiler::DataType::Bool: + { + const auto value = _serializedValue.toValue()->value(); + return value ? 1 : 0; + } + + case ::profiler::DataType::Char: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Int8: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Uint8: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Int16: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Uint16: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Int32: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Uint32: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Int64: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Uint64: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Float: return static_cast(_serializedValue.toValue()->value()); + case ::profiler::DataType::Double: return _serializedValue.toValue()->value(); + case ::profiler::DataType::String: return static_cast(_serializedValue.data()[_index]); + default: return 0; + } + } + + ////////////////////////////////////////////////////////////////////////// + +} // end of namespace profiler_gui. diff --git a/3rdparty/easyprofiler/profiler_gui/common_functions.h b/3rdparty/easyprofiler/profiler_gui/common_functions.h new file mode 100644 index 0000000..7528962 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/common_functions.h @@ -0,0 +1,205 @@ +/************************************************************************ +* file name : common_functions.h +* ----------------- : +* creation time : 2017/12/06 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains common functions used by different UI widgets. +* ----------------- : +* change log : * 2017/12/06 Victor Zarubkin: Initial commit. Moved sources from common_types.h +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER_GUI_COMMON_FUNCTIONS_H +#define EASY_PROFILER_GUI_COMMON_FUNCTIONS_H + +#include +#include +#include +#include +#include "common_types.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#define PROF_MICROSECONDS(timestamp) ((timestamp) * 1e-3) +//#define PROF_MICROSECONDS(timestamp) (timestamp) + +#define PROF_FROM_MICROSECONDS(to_timestamp) ((to_timestamp) * 1e3) +//#define PROF_FROM_MICROSECONDS(to_timestamp) (to_timestamp) + +#define PROF_MILLISECONDS(timestamp) ((timestamp) * 1e-6) +//#define PROF_MILLISECONDS(timestamp) ((timestamp) * 1e-3) + +#define PROF_FROM_MILLISECONDS(to_timestamp) ((to_timestamp) * 1e6) +//#define PROF_FROM_MILLISECONDS(to_timestamp) ((to_timestamp) * 1e3) + +#define PROF_NANOSECONDS(timestamp) (timestamp) +//#define PROF_NANOSECONDS(timestamp) ((timestamp) * 1000) + +////////////////////////////////////////////////////////////////////////// + +EASY_FORCE_INLINE qreal units2microseconds(qreal _value) { + return _value; + //return _value * 1e3; +} + +EASY_FORCE_INLINE qreal microseconds2units(qreal _value) { + return _value; + //return _value * 1e-3; +} + +#ifdef EASY_CONSTEXPR_AVAILABLE +template +EASY_FORCE_INLINE EASY_CONSTEXPR_FCN typename ::std::underlying_type::type int_cast(TEnum _enumValue) { + return static_cast::type>(_enumValue); +} +#else +# define int_cast(_enumValue) static_cast<::std::underlying_type::type>(_enumValue) +#endif + +////////////////////////////////////////////////////////////////////////// + +namespace profiler_gui { + +////////////////////////////////////////////////////////////////////////// + +template inline +EASY_CONSTEXPR_FCN T numeric_max() { + return ::std::numeric_limits::max(); +} + +template inline +EASY_CONSTEXPR_FCN T numeric_max(T) { + return ::std::numeric_limits::max(); +} + +template inline +EASY_CONSTEXPR_FCN bool is_max(const T& _value) { + return _value == ::std::numeric_limits::max(); +} + +template inline +void set_max(T& _value) { + _value = ::std::numeric_limits::max(); +} + +////////////////////////////////////////////////////////////////////////// + +inline EASY_CONSTEXPR_FCN QRgb toRgb(uint32_t _red, uint32_t _green, uint32_t _blue) { + return (_red << 16) + (_green << 8) + _blue; +} + +inline EASY_CONSTEXPR_FCN QRgb fromProfilerRgb(uint32_t _red, uint32_t _green, uint32_t _blue) { + return _red == 0 && _green == 0 && _blue == 0 ? ::profiler::colors::Default : toRgb(_red, _green, _blue) | 0x00141414; +} + +EASY_FORCE_INLINE EASY_CONSTEXPR_FCN qreal colorSum(::profiler::color_t _color) { + return 255. - (((_color & 0x00ff0000) >> 16) * 0.299 + ((_color & 0x0000ff00) >> 8) * 0.587 + (_color & 0x000000ff) * 0.114); +} + +inline EASY_CONSTEXPR_FCN bool isLightColor(::profiler::color_t _color) { + return colorSum(_color) < 76.5 || ((_color & 0xff000000) >> 24) < 0x80; +} + +inline EASY_CONSTEXPR_FCN bool isLightColor(::profiler::color_t _color, qreal _maxSum) { + return colorSum(_color) < _maxSum || ((_color & 0xff000000) >> 24) < 0x80; +} + +inline EASY_CONSTEXPR_FCN ::profiler::color_t textColorForFlag(bool _is_light) { + return _is_light ? ::profiler::colors::Dark : ::profiler::colors::CreamWhite; +} + +inline EASY_CONSTEXPR_FCN ::profiler::color_t textColorForRgb(::profiler::color_t _color) { + return isLightColor(_color) ? ::profiler::colors::Dark : ::profiler::colors::CreamWhite; +} + +////////////////////////////////////////////////////////////////////////// + +qreal timeFactor(qreal _interval); + +QString autoTimeStringReal(qreal _interval, int _precision = 1); +QString autoTimeStringInt(qreal _interval); +QString autoTimeStringRealNs(::profiler::timestamp_t _interval, int _precision = 1); +QString autoTimeStringIntNs(::profiler::timestamp_t _interval); + +QString timeStringReal(TimeUnits _units, qreal _interval, int _precision = 1); +QString timeStringRealNs(TimeUnits _units, ::profiler::timestamp_t _interval, int _precision = 1); +QString timeStringInt(TimeUnits _units, qreal _interval); +QString timeStringIntNs(TimeUnits _units, ::profiler::timestamp_t _interval); + +////////////////////////////////////////////////////////////////////////// + +inline double percentReal(::profiler::timestamp_t _partial, ::profiler::timestamp_t _total) { + return _total != 0 ? 100. * static_cast(_partial) / static_cast(_total) : 0.; +} + +inline int percent(::profiler::timestamp_t _partial, ::profiler::timestamp_t _total) { + return static_cast(0.5 + percentReal(_partial, _total)); +} + +////////////////////////////////////////////////////////////////////////// + +QFont EFont(QFont::StyleHint _hint, const char* _family, int _size, int _weight = -1); + +inline QFont EFont(const char* _family, int _size, int _weight = -1) { + return EFont(QFont::Helvetica, _family, _size, _weight); +} + +////////////////////////////////////////////////////////////////////////// + +QString valueTypeString(::profiler::DataType _dataType); +QString valueTypeString(const ::profiler::ArbitraryValue& _serializedValue); +QString valueString(const ::profiler::ArbitraryValue& _serializedValue); +double value2real(const ::profiler::ArbitraryValue& _serializedValue, int _index = 0); + +////////////////////////////////////////////////////////////////////////// + +} // END of namespace profiler_gui. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER_GUI_COMMON_FUNCTIONS_H diff --git a/3rdparty/easyprofiler/profiler_gui/common_types.h b/3rdparty/easyprofiler/profiler_gui/common_types.h new file mode 100644 index 0000000..c272703 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/common_types.h @@ -0,0 +1,205 @@ +/************************************************************************ +* file name : common_types.h +* ----------------- : +* creation time : 2016/07/31 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of common types for both GraphicsView +* : and TreeWidget. +* ----------------- : +* change log : * 2016/07/31 Victor Zarubkin: initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER__GUI_COMMON_TYPES_H +#define EASY_PROFILER__GUI_COMMON_TYPES_H + +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +namespace profiler_gui { + +#define EASY_GRAPHICS_ITEM_RECURSIVE_PAINT +//#undef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + +#pragma pack(push, 1) +struct EasyBlockItem Q_DECL_FINAL +{ + qreal x; ///< x coordinate of the item (this is made qreal=double to avoid mistakes on very wide scene) + float w; ///< Width of the item + ::profiler::block_index_t block; ///< Index of profiler block + +#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + ::profiler::block_index_t neighbours; ///< Number of neighbours (parent.children.size()) + uint32_t children_begin; ///< Index of first child item on the next sublevel + int8_t state; ///< 0 = no change, 1 = paint, -1 = do not paint +#else + ::profiler::block_index_t max_depth_child; ///< Index of child with maximum tree depth + uint32_t children_begin; ///< Index of first child item on the next sublevel +#endif + + // Possible optimizations: + // 1) We can save 1 more byte per block if we will use char instead of short + real time calculations for "totalHeight" var; + // 2) We can save 12 bytes per block if "x" and "w" vars will be removed (all this information exist inside BlocksTree), + // but this requires runtime x-coodinate calculation because BlocksTree has x value in nanoseconds. + + inline void setPos(qreal _x, float _w) { x = _x; w = _w; } + inline qreal left() const { return x; } + inline qreal right() const { return x + w; } + inline float width() const { return w; } + +}; // END of struct EasyBlockItem. + +//#define EASY_TREE_WIDGET__USE_VECTOR +struct EasyBlock Q_DECL_FINAL +{ + ::profiler::BlocksTree tree; +#ifdef EASY_TREE_WIDGET__USE_VECTOR + uint32_t tree_item; +#endif + uint32_t graphics_item_index; + uint8_t graphics_item_level; + uint8_t graphics_item; + bool expanded; + + EasyBlock() = default; + + EasyBlock(EasyBlock&& that) + : tree(::std::move(that.tree)) +#ifdef EASY_TREE_WIDGET__USE_VECTOR + , tree_item(that.tree_item) +#endif + , graphics_item_index(that.graphics_item_index) + , graphics_item_level(that.graphics_item_level) + , graphics_item(that.graphics_item) + , expanded(that.expanded) + { + } + +private: + + EasyBlock(const EasyBlock&) = delete; +}; +#pragma pack(pop) + +typedef ::std::vector EasyItems; +typedef ::std::vector EasyBlocks; + +////////////////////////////////////////////////////////////////////////// + +struct EasySelectedBlock Q_DECL_FINAL +{ + const ::profiler::BlocksTreeRoot* root; + ::profiler::block_index_t tree; + + EasySelectedBlock() : root(nullptr), tree(0xffffffff) + { + } + + EasySelectedBlock(const ::profiler::BlocksTreeRoot* _root, const ::profiler::block_index_t _tree) + : root(_root) + , tree(_tree) + { + } + +}; // END of struct EasySelectedBlock. + +typedef ::std::vector TreeBlocks; + +////////////////////////////////////////////////////////////////////////// + +enum TimeUnits : int8_t +{ + TimeUnits_ms = 0, + TimeUnits_us, + TimeUnits_ns, + TimeUnits_auto + +}; // END of enum TimeUnits. + +////////////////////////////////////////////////////////////////////////// + +} // END of namespace profiler_gui. + +template +struct Overload +{ + template + static EASY_CONSTEXPR_FCN auto of(TReturn (TClass::*method)(Args...)) -> decltype(method) + { + return method; + } + + template + static EASY_CONSTEXPR_FCN auto of(TReturn (*func)(Args...)) -> decltype(func) + { + return func; + } +}; + +template <> +struct Overload +{ + template + static EASY_CONSTEXPR_FCN auto of(TReturn (TClass::*method)()) -> decltype(method) + { + return method; + } + + template + static EASY_CONSTEXPR_FCN auto of(TReturn (*func)()) -> decltype(func) + { + return func; + } +}; + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER__GUI_COMMON_TYPES_H diff --git a/3rdparty/easyprofiler/profiler_gui/descriptors_tree_widget.cpp b/3rdparty/easyprofiler/profiler_gui/descriptors_tree_widget.cpp new file mode 100644 index 0000000..4d4c813 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/descriptors_tree_widget.cpp @@ -0,0 +1,982 @@ +/************************************************************************ +* file name : descriptors_tree_widget.cpp +* ----------------- : +* creation time : 2016/09/17 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of EasyDescTreeWidget and it's auxiliary classes +* : for displyaing EasyProfiler blocks descriptors tree. +* ----------------- : +* change log : * 2016/09/17 Victor Zarubkin: initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "descriptors_tree_widget.h" +#include "arbitrary_value_inspector.h" +#include "treeview_first_column_delegate.h" +#include "globals.h" + +#ifdef _WIN32 +#include + +#ifdef __MINGW32__ +#include +#endif + +#endif + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +////////////////////////////////////////////////////////////////////////// + +enum DescColumns +{ + DESC_COL_FILE_LINE = 0, + DESC_COL_TYPE, + DESC_COL_NAME, + DESC_COL_STATUS, + + DESC_COL_COLUMNS_NUMBER +}; + +////////////////////////////////////////////////////////////////////////// + +::profiler::EasyBlockStatus nextStatus(::profiler::EasyBlockStatus _status) +{ + switch (_status) + { + case ::profiler::OFF: + return ::profiler::ON; + + case ::profiler::ON: + return ::profiler::FORCE_ON; + + case ::profiler::FORCE_ON: + return ::profiler::OFF_RECURSIVE; + + case ::profiler::OFF_RECURSIVE: + return ::profiler::ON_WITHOUT_CHILDREN; + + case ::profiler::ON_WITHOUT_CHILDREN: + return ::profiler::FORCE_ON_WITHOUT_CHILDREN; + + case ::profiler::FORCE_ON_WITHOUT_CHILDREN: + return ::profiler::OFF; + } + + return ::profiler::OFF; +} + +const char* statusText(::profiler::EasyBlockStatus _status) +{ + switch (_status) + { + case ::profiler::OFF: + return "OFF"; + + case ::profiler::ON: + return "ON"; + + case ::profiler::FORCE_ON: + return "FORCE_ON"; + + case ::profiler::OFF_RECURSIVE: + return "OFF_RECURSIVE"; + + case ::profiler::ON_WITHOUT_CHILDREN: + return "ON_WITHOUT_CHILDREN"; + + case ::profiler::FORCE_ON_WITHOUT_CHILDREN: + return "FORCE_ON_WITHOUT_CHILDREN"; + } + + return ""; +} + +::profiler::color_t statusColor(::profiler::EasyBlockStatus _status) +{ + switch (_status) + { + case ::profiler::OFF: + return ::profiler::colors::Red900; + + case ::profiler::ON: + return ::profiler::colors::LightGreen900; + + case ::profiler::FORCE_ON: + return ::profiler::colors::LightGreen900; + + case ::profiler::OFF_RECURSIVE: + return ::profiler::colors::Red900; + + case ::profiler::ON_WITHOUT_CHILDREN: + return ::profiler::colors::Lime900; + + case ::profiler::FORCE_ON_WITHOUT_CHILDREN: + return ::profiler::colors::Lime900; + } + + return ::profiler::colors::Black; +} + +////////////////////////////////////////////////////////////////////////// + +EasyDescWidgetItem::EasyDescWidgetItem(::profiler::block_id_t _desc, Parent* _parent) + : Parent(_parent, QTreeWidgetItem::UserType) + , m_desc(_desc) + , m_type(EasyDescWidgetItem::Type::File) +{ + +} + +EasyDescWidgetItem::~EasyDescWidgetItem() +{ + +} + +bool EasyDescWidgetItem::operator < (const Parent& _other) const +{ + const auto col = treeWidget()->sortColumn(); + + switch (col) + { + case DESC_COL_FILE_LINE: + { + if (parent() != nullptr) + return data(col, Qt::UserRole).toInt() < _other.data(col, Qt::UserRole).toInt(); + } + } + + return Parent::operator < (_other); +} + +QVariant EasyDescWidgetItem::data(int _column, int _role) const +{ + if (_column == DESC_COL_TYPE) + { + if (_role == Qt::ToolTipRole) + { + switch (m_type) + { + case Type::File: return QStringLiteral("File"); + case Type::Event: return QStringLiteral("Event"); + case Type::Block: return QStringLiteral("Block"); + case Type::Value: return QStringLiteral("Arbitrary Value"); + } + } + else if (_role == Qt::DisplayRole) + { + switch (m_type) + { + case Type::File: return QStringLiteral("F"); + case Type::Event: return QStringLiteral("E"); + case Type::Block: return QStringLiteral("B"); + case Type::Value: return QStringLiteral("V"); + } + } + } + + return QTreeWidgetItem::data(_column, _role); +} + +////////////////////////////////////////////////////////////////////////// + +EasyDescTreeWidget::EasyDescTreeWidget(QWidget* _parent) + : Parent(_parent) + , m_lastFound(nullptr) + , m_lastSearchColumn(-1) + , m_searchColumn(DESC_COL_NAME) + , m_bLocked(false) +{ + setAutoFillBackground(false); + setAlternatingRowColors(true); + setItemsExpandable(true); + setAnimated(true); + setSortingEnabled(false); + setColumnCount(DESC_COL_COLUMNS_NUMBER); + setSelectionBehavior(QAbstractItemView::SelectRows); + + auto header_item = new QTreeWidgetItem(); + header_item->setText(DESC_COL_FILE_LINE, "File/Line"); + header_item->setText(DESC_COL_TYPE, "Type"); + header_item->setText(DESC_COL_NAME, "Name"); + header_item->setText(DESC_COL_STATUS, "Status"); + setHeaderItem(header_item); + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::selectedBlockChanged, this, &This::onSelectedBlockChange); + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::blockStatusChanged, this, &This::onBlockStatusChange); + connect(this, &Parent::itemExpanded, this, &This::onItemExpand); + connect(this, &Parent::itemDoubleClicked, this, &This::onDoubleClick); + connect(this, &Parent::currentItemChanged, this, &This::onCurrentItemChange); + + loadSettings(); + + setItemDelegateForColumn(0, new EasyTreeViewFirstColumnItemDelegate(this)); +} + +EasyDescTreeWidget::~EasyDescTreeWidget() +{ + if (::profiler_gui::is_max(EASY_GLOBALS.selected_block) && !::profiler_gui::is_max(EASY_GLOBALS.selected_block_id)) + { + ::profiler_gui::set_max(EASY_GLOBALS.selected_block_id); + emit EASY_GLOBALS.events.refreshRequired(); + } + + saveSettings(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::setSearchColumn(int column) +{ + m_searchColumn = column; +} + +int EasyDescTreeWidget::searchColumn() const +{ + return m_searchColumn; +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::contextMenuEvent(QContextMenuEvent* _event) +{ + _event->accept(); + + QMenu menu; + menu.setToolTipsVisible(true); + auto action = menu.addAction("Expand all"); + action->setIcon(QIcon(imagePath("expand"))); + connect(action, &QAction::triggered, this, &This::expandAll); + + action = menu.addAction("Collapse all"); + action->setIcon(QIcon(imagePath("collapse"))); + connect(action, &QAction::triggered, this, &This::collapseAll); + + auto item = currentItem(); + if (item != nullptr && item->parent() != nullptr && currentColumn() >= DESC_COL_TYPE) + { + const auto& desc = easyDescriptor(static_cast(item)->desc()); + + menu.addSeparator(); + auto submenu = menu.addMenu("Change status"); + submenu->setToolTipsVisible(true); + +#define ADD_STATUS_ACTION(NameValue, StatusValue, ToolTipValue)\ + action = submenu->addAction(NameValue);\ + action->setCheckable(true);\ + action->setChecked(desc.status() == StatusValue);\ + action->setData(static_cast(StatusValue));\ + action->setToolTip(ToolTipValue);\ + connect(action, &QAction::triggered, this, &This::onBlockStatusChangeClicked) + + ADD_STATUS_ACTION("Off", ::profiler::OFF, "Do not profile this block."); + ADD_STATUS_ACTION("On", ::profiler::ON, "Profile this block\nif parent enabled children."); + ADD_STATUS_ACTION("Force-On", ::profiler::FORCE_ON, "Always profile this block even\nif it's parent disabled children."); + ADD_STATUS_ACTION("Off-recursive", ::profiler::OFF_RECURSIVE, "Do not profile neither this block\nnor it's children."); + ADD_STATUS_ACTION("On-without-children", ::profiler::ON_WITHOUT_CHILDREN, "Profile this block, but\ndo not profile it's children."); + ADD_STATUS_ACTION("Force-On-without-children", ::profiler::FORCE_ON_WITHOUT_CHILDREN, "Always profile this block, but\ndo not profile it's children."); +#undef ADD_STATUS_ACTION + + submenu->setEnabled(EASY_GLOBALS.connected); + if (!EASY_GLOBALS.connected) + submenu->setTitle(QString("%1 (connection needed)").arg(submenu->title())); + } + + menu.exec(QCursor::pos()); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::clearSilent(bool _global) +{ + const QSignalBlocker b(this); + + setSortingEnabled(false); + m_lastFound = nullptr; + m_lastSearch.clear(); + + m_highlightItems.clear(); + m_items.clear(); + + ::std::vector topLevelItems; + topLevelItems.reserve(topLevelItemCount()); + for (int i = topLevelItemCount() - 1; i >= 0; --i) + { + const bool expanded = !_global && topLevelItem(i)->isExpanded(); + auto item = takeTopLevelItem(i); + if (expanded) + m_expandedFilesTemp.insert(item->text(DESC_COL_FILE_LINE).toStdString()); + topLevelItems.push_back(item); + } + + auto deleter_thread = ::std::thread([](decltype(topLevelItems) _items) + { +#ifdef _WIN32 + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); +#endif + + for (auto item : _items) + delete item; + + }, ::std::move(topLevelItems)); + + deleter_thread.detach(); + + //clear(); +} + +////////////////////////////////////////////////////////////////////////// + +struct FileItems +{ + using Items = ::std::unordered_map >; + Items children; + QTreeWidgetItem* item = nullptr; +}; + +void EasyDescTreeWidget::build() +{ + auto f = font(); + f.setBold(true); + + typedef ::std::unordered_map<::std::string, FileItems> Files; + Files fileItems; + + m_items.resize(EASY_GLOBALS.descriptors.size()); + memset(m_items.data(), 0, sizeof(void*) * m_items.size()); + + const QSignalBlocker b(this); + ::profiler::block_id_t id = 0; + for (auto desc : EASY_GLOBALS.descriptors) + { + if (desc != nullptr) + { + auto& p = fileItems[desc->file()]; + if (p.item == nullptr) + { + auto item = new EasyDescWidgetItem(0); + item->setText(DESC_COL_FILE_LINE, QString(desc->file()).remove(QRegExp("^(\\.{2}\\\\+|\\/+)+"))); + item->setType(EasyDescWidgetItem::Type::File); + p.item = item; + } + + auto it = p.children.find(desc->line()); + if (it == p.children.end()) + { + auto item = new EasyDescWidgetItem(desc->id(), p.item); + item->setText(DESC_COL_FILE_LINE, QString::number(desc->line())); + item->setData(DESC_COL_FILE_LINE, Qt::UserRole, desc->line()); + item->setText(DESC_COL_NAME, desc->name()); + + switch (desc->type()) + { + case ::profiler::BlockType::Block: + item->setType(EasyDescWidgetItem::Type::Block); + break; + + case ::profiler::BlockType::Event: + item->setType(EasyDescWidgetItem::Type::Event); + break; + + case ::profiler::BlockType::Value: + item->setType(EasyDescWidgetItem::Type::Value); + break; + } + + item->setFont(DESC_COL_STATUS, f); + item->setText(DESC_COL_STATUS, statusText(desc->status())); + item->setForeground(DESC_COL_STATUS, QColor::fromRgba(statusColor(desc->status()))); + + m_items[id] = item; + p.children.insert(::std::make_pair(desc->line(), item)); + } + else + { + m_items[id] = it->second; + } + } + + ++id; + } + + for (auto& p : fileItems) + { + addTopLevelItem(p.second.item); + if (m_expandedFilesTemp.find(p.first) != m_expandedFilesTemp.end()) + p.second.item->setExpanded(true); + } + + m_expandedFilesTemp.clear(); + setSortingEnabled(true); + sortByColumn(DESC_COL_FILE_LINE, Qt::AscendingOrder); + resizeColumnsToContents(); + QTimer::singleShot(100, [this](){ onSelectedBlockChange(EASY_GLOBALS.selected_block); }); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::onItemExpand(QTreeWidgetItem*) +{ + resizeColumnsToContents(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::onDoubleClick(QTreeWidgetItem* _item, int _column) +{ + if (!EASY_GLOBALS.connected) + return; + + if (_column >= DESC_COL_TYPE && _item->parent() != nullptr) + { + auto item = static_cast(_item); + auto& desc = easyDescriptor(item->desc()); + desc.setStatus(nextStatus(desc.status())); + + item->setText(DESC_COL_STATUS, statusText(desc.status())); + item->setForeground(DESC_COL_STATUS, QColor::fromRgba(statusColor(desc.status()))); + + m_bLocked = true; + emit EASY_GLOBALS.events.blockStatusChanged(desc.id(), desc.status()); + m_bLocked = false; + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::onCurrentItemChange(QTreeWidgetItem* _item, QTreeWidgetItem* _prev) +{ + if (_prev != nullptr) + { + auto f = font(); + for (int i = 0; i < DESC_COL_STATUS; ++i) + _prev->setFont(i, f); + } + + if (_item != nullptr) + { + auto f = font(); + f.setBold(true); + for (int i = 0; i < DESC_COL_STATUS; ++i) + _item->setFont(i, f); + + if (::profiler_gui::is_max(EASY_GLOBALS.selected_block) && _item->parent() != nullptr) + { + const auto id = static_cast(_item)->desc(); + if (EASY_GLOBALS.selected_block_id != id) + { + EASY_GLOBALS.selected_block_id = id; + emit EASY_GLOBALS.events.selectedBlockIdChanged(id); + } + } + } + else if (::profiler_gui::is_max(EASY_GLOBALS.selected_block) && !::profiler_gui::is_max(EASY_GLOBALS.selected_block_id)) + { + ::profiler_gui::set_max(EASY_GLOBALS.selected_block_id); + emit EASY_GLOBALS.events.selectedBlockIdChanged(EASY_GLOBALS.selected_block_id); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::onBlockStatusChangeClicked(bool _checked) +{ + if (!_checked || !EASY_GLOBALS.connected) + return; + + auto item = currentItem(); + if (item == nullptr || item->parent() == nullptr) + return; + + auto action = qobject_cast(sender()); + if (action != nullptr) + { + auto& desc = easyDescriptor(static_cast(item)->desc()); + desc.setStatus(static_cast<::profiler::EasyBlockStatus>(action->data().toUInt())); + item->setText(DESC_COL_STATUS, statusText(desc.status())); + item->setForeground(DESC_COL_STATUS, QColor::fromRgba(statusColor(desc.status()))); + + m_bLocked = true; + emit EASY_GLOBALS.events.blockStatusChanged(desc.id(), desc.status()); + m_bLocked = false; + } +} + +void EasyDescTreeWidget::onBlockStatusChange(::profiler::block_id_t _id, ::profiler::EasyBlockStatus _status) +{ + if (m_bLocked) + return; + + auto item = m_items[_id]; + if (item == nullptr) + return; + + auto& desc = easyDescriptor(item->desc()); + item->setText(DESC_COL_STATUS, statusText(desc.status())); + item->setForeground(DESC_COL_STATUS, QColor::fromRgba(statusColor(desc.status()))); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::resizeColumnsToContents() +{ + for (int i = 0; i < DESC_COL_COLUMNS_NUMBER; ++i) + resizeColumnToContents(i); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::onSelectedBlockChange(uint32_t _block_index) +{ + if (::profiler_gui::is_max(_block_index)) + { + setCurrentItem(nullptr); + return; + } + + auto item = m_items[easyBlocksTree(_block_index).node->id()]; + if (item == nullptr) + return; + + scrollToItem(item, QAbstractItemView::PositionAtCenter); + setCurrentItem(item); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyDescTreeWidget::resetHighlight() +{ + for (auto item : m_highlightItems) { + for (int i = 0; i < DESC_COL_COLUMNS_NUMBER; ++i) + item->setBackground(i, Qt::NoBrush); + } + m_highlightItems.clear(); +} + +void EasyDescTreeWidget::loadSettings() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("desc_tree_widget"); + + auto val = settings.value("searchColumn"); + if (!val.isNull()) + m_searchColumn = val.toInt(); + + settings.endGroup(); +} + +void EasyDescTreeWidget::saveSettings() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("desc_tree_widget"); + + settings.setValue("searchColumn", m_searchColumn); + + settings.endGroup(); +} + +////////////////////////////////////////////////////////////////////////// + +int EasyDescTreeWidget::findNext(const QString& _str, Qt::MatchFlags _flags) +{ + if (_str.isEmpty()) + { + resetHighlight(); + m_lastSearchColumn = m_searchColumn; + return 0; + } + + const bool isNewSearch = (m_lastSearchColumn != m_searchColumn || m_lastSearch != _str); + auto itemsList = findItems(_str, Qt::MatchContains | Qt::MatchRecursive | _flags, m_searchColumn); + + if (!isNewSearch) + { + if (!itemsList.empty()) + { + bool stop = false; + decltype(m_lastFound) next = nullptr; + for (auto item : itemsList) + { + if (stop) + { + next = item; + break; + } + + stop = item == m_lastFound; + } + + m_lastFound = next == nullptr ? itemsList.front() : next; + } + else + { + m_lastFound = nullptr; + } + } + else + { + resetHighlight(); + + m_lastSearchColumn = m_searchColumn; + m_lastSearch = _str; + m_lastFound = !itemsList.empty() ? itemsList.front() : nullptr; + + for (auto item : itemsList) + { + m_highlightItems.push_back(item); + for (int i = 0; i < DESC_COL_COLUMNS_NUMBER; ++i) + item->setBackgroundColor(i, QColor::fromRgba(0x80000000 | (0x00ffffff & ::profiler::colors::Yellow))); + } + } + + if (m_lastFound != nullptr) + { + scrollToItem(m_lastFound, QAbstractItemView::PositionAtCenter); + setCurrentItem(m_lastFound); + } + + return itemsList.size(); +} + +int EasyDescTreeWidget::findPrev(const QString& _str, Qt::MatchFlags _flags) +{ + if (_str.isEmpty()) + { + resetHighlight(); + m_lastSearchColumn = m_searchColumn; + return 0; + } + + const bool isNewSearch = (m_lastSearchColumn != m_searchColumn || m_lastSearch != _str); + auto itemsList = findItems(_str, Qt::MatchContains | Qt::MatchRecursive | _flags, m_searchColumn); + + if (!isNewSearch) + { + if (!itemsList.empty()) + { + decltype(m_lastFound) prev = nullptr; + for (auto item : itemsList) + { + if (item == m_lastFound) + break; + + prev = item; + } + + m_lastFound = prev == nullptr ? itemsList.back() : prev; + } + else + { + m_lastFound = nullptr; + } + } + else + { + resetHighlight(); + + m_lastSearchColumn = m_searchColumn; + m_lastSearch = _str; + m_lastFound = !itemsList.empty() ? itemsList.front() : nullptr; + + m_highlightItems.reserve(itemsList.size()); + for (auto item : itemsList) + { + m_highlightItems.push_back(item); + for (int i = 0; i < DESC_COL_COLUMNS_NUMBER; ++i) + item->setBackgroundColor(i, QColor::fromRgba(0x80000000 | (0x00ffffff & ::profiler::colors::Yellow))); + } + } + + if (m_lastFound != nullptr) + { + scrollToItem(m_lastFound, QAbstractItemView::PositionAtCenter); + setCurrentItem(m_lastFound); + } + + return itemsList.size(); +} + +////////////////////////////////////////////////////////////////////////// + +EasyDescWidget::EasyDescWidget(QWidget* _parent) : Parent(_parent) + , m_tree(new EasyDescTreeWidget(this)) + , m_values(new EasyArbitraryValuesWidget(this)) + , m_searchBox(new QLineEdit(this)) + , m_foundNumber(new QLabel("Found 0 matches", this)) + , m_searchButton(nullptr) + , m_bCaseSensitiveSearch(false) +{ + loadSettings(); + + m_searchBox->setFixedWidth(300); + m_searchBox->setContentsMargins(5, 0, 0, 0); + + auto tb = new QToolBar(this); + tb->setIconSize(::profiler_gui::ICONS_SIZE); + auto refreshButton = tb->addAction(QIcon(imagePath("reload")), tr("Refresh blocks list")); + refreshButton->setEnabled(EASY_GLOBALS.connected); + refreshButton->setToolTip(tr("Refresh blocks list.\nConnection needed.")); + connect(refreshButton, &QAction::triggered, &EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::blocksRefreshRequired); + + + + auto menu = new QMenu(this); + m_searchButton = menu->menuAction(); + m_searchButton->setText("Find next"); + m_searchButton->setIcon(QIcon(imagePath("find-next"))); + m_searchButton->setData(true); + connect(m_searchButton, &QAction::triggered, this, &This::findNext); + + auto actionGroup = new QActionGroup(this); + actionGroup->setExclusive(true); + + auto a = new QAction(tr("Find next"), actionGroup); + a->setCheckable(true); + a->setChecked(true); + connect(a, &QAction::triggered, this, &This::findNextFromMenu); + menu->addAction(a); + + a = new QAction(tr("Find previous"), actionGroup); + a->setCheckable(true); + connect(a, &QAction::triggered, this, &This::findPrevFromMenu); + menu->addAction(a); + + a = menu->addAction("Case sensitive"); + a->setCheckable(true); + a->setChecked(m_bCaseSensitiveSearch); + connect(a, &QAction::triggered, [this](bool _checked){ m_bCaseSensitiveSearch = _checked; }); + menu->addAction(a); + + menu->addSeparator(); + auto headerItem = m_tree->headerItem(); + actionGroup = new QActionGroup(this); + actionGroup->setExclusive(true); + for (int i = 0; i < DESC_COL_STATUS; ++i) + { + if (i == DESC_COL_TYPE) + continue; + + a = new QAction(QStringLiteral("Search by ") + headerItem->text(i), actionGroup); + a->setData(i); + a->setCheckable(true); + if (i == m_tree->searchColumn()) + a->setChecked(true); + connect(a, &QAction::triggered, this, &This::onSearchColumnChange); + + menu->addAction(a); + } + + tb->addSeparator(); + tb->addAction(m_searchButton); + tb->addWidget(m_searchBox); + + auto searchbox = new QHBoxLayout(); + searchbox->setContentsMargins(0, 0, 5, 0); + searchbox->addWidget(tb); + searchbox->addStretch(100); + searchbox->addWidget(m_foundNumber, Qt::AlignRight); + + auto lay = new QVBoxLayout(this); + lay->setContentsMargins(1, 1, 1, 1); + lay->addLayout(searchbox); + lay->addWidget(m_tree); + lay->addWidget(m_values); + + connect(m_searchBox, &QLineEdit::returnPressed, this, &This::onSeachBoxReturnPressed); + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::connectionChanged, refreshButton, &QAction::setEnabled); +} + +EasyDescWidget::~EasyDescWidget() +{ + saveSettings(); +} + +void EasyDescWidget::loadSettings() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("EasyDescWidget"); + + auto val = settings.value("case_sensitive"); + if (!val.isNull()) + m_bCaseSensitiveSearch = val.toBool(); + + settings.endGroup(); +} + +void EasyDescWidget::saveSettings() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("EasyDescWidget"); + settings.setValue("case_sensitive", m_bCaseSensitiveSearch); + settings.endGroup(); +} + +void EasyDescWidget::keyPressEvent(QKeyEvent* _event) +{ + if (_event->key() == Qt::Key_F3) + { + if (_event->modifiers() & Qt::ShiftModifier) + findPrev(true); + else + findNext(true); + } + + _event->accept(); +} + +void EasyDescWidget::contextMenuEvent(QContextMenuEvent* _event) +{ + m_tree->contextMenuEvent(_event); +} + +void EasyDescWidget::build() +{ + m_tree->clearSilent(false); + m_foundNumber->setText(QString("Found 0 matches")); + m_tree->build(); + m_values->rebuild(); +} + +void EasyDescWidget::clear() +{ + m_tree->clearSilent(true); + m_foundNumber->setText(QString("Found 0 matches")); + m_values->clear(); +} + +void EasyDescWidget::onSeachBoxReturnPressed() +{ + if (m_searchButton->data().toBool() == true) + findNext(true); + else + findPrev(true); +} + +void EasyDescWidget::onSearchColumnChange(bool) +{ + auto action = qobject_cast(sender()); + if (action != nullptr) + m_tree->setSearchColumn(action->data().toInt()); +} + +void EasyDescWidget::findNext(bool) +{ + auto matches = m_tree->findNext(m_searchBox->text(), m_bCaseSensitiveSearch ? Qt::MatchCaseSensitive : Qt::MatchFlags()); + + if (matches == 1) + m_foundNumber->setText(QString("Found 1 match")); + else + m_foundNumber->setText(QString("Found %1 matches").arg(matches)); +} + +void EasyDescWidget::findPrev(bool) +{ + auto matches = m_tree->findPrev(m_searchBox->text(), m_bCaseSensitiveSearch ? Qt::MatchCaseSensitive : Qt::MatchFlags()); + + if (matches == 1) + m_foundNumber->setText(QString("Found 1 match")); + else + m_foundNumber->setText(QString("Found %1 matches").arg(matches)); +} + +void EasyDescWidget::findNextFromMenu(bool _checked) +{ + if (!_checked) + return; + + if (m_searchButton->data().toBool() == false) + { + m_searchButton->setData(true); + m_searchButton->setText(tr("Find next")); + m_searchButton->setIcon(QIcon(imagePath("find-next"))); + disconnect(m_searchButton, &QAction::triggered, this, &This::findPrev); + connect(m_searchButton, &QAction::triggered, this, &This::findNext); + } + + findNext(true); +} + +void EasyDescWidget::findPrevFromMenu(bool _checked) +{ + if (!_checked) + return; + + if (m_searchButton->data().toBool() == true) + { + m_searchButton->setData(false); + m_searchButton->setText(tr("Find prev")); + m_searchButton->setIcon(QIcon(imagePath("find-prev"))); + disconnect(m_searchButton, &QAction::triggered, this, &This::findNext); + connect(m_searchButton, &QAction::triggered, this, &This::findPrev); + } + + findPrev(true); +} + +////////////////////////////////////////////////////////////////////////// diff --git a/3rdparty/easyprofiler/profiler_gui/descriptors_tree_widget.h b/3rdparty/easyprofiler/profiler_gui/descriptors_tree_widget.h new file mode 100644 index 0000000..3a00d67 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/descriptors_tree_widget.h @@ -0,0 +1,234 @@ +/************************************************************************ +* file name : descriptors_tree_widget.h +* ----------------- : +* creation time : 2016/09/17 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of EasyDescTreeWidget and it's auxiliary classes +* : for displyaing EasyProfiler blocks descriptors tree. +* ----------------- : +* change log : * 2016/09/17 Victor Zarubkin: initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_DESCRIPTORS_WIDGET_H +#define EASY_DESCRIPTORS_WIDGET_H + +#include +#include +#include + +#include +#include + +#include + +////////////////////////////////////////////////////////////////////////// + +class EasyDescWidgetItem : public QTreeWidgetItem +{ + using Parent = QTreeWidgetItem; + using This = EasyDescWidgetItem; + +public: + + enum class Type : uint8_t + { + File, + Event, + Block, + Value + }; + +private: + + ::profiler::block_id_t m_desc; + Type m_type; + +public: + + explicit EasyDescWidgetItem(::profiler::block_id_t _desc, Parent* _parent = nullptr); + virtual ~EasyDescWidgetItem(); + + bool operator < (const Parent& _other) const override; + QVariant data(int _column, int _role) const override; + +public: + + // Public inline methods + + inline ::profiler::block_id_t desc() const + { + return m_desc; + } + + inline void setType(Type _type) + { + m_type = _type; + } + +}; // END of class EasyDescWidgetItem. + +////////////////////////////////////////////////////////////////////////// + +class EasyDescTreeWidget : public QTreeWidget +{ + Q_OBJECT + + typedef QTreeWidget Parent; + typedef EasyDescTreeWidget This; + + typedef ::std::vector Items; + typedef ::std::vector TreeItems; + typedef ::std::unordered_set<::std::string> ExpandedFiles; + +protected: + + ExpandedFiles m_expandedFilesTemp; + Items m_items; + TreeItems m_highlightItems; + QString m_lastSearch; + QTreeWidgetItem* m_lastFound; + int m_lastSearchColumn; + int m_searchColumn; + bool m_bLocked; + +public: + + // Public virtual methods + + explicit EasyDescTreeWidget(QWidget* _parent = nullptr); + virtual ~EasyDescTreeWidget(); + void contextMenuEvent(QContextMenuEvent* _event) override; + +public: + + // Public non-virtual methods + + int findNext(const QString& _str, Qt::MatchFlags _flags); + int findPrev(const QString& _str, Qt::MatchFlags _flags); + void setSearchColumn(int column); + int searchColumn() const; + +public slots: + + void clearSilent(bool _global = false); + void build(); + +private slots: + + void onBlockStatusChangeClicked(bool); + void onCurrentItemChange(QTreeWidgetItem* _item, QTreeWidgetItem* _prev); + void onItemExpand(QTreeWidgetItem* _item); + void onDoubleClick(QTreeWidgetItem* _item, int _column); + void onSelectedBlockChange(uint32_t _block_index); + void onBlockStatusChange(::profiler::block_id_t _id, ::profiler::EasyBlockStatus _status); + void resizeColumnsToContents(); + +private: + + // Private methods + + void resetHighlight(); + void loadSettings(); + void saveSettings(); + +}; // END of class EasyDescTreeWidget. + +////////////////////////////////////////////////////////////////////////// + +class EasyDescWidget : public QWidget +{ + Q_OBJECT + + typedef QWidget Parent; + typedef EasyDescWidget This; + +private: + + EasyDescTreeWidget* m_tree; + class EasyArbitraryValuesWidget* m_values; + class QLineEdit* m_searchBox; + class QLabel* m_foundNumber; + class QAction* m_searchButton; + bool m_bCaseSensitiveSearch; + +public: + + // Public virtual methods + + explicit EasyDescWidget(QWidget* _parent = nullptr); + virtual ~EasyDescWidget(); + void keyPressEvent(QKeyEvent* _event) override; + void contextMenuEvent(QContextMenuEvent* _event) override; + +public: + + // Public non-virtual methods + + void build(); + void clear(); + +private slots: + + void onSeachBoxReturnPressed(); + void findNext(bool); + void findPrev(bool); + void findNextFromMenu(bool); + void findPrevFromMenu(bool); + void onSearchColumnChange(bool); + +private: + + // Private non-virtual slots + + void loadSettings(); + void saveSettings(); + +}; // END of class EasyDescWidget. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_DESCRIPTORS_WIDGET_H diff --git a/3rdparty/easyprofiler/profiler_gui/easy_chronometer_item.cpp b/3rdparty/easyprofiler/profiler_gui/easy_chronometer_item.cpp new file mode 100644 index 0000000..357833e --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_chronometer_item.cpp @@ -0,0 +1,396 @@ +/************************************************************************ +* file name : easy_chronometer_item.cpp +* ----------------- : +* creation time : 2016/09/15 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of EasyChronometerItem. +* ----------------- : +* change log : * 2016/09/15 Victor Zarubkin: moved sources from blocks_graphics_view.cpp +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include +#include "blocks_graphics_view.h" +#include "easy_chronometer_item.h" +#include "globals.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +////////////////////////////////////////////////////////////////////////// + +EasyChronometerItem::EasyChronometerItem(bool _main) + : Parent() + , m_color(::profiler_gui::CHRONOMETER_COLOR) + , m_left(0) + , m_right(0) + , m_bMain(_main) + , m_bReverse(false) + , m_bHoverIndicator(false) + , m_bHoverLeftBorder(false) + , m_bHoverRightBorder(false) +{ + m_indicator.reserve(3); +} + +EasyChronometerItem::~EasyChronometerItem() +{ +} + +QRectF EasyChronometerItem::boundingRect() const +{ + return m_boundingRect; +} + +void EasyChronometerItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*, QWidget*) +{ + auto const sceneView = view(); + const auto currentScale = sceneView->scale(); + const auto offset = sceneView->offset(); + const auto visibleSceneRect = sceneView->visibleSceneRect(); + auto sceneLeft = offset, sceneRight = offset + visibleSceneRect.width() / currentScale; + + if (m_bMain) + m_indicator.clear(); + + if (m_left > sceneRight || m_right < sceneLeft) + { + // This item is out of screen + + if (m_bMain) + { + const int size = m_bHoverIndicator ? 12 : 10; + auto vcenter = visibleSceneRect.top() + visibleSceneRect.height() * 0.5; + auto color = QColor::fromRgb(m_color.rgb()); + auto pen = _painter->pen(); + pen.setColor(color); + + m_indicator.clear(); + if (m_left > sceneRight) + { + sceneRight = (sceneRight - offset) * currentScale; + m_indicator.push_back(QPointF(sceneRight - size, vcenter - size)); + m_indicator.push_back(QPointF(sceneRight, vcenter)); + m_indicator.push_back(QPointF(sceneRight - size, vcenter + size)); + } + else + { + sceneLeft = (sceneLeft - offset) * currentScale; + m_indicator.push_back(QPointF(sceneLeft + size, vcenter - size)); + m_indicator.push_back(QPointF(sceneLeft, vcenter)); + m_indicator.push_back(QPointF(sceneLeft + size, vcenter + size)); + } + + _painter->save(); + _painter->setTransform(QTransform::fromTranslate(-x(), -y()), true); + _painter->setBrush(m_bHoverIndicator ? QColor::fromRgb(0xffff0000) : color); + _painter->setPen(pen); + _painter->drawPolygon(m_indicator); + _painter->restore(); + } + + return; + } + + auto selectedInterval = width(); + QRectF rect((m_left - offset) * currentScale, visibleSceneRect.top(), ::std::max(selectedInterval * currentScale, 1.0), visibleSceneRect.height()); + selectedInterval = units2microseconds(selectedInterval); + + const QString text = ::profiler_gui::timeStringReal(EASY_GLOBALS.time_units, selectedInterval); // Displayed text + const auto textRect = QFontMetricsF(EASY_GLOBALS.chronometer_font, sceneView).boundingRect(text); // Calculate displayed text boundingRect + const auto rgb = m_color.rgb() & 0x00ffffff; + + + + // Paint!-------------------------- + _painter->save(); + + // instead of scrollbar we're using manual offset + _painter->setTransform(QTransform::fromTranslate(-x(), -y()), true); + + if (m_left < sceneLeft) + rect.setLeft(0); + + if (m_right > sceneRight) + rect.setWidth((sceneRight - offset) * currentScale - rect.left()); + + // draw transparent rectangle + auto vcenter = rect.top() + rect.height() * 0.5; + QLinearGradient g(rect.left(), vcenter, rect.right(), vcenter); + g.setColorAt(0, m_color); + g.setColorAt(0.2, QColor::fromRgba(0x14000000 | rgb)); + g.setColorAt(0.8, QColor::fromRgba(0x14000000 | rgb)); + g.setColorAt(1, m_color); + _painter->setBrush(g); + _painter->setPen(Qt::NoPen); + _painter->drawRect(rect); + + // draw left and right borders + _painter->setBrush(Qt::NoBrush); + if (m_bMain && !m_bReverse) + { + QPen p(QColor::fromRgba(0xd0000000 | rgb)); + p.setStyle(Qt::DotLine); + _painter->setPen(p); + } + else + { + _painter->setPen(QColor::fromRgba(0xd0000000 | rgb)); + } + + if (m_left > sceneLeft) + { + if (m_bHoverLeftBorder) + { + // Set bold if border is hovered + QPen p = _painter->pen(); + p.setWidth(3); + _painter->setPen(p); + } + + _painter->drawLine(QPointF(rect.left(), rect.top()), QPointF(rect.left(), rect.bottom())); + } + + if (m_right < sceneRight) + { + if (m_bHoverLeftBorder) + { + // Restore width + QPen p = _painter->pen(); + p.setWidth(1); + _painter->setPen(p); + } + else if (m_bHoverRightBorder) + { + // Set bold if border is hovered + QPen p = _painter->pen(); + p.setWidth(3); + _painter->setPen(p); + } + + _painter->drawLine(QPointF(rect.right(), rect.top()), QPointF(rect.right(), rect.bottom())); + + // This is not necessary because another setPen() invoked for draw text + //if (m_bHoverRightBorder) + //{ + // // Restore width + // QPen p = _painter->pen(); + // p.setWidth(1); + // _painter->setPen(p); + //} + } + + // draw text + _painter->setCompositionMode(QPainter::CompositionMode_Difference); // This lets the text to be visible on every background + _painter->setRenderHint(QPainter::TextAntialiasing); + _painter->setPen(0x00ffffff - rgb); + _painter->setFont(EASY_GLOBALS.chronometer_font); + + int textFlags = 0; + switch (EASY_GLOBALS.chrono_text_position) + { + case ::profiler_gui::ChronoTextPosition_Top: + textFlags = Qt::AlignTop | Qt::AlignHCenter; + if (!m_bMain) rect.setTop(rect.top() + textRect.height() * 0.75); + break; + + case ::profiler_gui::ChronoTextPosition_Center: + textFlags = Qt::AlignCenter; + if (!m_bMain) rect.setTop(rect.top() + textRect.height() * 1.5); + break; + + case ::profiler_gui::ChronoTextPosition_Bottom: + textFlags = Qt::AlignBottom | Qt::AlignHCenter; + if (!m_bMain) rect.setHeight(rect.height() - textRect.height() * 0.75); + break; + } + + const auto textRect_width = textRect.width() * ::profiler_gui::FONT_METRICS_FACTOR; + if (textRect_width < rect.width()) + { + // Text will be drawed inside rectangle + _painter->drawText(rect, textFlags, text); + _painter->restore(); + return; + } + + const auto w = textRect_width / currentScale; + if (m_right + w < sceneRight) + { + // Text will be drawed to the right of rectangle + rect.translate(rect.width(), 0); + textFlags &= ~Qt::AlignHCenter; + textFlags |= Qt::AlignLeft; + } + else if (m_left - w > sceneLeft) + { + // Text will be drawed to the left of rectangle + rect.translate(-rect.width(), 0); + textFlags &= ~Qt::AlignHCenter; + textFlags |= Qt::AlignRight; + } + //else // Text will be drawed inside rectangle + + _painter->drawText(rect, textFlags | Qt::TextDontClip, text); + + _painter->restore(); + // END Paint!~~~~~~~~~~~~~~~~~~~~~~ +} + +void EasyChronometerItem::hide() +{ + m_bHoverIndicator = false; + m_bHoverLeftBorder = false; + m_bHoverRightBorder = false; + m_bReverse = false; + Parent::hide(); +} + +bool EasyChronometerItem::indicatorContains(const QPointF& _pos) const +{ + if (m_indicator.empty()) + return false; + + const auto itemX = toItem(_pos.x()); + return m_indicator.containsPoint(QPointF(itemX, _pos.y()), Qt::OddEvenFill); +} + +void EasyChronometerItem::setHoverLeft(bool _hover) +{ + m_bHoverLeftBorder = _hover; +} + +void EasyChronometerItem::setHoverRight(bool _hover) +{ + m_bHoverRightBorder = _hover; +} + +bool EasyChronometerItem::hoverLeft(qreal _x) const +{ + const auto dx = fabs(_x - m_left) * view()->scale(); + return dx < 4; +} + +bool EasyChronometerItem::hoverRight(qreal _x) const +{ + const auto dx = fabs(_x - m_right) * view()->scale(); + return dx < 4; +} + +QPointF EasyChronometerItem::toItem(const QPointF& _pos) const +{ + const auto sceneView = view(); + return QPointF((_pos.x() - sceneView->offset()) * sceneView->scale() - x(), _pos.y()); +} + +qreal EasyChronometerItem::toItem(qreal _x) const +{ + const auto sceneView = view(); + return (_x - sceneView->offset()) * sceneView->scale() - x(); +} + +void EasyChronometerItem::setColor(const QColor& _color) +{ + m_color = _color; +} + +void EasyChronometerItem::setBoundingRect(qreal x, qreal y, qreal w, qreal h) +{ + m_boundingRect.setRect(x, y, w, h); +} + +void EasyChronometerItem::setBoundingRect(const QRectF& _rect) +{ + m_boundingRect = _rect; +} + +void EasyChronometerItem::setLeftRight(qreal _left, qreal _right) +{ + if (_left < _right) + { + m_left = _left; + m_right = _right; + } + else + { + m_left = _right; + m_right = _left; + } +} + +void EasyChronometerItem::setReverse(bool _reverse) +{ + m_bReverse = _reverse; +} + +void EasyChronometerItem::setHoverIndicator(bool _hover) +{ + m_bHoverIndicator = _hover; +} + +const EasyGraphicsView* EasyChronometerItem::view() const +{ + return static_cast(scene()->parent()); +} + +EasyGraphicsView* EasyChronometerItem::view() +{ + return static_cast(scene()->parent()); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + diff --git a/3rdparty/easyprofiler/profiler_gui/easy_chronometer_item.h b/3rdparty/easyprofiler/profiler_gui/easy_chronometer_item.h new file mode 100644 index 0000000..1c20865 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_chronometer_item.h @@ -0,0 +1,171 @@ +/************************************************************************ +* file name : easy_chronometer_item.h +* ----------------- : +* creation time : 2016/09/15 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of EasyChronometerItem - an item +* : used to display selected interval on graphics scene. +* ----------------- : +* change log : * 2016/09/15 Victor Zarubkin: moved sources from blocks_graphics_view.h +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_CHRONOMETER_ITEM_H +#define EASY_CHRONOMETER_ITEM_H + +#include +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +class QWidget; +class QPainter; +class QStyleOptionGraphicsItem; +class EasyGraphicsView; + +class EasyChronometerItem : public QGraphicsItem +{ + typedef QGraphicsItem Parent; + typedef EasyChronometerItem This; + + QPolygonF m_indicator; ///< Indicator displayed when this chrono item is out of screen (displaying only for main item) + QRectF m_boundingRect; ///< boundingRect (see QGraphicsItem) + QColor m_color; ///< Color of the item + qreal m_left, m_right; ///< Left and right bounds of the selection zone + bool m_bMain; ///< Is this chronometer main (true, by default) + bool m_bReverse; ///< + bool m_bHoverIndicator; ///< Mouse hover above indicator + bool m_bHoverLeftBorder; + bool m_bHoverRightBorder; + +public: + + explicit EasyChronometerItem(bool _main = true); + virtual ~EasyChronometerItem(); + + // Public virtual methods + + QRectF boundingRect() const override; + void paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget = nullptr) override; + +public: + + // Public non-virtual methods + + void hide(); + + void setColor(const QColor& _color); + + void setBoundingRect(qreal x, qreal y, qreal w, qreal h); + void setBoundingRect(const QRectF& _rect); + + void setLeftRight(qreal _left, qreal _right); + + void setReverse(bool _reverse); + + void setHoverIndicator(bool _hover); + + bool indicatorContains(const QPointF& _pos) const; + + void setHoverLeft(bool _hover); + void setHoverRight(bool _hover); + + bool hoverLeft(qreal _x) const; + bool hoverRight(qreal _x) const; + + QPointF toItem(const QPointF& _pos) const; + qreal toItem(qreal _x) const; + + inline bool hoverIndicator() const + { + return m_bHoverIndicator; + } + + inline bool hoverLeft() const + { + return m_bHoverLeftBorder; + } + + inline bool hoverRight() const + { + return m_bHoverRightBorder; + } + + inline bool reverse() const + { + return m_bReverse; + } + + inline qreal left() const + { + return m_left; + } + + inline qreal right() const + { + return m_right; + } + + inline qreal width() const + { + return m_right - m_left; + } + +private: + + ///< Returns pointer to the EasyGraphicsView widget. + const EasyGraphicsView* view() const; + EasyGraphicsView* view(); + +}; // END of class EasyChronometerItem. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_CHRONOMETER_ITEM_H diff --git a/3rdparty/easyprofiler/profiler_gui/easy_frame_rate_viewer.cpp b/3rdparty/easyprofiler/profiler_gui/easy_frame_rate_viewer.cpp new file mode 100644 index 0000000..9cdde8b --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_frame_rate_viewer.cpp @@ -0,0 +1,339 @@ +/************************************************************************ +* file name : easy_frame_rate_viewer.cpp +* ----------------- : +* creation time : 2017/04/02 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : This file contains implementation of EasyFrameRateViewer widget. +* ----------------- : +* change log : * 2017/04/02 Victor Zarubkin: Initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include +#include +#include +#include "easy_frame_rate_viewer.h" +#include "globals.h" + +const int INTERVAL_WIDTH = 20; + +////////////////////////////////////////////////////////////////////////// + +EasyFPSGraphicsItem::EasyFPSGraphicsItem() : Parent(nullptr) +{ + +} + +EasyFPSGraphicsItem::~EasyFPSGraphicsItem() +{ + +} + +////////////////////////////////////////////////////////////////////////// + +QRectF EasyFPSGraphicsItem::boundingRect() const +{ + return m_boundingRect; +} + +void EasyFPSGraphicsItem::setBoundingRect(const QRectF& _boundingRect) +{ + m_boundingRect = _boundingRect; +} + +void EasyFPSGraphicsItem::setBoundingRect(qreal x, qreal y, qreal w, qreal h) +{ + m_boundingRect.setRect(x, y, w, h); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyFPSGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*, QWidget*) +{ + if (m_frames.empty()) + return; + + const auto fontMetrics = QFontMetrics(scene()->font()); + const int fontHeight = fontMetrics.height() + 2; + const qreal h = m_boundingRect.height() - (fontHeight << 1) - 4; + if (h < 0) + return; + + const qreal halfWidth = m_boundingRect.width() * 0.5 - INTERVAL_WIDTH; + const int halfMax = static_cast(0.5 + halfWidth / INTERVAL_WIDTH); + const int half = static_cast(m_frames.size() / 2); + const qreal top = fontHeight, bottom = h + 4 + fontHeight; + qreal y; + + _painter->save(); + + _painter->drawLine(QPointF(0, top), QPointF(m_boundingRect.width(), top)); + _painter->drawLine(QPointF(0, bottom), QPointF(m_boundingRect.width(), bottom)); + + _painter->setPen(Qt::lightGray); + y = m_boundingRect.height() * 0.5; + _painter->drawLine(QPointF(0, y), QPointF(m_boundingRect.width(), y)); + y -= h * 0.25; + _painter->drawLine(QPointF(0, y), QPointF(m_boundingRect.width(), y)); + y += h * 0.5; + _painter->drawLine(QPointF(0, y), QPointF(m_boundingRect.width(), y)); + + m_points1.reserve(m_frames.size()); + m_points2.reserve(m_frames.size()); + int n = 0; + qreal x = m_boundingRect.width() * 0.5 + std::min(halfMax, half) * INTERVAL_WIDTH, localMax = 0, localMin = 1e30; + const qreal xCurrent = x; + for (int i = static_cast(m_frames.size()) - 1; i > -1 && x >= 0; --i, x -= INTERVAL_WIDTH, ++n) + { + const auto& val = m_frames[i]; + + if (val.first > localMax) + localMax = val.first; + if (val.first < localMin) + localMin = val.first; + m_points1.emplace_back(x, static_cast(val.first) + 1e-3); + + if (val.second > localMax) + localMax = val.second; + if (val.second < localMin) + localMin = val.second; + m_points2.emplace_back(x, static_cast(val.second) + 1e-3); + + _painter->drawLine(QPointF(x, top + 1), QPointF(x, bottom - 1)); + } + + const auto delta = std::max(localMax - localMin, 1e-3); + _painter->setPen(Qt::black); + + qreal frameTime = std::max(localMax, 1.); + _painter->drawText(5, 0, m_boundingRect.width() - 10, fontHeight, Qt::AlignVCenter | Qt::AlignLeft, QString("Slowest %1 FPS (%2)") + .arg(static_cast(1e6 / frameTime)).arg(::profiler_gui::timeStringReal(EASY_GLOBALS.time_units, localMax, 1))); + + frameTime = std::max(m_frames.back().first, 1U); + _painter->drawText(5, 0, xCurrent - 5, fontHeight, Qt::AlignVCenter | Qt::AlignRight, QString("Max current %1 FPS (%2)") + .arg(static_cast(1e6 / frameTime)).arg(::profiler_gui::timeStringReal(EASY_GLOBALS.time_units, m_frames.back().first, 1))); + + frameTime = std::max(m_frames.back().second, 1U); + _painter->drawText(5, bottom, xCurrent - 5, fontHeight, Qt::AlignVCenter | Qt::AlignRight, QString("Avg current %1 FPS (%2)") + .arg(static_cast(1e6 / frameTime)).arg(::profiler_gui::timeStringReal(EASY_GLOBALS.time_units, m_frames.back().second, 1))); + + frameTime = std::max(localMin, 1.); + _painter->drawText(5, bottom, m_boundingRect.width() - 10, fontHeight, Qt::AlignVCenter | Qt::AlignLeft, QString("Fastest %1 FPS (%2)") + .arg(static_cast(1e6 / frameTime)).arg(::profiler_gui::timeStringReal(EASY_GLOBALS.time_units, localMin, 1))); + + if (localMin < EASY_GLOBALS.frame_time && EASY_GLOBALS.frame_time < localMax) + { + y = fontHeight + 2 + h * (1. - (EASY_GLOBALS.frame_time - localMin) / delta); + _painter->setPen(Qt::DashLine); + _painter->drawLine(QPointF(0, y), QPointF(m_boundingRect.width(), y)); + } + + for (int i = 0; i < n; ++i) + { + auto& point1 = m_points1[i]; + point1.setY(fontHeight + 2 + h * (1. - (point1.y() - localMin) / delta)); + + auto& point2 = m_points2[i]; + point2.setY(fontHeight + 2 + h * (1. - (point2.y() - localMin) / delta)); + } + + _painter->setRenderHint(QPainter::Antialiasing, true); + + QPen pen(QColor::fromRgba(0x80ff0000)); + pen.setWidth(EASY_GLOBALS.fps_widget_line_width); + _painter->setPen(pen); + if (n > 1) + { + _painter->drawPolyline(m_points1.data(), n); + + pen.setColor(QColor::fromRgba(0x800000ff)); + _painter->setPen(pen); + _painter->drawPolyline(m_points2.data(), n); + } + else + { + _painter->drawPoint(m_points1.back()); + + pen.setColor(QColor::fromRgba(0x800000ff)); + _painter->setPen(pen); + _painter->drawPoint(m_points2.back()); + } + + const auto txtTop = ::profiler_gui::timeStringReal(EASY_GLOBALS.time_units, localMin + delta * 0.75, 1); + const auto txtMid = ::profiler_gui::timeStringReal(EASY_GLOBALS.time_units, localMin + delta * 0.5, 1); + const auto txtBtm = ::profiler_gui::timeStringReal(EASY_GLOBALS.time_units, localMin + delta * 0.25, 1); + + _painter->setPen(Qt::NoPen); + _painter->setBrush(Qt::white); + _painter->drawRect(0, top + 1, std::max({fontMetrics.width(txtTop), fontMetrics.width(txtMid), fontMetrics.width(txtBtm)}) + 8, bottom - top - 1); + + _painter->setPen(Qt::black); + _painter->setBrush(Qt::NoBrush); + + y = m_boundingRect.height() * 0.5; + _painter->drawText(5, y - (fontHeight >> 1), m_boundingRect.width(), fontHeight, Qt::AlignVCenter | Qt::AlignLeft, txtMid); + + y -= h * 0.25; + _painter->drawText(5, y - (fontHeight >> 1), m_boundingRect.width(), fontHeight, Qt::AlignVCenter | Qt::AlignLeft, txtTop); + + y += h * 0.5; + _painter->drawText(5, y - (fontHeight >> 1), m_boundingRect.width(), fontHeight, Qt::AlignVCenter | Qt::AlignLeft, txtBtm); + + _painter->restore(); + + m_points1.clear(); + m_points2.clear(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyFPSGraphicsItem::clear() +{ + m_frames.clear(); +} + +void EasyFPSGraphicsItem::addPoint(uint32_t _maxFrameTime, uint32_t _avgFrameTime) +{ + m_frames.emplace_back(_maxFrameTime, _avgFrameTime); + if (static_cast(m_frames.size()) > EASY_GLOBALS.max_fps_history) + m_frames.pop_front(); +} + +////////////////////////////////////////////////////////////////////////// + +EasyFrameRateViewer::EasyFrameRateViewer(QWidget* _parent) : Parent(_parent), m_fpsItem(nullptr) +{ + setCacheMode(QGraphicsView::CacheNone); + //setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); + setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + setOptimizationFlag(QGraphicsView::DontSavePainterState, true); + + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + setContentsMargins(0, 0, 0, 0); + setScene(new QGraphicsScene(this)); + scene()->setSceneRect(0, 0, 50, 50); + + m_fpsItem = new EasyFPSGraphicsItem(); + m_fpsItem->setPos(0, 0); + m_fpsItem->setBoundingRect(0, 0, 50, 50); + scene()->addItem(m_fpsItem); + + centerOn(0, 0); + + // Dirty hack for QDockWidget stupid initial size policy :( + setFixedHeight(10); // Set very small height to enable appropriate minimum height on the application startup + QTimer::singleShot(100, [this] + { + // Now set appropriate minimum height + setMinimumHeight((QFontMetrics(scene()->font()).height() + 3) * 6); + setMaximumHeight(minimumHeight() * 20); + }); +} + +EasyFrameRateViewer::~EasyFrameRateViewer() +{ + +} + +void EasyFrameRateViewer::clear() +{ + m_fpsItem->clear(); + scene()->update(); +} + +void EasyFrameRateViewer::addPoint(uint32_t _maxFrameTime, uint32_t _avgFrameTime) +{ + m_fpsItem->addPoint(_maxFrameTime, _avgFrameTime); + scene()->update(); +} + +void EasyFrameRateViewer::resizeEvent(QResizeEvent* _event) +{ + Parent::resizeEvent(_event); + + auto size = _event->size(); + m_fpsItem->setBoundingRect(0, 0, size.width(), size.height()); + + scene()->setSceneRect(m_fpsItem->boundingRect()); + scene()->update(); +} + +void EasyFrameRateViewer::hideEvent(QHideEvent* _event) +{ + Parent::hideEvent(_event); + EASY_GLOBALS.fps_enabled = isVisible(); + clear(); +} + +void EasyFrameRateViewer::showEvent(QShowEvent* _event) +{ + Parent::showEvent(_event); + EASY_GLOBALS.fps_enabled = isVisible(); + clear(); +} + +void EasyFrameRateViewer::contextMenuEvent(QContextMenuEvent* _event) +{ + QMenu menu; + QAction* action = nullptr; + + action = menu.addAction(QIcon(imagePath("delete")), "Clear"); + connect(action, &QAction::triggered, [this](bool){ clear(); }); + + action = menu.addAction("Close"); + connect(action, &QAction::triggered, [this](bool){ parentWidget()->hide(); }); + + menu.exec(QCursor::pos()); + + _event->accept(); +} + +////////////////////////////////////////////////////////////////////////// + diff --git a/3rdparty/easyprofiler/profiler_gui/easy_frame_rate_viewer.h b/3rdparty/easyprofiler/profiler_gui/easy_frame_rate_viewer.h new file mode 100644 index 0000000..ca07303 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_frame_rate_viewer.h @@ -0,0 +1,126 @@ +/************************************************************************ +* file name : easy_frame_rate_viewer.cpp +* ----------------- : +* creation time : 2017/04/02 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : This file contains declaration of EasyFrameRateViewer widget. +* ----------------- : +* change log : * 2017/04/02 Victor Zarubkin: Initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY__FRAME_RATE_VIEWER__H +#define EASY__FRAME_RATE_VIEWER__H + +#include +#include +#include +#include +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// + +class EasyFPSGraphicsItem : public QGraphicsItem +{ + typedef QGraphicsItem Parent; + typedef EasyFPSGraphicsItem This; + typedef std::deque > FrameTimes; + + std::vector m_points1, m_points2; + FrameTimes m_frames; + QRectF m_boundingRect; + +public: + + explicit EasyFPSGraphicsItem(); + virtual ~EasyFPSGraphicsItem(); + + QRectF boundingRect() const override; + void paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget = nullptr) override; + + void setBoundingRect(const QRectF& _boundingRect); + void setBoundingRect(qreal x, qreal y, qreal w, qreal h); + + void clear(); + void addPoint(uint32_t _maxFrameTime, uint32_t _avgFrameTime); + +}; // END of class EasyFPSGraphicsItem. + +////////////////////////////////////////////////////////////////////////// + +class EasyFrameRateViewer : public QGraphicsView +{ + Q_OBJECT + +private: + + typedef QGraphicsView Parent; + typedef EasyFrameRateViewer This; + + EasyFPSGraphicsItem* m_fpsItem; + +public: + + explicit EasyFrameRateViewer(QWidget* _parent = nullptr); + virtual ~EasyFrameRateViewer(); + + void resizeEvent(QResizeEvent* _event) override; + void hideEvent(QHideEvent* _event) override; + void showEvent(QShowEvent* _event) override; + void contextMenuEvent(QContextMenuEvent* _event) override; + +public slots: + + void clear(); + void addPoint(uint32_t _maxFrameTime, uint32_t _avgFrameTime); + +}; // END of class EasyFrameRateViewer. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY__FRAME_RATE_VIEWER__H diff --git a/3rdparty/easyprofiler/profiler_gui/easy_graphics_item.cpp b/3rdparty/easyprofiler/profiler_gui/easy_graphics_item.cpp new file mode 100644 index 0000000..1c51fff --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_graphics_item.cpp @@ -0,0 +1,1460 @@ +/************************************************************************ +* file name : easy_graphics_item.cpp +* ----------------- : +* creation time : 2016/09/15 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of EasyGraphicsItem. +* ----------------- : +* change log : * 2016/09/15 Victor Zarubkin: Moved sources from blocks_graphics_view.cpp +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include +#include "easy_graphics_item.h" +#include "blocks_graphics_view.h" +#include "globals.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +enum BlockItemState : int8_t +{ + BLOCK_ITEM_DO_PAINT_FIRST = -2, + BLOCK_ITEM_DO_NOT_PAINT = -1, + BLOCK_ITEM_UNCHANGED, + BLOCK_ITEM_DO_PAINT +}; + +////////////////////////////////////////////////////////////////////////// + +EASY_CONSTEXPR int MIN_SYNC_SPACING = 1; +EASY_CONSTEXPR int MIN_SYNC_SIZE = 3; +EASY_CONSTEXPR int EVENT_HEIGHT = 4; +EASY_CONSTEXPR QRgb BORDERS_COLOR = ::profiler::colors::Grey600 & 0x00ffffff;// 0x00686868; + +inline QRgb selectedItemBorderColor(::profiler::color_t _color) { + return ::profiler_gui::isLightColor(_color, 192) ? ::profiler::colors::Black : ::profiler::colors::RichRed; +} + +const QPen HIGHLIGHTER_PEN = ([]() -> QPen { QPen p(::profiler::colors::Black); p.setStyle(Qt::DotLine); p.setWidth(2); return p; })(); + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +////////////////////////////////////////////////////////////////////////// + +EasyGraphicsItem::EasyGraphicsItem(uint8_t _index, const::profiler::BlocksTreeRoot& _root) + : QGraphicsItem(nullptr) + , m_threadName(::profiler_gui::decoratedThreadName(EASY_GLOBALS.use_decorated_thread_name, _root, EASY_GLOBALS.hex_thread_id)) + , m_pRoot(&_root) + , m_index(_index) +{ +} + +EasyGraphicsItem::~EasyGraphicsItem() +{ +} + +void EasyGraphicsItem::validateName() +{ + m_threadName = ::profiler_gui::decoratedThreadName(EASY_GLOBALS.use_decorated_thread_name, *m_pRoot, EASY_GLOBALS.hex_thread_id); +} + +const EasyGraphicsView* EasyGraphicsItem::view() const +{ + return static_cast(scene()->parent()); +} + +////////////////////////////////////////////////////////////////////////// + +QRectF EasyGraphicsItem::boundingRect() const +{ + return m_boundingRect; +} + +////////////////////////////////////////////////////////////////////////// + +struct EasyPainterInformation EASY_FINAL +{ + const QRectF visibleSceneRect; + QRectF rect; + QBrush brush; + const qreal visibleBottom; + const qreal currentScale; + const qreal offset; + const qreal sceneLeft; + const qreal sceneRight; + const qreal dx; + QRgb previousColor; + QRgb textColor; + Qt::PenStyle previousPenStyle; + bool is_light; + bool selectedItemsWasPainted; + + explicit EasyPainterInformation(const EasyGraphicsView* sceneView) + : visibleSceneRect(sceneView->visibleSceneRect()) + , visibleBottom(visibleSceneRect.bottom() - 1) + , currentScale(sceneView->scale()) + , offset(sceneView->offset()) + , sceneLeft(offset) + , sceneRight(offset + visibleSceneRect.width() / currentScale) + , dx(offset * currentScale) + , previousColor(0) + , textColor(0) + , previousPenStyle(Qt::NoPen) + , is_light(false) + , selectedItemsWasPainted(false) + { + brush.setStyle(Qt::SolidPattern); + } + + EasyPainterInformation() = delete; +}; + +#ifdef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT +void EasyGraphicsItem::paintChildren(const float _minWidth, const int _narrowSizeHalf, const uint8_t _levelsNumber, QPainter* _painter, struct EasyPainterInformation& p, ::profiler_gui::EasyBlockItem& _item, const ::profiler_gui::EasyBlock& _itemBlock, RightBounds& _rightBounds, uint8_t _level, int8_t _mode) +{ + if (_level >= _levelsNumber || _itemBlock.tree.children.empty()) + return; + + const auto top = levelY(_level); + if (top > p.visibleBottom) + return; + + qreal& prevRight = _rightBounds[_level]; + auto& level = m_levels[_level]; + const short next_level = _level + 1; + + uint32_t neighbours = (uint32_t)_itemBlock.tree.children.size(); + uint32_t last = neighbours - 1; + uint32_t neighbour = 0; + + if (_mode == BLOCK_ITEM_DO_PAINT_FIRST) + { + neighbour = last = _item.max_depth_child; + neighbours = neighbour + 1; + } + + for (uint32_t i = _item.children_begin + neighbour; neighbour < neighbours; ++i, ++neighbour) + { + auto& item = level[i]; + + if (item.left() > p.sceneRight) + break; // This is first totally invisible item. No need to check other items. + + if (item.right() < p.sceneLeft) + continue; // This item is not visible + + const auto& itemBlock = easyBlock(item.block); + const uint16_t totalHeight = itemBlock.tree.depth * ::profiler_gui::GRAPHICS_ROW_SIZE_FULL + ::profiler_gui::GRAPHICS_ROW_SIZE; + if ((top + totalHeight) < p.visibleSceneRect.top()) + continue; // This item is not visible + + const auto item_width = ::std::max(item.width(), _minWidth); + auto x = item.left() * p.currentScale - p.dx; + auto w = item_width * p.currentScale; + //const auto right = x + w; + if ((x + w) <= prevRight) + { + // This item is not visible + if (!(EASY_GLOBALS.hide_narrow_children && w < EASY_GLOBALS.blocks_narrow_size)) + paintChildren(_minWidth, _narrowSizeHalf, _levelsNumber, _painter, p, item, itemBlock, _rightBounds, next_level, BLOCK_ITEM_DO_PAINT_FIRST); + continue; + } + + if (x < prevRight) + { + w -= prevRight - x; + x = prevRight; + } + + if (EASY_GLOBALS.hide_minsize_blocks && w < EASY_GLOBALS.blocks_size_min) + continue; // Hide blocks (except top-level blocks) which width is less than 1 pixel + + const auto& itemDesc = easyDescriptor(itemBlock.tree.node->id()); + + int h = 0; + bool do_paint_children = false; + if ((EASY_GLOBALS.hide_narrow_children && w < EASY_GLOBALS.blocks_narrow_size) || !itemBlock.expanded) + { + // Items which width is less than 20 will be painted as big rectangles which are hiding it's children + + //x = item.left() * p.currentScale - p.dx; + h = totalHeight; + const auto dh = top + h - p.visibleBottom; + if (dh > 0) + h -= dh; + + if (item.block == EASY_GLOBALS.selected_block) + p.selectedItemsWasPainted = true; + + const bool colorChange = (p.previousColor != itemDesc.color()); + if (colorChange) + { + // Set background color brush for rectangle + p.previousColor = itemDesc.color(); + //p.inverseColor = 0xffffffff - p.previousColor; + p.is_light = ::profiler_gui::isLightColor(p.previousColor); + p.textColor = ::profiler_gui::textColorForFlag(p.is_light); + p.brush.setColor(QColor::fromRgba(p.previousColor)); + _painter->setBrush(p.brush); + } + + if (EASY_GLOBALS.highlight_blocks_with_same_id && (EASY_GLOBALS.selected_block_id == itemBlock.tree.node->id() + || (::profiler_gui::is_max(EASY_GLOBALS.selected_block) && EASY_GLOBALS.selected_block_id == itemDesc.id()))) + { + if (p.previousPenStyle != Qt::DotLine) + { + p.previousPenStyle = Qt::DotLine; + _painter->setPen(HIGHLIGHTER_PEN); + } + } + else if (EASY_GLOBALS.draw_graphics_items_borders) + { + if (p.previousPenStyle != Qt::SolidLine)// || colorChange) + { + // Restore pen for item which is wide enough to paint borders + p.previousPenStyle = Qt::SolidLine; + _painter->setPen(BORDERS_COLOR);//BORDERS_COLOR & inverseColor); + } + } + else if (p.previousPenStyle != Qt::NoPen) + { + p.previousPenStyle = Qt::NoPen; + _painter->setPen(Qt::NoPen); + } + + const auto wprev = w; + decltype(w) dw = 0; + if (item.left() < p.sceneLeft) + { + // if item left border is out of screen then attach text to the left border of the screen + // to ensure text is always visible for items presenting on the screen. + w += (item.left() - p.sceneLeft) * p.currentScale; + x = p.sceneLeft * p.currentScale - p.dx - 2; + w += 2; + dw = 2; + } + + if (item.right() > p.sceneRight) + { + w -= (item.right() - p.sceneRight) * p.currentScale; + w += 2; + dw += 2; + } + + if (w < EASY_GLOBALS.blocks_size_min) + w = EASY_GLOBALS.blocks_size_min; + + // Draw rectangle + p.rect.setRect(x, top, w, h); + _painter->drawRect(p.rect); + + prevRight = p.rect.right() + EASY_GLOBALS.blocks_spacing; + //skip_children(next_level, item.children_begin); + if (wprev < EASY_GLOBALS.blocks_narrow_size) + continue; + + if (dw > 1) + { + w -= dw; + x += 2; + } + } + else + { + if (item.block == EASY_GLOBALS.selected_block) + p.selectedItemsWasPainted = true; + + const bool colorChange = (p.previousColor != itemDesc.color()); + if (colorChange) + { + // Set background color brush for rectangle + p.previousColor = itemDesc.color(); + //p.inverseColor = 0xffffffff - p.previousColor; + p.is_light = ::profiler_gui::isLightColor(p.previousColor); + p.textColor = ::profiler_gui::textColorForFlag(p.is_light); + p.brush.setColor(QColor::fromRgba(p.previousColor)); + _painter->setBrush(p.brush); + } + + if (EASY_GLOBALS.highlight_blocks_with_same_id && (EASY_GLOBALS.selected_block_id == itemBlock.tree.node->id() + || (::profiler_gui::is_max(EASY_GLOBALS.selected_block) && EASY_GLOBALS.selected_block_id == itemDesc.id()))) + { + if (p.previousPenStyle != Qt::DotLine) + { + p.previousPenStyle = Qt::DotLine; + _painter->setPen(HIGHLIGHTER_PEN); + } + } + else if (EASY_GLOBALS.draw_graphics_items_borders) + { + if (p.previousPenStyle != Qt::SolidLine)// || colorChange) + { + // Restore pen for item which is wide enough to paint borders + p.previousPenStyle = Qt::SolidLine; + _painter->setPen(BORDERS_COLOR);// BORDERS_COLOR & inverseColor); + } + } + else if (p.previousPenStyle != Qt::NoPen) + { + p.previousPenStyle = Qt::NoPen; + _painter->setPen(Qt::NoPen); + } + + // Draw rectangle + //x = item.left() * currentScale - p.dx; + h = ::profiler_gui::GRAPHICS_ROW_SIZE; + const auto dh = top + h - p.visibleBottom; + if (dh > 0) + h -= dh; + + const auto wprev = w; + decltype(w) dw = 0; + if (item.left() < p.sceneLeft) + { + // if item left border is out of screen then attach text to the left border of the screen + // to ensure text is always visible for items presenting on the screen. + w += (item.left() - p.sceneLeft) * p.currentScale; + x = p.sceneLeft * p.currentScale - p.dx - 2; + w += 2; + dw = 2; + } + + if (item.right() > p.sceneRight) + { + w -= (item.right() - p.sceneRight) * p.currentScale; + w += 2; + dw += 2; + } + + if (w < EASY_GLOBALS.blocks_size_min) + w = EASY_GLOBALS.blocks_size_min; + + p.rect.setRect(x, top, w, h); + _painter->drawRect(p.rect); + + prevRight = p.rect.right() + EASY_GLOBALS.blocks_spacing; + if (wprev < EASY_GLOBALS.blocks_narrow_size) + { + paintChildren(_minWidth, _narrowSizeHalf, _levelsNumber, _painter, p, item, itemBlock, _rightBounds, next_level, wprev < _narrowSizeHalf ? BLOCK_ITEM_DO_PAINT_FIRST : BLOCK_ITEM_DO_PAINT); + continue; + } + + if (dw > 1) + { + w -= dw; + x += 2; + } + + do_paint_children = true; + } + + // Draw text----------------------------------- + p.rect.setRect(x + 1, top, w - 1, h); + + // text will be painted with inverse color + //auto textColor = inverseColor < 0x00808080 ? profiler::colors::Black : profiler::colors::White; + //if (textColor == previousColor) textColor = 0; + _painter->setPen(p.textColor); + + if (item.block == EASY_GLOBALS.selected_block) + _painter->setFont(EASY_GLOBALS.selected_item_font); + + // drawing text + auto name = easyBlockName(itemBlock.tree, itemDesc); + _painter->drawText(p.rect, Qt::AlignCenter, ::profiler_gui::toUnicode(name)); + + // restore previous pen color + if (p.previousPenStyle == Qt::NoPen) + _painter->setPen(Qt::NoPen); + else if (p.previousPenStyle == Qt::DotLine) + { + _painter->setPen(HIGHLIGHTER_PEN); + } + else + _painter->setPen(BORDERS_COLOR);// BORDERS_COLOR & inverseColor); // restore pen for rectangle painting + + // restore font + if (item.block == EASY_GLOBALS.selected_block) + _painter->setFont(EASY_GLOBALS.items_font); + // END Draw text~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + if (do_paint_children) + paintChildren(_minWidth, _narrowSizeHalf, _levelsNumber, _painter, p, item, itemBlock, _rightBounds, next_level, _mode); + } +} +#endif + +void EasyGraphicsItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem*, QWidget*) +{ + const bool gotItems = !m_levels.empty() && !m_levels.front().empty(); + const bool gotSync = !m_pRoot->sync.empty(); + + if (!gotItems && !gotSync) + { + return; + } + + EasyPainterInformation p(view()); + + _painter->save(); + _painter->setFont(EASY_GLOBALS.items_font); + + // Reset indices of first visible item for each layer + const auto levelsNumber = levels(); + m_rightBounds[0] = -1e100; + for (uint8_t i = 1; i < levelsNumber; ++i) { + ::profiler_gui::set_max(m_levelsIndexes[i]); + m_rightBounds[i] = -1e100; + } + + + // Search for first visible top-level item + if (gotItems) + { + auto& level0 = m_levels.front(); + auto first = ::std::lower_bound(level0.begin(), level0.end(), p.sceneLeft, [](const ::profiler_gui::EasyBlockItem& _item, qreal _value) + { + return _item.left() < _value; + }); + + if (first != level0.end()) + { + m_levelsIndexes[0] = first - level0.begin(); + if (m_levelsIndexes[0] > 0) + m_levelsIndexes[0] -= 1; + } + else + { + m_levelsIndexes[0] = static_cast(level0.size() - 1); + } + } + + + + // This is to make _painter->drawText() work properly + // (it seems there is a bug in Qt5.6 when drawText called for big coordinates, + // drawRect at the same time called for actually same coordinates + // works fine without using this additional shifting) + //const auto dx = p.offset * p.currentScale; + + // Shifting coordinates to current screen offset + _painter->setTransform(QTransform::fromTranslate(0, -y()), true); + + + + if (EASY_GLOBALS.draw_graphics_items_borders) + { + p.previousPenStyle = Qt::SolidLine; + _painter->setPen(BORDERS_COLOR); + } + else + { + _painter->setPen(Qt::NoPen); + } + + + const auto MIN_WIDTH = EASY_GLOBALS.enable_zero_length ? 0.f : 0.25f; + + + // Iterate through layers and draw visible items + if (gotItems) + { + const int narrow_size_half = EASY_GLOBALS.blocks_narrow_size >> 1; + +#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + static const auto MAX_CHILD_INDEX = ::profiler_gui::numeric_max(); + auto const dont_skip_children = [this, &levelsNumber](short next_level, decltype(::profiler_gui::EasyBlockItem::children_begin) children_begin, int8_t _state) + { + if (next_level < levelsNumber && children_begin != MAX_CHILD_INDEX) + { + if (m_levelsIndexes[next_level] == MAX_CHILD_INDEX) + { + // Mark first potentially visible child item on next sublevel + m_levelsIndexes[next_level] = children_begin; + } + + // Mark children items that we want to draw them + m_levels[next_level][children_begin].state = _state; + } + }; +#endif + + //size_t iterations = 0; +#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + for (uint8_t l = 0; l < levelsNumber; ++l) +#else + for (uint8_t l = 0; l < 1; ++l) +#endif + { + auto& level = m_levels[l]; + const short next_level = l + 1; + + const auto top = levelY(l); + if (top > p.visibleBottom) + break; + + //qreal& prevRight = m_rightBounds[l]; + qreal prevRight = -1e100; + uint32_t neighbour = 0; + for (uint32_t i = m_levelsIndexes[l], end = static_cast(level.size()); i < end; ++i, ++neighbour) + { + //++iterations; + + auto& item = level[i]; + + if (item.left() > p.sceneRight) + break; // This is first totally invisible item. No need to check other items. + +#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + char state = BLOCK_ITEM_DO_PAINT; + if (item.state != BLOCK_ITEM_UNCHANGED) + { + neighbour = 0; // first block in parent's children list + state = item.state; + item.state = BLOCK_ITEM_DO_NOT_PAINT; + } +#endif + + if (item.right() < p.sceneLeft) + continue; // This item is not visible + +#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + if (state == BLOCK_ITEM_DO_NOT_PAINT) + { + // This item is not visible + if (neighbour < item.neighbours) + i += item.neighbours - neighbour - 1; // Skip all neighbours + continue; + } + + if (state == BLOCK_ITEM_DO_PAINT_FIRST && item.children_begin == MAX_CHILD_INDEX && next_level < levelsNumber && neighbour < (item.neighbours-1)) + // Paint only first child which has own children + continue; // This item has no children and would not be painted +#endif + + const auto& itemBlock = easyBlock(item.block); + const uint16_t totalHeight = itemBlock.tree.depth * ::profiler_gui::GRAPHICS_ROW_SIZE_FULL + ::profiler_gui::GRAPHICS_ROW_SIZE; + if ((top + totalHeight) < p.visibleSceneRect.top()) + continue; // This item is not visible + + const auto item_width = ::std::max(item.width(), MIN_WIDTH); + auto x = item.left() * p.currentScale - p.dx; + auto w = item_width * p.currentScale; + if ((x + w) <= prevRight) + { + // This item is not visible +#ifdef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + if (!EASY_GLOBALS.hide_narrow_children || w >= EASY_GLOBALS.blocks_narrow_size) + paintChildren(MIN_WIDTH, narrow_size_half, levelsNumber, _painter, p, item, itemBlock, m_rightBounds, next_level, BLOCK_ITEM_DO_PAINT_FIRST); +#else + if (!(EASY_GLOBALS.hide_narrow_children && w < EASY_GLOBALS.blocks_narrow_size) && l > 0) + dont_skip_children(next_level, item.children_begin, BLOCK_ITEM_DO_PAINT_FIRST); +#endif + continue; + } + + if (x < prevRight) + { + w -= prevRight - x; + x = prevRight; + } + +#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + if (EASY_GLOBALS.hide_minsize_blocks && w < EASY_GLOBALS.blocks_size_min && l > 0) + continue; // Hide blocks (except top-level blocks) which width is less than 1 pixel + + if (state == BLOCK_ITEM_DO_PAINT_FIRST && neighbour < item.neighbours) + { + // Paint only first child which has own children + i += item.neighbours - neighbour - 1; // Skip all neighbours + } +#endif + + const auto& itemDesc = easyDescriptor(itemBlock.tree.node->id()); + int h = 0; + +#ifdef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + bool do_paint_children = false; +#endif + + if ((EASY_GLOBALS.hide_narrow_children && w < EASY_GLOBALS.blocks_narrow_size) || !itemBlock.expanded) + { + // Items which width is less than 20 will be painted as big rectangles which are hiding it's children + + //x = item.left() * p.currentScale - p.dx; + h = totalHeight; + const auto dh = top + h - p.visibleBottom; + if (dh > 0) + h -= dh; + + if (item.block == EASY_GLOBALS.selected_block) + p.selectedItemsWasPainted = true; + + const bool colorChange = (p.previousColor != itemDesc.color()); + if (colorChange) + { + // Set background color brush for rectangle + p.previousColor = itemDesc.color(); + //p.inverseColor = 0xffffffff - p.previousColor; + p.is_light = ::profiler_gui::isLightColor(p.previousColor); + p.textColor = ::profiler_gui::textColorForFlag(p.is_light); + p.brush.setColor(QColor::fromRgba(p.previousColor)); + _painter->setBrush(p.brush); + } + + if (EASY_GLOBALS.highlight_blocks_with_same_id && (EASY_GLOBALS.selected_block_id == itemBlock.tree.node->id() + || (::profiler_gui::is_max(EASY_GLOBALS.selected_block) && EASY_GLOBALS.selected_block_id == itemDesc.id()))) + { + if (p.previousPenStyle != Qt::DotLine) + { + p.previousPenStyle = Qt::DotLine; + _painter->setPen(HIGHLIGHTER_PEN); + } + } + else if (EASY_GLOBALS.draw_graphics_items_borders) + { + if (p.previousPenStyle != Qt::SolidLine)// || colorChange) + { + // Restore pen for item which is wide enough to paint borders + p.previousPenStyle = Qt::SolidLine; + _painter->setPen(BORDERS_COLOR);//BORDERS_COLOR & inverseColor); + } + } + else if (p.previousPenStyle != Qt::NoPen) + { + p.previousPenStyle = Qt::NoPen; + _painter->setPen(Qt::NoPen); + } + + const auto wprev = w; + decltype(w) dw = 0; + if (item.left() < p.sceneLeft) + { + // if item left border is out of screen then attach text to the left border of the screen + // to ensure text is always visible for items presenting on the screen. + w += (item.left() - p.sceneLeft) * p.currentScale; + x = p.sceneLeft * p.currentScale - p.dx - 2; + w += 2; + dw = 2; + } + + if (item.right() > p.sceneRight) + { + w -= (item.right() - p.sceneRight) * p.currentScale; + w += 2; + dw += 2; + } + + if (w < EASY_GLOBALS.blocks_size_min) + w = EASY_GLOBALS.blocks_size_min; + + // Draw rectangle + p.rect.setRect(x, top, w, h); + _painter->drawRect(p.rect); + + prevRight = p.rect.right() + EASY_GLOBALS.blocks_spacing; + //skip_children(next_level, item.children_begin); + if (wprev < EASY_GLOBALS.blocks_narrow_size) + continue; + + if (dw > 1) { + w -= dw; + x += 2; + } + } + else + { + if (item.block == EASY_GLOBALS.selected_block) + p.selectedItemsWasPainted = true; + + const bool colorChange = (p.previousColor != itemDesc.color()); + if (colorChange) + { + // Set background color brush for rectangle + p.previousColor = itemDesc.color(); + //p.inverseColor = 0xffffffff - p.previousColor; + p.is_light = ::profiler_gui::isLightColor(p.previousColor); + p.textColor = ::profiler_gui::textColorForFlag(p.is_light); + p.brush.setColor(QColor::fromRgba(p.previousColor)); + _painter->setBrush(p.brush); + } + + if (EASY_GLOBALS.highlight_blocks_with_same_id && (EASY_GLOBALS.selected_block_id == itemBlock.tree.node->id() + || (::profiler_gui::is_max(EASY_GLOBALS.selected_block) && EASY_GLOBALS.selected_block_id == itemDesc.id()))) + { + if (p.previousPenStyle != Qt::DotLine) + { + p.previousPenStyle = Qt::DotLine; + _painter->setPen(HIGHLIGHTER_PEN); + } + } + else if (EASY_GLOBALS.draw_graphics_items_borders) + { + if (p.previousPenStyle != Qt::SolidLine)// || colorChange) + { + // Restore pen for item which is wide enough to paint borders + p.previousPenStyle = Qt::SolidLine; + _painter->setPen(BORDERS_COLOR);// BORDERS_COLOR & inverseColor); + } + } + else if (p.previousPenStyle != Qt::NoPen) + { + p.previousPenStyle = Qt::NoPen; + _painter->setPen(Qt::NoPen); + } + + // Draw rectangle + //x = item.left() * currentScale - p.dx; + h = ::profiler_gui::GRAPHICS_ROW_SIZE; + const auto dh = top + h - p.visibleBottom; + if (dh > 0) + h -= dh; + + const auto wprev = w; + decltype(w) dw = 0; + if (item.left() < p.sceneLeft) + { + // if item left border is out of screen then attach text to the left border of the screen + // to ensure text is always visible for items presenting on the screen. + w += (item.left() - p.sceneLeft) * p.currentScale; + x = p.sceneLeft * p.currentScale - p.dx - 2; + w += 2; + dw = 2; + } + + if (item.right() > p.sceneRight) + { + w -= (item.right() - p.sceneRight) * p.currentScale; + w += 2; + dw += 2; + } + + if (w < EASY_GLOBALS.blocks_size_min) + w = EASY_GLOBALS.blocks_size_min; + + p.rect.setRect(x, top, w, h); + _painter->drawRect(p.rect); + + prevRight = p.rect.right() + EASY_GLOBALS.blocks_spacing; + if (wprev < EASY_GLOBALS.blocks_narrow_size) + { +#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + dont_skip_children(next_level, item.children_begin, wprev < narrow_size_half ? BLOCK_ITEM_DO_PAINT_FIRST : BLOCK_ITEM_DO_PAINT); +#else + paintChildren(MIN_WIDTH, narrow_size_half, levelsNumber, _painter, p, item, itemBlock, m_rightBounds, next_level, wprev < narrow_size_half ? BLOCK_ITEM_DO_PAINT_FIRST : BLOCK_ITEM_DO_PAINT); +#endif + continue; + } + +#ifndef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + dont_skip_children(next_level, item.children_begin, BLOCK_ITEM_DO_PAINT); +#endif + + if (dw > 1) { + w -= dw; + x += 2; + } + +#ifdef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + do_paint_children = true; +#endif + } + + // Draw text----------------------------------- + p.rect.setRect(x + 1, top, w - 1, h); + + // text will be painted with inverse color + //auto textColor = inverseColor < 0x00808080 ? profiler::colors::Black : profiler::colors::White; + //if (textColor == previousColor) textColor = 0; + _painter->setPen(p.textColor); + + if (item.block == EASY_GLOBALS.selected_block) + _painter->setFont(EASY_GLOBALS.selected_item_font); + + // drawing text + auto name = easyBlockName(itemBlock.tree, itemDesc); + _painter->drawText(p.rect, Qt::AlignCenter, ::profiler_gui::toUnicode(name)); + + // restore previous pen color + if (p.previousPenStyle == Qt::NoPen) + _painter->setPen(Qt::NoPen); + else if (p.previousPenStyle == Qt::DotLine) + { + _painter->setPen(HIGHLIGHTER_PEN); + } + else + _painter->setPen(BORDERS_COLOR);// BORDERS_COLOR & inverseColor); // restore pen for rectangle painting + + // restore font + if (item.block == EASY_GLOBALS.selected_block) + _painter->setFont(EASY_GLOBALS.items_font); + // END Draw text~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +#ifdef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + if (do_paint_children) + paintChildren(MIN_WIDTH, narrow_size_half, levelsNumber, _painter, p, item, itemBlock, m_rightBounds, next_level, BLOCK_ITEM_DO_PAINT); +#endif + } + } + + if (EASY_GLOBALS.selected_block < EASY_GLOBALS.gui_blocks.size()) + { + const auto& guiblock = EASY_GLOBALS.gui_blocks[EASY_GLOBALS.selected_block]; + if (guiblock.graphics_item == m_index) + { + const auto& item = m_levels[guiblock.graphics_item_level][guiblock.graphics_item_index]; + if (item.left() < p.sceneRight && item.right() > p.sceneLeft) + { + const auto& itemBlock = easyBlock(item.block); + const auto item_width = ::std::max(item.width(), MIN_WIDTH); + auto top = levelY(guiblock.graphics_item_level); + auto w = ::std::max(item_width * p.currentScale, 1.0); + decltype(top) h = (!itemBlock.expanded || + (w < EASY_GLOBALS.blocks_narrow_size && EASY_GLOBALS.hide_narrow_children)) + ? (itemBlock.tree.depth * ::profiler_gui::GRAPHICS_ROW_SIZE_FULL + ::profiler_gui::GRAPHICS_ROW_SIZE) + : ::profiler_gui::GRAPHICS_ROW_SIZE; + + auto dh = top + h - p.visibleBottom; + if (dh < h) + { + if (dh > 0) + h -= dh; + + const auto& itemDesc = easyDescriptor(itemBlock.tree.node->id()); + + QPen pen(Qt::SolidLine); + pen.setJoinStyle(Qt::MiterJoin); + pen.setColor(selectedItemBorderColor(itemDesc.color()));//Qt::red); + pen.setWidth(3); + _painter->setPen(pen); + + if (!p.selectedItemsWasPainted) + { + p.brush.setColor(QColor::fromRgba(itemDesc.color()));// SELECTED_ITEM_COLOR); + _painter->setBrush(p.brush); + } + else + { + _painter->setBrush(Qt::NoBrush); + } + + auto x = item.left() * p.currentScale - p.dx; + decltype(w) dw = 0; + if (item.left() < p.sceneLeft) + { + // if item left border is out of screen then attach text to the left border of the screen + // to ensure text is always visible for items presenting on the screen. + w += (item.left() - p.sceneLeft) * p.currentScale; + x = p.sceneLeft * p.currentScale - p.dx - 2; + w += 2; + dw = 2; + } + + if (item.right() > p.sceneRight) + { + w -= (item.right() - p.sceneRight) * p.currentScale; + w += 2; + dw += 2; + } + + p.rect.setRect(x, top, w, h); + _painter->drawRect(p.rect); + + if (!p.selectedItemsWasPainted && w > EASY_GLOBALS.blocks_narrow_size) + { + if (dw > 1) { + w -= dw; + x += 2; + } + + // Draw text----------------------------------- + p.rect.setRect(x + 1, top, w - 1, h); + + // text will be painted with inverse color + //auto textColor = 0x00ffffff - previousColor; + //if (textColor == previousColor) textColor = 0; + p.textColor = ::profiler_gui::textColorForRgb(itemDesc.color());// SELECTED_ITEM_COLOR); + _painter->setPen(p.textColor); + + _painter->setFont(EASY_GLOBALS.selected_item_font); + + // drawing text + auto name = easyBlockName(itemBlock.tree, itemDesc); + _painter->drawText(p.rect, Qt::AlignCenter, ::profiler_gui::toUnicode(name)); + // END Draw text~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + } + } + } + } + } + + //printf("%u: %llu\n", m_index, iterations); + } + + + + if (gotSync) + { + const auto sceneView = view(); + auto firstSync = ::std::lower_bound(m_pRoot->sync.begin(), m_pRoot->sync.end(), p.sceneLeft, [&sceneView](::profiler::block_index_t _index, qreal _value) + { + return sceneView->time2position(easyBlocksTree(_index).node->begin()) < _value; + }); + + if (firstSync != m_pRoot->sync.end()) + { + if (firstSync != m_pRoot->sync.begin()) + --firstSync; + } + else if (!m_pRoot->sync.empty()) + { + firstSync = m_pRoot->sync.begin() + m_pRoot->sync.size() - 1; + } + //firstSync = m_pRoot->sync.begin(); + + p.previousColor = 0; + qreal prevRight = -1e100; + const qreal top = y() + 1 - EVENT_HEIGHT; + if (top + EVENT_HEIGHT < p.visibleBottom) + { + _painter->setPen(BORDERS_COLOR); + + for (auto it = firstSync, end = m_pRoot->sync.end(); it != end; ++it) + { + const auto& item = easyBlocksTree(*it); + auto left = sceneView->time2position(item.node->begin()); + + if (left > p.sceneRight) + break; // This is first totally invisible item. No need to check other items. + + decltype(left) width = sceneView->time2position(item.node->end()) - left; + if (left + width < p.sceneLeft) // This item is not visible + continue; + + left *= p.currentScale; + left -= p.dx; + width *= p.currentScale; + if (left + width <= prevRight) // This item is not visible + continue; + + if (left < prevRight) + { + width -= prevRight - left; + left = prevRight; + } + + if (width < MIN_SYNC_SIZE) + width = MIN_SYNC_SIZE; + + const ::profiler::thread_id_t tid = EASY_GLOBALS.version < ::profiler_gui::V130 ? item.node->id() : item.cs->tid(); + const bool self_thread = tid != 0 && EASY_GLOBALS.profiler_blocks.find(tid) != EASY_GLOBALS.profiler_blocks.end(); + + ::profiler::color_t color = 0; + if (self_thread) + color = ::profiler::colors::Coral; + else if (item.node->id() == 0) + color = ::profiler::colors::Black; + else + color = ::profiler::colors::RedA400; + + if (p.previousColor != color) + { + p.previousColor = color; + _painter->setBrush(QColor::fromRgb(color)); + } + + p.rect.setRect(left, top, width, EVENT_HEIGHT); + _painter->drawRect(p.rect); + prevRight = left + width + MIN_SYNC_SPACING; + } + } + } + + + + if (EASY_GLOBALS.enable_event_markers && !m_pRoot->events.empty()) + { + const auto sceneView = view(); + auto first = ::std::lower_bound(m_pRoot->events.begin(), m_pRoot->events.end(), p.offset, [&sceneView](::profiler::block_index_t _index, qreal _value) + { + return sceneView->time2position(easyBlocksTree(_index).node->begin()) < _value; + }); + + if (first != m_pRoot->events.end()) + { + if (first != m_pRoot->events.begin()) + --first; + } + else if (!m_pRoot->events.empty()) + { + first = m_pRoot->events.begin() + m_pRoot->events.size() - 1; + } + + p.previousColor = 0; + qreal prevRight = -1e100; + const qreal top = y() + boundingRect().height() - 1; + if (top + EVENT_HEIGHT < p.visibleBottom) + { + _painter->setPen(BORDERS_COLOR); + + for (auto it = first, end = m_pRoot->events.end(); it != end; ++it) + { + const auto& item = easyBlocksTree(*it); + auto left = sceneView->time2position(item.node->begin()); + + if (left > p.sceneRight) + break; // This is first totally invisible item. No need to check other items. + + decltype(left) width = MIN_WIDTH; + if (left + width < p.sceneLeft) // This item is not visible + continue; + + left *= p.currentScale; + left -= p.dx; + width *= p.currentScale; + if (width < 2) + width = 2; + + if (left + width <= prevRight) // This item is not visible + continue; + + if (left < prevRight) + { + width -= prevRight - left; + left = prevRight; + } + + if (width < 2) + width = 2; + + ::profiler::color_t color = easyDescriptor(item.node->id()).color(); + if (p.previousColor != color) + { + p.previousColor = color; + _painter->setBrush(QColor::fromRgb(color)); + } + + p.rect.setRect(left, top, width, EVENT_HEIGHT); + _painter->drawRect(p.rect); + prevRight = left + width + 2; + } + } + } + + + + _painter->restore(); +} + +////////////////////////////////////////////////////////////////////////// + +const ::profiler::BlocksTreeRoot* EasyGraphicsItem::root() const +{ + return m_pRoot; +} + +const QString& EasyGraphicsItem::threadName() const +{ + return m_threadName; +} + +////////////////////////////////////////////////////////////////////////// + +QRect EasyGraphicsItem::getRect() const +{ + return view()->mapFromScene(m_boundingRect).boundingRect(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsItem::getBlocks(qreal _left, qreal _right, ::profiler_gui::TreeBlocks& _blocks) const +{ + // Search for first visible top-level item + auto& level0 = m_levels.front(); + auto first = ::std::lower_bound(level0.begin(), level0.end(), _left, [](const ::profiler_gui::EasyBlockItem& _item, qreal _value) + { + return _item.left() < _value; + }); + + size_t itemIndex = 0; + if (first != level0.end()) + { + itemIndex = first - level0.begin(); + if (itemIndex > 0) + itemIndex -= 1; + } + else + { + itemIndex = level0.size() - 1; + } + + // Add all visible top-level items into array of visible blocks + for (size_t i = itemIndex, end = level0.size(); i < end; ++i) + { + const auto& item = level0[i]; + + if (item.left() > _right) + { + // First invisible item. No need to check other items. + break; + } + + if (item.right() < _left) + { + // This item is not visible yet + // This is just to be sure + continue; + } + + _blocks.emplace_back(m_pRoot, item.block); + } +} + +////////////////////////////////////////////////////////////////////////// + +const ::profiler_gui::EasyBlock* EasyGraphicsItem::intersect(const QPointF& _pos, ::profiler::block_index_t& _blockIndex) const +{ + if (m_levels.empty() || m_levels.front().empty()) + { + return nullptr; + } + + const auto& level0 = m_levels.front(); + const auto top = y(); + + if (top > _pos.y()) + { + return nullptr; + } + + EASY_STATIC_CONSTEXPR auto OVERLAP = (::profiler_gui::THREADS_ROW_SPACING >> 1) + 2; + const auto bottom = top + m_levels.size() * ::profiler_gui::GRAPHICS_ROW_SIZE_FULL + OVERLAP; + if (bottom < _pos.y()) + { + return nullptr; + } + + const unsigned int levelIndex = static_cast(_pos.y() - top) / ::profiler_gui::GRAPHICS_ROW_SIZE_FULL; + if (levelIndex >= m_levels.size()) + { + // The Y position is out of blocks range + + if (EASY_GLOBALS.enable_event_markers && !m_pRoot->events.empty()) + { + // If event indicators are enabled then try to intersect with one of event indicators + + const auto& sceneView = view(); + auto first = ::std::lower_bound(m_pRoot->events.begin(), m_pRoot->events.end(), _pos.x(), [&sceneView](::profiler::block_index_t _index, qreal _value) + { + return sceneView->time2position(easyBlocksTree(_index).node->begin()) < _value; + }); + + if (first != m_pRoot->events.end()) + { + if (first != m_pRoot->events.begin()) + --first; + } + else if (!m_pRoot->events.empty()) + { + first = m_pRoot->events.begin() + m_pRoot->events.size() - 1; + } + + const auto MIN_WIDTH = EASY_GLOBALS.enable_zero_length ? 0.f : 0.25f; + const auto currentScale = sceneView->scale(); + const auto dw = 5. / currentScale; + + for (auto it = first, end = m_pRoot->events.end(); it != end; ++it) + { + _blockIndex = *it; + const auto& item = easyBlock(_blockIndex); + auto left = sceneView->time2position(item.tree.node->begin()); + + if (left - dw > _pos.x()) + break; // This is first totally invisible item. No need to check other items. + + decltype(left) width = MIN_WIDTH; + if (left + width + dw < _pos.x()) // This item is not visible + continue; + + return &item; + } + } + + return nullptr; + } + + // The Y position is inside blocks range + + const auto MIN_WIDTH = EASY_GLOBALS.enable_zero_length ? 0.f : 0.25f; + + const auto currentScale = view()->scale(); + const auto dw = 5. / currentScale; + unsigned int i = 0; + size_t itemIndex = ::std::numeric_limits::max(); + size_t firstItem = 0, lastItem = static_cast(level0.size()); + while (i <= levelIndex) + { + const auto& level = m_levels[i]; + + // Search for first visible item + auto first = ::std::lower_bound(level.begin() + firstItem, level.begin() + lastItem, _pos.x(), [](const ::profiler_gui::EasyBlockItem& _item, qreal _value) + { + return _item.left() < _value; + }); + + if (first != level.end()) + { + itemIndex = first - level.begin(); + if (itemIndex != 0) + --itemIndex; + } + else + { + itemIndex = level.size() - 1; + } + + for (auto size = level.size(); itemIndex < size; ++itemIndex) + { + const auto& item = level[itemIndex]; + static const auto MAX_CHILD_INDEX = ::profiler_gui::numeric_max(item.children_begin); + + if (item.left() - dw > _pos.x()) + { + return nullptr; + } + + const auto item_width = ::std::max(item.width(), MIN_WIDTH); + if (item.left() + item_width + dw < _pos.x()) + { + continue; + } + + const auto w = item_width * currentScale; + const auto& guiItem = easyBlock(item.block); + if (i == levelIndex || (w < EASY_GLOBALS.blocks_narrow_size && EASY_GLOBALS.hide_narrow_children) || !guiItem.expanded) + { + _blockIndex = item.block; + return &guiItem; + } + + if (item.children_begin == MAX_CHILD_INDEX) + { + if (itemIndex != 0) + { + auto j = itemIndex; + firstItem = 0; + do { + + --j; + const auto& item2 = level[j]; + if (item2.children_begin != MAX_CHILD_INDEX) + { + firstItem = item2.children_begin; + break; + } + + } while (j != 0); + } + else + { + firstItem = 0; + } + } + else + { + firstItem = item.children_begin; + } + + lastItem = m_levels[i + 1].size(); + for (auto j = itemIndex + 1; j < size; ++j) + { + const auto& item2 = level[j]; + if (item2.children_begin != MAX_CHILD_INDEX) + { + lastItem = item2.children_begin; + break; + } + } + + break; + } + + ++i; + } + + return nullptr; +} + +const ::profiler_gui::EasyBlock* EasyGraphicsItem::intersectEvent(const QPointF& _pos) const +{ + if (m_pRoot->sync.empty()) + { + return nullptr; + } + + const auto top = y() - EVENT_HEIGHT; + if (top > _pos.y()) + { + return nullptr; + } + + const auto bottom = top + EVENT_HEIGHT + 2; + if (bottom < _pos.y()) + { + return nullptr; + } + + const auto sceneView = view(); + auto firstSync = ::std::lower_bound(m_pRoot->sync.begin(), m_pRoot->sync.end(), _pos.x(), [&sceneView](::profiler::block_index_t _index, qreal _value) + { + return sceneView->time2position(easyBlocksTree(_index).node->begin()) < _value; + }); + + if (firstSync == m_pRoot->sync.end()) + firstSync = m_pRoot->sync.begin() + m_pRoot->sync.size() - 1; + else if (firstSync != m_pRoot->sync.begin()) + --firstSync; + + const auto dw = 4. / view()->scale(); + for (auto it = firstSync, end = m_pRoot->sync.end(); it != end; ++it) + { + const auto& item = easyBlock(*it); + + const auto left = sceneView->time2position(item.tree.node->begin()) - dw; + if (left > _pos.x()) + break; + + const auto right = sceneView->time2position(item.tree.node->end()) + dw; + if (right < _pos.x()) + continue; + + return &item; + } + + return nullptr; +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsItem::setBoundingRect(qreal x, qreal y, qreal w, qreal h) +{ + m_boundingRect.setRect(x, y, w, h); +} + +void EasyGraphicsItem::setBoundingRect(const QRectF& _rect) +{ + m_boundingRect = _rect; +} + +////////////////////////////////////////////////////////////////////////// + +::profiler::thread_id_t EasyGraphicsItem::threadId() const +{ + return m_pRoot->thread_id; +} + +////////////////////////////////////////////////////////////////////////// + +uint8_t EasyGraphicsItem::levels() const +{ + return static_cast(m_levels.size()); +} + +float EasyGraphicsItem::levelY(uint8_t _level) const +{ + return y() + static_cast(_level) * static_cast(::profiler_gui::GRAPHICS_ROW_SIZE_FULL); +} + +void EasyGraphicsItem::setLevels(uint8_t _levels) +{ + typedef decltype(m_levelsIndexes) IndexesT; + static const auto MAX_CHILD_INDEX = ::profiler_gui::numeric_max(); + + m_levels.resize(_levels); + m_levelsIndexes.resize(_levels, MAX_CHILD_INDEX); + m_rightBounds.resize(_levels, -1e100); +} + +void EasyGraphicsItem::reserve(uint8_t _level, unsigned int _items) +{ + m_levels[_level].reserve(_items); +} + +////////////////////////////////////////////////////////////////////////// + +const EasyGraphicsItem::Children& EasyGraphicsItem::items(uint8_t _level) const +{ + return m_levels[_level]; +} + +const ::profiler_gui::EasyBlockItem& EasyGraphicsItem::getItem(uint8_t _level, unsigned int _index) const +{ + return m_levels[_level][_index]; +} + +::profiler_gui::EasyBlockItem& EasyGraphicsItem::getItem(uint8_t _level, unsigned int _index) +{ + return m_levels[_level][_index]; +} + +unsigned int EasyGraphicsItem::addItem(uint8_t _level) +{ + m_levels[_level].emplace_back(); + return static_cast(m_levels[_level].size() - 1); +} + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + diff --git a/3rdparty/easyprofiler/profiler_gui/easy_graphics_item.h b/3rdparty/easyprofiler/profiler_gui/easy_graphics_item.h new file mode 100644 index 0000000..a980e58 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_graphics_item.h @@ -0,0 +1,195 @@ +/************************************************************************ +* file name : easy_graphics_item.h +* ----------------- : +* creation time : 2016/09/15 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of EasyGraphicsItem - an item +* : used to draw profiler blocks on graphics scene. +* ----------------- : +* change log : * 2016/09/15 Victor Zarubkin: moved sources from blocks_graphics_view.h/.cpp +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_GRAPHICS_ITEM_H +#define EASY_GRAPHICS_ITEM_H + +#include + +#include +#include +#include + +#include + +#include "common_types.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +class EasyGraphicsView; + +class EasyGraphicsItem : public QGraphicsItem +{ + typedef ::profiler_gui::EasyItems Children; + typedef ::std::vector DrawIndexes; + typedef ::std::vector RightBounds; + typedef ::std::vector Sublevels; + + DrawIndexes m_levelsIndexes; ///< Indexes of first item on each level from which we must start painting + RightBounds m_rightBounds; ///< + Sublevels m_levels; ///< Arrays of items for each level + + QRectF m_boundingRect; ///< boundingRect (see QGraphicsItem) + QString m_threadName; ///< + const ::profiler::BlocksTreeRoot* m_pRoot; ///< Pointer to the root profiler block (thread block). Used by ProfTreeWidget to restore hierarchy. + uint8_t m_index; ///< This item's index in the list of items of EasyGraphicsView + +public: + + explicit EasyGraphicsItem(uint8_t _index, const::profiler::BlocksTreeRoot& _root); + virtual ~EasyGraphicsItem(); + + // Public virtual methods + + QRectF boundingRect() const override; + + void paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget = nullptr) override; + +public: + + // Public non-virtual methods + + void validateName(); + + const ::profiler::BlocksTreeRoot* root() const; + const QString& threadName() const; + + QRect getRect() const; + + void setBoundingRect(qreal x, qreal y, qreal w, qreal h); + void setBoundingRect(const QRectF& _rect); + + ::profiler::thread_id_t threadId() const; + + ///< Returns number of levels + uint8_t levels() const; + + float levelY(uint8_t _level) const; + + /** \brief Sets number of levels. + + \note Must be set before doing anything else. + + \param _levels Desired number of levels */ + void setLevels(uint8_t _levels); + + /** \brief Reserves memory for desired number of items on specified level. + + \param _level Index of the level + \param _items Desired number of items on this level */ + void reserve(uint8_t _level, unsigned int _items); + + /**\brief Returns reference to the array of items of specified level. + + \param _level Index of the level */ + const Children& items(uint8_t _level) const; + + /**\brief Returns reference to the item with required index on specified level. + + \param _level Index of the level + \param _index Index of required item */ + const ::profiler_gui::EasyBlockItem& getItem(uint8_t _level, unsigned int _index) const; + + /**\brief Returns reference to the item with required index on specified level. + + \param _level Index of the level + \param _index Index of required item */ + ::profiler_gui::EasyBlockItem& getItem(uint8_t _level, unsigned int _index); + + /** \brief Adds new item to required level. + + \param _level Index of the level + + \retval Index of the new created item */ + unsigned int addItem(uint8_t _level); + + /** \brief Finds top-level blocks which are intersects with required selection zone. + + \note Found blocks will be added into the array of selected blocks. + + \param _left Left bound of the selection zone + \param _right Right bound of the selection zone + \param _blocks Reference to the array of selected blocks */ + void getBlocks(qreal _left, qreal _right, ::profiler_gui::TreeBlocks& _blocks) const; + + const ::profiler_gui::EasyBlock* intersect(const QPointF& _pos, ::profiler::block_index_t& _blockIndex) const; + const ::profiler_gui::EasyBlock* intersectEvent(const QPointF& _pos) const; + +private: + + ///< Returns pointer to the EasyGraphicsView widget. + const EasyGraphicsView* view() const; + +#ifdef EASY_GRAPHICS_ITEM_RECURSIVE_PAINT + void paintChildren(const float _minWidth, const int _narrowSizeHalf, const uint8_t _levelsNumber, QPainter* _painter, struct EasyPainterInformation& p, ::profiler_gui::EasyBlockItem& _item, const ::profiler_gui::EasyBlock& _itemBlock, RightBounds& _rightBounds, uint8_t _level, int8_t _mode); +#endif + +public: + + // Public inline methods + + ///< Returns this item's index in the list of graphics items of EasyGraphicsView + inline uint8_t index() const + { + return m_index; + } + +}; // END of class EasyGraphicsItem. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_GRAPHICS_ITEM_H diff --git a/3rdparty/easyprofiler/profiler_gui/easy_graphics_scrollbar.cpp b/3rdparty/easyprofiler/profiler_gui/easy_graphics_scrollbar.cpp new file mode 100644 index 0000000..c7dee10 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_graphics_scrollbar.cpp @@ -0,0 +1,2078 @@ +/************************************************************************ +* file name : easy_graphics_scrollbar.cpp +* ----------------- : +* creation time : 2016/07/04 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : . +* ----------------- : +* change log : * 2016/07/04 Victor Zarubkin: Initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "easy_graphics_scrollbar.h" +#include "globals.h" + + +// TODO: use profiler_core/spin_lock.h + +#if defined(_WIN32) && defined(EASY_GUI_USE_CRITICAL_SECTION) +# include +# ifdef min +# undef min +# endif +# ifdef max +# undef max +# endif + +namespace profiler_gui { + void spin_lock::lock() { + EnterCriticalSection((CRITICAL_SECTION*)m_lock); + } + + void spin_lock::unlock() { + LeaveCriticalSection((CRITICAL_SECTION*)m_lock); + } + + spin_lock::spin_lock() : m_lock(new CRITICAL_SECTION) { + InitializeCriticalSection((CRITICAL_SECTION*)m_lock); + } + + spin_lock::~spin_lock() { + DeleteCriticalSection((CRITICAL_SECTION*)m_lock); + delete ((CRITICAL_SECTION*)m_lock); + } +} +#endif + +////////////////////////////////////////////////////////////////////////// + +EASY_CONSTEXPR int DEFAULT_TOP = -40; +EASY_CONSTEXPR int DEFAULT_HEIGHT = 80; +EASY_CONSTEXPR int INDICATOR_SIZE = 6; +EASY_CONSTEXPR int INDICATOR_SIZE_x2 = INDICATOR_SIZE << 1; +EASY_CONSTEXPR int HIST_COLUMN_MIN_HEIGHT = 2; +EASY_CONSTEXPR int WORKER_THREAD_CHECK_INTERVAL = 40; +EASY_CONSTEXPR int BOUNDARY_TIMER_INTERVAL = 100; + +////////////////////////////////////////////////////////////////////////// + +using estd::sqr; + +inline qreal calculate_color1(qreal h, qreal, qreal k) +{ + return std::min(h * k, 0.9999999); +} + +inline qreal calculate_color2(qreal, qreal duration, qreal k) +{ + return std::min(sqr(sqr(duration)) * k, 0.9999999); +} + +////////////////////////////////////////////////////////////////////////// + +EasyGraphicsSliderItem::EasyGraphicsSliderItem(bool _main) : Parent(), m_halfwidth(0), m_bMain(_main) +{ + m_indicator.reserve(3); + + if (_main) + { + m_indicator.push_back(QPointF(0, DEFAULT_TOP + INDICATOR_SIZE)); + m_indicator.push_back(QPointF(-INDICATOR_SIZE, DEFAULT_TOP)); + m_indicator.push_back(QPointF(INDICATOR_SIZE, DEFAULT_TOP)); + } + else + { + m_indicator.push_back(QPointF(0, DEFAULT_TOP + DEFAULT_HEIGHT - INDICATOR_SIZE)); + m_indicator.push_back(QPointF(-INDICATOR_SIZE, DEFAULT_TOP + DEFAULT_HEIGHT)); + m_indicator.push_back(QPointF(INDICATOR_SIZE, DEFAULT_TOP + DEFAULT_HEIGHT)); + } + + setWidth(1); + setBrush(Qt::SolidPattern); +} + +EasyGraphicsSliderItem::~EasyGraphicsSliderItem() +{ + +} + +void EasyGraphicsSliderItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget) +{ + if (static_cast(scene()->parent())->bindMode()) + { + return; + } + + const auto currentScale = static_cast(scene()->parent())->getWindowScale(); + const auto br = rect(); + + qreal w = width() * currentScale; + QRectF r(br.left() * currentScale, br.top() + INDICATOR_SIZE, w, br.height() - INDICATOR_SIZE_x2); + const auto r_right = r.right(); + const auto r_bottom = r.bottom(); + auto b = brush(); + + _painter->save(); + _painter->setTransform(QTransform::fromScale(1.0 / currentScale, 1), true); + _painter->setBrush(b); + + if (w > 1) + { + _painter->setPen(Qt::NoPen); + _painter->drawRect(r); + + // Draw left and right borders + auto cmode = _painter->compositionMode(); + if (m_bMain) _painter->setCompositionMode(QPainter::CompositionMode_Exclusion); + _painter->setPen(QColor::fromRgba(0xe0000000 | b.color().rgb())); + _painter->drawLine(QPointF(r.left(), r.top()), QPointF(r.left(), r_bottom)); + _painter->drawLine(QPointF(r_right, r.top()), QPointF(r_right, r_bottom)); + if (!m_bMain) _painter->setCompositionMode(cmode); + } + else + { + _painter->setPen(QColor::fromRgba(0xe0000000 | b.color().rgb())); + _painter->drawLine(QPointF(r.left(), r.top()), QPointF(r.left(), r_bottom)); + if (m_bMain) _painter->setCompositionMode(QPainter::CompositionMode_Exclusion); + } + + // Draw triangle indicators for small slider + _painter->setTransform(QTransform::fromTranslate(r.left() + w * 0.5, 0), true); + _painter->setPen(b.color().rgb()); + _painter->drawPolygon(m_indicator); + + _painter->restore(); +} + +qreal EasyGraphicsSliderItem::width() const +{ + return m_halfwidth * 2.0; +} + +qreal EasyGraphicsSliderItem::halfwidth() const +{ + return m_halfwidth; +} + +void EasyGraphicsSliderItem::setWidth(qreal _width) +{ + m_halfwidth = _width * 0.5; + setRect(-m_halfwidth, DEFAULT_TOP, _width, DEFAULT_HEIGHT); +} + +void EasyGraphicsSliderItem::setHalfwidth(qreal _halfwidth) +{ + m_halfwidth = _halfwidth; + setRect(-m_halfwidth, DEFAULT_TOP, m_halfwidth * 2.0, DEFAULT_HEIGHT); +} + +void EasyGraphicsSliderItem::setColor(QRgb _color) +{ + setColor(QColor::fromRgba(_color)); +} + +void EasyGraphicsSliderItem::setColor(const QColor& _color) +{ + auto b = brush(); + b.setColor(_color); + setBrush(b); +} + +////////////////////////////////////////////////////////////////////////// + +EasyHistogramItem::EasyHistogramItem() : Parent(nullptr) + , m_threadDuration(0) + , m_threadProfiledTime(0) + , m_threadWaitTime(0) + , m_pSource(nullptr) + , m_workerImage(nullptr) + , m_topDuration(0) + , m_maxDuration(0) + , m_minDuration(0) + , m_imageOrigin(0) + , m_imageScale(1) + , m_workerImageOrigin(0) + , m_workerImageScale(1) + , m_workerTopDuration(0) + , m_workerBottomDuration(0) + , m_blockTotalDuraion(0) + , m_timer(::std::bind(&This::onTimeout, this)) + , m_boundaryTimer([this](){ updateImage(); }, true) + , m_pProfilerThread(nullptr) + , m_threadId(0) + , m_blockId(::profiler_gui::numeric_max()) + , m_timeouts(0) + , m_timeUnits(::profiler_gui::TimeUnits_auto) + , m_regime(Hist_Pointer) + , m_bPermitImageUpdate(false) +{ + m_bReady = ATOMIC_VAR_INIT(false); +} + +EasyHistogramItem::~EasyHistogramItem() +{ + m_bReady.store(true, ::std::memory_order_release); + if (m_workerThread.joinable()) + m_workerThread.join(); + delete m_workerImage; +} + +QRectF EasyHistogramItem::boundingRect() const +{ + return m_boundingRect; +} + +void EasyHistogramItem::paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget) +{ + if (!m_bPermitImageUpdate || (m_regime == Hist_Pointer && m_pSource == nullptr) || (m_regime == Hist_Id && (m_threadId == 0 || ::profiler_gui::is_max(m_blockId)))) + return; + + if (m_regime == Hist_Pointer) + paintByPtr(_painter); + else + paintById(_painter); +} + +void EasyHistogramItem::paintBusyIndicator(QPainter* _painter, qreal _current_scale) +{ + const auto width = m_boundingRect.width() * _current_scale; + const auto h = _painter->fontMetrics().height(); + + _painter->setPen(::profiler_gui::TEXT_COLOR); + _painter->drawText(QRectF(0, m_boundingRect.top(), width, m_boundingRect.height() - h), + Qt::AlignCenter, "Generating image"); + _painter->drawText(QRectF(0, m_boundingRect.top() + h, width, m_boundingRect.height() - h), + Qt::AlignCenter, QString(m_timeouts, QChar('.'))); +} + +void EasyHistogramItem::paintMouseIndicator(QPainter* _painter, qreal _top, qreal _bottom, qreal _width, qreal _height, qreal _top_width, qreal _mouse_y, qreal _delta_time, int _font_h) +{ + if (_font_h != 0 && _top < _mouse_y && _mouse_y < _bottom) + { + const int half_font_h = _font_h >> 1; + + _painter->setPen(Qt::blue); + + const auto mouseStr = ::profiler_gui::timeStringReal(m_timeUnits, m_bottomDuration + _delta_time * (_bottom - _mouse_y) / _height, 3); + qreal mouseIndicatorRight = _width; + if (_mouse_y < _top + half_font_h) + mouseIndicatorRight = _top_width; + + qreal mouseIndicatorLeft = 0; + const QRectF rect(0, _mouse_y - _font_h, _width, _font_h << 1); + if (_mouse_y > _bottom - half_font_h) + { + _painter->drawText(rect, Qt::AlignLeft | Qt::AlignTop, mouseStr); + } + else if (_mouse_y < _top + half_font_h) + { + _painter->drawText(rect, Qt::AlignLeft | Qt::AlignBottom, mouseStr); + } + else + { + _painter->drawText(rect, Qt::AlignLeft | Qt::AlignVCenter, mouseStr); + mouseIndicatorLeft = _painter->fontMetrics().width(mouseStr) + 3; + } + + _painter->drawLine(QLineF(mouseIndicatorLeft, _mouse_y, mouseIndicatorRight, _mouse_y)); + } +} + +void EasyHistogramItem::paintByPtr(QPainter* _painter) +{ + const auto widget = static_cast(scene()->parent()); + const bool bindMode = widget->bindMode(); + const auto currentScale = widget->getWindowScale(); + const auto bottom = m_boundingRect.bottom(); + const auto width = m_boundingRect.width() * currentScale; + const auto dtime = m_topDuration - m_bottomDuration; + const auto maxColumnHeight = m_boundingRect.height(); + const auto coeff = (m_boundingRect.height() - HIST_COLUMN_MIN_HEIGHT) / (dtime > 1e-3 ? dtime : 1.); + + QRectF rect; + QBrush brush(Qt::SolidPattern); + //QRgb previousColor = 0; + + _painter->save(); + _painter->setTransform(QTransform::fromScale(1.0 / currentScale, 1), true); + + if (!m_pSource->empty()) + { + _painter->setPen(Qt::NoPen); + + if (!bindMode) + _painter->drawImage(0, m_boundingRect.top(), m_mainImage); + else + { + const auto range = widget->sliderWidth(); + const auto minimum = widget->value(); + const auto slider_k = widget->range() / range; + + /*if (false)//slider_k < 8) + { + _painter->setTransform(QTransform::fromScale(slider_k, 1), true); + _painter->drawImage((widget->minimum() - minimum) * currentScale, m_boundingRect.top(), m_mainImage); + _painter->setTransform(QTransform::fromScale(1. / slider_k, 1), true); + } + else*/ + { + const auto deltaScale = slider_k / m_imageScale; + _painter->setTransform(QTransform::fromScale(deltaScale, 1), true); + _painter->drawImage((widget->minimum() + m_imageOrigin - minimum) * currentScale * m_imageScale, m_boundingRect.top(), m_mainImage); + _painter->setTransform(QTransform::fromScale(1. / deltaScale, 1), true); + } + + /*if (false) + { + const bool gotFrame = EASY_GLOBALS.frame_time > 1e-6f; + qreal frameCoeff = 1; + if (gotFrame) + { + if (EASY_GLOBALS.frame_time <= m_bottomDuration) + frameCoeff = m_boundingRect.height(); + else + frameCoeff = 0.9 / EASY_GLOBALS.frame_time; + } + + auto const calculate_color = gotFrame ? calculate_color2 : calculate_color1; + auto const k = gotFrame ? sqr(sqr(frameCoeff)) : 1.0 / m_boundingRect.height(); + + const auto& items = *m_pSource; + const auto maximum = minimum + range; + const auto realScale = currentScale * slider_k; + const auto offset = minimum * realScale; + + auto first = ::std::lower_bound(items.begin(), items.end(), minimum, [](const ::profiler_gui::EasyBlockItem& _item, qreal _value) + { + return _item.left() < _value; + }); + + if (first != items.end()) + { + if (first != items.begin()) + --first; + } + else + { + first = items.begin() + items.size() - 1; + } + + qreal previous_x = -1e30, previous_h = -1e30; + for (auto it = first, end = items.end(); it != end; ++it) + { + // Draw rectangle + + if (it->left() > maximum) + break; + + if (it->right() < minimum) + continue; + + const qreal item_x = it->left() * realScale - offset; + const qreal item_w = ::std::max(it->width() * realScale, 1.0); + const qreal item_r = item_x + item_w; + const qreal h = it->width() <= m_bottomDuration ? HIST_COLUMN_MIN_HEIGHT : + (it->width() > m_topDuration ? maxColumnHeight : (HIST_COLUMN_MIN_HEIGHT + (it->width() - m_bottomDuration) * coeff)); + + if (h < previous_h && item_r < previous_x) + continue; + + const auto col = calculate_color(h, it->width(), k); + const auto color = 0x00ffffff & QColor::fromHsvF((1.0 - col) * 0.375, 0.85, 0.85).rgb(); + + if (previousColor != color) + { + // Set background color brush for rectangle + previousColor = color; + brush.setColor(QColor::fromRgba(0xc0000000 | color)); + _painter->setBrush(brush); + } + + rect.setRect(item_x, bottom - h, item_w, h); + _painter->drawRect(rect); + + previous_x = item_r; + previous_h = h; + } + }*/ + } + } + + //if (!m_bReady.load(::std::memory_order_acquire)) + // paintBusyIndicator(_painter, currentScale); + + qreal top_width = width, bottom_width = width; + int font_h = 0; + if (!m_topDurationStr.isEmpty()) + { + rect.setRect(0, m_boundingRect.top() - INDICATOR_SIZE, width - 3, m_boundingRect.height() + INDICATOR_SIZE_x2); + + if (m_timeUnits != EASY_GLOBALS.time_units) + { + m_timeUnits = EASY_GLOBALS.time_units; + m_topDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_topDuration, 3); + m_bottomDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_bottomDuration, 3); + } + + auto fm = _painter->fontMetrics(); + font_h = fm.height(); + //bottom_width -= fm.width(m_bottomDurationStr) + 7; + top_width -= fm.width(m_topDurationStr) + 7; + + _painter->setPen(m_topDuration < m_maxDuration ? QColor(Qt::darkRed) : ::profiler_gui::TEXT_COLOR); + _painter->drawText(rect, Qt::AlignRight | Qt::AlignTop, m_topDurationStr); + + rect.setRect(0, bottom, width - 3, font_h); + _painter->setPen(m_bottomDuration > m_minDuration ? QColor(Qt::darkRed) : ::profiler_gui::TEXT_COLOR); + _painter->drawText(rect, Qt::AlignRight | Qt::AlignTop, m_bottomDurationStr); + } + + _painter->setPen(Qt::darkGray); + _painter->drawLine(QLineF(0, bottom, bottom_width, bottom)); + _painter->drawLine(QLineF(0, m_boundingRect.top(), top_width, m_boundingRect.top())); + + paintMouseIndicator(_painter, m_boundingRect.top(), bottom, width, maxColumnHeight - HIST_COLUMN_MIN_HEIGHT, top_width, m_mouseY, dtime, font_h); + + if (m_bottomDuration < EASY_GLOBALS.frame_time && EASY_GLOBALS.frame_time < m_topDuration) + { + // Draw marker displaying expected frame_time step + const auto h = bottom - (EASY_GLOBALS.frame_time - m_bottomDuration) * coeff; + _painter->setPen(Qt::DashLine); + + auto w = width; + const auto boundary = INDICATOR_SIZE - font_h; + if (h < (m_boundingRect.top() - boundary)) + w = top_width; + else if (h > (bottom + boundary)) + w = bottom_width; + + _painter->drawLine(QLineF(0, h, w, h)); + } + + _painter->setPen(::profiler_gui::TEXT_COLOR); + rect.setRect(0, bottom + 2, width, widget->defaultFontHeight()); + const auto eventsSize = m_pProfilerThread->events.size(); + _painter->drawText(rect, Qt::AlignHCenter | Qt::TextDontClip, QString("%1 | duration: %2 | profiled: %3 (%4%) | wait: %5 (%6%) | %7 frames | %8 blocks | %9 markers") + .arg(m_threadName) + .arg(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, m_threadDuration)) + .arg(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, m_threadProfiledTime)) + .arg(m_threadDuration ? QString::number(100. * (double)m_threadProfiledTime / (double)m_threadDuration, 'f', 2) : QString("0")) + .arg(::profiler_gui::timeStringRealNs(EASY_GLOBALS.time_units, m_threadWaitTime)) + .arg(m_threadDuration ? QString::number(100. * (double)m_threadWaitTime / (double)m_threadDuration, 'f', 2) : QString("0")) + .arg(m_pProfilerThread->frames_number) + .arg(m_pProfilerThread->blocks_number - eventsSize) + .arg(eventsSize)); + + _painter->drawText(rect, Qt::AlignLeft, bindMode ? " MODE: zoom" : " MODE: overview"); + + _painter->restore(); +} + +void EasyHistogramItem::paintById(QPainter* _painter) +{ + const auto widget = static_cast(scene()->parent()); + const bool bindMode = widget->bindMode(); + const auto currentScale = widget->getWindowScale(); + const auto bottom = m_boundingRect.bottom(); + const auto width = m_boundingRect.width() * currentScale; + const auto dtime = m_topDuration - m_bottomDuration; + const auto maxColumnHeight = m_boundingRect.height(); + const auto coeff = (m_boundingRect.height() - HIST_COLUMN_MIN_HEIGHT) / (dtime > 1e-3 ? dtime : 1.); + + QRectF rect; + QBrush brush(Qt::SolidPattern); + //QRgb previousColor = 0; + + _painter->save(); + _painter->setTransform(QTransform::fromScale(1.0 / currentScale, 1), true); + + const auto& items = m_selectedBlocks; + if (!items.empty()) + { + _painter->setPen(Qt::NoPen); + + if (!bindMode) + _painter->drawImage(0, m_boundingRect.top(), m_mainImage); + else + { + const auto range = widget->sliderWidth(); + auto minimum = widget->value(); + const auto slider_k = widget->range() / range; + + /*if (false)//slider_k < 8) + { + _painter->setTransform(QTransform::fromScale(slider_k, 1), true); + _painter->drawImage((widget->minimum() - minimum) * currentScale, m_boundingRect.top(), m_mainImage); + _painter->setTransform(QTransform::fromScale(1. / slider_k, 1), true); + } + else*/ + { + const auto deltaScale = slider_k / m_imageScale; + _painter->setTransform(QTransform::fromScale(deltaScale, 1), true); + _painter->drawImage((widget->minimum() + m_imageOrigin - minimum) * currentScale * m_imageScale, m_boundingRect.top(), m_mainImage); + _painter->setTransform(QTransform::fromScale(1. / deltaScale, 1), true); + } + + /*if (false) + { + minimum *= 1e3; + const auto maximum = minimum + range * 1e3; + const auto realScale = currentScale * slider_k; + const auto offset = minimum * realScale; + + auto first = ::std::lower_bound(items.begin(), items.end(), minimum + EASY_GLOBALS.begin_time, [](::profiler::block_index_t _item, qreal _value) + { + return easyBlock(_item).tree.node->begin() < _value; + }); + + if (first != items.end()) + { + if (first != items.begin()) + --first; + } + else + { + first = items.begin() + (items.size() - 1); + } + + auto last = ::std::upper_bound(first, items.end(), maximum + EASY_GLOBALS.begin_time, [](qreal _value, ::profiler::block_index_t _item) + { + return _value < easyBlock(_item).tree.node->begin(); + }); + + const auto n = static_cast(::std::distance(first, last)); + + if (n > 0) + { + const bool gotFrame = EASY_GLOBALS.frame_time > 1e-6f; + qreal frameCoeff = 1; + if (gotFrame) + { + if (EASY_GLOBALS.frame_time <= m_bottomDuration) + frameCoeff = m_boundingRect.height(); + else + frameCoeff = 0.9 / EASY_GLOBALS.frame_time; + } + + auto const calculate_color = gotFrame ? calculate_color2 : calculate_color1; + auto const k = gotFrame ? sqr(sqr(frameCoeff)) : 1.0 / m_boundingRect.height(); + + const auto draw = [this, &previousColor, &brush, &_painter](qreal x, qreal y, qreal w, qreal h, QRgb color) + { + m_spin.lock(); + + if (previousColor != color) + { + // Set background color brush for rectangle + previousColor = color; + brush.setColor(QColor::fromRgba(0xc0000000 | color)); + _painter->setBrush(brush); + } + + _painter->drawRect(QRectF(x, y, w, h)); + + m_spin.unlock(); + }; + + ::std::vector<::std::thread> threads; + const auto n_threads = ::std::min(n, ::std::thread::hardware_concurrency()); + threads.reserve(n_threads); + const auto n_items = n / n_threads; + for (uint32_t i = 0; i < n_threads; ++i) + { + auto begin = first + i * n_items; + threads.emplace_back([this, &draw, &maximum, &minimum, &realScale, &offset, &coeff, &calculate_color, &k, &bottom, &maxColumnHeight](decltype(begin) it, decltype(begin) end) + { + qreal previous_x = -1e30, previous_h = -1e30; + + //for (auto it = first, end = items.end(); it != end; ++it) + for (; it != end; ++it) + { + // Draw rectangle + const auto item = easyBlock(*it).tree.node; + + const auto beginTime = item->begin() - EASY_GLOBALS.begin_time; + if (beginTime > maximum) + break; + + const auto endTime = item->end() - EASY_GLOBALS.begin_time; + if (endTime < minimum) + continue; + + const qreal duration = item->duration() * 1e-3; + const qreal item_x = (beginTime * realScale - offset) * 1e-3; + const qreal item_w = ::std::max(duration * realScale, 1.0); + const qreal item_r = item_x + item_w; + const qreal h = duration <= m_bottomDuration ? HIST_COLUMN_MIN_HEIGHT : + (duration > m_topDuration ? maxColumnHeight : (HIST_COLUMN_MIN_HEIGHT + (duration - m_bottomDuration) * coeff)); + + if (h < previous_h && item_r < previous_x) + continue; + + const auto col = calculate_color(h, duration, k); + const auto color = 0x00ffffff & QColor::fromHsvF((1.0 - col) * 0.375, 0.85, 0.85).rgb(); + + draw(item_x, bottom - h, item_w, h, color); + //if (previousColor != color) + //{ + // // Set background color brush for rectangle + // previousColor = color; + // brush.setColor(QColor::fromRgba(0xc0000000 | color)); + // _painter->setBrush(brush); + //} + + //rect.setRect(item_x, bottom - h, item_w, h); + //_painter->drawRect(rect); + + previous_x = item_r; + previous_h = h; + } + }, begin, i == (n_threads - 1) ? items.end() : begin + n_items); + } + + for (auto& t : threads) + t.join(); + } + }*/ + } + } + + //if (!m_bReady.load(::std::memory_order_acquire)) + // paintBusyIndicator(_painter, currentScale); + + qreal top_width = width, bottom_width = width; + int font_h = 0; + if (!m_topDurationStr.isEmpty()) + { + rect.setRect(0, m_boundingRect.top() - INDICATOR_SIZE, width - 3, m_boundingRect.height() + INDICATOR_SIZE_x2); + + if (m_timeUnits != EASY_GLOBALS.time_units) + { + m_timeUnits = EASY_GLOBALS.time_units; + m_topDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_topDuration, 3); + m_bottomDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_bottomDuration, 3); + } + + auto fm = _painter->fontMetrics(); + font_h = fm.height(); + //bottom_width -= fm.width(m_bottomDurationStr) + 7; + top_width -= fm.width(m_topDurationStr) + 7; + + _painter->setPen(m_topDuration < m_maxDuration ? QColor(Qt::darkRed) : ::profiler_gui::TEXT_COLOR); + _painter->drawText(rect, Qt::AlignRight | Qt::AlignTop, m_topDurationStr); + + rect.setRect(0, bottom, width - 3, font_h); + _painter->setPen(m_bottomDuration > m_minDuration ? QColor(Qt::darkRed) : ::profiler_gui::TEXT_COLOR); + _painter->drawText(rect, Qt::AlignRight | Qt::AlignTop, m_bottomDurationStr); + } + + _painter->setPen(Qt::darkGray); + _painter->drawLine(QLineF(0, bottom, bottom_width, bottom)); + _painter->drawLine(QLineF(0, m_boundingRect.top(), top_width, m_boundingRect.top())); + + paintMouseIndicator(_painter, m_boundingRect.top(), bottom, width, maxColumnHeight - HIST_COLUMN_MIN_HEIGHT, top_width, m_mouseY, dtime, font_h); + + if (m_bottomDuration < EASY_GLOBALS.frame_time && EASY_GLOBALS.frame_time < m_topDuration) + { + // Draw marker displaying required frame_time step + const auto h = bottom - (EASY_GLOBALS.frame_time - m_bottomDuration) * coeff; + _painter->setPen(Qt::DashLine); + + auto w = width; + const auto boundary = INDICATOR_SIZE - font_h; + if (h < (m_boundingRect.top() - boundary)) + w = top_width; + else if (h >(bottom + boundary)) + w = bottom_width; + + _painter->drawLine(QLineF(0, h, w, h)); + } + + _painter->setPen(::profiler_gui::TEXT_COLOR); + rect.setRect(0, bottom + 2, width, widget->defaultFontHeight()); + + if (!m_selectedBlocks.empty()) + { + _painter->drawText(rect, Qt::AlignHCenter | Qt::TextDontClip, QString("%1 | %2 | %3 calls | %4% of thread profiled time") + .arg(m_threadName).arg(m_blockName).arg(m_selectedBlocks.size()) + .arg(m_threadProfiledTime ? QString::number(100. * (double)m_blockTotalDuraion / (double)m_threadProfiledTime, 'f', 2) : QString("100"))); + } + else + { + _painter->drawText(rect, Qt::AlignHCenter | Qt::TextDontClip, QString("%1 | %2 | 0 calls").arg(m_threadName).arg(m_blockName)); + } + + _painter->drawText(rect, Qt::AlignLeft, bindMode ? " MODE: zoom" : " MODE: overview"); + + _painter->restore(); +} + +::profiler::thread_id_t EasyHistogramItem::threadId() const +{ + return m_threadId; +} + +void EasyHistogramItem::setBoundingRect(const QRectF& _rect) +{ + m_boundingRect = _rect; +} + +void EasyHistogramItem::setBoundingRect(qreal x, qreal y, qreal w, qreal h) +{ + m_boundingRect.setRect(x, y, w, h); +} + +void EasyHistogramItem::rebuildSource(HistRegime _regime) +{ + if (m_regime == _regime) + rebuildSource(); +} + +void EasyHistogramItem::rebuildSource() +{ + if (m_regime == Hist_Id) + { + m_regime = Hist_Pointer; + setSource(m_threadId, m_blockId); + } + else + { + m_regime = Hist_Id; + setSource(m_threadId, m_pSource); + } +} + +void EasyHistogramItem::setSource(::profiler::thread_id_t _thread_id, const ::profiler_gui::EasyItems* _items) +{ + if (m_regime == Hist_Pointer && m_threadId == _thread_id && m_pSource == _items) + return; + + m_timer.stop(); + m_boundaryTimer.stop(); + + m_bReady.store(true, ::std::memory_order_release); + if (m_workerThread.joinable()) + m_workerThread.join(); + + m_blockName.clear(); + m_blockTotalDuraion = 0; + + delete m_workerImage; + m_workerImage = nullptr; + m_imageOriginUpdate = m_imageOrigin = 0; + m_imageScaleUpdate = m_imageScale = 1; + + m_selectedBlocks.clear(); + { ::profiler::BlocksTree::children_t().swap(m_selectedBlocks); } + + m_bPermitImageUpdate = false; + m_regime = Hist_Pointer; + m_pSource = _items; + m_threadId = _thread_id; + ::profiler_gui::set_max(m_blockId); + + if (m_pSource != nullptr) + { + if (m_pSource->empty()) + { + m_pSource = nullptr; + } + else + { + const auto& root = EASY_GLOBALS.profiler_blocks[_thread_id]; + m_threadName = ::profiler_gui::decoratedThreadName(EASY_GLOBALS.use_decorated_thread_name, root, EASY_GLOBALS.hex_thread_id); + + if (root.children.empty()) + m_threadDuration = 0; + else + m_threadDuration = easyBlock(root.children.back()).tree.node->end() - easyBlock(root.children.front()).tree.node->begin(); + + m_threadProfiledTime = root.profiled_time; + m_threadWaitTime = root.wait_time; + m_pProfilerThread = &root; + m_timeUnits = EASY_GLOBALS.time_units; + + m_bReady.store(false, ::std::memory_order_release); + m_workerThread = ::std::thread([this](const ::profiler_gui::EasyItems* _source) + { + m_maxDuration = 0; + m_minDuration = 1e30; + + bool empty = true; + for (const auto& item : *_source) + { + if (m_bReady.load(::std::memory_order_acquire)) + return; + + if (easyDescriptor(easyBlock(item.block).tree.node->id()).type() == ::profiler::BlockType::Event) + continue; + + const auto w = item.width(); + + if (w > m_maxDuration) + m_maxDuration = w; + + if (w < m_minDuration) + m_minDuration = w; + + empty = false; + } + + if ((m_maxDuration - m_minDuration) < 1e-3) + { + if (m_minDuration > 0.1) + { + m_minDuration -= 0.1; + } + else + { + m_maxDuration = 0.1; + m_minDuration = 0; + } + } + + m_topDuration = m_maxDuration; + m_bottomDuration = m_minDuration; + + if (!empty) + { + m_topDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_topDuration, 3); + m_bottomDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_bottomDuration, 3); + } + else + { + m_topDurationStr.clear(); + m_bottomDurationStr.clear(); + } + + m_bReady.store(true, ::std::memory_order_release); + + }, m_pSource); + + m_timeouts = 3; + m_timer.start(WORKER_THREAD_CHECK_INTERVAL); + show(); + } + } + + if (m_pSource == nullptr) + { + m_pProfilerThread = nullptr; + m_topDurationStr.clear(); + m_bottomDurationStr.clear(); + m_threadName.clear(); + hide(); + } +} + +void EasyHistogramItem::setSource(::profiler::thread_id_t _thread_id, ::profiler::block_id_t _block_id) +{ + if (m_regime == Hist_Id && m_threadId == _thread_id && m_blockId == _block_id) + return; + + m_bPermitImageUpdate = false; // Set to false because m_workerThread have to parse input data first. This will be set to true when m_workerThread finish - see onTimeout() + m_regime = Hist_Id; + + m_timer.stop(); + m_boundaryTimer.stop(); + + m_bReady.store(true, ::std::memory_order_release); + if (m_workerThread.joinable()) + m_workerThread.join(); + + m_pSource = nullptr; + m_topDurationStr.clear(); + m_bottomDurationStr.clear(); + m_blockName.clear(); + m_blockTotalDuraion = 0; + + delete m_workerImage; + m_workerImage = nullptr; + m_imageOriginUpdate = m_imageOrigin = 0; + m_imageScaleUpdate = m_imageScale = 1; + + m_selectedBlocks.clear(); + { ::profiler::BlocksTree::children_t().swap(m_selectedBlocks); } + + m_threadId = _thread_id; + m_blockId = _block_id; + + if (m_threadId != 0 && !::profiler_gui::is_max(m_blockId)) + { + m_blockName = ::profiler_gui::toUnicode(easyDescriptor(m_blockId).name()); + + const auto& root = EASY_GLOBALS.profiler_blocks[_thread_id]; + m_threadName = ::profiler_gui::decoratedThreadName(EASY_GLOBALS.use_decorated_thread_name, root, EASY_GLOBALS.hex_thread_id); + m_pProfilerThread = &root; + m_timeUnits = EASY_GLOBALS.time_units; + + if (root.children.empty()) + { + m_threadDuration = 0; + m_threadProfiledTime = 0; + m_threadWaitTime = 0; + + m_topDuration = m_maxDuration = 0; + m_bottomDuration = m_minDuration = 1e30; + + m_bPermitImageUpdate = true; + + m_bReady.store(true, ::std::memory_order_release); + } + else + { + m_threadDuration = easyBlock(root.children.back()).tree.node->end() - easyBlock(root.children.front()).tree.node->begin(); + m_threadProfiledTime = root.profiled_time; + m_threadWaitTime = root.wait_time; + + m_bReady.store(false, ::std::memory_order_release); + m_workerThread = ::std::thread([this](decltype(root) profiler_thread, ::profiler::block_index_t selected_block, bool _showOnlyTopLevelBlocks) + { + typedef ::std::vector<::std::pair<::profiler::block_index_t, ::profiler::block_index_t> > Stack; + + m_maxDuration = 0; + m_minDuration = 1e30; + //const auto& profiler_thread = EASY_GLOBALS.profiler_blocks[m_threadId]; + Stack stack; + stack.reserve(profiler_thread.depth); + + const bool has_selected_block = !::profiler_gui::is_max(selected_block); + + for (auto frame : profiler_thread.children) + { + const auto& frame_block = easyBlock(frame).tree; + if (frame_block.node->id() == m_blockId || (!has_selected_block && m_blockId == easyDescriptor(frame_block.node->id()).id())) + { + m_selectedBlocks.push_back(frame); + + const auto w = frame_block.node->duration(); + if (w > m_maxDuration) + m_maxDuration = w; + + if (w < m_minDuration) + m_minDuration = w; + + m_blockTotalDuraion += w; + } + + if (_showOnlyTopLevelBlocks) + continue; + + stack.push_back(::std::make_pair(frame, 0U)); + while (!stack.empty()) + { + if (m_bReady.load(::std::memory_order_acquire)) + return; + + auto& top = stack.back(); + const auto& top_children = easyBlock(top.first).tree.children; + const auto stack_size = stack.size(); + for (auto end = top_children.size(); top.second < end; ++top.second) + { + if (m_bReady.load(::std::memory_order_acquire)) + return; + + const auto child_index = top_children[top.second]; + const auto& child = easyBlock(child_index).tree; + if (child.node->id() == m_blockId || (!has_selected_block && m_blockId == easyDescriptor(child.node->id()).id())) + { + m_selectedBlocks.push_back(child_index); + + const auto w = child.node->duration(); + if (w > m_maxDuration) + m_maxDuration = w; + + if (w < m_minDuration) + m_minDuration = w; + + m_blockTotalDuraion += w; + } + + if (!child.children.empty()) + { + ++top.second; + stack.push_back(::std::make_pair(child_index, 0U)); + break; + } + } + + if (stack_size == stack.size()) + { + stack.pop_back(); + } + } + } + + if (m_selectedBlocks.empty()) + { + m_topDurationStr.clear(); + m_bottomDurationStr.clear(); + } + else + { + if (has_selected_block) + { + const auto& item = easyBlock(selected_block).tree; + if (*item.node->name() != 0) + m_blockName = ::profiler_gui::toUnicode(item.node->name()); + } + + m_maxDuration *= 1e-3; + m_minDuration *= 1e-3; + + if ((m_maxDuration - m_minDuration) < 1e-3) + { + if (m_minDuration > 0.1) + { + m_minDuration -= 0.1; + } + else + { + m_maxDuration = 0.1; + m_minDuration = 0; + } + } + + m_topDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_maxDuration, 3); + m_bottomDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_minDuration, 3); + } + + + + m_topDuration = m_maxDuration; + m_bottomDuration = m_minDuration; + + m_bReady.store(true, ::std::memory_order_release); + + }, std::ref(root), EASY_GLOBALS.selected_block, EASY_GLOBALS.display_only_frames_on_histogram); + + m_timeouts = 3; + m_timer.start(WORKER_THREAD_CHECK_INTERVAL); + } + + show(); + } + else + { + m_pProfilerThread = nullptr; + m_threadName.clear(); + hide(); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyHistogramItem::validateName() +{ + if (m_threadName.isEmpty()) + return; + m_threadName = ::profiler_gui::decoratedThreadName(EASY_GLOBALS.use_decorated_thread_name, EASY_GLOBALS.profiler_blocks[m_threadId], EASY_GLOBALS.hex_thread_id); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyHistogramItem::onTimeout() +{ + if (!isVisible()) + { + m_timer.stop(); + return; + } + + if (++m_timeouts > 8) + m_timeouts = 3; + + if (m_bReady.load(::std::memory_order_acquire)) + { + m_timer.stop(); + if (!m_bPermitImageUpdate) + { + // Worker thread have finished parsing input data (when setSource(_block_id) was called) + m_bPermitImageUpdate = true; // From now we can update an image + updateImage(); + } + else + { + // Image updated + + if (m_workerThread.joinable()) + m_workerThread.join(); + + m_workerImage->swap(m_mainImage); + delete m_workerImage; + m_workerImage = nullptr; + + m_imageOriginUpdate = m_imageOrigin = m_workerImageOrigin; + m_imageScaleUpdate = m_imageScale = m_workerImageScale; + + if (EASY_GLOBALS.auto_adjust_histogram_height && !m_topDurationStr.isEmpty()) + { + m_topDuration = m_workerTopDuration; + m_bottomDuration = m_workerBottomDuration; + + m_topDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_topDuration, 3); + m_bottomDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_bottomDuration, 3); + } + } + } + + scene()->update(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyHistogramItem::pickTopBoundary(qreal _y) +{ + if (m_bPermitImageUpdate && m_boundingRect.top() < _y && _y < m_boundingRect.bottom() && !m_topDurationStr.isEmpty()) + { + m_topDuration = m_bottomDuration + (m_topDuration - m_bottomDuration) * (m_boundingRect.bottom() - _y) / (m_boundingRect.height() - HIST_COLUMN_MIN_HEIGHT); + m_topDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_topDuration, 3); + m_boundaryTimer.stop(); + updateImage(); + scene()->update(); // to update top-boundary text right now + } +} + +void EasyHistogramItem::increaseTopBoundary() +{ + if (m_bPermitImageUpdate && m_topDuration < m_maxDuration && !m_topDurationStr.isEmpty()) + { + auto step = 0.05 * (m_maxDuration - m_bottomDuration); + if (m_topDuration < (m_bottomDuration + 1.25 * step)) + step = 0.1 * (m_topDuration - m_bottomDuration); + + m_topDuration = std::min(m_maxDuration, m_topDuration + step); + m_topDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_topDuration, 3); + updateImage(); + scene()->update(); // to update top-boundary text right now + + m_boundaryTimer.stop(); + m_boundaryTimer.start(BOUNDARY_TIMER_INTERVAL); + } +} + +void EasyHistogramItem::decreaseTopBoundary() +{ + if (m_bPermitImageUpdate && m_topDuration > m_bottomDuration && !m_topDurationStr.isEmpty()) + { + auto step = 0.05 * (m_maxDuration - m_bottomDuration); + if (m_topDuration < (m_bottomDuration + 1.25 * step)) + step = std::max(0.1 * (m_topDuration - m_bottomDuration), 0.3); + + if (m_topDuration > (m_bottomDuration + 1.25 * step)) + { + m_topDuration = std::max(m_bottomDuration + step, m_topDuration - step); + m_topDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_topDuration, 3); + scene()->update(); // to update top-boundary text right now + + m_boundaryTimer.stop(); + m_boundaryTimer.start(BOUNDARY_TIMER_INTERVAL); + } + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyHistogramItem::pickBottomBoundary(qreal _y) +{ + if (m_bPermitImageUpdate && m_boundingRect.top() < _y && _y < m_boundingRect.bottom() && !m_bottomDurationStr.isEmpty()) + { + m_bottomDuration = m_bottomDuration + (m_topDuration - m_bottomDuration) * (m_boundingRect.bottom() - _y) / (m_boundingRect.height() - HIST_COLUMN_MIN_HEIGHT); + m_bottomDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_bottomDuration, 3); + m_boundaryTimer.stop(); + updateImage(); + scene()->update(); // to update top-boundary text right now + } +} + +void EasyHistogramItem::increaseBottomBoundary() +{ + if (m_bPermitImageUpdate && m_bottomDuration < m_topDuration && !m_bottomDurationStr.isEmpty()) + { + auto step = 0.05 * (m_topDuration - m_minDuration); + if (m_bottomDuration > (m_topDuration - 1.25 * step)) + step = 0.1 * (m_topDuration - m_bottomDuration); + + if (m_bottomDuration < (m_topDuration - 1.25 * step)) + { + m_bottomDuration = std::min(m_topDuration - step, m_bottomDuration + step); + m_bottomDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_bottomDuration, 3); + scene()->update(); // to update bottom-boundary text right now + + m_boundaryTimer.stop(); + m_boundaryTimer.start(BOUNDARY_TIMER_INTERVAL); + } + } +} + +void EasyHistogramItem::decreaseBottomBoundary() +{ + if (m_bPermitImageUpdate && m_bottomDuration > m_minDuration && !m_bottomDurationStr.isEmpty()) + { + auto step = 0.05 * (m_topDuration - m_minDuration); + if (m_bottomDuration > (m_topDuration - 1.25 * step)) + step = std::max(0.1 * (m_topDuration - m_bottomDuration), 0.3); + + m_bottomDuration = std::max(m_minDuration, m_bottomDuration - step); + m_bottomDurationStr = ::profiler_gui::timeStringReal(m_timeUnits, m_bottomDuration, 3); + scene()->update(); // to update top-boundary text right now + + m_boundaryTimer.stop(); + m_boundaryTimer.start(BOUNDARY_TIMER_INTERVAL); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyHistogramItem::setMouseY(qreal _mouseY) +{ + m_mouseY = _mouseY; +} + +void EasyHistogramItem::pickFrameTime(qreal _y) const +{ + if (m_bPermitImageUpdate && m_boundingRect.top() < _y && _y < m_boundingRect.bottom() && !m_topDurationStr.isEmpty()) + { + EASY_GLOBALS.frame_time = m_bottomDuration + (m_topDuration - m_bottomDuration) * (m_boundingRect.bottom() - _y) / (m_boundingRect.height() - HIST_COLUMN_MIN_HEIGHT); + emit EASY_GLOBALS.events.expectedFrameTimeChanged(); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyHistogramItem::onValueChanged() +{ + const auto widget = static_cast(scene()->parent()); + + if (!widget->bindMode()) + return; + + m_boundaryTimer.stop(); + + const auto sliderWidth_inv = 1.0 / widget->sliderWidth(); + const auto k = widget->range() * sliderWidth_inv; + + const auto deltaScale = m_imageScaleUpdate < k ? (k / m_imageScaleUpdate) : (m_imageScaleUpdate / k); + if (deltaScale > 4) { + updateImage(); + return; + } + + const auto deltaOffset = (widget->value() - m_imageOriginUpdate) * sliderWidth_inv; + if (deltaOffset < 1.5 || deltaOffset > 4.5) { + updateImage(); + return; + } + + m_boundaryTimer.start(BOUNDARY_TIMER_INTERVAL); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyHistogramItem::onModeChanged() +{ + if (!m_bPermitImageUpdate) + return; + + const auto widget = static_cast(scene()->parent()); + + if (!widget->bindMode() && EASY_GLOBALS.auto_adjust_histogram_height) + { + m_topDuration = m_maxDuration; + m_bottomDuration = m_minDuration; + } + + m_boundaryTimer.stop(); + updateImage(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyHistogramItem::cancelImageUpdate() +{ + if (!m_bPermitImageUpdate) + return; + + m_bReady.store(true, ::std::memory_order_release); + if (m_workerThread.joinable()) + m_workerThread.join(); + m_bReady.store(false, ::std::memory_order_release); + + delete m_workerImage; + m_workerImage = nullptr; + + m_imageOriginUpdate = m_imageOrigin; + m_imageScaleUpdate = m_imageScale; + + m_timer.stop(); +} + +void EasyHistogramItem::updateImage() +{ + if (!m_bPermitImageUpdate) + return; + + const auto widget = static_cast(scene()->parent()); + + m_bReady.store(true, ::std::memory_order_release); + if (m_workerThread.joinable()) + m_workerThread.join(); + m_bReady.store(false, ::std::memory_order_release); + + delete m_workerImage; + m_workerImage = nullptr; + + m_imageScaleUpdate = widget->range() / widget->sliderWidth(); + m_imageOriginUpdate = widget->bindMode() ? (widget->value() - widget->sliderWidth() * 3) : widget->minimum(); + + m_workerThread = ::std::thread([this](QRectF _boundingRect, HistRegime _regime, qreal _current_scale, + qreal _minimum, qreal _maximum, qreal _range, qreal _value, qreal _width, qreal _top_duration, qreal _bottom_duration, + bool _bindMode, float _frame_time, ::profiler::timestamp_t _begin_time, qreal _origin, bool _autoAdjustHist) + { + updateImage(_boundingRect, _regime, _current_scale, _minimum, _maximum, _range, _value, _width, _top_duration, _bottom_duration, _bindMode, _frame_time, _begin_time, _origin, _autoAdjustHist); + m_bReady.store(true, ::std::memory_order_release); + }, m_boundingRect, m_regime, widget->getWindowScale(), widget->minimum(), widget->maximum(), widget->range(), widget->value(), widget->sliderWidth(), + m_topDuration, m_bottomDuration, widget->bindMode(), EASY_GLOBALS.frame_time, EASY_GLOBALS.begin_time, m_imageOriginUpdate, EASY_GLOBALS.auto_adjust_histogram_height); + + m_timeouts = 3; + m_timer.start(WORKER_THREAD_CHECK_INTERVAL); +} + +void EasyHistogramItem::updateImage(QRectF _boundingRect, HistRegime _regime, qreal _current_scale, + qreal _minimum, qreal _maximum, qreal _range, + qreal _value, qreal _width, qreal _top_duration, qreal _bottom_duration, + bool _bindMode, float _frame_time, ::profiler::timestamp_t _begin_time, + qreal _origin, bool _autoAdjustHist) +{ + const auto bottom = _boundingRect.height();//_boundingRect.bottom(); + const auto screenWidth = _boundingRect.width() * _current_scale; + const auto maxColumnHeight = _boundingRect.height(); + const auto viewScale = _range / _width; + + if (_bindMode) + { + m_workerImageScale = viewScale; + m_workerImageOrigin = _value - _width * 3; + m_workerImage = new QImage(screenWidth * 7 + 0.5, _boundingRect.height(), QImage::Format_ARGB32); + } + else + { + m_workerImageScale = 1; + m_workerImageOrigin = _minimum; + m_workerImage = new QImage(screenWidth + 0.5, _boundingRect.height(), QImage::Format_ARGB32); + } + + m_workerImage->fill(0); + QPainter p(m_workerImage); + p.setPen(Qt::NoPen); + + QRectF rect; + QBrush brush(Qt::SolidPattern); + QRgb previousColor = 0; + + qreal previous_x = -1e30, previous_h = -1e30, offset = 0.; + auto realScale = _current_scale; + + const bool gotFrame = _frame_time > 1e-6f; + qreal frameCoeff = 1; + if (gotFrame) + { + if (_frame_time <= _bottom_duration) + frameCoeff = _boundingRect.height(); + else + frameCoeff = 0.9 / _frame_time; + } + + auto const calculate_color = gotFrame ? calculate_color2 : calculate_color1; + auto const k = gotFrame ? sqr(sqr(frameCoeff)) : 1.0 / _boundingRect.height(); + + if (_regime == Hist_Pointer) + { + const auto& items = *m_pSource; + if (items.empty()) + return; + + auto first = items.begin(); + + if (_bindMode) + { + _minimum = m_workerImageOrigin; + _maximum = m_workerImageOrigin + _width * 7; + realScale *= viewScale; + offset = _minimum * realScale; + + first = ::std::lower_bound(items.begin(), items.end(), _minimum, [](const ::profiler_gui::EasyBlockItem& _item, qreal _value) + { + return _item.left() < _value; + }); + + if (first != items.end()) + { + if (first != items.begin()) + --first; + } + else + { + first = items.begin() + items.size() - 1; + } + + if (_autoAdjustHist) + { + const auto maxVal = _value + _width; + decltype(_top_duration) maxDuration = 0; + decltype(_bottom_duration) minDuration = 1e30; + size_t iterations = 0; + for (auto it = first, end = items.end(); it != end; ++it) + { + // Draw rectangle + if (it->left() > maxVal) + break; + + if (it->right() < _value) + continue; + + if (maxDuration < it->width()) + maxDuration = it->width(); + + if (minDuration > it->width()) + minDuration = it->width(); + + ++iterations; + } + + if (iterations) + { + _top_duration = maxDuration; + _bottom_duration = minDuration; + + if ((_top_duration - _bottom_duration) < 1e-3) + { + if (_bottom_duration > 0.1) + { + _bottom_duration -= 0.1; + } + else + { + _top_duration = 0.1; + _bottom_duration = 0; + } + } + } + } + } + + const auto dtime = _top_duration - _bottom_duration; + const auto coeff = (_boundingRect.height() - HIST_COLUMN_MIN_HEIGHT) / (dtime > 1e-3 ? dtime : 1.); + + for (auto it = first, end = items.end(); it != end; ++it) + { + // Draw rectangle + if (it->left() > _maximum) + break; + + if (it->right() < _minimum) + continue; + + const qreal item_x = it->left() * realScale - offset; + const qreal item_w = ::std::max(it->width() * realScale, 1.0); + const qreal item_r = item_x + item_w; + const qreal h = it->width() <= _bottom_duration ? HIST_COLUMN_MIN_HEIGHT : + (it->width() > _top_duration ? maxColumnHeight : (HIST_COLUMN_MIN_HEIGHT + (it->width() - _bottom_duration) * coeff)); + + if (h < previous_h && item_r < previous_x) + continue; + + const auto col = calculate_color(h, it->width(), k); + const auto color = 0x00ffffff & QColor::fromHsvF((1.0 - col) * 0.375, 0.85, 0.85).rgb(); + + if (previousColor != color) + { + // Set background color brush for rectangle + previousColor = color; + brush.setColor(QColor::fromRgba(0xc0000000 | color)); + p.setBrush(brush); + } + + rect.setRect(item_x, bottom - h, item_w, h); + p.drawRect(rect); + + previous_x = item_r; + previous_h = h; + } + } + else + { + auto first = m_selectedBlocks.begin(); + + if (_bindMode) + { + _minimum = m_workerImageOrigin; + _maximum = m_workerImageOrigin + _width * 7; + realScale *= viewScale; + offset = _minimum * 1e3 * realScale; + + first = ::std::lower_bound(m_selectedBlocks.begin(), m_selectedBlocks.end(), _minimum * 1e3 + _begin_time, [](::profiler::block_index_t _item, qreal _value) + { + return easyBlock(_item).tree.node->begin() < _value; + }); + + if (first != m_selectedBlocks.end()) + { + if (first != m_selectedBlocks.begin()) + --first; + } + else + { + first = m_selectedBlocks.begin() + m_selectedBlocks.size() - 1; + } + + _minimum *= 1e3; + _maximum *= 1e3; + + if (_autoAdjustHist) + { + const auto minVal = _value * 1e3, maxVal = (_value + _width) * 1e3; + decltype(_top_duration) maxDuration = 0; + decltype(_bottom_duration) minDuration = 1e30; + size_t iterations = 0; + for (auto it = first, end = m_selectedBlocks.end(); it != end; ++it) + { + const auto item = easyBlock(*it).tree.node; + + const auto beginTime = item->begin() - _begin_time; + if (beginTime > maxVal) + break; + + const auto endTime = item->end() - _begin_time; + if (endTime < minVal) + continue; + + const qreal duration = item->duration() * 1e-3; + + if (maxDuration < duration) + maxDuration = duration; + + if (minDuration > duration) + minDuration = duration; + + ++iterations; + } + + if (iterations) + { + _top_duration = maxDuration; + _bottom_duration = minDuration; + + if ((_top_duration - _bottom_duration) < 1e-3) + { + if (_bottom_duration > 0.1) + { + _bottom_duration -= 0.1; + } + else + { + _top_duration = 0.1; + _bottom_duration = 0; + } + } + } + } + } + else + { + _minimum *= 1e3; + _maximum *= 1e3; + } + + const auto dtime = _top_duration - _bottom_duration; + const auto coeff = (_boundingRect.height() - HIST_COLUMN_MIN_HEIGHT) / (dtime > 1e-3 ? dtime : 1.); + + for (auto it = first, end = m_selectedBlocks.end(); it != end; ++it) + { + // Draw rectangle + const auto item = easyBlock(*it).tree.node; + + const auto beginTime = item->begin() - _begin_time; + if (beginTime > _maximum) + break; + + const auto endTime = item->end() - _begin_time; + if (endTime < _minimum) + continue; + + const qreal duration = item->duration() * 1e-3; + const qreal item_x = (beginTime * realScale - offset) * 1e-3; + const qreal item_w = ::std::max(duration * realScale, 1.0); + const qreal item_r = item_x + item_w; + const auto h = duration <= _bottom_duration ? HIST_COLUMN_MIN_HEIGHT : + (duration > _top_duration ? maxColumnHeight : (HIST_COLUMN_MIN_HEIGHT + (duration - _bottom_duration) * coeff)); + + if (h < previous_h && item_r < previous_x) + continue; + + const auto col = calculate_color(h, duration, k); + const auto color = 0x00ffffff & QColor::fromHsvF((1.0 - col) * 0.375, 0.85, 0.85).rgb(); + + if (previousColor != color) + { + // Set background color brush for rectangle + previousColor = color; + brush.setColor(QColor::fromRgba(0xc0000000 | color)); + p.setBrush(brush); + } + + rect.setRect(item_x, bottom - h, item_w, h); + p.drawRect(rect); + + previous_x = item_r; + previous_h = h; + } + } + + m_workerTopDuration = _top_duration; + m_workerBottomDuration = _bottom_duration; +} + +////////////////////////////////////////////////////////////////////////// + +EasyGraphicsScrollbar::EasyGraphicsScrollbar(QWidget* _parent) + : Parent(_parent) + , m_minimumValue(0) + , m_maximumValue(500) + , m_value(10) + , m_windowScale(1) + , m_mouseButtons(Qt::NoButton) + , m_slider(nullptr) + , m_chronometerIndicator(nullptr) + , m_histogramItem(nullptr) + , m_defaultFontHeight(0) + , m_bScrolling(false) + , m_bBindMode(false) + , m_bLocked(false) +{ + setCacheMode(QGraphicsView::CacheNone); + setTransformationAnchor(QGraphicsView::AnchorUnderMouse); + //setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); + setViewportUpdateMode(QGraphicsView::FullViewportUpdate); + setOptimizationFlag(QGraphicsView::DontSavePainterState, true); + + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + setContentsMargins(0, 0, 0, 0); + + auto selfScene = new QGraphicsScene(this); + m_defaultFontHeight = QFontMetrics(selfScene->font()).height(); + selfScene->setSceneRect(0, DEFAULT_TOP, 500, DEFAULT_HEIGHT + m_defaultFontHeight + 2); + setFixedHeight(DEFAULT_HEIGHT + m_defaultFontHeight + 2); + + setScene(selfScene); + + m_histogramItem = new EasyHistogramItem(); + m_histogramItem->setPos(0, 0); + m_histogramItem->setBoundingRect(0, DEFAULT_TOP + INDICATOR_SIZE, scene()->width(), DEFAULT_HEIGHT - INDICATOR_SIZE_x2); + selfScene->addItem(m_histogramItem); + m_histogramItem->hide(); + + m_chronometerIndicator = new EasyGraphicsSliderItem(false); + m_chronometerIndicator->setPos(0, 0); + m_chronometerIndicator->setColor(0x40000000 | ::profiler_gui::CHRONOMETER_COLOR.rgba()); + selfScene->addItem(m_chronometerIndicator); + m_chronometerIndicator->hide(); + + m_slider = new EasyGraphicsSliderItem(true); + m_slider->setPos(0, 0); + m_slider->setColor(0x40c0c0c0); + selfScene->addItem(m_slider); + m_slider->hide(); + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::expectedFrameTimeChanged, [this]() + { + if (m_histogramItem->isVisible()) + { + m_histogramItem->updateImage(); + scene()->update(); + } + }); + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::autoAdjustHistogramChanged, [this]() + { + if (m_histogramItem->isVisible()) + m_histogramItem->onModeChanged(); + }); + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::displayOnlyFramesOnHistogramChanged, [this]() + { + if (m_histogramItem->isVisible()) + m_histogramItem->rebuildSource(EasyHistogramItem::Hist_Id); + }); + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::threadNameDecorationChanged, this, &This::onThreadViewChanged); + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::hexThreadIdChanged, this, &This::onThreadViewChanged); + + centerOn(0, 0); +} + +EasyGraphicsScrollbar::~EasyGraphicsScrollbar() +{ + +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsScrollbar::onThreadViewChanged() +{ + if (m_histogramItem->isVisible()) + { + m_histogramItem->validateName(); + scene()->update(); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsScrollbar::clear() +{ + setHistogramSource(0, nullptr); + hideChrono(); + setRange(0, 100); + setSliderWidth(2); + setValue(0); +} + +////////////////////////////////////////////////////////////////////////// + +bool EasyGraphicsScrollbar::bindMode() const +{ + return m_bBindMode; +} + +qreal EasyGraphicsScrollbar::getWindowScale() const +{ + return m_windowScale; +} + +::profiler::thread_id_t EasyGraphicsScrollbar::hystThread() const +{ + return m_histogramItem->threadId(); +} + +qreal EasyGraphicsScrollbar::minimum() const +{ + return m_minimumValue; +} + +qreal EasyGraphicsScrollbar::maximum() const +{ + return m_maximumValue; +} + +qreal EasyGraphicsScrollbar::range() const +{ + return m_maximumValue - m_minimumValue; +} + +qreal EasyGraphicsScrollbar::value() const +{ + return m_value; +} + +qreal EasyGraphicsScrollbar::sliderWidth() const +{ + return m_slider->width(); +} + +qreal EasyGraphicsScrollbar::sliderHalfWidth() const +{ + return m_slider->halfwidth(); +} + +int EasyGraphicsScrollbar::defaultFontHeight() const +{ + return m_defaultFontHeight; +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsScrollbar::setValue(qreal _value) +{ + using estd::clamp; + m_value = clamp(m_minimumValue, _value, ::std::max(m_minimumValue, m_maximumValue - m_slider->width())); + m_slider->setX(m_value + m_slider->halfwidth()); + emit valueChanged(m_value); + + if (m_histogramItem->isVisible()) + m_histogramItem->onValueChanged(); +} + +void EasyGraphicsScrollbar::setRange(qreal _minValue, qreal _maxValue) +{ + const auto oldRange = range(); + const auto oldValue = oldRange < 1e-3 ? 0.0 : m_value / oldRange; + + m_minimumValue = _minValue; + m_maximumValue = _maxValue; + const auto range = this->range(); + scene()->setSceneRect(_minValue, DEFAULT_TOP, range, DEFAULT_HEIGHT + m_defaultFontHeight + 4); + + m_histogramItem->cancelImageUpdate(); + m_histogramItem->setBoundingRect(_minValue, DEFAULT_TOP + INDICATOR_SIZE, range, DEFAULT_HEIGHT - INDICATOR_SIZE_x2); + + emit rangeChanged(); + + setValue(_minValue + oldValue * range); + + onWindowWidthChange(width()); + + if (m_histogramItem->isVisible()) + m_histogramItem->updateImage(); +} + +void EasyGraphicsScrollbar::setSliderWidth(qreal _width) +{ + m_slider->setWidth(_width); + setValue(m_value); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsScrollbar::setChronoPos(qreal _left, qreal _right) +{ + m_chronometerIndicator->setWidth(_right - _left); + m_chronometerIndicator->setX(_left + m_chronometerIndicator->halfwidth()); +} + +void EasyGraphicsScrollbar::showChrono() +{ + m_chronometerIndicator->show(); +} + +void EasyGraphicsScrollbar::hideChrono() +{ + m_chronometerIndicator->hide(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsScrollbar::setHistogramSource(::profiler::thread_id_t _thread_id, const ::profiler_gui::EasyItems* _items) +{ + if (m_bLocked) + return; + + m_histogramItem->setSource(_thread_id, _items); + m_slider->setVisible(m_histogramItem->isVisible()); + scene()->update(); +} + +void EasyGraphicsScrollbar::setHistogramSource(::profiler::thread_id_t _thread_id, ::profiler::block_id_t _block_id) +{ + if (m_bLocked) + return; + + m_histogramItem->setSource(_thread_id, _block_id); + m_slider->setVisible(m_histogramItem->isVisible()); + scene()->update(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsScrollbar::mousePressEvent(QMouseEvent* _event) +{ + _event->accept(); + + m_mouseButtons = _event->buttons(); + + if (m_mouseButtons & Qt::LeftButton) + { + if (_event->modifiers() & Qt::ControlModifier) + { + m_histogramItem->pickBottomBoundary(mapToScene(_event->pos()).y()); + } + else if (_event->modifiers() & Qt::ShiftModifier) + { + m_histogramItem->pickTopBoundary(mapToScene(_event->pos()).y()); + } + else + { + m_bScrolling = true; + m_mousePressPos = _event->pos(); + if (!m_bBindMode) + setValue(mapToScene(m_mousePressPos).x() - m_minimumValue - m_slider->halfwidth()); + } + } + + if (m_mouseButtons & Qt::RightButton) + { + if (_event->modifiers()) + { + m_histogramItem->pickFrameTime(mapToScene(_event->pos()).y()); + } + else + { + m_bBindMode = !m_bBindMode; + if (m_histogramItem->isVisible()) + m_histogramItem->onModeChanged(); + } + } + + //QGraphicsView::mousePressEvent(_event); +} + +void EasyGraphicsScrollbar::mouseReleaseEvent(QMouseEvent* _event) +{ + m_mouseButtons = _event->buttons(); + m_bScrolling = false; + _event->accept(); + //QGraphicsView::mouseReleaseEvent(_event); +} + +void EasyGraphicsScrollbar::mouseMoveEvent(QMouseEvent* _event) +{ + const auto pos = _event->pos(); + + if (m_mouseButtons & Qt::LeftButton) + { + const auto delta = pos - m_mousePressPos; + m_mousePressPos = pos; + + if (m_bScrolling) + { + auto realScale = m_windowScale; + if (m_bBindMode) + realScale *= -range() / sliderWidth(); + setValue(m_value + delta.x() / realScale); + } + } + + if (m_histogramItem->isVisible()) + { + m_histogramItem->setMouseY(mapToScene(pos).y()); + scene()->update(); + } +} + +void EasyGraphicsScrollbar::wheelEvent(QWheelEvent* _event) +{ + _event->accept(); + + if (_event->modifiers() & Qt::ShiftModifier) + { + // Shift + mouse wheel will change histogram top boundary + + if (m_histogramItem->isVisible()) + { + if (_event->delta() > 0) + m_histogramItem->increaseTopBoundary(); + else + m_histogramItem->decreaseTopBoundary(); + } + + return; + } + + if (_event->modifiers() & Qt::ControlModifier) + { + // Ctrl + mouse wheel will change histogram bottom boundary + + if (m_histogramItem->isVisible()) + { + if (_event->delta() > 0) + m_histogramItem->increaseBottomBoundary(); + else + m_histogramItem->decreaseBottomBoundary(); + } + + return; + } + + if (!m_bBindMode) + { + const auto w = m_slider->halfwidth() * (_event->delta() < 0 ? ::profiler_gui::SCALING_COEFFICIENT : ::profiler_gui::SCALING_COEFFICIENT_INV); + setValue(mapToScene(_event->pos()).x() - m_minimumValue - w); + emit wheeled(w * m_windowScale, _event->delta()); + } + else + { + const auto x = (mapToScene(_event->pos()).x() - m_minimumValue) * m_windowScale; + emit wheeled(x, _event->delta()); + } +} + +void EasyGraphicsScrollbar::resizeEvent(QResizeEvent* _event) +{ + onWindowWidthChange(_event->size().width()); + if (m_histogramItem->isVisible()) + m_histogramItem->updateImage(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyGraphicsScrollbar::onWindowWidthChange(qreal _width) +{ + const auto oldScale = m_windowScale; + const auto scrollingRange = range(); + + if (scrollingRange < 1e-3) + { + m_windowScale = 1; + } + else + { + m_windowScale = _width / scrollingRange; + } + + scale(m_windowScale / oldScale, 1); +} + +////////////////////////////////////////////////////////////////////////// diff --git a/3rdparty/easyprofiler/profiler_gui/easy_graphics_scrollbar.h b/3rdparty/easyprofiler/profiler_gui/easy_graphics_scrollbar.h new file mode 100644 index 0000000..06a8ec7 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_graphics_scrollbar.h @@ -0,0 +1,342 @@ +/************************************************************************ +* file name : easy_graphics_scrollbar.h +* ----------------- : +* creation time : 2016/07/04 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : This file contains declaration of +* ----------------- : +* change log : * 2016/07/04 Victor Zarubkin: Initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY__GRAPHICS_SCROLLBAR__H +#define EASY__GRAPHICS_SCROLLBAR__H + +#include +#include +#include +#include +#include +#include +#include +#include +#include "easy_qtimer.h" +#include "common_types.h" + +////////////////////////////////////////////////////////////////////////// + +// TODO: use profiler_core/spin_lock.h + +#define EASY_GUI_USE_CRITICAL_SECTION // Use CRITICAL_SECTION instead of std::atomic_flag +#if defined(_WIN32) && defined(EASY_GUI_USE_CRITICAL_SECTION) +namespace profiler_gui { + // std::atomic_flag on Windows works slower than critical section, so we will use it instead of std::atomic_flag... + // By the way, Windows critical sections are slower than std::atomic_flag on Unix. + class spin_lock { void* m_lock; public: + void lock(); + void unlock(); + spin_lock(); + ~spin_lock(); + }; +#else +namespace profiler_gui { + // std::atomic_flag on Unix works fine and very fast (almost instant!) + class spin_lock { + ::std::atomic_flag m_lock; public: + + void lock() { + while (m_lock.test_and_set(::std::memory_order_acquire)); + } + + void unlock() { + m_lock.clear(::std::memory_order_release); + } + + spin_lock() { + m_lock.clear(); + } + }; +#endif + +} // END of namespace profiler_gui. + +////////////////////////////////////////////////////////////////////////// + +class EasyGraphicsSliderItem : public QGraphicsRectItem +{ + typedef QGraphicsRectItem Parent; + typedef EasyGraphicsSliderItem This; + +private: + + QPolygonF m_indicator; + qreal m_halfwidth; + bool m_bMain; + +public: + + explicit EasyGraphicsSliderItem(bool _main); + virtual ~EasyGraphicsSliderItem(); + + void paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget = nullptr) override; + + qreal width() const; + qreal halfwidth() const; + + void setWidth(qreal _width); + void setHalfwidth(qreal _halfwidth); + + void setColor(QRgb _color); + void setColor(const QColor& _color); + +}; // END of class EasyGraphicsSliderItem. + +////////////////////////////////////////////////////////////////////////// + +class EasyHistogramItem : public QGraphicsItem +{ + typedef QGraphicsItem Parent; + typedef EasyHistogramItem This; + +public: + + enum HistRegime : uint8_t { Hist_Pointer, Hist_Id }; + +private: + + QRectF m_boundingRect; + qreal m_topDuration; + qreal m_bottomDuration; + qreal m_maxDuration; + qreal m_minDuration; + qreal m_mouseY; + qreal m_imageOrigin; + qreal m_imageScale; + qreal m_imageOriginUpdate; + qreal m_imageScaleUpdate; + qreal m_workerImageOrigin; + qreal m_workerImageScale; + qreal m_workerTopDuration; + qreal m_workerBottomDuration; + ::profiler::timestamp_t m_blockTotalDuraion; + QString m_topDurationStr; + QString m_bottomDurationStr; + QString m_threadName; + QString m_blockName; + ::profiler::BlocksTree::children_t m_selectedBlocks; + QImage m_mainImage; + EasyQTimer m_timer; + EasyQTimer m_boundaryTimer; + ::std::thread m_workerThread; + ::profiler::timestamp_t m_threadDuration; + ::profiler::timestamp_t m_threadProfiledTime; + ::profiler::timestamp_t m_threadWaitTime; + const ::profiler_gui::EasyItems* m_pSource; + QImage* m_workerImage; + const ::profiler::BlocksTreeRoot* m_pProfilerThread; + ::profiler::thread_id_t m_threadId; + ::profiler::block_index_t m_blockId; + int m_timeouts; + ::profiler_gui::TimeUnits m_timeUnits; + HistRegime m_regime; + bool m_bPermitImageUpdate; ///< Is false when m_workerThread is parsing input dataset (when setSource(_block_id) is called) + ::profiler_gui::spin_lock m_spin; + ::std::atomic_bool m_bReady; + +public: + + explicit EasyHistogramItem(); + virtual ~EasyHistogramItem(); + + // Public virtual methods + + QRectF boundingRect() const override; + void paint(QPainter* _painter, const QStyleOptionGraphicsItem* _option, QWidget* _widget = nullptr) override; + +public: + + // Public non-virtual methods + + ::profiler::thread_id_t threadId() const; + + void setBoundingRect(const QRectF& _rect); + void setBoundingRect(qreal x, qreal y, qreal w, qreal h); + + void setSource(::profiler::thread_id_t _thread_id, const ::profiler_gui::EasyItems* _items); + void setSource(::profiler::thread_id_t _thread_id, ::profiler::block_id_t _block_id); + void rebuildSource(HistRegime _regime); + void rebuildSource(); + void validateName(); + void updateImage(); + void cancelImageUpdate(); + + void pickTopBoundary(qreal _y); + void increaseTopBoundary(); + void decreaseTopBoundary(); + + void pickBottomBoundary(qreal _y); + void increaseBottomBoundary(); + void decreaseBottomBoundary(); + + void setMouseY(qreal _mouseY); + void pickFrameTime(qreal _y) const; + + void onValueChanged(); + void onModeChanged(); + +private: + + void paintBusyIndicator(QPainter* _painter, qreal _current_scale); + void paintMouseIndicator(QPainter* _painter, qreal _top, qreal _bottom, qreal _width, qreal _height, qreal _top_width, qreal _mouse_y, qreal _delta_time, int _font_h); + void paintByPtr(QPainter* _painter); + void paintById(QPainter* _painter); + void onTimeout(); + void updateImage(QRectF _boundingRect, HistRegime _regime, qreal _current_scale, + qreal _minimum, qreal _maximum, qreal _range, + qreal _value, qreal _width, qreal _top_duration, qreal _bottom_duration, bool _bindMode, + float _frame_time, ::profiler::timestamp_t _begin_time, qreal _origin, bool _autoAdjustHist); + +}; // END of class EasyHistogramItem. + +////////////////////////////////////////////////////////////////////////// + +class EasyGraphicsScrollbar : public QGraphicsView +{ + Q_OBJECT + +private: + + typedef QGraphicsView Parent; + typedef EasyGraphicsScrollbar This; + + qreal m_minimumValue; + qreal m_maximumValue; + qreal m_value; + qreal m_windowScale; + QPoint m_mousePressPos; + Qt::MouseButtons m_mouseButtons; + EasyGraphicsSliderItem* m_slider; + EasyGraphicsSliderItem* m_chronometerIndicator; + EasyHistogramItem* m_histogramItem; + int m_defaultFontHeight; + bool m_bScrolling; + bool m_bBindMode; + bool m_bLocked; + +public: + + explicit EasyGraphicsScrollbar(QWidget* _parent = nullptr); + virtual ~EasyGraphicsScrollbar(); + + // Public virtual methods + + void mousePressEvent(QMouseEvent* _event) override; + void mouseReleaseEvent(QMouseEvent* _event) override; + void mouseMoveEvent(QMouseEvent* _event) override; + void wheelEvent(QWheelEvent* _event) override; + void resizeEvent(QResizeEvent* _event) override; + + void dragEnterEvent(QDragEnterEvent*) override {} + +public: + + // Public non-virtual methods + + void clear(); + + bool bindMode() const; + qreal getWindowScale() const; + ::profiler::thread_id_t hystThread() const; + + qreal minimum() const; + qreal maximum() const; + qreal range() const; + qreal value() const; + qreal sliderWidth() const; + qreal sliderHalfWidth() const; + int defaultFontHeight() const; + + void setValue(qreal _value); + void setRange(qreal _minValue, qreal _maxValue); + void setSliderWidth(qreal _width); + void setChronoPos(qreal _left, qreal _right); + void showChrono(); + void hideChrono(); + + void setHistogramSource(::profiler::thread_id_t _thread_id, const::profiler_gui::EasyItems* _items); + void setHistogramSource(::profiler::thread_id_t _thread_id, ::profiler::block_id_t _block_id); + + inline void setHistogramSource(::profiler::thread_id_t _thread_id, const ::profiler_gui::EasyItems& _items) + { + setHistogramSource(_thread_id, &_items); + } + + inline void lock() + { + m_bLocked = true; + } + + inline void unlock() + { + m_bLocked = false; + } + +signals: + + void rangeChanged(); + void valueChanged(qreal _value); + void wheeled(qreal _mouseX, int _wheelDelta); + +private slots: + + void onThreadViewChanged(); + void onWindowWidthChange(qreal _width); + +}; // END of class EasyGraphicsScrollbar. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY__GRAPHICS_SCROLLBAR__H diff --git a/3rdparty/easyprofiler/profiler_gui/easy_qtimer.cpp b/3rdparty/easyprofiler/profiler_gui/easy_qtimer.cpp new file mode 100644 index 0000000..4eb1740 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_qtimer.cpp @@ -0,0 +1,85 @@ +/************************************************************************ +* file name : easy_qtimer.h +* ----------------- : +* creation time : 2016/12/05 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : This file contains implementation of EasyQTimer class used to +* : connect QTimer to non-QObject classes. +* ----------------- : +* change log : * 2016/12/05 Victor Zarubkin: Initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include "easy_qtimer.h" + +////////////////////////////////////////////////////////////////////////// + +EasyQTimer::EasyQTimer() + : QObject() +{ + connect(&m_timer, &QTimer::timeout, [this](){ m_handler(); }); +} + +EasyQTimer::EasyQTimer(::std::function&& _handler, bool _isSignleShot) + : QObject() + , m_handler(::std::forward<::std::function&&>(_handler)) +{ + m_timer.setSingleShot(_isSignleShot); + connect(&m_timer, &QTimer::timeout, [this](){ m_handler(); }); +} + +EasyQTimer::~EasyQTimer() +{ + +} + +void EasyQTimer::setHandler(::std::function&& _handler) +{ + m_handler = _handler; +} + +////////////////////////////////////////////////////////////////////////// + diff --git a/3rdparty/easyprofiler/profiler_gui/easy_qtimer.h b/3rdparty/easyprofiler/profiler_gui/easy_qtimer.h new file mode 100644 index 0000000..818e628 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/easy_qtimer.h @@ -0,0 +1,89 @@ +/************************************************************************ +* file name : easy_qtimer.h +* ----------------- : +* creation time : 2016/12/05 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : This file contains declaration of EasyQTimer class used to +* : connect QTimer to non-QObject classes. +* ----------------- : +* change log : * 2016/12/05 Victor Zarubkin: Initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY__QTIMER__H +#define EASY__QTIMER__H + +#include +#include + +////////////////////////////////////////////////////////////////////////// + +class EasyQTimer : public QObject +{ + Q_OBJECT + +private: + + QTimer m_timer; + ::std::function m_handler; + +public: + + EasyQTimer(); + EasyQTimer(::std::function&& _handler, bool _isSignleShot = false); + virtual ~EasyQTimer(); + + void setHandler(::std::function&& _handler); + + inline void start(int msec) { m_timer.start(msec); } + inline void stop() { if (m_timer.isActive()) m_timer.stop(); } + inline bool isActive() const { return m_timer.isActive(); } + +}; // END of class EasyQTimer. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY__QTIMER__H diff --git a/3rdparty/easyprofiler/profiler_gui/globals.cpp b/3rdparty/easyprofiler/profiler_gui/globals.cpp new file mode 100644 index 0000000..4487849 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/globals.cpp @@ -0,0 +1,122 @@ +/************************************************************************ +* file name : globals.cpp +* ----------------- : +* creation time : 2016/08/03 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of global constants and variables for profiler gui. +* ----------------- : +* change log : * 2016/08/03 Victor Zarubkin: initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#define IGNORE_GLOBALS_DECLARATION +#include "globals.h" +#undef IGNORE_GLOBALS_DECLARATION + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +namespace profiler_gui { + + EasyGlobals& EasyGlobals::instance() + { + // It's okay even without C++11 "magic statics" feature because first call happens + // on application initialization - there is only one thread and no data races occur. + static EasyGlobals globals; + return globals; + } + + EasyGlobals::EasyGlobals() + : theme("default") + , bg_font(::profiler_gui::EFont("DejaVu Sans", 10, QFont::Bold)) + , chronometer_font(::profiler_gui::EFont("DejaVu Sans", 16, QFont::Bold)) + , items_font(::profiler_gui::EFont("DejaVu Sans", 10, QFont::Medium)) + , selected_item_font(::profiler_gui::EFont("DejaVu Sans", 10, QFont::Medium)) + , scene_left(0) + , scene_right(100) + , begin_time(0) + , selected_thread(0U) + , selected_block(::profiler_gui::numeric_max()) + , selected_block_id(::profiler_gui::numeric_max()) + , version(0) + , frame_time(16700) + , blocks_spacing(0) + , blocks_size_min(2) + , blocks_narrow_size(20) + , max_fps_history(90) + , fps_timer_interval(500) + , fps_widget_line_width(2) + , chrono_text_position(ChronoTextPosition_Top) + , time_units(TimeUnits_ms) + , connected(false) + , fps_enabled(true) + , use_decorated_thread_name(false) + , hex_thread_id(false) + , enable_event_markers(true) + , enable_statistics(true) + , enable_zero_length(true) + , add_zero_blocks_to_hierarchy(false) + , draw_graphics_items_borders(true) + , hide_narrow_children(false) + , hide_minsize_blocks(false) + , display_only_relevant_stats(true) + , collapse_items_on_tree_close(false) + , all_items_expanded_by_default(true) + , only_current_thread_hierarchy(false) + , highlight_blocks_with_same_id(true) + , selecting_block_changes_thread(true) + , auto_adjust_histogram_height(true) + , display_only_frames_on_histogram(false) + , bind_scene_and_tree_expand_status(true) + { + + } + +} // END of namespace profiler_gui. + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + diff --git a/3rdparty/easyprofiler/profiler_gui/globals.h b/3rdparty/easyprofiler/profiler_gui/globals.h new file mode 100644 index 0000000..6f346be --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/globals.h @@ -0,0 +1,273 @@ +/************************************************************************ +* file name : globals.h +* ----------------- : +* creation time : 2016/08/03 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of global constants and variables for profiler gui. +* ----------------- : +* change log : * 2016/08/03 Victor Zarubkin: initial commit. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER__GUI_GLOBALS_H +#define EASY_PROFILER__GUI_GLOBALS_H + +#include +#include +#include +#include +#include +#include +#include "common_functions.h" +#include "globals_qobjects.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +namespace profiler_gui { + + const QString ORGANAZATION_NAME = "EasyProfiler"; + const QString APPLICATION_NAME = "Easy profiler gui application"; + + const QColor CHRONOMETER_COLOR = QColor::fromRgba(0x40000000 | (::profiler::colors::RichBlue & 0x00ffffff));// 0x402020c0); + const QColor CHRONOMETER_COLOR2 = QColor::fromRgba(0x40000000 | (::profiler::colors::Dark & 0x00ffffff));// 0x40408040); + const QColor TEXT_COLOR = QColor::fromRgb(0xff504040); + const QColor SYSTEM_BORDER_COLOR = QColor::fromRgb(0xffcccccc); + EASY_CONSTEXPR QRgb SELECTED_THREAD_BACKGROUND = 0xffe0e060; + EASY_CONSTEXPR QRgb SELECTED_THREAD_FOREGROUND = 0xffffffff - (SELECTED_THREAD_BACKGROUND & 0x00ffffff); + + EASY_CONSTEXPR qreal SCALING_COEFFICIENT = 1.25; + EASY_CONSTEXPR qreal SCALING_COEFFICIENT_INV = 1.0 / SCALING_COEFFICIENT; + + EASY_CONSTEXPR uint32_t V130 = 0x01030000; + + Q_CONSTEXPR QSize ICONS_SIZE {28, 28}; + EASY_CONSTEXPR uint16_t GRAPHICS_ROW_SIZE = 20; + EASY_CONSTEXPR uint16_t GRAPHICS_ROW_SPACING = 0; + EASY_CONSTEXPR uint16_t GRAPHICS_ROW_SIZE_FULL = GRAPHICS_ROW_SIZE + GRAPHICS_ROW_SPACING; + EASY_CONSTEXPR uint16_t THREADS_ROW_SPACING = 10; + +#ifdef _WIN32 + EASY_CONSTEXPR qreal FONT_METRICS_FACTOR = 1.05; +#else + EASY_CONSTEXPR qreal FONT_METRICS_FACTOR = 1.; +#endif + + ////////////////////////////////////////////////////////////////////////// + + template + inline auto toUnicode(const T& _inputString) -> decltype(QTextCodec::codecForLocale()->toUnicode(_inputString)) + { + return QTextCodec::codecForLocale()->toUnicode(_inputString); + } + + ////////////////////////////////////////////////////////////////////////// + + inline QString decoratedThreadName(bool _use_decorated_thread_name, const::profiler::BlocksTreeRoot& _root, const QString& _unicodeThreadWord, bool _hex = false) + { + if (_root.got_name()) + { + QString rootname(toUnicode(_root.name())); + if (!_use_decorated_thread_name || rootname.contains(_unicodeThreadWord, Qt::CaseInsensitive)) + { + if (_hex) + return QString("%1 0x%2").arg(rootname).arg(_root.thread_id, 0, 16); + return QString("%1 %2").arg(rootname).arg(_root.thread_id); + } + + if (_hex) + return QString("%1 Thread 0x%2").arg(rootname).arg(_root.thread_id, 0, 16); + return QString("%1 Thread %2").arg(rootname).arg(_root.thread_id); + } + + if (_hex) + return QString("Thread 0x%1").arg(_root.thread_id, 0, 16); + return QString("Thread %1").arg(_root.thread_id); + } + + inline QString decoratedThreadName(bool _use_decorated_thread_name, const ::profiler::BlocksTreeRoot& _root, bool _hex = false) + { + if (_root.got_name()) + { + QString rootname(toUnicode(_root.name())); + if (!_use_decorated_thread_name || rootname.contains(toUnicode("thread"), Qt::CaseInsensitive)) + { + if (_hex) + return QString("%1 0x%2").arg(rootname).arg(_root.thread_id, 0, 16); + return QString("%1 %2").arg(rootname).arg(_root.thread_id); + } + + if (_hex) + return QString("%1 Thread 0x%2").arg(rootname).arg(_root.thread_id, 0, 16); + return QString("%1 Thread %2").arg(rootname).arg(_root.thread_id); + } + + if (_hex) + return QString("Thread 0x%1").arg(_root.thread_id, 0, 16); + return QString("Thread %1").arg(_root.thread_id); + } + + ////////////////////////////////////////////////////////////////////////// + + enum ChronometerTextPosition : int8_t + { + ChronoTextPosition_Center = 0, + ChronoTextPosition_Top, + ChronoTextPosition_Bottom, + + }; // END of enum ChronometerTextPosition. + + ////////////////////////////////////////////////////////////////////////// + + struct EasyGlobals Q_DECL_FINAL + { + static EasyGlobals& instance(); + + EasyGlobalSignals events; ///< Global signals + ::profiler::thread_blocks_tree_t profiler_blocks; ///< Profiler blocks tree loaded from file + ::profiler::descriptors_list_t descriptors; ///< Profiler block descriptors list + EasyBlocks gui_blocks; ///< Profiler graphics blocks builded by GUI + + QString theme; ///< Current UI theme name + QFont bg_font; ///< Font for blocks_graphics_view + QFont chronometer_font; ///< Font for easy_chronometer_item + QFont items_font; ///< Font for easy_graphics_item + QFont selected_item_font; ///< Font for easy_graphics_item + + double scene_left; ///< Graphics scene left boundary + double scene_right; ///< Graphics scene right boundary + ::profiler::timestamp_t begin_time; ///< + ::profiler::thread_id_t selected_thread; ///< Current selected thread id + ::profiler::block_index_t selected_block; ///< Current selected profiler block index + ::profiler::block_id_t selected_block_id; ///< Current selected profiler block id + uint32_t version; ///< Opened file version (files may have different format) + float frame_time; ///< Expected frame time value in microseconds to be displayed at minimap on graphics scrollbar + int blocks_spacing; ///< Minimum blocks spacing on diagram + int blocks_size_min; ///< Minimum blocks size on diagram + int blocks_narrow_size; ///< Width indicating narrow blocks + int max_fps_history; ///< Max frames history displayed in FPS Monitor + int fps_timer_interval; ///< Interval in milliseconds for sending network requests to the profiled application (used by FPS Monitor) + int fps_widget_line_width; ///< Line width in pixels of FPS lines for FPS Monitor + ChronometerTextPosition chrono_text_position; ///< Selected interval text position + TimeUnits time_units; ///< Units type for time (milliseconds, microseconds, nanoseconds or auto-definition) + bool connected; ///< Is connected to source (to be able to capture profiling information) + bool fps_enabled; ///< Is FPS Monitor enabled + bool use_decorated_thread_name; ///< Add "Thread" to the name of each thread (if there is no one) + bool hex_thread_id; ///< Use hex view for thread-id instead of decimal + bool enable_event_markers; ///< Enable event indicators painting (These are narrow rectangles at the bottom of each thread) + bool enable_statistics; ///< Enable gathering and using statistics (Disable if you want to consume less memory) + bool enable_zero_length; ///< Enable zero length blocks (if true, then such blocks will have width == 1 pixel on each scale) + bool add_zero_blocks_to_hierarchy; ///< Enable adding zero blocks into hierarchy tree + bool draw_graphics_items_borders; ///< Draw borders for graphics blocks or not + bool hide_narrow_children; ///< Hide children for narrow graphics blocks (See blocks_narrow_size) + bool hide_minsize_blocks; ///< Hide blocks which screen size is less than blocks_size_min + bool display_only_relevant_stats; ///< Display only relevant information in ProfTreeWidget (excludes min, max, average times if there are only 1 calls number) + bool collapse_items_on_tree_close; ///< Collapse all items which were displayed in the hierarchy tree after tree close/reset + bool all_items_expanded_by_default; ///< Expand all items after file is opened + bool only_current_thread_hierarchy; ///< Build hierarchy tree for current thread only + bool highlight_blocks_with_same_id; ///< Highlight all blocks with same id on diagram + bool selecting_block_changes_thread; ///< If true then current selected thread will change every time you select block + bool auto_adjust_histogram_height; ///< Automatically adjust histogram height to the visible region + bool display_only_frames_on_histogram; ///< Display only top-level blocks on histogram when drawing histogram by block id + bool bind_scene_and_tree_expand_status; /** \brief If true then items on graphics scene and in the tree (blocks hierarchy) are binded on each other + so expanding/collapsing items on scene also expands/collapse items in the tree. */ + + private: + + EasyGlobals(); + + }; // END of struct EasyGlobals. + + ////////////////////////////////////////////////////////////////////////// + +} // END of namespace profiler_gui. + +#ifndef IGNORE_GLOBALS_DECLARATION +#define EASY_GLOBALS ::profiler_gui::EasyGlobals::instance() + +inline ::profiler_gui::EasyBlock& easyBlock(::profiler::block_index_t i) { + return EASY_GLOBALS.gui_blocks[i]; +} + +inline ::profiler::SerializedBlockDescriptor& easyDescriptor(::profiler::block_id_t i) { + return *EASY_GLOBALS.descriptors[i]; +} + +EASY_FORCE_INLINE const ::profiler::BlocksTree& easyBlocksTree(::profiler::block_index_t i) { + return easyBlock(i).tree; +} + +EASY_FORCE_INLINE const char* easyBlockName(const ::profiler::BlocksTree& _block) { + const char* name = _block.node->name(); + return *name != 0 ? name : easyDescriptor(_block.node->id()).name(); +} + +EASY_FORCE_INLINE const char* easyBlockName(const ::profiler::BlocksTree& _block, const ::profiler::SerializedBlockDescriptor& _desc) { + const char* name = _block.node->name(); + return *name != 0 ? name : _desc.name(); +} + +EASY_FORCE_INLINE const char* easyBlockName(::profiler::block_index_t i) { + return easyBlockName(easyBlock(i).tree); +} + +inline qreal sceneX(profiler::timestamp_t _time) { + return PROF_MICROSECONDS(qreal(_time - EASY_GLOBALS.begin_time)); +} + +inline QString imagePath(const QString& _resource) { + return QString(":/images/%1/%2").arg(EASY_GLOBALS.theme).arg(_resource); +} + +inline QString imagePath(const char* _resource) { + return QString(":/images/%1/%2").arg(EASY_GLOBALS.theme).arg(_resource); +} +#endif + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER__GUI_GLOBALS_H diff --git a/3rdparty/easyprofiler/profiler_gui/globals_qobjects.cpp b/3rdparty/easyprofiler/profiler_gui/globals_qobjects.cpp new file mode 100644 index 0000000..62319b1 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/globals_qobjects.cpp @@ -0,0 +1,72 @@ +/************************************************************************ +* file name : globals_qobjects.cpp +* ----------------- : +* creation time : 2016/08/08 +* authors : Victor Zarubkin, Sergey Yagovtsev +* email : v.s.zarubkin@gmail.com, yse.sey@gmail.com +* ----------------- : +* description : The file contains implementation of EasyGlobalSignals QObject class. +* ----------------- : +* change log : * 2016/08/08 Sergey Yagovtsev: moved sources from globals.cpp +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include "globals_qobjects.h" + +////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////// + +namespace profiler_gui { + + EasyGlobalSignals::EasyGlobalSignals() : QObject() + { + } + + EasyGlobalSignals::~EasyGlobalSignals() + { + } + +} // END of namespace profiler_gui. + +////////////////////////////////////////////////////////////////////////// diff --git a/3rdparty/easyprofiler/profiler_gui/globals_qobjects.h b/3rdparty/easyprofiler/profiler_gui/globals_qobjects.h new file mode 100644 index 0000000..348aede --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/globals_qobjects.h @@ -0,0 +1,95 @@ +/************************************************************************ +* file name : globals_qobjects.h +* ----------------- : +* creation time : 2016/08/08 +* authors : Victor Zarubkin, Sergey Yagovtsev +* email : v.s.zarubkin@gmail.com, yse.sey@gmail.com +* ----------------- : +* description : The file contains declaration of EasyGlobalSignals QObject class. +* ----------------- : +* change log : * 2016/08/08 Sergey Yagovtsev: moved sources from globals.h +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_GLOBALS_QOBJECTS_H +#define EASY_GLOBALS_QOBJECTS_H + +#include +#include + +namespace profiler_gui { + + class EasyGlobalSignals Q_DECL_FINAL : public QObject + { + Q_OBJECT + + public: + + EasyGlobalSignals(); + virtual ~EasyGlobalSignals(); + + signals: + + void selectedThreadChanged(::profiler::thread_id_t _id); + void selectedBlockChanged(uint32_t _block_index); + void selectedBlockIdChanged(::profiler::block_id_t _id); + void itemsExpandStateChanged(); + void blockStatusChanged(::profiler::block_id_t _id, ::profiler::EasyBlockStatus _status); + void connectionChanged(bool _connected); + void blocksRefreshRequired(bool); + void expectedFrameTimeChanged(); + void autoAdjustHistogramChanged(); + void displayOnlyFramesOnHistogramChanged(); + void hierarchyFlagChanged(bool); + void threadNameDecorationChanged(); + void hexThreadIdChanged(); + void refreshRequired(); + void blocksTreeModeChanged(); + void sceneSizeChanged(); + + }; // END of class EasyGlobalSignals. + +} // END of namespace profiler_gui. + +#endif // EASY_GLOBALS_QOBJECTS_H diff --git a/3rdparty/easyprofiler/profiler_gui/images/attribution.txt b/3rdparty/easyprofiler/profiler_gui/images/attribution.txt new file mode 100644 index 0000000..e346622 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/attribution.txt @@ -0,0 +1,43 @@ +logo.svg - Icon made by Freepik from www.flaticon.com + +default/off.svg - Icon made by Freepik from www.flaticon.com +default/open-folder.svg - Icon made by Freepik from www.flaticon.com +default/open-folder2.svg - Icon made by Freepik from www.flaticon.com +default/reload-folder2.svg - Icon made by Freepik from www.flaticon.com +default/reload.svg - Icon made by Freepik from www.flaticon.com +default/expand.svg - Icon made by Freepik from www.flaticon.com +default/collapse.svg - Icon made by Freepik from www.flaticon.com +default/colors.svg - Icon made by Freepik from www.flaticon.com +default/colors-black.svg - Icon made by Freepik from www.flaticon.com +default/save.svg - Icon made by Freepik from www.flaticon.com +default/statistics.svg - Icon made by Freepik from www.flaticon.com +default/statistics2.svg - Icon made by Freepik from www.flaticon.com +default/lan.svg - Icon made by Freepik from www.flaticon.com +default/lan_on.svg - Icon made by Freepik from www.flaticon.com +default/wifi.svg - Icon made by Freepik from www.flaticon.com +default/wifi_on.svg - Icon made by Freepik from www.flaticon.com +default/play.svg - Icon made by Google from www.flaticon.com +default/stop.svg - Icon made by Google from www.flaticon.com +default/delete.svg - Icon made by Google from www.flaticon.com +default/list.svg - Icon made by Freepik from www.flaticon.com +default/search-prev.svg - Icon made by Freepik from www.flaticon.com +default/search-next.svg - Icon made by Freepik from www.flaticon.com +default/settings.svg - Icon made by Freepik from www.flaticon.com +default/check.svg - Icon made by Kirill Kazachek from www.flaticon.com +default/check-disabled.svg - Icon made by Kirill Kazachek from www.flaticon.com +default/close-white.svg - Icon made by Cole Bemis from www.flaticon.com +default/close-white-hover.svg - Icon made by Cole Bemis from www.flaticon.com +default/close-white-pressed.svg - Icon made by Cole Bemis from www.flaticon.com +default/maximize-white.svg - Icon made by Freepik from www.flaticon.com +default/maximize-white-hover.svg - Icon made by Freepik from www.flaticon.com +default/maximize-white-pressed.svg - Icon made by Freepik from www.flaticon.com +default/minimize-white.svg - Icon made by Freepik from www.flaticon.com +default/minimize-white-pressed.svg - Icon made by Freepik from www.flaticon.com +default/arrow-down.svg - Icon made by Freepik from www.flaticon.com +default/arrow-down-hover.svg - Icon made by Freepik from www.flaticon.com +default/arrow-down-disabled.svg - Icon made by Freepik from www.flaticon.com +default/arrow-up.svg - Icon made by Freepik from www.flaticon.com +default/arrow-up-hover.svg - Icon made by Freepik from www.flaticon.com +default/arrow-up-disabled.svg - Icon made by Freepik from www.flaticon.com +default/arrow-left.svg - Icon made by Freepik from www.flaticon.com +default/arrow-right.svg - Icon made by Freepik from www.flaticon.com diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/arrow-down-disabled.svg b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-down-disabled.svg new file mode 100644 index 0000000..46d7c82 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-down-disabled.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/arrow-down-hover.svg b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-down-hover.svg new file mode 100644 index 0000000..e16736a --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-down-hover.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/arrow-down.svg b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-down.svg new file mode 100644 index 0000000..13d0004 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-down.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/arrow-left.svg b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-left.svg new file mode 100644 index 0000000..7c452e6 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-left.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/arrow-right.svg b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-right.svg new file mode 100644 index 0000000..199bfc8 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-right.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/arrow-up-disabled.svg b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-up-disabled.svg new file mode 100644 index 0000000..4581ed1 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-up-disabled.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/arrow-up-hover.svg b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-up-hover.svg new file mode 100644 index 0000000..da0da91 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-up-hover.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/arrow-up.svg b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-up.svg new file mode 100644 index 0000000..2120ab9 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/arrow-up.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/check-disabled.svg b/3rdparty/easyprofiler/profiler_gui/images/default/check-disabled.svg new file mode 100644 index 0000000..53eb1f9 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/check-disabled.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/check.svg b/3rdparty/easyprofiler/profiler_gui/images/default/check.svg new file mode 100644 index 0000000..cc1eb65 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/check.svg @@ -0,0 +1,8 @@ + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/close-white-hover.svg b/3rdparty/easyprofiler/profiler_gui/images/default/close-white-hover.svg new file mode 100644 index 0000000..d78f3d0 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/close-white-hover.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/close-white-pressed.svg b/3rdparty/easyprofiler/profiler_gui/images/default/close-white-pressed.svg new file mode 100644 index 0000000..6602d1c --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/close-white-pressed.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/close-white.svg b/3rdparty/easyprofiler/profiler_gui/images/default/close-white.svg new file mode 100644 index 0000000..cec4875 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/close-white.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/collapse.svg b/3rdparty/easyprofiler/profiler_gui/images/default/collapse.svg new file mode 100644 index 0000000..3bf9ed4 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/collapse.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/colors-black.svg b/3rdparty/easyprofiler/profiler_gui/images/default/colors-black.svg new file mode 100644 index 0000000..13c8182 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/colors-black.svg @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/colors.svg b/3rdparty/easyprofiler/profiler_gui/images/default/colors.svg new file mode 100644 index 0000000..a8d580a --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/colors.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/delete-old.svg b/3rdparty/easyprofiler/profiler_gui/images/default/delete-old.svg new file mode 100644 index 0000000..6502e27 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/delete-old.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/delete.svg b/3rdparty/easyprofiler/profiler_gui/images/default/delete.svg new file mode 100644 index 0000000..35a8016 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/delete.svg @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/expand.svg b/3rdparty/easyprofiler/profiler_gui/images/default/expand.svg new file mode 100644 index 0000000..44ccaa3 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/expand.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/lan.svg b/3rdparty/easyprofiler/profiler_gui/images/default/lan.svg new file mode 100644 index 0000000..0f0124d --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/lan.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/lan_on.svg b/3rdparty/easyprofiler/profiler_gui/images/default/lan_on.svg new file mode 100644 index 0000000..41da421 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/lan_on.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/list.svg b/3rdparty/easyprofiler/profiler_gui/images/default/list.svg new file mode 100644 index 0000000..38ac6ed --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/list.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/maximize-white-hover.svg b/3rdparty/easyprofiler/profiler_gui/images/default/maximize-white-hover.svg new file mode 100644 index 0000000..92f8257 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/maximize-white-hover.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/maximize-white-pressed.svg b/3rdparty/easyprofiler/profiler_gui/images/default/maximize-white-pressed.svg new file mode 100644 index 0000000..73a95d0 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/maximize-white-pressed.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/maximize-white.svg b/3rdparty/easyprofiler/profiler_gui/images/default/maximize-white.svg new file mode 100644 index 0000000..d6d86c9 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/maximize-white.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/minimize-white-hover.svg b/3rdparty/easyprofiler/profiler_gui/images/default/minimize-white-hover.svg new file mode 100644 index 0000000..828901c --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/minimize-white-hover.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/minimize-white-pressed.svg b/3rdparty/easyprofiler/profiler_gui/images/default/minimize-white-pressed.svg new file mode 100644 index 0000000..f575f28 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/minimize-white-pressed.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/minimize-white.svg b/3rdparty/easyprofiler/profiler_gui/images/default/minimize-white.svg new file mode 100644 index 0000000..24c65de --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/minimize-white.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/off.svg b/3rdparty/easyprofiler/profiler_gui/images/default/off.svg new file mode 100644 index 0000000..57ce672 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/off.svg @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/open-folder.svg b/3rdparty/easyprofiler/profiler_gui/images/default/open-folder.svg new file mode 100644 index 0000000..7500c16 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/open-folder.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/open-folder2.svg b/3rdparty/easyprofiler/profiler_gui/images/default/open-folder2.svg new file mode 100644 index 0000000..70cc9c5 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/open-folder2.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/play.svg b/3rdparty/easyprofiler/profiler_gui/images/default/play.svg new file mode 100644 index 0000000..8bbdf01 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/play.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/radio-indicator-disabled.svg b/3rdparty/easyprofiler/profiler_gui/images/default/radio-indicator-disabled.svg new file mode 100644 index 0000000..cb9540e --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/radio-indicator-disabled.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/radio-indicator.svg b/3rdparty/easyprofiler/profiler_gui/images/default/radio-indicator.svg new file mode 100644 index 0000000..76e0974 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/radio-indicator.svg @@ -0,0 +1,7 @@ + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/reload-folder2.svg b/3rdparty/easyprofiler/profiler_gui/images/default/reload-folder2.svg new file mode 100644 index 0000000..1f6d7a6 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/reload-folder2.svg @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/reload.svg b/3rdparty/easyprofiler/profiler_gui/images/default/reload.svg new file mode 100644 index 0000000..796319e --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/reload.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/save.svg b/3rdparty/easyprofiler/profiler_gui/images/default/save.svg new file mode 100644 index 0000000..e81c739 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/save.svg @@ -0,0 +1,73 @@ + + +image/svg+xml \ No newline at end of file diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/search-next.svg b/3rdparty/easyprofiler/profiler_gui/images/default/search-next.svg new file mode 100644 index 0000000..e9ff44d --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/search-next.svg @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/search-prev.svg b/3rdparty/easyprofiler/profiler_gui/images/default/search-prev.svg new file mode 100644 index 0000000..8dbd6fb --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/search-prev.svg @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/settings.svg b/3rdparty/easyprofiler/profiler_gui/images/default/settings.svg new file mode 100644 index 0000000..783969c --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/settings.svg @@ -0,0 +1,39 @@ + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/statistics.svg b/3rdparty/easyprofiler/profiler_gui/images/default/statistics.svg new file mode 100644 index 0000000..bbb4428 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/statistics.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/statistics2.svg b/3rdparty/easyprofiler/profiler_gui/images/default/statistics2.svg new file mode 100644 index 0000000..3f5c3ad --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/statistics2.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/stop.svg b/3rdparty/easyprofiler/profiler_gui/images/default/stop.svg new file mode 100644 index 0000000..a914d1e --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/stop.svg @@ -0,0 +1,11 @@ + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/wifi.svg b/3rdparty/easyprofiler/profiler_gui/images/default/wifi.svg new file mode 100644 index 0000000..cb04ace --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/wifi.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/default/wifi_on.svg b/3rdparty/easyprofiler/profiler_gui/images/default/wifi_on.svg new file mode 100644 index 0000000..461e2b7 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/default/wifi_on.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/images/logo.ico b/3rdparty/easyprofiler/profiler_gui/images/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..9d72f93046aa235a2fc6af79572dfc4eb50fe688 GIT binary patch literal 179025 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í zJ6B_&xe(7b+{XRADw=N-p13rw`3$`Bu4_x6W7F^t$0O%6usMx+H+oWic(-xx`oELb z`7j;)(2tebz9l@I~wP%(|0fQj(N~LRMg*e(o#E6Jy2Wlst3}G_S>dB zRwnF`@DcdLpWm@rcPfY>px-7gJs~A|0&tgmu2JC zhgWu;H+gou@6b2YLq7F;UVWqL?VYLQU(a#~t8u+o-sf{YLcTkK-a&H9wX4o$6JKQf zcrxJ!!8-Eyzu zTDv6juTDjCR(CuLxt2{@Pl5KwoAj%KI}+KBhY22X|H8F9lF0v^`1e}R`J8FG#`l_+ zRE0b{W%xBK@}9;ky*=`;avYFE{-46X?54Z?UuzY8{4nyaZ}B+Ot`f(LhqR7zw};%y z$LJ*T|DI1A4>rzSeR@^QyDif-$gMH4yWDiHwi`$V_@kbC#?hJej8;`R|6Q4bxAc*H zZ4&t(=M#tCJv=v!`QJiZlVMDnXwQ5=eV14HZ{>QReH!@FT9a2C*CXdSkgoPVm$>vT zraEb&Hs$Y^e~o2>=Km9){C91XyQxJQ^RIs7v_OqApeN*R)Bde*C%NU;SjPH2;UGG|uhx1OgFBw(Tsxb*>v=`8-|6vc zGwCk>Q<3i*54kmOxiLuIJQN-}x3^DjH_ zDtPsSYGYTD_w!*fB-7@de$$ozEaaI3UiDRWET!KPCtM5A9$l|^mq%jP{*C$2HRM0l zzMw++w|_@tKjhQ;mY0lcxPE!EWpDfwwifuUCn&w1{0@fN!3Ut{*3PmGa$KSOlYR!= z0$ywXl23N8uE|d-F5wS{W#FaXpSj+rd3b{6FHfhSgOu}6x>}>|3YypY$)@_7O18_w z*xyWfn0Wl21u(YA?_lfTeRPmaTSzJY$fCTr2CY$g^>^F3uD&oW?*S6e!O#c1^sH;r zO`lfL$7lU}^m12o ze^@Ni~ZLfq{?N9Kr;BrS6SDk(+{9&X?x$SyzAMd zSGk+~%l$l2zJlH-ZPnWYLG?RmT}X#MWdGG4XF?77+(hMW@~<)K^Fi|$)Suli%SJy7 zveACy(Te0<_H6;Y1%HF;Mn3Y?4ie47G#=>%N0@Nwc9BW8tTCufq_aM(BffV)c5x^B zMV?xN_M(__cDu^^NH_ulJp-tSZtQPw?vAV%Ko6Jz>IV|_o2nlgyGnPOx2leJfLa=d z`~C3^P1*hWp#Ic7?yU53_mc~`Wgqqg*~u0#1QNA@Rrm?RiJ-Y{Sv~hlN7qZgS!S(A zNC&3;%gUW^Csum7$CFR@$cy^8MEReeC?3E2whmMezOd`UW4MR=`LC?&u%3EPI_OugTp1B1rzLf*`nm9(o$801$yXa<_^Yt1BHo6wwpE@*uqA2fEX^sHE)Dk#vW1Nd@4w%kJdD+460 zuMm`eyTNt~?C(8f+h0@2w7(Hyz7@ge2`q^TXuG9fV=&*aFyF`c!?nNSP++^+_Gd?u zbu;a7o-V>#*Kw_Q5jufeXx}f)mRw}Ul25MGfle&7$W{J!@ZAr~<$E5=xB2b{pROo? z(2h_>wp_wy?kE+sR+($*x3HEKp}sw#2x{0L->4;5<)V_otKF! zpbgyn0g7NCroJ!x>U-n9%K3*d0hWQ^dWq`ac+eQD?DtBI45_-rrTSh7O5011szZ~Y zV=V8&NKW*{*3H5*uVzo=txa;5b!r-(cVqML_={RcAI`#$`hE3d%BNRcx~BDTt!Y)b zO%TUHa6h=yQWIAcWqnd!~v(1~c4d3&MhE1OzJti^EC+MEg*EPBO~bR# zA3CfsCj>tr_Xcjl08U*z_Bc4=fw#@#}Fx;z^DAK3?YS<5b| z{swN(_}v381NVCSY|^+E*?S}VT1ZC5M1E&c4!6hhE|9G5bid|W)1VCjzjfhbaMqix zvApvhX%b$f{Z&7wS$5@3?P7eh@RVHAb(g!!;9o)H$6s|&-?|Z;^1t0YJgz-yd|wH& zo3fF88pE^Hvq}4VSNiKYKOj*a@N*#ahjR5k61(w=#^FY4i7S>*xb|&gYbW8|Qa`ZxL`$Yaz}spR|a4q5ZU}$gk&I z+E=qE1qQZ?J`;AyB71Z%#FKx9E6m5uBSjacDE|h+JqocDXcUfhJk2GG#&q2h$Ungq zW@J|69leW|ivG2~=u%&0CAfhc4PCOR{&WG~klgzSob7i?IMyW#Ia2AjQkEYX^o+M1 zIP3C8&O7)D&kgSP0%yOs06V7ktMPrZWl$0MHHPd8PWiQ0>AVE;UymQ>I9zkmZpi*@ z3T03c`Hv!9&6%C@Yg~7F0{L_B^MfPYe>on_JJgpTf1*ChRWz&Q?(JpY8a-=gEb#?QBd>WwoG{g~_O zJ=;Y|GL7E9t%; zIQ6GB$M+%7dJ6vbg@?f@KkXoYc&q4>%zd{^515Cf`gX*6%&aKp? z_xM(lz7?hRums$7U*`$sCtmeaF_;H#+0j*ATh^NPAg%*a+3!yHBcLa!A8_VD$Li1T zY!!VrkMDPOA&s%H6wEx$Q+~q8M(7z{6y65S@!WAQ<=Sn;RTItu&0P!Nuw?dY6Nl_+ zCJckk;7(^f*G93H_^(#cp4ajY=PjB$QMXFQT-=RxNh8_ovCfB8@G4cSi7*wxp?@-DiR zYgfXZ@EnW<=~i{aFP@uXdFLODtjB}&?p&W-!Fk|s<~Z|4deYxjun_#x_mU~dHQ9Uh z`|9VNb;he*jd#iw^q9C+Z`Iz;h1a1Noc1+{oNhm=`>IFX;53lz%7faHQ|~4pvK3u| z%IxKjG*q7t2aV51f^_GWE6DjW!o2_ykY23hkWc%~y}pCBk?Rk^fnIW@a*Z^Vm%7j% z-hio~w%{ed+RiZO0T)At*Zx`L%Yd7~X_qDY6_B>?r<(jChw7F3AoUk&tD0wc$^R4A zGePahcmJ!s-}4|l55>6p{^)~}o&ByR*|fOG@i%Dhpfks-z)Su$w!ap*qA7U(E}WeQ zl|vh74VALrh4j^qQ*FZu*Q3&+e|qWPeQg0@bK^u`>9q`wcS47|n`etA%RQ{8C>zU??j`W5v<`m&!Vz|*iEyvBLXd}u5?6S_jB z?so{9H{?(r4gftr90AIQQ)V4&ys--ULOvulABiVR>2@Ku3~AdDdz9p6$}Q4%G2B9J z7sDlzYW%bIec@W$n+pDL38wu_A-7ws>zVpFAO85koem)F`$Ki6Q2m6A;BT@SQh*vg8wxa+>!4lBe#;+fftXp9@41v4hEXaVg z2}oQT!yE(m!&s1w^OMQlKF#@d!mNhR;AS`$Dl8*$Xnd;ihRRXp=9WuqE-KrpFd7r_ zIc^br1JbYb=L{pAYW&+DROWG?%f`z9VO8H6!(h;y+UP>A?AG_l)1B`NU%@)&H7z2a zcV<6P*Ork_ZqJGKyo%@D?eWtCW`Q%Tmsq6y77&iafDYsjXu?97HAg)kS;0P(0a=l^yT|e_ev9}tUNtgq;aGh~T?o`?<49dGBt5lbTOWD<;Mj9~$o1pkJ@^$=zDrt1A9<2GGXnX%);xmh%hMnG{04_( zw?9cb&bHE<^Mkw;$aUGF$)NhG{%AC|7Wu68fK=Orr)wj_>B@&OJBi4(8({;;-zL__d-3i1cao4# za(xSWh7yE<$agbqv9H-_DqYpZcHkx7^;|c0d2=*&`3p^Qmk&xpK0On81da!vNSFR@+UCgBCIkyg;Qp|!NmJ4NhsK{CK$@Fp1f=5ri{ zokDR<<^ChcwqRrO-{IM5FVfr!@#>tpm#lo6f1U`#!N@nAW6yUJxqb$W1o||~#>~i$ zzWOM#sZIsy*OHZQchb2Kq!S~b#!Q~ye&qTQ@G|@Y^1mS*>(rC+o9du>wqtbVHMW+8aa(Yc-hH^3^8-`^RFe!@N@)|NLf3Q)$$%GZcAG@ns_p!9x&=HNLF z11JLd7t0v;JxM$6hkS|JNnrViSK~O1lZ@^p<21 zN3tp3=fVh(Oh!J958CELd+ihSSuXx%H}41ahbA88GHu7^#_s9Ce($H5BYljFOM$tC zCF@S|5ms{T2B$zL_!72(DVGJ*pW9nRhMz%2@GFW|X;C-y&I!aeoxH^Xx<29|;u z^O`thOK#7NcB8M}*vXbnV;}WZLbg!!}L^k;$t=e!3 zoC#Ub8#KRmma%Mz+K1L6&VrMm+Q?nGTo7HP(5t%Pr!Z$2g%Nu3n&&zw&Oa?WO0n^jM1fzOEiu zg^EM9^q7c;Otp$6A8w(}w}tkz0rhQa>v|UPJ$wM_=VS*C2aR<|J+(i=sz2Hb z)UQ1bvMm~O`PmnZyCu_C@H9l>U`Sd3!l*6EUR(wm$I51ybk#Oj!94iRb~T36b+t|T zTMz2@yTSetxEdPoz>}ac6>;TnX3b=B>u5pGrs28W>C5yS;Ab#nE4i9yPi1ZJ ziQHKC9=umd-t#rb(|AK=@)8^marA4LYhJ9kZdQNq95*>- z(7a_6&qPMFjC{~H8oO#ZGAIv{VIkZBzI(a2r}}mz%mV2S+ty|x&#s=dbe2<3r+6`Wn}${zm)?fqSa!H-Pd@nEdY1r``vpexoZ!JCif_n^< zYY&|730Ffg@Y@_0Ok)k3@$e?+o;GLPL684SIXp-G9ZS3_1GSASK_<2Ak8`z;M_~hO zrhR?PcMv{7e$6q1rse66=ZzzImtdeBx6*$O%GE>8rIP_5{rto?4hB$h*?iNzA7!wNxRw53s9TnK4mht5p8)l~&ElNs3;me8&P$Mn%2#b-b$m8{!(8?S z=J4}~U+Jrkod#thaC{rN%}6Qr*;q564Od`fQS_Z>QtukVRp=}&?) zz?uFDoPP|;{}OB}`CmUbLHe?JJz>9iG!K8hKi{5cN8EEk>5qd`z?ps~=WhWvCvO$) zzCX`_60NVw20u|2iO&J?Wx!Ri7?l1{IM(T%^ZnrgP(SyxY$xCM{*d@LfnWU#n*L$L z*%LHQQ2LL7hC*e3oM*tLpgO{u)Oj;`c1j)C7_SZlO}`0ojseQn>O(KUEjN$lT()0j zqBekx`DC25A%CD|VU&G*T(E5zlVeSO2{i*J%Km7tESD@dMCl0Nz)rOPdeCP?1!{}IL zycFo;tbP3_;T`}A7b2ZTAl)yA*$@Wx8NTh%Ll-rPOLamv>OvR=s@KZD(*G8&0O{%& z*xkfII(na~0o)2&H`^V|?Le*_XMfzE!RXx2)tI+Vpojx{BEJ3M9?(3?FI`=ioqGV{ z*6o1FmU$ySwS|W8Hn{7akw^Ab<)C_^seIc0h)-=H16016f3E`N)#O?I%fF!=NY=n< zvsR!l3F^Cu*{q#pLakybvMFR4!bLUCZFX?a@H@xb_b3jPKv50isV0cqf^@3wD6CNf z_%!7o)DMM1hrt<8wob8U;&lq;5o8~Zf_zZ9e+|-w+C~Y?0FA5EW;DhN^gay!6t`@8 zeNele2AUhFj1})1ke%HMx~8$+>u?z;9J%rTOUYmEL+I)zRg4E zM_y;o6@6~LWRVT+4CUr1N{nk_Zx{-j@V_EE`pP?eJMK&7YHRIyonsZ*+~1hXeA_be z(O~wjOdy>45xF~MfJ@R#4k)kdqp|h_8|SW@g^cR!onsGY8agJ8b@O;vxHsWcKFF5W z*Qp@Rt3f?@7rB3-A05>+{M{%IncZi;0v%?tK_ z(SKUsa8$c~9;|kNtMY9PQz+k`*vqW)o$nL>Kxf@^9uqzrCV|TLYB1%i`lxg z6j4^_$WwmL_z9~xy1`GNHdG%>{WN88BiFDe=Pcs;0KJLdJ;#%Nc8Z@c3a@^67Hk96 zA&pC%*^?jX=?hT#tj~_T(VK4vQcpIO5U*^G=IvJe+?Ri$xlc<_-$uL2pTzf+&c&a~ zs9gN^9N_}|jfZWNHS?s$hVsn)Q^w_UNM|u&UgDl~p*C|cNY8@-8=gOp`u{L{ns2~g zL(ntXa%tdC`BWJ7AIQ^oCF_t=nUB58y!2&knc7J++s|{j^FZ~Tx$DJ+%rm+m$5+HV z5YB|1#sm13d`H5Y@B?fF)rsF>hmGvMbiEj)8|Dz!*u5B6x||NWR&G5@nZd768ppw9 z@FZZH%ARTdhhwFSJ+#`*8Mu2Bm*yv$XX%|-jTw&s-?1uTs>4B`@ZDe$C=aTC{Xu`q zr&U*ot1f8%aS!Yd)uEjJohO7-8A|?nVD#d43%R$SGhEPP!qtEV@Nba5opI}2wqEVN zX3#jD{s^aXknPI>jU&`9l!p2b_2-X(?mL6+bX>yAOFUD8J$UxCN2t(7qozMF!MIjy zEIbI+LPZ(CtzuwIW})Y2+j)X!sL%O9AlHn;a2(X1yeWgYq(_Pmd0O`J9TuO_qqZW8-Q$K^)5e?^<6Znas4U-gG4Ls?mKthiK1 z+QKAQgWdcb`!SyN2={oZguTNvSSJ|C8rrw`T@DYykw!p{r32Zdp0JMoW(4+eCiX&h zSZ&(XUv1vT_-SFw$l$l}FB>79Mji2GaDEZGn!)&Ldh_t4u{+1%j?+5d%oy_>!f71) z0@McORqoxa)yzXT6It(&EpW-?eU5GXlyX`?c#RKF1eMKU@GNU6^I5YPN1w@dWo%yUQ6W==bxKldRJX?0G94#WB-a%a&O?cHG)id=~ zl8^n^lCRHL*2~@NZ5odZ2hG{b5s7tZO1)8C{Su6P`*M5>*MA7dI!|gE{&5E3ocdFI zLrwV^moU=()gb-719d=kr6#n7iPX~{vm);gCA|7*6X#Cx;a71f9AgP;2NB;w_8M_Ai|u0vE$_!i=XqMRTIhS8o=cZi#REYmPe%*nit) z6z_c%v48YC>b1TjqCQ6HW`OEN7nq8U=CaQED9_kh;ioppn3*{D!w>aZx;?vuedRn4 zdw5jK$dGsWJrk4yfNe6q-Oir~!Xu)^UVi>GCE}-BMl+%KKYT56X1! z2~{&zEAOkZLr3*mR>nlc(tRhfdBg@V~?iM_7>4+ z{KULz1^fQL&x!V(Oy5Bq)_5cbcMnN`D|uvN=+D|sA>2&b>;}qQ?NzpbdD-S)Xmg9P z5ySDf3~1wdT3%83Bgo@Z?E9SFBJ!EWrpA7FxxbLF&&bDQ!nFa}654H>f%F;3JjdN9 z$mVKYz6|yz@SURb)K}dE`@osB;~}}RZc}-`ME#~oSMy1=vHni@4k|Xjo$RXWyUMEp z;RmBSUf=-LU8ZWa#^1t2?G$sH5 literal 0 HcmV?d00001 diff --git a/3rdparty/easyprofiler/profiler_gui/images/logo.svg b/3rdparty/easyprofiler/profiler_gui/images/logo.svg new file mode 100644 index 0000000..87756e5 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/images/logo.svg @@ -0,0 +1,18 @@ + + + + + + + + + + diff --git a/3rdparty/easyprofiler/profiler_gui/main.cpp b/3rdparty/easyprofiler/profiler_gui/main.cpp new file mode 100644 index 0000000..fb5a0bb --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/main.cpp @@ -0,0 +1,74 @@ +/************************************************************************ +* file name : main.cpp +* ----------------- : +* creation time : 2016/04/29 +* authors : Sergey Yagovtsev, Victor Zarubkin +* email : yse.sey@gmail.com, v.s.zarubkin@gmail.com +* ----------------- : +* description : Main file for EasyProfiler GUI. +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include +#include "main_window.h" +#include "globals.h" + +#if defined(_WIN32) && defined (_BUILD_RELEASE_) +#pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup") +#endif + +int main(int argc, char **argv) +{ + auto now = ::std::chrono::duration_cast(::std::chrono::system_clock::now().time_since_epoch()).count() >> 1; + srand((unsigned int)now); + + QApplication app(argc, argv); + + //Instanciate easy globals after QApplication to allow creation of global fonts, and on the main thread to avoid data races + profiler_gui::EasyGlobals::instance(); + + EasyMainWindow window; + window.show(); + + return app.exec(); +} diff --git a/3rdparty/easyprofiler/profiler_gui/main_window.cpp b/3rdparty/easyprofiler/profiler_gui/main_window.cpp new file mode 100644 index 0000000..be8c970 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/main_window.cpp @@ -0,0 +1,2982 @@ +/************************************************************************ +* file name : main_window.cpp +* ----------------- : +* creation time : 2016/06/26 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of MainWindow for easy_profiler GUI. +* ----------------- : +* change log : * 2016/06/26 Victor Zarubkin: Initial commit. +* : +* : * 2016/06/27 Victor Zarubkin: Passing blocks number to EasyTreeWidget::setTree(). +* : +* : * 2016/06/29 Victor Zarubkin: Added menu with tests. +* : +* : * 2016/06/30 Sergey Yagovtsev: Open file by command line argument +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "main_window.h" +#include "blocks_tree_widget.h" +#include "blocks_graphics_view.h" +#include "descriptors_tree_widget.h" +#include "easy_frame_rate_viewer.h" +#include "globals.h" + +#include +#include + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +////////////////////////////////////////////////////////////////////////// + +#define EASY_DEFAULT_WINDOW_TITLE "EasyProfiler" + +const int LOADER_TIMER_INTERVAL = 40; +const auto NETWORK_CACHE_FILE = "easy_profiler_stream.cache"; + +////////////////////////////////////////////////////////////////////////// + +inline const QStringList& UI_themes() +{ + static const QStringList themes { + "default" + }; + + return themes; +} + +////////////////////////////////////////////////////////////////////////// + +inline void clear_stream(std::stringstream& _stream) +{ +#if defined(__GNUC__) && __GNUC__ < 5 + // gcc 4 has a known bug which has been solved in gcc 5: + // std::stringstream has no swap() method :( + _stream.str(std::string()); +#else + std::stringstream().swap(_stream); +#endif +} + +inline void loadTheme(const QString& _theme) +{ + QFile file(QStringLiteral(":/themes/") + _theme); + if (file.open(QFile::ReadOnly | QFile::Text)) + { + QTextStream in(&file); + QString style = in.readAll(); + if (!style.isEmpty()) + qApp->setStyleSheet(style); + } +} + +////////////////////////////////////////////////////////////////////////// + +EasyDockWidget::EasyDockWidget(const QString& title, QWidget* parent) : QDockWidget(title, parent) +{ + auto floatingButton = new QPushButton(); + floatingButton->setObjectName("EasyDockWidgetFloatButton"); + floatingButton->setProperty("floating", isFloating()); + connect(floatingButton, &QPushButton::clicked, [this, floatingButton] { + setFloating(!isFloating()); + floatingButton->setProperty("floating", isFloating()); + floatingButton->style()->unpolish(floatingButton); + floatingButton->style()->polish(floatingButton); + floatingButton->update(); + }); + + auto closeButton = new QPushButton(); + closeButton->setObjectName("EasyDockWidgetCloseButton"); + connect(closeButton, &QPushButton::clicked, [this] { + close(); + }); + + auto caption = new QWidget(this); + caption->setObjectName("EasyDockWidgetTitle"); + + auto lay = new QHBoxLayout(caption); + lay->setContentsMargins(0, 0, 0, 0); + lay->setSpacing(2); + lay->addWidget(new QLabel(title)); + lay->addStretch(100); + lay->addWidget(floatingButton); + lay->addWidget(closeButton); + + setTitleBarWidget(caption); +} + +EasyDockWidget::~EasyDockWidget() +{ +} + +EasyMainWindow::EasyMainWindow() : Parent(), m_theme("default"), m_lastAddress("localhost"), m_lastPort(::profiler::DEFAULT_PORT) +{ + { QIcon icon(":/images/logo"); if (!icon.isNull()) QApplication::setWindowIcon(icon); } + + setObjectName("ProfilerGUI_MainWindow"); + setWindowTitle(EASY_DEFAULT_WINDOW_TITLE); + setDockNestingEnabled(true); + setAcceptDrops(true); + resize(800, 600); + setStatusBar(nullptr); + + loadSettings(); + loadTheme(m_theme); + + m_graphicsView = new EasyDockWidget("Diagram", this); + m_graphicsView->setObjectName("ProfilerGUI_Diagram"); + m_graphicsView->setMinimumHeight(50); + m_graphicsView->setAllowedAreas(Qt::AllDockWidgetAreas); + + auto graphicsView = new EasyGraphicsViewWidget(this); + m_graphicsView->setWidget(graphicsView); + + m_treeWidget = new EasyDockWidget("Hierarchy", this); + m_treeWidget->setObjectName("ProfilerGUI_Hierarchy"); + m_treeWidget->setMinimumHeight(50); + m_treeWidget->setAllowedAreas(Qt::AllDockWidgetAreas); + + auto treeWidget = new EasyHierarchyWidget(this); + m_treeWidget->setWidget(treeWidget); + + m_fpsViewer = new EasyDockWidget("FPS Monitor", this); + m_fpsViewer->setObjectName("ProfilerGUI_FPS"); + m_fpsViewer->setWidget(new EasyFrameRateViewer(this)); + m_fpsViewer->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); + + addDockWidget(Qt::TopDockWidgetArea, m_graphicsView); + addDockWidget(Qt::BottomDockWidgetArea, m_treeWidget); + addDockWidget(Qt::TopDockWidgetArea, m_fpsViewer); + +#if EASY_GUI_USE_DESCRIPTORS_DOCK_WINDOW != 0 + auto descTree = new EasyDescWidget(); + m_descTreeWidget = new EasyDockWidget("Blocks"); + m_descTreeWidget->setObjectName("ProfilerGUI_Blocks"); + m_descTreeWidget->setMinimumHeight(50); + m_descTreeWidget->setAllowedAreas(Qt::AllDockWidgetAreas); + m_descTreeWidget->setWidget(descTree); + addDockWidget(Qt::BottomDockWidgetArea, m_descTreeWidget); +#endif + + + auto toolbar = addToolBar("FileToolbar"); + toolbar->setIconSize(::profiler_gui::ICONS_SIZE); + toolbar->setObjectName("ProfilerGUI_FileToolbar"); + toolbar->setContentsMargins(1, 0, 1, 0); + + m_loadActionMenu = new QMenu(this); + auto action = m_loadActionMenu->menuAction(); + action->setText("Open file"); + action->setIcon(QIcon(imagePath("open"))); + connect(action, &QAction::triggered, this, &This::onOpenFileClicked); + toolbar->addAction(action); + + for (const auto& f : m_lastFiles) + { + action = new QAction(f, this); + connect(action, &QAction::triggered, this, &This::onOpenFileClicked); + m_loadActionMenu->addAction(action); + } + + m_saveAction = toolbar->addAction(QIcon(imagePath("save")), tr("Save"), this, SLOT(onSaveFileClicked(bool))); + m_deleteAction = toolbar->addAction(QIcon(imagePath("delete")), tr("Clear all"), this, SLOT(onDeleteClicked(bool))); + + m_saveAction->setEnabled(false); + m_deleteAction->setEnabled(false); + + + + toolbar = addToolBar("ProfileToolbar"); + toolbar->setIconSize(::profiler_gui::ICONS_SIZE); + toolbar->setObjectName("ProfilerGUI_ProfileToolbar"); + toolbar->setContentsMargins(1, 0, 1, 0); + + toolbar->addAction(QIcon(imagePath("list")), tr("Blocks"), this, SLOT(onEditBlocksClicked(bool))); + m_captureAction = toolbar->addAction(QIcon(imagePath("start")), tr("Capture"), this, SLOT(onCaptureClicked(bool))); + m_captureAction->setEnabled(false); + + toolbar->addSeparator(); + m_connectAction = toolbar->addAction(QIcon(imagePath("connect")), tr("Connect"), this, SLOT(onConnectClicked(bool))); + + auto lbl = new QLabel("Address:", toolbar); + lbl->setContentsMargins(5, 0, 2, 0); + toolbar->addWidget(lbl); + m_addressEdit = new QLineEdit(); + m_addressEdit->setToolTip("Enter IP-address or host name"); + //QRegExp rx("^0*(2(5[0-5]|[0-4]\\d)|1?\\d{1,2})(\\.0*(2(5[0-5]|[0-4]\\d)|1?\\d{1,2})){3}$"); + //m_addressEdit->setValidator(new QRegExpValidator(rx, m_addressEdit)); + m_addressEdit->setText(m_lastAddress); + m_addressEdit->setFixedWidth((m_addressEdit->fontMetrics().width(QString("255.255.255.255")) * 3) / 2); + toolbar->addWidget(m_addressEdit); + + lbl = new QLabel("Port:", toolbar); + lbl->setContentsMargins(5, 0, 2, 0); + toolbar->addWidget(lbl); + m_portEdit = new QLineEdit(); + m_portEdit->setValidator(new QIntValidator(1, 65535, m_portEdit)); + m_portEdit->setText(QString::number(m_lastPort)); + m_portEdit->setFixedWidth(m_portEdit->fontMetrics().width(QString("000000")) + 10); + toolbar->addWidget(m_portEdit); + + connect(m_addressEdit, &QLineEdit::returnPressed, [this] { onConnectClicked(true); }); + connect(m_portEdit, &QLineEdit::returnPressed, [this] { onConnectClicked(true); }); + + + + toolbar = addToolBar("SetupToolbar"); + toolbar->setIconSize(::profiler_gui::ICONS_SIZE); + toolbar->setObjectName("ProfilerGUI_SetupToolbar"); + toolbar->setContentsMargins(1, 0, 1, 0); + + toolbar->addAction(QIcon(imagePath("expand")), "Expand all", this, SLOT(onExpandAllClicked(bool))); + toolbar->addAction(QIcon(imagePath("collapse")), "Collapse all", this, SLOT(onCollapseAllClicked(bool))); + + toolbar->addSeparator(); + auto menu = new QMenu("Settings", this); + menu->setToolTipsVisible(true); + + QToolButton* toolButton = new QToolButton(toolbar); + toolButton->setIcon(QIcon(imagePath("settings"))); + toolButton->setMenu(menu); + toolButton->setPopupMode(QToolButton::InstantPopup); + toolbar->addWidget(toolButton); + + action = menu->addAction("Statistics enabled"); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.enable_statistics); + connect(action, &QAction::triggered, this, &This::onEnableDisableStatistics); + if (EASY_GLOBALS.enable_statistics) + { + auto f = action->font(); + f.setBold(true); + action->setFont(f); + action->setIcon(QIcon(imagePath("stats"))); + } + else + { + action->setText("Statistics disabled"); + action->setIcon(QIcon(imagePath("stats-off"))); + } + + + action = menu->addAction("Only frames on histogram"); + action->setToolTip("Display only top-level blocks on histogram."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.display_only_frames_on_histogram); + connect(action, &QAction::triggered, [this](bool _checked) + { + EASY_GLOBALS.display_only_frames_on_histogram = _checked; + emit EASY_GLOBALS.events.displayOnlyFramesOnHistogramChanged(); + }); + + + menu->addSeparator(); + auto submenu = menu->addMenu("View"); + submenu->setToolTipsVisible(true); + action = submenu->addAction("Draw items' borders"); + action->setToolTip("Draw borders for blocks on diagram.\nThis reduces performance."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.draw_graphics_items_borders); + connect(action, &QAction::triggered, [this](bool _checked){ EASY_GLOBALS.draw_graphics_items_borders = _checked; refreshDiagram(); }); + + action = submenu->addAction("Overlap narrow children"); + action->setToolTip("Children blocks will be overlaped by narrow\nparent blocks. See also \'Blocks narrow size\'.\nThis improves performance."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.hide_narrow_children); + connect(action, &QAction::triggered, [this](bool _checked){ EASY_GLOBALS.hide_narrow_children = _checked; refreshDiagram(); }); + + action = submenu->addAction("Hide min-size blocks"); + action->setToolTip("Hides blocks which screen size\nis less than \'Min blocks size\'."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.hide_minsize_blocks); + connect(action, &QAction::triggered, [this](bool _checked){ EASY_GLOBALS.hide_minsize_blocks = _checked; refreshDiagram(); }); + + action = submenu->addAction("Build hierarchy only for current thread"); + action->setToolTip("Hierarchy tree will be built\nfor blocks from current thread only.\nThis improves performance\nand saves a lot of memory."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.only_current_thread_hierarchy); + connect(action, &QAction::triggered, this, &This::onHierarchyFlagChange); + + action = submenu->addAction("Add zero blocks to hierarchy"); + action->setToolTip("Zero duration blocks will be added into hierarchy tree.\nThis reduces performance and increases memory consumption."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.add_zero_blocks_to_hierarchy); + connect(action, &QAction::triggered, [this](bool _checked) + { + EASY_GLOBALS.add_zero_blocks_to_hierarchy = _checked; + emit EASY_GLOBALS.events.hierarchyFlagChanged(_checked); + }); + + action = submenu->addAction("Enable zero duration blocks on diagram"); + action->setToolTip("If checked then allows diagram to paint zero duration blocks\nwith 1px width on each scale. Otherwise, such blocks will be resized\nto 250ns duration."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.enable_zero_length); + connect(action, &QAction::triggered, [this](bool _checked){ EASY_GLOBALS.enable_zero_length = _checked; refreshDiagram(); }); + + action = submenu->addAction("Highlight similar blocks"); + action->setToolTip("Highlight all visible blocks which are similar\nto the current selected block.\nThis reduces performance."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.highlight_blocks_with_same_id); + connect(action, &QAction::triggered, [this](bool _checked){ EASY_GLOBALS.highlight_blocks_with_same_id = _checked; refreshDiagram(); }); + + action = submenu->addAction("Collapse blocks on tree reset"); + action->setToolTip("This collapses all blocks on diagram\nafter hierarchy tree reset."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.collapse_items_on_tree_close); + connect(action, &QAction::triggered, this, &This::onCollapseItemsAfterCloseChanged); + + action = submenu->addAction("Expand all on file open"); + action->setToolTip("If checked then all blocks on diagram\nwill be initially expanded."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.all_items_expanded_by_default); + connect(action, &QAction::triggered, this, &This::onAllItemsExpandedByDefaultChange); + + action = submenu->addAction("Bind diagram and tree expand"); + action->setToolTip("Expanding/collapsing blocks at diagram expands/collapses\nblocks at hierarchy tree and wise versa."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.bind_scene_and_tree_expand_status); + connect(action, &QAction::triggered, this, &This::onBindExpandStatusChange); + + action = submenu->addAction("Selecting block changes current thread"); + action->setToolTip("Automatically select thread while selecting a block.\nIf not checked then you will have to select current thread\nmanually double clicking on thread name on a diagram."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.selecting_block_changes_thread); + connect(action, &QAction::triggered, [this](bool _checked){ EASY_GLOBALS.selecting_block_changes_thread = _checked; }); + + action = submenu->addAction("Draw event markers"); + action->setToolTip("Display event markers under the blocks\n(even if event-blocks are not visible).\nThis slightly reduces performance."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.enable_event_markers); + connect(action, &QAction::triggered, [this](bool _checked) + { + EASY_GLOBALS.enable_event_markers = _checked; + refreshDiagram(); + }); + + action = submenu->addAction("Automatically adjust histogram height"); + action->setToolTip("You do not need to adjust boundaries manually,\nbut this restricts you from adjusting boundaries at all (zoom mode).\nYou can still adjust boundaries in overview mode though."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.auto_adjust_histogram_height); + connect(action, &QAction::triggered, [](bool _checked) + { + EASY_GLOBALS.auto_adjust_histogram_height = _checked; + emit EASY_GLOBALS.events.autoAdjustHistogramChanged(); + }); + + action = submenu->addAction("Use decorated thread names"); + action->setToolTip("Add \'Thread\' word into thread name if there is no one already.\nExamples: \'Render\' will change to \'Render Thread\'\n\'WorkerThread\' will not change."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.use_decorated_thread_name); + connect(action, &QAction::triggered, [this](bool _checked) + { + EASY_GLOBALS.use_decorated_thread_name = _checked; + emit EASY_GLOBALS.events.threadNameDecorationChanged(); + }); + + action = submenu->addAction("Display hex thread id"); + action->setToolTip("Display hex thread id instead of decimal."); + action->setCheckable(true); + action->setChecked(EASY_GLOBALS.hex_thread_id); + connect(action, &QAction::triggered, [this](bool _checked) + { + EASY_GLOBALS.hex_thread_id = _checked; + emit EASY_GLOBALS.events.hexThreadIdChanged(); + }); + + submenu->addSeparator(); + auto actionGroup = new QActionGroup(this); + actionGroup->setExclusive(true); + + action = new QAction("Chrono text at top", actionGroup); + action->setToolTip("Draw duration of selected interval\nat the top of the screen."); + action->setCheckable(true); + action->setData(static_cast(::profiler_gui::ChronoTextPosition_Top)); + if (EASY_GLOBALS.chrono_text_position == ::profiler_gui::ChronoTextPosition_Top) + action->setChecked(true); + submenu->addAction(action); + connect(action, &QAction::triggered, this, &This::onChronoTextPosChanged); + + action = new QAction("Chrono text at center", actionGroup); + action->setToolTip("Draw duration of selected interval\nat the center of the screen."); + action->setCheckable(true); + action->setData(static_cast(::profiler_gui::ChronoTextPosition_Center)); + if (EASY_GLOBALS.chrono_text_position == ::profiler_gui::ChronoTextPosition_Center) + action->setChecked(true); + submenu->addAction(action); + connect(action, &QAction::triggered, this, &This::onChronoTextPosChanged); + + action = new QAction("Chrono text at bottom", actionGroup); + action->setToolTip("Draw duration of selected interval\nat the bottom of the screen."); + action->setCheckable(true); + action->setData(static_cast(::profiler_gui::ChronoTextPosition_Bottom)); + if (EASY_GLOBALS.chrono_text_position == ::profiler_gui::ChronoTextPosition_Bottom) + action->setChecked(true); + submenu->addAction(action); + connect(action, &QAction::triggered, this, &This::onChronoTextPosChanged); + + submenu->addSeparator(); + auto w = new QWidget(submenu); + auto l = new QHBoxLayout(w); + l->setContentsMargins(26, 1, 16, 1); + l->addWidget(new QLabel("Min blocks spacing, px", w), 0, Qt::AlignLeft); + auto spinbox = new QSpinBox(w); + spinbox->setRange(0, 400); + spinbox->setValue(EASY_GLOBALS.blocks_spacing); + spinbox->setFixedWidth(70); + connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(onSpacingChange(int))); + l->addWidget(spinbox); + w->setLayout(l); + auto waction = new QWidgetAction(submenu); + waction->setDefaultWidget(w); + submenu->addAction(waction); + + w = new QWidget(submenu); + l = new QHBoxLayout(w); + l->setContentsMargins(26, 1, 16, 1); + l->addWidget(new QLabel("Min blocks size, px", w), 0, Qt::AlignLeft); + spinbox = new QSpinBox(w); + spinbox->setRange(1, 400); + spinbox->setValue(EASY_GLOBALS.blocks_size_min); + spinbox->setFixedWidth(70); + connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(onMinSizeChange(int))); + l->addWidget(spinbox); + w->setLayout(l); + waction = new QWidgetAction(submenu); + waction->setDefaultWidget(w); + submenu->addAction(waction); + + w = new QWidget(submenu); + l = new QHBoxLayout(w); + l->setContentsMargins(26, 1, 16, 1); + l->addWidget(new QLabel("Blocks narrow size, px", w), 0, Qt::AlignLeft); + spinbox = new QSpinBox(w); + spinbox->setRange(1, 400); + spinbox->setValue(EASY_GLOBALS.blocks_narrow_size); + spinbox->setFixedWidth(70); + connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(onNarrowSizeChange(int))); + l->addWidget(spinbox); + w->setLayout(l); + waction = new QWidgetAction(submenu); + waction->setDefaultWidget(w); + submenu->addAction(waction); + + + + + submenu = menu->addMenu("FPS Monitor"); + w = new QWidget(submenu); + l = new QHBoxLayout(w); + l->setContentsMargins(26, 1, 16, 1); + l->addWidget(new QLabel("Request interval, ms", w), 0, Qt::AlignLeft); + spinbox = new QSpinBox(w); + spinbox->setRange(1, 600000); + spinbox->setValue(EASY_GLOBALS.fps_timer_interval); + spinbox->setFixedWidth(70); + connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(onFpsIntervalChange(int))); + l->addWidget(spinbox); + w->setLayout(l); + waction = new QWidgetAction(submenu); + waction->setDefaultWidget(w); + submenu->addAction(waction); + + w = new QWidget(submenu); + l = new QHBoxLayout(w); + l->setContentsMargins(26, 1, 16, 1); + l->addWidget(new QLabel("Max history size", w), 0, Qt::AlignLeft); + spinbox = new QSpinBox(w); + spinbox->setRange(2, 200); + spinbox->setValue(EASY_GLOBALS.max_fps_history); + spinbox->setFixedWidth(70); + connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(onFpsHistoryChange(int))); + l->addWidget(spinbox); + w->setLayout(l); + waction = new QWidgetAction(submenu); + waction->setDefaultWidget(w); + submenu->addAction(waction); + + w = new QWidget(submenu); + l = new QHBoxLayout(w); + l->setContentsMargins(26, 1, 16, 1); + l->addWidget(new QLabel("Line width, px", w), 0, Qt::AlignLeft); + spinbox = new QSpinBox(w); + spinbox->setRange(1, 6); + spinbox->setValue(EASY_GLOBALS.fps_widget_line_width); + spinbox->setFixedWidth(70); + connect(spinbox, SIGNAL(valueChanged(int)), this, SLOT(onFpsMonitorLineWidthChange(int))); + l->addWidget(spinbox); + w->setLayout(l); + waction = new QWidgetAction(submenu); + waction->setDefaultWidget(w); + submenu->addAction(waction); + + + + + submenu = menu->addMenu("Units"); + actionGroup = new QActionGroup(this); + actionGroup->setExclusive(true); + action = new QAction("Auto", actionGroup); + action->setCheckable(true); + action->setData(static_cast(::profiler_gui::TimeUnits_auto)); + if (EASY_GLOBALS.time_units == ::profiler_gui::TimeUnits_auto) + action->setChecked(true); + submenu->addAction(action); + connect(action, &QAction::triggered, this, &This::onUnitsChanged); + + action = new QAction("Milliseconds", actionGroup); + action->setCheckable(true); + action->setData(static_cast(::profiler_gui::TimeUnits_ms)); + if (EASY_GLOBALS.time_units == ::profiler_gui::TimeUnits_ms) + action->setChecked(true); + submenu->addAction(action); + connect(action, &QAction::triggered, this, &This::onUnitsChanged); + + action = new QAction("Microseconds", actionGroup); + action->setCheckable(true); + action->setData(static_cast(::profiler_gui::TimeUnits_us)); + if (EASY_GLOBALS.time_units == ::profiler_gui::TimeUnits_us) + action->setChecked(true); + submenu->addAction(action); + connect(action, &QAction::triggered, this, &This::onUnitsChanged); + + action = new QAction("Nanoseconds", actionGroup); + action->setCheckable(true); + action->setData(static_cast(::profiler_gui::TimeUnits_ns)); + if (EASY_GLOBALS.time_units == ::profiler_gui::TimeUnits_ns) + action->setChecked(true); + submenu->addAction(action); + connect(action, &QAction::triggered, this, &This::onUnitsChanged); + + + submenu = menu->addMenu("Remote"); + m_eventTracingEnableAction = submenu->addAction("Event tracing enabled"); + m_eventTracingEnableAction->setCheckable(true); + m_eventTracingEnableAction->setEnabled(false); + connect(m_eventTracingEnableAction, &QAction::triggered, this, &This::onEventTracingEnableChange); + + m_eventTracingPriorityAction = submenu->addAction("Low priority event tracing"); + m_eventTracingPriorityAction->setCheckable(true); + m_eventTracingPriorityAction->setChecked(EASY_OPTION_LOW_PRIORITY_EVENT_TRACING); + m_eventTracingPriorityAction->setEnabled(false); + connect(m_eventTracingPriorityAction, &QAction::triggered, this, &This::onEventTracingPriorityChange); + + + submenu = menu->addMenu("Encoding"); + actionGroup = new QActionGroup(this); + actionGroup->setExclusive(true); + + auto default_codec_mib = QTextCodec::codecForLocale()->mibEnum(); + { + QList actions; + + for (int mib : QTextCodec::availableMibs()) + { + auto codec = QTextCodec::codecForMib(mib)->name(); + + action = new QAction(codec, actionGroup); + action->setData(mib); + action->setCheckable(true); + if (mib == default_codec_mib) + action->setChecked(true); + + actions.push_back(action); + connect(action, &QAction::triggered, this, &This::onEncodingChanged); + } + + qSort(actions.begin(), actions.end(), [](QAction* lhs, QAction* rhs) { + return lhs->text().compare(rhs->text(), Qt::CaseInsensitive) < 0; + }); + + submenu->addActions(actions); + } + + + + menu->addSeparator(); + submenu = menu->addMenu("Theme"); + actionGroup = new QActionGroup(this); + actionGroup->setExclusive(true); + + for (const auto& theme : UI_themes()) + { + action = new QAction(theme, actionGroup); + action->setCheckable(true); + action->setChecked(action->text() == EASY_GLOBALS.theme); + connect(action, &QAction::triggered, this, &EasyMainWindow::onThemeChange); + submenu->addAction(action); + } + + + auto tb_height = toolbar->height() + 4; + toolbar = addToolBar("FrameToolbar"); + toolbar->setIconSize(::profiler_gui::ICONS_SIZE); + toolbar->setObjectName("ProfilerGUI_FrameToolbar"); + toolbar->setContentsMargins(1, 0, 1, 0); + toolbar->setMinimumHeight(tb_height); + + lbl = new QLabel("Expected frame time:", toolbar); + lbl->setContentsMargins(5, 2, 2, 2); + toolbar->addWidget(lbl); + + m_frameTimeEdit = new QLineEdit(); + m_frameTimeEdit->setFixedWidth(70); + auto val = new QDoubleValidator(m_frameTimeEdit); + val->setLocale(QLocale::c()); + val->setBottom(0); + m_frameTimeEdit->setValidator(val); + m_frameTimeEdit->setText(QString::number(EASY_GLOBALS.frame_time * 1e-3)); + connect(m_frameTimeEdit, &QLineEdit::editingFinished, this, &This::onFrameTimeEditFinish); + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::expectedFrameTimeChanged, this, &This::onFrameTimeChanged); + toolbar->addWidget(m_frameTimeEdit); + + lbl = new QLabel("ms", toolbar); + lbl->setContentsMargins(5, 2, 1, 1); + toolbar->addWidget(lbl); + + + connect(graphicsView->view(), &EasyGraphicsView::intervalChanged, treeWidget->tree(), &EasyTreeWidget::setTreeBlocks); + connect(&m_readerTimer, &QTimer::timeout, this, &This::onFileReaderTimeout); + connect(&m_listenerTimer, &QTimer::timeout, this, &This::onListenerTimerTimeout); + connect(&m_fpsRequestTimer, &QTimer::timeout, this, &This::onFrameTimeRequestTimeout); + + + loadGeometry(); + + if(QCoreApplication::arguments().size() > 1) + { + auto opened_filename = QCoreApplication::arguments().at(1); + loadFile(opened_filename); + } + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::blockStatusChanged, this, &This::onBlockStatusChange); + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::blocksRefreshRequired, this, &This::onGetBlockDescriptionsClicked); +} + +EasyMainWindow::~EasyMainWindow() +{ +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::dragEnterEvent(QDragEnterEvent* drag_event) +{ + if (drag_event->mimeData()->hasUrls()) + drag_event->acceptProposedAction(); +} + +void EasyMainWindow::dragMoveEvent(QDragMoveEvent* drag_event) +{ + if (drag_event->mimeData()->hasUrls()) + drag_event->acceptProposedAction(); +} + +void EasyMainWindow::dragLeaveEvent(QDragLeaveEvent* drag_event) +{ + drag_event->accept(); +} + +void EasyMainWindow::dropEvent(QDropEvent* drop_event) +{ + const auto& urls = drop_event->mimeData()->urls(); + if (!urls.empty()) + { + if (m_bNetworkFileRegime) + { + // Warn user about unsaved network information and suggest to save + auto result = QMessageBox::question(this, "Unsaved session", "You have unsaved data!\nSave before opening new file?", QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel); + if (result == QMessageBox::Yes) + { + onSaveFileClicked(true); + } + else if (result != QMessageBox::No) + { + // User cancelled opening new file + return; + } + } + + loadFile(urls.front().toLocalFile()); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onThemeChange(bool) +{ + auto action = qobject_cast(sender()); + if (action == nullptr) + return; + + auto newTheme = action->text(); + if (m_theme != newTheme) + { + m_theme = std::move(newTheme); + QMessageBox::information(this, "Theme", "You should restart the application to apply the theme."); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onOpenFileClicked(bool) +{ + auto action = qobject_cast(sender()); + if (action == nullptr) + return; + + QString filename; + + if (action == m_loadActionMenu->menuAction()) + filename = QFileDialog::getOpenFileName(this, "Open EasyProfiler File", m_lastFiles.empty() ? QString() : m_lastFiles.front(), "EasyProfiler File (*.prof);;All Files (*.*)"); + else + filename = action->text(); + + if (!filename.isEmpty()) + { + if (m_bNetworkFileRegime) + { + // Warn user about unsaved network information and suggest to save + auto result = QMessageBox::question(this, "Unsaved session", "You have unsaved data!\nSave before opening new file?", QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel); + if (result == QMessageBox::Yes) + { + onSaveFileClicked(true); + } + else if (result != QMessageBox::No) + { + // User cancelled opening new file + return; + } + } + + loadFile(filename); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::addFileToList(const QString& filename) +{ + m_lastFiles.push_front(filename); + + auto action = new QAction(filename, this); + connect(action, &QAction::triggered, this, &This::onOpenFileClicked); + auto fileActions = m_loadActionMenu->actions(); + if (fileActions.empty()) + m_loadActionMenu->addAction(action); + else + m_loadActionMenu->insertAction(fileActions.front(), action); + + if (m_lastFiles.size() > 10) + { + // Keep 10 files at the list + m_lastFiles.pop_back(); + m_loadActionMenu->removeAction(fileActions.back()); + delete fileActions.back(); + } + + m_bOpenedCacheFile = filename.contains(NETWORK_CACHE_FILE); + + if (m_bOpenedCacheFile) + setWindowTitle(QString(EASY_DEFAULT_WINDOW_TITLE " - [%1] - UNSAVED network cache file").arg(m_lastFiles.front())); + else + setWindowTitle(QString(EASY_DEFAULT_WINDOW_TITLE " - [%1]").arg(m_lastFiles.front())); +} + +void EasyMainWindow::loadFile(const QString& filename) +{ + const auto i = filename.lastIndexOf(QChar('/')); + const auto j = filename.lastIndexOf(QChar('\\')); + + createProgressDialog(QString("Loading %1...").arg(filename.mid(::std::max(i, j) + 1))); + + m_readerTimer.start(LOADER_TIMER_INTERVAL); + m_reader.load(filename); +} + +void EasyMainWindow::readStream(::std::stringstream& data) +{ + createProgressDialog(tr("Reading from stream...")); + m_readerTimer.start(LOADER_TIMER_INTERVAL); + m_reader.load(data); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onSaveFileClicked(bool) +{ + if (m_serializedBlocks.empty()) + return; + + QString lastFile = m_lastFiles.empty() ? QString() : m_lastFiles.front(); + + const auto i = lastFile.lastIndexOf(QChar('/')); + const auto j = lastFile.lastIndexOf(QChar('\\')); + auto k = ::std::max(i, j); + + QString dir; + if (k > 0) + dir = lastFile.mid(0, ++k); + + if (m_bNetworkFileRegime) + { + // Current file is network cache file, use current system time as output file name + + if (!dir.isEmpty()) + dir += QDateTime::currentDateTime().toString("/yyyy-MM-dd_HH-mm-ss.prof"); + else + dir = QDateTime::currentDateTime().toString("yyyy-MM-dd_HH-mm-ss.prof"); + } + else if (m_bOpenedCacheFile) + { + // Opened old network cache file, use it's last modification time as output file name + + QFileInfo fileInfo(lastFile); + if (!fileInfo.exists()) + { + // Can not open the file! + + QMessageBox::warning(this, "Warning", "Cannot open source file.\nSaving incomplete.", QMessageBox::Close); + + m_lastFiles.pop_front(); + auto action = m_loadActionMenu->actions().front(); + m_loadActionMenu->removeAction(action); + delete action; + + return; + } + + if (!dir.isEmpty()) + dir += fileInfo.lastModified().toString("/yyyy-MM-dd_HH-mm-ss.prof"); + else + dir = fileInfo.lastModified().toString("yyyy-MM-dd_HH-mm-ss.prof"); + } + else + { + dir = lastFile; + } + + auto filename = QFileDialog::getSaveFileName(this, "Save EasyProfiler File", dir, "EasyProfiler File (*.prof);;All Files (*.*)"); + if (!filename.isEmpty()) + { + // Check if the same file has been selected + { + QFileInfo fileInfo1(m_bNetworkFileRegime ? QString(NETWORK_CACHE_FILE) : lastFile), fileInfo2(filename); + if (fileInfo1.exists() && fileInfo2.exists() && fileInfo1 == fileInfo2) + { + // Selected the same file - do nothing + return; + } + } + + bool inOk = false, outOk = false; + int8_t retry1 = -1; + while (++retry1 < 4) + { + ::std::ifstream inFile(m_bNetworkFileRegime ? NETWORK_CACHE_FILE : lastFile.toStdString().c_str(), ::std::fstream::binary); + if (!inFile.is_open()) + { + ::std::this_thread::sleep_for(::std::chrono::milliseconds(500)); + continue; + } + + inOk = true; + + int8_t retry2 = -1; + while (++retry2 < 4) + { + ::std::ofstream outFile(filename.toStdString(), ::std::fstream::binary); + if (!outFile.is_open()) + { + ::std::this_thread::sleep_for(::std::chrono::milliseconds(500)); + continue; + } + + outFile << inFile.rdbuf(); + outOk = true; + break; + } + + break; + } + + if (outOk) + { + if (m_bNetworkFileRegime) + { + // Remove temporary network cahche file + QFile::remove(QString(NETWORK_CACHE_FILE)); + } + else if (m_bOpenedCacheFile) + { + // Remove old temporary network cahche file + + QFile::remove(lastFile.toStdString().c_str()); + + m_lastFiles.pop_front(); + auto action = m_loadActionMenu->actions().front(); + m_loadActionMenu->removeAction(action); + delete action; + } + + addFileToList(filename); + + m_bNetworkFileRegime = false; + } + else if (inOk) + { + QMessageBox::warning(this, "Warning", "Cannot open destination file.\nSaving incomplete.", QMessageBox::Close); + } + else + { + if (m_bNetworkFileRegime) + QMessageBox::warning(this, "Warning", "Cannot open network cache file.\nSaving incomplete.", QMessageBox::Close); + else + QMessageBox::warning(this, "Warning", "Cannot open source file.\nSaving incomplete.", QMessageBox::Close); + } + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::clear() +{ + static_cast(m_treeWidget->widget())->clear(true); + static_cast(m_graphicsView->widget())->clear(); + +#if EASY_GUI_USE_DESCRIPTORS_DOCK_WINDOW != 0 + static_cast(m_descTreeWidget->widget())->clear(); +#endif + if (m_dialogDescTree != nullptr) + m_dialogDescTree->clear(); + + EASY_GLOBALS.selected_thread = 0; + ::profiler_gui::set_max(EASY_GLOBALS.selected_block); + ::profiler_gui::set_max(EASY_GLOBALS.selected_block_id); + EASY_GLOBALS.profiler_blocks.clear(); + EASY_GLOBALS.descriptors.clear(); + EASY_GLOBALS.gui_blocks.clear(); + + m_serializedBlocks.clear(); + m_serializedDescriptors.clear(); + + m_saveAction->setEnabled(false); + m_deleteAction->setEnabled(false); + + if (m_bNetworkFileRegime) + QFile::remove(QString(NETWORK_CACHE_FILE)); + + m_bNetworkFileRegime = false; + m_bOpenedCacheFile = false; + + setWindowTitle(EASY_DEFAULT_WINDOW_TITLE); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::refreshDiagram() +{ + static_cast(m_graphicsView->widget())->view()->scene()->update(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onDeleteClicked(bool) +{ + int button = QMessageBox::Yes; + if (m_bNetworkFileRegime) + button = QMessageBox::question(this, "Clear all profiled data", "All profiled data and network cache file\nare going to be deleted!\nContinue?", QMessageBox::Yes, QMessageBox::No); + + if (button == QMessageBox::Yes) + clear(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onExitClicked(bool) +{ + close(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onEncodingChanged(bool) +{ + auto action = qobject_cast(sender()); + if (action == nullptr) + return; + + const int mib = action->data().toInt(); + auto codec = QTextCodec::codecForMib(mib); + if (codec != nullptr) + QTextCodec::setCodecForLocale(codec); +} + +void EasyMainWindow::onChronoTextPosChanged(bool) +{ + auto _sender = qobject_cast(sender()); + EASY_GLOBALS.chrono_text_position = static_cast<::profiler_gui::ChronometerTextPosition>(_sender->data().toInt()); + refreshDiagram(); +} + +void EasyMainWindow::onUnitsChanged(bool) +{ + auto _sender = qobject_cast(sender()); + EASY_GLOBALS.time_units = static_cast<::profiler_gui::TimeUnits>(_sender->data().toInt()); +} + +void EasyMainWindow::onEnableDisableStatistics(bool _checked) +{ + EASY_GLOBALS.enable_statistics = _checked; + + auto action = qobject_cast(sender()); + if (action != nullptr) + { + auto f = action->font(); + f.setBold(_checked); + action->setFont(f); + + if (_checked) + { + action->setText("Statistics enabled"); + action->setIcon(QIcon(imagePath("stats"))); + } + else + { + action->setText("Statistics disabled"); + action->setIcon(QIcon(imagePath("stats-off"))); + } + } +} + +void EasyMainWindow::onCollapseItemsAfterCloseChanged(bool _checked) +{ + EASY_GLOBALS.collapse_items_on_tree_close = _checked; +} + +void EasyMainWindow::onAllItemsExpandedByDefaultChange(bool _checked) +{ + EASY_GLOBALS.all_items_expanded_by_default = _checked; +} + +void EasyMainWindow::onBindExpandStatusChange(bool _checked) +{ + EASY_GLOBALS.bind_scene_and_tree_expand_status = _checked; +} + +void EasyMainWindow::onHierarchyFlagChange(bool _checked) +{ + EASY_GLOBALS.only_current_thread_hierarchy = _checked; + emit EASY_GLOBALS.events.hierarchyFlagChanged(_checked); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onExpandAllClicked(bool) +{ + for (auto& block : EASY_GLOBALS.gui_blocks) + block.expanded = true; + + emit EASY_GLOBALS.events.itemsExpandStateChanged(); + + auto tree = static_cast(m_treeWidget->widget())->tree(); + const QSignalBlocker b(tree); + tree->expandAll(); +} + +void EasyMainWindow::onCollapseAllClicked(bool) +{ + for (auto& block : EASY_GLOBALS.gui_blocks) + block.expanded = false; + + emit EASY_GLOBALS.events.itemsExpandStateChanged(); + + auto tree = static_cast(m_treeWidget->widget())->tree(); + const QSignalBlocker b(tree); + tree->collapseAll(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onSpacingChange(int _value) +{ + EASY_GLOBALS.blocks_spacing = _value; + refreshDiagram(); +} + +void EasyMainWindow::onMinSizeChange(int _value) +{ + EASY_GLOBALS.blocks_size_min = _value; + refreshDiagram(); +} + +void EasyMainWindow::onNarrowSizeChange(int _value) +{ + EASY_GLOBALS.blocks_narrow_size = _value; + refreshDiagram(); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onFpsIntervalChange(int _value) +{ + EASY_GLOBALS.fps_timer_interval = _value; + + if (m_fpsRequestTimer.isActive()) + m_fpsRequestTimer.stop(); + + if (EASY_GLOBALS.connected) + m_fpsRequestTimer.start(_value); +} + +void EasyMainWindow::onFpsHistoryChange(int _value) +{ + EASY_GLOBALS.max_fps_history = _value; +} + +void EasyMainWindow::onFpsMonitorLineWidthChange(int _value) +{ + EASY_GLOBALS.fps_widget_line_width = _value; +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onEditBlocksClicked(bool) +{ + if (m_descTreeDialog != nullptr) + { + m_descTreeDialog->raise(); + return; + } + + m_descTreeDialog = new QDialog(); + m_descTreeDialog->setAttribute(Qt::WA_DeleteOnClose, true); + m_descTreeDialog->setWindowTitle(EASY_DEFAULT_WINDOW_TITLE); + m_descTreeDialog->resize(800, 600); + connect(m_descTreeDialog, &QDialog::finished, this, &This::onDescTreeDialogClose); + + auto l = new QVBoxLayout(m_descTreeDialog); + m_dialogDescTree = new EasyDescWidget(m_descTreeDialog); + l->addWidget(m_dialogDescTree); + m_descTreeDialog->setLayout(l); + + m_dialogDescTree->build(); + m_descTreeDialog->show(); +} + +void EasyMainWindow::onDescTreeDialogClose(int) +{ + disconnect(m_descTreeDialog, &QDialog::finished, this, &This::onDescTreeDialogClose); + m_dialogDescTree = nullptr; + m_descTreeDialog = nullptr; +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::closeEvent(QCloseEvent* close_event) +{ + if (m_bNetworkFileRegime) + { + // Warn user about unsaved network information and suggest to save + if (QMessageBox::Yes == QMessageBox::question(this, "Unsaved session", "You have unsaved data!\nSave before exit?", QMessageBox::Yes, QMessageBox::No)) + { + onSaveFileClicked(true); + } + } + + saveSettingsAndGeometry(); + + if (m_descTreeDialog != nullptr) + { + m_descTreeDialog->reject(); + m_descTreeDialog = nullptr; + m_dialogDescTree = nullptr; + } + + Parent::closeEvent(close_event); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::loadSettings() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("main"); + + auto last_files = settings.value("last_files"); + if (!last_files.isNull()) + m_lastFiles = last_files.toStringList(); + + auto last_addr = settings.value("ip_address"); + if (!last_addr.isNull()) + m_lastAddress = last_addr.toString(); + + auto last_port = settings.value("port"); + if (!last_port.isNull()) + m_lastPort = (uint16_t)last_port.toUInt(); + + + auto val = settings.value("chrono_text_position"); + if (!val.isNull()) + EASY_GLOBALS.chrono_text_position = static_cast<::profiler_gui::ChronometerTextPosition>(val.toInt()); + + val = settings.value("time_units"); + if (!val.isNull()) + EASY_GLOBALS.time_units = static_cast<::profiler_gui::TimeUnits>(val.toInt()); + + + val = settings.value("frame_time"); + if (!val.isNull()) + EASY_GLOBALS.frame_time = val.toFloat(); + + val = settings.value("blocks_spacing"); + if (!val.isNull()) + EASY_GLOBALS.blocks_spacing = val.toInt(); + + val = settings.value("blocks_size_min"); + if (!val.isNull()) + EASY_GLOBALS.blocks_size_min = val.toInt(); + + val = settings.value("blocks_narrow_size"); + if (!val.isNull()) + EASY_GLOBALS.blocks_narrow_size = val.toInt(); + + + auto flag = settings.value("draw_graphics_items_borders"); + if (!flag.isNull()) + EASY_GLOBALS.draw_graphics_items_borders = flag.toBool(); + + flag = settings.value("hide_narrow_children"); + if (!flag.isNull()) + EASY_GLOBALS.hide_narrow_children = flag.toBool(); + + flag = settings.value("hide_minsize_blocks"); + if (!flag.isNull()) + EASY_GLOBALS.hide_minsize_blocks = flag.toBool(); + + flag = settings.value("collapse_items_on_tree_close"); + if (!flag.isNull()) + EASY_GLOBALS.collapse_items_on_tree_close = flag.toBool(); + + flag = settings.value("all_items_expanded_by_default"); + if (!flag.isNull()) + EASY_GLOBALS.all_items_expanded_by_default = flag.toBool(); + + flag = settings.value("only_current_thread_hierarchy"); + if (!flag.isNull()) + EASY_GLOBALS.only_current_thread_hierarchy = flag.toBool(); + + flag = settings.value("enable_zero_length"); + if (!flag.isNull()) + EASY_GLOBALS.enable_zero_length = flag.toBool(); + + flag = settings.value("add_zero_blocks_to_hierarchy"); + if (!flag.isNull()) + EASY_GLOBALS.add_zero_blocks_to_hierarchy = flag.toBool(); + + + flag = settings.value("highlight_blocks_with_same_id"); + if (!flag.isNull()) + EASY_GLOBALS.highlight_blocks_with_same_id = flag.toBool(); + + flag = settings.value("bind_scene_and_tree_expand_status"); + if (!flag.isNull()) + EASY_GLOBALS.bind_scene_and_tree_expand_status = flag.toBool(); + + flag = settings.value("selecting_block_changes_thread"); + if (!flag.isNull()) + EASY_GLOBALS.selecting_block_changes_thread = flag.toBool(); + + flag = settings.value("enable_event_indicators"); + if (!flag.isNull()) + EASY_GLOBALS.enable_event_markers = flag.toBool(); + + flag = settings.value("auto_adjust_histogram_height"); + if (!flag.isNull()) + EASY_GLOBALS.auto_adjust_histogram_height = flag.toBool(); + + flag = settings.value("display_only_frames_on_histogram"); + if (!flag.isNull()) + EASY_GLOBALS.display_only_frames_on_histogram = flag.toBool(); + + flag = settings.value("use_decorated_thread_name"); + if (!flag.isNull()) + EASY_GLOBALS.use_decorated_thread_name = flag.toBool(); + + flag = settings.value("hex_thread_id"); + if (!flag.isNull()) + EASY_GLOBALS.hex_thread_id = flag.toBool(); + + flag = settings.value("fps_timer_interval"); + if (!flag.isNull()) + EASY_GLOBALS.fps_timer_interval = flag.toInt(); + + flag = settings.value("max_fps_history"); + if (!flag.isNull()) + EASY_GLOBALS.max_fps_history = flag.toInt(); + + flag = settings.value("fps_widget_line_width"); + if (!flag.isNull()) + EASY_GLOBALS.fps_widget_line_width = flag.toInt(); + + flag = settings.value("enable_statistics"); + if (!flag.isNull()) + EASY_GLOBALS.enable_statistics = flag.toBool(); + + QString encoding = settings.value("encoding", "UTF-8").toString(); + auto default_codec_mib = QTextCodec::codecForName(encoding.toStdString().c_str())->mibEnum(); + auto default_codec = QTextCodec::codecForMib(default_codec_mib); + QTextCodec::setCodecForLocale(default_codec); + + auto theme = settings.value("theme"); + if (theme.isValid()) + { + EASY_GLOBALS.theme = m_theme = theme.toString(); + } + else + { + m_theme = EASY_GLOBALS.theme; + } + + settings.endGroup(); +} + +void EasyMainWindow::loadGeometry() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("main"); + + auto geometry = settings.value("geometry").toByteArray(); + if (!geometry.isEmpty()) + restoreGeometry(geometry); + + auto state = settings.value("windowState").toByteArray(); + if (!state.isEmpty()) + restoreState(state); + + settings.endGroup(); +} + +void EasyMainWindow::saveSettingsAndGeometry() +{ + QSettings settings(::profiler_gui::ORGANAZATION_NAME, ::profiler_gui::APPLICATION_NAME); + settings.beginGroup("main"); + + settings.setValue("geometry", this->saveGeometry()); + settings.setValue("windowState", this->saveState()); + settings.setValue("last_files", m_lastFiles); + settings.setValue("ip_address", m_lastAddress); + settings.setValue("port", (quint32)m_lastPort); + settings.setValue("chrono_text_position", static_cast(EASY_GLOBALS.chrono_text_position)); + settings.setValue("time_units", static_cast(EASY_GLOBALS.time_units)); + settings.setValue("frame_time", EASY_GLOBALS.frame_time); + settings.setValue("blocks_spacing", EASY_GLOBALS.blocks_spacing); + settings.setValue("blocks_size_min", EASY_GLOBALS.blocks_size_min); + settings.setValue("blocks_narrow_size", EASY_GLOBALS.blocks_narrow_size); + settings.setValue("draw_graphics_items_borders", EASY_GLOBALS.draw_graphics_items_borders); + settings.setValue("hide_narrow_children", EASY_GLOBALS.hide_narrow_children); + settings.setValue("hide_minsize_blocks", EASY_GLOBALS.hide_minsize_blocks); + settings.setValue("collapse_items_on_tree_close", EASY_GLOBALS.collapse_items_on_tree_close); + settings.setValue("all_items_expanded_by_default", EASY_GLOBALS.all_items_expanded_by_default); + settings.setValue("only_current_thread_hierarchy", EASY_GLOBALS.only_current_thread_hierarchy); + settings.setValue("enable_zero_length", EASY_GLOBALS.enable_zero_length); + settings.setValue("add_zero_blocks_to_hierarchy", EASY_GLOBALS.add_zero_blocks_to_hierarchy); + settings.setValue("highlight_blocks_with_same_id", EASY_GLOBALS.highlight_blocks_with_same_id); + settings.setValue("bind_scene_and_tree_expand_status", EASY_GLOBALS.bind_scene_and_tree_expand_status); + settings.setValue("selecting_block_changes_thread", EASY_GLOBALS.selecting_block_changes_thread); + settings.setValue("enable_event_indicators", EASY_GLOBALS.enable_event_markers); + settings.setValue("auto_adjust_histogram_height", EASY_GLOBALS.auto_adjust_histogram_height); + settings.setValue("display_only_frames_on_histogram", EASY_GLOBALS.display_only_frames_on_histogram); + settings.setValue("use_decorated_thread_name", EASY_GLOBALS.use_decorated_thread_name); + settings.setValue("hex_thread_id", EASY_GLOBALS.hex_thread_id); + settings.setValue("enable_statistics", EASY_GLOBALS.enable_statistics); + settings.setValue("fps_timer_interval", EASY_GLOBALS.fps_timer_interval); + settings.setValue("max_fps_history", EASY_GLOBALS.max_fps_history); + settings.setValue("fps_widget_line_width", EASY_GLOBALS.fps_widget_line_width); + settings.setValue("encoding", QTextCodec::codecForLocale()->name()); + settings.setValue("theme", m_theme); + + settings.endGroup(); +} + +void EasyMainWindow::destroyProgressDialog() +{ + if (m_progress != nullptr) + { + m_progress->setValue(100); + m_progress->deleteLater(); + m_progress = nullptr; + } +} + +void EasyMainWindow::createProgressDialog(const QString& text) +{ + destroyProgressDialog(); + + m_progress = new QProgressDialog(text, QStringLiteral("Cancel"), 0, 100, this); + connect(m_progress, &QProgressDialog::canceled, this, &This::onFileReaderCancel); + + m_progress->setFixedWidth(300); + m_progress->setWindowTitle(EASY_DEFAULT_WINDOW_TITLE); + m_progress->setModal(true); + m_progress->setValue(0); + m_progress->show(); +} + +void EasyMainWindow::setDisconnected(bool _showMessage) +{ + if (m_fpsRequestTimer.isActive()) + m_fpsRequestTimer.stop(); + + if (_showMessage) + QMessageBox::warning(this, "Warning", "Connection was lost", QMessageBox::Close); + + EASY_GLOBALS.connected = false; + m_captureAction->setEnabled(false); + m_connectAction->setIcon(QIcon(imagePath("connect"))); + m_connectAction->setText(tr("Connect")); + + m_eventTracingEnableAction->setEnabled(false); + m_eventTracingPriorityAction->setEnabled(false); + + m_addressEdit->setEnabled(true); + m_portEdit->setEnabled(true); + + emit EASY_GLOBALS.events.connectionChanged(false); + +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onFrameTimeRequestTimeout() +{ + if (EASY_GLOBALS.fps_enabled && EASY_GLOBALS.connected && (m_listener.regime() == LISTENER_IDLE || m_listener.regime() == LISTENER_CAPTURE)) + { + if (m_listener.requestFrameTime()) + { + QTimer::singleShot(100, this, &This::checkFrameTimeReady); + } + else if (!m_listener.connected()) + { + m_listener.closeSocket(); + setDisconnected(); + } + } +} + +void EasyMainWindow::checkFrameTimeReady() +{ + if (EASY_GLOBALS.fps_enabled && EASY_GLOBALS.connected && (m_listener.regime() == LISTENER_IDLE || m_listener.regime() == LISTENER_CAPTURE)) + { + uint32_t maxTime = 0, avgTime = 0; + if (m_listener.frameTime(maxTime, avgTime)) + { + static_cast(m_fpsViewer->widget())->addPoint(maxTime, avgTime); + } + else if (m_fpsRequestTimer.isActive()) + { + QTimer::singleShot(100, this, &This::checkFrameTimeReady); + } + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onListenerTimerTimeout() +{ + if (!m_listener.connected()) + { + if (m_listener.regime() == LISTENER_CAPTURE_RECEIVE) + m_listener.finalizeCapture(); + if (m_listenerDialog) + m_listenerDialog->reject(); + } + else if (m_listener.regime() == LISTENER_CAPTURE_RECEIVE) + { + if (m_listener.captured()) + { + if (m_listenerTimer.isActive()) + m_listenerTimer.stop(); + + m_listener.finalizeCapture(); + + m_listenerDialog->accept(); + m_listenerDialog = nullptr; + + if (m_listener.size() != 0) + { + readStream(m_listener.data()); + m_listener.clearData(); + } + } + } +} + +void EasyMainWindow::onListenerDialogClose(int _result) +{ + if (m_listener.regime() != LISTENER_CAPTURE_RECEIVE || !m_listener.connected()) + { + if (m_listenerTimer.isActive()) + m_listenerTimer.stop(); + } + + disconnect(m_listenerDialog, &QDialog::finished, this, &This::onListenerDialogClose); + m_listenerDialog = nullptr; + + switch (m_listener.regime()) + { + case LISTENER_CAPTURE: + { + m_listenerDialog = new QMessageBox(QMessageBox::Information, "Receiving data...", "This process may take some time.", QMessageBox::Cancel, this); + m_listenerDialog->setAttribute(Qt::WA_DeleteOnClose, true); + m_listenerDialog->show(); + + m_listener.stopCapture(); + + if (m_listener.regime() != LISTENER_CAPTURE_RECEIVE) + { + m_listenerDialog->reject(); + m_listenerDialog = nullptr; + } + else + { + connect(m_listenerDialog, &QDialog::finished, this, &This::onListenerDialogClose); + m_listenerTimer.start(250); + } + + break; + } + + case LISTENER_CAPTURE_RECEIVE: + { + if (!m_listener.captured()) + { + if (_result == QDialog::Accepted) + { + m_listenerDialog = new QMessageBox(QMessageBox::Information, "Receiving data...", "This process may take some time.", QMessageBox::Cancel, this); + connect(m_listenerDialog, &QDialog::finished, this, &This::onListenerDialogClose); + m_listenerDialog->setAttribute(Qt::WA_DeleteOnClose, true); + m_listenerDialog->show(); + } + else + { + m_listener.finalizeCapture(); + m_listener.clearData(); + + if (m_listener.connected()) + { + // make reconnect to clear socket buffers + const std::string address = m_listener.address(); + const auto port = m_listener.port(); + + profiler::net::EasyProfilerStatus reply(false, false, false); + if (m_listener.reconnect(address.c_str(), port, reply)) + { + disconnect(m_eventTracingEnableAction, &QAction::triggered, this, &This::onEventTracingEnableChange); + disconnect(m_eventTracingPriorityAction, &QAction::triggered, this, &This::onEventTracingPriorityChange); + + m_eventTracingEnableAction->setChecked(reply.isEventTracingEnabled); + m_eventTracingPriorityAction->setChecked(reply.isLowPriorityEventTracing); + + connect(m_eventTracingEnableAction, &QAction::triggered, this, &This::onEventTracingEnableChange); + connect(m_eventTracingPriorityAction, &QAction::triggered, this, &This::onEventTracingPriorityChange); + + if (reply.isProfilerEnabled) + { + // Connected application is already profiling. + // Show capture dialog immediately + onCaptureClicked(true); + } + } + } + } + + break; + } + + if (m_listenerTimer.isActive()) + m_listenerTimer.stop(); + + m_listener.finalizeCapture(); + + if (m_listener.size() != 0) + { + readStream(m_listener.data()); + m_listener.clearData(); + } + + break; + } + + case LISTENER_DESCRIBE: + { + break; + } + + default: + return; + } + + if (!m_listener.connected()) + { + m_listener.closeSocket(); + setDisconnected(); + } +} + + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onFileReaderTimeout() +{ + if (m_reader.done()) + { + auto nblocks = m_reader.size(); + if (nblocks != 0) + { + static_cast(m_treeWidget->widget())->clear(true); + + ::profiler::SerializedData serialized_blocks; + ::profiler::SerializedData serialized_descriptors; + ::profiler::descriptors_list_t descriptors; + ::profiler::blocks_t blocks; + ::profiler::thread_blocks_tree_t threads_map; + QString filename; + uint32_t descriptorsNumberInFile = 0; + uint32_t version = 0; + m_reader.get(serialized_blocks, serialized_descriptors, descriptors, blocks, threads_map, descriptorsNumberInFile, version, filename); + + if (threads_map.size() > 0xff) + { + if (m_reader.isFile()) + qWarning() << "Warning: file " << filename << " contains " << threads_map.size() << " threads!"; + else + qWarning() << "Warning: input stream contains " << threads_map.size() << " threads!"; + qWarning() << "Warning: Currently, maximum number of displayed threads is 255! Some threads will not be displayed."; + } + + m_bNetworkFileRegime = !m_reader.isFile(); + if (!m_bNetworkFileRegime) + { + auto index = m_lastFiles.indexOf(filename, 0); + if (index == -1) + { + // This file is totally new. Add it to the list. + addFileToList(filename); + } + else + { + if (index != 0) + { + // This file has been already loaded. Move it to the front. + m_lastFiles.move(index, 0); + auto fileActions = m_loadActionMenu->actions(); + auto action = fileActions.at(index); + m_loadActionMenu->removeAction(action); + m_loadActionMenu->insertAction(fileActions.front(), action); + } + + m_bOpenedCacheFile = filename.contains(NETWORK_CACHE_FILE); + + if (m_bOpenedCacheFile) + setWindowTitle(QString(EASY_DEFAULT_WINDOW_TITLE " - [%1] - UNSAVED network cache file").arg(filename)); + else + setWindowTitle(QString(EASY_DEFAULT_WINDOW_TITLE " - [%1]").arg(filename)); + } + } + else + { + m_bOpenedCacheFile = false; + setWindowTitle(EASY_DEFAULT_WINDOW_TITLE " - UNSAVED network cache"); + } + + m_serializedBlocks = ::std::move(serialized_blocks); + m_serializedDescriptors = ::std::move(serialized_descriptors); + m_descriptorsNumberInFile = descriptorsNumberInFile; + EASY_GLOBALS.selected_thread = 0; + EASY_GLOBALS.version = version; + ::profiler_gui::set_max(EASY_GLOBALS.selected_block); + ::profiler_gui::set_max(EASY_GLOBALS.selected_block_id); + EASY_GLOBALS.profiler_blocks.swap(threads_map); + EASY_GLOBALS.descriptors.swap(descriptors); + + EASY_GLOBALS.gui_blocks.clear(); + EASY_GLOBALS.gui_blocks.resize(nblocks); + memset(EASY_GLOBALS.gui_blocks.data(), 0, sizeof(::profiler_gui::EasyBlock) * nblocks); + for (decltype(nblocks) i = 0; i < nblocks; ++i) { + auto& guiblock = EASY_GLOBALS.gui_blocks[i]; + guiblock.tree = ::std::move(blocks[i]); +#ifdef EASY_TREE_WIDGET__USE_VECTOR + ::profiler_gui::set_max(guiblock.tree_item); +#endif + } + + static_cast(m_graphicsView->widget())->view()->setTree(EASY_GLOBALS.profiler_blocks); + +#if EASY_GUI_USE_DESCRIPTORS_DOCK_WINDOW != 0 + static_cast(m_descTreeWidget->widget())->build(); +#endif + if (m_dialogDescTree != nullptr) + m_dialogDescTree->build(); + + m_saveAction->setEnabled(true); + m_deleteAction->setEnabled(true); + } + else + { + QMessageBox::warning(this, "Warning", QString("Cannot read profiled blocks.\n\nReason:\n%1").arg(m_reader.getError()), QMessageBox::Close); + + if (m_reader.isFile()) + { + auto index = m_lastFiles.indexOf(m_reader.filename(), 0); + if (index >= 0) + { + // Remove unexisting file from list + m_lastFiles.removeAt(index); + auto action = m_loadActionMenu->actions().at(index); + m_loadActionMenu->removeAction(action); + delete action; + } + } + } + + m_reader.interrupt(); + + m_readerTimer.stop(); + destroyProgressDialog(); + + if (EASY_GLOBALS.all_items_expanded_by_default) + { + onExpandAllClicked(true); + } + } + else if (m_progress != nullptr) + { + m_progress->setValue(m_reader.progress()); + } +} + +void EasyMainWindow::onFileReaderCancel() +{ + m_readerTimer.stop(); + m_reader.interrupt(); + destroyProgressDialog(); +} + +////////////////////////////////////////////////////////////////////////// + +EasyFileReader::EasyFileReader() +{ + +} + +EasyFileReader::~EasyFileReader() +{ + interrupt(); +} + +const bool EasyFileReader::isFile() const +{ + return m_isFile; +} + +bool EasyFileReader::done() const +{ + return m_bDone.load(::std::memory_order_acquire); +} + +int EasyFileReader::progress() const +{ + return m_progress.load(::std::memory_order_acquire); +} + +unsigned int EasyFileReader::size() const +{ + return m_size.load(::std::memory_order_acquire); +} + +const QString& EasyFileReader::filename() const +{ + return m_filename; +} + +void EasyFileReader::load(const QString& _filename) +{ + interrupt(); + + m_isFile = true; + m_filename = _filename; + m_thread = ::std::thread([this](bool _enableStatistics) { + m_size.store(fillTreesFromFile(m_progress, m_filename.toStdString().c_str(), m_serializedBlocks, m_serializedDescriptors, + m_descriptors, m_blocks, m_blocksTree, m_descriptorsNumberInFile, m_version, _enableStatistics, m_errorMessage), ::std::memory_order_release); + m_progress.store(100, ::std::memory_order_release); + m_bDone.store(true, ::std::memory_order_release); + }, EASY_GLOBALS.enable_statistics); +} + +void EasyFileReader::load(::std::stringstream& _stream) +{ + interrupt(); + + m_isFile = false; + m_filename.clear(); + +#if defined(__GNUC__) && __GNUC__ < 5 && !defined(__llvm__) + // gcc 4 has a known bug which has been solved in gcc 5: + // std::stringstream has no swap() method :( + // have to copy all contents... Use gcc 5 or higher! +#pragma message "Warning: in gcc 4 and lower std::stringstream has no swap()! Memory consumption may increase! Better use gcc 5 or higher instead." + m_stream.str(_stream.str()); +#else + m_stream.swap(_stream); +#endif + + m_thread = ::std::thread([this](bool _enableStatistics) { + ::std::ofstream cache_file(NETWORK_CACHE_FILE, ::std::fstream::binary); + if (cache_file.is_open()) { + cache_file << m_stream.str(); + cache_file.close(); + } + m_size.store(fillTreesFromStream(m_progress, m_stream, m_serializedBlocks, m_serializedDescriptors, m_descriptors, + m_blocks, m_blocksTree, m_descriptorsNumberInFile, m_version, _enableStatistics, m_errorMessage), ::std::memory_order_release); + m_progress.store(100, ::std::memory_order_release); + m_bDone.store(true, ::std::memory_order_release); + }, EASY_GLOBALS.enable_statistics); +} + +void EasyFileReader::interrupt() +{ + m_progress.store(-100, ::std::memory_order_release); + if (m_thread.joinable()) + m_thread.join(); + + m_bDone.store(false, ::std::memory_order_release); + m_progress.store(0, ::std::memory_order_release); + m_size.store(0, ::std::memory_order_release); + m_serializedBlocks.clear(); + m_serializedDescriptors.clear(); + m_descriptors.clear(); + m_blocks.clear(); + m_blocksTree.clear(); + m_descriptorsNumberInFile = 0; + m_version = 0; + + clear_stream(m_stream); + clear_stream(m_errorMessage); +} + +void EasyFileReader::get(::profiler::SerializedData& _serializedBlocks, ::profiler::SerializedData& _serializedDescriptors, + ::profiler::descriptors_list_t& _descriptors, ::profiler::blocks_t& _blocks, + ::profiler::thread_blocks_tree_t& _tree, uint32_t& _descriptorsNumberInFile, uint32_t& _version, QString& _filename) +{ + if (done()) + { + m_serializedBlocks.swap(_serializedBlocks); + m_serializedDescriptors.swap(_serializedDescriptors); + ::profiler::descriptors_list_t(::std::move(m_descriptors)).swap(_descriptors); + m_blocks.swap(_blocks); + m_blocksTree.swap(_tree); + m_filename.swap(_filename); + _descriptorsNumberInFile = m_descriptorsNumberInFile; + _version = m_version; + } +} + +QString EasyFileReader::getError() +{ + return QString(m_errorMessage.str().c_str()); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onEventTracingPriorityChange(bool _checked) +{ + if (EASY_GLOBALS.connected) + m_listener.send(profiler::net::BoolMessage(profiler::net::MessageType::Change_Event_Tracing_Priority, _checked)); +} + +void EasyMainWindow::onEventTracingEnableChange(bool _checked) +{ + if (EASY_GLOBALS.connected) + m_listener.send(profiler::net::BoolMessage(profiler::net::MessageType::Change_Event_Tracing_Status, _checked)); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onFrameTimeEditFinish() +{ + auto text = m_frameTimeEdit->text(); + if (text.contains(QChar(','))) + { + text.remove(QChar('.')).replace(QChar(','), QChar('.')); + m_frameTimeEdit->setText(text); + } + + EASY_GLOBALS.frame_time = text.toFloat() * 1e3f; + + disconnect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::expectedFrameTimeChanged, + this, &This::onFrameTimeChanged); + + emit EASY_GLOBALS.events.expectedFrameTimeChanged(); + + connect(&EASY_GLOBALS.events, &::profiler_gui::EasyGlobalSignals::expectedFrameTimeChanged, + this, &This::onFrameTimeChanged); +} + +void EasyMainWindow::onFrameTimeChanged() +{ + m_frameTimeEdit->setText(QString::number(EASY_GLOBALS.frame_time * 1e-3)); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onConnectClicked(bool) +{ + if (EASY_GLOBALS.connected) + { + // Disconnect if already connected + m_listener.disconnect(); + setDisconnected(false); + return; + } + + QString address = m_addressEdit->text(); + const decltype(m_lastPort) port = m_portEdit->text().toUShort(); + + const bool isSameAddress = (EASY_GLOBALS.connected && m_listener.port() == port && + address.toStdString() == m_listener.address()); + + profiler::net::EasyProfilerStatus reply(false, false, false); + if (!m_listener.connect(address.toStdString().c_str(), port, reply)) + { + QMessageBox::warning(this, "Warning", QString("Cannot connect to %1").arg(address), QMessageBox::Close); + if (EASY_GLOBALS.connected) + { + m_listener.closeSocket(); + setDisconnected(false); + } + + if (!isSameAddress) + { + m_lastAddress = ::std::move(address); + m_lastPort = port; + } + + return; + } + + m_lastAddress = ::std::move(address); + m_lastPort = port; + + qInfo() << "Connected successfully"; + EASY_GLOBALS.connected = true; + m_captureAction->setEnabled(true); + m_connectAction->setIcon(QIcon(imagePath("connected"))); + m_connectAction->setText(tr("Disconnect")); + + if (m_fpsViewer->isVisible()) + static_cast(m_fpsViewer->widget())->clear(); + + if (!m_fpsRequestTimer.isActive()) + m_fpsRequestTimer.start(EASY_GLOBALS.fps_timer_interval); + + disconnect(m_eventTracingEnableAction, &QAction::triggered, this, &This::onEventTracingEnableChange); + disconnect(m_eventTracingPriorityAction, &QAction::triggered, this, &This::onEventTracingPriorityChange); + + m_eventTracingEnableAction->setEnabled(true); + m_eventTracingPriorityAction->setEnabled(true); + + m_eventTracingEnableAction->setChecked(reply.isEventTracingEnabled); + m_eventTracingPriorityAction->setChecked(reply.isLowPriorityEventTracing); + + connect(m_eventTracingEnableAction, &QAction::triggered, this, &This::onEventTracingEnableChange); + connect(m_eventTracingPriorityAction, &QAction::triggered, this, &This::onEventTracingPriorityChange); + + m_addressEdit->setEnabled(false); + m_portEdit->setEnabled(false); + + emit EASY_GLOBALS.events.connectionChanged(true); + + if (reply.isProfilerEnabled) + { + // Connected application is already profiling. + // Show capture dialog immediately + onCaptureClicked(true); + } +} + +void EasyMainWindow::onCaptureClicked(bool) +{ + if (!EASY_GLOBALS.connected) + { + QMessageBox::warning(this, "Warning", "No connection with profiling app", QMessageBox::Close); + return; + } + + if (m_listener.regime() != LISTENER_IDLE) + { + if (m_listener.regime() == LISTENER_CAPTURE || m_listener.regime() == LISTENER_CAPTURE_RECEIVE) + QMessageBox::warning(this, "Warning", "Already capturing frames.\nFinish old capturing session first.", QMessageBox::Close); + else + QMessageBox::warning(this, "Warning", "Capturing blocks description.\nFinish old capturing session first.", QMessageBox::Close); + return; + } + + if (!m_listener.startCapture()) + { + // Connection lost. Try to restore connection. + + profiler::net::EasyProfilerStatus reply(false, false, false); + if (!m_listener.connect(m_lastAddress.toStdString().c_str(), m_lastPort, reply)) + { + m_listener.closeSocket(); + setDisconnected(); + return; + } + + if (!m_listener.startCapture()) + { + m_listener.closeSocket(); + setDisconnected(); + return; + } + } + + m_listenerTimer.start(250); + + m_listenerDialog = new QMessageBox(QMessageBox::Information, "Capturing frames...", "Close this dialog to stop capturing.", QMessageBox::NoButton, this); + + auto button = new QToolButton(m_listenerDialog); + button->setAutoRaise(true); + button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + button->setIconSize(::profiler_gui::ICONS_SIZE); + button->setIcon(QIcon(imagePath("stop"))); + button->setText("Stop"); + m_listenerDialog->addButton(button, QMessageBox::AcceptRole); + + m_listenerDialog->setAttribute(Qt::WA_DeleteOnClose, true); + connect(m_listenerDialog, &QDialog::finished, this, &This::onListenerDialogClose); + m_listenerDialog->show(); +} + +void EasyMainWindow::onGetBlockDescriptionsClicked(bool) +{ + if (!EASY_GLOBALS.connected) + { + QMessageBox::warning(this, "Warning", "No connection with profiling app", QMessageBox::Close); + return; + } + + if (m_listener.regime() != LISTENER_IDLE) + { + if (m_listener.regime() == LISTENER_DESCRIBE) + QMessageBox::warning(this, "Warning", "Already capturing blocks description.\nFinish old capturing session first.", QMessageBox::Close); + else + QMessageBox::warning(this, "Warning", "Already capturing frames.\nFinish old capturing session first.", QMessageBox::Close); + return; + } + + m_listenerDialog = new QMessageBox(QMessageBox::Information, "Waiting for blocks...", "This may take some time.", QMessageBox::NoButton, this); + m_listenerDialog->setAttribute(Qt::WA_DeleteOnClose, true); + m_listenerDialog->show(); + + m_listener.requestBlocksDescription(); + + m_listenerDialog->reject(); + m_listenerDialog = nullptr; + + if (m_listener.size() != 0) + { + // Read descriptions from stream + + decltype(EASY_GLOBALS.descriptors) descriptors; + decltype(m_serializedDescriptors) serializedDescriptors; + ::std::stringstream errorMessage; + if (readDescriptionsFromStream(m_listener.data(), serializedDescriptors, descriptors, errorMessage)) + { + // Merge old and new descriptions + + bool cancel = false; + const bool doFlush = m_descriptorsNumberInFile > descriptors.size(); + if (doFlush && !m_serializedBlocks.empty()) + { + auto button = QMessageBox::question(this, "Information", + QString("New blocks description number = %1\nis less than the old one = %2.\nTo avoid possible conflicts\nall profiled data will be deleted.\nContinue?") + .arg(descriptors.size()) + .arg(m_descriptorsNumberInFile), + QMessageBox::Yes, QMessageBox::No); + + if (button == QMessageBox::Yes) + clear(); // Clear all contents because new descriptors list conflicts with old one + else + cancel = true; + } + + if (!cancel) + { + if (!doFlush && m_descriptorsNumberInFile < EASY_GLOBALS.descriptors.size()) + { + // There are dynamically added descriptors, add them to the new list too + + auto newnumber = static_cast(descriptors.size()); + auto size = static_cast(EASY_GLOBALS.descriptors.size()); + auto diff = newnumber - size; + decltype(newnumber) failnumber = 0; + + descriptors.reserve(descriptors.size() + EASY_GLOBALS.descriptors.size() - m_descriptorsNumberInFile); + for (auto i = m_descriptorsNumberInFile; i < size; ++i) + { + auto id = EASY_GLOBALS.descriptors[i]->id(); + if (id < newnumber) + descriptors.push_back(descriptors[id]); + else + ++failnumber; + } + + if (failnumber != 0) + { + // There are some errors... + + // revert changes + descriptors.resize(newnumber); + + // clear all profiled data to avoid conflicts + auto button = QMessageBox::question(this, "Information", + "There are errors while merging block descriptions lists.\nTo avoid possible conflicts\nall profiled data will be deleted.\nContinue?", + QMessageBox::Yes, QMessageBox::No); + + if (button == QMessageBox::Yes) + clear(); // Clear all contents because new descriptors list conflicts with old one + else + cancel = true; + } + + if (!cancel && diff != 0) + { + for (auto& b : EASY_GLOBALS.gui_blocks) + { + if (b.tree.node->id() >= m_descriptorsNumberInFile) + b.tree.node->setId(b.tree.node->id() + diff); + } + + m_descriptorsNumberInFile = newnumber; + } + } + + if (!cancel) + { + EASY_GLOBALS.descriptors.swap(descriptors); + m_serializedDescriptors.swap(serializedDescriptors); + m_descriptorsNumberInFile = static_cast(EASY_GLOBALS.descriptors.size()); + + if (m_descTreeDialog != nullptr) + { +#if EASY_GUI_USE_DESCRIPTORS_DOCK_WINDOW != 0 + static_cast(m_descTreeWidget->widget())->build(); +#endif + m_dialogDescTree->build(); + m_descTreeDialog->raise(); + } + else + { + onEditBlocksClicked(true); + } + } + } + } + else + { + QMessageBox::warning(this, "Warning", QString("Cannot read blocks description from stream.\n\nReason:\n%1").arg(errorMessage.str().c_str()), QMessageBox::Close); + } + + m_listener.clearData(); + } + + if (!m_listener.connected()) + { + m_listener.closeSocket(); + setDisconnected(); + } +} + +////////////////////////////////////////////////////////////////////////// + +void EasyMainWindow::onBlockStatusChange(::profiler::block_id_t _id, ::profiler::EasyBlockStatus _status) +{ + if (EASY_GLOBALS.connected) + m_listener.send(profiler::net::BlockStatusMessage(_id, static_cast(_status))); +} + +////////////////////////////////////////////////////////////////////////// + +EasySocketListener::EasySocketListener() : m_receivedSize(0), m_port(0), m_regime(LISTENER_IDLE) +{ + m_bInterrupt = ATOMIC_VAR_INIT(false); + m_bConnected = ATOMIC_VAR_INIT(false); + m_bStopReceive = ATOMIC_VAR_INIT(false); + m_bFrameTimeReady = ATOMIC_VAR_INIT(false); + m_bCaptureReady = ATOMIC_VAR_INIT(false); + m_frameMax = ATOMIC_VAR_INIT(0); + m_frameAvg = ATOMIC_VAR_INIT(0); +} + +EasySocketListener::~EasySocketListener() +{ + m_bInterrupt.store(true, ::std::memory_order_release); + if (m_thread.joinable()) + m_thread.join(); +} + +bool EasySocketListener::connected() const +{ + return m_bConnected.load(::std::memory_order_acquire); +} + +bool EasySocketListener::captured() const +{ + return m_bCaptureReady.load(::std::memory_order_acquire); +} + +EasyListenerRegime EasySocketListener::regime() const +{ + return m_regime; +} + +uint64_t EasySocketListener::size() const +{ + return m_receivedSize; +} + +::std::stringstream& EasySocketListener::data() +{ + return m_receivedData; +} + +const ::std::string& EasySocketListener::address() const +{ + return m_address; +} + +uint16_t EasySocketListener::port() const +{ + return m_port; +} + +void EasySocketListener::clearData() +{ + clear_stream(m_receivedData); + m_receivedSize = 0; +} + +void EasySocketListener::disconnect() +{ + if (connected()) + { + m_bInterrupt.store(true, ::std::memory_order_release); + if (m_thread.joinable()) + m_thread.join(); + + m_bConnected.store(false, ::std::memory_order_release); + m_bInterrupt.store(false, ::std::memory_order_release); + m_bCaptureReady.store(false, ::std::memory_order_release); + m_bStopReceive.store(false, ::std::memory_order_release); + } + + m_address.clear(); + m_port = 0; + + closeSocket(); +} + +void EasySocketListener::closeSocket() +{ + m_easySocket.flush(); + m_easySocket.init(); +} + +bool EasySocketListener::connect(const char* _ipaddress, uint16_t _port, profiler::net::EasyProfilerStatus& _reply, bool _disconnectFirst) +{ + if (connected()) + { + m_bInterrupt.store(true, ::std::memory_order_release); + if (m_thread.joinable()) + m_thread.join(); + + m_bConnected.store(false, ::std::memory_order_release); + m_bInterrupt.store(false, ::std::memory_order_release); + m_bCaptureReady.store(false, ::std::memory_order_release); + m_bStopReceive.store(false, ::std::memory_order_release); + } + + m_address.clear(); + m_port = 0; + + if (_disconnectFirst) + closeSocket(); + + int res = m_easySocket.setAddress(_ipaddress, _port); + res = m_easySocket.connect(); + + const bool isConnected = res == 0; + if (isConnected) + { + static const size_t buffer_size = sizeof(profiler::net::EasyProfilerStatus) << 1; + char buffer[buffer_size] = {}; + int bytes = 0; + + while (true) + { + bytes = m_easySocket.receive(buffer, buffer_size); + + if (bytes == -1) + { + if (m_easySocket.isDisconnected()) + return false; + bytes = 0; + continue; + } + + break; + } + + if (bytes == 0) + { + m_address = _ipaddress; + m_port = _port; + m_bConnected.store(isConnected, ::std::memory_order_release); + return isConnected; + } + + size_t seek = bytes; + while (seek < sizeof(profiler::net::EasyProfilerStatus)) + { + bytes = m_easySocket.receive(buffer + seek, buffer_size - seek); + + if (bytes == -1) + { + if (m_easySocket.isDisconnected()) + return false; + break; + } + + seek += bytes; + } + + auto message = reinterpret_cast(buffer); + if (message->isEasyNetMessage() && message->type == profiler::net::MessageType::Connection_Accepted) + _reply = *message; + + m_address = _ipaddress; + m_port = _port; + } + + m_bConnected.store(isConnected, ::std::memory_order_release); + return isConnected; +} + +bool EasySocketListener::reconnect(const char* _ipaddress, uint16_t _port, ::profiler::net::EasyProfilerStatus& _reply) +{ + return connect(_ipaddress, _port, _reply, true); +} + +bool EasySocketListener::startCapture() +{ + //if (m_thread.joinable()) + //{ + // m_bInterrupt.store(true, ::std::memory_order_release); + // m_thread.join(); + // m_bInterrupt.store(false, ::std::memory_order_release); + //} + + clearData(); + + profiler::net::Message request(profiler::net::MessageType::Request_Start_Capture); + m_easySocket.send(&request, sizeof(request)); + + if (m_easySocket.isDisconnected()) { + m_bConnected.store(false, ::std::memory_order_release); + return false; + } + + m_regime = LISTENER_CAPTURE; + m_bCaptureReady.store(false, ::std::memory_order_release); + //m_thread = ::std::thread(&EasySocketListener::listenCapture, this); + + return true; +} + +void EasySocketListener::stopCapture() +{ + //if (!m_thread.joinable() || m_regime != LISTENER_CAPTURE) + // return; + + if (m_regime != LISTENER_CAPTURE) + return; + + //m_bStopReceive.store(true, ::std::memory_order_release); + profiler::net::Message request(profiler::net::MessageType::Request_Stop_Capture); + m_easySocket.send(&request, sizeof(request)); + + //m_thread.join(); + + if (m_easySocket.isDisconnected()) { + m_bConnected.store(false, ::std::memory_order_release); + m_bStopReceive.store(false, ::std::memory_order_release); + m_regime = LISTENER_IDLE; + m_bCaptureReady.store(true, ::std::memory_order_release); + return; + } + + m_regime = LISTENER_CAPTURE_RECEIVE; + if (m_thread.joinable()) + { + m_bInterrupt.store(true, ::std::memory_order_release); + m_thread.join(); + m_bInterrupt.store(false, ::std::memory_order_release); + } + + m_thread = ::std::thread(&EasySocketListener::listenCapture, this); + + //m_regime = LISTENER_IDLE; + //m_bStopReceive.store(false, ::std::memory_order_release); +} + +void EasySocketListener::finalizeCapture() +{ + if (m_thread.joinable()) + { + m_bInterrupt.store(true, ::std::memory_order_release); + m_thread.join(); + m_bInterrupt.store(false, ::std::memory_order_release); + } + + m_regime = LISTENER_IDLE; + m_bCaptureReady.store(false, ::std::memory_order_release); + m_bStopReceive.store(false, ::std::memory_order_release); +} + +void EasySocketListener::requestBlocksDescription() +{ + if (m_thread.joinable()) + { + m_bInterrupt.store(true, ::std::memory_order_release); + m_thread.join(); + m_bInterrupt.store(false, ::std::memory_order_release); + } + + clearData(); + + profiler::net::Message request(profiler::net::MessageType::Request_Blocks_Description); + m_easySocket.send(&request, sizeof(request)); + + if(m_easySocket.isDisconnected() ){ + m_bConnected.store(false, ::std::memory_order_release); + } + + m_regime = LISTENER_DESCRIBE; + listenDescription(); + m_regime = LISTENER_IDLE; +} + +bool EasySocketListener::frameTime(uint32_t& _maxTime, uint32_t& _avgTime) +{ + if (m_bFrameTimeReady.exchange(false, ::std::memory_order_acquire)) + { + _maxTime = m_frameMax.load(::std::memory_order_acquire); + _avgTime = m_frameAvg.load(::std::memory_order_acquire); + return true; + } + + return false; +} + +bool EasySocketListener::requestFrameTime() +{ + if (m_regime != LISTENER_IDLE && m_regime != LISTENER_CAPTURE) + return false; + + if (m_thread.joinable()) + { + m_bInterrupt.store(true, ::std::memory_order_release); + m_thread.join(); + m_bInterrupt.store(false, ::std::memory_order_release); + } + + profiler::net::Message request(profiler::net::MessageType::Request_MainThread_FPS); + m_easySocket.send(&request, sizeof(request)); + + if (m_easySocket.isDisconnected()) + { + m_bConnected.store(false, ::std::memory_order_release); + return false; + } + + m_bFrameTimeReady.store(false, ::std::memory_order_release); + m_thread = ::std::thread(&EasySocketListener::listenFrameTime, this); + + return true; +} + +////////////////////////////////////////////////////////////////////////// + +void EasySocketListener::listenCapture() +{ + EASY_STATIC_CONSTEXPR int buffer_size = 8 * 1024 * 1024; + + char* buffer = new char[buffer_size]; + int seek = 0, bytes = 0; + auto timeBegin = ::std::chrono::system_clock::now(); + + bool isListen = true, disconnected = false; + while (isListen && !m_bInterrupt.load(::std::memory_order_acquire)) + { + if (m_bStopReceive.load(::std::memory_order_acquire)) + { + profiler::net::Message request(profiler::net::MessageType::Request_Stop_Capture); + m_easySocket.send(&request, sizeof(request)); + m_bStopReceive.store(false, ::std::memory_order_release); + } + + if ((bytes - seek) == 0) + { + bytes = m_easySocket.receive(buffer, buffer_size); + + if (bytes == -1) + { + if (m_easySocket.isDisconnected()) + { + m_bConnected.store(false, ::std::memory_order_release); + isListen = false; + disconnected = true; + } + + seek = 0; + bytes = 0; + + continue; + } + + seek = 0; + } + + if (bytes == 0) + { + isListen = false; + break; + } + + char* buf = buffer + seek; + + if (bytes > 0) + { + auto message = reinterpret_cast(buf); + if (!message->isEasyNetMessage()) + continue; + + switch (message->type) + { + case profiler::net::MessageType::Connection_Accepted: + { + qInfo() << "Receive MessageType::Connection_Accepted"; + //m_easySocket.send(&request, sizeof(request)); + seek += sizeof(profiler::net::Message); + break; + } + + case profiler::net::MessageType::Reply_Capturing_Started: + { + qInfo() << "Receive MessageType::Reply_Capturing_Started"; + seek += sizeof(profiler::net::Message); + break; + } + + case profiler::net::MessageType::Reply_Blocks_End: + { + qInfo() << "Receive MessageType::Reply_Blocks_End"; + seek += sizeof(profiler::net::Message); + + const auto dt = ::std::chrono::duration_cast(::std::chrono::system_clock::now() - timeBegin); + const auto bytesNumber = m_receivedData.str().size(); + qInfo() << "recieved " << bytesNumber << " bytes, " << dt.count() << " ms, average speed = " << double(bytesNumber) * 1e3 / double(dt.count()) / 1024. << " kBytes/sec"; + + seek = 0; + bytes = 0; + + isListen = false; + + break; + } + + case profiler::net::MessageType::Reply_Blocks: + { + qInfo() << "Receive MessageType::Reply_Blocks"; + + seek += sizeof(profiler::net::DataMessage); + auto dm = (profiler::net::DataMessage*)message; + timeBegin = std::chrono::system_clock::now(); + + int neededSize = dm->size; + + + buf = buffer + seek; + auto bytesNumber = ::std::min((int)dm->size, bytes - seek); + m_receivedSize += bytesNumber; + m_receivedData.write(buf, bytesNumber); + neededSize -= bytesNumber; + + if (neededSize == 0) + seek += bytesNumber; + else + { + seek = 0; + bytes = 0; + } + + + int loaded = 0; + while (neededSize > 0) + { + bytes = m_easySocket.receive(buffer, buffer_size); + + if (bytes == -1) + { + if (m_easySocket.isDisconnected()) + { + m_bConnected.store(false, ::std::memory_order_release); + isListen = false; + disconnected = true; + neededSize = 0; + } + + break; + } + + buf = buffer; + int toWrite = ::std::min(bytes, neededSize); + m_receivedSize += toWrite; + m_receivedData.write(buf, toWrite); + neededSize -= toWrite; + loaded += toWrite; + seek = toWrite; + } + + if (m_bStopReceive.load(::std::memory_order_acquire)) + { + profiler::net::Message request(profiler::net::MessageType::Request_Stop_Capture); + m_easySocket.send(&request, sizeof(request)); + m_bStopReceive.store(false, ::std::memory_order_release); + } + + break; + } + + default: + //qInfo() << "Receive unknown " << message->type; + break; + } + } + } + + if (disconnected) + clearData(); + + delete [] buffer; + + m_bCaptureReady.store(true, ::std::memory_order_release); +} + +void EasySocketListener::listenDescription() +{ + EASY_STATIC_CONSTEXPR int buffer_size = 8 * 1024 * 1024; + + char* buffer = new char[buffer_size]; + int seek = 0, bytes = 0; + + bool isListen = true, disconnected = false; + while (isListen && !m_bInterrupt.load(::std::memory_order_acquire)) + { + if ((bytes - seek) == 0) + { + bytes = m_easySocket.receive(buffer, buffer_size); + + if (bytes == -1) + { + if (m_easySocket.isDisconnected()) + { + m_bConnected.store(false, ::std::memory_order_release); + isListen = false; + disconnected = true; + } + + seek = 0; + bytes = 0; + + continue; + } + + seek = 0; + } + + if (bytes == 0) + { + isListen = false; + break; + } + + char* buf = buffer + seek; + + if (bytes > 0) + { + auto message = reinterpret_cast(buf); + if (!message->isEasyNetMessage()) + continue; + + switch (message->type) + { + case profiler::net::MessageType::Connection_Accepted: + { + qInfo() << "Receive MessageType::Connection_Accepted"; + seek += sizeof(profiler::net::Message); + break; + } + + case profiler::net::MessageType::Reply_Blocks_Description_End: + { + qInfo() << "Receive MessageType::Reply_Blocks_Description_End"; + seek += sizeof(profiler::net::Message); + + seek = 0; + bytes = 0; + + isListen = false; + + break; + } + + case profiler::net::MessageType::Reply_Blocks_Description: + { + qInfo() << "Receive MessageType::Reply_Blocks_Description"; + + seek += sizeof(profiler::net::DataMessage); + auto dm = (profiler::net::DataMessage*)message; + int neededSize = dm->size; + + buf = buffer + seek; + auto bytesNumber = ::std::min((int)dm->size, bytes - seek); + m_receivedSize += bytesNumber; + m_receivedData.write(buf, bytesNumber); + neededSize -= bytesNumber; + + if (neededSize == 0) + seek += bytesNumber; + else{ + seek = 0; + bytes = 0; + } + + int loaded = 0; + while (neededSize > 0) + { + bytes = m_easySocket.receive(buffer, buffer_size); + + if (bytes == -1) + { + if (m_easySocket.isDisconnected()) + { + m_bConnected.store(false, ::std::memory_order_release); + isListen = false; + disconnected = true; + neededSize = 0; + } + + break; + } + + buf = buffer; + int toWrite = ::std::min(bytes, neededSize); + m_receivedSize += toWrite; + m_receivedData.write(buf, toWrite); + neededSize -= toWrite; + loaded += toWrite; + seek = toWrite; + } + + break; + } + + default: + break; + } + } + } + + if (disconnected) + clearData(); + + delete[] buffer; +} + +void EasySocketListener::listenFrameTime() +{ + EASY_STATIC_CONSTEXPR size_t buffer_size = sizeof(::profiler::net::TimestampMessage) << 2; + + char buffer[buffer_size] = {}; + int seek = 0, bytes = 0; + + bool isListen = true; + while (isListen && !m_bInterrupt.load(::std::memory_order_acquire)) + { + if ((bytes - seek) == 0) + { + bytes = m_easySocket.receive(buffer, buffer_size); + + if (bytes == -1) + { + if (m_easySocket.isDisconnected()) + { + m_bConnected.store(false, ::std::memory_order_release); + isListen = false; + } + + seek = 0; + bytes = 0; + + continue; + } + + seek = 0; + } + + if (bytes == 0) + { + isListen = false; + break; + } + + char* buf = buffer + seek; + + if (bytes > 0) + { + auto message = reinterpret_cast(buf); + if (!message->isEasyNetMessage()) + continue; + + switch (message->type) + { + case profiler::net::MessageType::Connection_Accepted: + case profiler::net::MessageType::Reply_Capturing_Started: + { + seek += sizeof(profiler::net::Message); + break; + } + + case profiler::net::MessageType::Reply_MainThread_FPS: + { + //qInfo() << "Receive MessageType::Reply_MainThread_FPS"; + + seek += sizeof(profiler::net::TimestampMessage); + if (seek <= buffer_size) + { + auto timestampMessage = (profiler::net::TimestampMessage*)message; + m_frameMax.store(timestampMessage->maxValue, ::std::memory_order_release); + m_frameAvg.store(timestampMessage->avgValue, ::std::memory_order_release); + m_bFrameTimeReady.store(true, ::std::memory_order_release); + } + + isListen = false; + break; + } + + default: + break; + } + } + } +} + +////////////////////////////////////////////////////////////////////////// + diff --git a/3rdparty/easyprofiler/profiler_gui/main_window.h b/3rdparty/easyprofiler/profiler_gui/main_window.h new file mode 100644 index 0000000..474b972 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/main_window.h @@ -0,0 +1,335 @@ +/************************************************************************ +* file name : main_window.h +* ----------------- : +* creation time : 2016/06/26 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of MainWindow for easy_profiler GUI. +* ----------------- : +* change log : * 2016/06/26 Victor Zarubkin: initial commit. +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_PROFILER_GUI__MAIN_WINDOW__H +#define EASY_PROFILER_GUI__MAIN_WINDOW__H + +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +////////////////////////////////////////////////////////////////////////// + +#define EASY_GUI_USE_DESCRIPTORS_DOCK_WINDOW 0 + +namespace profiler { namespace net { struct EasyProfilerStatus; } } + +////////////////////////////////////////////////////////////////////////// + +class EasyFileReader Q_DECL_FINAL +{ + ::profiler::SerializedData m_serializedBlocks; ///< + ::profiler::SerializedData m_serializedDescriptors; ///< + ::profiler::descriptors_list_t m_descriptors; ///< + ::profiler::blocks_t m_blocks; ///< + ::profiler::thread_blocks_tree_t m_blocksTree; ///< + ::std::stringstream m_stream; ///< + ::std::stringstream m_errorMessage; ///< + QString m_filename; ///< + uint32_t m_descriptorsNumberInFile = 0; ///< + uint32_t m_version = 0; ///< + ::std::thread m_thread; ///< + ::std::atomic_bool m_bDone; ///< + ::std::atomic m_progress; ///< + ::std::atomic m_size; ///< + bool m_isFile = false; ///< + +public: + + EasyFileReader(); + ~EasyFileReader(); + + const bool isFile() const; + bool done() const; + int progress() const; + unsigned int size() const; + const QString& filename() const; + + void load(const QString& _filename); + void load(::std::stringstream& _stream); + void interrupt(); + void get(::profiler::SerializedData& _serializedBlocks, ::profiler::SerializedData& _serializedDescriptors, + ::profiler::descriptors_list_t& _descriptors, ::profiler::blocks_t& _blocks, ::profiler::thread_blocks_tree_t& _tree, + uint32_t& _descriptorsNumberInFile, uint32_t& _version, QString& _filename); + + QString getError(); + +}; // END of class EasyFileReader. + +////////////////////////////////////////////////////////////////////////// + +enum EasyListenerRegime : uint8_t +{ + LISTENER_IDLE = 0, + LISTENER_CAPTURE, + LISTENER_CAPTURE_RECEIVE, + LISTENER_DESCRIBE +}; + +class EasySocketListener Q_DECL_FINAL +{ + EasySocket m_easySocket; ///< + ::std::string m_address; ///< + ::std::stringstream m_receivedData; ///< + ::std::thread m_thread; ///< + uint64_t m_receivedSize; ///< + uint16_t m_port; ///< + ::std::atomic m_frameMax; ///< + ::std::atomic m_frameAvg; ///< + ::std::atomic_bool m_bInterrupt; ///< + ::std::atomic_bool m_bConnected; ///< + ::std::atomic_bool m_bStopReceive; ///< + ::std::atomic_bool m_bCaptureReady; ///< + ::std::atomic_bool m_bFrameTimeReady; ///< + EasyListenerRegime m_regime; ///< + +public: + + EasySocketListener(); + ~EasySocketListener(); + + bool connected() const; + bool captured() const; + EasyListenerRegime regime() const; + uint64_t size() const; + const ::std::string& address() const; + uint16_t port() const; + + ::std::stringstream& data(); + void clearData(); + + void disconnect(); + void closeSocket(); + bool connect(const char* _ipaddress, uint16_t _port, ::profiler::net::EasyProfilerStatus& _reply, bool _disconnectFirst = false); + bool reconnect(const char* _ipaddress, uint16_t _port, ::profiler::net::EasyProfilerStatus& _reply); + + bool startCapture(); + void stopCapture(); + void finalizeCapture(); + void requestBlocksDescription(); + + bool frameTime(uint32_t& _maxTime, uint32_t& _avgTime); + bool requestFrameTime(); + + template + inline void send(const T& _message) + { + m_easySocket.send(&_message, sizeof(T)); + } + +private: + + void listenCapture(); + void listenDescription(); + void listenFrameTime(); + +}; // END of class EasySocketListener. + +////////////////////////////////////////////////////////////////////////// + +class EasyDockWidget : public QDockWidget +{ + Q_OBJECT +public: + explicit EasyDockWidget(const QString& title, QWidget* parent = nullptr); + ~EasyDockWidget() override; +}; + +class EasyMainWindow : public QMainWindow +{ + Q_OBJECT + +protected: + + typedef EasyMainWindow This; + typedef QMainWindow Parent; + + QStringList m_lastFiles; + QString m_theme; + QString m_lastAddress; + QDockWidget* m_treeWidget = nullptr; + QDockWidget* m_graphicsView = nullptr; + QDockWidget* m_fpsViewer = nullptr; + +#if EASY_GUI_USE_DESCRIPTORS_DOCK_WINDOW != 0 + QDockWidget* m_descTreeWidget = nullptr; +#endif + + class QProgressDialog* m_progress = nullptr; + class QDialog* m_descTreeDialog = nullptr; + class EasyDescWidget* m_dialogDescTree = nullptr; + class QMessageBox* m_listenerDialog = nullptr; + QTimer m_readerTimer; + QTimer m_listenerTimer; + QTimer m_fpsRequestTimer; + ::profiler::SerializedData m_serializedBlocks; + ::profiler::SerializedData m_serializedDescriptors; + EasyFileReader m_reader; + EasySocketListener m_listener; + + class QLineEdit* m_addressEdit = nullptr; + class QLineEdit* m_portEdit = nullptr; + class QLineEdit* m_frameTimeEdit = nullptr; + + class QMenu* m_loadActionMenu = nullptr; + class QAction* m_saveAction = nullptr; + class QAction* m_deleteAction = nullptr; + + class QAction* m_captureAction = nullptr; + class QAction* m_connectAction = nullptr; + class QAction* m_eventTracingEnableAction = nullptr; + class QAction* m_eventTracingPriorityAction = nullptr; + + uint32_t m_descriptorsNumberInFile = 0; + uint16_t m_lastPort = 0; + bool m_bNetworkFileRegime = false; + bool m_bOpenedCacheFile = false; + +public: + + explicit EasyMainWindow(); + ~EasyMainWindow() override; + + // Public virtual methods + + void closeEvent(QCloseEvent* close_event) override; + void dragEnterEvent(QDragEnterEvent* drag_event) override; + void dragMoveEvent(QDragMoveEvent* drag_event) override; + void dragLeaveEvent(QDragLeaveEvent* drag_event) override; + void dropEvent(QDropEvent* drop_event) override; + +protected slots: + + void onThemeChange(bool); + void onOpenFileClicked(bool); + void onSaveFileClicked(bool); + void onDeleteClicked(bool); + void onExitClicked(bool); + void onEncodingChanged(bool); + void onChronoTextPosChanged(bool); + void onUnitsChanged(bool); + void onEnableDisableStatistics(bool); + void onCollapseItemsAfterCloseChanged(bool); + void onAllItemsExpandedByDefaultChange(bool); + void onBindExpandStatusChange(bool); + void onHierarchyFlagChange(bool); + void onExpandAllClicked(bool); + void onCollapseAllClicked(bool); + void onSpacingChange(int _value); + void onMinSizeChange(int _value); + void onNarrowSizeChange(int _value); + void onFpsIntervalChange(int _value); + void onFpsHistoryChange(int _value); + void onFpsMonitorLineWidthChange(int _value); + void onFileReaderTimeout(); + void onFrameTimeRequestTimeout(); + void onListenerTimerTimeout(); + void onFileReaderCancel(); + void onEditBlocksClicked(bool); + void onDescTreeDialogClose(int); + void onListenerDialogClose(int); + void onCaptureClicked(bool); + void onGetBlockDescriptionsClicked(bool); + void onConnectClicked(bool); + void onEventTracingPriorityChange(bool _checked); + void onEventTracingEnableChange(bool _checked); + void onFrameTimeEditFinish(); + void onFrameTimeChanged(); + + void onBlockStatusChange(::profiler::block_id_t _id, ::profiler::EasyBlockStatus _status); + + void checkFrameTimeReady(); + +private: + + // Private non-virtual methods + + void clear(); + + void refreshDiagram(); + + void addFileToList(const QString& filename); + void loadFile(const QString& filename); + void readStream(::std::stringstream& data); + + void loadSettings(); + void loadGeometry(); + void saveSettingsAndGeometry(); + + void setDisconnected(bool _showMessage = true); + + void destroyProgressDialog(); + void createProgressDialog(const QString& text); + +}; // END of class EasyMainWindow. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_PROFILER_GUI__MAIN_WINDOW__H diff --git a/3rdparty/easyprofiler/profiler_gui/resources.qrc b/3rdparty/easyprofiler/profiler_gui/resources.qrc new file mode 100644 index 0000000..74dffc4 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/resources.qrc @@ -0,0 +1,51 @@ + + + themes/default.css + + + images/logo.svg + + + images/default/off.svg + images/default/open-folder2.svg + images/default/reload-folder2.svg + images/default/reload.svg + images/default/expand.svg + images/default/collapse.svg + images/default/save.svg + images/default/statistics.svg + images/default/statistics2.svg + images/default/lan.svg + images/default/lan_on.svg + images/default/wifi.svg + images/default/wifi_on.svg + images/default/lan.svg + images/default/lan_on.svg + images/default/play.svg + images/default/stop.svg + images/default/delete.svg + images/default/list.svg + images/default/search-next.svg + images/default/search-prev.svg + images/default/settings.svg + images/default/check.svg + images/default/check-disabled.svg + images/default/radio-indicator.svg + images/default/radio-indicator-disabled.svg + images/default/maximize-white.svg + images/default/maximize-white-hover.svg + images/default/maximize-white-pressed.svg + images/default/minimize-white.svg + images/default/minimize-white-hover.svg + images/default/minimize-white-pressed.svg + images/default/close-white.svg + images/default/close-white-hover.svg + images/default/close-white-pressed.svg + images/default/arrow-up.svg + images/default/arrow-up-hover.svg + images/default/arrow-up-disabled.svg + images/default/arrow-down.svg + images/default/arrow-down-hover.svg + images/default/arrow-down-disabled.svg + + diff --git a/3rdparty/easyprofiler/profiler_gui/resources.rc b/3rdparty/easyprofiler/profiler_gui/resources.rc new file mode 100644 index 0000000..fdc5adb --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/resources.rc @@ -0,0 +1,33 @@ +IDI_ICON1 ICON DISCARDABLE "images/logo.ico" +1 VERSIONINFO +FILEVERSION EASY_PROFILER_VERSION_MAJOR, EASY_PROFILER_VERSION_MINOR, EASY_PROFILER_VERSION_PATCH +PRODUCTVERSION EASY_PROFILER_VERSION_MAJOR, EASY_PROFILER_VERSION_MINOR, EASY_PROFILER_VERSION_PATCH + +# define EASY_STRINGIFY(a) #a +# define EASY_STRINGIFICATION(a) EASY_STRINGIFY(a) + +#define EASY_PROFILER_PRODUCT_VERSION "v" EASY_STRINGIFICATION(EASY_PROFILER_VERSION_MAJOR) "." \ + EASY_STRINGIFICATION(EASY_PROFILER_VERSION_MINOR) "." \ + EASY_STRINGIFICATION(EASY_PROFILER_VERSION_PATCH) + +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "080904b0" + BEGIN + VALUE "CompanyName", "EasySolutions" + VALUE "FileDescription", "EasyProfiler" + VALUE "InternalName", "profiler_gui" + VALUE "LegalCopyright", "Copyright (C) 2016-2017 Victor Zarubkin, Sergey Yagovtsev" + VALUE "LegalTrademarks1", "All Rights Reserved" + VALUE "LegalTrademarks2", "All Rights Reserved" + VALUE "OriginalFilename", "profiler_gui.exe" + VALUE "ProductName", "easy_profiler gui application" + VALUE "ProductVersion", EASY_PROFILER_PRODUCT_VERSION + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x809, 1200 + END +END diff --git a/3rdparty/easyprofiler/profiler_gui/themes/default.css b/3rdparty/easyprofiler/profiler_gui/themes/default.css new file mode 100644 index 0000000..4d944f7 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/themes/default.css @@ -0,0 +1,358 @@ +/********************************** +* * +* Light theme for EasyProfiler. * +* * +* Automatically generated from * +* default.scss by pysassc tool * +* * +***********************************/ +/* ****************************************************************************************************************** */ +/* Functions */ +/* ****************************************************************************************************************** */ +/* Constants */ +/* ****************************************************************************************************************** */ +/* StyleSheet */ +* { + font-family: "DejaVu Sans"; + font-size: 13px; + color: #504040; } + +*:disabled { + color: #a08888; } + +EasyMainWindow, QToolBar, QDialog { + background-color: #f8f2f2; } + +QToolTip { + background-color: #ffeccc; + border: 1px solid #cccccc; } + +QGraphicsView { + border: 1px solid #cccccc; } + +/* ****************************************************************************************************************** */ +QLineEdit, QComboBox, QSpinBox { + height: 24px; + border: 1px solid #cccccc; + background-color: white; + selection-background-color: rgba(152, 222, 152, 0.5); + selection-color: #504040; } + +QLineEdit:disabled, QComboBox:disabled, QSpinBox:disabled { + background-color: #f0f0f0; + color: #a08888; + selection-background-color: rgba(152, 222, 152, 0.5); + selection-color: #a08888; } + +QLineEdit:focus { + border: 1px solid #ffbcbc; } + +/* ****************************************************************************************************************** */ +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: 24px; + border: none; + margin-left: 0; } + +QComboBox::down-arrow { + image: url(":/images/default/arrow-down"); + height: 8px; + width: 8px; } + +QComboBox::down-arrow:hover { + image: url(":/images/default/arrow-down-hover"); } + +QComboBox::down-arrow:disabled { + image: url(":/images/default/arrow-down-disabled"); } + +/* ****************************************************************************************************************** */ +QSpinBox::up-button { + subcontrol-origin: padding; + subcontrol-position: top right; + margin-left: 5px; + width: 24px; + border-left: 1px solid #cccccc; + border-bottom: 1px solid #cccccc; } + +QSpinBox::down-button { + subcontrol-origin: padding; + subcontrol-position: bottom right; + margin-left: 5px; + width: 24px; + border-left: 1px solid #cccccc; } + +QSpinBox::up-button:pressed, QSpinBox::down-button:pressed { + background-color: #f4f4f4; } + +QSpinBox::up-arrow { + image: url(":/images/default/arrow-up"); + height: 8px; + width: 8px; } + +QSpinBox::up-arrow:hover { + image: url(":/images/default/arrow-up-hover"); } + +QSpinBox::up-arrow:disabled { + image: url(":/images/default/arrow-up-disabled"); } + +QSpinBox::down-arrow { + image: url(":/images/default/arrow-down"); + height: 8px; + width: 8px; } + +QSpinBox::down-arrow:hover { + image: url(":/images/default/arrow-down-hover"); } + +QSpinBox::down-arrow:disabled { + image: url(":/images/default/arrow-down-disabled"); } + +/* ****************************************************************************************************************** */ +QPushButton { + height: 24px; + min-width: 50px; + border: 1px solid #cccccc; + background-color: white; + padding: 0 5px 0 5px; } + +QPushButton:disabled { + background-color: #f0f0f0; + color: #a08888; } + +QPushButton:hover { + border: 1px solid #ffbcbc; + color: #922c2c; } + +QPushButton:pressed { + border: 1px solid #922c2c; + color: #370400; } + +/* ****************************************************************************************************************** */ +QListView { + background-color: white; + border: 1px solid #cccccc; } + +QListView, QTableView, QTreeView { + alternate-background-color: #e4e4ec; + selection-background-color: rgba(152, 222, 152, 0.8); + selection-color: #504040; } + +QListView::item, QTableView::item, QTreeView::item { + height: 26px; + border-bottom: 1px solid #cccccc; } + +QListView::item:selected, QTableView::item:selected, QTreeView::item:selected { + background-color: rgba(152, 222, 152, 0.8); } + +QTreeView::indicator { + width: 14px; + height: 14px; + background-color: transparent; + border: 1px solid transparent; + padding: 1px; + margin: 0; } + +QTreeView::indicator:hover, QTreeView::indicator:checked { + background-color: white; + border: 1px solid #cccccc; } + +QTreeView::indicator:checked { + image: url(":/images/default/check"); } + +QTreeView::indicator:checked:disabled { + image: url(":/images/default/check-disabled"); } + +/* ****************************************************************************************************************** */ +QMenu { + background-color: white; + border: 1px solid #cccccc; + padding-top: 4px; + padding-bottom: 4px; } + +QMenu::item { + height: 24px; + padding: 0 16px 0 25px; + border: 1px solid transparent; + /* reserve space for selection border */ } + +QMenu::item:selected { + border: 1px solid rgba(152, 222, 152, 0.5); + background-color: rgba(152, 222, 152, 0.5); } + +QMenu::icon { + width: 14px; + height: 14px; + background: none; + border: 1px inset transparent; + padding: 1px; + margin-left: 2px; } + +QMenu::icon:checked { + /* appearance of a 'checked' icon */ + background-color: #dddddd; + border: 1px inset #aaaaaa; } + +QMenu::separator { + height: 1px; + background: #cccccc; + margin-left: 5px; + margin-right: 5px; } + +QMenu::indicator { + width: 14px; + height: 14px; + background-color: white; + border: 1px solid #cccccc; + margin-left: 2px; + padding: 1px; } + +QMenu::indicator:non-exclusive:checked { + image: url(":/images/default/check"); } + +QMenu::indicator:non-exclusive:checked:disabled { + image: url(":/images/default/check-disabled"); } + +QMenu::indicator:exclusive { + border-radius: 8px; } + +QMenu::indicator:exclusive:checked { + image: url(":/images/default/radio-check"); } + +QMenu::indicator:exclusive:checked:disabled { + image: url(":/images/default/radio-check-disabled"); } + +/* ****************************************************************************************************************** */ +/*QToolButton { + border: 1px solid transparent; + background: none; + padding: 2px; +} + +QToolButton:hover { + border: 1px solid $BorderColor; +} + +QToolButton[popupMode="1"] { + padding-right: 13px; +} + +QToolButton:pressed { + background-color: #808080; +} + +QToolButton::menu-button { + border: none; + border-left: 1px solid transparent; + width: 12px; +} + +QToolButton::menu-button:hover { + border-left: 1px solid $BorderColor; + background-color: #bbbbbb; +} + +QToolButton::menu-button:pressed { + border-left: 1px solid $BorderColor; + background-color: #808080; +}*/ +/* ****************************************************************************************************************** */ +QHeaderView::section { + height: 28px; + width: 96px; + min-width: 64px; + background: #eeeeee; } + +/* ****************************************************************************************************************** */ +EasyDockWidget QWidget#EasyDockWidgetTitle { + background-color: #686464; } + EasyDockWidget QWidget#EasyDockWidgetTitle QLabel { + color: white; + margin-left: 4px; } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton { + background: none; + border: none; + max-height: 12px; + min-width: 12px; + max-width: 12px; + margin-right: 4px; + padding: 0; } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton#EasyDockWidgetFloatButton { + image: url(":/images/default/dock-maximize-white"); } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton#EasyDockWidgetFloatButton:hover { + image: url(":/images/default/dock-maximize-white-hover"); } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton#EasyDockWidgetFloatButton:pressed { + image: url(":/images/default/dock-maximize-white-pressed"); } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton#EasyDockWidgetFloatButton[floating=true] { + image: url(":/images/default/dock-minimize-white"); } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton#EasyDockWidgetFloatButton[floating=true]:hover { + image: url(":/images/default/dock-minimize-white-hover"); } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton#EasyDockWidgetFloatButton[floating=true]:pressed { + image: url(":/images/default/dock-minimize-white-pressed"); } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton#EasyDockWidgetCloseButton { + image: url(":/images/default/dock-close-white"); } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton#EasyDockWidgetCloseButton:hover { + image: url(":/images/default/dock-close-white-hover"); } + EasyDockWidget QWidget#EasyDockWidgetTitle QPushButton#EasyDockWidgetCloseButton:pressed { + image: url(":/images/default/dock-close-white-pressed"); } + +/* ****************************************************************************************************************** */ +QWidget#DiagramPopup, QWidget#ThreadsPopup { + background-color: white; + border: 1px solid #cccccc; } + +/* ****************************************************************************************************************** */ +QProgressBar { + height: 24px; + background-color: white; + border: 1px solid #cccccc; + color: #0B530B; + text-align: center; } + +QProgressBar::chunk { + background-color: #98DE98; + width: 2px; + margin: 0; } + +/* ****************************************************************************************************************** */ +QScrollBar { + background-color: transparent; + border: none; + padding: 0; } + +QScrollBar:hover { + background-color: rgba(0, 0, 0, 0.1); } + +QScrollBar:horizontal { + margin: 0; + height: 8px; } + +QScrollBar:vertical { + margin: 0; + width: 8px; } + +QScrollBar::handle { + background-color: rgba(0, 0, 0, 0.4); + border: none; + margin: 0; + padding: 0; } + +QScrollBar::handle:pressed { + background-color: rgba(0, 0, 0, 0.6); } + +QScrollBar::handle:vertical { + min-height: 30px; + margin-left: 4px; } + +QScrollBar::handle:vertical:hover, QScrollBar::handle:vertical:pressed { + margin-left: 0; } + +QScrollBar::handle:horizontal { + min-width: 30px; + margin-top: 4px; } + +QScrollBar::handle:horizontal:hover, QScrollBar::handle:horizontal:pressed { + margin-top: 0; } + +QScrollBar::add-line, QScrollBar::sub-line { + background: none; + border: none; } diff --git a/3rdparty/easyprofiler/profiler_gui/themes/default.scss b/3rdparty/easyprofiler/profiler_gui/themes/default.scss new file mode 100644 index 0000000..2bd248c --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/themes/default.scss @@ -0,0 +1,391 @@ +/********************************** +* * +* Light theme for EasyProfiler. * +* * +* Automatically generated from * +* default.scss by pysassc tool * +* * +***********************************/ + +/* ****************************************************************************************************************** */ +/* Functions */ +@function rgb_a($color, $opacity) { + @return fade_out($color, 1.0 - $opacity); +} + +/* ****************************************************************************************************************** */ +/* Constants */ +$TextColor: #504040; +$DisabledTextColor: #a08888; +$BorderColor: #cccccc; +$MainColor: #f44336; +$HoveredMenuRowColor: rgb_a(#98DE98, 0.5); +$BackgroundColor: white; +$DisabledBackgroundColor: #f0f0f0; +$ButtonHoverColor: #922c2c;//#d77d7d; +$ButtonPressedColor: #370400;//#922c2c; +$FocusBorderColor: #ffbcbc; +$DefaultHeight: 24px; +$ComboBoxArrowSize: 8px; +$SpinBoxArrowSize: 8px; + +/* ****************************************************************************************************************** */ +/* StyleSheet */ + +* { + font-family: "DejaVu Sans"; + font-size: 13px; + color: $TextColor; +} + +*:disabled { + color: $DisabledTextColor; +} + +EasyMainWindow, QToolBar, QDialog { + background-color: #f8f2f2; +} + +QToolTip { + background-color: #ffeccc; + border: 1px solid $BorderColor; +} + +QGraphicsView { + border: 1px solid $BorderColor; +} + +/* ****************************************************************************************************************** */ +QLineEdit, QComboBox, QSpinBox { + height: $DefaultHeight; + border: 1px solid $BorderColor; + background-color: $BackgroundColor; + selection-background-color: $HoveredMenuRowColor; + selection-color: $TextColor; +} + +QLineEdit:disabled, QComboBox:disabled, QSpinBox:disabled { + background-color: $DisabledBackgroundColor; + color: $DisabledTextColor; + selection-background-color: $HoveredMenuRowColor; + selection-color: $DisabledTextColor; +} + +QLineEdit:focus { border: 1px solid $FocusBorderColor; } + +/* ****************************************************************************************************************** */ +QComboBox::drop-down { + subcontrol-origin: padding; + subcontrol-position: top right; + width: $DefaultHeight; + border: none; + margin-left: 0; +} + +QComboBox::down-arrow { image: url(":/images/default/arrow-down"); height: $ComboBoxArrowSize; width: $ComboBoxArrowSize; } +QComboBox::down-arrow:hover { image: url(":/images/default/arrow-down-hover"); } +QComboBox::down-arrow:disabled { image: url(":/images/default/arrow-down-disabled"); } + +/* ****************************************************************************************************************** */ +QSpinBox::up-button { + subcontrol-origin: padding; + subcontrol-position: top right; + margin-left: 5px; + width: $DefaultHeight; + border-left: 1px solid $BorderColor; + border-bottom: 1px solid $BorderColor; +} + +QSpinBox::down-button { + subcontrol-origin: padding; + subcontrol-position: bottom right; + margin-left: 5px; + width: $DefaultHeight; + border-left: 1px solid $BorderColor; +} + +QSpinBox::up-button:pressed, QSpinBox::down-button:pressed { + background-color: #f4f4f4; +} + +QSpinBox::up-arrow { image: url(":/images/default/arrow-up"); height: $SpinBoxArrowSize; width: $SpinBoxArrowSize; } +QSpinBox::up-arrow:hover { image: url(":/images/default/arrow-up-hover"); } +QSpinBox::up-arrow:disabled { image: url(":/images/default/arrow-up-disabled"); } + +QSpinBox::down-arrow { image: url(":/images/default/arrow-down"); height: $SpinBoxArrowSize; width: $SpinBoxArrowSize; } +QSpinBox::down-arrow:hover { image: url(":/images/default/arrow-down-hover"); } +QSpinBox::down-arrow:disabled { image: url(":/images/default/arrow-down-disabled"); } + +/* ****************************************************************************************************************** */ +QPushButton { + height: $DefaultHeight; + min-width: 50px; + border: 1px solid $BorderColor; + background-color: $BackgroundColor; + padding: 0 5px 0 5px; +} + +QPushButton:disabled { + background-color: $DisabledBackgroundColor; + color: $DisabledTextColor; +} + +QPushButton:hover { + border: 1px solid $FocusBorderColor; + color: $ButtonHoverColor; +} + +QPushButton:pressed { + border: 1px solid $ButtonHoverColor; + color: $ButtonPressedColor; +} + +/* ****************************************************************************************************************** */ +QListView { + background-color: $BackgroundColor; + border: 1px solid $BorderColor; +} + +QListView, QTableView, QTreeView { + alternate-background-color: #e4e4ec; + selection-background-color: rgb_a(#98DE98, 0.8); + selection-color: $TextColor; +} + +QListView::item, QTableView::item, QTreeView::item { + height: $DefaultHeight + 2px; + border-bottom: 1px solid $BorderColor; +} + +QListView::item:selected, QTableView::item:selected, QTreeView::item:selected { + background-color: rgb_a(#98DE98, 0.8); +} + + +QTreeView::indicator { + width: 14px; + height: 14px; + background-color: transparent; + border: 1px solid transparent; + padding: 1px; + margin: 0; +} + +QTreeView::indicator:hover, QTreeView::indicator:checked { + background-color: $BackgroundColor; + border: 1px solid $BorderColor; +} + +QTreeView::indicator:checked { image: url(":/images/default/check"); } +QTreeView::indicator:checked:disabled { image: url(":/images/default/check-disabled"); } + +/* ****************************************************************************************************************** */ +QMenu { + background-color: $BackgroundColor; + border: 1px solid $BorderColor; + padding-top: 4px; + padding-bottom: 4px; +} + +QMenu::item { + height: $DefaultHeight; + padding: 0 16px 0 25px; + border: 1px solid transparent; /* reserve space for selection border */ +} + +QMenu::item:selected { + border: 1px solid $HoveredMenuRowColor; + background-color: $HoveredMenuRowColor; +} + +QMenu::icon { + width: 14px; + height: 14px; + background: none; + border: 1px inset transparent; + padding: 1px; + margin-left: 2px; +} + +QMenu::icon:checked { /* appearance of a 'checked' icon */ + background-color: #dddddd; + border: 1px inset #aaaaaa; +} + +QMenu::separator { + height: 1px; + background: $BorderColor; + margin-left: 5px; + margin-right: 5px; +} + +QMenu::indicator { + width: 14px; + height: 14px; + background-color: $BackgroundColor; + border: 1px solid $BorderColor; + margin-left: 2px; + padding: 1px; +} + +QMenu::indicator:non-exclusive:checked { image: url(":/images/default/check"); } +QMenu::indicator:non-exclusive:checked:disabled { image: url(":/images/default/check-disabled"); } + +QMenu::indicator:exclusive { border-radius: 8px; } +QMenu::indicator:exclusive:checked { image: url(":/images/default/radio-check"); } +QMenu::indicator:exclusive:checked:disabled { image: url(":/images/default/radio-check-disabled"); } + + + + +/* ****************************************************************************************************************** */ +/*QToolButton { + border: 1px solid transparent; + background: none; + padding: 2px; +} + +QToolButton:hover { + border: 1px solid $BorderColor; +} + +QToolButton[popupMode="1"] { + padding-right: 13px; +} + +QToolButton:pressed { + background-color: #808080; +} + +QToolButton::menu-button { + border: none; + border-left: 1px solid transparent; + width: 12px; +} + +QToolButton::menu-button:hover { + border-left: 1px solid $BorderColor; + background-color: #bbbbbb; +} + +QToolButton::menu-button:pressed { + border-left: 1px solid $BorderColor; + background-color: #808080; +}*/ + + + + + + +/* ****************************************************************************************************************** */ +QHeaderView::section { + height: 28px; + width: 96px; + min-width: 64px; + background: #eeeeee; +} + + + + + +/* ****************************************************************************************************************** */ +EasyDockWidget +{ + QWidget#EasyDockWidgetTitle + { + background-color: #686464; + + QLabel { + color: white; + margin-left: 4px; + } + + QPushButton { + background: none; + border: none; + max-height: 12px; + min-width: 12px; + max-width: 12px; + margin-right: 4px; + padding: 0; + } + + QPushButton#EasyDockWidgetFloatButton { image: url(":/images/default/dock-maximize-white"); } + QPushButton#EasyDockWidgetFloatButton:hover { image: url(":/images/default/dock-maximize-white-hover"); } + QPushButton#EasyDockWidgetFloatButton:pressed { image: url(":/images/default/dock-maximize-white-pressed"); } + + QPushButton#EasyDockWidgetFloatButton[floating=true] { image: url(":/images/default/dock-minimize-white"); } + QPushButton#EasyDockWidgetFloatButton[floating=true]:hover { image: url(":/images/default/dock-minimize-white-hover"); } + QPushButton#EasyDockWidgetFloatButton[floating=true]:pressed { image: url(":/images/default/dock-minimize-white-pressed"); } + + QPushButton#EasyDockWidgetCloseButton { image: url(":/images/default/dock-close-white"); } + QPushButton#EasyDockWidgetCloseButton:hover { image: url(":/images/default/dock-close-white-hover"); } + QPushButton#EasyDockWidgetCloseButton:pressed { image: url(":/images/default/dock-close-white-pressed"); } + } +} + +/* ****************************************************************************************************************** */ +QWidget#DiagramPopup, QWidget#ThreadsPopup { + background-color: $BackgroundColor; + border: 1px solid $BorderColor; +} + +/* ****************************************************************************************************************** */ +QProgressBar { + height: $DefaultHeight; + background-color: $BackgroundColor; + border: 1px solid $BorderColor;//#64BC64; + color: #0B530B; + text-align: center; +} + +QProgressBar::chunk { + background-color: #98DE98; + width: 2px; + margin: 0; +} + +/* ****************************************************************************************************************** */ +QScrollBar { + background-color: transparent; + border: none; + padding: 0; +} + +QScrollBar:hover { + background-color: rgb_a(#000000, 0.1); +} + +QScrollBar:horizontal { + margin: 0; + height: 8px; +} + +QScrollBar:vertical { + margin: 0; + width: 8px; +} + +QScrollBar::handle { + background-color: rgb_a(#000000, 0.4); + border: none; + margin: 0; + padding: 0; +} + +QScrollBar::handle:pressed { + background-color: rgb_a(#000000, 0.6); +} + +QScrollBar::handle:vertical { min-height: 30px; margin-left: 4px; } +QScrollBar::handle:vertical:hover, QScrollBar::handle:vertical:pressed { margin-left: 0; } + +QScrollBar::handle:horizontal { min-width: 30px; margin-top: 4px; } +QScrollBar::handle:horizontal:hover, QScrollBar::handle:horizontal:pressed { margin-top: 0; } + +QScrollBar::add-line, QScrollBar::sub-line { + background: none; + border: none; +} diff --git a/3rdparty/easyprofiler/profiler_gui/tree_widget_item.cpp b/3rdparty/easyprofiler/profiler_gui/tree_widget_item.cpp new file mode 100644 index 0000000..4fd2459 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/tree_widget_item.cpp @@ -0,0 +1,431 @@ +/************************************************************************ +* file name : tree_widget_item.cpp +* ----------------- : +* creation time : 2016/08/18 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of EasyTreeWidgetItem. +* ----------------- : +* change log : * 2016/08/18 Victor Zarubkin: Moved sources from blocks_tree_widget.cpp +* : and renamed classes from Prof* to Easy*. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include "tree_widget_item.h" +#include "globals.h" +#include +#include +#include +#include +#include +#include + +////////////////////////////////////////////////////////////////////////// + +EASY_CONSTEXPR int BlockColorRole = Qt::UserRole + 1; + +////////////////////////////////////////////////////////////////////////// + +EASY_CONSTEXPR int ColumnBit[COL_COLUMNS_NUMBER] = { + -1 // COL_NAME = 0, + + , 0 // COL_BEGIN, + + , 1 // COL_DURATION, + , 2 // COL_SELF_DURATION, + , 3 // COL_DURATION_SUM_PER_PARENT, + , 4 // COL_DURATION_SUM_PER_FRAME, + , 5 // COL_DURATION_SUM_PER_THREAD, + + , -1 // COL_SELF_DURATION_PERCENT, + , -1 // COL_PERCENT_PER_PARENT, + , -1 // COL_PERCENT_PER_FRAME, + , -1 // COL_PERCENT_SUM_PER_PARENT, + , -1 // COL_PERCENT_SUM_PER_FRAME, + , -1 // COL_PERCENT_SUM_PER_THREAD, + + , 6 // COL_END, + + , 7 // COL_MIN_PER_FRAME, + , 8 // COL_MAX_PER_FRAME, + , 9 // COL_AVERAGE_PER_FRAME, + , -1 // COL_NCALLS_PER_FRAME, + + , 10 // COL_MIN_PER_THREAD, + , 11 // COL_MAX_PER_THREAD, + , 12 // COL_AVERAGE_PER_THREAD, + , -1 // COL_NCALLS_PER_THREAD, + + , 13 // COL_MIN_PER_PARENT, + , 14 // COL_MAX_PER_PARENT, + , 15 // COL_AVERAGE_PER_PARENT, + , -1 // COL_NCALLS_PER_PARENT, + + , 16 // COL_ACTIVE_TIME, + , -1 // COL_ACTIVE_PERCENT, +}; + +////////////////////////////////////////////////////////////////////////// + +EasyTreeWidgetItem::EasyTreeWidgetItem(const ::profiler::block_index_t _treeBlock, Parent* _parent) + : Parent(_parent, QTreeWidgetItem::UserType) + , m_block(_treeBlock) + , m_customBGColor(0) + , m_bMain(false) +{ + +} + +EasyTreeWidgetItem::~EasyTreeWidgetItem() +{ +} + +bool EasyTreeWidgetItem::operator < (const Parent& _other) const +{ + const auto col = treeWidget()->sortColumn(); + + switch (col) + { + //case COL_UNKNOWN: + case COL_NAME: + { + if (parent() == nullptr) + return false; // Do not sort topLevelItems by name + return Parent::operator < (_other); + } + + case COL_NCALLS_PER_THREAD: + case COL_NCALLS_PER_PARENT: + case COL_NCALLS_PER_FRAME: + { + return data(col, Qt::UserRole).toUInt() < _other.data(col, Qt::UserRole).toUInt(); + } + + case COL_SELF_DURATION_PERCENT: + case COL_PERCENT_PER_PARENT: + case COL_PERCENT_PER_FRAME: + case COL_PERCENT_SUM_PER_PARENT: + case COL_PERCENT_SUM_PER_FRAME: + case COL_PERCENT_SUM_PER_THREAD: + { + return data(col, Qt::UserRole).toInt() < _other.data(col, Qt::UserRole).toInt(); + } + + case COL_ACTIVE_PERCENT: + { + return data(col, Qt::UserRole).toDouble() < _other.data(col, Qt::UserRole).toDouble(); + } + + default: + { + // durations min, max, average + return data(col, Qt::UserRole).toULongLong() < _other.data(col, Qt::UserRole).toULongLong(); + } + } + + return false; +} + +bool EasyTreeWidgetItem::hasToolTip(int _column) const +{ + const int bit = ColumnBit[_column]; + return bit < 0 ? false : m_bHasToolTip.test(static_cast(bit)); +} + +void EasyTreeWidgetItem::setHasToolTip(int _column) +{ + const int bit = ColumnBit[_column]; + if (bit >= 0) + m_bHasToolTip.set(static_cast(bit), true); +} + +QVariant EasyTreeWidgetItem::data(int _column, int _role) const +{ + if (_column == COL_NAME) + { + if (_role == Qt::SizeHintRole) + { +#ifdef _WIN32 + const float k = m_font.bold() ? 1.2f : 1.f; +#else + const float k = m_font.bold() ? 1.15f : 1.f; +#endif + return QSize(static_cast(QFontMetrics(m_font).width(text(COL_NAME)) * k) + 20, 26); + } + + if (_role == BlockColorRole) + { + if (parent() != nullptr || m_bMain) + return QBrush(QColor::fromRgba(m_customBGColor)); + return QVariant(); + } + } + + switch (_role) + { + case Qt::FontRole: + return m_font; + + case Qt::ForegroundRole: + return m_bMain ? QVariant::fromValue(QColor::fromRgb(::profiler_gui::SELECTED_THREAD_FOREGROUND)) : QVariant(); + + case Qt::ToolTipRole: + return hasToolTip(_column) ? + QVariant::fromValue(QString("%1 ns").arg(QTreeWidgetItem::data(_column, Qt::UserRole).toULongLong())) : + QVariant(); + + default: + return QTreeWidgetItem::data(_column, _role); + } +} + +::profiler::block_index_t EasyTreeWidgetItem::block_index() const +{ + return m_block; +} + +::profiler_gui::EasyBlock& EasyTreeWidgetItem::guiBlock() +{ + return easyBlock(m_block); +} + +const ::profiler::BlocksTree& EasyTreeWidgetItem::block() const +{ + return easyBlocksTree(m_block); +} + +::profiler::timestamp_t EasyTreeWidgetItem::duration() const +{ + if (parent() != nullptr) + return block().node->duration(); + return data(COL_DURATION, Qt::UserRole).toULongLong(); +} + +::profiler::timestamp_t EasyTreeWidgetItem::selfDuration() const +{ + return data(COL_SELF_DURATION, Qt::UserRole).toULongLong(); +} + +void EasyTreeWidgetItem::setTimeSmart(int _column, ::profiler_gui::TimeUnits _units, const ::profiler::timestamp_t& _time, const QString& _prefix) +{ + const ::profiler::timestamp_t nanosecondsTime = PROF_NANOSECONDS(_time); + + setData(_column, Qt::UserRole, (quint64)nanosecondsTime); + setHasToolTip(_column); + setText(_column, QString("%1%2").arg(_prefix).arg(::profiler_gui::timeStringRealNs(_units, nanosecondsTime, 3))); + +// if (_time < 1e3) +// { +// setText(_column, QString("%1%2 ns").arg(_prefix).arg(nanosecondsTime)); +// } +// else if (_time < 1e6) +// { +// setText(_column, QString("%1%2 us").arg(_prefix).arg(double(nanosecondsTime) * 1e-3, 0, 'f', 3)); +// } +// else if (_time < 1e9) +// { +// setText(_column, QString("%1%2 ms").arg(_prefix).arg(double(nanosecondsTime) * 1e-6, 0, 'f', 3)); +// } +// else +// { +// setText(_column, QString("%1%2 s").arg(_prefix).arg(double(nanosecondsTime) * 1e-9, 0, 'f', 3)); +// } +} + +void EasyTreeWidgetItem::setTimeSmart(int _column, ::profiler_gui::TimeUnits _units, const ::profiler::timestamp_t& _time) +{ + const ::profiler::timestamp_t nanosecondsTime = PROF_NANOSECONDS(_time); + + setData(_column, Qt::UserRole, (quint64)nanosecondsTime); + setHasToolTip(_column); + setText(_column, ::profiler_gui::timeStringRealNs(_units, nanosecondsTime, 3)); +} + +void EasyTreeWidgetItem::setTimeMs(int _column, const ::profiler::timestamp_t& _time) +{ + const ::profiler::timestamp_t nanosecondsTime = PROF_NANOSECONDS(_time); + setData(_column, Qt::UserRole, (quint64)nanosecondsTime); + setHasToolTip(_column); + setText(_column, QString::number(double(nanosecondsTime) * 1e-6, 'g', 9)); +} + +void EasyTreeWidgetItem::setTimeMs(int _column, const ::profiler::timestamp_t& _time, const QString& _prefix) +{ + const ::profiler::timestamp_t nanosecondsTime = PROF_NANOSECONDS(_time); + setData(_column, Qt::UserRole, (quint64)nanosecondsTime); + setHasToolTip(_column); + setText(_column, QString("%1%2").arg(_prefix).arg(double(nanosecondsTime) * 1e-6, 0, 'g', 9)); +} + +void EasyTreeWidgetItem::setBackgroundColor(QRgb _color) +{ + m_customBGColor = _color; +} + +void EasyTreeWidgetItem::setMain(bool _main) +{ + m_bMain = _main; +} + +void EasyTreeWidgetItem::collapseAll() +{ + for (int i = 0, childrenNumber = childCount(); i < childrenNumber; ++i) + { + static_cast(child(i))->collapseAll(); + } + + setExpanded(false); + if (parent() != nullptr) + guiBlock().expanded = false; +} + +void EasyTreeWidgetItem::expandAll() +{ + for (int i = 0, childrenNumber = childCount(); i < childrenNumber; ++i) + { + static_cast(child(i))->expandAll(); + } + + setExpanded(true); + if (parent() != nullptr) + guiBlock().expanded = true; +} + +void EasyTreeWidgetItem::setBold(bool _bold) +{ + m_font.setBold(_bold); +} + +////////////////////////////////////////////////////////////////////////// + +EasyItemDelegate::EasyItemDelegate(QTreeWidget* parent) : QStyledItemDelegate(parent), m_treeWidget(parent) +{ + +} + +EasyItemDelegate::~EasyItemDelegate() +{ + +} + +void EasyItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + auto brushData = m_treeWidget->model()->data(index, BlockColorRole); + if (brushData.isNull()) + { +#ifdef _WIN32 + const auto currentTreeIndex = m_treeWidget->currentIndex(); + if (index.parent() == currentTreeIndex.parent() && index.row() == currentTreeIndex.row()) + { + // Draw selection background for selected row + painter->save(); + painter->setBrush(QColor::fromRgba(0xCC98DE98)); + painter->setPen(Qt::NoPen); + painter->drawRect(QRect(0, option.rect.top(), option.rect.left() + 16, option.rect.height())); + painter->restore(); + } +#endif + + // Draw item as usual + QStyledItemDelegate::paint(painter, option, index); + + // Draw line under tree indicator + const auto bottomLeft = option.rect.bottomLeft(); + if (bottomLeft.x() > 0) + { + painter->save(); + painter->setBrush(Qt::NoBrush); + painter->setPen(::profiler_gui::SYSTEM_BORDER_COLOR); + painter->drawLine(QPoint(0, bottomLeft.y()), bottomLeft); + painter->restore(); + } + + return; + } + + const auto currentTreeIndex = m_treeWidget->currentIndex(); + if (index.parent() == currentTreeIndex.parent() && index.row() == currentTreeIndex.row()) + { + // Draw selection background for selected row + + painter->save(); + + painter->setBrush(QColor::fromRgba(0xCC98DE98)); + painter->setPen(Qt::NoPen); + +#ifdef _WIN32 + painter->drawRect(QRect(0, option.rect.top(), option.rect.left() + 16, option.rect.height())); +#else + painter->drawRect(QRect(option.rect.left(), option.rect.top(), 16, option.rect.height())); +#endif + + painter->restore(); + } + + // Adjust rect size for drawing color marker + QStyleOptionViewItem opt = option; + opt.rect.adjust(16, 0, 0, 0); + + // Draw item as usual + QStyledItemDelegate::paint(painter, opt, index); + + painter->save(); + + // Draw color marker with block color + const auto brush = m_treeWidget->model()->data(index, Qt::UserRole + 1).value(); + painter->setBrush(brush); + painter->setPen(::profiler_gui::SYSTEM_BORDER_COLOR); + painter->drawRect(QRect(option.rect.left(), option.rect.top() + 5, 16, option.rect.height() - 10)); + + // Draw line under tree indicator + const auto bottomLeft = opt.rect.bottomLeft(); + if (bottomLeft.x() > 0) + { + painter->setBrush(Qt::NoBrush); + painter->drawLine(QPoint(0, bottomLeft.y()), bottomLeft); + } + + painter->restore(); +} diff --git a/3rdparty/easyprofiler/profiler_gui/tree_widget_item.h b/3rdparty/easyprofiler/profiler_gui/tree_widget_item.h new file mode 100644 index 0000000..b164907 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/tree_widget_item.h @@ -0,0 +1,184 @@ +/************************************************************************ +* file name : tree_widget_item.h +* ----------------- : +* creation time : 2016/08/18 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of EasyTreeWidgetItem +* : for displyaing EasyProfiler blocks tree. +* ----------------- : +* change log : * 2016/08/18 Victor Zarubkin: moved sources from blocks_tree_widget.h +* : and renamed classes from Prof* to Easy*. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_TREE_WIDGET_ITEM_H +#define EASY_TREE_WIDGET_ITEM_H + +#include +#include +#include +#include +#include + +#include "common_functions.h" + +////////////////////////////////////////////////////////////////////////// + +enum EasyColumnsIndexes +{ + COL_UNKNOWN = -1, + + COL_NAME = 0, + + COL_BEGIN, + + COL_DURATION, + COL_SELF_DURATION, + COL_DURATION_SUM_PER_PARENT, + COL_DURATION_SUM_PER_FRAME, + COL_DURATION_SUM_PER_THREAD, + + COL_SELF_DURATION_PERCENT, + COL_PERCENT_PER_PARENT, + COL_PERCENT_PER_FRAME, + COL_PERCENT_SUM_PER_PARENT, + COL_PERCENT_SUM_PER_FRAME, + COL_PERCENT_SUM_PER_THREAD, + + COL_END, + + COL_MIN_PER_FRAME, + COL_MAX_PER_FRAME, + COL_AVERAGE_PER_FRAME, + COL_NCALLS_PER_FRAME, + + COL_MIN_PER_THREAD, + COL_MAX_PER_THREAD, + COL_AVERAGE_PER_THREAD, + COL_NCALLS_PER_THREAD, + + COL_MIN_PER_PARENT, + COL_MAX_PER_PARENT, + COL_AVERAGE_PER_PARENT, + COL_NCALLS_PER_PARENT, + + COL_ACTIVE_TIME, + COL_ACTIVE_PERCENT, + + COL_COLUMNS_NUMBER +}; + +////////////////////////////////////////////////////////////////////////// + +class EasyTreeWidgetItem : public QTreeWidgetItem +{ + using Parent = QTreeWidgetItem; + using This = EasyTreeWidgetItem; + + QFont m_font; + const ::profiler::block_index_t m_block; + QRgb m_customBGColor; + std::bitset<17> m_bHasToolTip; + bool m_bMain; + +public: + + explicit EasyTreeWidgetItem(const ::profiler::block_index_t _treeBlock = ::profiler_gui::numeric_max(), Parent* _parent = nullptr); + virtual ~EasyTreeWidgetItem(); + + bool operator < (const Parent& _other) const override; + QVariant data(int _column, int _role) const override; + +public: + + ::profiler::block_index_t block_index() const; + ::profiler_gui::EasyBlock& guiBlock(); + const ::profiler::BlocksTree& block() const; + + ::profiler::timestamp_t duration() const; + ::profiler::timestamp_t selfDuration() const; + + void setTimeSmart(int _column, ::profiler_gui::TimeUnits _units, const ::profiler::timestamp_t& _time, const QString& _prefix); + void setTimeSmart(int _column, ::profiler_gui::TimeUnits _units, const ::profiler::timestamp_t& _time); + + void setTimeMs(int _column, const ::profiler::timestamp_t& _time); + void setTimeMs(int _column, const ::profiler::timestamp_t& _time, const QString& _prefix); + + void setBackgroundColor(QRgb _color); + + void setMain(bool _main); + + void collapseAll(); + + void expandAll(); + + void setBold(bool _bold); + +private: + + bool hasToolTip(int _column) const; + void setHasToolTip(int _column); + +}; // END of class EasyTreeWidgetItem. + +////////////////////////////////////////////////////////////////////////// + +class EasyItemDelegate : public QStyledItemDelegate +{ + Q_OBJECT + QTreeWidget* m_treeWidget; + +public: + + explicit EasyItemDelegate(QTreeWidget* parent = nullptr); + ~EasyItemDelegate() override; + void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; + +}; // END of class EasyItemDelegate. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_TREE_WIDGET_ITEM_H diff --git a/3rdparty/easyprofiler/profiler_gui/tree_widget_loader.cpp b/3rdparty/easyprofiler/profiler_gui/tree_widget_loader.cpp new file mode 100644 index 0000000..c6ae0b8 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/tree_widget_loader.cpp @@ -0,0 +1,1031 @@ +/************************************************************************ +* file name : tree_widget_loader.h +* ----------------- : +* creation time : 2016/08/18 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains implementation of EasyTreeWidgetLoader which aim is +* : to load EasyProfiler blocks hierarchy in separate thread. +* ----------------- : +* change log : * 2016/08/18 Victor Zarubkin: moved sources from blocks_tree_widget.h/.cpp +* : and renamed Prof* to Easy*. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#include "tree_widget_loader.h" +#include "tree_widget_item.h" +#include "globals.h" + +#ifdef _WIN32 +#include + +#ifdef __MINGW32__ +#include +#endif + +#endif + +#ifdef max +#undef max +#endif + +#ifdef min +#undef min +#endif + +////////////////////////////////////////////////////////////////////////// + +EasyTreeWidgetLoader::EasyTreeWidgetLoader() + : m_bDone(ATOMIC_VAR_INIT(false)) + , m_bInterrupt(ATOMIC_VAR_INIT(false)) + , m_progress(ATOMIC_VAR_INIT(0)) + , m_mode(EasyTreeMode_Full) +{ +} + +EasyTreeWidgetLoader::~EasyTreeWidgetLoader() +{ + interrupt(true); +} + +bool EasyTreeWidgetLoader::done() const +{ + return m_bDone.load(); +} + +void EasyTreeWidgetLoader::setDone() +{ + m_bDone.store(true); + //m_progress.store(100); +} + +void EasyTreeWidgetLoader::setProgress(int _progress) +{ + m_progress.store(_progress); +} + +bool EasyTreeWidgetLoader::interrupted() const +{ + return m_bInterrupt.load(); +} + +int EasyTreeWidgetLoader::progress() const +{ + return m_progress.load(); +} + +void EasyTreeWidgetLoader::takeTopLevelItems(ThreadedItems& _output) +{ + if (done()) + { + _output = ::std::move(m_topLevelItems); + m_topLevelItems.clear(); + } +} + +void EasyTreeWidgetLoader::takeItems(Items& _output) +{ + if (done()) + { + _output = ::std::move(m_items); + m_items.clear(); + } +} + +void EasyTreeWidgetLoader::interrupt(bool _wait) +{ + m_bInterrupt.store(true); + if (m_thread.joinable()) + m_thread.join(); + + m_bInterrupt.store(false); + m_bDone.store(false); + m_progress.store(0); + + if (!_wait) + { + auto deleter_thread = ::std::thread([](decltype(m_topLevelItems) _items) + { +#ifdef _WIN32 + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_LOWEST); +#endif + + for (auto item : _items) + delete item.second; + + }, ::std::move(m_topLevelItems)); + + deleter_thread.detach(); + } + else + { + for (auto item : m_topLevelItems) + delete item.second; + } + + m_items.clear(); + m_topLevelItems.clear(); + m_iditems.clear(); +} + +void EasyTreeWidgetLoader::fillTree(::profiler::timestamp_t& _beginTime, const unsigned int _blocksNumber, const ::profiler::thread_blocks_tree_t& _blocksTree, EasyTreeMode _mode) +{ + interrupt(); + m_mode = _mode; + m_thread = ::std::thread(&EasyTreeWidgetLoader::setTreeInternal1, this, + ::std::ref(_beginTime), _blocksNumber, ::std::ref(_blocksTree), EASY_GLOBALS.add_zero_blocks_to_hierarchy, + EASY_GLOBALS.use_decorated_thread_name, EASY_GLOBALS.hex_thread_id, EASY_GLOBALS.time_units); +} + +void EasyTreeWidgetLoader::fillTreeBlocks(const::profiler_gui::TreeBlocks& _blocks, ::profiler::timestamp_t _beginTime, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict, EasyTreeMode _mode) +{ + interrupt(); + m_mode = _mode; + m_thread = ::std::thread(&EasyTreeWidgetLoader::setTreeInternal2, this, + _beginTime, ::std::ref(_blocks), _left, _right, _strict, EASY_GLOBALS.add_zero_blocks_to_hierarchy, + EASY_GLOBALS.use_decorated_thread_name, EASY_GLOBALS.hex_thread_id, EASY_GLOBALS.time_units); +} + +////////////////////////////////////////////////////////////////////////// + +void EasyTreeWidgetLoader::setTreeInternal1(::profiler::timestamp_t& _beginTime, const unsigned int _blocksNumber, const ::profiler::thread_blocks_tree_t& _blocksTree, bool _addZeroBlocks, bool _decoratedThreadNames, bool _hexThreadId, ::profiler_gui::TimeUnits _units) +{ + m_items.reserve(_blocksNumber + _blocksTree.size()); // _blocksNumber does not include Thread root blocks + + ::profiler::timestamp_t finishtime = 0; + for (const auto& threadTree : _blocksTree) + { + const auto node_block = easyBlocksTree(threadTree.second.children.front()).node; + const auto startTime = node_block->begin(); + const auto endTime = node_block->end(); + + if (_beginTime > startTime) + _beginTime = startTime; + + if (finishtime < endTime) + finishtime = endTime; + } + + //const QSignalBlocker b(this); + const auto u_thread = ::profiler_gui::toUnicode("thread"); + int i = 0; + const int total = static_cast(_blocksTree.size()); + for (const auto& threadTree : _blocksTree) + { + if (interrupted()) + break; + + const auto& root = threadTree.second; + auto item = new EasyTreeWidgetItem(); + item->setText(COL_NAME, ::profiler_gui::decoratedThreadName(_decoratedThreadNames, root, u_thread, _hexThreadId)); + + ::profiler::timestamp_t duration = 0; + if (!root.children.empty()) + duration = easyBlocksTree(root.children.back()).node->end() - easyBlocksTree(root.children.front()).node->begin(); + + item->setTimeSmart(COL_DURATION, _units, duration); + item->setBackgroundColor(::profiler_gui::SELECTED_THREAD_BACKGROUND); + + //_items.push_back(item); + + item->setTimeSmart(COL_SELF_DURATION, _units, root.profiled_time); + + ::profiler::timestamp_t children_duration = 0; + const auto children_items_number = setTreeInternal(root, 0, _beginTime, root.children, item, nullptr, + _beginTime, finishtime + 1000000000ULL, false, + children_duration, _addZeroBlocks, _units); + + if (children_items_number > 0) + { + //total_items += children_items_number + 1; + //addTopLevelItem(item); + //m_roots[threadTree.first] = item; + m_topLevelItems.emplace_back(root.thread_id, item); + } + else + { + //_items.pop_back(); + delete item; + } + + setProgress((100 * ++i) / total); + } + + setDone(); + //return total_items; +} + +////////////////////////////////////////////////////////////////////////// + +// auto calculateTotalChildrenNumber(const ::profiler::BlocksTree& _tree) -> decltype(_tree.children.size()) +// { +// auto children_number = _tree.children.size(); +// for (auto i : _tree.children) +// children_number += calculateTotalChildrenNumber(easyBlocksTree(i)); +// return children_number; +// } + +using BeginEndIndicesMap = ::std::unordered_map<::profiler::thread_id_t, ::profiler::block_index_t, + ::estd::hash<::profiler::thread_id_t> >; + +void EasyTreeWidgetLoader::setTreeInternal2(const ::profiler::timestamp_t& _beginTime, + const ::profiler_gui::TreeBlocks& _blocks, + ::profiler::timestamp_t _left, + ::profiler::timestamp_t _right, + bool _strict, + bool _addZeroBlocks, + bool _decoratedThreadNames, + bool _hexThreadId, + ::profiler_gui::TimeUnits _units) +{ + //size_t blocksNumber = 0; + //for (const auto& block : _blocks) + // blocksNumber += calculateTotalChildrenNumber(*block.tree); + // //blocksNumber += block.tree->total_children_number; + //m_items.reserve(blocksNumber + _blocks.size()); // blocksNumber does not include root blocks + + BeginEndIndicesMap beginEndMap; + RootsMap threadsMap; + + auto const setTree = (m_mode == EasyTreeMode_Full) ? &EasyTreeWidgetLoader::setTreeInternal : &EasyTreeWidgetLoader::setTreeInternalPlain; + + const auto u_thread = ::profiler_gui::toUnicode("thread"); + int i = 0, total = static_cast(_blocks.size()); + //const QSignalBlocker b(this); + for (const auto& block : _blocks) + { + if (interrupted()) + break; + + auto& gui_block = easyBlock(block.tree); + const auto startTime = gui_block.tree.node->begin(); + const auto endTime = gui_block.tree.node->end(); + if (startTime > _right || endTime < _left) + { + setProgress((90 * ++i) / total); + continue; + } + + ::profiler::timestamp_t duration = 0; + EasyTreeWidgetItem* thread_item = nullptr; + ::profiler::block_index_t& firstCswitch = beginEndMap[block.root->thread_id]; + auto thread_item_it = threadsMap.find(block.root->thread_id); + if (thread_item_it != threadsMap.end()) + { + thread_item = thread_item_it->second; + } + else + { + thread_item = new EasyTreeWidgetItem(); + thread_item->setText(COL_NAME, ::profiler_gui::decoratedThreadName(_decoratedThreadNames, *block.root, u_thread, _hexThreadId)); + + if (!block.root->children.empty()) + duration = easyBlocksTree(block.root->children.back()).node->end() - easyBlocksTree(block.root->children.front()).node->begin(); + + thread_item->setTimeSmart(COL_DURATION, _units, duration); + thread_item->setBackgroundColor(::profiler_gui::SELECTED_THREAD_BACKGROUND); + + // Sum of all children durations: + thread_item->setTimeSmart(COL_SELF_DURATION, _units, block.root->profiled_time); + + threadsMap.insert(::std::make_pair(block.root->thread_id, thread_item)); + + firstCswitch = 0; + auto it = ::std::lower_bound(block.root->sync.begin(), block.root->sync.end(), _left, [](::profiler::block_index_t ind, decltype(_left) _val) + { + return EASY_GLOBALS.gui_blocks[ind].tree.node->begin() < _val; + }); + + if (it != block.root->sync.end()) + { + firstCswitch = it - block.root->sync.begin(); + if (firstCswitch > 0) + --firstCswitch; + } + else + { + firstCswitch = static_cast<::profiler::block_index_t>(block.root->sync.size()); + } + } + + bool hasContextSwitch = false; + ::profiler::timestamp_t idleTime = 0; + for (::profiler::block_index_t ind = firstCswitch, ncs = static_cast<::profiler::block_index_t>(block.root->sync.size()); ind < ncs; ++ind) + { + auto cs_index = block.root->sync[ind]; + const auto cs = EASY_GLOBALS.gui_blocks[cs_index].tree.node; + + if (cs->begin() > endTime) + { + if (!hasContextSwitch) + firstCswitch = ind; + break; + } + + if (startTime <= cs->begin() && cs->end() <= endTime) + { + if (!hasContextSwitch) + { + firstCswitch = ind; + hasContextSwitch = true; + } + + idleTime += cs->duration(); + } + } + + auto item = new EasyTreeWidgetItem(block.tree, thread_item); + duration = endTime - startTime; + + auto name = *gui_block.tree.node->name() != 0 ? gui_block.tree.node->name() : easyDescriptor(gui_block.tree.node->id()).name(); + item->setText(COL_NAME, ::profiler_gui::toUnicode(name)); + item->setTimeSmart(COL_DURATION, _units, duration); + + auto active_time = duration - idleTime; + auto active_percent = duration == 0 ? 100. : ::profiler_gui::percentReal(active_time, duration); + item->setTimeSmart(COL_ACTIVE_TIME, _units, active_time); + item->setText(COL_ACTIVE_PERCENT, QString::number(active_percent, 'g', 3)); + item->setData(COL_ACTIVE_PERCENT, Qt::UserRole, active_percent); + + item->setTimeMs(COL_BEGIN, startTime - _beginTime); + item->setTimeMs(COL_END, endTime - _beginTime); + + item->setData(COL_PERCENT_PER_FRAME, Qt::UserRole, 0); + + auto percentage_per_thread = ::profiler_gui::percent(duration, block.root->profiled_time); + item->setData(COL_PERCENT_PER_PARENT, Qt::UserRole, percentage_per_thread); + item->setText(COL_PERCENT_PER_PARENT, QString::number(percentage_per_thread)); + + if (gui_block.tree.per_thread_stats != nullptr) // if there is per_thread_stats then there are other stats also + { + const ::profiler::BlockStatistics* per_thread_stats = gui_block.tree.per_thread_stats; + const ::profiler::BlockStatistics* per_parent_stats = gui_block.tree.per_parent_stats; + const ::profiler::BlockStatistics* per_frame_stats = gui_block.tree.per_frame_stats; + + + if (per_thread_stats->calls_number > 1 || !EASY_GLOBALS.display_only_relevant_stats) + { + item->setTimeSmart(COL_MIN_PER_THREAD, _units, easyBlock(per_thread_stats->min_duration_block).tree.node->duration()); + item->setTimeSmart(COL_MAX_PER_THREAD, _units, easyBlock(per_thread_stats->max_duration_block).tree.node->duration()); + item->setTimeSmart(COL_AVERAGE_PER_THREAD, _units, per_thread_stats->average_duration()); + item->setTimeSmart(COL_DURATION_SUM_PER_THREAD, _units, per_thread_stats->total_duration); + } + + item->setData(COL_NCALLS_PER_THREAD, Qt::UserRole, per_thread_stats->calls_number); + item->setText(COL_NCALLS_PER_THREAD, QString::number(per_thread_stats->calls_number)); + + percentage_per_thread = ::profiler_gui::percent(per_thread_stats->total_duration, block.root->profiled_time); + item->setData(COL_PERCENT_SUM_PER_THREAD, Qt::UserRole, percentage_per_thread); + item->setText(COL_PERCENT_SUM_PER_THREAD, QString::number(percentage_per_thread)); + + + if (per_parent_stats->calls_number > 1 || !EASY_GLOBALS.display_only_relevant_stats) + { + item->setTimeSmart(COL_MIN_PER_PARENT, _units, easyBlock(per_parent_stats->min_duration_block).tree.node->duration()); + item->setTimeSmart(COL_MAX_PER_PARENT, _units, easyBlock(per_parent_stats->max_duration_block).tree.node->duration()); + item->setTimeSmart(COL_AVERAGE_PER_PARENT, _units, per_parent_stats->average_duration()); + item->setTimeSmart(COL_DURATION_SUM_PER_PARENT, _units, per_parent_stats->total_duration); + } + + item->setData(COL_NCALLS_PER_PARENT, Qt::UserRole, per_parent_stats->calls_number); + item->setText(COL_NCALLS_PER_PARENT, QString::number(per_parent_stats->calls_number)); + + + if (per_frame_stats->calls_number > 1 || !EASY_GLOBALS.display_only_relevant_stats) + { + item->setTimeSmart(COL_MIN_PER_FRAME, _units, easyBlock(per_frame_stats->min_duration_block).tree.node->duration()); + item->setTimeSmart(COL_MAX_PER_FRAME, _units, easyBlock(per_frame_stats->max_duration_block).tree.node->duration()); + item->setTimeSmart(COL_AVERAGE_PER_FRAME, _units, per_frame_stats->average_duration()); + item->setTimeSmart(COL_DURATION_SUM_PER_FRAME, _units, per_frame_stats->total_duration); + } + + item->setData(COL_NCALLS_PER_FRAME, Qt::UserRole, per_frame_stats->calls_number); + item->setText(COL_NCALLS_PER_FRAME, QString::number(per_frame_stats->calls_number)); + } + else + { + item->setData(COL_PERCENT_SUM_PER_THREAD, Qt::UserRole, 0); + item->setText(COL_PERCENT_SUM_PER_THREAD, ""); + } + + const auto color = easyDescriptor(gui_block.tree.node->id()).color(); + item->setBackgroundColor(color); + +#ifdef EASY_TREE_WIDGET__USE_VECTOR + auto item_index = static_cast(m_items.size()); + m_items.push_back(item); +#endif + + size_t children_items_number = 0; + ::profiler::timestamp_t children_duration = 0; + if (!gui_block.tree.children.empty()) + { + m_iditems.clear(); + + children_items_number = (this->*setTree)(*block.root, firstCswitch, _beginTime, gui_block.tree.children, + item, item, _left, _right, _strict, children_duration, + _addZeroBlocks, _units); + + if (interrupted()) + break; + } + + int percentage = 100; + auto self_duration = duration - children_duration; + if (children_duration > 0 && duration > 0) + { + percentage = static_cast(0.5 + 100. * static_cast(self_duration) / static_cast(duration)); + } + + item->setTimeSmart(COL_SELF_DURATION, _units, self_duration); + item->setData(COL_SELF_DURATION_PERCENT, Qt::UserRole, percentage); + item->setText(COL_SELF_DURATION_PERCENT, QString::number(percentage)); + + if (children_items_number > 0 || !_strict || (startTime >= _left && endTime <= _right)) + { + //total_items += children_items_number + 1; +#ifdef EASY_TREE_WIDGET__USE_VECTOR + gui_block.tree_item = item_index; +#endif + + if (gui_block.expanded) + item->setExpanded(true); + +#ifndef EASY_TREE_WIDGET__USE_VECTOR + m_items.insert(::std::make_pair(block.tree, item)); +#endif + } + else + { +#ifdef EASY_TREE_WIDGET__USE_VECTOR + m_items.pop_back(); +#endif + delete item; + } + + setProgress((90 * ++i) / total); + } + + i = 0; + total = static_cast(threadsMap.size()); + for (auto& it : threadsMap) + { + auto item = it.second; + + if (item->childCount() > 0) + { + //addTopLevelItem(item); + //m_roots[it.first] = item; + + //_items.push_back(item); + m_topLevelItems.emplace_back(it.first, item); + + //++total_items; + } + else + { + delete item; + } + + setProgress(90 + (10 * ++i) / total); + } + + setDone(); + //return total_items; +} + +////////////////////////////////////////////////////////////////////////// + +size_t EasyTreeWidgetLoader::setTreeInternal(const ::profiler::BlocksTreeRoot& _threadRoot, + ::profiler::block_index_t _firstCswitch, + const ::profiler::timestamp_t& _beginTime, + const ::profiler::BlocksTree::children_t& _children, + EasyTreeWidgetItem* _parent, + EasyTreeWidgetItem* _frame, + ::profiler::timestamp_t _left, + ::profiler::timestamp_t _right, + bool _strict, + ::profiler::timestamp_t& _duration, + bool _addZeroBlocks, + ::profiler_gui::TimeUnits _units) +{ + auto const setTree = m_mode == EasyTreeMode_Full ? &EasyTreeWidgetLoader::setTreeInternal : &EasyTreeWidgetLoader::setTreeInternalPlain; + + size_t total_items = 0; + for (auto child_index : _children) + { + if (interrupted()) + break; + + auto& gui_block = easyBlock(child_index); + const auto& child = gui_block.tree; + const auto startTime = child.node->begin(); + const auto endTime = child.node->end(); + const auto duration = endTime - startTime; + + if (duration == 0 && !_addZeroBlocks) + continue; + + _duration += duration; + + if (startTime > _right || endTime < _left) + continue; + + bool hasContextSwitch = false; + ::profiler::timestamp_t idleTime = 0; + for (::profiler::block_index_t ind = _firstCswitch, ncs = static_cast<::profiler::block_index_t>(_threadRoot.sync.size()); ind < ncs; ++ind) + { + auto cs_index = _threadRoot.sync[ind]; + const auto cs = EASY_GLOBALS.gui_blocks[cs_index].tree.node; + + if (cs->begin() > endTime) + { + if (!hasContextSwitch) + _firstCswitch = ind; + break; + } + + if (startTime <= cs->begin() && cs->end() <= endTime) + { + if (!hasContextSwitch) + { + _firstCswitch = ind; + hasContextSwitch = true; + } + + idleTime += cs->duration(); + } + } + + auto item = new EasyTreeWidgetItem(child_index, _parent); + + auto name = *child.node->name() != 0 ? child.node->name() : easyDescriptor(child.node->id()).name(); + item->setText(COL_NAME, ::profiler_gui::toUnicode(name)); + item->setTimeSmart(COL_DURATION, _units, duration); + + auto active_time = duration - idleTime; + auto active_percent = duration == 0 ? 100. : ::profiler_gui::percentReal(active_time, duration); + item->setTimeSmart(COL_ACTIVE_TIME, _units, active_time); + item->setText(COL_ACTIVE_PERCENT, QString::number(active_percent, 'g', 3)); + item->setData(COL_ACTIVE_PERCENT, Qt::UserRole, active_percent); + + item->setTimeMs(COL_BEGIN, startTime - _beginTime); + item->setTimeMs(COL_END, endTime - _beginTime); + item->setData(COL_PERCENT_SUM_PER_THREAD, Qt::UserRole, 0); + + if (child.per_thread_stats != nullptr) // if there is per_thread_stats then there are other stats also + { + const ::profiler::BlockStatistics* per_thread_stats = child.per_thread_stats; + const ::profiler::BlockStatistics* per_parent_stats = child.per_parent_stats; + const ::profiler::BlockStatistics* per_frame_stats = child.per_frame_stats; + + auto parent_duration = _parent->duration(); + auto percentage = duration == 0 ? 0 : ::profiler_gui::percent(duration, parent_duration); + auto percentage_sum = ::profiler_gui::percent(per_parent_stats->total_duration, parent_duration); + item->setData(COL_PERCENT_PER_PARENT, Qt::UserRole, percentage); + item->setText(COL_PERCENT_PER_PARENT, QString::number(percentage)); + item->setData(COL_PERCENT_SUM_PER_PARENT, Qt::UserRole, percentage_sum); + item->setText(COL_PERCENT_SUM_PER_PARENT, QString::number(percentage_sum)); + + if (_frame != nullptr) + { + if (_parent != _frame) + { + parent_duration = _frame->duration(); + percentage = duration == 0 ? 0 : ::profiler_gui::percent(duration, parent_duration); + percentage_sum = ::profiler_gui::percent(per_frame_stats->total_duration, parent_duration); + } + + item->setData(COL_PERCENT_PER_FRAME, Qt::UserRole, percentage); + item->setText(COL_PERCENT_PER_FRAME, QString::number(percentage)); + item->setData(COL_PERCENT_SUM_PER_FRAME, Qt::UserRole, percentage_sum); + item->setText(COL_PERCENT_SUM_PER_FRAME, QString::number(percentage_sum)); + } + else + { + item->setData(COL_PERCENT_PER_FRAME, Qt::UserRole, 0); + item->setData(COL_PERCENT_SUM_PER_FRAME, Qt::UserRole, 0); + + auto percentage_per_thread = ::profiler_gui::percent(duration, _threadRoot.profiled_time); + item->setData(COL_PERCENT_PER_PARENT, Qt::UserRole, percentage_per_thread); + item->setText(COL_PERCENT_PER_PARENT, QString::number(percentage_per_thread)); + } + + + if (per_thread_stats->calls_number > 1 || !EASY_GLOBALS.display_only_relevant_stats) + { + item->setTimeSmart(COL_MIN_PER_THREAD, _units, easyBlock(per_thread_stats->min_duration_block).tree.node->duration()); + item->setTimeSmart(COL_MAX_PER_THREAD, _units, easyBlock(per_thread_stats->max_duration_block).tree.node->duration()); + item->setTimeSmart(COL_AVERAGE_PER_THREAD, _units, per_thread_stats->average_duration()); + item->setTimeSmart(COL_DURATION_SUM_PER_THREAD, _units, per_thread_stats->total_duration); + } + + item->setData(COL_NCALLS_PER_THREAD, Qt::UserRole, per_thread_stats->calls_number); + item->setText(COL_NCALLS_PER_THREAD, QString::number(per_thread_stats->calls_number)); + + auto percentage_per_thread = ::profiler_gui::percent(per_thread_stats->total_duration, _threadRoot.profiled_time); + item->setData(COL_PERCENT_SUM_PER_THREAD, Qt::UserRole, percentage_per_thread); + item->setText(COL_PERCENT_SUM_PER_THREAD, QString::number(percentage_per_thread)); + + + if (per_parent_stats->calls_number > 1 || !EASY_GLOBALS.display_only_relevant_stats) + { + item->setTimeSmart(COL_MIN_PER_PARENT, _units, easyBlock(per_parent_stats->min_duration_block).tree.node->duration()); + item->setTimeSmart(COL_MAX_PER_PARENT, _units, easyBlock(per_parent_stats->max_duration_block).tree.node->duration()); + item->setTimeSmart(COL_AVERAGE_PER_PARENT, _units, per_parent_stats->average_duration()); + item->setTimeSmart(COL_DURATION_SUM_PER_PARENT, _units, per_parent_stats->total_duration); + } + + item->setData(COL_NCALLS_PER_PARENT, Qt::UserRole, per_parent_stats->calls_number); + item->setText(COL_NCALLS_PER_PARENT, QString::number(per_parent_stats->calls_number)); + + + if (per_frame_stats->calls_number > 1 || !EASY_GLOBALS.display_only_relevant_stats) + { + item->setTimeSmart(COL_MIN_PER_FRAME, _units, easyBlock(per_frame_stats->min_duration_block).tree.node->duration()); + item->setTimeSmart(COL_MAX_PER_FRAME, _units, easyBlock(per_frame_stats->max_duration_block).tree.node->duration()); + item->setTimeSmart(COL_AVERAGE_PER_FRAME, _units, per_frame_stats->average_duration()); + item->setTimeSmart(COL_DURATION_SUM_PER_FRAME, _units, per_frame_stats->total_duration); + } + + item->setData(COL_NCALLS_PER_FRAME, Qt::UserRole, per_frame_stats->calls_number); + item->setText(COL_NCALLS_PER_FRAME, QString::number(per_frame_stats->calls_number)); + } + else + { + if (_frame == nullptr) + { + auto percentage_per_thread = ::profiler_gui::percent(duration, _threadRoot.profiled_time); + item->setData(COL_PERCENT_PER_PARENT, Qt::UserRole, percentage_per_thread); + item->setText(COL_PERCENT_PER_PARENT, QString::number(percentage_per_thread)); + } + else + { + item->setData(COL_PERCENT_PER_PARENT, Qt::UserRole, 0); + } + + item->setData(COL_PERCENT_SUM_PER_PARENT, Qt::UserRole, 0); + item->setData(COL_PERCENT_SUM_PER_THREAD, Qt::UserRole, 0); + } + + const auto color = easyDescriptor(child.node->id()).color(); + item->setBackgroundColor(color); + +#ifdef EASY_TREE_WIDGET__USE_VECTOR + auto item_index = static_cast(m_items.size()); + m_items.push_back(item); +#endif + + size_t children_items_number = 0; + ::profiler::timestamp_t children_duration = 0; + if (!child.children.empty()) + { + m_iditems.clear(); + + children_items_number = (this->*setTree)(_threadRoot, _firstCswitch, _beginTime, child.children, item, + _frame ? _frame : item, _left, _right, _strict, children_duration, + _addZeroBlocks, _units); + + if (interrupted()) + break; + } + + int percentage = 100; + auto self_duration = duration - children_duration; + if (children_duration > 0 && duration > 0) + { + percentage = ::profiler_gui::percent(self_duration, duration); + } + + item->setTimeSmart(COL_SELF_DURATION, _units, self_duration); + item->setData(COL_SELF_DURATION_PERCENT, Qt::UserRole, percentage); + item->setText(COL_SELF_DURATION_PERCENT, QString::number(percentage)); + + if (children_items_number > 0 || !_strict || (startTime >= _left && endTime <= _right)) + { + total_items += children_items_number + 1; +#ifdef EASY_TREE_WIDGET__USE_VECTOR + gui_block.tree_item = item_index; +#endif + + if (gui_block.expanded) + item->setExpanded(true); + +#ifndef EASY_TREE_WIDGET__USE_VECTOR + m_items.insert(::std::make_pair(child_index, item)); +#endif + } + else + { +#ifdef EASY_TREE_WIDGET__USE_VECTOR + m_items.pop_back(); +#endif + delete item; + } + } + + return total_items; +} + +////////////////////////////////////////////////////////////////////////// + +::profiler::timestamp_t EasyTreeWidgetLoader::calculateChildrenDurationRecursive(const ::profiler::BlocksTree::children_t& _children, ::profiler::block_id_t _id) +{ + ::profiler::timestamp_t total_duration = 0; + + for (auto child_index : _children) + { + if (interrupted()) + break; + + const auto& gui_block = easyBlock(child_index); + total_duration += gui_block.tree.node->duration(); + if (gui_block.tree.node->id() == _id) + total_duration += calculateChildrenDurationRecursive(gui_block.tree.children, _id); + } + + return total_duration; +} + +size_t EasyTreeWidgetLoader::setTreeInternalPlain(const ::profiler::BlocksTreeRoot& _threadRoot, + ::profiler::block_index_t _firstCswitch, + const ::profiler::timestamp_t& _beginTime, + const ::profiler::BlocksTree::children_t& _children, + EasyTreeWidgetItem*, + EasyTreeWidgetItem* _frame, + ::profiler::timestamp_t _left, + ::profiler::timestamp_t _right, + bool _strict, + ::profiler::timestamp_t& _duration, + bool _addZeroBlocks, + ::profiler_gui::TimeUnits _units) +{ + size_t total_items = 0; + + for (auto child_index : _children) + { + if (interrupted()) + break; + + const auto& gui_block = easyBlock(child_index); + const auto& child = gui_block.tree; + const auto startTime = child.node->begin(); + const auto endTime = child.node->end(); + const auto duration = endTime - startTime; + + _duration += duration; + + auto it = m_iditems.find(child.node->id()); + if (it != m_iditems.end()) + { + ++total_items; + + ::profiler::timestamp_t children_duration = 0; + if (!child.children.empty()) + { + setTreeInternalPlain(_threadRoot, _firstCswitch, _beginTime, child.children, _frame, _frame, _left, + _right, _strict, children_duration, _addZeroBlocks, _units); + + if (interrupted()) + break; + } + + if (it->second != nullptr && child.per_frame_stats != nullptr) + { + auto item = it->second; + + //auto children_duration = calculateChildrenDurationRecursive(child.children, it->first); + if (children_duration != 0) + { + auto self_duration = item->data(COL_SELF_DURATION, Qt::UserRole).toULongLong() - children_duration; + + int percentage = 100; + if (child.per_frame_stats->total_duration > 0) + percentage = ::profiler_gui::percent(self_duration, child.per_frame_stats->total_duration); + + item->setTimeSmart(COL_SELF_DURATION, _units, self_duration); + item->setData(COL_SELF_DURATION_PERCENT, Qt::UserRole, percentage); + item->setText(COL_SELF_DURATION_PERCENT, QString::number(percentage)); + } + + bool hasContextSwitch = false; + ::profiler::timestamp_t idleTime = 0; + for (::profiler::block_index_t ind = _firstCswitch, ncs = static_cast<::profiler::block_index_t>(_threadRoot.sync.size()); ind < ncs; ++ind) + { + auto cs_index = _threadRoot.sync[ind]; + const auto cs = EASY_GLOBALS.gui_blocks[cs_index].tree.node; + + if (cs->begin() > endTime) + { + if (!hasContextSwitch) + _firstCswitch = ind; + break; + } + + if (startTime <= cs->begin() && cs->end() <= endTime) + { + if (!hasContextSwitch) + { + _firstCswitch = ind; + hasContextSwitch = true; + } + + idleTime += cs->duration(); + } + } + + auto active_time = item->data(COL_ACTIVE_TIME, Qt::UserRole).toULongLong() - idleTime; + auto active_percent = child.per_frame_stats->total_duration == 0 ? 100. : ::profiler_gui::percentReal(active_time, child.per_frame_stats->total_duration); + item->setTimeSmart(COL_ACTIVE_TIME, _units, active_time); + item->setText(COL_ACTIVE_PERCENT, QString::number(active_percent, 'g', 3)); + item->setData(COL_ACTIVE_PERCENT, Qt::UserRole, active_percent); + } + + continue; + } + + if (startTime > _right || endTime < _left) + continue; + + bool hasContextSwitch = false; + ::profiler::timestamp_t idleTime = 0; + for (::profiler::block_index_t ind = _firstCswitch, ncs = static_cast<::profiler::block_index_t>(_threadRoot.sync.size()); ind < ncs; ++ind) + { + auto cs_index = _threadRoot.sync[ind]; + const auto cs = EASY_GLOBALS.gui_blocks[cs_index].tree.node; + + if (cs->begin() > endTime) + { + if (!hasContextSwitch) + _firstCswitch = ind; + break; + } + + if (startTime <= cs->begin() && cs->end() <= endTime) + { + if (!hasContextSwitch) + { + _firstCswitch = ind; + hasContextSwitch = true; + } + + idleTime += cs->duration(); + } + } + + auto item = new EasyTreeWidgetItem(child_index, _frame); + + auto name = *child.node->name() != 0 ? child.node->name() : easyDescriptor(child.node->id()).name(); + item->setText(COL_NAME, ::profiler_gui::toUnicode(name)); + + if (child.per_thread_stats != nullptr) // if there is per_thread_stats then there are other stats also + { + const ::profiler::BlockStatistics* per_thread_stats = child.per_thread_stats; + if (per_thread_stats->calls_number > 1 || !EASY_GLOBALS.display_only_relevant_stats) + { + item->setTimeSmart(COL_MIN_PER_THREAD, _units, easyBlock(per_thread_stats->min_duration_block).tree.node->duration()); + item->setTimeSmart(COL_MAX_PER_THREAD, _units, easyBlock(per_thread_stats->max_duration_block).tree.node->duration()); + item->setTimeSmart(COL_AVERAGE_PER_THREAD, _units, per_thread_stats->average_duration()); + } + + item->setTimeSmart(COL_DURATION_SUM_PER_THREAD, _units, per_thread_stats->total_duration); + item->setData(COL_NCALLS_PER_THREAD, Qt::UserRole, per_thread_stats->calls_number); + item->setText(COL_NCALLS_PER_THREAD, QString::number(per_thread_stats->calls_number)); + + auto percentage_per_thread = ::profiler_gui::percent(per_thread_stats->total_duration, _threadRoot.profiled_time); + item->setData(COL_PERCENT_SUM_PER_THREAD, Qt::UserRole, percentage_per_thread); + item->setText(COL_PERCENT_SUM_PER_THREAD, QString::number(percentage_per_thread)); + + const ::profiler::BlockStatistics* per_frame_stats = child.per_frame_stats; + const auto percentage_sum = ::profiler_gui::percent(per_frame_stats->total_duration, _frame->duration()); + item->setData(COL_PERCENT_PER_FRAME, Qt::UserRole, percentage_sum); + item->setText(COL_PERCENT_PER_FRAME, QString::number(percentage_sum)); + + if (per_frame_stats->calls_number > 1 || !EASY_GLOBALS.display_only_relevant_stats) + { + item->setTimeSmart(COL_MIN_PER_FRAME, _units, easyBlock(per_frame_stats->min_duration_block).tree.node->duration()); + item->setTimeSmart(COL_MAX_PER_FRAME, _units, easyBlock(per_frame_stats->max_duration_block).tree.node->duration()); + item->setTimeSmart(COL_AVERAGE_PER_FRAME, _units, per_frame_stats->average_duration()); + } + + item->setTimeSmart(COL_DURATION, _units, per_frame_stats->total_duration); + item->setData(COL_NCALLS_PER_FRAME, Qt::UserRole, per_frame_stats->calls_number); + item->setText(COL_NCALLS_PER_FRAME, QString::number(per_frame_stats->calls_number)); + } + else + { + item->setData(COL_PERCENT_SUM_PER_THREAD, Qt::UserRole, 0); + item->setData(COL_PERCENT_PER_FRAME, Qt::UserRole, 0); + } + + const auto color = easyDescriptor(child.node->id()).color(); + item->setBackgroundColor(color); + +#ifdef EASY_TREE_WIDGET__USE_VECTOR + auto item_index = static_cast(m_items.size()); + m_items.push_back(item); +#endif + m_iditems[child.node->id()] = nullptr; + + size_t children_items_number = 0; + ::profiler::timestamp_t children_duration = 0; + if (!child.children.empty()) + { + children_items_number = setTreeInternalPlain(_threadRoot, _firstCswitch, _beginTime, child.children, _frame, + _frame, _left, _right, _strict, children_duration, + _addZeroBlocks, _units); + + if (interrupted()) + break; + } + + m_iditems[child.node->id()] = item; + + if (child.per_frame_stats != nullptr) + { + int percentage = 100; + auto self_duration = child.per_frame_stats->total_duration - children_duration; + if (child.per_frame_stats->total_duration > 0) + percentage = ::profiler_gui::percent(self_duration, child.per_frame_stats->total_duration); + + item->setTimeSmart(COL_SELF_DURATION, _units, self_duration); + item->setData(COL_SELF_DURATION_PERCENT, Qt::UserRole, percentage); + item->setText(COL_SELF_DURATION_PERCENT, QString::number(percentage)); + + auto active_time = child.per_frame_stats->total_duration - idleTime; + auto active_percent = child.per_frame_stats->total_duration == 0 ? 100. : ::profiler_gui::percentReal(active_time, child.per_frame_stats->total_duration); + item->setTimeSmart(COL_ACTIVE_TIME, _units, active_time); + item->setText(COL_ACTIVE_PERCENT, QString::number(active_percent, 'g', 3)); + item->setData(COL_ACTIVE_PERCENT, Qt::UserRole, active_percent); + } + + if (children_items_number > 0 || !_strict || (startTime >= _left && endTime <= _right)) + { + total_items += children_items_number + 1; +#ifdef EASY_TREE_WIDGET__USE_VECTOR + gui_block.tree_item = item_index; +#endif + + if (gui_block.expanded) + item->setExpanded(true); + +#ifndef EASY_TREE_WIDGET__USE_VECTOR + m_items.insert(::std::make_pair(child_index, item)); +#endif + } + else + { +#ifdef EASY_TREE_WIDGET__USE_VECTOR + m_items.pop_back(); +#endif + delete item; + m_iditems.erase(gui_block.tree.node->id()); + } + } + + return total_items; +} + +////////////////////////////////////////////////////////////////////////// diff --git a/3rdparty/easyprofiler/profiler_gui/tree_widget_loader.h b/3rdparty/easyprofiler/profiler_gui/tree_widget_loader.h new file mode 100644 index 0000000..5e0dc09 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/tree_widget_loader.h @@ -0,0 +1,134 @@ +/************************************************************************ +* file name : tree_widget_loader.h +* ----------------- : +* creation time : 2016/08/18 +* author : Victor Zarubkin +* email : v.s.zarubkin@gmail.com +* ----------------- : +* description : The file contains declaration of EasyTreeWidgetLoader which aim is +* : to load EasyProfiler blocks hierarchy in separate thread. +* ----------------- : +* change log : * 2016/08/18 Victor Zarubkin: moved sources from blocks_tree_widget.h/.cpp +* : and renamed Prof* to Easy*. +* : +* : * +* ----------------- : +* license : Lightweight profiler library for c++ +* : Copyright(C) 2016-2017 Sergey Yagovtsev, Victor Zarubkin +* : +* : Licensed under either of +* : * MIT license (LICENSE.MIT or http://opensource.org/licenses/MIT) +* : * Apache License, Version 2.0, (LICENSE.APACHE or http://www.apache.org/licenses/LICENSE-2.0) +* : at your option. +* : +* : The MIT License +* : +* : Permission is hereby granted, free of charge, to any person obtaining a copy +* : of this software and associated documentation files (the "Software"), to deal +* : in the Software without restriction, including without limitation the rights +* : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +* : of the Software, and to permit persons to whom the Software is furnished +* : to do so, subject to the following conditions: +* : +* : The above copyright notice and this permission notice shall be included in all +* : copies or substantial portions of the Software. +* : +* : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +* : INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +* : PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +* : LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* : TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +* : USE OR OTHER DEALINGS IN THE SOFTWARE. +* : +* : The Apache License, Version 2.0 (the "License") +* : +* : You may not use this file except in compliance with the License. +* : You may obtain a copy of the License at +* : +* : http://www.apache.org/licenses/LICENSE-2.0 +* : +* : Unless required by applicable law or agreed to in writing, software +* : distributed under the License is distributed on an "AS IS" BASIS, +* : WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* : See the License for the specific language governing permissions and +* : limitations under the License. +************************************************************************/ + +#ifndef EASY_TREE_WIDGET_LOADER_H +#define EASY_TREE_WIDGET_LOADER_H + +#include +#include +#include +#include +#include +#include "common_types.h" + +////////////////////////////////////////////////////////////////////////// + +class EasyTreeWidgetItem; + +#ifndef EASY_TREE_WIDGET__USE_VECTOR +using Items = ::std::unordered_map<::profiler::block_index_t, EasyTreeWidgetItem*, ::estd::hash<::profiler::block_index_t> >; +#else +using Items = ::std::vector; +#endif + +using ThreadedItems = ::std::vector<::std::pair<::profiler::thread_id_t, EasyTreeWidgetItem*> >; +using RootsMap = ::std::unordered_map<::profiler::thread_id_t, EasyTreeWidgetItem*, ::estd::hash<::profiler::thread_id_t> >; +using IdItems = ::std::unordered_map<::profiler::block_id_t, EasyTreeWidgetItem*, ::estd::hash<::profiler::block_index_t> >; + +////////////////////////////////////////////////////////////////////////// + +enum EasyTreeMode : uint8_t +{ + EasyTreeMode_Full, + EasyTreeMode_Plain +}; + +////////////////////////////////////////////////////////////////////////// + +class EasyTreeWidgetLoader Q_DECL_FINAL +{ + ThreadedItems m_topLevelItems; ///< + Items m_items; ///< + IdItems m_iditems; ///< + ::std::thread m_thread; ///< + ::std::atomic_bool m_bDone; ///< + ::std::atomic_bool m_bInterrupt; ///< + ::std::atomic m_progress; ///< + EasyTreeMode m_mode; ///< + +public: + + EasyTreeWidgetLoader(); + ~EasyTreeWidgetLoader(); + + int progress() const; + bool done() const; + + void takeTopLevelItems(ThreadedItems& _output); + void takeItems(Items& _output); + + void interrupt(bool _wait = false); + void fillTree(::profiler::timestamp_t& _beginTime, const unsigned int _blocksNumber, const ::profiler::thread_blocks_tree_t& _blocksTree, EasyTreeMode _mode); + void fillTreeBlocks(const::profiler_gui::TreeBlocks& _blocks, ::profiler::timestamp_t _beginTime, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict, EasyTreeMode _mode); + +private: + + bool interrupted() const; + void setDone(); + void setProgress(int _progress); + + void setTreeInternal1(::profiler::timestamp_t& _beginTime, const unsigned int _blocksNumber, const ::profiler::thread_blocks_tree_t& _blocksTree, bool _addZeroBlocks, bool _decoratedThreadNames, bool _hexThreadId, ::profiler_gui::TimeUnits _units); + void setTreeInternal2(const ::profiler::timestamp_t& _beginTime, const ::profiler_gui::TreeBlocks& _blocks, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict, bool _addZeroBlocks, bool _decoratedThreadNames, bool _hexThreadId, ::profiler_gui::TimeUnits _units); + size_t setTreeInternal(const ::profiler::BlocksTreeRoot& _threadRoot, ::profiler::block_index_t _firstCswitch, const ::profiler::timestamp_t& _beginTime, const ::profiler::BlocksTree::children_t& _children, EasyTreeWidgetItem* _parent, EasyTreeWidgetItem* _frame, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict, ::profiler::timestamp_t& _duration, bool _addZeroBlocks, ::profiler_gui::TimeUnits _units); + size_t setTreeInternalPlain(const ::profiler::BlocksTreeRoot& _threadRoot, ::profiler::block_index_t _firstCswitch, const ::profiler::timestamp_t& _beginTime, const ::profiler::BlocksTree::children_t& _children, EasyTreeWidgetItem* _parent, EasyTreeWidgetItem* _frame, ::profiler::timestamp_t _left, ::profiler::timestamp_t _right, bool _strict, ::profiler::timestamp_t& _duration, bool _addZeroBlocks, ::profiler_gui::TimeUnits _units); + + ::profiler::timestamp_t calculateChildrenDurationRecursive(const ::profiler::BlocksTree::children_t& _children, ::profiler::block_id_t _id); + +}; // END of class EasyTreeWidgetLoader. + +////////////////////////////////////////////////////////////////////////// + +#endif // EASY_TREE_WIDGET_LOADER_H diff --git a/3rdparty/easyprofiler/profiler_gui/treeview_first_column_delegate.cpp b/3rdparty/easyprofiler/profiler_gui/treeview_first_column_delegate.cpp new file mode 100644 index 0000000..bc61555 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/treeview_first_column_delegate.cpp @@ -0,0 +1,33 @@ + + +#include +#include +#include "treeview_first_column_delegate.h" +#include "globals.h" + +EasyTreeViewFirstColumnItemDelegate::EasyTreeViewFirstColumnItemDelegate(QObject* parent) : QStyledItemDelegate(parent) +{ + +} + +EasyTreeViewFirstColumnItemDelegate::~EasyTreeViewFirstColumnItemDelegate() +{ + +} + +void EasyTreeViewFirstColumnItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const +{ + // Draw item as usual + QStyledItemDelegate::paint(painter, option, index); + + // Draw line under tree indicator + const auto bottomLeft = option.rect.bottomLeft(); + if (bottomLeft.x() > 0) + { + painter->save(); + painter->setBrush(Qt::NoBrush); + painter->setPen(::profiler_gui::SYSTEM_BORDER_COLOR); + painter->drawLine(QPoint(0, bottomLeft.y()), bottomLeft); + painter->restore(); + } +} \ No newline at end of file diff --git a/3rdparty/easyprofiler/profiler_gui/treeview_first_column_delegate.h b/3rdparty/easyprofiler/profiler_gui/treeview_first_column_delegate.h new file mode 100644 index 0000000..d55c056 --- /dev/null +++ b/3rdparty/easyprofiler/profiler_gui/treeview_first_column_delegate.h @@ -0,0 +1,23 @@ + + + + + +#ifndef EASY_PROFILER_GUI_TREEVIEW_FIRST_COLUMN_DELEGATE_H +#define EASY_PROFILER_GUI_TREEVIEW_FIRST_COLUMN_DELEGATE_H + +#include + +class EasyTreeViewFirstColumnItemDelegate : public QStyledItemDelegate +{ + Q_OBJECT + +public: + + explicit EasyTreeViewFirstColumnItemDelegate(QObject* parent = nullptr); + ~EasyTreeViewFirstColumnItemDelegate() override; + void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; + +}; // END of class EasyTreeViewFirstColumnItemDelegate. + +#endif // EASY_PROFILER_GUI_TREEVIEW_FIRST_COLUMN_DELEGATE_H diff --git a/3rdparty/easyprofiler/reader/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/easyprofiler/reader/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..9ecfcf5 --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/alex/Work/C++Projects/easyprofiler") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/alex/Work/C++Projects/easyprofiler") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/DependInfo.cmake b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/DependInfo.cmake new file mode 100644 index 0000000..235700c --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/DependInfo.cmake @@ -0,0 +1,31 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/alex/Work/C++Projects/easyprofiler/reader/main.cpp" "/home/alex/Work/C++Projects/easyprofiler/reader/CMakeFiles/profiler_reader.dir/main.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "BUILD_WITH_EASY_PROFILER=1" + "EASY_DEFAULT_PORT=28077" + "EASY_PROFILER_VERSION_MAJOR=1" + "EASY_PROFILER_VERSION_MINOR=3" + "EASY_PROFILER_VERSION_PATCH=0" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "easy_profiler_core/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/build.make b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/build.make new file mode 100644 index 0000000..604c854 --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/build.make @@ -0,0 +1,114 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/alex/Work/C++Projects/easyprofiler + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/alex/Work/C++Projects/easyprofiler + +# Include any dependencies generated for this target. +include reader/CMakeFiles/profiler_reader.dir/depend.make + +# Include the progress variables for this target. +include reader/CMakeFiles/profiler_reader.dir/progress.make + +# Include the compile flags for this target's objects. +include reader/CMakeFiles/profiler_reader.dir/flags.make + +reader/CMakeFiles/profiler_reader.dir/main.cpp.o: reader/CMakeFiles/profiler_reader.dir/flags.make +reader/CMakeFiles/profiler_reader.dir/main.cpp.o: reader/main.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object reader/CMakeFiles/profiler_reader.dir/main.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/reader && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_reader.dir/main.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/reader/main.cpp + +reader/CMakeFiles/profiler_reader.dir/main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_reader.dir/main.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/reader && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/reader/main.cpp > CMakeFiles/profiler_reader.dir/main.cpp.i + +reader/CMakeFiles/profiler_reader.dir/main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_reader.dir/main.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/reader && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/reader/main.cpp -o CMakeFiles/profiler_reader.dir/main.cpp.s + +reader/CMakeFiles/profiler_reader.dir/main.cpp.o.requires: + +.PHONY : reader/CMakeFiles/profiler_reader.dir/main.cpp.o.requires + +reader/CMakeFiles/profiler_reader.dir/main.cpp.o.provides: reader/CMakeFiles/profiler_reader.dir/main.cpp.o.requires + $(MAKE) -f reader/CMakeFiles/profiler_reader.dir/build.make reader/CMakeFiles/profiler_reader.dir/main.cpp.o.provides.build +.PHONY : reader/CMakeFiles/profiler_reader.dir/main.cpp.o.provides + +reader/CMakeFiles/profiler_reader.dir/main.cpp.o.provides.build: reader/CMakeFiles/profiler_reader.dir/main.cpp.o + + +# Object files for target profiler_reader +profiler_reader_OBJECTS = \ +"CMakeFiles/profiler_reader.dir/main.cpp.o" + +# External object files for target profiler_reader +profiler_reader_EXTERNAL_OBJECTS = + +bin/profiler_reader: reader/CMakeFiles/profiler_reader.dir/main.cpp.o +bin/profiler_reader: reader/CMakeFiles/profiler_reader.dir/build.make +bin/profiler_reader: bin/libeasy_profiler.so +bin/profiler_reader: reader/CMakeFiles/profiler_reader.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../bin/profiler_reader" + cd /home/alex/Work/C++Projects/easyprofiler/reader && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/profiler_reader.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +reader/CMakeFiles/profiler_reader.dir/build: bin/profiler_reader + +.PHONY : reader/CMakeFiles/profiler_reader.dir/build + +reader/CMakeFiles/profiler_reader.dir/requires: reader/CMakeFiles/profiler_reader.dir/main.cpp.o.requires + +.PHONY : reader/CMakeFiles/profiler_reader.dir/requires + +reader/CMakeFiles/profiler_reader.dir/clean: + cd /home/alex/Work/C++Projects/easyprofiler/reader && $(CMAKE_COMMAND) -P CMakeFiles/profiler_reader.dir/cmake_clean.cmake +.PHONY : reader/CMakeFiles/profiler_reader.dir/clean + +reader/CMakeFiles/profiler_reader.dir/depend: + cd /home/alex/Work/C++Projects/easyprofiler && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/reader /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/reader /home/alex/Work/C++Projects/easyprofiler/reader/CMakeFiles/profiler_reader.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : reader/CMakeFiles/profiler_reader.dir/depend + diff --git a/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/cmake_clean.cmake b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/cmake_clean.cmake new file mode 100644 index 0000000..93ff1ac --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +file(REMOVE_RECURSE + "CMakeFiles/profiler_reader.dir/main.cpp.o" + "../bin/profiler_reader.pdb" + "../bin/profiler_reader" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/profiler_reader.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/depend.make b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/depend.make new file mode 100644 index 0000000..e5f4bcd --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for profiler_reader. +# This may be replaced when dependencies are built. diff --git a/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/flags.make b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/flags.make new file mode 100644 index 0000000..a02c938 --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -O3 -DNDEBUG -DEASY_CHRONO_STEADY_CLOCK=0 -DEASY_CHRONO_HIGHRES_CLOCK=0 -DEASY_OPTION_START_LISTEN_ON_STARTUP=0 -DEASY_OPTION_MEASURE_STORAGE_EXPAND=0 -DEASY_OPTION_STORAGE_EXPAND_BLOCKS_ON=0 -DEASY_OPTION_IMPLICIT_THREAD_REGISTRATION=1 -DEASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS=0 -DEASY_OPTION_LOG_ENABLED=0 -DEASY_OPTION_PRETTY_PRINT_FUNCTIONS=0 -DEASY_OPTION_BUILTIN_COLORS=1 -std=gnu++11 + +CXX_DEFINES = -DBUILD_WITH_EASY_PROFILER=1 -DEASY_DEFAULT_PORT=28077 -DEASY_PROFILER_VERSION_MAJOR=1 -DEASY_PROFILER_VERSION_MINOR=3 -DEASY_PROFILER_VERSION_PATCH=0 + +CXX_INCLUDES = -I/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include + diff --git a/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/link.txt b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/link.txt new file mode 100644 index 0000000..73eee0f --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/profiler_reader.dir/main.cpp.o -o ../bin/profiler_reader -rdynamic ../bin/libeasy_profiler.so -lpthread -Wl,-rpath,/home/alex/Work/C++Projects/easyprofiler/bin diff --git a/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/progress.make b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/progress.make new file mode 100644 index 0000000..335ef43 --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeFiles/profiler_reader.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 30 +CMAKE_PROGRESS_2 = 31 + diff --git a/3rdparty/easyprofiler/reader/CMakeFiles/progress.marks b/3rdparty/easyprofiler/reader/CMakeFiles/progress.marks new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeFiles/progress.marks @@ -0,0 +1 @@ +10 diff --git a/3rdparty/easyprofiler/reader/CMakeLists.txt b/3rdparty/easyprofiler/reader/CMakeLists.txt new file mode 100644 index 0000000..903c910 --- /dev/null +++ b/3rdparty/easyprofiler/reader/CMakeLists.txt @@ -0,0 +1,3 @@ + +add_executable(profiler_reader main.cpp) +target_link_libraries(profiler_reader easy_profiler) diff --git a/3rdparty/easyprofiler/reader/cmake_install.cmake b/3rdparty/easyprofiler/reader/cmake_install.cmake new file mode 100644 index 0000000..bf2dcfa --- /dev/null +++ b/3rdparty/easyprofiler/reader/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/alex/Work/C++Projects/easyprofiler/reader + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/easyprofiler/reader/main.cpp b/3rdparty/easyprofiler/reader/main.cpp new file mode 100644 index 0000000..34a9360 --- /dev/null +++ b/3rdparty/easyprofiler/reader/main.cpp @@ -0,0 +1,146 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class TreePrinter +{ + struct Info{ + std::string name; + std::string info; + }; + std::vector m_rows; + +public: + TreePrinter(){ + + } + void addNewRow(int level) + { + + } + + void printTree() + { + for (auto& row : m_rows){ + std::cout << row.name << " " << row.info << std::endl; + } + } +}; + + +void printTree(TreePrinter& printer, const ::profiler::BlocksTree& tree, int level = 0, profiler::timestamp_t parent_dur = 0, profiler::timestamp_t root_dur = 0) +{ + // + //if (tree.node){ + // auto duration = tree.node->block()->duration(); + // float duration_ms = duration / 1e6f; + // float percent = parent_dur ? float(duration) / float(parent_dur)*100.0f : 100.0f; + // float rpercent = root_dur ? float(duration) / float(root_dur)*100.0f : 100.0f; + // std::cout << std::string(level, '\t') << tree.node->getName() + // << std::string(5 - level, '\t') + // /*<< std::string(level, ' ')*/ << percent << "%| " + // << rpercent << "%| " + // << duration_ms << " ms" + // << std::endl; + // if (root_dur == 0){ + // root_dur = tree.node->block()->duration(); + // } + //} + //else{ + // root_dur = 0; + //} + // + + //for (const auto& i : tree.children){ + + // printTree(printer, i, level + 1, tree.node ? tree.node->block()->duration() : 0, root_dur); + //} +} + +int main(int argc, char* argv[]) +{ + + ::profiler::thread_blocks_tree_t threaded_trees; + + ::std::string filename;// = "test.prof"; + if (argc > 1 && argv[1]) + { + filename = argv[1]; + } + else + { + std::cout << "Specify prof file: "; + std::getline(std::cin, filename); + //return 255; + } + + ::std::string dump_filename; + if (argc > 2 && argv[2]) + { + dump_filename = argv[2]; + } + else + { + std::cout << "Specify output prof file: "; + std::getline(std::cin, dump_filename); + } + + if (dump_filename.size() > 2) + { + EASY_PROFILER_ENABLE; + std::cout << "Will dump reader prof file to " << dump_filename << std::endl; + } + else + { + dump_filename.clear(); + } + + + auto start = std::chrono::system_clock::now(); + + ::profiler::SerializedData serialized_blocks, serialized_descriptors; + ::profiler::descriptors_list_t descriptors; + ::profiler::blocks_t blocks; + ::std::stringstream errorMessage; + uint32_t descriptorsNumberInFile = 0; + uint32_t version = 0; + auto blocks_counter = fillTreesFromFile(filename.c_str(), serialized_blocks, serialized_descriptors, descriptors, blocks, + threaded_trees, descriptorsNumberInFile, version, true, errorMessage); + if (blocks_counter == 0) + std::cout << "Can not read blocks from file " << filename.c_str() << "\nReason: " << errorMessage.str(); + + auto end = std::chrono::system_clock::now(); + + std::cout << "Blocks count: " << blocks_counter << std::endl; + std::cout << "dT = " << std::chrono::duration_cast(end - start).count() << " usec" << std::endl; + //for (const auto & i : threaded_trees){ + // TreePrinter p; + // std::cout << std::string(20, '=') << " thread "<< i.first << " "<< std::string(20, '=') << std::endl; + // printTree(p, i.second.tree,-1); + //} + + if (!dump_filename.empty()) + { + auto bcount = profiler::dumpBlocksToFile(dump_filename.c_str()); + + std::cout << "Blocks count for reader: " << bcount << std::endl; + } + + //char c; + //::std::cin >> c; + + + return 0; +} diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/CMakeDirectoryInformation.cmake b/3rdparty/easyprofiler/sample/CMakeFiles/CMakeDirectoryInformation.cmake new file mode 100644 index 0000000..9ecfcf5 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/CMakeDirectoryInformation.cmake @@ -0,0 +1,16 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Relative path conversion top directories. +set(CMAKE_RELATIVE_PATH_TOP_SOURCE "/home/alex/Work/C++Projects/easyprofiler") +set(CMAKE_RELATIVE_PATH_TOP_BINARY "/home/alex/Work/C++Projects/easyprofiler") + +# Force unix paths in dependencies. +set(CMAKE_FORCE_UNIX_PATHS 1) + + +# The C and CXX include file regular expressions for this directory. +set(CMAKE_C_INCLUDE_REGEX_SCAN "^.*$") +set(CMAKE_C_INCLUDE_REGEX_COMPLAIN "^$") +set(CMAKE_CXX_INCLUDE_REGEX_SCAN ${CMAKE_C_INCLUDE_REGEX_SCAN}) +set(CMAKE_CXX_INCLUDE_REGEX_COMPLAIN ${CMAKE_C_INCLUDE_REGEX_COMPLAIN}) diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/DependInfo.cmake b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/DependInfo.cmake new file mode 100644 index 0000000..60f0791 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/DependInfo.cmake @@ -0,0 +1,31 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/alex/Work/C++Projects/easyprofiler/sample/main.cpp" "/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/profiler_sample.dir/main.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "BUILD_WITH_EASY_PROFILER=1" + "EASY_DEFAULT_PORT=28077" + "EASY_PROFILER_VERSION_MAJOR=1" + "EASY_PROFILER_VERSION_MINOR=3" + "EASY_PROFILER_VERSION_PATCH=0" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "easy_profiler_core/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/build.make b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/build.make new file mode 100644 index 0000000..3e96c75 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/build.make @@ -0,0 +1,114 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/alex/Work/C++Projects/easyprofiler + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/alex/Work/C++Projects/easyprofiler + +# Include any dependencies generated for this target. +include sample/CMakeFiles/profiler_sample.dir/depend.make + +# Include the progress variables for this target. +include sample/CMakeFiles/profiler_sample.dir/progress.make + +# Include the compile flags for this target's objects. +include sample/CMakeFiles/profiler_sample.dir/flags.make + +sample/CMakeFiles/profiler_sample.dir/main.cpp.o: sample/CMakeFiles/profiler_sample.dir/flags.make +sample/CMakeFiles/profiler_sample.dir/main.cpp.o: sample/main.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object sample/CMakeFiles/profiler_sample.dir/main.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/sample && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_sample.dir/main.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/sample/main.cpp + +sample/CMakeFiles/profiler_sample.dir/main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_sample.dir/main.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/sample && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/sample/main.cpp > CMakeFiles/profiler_sample.dir/main.cpp.i + +sample/CMakeFiles/profiler_sample.dir/main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_sample.dir/main.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/sample && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/sample/main.cpp -o CMakeFiles/profiler_sample.dir/main.cpp.s + +sample/CMakeFiles/profiler_sample.dir/main.cpp.o.requires: + +.PHONY : sample/CMakeFiles/profiler_sample.dir/main.cpp.o.requires + +sample/CMakeFiles/profiler_sample.dir/main.cpp.o.provides: sample/CMakeFiles/profiler_sample.dir/main.cpp.o.requires + $(MAKE) -f sample/CMakeFiles/profiler_sample.dir/build.make sample/CMakeFiles/profiler_sample.dir/main.cpp.o.provides.build +.PHONY : sample/CMakeFiles/profiler_sample.dir/main.cpp.o.provides + +sample/CMakeFiles/profiler_sample.dir/main.cpp.o.provides.build: sample/CMakeFiles/profiler_sample.dir/main.cpp.o + + +# Object files for target profiler_sample +profiler_sample_OBJECTS = \ +"CMakeFiles/profiler_sample.dir/main.cpp.o" + +# External object files for target profiler_sample +profiler_sample_EXTERNAL_OBJECTS = + +bin/profiler_sample: sample/CMakeFiles/profiler_sample.dir/main.cpp.o +bin/profiler_sample: sample/CMakeFiles/profiler_sample.dir/build.make +bin/profiler_sample: bin/libeasy_profiler.so +bin/profiler_sample: sample/CMakeFiles/profiler_sample.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../bin/profiler_sample" + cd /home/alex/Work/C++Projects/easyprofiler/sample && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/profiler_sample.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +sample/CMakeFiles/profiler_sample.dir/build: bin/profiler_sample + +.PHONY : sample/CMakeFiles/profiler_sample.dir/build + +sample/CMakeFiles/profiler_sample.dir/requires: sample/CMakeFiles/profiler_sample.dir/main.cpp.o.requires + +.PHONY : sample/CMakeFiles/profiler_sample.dir/requires + +sample/CMakeFiles/profiler_sample.dir/clean: + cd /home/alex/Work/C++Projects/easyprofiler/sample && $(CMAKE_COMMAND) -P CMakeFiles/profiler_sample.dir/cmake_clean.cmake +.PHONY : sample/CMakeFiles/profiler_sample.dir/clean + +sample/CMakeFiles/profiler_sample.dir/depend: + cd /home/alex/Work/C++Projects/easyprofiler && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/sample /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/sample /home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/profiler_sample.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : sample/CMakeFiles/profiler_sample.dir/depend + diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/cmake_clean.cmake b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/cmake_clean.cmake new file mode 100644 index 0000000..4b8b8c5 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +file(REMOVE_RECURSE + "CMakeFiles/profiler_sample.dir/main.cpp.o" + "../bin/profiler_sample.pdb" + "../bin/profiler_sample" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/profiler_sample.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/depend.make b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/depend.make new file mode 100644 index 0000000..6b5fc0b --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for profiler_sample. +# This may be replaced when dependencies are built. diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/flags.make b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/flags.make new file mode 100644 index 0000000..a02c938 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -O3 -DNDEBUG -DEASY_CHRONO_STEADY_CLOCK=0 -DEASY_CHRONO_HIGHRES_CLOCK=0 -DEASY_OPTION_START_LISTEN_ON_STARTUP=0 -DEASY_OPTION_MEASURE_STORAGE_EXPAND=0 -DEASY_OPTION_STORAGE_EXPAND_BLOCKS_ON=0 -DEASY_OPTION_IMPLICIT_THREAD_REGISTRATION=1 -DEASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS=0 -DEASY_OPTION_LOG_ENABLED=0 -DEASY_OPTION_PRETTY_PRINT_FUNCTIONS=0 -DEASY_OPTION_BUILTIN_COLORS=1 -std=gnu++11 + +CXX_DEFINES = -DBUILD_WITH_EASY_PROFILER=1 -DEASY_DEFAULT_PORT=28077 -DEASY_PROFILER_VERSION_MAJOR=1 -DEASY_PROFILER_VERSION_MINOR=3 -DEASY_PROFILER_VERSION_PATCH=0 + +CXX_INCLUDES = -I/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include + diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/link.txt b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/link.txt new file mode 100644 index 0000000..d0949c3 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/profiler_sample.dir/main.cpp.o -o ../bin/profiler_sample -L/home/alex/Work/C++Projects/easyprofiler/../bin -rdynamic ../bin/libeasy_profiler.so -lpthread -Wl,-rpath,/home/alex/Work/C++Projects/easyprofiler/../bin:/home/alex/Work/C++Projects/easyprofiler/bin diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/progress.make b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/progress.make new file mode 100644 index 0000000..e1615c1 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 32 +CMAKE_PROGRESS_2 = 33 + diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/DependInfo.cmake b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/DependInfo.cmake new file mode 100644 index 0000000..228a991 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/DependInfo.cmake @@ -0,0 +1,32 @@ +# The set of languages for which implicit dependencies are needed: +set(CMAKE_DEPENDS_LANGUAGES + "CXX" + ) +# The set of files for implicit dependencies of each language: +set(CMAKE_DEPENDS_CHECK_CXX + "/home/alex/Work/C++Projects/easyprofiler/sample/main.cpp" "/home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o" + ) +set(CMAKE_CXX_COMPILER_ID "GNU") + +# Preprocessor definitions for this target. +set(CMAKE_TARGET_DEFINITIONS_CXX + "BUILD_WITH_EASY_PROFILER=1" + "DISABLE_EASY_PROFILER" + "EASY_DEFAULT_PORT=28077" + "EASY_PROFILER_VERSION_MAJOR=1" + "EASY_PROFILER_VERSION_MINOR=3" + "EASY_PROFILER_VERSION_PATCH=0" + ) + +# The include file search paths: +set(CMAKE_CXX_TARGET_INCLUDE_PATH + "easy_profiler_core/include" + ) + +# Targets to which this target links. +set(CMAKE_TARGET_LINKED_INFO_FILES + "/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/CMakeFiles/easy_profiler.dir/DependInfo.cmake" + ) + +# Fortran module output directory. +set(CMAKE_Fortran_TARGET_MODULE_DIR "") diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/build.make b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/build.make new file mode 100644 index 0000000..17502cf --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/build.make @@ -0,0 +1,114 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# Delete rule output on recipe failure. +.DELETE_ON_ERROR: + + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + + +# Remove some rules from gmake that .SUFFIXES does not remove. +SUFFIXES = + +.SUFFIXES: .hpux_make_needs_suffix_list + + +# Suppress display of executed commands. +$(VERBOSE).SILENT: + + +# A target that is always out of date. +cmake_force: + +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E remove -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/alex/Work/C++Projects/easyprofiler + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/alex/Work/C++Projects/easyprofiler + +# Include any dependencies generated for this target. +include sample/CMakeFiles/profiler_sample_disabled_profiler.dir/depend.make + +# Include the progress variables for this target. +include sample/CMakeFiles/profiler_sample_disabled_profiler.dir/progress.make + +# Include the compile flags for this target's objects. +include sample/CMakeFiles/profiler_sample_disabled_profiler.dir/flags.make + +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o: sample/CMakeFiles/profiler_sample_disabled_profiler.dir/flags.make +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o: sample/main.cpp + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_1) "Building CXX object sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o" + cd /home/alex/Work/C++Projects/easyprofiler/sample && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -o CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o -c /home/alex/Work/C++Projects/easyprofiler/sample/main.cpp + +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.i: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Preprocessing CXX source to CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.i" + cd /home/alex/Work/C++Projects/easyprofiler/sample && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -E /home/alex/Work/C++Projects/easyprofiler/sample/main.cpp > CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.i + +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.s: cmake_force + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green "Compiling CXX source to assembly CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.s" + cd /home/alex/Work/C++Projects/easyprofiler/sample && /usr/bin/c++ $(CXX_DEFINES) $(CXX_INCLUDES) $(CXX_FLAGS) -S /home/alex/Work/C++Projects/easyprofiler/sample/main.cpp -o CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.s + +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o.requires: + +.PHONY : sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o.requires + +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o.provides: sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o.requires + $(MAKE) -f sample/CMakeFiles/profiler_sample_disabled_profiler.dir/build.make sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o.provides.build +.PHONY : sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o.provides + +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o.provides.build: sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o + + +# Object files for target profiler_sample_disabled_profiler +profiler_sample_disabled_profiler_OBJECTS = \ +"CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o" + +# External object files for target profiler_sample_disabled_profiler +profiler_sample_disabled_profiler_EXTERNAL_OBJECTS = + +bin/profiler_sample_disabled_profiler: sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o +bin/profiler_sample_disabled_profiler: sample/CMakeFiles/profiler_sample_disabled_profiler.dir/build.make +bin/profiler_sample_disabled_profiler: bin/libeasy_profiler.so +bin/profiler_sample_disabled_profiler: sample/CMakeFiles/profiler_sample_disabled_profiler.dir/link.txt + @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --green --bold --progress-dir=/home/alex/Work/C++Projects/easyprofiler/CMakeFiles --progress-num=$(CMAKE_PROGRESS_2) "Linking CXX executable ../bin/profiler_sample_disabled_profiler" + cd /home/alex/Work/C++Projects/easyprofiler/sample && $(CMAKE_COMMAND) -E cmake_link_script CMakeFiles/profiler_sample_disabled_profiler.dir/link.txt --verbose=$(VERBOSE) + +# Rule to build all files generated by this target. +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/build: bin/profiler_sample_disabled_profiler + +.PHONY : sample/CMakeFiles/profiler_sample_disabled_profiler.dir/build + +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/requires: sample/CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o.requires + +.PHONY : sample/CMakeFiles/profiler_sample_disabled_profiler.dir/requires + +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/clean: + cd /home/alex/Work/C++Projects/easyprofiler/sample && $(CMAKE_COMMAND) -P CMakeFiles/profiler_sample_disabled_profiler.dir/cmake_clean.cmake +.PHONY : sample/CMakeFiles/profiler_sample_disabled_profiler.dir/clean + +sample/CMakeFiles/profiler_sample_disabled_profiler.dir/depend: + cd /home/alex/Work/C++Projects/easyprofiler && $(CMAKE_COMMAND) -E cmake_depends "Unix Makefiles" /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/sample /home/alex/Work/C++Projects/easyprofiler /home/alex/Work/C++Projects/easyprofiler/sample /home/alex/Work/C++Projects/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/DependInfo.cmake --color=$(COLOR) +.PHONY : sample/CMakeFiles/profiler_sample_disabled_profiler.dir/depend + diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/cmake_clean.cmake b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/cmake_clean.cmake new file mode 100644 index 0000000..38c16f6 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/cmake_clean.cmake @@ -0,0 +1,10 @@ +file(REMOVE_RECURSE + "CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o" + "../bin/profiler_sample_disabled_profiler.pdb" + "../bin/profiler_sample_disabled_profiler" +) + +# Per-language clean rules from dependency scanning. +foreach(lang CXX) + include(CMakeFiles/profiler_sample_disabled_profiler.dir/cmake_clean_${lang}.cmake OPTIONAL) +endforeach() diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/depend.make b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/depend.make new file mode 100644 index 0000000..6291d48 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/depend.make @@ -0,0 +1,2 @@ +# Empty dependencies file for profiler_sample_disabled_profiler. +# This may be replaced when dependencies are built. diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/flags.make b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/flags.make new file mode 100644 index 0000000..084b973 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/flags.make @@ -0,0 +1,10 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.5 + +# compile CXX with /usr/bin/c++ +CXX_FLAGS = -O3 -DNDEBUG -DEASY_CHRONO_STEADY_CLOCK=0 -DEASY_CHRONO_HIGHRES_CLOCK=0 -DEASY_OPTION_START_LISTEN_ON_STARTUP=0 -DEASY_OPTION_MEASURE_STORAGE_EXPAND=0 -DEASY_OPTION_STORAGE_EXPAND_BLOCKS_ON=0 -DEASY_OPTION_IMPLICIT_THREAD_REGISTRATION=1 -DEASY_OPTION_REMOVE_EMPTY_UNGUARDED_THREADS=0 -DEASY_OPTION_LOG_ENABLED=0 -DEASY_OPTION_PRETTY_PRINT_FUNCTIONS=0 -DEASY_OPTION_BUILTIN_COLORS=1 -std=gnu++11 + +CXX_DEFINES = -DBUILD_WITH_EASY_PROFILER=1 -DDISABLE_EASY_PROFILER -DEASY_DEFAULT_PORT=28077 -DEASY_PROFILER_VERSION_MAJOR=1 -DEASY_PROFILER_VERSION_MINOR=3 -DEASY_PROFILER_VERSION_PATCH=0 + +CXX_INCLUDES = -I/home/alex/Work/C++Projects/easyprofiler/easy_profiler_core/include + diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/link.txt b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/link.txt new file mode 100644 index 0000000..caada90 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/link.txt @@ -0,0 +1 @@ +/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/profiler_sample_disabled_profiler.dir/main.cpp.o -o ../bin/profiler_sample_disabled_profiler -L/home/alex/Work/C++Projects/easyprofiler/../bin -rdynamic ../bin/libeasy_profiler.so -lpthread -Wl,-rpath,/home/alex/Work/C++Projects/easyprofiler/../bin:/home/alex/Work/C++Projects/easyprofiler/bin diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/progress.make b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/progress.make new file mode 100644 index 0000000..30c3091 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/profiler_sample_disabled_profiler.dir/progress.make @@ -0,0 +1,3 @@ +CMAKE_PROGRESS_1 = 34 +CMAKE_PROGRESS_2 = 35 + diff --git a/3rdparty/easyprofiler/sample/CMakeFiles/progress.marks b/3rdparty/easyprofiler/sample/CMakeFiles/progress.marks new file mode 100644 index 0000000..48082f7 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeFiles/progress.marks @@ -0,0 +1 @@ +12 diff --git a/3rdparty/easyprofiler/sample/CMakeLists.txt b/3rdparty/easyprofiler/sample/CMakeLists.txt new file mode 100644 index 0000000..dbc31a3 --- /dev/null +++ b/3rdparty/easyprofiler/sample/CMakeLists.txt @@ -0,0 +1,16 @@ +set(CPP_FILES + main.cpp +) + +set(SOURCES + ${CPP_FILES} +) + +link_directories(${CMAKE_SOURCE_DIR}/../bin) + +add_executable(profiler_sample ${SOURCES}) +target_link_libraries(profiler_sample easy_profiler) + +add_executable(profiler_sample_disabled_profiler ${SOURCES}) +target_link_libraries(profiler_sample_disabled_profiler easy_profiler) +target_compile_definitions(profiler_sample_disabled_profiler PRIVATE DISABLE_EASY_PROFILER) diff --git a/3rdparty/easyprofiler/sample/build_express_test.sh b/3rdparty/easyprofiler/sample/build_express_test.sh new file mode 100755 index 0000000..638ee2a --- /dev/null +++ b/3rdparty/easyprofiler/sample/build_express_test.sh @@ -0,0 +1,21 @@ +#!/bin/bash +TEMP_FILE_ENABLE="enable.info" +TEMP_FILE_DISABLE="disable.info" +OBJECTS="1000" + +$CXX_COMPILER -O3 -std=c++11 -I../easy_profiler_core/include/ -L../bin/ -leasy_profiler express_sample.cpp -o express_test_disabled +$CXX_COMPILER -O3 -std=c++11 -I../easy_profiler_core/include/ -L../bin/ -leasy_profiler -DBUILD_WITH_EASY_PROFILER express_sample.cpp -o express_test_enabled + +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:../bin + +./express_test_disabled $OBJECTS > $TEMP_FILE_DISABLE +./express_test_enabled $OBJECTS > $TEMP_FILE_ENABLE + +DT_ENA=`cat $TEMP_FILE_ENABLE | grep Elapsed| awk '{print $3}'` +N_ENA=`cat $TEMP_FILE_ENABLE | grep Blocks| awk '{print $3}'` +DT_DIS=`cat $TEMP_FILE_DISABLE | grep Elapsed| awk '{print $3}'` + +DELTA=$(($DT_ENA-$DT_DIS)) +USEC_BLOCK=`awk "BEGIN{print $DELTA/$N_ENA}"` + +echo "~" $USEC_BLOCK "usec/block" diff --git a/3rdparty/easyprofiler/sample/cmake_install.cmake b/3rdparty/easyprofiler/sample/cmake_install.cmake new file mode 100644 index 0000000..a3eabe7 --- /dev/null +++ b/3rdparty/easyprofiler/sample/cmake_install.cmake @@ -0,0 +1,34 @@ +# Install script for directory: /home/alex/Work/C++Projects/easyprofiler/sample + +# Set the install prefix +if(NOT DEFINED CMAKE_INSTALL_PREFIX) + set(CMAKE_INSTALL_PREFIX "/usr/local") +endif() +string(REGEX REPLACE "/$" "" CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}") + +# Set the install configuration name. +if(NOT DEFINED CMAKE_INSTALL_CONFIG_NAME) + if(BUILD_TYPE) + string(REGEX REPLACE "^[^A-Za-z0-9_]+" "" + CMAKE_INSTALL_CONFIG_NAME "${BUILD_TYPE}") + else() + set(CMAKE_INSTALL_CONFIG_NAME "Release") + endif() + message(STATUS "Install configuration: \"${CMAKE_INSTALL_CONFIG_NAME}\"") +endif() + +# Set the component getting installed. +if(NOT CMAKE_INSTALL_COMPONENT) + if(COMPONENT) + message(STATUS "Install component: \"${COMPONENT}\"") + set(CMAKE_INSTALL_COMPONENT "${COMPONENT}") + else() + set(CMAKE_INSTALL_COMPONENT) + endif() +endif() + +# Install shared libraries without execute permission? +if(NOT DEFINED CMAKE_INSTALL_SO_NO_EXE) + set(CMAKE_INSTALL_SO_NO_EXE "1") +endif() + diff --git a/3rdparty/easyprofiler/sample/express_sample.cpp b/3rdparty/easyprofiler/sample/express_sample.cpp new file mode 100644 index 0000000..4212c48 --- /dev/null +++ b/3rdparty/easyprofiler/sample/express_sample.cpp @@ -0,0 +1,83 @@ +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +int OBJECTS = 500; + +void modellingThread(){ + EASY_THREAD("Modelling"); + + static const int N = OBJECTS; + + volatile double *pos[N]; + for (int i = 0; i < N; ++i) + { + pos[i] = new volatile double[3]; + } + + { + EASY_BLOCK("Collisions"); + volatile int i, j; + volatile double dist; + for (i = 0; i < N; ++i) + { + for (j = i + 1; j < N; ++j) + { + EASY_BLOCK("Check"); + volatile double v[3]; + v[0] = pos[i][0] - pos[j][0]; + v[1] = pos[i][1] - pos[j][1]; + v[2] = pos[i][2] - pos[j][2]; + dist = v[0] * v[0] + v[1] * v[1] + v[2] * v[2]; + if (dist < 10000) + { + dist *= dist; + } + } + } + } + + for (int i = 0; i < N; ++i) + { + delete [] pos[i]; + } +} + +////////////////////////////////////////////////////////////////////////// + +int main(int argc, char* argv[]) +{ + if (argc > 1 && argv[1]){ + OBJECTS = std::atoi(argv[1]); + } + + std::cout << "Objects count: " << OBJECTS << std::endl; + + auto start = std::chrono::system_clock::now(); + + + EASY_PROFILER_ENABLE; + EASY_MAIN_THREAD; + + + modellingThread(); + + auto end = std::chrono::system_clock::now(); + auto elapsed = + std::chrono::duration_cast(end - start); + + std::cout << "Elapsed time: " << elapsed.count() << " usec" << std::endl; + + auto blocks_count = profiler::dumpBlocksToFile("test.prof"); + + std::cout << "Blocks count: " << blocks_count << std::endl; + + return 0; +} diff --git a/3rdparty/easyprofiler/sample/main.cpp b/3rdparty/easyprofiler/sample/main.cpp new file mode 100644 index 0000000..b2e694f --- /dev/null +++ b/3rdparty/easyprofiler/sample/main.cpp @@ -0,0 +1,289 @@ +//#define FULL_DISABLE_PROFILER +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +std::condition_variable cv; +std::mutex cv_m; +int g_i = 0; + +int OBJECTS = 500; +int MODELLING_STEPS = 1500; +int RENDER_STEPS = 1500; +int RESOURCE_LOADING_COUNT = 50; + +#define SAMPLE_NETWORK_TEST + +void localSleep(int magic=200000) +{ + //PROFILER_BEGIN_FUNCTION_BLOCK_GROUPED(profiler::colors::Blue); + volatile int i = 0; + for (; i < magic; ++i); +} + +void loadingResources(){ + EASY_FUNCTION(profiler::colors::DarkCyan); + localSleep(); +// std::this_thread::sleep_for(std::chrono::milliseconds(50)); +} + +void prepareMath(){ + EASY_FUNCTION(profiler::colors::Green); + uint64_t sum = 0; + int* intarray = new int[OBJECTS]; + for (int i = 0; i < OBJECTS; ++i) + { + intarray[i] = i * i; + sum += i * i; + } + delete[] intarray; + //std::this_thread::sleep_for(std::chrono::milliseconds(3)); + + EASY_VALUE("sum", sum, profiler::colors::Blue); +} + +void calcIntersect(){ + EASY_FUNCTION(profiler::colors::Gold); + //int* intarray = new int[OBJECTS * OBJECTS]; + int* intarray = new int[OBJECTS]; + for (int i = 0; i < OBJECTS; ++i) + { + for (int j = i; j < OBJECTS; ++j) + //intarray[i * OBJECTS + j] = i * j - i / 2 + (OBJECTS - j) * 5; + intarray[j] = i * j - i / 2 + (OBJECTS - j) * 5; + } + delete[] intarray; + //std::this_thread::sleep_for(std::chrono::milliseconds(4)); +} + +double multModel(double i) +{ + EASY_FUNCTION(profiler::colors::PaleGold); + return i * sin(i) * cos(i); +} + +void calcPhys(){ + EASY_FUNCTION(profiler::colors::Amber); + double* intarray = new double[OBJECTS]; + for (int i = 0; i < OBJECTS; ++i) + intarray[i] = multModel(double(i)) + double(i / 3) - double((OBJECTS - i) / 2); + calcIntersect(); + delete[] intarray; +} + +double calcSubbrain(int i) +{ + EASY_FUNCTION(profiler::colors::Navy); + auto val = i * i * i - i / 10 + (OBJECTS - i) * 7 ; + EASY_VALUE("subbrainResult", val, profiler::colors::DarkRed); + return val; +} + +void calcBrain(){ + EASY_FUNCTION(profiler::colors::LightBlue); + double* intarray = new double[OBJECTS]; + for (int i = 0; i < OBJECTS; ++i) + intarray[i] = calcSubbrain(i) + double(i * 180 / 3); + delete[] intarray; + //std::this_thread::sleep_for(std::chrono::milliseconds(3)); +} + +void calculateBehavior(){ + EASY_FUNCTION(profiler::colors::Blue); + calcPhys(); + calcBrain(); +} + +void modellingStep(){ + EASY_FUNCTION(); + prepareMath(); + calculateBehavior(); +} + +void prepareRender(){ + EASY_FUNCTION(profiler::colors::Brick); + localSleep(); + //std::this_thread::sleep_for(std::chrono::milliseconds(8)); + +} + +int multPhys(int i) +{ + EASY_FUNCTION(profiler::colors::Red700, profiler::ON); + return i * i * i * i / 100; +} + +int calcPhysicForObject(int i) +{ + EASY_FUNCTION(profiler::colors::Red); + return multPhys(i) + i / 3 - (OBJECTS - i) * 15; +} + +void calculatePhysics(){ + EASY_FUNCTION(profiler::colors::Red); + unsigned int* intarray = new unsigned int[OBJECTS]; + for (int i = 0; i < OBJECTS; ++i) + intarray[i] = calcPhysicForObject(i); + delete[] intarray; + //std::this_thread::sleep_for(std::chrono::milliseconds(8)); +} + +void frame(){ + EASY_FUNCTION(profiler::colors::Magenta); + prepareRender(); + calculatePhysics(); +} + +void loadingResourcesThread(){ + //std::unique_lock lk(cv_m); + //cv.wait(lk, []{return g_i == 1; }); + EASY_THREAD("Resource loading"); +#ifdef SAMPLE_NETWORK_TEST + while (true) { +#else + for(int i = 0; i < RESOURCE_LOADING_COUNT; i++){ +#endif + loadingResources(); + EASY_EVENT("Resources Loading!", profiler::colors::Cyan); + localSleep(1200000); + //std::this_thread::sleep_for(std::chrono::milliseconds(20)); + } +} + +void modellingThread(){ + //std::unique_lock lk(cv_m); + //cv.wait(lk, []{return g_i == 1; }); + EASY_THREAD("Modelling"); + uint64_t step = 0; +#ifdef SAMPLE_NETWORK_TEST + while (true) { +#else + for (int i = 0; i < MODELLING_STEPS; i++){ +#endif + EASY_END_BLOCK; + EASY_NONSCOPED_BLOCK("Frame", true, 15., profiler::ON, -5.f, profiler::colors::Red); + modellingStep(); + + localSleep(1200000); + + ++step; + EASY_VALUE("step", step, profiler::colors::Gold); + if (step > 10000000) + step = 0; + + EASY_TEXT("Test String", "Some short text. Hey!", profiler::colors::Red); + //std::this_thread::sleep_for(std::chrono::milliseconds(20)); + } + EASY_END_BLOCK; +} + +void renderThread(){ + //std::unique_lock lk(cv_m); + //cv.wait(lk, []{return g_i == 1; }); + EASY_THREAD("Render"); +#ifdef SAMPLE_NETWORK_TEST + while (true) { +#else + for (int i = 0; i < RENDER_STEPS; i++){ +#endif + frame(); + localSleep(1200000); + //std::this_thread::sleep_for(std::chrono::milliseconds(20)); + } +} + +////////////////////////////////////////////////////////////////////////// + +int main(int argc, char* argv[]) +{ + if (argc > 1 && argv[1]){ + OBJECTS = std::atoi(argv[1]); + } + if (argc > 2 && argv[2]){ + MODELLING_STEPS = std::atoi(argv[2]); + } + if (argc > 3 && argv[3]){ + RENDER_STEPS = std::atoi(argv[3]); + } + if (argc > 4 && argv[4]){ + RESOURCE_LOADING_COUNT = std::atoi(argv[4]); + } + + std::cout << "Objects count: " << OBJECTS << std::endl; + std::cout << "Render steps: " << MODELLING_STEPS << std::endl; + std::cout << "Modelling steps: " << RENDER_STEPS << std::endl; + std::cout << "Resource loading count: " << RESOURCE_LOADING_COUNT << std::endl; + + auto start = std::chrono::system_clock::now(); + +#ifndef SAMPLE_NETWORK_TEST + EASY_PROFILER_ENABLE; +#endif + + EASY_MAIN_THREAD; + profiler::startListen(); + +#ifdef EASY_CONSTEXPR_AVAILABLE + constexpr int grrr[] {2, -3, 4}; + auto pppp = &grrr; + EASY_ARRAY("threads count", grrr, 3, false, true, "blabla", profiler::colors::Blue/*, EASY_VIN("threads count")*/, profiler::OFF); +#endif + + int* intPtr = new int(2); + EASY_VALUE("count", *intPtr); + + std::vector threads; + //for (int i=0; i < 3; i++) + { + threads.emplace_back(loadingResourcesThread); + threads.emplace_back(renderThread); + threads.emplace_back(modellingThread); + } + + cv_m.lock(); + g_i = 1; + cv_m.unlock(); + cv.notify_all(); + +#ifndef SAMPLE_NETWORK_TEST + std::atomic_bool stop = ATOMIC_VAR_INIT(false); + auto frame_time_printer_thread = std::thread([&stop]() + { + while (!stop.load(std::memory_order_acquire)) + { + std::cout << "Frame time: max " << profiler::main_thread::frameTimeLocalMax() << " us // avg " << profiler::main_thread::frameTimeLocalAvg() << " us\n"; + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } + }); +#endif + + modellingThread(); + +#ifndef SAMPLE_NETWORK_TEST + stop.store(true, std::memory_order_release); + frame_time_printer_thread.join(); +#endif + + for(auto& t : threads) + t.join(); + + auto end = std::chrono::system_clock::now(); + auto elapsed = + std::chrono::duration_cast(end - start); + + std::cout << "Elapsed time: " << elapsed.count() << " usec" << std::endl; + + auto blocks_count = profiler::dumpBlocksToFile("test.prof"); + + std::cout << "Blocks count: " << blocks_count << std::endl; + + return 0; +} diff --git a/3rdparty/easyprofiler/sample/main_clock.cpp b/3rdparty/easyprofiler/sample/main_clock.cpp new file mode 100644 index 0000000..95fa008 --- /dev/null +++ b/3rdparty/easyprofiler/sample/main_clock.cpp @@ -0,0 +1,249 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + + +static inline uint64_t getCurrentTime() +{ +#if defined(__i386__) + int64_t ret; + __asm__ volatile("rdtsc" : "=A"(ret)); + return ret; +#elif defined(__x86_64__) || defined(__amd64__) + uint64_t low, high; + __asm__ volatile("rdtsc" : "=a"(low), "=d"(high)); + return (high << 32) | low; +#endif +} + +int OBJECTS = 500; +#define STR(x) #x + +int64_t calculate_cpu_frequency()//per sec +{ + double g_TicksPerNanoSec; + struct timespec begints, endts; + uint64_t begin = 0, end = 0; + clock_gettime(CLOCK_MONOTONIC, &begints); + begin = getCurrentTime(); + volatile uint64_t i; + for (i = 0; i < 100000000; i++); /* must be CPU intensive */ + end = getCurrentTime(); + clock_gettime(CLOCK_MONOTONIC, &endts); + struct timespec tmpts; + const int NANO_SECONDS_IN_SEC = 1000000000; + tmpts.tv_sec = endts.tv_sec - begints.tv_sec; + tmpts.tv_nsec = endts.tv_nsec - begints.tv_nsec; + if (tmpts.tv_nsec < 0) + { + tmpts.tv_sec--; + tmpts.tv_nsec += NANO_SECONDS_IN_SEC; + } + + uint64_t nsecElapsed = tmpts.tv_sec * 1000000000LL + tmpts.tv_nsec; + g_TicksPerNanoSec = (double)(end - begin) / (double)nsecElapsed; + + int64_t cpu_frequency = int(g_TicksPerNanoSec * 1000); + + return cpu_frequency; +} + +const auto CPU_FREQUENCY = calculate_cpu_frequency(); + +# define TICKS_TO_US(ticks) ticks / CPU_FREQUENCY + +void localSleep(int magic=200000) +{ + volatile int i = 0; + for (; i < magic; ++i); +} + +template +auto calcDelta(int magic=200000) -> decltype(Clock::now().time_since_epoch().count()) +{ + auto start = Clock::now().time_since_epoch().count(); + localSleep(magic); + auto end = Clock::now().time_since_epoch().count(); + return end - start; +} + +template +double calcDuration(int objects) +{ + const auto frequency = Clock::period::den / Clock::period::num; + + auto start = Clock::now(); + + decltype(Clock::now().time_since_epoch().count()) summ = 0; + + for (int i=0; i < objects; i++) + { + summ += calcDelta(); + } + + summ = summ * 1000000LL / frequency; + + auto end = Clock::now(); + auto elapsed = + std::chrono::duration_cast(end - start); + + + return (elapsed.count()-summ)/double(objects)/2.0; +} + +uint64_t calcDeltaRdtsc(int magic=200000) +{ + auto start = getCurrentTime(); + localSleep(magic); + auto end = getCurrentTime(); + return end - start; +} + +double calcDurationByRdtsc(int objects) +{ + auto start = getCurrentTime(); + + uint64_t summ = 0; + + for (int i=0; i < objects; i++) + { + summ += calcDeltaRdtsc(); + } + + auto end = getCurrentTime(); + return TICKS_TO_US((end - start - summ))/double(objects)/2.0; +} + +uint64_t calcDeltaSysCall(int magic, int type) +{ + timespec tp0,tp1; + syscall(SYS_clock_gettime, type, &tp0); + auto start = tp0.tv_sec*1000000000+tp0.tv_nsec; + localSleep(magic); + syscall(SYS_clock_gettime, type, &tp1); + auto end = tp1.tv_sec*1000000000+tp1.tv_nsec; + return end - start; +} + +double calcDurationBySyscall(int objects, int type) +{ + timespec tp0,tp1; + syscall(SYS_clock_gettime, type, &tp0); + auto start = tp0.tv_sec*1000000000+tp0.tv_nsec; + + uint64_t summ = 0; + + for (int i=0; i < objects; i++) + { + summ += calcDeltaSysCall(200000,type); + } + + syscall(SYS_clock_gettime, type, &tp1); + auto end = tp1.tv_sec*1000000000+tp1.tv_nsec; + return (end - start - summ)/double(objects)/2.0/1000.0; +} + +uint64_t calcDeltaSysGetTime(int magic, int type) +{ + timespec tp0,tp1; + clock_gettime(type, &tp0); + auto start = tp0.tv_sec*1000000000+tp0.tv_nsec; + localSleep(magic); + clock_gettime(type, &tp1); + auto end = tp1.tv_sec*1000000000+tp1.tv_nsec; + return end - start; +} + +double calcDurationByGetTime(int objects, int type) +{ + timespec tp0,tp1; + clock_gettime(type, &tp0); + auto start = tp0.tv_sec*1000000000+tp0.tv_nsec; + + uint64_t summ = 0; + + for (int i=0; i < objects; i++) + { + summ += calcDeltaSysGetTime(200000,type); + } + + clock_gettime(type, &tp1); + auto end = tp1.tv_sec*1000000000+tp1.tv_nsec; + return (end - start - summ)/double(objects)/2.0/1000.0; +} + +uint64_t calcDeltaSysGetTimeOfDay(int magic=200000) +{ + timeval tv0,tv1; + gettimeofday(&tv0,0); + auto start = tv0.tv_sec*1000000+tv0.tv_usec; + localSleep(magic); + gettimeofday(&tv1, 0); + auto end = tv1.tv_sec*1000000+tv1.tv_usec; + return end - start; +} + +double calcDurationByGetTimeOfDay(int objects) +{ + timeval tv0,tv1; + gettimeofday(&tv0,0); + auto start = tv0.tv_sec*1000000+tv0.tv_usec; + + uint64_t summ = 0; + + for (int i=0; i < objects; i++) + { + summ += calcDeltaSysGetTimeOfDay(); + } + + gettimeofday(&tv1, 0); + auto end = tv1.tv_sec*1000000+tv1.tv_usec; + return (end - start - summ)/double(objects)/2.0; +} + +int main(int argc, char* argv[]) +{ + if (argc > 1 && argv[1]){ + OBJECTS = std::atoi(argv[1]); + } + + + std::cout << STR(std::chrono::steady_clock) << ": "<(OBJECTS) << " usec\n"; + std::cout << STR(std::chrono::high_resolution_clock)<< ": " << calcDuration(OBJECTS) << " usec\n"; + std::cout << STR(std::chrono::system_clock)<< ": " << calcDuration(OBJECTS) << " usec\n"; + + std::cout << "\n"; + + std::cout << "rdtsc: " << calcDurationByRdtsc(OBJECTS) << " usec\n"; + + std::cout << "\n"; + + std::cout << "syscall(SYS_clock_gettime, CLOCK_MONOTONIC): " << calcDurationBySyscall(OBJECTS,CLOCK_MONOTONIC) << " usec\n"; + std::cout << "syscall(SYS_clock_gettime, CLOCK_REALTIME): " << calcDurationBySyscall(OBJECTS,CLOCK_REALTIME) << " usec\n"; + std::cout << "syscall(SYS_clock_gettime, CLOCK_MONOTONIC_RAW): " << calcDurationBySyscall(OBJECTS,CLOCK_MONOTONIC_RAW) << " usec\n"; + std::cout << "syscall(SYS_clock_gettime, CLOCK_MONOTONIC_COARSE): " << calcDurationBySyscall(OBJECTS,CLOCK_MONOTONIC_COARSE) << " usec\n"; + std::cout << "syscall(SYS_clock_gettime, CLOCK_REALTIME_COARSE): " << calcDurationBySyscall(OBJECTS,CLOCK_REALTIME_COARSE) << " usec\n"; + + std::cout << "\n"; + + std::cout << "clock_gettime(CLOCK_MONOTONIC): " << calcDurationByGetTime(OBJECTS,CLOCK_MONOTONIC) << " usec\n"; + std::cout << "clock_gettime(CLOCK_REALTIME): " << calcDurationByGetTime(OBJECTS,CLOCK_REALTIME) << " usec\n"; + std::cout << "clock_gettime(CLOCK_MONOTONIC_RAW): " << calcDurationByGetTime(OBJECTS,CLOCK_MONOTONIC_RAW) << " usec\n"; + std::cout << "clock_gettime(CLOCK_MONOTONIC_COARSE): " << calcDurationByGetTime(OBJECTS,CLOCK_MONOTONIC_COARSE) << " usec\n"; + std::cout << "clock_gettime(CLOCK_REALTIME_COARSE): " << calcDurationByGetTime(OBJECTS,CLOCK_REALTIME_COARSE) << " usec\n"; + + std::cout << "\n"; + + std::cout << "gettimeofday(): " << calcDurationByGetTimeOfDay(OBJECTS) << " usec\n"; + + return 0; +} diff --git a/3rdparty/easyprofiler/scripts/context_switch_logger.stp b/3rdparty/easyprofiler/scripts/context_switch_logger.stp new file mode 100644 index 0000000..fd10537 --- /dev/null +++ b/3rdparty/easyprofiler/scripts/context_switch_logger.stp @@ -0,0 +1,37 @@ +global target_pid +global target_name + +probe scheduler.ctxswitch { + + if (target_pid != 0 + && next_pid != target_pid + && prev_pid != target_pid) + next + + if (target_name != "" + && prev_task_name != target_name + && next_task_name != target_name) + next + + //printf("Switch from %d(%s) to %d(%s) at %d\n",prev_tid, prev_task_name,next_tid,next_task_name, gettimeofday_ns()) + printf("%d %d %d %s %d\n",gettimeofday_ns(),prev_tid, next_tid, next_task_name,next_pid ) + //printf("%d %d %d\n",gettimeofday_ns(),prev_tid, next_tid ) +} + +probe begin +{ + target_pid = 0 + target_name = "" + + %( $# == 1 || $# > 2 %? + log("Wrong number of arguments, use none, 'pid nr' or 'name proc'") + exit() + %) + + %( $# == 2 %? + if(@1 == "pid") + target_pid = strtol(@2, 10) + if(@1 == "name") + target_name = @2 + %) +} diff --git a/3rdparty/easyprofiler/scripts/make_style.sh b/3rdparty/easyprofiler/scripts/make_style.sh new file mode 100755 index 0000000..6646ccd --- /dev/null +++ b/3rdparty/easyprofiler/scripts/make_style.sh @@ -0,0 +1,19 @@ +if [ "$#" -ne 1 ]; then + echo -e "Usage: \n$0 DIRECTORY\n\twhere DIRECTORY is a derectory with sources for styling" + exit 1 +fi + +if ! [ -x "$(command -v clang-format)" ]; then + echo 'Error: clang-format is not installed. Please install clang-format with minimal version 3.8' >&2 + exit 1 +fi + +DIR=$1 + +FILES=`find $DIR -name "*.h" -or -name "*.cpp"` + +for FILE in $FILES +do + echo "Set style for $FILE" + clang-format -i $FILE +done diff --git a/3rdparty/easyprofiler/scripts/test.sh b/3rdparty/easyprofiler/scripts/test.sh new file mode 100755 index 0000000..4072207 --- /dev/null +++ b/3rdparty/easyprofiler/scripts/test.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +unamestr=`uname` +SUBDIR="./bin" +if [[ ! "$unamestr" == 'Linux' ]]; then + SUBDIR="./bin/Release/" +fi + +DISABLED_PROF=$SUBDIR/profiler_sample_disabled_profiler +ENABLED_PROF=$SUBDIR/profiler_sample + +TEMP_FILE_ENABLE="enable.info" +TEMP_FILE_DISABLE="disable.info" +RESULT_FILE="result.csv" +RESULT_FILE_TMP="result.csv.tmp" + +HEADER="Blocks count, dT prof enabled usec, dT prof disabled usec,delta, usec/block" + +#echo "Blocks count, dT prof enabled usec, dT prof disabled usec,delta, usec/block" > $RESULT_FILE + +rm -rf $RESULT_FILE + +for i in {1..9} +do + OBJECTS_COUNT=$(($i*100)) + for j in {10..15} + do + RENDER_COUNT=$(($j*100)) + for k in {10..15} + do + MODELLING_COUNT=$(($k*100)) + $ENABLED_PROF $OBJECTS_COUNT $RENDER_COUNT $MODELLING_COUNT > $TEMP_FILE_ENABLE + $DISABLED_PROF $OBJECTS_COUNT $RENDER_COUNT $MODELLING_COUNT > $TEMP_FILE_DISABLE + DT_ENA=`cat $TEMP_FILE_ENABLE | grep Elapsed| awk '{print $3}'` + N_ENA=`cat $TEMP_FILE_ENABLE | grep Blocks| awk '{print $3}'` + N_DIS=`cat $TEMP_FILE_DISABLE | grep Elapsed| awk '{print $3}'` + + DELTA=$(($DT_ENA-$N_DIS)) + USEC_BLOCK=`awk "BEGIN{print $DELTA/$N_ENA}"` + + echo $N_ENA,$DT_ENA,$N_DIS,$DELTA,$USEC_BLOCK >> $RESULT_FILE + done + done + echo $i + +done + +cat $RESULT_FILE | sort > $RESULT_FILE_TMP + +echo $HEADER > $RESULT_FILE +cat $RESULT_FILE_TMP >> $RESULT_FILE + +rm -rf $TEMP_FILE_ENABLE +rm -rf $TEMP_FILE_DISABLE +rm -rf $RESULT_FILE_TMP + +echo "See result in $RESULT_FILE" diff --git a/common.pri b/common.pri index cfdac1c..d4514ad 100644 --- a/common.pri +++ b/common.pri @@ -1,16 +1,25 @@ CONFIG *= build_translations +#CONFIG *= easy_profiler !contains(CONFIG, no_zint){ CONFIG *= zint } +INCLUDEPATH += $$PWD/3rdparty/easyprofiler/easy_profiler_core/include +DEPENDPATH += $$PWD/3rdparty/easyprofiler/easy_profiler_core/include + +contains(CONFIG, easy_profiler){ + message(EasyProfiler) + unix|win32: LIBS += -L$$PWD/3rdparty/easyprofiler/build/bin/ -leasy_profiler + DEFINES += BUILD_WITH_EASY_PROFILER +} + !contains(CONFIG, qtscriptengine): greaterThan(QT_MAJOR_VERSION, 4): greaterThan(QT_MINOR_VERSION, 5){ CONFIG *= qjsengine } - !contains(CONFIG, no_formdesigner){ CONFIG *= dialogdesigner } @@ -28,6 +37,7 @@ contains(CONFIG,zint){ greaterThan(QT_MAJOR_VERSION, 4) { QT *= uitools } + lessThan(QT_MAJOR_VERSION, 5){ CONFIG *= uitools } @@ -107,5 +117,3 @@ lessThan(QT_MAJOR_VERSION, 5){ DEFINES *= HAVE_UI_LOADER } } - - diff --git a/demo_r1/mainwindow.cpp b/demo_r1/mainwindow.cpp index 1c82c3a..6771e4b 100644 --- a/demo_r1/mainwindow.cpp +++ b/demo_r1/mainwindow.cpp @@ -38,6 +38,8 @@ #include #include +#include "easy/profiler.h" + MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), m_progressDialog(0), m_customers(0), m_orders(0) @@ -110,22 +112,32 @@ MainWindow::~MainWindow() void MainWindow::on_pushButton_clicked() { + EASY_PROFILER_ENABLE; + EASY_BLOCK("design report"); report->dataManager()->clearUserVariables(); if (!ui->leVariableName->text().isEmpty() && !ui->leVariableValue->text().isEmpty()){ report->dataManager()->setReportVariable(ui->leVariableName->text(), ui->leVariableValue->text()); } report->setShowProgressDialog(false); report->designReport(); + EASY_END_BLOCK; + profiler::dumpBlocksToFile("test.prof"); } void MainWindow::on_pushButton_2_clicked() { QString fileName = QFileDialog::getOpenFileName(this,"Select report file",QApplication::applicationDirPath()+"/demo_reports/","*.lrxml"); if (!fileName.isEmpty()) { + EASY_PROFILER_ENABLE; + EASY_BLOCK("Load file"); report->loadFromFile(fileName); + EASY_END_BLOCK; + EASY_BLOCK("Set report variable"); if (!ui->leVariableName->text().isEmpty() && !ui->leVariableValue->text().isEmpty()){ report->dataManager()->setReportVariable(ui->leVariableName->text(), ui->leVariableValue->text()); } + EASY_END_BLOCK; + profiler::dumpBlocksToFile("test.prof"); report->previewReport(); } } diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 1c14081..a95a309 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -37,6 +37,8 @@ #include #include +#include "easy/profiler.h" + namespace LimeReport{ DataNode::~DataNode() @@ -217,7 +219,7 @@ void DataSourceModel::updateModel() } DataSourceManager::DataSourceManager(QObject *parent) : - QObject(parent), m_lastError(""), m_designTime(true), m_needUpdate(false), m_dbCredentialsProvider(0) + QObject(parent), m_lastError(""), m_designTime(false), m_needUpdate(false), m_dbCredentialsProvider(0) { m_groupFunctionFactory.registerFunctionCreator(QLatin1String("COUNT"),new ConstructorGroupFunctionCreator); m_groupFunctionFactory.registerFunctionCreator(QLatin1String("SUM"),new ConstructorGroupFunctionCreator); @@ -1104,11 +1106,11 @@ QObject* DataSourceManager::elementAt(const QString &collectionName, int index) void DataSourceManager::collectionLoadFinished(const QString &collectionName) { - + EASY_BLOCK("DataSourceManager::collectionLoadFinished"); if (collectionName.compare("connections",Qt::CaseInsensitive) == 0){ } - + EASY_BLOCK("queryes"); if (collectionName.compare("queries",Qt::CaseInsensitive) == 0){ QMutableListIterator it(m_queries); @@ -1125,7 +1127,8 @@ void DataSourceManager::collectionLoadFinished(const QString &collectionName) } } - + EASY_END_BLOCK; + EASY_BLOCK("subqueries") if (collectionName.compare("subqueries",Qt::CaseInsensitive) == 0){ QMutableListIterator it(m_subqueries); @@ -1147,7 +1150,8 @@ void DataSourceManager::collectionLoadFinished(const QString &collectionName) } } - + EASY_END_BLOCK; + EASY_BLOCK("subproxies"); if (collectionName.compare("subproxies",Qt::CaseInsensitive) == 0){ QMutableListIterator it(m_proxies); while (it.hasNext()){ @@ -1160,7 +1164,8 @@ void DataSourceManager::collectionLoadFinished(const QString &collectionName) } } } - + EASY_END_BLOCK; + EASY_BLOCK("variables"); if (collectionName.compare("variables",Qt::CaseInsensitive) == 0){ foreach (VarDesc* item, m_tempVars) { if (!m_reportVariables.containsVariable(item->name())){ @@ -1172,9 +1177,16 @@ void DataSourceManager::collectionLoadFinished(const QString &collectionName) } m_tempVars.clear(); } - - emit datasourcesChanged(); + EASY_END_BLOCK; + if (designTime()){ + EASY_BLOCK("emit datasourcesChanged()"); + emit datasourcesChanged(); + EASY_END_BLOCK; + } + EASY_BLOCK("emit loadCollectionFinished(collectionName)"); emit loadCollectionFinished(collectionName); + EASY_END_BLOCK; + EASY_END_BLOCK; } void DataSourceManager::addVariable(const QString &name, const QVariant &value, VarDesc::VarType type, RenderPass pass) @@ -1184,8 +1196,11 @@ void DataSourceManager::addVariable(const QString &name, const QVariant &value, } else { m_reportVariables.addVariable(name,value,type,pass); } - if (designTime()) - emit datasourcesChanged(); + if (designTime()){ + EASY_BLOCK("DataSourceManager::addVariable emit ds changed"); + emit datasourcesChanged(); + EASY_END_BLOCK; + } } void DataSourceManager::deleteVariable(const QString& name) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 9123426..65beee0 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -56,6 +56,8 @@ #include "lrpreviewreportwidget.h" #include "lrpreviewreportwidget_p.h" +#include "easy/profiler.h" + #ifdef HAVE_STATIC_BUILD #include "lrfactoryinitializer.h" @@ -223,6 +225,12 @@ void ReportEnginePrivate::slotPreviewWindowDestroyed(QObject* window) } } +void ReportEnginePrivate::slotDesignerWindowDestroyed(QObject *window) +{ + Q_UNUSED(window) + dataManager()->setDesignTime(false); +} + void ReportEnginePrivate::clearReport() { foreach(PageDesignIntf* page,m_pages) delete page; @@ -375,7 +383,7 @@ void ReportEnginePrivate::setReportTranslation(const QString &languageName) setReportLanguage(language); } } -}; +} bool ReportEnginePrivate::printReport(QPrinter* printer) { @@ -396,9 +404,10 @@ bool ReportEnginePrivate::printReport(QPrinter* printer) printer =(printer)?printer:m_printer.data(); if (printer&&printer->isValid()){ try{ + bool designTime = dataManager()->designTime(); dataManager()->setDesignTime(false); ReportPages pages = renderToPages(); - dataManager()->setDesignTime(true); + dataManager()->setDesignTime(designTime); if (pages.count()>0){ printReport(pages,*printer); } @@ -601,6 +610,7 @@ void ReportEnginePrivate::setCurrentReportsDir(const QString &dirName) bool ReportEnginePrivate::slotLoadFromFile(const QString &fileName) { + EASY_BLOCK("ReportEnginePrivate::slotLoadFromFile") PreviewReportWindow *currentPreview = qobject_cast(m_activePreview); if (!QFile::exists(fileName)) @@ -642,17 +652,20 @@ bool ReportEnginePrivate::slotLoadFromFile(const QString &fileName) } } } - + EASY_BLOCK("Connect auto connections") dataManager()->connectAutoConnections(); + EASY_END_BLOCK; if ( hasActivePreview() ) { currentPreview->reloadPreview(); } + EASY_END_BLOCK; return true; }; } m_lastError = reader->lastError(); + EASY_END_BLOCK; return false; } @@ -672,6 +685,8 @@ void ReportEnginePrivate::designReport() { ReportDesignWindowInterface* designerWindow = getDesignerWindow(); if (designerWindow){ + dataManager()->setDesignTime(true); + connect(designerWindow, SIGNAL(destroyed(QObject*)), this, SLOT(slotDesignerWindowDestroyed(QObject*))); #ifdef Q_OS_WIN designerWindow->setWindowModality(Qt::ApplicationModal); #endif @@ -709,6 +724,7 @@ QSettings*ReportEnginePrivate::settings() bool ReportEnginePrivate::loadFromFile(const QString &fileName, bool autoLoadPreviewOnChange) { // only watch one file at a time + if ( !m_fileWatcher->files().isEmpty() ) { m_fileWatcher->removePaths( m_fileWatcher->files() ); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 9f7ebf5..5bc2bb4 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -197,7 +197,8 @@ protected: protected slots: void slotDataSourceCollectionLoaded(const QString& collectionName); private slots: - void slotPreviewWindowDestroyed(QObject *window); + void slotPreviewWindowDestroyed(QObject* window); + void slotDesignerWindowDestroyed(QObject* window); private: //ICollectionContainer virtual QObject* createElement(const QString&,const QString&); diff --git a/limereport/serializators/lrxmlreader.cpp b/limereport/serializators/lrxmlreader.cpp index 9b15b30..4bd26e8 100644 --- a/limereport/serializators/lrxmlreader.cpp +++ b/limereport/serializators/lrxmlreader.cpp @@ -36,6 +36,7 @@ #include "lrreporttranslation.h" #include +#include "easy/profiler.h" namespace LimeReport{ @@ -107,6 +108,7 @@ bool XMLReader::readItem(QObject *item) void XMLReader::readItemFromNode(QObject* item,QDomElement *node) { + EASY_BLOCK("readItemFromNode"); ObjectLoadingStateIntf* lf = dynamic_cast(item); if(lf) lf->objectLoadStarted(); for (int i=0;ichildNodes().count();i++){ @@ -129,6 +131,7 @@ void XMLReader::readItemFromNode(QObject* item,QDomElement *node) if (baseItem) baseItem->parentObjectLoadFinished(); } } + EASY_END_BLOCK; } QString XMLReader::lastError() @@ -183,13 +186,16 @@ QVariant XMLReader::getValue(QDomElement *node) void XMLReader::readQObject(QObject* item, QDomElement* node) { + EASY_BLOCK("readQObject"); QObject* childItem = qvariant_cast(item->property(node->nodeName().toLatin1())); if (childItem) readItemFromNode(childItem,node); + EASY_END_BLOCK; } void XMLReader::readCollection(QObject *item, QDomElement *node) { + EASY_BLOCK("readCollection") ICollectionContainer* collection = dynamic_cast(item); if (collection){ QString collectionName = node->nodeName(); @@ -201,6 +207,7 @@ void XMLReader::readCollection(QObject *item, QDomElement *node) } collection->collectionLoadFinished(collectionName); } + EASY_END_BLOCK; } void XMLReader::readTranslation(QObject* item, QDomElement* node) From 32d85816729fd6275c8422d8ad26e9e185cc7925 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 7 Mar 2018 19:46:23 +0300 Subject: [PATCH 122/347] memory leak fixed --- limereport/scripteditor/lrscripthighlighter.cpp | 7 +++++++ limereport/scripteditor/lrscripthighlighter.h | 1 + 2 files changed, 8 insertions(+) diff --git a/limereport/scripteditor/lrscripthighlighter.cpp b/limereport/scripteditor/lrscripthighlighter.cpp index 1dac14b..d6efa5b 100644 --- a/limereport/scripteditor/lrscripthighlighter.cpp +++ b/limereport/scripteditor/lrscripthighlighter.cpp @@ -205,6 +205,13 @@ ScriptHighlighter::ScriptHighlighter(QTextDocument* parent): } } +TextBlockData::~TextBlockData() +{ + foreach(ParenthesisInfo* info, m_parentheses){ + delete info; + } +} + QVector TextBlockData::parentheses() { return m_parentheses; diff --git a/limereport/scripteditor/lrscripthighlighter.h b/limereport/scripteditor/lrscripthighlighter.h index 4580484..136b053 100644 --- a/limereport/scripteditor/lrscripthighlighter.h +++ b/limereport/scripteditor/lrscripthighlighter.h @@ -23,6 +23,7 @@ class TextBlockData : public QTextBlockUserData { public: TextBlockData(){} + ~TextBlockData(); QVector parentheses(); void insert(ParenthesisInfo *info); From c406920206e2be57823f071f2c8cba9842354eed Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 7 Mar 2018 19:50:52 +0300 Subject: [PATCH 123/347] Printable property has been added to PageItem --- limereport/lrpageitemdesignintf.cpp | 16 +++++++++++++--- limereport/lrpageitemdesignintf.h | 6 +++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index fcccff0..2c22102 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -51,7 +51,7 @@ PageItemDesignIntf::PageItemDesignIntf(QObject *owner, QGraphicsItem *parent) : m_pageOrientaion(Portrait), m_pageSize(A4), m_sizeChainging(false), m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false), m_setPageSizeToPrinter(false), - m_endlessHeight(false) + m_endlessHeight(false), m_printable(true) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -64,8 +64,8 @@ PageItemDesignIntf::PageItemDesignIntf(const PageSize pageSize, const QRectF &re m_topMargin(0), m_bottomMargin(0), m_leftMargin(0), m_rightMargin(0), m_pageOrientaion(Portrait), m_pageSize(pageSize), m_sizeChainging(false), m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), - m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false), - m_endlessHeight(false) + m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false), m_setPageSizeToPrinter(false), + m_endlessHeight(false), m_printable(true) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -333,6 +333,16 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } +bool PageItemDesignIntf::isPrintable() const +{ + return m_printable; +} + +void PageItemDesignIntf::setPrintable(bool printable) +{ + m_printable = printable; +} + bool PageItemDesignIntf::endlessHeight() const { return m_endlessHeight; diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 93df860..4204d06 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -58,7 +58,7 @@ class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft Q_PROPERTY(bool pageIsTOC READ isTOC WRITE setIsTOC) Q_PROPERTY(bool setPageSizeToPrinter READ getSetPageSizeToPrinter WRITE setSetPageSizeToPrinter ) Q_PROPERTY(bool endlessHeight READ endlessHeight WRITE setEndlessHeight) - + Q_PROPERTY(bool printable READ isPrintable WRITE setPrintable) friend class ReportRender; public: enum Orientation { Portrait, Landscape }; @@ -138,6 +138,9 @@ public: bool endlessHeight() const; void setEndlessHeight(bool endlessHeight); + bool isPrintable() const; + void setPrintable(bool printable); + signals: void beforeFirstPageRendered(); void afterLastPageRendered(); @@ -175,6 +178,7 @@ private: bool m_isTOC; bool m_setPageSizeToPrinter; bool m_endlessHeight; + bool m_printable; }; typedef QList ReportPages; From 3019f239f04cf75581b73a4b3d97cf6f61a51635 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 7 Mar 2018 19:54:57 +0300 Subject: [PATCH 124/347] Pages are cloned before generation to prevent them from changing by init script --- limereport/lrreportengine.cpp | 47 ++++++++++++------- limereport/lrreportengine_p.h | 4 +- limereport/lrreportrender.cpp | 12 ++--- limereport/lrreportrender.h | 8 ++-- limereport/lrreporttranslation.cpp | 2 +- .../translationeditor/translationeditor.cpp | 10 +++- 6 files changed, 52 insertions(+), 31 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 65beee0..e025379 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -858,13 +858,13 @@ QString ReportEnginePrivate::renderToString() if (m_pages.count()){ render.setDatasources(dataManager()); render.setScriptContext(scriptContext()); - return render.renderPageToString(m_pages.at(0)); + return render.renderPageToString(m_pages.at(0)->pageItem()); }else return QString(); } -PageDesignIntf* ReportEnginePrivate::getPageByName(const QString& pageName) +PageItemDesignIntf* ReportEnginePrivate::getPageByName(const QString& pageName) { - foreach(PageDesignIntf* page, m_pages){ + foreach(PageItemDesignIntf* page, m_renderingPages){ if ( page->objectName().compare(pageName, Qt::CaseInsensitive) == 0) return page; } @@ -931,10 +931,10 @@ void ReportEnginePrivate::activateLanguage(QLocale::Language language) ReportTranslation* translation = m_translations.value(language); foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){ - PageDesignIntf* page = getPageByName(pageTranslation->pageName); + PageItemDesignIntf* page = getPageByName(pageTranslation->pageName); if (page){ foreach(ItemTranslation* itemTranslation, pageTranslation->itemsTranslation){ - BaseDesignIntf* item = page->pageItem()->childByName(itemTranslation->itemName); + BaseDesignIntf* item = page->childByName(itemTranslation->itemName); if (item) { foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){ item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value); @@ -1017,6 +1017,13 @@ void ReportEnginePrivate::setPreviewWindowIcon(const QIcon &previewWindowIcon) m_previewWindowIcon = previewWindowIcon; } +PageItemDesignIntf* ReportEnginePrivate::createRenderingPage(PageItemDesignIntf* page){ + PageItemDesignIntf* result = dynamic_cast(page->cloneItem(page->itemMode())); + ICollectionContainer* co = dynamic_cast(result); + if (co) co->collectionLoadFinished("children"); + return result; +} + ReportPages ReportEnginePrivate::renderToPages() { if (m_reportRendering) return ReportPages(); @@ -1031,6 +1038,7 @@ ReportPages ReportEnginePrivate::renderToPages() this, SIGNAL(renderPageFinished(int))); if (m_pages.count()){ + #ifdef HAVE_UI_LOADER m_scriptEngineContext->initDialogs(); #endif @@ -1041,7 +1049,9 @@ ReportPages ReportEnginePrivate::renderToPages() m_reportRender->setScriptContext(scriptContext()); foreach (PageDesignIntf* page, m_pages) { - scriptContext()->baseDesignIntfToScript(page->pageItem()->objectName(), page->pageItem()); + PageItemDesignIntf* rp = createRenderingPage(page->pageItem()); + m_renderingPages.append(rp); + scriptContext()->baseDesignIntfToScript(rp->objectName(), rp); } scriptContext()->qobjectToScript("engine",this); @@ -1051,27 +1061,25 @@ ReportPages ReportEnginePrivate::renderToPages() activateLanguage(m_reportLanguage); emit renderStarted(); - foreach(PageDesignIntf* page , m_pages){ - if (!page->pageItem()->isTOC()){ + foreach(PageItemDesignIntf* page , m_renderingPages){ + if (!page->isTOC() && page->isPrintable()){ page->setReportSettings(&m_reportSettings); result.append(m_reportRender->renderPageToPages(page)); } } -// m_reportRender->secondRenderPass(result); - - for (int i=0; ipageItem()->isTOC()){ + for (int i=0; iisTOC()){ page->setReportSettings(&m_reportSettings); if (i==0){ - PageDesignIntf* secondPage = 0; - if (m_pages.count()>1) secondPage = m_pages.at(1); + PageItemDesignIntf* secondPage = 0; + if (m_pages.count()>1) secondPage = m_renderingPages.at(1); ReportPages pages = m_reportRender->renderTOC( page, true, - secondPage && secondPage->pageItem()->resetPageNumber() + secondPage && secondPage->resetPageNumber() ); for (int j=0; j m_pages; + QList m_renderingPages; DataSourceManager* m_datasources; ScriptEngineContext* m_scriptEngineContext; ReportRender::Ptr m_reportRender; diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 154ab61..d6876b9 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -187,10 +187,10 @@ void ReportRender::initDatasource(const QString& name){ } } -void ReportRender::renderPage(PageDesignIntf* patternPage, bool isTOC, bool isFirst, bool resetPageNumbers) +void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool isFirst, bool resetPageNumbers) { m_curentNameIndex = 0; - m_patternPageItem = patternPage->pageItem(); + m_patternPageItem = patternPage; m_renderingFirstTOC = isTOC && isFirst; if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) { @@ -269,19 +269,19 @@ PageItemDesignIntf::Ptr ReportRender::pageAt(int index) else return m_renderedPages.at(index); } -QString ReportRender::renderPageToString(PageDesignIntf *patternPage) +QString ReportRender::renderPageToString(PageItemDesignIntf *patternPage) { renderPage(patternPage); return toString(); } -ReportPages ReportRender::renderPageToPages(PageDesignIntf *patternPage) +ReportPages ReportRender::renderPageToPages(PageItemDesignIntf *patternPage) { renderPage(patternPage); return m_renderedPages; } -ReportPages ReportRender::renderTOC(PageDesignIntf* patternPage, bool first, bool resetPages){ +ReportPages ReportRender::renderTOC(PageItemDesignIntf* patternPage, bool first, bool resetPages){ renderPage(patternPage, true, first, resetPages); return m_renderedPages; } @@ -1134,7 +1134,7 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand) { BandDesignIntf* bandClone = dynamic_cast(patternBand->cloneItem(PreviewMode)); - m_scriptEngineContext->baseDesignIntfToScript(patternBand->page()->pageItem()->objectName(), bandClone); + m_scriptEngineContext->baseDesignIntfToScript(patternBand->parent()->objectName(), bandClone); m_scriptEngineContext->setCurrentBand(bandClone); emit(patternBand->beforeRender()); diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index e32d04a..8467656 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -80,9 +80,9 @@ public: DataSourceManager* datasources(){return m_datasources;} int pageCount(); PageItemDesignIntf::Ptr pageAt(int index); - QString renderPageToString(PageDesignIntf *patternPage); - ReportPages renderPageToPages(PageDesignIntf *patternPage); - ReportPages renderTOC(PageDesignIntf* patternPage, bool first, bool resetPages); + QString renderPageToString(PageItemDesignIntf *patternPage); + ReportPages renderPageToPages(PageItemDesignIntf *patternPage); + ReportPages renderTOC(PageItemDesignIntf *patternPage, bool first, bool resetPages); void secondRenderPass(ReportPages renderedPages); signals: void pageRendered(int renderedPageCount); @@ -96,7 +96,7 @@ private: void initGroups(); void clearPageMap(); - void renderPage(PageDesignIntf *patternPage, bool isTOC = false, bool isFirst = false, bool resetPageNumbers = false); + void renderPage(PageItemDesignIntf *patternPage, bool isTOC = false, bool isFirst = false, bool resetPageNumbers = false); BandDesignIntf* renderBand(BandDesignIntf *patternBand, BandDesignIntf *bandData, DataRenderMode mode = NotStartNewPage, bool isLast = false); void renderDataBand(BandDesignIntf* dataBand); void renderPageHeader(PageItemDesignIntf* patternPage); diff --git a/limereport/lrreporttranslation.cpp b/limereport/lrreporttranslation.cpp index 2df00eb..5c8fee8 100644 --- a/limereport/lrreporttranslation.cpp +++ b/limereport/lrreporttranslation.cpp @@ -32,7 +32,7 @@ ReportTranslation::~ReportTranslation() PageTranslation* ReportTranslation::createPageTranslation(PageDesignIntf* page) { PageTranslation* pageTranslation = new PageTranslation; - pageTranslation->pageName = page->objectName(); + pageTranslation->pageName = page->pageItem()->objectName(); foreach(BaseDesignIntf* item, page->pageItem()->allChildBaseItems()){ createItemTranslation(item, pageTranslation); } diff --git a/limereport/translationeditor/translationeditor.cpp b/limereport/translationeditor/translationeditor.cpp index 4db0a6a..f4f4ce6 100644 --- a/limereport/translationeditor/translationeditor.cpp +++ b/limereport/translationeditor/translationeditor.cpp @@ -78,8 +78,14 @@ void TranslationEditor::updateUi() ui->lvLanguages->addItem(QLocale::languageToString(language)); } if (!translations->keys().isEmpty()){ - ui->lvLanguages->item(0)->setSelected(true); - activateLanguage(getLanguageByName(ui->lvLanguages->item(0)->text())); + if (ui->lvLanguages->count()!=0){ + ui->lvLanguages->item(0)->setSelected(true); + activateLanguage(getLanguageByName(ui->lvLanguages->item(0)->text())); + } else { + //activateLanguage(QLocale::AnyLanguage); + ui->twPages->clear(); + ui->tbStrings->setRowCount(0); + } } } } From 4c162e0e470c16e1868490d405759dc938ed94e4 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 14 Mar 2018 11:22:03 +0300 Subject: [PATCH 125/347] Group functions have been changed --- include/lrglobal.h | 2 +- limereport/lrglobal.h | 2 +- limereport/lrgroupfunctions.cpp | 83 ++++++++++++++++++++++------ limereport/lrgroupfunctions.h | 14 +++-- limereport/lrreportrender.cpp | 30 +++++++++- limereport/lrscriptenginemanager.cpp | 11 ++-- limereport/lrscriptenginemanager.h | 2 +- 7 files changed, 111 insertions(+), 33 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index 4829390..4ddad30 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -85,7 +85,7 @@ namespace Const{ const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}"; const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; - const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*.\\w*\\s*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))\\)"; + const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*.\\w*\\s*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))(?:(?:\\s*,\\s*(?:(\\w*)))|(?:))\\)"; const int DATASOURCE_INDEX = 3; const int VALUE_INDEX = 2; const int EXPRESSION_ARGUMENT_INDEX = 1; diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 4829390..4ddad30 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -85,7 +85,7 @@ namespace Const{ const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}"; const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; - const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*.\\w*\\s*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))\\)"; + const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*.\\w*\\s*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))(?:(?:\\s*,\\s*(?:(\\w*)))|(?:))\\)"; const int DATASOURCE_INDEX = 3; const int VALUE_INDEX = 2; const int EXPRESSION_ARGUMENT_INDEX = 1; diff --git a/limereport/lrgroupfunctions.cpp b/limereport/lrgroupfunctions.cpp index c265dfc..b3ea189 100644 --- a/limereport/lrgroupfunctions.cpp +++ b/limereport/lrgroupfunctions.cpp @@ -32,6 +32,7 @@ #include "lrbanddesignintf.h" #include "lritemdesignintf.h" #include "lrscriptenginemanager.h" +#include "lrpageitemdesignintf.h" #include @@ -50,6 +51,7 @@ void GroupFunction::slotBandRendered(BandDesignIntf *band) QString field = rxField.cap(1); if (m_dataManager->containsField(field)){ m_values.push_back(m_dataManager->fieldData(field)); + m_valuesByBand.insert(band, m_dataManager->fieldData(field)); } else { setInvalid(tr("Field \"%1\" not found").arg(m_data)); } @@ -60,6 +62,7 @@ void GroupFunction::slotBandRendered(BandDesignIntf *band) QString var = rxVar.cap(1); if (m_dataManager->containsVariable(var)){ m_values.push_back(m_dataManager->variable(var)); + m_valuesByBand.insert(band, m_dataManager->variable(var)); } else { setInvalid(tr("Variable \"%1\" not found").arg(m_data)); } @@ -70,6 +73,7 @@ void GroupFunction::slotBandRendered(BandDesignIntf *band) QVariant value = sm.evaluateScript(m_data); if (value.isValid()){ m_values.push_back(value); + m_valuesByBand.insert(band, value); } else { setInvalid(tr("Wrong script syntax \"%1\" ").arg(m_data)); } @@ -78,10 +82,12 @@ void GroupFunction::slotBandRendered(BandDesignIntf *band) case ContentItem:{ QString itemName = m_data; ContentItemDesignIntf* item = dynamic_cast(band->childByName(itemName.remove('"'))); - if (item) + if (item){ m_values.push_back(item->content()); - else if (m_name.compare("COUNT",Qt::CaseInsensitive) == 0) { + m_valuesByBand.insert(band, item->content()); + } else if (m_name.compare("COUNT",Qt::CaseInsensitive) == 0) { m_values.push_back(1); + m_valuesByBand.insert(band, 1); } else setInvalid(tr("Item \"%1\" not found").arg(m_data)); break; @@ -153,20 +159,32 @@ GroupFunctionFactory::~GroupFunctionFactory() m_creators.clear(); } -QVariant SumGroupFunction::calculate() +QVariant SumGroupFunction::calculate(PageItemDesignIntf *page) { - QVariant res=0; - foreach(QVariant value,values()){ - res=addition(res,value); + QVariant res = 0; + if (!page){ + foreach(QVariant value,values()){ + res = addition(res,value); + } + } else { + foreach (BandDesignIntf* band, page->bands()) { + res = addition(res, m_valuesByBand.value(band)); + } } return res; } -QVariant AvgGroupFunction::calculate() +QVariant AvgGroupFunction::calculate(PageItemDesignIntf *page) { - QVariant res=QVariant(); - foreach(QVariant value,values()){ - res=addition(res,value); + QVariant res = QVariant(); + if (!page){ + foreach(QVariant value,values()){ + res=addition(res,value); + } + } else { + foreach (BandDesignIntf* band, page->bands()) { + res = addition(res, m_valuesByBand.value(band)); + } } if (!res.isNull()&&(values().count()>0)){ res=division(res,values().count()); @@ -174,29 +192,58 @@ QVariant AvgGroupFunction::calculate() return res; } -QVariant MinGroupFunction::calculate() +QVariant MinGroupFunction::calculate(PageItemDesignIntf *page) { //TODO: check variant type QVariant res = QVariant(); - if (!values().empty()) res = values().at(0); - foreach(QVariant value, values()){ - if (res.toDouble()>value.toDouble()) res = value; + if (!page){ + if (!values().empty()) res = values().at(0); + foreach(QVariant value, values()){ + if (res.toDouble() > value.toDouble()) res = value; + } + } else { + if (!page->bands().empty()) res = m_valuesByBand.value(page->bands().at(0)); + foreach (BandDesignIntf* band, page->bands()) { + if (res.toDouble() > m_valuesByBand.value(band).toDouble()) res = m_valuesByBand.value(band); + } } return res; } -QVariant MaxGroupFunction::calculate() +QVariant MaxGroupFunction::calculate(PageItemDesignIntf *page) { //TODO: check variant type QVariant res = QVariant(); - if (!values().empty()) res = values().at(0); - foreach(QVariant value, values()){ - if (res.toDouble()bands().empty()) res = m_valuesByBand.value(page->bands().at(0)); + foreach (BandDesignIntf* band, page->bands()) { + if (res.toDouble() < m_valuesByBand.value(band).toDouble()) res = m_valuesByBand.value(band); + } } return res; } +QVariant CountGroupFunction::calculate(PageItemDesignIntf *page){ + if (!page){ + return values().count(); + } else { + int res = 0; + foreach (BandDesignIntf* band, page->bands()) { + if (!m_valuesByBand.value(band).isNull()){ + res++; + } + } + return res; + } +} + } //namespace LimeReport diff --git a/limereport/lrgroupfunctions.h b/limereport/lrgroupfunctions.h index f85a0bd..28cc08b 100644 --- a/limereport/lrgroupfunctions.h +++ b/limereport/lrgroupfunctions.h @@ -38,6 +38,7 @@ namespace LimeReport{ class DataSourceManager; class BandDesignIntf; +class PageItemDesignIntf; class GroupFunction : public QObject{ Q_OBJECT @@ -50,8 +51,9 @@ public: const QString& data(){return m_data;} const QString& error(){return m_errorMessage;} QVector& values(){return m_values;} + QHash m_valuesByBand; const QString& dataBandName(){return m_dataBandName;} - virtual QVariant calculate()=0; + virtual QVariant calculate(PageItemDesignIntf* page = 0)=0; public slots: void slotBandRendered(BandDesignIntf* band); protected: @@ -95,7 +97,7 @@ public: CountGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) :GroupFunction(expression, dataBandName, dataManager){setName("COUNT");} protected: - virtual QVariant calculate(){return values().count();} + virtual QVariant calculate(PageItemDesignIntf* page = 0); }; class SumGroupFunction :public GroupFunction{ @@ -104,7 +106,7 @@ public: SumGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) :GroupFunction(expression, dataBandName, dataManager){setName("SUM");} protected: - virtual QVariant calculate(); + virtual QVariant calculate(PageItemDesignIntf* page = 0); }; class AvgGroupFunction :public GroupFunction{ @@ -113,7 +115,7 @@ public: AvgGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) :GroupFunction(expression, dataBandName, dataManager){setName("AVG");} protected: - virtual QVariant calculate(); + virtual QVariant calculate(PageItemDesignIntf* page = 0); }; class MinGroupFunction :public GroupFunction{ @@ -122,7 +124,7 @@ public: MinGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) :GroupFunction(expression, dataBandName, dataManager){setName("MIN");} protected: - virtual QVariant calculate(); + virtual QVariant calculate(PageItemDesignIntf* page = 0); }; class MaxGroupFunction :public GroupFunction{ @@ -131,7 +133,7 @@ public: MaxGroupFunction(const QString& expression, const QString& dataBandName, DataSourceManager *dataManager) :GroupFunction(expression, dataBandName, dataManager){setName("MAX");} protected: - virtual QVariant calculate(); + virtual QVariant calculate(PageItemDesignIntf* page = 0); }; template diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index d6876b9..725c969 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -253,7 +253,7 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool } #ifndef USE_QJSENGINE - ScriptEngineManager::instance().scriptEngine()->popContext(); + Manager::instance().scriptEScriptEnginengine()->popContext(); #endif } @@ -294,6 +294,24 @@ void ReportRender::initRenderPage() m_renderPageItem->setItemMode(PreviewMode); m_renderPageItem->setPatternName(m_patternPageItem->objectName()); m_renderPageItem->setPatternItem(m_patternPageItem); + + ScriptValueType svCurrentPage; + ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); + +#ifdef USE_QJSENGINE + svCurrentPage = getCppOwnedJSValue(*se, m_renderPageItem); + se->globalObject().setProperty("currentPage", svCurrentPage); +#else + svCurrentPage = se->globalObject().property("currentPage"); + if (svCurrentPage.isValid()){ + se->newQObject(svCurrentPage, m_renderPageItem); + } else { + svThis = se->newQObject(m_renderPageItem); + se->globalObject().setProperty("currentPage", svCurrentPage); + } +#endif + + } } @@ -384,7 +402,15 @@ void ReportRender::replaceGroupFunctionsInItem(ContentItemDesignIntf* contentIte QVector captures = normalizeCaptures(rx); if (captures.size() >= 3){ QString expressionIndex = datasources()->putGroupFunctionsExpressions(captures.at(Const::VALUE_INDEX)); - content.replace(captures.at(0),QString("%1(%2,%3)").arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"')); + if (captures.size()<5){ + content.replace(captures.at(0),QString("%1(%2,%3)").arg(functionName).arg('"'+expressionIndex+'"').arg('"'+band->objectName()+'"')); + } else { + content.replace(captures.at(0),QString("%1(%2,%3,%4)") + .arg(functionName) + .arg('"'+expressionIndex+'"') + .arg('"'+band->objectName()+'"') + .arg(captures.at(4))); + } } pos += rx.matchedLength(); } diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 2bc89a5..50ef677 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -41,6 +41,7 @@ #include "lrdatasourcemanager.h" #include "lrbasedesignintf.h" #include "lrbanddesignintf.h" +#include "lrpageitemdesignintf.h" Q_DECLARE_METATYPE(QColor) Q_DECLARE_METATYPE(QFont) @@ -340,8 +341,9 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ func+"(\""+tr("FieldName")+"\",\""+tr("BandName")+"\")", LimeReport::Const::FUNCTION_MANAGER_NAME, m_functionManager, - QString("function %1(fieldName,bandName){\ - return %2.calcGroupFunction(\"%1\",fieldName,bandName);}" + QString("function %1(fieldName, bandName, pageitem){\ + pageitem = typeof pageitem !== 'undefined' ? pageitem : 0; \ + return %2.calcGroupFunction(\"%1\",fieldName, bandName, pageitem);}" ).arg(func) .arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); @@ -1444,14 +1446,15 @@ void JSFunctionDesc::setScriptWrapper(const QString &scriptWrapper) m_scriptWrapper = scriptWrapper; } -QVariant ScriptFunctionsManager::calcGroupFunction(const QString &name, const QString &expressionID, const QString &bandName) +QVariant ScriptFunctionsManager::calcGroupFunction(const QString &name, const QString &expressionID, const QString &bandName, QObject* currentPage) { if (m_scriptEngineManager->dataManager()){ + PageItemDesignIntf* pageItem = dynamic_cast(currentPage); QString expression = m_scriptEngineManager->dataManager()->getExpression(expressionID); GroupFunction* gf = m_scriptEngineManager->dataManager()->groupFunction(name,expression,bandName); if (gf){ if (gf->isValid()){ - return gf->calculate(); + return gf->calculate(pageItem); }else{ return gf->error(); } diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index dc30657..c263b39 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -305,7 +305,7 @@ public: ~ScriptFunctionsManager(){ foreach(IWrapperCreator* wrapper, m_wrappersFactory.values()){ delete wrapper;} m_wrappersFactory.clear(); } - Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName); + Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName, QObject* currentPage); Q_INVOKABLE QVariant line(const QString& bandName); Q_INVOKABLE QVariant numberFormat(QVariant value, const char &format, int precision, const QString &locale); Q_INVOKABLE QVariant dateFormat(QVariant value, const QString& format); From e5e2de70bf385ed928b5bb0e4d70ea4b88245745 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 15 Mar 2018 22:58:08 +0300 Subject: [PATCH 126/347] Printing large pages fixed --- limereport/lrreportengine.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index e025379..2b60610 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -291,10 +291,6 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) qreal leftMargin, topMargin, rightMargin, bottomMargin; printer.getPageMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin, QPrinter::Millimeter); - QRectF printerPageRect = printer.pageRect(QPrinter::Millimeter); - printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR, - (printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR); - foreach(PageItemDesignIntf::Ptr page, pages){ if ( @@ -342,7 +338,11 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) } else { isFirst=false; painter = new QPainter(&printer); - } + } + + QRectF printerPageRect = printer.pageRect(QPrinter::Millimeter); + printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR, + (printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR); if (printerPageRect.width() < page->geometry().width()){ qreal pageWidth = page->geometry().width(); From 3bbc02507a1b0dbfc51ed0427f4d27f7b6bb9324 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 16 Mar 2018 19:12:14 +0300 Subject: [PATCH 127/347] Load image from variable has been added --- limereport/items/lrimageitem.cpp | 55 +++++++++++++++++++++----------- limereport/items/lrimageitem.h | 7 +++- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/limereport/items/lrimageitem.cpp b/limereport/items/lrimageitem.cpp index 1233ac0..72f5a62 100644 --- a/limereport/items/lrimageitem.cpp +++ b/limereport/items/lrimageitem.cpp @@ -54,6 +54,28 @@ BaseDesignIntf *ImageItem::createSameTypeItem(QObject *owner, QGraphicsItem *par return new ImageItem(owner,parent); } +void ImageItem::loadPictureFromVariant(QVariant& data){ + if (data.isValid()){ + if (data.type()==QVariant::Image){ + m_picture = data.value(); + } else { + switch (m_format) { + default: + case Binary: + m_picture.loadFromData(data.toByteArray()); + break; + case Hex: + m_picture.loadFromData(QByteArray::fromHex(data.toByteArray())); + break; + case Base64: + m_picture.loadFromData(QByteArray::fromBase64(data.toByteArray())); + break; + } + } + + } +} + void ImageItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) { @@ -62,28 +84,13 @@ void ImageItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, IDataSource* ds = dataManager->dataSource(m_datasource); if (ds) { QVariant data = ds->data(m_field); - if (data.isValid()){ - if (data.type()==QVariant::Image){ - m_picture = data.value(); - } else { - switch (m_format) { - default: - case Binary: - m_picture.loadFromData(data.toByteArray()); - break; - case Hex: - m_picture.loadFromData(QByteArray::fromHex(data.toByteArray())); - break; - case Base64: - m_picture.loadFromData(QByteArray::fromBase64(data.toByteArray())); - break; - } - } - - } + loadPictureFromVariant(data); } } else if (!m_resourcePath.isEmpty()){ m_picture = QImage(m_resourcePath); + } else if (!m_variable.isEmpty()){ + QVariant data = dataManager->variable(m_variable); + loadPictureFromVariant(data); } } if (m_autoSize){ @@ -112,6 +119,16 @@ qreal ImageItem::minHeight() const{ } } +void ImageItem::setVariable(const QString& content) +{ + if (m_variable!=content){ + QString oldValue = m_variable; + m_variable=content; + update(); + notify("content", oldValue, m_variable); + } +} + bool ImageItem::center() const { return m_center; diff --git a/limereport/items/lrimageitem.h b/limereport/items/lrimageitem.h index 18b236f..0c8c807 100644 --- a/limereport/items/lrimageitem.h +++ b/limereport/items/lrimageitem.h @@ -47,6 +47,7 @@ class ImageItem : public LimeReport::ItemDesignIntf Q_PROPERTY(bool keepAspectRatio READ keepAspectRatio WRITE setKeepAspectRatio) Q_PROPERTY(bool center READ center WRITE setCenter) Q_PROPERTY(QString resourcePath READ resourcePath WRITE setResourcePath) + Q_PROPERTY(QString variable READ variable WRITE setVariable) public: enum Format { Binary = 0, @@ -75,14 +76,16 @@ public: void setCenter(bool center); Format format() const; void setFormat(Format format); - qreal minHeight() const; + QString variable(){ return m_variable;} + void setVariable(const QString& variable); protected: BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent); void updateItemSize(DataSourceManager *dataManager, RenderPass pass, int maxHeight); bool isNeedUpdateSize(RenderPass) const; bool drawDesignBorders() const {return m_picture.isNull();} + void loadPictureFromVariant(QVariant& data); private: QImage m_picture; QString m_resourcePath; @@ -93,6 +96,8 @@ private: bool m_keepAspectRatio; bool m_center; Format m_format; + QString m_variable; + }; } From 01e36f3bbe398be5922685d5949e61dc31c4a4e3 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 22 Mar 2018 02:38:42 +0300 Subject: [PATCH 128/347] build without qtscriptengine fixed --- common.pri | 15 ++++++++++++--- limereport/items/lrtextitem.cpp | 2 ++ limereport/lrreportrender.cpp | 4 ++-- limereport/lrscriptenginemanager.cpp | 4 ++++ limereport/lrscriptenginemanager.h | 8 +++++--- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/common.pri b/common.pri index f224530..c39e56c 100644 --- a/common.pri +++ b/common.pri @@ -14,11 +14,19 @@ contains(CONFIG, easy_profiler){ DEFINES += BUILD_WITH_EASY_PROFILER } -!contains(CONFIG, qtscriptengine): -greaterThan(QT_MAJOR_VERSION, 4): +!contains(CONFIG, qtscriptengine){ +greaterThan(QT_MAJOR_VERSION, 4){ greaterThan(QT_MINOR_VERSION, 5){ CONFIG *= qjsengine } +} +} + +contains(CONFIG, qtscriptengine){ + CONFIG -= qjsengine + QT *= script + message(qtscriptengine) +} !contains(CONFIG, no_formdesigner){ CONFIG *= dialogdesigner @@ -93,7 +101,8 @@ LIMEREPORT_VERSION_RELEASE = 68 LIMEREPORT_VERSION = '$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}' DEFINES *= LIMEREPORT_VERSION_STR=\\\"$${LIMEREPORT_VERSION}\\\" -QT *= script xml sql +QT *= xml sql + REPORT_PATH = $$PWD/limereport TRANSLATIONS_PATH = $$PWD/translations diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 9bd5b0e..4c0df76 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -29,7 +29,9 @@ ****************************************************************************/ #include #include +#ifndef USE_QJSENGINE #include +#endif #include #include #include diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 49c3dba..0d30ffc 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -253,7 +253,7 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool } #ifndef USE_QJSENGINE - Manager::instance().scriptEScriptEnginengine()->popContext(); + ScriptEngineManager::instance().scriptEngine()->popContext(); #endif } @@ -306,7 +306,7 @@ void ReportRender::initRenderPage() if (svCurrentPage.isValid()){ se->newQObject(svCurrentPage, m_renderPageItem); } else { - svThis = se->newQObject(m_renderPageItem); + svCurrentPage = se->newQObject(m_renderPageItem); se->globalObject().setProperty("currentPage", svCurrentPage); } #endif diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 50ef677..d50de7e 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -31,7 +31,9 @@ #include #include +#ifndef USE_QJSENGINE #include +#endif #include #ifdef HAVE_UI_LOADER #include @@ -47,11 +49,13 @@ Q_DECLARE_METATYPE(QColor) Q_DECLARE_METATYPE(QFont) Q_DECLARE_METATYPE(LimeReport::ScriptEngineManager *) +#ifndef USE_QJSENGINE QScriptValue constructColor(QScriptContext *context, QScriptEngine *engine) { QColor color(context->argument(0).toString()); return engine->toScriptValue(color); } +#endif namespace LimeReport{ diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index c263b39..41d9b96 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -29,14 +29,15 @@ ****************************************************************************/ #ifndef LRSCRIPTENGINEMANAGER_H #define LRSCRIPTENGINEMANAGER_H - +#ifndef USE_QJSENGINE #include +#include +#endif #include #include #include #include #include -#include #include #include @@ -440,6 +441,7 @@ private: }; +#ifndef USE_QJSENGINE class QFontPrototype : public QObject, public QScriptable { Q_OBJECT Q_PROPERTY(QString family READ family) @@ -486,9 +488,9 @@ public: return qScriptValueFromValue(engine, font); } }; +#endif } - #ifndef USE_QJSENGINE Q_DECLARE_METATYPE(LimeReport::ComboBoxPrototype*) Q_DECLARE_METATYPE(QComboBox*) From f8b9a1c53d4013f714bcce769194c242c2712397 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 22 Mar 2018 18:07:56 +0300 Subject: [PATCH 129/347] Font editor has been fixed --- limereport/items/editors/lrfonteditorwidget.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/limereport/items/editors/lrfonteditorwidget.cpp b/limereport/items/editors/lrfonteditorwidget.cpp index 28212f5..2d6bcad 100644 --- a/limereport/items/editors/lrfonteditorwidget.cpp +++ b/limereport/items/editors/lrfonteditorwidget.cpp @@ -122,6 +122,7 @@ void FontEditorWidget::slotFontAttribsChanged(bool) { if (m_ignoreSlots) return; m_resFont = m_fontNameEditor->currentFont(); + m_resFont.setPointSize(m_fontSizeEditor->currentText().toInt()); m_resFont.setBold(m_fontBold->isChecked()); m_resFont.setItalic(m_fontItalic->isChecked()); m_resFont.setUnderline(m_fontUnderline->isChecked()); From 15345d44a7c0769d2b1827d9328c6d0480299ac5 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 22 Mar 2018 20:10:45 +0300 Subject: [PATCH 130/347] Default item editor title changed --- limereport/lrbasedesignintf.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 6e6cb56..27ae5f3 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1183,6 +1183,7 @@ void BaseDesignIntf::showEditorDialog(){ dialog->layout()->setContentsMargins(2,2,2,2); dialog->layout()->addWidget(editor); connect(editor,SIGNAL(destroyed()),dialog,SLOT(close())); + dialog->setWindowTitle(editor->windowTitle()); dialog->exec(); #endif } From 785b6cec67e865c10b09ac90bc25cbdd9645d1a6 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 22 Mar 2018 20:26:07 +0300 Subject: [PATCH 131/347] Watermark property can be changed by context menu --- limereport/items/lrimageitem.cpp | 15 +++++++++++++++ limereport/items/lrimageitem.h | 2 ++ limereport/items/lrtextitem.cpp | 6 ++++++ 3 files changed, 23 insertions(+) diff --git a/limereport/items/lrimageitem.cpp b/limereport/items/lrimageitem.cpp index 72f5a62..a271cda 100644 --- a/limereport/items/lrimageitem.cpp +++ b/limereport/items/lrimageitem.cpp @@ -31,6 +31,7 @@ #include "lrdesignelementsfactory.h" #include "lrglobal.h" #include "lrdatasourcemanager.h" +#include "lrpagedesignintf.h" namespace{ @@ -76,6 +77,20 @@ void ImageItem::loadPictureFromVariant(QVariant& data){ } } +void ImageItem::preparePopUpMenu(QMenu &menu) +{ + QAction* action = menu.addAction(tr("Watermark")); + action->setCheckable(true); + action->setChecked(isWatermark()); +} + +void ImageItem::processPopUpAction(QAction *action) +{ + if (action->text().compare(tr("Watermark")) == 0){ + page()->setPropertyToSelectedItems("watermark",action->isChecked()); + } +} + void ImageItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) { diff --git a/limereport/items/lrimageitem.h b/limereport/items/lrimageitem.h index 4c16699..f6713df 100644 --- a/limereport/items/lrimageitem.h +++ b/limereport/items/lrimageitem.h @@ -87,6 +87,8 @@ protected: bool isNeedUpdateSize(RenderPass) const; bool drawDesignBorders() const {return m_picture.isNull();} void loadPictureFromVariant(QVariant& data); + void preparePopUpMenu(QMenu &menu); + void processPopUpAction(QAction *action); private: QImage m_picture; QString m_resourcePath; diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 772f084..47318dc 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -111,6 +111,9 @@ void TextItem::preparePopUpMenu(QMenu &menu) action->setCheckable(true); action->setChecked(backgroundMode() == TransparentMode); + action = menu.addAction(tr("Watermark")); + action->setCheckable(true); + action->setChecked(isWatermark()); } void TextItem::processPopUpAction(QAction *action) @@ -137,6 +140,9 @@ void TextItem::processPopUpAction(QAction *action) setProperty("backgroundMode",OpaqueMode); } } + if (action->text().compare(tr("Watermark")) == 0){ + page()->setPropertyToSelectedItems("watermark",action->isChecked()); + } } void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, QWidget* widget) { From fbbf6af33dbd6cec2b4175b35ad517f272c107f1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 22 Mar 2018 23:00:51 +0300 Subject: [PATCH 132/347] Build has been fixed --- common.pri | 3 ++- demo_r1/mainwindow.cpp | 10 ++++++++++ limereport/lrdatasourcemanager.cpp | 5 +++++ limereport/lrreportengine.cpp | 5 +++++ limereport/scripteditor/lrscripteditor.cpp | 4 ++++ limereport/serializators/lrxmlreader.cpp | 5 +++++ 6 files changed, 31 insertions(+), 1 deletion(-) diff --git a/common.pri b/common.pri index 0fc4cca..fda2b99 100644 --- a/common.pri +++ b/common.pri @@ -16,9 +16,10 @@ contains(CONFIG, easy_profiler){ !contains(CONFIG, qtscriptengine){ greaterThan(QT_MAJOR_VERSION, 4){ -greaterThan(QT_MINOR_VERSION, 5){ CONFIG *= qjsengine } +lessThan(QT_MAJOR_VERSION, 5){ + CONFIG *= qtscriptengine } } diff --git a/demo_r1/mainwindow.cpp b/demo_r1/mainwindow.cpp index 6771e4b..48da52f 100644 --- a/demo_r1/mainwindow.cpp +++ b/demo_r1/mainwindow.cpp @@ -38,7 +38,13 @@ #include #include +#ifndef HAVE_QT4 #include "easy/profiler.h" +#else +# define EASY_BLOCK(...) +# define EASY_END_BLOCK +# define EASY_PROFILER_ENABLE +#endif MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), @@ -121,7 +127,9 @@ void MainWindow::on_pushButton_clicked() report->setShowProgressDialog(false); report->designReport(); EASY_END_BLOCK; +#ifndef HAVE_QT4 profiler::dumpBlocksToFile("test.prof"); +#endif } void MainWindow::on_pushButton_2_clicked() @@ -137,7 +145,9 @@ void MainWindow::on_pushButton_2_clicked() report->dataManager()->setReportVariable(ui->leVariableName->text(), ui->leVariableValue->text()); } EASY_END_BLOCK; +#ifndef HAVE_QT4 profiler::dumpBlocksToFile("test.prof"); +#endif report->previewReport(); } } diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index a95a309..60a61fe 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -37,7 +37,12 @@ #include #include +#ifndef HAVE_QT4 #include "easy/profiler.h" +#else +# define EASY_BLOCK(...) +# define EASY_END_BLOCK +#endif namespace LimeReport{ diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 2b60610..d938b2e 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -56,7 +56,12 @@ #include "lrpreviewreportwidget.h" #include "lrpreviewreportwidget_p.h" +#ifndef HAVE_QT4 #include "easy/profiler.h" +#else +# define EASY_BLOCK(...) +# define EASY_END_BLOCK +#endif #ifdef HAVE_STATIC_BUILD diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 1b84f25..61eacf5 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -312,7 +312,11 @@ QStringList ReportStructureCompleater::extractSlotNames(BaseDesignIntf *item) for(int i = mo->methodOffset(); i < mo->methodCount(); ++i) { if (mo->method(i).methodType() == QMetaMethod::Signal) { +#ifndef HAVE_QT4 result.append(QString::fromLatin1(mo->method(i).name())); +#else + result.append(QString::fromLatin1(mo->method(i).signature())); +#endif } } mo = mo->superClass(); diff --git a/limereport/serializators/lrxmlreader.cpp b/limereport/serializators/lrxmlreader.cpp index 4bd26e8..8748ae5 100644 --- a/limereport/serializators/lrxmlreader.cpp +++ b/limereport/serializators/lrxmlreader.cpp @@ -36,7 +36,12 @@ #include "lrreporttranslation.h" #include +#ifndef HAVE_QT4 #include "easy/profiler.h" +#else +# define EASY_BLOCK(...) +# define EASY_END_BLOCK +#endif namespace LimeReport{ From dcae0255aec90a8aefa8d75230874156371ae6a4 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Fri, 23 Mar 2018 00:03:43 +0300 Subject: [PATCH 133/347] Script editor modified --- limereport/images/property.png | Bin 0 -> 266 bytes limereport/images/signal.png | Bin 0 -> 509 bytes limereport/report.qrc | 2 ++ limereport/scripteditor/lrscripteditor.cpp | 31 ++++++++++++++++++--- limereport/scripteditor/lrscripteditor.h | 1 + 5 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 limereport/images/property.png create mode 100644 limereport/images/signal.png diff --git a/limereport/images/property.png b/limereport/images/property.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4efaa2b2f72ea065ff42c270bf15aaf3b5b511 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE9)O4kwElYQpMSoJ4w^wYmd=h<;HU0e&g9mIe zmy|`XE?i|_UD_d6E7HBq>`l*x(`Jz`zQ34p)M!et-PapG@A|PZY&jiPm$|s%&U5XA z`)?oLx-RZ~SkL0HL5uY<&8sVCuyoj+n&JHSJ6}m1Yuum5S|=-C-2DS|B7>)^pUXO@ GgeCx(RAZF@ literal 0 HcmV?d00001 diff --git a/limereport/images/signal.png b/limereport/images/signal.png new file mode 100644 index 0000000000000000000000000000000000000000..864c27d8d127b03453cfddca6d0d03c63b8eb0c1 GIT binary patch literal 509 zcmV|M9 zJjTaNzy@N#KCmlY=@ur?ufy6xdZHrr{@i#I4P{16BnK=5CqO?i86>d^)z#IIi3zV_ z|KhPXB3;=5i~#dM3fKbDKtefc?=yq$@acNgKJIMepvKA*11+R0mw*h=1PlU`Ks7J} zB)^GhX>Z38mD_dUP%E0tm!XwIVA_Nov--dZV76!p0MeEBKz-mS3&eplBWzANs#g5b z;images/deleteDialog.png images/copy3.png images/paste2.png + images/property.png + images/signal.png diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 61eacf5..e385308 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -219,8 +219,6 @@ void ScriptEditor::slotOnCurrentChanged(const QModelIndex &to, const QModelIndex } } - - QString ReportStructureCompleater::pathFromIndex(const QModelIndex &index) const { QStringList dataList; @@ -284,15 +282,24 @@ void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterfa itemNode->setText(page->pageItem()->objectName()); m_model.invisibleRootItem()->appendRow(itemNode); - QStringList slotsNames = extractSlotNames(page->pageItem()); - foreach(QString slotName, slotsNames){ + QStringList items = extractSlotNames(page->pageItem()); + foreach(QString slotName, items){ QStandardItem* slotItem = new QStandardItem; slotItem->setText(slotName); + slotItem->setIcon(QIcon(":/report/images/signal")); itemNode->appendRow(slotItem); } + items = extractPropertyes(page->pageItem()); + foreach(QString propertyName, items){ + QStandardItem* properyItem = new QStandardItem; + properyItem->setText(propertyName); + properyItem->setIcon(QIcon(":/report/images/property")); + itemNode->appendRow(properyItem); + } foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ addChildItem(item, itemNode->text(), m_model.invisibleRootItem()); } + } } } @@ -325,6 +332,22 @@ QStringList ReportStructureCompleater::extractSlotNames(BaseDesignIntf *item) return result; } +QStringList ReportStructureCompleater::extractPropertyes(BaseDesignIntf *item) +{ + QStringList result; + if (!item) return result; + QMetaObject const * mo = item->metaObject(); + while (mo){ + for(int i = mo->propertyOffset(); i < mo->propertyCount(); ++i) + { + result.append(QString::fromLatin1(mo->property(i).name())); + } + mo = mo->superClass(); + } + result.sort(); + return result; +} + void ReportStructureCompleater::addChildItem(BaseDesignIntf *item, const QString &pageName, QStandardItem *parent) { if (!item) return; diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index 666dbc9..31d16fd 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -34,6 +34,7 @@ public: void updateCompleaterModel(DataSourceManager* dataManager); protected: QStringList extractSlotNames(BaseDesignIntf* item); + QStringList extractPropertyes(BaseDesignIntf* item); void addChildItem(BaseDesignIntf *item, const QString &pageName, QStandardItem *parent); void addAdditionalDatawords(DataSourceManager *dataManager); private: From 9219529e0ac14ab44e0c4594a67a40379addd00a Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Fri, 23 Mar 2018 00:25:58 +0300 Subject: [PATCH 134/347] Script editor modified --- limereport/images/object.png | Bin 0 -> 382 bytes limereport/report.qrc | 1 + limereport/scripteditor/lrscripteditor.cpp | 17 ++++++++++++----- 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 limereport/images/object.png diff --git a/limereport/images/object.png b/limereport/images/object.png new file mode 100644 index 0000000000000000000000000000000000000000..807c2a8848b87b5678c89a707536572e353e3bc1 GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkEE5mfigYDlfNQnBO7gq407_!|`)#&vLGA`^`|e zYUc3|32EgI>{Eo-#9#fMlk(d^dIh6*!lIe;&Q^cE9^_axQ*GTNIo8fSzx>`jYCn_q zJ1OPG-tecOi}*F9a4|JB@}#^dW5HobilogA>oySk@ess~Dk^nMeJYP!<3@z}S+^ZctXKesRA Zo-cksvE%4E(>PEtdb;|#taD0e0szuLp&$SN literal 0 HcmV?d00001 diff --git a/limereport/report.qrc b/limereport/report.qrc index 23d48f9..fe70d36 100644 --- a/limereport/report.qrc +++ b/limereport/report.qrc @@ -181,5 +181,6 @@ images/paste2.png images/property.png images/signal.png + images/object.png diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index e385308..d78a361 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -280,6 +280,7 @@ void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterfa QStandardItem* itemNode = new QStandardItem; itemNode->setText(page->pageItem()->objectName()); + itemNode->setIcon(QIcon(":/report/images/object")); m_model.invisibleRootItem()->appendRow(itemNode); QStringList items = extractSlotNames(page->pageItem()); @@ -354,19 +355,25 @@ void ReportStructureCompleater::addChildItem(BaseDesignIntf *item, const QString QStandardItem* itemNode = new QStandardItem; itemNode->setText(pageName+"_"+item->objectName()); + itemNode->setIcon(QIcon(":/report/images/object")); parent->appendRow(itemNode); - QStringList slotNames = extractSlotNames(item); - foreach(QString slotName, slotNames){ + QStringList items = extractSlotNames(item); + foreach(QString slotName, items){ QStandardItem* slotItem = new QStandardItem; slotItem->setText(slotName); + slotItem->setIcon(QIcon(":/report/images/signal")); itemNode->appendRow(slotItem); } - //BandDesignIntf* band = dynamic_cast(item); - //if (band){ + items = extractPropertyes(item); + foreach(QString propertyName, items){ + QStandardItem* properyItem = new QStandardItem; + properyItem->setText(propertyName); + properyItem->setIcon(QIcon(":/report/images/property")); + itemNode->appendRow(properyItem); + } foreach (BaseDesignIntf* child, item->childBaseItems()){ addChildItem(child, pageName, parent); } - //} } } // namespace LimeReport From ddc19ed879b1945e6e68fca7feffe1d478556f6b Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 23 Mar 2018 01:17:15 +0300 Subject: [PATCH 135/347] MacOS build fixed --- 3rdparty/zint-2.6.1/backend/emf.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/3rdparty/zint-2.6.1/backend/emf.c b/3rdparty/zint-2.6.1/backend/emf.c index 94c1425..8e9ba0f 100644 --- a/3rdparty/zint-2.6.1/backend/emf.c +++ b/3rdparty/zint-2.6.1/backend/emf.c @@ -35,7 +35,10 @@ #include #include #include +#include +#ifdef _MSC_VER #include +#endif #include "common.h" #include "emf.h" From 3e0b58d3e22a32a072a3fbe2797fc85ce52fc289 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Mon, 26 Mar 2018 23:57:44 +0300 Subject: [PATCH 136/347] DocWidget title color fixed --- 3rdparty/dark_style_sheet/qdarkstyle/style.qss | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 1642eca..59941f4 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -949,6 +949,12 @@ QDockWidget { titlebar-normal-icon: url(:/qss_icons/rc/undock.png); } +QDockWidget::title{ + background: #383838; + padding-left: 5px; +} + + QDockWidget::close-button, QDockWidget::float-button { border: 1px solid transparent; border-radius: 2px; From 3f96bf298e3a64ab427d7b2c4a926f62e1828afe Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 15 Mar 2018 23:35:29 +0300 Subject: [PATCH 137/347] Context items added to pagefooter band --- limereport/bands/lrpagefooter.cpp | 39 ++++++++++++++++++++++++++++--- limereport/bands/lrpagefooter.h | 4 +++- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/limereport/bands/lrpagefooter.cpp b/limereport/bands/lrpagefooter.cpp index c5be0fb..a6b304f 100644 --- a/limereport/bands/lrpagefooter.cpp +++ b/limereport/bands/lrpagefooter.cpp @@ -30,6 +30,7 @@ #include "lrpagefooter.h" #include "lrdesignelementsfactory.h" #include "lrglobal.h" +#include "lrpagedesignintf.h" const QString xmlTag ="PageFooter"; @@ -62,7 +63,29 @@ BaseDesignIntf *PageFooter::createSameTypeItem(QObject *owner, QGraphicsItem *pa QColor PageFooter::bandColor() const { - return QColor(246,120,12); + return QColor(246,120,12); +} + +void PageFooter::preparePopUpMenu(QMenu &menu) +{ + QAction* action = menu.addAction(tr("Print on first page")); + action->setCheckable(true); + action->setChecked(printOnFirstPage()); + + action = menu.addAction(tr("Print on last page")); + action->setCheckable(true); + action->setChecked(printOnLastPage()); + +} + +void PageFooter::processPopUpAction(QAction *action) +{ + if (action->text().compare(tr("Print on first page")) == 0){ + page()->setPropertyToSelectedItems("printOnFirstPage",action->isChecked()); + } + if (action->text().compare(tr("Print on last page")) == 0){ + page()->setPropertyToSelectedItems("printOnLastPage",action->isChecked()); + } } bool PageFooter::printOnFirstPage() const @@ -72,7 +95,12 @@ bool PageFooter::printOnFirstPage() const void PageFooter::setPrintOnFirstPage(bool printOnFirstPage) { - m_printOnFirstPage = printOnFirstPage; + if (m_printOnFirstPage != printOnFirstPage){ + bool oldValue = m_printOnFirstPage; + m_printOnFirstPage = printOnFirstPage; + update(); + notify("printOnFirstPage",oldValue,printOnFirstPage); + } } bool PageFooter::printOnLastPage() const @@ -82,7 +110,12 @@ bool PageFooter::printOnLastPage() const void PageFooter::setPrintOnLastPage(bool printOnLastPage) { - m_printOnLastPage = printOnLastPage; + if (m_printOnLastPage != printOnLastPage){ + bool oldValue = m_printOnLastPage; + m_printOnLastPage = printOnLastPage; + update(); + notify("printOnLastPage",oldValue,printOnLastPage); + } } } // namespace LimeReport diff --git a/limereport/bands/lrpagefooter.h b/limereport/bands/lrpagefooter.h index d6678a3..2f634a5 100644 --- a/limereport/bands/lrpagefooter.h +++ b/limereport/bands/lrpagefooter.h @@ -50,7 +50,9 @@ public: void setPrintOnFirstPage(bool printOnFirstPage); protected: - QColor bandColor() const; + QColor bandColor() const; + void preparePopUpMenu(QMenu &menu); + void processPopUpAction(QAction *action); private: bool m_printOnFirstPage; bool m_printOnLastPage; From ebefde8231f3ade048fa6fff9e868b9d46abbfb3 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 28 Mar 2018 12:04:53 +0300 Subject: [PATCH 138/347] Background fixed --- limereport/items/lrtextitem.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 47318dc..a022147 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -563,8 +563,11 @@ void TextItem::setTextLayoutDirection(const Qt::LayoutDirection &textLayoutDirec void TextItem::setWatermark(bool watermark) { - setBackgroundMode(TransparentMode); + if (watermark){ + setBackgroundMode(TransparentMode); + } BaseDesignIntf::setWatermark(watermark); + } From 891622e2b3e0a7c0e66456b78f49a81096fb90cc Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 29 Mar 2018 23:18:15 +0300 Subject: [PATCH 139/347] Color property drawing has been changed --- .../objectinspector/editors/lrcoloreditor.cpp | 5 +++-- .../propertyItems/lrcolorpropitem.cpp | 16 +++++++++------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/limereport/objectinspector/editors/lrcoloreditor.cpp b/limereport/objectinspector/editors/lrcoloreditor.cpp index e845d76..b0f4c19 100644 --- a/limereport/objectinspector/editors/lrcoloreditor.cpp +++ b/limereport/objectinspector/editors/lrcoloreditor.cpp @@ -100,11 +100,12 @@ void ColorIndicator::paintEvent(QPaintEvent* event) QPainter painter(this); painter.save(); painter.setBrush(m_color); - painter.setPen(Qt::gray); + painter.setPen(Qt::transparent); QRect rect = event->rect().adjusted(3,3,-4,-4); rect.setWidth(rect.height()); painter.setRenderHint(QPainter::Antialiasing); - painter.drawEllipse(rect); +// painter.drawEllipse(rect); + painter.drawRoundedRect(rect,2,2); painter.restore(); } diff --git a/limereport/objectinspector/propertyItems/lrcolorpropitem.cpp b/limereport/objectinspector/propertyItems/lrcolorpropitem.cpp index 8201e22..4eed649 100644 --- a/limereport/objectinspector/propertyItems/lrcolorpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrcolorpropitem.cpp @@ -60,20 +60,22 @@ bool ColorPropItem::paint(QPainter *painter, const StyleOptionViewItem &option, painter->save(); QPen pen; - if (option.state & QStyle::State_Selected){ - pen.setWidth(2); - pen.setColor(option.palette.brightText().color()); - }else { - pen.setColor(Qt::gray); - } +// if (option.state & QStyle::State_Selected){ +// pen.setWidth(1); +// pen.setColor(option.palette.brightText().color()); +// }else { +// pen.setColor(Qt::darkGray); +// } + pen.setColor(Qt::transparent); painter->setPen(pen); painter->setBrush(propertyValue().value()); QRect rect = option.rect.adjusted(4,4,-4,-6); rect.setWidth(rect.height()); painter->setRenderHint(QPainter::Antialiasing); - painter->drawEllipse(rect); + painter->drawRoundedRect(rect,2,2); +// painter->drawEllipse(rect); painter->restore(); return true; } else return false; From dd94689f415e4d3049f3ba207ed81c40ed634a1e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 4 Apr 2018 00:20:14 +0300 Subject: [PATCH 140/347] isDarkColor function has been added --- include/lrglobal.cpp | 9 +++++++++ include/lrglobal.h | 1 + limereport/lrglobal.cpp | 9 +++++++++ limereport/lrglobal.h | 1 + 4 files changed, 20 insertions(+) diff --git a/include/lrglobal.cpp b/include/lrglobal.cpp index b4eb854..55ab31b 100644 --- a/include/lrglobal.cpp +++ b/include/lrglobal.cpp @@ -76,4 +76,13 @@ QVector normalizeCaptures(const QRegExp& reg){ return result; } +bool isColorDark(QColor color){ + qreal darkness = 1-(0.299*color.red() + 0.587*color.green() + 0.114*color.blue())/255; + if(darkness<0.5){ + return false; + } else { + return true; + } +} + } //namespace LimeReport diff --git a/include/lrglobal.h b/include/lrglobal.h index 4ddad30..fdc35d4 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -101,6 +101,7 @@ namespace Const{ QString escapeSimbols(const QString& value); QString replaceHTMLSymbols(const QString &value); QVector normalizeCaptures(const QRegExp ®); + bool isColorDark(QColor color); enum ExpandType {EscapeSymbols, NoEscapeSymbols, ReplaceHTMLSymbols}; enum RenderPass {FirstPass = 1, SecondPass = 2}; diff --git a/limereport/lrglobal.cpp b/limereport/lrglobal.cpp index b4eb854..55ab31b 100644 --- a/limereport/lrglobal.cpp +++ b/limereport/lrglobal.cpp @@ -76,4 +76,13 @@ QVector normalizeCaptures(const QRegExp& reg){ return result; } +bool isColorDark(QColor color){ + qreal darkness = 1-(0.299*color.red() + 0.587*color.green() + 0.114*color.blue())/255; + if(darkness<0.5){ + return false; + } else { + return true; + } +} + } //namespace LimeReport diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 4ddad30..fdc35d4 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -101,6 +101,7 @@ namespace Const{ QString escapeSimbols(const QString& value); QString replaceHTMLSymbols(const QString &value); QVector normalizeCaptures(const QRegExp ®); + bool isColorDark(QColor color); enum ExpandType {EscapeSymbols, NoEscapeSymbols, ReplaceHTMLSymbols}; enum RenderPass {FirstPass = 1, SecondPass = 2}; From 1caf4a8e2d146ff69e6c8753dde39abb4951f006 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 4 Apr 2018 00:20:59 +0300 Subject: [PATCH 141/347] Color property reafctored --- .../objectinspector/editors/lrcoloreditor.cpp | 22 ++++++++++----- .../propertyItems/lrcolorpropitem.cpp | 28 +++++++++---------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/limereport/objectinspector/editors/lrcoloreditor.cpp b/limereport/objectinspector/editors/lrcoloreditor.cpp index b0f4c19..09c22d6 100644 --- a/limereport/objectinspector/editors/lrcoloreditor.cpp +++ b/limereport/objectinspector/editors/lrcoloreditor.cpp @@ -28,11 +28,14 @@ * GNU General Public License for more details. * ****************************************************************************/ #include "lrcoloreditor.h" +#include "lrglobal.h" #include #include #include #include +#include +#include namespace LimeReport{ @@ -94,18 +97,23 @@ void ColorEditor::slotClicked() emit(editingFinished()); } - void ColorIndicator::paintEvent(QPaintEvent* event) { QPainter painter(this); + + QStyle* style = QApplication::style(); painter.save(); painter.setBrush(m_color); - painter.setPen(Qt::transparent); - QRect rect = event->rect().adjusted(3,3,-4,-4); - rect.setWidth(rect.height()); - painter.setRenderHint(QPainter::Antialiasing); -// painter.drawEllipse(rect); - painter.drawRoundedRect(rect,2,2); + QColor penColor = isColorDark(m_color) ? Qt::transparent : Qt::darkGray; + + painter.setPen(penColor); + int border = (event->rect().height() - style->pixelMetric(QStyle::PM_IndicatorWidth))/2; + + QRect rect(event->rect().x()+border, event->rect().y()+border, + style->pixelMetric(QStyle::PM_IndicatorWidth), + style->pixelMetric(QStyle::PM_IndicatorWidth));// = option.rect.adjusted(4,4,-4,-6); + + painter.drawRect(rect); painter.restore(); } diff --git a/limereport/objectinspector/propertyItems/lrcolorpropitem.cpp b/limereport/objectinspector/propertyItems/lrcolorpropitem.cpp index 4eed649..a47f77c 100644 --- a/limereport/objectinspector/propertyItems/lrcolorpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrcolorpropitem.cpp @@ -28,8 +28,10 @@ * GNU General Public License for more details. * ****************************************************************************/ #include "lrcolorpropitem.h" +#include "lrglobal.h" #include "editors/lrcoloreditor.h" #include +#include namespace{ LimeReport::ObjectPropItem * createColorPropItem( @@ -58,24 +60,20 @@ bool ColorPropItem::paint(QPainter *painter, const StyleOptionViewItem &option, { if (index.column()==1){ painter->save(); + + QStyle* style = option.widget ? option.widget->style() : QApplication::style(); QPen pen; - -// if (option.state & QStyle::State_Selected){ -// pen.setWidth(1); -// pen.setColor(option.palette.brightText().color()); -// }else { -// pen.setColor(Qt::darkGray); -// } - - pen.setColor(Qt::transparent); + QColor penColor = isColorDark(propertyValue().value()) ? Qt::transparent : Qt::darkGray; + pen.setColor(penColor); painter->setPen(pen); - painter->setBrush(propertyValue().value()); - QRect rect = option.rect.adjusted(4,4,-4,-6); - rect.setWidth(rect.height()); - painter->setRenderHint(QPainter::Antialiasing); - painter->drawRoundedRect(rect,2,2); -// painter->drawEllipse(rect); + int border = (option.rect.height() - style->pixelMetric(QStyle::PM_IndicatorWidth))/2; + + QRect rect(option.rect.x()+border,option.rect.y()+border, + style->pixelMetric(QStyle::PM_IndicatorWidth), + style->pixelMetric(QStyle::PM_IndicatorWidth)); + painter->drawRect(rect); + painter->restore(); return true; } else return false; From ab3236f6694f17f6c0ca7141aa3a2949f6fc7ee6 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 4 Apr 2018 00:21:33 +0300 Subject: [PATCH 142/347] Property delegate changed --- limereport/objectinspector/lrpropertydelegate.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/limereport/objectinspector/lrpropertydelegate.cpp b/limereport/objectinspector/lrpropertydelegate.cpp index 80bd4d0..acb9c20 100644 --- a/limereport/objectinspector/lrpropertydelegate.cpp +++ b/limereport/objectinspector/lrpropertydelegate.cpp @@ -62,14 +62,12 @@ void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionVi painter->save(); painter->setPen(option.palette.color(QPalette::HighlightedText)); painter->setBackground(QBrush(option.palette.color(QPalette::Highlight))); - //drawBackground(painter,option,index); cellOpt.widget->style()->drawPrimitive(QStyle::PE_IndicatorBranch,&primitiveOpt,painter); cellOpt.rect.adjust(primitiveOpt.rect.width(),0,0,0); cellOpt.font.setBold(true); cellOpt.palette.setColor(QPalette::Text,cellOpt.palette.color(QPalette::BrightText)); cellOpt.text = LimeReport::extractClassName(node->propertyName()); style->drawControl(QStyle::CE_ItemViewItem, &cellOpt, painter, cellOpt.widget); - //drawDisplay(painter,cellOpt,cellOpt.rect,LimeReport::extractClassName(node->propertyName())); painter->restore(); } } else { @@ -92,13 +90,13 @@ void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionVi else so.palette.setColor(QPalette::Text,Qt::black); -// drawBackground(painter,option,index); - opt.text = ""; + opt.rect.setHeight(opt.rect.height()-1); style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget); if (!node->paint(painter,so,index)){ so.state &= ~QStyle::State_HasFocus; + so.rect.adjust(0,0,0,-1); QStyledItemDelegate::paint(painter, so, index); } @@ -117,6 +115,8 @@ void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionVi painter->drawLine(start,end); painter->restore(); } + + } } } From bea84a332033e75ed265f99b6eb63bac3e0b7e7c Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 4 Apr 2018 00:22:44 +0300 Subject: [PATCH 143/347] Script highlighter changed --- limereport/scripteditor/lrscripthighlighter.cpp | 9 ++------- limereport/scripteditor/lrscripthighlighter.h | 1 - 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/limereport/scripteditor/lrscripthighlighter.cpp b/limereport/scripteditor/lrscripthighlighter.cpp index d6efa5b..0af09ba 100644 --- a/limereport/scripteditor/lrscripthighlighter.cpp +++ b/limereport/scripteditor/lrscripthighlighter.cpp @@ -1,4 +1,5 @@ #include "lrscripthighlighter.h" +#include "lrglobal.h" #include #include @@ -180,17 +181,11 @@ bool ScriptHighlighter::isKeyWord(const QString& word) return false; } -bool ScriptHighlighter::isDark(QColor color) -{ - double a = 1 - ( 0.299 * color.red() + 0.587 * color.green() + 0.114 * color.blue()) / 255; - return (a < 0.5); -} - ScriptHighlighter::ScriptHighlighter(QTextDocument* parent): QSyntaxHighlighter(parent) { - if ( isDark(QPalette().background().color())){ + if ( isColorDark(QPalette().background().color())){ m_formats[NumberFormat].setForeground(Qt::darkBlue); m_formats[StringFormat].setForeground(Qt::darkGreen); m_formats[KeywordFormat].setForeground(Qt::darkYellow); diff --git a/limereport/scripteditor/lrscripthighlighter.h b/limereport/scripteditor/lrscripthighlighter.h index 136b053..46c4d24 100644 --- a/limereport/scripteditor/lrscripthighlighter.h +++ b/limereport/scripteditor/lrscripthighlighter.h @@ -42,7 +42,6 @@ protected: }; QTextCharFormat m_formats[FormatsCount]; bool isKeyWord(const QString& word); - bool isDark(QColor color); void createParentheisisInfo(const char& literal, TextBlockData *data, const QString& text); }; From 4da0e7f0f28101ef0b060103d7d965f7e9880665 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 4 Apr 2018 00:42:46 +0300 Subject: [PATCH 144/347] Translations updated --- limereport/bands/lrdataband.cpp | 4 ++-- limereport/objectinspector/lrobjectitemmodel.cpp | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/limereport/bands/lrdataband.cpp b/limereport/bands/lrdataband.cpp index 4a67e58..d6a4b94 100644 --- a/limereport/bands/lrdataband.cpp +++ b/limereport/bands/lrdataband.cpp @@ -83,7 +83,7 @@ void DataBand::preparePopUpMenu(QMenu &menu) { DataBandDesignIntf::preparePopUpMenu(menu); - QAction* autoSplittableAction = menu.addAction(tr("useAlternateBackgroundColor")); + QAction* autoSplittableAction = menu.addAction(tr("Use alternate background color")); autoSplittableAction->setCheckable(true); autoSplittableAction->setChecked(useAlternateBackgroundColor()); } @@ -91,7 +91,7 @@ void DataBand::preparePopUpMenu(QMenu &menu) void DataBand::processPopUpAction(QAction *action) { DataBandDesignIntf::processPopUpAction(action); - if (action->text().compare(tr("useAlternateBackgroundColor")) == 0){ + if (action->text().compare(tr("Use alternate background color")) == 0){ setProperty("useAlternateBackgroundColor",action->isChecked()); } } diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 04b2f20..6fc1dab 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -148,6 +148,8 @@ void QObjectPropertyModel::translatePropertyName() tr("series"); tr("titleAlign"); tr("watermark"); + tr("keepTopSpace"); + } void QObjectPropertyModel::clearObjectsList() From c2d731eef9e075a375799783c7466ea2adfd940a Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 9 Apr 2018 22:03:22 +0300 Subject: [PATCH 145/347] Changing theme fixed --- limereport/lrreportdesignwidget.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index b336429..2da64da 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -206,7 +206,10 @@ void ReportDesignWidget::applySettings() QString styleSheet = theme.readAll(); parentWidget()->setStyleSheet(styleSheet); m_report->setStyleSheet(styleSheet); - } else parentWidget()->setStyleSheet(""); + } else { + parentWidget()->setStyleSheet(""); + m_report->setStyleSheet(""); + } } void ReportDesignWidget::loadState(QSettings* settings) From e9c44f0eb6a52cd773fe6a99c61ad6136545b117 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 10 Apr 2018 16:28:48 +0300 Subject: [PATCH 146/347] Designer interface setting added --- include/lrreportengine.h | 4 ++ limereport/lrreportdesignwidget.cpp | 2 + limereport/lrreportengine.cpp | 60 +++++++++++++++++++++++++++++ limereport/lrreportengine.h | 4 ++ limereport/lrreportengine_p.h | 15 +++++++- limereport/lrsettingdialog.cpp | 19 +++++++++ limereport/lrsettingdialog.h | 4 ++ limereport/lrsettingdialog.ui | 31 ++++++++++++++- 8 files changed, 136 insertions(+), 3 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 589e359..97549f5 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -113,6 +113,10 @@ public: bool setReportLanguage(QLocale::Language language); Qt::LayoutDirection previewLayoutDirection(); void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); + void addDesignerLanguage(QLocale::Language language); + void removeDesignerLanguage(QLocale::Language language); + QList* designerLanguages(); + QLocale::Language currentDesignerLanguage(); signals: void renderStarted(); void renderFinished(); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 2da64da..9fc328d 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -712,6 +712,7 @@ void ReportDesignWidget::editSetting() setting.setDefaultFont(m_defaultFont); setting.setSuppressAbsentFieldsAndVarsWarnings(m_report->suppressFieldAndVarError()); setting.setUseDarkTheme(m_useDarkTheme); + setting.setDesignerLanguages(m_report->designerLanguages(), m_report->currentDesignerLanguage()); if (setting.exec()){ m_horizontalGridStep = setting.horizontalGridStep(); @@ -719,6 +720,7 @@ void ReportDesignWidget::editSetting() m_defaultFont = setting.defaultFont(); m_useDarkTheme = setting.userDarkTheme(); m_report->setSuppressFieldAndVarError(setting.suppressAbsentFieldsAndVarsWarnings()); + m_report->setCurrentDesignerLanguage(setting.designerLanguage()); applySettings(); } } diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index d938b2e..0c8d92f 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -950,6 +950,42 @@ void ReportEnginePrivate::activateLanguage(QLocale::Language language) } } +QString ReportEnginePrivate::getLanguagesDir() const +{ + return m_languagesDir; +} + +void ReportEnginePrivate::setLanguagesDir(const QString& languagesDir) +{ + m_languagesDir = languagesDir; +} + +void ReportEnginePrivate::addDesignerLanguage(QLocale::Language language) +{ + if (!m_designerLanguages.contains(language)) + m_designerLanguages.append(language); +} + +void ReportEnginePrivate::removeDesignerLanguage(QLocale::Language language) +{ + m_designerLanguages.removeAll(language); +} + +QList* ReportEnginePrivate::designerLanguages() +{ + return &m_designerLanguages; +} + +QLocale::Language ReportEnginePrivate::currentDesignerLanguage() +{ + return m_currentDesignerLanguage; +} + +void ReportEnginePrivate::setCurrentDesignerLanguage(QLocale::Language language) +{ + m_currentDesignerLanguage = language; +} + QString ReportEnginePrivate::styleSheet() const { return m_styleSheet; @@ -1237,6 +1273,30 @@ bool ReportEngine::setReportLanguage(QLocale::Language language) return d->setReportLanguage(language); } +void ReportEngine::addDesignerLanguage(QLocale::Language language) +{ + Q_D(ReportEngine); + d->addDesignerLanguage(language); +} + +void ReportEngine::removeDesignerLanguage(QLocale::Language language) +{ + Q_D(ReportEngine); + d->removeDesignerLanguage(language); +} + +QList*ReportEngine::designerLanguages() +{ + Q_D(ReportEngine); + return d->designerLanguages(); +} + +QLocale::Language ReportEngine::currentDesignerLanguage() +{ + Q_D(ReportEngine); + return d->currentDesignerLanguage(); +} + void ReportEngine::setShowProgressDialog(bool value) { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 589e359..97549f5 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -113,6 +113,10 @@ public: bool setReportLanguage(QLocale::Language language); Qt::LayoutDirection previewLayoutDirection(); void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); + void addDesignerLanguage(QLocale::Language language); + void removeDesignerLanguage(QLocale::Language language); + QList* designerLanguages(); + QLocale::Language currentDesignerLanguage(); signals: void renderStarted(); void renderFinished(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 95ed764..eb4f611 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -33,6 +33,7 @@ #include #include #include +#include #include "lrreportengine.h" #include "lrcollection.h" #include "lrglobal.h" @@ -83,6 +84,9 @@ public: virtual void setSuppressFieldAndVarError(bool suppressFieldAndVarError) = 0; virtual void setStyleSheet(const QString& styleSheet) = 0; virtual QString styleSheet() const = 0; + virtual QList* designerLanguages() = 0; + virtual QLocale::Language currentDesignerLanguage() = 0; + virtual void setCurrentDesignerLanguage(QLocale::Language language) = 0; }; class ReportEnginePrivate : public QObject, public ICollectionContainer, public ITranslationContainer, @@ -178,7 +182,13 @@ public: void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); QString styleSheet() const; void setStyleSheet(const QString &styleSheet); - + QString getLanguagesDir() const; + void setLanguagesDir(const QString& languagesDir); + void addDesignerLanguage(QLocale::Language language); + void removeDesignerLanguage(QLocale::Language language); + QList* designerLanguages(); + QLocale::Language currentDesignerLanguage(); + void setCurrentDesignerLanguage(QLocale::Language language); signals: void pagesLoadFinished(); void datasourceCollectionLoadFinished(const QString& collectionName); @@ -247,6 +257,9 @@ private: Qt::LayoutDirection m_previewLayoutDirection; LimeReportPluginInterface* m_designerFactory; QString m_styleSheet; + QString m_languagesDir; + QList m_designerLanguages; + QLocale::Language m_currentDesignerLanguage; }; } diff --git a/limereport/lrsettingdialog.cpp b/limereport/lrsettingdialog.cpp index ee34440..c1272f1 100644 --- a/limereport/lrsettingdialog.cpp +++ b/limereport/lrsettingdialog.cpp @@ -47,6 +47,15 @@ bool SettingDialog::suppressAbsentFieldsAndVarsWarnings() return ui->cbSuppressWarnings->isChecked(); } +QLocale::Language SettingDialog::designerLanguage() +{ + foreach (QLocale::Language language, *m_designerLanguages) { + if (ui->designerLanguage->currentText().compare(QLocale::languageToString(language)) == 0) + return language; + } + return QLocale().language(); +} + void SettingDialog::setSuppressAbsentFieldsAndVarsWarnings(bool value){ ui->cbSuppressWarnings->setChecked(value); } @@ -72,4 +81,14 @@ void SettingDialog::setUseDarkTheme(bool value) ui->cbbUseDarkTheme->setChecked(value); } +void SettingDialog::setDesignerLanguages(QList* languages, QLocale::Language currentLanguage) +{ + m_designerLanguages = languages; + ui->designerLanguage->addItem(QLocale::languageToString(currentLanguage)); + foreach (QLocale::Language language, *languages) { + if (language != currentLanguage) + ui->designerLanguage->addItem(QLocale::languageToString(language)); + } +} + } // namespace LimeReport diff --git a/limereport/lrsettingdialog.h b/limereport/lrsettingdialog.h index db908f9..20bbb0b 100644 --- a/limereport/lrsettingdialog.h +++ b/limereport/lrsettingdialog.h @@ -2,6 +2,7 @@ #define LRSETTINGDIALOG_H #include +#include namespace LimeReport{ @@ -21,13 +22,16 @@ public: QFont defaultFont(); bool userDarkTheme(); bool suppressAbsentFieldsAndVarsWarnings(); + QLocale::Language designerLanguage(); void setSuppressAbsentFieldsAndVarsWarnings(bool value); void setHorizontalGridStep(int value); void setVerticalGridStep(int value); void setDefaultFont(const QFont& value); void setUseDarkTheme(bool value); + void setDesignerLanguages(QList* languages, QLocale::Language currentLanguage); private: Ui::SettingDialog *ui; + QList* m_designerLanguages; }; } // namespace LimeReport diff --git a/limereport/lrsettingdialog.ui b/limereport/lrsettingdialog.ui index b0dd1ed..688ad14 100644 --- a/limereport/lrsettingdialog.ui +++ b/limereport/lrsettingdialog.ui @@ -6,10 +6,16 @@ 0 0 - 351 - 318 + 397 + 378 + + + 0 + 0 + + Designer setting @@ -108,6 +114,27 @@ + + + + + + Language + + + + + + + + 0 + 0 + + + + + + From 537fec13fd99dde2283fa9f684c632f9459595cd Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 12 Apr 2018 22:41:34 +0300 Subject: [PATCH 147/347] Group functions fixed for qtscriptengine --- limereport/lrscriptenginemanager.cpp | 9 +++++++-- limereport/lrscriptenginemanager.h | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index d50de7e..3b2385e 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -346,8 +346,8 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ LimeReport::Const::FUNCTION_MANAGER_NAME, m_functionManager, QString("function %1(fieldName, bandName, pageitem){\ - pageitem = typeof pageitem !== 'undefined' ? pageitem : 0; \ - return %2.calcGroupFunction(\"%1\",fieldName, bandName, pageitem);}" + if (typeof pageitem == 'undefined') return %2.calcGroupFunction(\"%1\", fieldName, bandName); \ + else return %2.calcGroupFunction(\"%1\", fieldName, bandName, pageitem);}" ).arg(func) .arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); @@ -1471,6 +1471,11 @@ QVariant ScriptFunctionsManager::calcGroupFunction(const QString &name, const QS } } +QVariant ScriptFunctionsManager::calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName) +{ + return calcGroupFunction(name, expressionID, bandName, 0); +} + QVariant ScriptFunctionsManager::line(const QString &bandName) { QString varName = QLatin1String("line_")+bandName.toLower(); diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 41d9b96..a15f524 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -307,6 +307,7 @@ public: foreach(IWrapperCreator* wrapper, m_wrappersFactory.values()){ delete wrapper;} m_wrappersFactory.clear(); } Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName, QObject* currentPage); + Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName); Q_INVOKABLE QVariant line(const QString& bandName); Q_INVOKABLE QVariant numberFormat(QVariant value, const char &format, int precision, const QString &locale); Q_INVOKABLE QVariant dateFormat(QVariant value, const QString& format); From 766c5b36d46b873ae25499d0751a5c4f75d6795e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 18 Apr 2018 21:37:05 +0300 Subject: [PATCH 148/347] Accelerated opening of the file by the designer --- limereport/scripteditor/lrscripteditor.cpp | 42 ++++++++++++++++------ limereport/scripteditor/lrscripteditor.h | 6 ++-- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index d78a361..f40068a 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -272,7 +272,8 @@ void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterfa { if (report){ m_model.clear(); - + QIcon signalIcon(":/report/images/signal"); + QIcon propertyIcon(":/report/images/property"); addAdditionalDatawords(report->dataManager()); for ( int i = 0; i < report->pageCount(); ++i){ @@ -283,18 +284,18 @@ void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterfa itemNode->setIcon(QIcon(":/report/images/object")); m_model.invisibleRootItem()->appendRow(itemNode); - QStringList items = extractSlotNames(page->pageItem()); + QStringList items = extractSignalNames(page->pageItem()); foreach(QString slotName, items){ QStandardItem* slotItem = new QStandardItem; slotItem->setText(slotName); - slotItem->setIcon(QIcon(":/report/images/signal")); + slotItem->setIcon(signalIcon); itemNode->appendRow(slotItem); } - items = extractPropertyes(page->pageItem()); + items = extractProperties(page->pageItem()); foreach(QString propertyName, items){ QStandardItem* properyItem = new QStandardItem; properyItem->setText(propertyName); - properyItem->setIcon(QIcon(":/report/images/property")); + properyItem->setIcon(propertyIcon); itemNode->appendRow(properyItem); } foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ @@ -311,7 +312,7 @@ void ReportStructureCompleater::updateCompleaterModel(DataSourceManager *dataMan addAdditionalDatawords(dataManager); } -QStringList ReportStructureCompleater::extractSlotNames(BaseDesignIntf *item) +QStringList ReportStructureCompleater::extractSignalNames(BaseDesignIntf *item) { QStringList result; if (!item) return result; @@ -333,7 +334,7 @@ QStringList ReportStructureCompleater::extractSlotNames(BaseDesignIntf *item) return result; } -QStringList ReportStructureCompleater::extractPropertyes(BaseDesignIntf *item) +QStringList ReportStructureCompleater::extractProperties(BaseDesignIntf *item) { QStringList result; if (!item) return result; @@ -353,24 +354,43 @@ void ReportStructureCompleater::addChildItem(BaseDesignIntf *item, const QString { if (!item) return; + QIcon signalIcon(":/report/images/signal"); + QIcon propertyIcon(":/report/images/property"); + QStandardItem* itemNode = new QStandardItem; itemNode->setText(pageName+"_"+item->objectName()); itemNode->setIcon(QIcon(":/report/images/object")); parent->appendRow(itemNode); - QStringList items = extractSlotNames(item); + QStringList items; + + if (!m_signals.contains(item->metaObject()->className())){ + items = extractSignalNames(item); + m_signals.insert(item->metaObject()->className(),items); + } else { + items = m_signals.value(item->metaObject()->className()); + } + foreach(QString slotName, items){ QStandardItem* slotItem = new QStandardItem; slotItem->setText(slotName); - slotItem->setIcon(QIcon(":/report/images/signal")); + slotItem->setIcon(signalIcon); itemNode->appendRow(slotItem); } - items = extractPropertyes(item); + + if (!m_properties.contains(item->metaObject()->className())){ + items = extractProperties(item); + m_properties.insert(item->metaObject()->className(),items); + } else { + items = m_properties.value(item->metaObject()->className()); + } + foreach(QString propertyName, items){ QStandardItem* properyItem = new QStandardItem; properyItem->setText(propertyName); - properyItem->setIcon(QIcon(":/report/images/property")); + properyItem->setIcon(propertyIcon); itemNode->appendRow(properyItem); } + foreach (BaseDesignIntf* child, item->childBaseItems()){ addChildItem(child, pageName, parent); } diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index 31d16fd..e9e0aa6 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -33,12 +33,14 @@ public: void updateCompleaterModel(ReportEnginePrivateInterface* report); void updateCompleaterModel(DataSourceManager* dataManager); protected: - QStringList extractSlotNames(BaseDesignIntf* item); - QStringList extractPropertyes(BaseDesignIntf* item); + QStringList extractSignalNames(BaseDesignIntf* item); + QStringList extractProperties(BaseDesignIntf* item); void addChildItem(BaseDesignIntf *item, const QString &pageName, QStandardItem *parent); void addAdditionalDatawords(DataSourceManager *dataManager); private: QStandardItemModel m_model; + QMap m_properties; + QMap m_signals; }; class ScriptEditor : public QWidget From eacc5c645e3d1ae28ae0ca53d2e44841b7648692 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 7 May 2018 22:52:28 +0300 Subject: [PATCH 149/347] Build has been fixed --- common.pri | 9 ++++++++- demo_r1/mainwindow.cpp | 6 +++--- limereport/lrdatasourcemanager.cpp | 2 +- limereport/lrreportengine.cpp | 2 +- limereport/serializators/lrxmlreader.cpp | 3 ++- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/common.pri b/common.pri index 5db695e..b4a4dce 100644 --- a/common.pri +++ b/common.pri @@ -11,13 +11,20 @@ DEPENDPATH += $$PWD/3rdparty/easyprofiler/easy_profiler_core/include contains(CONFIG, easy_profiler){ message(EasyProfiler) unix|win32: LIBS += -L$$PWD/3rdparty/easyprofiler/build/bin/ -leasy_profiler - DEFINES += BUILD_WITH_EASY_PROFILER + greaterThan(QT_MAJOR_VERSION, 4){ + DEFINES += BUILD_WITH_EASY_PROFILER + } } !contains(CONFIG, qtscriptengine){ greaterThan(QT_MAJOR_VERSION, 4){ +greaterThan(QT_MINOR_VERSION, 5){ CONFIG *= qjsengine } +lessThan(QT_MINOR_VERSION, 6){ + CONFIG *= qtscriptengine +} +} lessThan(QT_MAJOR_VERSION, 5){ CONFIG *= qtscriptengine } diff --git a/demo_r1/mainwindow.cpp b/demo_r1/mainwindow.cpp index 48da52f..7f35de3 100644 --- a/demo_r1/mainwindow.cpp +++ b/demo_r1/mainwindow.cpp @@ -38,7 +38,7 @@ #include #include -#ifndef HAVE_QT4 +#ifdef BUILD_WITH_EASY_PROFILER #include "easy/profiler.h" #else # define EASY_BLOCK(...) @@ -127,7 +127,7 @@ void MainWindow::on_pushButton_clicked() report->setShowProgressDialog(false); report->designReport(); EASY_END_BLOCK; -#ifndef HAVE_QT4 +#ifdef BUILD_WITH_EASY_PROFILER profiler::dumpBlocksToFile("test.prof"); #endif } @@ -145,7 +145,7 @@ void MainWindow::on_pushButton_2_clicked() report->dataManager()->setReportVariable(ui->leVariableName->text(), ui->leVariableValue->text()); } EASY_END_BLOCK; -#ifndef HAVE_QT4 +#ifdef BUILD_WITH_EASY_PROFILER profiler::dumpBlocksToFile("test.prof"); #endif report->previewReport(); diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 60a61fe..ad1cd58 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -37,7 +37,7 @@ #include #include -#ifndef HAVE_QT4 +#ifdef BUILD_WITH_EASY_PROFILER #include "easy/profiler.h" #else # define EASY_BLOCK(...) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index d938b2e..b54e13e 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -56,7 +56,7 @@ #include "lrpreviewreportwidget.h" #include "lrpreviewreportwidget_p.h" -#ifndef HAVE_QT4 +#ifdef BUILD_WITH_EASY_PROFILER #include "easy/profiler.h" #else # define EASY_BLOCK(...) diff --git a/limereport/serializators/lrxmlreader.cpp b/limereport/serializators/lrxmlreader.cpp index 8748ae5..7439fc4 100644 --- a/limereport/serializators/lrxmlreader.cpp +++ b/limereport/serializators/lrxmlreader.cpp @@ -36,7 +36,8 @@ #include "lrreporttranslation.h" #include -#ifndef HAVE_QT4 + +#ifdef BUILD_WITH_EASY_PROFILER #include "easy/profiler.h" #else # define EASY_BLOCK(...) From 2151a549e8eed3dc3e02a2edaa736b7c2f4a037d Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 8 May 2018 10:52:23 +0300 Subject: [PATCH 150/347] QQmlEngine -> QJSEngine --- limereport/lrglobal.h | 5 ++--- limereport/lrreportrender.cpp | 2 +- limereport/lrscriptenginemanager.cpp | 6 +++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index fdc35d4..b32d263 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -138,13 +138,12 @@ namespace Const{ #endif #ifdef USE_QJSENGINE - typedef QQmlEngine ScriptEngineType; + typedef QJSEngine ScriptEngineType; typedef QJSValue ScriptValueType; template - static inline QJSValue getCppOwnedJSValue(QJSEngine &e, T *p) + static inline QJSValue getJSValue(QJSEngine &e, T *p) { QJSValue res = e.newQObject(p); - QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); return res; } #else diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 9ad41f2..a6679bf 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -299,7 +299,7 @@ void ReportRender::initRenderPage() ScriptEngineType* se = ScriptEngineManager::instance().scriptEngine(); #ifdef USE_QJSENGINE - svCurrentPage = getCppOwnedJSValue(*se, m_renderPageItem); + svCurrentPage = getJSValue(*se, m_renderPageItem); se->globalObject().setProperty("currentPage", svCurrentPage); #else svCurrentPage = se->globalObject().property("currentPage"); diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 3b2385e..6dd5ea8 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -474,7 +474,7 @@ QString ScriptEngineManager::expandScripts(QString context, QVariant& varValue, ScriptValueType svThis; #ifdef USE_QJSENGINE - svThis = getCppOwnedJSValue(*se, reportItem); + svThis = getJSValue(*se, reportItem); se->globalObject().setProperty("THIS",svThis); #else svThis = se->globalObject().property("THIS"); @@ -1280,7 +1280,7 @@ void ScriptEngineContext::baseDesignIntfToScript(const QString& pageName, BaseDe ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); #ifdef USE_QJSENGINE - ScriptValueType sItem = getCppOwnedJSValue(*engine, item); + ScriptValueType sItem = getJSValue(*engine, item); QString on = item->patternName().compare(pageName) == 0 ? pageName : pageName+"_"+item->patternName(); engine->globalObject().setProperty(on, sItem); #else @@ -1303,7 +1303,7 @@ void ScriptEngineContext::qobjectToScript(const QString& name, QObject *item) { ScriptEngineType* engine = ScriptEngineManager::instance().scriptEngine(); #ifdef USE_QJSENGINE - ScriptValueType sItem = getCppOwnedJSValue(*engine, item); + ScriptValueType sItem = getJSValue(*engine, item); engine->globalObject().setProperty(name, sItem); #else ScriptValueType sItem = engine->globalObject().property(name); From 5e6704c69795ce9b8afc3a6fe0fcb3a1d5f042f3 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 8 May 2018 10:53:27 +0300 Subject: [PATCH 151/347] QQmlEngine -> QJSEngine --- common.pri | 11 ++++++----- include/lrglobal.h | 5 ++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/common.pri b/common.pri index b4a4dce..cef5fe8 100644 --- a/common.pri +++ b/common.pri @@ -18,12 +18,13 @@ contains(CONFIG, easy_profiler){ !contains(CONFIG, qtscriptengine){ greaterThan(QT_MAJOR_VERSION, 4){ -greaterThan(QT_MINOR_VERSION, 5){ CONFIG *= qjsengine -} -lessThan(QT_MINOR_VERSION, 6){ - CONFIG *= qtscriptengine -} +#greaterThan(QT_MINOR_VERSION, 5){ +# CONFIG *= qjsengine +#} +#lessThan(QT_MINOR_VERSION, 6){ +# CONFIG *= qtscriptengine +#} } lessThan(QT_MAJOR_VERSION, 5){ CONFIG *= qtscriptengine diff --git a/include/lrglobal.h b/include/lrglobal.h index fdc35d4..b32d263 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -138,13 +138,12 @@ namespace Const{ #endif #ifdef USE_QJSENGINE - typedef QQmlEngine ScriptEngineType; + typedef QJSEngine ScriptEngineType; typedef QJSValue ScriptValueType; template - static inline QJSValue getCppOwnedJSValue(QJSEngine &e, T *p) + static inline QJSValue getJSValue(QJSEngine &e, T *p) { QJSValue res = e.newQObject(p); - QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); return res; } #else From d344264bfbc68b6c1edbb7d7a312e9138063a7dc Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 8 May 2018 10:58:43 +0300 Subject: [PATCH 152/347] loaded() signal has been added --- limereport/lrreportdesignwidget.cpp | 41 ++++++++++++++++------------- limereport/lrreportdesignwidget.h | 1 + limereport/lrreportengine.cpp | 12 +++++++-- limereport/lrreportengine.h | 1 + limereport/lrreportengine_p.h | 1 + 5 files changed, 36 insertions(+), 20 deletions(-) diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 2da64da..b5585d8 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -72,20 +72,15 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QMa mainLayout->addWidget(m_tabWidget); setLayout(mainLayout); -// if (!report) { -// m_report=new ReportEnginePrivate(this); -// m_report->setObjectName("report"); -// m_report->appendPage("page1"); -// } -// else { - m_report=report;//report->d_ptr; - if (!m_report->pageCount()) m_report->appendPage("page1"); -// } + m_report=report; + if (!m_report->pageCount()) m_report->appendPage("page1"); createTabs(); connect(dynamic_cast(m_report), SIGNAL(pagesLoadFinished()),this,SLOT(slotPagesLoadFinished())); - connect(dynamic_cast(m_report), SIGNAL(cleared()),this,SIGNAL(cleared())); + connect(dynamic_cast(m_report), SIGNAL(cleared()), this, SIGNAL(cleared())); + connect(dynamic_cast(m_report), SIGNAL(loaded()), this, SLOT(slotReportLoaded())); + connect(m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slotCurrentTabChanged(int))); #ifdef HAVE_UI_LOADER connect(m_report->scriptContext(), SIGNAL(dialogDeleted(QString)), this, SLOT(slotDialogDeleted(QString))); @@ -250,6 +245,7 @@ void ReportDesignWidget::loadState(QSettings* settings) void ReportDesignWidget::createTabs(){ + m_tabWidget->clear(); int pageIndex = -1; for (int i = 0; ipageCount();++i){ QGraphicsView* view = new QGraphicsView(qobject_cast(this)); @@ -465,14 +461,13 @@ bool ReportDesignWidget::save() bool ReportDesignWidget::loadFromFile(const QString &fileName) { if (m_report->loadFromFile(fileName,false)){ - QByteArray editorState = m_scriptEditor->saveState(); - createTabs(); - //connectPage(m_report->pageAt(0)); - m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); - m_scriptEditor->restoreState(editorState); - emit loaded(); - m_dialogChanged = false; - return true; +// QByteArray editorState = m_scriptEditor->saveState(); +// createTabs(); +// m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); +// m_scriptEditor->restoreState(editorState); +// emit loaded(); +// m_dialogChanged = false; +// return true; } else { QMessageBox::critical(this,tr("Error"),tr("Wrong file format")); return false; @@ -839,6 +834,16 @@ void ReportDesignWidget::slotCurrentTabChanged(int index) if (view) view->centerOn(0,0); } +void ReportDesignWidget::slotReportLoaded() +{ + QByteArray editorState = m_scriptEditor->saveState(); + createTabs(); + m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); + m_scriptEditor->restoreState(editorState); + emit loaded(); + m_dialogChanged = false; +} + #ifdef HAVE_QTDESIGNER_INTEGRATION void ReportDesignWidget::addNewDialog() diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 2887621..8e812dc 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -168,6 +168,7 @@ private slots: void slotDatasourceCollectionLoaded(const QString&); void slotSceneRectChanged(QRectF); void slotCurrentTabChanged(int index); + void slotReportLoaded(); #ifdef HAVE_QTDESIGNER_INTEGRATION void slotDialogChanged(QString); void slotDialogNameChanged(QString oldName, QString newName); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index b54e13e..e699459 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -67,6 +67,7 @@ #ifdef HAVE_STATIC_BUILD #include "lrfactoryinitializer.h" #endif + namespace LimeReport{ QSettings* ReportEngine::m_settings = 0; @@ -740,7 +741,11 @@ bool ReportEnginePrivate::loadFromFile(const QString &fileName, bool autoLoadPre m_fileWatcher->addPath( fileName ); } - return slotLoadFromFile( fileName ); + bool result = slotLoadFromFile( fileName ); + if (result) { + emit loaded(); + } + return result; } bool ReportEnginePrivate::loadFromByteArray(QByteArray* data, const QString &name){ @@ -752,6 +757,7 @@ bool ReportEnginePrivate::loadFromByteArray(QByteArray* data, const QString &nam if (reader->readItem(this)){ m_fileName = ""; m_reportName = name; + emit loaded(); return true; }; } @@ -768,6 +774,7 @@ bool ReportEnginePrivate::loadFromString(const QString &report, const QString &n if (reader->readItem(this)){ m_fileName = ""; m_reportName = name; + emit loaded(); return true; }; } @@ -1131,6 +1138,7 @@ ReportEngine::ReportEngine(QObject *parent) connect(d, SIGNAL(onSave()), this, SIGNAL(onSave())); connect(d, SIGNAL(onLoad(bool&)), this, SIGNAL(onLoad(bool&))); connect(d, SIGNAL(saveFinished()), this, SIGNAL(saveFinished())); + connect(d, SIGNAL(loaded()), this, SIGNAL(loaded())); } ReportEngine::~ReportEngine() @@ -1177,7 +1185,7 @@ void ReportEngine::designReport() d->designReport(); } -ReportDesignWindowInterface*ReportEngine::getDesignerWindow() +ReportDesignWindowInterface* ReportEngine::getDesignerWindow() { Q_D(ReportEngine); return d->getDesignerWindow(); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 589e359..bed2d88 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -120,6 +120,7 @@ signals: void onLoad(bool& loaded); void onSave(); void saveFinished(); + void loaded(); public slots: void cancelRender(); protected: diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 95ed764..d0bc16f 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -189,6 +189,7 @@ signals: void onLoad(bool& loaded); void onSave(); void saveFinished(); + void loaded(); public slots: bool slotLoadFromFile(const QString& fileName); void cancelRender(); From 79baeef72c7d006109ed5767be79843da5fb13e9 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 8 May 2018 09:30:10 -0400 Subject: [PATCH 153/347] Add printedToPDF signal for digitally signing saved pdfs. --- limereport/lrpreviewreportwidget.cpp | 1 + limereport/lrreportengine.cpp | 10 +++++++++- limereport/lrreportengine.h | 1 + limereport/lrreportengine_p.h | 2 ++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 5443adf..5ef2693 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -200,6 +200,7 @@ void PreviewReportWidget::printToPDF() foreach(PageItemDesignIntf::Ptr pageItem, d_ptr->m_reportPages){ d_ptr->m_previewPage->reactivatePageItem(pageItem); } + d_ptr->m_report->emitPrintedToPDF(fileName); } } diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index e699459..13adeb2 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -484,7 +484,9 @@ bool ReportEnginePrivate::printToPDF(const QString &fileName) QPrinter printer; printer.setOutputFileName(fn); printer.setOutputFormat(QPrinter::PdfFormat); - return printReport(&printer); + bool success = printReport(&printer); + if(success) emitPrintedToPDF(fileName); + return success; } return false; } @@ -600,6 +602,11 @@ void ReportEnginePrivate::emitSaveFinished() emit saveFinished(); } +void ReportEnginePrivate::emitPrintedToPDF(QString fileName) +{ + emit printedToPDF(fileName); +} + bool ReportEnginePrivate::isSaved() { foreach (PageDesignIntf* page, m_pages) { @@ -1139,6 +1146,7 @@ ReportEngine::ReportEngine(QObject *parent) connect(d, SIGNAL(onLoad(bool&)), this, SIGNAL(onLoad(bool&))); connect(d, SIGNAL(saveFinished()), this, SIGNAL(saveFinished())); connect(d, SIGNAL(loaded()), this, SIGNAL(loaded())); + connect(d, SIGNAL(printedToPDF(QString)), this, SIGNAL(printedToPDF(QString))); } ReportEngine::~ReportEngine() diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index bed2d88..7b098d9 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -121,6 +121,7 @@ signals: void onSave(); void saveFinished(); void loaded(); + void printedToPDF(QString fileName); public slots: void cancelRender(); protected: diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index d0bc16f..912ae5d 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -147,6 +147,7 @@ public: void emitSaveReport(); bool emitLoadReport(); void emitSaveFinished(); + void emitPrintedToPDF(QString fileName); bool isSaved(); void setCurrentReportsDir(const QString& dirName); QString currentReportsDir(){ return m_reportsDir;} @@ -190,6 +191,7 @@ signals: void onSave(); void saveFinished(); void loaded(); + void printedToPDF(QString fileName); public slots: bool slotLoadFromFile(const QString& fileName); void cancelRender(); From 3d8588316be1cb5e5ae1a447969a4a6e89259e16 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 15 May 2018 22:12:36 +0300 Subject: [PATCH 154/347] Dark theme fixed --- 3rdparty/dark_style_sheet/qdarkstyle/style.qss | 1 + 1 file changed, 1 insertion(+) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 59941f4..fd9d694 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -952,6 +952,7 @@ QDockWidget { QDockWidget::title{ background: #383838; padding-left: 5px; + margin-top: 4px; } From 8df8182875ca671a8fedae8cbbb0f57ab4826121 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 15 May 2018 22:14:17 +0300 Subject: [PATCH 155/347] Language settings has been added to designer --- designer/designer.pro | 6 +++- designer/designersettingmanager.cpp | 37 +++++++++++++++++++++++ designer/designersettingmanager.h | 27 +++++++++++++++++ designer/main.cpp | 25 +++++++++++++-- include/lrreportengine.h | 7 +++-- limereport/lrreportdesignwidget.cpp | 4 ++- limereport/lrreportdesignwindow.h | 1 - limereport/lrreportengine.cpp | 47 ++++++++++++----------------- limereport/lrreportengine.h | 7 +++-- limereport/lrreportengine_p.h | 13 +++----- limereport/lrsettingdialog.cpp | 16 +++++++--- limereport/lrsettingdialog.h | 5 +-- limereport/lrsettingdialog.ui | 6 ++-- 13 files changed, 145 insertions(+), 56 deletions(-) create mode 100644 designer/designersettingmanager.cpp create mode 100644 designer/designersettingmanager.h diff --git a/designer/designer.pro b/designer/designer.pro index 4062e6f..d5abd1b 100644 --- a/designer/designer.pro +++ b/designer/designer.pro @@ -8,7 +8,8 @@ contains(CONFIG,release) { } TEMPLATE = app -SOURCES += main.cpp +SOURCES += main.cpp \ + designersettingmanager.cpp INCLUDEPATH += $$PWD/../include DEPENDPATH += $$PWD/../include @@ -61,3 +62,6 @@ win32 { } } +HEADERS += \ + designersettingmanager.h + diff --git a/designer/designersettingmanager.cpp b/designer/designersettingmanager.cpp new file mode 100644 index 0000000..925143f --- /dev/null +++ b/designer/designersettingmanager.cpp @@ -0,0 +1,37 @@ +#include "designersettingmanager.h" + +DesignerSettingManager::DesignerSettingManager(QObject *parent) : QObject(parent) +{ + m_setting = new QSettings("LimeReport",QCoreApplication::applicationName()); +} + +DesignerSettingManager::~DesignerSettingManager() +{ + delete m_setting; +} + +void DesignerSettingManager::getAviableLanguages(QList* languages) +{ + languages->append(QLocale::Russian); + languages->append(QLocale::English); + languages->append(QLocale::Arabic); +} + +QLocale::Language DesignerSettingManager::getCurrentDefaultLanguage() +{ + m_setting->beginGroup("ReportDesigner"); + QVariant v = m_setting->value("DesignerLanguage"); + m_setting->endGroup(); + if (v.isValid()){ + return static_cast(v.toInt()) ; + } else { + return QLocale::system().language(); + } +} + +void DesignerSettingManager::currentDefaulLanguageChanged(QLocale::Language language) +{ + m_setting->beginGroup("ReportDesigner"); + m_setting->setValue("DesignerLanguage", (int)language); + m_setting->endGroup(); +} diff --git a/designer/designersettingmanager.h b/designer/designersettingmanager.h new file mode 100644 index 0000000..2f07d79 --- /dev/null +++ b/designer/designersettingmanager.h @@ -0,0 +1,27 @@ +#ifndef DESIGNERSETTINGMANAGER_H +#define DESIGNERSETTINGMANAGER_H + +#include +#include +#include +#include + +class DesignerSettingManager : public QObject +{ + Q_OBJECT +public: + explicit DesignerSettingManager(QObject *parent = 0); + ~DesignerSettingManager(); + void setApplicationInstance(QApplication* application); +signals: + +public slots: + void getAviableLanguages(QList* languages); + QLocale::Language getCurrentDefaultLanguage(); + void currentDefaulLanguageChanged(QLocale::Language language); +private: + QApplication* m_app; + QSettings* m_setting; +}; + +#endif // DESIGNERSETTINGMANAGER_H diff --git a/designer/main.cpp b/designer/main.cpp index 9132b47..eeadf9b 100644 --- a/designer/main.cpp +++ b/designer/main.cpp @@ -1,25 +1,46 @@ #include #include #include +#include +#include "designersettingmanager.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); + DesignerSettingManager manager; QTranslator limeReportTranslator; QString translationPath = QApplication::applicationDirPath(); translationPath.append("/languages"); - limeReportTranslator.load("limereport_"+QLocale::system().name(),translationPath); + + QString designerTranslation = QLocale(manager.getCurrentDefaultLanguage()).name(); + + limeReportTranslator.load("limereport_"+designerTranslation, translationPath); a.installTranslator(&limeReportTranslator); QTranslator qtTranslator; - qtTranslator.load("qt_" + QLocale::system().name(),translationPath); + qtTranslator.load("qt_" + designerTranslation, translationPath); a.installTranslator(&qtTranslator); + Qt::LayoutDirection layoutDirection = QLocale(manager.getCurrentDefaultLanguage()).textDirection(); + LimeReport::ReportEngine report; + a.setLayoutDirection(layoutDirection); + report.setPreviewLayoutDirection(layoutDirection); + if (a.arguments().count()>1){ report.loadFromFile(a.arguments().at(1)); } + QObject::connect(&report, SIGNAL(getAviableLanguages(QList*)), + &manager, SLOT(getAviableLanguages(QList*))); + + QObject::connect(&report, SIGNAL(getCurrentDefaultLanguage()), + &manager, SLOT(getCurrentDefaultLanguage())); + + QObject::connect(&report, SIGNAL(currentDefaulLanguageChanged(QLocale::Language)), + &manager, SLOT(currentDefaulLanguageChanged(QLocale::Language))); + report.designReport(); return a.exec(); } + diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 97549f5..e6db8d0 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -113,9 +113,7 @@ public: bool setReportLanguage(QLocale::Language language); Qt::LayoutDirection previewLayoutDirection(); void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); - void addDesignerLanguage(QLocale::Language language); - void removeDesignerLanguage(QLocale::Language language); - QList* designerLanguages(); + QList designerLanguages(); QLocale::Language currentDesignerLanguage(); signals: void renderStarted(); @@ -124,6 +122,9 @@ signals: void onLoad(bool& loaded); void onSave(); void saveFinished(); + void getAviableLanguages(QList* languages); + void currentDefaulLanguageChanged(QLocale::Language); + QLocale::Language getCurrentDefaultLanguage(); public slots: void cancelRender(); protected: diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 9fc328d..c32e608 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -720,7 +720,9 @@ void ReportDesignWidget::editSetting() m_defaultFont = setting.defaultFont(); m_useDarkTheme = setting.userDarkTheme(); m_report->setSuppressFieldAndVarError(setting.suppressAbsentFieldsAndVarsWarnings()); - m_report->setCurrentDesignerLanguage(setting.designerLanguage()); + if (m_report->currentDesignerLanguage() != setting.designerLanguage() ){ + m_report->setCurrentDesignerLanguage(setting.designerLanguage()); + } applySettings(); } } diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 6f3dba6..1beb45a 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -71,7 +71,6 @@ public: QSettings* settings(); void restoreSetting(); void setShowProgressDialog(bool value){m_showProgressDialog = value;} - private slots: void slotNewReport(); void slotNewPage(); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index c9ae526..5d57a65 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -950,40 +950,25 @@ void ReportEnginePrivate::activateLanguage(QLocale::Language language) } } -QString ReportEnginePrivate::getLanguagesDir() const +QList ReportEnginePrivate::designerLanguages() { - return m_languagesDir; -} -void ReportEnginePrivate::setLanguagesDir(const QString& languagesDir) -{ - m_languagesDir = languagesDir; -} - -void ReportEnginePrivate::addDesignerLanguage(QLocale::Language language) -{ - if (!m_designerLanguages.contains(language)) - m_designerLanguages.append(language); -} - -void ReportEnginePrivate::removeDesignerLanguage(QLocale::Language language) -{ - m_designerLanguages.removeAll(language); -} - -QList* ReportEnginePrivate::designerLanguages() -{ - return &m_designerLanguages; + QList result; + emit getAviableLanguages(&result); + return result; } QLocale::Language ReportEnginePrivate::currentDesignerLanguage() { - return m_currentDesignerLanguage; + QLocale::Language result = emit getCurrentDefaultLanguage(); + return result; } void ReportEnginePrivate::setCurrentDesignerLanguage(QLocale::Language language) { m_currentDesignerLanguage = language; + QMessageBox::information(m_designerWindow, tr("Warning") ,tr("The language will change after the application is restarted")); + emit currentDefaulLanguageChanged(language); } QString ReportEnginePrivate::styleSheet() const @@ -1167,6 +1152,12 @@ ReportEngine::ReportEngine(QObject *parent) connect(d, SIGNAL(onSave()), this, SIGNAL(onSave())); connect(d, SIGNAL(onLoad(bool&)), this, SIGNAL(onLoad(bool&))); connect(d, SIGNAL(saveFinished()), this, SIGNAL(saveFinished())); + connect(d, SIGNAL(getAviableLanguages(QList*)), + this, SIGNAL(getAviableLanguages(QList*))); + connect(d, SIGNAL(currentDefaulLanguageChanged(QLocale::Language)), + this, SIGNAL(currentDefaulLanguageChanged(QLocale::Language))); + connect(d, SIGNAL(getCurrentDefaultLanguage()), + this, SIGNAL(getCurrentDefaultLanguage())); } ReportEngine::~ReportEngine() @@ -1273,19 +1264,19 @@ bool ReportEngine::setReportLanguage(QLocale::Language language) return d->setReportLanguage(language); } -void ReportEngine::addDesignerLanguage(QLocale::Language language) +Qt::LayoutDirection ReportEngine::previewLayoutDirection() { Q_D(ReportEngine); - d->addDesignerLanguage(language); + return d->previewLayoutDirection(); } -void ReportEngine::removeDesignerLanguage(QLocale::Language language) +void ReportEngine::setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection) { Q_D(ReportEngine); - d->removeDesignerLanguage(language); + d->setPreviewLayoutDirection(previewLayoutDirection); } -QList*ReportEngine::designerLanguages() +QList ReportEngine::designerLanguages() { Q_D(ReportEngine); return d->designerLanguages(); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 97549f5..e6db8d0 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -113,9 +113,7 @@ public: bool setReportLanguage(QLocale::Language language); Qt::LayoutDirection previewLayoutDirection(); void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); - void addDesignerLanguage(QLocale::Language language); - void removeDesignerLanguage(QLocale::Language language); - QList* designerLanguages(); + QList designerLanguages(); QLocale::Language currentDesignerLanguage(); signals: void renderStarted(); @@ -124,6 +122,9 @@ signals: void onLoad(bool& loaded); void onSave(); void saveFinished(); + void getAviableLanguages(QList* languages); + void currentDefaulLanguageChanged(QLocale::Language); + QLocale::Language getCurrentDefaultLanguage(); public slots: void cancelRender(); protected: diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index eb4f611..69fa30f 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -84,7 +84,7 @@ public: virtual void setSuppressFieldAndVarError(bool suppressFieldAndVarError) = 0; virtual void setStyleSheet(const QString& styleSheet) = 0; virtual QString styleSheet() const = 0; - virtual QList* designerLanguages() = 0; + virtual QList designerLanguages() = 0; virtual QLocale::Language currentDesignerLanguage() = 0; virtual void setCurrentDesignerLanguage(QLocale::Language language) = 0; }; @@ -182,11 +182,7 @@ public: void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); QString styleSheet() const; void setStyleSheet(const QString &styleSheet); - QString getLanguagesDir() const; - void setLanguagesDir(const QString& languagesDir); - void addDesignerLanguage(QLocale::Language language); - void removeDesignerLanguage(QLocale::Language language); - QList* designerLanguages(); + QList designerLanguages(); QLocale::Language currentDesignerLanguage(); void setCurrentDesignerLanguage(QLocale::Language language); signals: @@ -199,6 +195,9 @@ signals: void onLoad(bool& loaded); void onSave(); void saveFinished(); + void getAviableLanguages(QList* languages); + void currentDefaulLanguageChanged(QLocale::Language); + QLocale::Language getCurrentDefaultLanguage(); public slots: bool slotLoadFromFile(const QString& fileName); void cancelRender(); @@ -257,8 +256,6 @@ private: Qt::LayoutDirection m_previewLayoutDirection; LimeReportPluginInterface* m_designerFactory; QString m_styleSheet; - QString m_languagesDir; - QList m_designerLanguages; QLocale::Language m_currentDesignerLanguage; }; diff --git a/limereport/lrsettingdialog.cpp b/limereport/lrsettingdialog.cpp index c1272f1..b05fa74 100644 --- a/limereport/lrsettingdialog.cpp +++ b/limereport/lrsettingdialog.cpp @@ -49,7 +49,7 @@ bool SettingDialog::suppressAbsentFieldsAndVarsWarnings() QLocale::Language SettingDialog::designerLanguage() { - foreach (QLocale::Language language, *m_designerLanguages) { + foreach (QLocale::Language language, m_aviableLanguages) { if (ui->designerLanguage->currentText().compare(QLocale::languageToString(language)) == 0) return language; } @@ -81,14 +81,22 @@ void SettingDialog::setUseDarkTheme(bool value) ui->cbbUseDarkTheme->setChecked(value); } -void SettingDialog::setDesignerLanguages(QList* languages, QLocale::Language currentLanguage) +void SettingDialog::setDesignerLanguages(QList languages, QLocale::Language currentLanguage) { - m_designerLanguages = languages; + m_aviableLanguages = languages; + m_currentLanguage = currentLanguage; + + if (languages.isEmpty()) { + ui->designerLanguage->setVisible(false); + ui->lblLanguage->setVisible(false); + return; + } ui->designerLanguage->addItem(QLocale::languageToString(currentLanguage)); - foreach (QLocale::Language language, *languages) { + foreach (QLocale::Language language, languages) { if (language != currentLanguage) ui->designerLanguage->addItem(QLocale::languageToString(language)); } + ui->designerLanguage->setCurrentText(QLocale::languageToString(currentLanguage)); } } // namespace LimeReport diff --git a/limereport/lrsettingdialog.h b/limereport/lrsettingdialog.h index 20bbb0b..d4c89e3 100644 --- a/limereport/lrsettingdialog.h +++ b/limereport/lrsettingdialog.h @@ -28,10 +28,11 @@ public: void setVerticalGridStep(int value); void setDefaultFont(const QFont& value); void setUseDarkTheme(bool value); - void setDesignerLanguages(QList* languages, QLocale::Language currentLanguage); + void setDesignerLanguages(QList languages, QLocale::Language currentLanguage); private: Ui::SettingDialog *ui; - QList* m_designerLanguages; + QList m_aviableLanguages; + QLocale::Language m_currentLanguage; }; } // namespace LimeReport diff --git a/limereport/lrsettingdialog.ui b/limereport/lrsettingdialog.ui index 688ad14..fa7da68 100644 --- a/limereport/lrsettingdialog.ui +++ b/limereport/lrsettingdialog.ui @@ -11,7 +11,7 @@ - + 0 0 @@ -115,9 +115,9 @@ - + - + Language From 91827a27f2a9eb14fe4a1eef30e595ee4febdb05 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 16 May 2018 11:00:15 +0300 Subject: [PATCH 156/347] FontEditor fixed --- limereport/items/editors/lrfonteditorwidget.cpp | 4 ++-- limereport/items/editors/lrfonteditorwidget.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/limereport/items/editors/lrfonteditorwidget.cpp b/limereport/items/editors/lrfonteditorwidget.cpp index 2d6bcad..be54949 100644 --- a/limereport/items/editors/lrfonteditorwidget.cpp +++ b/limereport/items/editors/lrfonteditorwidget.cpp @@ -106,9 +106,9 @@ bool FontEditorWidget::ignoreSlots() const } -void FontEditorWidget::slotFontChanged(const QFont /*&font*/) +void FontEditorWidget::slotFontChanged(const QFont& /*font*/) { - // if (page()) page()->setFont(font); + //if (page()) page()->setFont(font); } void FontEditorWidget::slotFontSizeChanged(const QString &value) diff --git a/limereport/items/editors/lrfonteditorwidget.h b/limereport/items/editors/lrfonteditorwidget.h index c5de288..d319ff0 100644 --- a/limereport/items/editors/lrfonteditorwidget.h +++ b/limereport/items/editors/lrfonteditorwidget.h @@ -53,7 +53,7 @@ protected: QFontComboBox* fontNameEditor(){return m_fontNameEditor;} virtual void initEditor(); protected slots: - virtual void slotFontChanged(const QFont); + virtual void slotFontChanged(const QFont&); virtual void slotFontSizeChanged(const QString& value); virtual void slotFontAttribsChanged(bool); void slotPropertyChanged(const QString& objectName, const QString& property, const QVariant &oldValue, const QVariant &newValue); From 16a5da084a4d73eff0ae57fab169fcaedb83d35e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 21 May 2018 18:54:55 +0300 Subject: [PATCH 157/347] ru.ts updated --- translations/limereport_ru.ts | 454 +++++++++++++++++++++++++++++++++- 1 file changed, 450 insertions(+), 4 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 7d0f7ef..d66a67a 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1,6 +1,60 @@ + + $ClassName$ + + $ClassName$ + + + + + ChartItemEditor + + Series editor + + + + Series + + + + Add + + + + Delete + + + + Name + Имя + + + Values field + + + + Color + + + + Type + Тип + + + Labels field + + + + Ok + Ок + + + Series name + + + LRVariableDialog @@ -23,6 +77,21 @@ Attention Внимание + + Mandatory + + + + + LanguageSelectDialog + + Dialog + + + + Language + + LimeReport::AboutDialog @@ -319,6 +388,10 @@ p, li { white-space: pre-wrap; } Start new page Начинать новую страницу + + Keep top space + + LimeReport::BaseDesignIntf @@ -350,6 +423,10 @@ p, li { white-space: pre-wrap; } All borders Внешние границы + + Create Horizontal Layout + + LimeReport::ConnectionDesc @@ -440,6 +517,10 @@ p, li { white-space: pre-wrap; } already exists! уже существует! + + Port + + LimeReport::DataBand @@ -447,6 +528,10 @@ p, li { white-space: pre-wrap; } Data Данные + + Use alternate background color + + LimeReport::DataBrowser @@ -595,6 +680,37 @@ p, li { white-space: pre-wrap; } Внешние переменные + + LimeReport::DialogDesignerManager + + Edit Widgets + + + + Widget Box + + + + Object Inspector + Инспектор объектов + + + Property Editor + + + + Signals && Slots Editor + + + + Resource Editor + + + + Action Editor + + + LimeReport::EnumPropItem @@ -785,6 +901,42 @@ p, li { white-space: pre-wrap; } VerticalUniform Вертикально равномерно + + Pie + + + + VerticalBar + + + + HorizontalBar + + + + LegendAlignTop + + + + LegendAlignCenter + + + + LegendAlignBottom + + + + TitleAlignLeft + + + + TitleAlignRight + + + + TitleAlignCenter + + LimeReport::FlagsPropItem @@ -894,6 +1046,10 @@ p, li { white-space: pre-wrap; } Image Изображение + + Watermark + + LimeReport::ItemLocationPropItem @@ -1007,6 +1163,14 @@ p, li { white-space: pre-wrap; } Page Footer Нижний колонтитул + + Print on first page + + + + Print on last page + + LimeReport::PageHeader @@ -1021,6 +1185,22 @@ p, li { white-space: pre-wrap; } Paste Вставить + + Page is TOC + + + + Reset page number + + + + Full page + + + + Set page size to printer + + LimeReport::PreviewReportWidget @@ -1553,6 +1733,66 @@ p, li { white-space: pre-wrap; } Property value Значение + + endlessHeight + + + + extendedHeight + + + + isExtendedInDesignMode + + + + pageIsTOC + + + + setPageSizeToPrinter + + + + fillInSecondPass + + + + chartTitle + + + + chartType + + + + drawLegendBorder + + + + labelsField + + + + legendAlign + + + + series + + + + titleAlign + + + + watermark + + + + keepTopSpace + + LimeReport::RectMMPropItem @@ -1594,6 +1834,10 @@ p, li { white-space: pre-wrap; } Wrong file format Неверный формат файла + + Translations + + LimeReport::ReportDesignWindow @@ -1687,11 +1931,11 @@ p, li { white-space: pre-wrap; } Hide left panel - Спрятать левую панель + Спрятать левую панель Hide right panel - Спрятать правую панель + Спрятать правую панель Report Tools @@ -1837,6 +2081,46 @@ p, li { white-space: pre-wrap; } Report has been modified! Do you want save the report? Отчет был изменен! Сохранить изменения? + + Hide left panel | Alt+L + + + + Hide right panel | Alt+R + + + + Delete dialog + + + + Add new dialog + + + + Widget Box + + + + Property Editor + + + + Action Editor + + + + Resource Editor + + + + SignalSlot Editor + + + + Dialog Designer Tools + + LimeReport::ReportEnginePrivate @@ -1858,6 +2142,22 @@ p, li { white-space: pre-wrap; } This preview is no longer valid. Файл отчета "%1" изменил имя или был удален. + + Designer not found! + + + + Language %1 already exists + + + + Warning + Предупреждение + + + The language will change after the application is restarted + + LimeReport::ReportFooter @@ -2042,12 +2342,31 @@ This preview is no longer valid. Диалог %1 уже существует + + LimeReport::ScriptEditor + + Form + Форма + + + Data + Данные + + + Functions + Функции + + LimeReport::ScriptEngineContext Dialog with name: %1 can`t be created Диалог %1 не может быть создан + + Error + Ошибка + LimeReport::ScriptEngineManager @@ -2103,6 +2422,50 @@ This preview is no longer valid. GENERAL ОБЩИЕ + + Function manger with name "%1" already exists! + + + + FieldName + + + + Field %1 not found in %2! + + + + Datasource + Источник данных + + + ValueField + + + + KeyField + + + + KeyFieldValue + + + + Unique identifier + + + + Content + Содержимое + + + Indent + + + + datasourceName + + LimeReport::SettingDialog @@ -2138,6 +2501,14 @@ This preview is no longer valid. Suppress absent fields and variables warning Не выводить сообщения об отсутствии полей или переменных + + Language + + + + Use dark theme + + LimeReport::SubDetailBand @@ -2221,6 +2592,14 @@ This preview is no longer valid. TextItem " %1 " not found! Текстовый элемент %1 не найден! + + Transparent + + + + Watermark + + LimeReport::TextItemEditor @@ -2234,7 +2613,7 @@ This preview is no longer valid. Functions - Функции + Функции Editor settings @@ -2250,7 +2629,7 @@ This preview is no longer valid. Data - Данные + Данные ... @@ -2269,6 +2648,53 @@ This preview is no longer valid. + + LimeReport::TranslationEditor + + Form + Форма + + + Languages + + + + ... + ... + + + Pages + + + + Strings + + + + Source Text + + + + Translation + + + + Checked + + + + Report Item + + + + Property + + + + Source text + + + LimeReport::VariablesHolder @@ -2486,5 +2912,25 @@ This preview is no longer valid. Object with name %1 already exists! Объект %1 уже существует! + + Chart Item + + + + First + + + + Second + + + + Thrid + + + + Datasource manager not found + + From c32281fb7965c7e12b1bad7762c6119038e755a5 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 21 May 2018 21:10:16 +0300 Subject: [PATCH 158/347] Fix re-enabling subdetail checkbox #109 --- include/lrreportengine.h | 1 + limereport/databrowser/lrdatabrowser.cpp | 69 ++++++++++++++-------- limereport/databrowser/lrdatabrowser.h | 5 ++ limereport/databrowser/lrsqleditdialog.cpp | 3 +- limereport/databrowser/lrsqleditdialog.h | 2 +- 5 files changed, 54 insertions(+), 26 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index e6db8d0..6eed25a 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -122,6 +122,7 @@ signals: void onLoad(bool& loaded); void onSave(); void saveFinished(); + void loaded(); void getAviableLanguages(QList* languages); void currentDefaulLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); diff --git a/limereport/databrowser/lrdatabrowser.cpp b/limereport/databrowser/lrdatabrowser.cpp index 3dcd795..50eaa6a 100644 --- a/limereport/databrowser/lrdatabrowser.cpp +++ b/limereport/databrowser/lrdatabrowser.cpp @@ -96,31 +96,10 @@ void DataBrowser::slotAddConnection() void DataBrowser::slotSQLEditingFinished(SQLEditResult result) { if (result.dialogMode==SQLEditDialog::AddMode) { - switch (result.resultMode) { - case SQLEditResult::Query: - addQuery(result); - break; - case SQLEditResult::SubQuery: - addSubQuery(result); - break; - case SQLEditResult::SubProxy: - addProxy(result); - default: - break; - } + addDatasource(result); } else { - switch(result.resultMode){ - case SQLEditResult::Query: - changeQuery(result); - break; - case SQLEditResult::SubQuery: - changeSubQuery(result); - break; - case SQLEditResult::SubProxy: - changeProxy(result); - } + applyChanges(result); } - updateDataTree(); } @@ -661,6 +640,50 @@ void DataBrowser::changeProxy(SQLEditResult result) } } +SQLEditResult::ResultMode DataBrowser::currentDatasourceType(const QString& datasourceName) +{ + if (m_report->dataManager()->isQuery(datasourceName)) return SQLEditResult::Query; + if (m_report->dataManager()->isSubQuery(datasourceName)) return SQLEditResult::SubQuery; + if (m_report->dataManager()->isProxy(datasourceName)) return SQLEditResult::SubProxy; + return SQLEditResult::Undefined; +} + + +void DataBrowser::applyChanges(SQLEditResult result) +{ + if (result.resultMode == currentDatasourceType(result.datasourceName)){ + switch(result.resultMode){ + case SQLEditResult::Query: + changeQuery(result); + break; + case SQLEditResult::SubQuery: + changeSubQuery(result); + break; + case SQLEditResult::SubProxy: + changeProxy(result); + } + } else { + removeDatasource(result.datasourceName); + addDatasource(result); + } +} + +void DataBrowser::addDatasource(SQLEditResult result) +{ + switch (result.resultMode) { + case SQLEditResult::Query: + addQuery(result); + break; + case SQLEditResult::SubQuery: + addSubQuery(result); + break; + case SQLEditResult::SubProxy: + addProxy(result); + default: + break; + } +} + void DataBrowser::addConnectionDesc(ConnectionDesc *connection) { m_report->dataManager()->addConnectionDesc(connection); diff --git a/limereport/databrowser/lrdatabrowser.h b/limereport/databrowser/lrdatabrowser.h index 7d0a91e..3e4bfd3 100644 --- a/limereport/databrowser/lrdatabrowser.h +++ b/limereport/databrowser/lrdatabrowser.h @@ -106,6 +106,11 @@ private: void addProxy(SQLEditResult result); void changeProxy(SQLEditResult result); + + SQLEditResult::ResultMode currentDatasourceType(const QString& datasourceName); + void applyChanges(SQLEditResult result); + void addDatasource(SQLEditResult result); + void addConnectionDesc(ConnectionDesc *connection); void changeConnectionDesc(ConnectionDesc *connection); bool checkConnectionDesc(ConnectionDesc *connection); diff --git a/limereport/databrowser/lrsqleditdialog.cpp b/limereport/databrowser/lrsqleditdialog.cpp index f74ae6c..ae0d297 100644 --- a/limereport/databrowser/lrsqleditdialog.cpp +++ b/limereport/databrowser/lrsqleditdialog.cpp @@ -179,7 +179,7 @@ void SQLEditDialog::setDataSources(LimeReport::DataSourceManager *dataSources, Q { m_datasources=dataSources; if (!datasourceName.isEmpty()){ - ui->cbSubdetail->setEnabled(false); + ui->cbSubdetail->setEnabled(true); initQueryMode(); m_oldDatasourceName=datasourceName; ui->leDatasourceName->setText(datasourceName); @@ -278,7 +278,6 @@ void SQLEditDialog::initSubQueryMode() ui->leMaster->setVisible(true); ui->leMaster->setEnabled(true); ui->lbMaster->setVisible(true); - } void SQLEditDialog::initProxyMode() diff --git a/limereport/databrowser/lrsqleditdialog.h b/limereport/databrowser/lrsqleditdialog.h index 269f3f4..0f6759a 100644 --- a/limereport/databrowser/lrsqleditdialog.h +++ b/limereport/databrowser/lrsqleditdialog.h @@ -95,7 +95,7 @@ private: }; struct SQLEditResult{ - enum ResultMode{Query,SubQuery,SubProxy}; + enum ResultMode{Query, SubQuery, SubProxy, Undefined}; QString connectionName; QString datasourceName; QString oldDatasourceName; From d460a36e45576a23006b9798216530b3fc9d045d Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 22 May 2018 01:24:38 +0400 Subject: [PATCH 159/347] designer translate ui fixed --- designer/designersettingmanager.cpp | 2 ++ designer/main.cpp | 21 ++++++++++++--------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/designer/designersettingmanager.cpp b/designer/designersettingmanager.cpp index 925143f..6a353ab 100644 --- a/designer/designersettingmanager.cpp +++ b/designer/designersettingmanager.cpp @@ -15,6 +15,8 @@ void DesignerSettingManager::getAviableLanguages(QList* langu languages->append(QLocale::Russian); languages->append(QLocale::English); languages->append(QLocale::Arabic); + languages->append(QLocale::French); + languages->append(QLocale::Chinese); } QLocale::Language DesignerSettingManager::getCurrentDefaultLanguage() diff --git a/designer/main.cpp b/designer/main.cpp index eeadf9b..3fcb4a9 100644 --- a/designer/main.cpp +++ b/designer/main.cpp @@ -9,24 +9,27 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); DesignerSettingManager manager; + LimeReport::ReportEngine report; + QTranslator limeReportTranslator; + QTranslator qtTranslator; QString translationPath = QApplication::applicationDirPath(); translationPath.append("/languages"); QString designerTranslation = QLocale(manager.getCurrentDefaultLanguage()).name(); - limeReportTranslator.load("limereport_"+designerTranslation, translationPath); - a.installTranslator(&limeReportTranslator); + if (limeReportTranslator.load("limereport_"+designerTranslation, translationPath)){ - QTranslator qtTranslator; - qtTranslator.load("qt_" + designerTranslation, translationPath); - a.installTranslator(&qtTranslator); + qtTranslator.load("qt_" + designerTranslation, translationPath); + a.installTranslator(&qtTranslator); + a.installTranslator(&limeReportTranslator); - Qt::LayoutDirection layoutDirection = QLocale(manager.getCurrentDefaultLanguage()).textDirection(); + Qt::LayoutDirection layoutDirection = QLocale(manager.getCurrentDefaultLanguage()).textDirection(); + + a.setLayoutDirection(layoutDirection); + report.setPreviewLayoutDirection(layoutDirection); + } - LimeReport::ReportEngine report; - a.setLayoutDirection(layoutDirection); - report.setPreviewLayoutDirection(layoutDirection); if (a.arguments().count()>1){ report.loadFromFile(a.arguments().at(1)); From 98cf12984e794853017a991ed0653e563577e7bb Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 22 May 2018 01:25:19 +0400 Subject: [PATCH 160/347] include updated --- include/lrreportengine.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 6eed25a..a4c1158 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -122,10 +122,14 @@ signals: void onLoad(bool& loaded); void onSave(); void saveFinished(); - void loaded(); + + void loaded(); + void printedToPDF(QString fileName); + void getAviableLanguages(QList* languages); void currentDefaulLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); + public slots: void cancelRender(); protected: From 77f26a846bbf491adcbbc2ebfd30682a288a0d59 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 22 May 2018 11:13:36 +0300 Subject: [PATCH 161/347] typo fixed --- limereport/lrdatadesignintf.cpp | 2 +- limereport/lrdatadesignintf.h | 4 ++-- limereport/lrscriptenginemanager.cpp | 2 +- limereport/lrscriptenginemanager.h | 4 ++-- limereport/lrsettingdialog.ui | 7 +++++-- 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index 23bd44c..2cde1d9 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -507,7 +507,7 @@ QObject *ProxyDesc::elementAt(const QString &collectionName, int index) ProxyHolder::ProxyHolder(ProxyDesc* desc, DataSourceManager* dataManager) :m_model(0), m_desc(desc), m_lastError(""), m_mode(IDataSource::RENDER_MODE), - m_invalid(false), m_dataManger(dataManager) + m_invalid(false), m_dataManager(dataManager) {} QString ProxyHolder::masterDatasource() diff --git a/limereport/lrdatadesignintf.h b/limereport/lrdatadesignintf.h index 3486549..2336ad5 100644 --- a/limereport/lrdatadesignintf.h +++ b/limereport/lrdatadesignintf.h @@ -337,7 +337,7 @@ public: void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false); void update(){} void clearErrors(){m_lastError = "";} - DataSourceManager* dataManager() const {return m_dataManger;} + DataSourceManager* dataManager() const {return m_dataManager;} private slots: void slotChildModelDestoroyed(); private: @@ -347,7 +347,7 @@ private: QString m_lastError; IDataSource::DatasourceMode m_mode; bool m_invalid; - DataSourceManager* m_dataManger; + DataSourceManager* m_dataManager; }; class ModelToDataSource : public QObject, public IDataSource{ diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 6dd5ea8..fa78023 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -262,7 +262,7 @@ bool ScriptEngineManager::addFunction(const JSFunctionDesc &functionDescriber) return false; } } else { - m_lastError = tr("Function manger with name \"%1\" already exists!"); + m_lastError = tr("Function manager with name \"%1\" already exists!"); return false; } diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index a15f524..2241c85 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -232,10 +232,10 @@ public: const QString& functionCategory, const QString& functionDescription, const QString& functionManagerName, - QObject* functionManger, + QObject* functionManager, const QString& functionScriptWrapper ): m_name(functionName), m_category(functionCategory), m_description(functionDescription), - m_managerName(functionManagerName), m_manager(functionManger), m_scriptWrapper(functionScriptWrapper) + m_managerName(functionManagerName), m_manager(functionManager), m_scriptWrapper(functionScriptWrapper) {} QString name() const; void setName(const QString &name); diff --git a/limereport/lrsettingdialog.ui b/limereport/lrsettingdialog.ui index fa7da68..19d27fe 100644 --- a/limereport/lrsettingdialog.ui +++ b/limereport/lrsettingdialog.ui @@ -7,11 +7,11 @@ 0 0 397 - 378 + 345 - + 0 0 @@ -20,6 +20,9 @@ Designer setting + + QLayout::SetDefaultConstraint + From 05df8021bad6413a4bd8c8eee35df1da5d58cf92 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 22 May 2018 11:24:29 +0300 Subject: [PATCH 162/347] translation creation updated --- limereport/limereport.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 079efff..f9a6480 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -102,10 +102,10 @@ contains(CONFIG,build_translations){ qtPrepareTool(LUPDATE, lupdate) greaterThan(QT_MAJOR_VERSION, 4) { - ts.commands = $$LUPDATE $$shell_quote($$PWD) -ts $$TRANSLATIONS + ts.commands = $$LUPDATE $$shell_quote($$PWD) -no-obsolete -ts $$TRANSLATIONS } lessThan(QT_MAJOR_VERSION, 5){ - ts.commands = $$LUPDATE $$quote($$PWD) -ts $$TRANSLATIONS + ts.commands = $$LUPDATE $$quote($$PWD) -no-obsolete -ts $$TRANSLATIONS } TRANSLATIONS_FILES = qtPrepareTool(LRELEASE, lrelease) From ab7e874992c2338928b54ed4cf556939b0d75e61 Mon Sep 17 00:00:00 2001 From: weibt Date: Thu, 24 May 2018 01:21:11 +0800 Subject: [PATCH 163/347] Chinese translation updated --- translations/limereport_zh.ts | 468 ++++++++++++++++++++++++++++++++-- 1 file changed, 445 insertions(+), 23 deletions(-) diff --git a/translations/limereport_zh.ts b/translations/limereport_zh.ts index dec023c..a0492ea 100644 --- a/translations/limereport_zh.ts +++ b/translations/limereport_zh.ts @@ -1,6 +1,60 @@ + + $ClassName$ + + $ClassName$ + $ClassName$ + + + + ChartItemEditor + + Series editor + 数据系列编辑器 + + + Series + 数据系列 + + + Add + 增加 + + + Delete + 删除 + + + Name + 名称 + + + Values field + 取值字段 + + + Color + 颜色 + + + Type + 类型 + + + Labels field + 标签字段 + + + Ok + 确定 + + + Series name + 系列名称 + + LRVariableDialog @@ -23,6 +77,21 @@ Attention 注意 + + Mandatory + 必要 + + + + LanguageSelectDialog + + Dialog + 对话框 + + + Language + 语言 + LimeReport::AboutDialog @@ -296,7 +365,7 @@ p, li { white-space: pre-wrap; } connected to - 连接到 + 连接到 Bring to top @@ -326,6 +395,10 @@ p, li { white-space: pre-wrap; } Start new page 开始新页 + + Keep top space + 保持顶部距离 + LimeReport::BaseDesignIntf @@ -357,6 +430,10 @@ p, li { white-space: pre-wrap; } All borders 所有边框 + + Create Horizontal Layout + 创建水平布局 + LimeReport::ConnectionDesc @@ -385,7 +462,7 @@ p, li { white-space: pre-wrap; } Server - 服务器 + 服务器 Port @@ -441,11 +518,11 @@ p, li { white-space: pre-wrap; } Connection with name - 连接 + 连接 already exists! - 已经存在! + 已经存在! defaultConnection @@ -458,6 +535,10 @@ p, li { white-space: pre-wrap; } Data 数据带 + + Use alternate background color + 使用交替背景色 + LimeReport::DataBrowser @@ -606,6 +687,37 @@ p, li { white-space: pre-wrap; } 外部变量 + + LimeReport::DialogDesignerManager + + Edit Widgets + 编辑组件 + + + Widget Box + 组件盒 + + + Object Inspector + 对象观察器 + + + Property Editor + 属性编辑器 + + + Signals && Slots Editor + 信号槽编辑器 + + + Resource Editor + 资源编辑器 + + + Action Editor + 动作编辑器 + + LimeReport::EnumPropItem @@ -796,6 +908,42 @@ p, li { white-space: pre-wrap; } VerticalUniform 均匀垂直 + + Pie + 饼状图 + + + VerticalBar + 柱状图 + + + HorizontalBar + 条形图 + + + LegendAlignTop + 图例靠上对齐 + + + LegendAlignCenter + 图例居中 + + + LegendAlignBottom + 图例靠下对齐 + + + TitleAlignLeft + 标题左对齐 + + + TitleAlignRight + 标题右对齐 + + + TitleAlignCenter + 标题居中 + LimeReport::FlagsPropItem @@ -892,7 +1040,7 @@ p, li { white-space: pre-wrap; } Wrong script syntax "%1" - 脚本语法错误 "%1" + 脚本语法错误 "%1" Item "%1" not found @@ -905,6 +1053,10 @@ p, li { white-space: pre-wrap; } Image 图像 + + Watermark + 水印 + LimeReport::ItemLocationPropItem @@ -1018,6 +1170,14 @@ p, li { white-space: pre-wrap; } Page Footer 页脚 + + Print on first page + 首页时打印 + + + Print on last page + 末页时打印 + LimeReport::PageHeader @@ -1032,6 +1192,22 @@ p, li { white-space: pre-wrap; } Paste 粘贴 + + Page is TOC + 目录页面 + + + Reset page number + 重置页数 + + + Full page + 全页 + + + Set page size to printer + 适合打印机纸张大小 + LimeReport::PreviewReportWidget @@ -1148,7 +1324,7 @@ p, li { white-space: pre-wrap; } Page: - 页数: + 页数: Font @@ -1564,6 +1740,66 @@ p, li { white-space: pre-wrap; } Warning 警告 + + endlessHeight + 无限高度 + + + extendedHeight + 扩展高度 + + + isExtendedInDesignMode + 设计模式扩展 + + + pageIsTOC + 目录页面 + + + setPageSizeToPrinter + 适合打印机纸张 + + + fillInSecondPass + 二次填充 + + + chartTitle + 图表标题 + + + chartType + 图表类型 + + + drawLegendBorder + 显示图例边框 + + + labelsField + 标签字段 + + + legendAlign + 图例对齐 + + + series + 数据系列 + + + titleAlign + 标题对齐 + + + watermark + 水印 + + + keepTopSpace + 保持顶部距离 + LimeReport::RectMMPropItem @@ -1605,6 +1841,10 @@ p, li { white-space: pre-wrap; } Wrong file format 文件格式错误 + + Translations + 翻译 + LimeReport::ReportDesignWindow @@ -1838,7 +2078,7 @@ p, li { white-space: pre-wrap; } page rendered - 报表生成 + 报表生成 Warning @@ -1848,6 +2088,38 @@ p, li { white-space: pre-wrap; } File "%1" not found! 未找到文件 "%1"! + + Delete dialog + 删除对话框 + + + Add new dialog + 新增对话框 + + + Widget Box + 组件盒 + + + Property Editor + 属性编辑器 + + + Action Editor + 动作编辑器 + + + Resource Editor + 资源编辑器 + + + SignalSlot Editor + 信号槽编辑器 + + + Dialog Designer Tools + 对话框设计工具 + LimeReport::ReportEnginePrivate @@ -1871,6 +2143,22 @@ This preview is no longer valid. 预览已无效。 + + Designer not found! + 设计器未找到! + + + Language %1 already exists + 语言 %1 已存在 + + + Warning + 警告 + + + The language will change after the application is restarted + 应用重启后语言版本将改变 + LimeReport::ReportFooter @@ -2055,12 +2343,31 @@ This preview is no longer valid. 文件格式错误 + + LimeReport::ScriptEditor + + Form + 表格 + + + Data + 数据 + + + Functions + 函数 + + LimeReport::ScriptEngineContext Dialog with name: %1 can`t be created 无法创建对话框 %1 + + Error + 错误 + LimeReport::ScriptEngineManager @@ -2104,10 +2411,6 @@ This preview is no longer valid. DATE&TIME 日期时间 - - Seconds - - CurrencySymbol 货币符号 @@ -2120,6 +2423,50 @@ This preview is no longer valid. Name 名称 + + Function manager with name "%1" already exists! + 函数管理器 %1 已存在! + + + FieldName + 字段名 + + + Field %1 not found in %2! + 在 %2 中找不到字段 %1 ! + + + Datasource + 数据源 + + + ValueField + 值字段 + + + KeyField + 键名字段 + + + KeyFieldValue + 键字段值 + + + Unique identifier + 唯一标识符 + + + Content + 内容内容 + + + Indent + 缩进 + + + datasourceName + 数据源名称 + LimeReport::SettingDialog @@ -2155,6 +2502,14 @@ This preview is no longer valid. Suppress absent fields and variables warning 抑制缺失字段及变量警告 + + Language + 语言 + + + Use dark theme + 使用暗色主题 + LimeReport::SubDetailBand @@ -2238,6 +2593,14 @@ This preview is no longer valid. TextItem " %1 " not found! 未找到文本框 "%1"! + + Transparent + 透明 + + + Watermark + 水印 + LimeReport::TextItemEditor @@ -2249,14 +2612,6 @@ This preview is no longer valid. Content 内容 - - Data - 数据 - - - Functions - 函数 - Editor settings 编辑器设置 @@ -2286,19 +2641,66 @@ This preview is no longer valid. + + LimeReport::TranslationEditor + + Form + 表格 + + + Languages + 语言 + + + ... + ... + + + Pages + + + + Strings + 字符串 + + + Source Text + 源文 + + + Translation + 译文 + + + Checked + 选中 + + + Report Item + 报表组件 + + + Property + 属性 + + + Source text + 源文 + + LimeReport::VariablesHolder variable with name - 变量 + 变量 already exists! - 已存在! + 已存在! does not exists! - 不存在! + 不存在! @@ -2401,7 +2803,7 @@ This preview is no longer valid. and child - 子数据源 + 子数据源 datasouce "%1" not found! @@ -2503,5 +2905,25 @@ This preview is no longer valid. Content is empty 字符串为空 + + Chart Item + 图表组件 + + + First + 第一 + + + Second + 第二 + + + Thrid + 第三 + + + Datasource manager not found + 数据源管理器未找到 + From 90e98be7992953d4c70cedac44fc0c7a4bac003f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 24 May 2018 01:41:45 +0300 Subject: [PATCH 164/347] Properties translation added --- limereport/objectinspector/lrobjectitemmodel.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 6fc1dab..9c1450d 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -149,7 +149,8 @@ void QObjectPropertyModel::translatePropertyName() tr("titleAlign"); tr("watermark"); tr("keepTopSpace"); - + tr("printable"); + tr("AllLines"); } void QObjectPropertyModel::clearObjectsList() @@ -398,7 +399,7 @@ ObjectPropItem * QObjectPropertyModel::createPropertyItem(QMetaProperty prop, QO 0, 0, QString(prop.name()), - QString(prop.name()), + QString(tr(prop.name())), object->property(prop.name()), parent ); From 150d9b1a4de4f43b05b07e0bb3fff009d22d2584 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 24 May 2018 02:24:31 +0300 Subject: [PATCH 165/347] Translations ru, zh updated --- translations/limereport_ru.ts | 250 ++++++++++++++++------------------ translations/limereport_zh.ts | 8 ++ 2 files changed, 129 insertions(+), 129 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index d66a67a..68c8b0e 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -5,54 +5,54 @@ $ClassName$ $ClassName$ - + $ClassName$ ChartItemEditor Series editor - + Редактор рядов данных Series - + Ряд Add - + Добавить Delete - + Удалить Name - Имя + Имя Values field - + Поле значений Color - + Цвет Type - Тип + Тип Labels field - + Поле меток Ok - Ок + Ок Series name - + Название ряда @@ -79,18 +79,18 @@ Mandatory - + Обязательная LanguageSelectDialog Dialog - + Диалог Language - + Язык @@ -295,11 +295,11 @@ p, li { white-space: pre-wrap; } horizontal - горизонтально + Горизонтально vertical - вертикально + Вертикально @@ -390,7 +390,7 @@ p, li { white-space: pre-wrap; } Keep top space - + Сохранять отступ сверху @@ -425,7 +425,7 @@ p, li { white-space: pre-wrap; } Create Horizontal Layout - + Создать Горизонтальную Компановку @@ -519,7 +519,7 @@ p, li { white-space: pre-wrap; } Port - + Порт @@ -530,7 +530,7 @@ p, li { white-space: pre-wrap; } Use alternate background color - + Использовать альтернативный цвет фона @@ -684,31 +684,31 @@ p, li { white-space: pre-wrap; } LimeReport::DialogDesignerManager Edit Widgets - + Панель Инструментов Widget Box - + Панель Виджетов Object Inspector - Инспектор объектов + Инспектор Объектов Property Editor - + Редактор Свойств Signals && Slots Editor - + Редактор Сигналов и Свойств Resource Editor - + Обозреватель Ресурсов Action Editor - + Редактор Действий @@ -903,39 +903,39 @@ p, li { white-space: pre-wrap; } Pie - + Круговая VerticalBar - + Вертикальная панель HorizontalBar - + Горизонтальная панель LegendAlignTop - + Легенда сверху LegendAlignCenter - + Легенда по центру LegendAlignBottom - + Легенда снизу TitleAlignLeft - + Название слева TitleAlignRight - + Название справа TitleAlignCenter - + Название по центру @@ -1048,7 +1048,7 @@ p, li { white-space: pre-wrap; } Watermark - + Водный знак @@ -1165,11 +1165,11 @@ p, li { white-space: pre-wrap; } Print on first page - + Печатать на первой странице Print on last page - + Печатать на последней странице @@ -1187,19 +1187,19 @@ p, li { white-space: pre-wrap; } Page is TOC - + Содержание отчета Reset page number - + Сбросить номер страницы Full page - + На всю страницу Set page size to printer - + Отправить параметры страницы в принтер @@ -1683,7 +1683,7 @@ p, li { white-space: pre-wrap; } layoutType - Тип группировки + Тип компановки barcodeType @@ -1735,62 +1735,70 @@ p, li { white-space: pre-wrap; } endlessHeight - + Бесконечная высота extendedHeight - + Увеличенная высота isExtendedInDesignMode - + Увеличить в режиме редактирования pageIsTOC - + Содержание отчета setPageSizeToPrinter - + Оправитьпараметры страницы в принтер fillInSecondPass - + Заполнять вторым проходом chartTitle - + Заголовок диаграммы chartType - + Тип диаграммы drawLegendBorder - + Отображать границы Легенды labelsField - + Поле меток legendAlign - + Расположение легенды series - + Ряд данных titleAlign - + Расположение Названия watermark - + водяной знак keepTopSpace + Сохранять отступ сверху + + + printable + + + + AllLines @@ -1836,7 +1844,7 @@ p, li { white-space: pre-wrap; } Translations - + Переводы @@ -1919,24 +1927,16 @@ p, li { white-space: pre-wrap; } Edit layouts mode - Режим редактирования группировок + Режим редактирования компановок Horizontal layout - Горизонтальная группировка + Горизонтальная компановка About О программе - - Hide left panel - Спрятать левую панель - - - Hide right panel - Спрятать правую панель - Report Tools Элементы отчета @@ -2083,43 +2083,43 @@ p, li { white-space: pre-wrap; } Hide left panel | Alt+L - + Спрятать левую панель | Alt+L Hide right panel | Alt+R - + Спрятать правую панель | Alt+R Delete dialog - + Удалить диалог Add new dialog - + Добавить диалог Widget Box - + Панель Виджетов Property Editor - + Редактор Свойств Action Editor - + Редактор Действий Resource Editor - + Обозреватель Ресурсов SignalSlot Editor - + Редактор Сигналов и Слотов Dialog Designer Tools - + Панель Инструментов @@ -2144,19 +2144,19 @@ This preview is no longer valid. Designer not found! - + Дизайнер не найден! Language %1 already exists - + Язык %1 уже существует Warning - Предупреждение + Предупреждение The language will change after the application is restarted - + Язык будет изменен после перезапуска приложения @@ -2346,15 +2346,15 @@ This preview is no longer valid. LimeReport::ScriptEditor Form - Форма + Форма Data - Данные + Данные Functions - Функции + Функции @@ -2365,7 +2365,7 @@ This preview is no longer valid. Error - Ошибка + Ошибка @@ -2423,48 +2423,48 @@ This preview is no longer valid. ОБЩИЕ - Function manger with name "%1" already exists! - + Function manager with name "%1" already exists! + Менеджер функций с именем %1 уже существует! FieldName - + Имя поля Field %1 not found in %2! - + Поле %1 не найдено в %2! Datasource - Источник данных + Источник данных ValueField - + Поле Значения KeyField - + Ключевое Поле KeyFieldValue - + Значение Ключевого Поля Unique identifier - + Уникальный идентификатор Content - Содержимое + Содержимое Indent - + Отступ datasourceName - + Имя источника данных @@ -2503,11 +2503,11 @@ This preview is no longer valid. Language - + Язык Use dark theme - + Использовать Темную тему @@ -2594,11 +2594,11 @@ This preview is no longer valid. Transparent - + Прозрачный Watermark - + Водный знак @@ -2611,10 +2611,6 @@ This preview is no longer valid. Content Содержимое - - Functions - Функции - Editor settings Настройки @@ -2627,10 +2623,6 @@ This preview is no longer valid. Cancel Отмена - - Data - Данные - ... ... @@ -2652,47 +2644,47 @@ This preview is no longer valid. LimeReport::TranslationEditor Form - Форма + Форма Languages - + Языки ... - ... + ... Pages - + Страницы Strings - + Строки Source Text - + Исходный текст Translation - + Перевод Checked - + Проверенный Report Item - + Элемент Отчета Property - + Свойство Source text - + Исходный текст @@ -2766,7 +2758,7 @@ This preview is no longer valid. Barcode Item - Элемент штрих код + Штрих код HLayout @@ -2914,23 +2906,23 @@ This preview is no longer valid. Chart Item - + Диаграмма First - + Первый Second - + Второй Thrid - + Третий Datasource manager not found - + Менеджер источников данных не найден diff --git a/translations/limereport_zh.ts b/translations/limereport_zh.ts index a0492ea..8d0b4e0 100644 --- a/translations/limereport_zh.ts +++ b/translations/limereport_zh.ts @@ -1800,6 +1800,14 @@ p, li { white-space: pre-wrap; } keepTopSpace 保持顶部距离 + + printable + + + + AllLines + + LimeReport::RectMMPropItem From 57bda4e77167655eb4bf5c0e365c128913869d2c Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 24 May 2018 02:25:26 +0300 Subject: [PATCH 166/347] Designer translation fixed --- designer/main.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/designer/main.cpp b/designer/main.cpp index 3fcb4a9..87c0832 100644 --- a/designer/main.cpp +++ b/designer/main.cpp @@ -9,27 +9,26 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); DesignerSettingManager manager; - LimeReport::ReportEngine report; + QTranslator limeReportTranslator; QTranslator qtTranslator; QString translationPath = QApplication::applicationDirPath(); translationPath.append("/languages"); + Qt::LayoutDirection layoutDirection = QLocale::system().textDirection(); QString designerTranslation = QLocale(manager.getCurrentDefaultLanguage()).name(); if (limeReportTranslator.load("limereport_"+designerTranslation, translationPath)){ - qtTranslator.load("qt_" + designerTranslation, translationPath); a.installTranslator(&qtTranslator); a.installTranslator(&limeReportTranslator); - Qt::LayoutDirection layoutDirection = QLocale(manager.getCurrentDefaultLanguage()).textDirection(); - a.setLayoutDirection(layoutDirection); - report.setPreviewLayoutDirection(layoutDirection); } + LimeReport::ReportEngine report; + report.setPreviewLayoutDirection(layoutDirection); if (a.arguments().count()>1){ report.loadFromFile(a.arguments().at(1)); From 865d37f3b252914e4beb9a94ad72124b56d44594 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 24 May 2018 02:51:00 +0300 Subject: [PATCH 167/347] Translation ru updated --- translations/limereport_ru.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 68c8b0e..07117cf 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -147,7 +147,19 @@ p, li { white-space: pre-wrap; } <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Генератор отчетов для </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - кросс-платформенная С++ библиотека, написанная с использованием Qt framework и предназначенная для разработчиков программного обеспечения, которые хотят добавить в свое Qt приложение возможность формирования отчетов или печатных форм, генерируемых на основании шаблона.</span></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Официальный веб-сайт : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Эта библиотека распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.</span></p> +<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> +<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. Все права защищены.</span></p></body></html> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -1795,11 +1807,11 @@ p, li { white-space: pre-wrap; } printable - + Печатать AllLines - + Все границы From 66089d27fc8f3bf4a2ba4c46a93beddbe3be9740 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 24 May 2018 12:05:53 +0300 Subject: [PATCH 168/347] Ru translation updated --- translations/limereport_ru.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 07117cf..b99ed80 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -972,6 +972,10 @@ p, li { white-space: pre-wrap; } RightLine Правая граница + + AllLines + Внешние границы + LimeReport::FontEditorWidget @@ -1810,8 +1814,8 @@ p, li { white-space: pre-wrap; } Печатать - AllLines - Все границы + variable + Переменная @@ -2162,14 +2166,6 @@ This preview is no longer valid. Language %1 already exists Язык %1 уже существует - - Warning - Предупреждение - - - The language will change after the application is restarted - Язык будет изменен после перезапуска приложения - LimeReport::ReportFooter From 86eb804e3a929df6788843f9ba04682214c3ed62 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 24 May 2018 12:07:03 +0300 Subject: [PATCH 169/347] Translation updated --- translations/limereport_ar.ts | 586 +++------------------------ translations/limereport_es_ES.ts | 120 +++--- translations/limereport_fr.ts | 675 +++++++++++++++++-------------- translations/limereport_zh.ts | 14 +- 4 files changed, 501 insertions(+), 894 deletions(-) diff --git a/translations/limereport_ar.ts b/translations/limereport_ar.ts index 46272ae..0240adc 100644 --- a/translations/limereport_ar.ts +++ b/translations/limereport_ar.ts @@ -8,35 +8,8 @@ - - AboutDialog - - About - حول البرنامج - - - Author - المؤلف - - - License - إتفاقية الترخيص - - - Close - إغلاق - - - Version 1.1.1 - الإصدار 1.1.1 - - ChartItemEditor - - Form - نموذج - Series @@ -82,116 +55,6 @@ - - ConnectionDialog - - Connection - إتصال بقاعدة بيانات - - - Connection Name - أسم الإتصال - - - Driver - المشغل - - - Server - الخادم - - - User - المستخدم - - - Password - كلمة المرور - - - Database - قاعدة البيانات - - - Auto connect - إتصال تلقائي - - - Check connection - فحص الإتصال - - - Cancel - إلغاء الأمر - - - Error - خطأ - - - Connection succsesfully established! - تم الإتصال بنجاح!! - - - Connection Name is empty - أسم الإتصال فارغ - - - Connection with name - إتصال بأسم - - - already exists - موجود مسبقاً - - - - DataBrowser - - Datasources - مصدر البيانات - - - Add database connection - إضافة إتصال قاعدة بيانات - - - Add new datasource - إضافة مصدر بيانات جديد - - - View data - عرض البيانات - - - Change datasource - تغيير مصدر البيانات - - - Delete datasource - حذف مصدر البيانات - - - Show error - عرض الأخطاء - - - Variables - المتغيرات - - - Add new variable - إضافة متغير - - - Edit variable - تعديل متغير - - - Delete variable - حذف متغير - - LRVariableDialog @@ -230,21 +93,6 @@ - - LimeReport::AVariablesHolder - - variable with name - متغير بأسم - - - already exists !! - موجود مسبقاً !! - - - does not exists !! - غير موجود !! - - LimeReport::AboutDialog @@ -535,6 +383,10 @@ p, li { white-space: pre-wrap; } Start new page + + Keep top space + + LimeReport::BaseDesignIntf @@ -566,6 +418,10 @@ p, li { white-space: pre-wrap; } All borders محاط بإطار + + Create Horizontal Layout + + LimeReport::ConnectionDesc @@ -632,10 +488,6 @@ p, li { white-space: pre-wrap; } Connection with name إتصال بأسم - - already exists - موجود مسبقاً - ... @@ -660,12 +512,9 @@ p, li { white-space: pre-wrap; } already exists! - - - LimeReport::ContentItemDesignIntf - Variable %1 not found - المتغير %1 غير موجود + Port + @@ -675,7 +524,7 @@ p, li { white-space: pre-wrap; } بيانات - useAlternateBackgroundColor + Use alternate background color @@ -729,28 +578,10 @@ p, li { white-space: pre-wrap; } Attention Attention - - Do you really want to delete "%1" connection ? - Do you really want delete "%1" connection ? - هل ترغب في حذف الإتصال "%1" ? - - - User variables - متغيرات المستخدم - System variables متغيرات النظام - - Do you really want to delete "%1" datasource ? - Do you really want delete "%1" datasource ? - هل ترغب في حذف مصدر البيانات "%1" ? - - - Do you really want delete variable "%1" ? - هل ترغب في حذف المتغير "%1" ? - Error خطأ @@ -759,10 +590,6 @@ p, li { white-space: pre-wrap; } ... - - Do you really want to delete variable "%1" ? - هل ترغب في حذف المتغير "%1" ? - Grab variable @@ -808,19 +635,6 @@ p, li { white-space: pre-wrap; } Connection "%1" is not open الإتصال "%1" غير مفتوح - - Datasource "%1" not found ! - الإتصال "%1" غير موجود ! - - - connection with name "%1" already exists ! - الإتصال بأسم "%1" موجود مسبقاً ! - - - datasource with name "%1" already exists ! - data source with name "%1" already exists !! - مصدر البيانات بأسم "%1" موجود مسبقاً ! - invalid connection خطأ بالإتصال @@ -1141,6 +955,10 @@ p, li { white-space: pre-wrap; } RightLine خط أيمن + + AllLines + + LimeReport::FontEditorWidget @@ -1227,6 +1045,10 @@ p, li { white-space: pre-wrap; } Image صورة + + Watermark + + LimeReport::ItemLocationPropItem @@ -1334,23 +1156,20 @@ p, li { white-space: pre-wrap; } الكائن - - LimeReport::PageDesignIntf - - Warning - تحذير - - - Multi band deletion not allowed - لا يمكن حذف فقرات متعددة - - LimeReport::PageFooter Page Footer ذيل الصفحة + + Print on first page + + + + Print on last page + + LimeReport::PageHeader @@ -1471,14 +1290,6 @@ p, li { white-space: pre-wrap; } of %1 من %1 - - Report file name - أسم التقرير - - - PDF file name - أسم ملف PDF - Preview معاينة @@ -1549,10 +1360,6 @@ p, li { white-space: pre-wrap; } topMargin الهامش العلوي - - الهامش السفلي - Отступ нижний - objectName أسم الكائن @@ -1977,6 +1784,22 @@ p, li { white-space: pre-wrap; } titleAlign + + watermark + + + + keepTopSpace + + + + printable + + + + variable + + LimeReport::RectMMPropItem @@ -2093,26 +1916,6 @@ p, li { white-space: pre-wrap; } Render Report إنشاء التقرير - - نمط تعديل النسق - Режим редактирования группировок - - - نسق أفقي - Горизонтальная группировка - - - حول البرنامج - О программе - - - Hide left panel - إخفاء المقطع الأيسر - - - Hide right panel - إخفاء المقطع الأيمن - Report Tools أدوات التقرير @@ -2213,10 +2016,6 @@ p, li { white-space: pre-wrap; } Data Browser إستعراض البيانات - - Report has been modified ! Do you want save the report ? - تم تعديل التقرير ! هل تريد حفظ التعديلات ? - Report file name أسم التقرير @@ -2313,6 +2112,14 @@ p, li { white-space: pre-wrap; } Report has been modified! Do you want save the report? + + Hide left panel | Alt+L + + + + Hide right panel | Alt+R + + LimeReport::ReportEnginePrivate @@ -2434,18 +2241,6 @@ This preview is no longer valid. Error خطأ - - Datasource Name is empty ! - أسم مصدر البيانات فارغ ! - - - SQL is empty ! - SQL فارغة ! - - - Datasource with name: "%1" already exists ! - مصدر البيانات بأسم: "%1" موجود مسبقاً ! - Datasource with name %1 already exist مصدر البيانات بأسم: "%1" موجود مسبقاً @@ -2602,10 +2397,6 @@ This preview is no longer valid. Variable %1 not found المتغير %1 غير موجود - - Function manger with name "%1" already exists! - - GROUP FUNCTIONS @@ -2662,6 +2453,10 @@ This preview is no longer valid. datasourceName + + Function manager with name "%1" already exists! + + LimeReport::SettingDialog @@ -2701,6 +2496,10 @@ This preview is no longer valid. Use dark theme + + Language + + LimeReport::SubDetailBand @@ -2788,6 +2587,10 @@ This preview is no longer valid. TextItem " %1 " not found! + + Watermark + + LimeReport::TextItemEditor @@ -2799,10 +2602,6 @@ This preview is no longer valid. Content المحتوى - - Functions - الدوال - Editor settings إعدادات المحرر @@ -2885,14 +2684,6 @@ This preview is no longer valid. variable with name متغير بأسم - - already exists !! - موجود مسبقاً !! - - - does not exists !! - غير موجود !! - already exists! @@ -2902,93 +2693,6 @@ This preview is no longer valid. - - PreviewReportWindow - - Preview - معاينة - - - View - عرض - - - Report - تقرير - - - toolBar - شريط الأدوات - - - Print - طباعة - - - Zoom In - تكبير - - - Zoom Out - تصغير - - - Prior Page - الصفحة السابقة - - - Next Page - الصفحة التالية - - - Close Preview - أغلاق - - - Edit Mode - وضع التعديل - - - Save to file - حفظ إلى ملف - - - Show errors - عرض الأخطاء - - - First Page - الصفحة الأولى - - - First page - الصفحة الأولى - - - Last Page - الصفحة الأخيرة - - - Print To PDF - تحويل إلى PDF - - - Page: - صفحة: - - - of %1 - من %1 - - - Report file name - أسم التقرير - - - PDF file name - أسم ملف PDF - - QObject @@ -3095,10 +2799,6 @@ This preview is no longer valid. Selected elements have different parent containers العناصر المحددة مختلفة البنية - - Object with name %1 already exists - أسم الكائن %1 уже موجود مسبقاً - Function %1 not found or have wrong arguments الدالة %1 غير موجودة او الباريميترات خاطئة @@ -3131,22 +2831,6 @@ This preview is no longer valid. File %1 not opened الحقل %1 غير مفتوح - - TopLine - خط علوي - - - BottomLine - خط سفلي - - - LeftLine - خط أيسر - - - RightLine - خط أيمن - content المحتوى @@ -3232,148 +2916,4 @@ This preview is no longer valid. - - SQLEditDialog - - Datasource - مصدر البيانات - - - Connection - الإتصال - - - Datasource Name - أسم مصدر البيانات - - - Subdetail - البيانات الفرعية - - - Master datasource - مصدر البيانات الرئيسي - - - Subquery mode - وضع الاستعلام الفرعي - - - Filter mode - وضع التصفية - - - Preview - معاينة - - - Hide Preview - إخفاء المعاينة - - - Child datasource - مصدر البيانات الفرعي - - - Data preview - معاينة البيانات - - - Cancel - إلغاء الأمر - - - Error - خطأ - - - Datasource Name is empty ! - أسم مصدر البيانات فارغ ! - - - SQL is empty ! - SQL فارغة ! - - - Datasource with name: "%1" already exists ! - مصدر البيانات بأسم: "%1" موجود مسبقاً ! - - - Datasource with name %1 already exist - مصدر البيانات بأسم: "%1" موجود مسبقاً - - - Connection is not specified - إتصال غير محدد - - - Refresh - تحديث - - - - SettingDialog - - Designer setting - إعدادات - - - Default font - الخط الإفتراضي - - - Grid - شبكة - - - Vertical grid step - تباعد الشبكة العمودي - - - Horizontal grid step - تباعد الشبكة الأفقي - - - - TextItemEditor - - Text Item Editor - محرر النص - - - Content - المحتوى - - - Data - جدول البيانات - - - Functions - الدوال - - - Editor settings - إعدادات المحرر - - - Editor font - محرر الخطوط - - - Cancel - إلغاء الأمر - - - - WaitForm - - Wait - انتظر - - - Please wait ... - يرجى الإنتظار ... - - diff --git a/translations/limereport_es_ES.ts b/translations/limereport_es_ES.ts index 3e69d43..2dd6548 100644 --- a/translations/limereport_es_ES.ts +++ b/translations/limereport_es_ES.ts @@ -93,21 +93,6 @@ - - LimeReport::AVariablesHolder - - variable with name - variable con el nombre - - - already exists !! - ya existe !! - - - does not exists !! - no existe !! - - LimeReport::AboutDialog @@ -398,6 +383,10 @@ p, li { white-space: pre-wrap; } Start new page + + Keep top space + + LimeReport::BaseDesignIntf @@ -429,6 +418,10 @@ p, li { white-space: pre-wrap; } All borders + + Create Horizontal Layout + + LimeReport::ConnectionDesc @@ -503,10 +496,6 @@ p, li { white-space: pre-wrap; } Connection with name - - already exists - ya existe - Use default application connection @@ -523,12 +512,9 @@ p, li { white-space: pre-wrap; } already exists! - - - LimeReport::ContentItemDesignIntf - Variable %1 not found - Variable %1 no encontrada + Port + @@ -538,7 +524,7 @@ p, li { white-space: pre-wrap; } Datos - useAlternateBackgroundColor + Use alternate background color @@ -596,14 +582,6 @@ p, li { white-space: pre-wrap; } Delete variable Borrarvariable - - Do you really want to delete "%1" connection ? - Realmente quieres borrar la conexion "%1"? - - - User variables - Variables de usuario - System variables Variables del sistema @@ -977,6 +955,10 @@ p, li { white-space: pre-wrap; } RightLine + + AllLines + + LimeReport::FontEditorWidget @@ -1063,6 +1045,10 @@ p, li { white-space: pre-wrap; } Image + + Watermark + + LimeReport::ItemLocationPropItem @@ -1176,6 +1162,14 @@ p, li { white-space: pre-wrap; } Page Footer + + Print on first page + + + + Print on last page + + LimeReport::PageHeader @@ -1790,6 +1784,22 @@ p, li { white-space: pre-wrap; } titleAlign + + watermark + + + + keepTopSpace + + + + printable + + + + variable + + LimeReport::RectMMPropItem @@ -1922,14 +1932,6 @@ p, li { white-space: pre-wrap; } Horizontal layout - - Hide left panel - - - - Hide right panel - - Report Tools @@ -2110,6 +2112,14 @@ p, li { white-space: pre-wrap; } Report has been modified! Do you want save the report? + + Hide left panel | Alt+L + + + + Hide right panel | Alt+R + + LimeReport::ReportEnginePrivate @@ -2383,10 +2393,6 @@ This preview is no longer valid. Name Nombre - - Function manger with name "%1" already exists! - - GROUP FUNCTIONS @@ -2447,6 +2453,10 @@ This preview is no longer valid. datasourceName + + Function manager with name "%1" already exists! + + LimeReport::SettingDialog @@ -2486,6 +2496,10 @@ This preview is no longer valid. Use dark theme + + Language + + LimeReport::SubDetailBand @@ -2573,6 +2587,10 @@ This preview is no longer valid. TextItem " %1 " not found! + + Watermark + + LimeReport::TextItemEditor @@ -2588,10 +2606,6 @@ This preview is no longer valid. Content - - Data - Datos - Editor settings @@ -2670,14 +2684,6 @@ This preview is no longer valid. variable with name variable con el nombre - - already exists !! - ya existe !! - - - does not exists !! - no existe !! - already exists! diff --git a/translations/limereport_fr.ts b/translations/limereport_fr.ts index 5abdcbd..a2b2989 100644 --- a/translations/limereport_fr.ts +++ b/translations/limereport_fr.ts @@ -338,112 +338,118 @@ p, li { white-space: pre-wrap; } LimeReport::BandDesignIntf - + DataBand bande de données - + DataHeaderBand En-tête de données - + DataFooterBand Pied de données - + ReportHeader En-tête du rapport - + ReportFooter Pied du rapport - + PageHeader En-tête de page - + PageFooter Pied de page - + SubDetailBand Sous-détails - + SubDetailHeaderBand En-tête de sous-détails - + SubDetailFooterBand Pied de sous-détails - + GroupBandHeader Groupe d'en-tête - + GroupBandFooter Groupe de pieds - + TearOffBand Bande détachable - + connected to Connecté à - + Bring to top Placer au premier-plan - + Send to back Placer en arrière-plan - - + + Auto height Hauteur automatique - - + + Splittable Divisible - - + + Keep bottom space Conserver l'espace inférieur - + + + Keep top space + + + + Start from new page Démarrer depuis une nouvelle page - - + + Start new page Démarrer une nouvelle page @@ -451,37 +457,42 @@ p, li { white-space: pre-wrap; } LimeReport::BaseDesignIntf - + Copy Copier - + Cut Couper - + Paste Coller - + Bring to top Placer au premier-plan - + Send to back Placer en arrière-plan - + + Create Horizontal Layout + + + + No borders Aucune bordure - + All borders Toutes les bordures @@ -489,8 +500,8 @@ p, li { white-space: pre-wrap; } LimeReport::ConnectionDesc - - + + defaultConnection Connexion par défaut @@ -514,57 +525,62 @@ p, li { white-space: pre-wrap; } Utiliser la connexion par défaut de l'application - + Driver Pilote - + Server Serveur - + + Port + + + + User Utilisateur - + Password Mot de passe - + Database Base de données - + ... - + Auto connect Connexion automatique - + Dont keep credentals in lrxml Ne pas enregistrer les informations personnelles - + Check connection Vérifier la connexion - + Cancel Annuler - + Ok @@ -595,7 +611,7 @@ p, li { white-space: pre-wrap; } existe déja! - + defaultConnection @@ -610,8 +626,8 @@ p, li { white-space: pre-wrap; } - useAlternateBackgroundColor - Couleurs de fond alternative + Use alternate background color + @@ -696,45 +712,45 @@ p, li { white-space: pre-wrap; } Saisir une variable - - - - + + + + Attention - + Do you really want to delete "%1" connection? Voulez-vous vraiment supprimer la connexion %1? - + Report variables Variables du rapport - + System variables Variables système - + External variables Variables externe - + Do you really want to delete "%1" datasource? Vouz-vous vraiment supprimer la source de donnée "%1"? - + Do you really want to delete variable "%1"? Vouz-vous vraiment supprimer la variable "%1"? - + Error Erreur @@ -758,41 +774,41 @@ p, li { white-space: pre-wrap; } LimeReport::DataSourceManager - + Connection "%1" is not open La connexion "%1" n'est pas ouverte - + Variable "%1" not found! Variable "%1" introuvable! - - + + Datasource "%1" not found! Source de donnée "%1" introuvable! - + Connection with name "%1" already exists! La connexion avec le nom "%1" existe déja! - - - + + + Datasource with name "%1" already exists! La source de donnée avec le nom "%1" existe déja! - + Database "%1" not found Base de données "%1 introuvable - + invalid connection Connexion invalide @@ -800,17 +816,17 @@ p, li { white-space: pre-wrap; } LimeReport::DataSourceModel - + Datasources Source de données - + Variables - + External variables Variables externe @@ -1163,6 +1179,11 @@ p, li { white-space: pre-wrap; } RightLine Ligne droite + + + AllLines + + LimeReport::FontEditorWidget @@ -1239,22 +1260,22 @@ p, li { white-space: pre-wrap; } LimeReport::GroupFunction - + Field "%1" not found Champ %1 introuvable - + Variable "%1" not found Variable %1 introuvable - + Wrong script syntax "%1" Syntaxe incorrecte du script "%1" - + Item "%1" not found Elément "%1" introuvable @@ -1262,7 +1283,13 @@ p, li { white-space: pre-wrap; } LimeReport::ImageItem - + + + Watermark + + + + Image Image @@ -1369,12 +1396,12 @@ p, li { white-space: pre-wrap; } LimeReport::MasterDetailProxyModel - + Field: "%1" not found in "%2" child datasource Le champ: "%1"est introuvable dans la source de donnée enfant "%2" - + Field: "%1" not found in "%2" master datasource Le champ: "%1"est introuvable dans la source de donnée principale "%2" @@ -1382,7 +1409,7 @@ p, li { white-space: pre-wrap; } LimeReport::ModelToDataSource - + model is destroyed Le modèle a été supprimé @@ -1390,7 +1417,7 @@ p, li { white-space: pre-wrap; } LimeReport::ObjectBrowser - + Objects Objets @@ -1398,10 +1425,22 @@ p, li { white-space: pre-wrap; } LimeReport::PageFooter - + Page Footer Pied de page + + + + Print on first page + + + + + + Print on last page + + LimeReport::PageHeader @@ -1414,31 +1453,31 @@ p, li { white-space: pre-wrap; } LimeReport::PageItemDesignIntf - + Paste Coller - - + + Page is TOC Table des contenus - - + + Reset page number Réinitialiser le numéro de page - - + + Full page Page entière - - + + Set page size to printer Adapterr la taille de la page à l'imprimante @@ -1456,7 +1495,7 @@ p, li { white-space: pre-wrap; } Nom du fichier PDF - + Report file name Nom du fichier du rapport @@ -1613,7 +1652,7 @@ p, li { white-space: pre-wrap; } LimeReport::ProxyHolder - + Datasource has been invalidated La source de donnée n'a pas été validée @@ -2163,17 +2202,37 @@ p, li { white-space: pre-wrap; } Alignement du titre - + + watermark + + + + + keepTopSpace + + + + + printable + + + + + variable + + + + Property Name Nom de la propriété - + Property value Valeur de la propriété - + Warning Avertissement @@ -2211,27 +2270,27 @@ p, li { white-space: pre-wrap; } LimeReport::ReportDesignWidget - + Script Script - + Translations Traductions - + Report file name Nom du rapport - + Error Erreur - + Wrong file format Format de fichier incorrect @@ -2355,228 +2414,228 @@ p, li { white-space: pre-wrap; } - Hide left panel - Masquer le panneau de gauche + Hide left panel | Alt+L + - - Hide right panel - Masquer le panneau de droite + + Hide right panel | Alt+R + - + Delete dialog Supprimer la boite du dialogue - + Add new dialog Ajouter une boite de dialogue - + Report Tools Outils de rapport - + Main Tools Outils principales - + Font Police - + Text alignment Alignement de texte - + Items alignment Alignement des éléments - + Borders Bordures - + Report bands Bandesde rapport - + Report Header En-tête du rapport - + Report Footer Pied de rapport - + Page Header En-tête de page - + Page Footer Pied de page - + Data Données - + Data Header En-tête de données - + Data Footer Pied de données - + SubDetail Sous-détails - + SubDetailHeader En-tête de sous-détails - + SubDetailFooter Pied de sous-détails - + GroupHeader En-tête de groupe - + GroupFooter Pied de groupe - + Tear-off Band Bande détachable - + File Fichier - + Edit Edition - + Info - + Recent Files Fichiers récents - - + + Object Inspector Inspecteur d'objets - + Report structure Structure du rapport - + Widget Box Boite de Widget - + Property Editor Editeur de propriété - + Action Editor Editeur d'action - + Resource Editor Editeur de ressource - + SignalSlot Editor Editeur de Signaux & Slots - + Dialog Designer Tools Boite à outils du Designer - + Data Browser Navigateur de données - + Script Browser Navigateur de script - + Report has been modified! Do you want save the report? Le rapport a été modifié! Voulez-vous l'enregistrer? - - + + Report file name Nom du fichier du rapport - + Rendering report Afficher l'aperçu du rapport - + Abort Quitter - + page rendered du rendu de la page - + Warning Avertissement - + File "%1" not found! Fichier "%1" introuvable! @@ -2584,22 +2643,22 @@ p, li { white-space: pre-wrap; } LimeReport::ReportEnginePrivate - + Preview Aperçu avant impression - + Error Erreur - + Report File Change Nom du fichier changé - + The report file "%1" has changed names or been deleted. This preview is no longer valid. @@ -2608,12 +2667,12 @@ This preview is no longer valid. Cet aperçu n'est plus valide. - + Designer not found! Designer introuvable! - + Language %1 already exists La langue %1 existe déja @@ -2649,12 +2708,12 @@ Cet aperçu n'est plus valide. Indice de la page dépassé - + Databand "%1" not found Bande de données "%1 introuvable - + Wrong using function %1 Utilisation incorrecte de la fonction "%1" @@ -2703,7 +2762,7 @@ Cet aperçu n'est plus valide. - + Preview Aperçu @@ -2774,18 +2833,18 @@ Cet aperçu n'est plus valide. La source de donnée avec le nom "%1" existe déja! - - + + Attention - + Connection is not specified La connexion n'est pas spécifiée - + Refresh Actualiser @@ -2876,13 +2935,13 @@ Cet aperçu n'est plus valide. LimeReport::ScriptEngineContext - + Dialog with name: %1 can`t be created Le dialogue avec le nom "%1" ne peut pas être crée - - + + Error Erreur @@ -2890,147 +2949,150 @@ Cet aperçu n'est plus valide. LimeReport::ScriptEngineManager - + GROUP FUNCTIONS Fonctions de groupe - - - - - - - + + + + + + + + Value Valeur - - + + BandName Nom de la bande - - Function manger with name "%1" already exists! - La fonction "%1" existe déja! + + Function manager with name "%1" already exists! + - + FieldName Nom du champ - + Variable %1 not found Variable "%1" introuvable - + Field %1 not found in %2! Champ "%1 introuvable dans %2! - + SYSTEM Système - - - + + + NUMBER Nombre - - - - + + + + + Format - + Precision Précision - - + + Locale Local - - - - - + + + + + + DATE&TIME DATE&HEURE - + CurrencySymbol Symbolde de la monnaie - - - - - - - + + + + + + + GENERAL - - - + + + Name Nom - + Datasource Source de donnée - + ValueField Valeur - + KeyField Clé - + KeyFieldValue Valeur de la clé - + Unique identifier Identifiant unique - + Content Contenu - + Indent Indenter - + datasourceName Nom de source de donnée @@ -3038,47 +3100,52 @@ Cet aperçu n'est plus valide. LimeReport::SettingDialog - + Designer setting Paramètres du Designer - + Designer Setting Paramètres du Designer - + Default font Police par défaut - + Grid Grille - + Vertical grid step Grille verticale - + Horizontal grid step Grille horizontale - + + Language + Langue + + + Use dark theme Utiliser le thème sombre - + Report Setting Paramètres du rapport - + Suppress absent fields and variables warning Effacer les messages d'absences de champs et d'avertissement de variables @@ -3144,54 +3211,60 @@ Cet aperçu n'est plus valide. LimeReport::TextItem - - + + Edit Edition - - + + Auto height Hauteur automatique - - + + Allow HTML Interpréter HTML - - + + Allow HTML in fields Interpréter HTML dans les champs - - + + Stretch to max height Etirer à la hauteur maximale - - + + Transparent Transparent - - + + + Watermark + + + + + Error Erreur - + TextItem " %1 " already has folower " %2 " L'élément texte " %1 " a toujours un copain " %2 " - + TextItem " %1 " not found! Elément "%1" introuvable! @@ -3208,14 +3281,6 @@ Cet aperçu n'est plus valide. Content Contenu - - Data - Données - - - Functions - Fonctions - Editor settings @@ -3339,45 +3404,45 @@ Cet aperçu n'est plus valide. - + Data Données - + DataHeader En-tête de données - + DataFooter Pied de données - + GroupHeader En-tête de groupe - + GroupFooter Pied de groupe - + - + Page Footer Pied de page - + Page Header En-tête de page @@ -3396,122 +3461,122 @@ Cet aperçu n'est plus valide. - + SubDetail Sous-détails - + SubDetailHeader En-tête de sous-détails - + SubDetailFooter Pied de sous-détails - + Tear-off Band Bande détachable - + alignment Alignement - + Barcode Item Elément de code barre - + HLayout - - + + Image Item - + Shape Item - + itemLocation - - + + Text Item - + Invalid connection! %1 Connexion invalidé %1 - + Master datasource "%1" not found! Source de donnée principale "%1" introuvable! - + Master datasouce "%1" not found! Source de donnée principale "%1" introuvable! - + Child Enfant - + and child est enfant - + datasouce "%1" not found! Source de donnée "%1" introuvable! - + bool - - + + QColor - + content Contenu - - + + @@ -3519,71 +3584,71 @@ Cet aperçu n'est plus valide. Source de donnée - - + + field Champ - + enum - + flags - + QFont - + QImage - + int - - + + qreal - + QRect - + QRectF - + geometry - + QString @@ -3599,17 +3664,17 @@ Cet aperçu n'est plus valide. Les éléments sélectionnés ont un parent différent - + Object with name %1 already exists! L'objet avec le nom "%1" existe déja! - + Function %1 not found or have wrong arguments La fonction %1 est introuvable ou contient des paramètres incorrects - + Datasource manager not found Gestionnaire de source de donnée introuvable @@ -3619,28 +3684,28 @@ Cet aperçu n'est plus valide. - + Wrong file format Format de fichier incorrect - + File %1 not opened Fichier "%1" n'est pas ouvert - + Content string is empty Contenu vide - + Content is empty Contenu vide - + Chart Item Elément du graphe diff --git a/translations/limereport_zh.ts b/translations/limereport_zh.ts index 8d0b4e0..52bb301 100644 --- a/translations/limereport_zh.ts +++ b/translations/limereport_zh.ts @@ -967,6 +967,10 @@ p, li { white-space: pre-wrap; } RightLine 右边框 + + AllLines + + LimeReport::FontEditorWidget @@ -1805,7 +1809,7 @@ p, li { white-space: pre-wrap; } - AllLines + variable @@ -2159,14 +2163,6 @@ This preview is no longer valid. Language %1 already exists 语言 %1 已存在 - - Warning - 警告 - - - The language will change after the application is restarted - 应用重启后语言版本将改变 - LimeReport::ReportFooter From 56e78f86baa996860e1d36aab76f46c962193cfa Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 24 May 2018 14:31:10 +0300 Subject: [PATCH 170/347] Designer updated --- designer/designer.pro | 6 ++++-- designer/designersettingmanager.cpp | 2 ++ designer/designersettingmanager.h | 2 -- designer/main.cpp | 2 -- limereport/lrreportdesignwidget.cpp | 2 +- limereport/lrreportengine.cpp | 1 - limereport/objectinspector/lrobjectitemmodel.cpp | 2 +- .../objectinspector/propertyItems/lrflagspropitem.cpp | 1 + 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/designer/designer.pro b/designer/designer.pro index d5abd1b..d3b9e26 100644 --- a/designer/designer.pro +++ b/designer/designer.pro @@ -8,6 +8,9 @@ contains(CONFIG,release) { } TEMPLATE = app +HEADERS += \ + designersettingmanager.h + SOURCES += main.cpp \ designersettingmanager.cpp @@ -62,6 +65,5 @@ win32 { } } -HEADERS += \ - designersettingmanager.h + diff --git a/designer/designersettingmanager.cpp b/designer/designersettingmanager.cpp index 6a353ab..bdbd680 100644 --- a/designer/designersettingmanager.cpp +++ b/designer/designersettingmanager.cpp @@ -1,4 +1,5 @@ #include "designersettingmanager.h" +#include DesignerSettingManager::DesignerSettingManager(QObject *parent) : QObject(parent) { @@ -33,6 +34,7 @@ QLocale::Language DesignerSettingManager::getCurrentDefaultLanguage() void DesignerSettingManager::currentDefaulLanguageChanged(QLocale::Language language) { + QMessageBox::information(0, tr("Warning") , tr("The language will change after the application is restarted")); m_setting->beginGroup("ReportDesigner"); m_setting->setValue("DesignerLanguage", (int)language); m_setting->endGroup(); diff --git a/designer/designersettingmanager.h b/designer/designersettingmanager.h index 2f07d79..2443718 100644 --- a/designer/designersettingmanager.h +++ b/designer/designersettingmanager.h @@ -13,8 +13,6 @@ public: explicit DesignerSettingManager(QObject *parent = 0); ~DesignerSettingManager(); void setApplicationInstance(QApplication* application); -signals: - public slots: void getAviableLanguages(QList* languages); QLocale::Language getCurrentDefaultLanguage(); diff --git a/designer/main.cpp b/designer/main.cpp index 87c0832..d36ee1d 100644 --- a/designer/main.cpp +++ b/designer/main.cpp @@ -9,8 +9,6 @@ int main(int argc, char *argv[]) QApplication a(argc, argv); DesignerSettingManager manager; - - QTranslator limeReportTranslator; QTranslator qtTranslator; QString translationPath = QApplication::applicationDirPath(); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 96cd9eb..b20d17e 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -467,7 +467,7 @@ bool ReportDesignWidget::loadFromFile(const QString &fileName) // m_scriptEditor->restoreState(editorState); // emit loaded(); // m_dialogChanged = false; -// return true; + return true; } else { QMessageBox::critical(this,tr("Error"),tr("Wrong file format")); return false; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 8c6c3f9..95275c2 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -981,7 +981,6 @@ QLocale::Language ReportEnginePrivate::currentDesignerLanguage() void ReportEnginePrivate::setCurrentDesignerLanguage(QLocale::Language language) { m_currentDesignerLanguage = language; - QMessageBox::information(m_designerWindow, tr("Warning") ,tr("The language will change after the application is restarted")); emit currentDefaulLanguageChanged(language); } diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 9c1450d..b5c8712 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -150,7 +150,7 @@ void QObjectPropertyModel::translatePropertyName() tr("watermark"); tr("keepTopSpace"); tr("printable"); - tr("AllLines"); + tr("variable"); } void QObjectPropertyModel::clearObjectsList() diff --git a/limereport/objectinspector/propertyItems/lrflagspropitem.cpp b/limereport/objectinspector/propertyItems/lrflagspropitem.cpp index c10eceb..de4af7c 100644 --- a/limereport/objectinspector/propertyItems/lrflagspropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrflagspropitem.cpp @@ -122,6 +122,7 @@ void FlagsPropItem::translateFlagsItem() tr("BottomLine"); tr("LeftLine"); tr("RightLine"); + tr("AllLines"); } FlagPropItem::FlagPropItem(QObject* object, ObjectsList* objects, const QString &propName, const QString &displayName, const QVariant &value, ObjectPropItem* parent, bool readonly) From afd49445060a992358682d525245bc85fcfee0cb Mon Sep 17 00:00:00 2001 From: James Date: Wed, 23 May 2018 12:01:30 -0400 Subject: [PATCH 171/347] Report Engine: changed onSave() -> onSave(bool&) rename 'loaded' signal to 'loadFinshed' to be consistent with 'saveFinished' signal added signal 'onSaveAs' and corresponding added functions: 'emitSaveReportAs', 'emitLoadFinished' DesignWidget: add boolean functions checking whether emitSaveReport and emitSaveReportAs completed. DesignWindow: save / saveas / load functions are interceptable by reportengine signals --- include/lrreportengine.h | 7 +- limereport/lrreportdesignwidget.cpp | 22 ++++- limereport/lrreportdesignwidget.h | 2 + limereport/lrreportdesignwindow.cpp | 92 ++++++++++--------- limereport/lrreportengine.cpp | 30 ++++-- limereport/lrreportengine.h | 6 +- limereport/lrreportengine_p.h | 16 ++-- limereport/objectsbrowser/lrobjectbrowser.cpp | 2 +- limereport/scriptbrowser/lrscriptbrowser.cpp | 2 +- 9 files changed, 108 insertions(+), 71 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index a4c1158..3b01f4f 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -119,13 +119,12 @@ signals: void renderStarted(); void renderFinished(); void renderPageFinished(int renderedPageCount); + void onSave(bool& saved); + void onSaveAs(bool& saved); void onLoad(bool& loaded); - void onSave(); void saveFinished(); - - void loaded(); + void loadFinished(); void printedToPDF(QString fileName); - void getAviableLanguages(QList* languages); void currentDefaulLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index b20d17e..8d48f61 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -79,7 +79,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QMa connect(dynamic_cast(m_report), SIGNAL(pagesLoadFinished()),this,SLOT(slotPagesLoadFinished())); connect(dynamic_cast(m_report), SIGNAL(cleared()), this, SIGNAL(cleared())); - connect(dynamic_cast(m_report), SIGNAL(loaded()), this, SLOT(slotReportLoaded())); + connect(dynamic_cast(m_report), SIGNAL(loadFinished()), this, SLOT(slotReportLoaded())); connect(m_tabWidget, SIGNAL(currentChanged(int)), this, SLOT(slotCurrentTabChanged(int))); #ifdef HAVE_UI_LOADER @@ -432,14 +432,15 @@ bool ReportDesignWidget::save() bool result = false; - if (!m_report->reportFileName().isEmpty()){ + if (emitSaveReport()) { + result = true; // saved via signal + } + else if (!m_report->reportFileName().isEmpty()){ if (m_report->saveToFile()){ m_report->emitSaveFinished(); result = true; } - } - else { - m_report->emitSaveReport(); + } else { if (m_report->isSaved()) { m_report->emitSaveFinished(); result = true; @@ -449,6 +450,7 @@ bool ReportDesignWidget::save() result = true; }; } + #ifdef HAVE_QTDESIGNER_INTEGRATION if (result){ m_dialogChanged = false; @@ -494,6 +496,16 @@ bool ReportDesignWidget::isNeedToSave() return false; } +bool ReportDesignWidget::emitSaveReport() +{ + return m_report->emitSaveReport(); +} + +bool ReportDesignWidget::emitSaveReportAs() +{ + return m_report->emitSaveReportAs(); +} + bool ReportDesignWidget::emitLoadReport() { return m_report->emitLoadReport(); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 8e812dc..7f67bb5 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -108,6 +108,8 @@ public: ReportEnginePrivateInterface* report(){return m_report;} QString reportFileName(); bool isNeedToSave(); + bool emitSaveReport(); + bool emitSaveReportAs(); bool emitLoadReport(); void saveState(QSettings *settings); void loadState(QSettings *settings); diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index fb2d073..d02cbef 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -1044,13 +1044,19 @@ void ReportDesignWindow::slotCommandHistoryChanged() void ReportDesignWindow::slotSaveReport() { + if (m_reportDesignWidget->emitSaveReport()) return; // report save as'd via signal + m_reportDesignWidget->save(); - m_lblReportName->setText(m_reportDesignWidget->reportFileName()); - if (!m_reportDesignWidget->reportFileName().isEmpty()) addRecentFile(m_reportDesignWidget->reportFileName()); + + QString filename = m_reportDesignWidget->reportFileName(); + m_lblReportName->setText(filename); + if(!filename.isEmpty()) addRecentFile(filename); } void ReportDesignWindow::slotSaveReportAs() { + if (m_reportDesignWidget->emitSaveReportAs()) return; // report save as'd via signal + QString fileName = QFileDialog::getSaveFileName(this,tr("Report file name"),"","Report files(*.lrxml);; All files(*)"); if (!fileName.isEmpty()){ m_reportDesignWidget->saveToFile(fileName); @@ -1061,49 +1067,49 @@ void ReportDesignWindow::slotSaveReportAs() void ReportDesignWindow::slotLoadReport() { - if (checkNeedToSave()){ - if (!m_reportDesignWidget->emitLoadReport()){ - QString fileName = QFileDialog::getOpenFileName( - this,tr("Report file name"), - m_reportDesignWidget->report()->currentReportsDir(), - "Report files(*.lrxml);; All files(*)" - ); - if (!fileName.isEmpty()) { - QApplication::processEvents(); - setCursor(Qt::WaitCursor); - m_reportDesignWidget->clear(); - if (m_reportDesignWidget->loadFromFile(fileName)){ - m_lblReportName->setText(fileName); - m_propertyModel->setObject(0); - updateRedoUndo(); - setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); - if (!m_recentFiles.contains(fileName)){ - if (m_recentFiles.count()==10){ - QMap::const_iterator it = m_recentFiles.constBegin(); - QDateTime minDate = QDateTime::currentDateTime(); - while (it != m_recentFiles.constEnd()) { - if (minDate>it.value()) minDate = it.value(); - ++it; - } - m_recentFiles.remove(m_recentFiles.key(minDate)); - } - m_recentFiles.insert(fileName,QDateTime::currentDateTime()); - } else { - m_recentFiles[fileName] = QDateTime::currentDateTime(); - } - createRecentFilesMenu(); - m_deletePageAction->setEnabled(m_reportDesignWidget->report()->pageCount()>1); - } else { - slotNewReport(); - } - unsetCursor(); - setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); - addRecentFile(fileName); - m_editorTabType = ReportDesignWidget::Page; - } - } + if (!checkNeedToSave()) return; // don't need to save + if (m_reportDesignWidget->emitLoadReport()) return; // report loaded via signal + + QString fileName = QFileDialog::getOpenFileName( + this,tr("Report file name"), + m_reportDesignWidget->report()->currentReportsDir(), + "Report files(*.lrxml);; All files(*)" + ); + if (!fileName.isEmpty()) { + QApplication::processEvents(); + setCursor(Qt::WaitCursor); + m_reportDesignWidget->clear(); + if (m_reportDesignWidget->loadFromFile(fileName)){ + m_lblReportName->setText(fileName); + m_propertyModel->setObject(0); + updateRedoUndo(); + setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); + if (!m_recentFiles.contains(fileName)){ + if (m_recentFiles.count()==10){ + QMap::const_iterator it = m_recentFiles.constBegin(); + QDateTime minDate = QDateTime::currentDateTime(); + while (it != m_recentFiles.constEnd()) { + if (minDate>it.value()) minDate = it.value(); + ++it; + } + m_recentFiles.remove(m_recentFiles.key(minDate)); + } + m_recentFiles.insert(fileName,QDateTime::currentDateTime()); + } else { + m_recentFiles[fileName] = QDateTime::currentDateTime(); + } + createRecentFilesMenu(); + m_deletePageAction->setEnabled(m_reportDesignWidget->report()->pageCount()>1); + } else { + slotNewReport(); + } + unsetCursor(); + setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); + addRecentFile(fileName); + m_editorTabType = ReportDesignWidget::Page; } + } void ReportDesignWindow::slotZoomIn() diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 95275c2..a5d101e 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -585,9 +585,18 @@ PageDesignIntf* ReportEnginePrivate::createPreviewScene(QObject* parent){ return result; } -void ReportEnginePrivate::emitSaveReport() +bool ReportEnginePrivate::emitSaveReport() { - emit onSave(); + bool result = false; + emit onSave(result); + return result; +} + +bool ReportEnginePrivate::emitSaveReportAs() +{ + bool result = false; + emit onSaveAs(result); + return result; } bool ReportEnginePrivate::emitLoadReport() @@ -602,6 +611,11 @@ void ReportEnginePrivate::emitSaveFinished() emit saveFinished(); } +void ReportEnginePrivate::emitLoadFinished() +{ + emit loadFinished(); +} + void ReportEnginePrivate::emitPrintedToPDF(QString fileName) { emit printedToPDF(fileName); @@ -750,7 +764,7 @@ bool ReportEnginePrivate::loadFromFile(const QString &fileName, bool autoLoadPre bool result = slotLoadFromFile( fileName ); if (result) { - emit loaded(); + emit loadFinished(); } return result; } @@ -764,7 +778,7 @@ bool ReportEnginePrivate::loadFromByteArray(QByteArray* data, const QString &nam if (reader->readItem(this)){ m_fileName = ""; m_reportName = name; - emit loaded(); + emit loadFinished(); return true; }; } @@ -781,7 +795,7 @@ bool ReportEnginePrivate::loadFromString(const QString &report, const QString &n if (reader->readItem(this)){ m_fileName = ""; m_reportName = name; - emit loaded(); + emit loadFinished(); return true; }; } @@ -1162,11 +1176,11 @@ ReportEngine::ReportEngine(QObject *parent) connect(d, SIGNAL(renderPageFinished(int)), this, SIGNAL(renderPageFinished(int))); connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); - connect(d, SIGNAL(onSave()), this, SIGNAL(onSave())); + connect(d, SIGNAL(onSave(bool&)), this, SIGNAL(onSave(bool&))); + connect(d, SIGNAL(onSaveAs(bool&)), this, SIGNAL(onSaveAs(bool&))); connect(d, SIGNAL(onLoad(bool&)), this, SIGNAL(onLoad(bool&))); connect(d, SIGNAL(saveFinished()), this, SIGNAL(saveFinished())); - - connect(d, SIGNAL(loaded()), this, SIGNAL(loaded())); + connect(d, SIGNAL(loadFinished()), this, SIGNAL(loadFinished())); connect(d, SIGNAL(printedToPDF(QString)), this, SIGNAL(printedToPDF(QString))); connect(d, SIGNAL(getAviableLanguages(QList*)), diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index a4c1158..a188cef 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -119,11 +119,11 @@ signals: void renderStarted(); void renderFinished(); void renderPageFinished(int renderedPageCount); + void onSave(bool& saved); + void onSaveAs(bool& saved); void onLoad(bool& loaded); - void onSave(); void saveFinished(); - - void loaded(); + void loadFinished(); void printedToPDF(QString fileName); void getAviableLanguages(QList* languages); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index a5c7fb4..ea8c854 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -67,14 +67,16 @@ public: virtual DataSourceManager* dataManager() = 0; virtual QString reportFileName() = 0; virtual void setReportFileName(const QString& reportFileName) = 0; - virtual void emitSaveFinished() = 0; virtual bool isNeedToSave() = 0; - virtual void emitSaveReport() = 0; + virtual bool emitSaveReport() = 0; + virtual bool emitSaveReportAs() = 0; + virtual void emitSaveFinished() = 0; virtual bool saveToFile(const QString& fileName = "") = 0; virtual bool isSaved() = 0; virtual QString reportName() = 0; virtual bool loadFromFile(const QString& fileName, bool autoLoadPreviewOnChange) = 0; virtual bool emitLoadReport() = 0; + virtual void emitLoadFinished() = 0; virtual void clearSelection() = 0; virtual bool printReport(QPrinter *printer=0) = 0; virtual void previewReport(PreviewHints hints = PreviewBarsUserSetting) = 0; @@ -148,9 +150,11 @@ public: bool isNeedToSave(); QString lastError(); ReportEngine * q_ptr; - void emitSaveReport(); + bool emitSaveReport(); + bool emitSaveReportAs(); bool emitLoadReport(); void emitSaveFinished(); + void emitLoadFinished(); void emitPrintedToPDF(QString fileName); bool isSaved(); void setCurrentReportsDir(const QString& dirName); @@ -193,11 +197,11 @@ signals: void renderStarted(); void renderFinished(); void renderPageFinished(int renderedPageCount); + void onSave(bool& saved); + void onSaveAs(bool& saved); void onLoad(bool& loaded); - void onSave(); void saveFinished(); - - void loaded(); + void loadFinished(); void printedToPDF(QString fileName); void getAviableLanguages(QList* languages); diff --git a/limereport/objectsbrowser/lrobjectbrowser.cpp b/limereport/objectsbrowser/lrobjectbrowser.cpp index a5ee464..508f7a9 100644 --- a/limereport/objectsbrowser/lrobjectbrowser.cpp +++ b/limereport/objectsbrowser/lrobjectbrowser.cpp @@ -51,7 +51,7 @@ void ObjectBrowser::setReportEditor(ReportDesignWidget *report) { m_report=report; connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); - connect(m_report, SIGNAL(loaded()), this, SLOT(slotReportLoaded())); + connect(m_report, SIGNAL(loadFinished()), this, SLOT(slotReportLoaded())); connect(m_report, SIGNAL(activePageChanged()), this, SLOT(slotActivePageChanged())); connect(m_report,SIGNAL(itemAdded(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*)), diff --git a/limereport/scriptbrowser/lrscriptbrowser.cpp b/limereport/scriptbrowser/lrscriptbrowser.cpp index 98d0568..75f5842 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.cpp +++ b/limereport/scriptbrowser/lrscriptbrowser.cpp @@ -58,7 +58,7 @@ void ScriptBrowser::setReportEditor(ReportDesignWidget* report) { m_report=report; connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); - connect(m_report,SIGNAL(loaded()),this,SLOT(slotUpdate())); + connect(m_report,SIGNAL(loadFinished()),this,SLOT(slotUpdate())); #ifdef HAVE_UI_LOADER connect(m_report->scriptContext(), SIGNAL(dialogAdded(QString)), this, SLOT(slotDialogAdded(QString))); #endif From 08f70069c299cd1780ed022d4bbd60bafd7977b1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 25 May 2018 19:13:26 +0300 Subject: [PATCH 172/347] Russian translation updated --- translations/limereport_ru.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index b99ed80..e827173 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1767,7 +1767,7 @@ p, li { white-space: pre-wrap; } setPageSizeToPrinter - Оправитьпараметры страницы в принтер + Отправить параметры страницы в принтер fillInSecondPass From ff61fef0a43bf8d2cfce70515774286177e33e17 Mon Sep 17 00:00:00 2001 From: James Date: Tue, 29 May 2018 15:55:13 -0400 Subject: [PATCH 173/347] reverted incorrect update function name in signal slot connection --- limereport/scriptbrowser/lrscriptbrowser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/scriptbrowser/lrscriptbrowser.cpp b/limereport/scriptbrowser/lrscriptbrowser.cpp index 75f5842..98d0568 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.cpp +++ b/limereport/scriptbrowser/lrscriptbrowser.cpp @@ -58,7 +58,7 @@ void ScriptBrowser::setReportEditor(ReportDesignWidget* report) { m_report=report; connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); - connect(m_report,SIGNAL(loadFinished()),this,SLOT(slotUpdate())); + connect(m_report,SIGNAL(loaded()),this,SLOT(slotUpdate())); #ifdef HAVE_UI_LOADER connect(m_report->scriptContext(), SIGNAL(dialogAdded(QString)), this, SLOT(slotDialogAdded(QString))); #endif From 353712864a3f5cfcb1595aafc9e1e4ebafb90063 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 31 May 2018 18:49:57 +0300 Subject: [PATCH 174/347] Signals renaming fixed --- include/lrreportengine.h | 1 + limereport/lrreportdesignwidget.cpp | 4 +- limereport/lrreportdesignwidget.h | 2 +- limereport/objectsbrowser/lrobjectbrowser.cpp | 46 +++++++++---------- limereport/objectsbrowser/lrobjectbrowser.h | 4 +- limereport/scriptbrowser/lrscriptbrowser.cpp | 18 ++++---- limereport/scriptbrowser/lrscriptbrowser.h | 6 +-- 7 files changed, 41 insertions(+), 40 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 3b01f4f..a188cef 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -125,6 +125,7 @@ signals: void saveFinished(); void loadFinished(); void printedToPDF(QString fileName); + void getAviableLanguages(QList* languages); void currentDefaulLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 8d48f61..1a2904b 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -798,7 +798,7 @@ void ReportDesignWidget::slotPagesLoadFinished() { applySettings(); //setActivePage(m_report->pageAt(0)); - emit loaded(); + emit loadFinished(); } void ReportDesignWidget::slotDialogDeleted(QString dialogName) @@ -856,7 +856,7 @@ void ReportDesignWidget::slotReportLoaded() createTabs(); m_scriptEditor->setPlainText(m_report->scriptContext()->initScript()); m_scriptEditor->restoreState(editorState); - emit loaded(); + emit loadFinished(); m_dialogChanged = false; } diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 7f67bb5..6204d69 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -186,7 +186,7 @@ signals: void multiItemSelected(); void commandHistoryChanged(); void cleared(); - void loaded(); + void loadFinished(); void activePageChanged(); void activePageUpdated(LimeReport::PageDesignIntf*); void bandAdded(LimeReport::PageDesignIntf*, LimeReport::BandDesignIntf*); diff --git a/limereport/objectsbrowser/lrobjectbrowser.cpp b/limereport/objectsbrowser/lrobjectbrowser.cpp index 508f7a9..2b51db5 100644 --- a/limereport/objectsbrowser/lrobjectbrowser.cpp +++ b/limereport/objectsbrowser/lrobjectbrowser.cpp @@ -35,7 +35,7 @@ namespace LimeReport{ ObjectBrowser::ObjectBrowser(QWidget *parent) - :QWidget(parent), m_report(NULL), m_mainWindow(NULL), + :QWidget(parent), m_designerWidget(NULL), m_mainWindow(NULL), m_changingItemSelection(false), m_movingItem(false) { QVBoxLayout *layout = new QVBoxLayout(this); @@ -47,28 +47,28 @@ ObjectBrowser::ObjectBrowser(QWidget *parent) m_treeView->setSelectionMode(QAbstractItemView::ExtendedSelection); } -void ObjectBrowser::setReportEditor(ReportDesignWidget *report) +void ObjectBrowser::setReportEditor(ReportDesignWidget *designerWidget) { - m_report=report; - connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); - connect(m_report, SIGNAL(loadFinished()), this, SLOT(slotReportLoaded())); - connect(m_report, SIGNAL(activePageChanged()), this, SLOT(slotActivePageChanged())); + m_designerWidget=designerWidget; + connect(m_designerWidget,SIGNAL(cleared()),this,SLOT(slotClear())); + connect(m_designerWidget, SIGNAL(loadFinished()), this, SLOT(slotReportLoaded())); + connect(m_designerWidget, SIGNAL(activePageChanged()), this, SLOT(slotActivePageChanged())); - connect(m_report,SIGNAL(itemAdded(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*)), + connect(m_designerWidget,SIGNAL(itemAdded(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*)), this, SLOT(slotItemAdded(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*))); - connect(m_report, SIGNAL(itemDeleted(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*)), + connect(m_designerWidget, SIGNAL(itemDeleted(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*)), this, SLOT(slotItemDeleted(LimeReport::PageDesignIntf*,LimeReport::BaseDesignIntf*))); - connect(m_report, SIGNAL(bandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), + connect(m_designerWidget, SIGNAL(bandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), this, SLOT(slotBandAdded(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); - connect(m_report, SIGNAL(bandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), + connect(m_designerWidget, SIGNAL(bandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*)), this, SLOT(slotBandDeleted(LimeReport::PageDesignIntf*,LimeReport::BandDesignIntf*))); connect(m_treeView, SIGNAL(itemSelectionChanged()), this, SLOT(slotObjectTreeItemSelectionChanged()) ); - connect(m_report, SIGNAL(itemSelected(LimeReport::BaseDesignIntf*)), + connect(m_designerWidget, SIGNAL(itemSelected(LimeReport::BaseDesignIntf*)), this, SLOT(slotItemSelected(LimeReport::BaseDesignIntf*))); - connect(m_report, SIGNAL(multiItemSelected()), + connect(m_designerWidget, SIGNAL(multiItemSelected()), this, SLOT(slotMultiItemSelected()) ); - connect(m_report, SIGNAL(activePageUpdated(LimeReport::PageDesignIntf*)), + connect(m_designerWidget, SIGNAL(activePageUpdated(LimeReport::PageDesignIntf*)), this, SLOT(slotActivePageUpdated(LimeReport::PageDesignIntf*))); connect(m_treeView, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(slotItemDoubleClicked(QTreeWidgetItem*,int))); @@ -113,15 +113,15 @@ void ObjectBrowser::buildTree(BaseDesignIntf* ignoredItem){ m_treeView->clear(); m_itemsMap.clear(); - if (!m_report->activePage()) return; + if (!m_designerWidget->activePage()) return; ObjectBrowserNode *topLevelItem=new ObjectBrowserNode(m_treeView); - topLevelItem->setText(0,m_report->activePage()->objectName()); - topLevelItem->setObject(m_report->activePage()); - m_itemsMap.insert(m_report->activePage(),topLevelItem); + topLevelItem->setText(0,m_designerWidget->activePage()->objectName()); + topLevelItem->setObject(m_designerWidget->activePage()); + m_itemsMap.insert(m_designerWidget->activePage(),topLevelItem); m_treeView->addTopLevelItem(topLevelItem); - QList itemsList = m_report->activePage()->items(); + QList itemsList = m_designerWidget->activePage()->items(); foreach (QGraphicsItem* item, itemsList) { if (item != ignoredItem){ BaseDesignIntf* reportItem = dynamic_cast(item); @@ -212,20 +212,20 @@ void ObjectBrowser::slotItemDeleted(PageDesignIntf *, BaseDesignIntf *item) void ObjectBrowser::slotObjectTreeItemSelectionChanged() { - if (!m_changingItemSelection && m_report->activePage()){ + if (!m_changingItemSelection && m_designerWidget->activePage()){ m_changingItemSelection = true; - m_report->activePage()->clearSelection(); + m_designerWidget->activePage()->clearSelection(); foreach(QTreeWidgetItem* item, m_treeView->selectedItems()){ ObjectBrowserNode* tn = dynamic_cast(item); if (tn){ BaseDesignIntf* si = dynamic_cast(tn->object()); if (si) { - m_report->activePage()->animateItem(si); + m_designerWidget->activePage()->animateItem(si); si->setSelected(true); QPointF p = si->mapToScene(si->pos()); if (si->parentItem()) p = si->parentItem()->mapToScene(si->pos()); - m_report->activeView()->centerOn(p); + m_designerWidget->activeView()->centerOn(p); } } } @@ -256,7 +256,7 @@ void ObjectBrowser::slotMultiItemSelected() m_treeView->selectionModel()->clear(); - foreach(QGraphicsItem* item, m_report->activePage()->selectedItems()){ + foreach(QGraphicsItem* item, m_designerWidget->activePage()->selectedItems()){ BaseDesignIntf* bg = dynamic_cast(item); if (bg){ ObjectBrowserNode* node = m_itemsMap.value(bg); diff --git a/limereport/objectsbrowser/lrobjectbrowser.h b/limereport/objectsbrowser/lrobjectbrowser.h index 9d9482b..c82fb27 100644 --- a/limereport/objectsbrowser/lrobjectbrowser.h +++ b/limereport/objectsbrowser/lrobjectbrowser.h @@ -53,7 +53,7 @@ class ObjectBrowser :public QWidget Q_OBJECT public: ObjectBrowser(QWidget *parent=0); - void setReportEditor(LimeReport::ReportDesignWidget* report); + void setReportEditor(LimeReport::ReportDesignWidget* designerWidget); void setMainWindow(QMainWindow* mainWindow); protected: void fillNode(QTreeWidgetItem *parentNode, BaseDesignIntf *reportItem, BaseDesignIntf* ignoredItem = 0); @@ -78,7 +78,7 @@ private slots: void slotActivePageUpdated(LimeReport::PageDesignIntf*); void slotItemParentChanged(BaseDesignIntf* item, BaseDesignIntf* parent); private: - ReportDesignWidget* m_report; + ReportDesignWidget* m_designerWidget; QMainWindow* m_mainWindow; QTreeWidget* m_treeView; QMap m_itemsMap; diff --git a/limereport/scriptbrowser/lrscriptbrowser.cpp b/limereport/scriptbrowser/lrscriptbrowser.cpp index 98d0568..148ddb7 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.cpp +++ b/limereport/scriptbrowser/lrscriptbrowser.cpp @@ -54,13 +54,13 @@ ScriptBrowser::~ScriptBrowser() delete ui; } -void ScriptBrowser::setReportEditor(ReportDesignWidget* report) +void ScriptBrowser::setReportEditor(ReportDesignWidget* designerWidget) { - m_report=report; - connect(m_report,SIGNAL(cleared()),this,SLOT(slotClear())); - connect(m_report,SIGNAL(loaded()),this,SLOT(slotUpdate())); + m_designerWidget=designerWidget; + connect(m_designerWidget,SIGNAL(cleared()),this,SLOT(slotClear())); + connect(m_designerWidget,SIGNAL(loadFinished()),this,SLOT(slotUpdate())); #ifdef HAVE_UI_LOADER - connect(m_report->scriptContext(), SIGNAL(dialogAdded(QString)), this, SLOT(slotDialogAdded(QString))); + connect(m_designerWidget->scriptContext(), SIGNAL(dialogAdded(QString)), this, SLOT(slotDialogAdded(QString))); #endif updateFunctionTree(); } @@ -163,9 +163,9 @@ void ScriptBrowser::on_tbAddDialog_clicked() QWidget* widget = loader.load(&file); QDialog* dialog = dynamic_cast(widget); if (dialog){ - if (!m_report->scriptContext()->containsDialog(dialog->objectName())){ + if (!m_designerWidget->scriptContext()->containsDialog(dialog->objectName())){ file.seek(0); - m_report->scriptContext()->addDialog(dialog->objectName(),file.readAll()); + m_designerWidget->scriptContext()->addDialog(dialog->objectName(),file.readAll()); //updateDialogsTree(); } else { QMessageBox::critical(this,tr("Error"),tr("Dialog with name: %1 already exists").arg(dialog->objectName())); @@ -186,14 +186,14 @@ void ScriptBrowser::on_tbAddDialog_clicked() void ScriptBrowser::on_tbRunDialog_clicked() { if (ui->twDialogs->currentItem()&& ui->twDialogs->currentItem()->parent()==0){ - m_report->scriptContext()->previewDialog(ui->twDialogs->currentItem()->text(0)); + m_designerWidget->scriptContext()->previewDialog(ui->twDialogs->currentItem()->text(0)); } } void ScriptBrowser::on_tbDeleteDialog_clicked() { if (ui->twDialogs->currentItem()&& ui->twDialogs->currentItem()->parent()==0){ - m_report->scriptContext()->deleteDialog(ui->twDialogs->currentItem()->text(0)); + m_designerWidget->scriptContext()->deleteDialog(ui->twDialogs->currentItem()->text(0)); updateDialogsTree(); } } diff --git a/limereport/scriptbrowser/lrscriptbrowser.h b/limereport/scriptbrowser/lrscriptbrowser.h index 54bf077..a004eef 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.h +++ b/limereport/scriptbrowser/lrscriptbrowser.h @@ -48,8 +48,8 @@ class ScriptBrowser : public QWidget public: explicit ScriptBrowser(QWidget *parent = 0); ~ScriptBrowser(); - void setReportEditor(LimeReport::ReportDesignWidget* report); - inline ReportDesignWidget* reportEditor(){return m_report;} + void setReportEditor(LimeReport::ReportDesignWidget* designerWidget); + inline ReportDesignWidget* reportEditor(){return m_designerWidget;} void updateFunctionTree(); #ifdef HAVE_UI_LOADER void updateDialogsTree(); @@ -71,7 +71,7 @@ private slots: private: Ui::ScriptBrowser *ui; - ReportDesignWidget* m_report; + ReportDesignWidget* m_designerWidget; }; } // namespace LimeReport From 3b0bd5d15f09ea2d3ff7f90315ad09f1dc8db9c4 Mon Sep 17 00:00:00 2001 From: James Date: Mon, 4 Jun 2018 15:31:03 -0400 Subject: [PATCH 175/347] Forward ReportEnginePrivate::cleared signal to ReportEngine::cleared s.t. users of LimeReport as a library are informed when a user clicks the new report Action --- limereport/lrreportengine.cpp | 1 + limereport/lrreportengine.h | 1 + 2 files changed, 2 insertions(+) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index a5d101e..b1955e6 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1181,6 +1181,7 @@ ReportEngine::ReportEngine(QObject *parent) connect(d, SIGNAL(onLoad(bool&)), this, SIGNAL(onLoad(bool&))); connect(d, SIGNAL(saveFinished()), this, SIGNAL(saveFinished())); connect(d, SIGNAL(loadFinished()), this, SIGNAL(loadFinished())); + connect(d, SIGNAL(cleared()), this, SIGNAL(cleared())); connect(d, SIGNAL(printedToPDF(QString)), this, SIGNAL(printedToPDF(QString))); connect(d, SIGNAL(getAviableLanguages(QList*)), diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index a188cef..a319dd1 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -116,6 +116,7 @@ public: QList designerLanguages(); QLocale::Language currentDesignerLanguage(); signals: + void cleared(); void renderStarted(); void renderFinished(); void renderPageFinished(int renderedPageCount); From bb45ac34e5b506f984cf44a2d102923651d27418 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 8 Jun 2018 20:51:43 +0300 Subject: [PATCH 176/347] zip deleted --- tests/drive-download-20170623T111607Z-001.zip | Bin 2296 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/drive-download-20170623T111607Z-001.zip diff --git a/tests/drive-download-20170623T111607Z-001.zip b/tests/drive-download-20170623T111607Z-001.zip deleted file mode 100644 index 9dc6a31609a7f823685cafebe5445d18fb09e425..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2296 zcmai0X*3j!8Xn8onjtb=TTvwYz9iCo%D$DgtYaOf#+b2$497NNG$MoS6j2xy8Cgn` zgzQrcAu~+bS}=rs`SX3d7k$?_EsF6!T=r~9zdbYJ4?WC5CI$m zgki$Gd|_9w`oMe1vP3r#hc;yPhj%F^rx9X))VENi}L_1)7 zRhQRX`&~F1CXC>+7y{}u7 z9y-(X6xTa`Yx86~1(zDiu&o%6Ui`@WZ3w)vb>&Th-H?Jm z+2*D>R4{K#rCIXBOewgF!aDh{i=UAI0gV|(5Et5~OY7%DWqS6UluZd-;GS(nl zVWvxUbC8=m?wTBg6%ly8hdj)g!IA1QV*(XTMT+Z{d&^p3E#8$r(>WDrL#B&2`mSdL z5-+eUohQaNBC{2jg7dqR-%FL$p=7oH#%MqXeBIsAKP_-v9gEY?H*z&B z=I)I56i9*z)V*L*_LN^mewGuLd72|o!I%rL7j553OFspzEiMf4!G#J-1A+@ln zGbA@pyrH^?;@CA`h?dZFJbtBUw9Om8;+GWfjTUTjer&NT9>s%Qp(d|ZnV?mph3iGS zXO6@M+%D>nW=h+oDN0fH3&Ao1-4HyUAz|EaD)Zhj5!Z8W0<;{@G9|k8tG#`g&-k86 zAo6dbPu?OMin^Rj$=Qf(>@%KF$z-Zz+F2^w_T~x}@D(J!8j6fEYu~q@%u5eyu5Z+d ztNFPt^pnA)BOgU%>R0W}G%{2Q_Ga(rO}?;c>mM{N7a`7N+4xNtSjduh#XIMYb)yrXsISkQ=PA-!8Y63h-Eow0mbJT-YX!2fn(V=ixu!2u^n19F0*|@r~oUeBR2G|=mZzf!>)5#f9w(oRlYJ8_$ znIpc1Rt!TH12wm5lAF#66rD}Vh3AP8YL;u{E{6M^qNX;fIKo&U3sr(Aurt_V_vW-Z z4Pg)TxnU%+>ek&iJv!PQ+ebE>l#*PUfKi9;>^m^1=4t_626@?B7NAUyLbZ3Rv|LPPuzz{U`!+UjJp~~As4V3V< z+fbQfBQIA#`33r_{&L=aJ0tLmvUXXyDGmD_*`p(mloD;dNw$$|(=i6&(e)mWx((EI zen=4cEfc3;Kni~VlCC$|6?FYuwdiI{6-=bKu;_;Vp`8xqhV@nAb8NdryvfqNQ?qq~ zB*?gwL7%IxwOR#;IYxd)za;X^-G#c?IP8QL^jb}~s(nP<5?%twzYF)&t|?dVD_0xs zRZlMkYhB8#Jxsh}*$(;4ujtN~OqxSHCXHsuytGk~74OPGkr<{Ii-8U6JwvXtpt=Z> ztetpbX)gWnRhM#iwibJ7#RM&cCZQQZ zNugna^21Xx27TW`wQVW{w{_o!qy!1c=VI2TUC^a;zNe4L8_NJ>Z}Pgb03SanhFSvV zQ8>$N81deSfeYtEhu4l(DP@I0pJUMJBZTUD5u)ffH6gU)YH4*WA5JJ^p57;*z4@Fh zc5~IxL23}Un9a1`iwXQ*MXW0oQ;q0N-P*|0qxZZKKU;w`YYoy-!y6AoTRbuD~? zOI9UPe7;uFiay{8d&hRb2VDJdfrIGF4gfTA9&nY7T^R7UZ}^?Z2fpFo@y|Bl|G0?% lJn{Sa13~+&2_e**3@D69Yg From 0671e0816421f6df398289631f2dd31d178fb456 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 18 Jun 2018 23:28:43 +0300 Subject: [PATCH 177/347] Deleted unneeded files Deleted unneeded files --- console/StarIO_Cpp_Linux_SDK_README.pdf | Bin 429744 -> 0 bytes console/limereport.pdf | Bin 169938 -> 0 bytes limerender/limerender.h | 120 --- limerender/limerender.pri | 156 ---- limerender/limerender.pro | 124 --- limerender/limerender_p.h | 192 ---- limerender/lrreportrender.cpp | 1104 ----------------------- 7 files changed, 1696 deletions(-) delete mode 100644 console/StarIO_Cpp_Linux_SDK_README.pdf delete mode 100644 console/limereport.pdf delete mode 100644 limerender/limerender.h delete mode 100644 limerender/limerender.pri delete mode 100644 limerender/limerender.pro delete mode 100644 limerender/limerender_p.h delete mode 100644 limerender/lrreportrender.cpp diff --git a/console/StarIO_Cpp_Linux_SDK_README.pdf b/console/StarIO_Cpp_Linux_SDK_README.pdf deleted file mode 100644 index c52b64a101c518deb77d36a429940fe93457de4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 429744 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
  1. Fgbjt^Bk zZZt4+$mr}|=CY$|agVW9(>E9mVE>iO_px+is;S&NQy`zX?btd#2G}!(Ltzx66dyT$ zc?eRTo)rEXavdhnzTdE_av_$g*+NNrxcBHt;PnuxC%q#dq>-5v^8D&<@?K4qP(*p^ zvwfC{nDU}F=R+ZD%rQzfa*`)3JUhuSj!Ozdy=8=<#=X*YAWRU#AQ4@&1C1Ec@%yw9 z@?p}IJLWw?_Ek}YKfV9+bY^}pZ(T-k!(dyjz&kUX$r8j~+5F38+P6mxz<;ZS3Nbte z6kzw`lCHKQ#>M#u?HuW)bsRGr&{nN5i8!*v^+PTU2aI@E{DByR&%&V0}H&uwVM zQZJGEG0J7jwTYgZ{CbbY%HluOFR1BFPfI>eD`nTdDSC)=QD~?)nZ*Vm>x~=1vt8&HpC`5HeRRH2kx&YoLEI~EbJt4r&itpHe3@Eu65;2&&YzBz zB0*j)b=^C9Gvx_l8HJDCZwkl*%CpOb;0Fd{54iyo^Uwc|g^V?r>ilw+_u^8{Xfais z61Tfv&@=ce*_b`Quw#aTzO9A)JkH#e6ZQ$vMvDtlBvs0CiOp9bc&J0Q%-HU}(PpMr zDW{j){dLJ^cDRPdE$_TXz>#HdBaP_=g)k4_U4V@J9^kX2tiDnG?= zEybPO&=bKv{*eX}D-~&~fA(}XMBYf%Dh@br#&igtGae4YN;?d7zUnt)7fFKbn;MyD zf8CV9-ui69M3fz)Ybpn`S}yC3Qam2d&pxabd3*WO+YI%@*CEX=(*4qKbh67mkiYR) zk~f3Y@_Ox|K91xX<}b}lF_j=j`7^=(1o!4(zY?*lGfs7P3vCTMu{9s2O*o8Q=}HQ<(T06&M}h@B z+%KEdq?fu_K0X-qZj6U3%4;nxeEe`ckUkqzhDC*ome&cqHUhd=2_-k`60d&F#)s)- zlen%RsWLXF$Vf)x1no4UFG6dl8dtNMv(2bN4YPOkztDUMC{?s#FH+una682OIjSF2 z98;h@1@7YqeC<}dCrZYa>@s8)L$;L4bSISNxF7wAvQ0&k=hlsP;^UwXrM8D{&y|o&macX5v%xbvDGiX#iVCz{@xB!gYkI0%TcVPgwz?jDCG-r51B5 zengumiNx_lf>|JgPCNiehu5yE#kCoad+*tpZ0tVBz~yZ%N?B;oY>E8}Qjkcv3P ziE_5lFODBcgg>L@x|+3$$)Ovf}5$+GN}g^ zvrZYNiUVf2?feDPin73vWQ35Q(ci7#{|bS)`h;1RKekuslgcOD*u>-Tm(e9BRFj*E zRnxzct<4XK6HLWS1* zgVEXQ<_+lm6I#d*#+kXq7RmM6o?D{Yz#T~^&W~^c%7rKG2^8AjLNg@R78S2@<023g z{6+8MP->*x51Y&V+)*@H59O8V`NAmWQf?8}{5W-vb97y_=PU(uQI=oU<*95HqGq|8 zZNoq;l(g(j(n-(2K@W>ny_xSf3Eq#_Enrt2w2gj}cK^`Q6GHDeSJ?~F<1r+9wGqUF1HFI+~#Q8S~zgR3SaF;4AH?3 zp@iM7m)vUBBGk`hzlNo;a7{*)VM-oWIQMML`Bg?m#TXwN4sQ2BgzAqyL&fO~aW40m zrc={o=_FE*k4^PDHeVhon1{1Q4wRHVTsxka7jT2mh#Z`tYt?Ws1#7rZUv=9s1zw;@ zi2ZssGl=hX_vD3Kfu7^M$NQcvtbRKq2rPPn)v6X>-hf0-C6gB7C__!vl-qsrFE3Zh zXc@0LbLs!)0T*tlmAw<4EZhT6Gae6LmkHX+c<8bwGw619Z+_=Nvi&pDw=kW+qmGtV z^R*8uW5CVb?0Bue?dE>3K8+x;=UP`KDlRs4e<1VF)M{Y{vqD_xz#m{1<6OZV7kNO& zYE^lpi~S4pw%_tW`Tr}w@!wTDR^xL}CDST)3DrXZdb(I7vuE|Zjk({HE-Hg4r) z-gdriySxG!BZ!tl_FFbhp{g@}0&cf?qygpjcpob*W;FT&7NUTYJdEJ4%^gZ&3u#oE z;UFP>vR&Tu%YFBWR-=(TYq?z*`6|T-?j@7;u1K<(w_&N8Q{pHJ;uW)r5FIpG0)(l4 z<(o|1tq4J3NVFyyBQM&UGc2b*8Q8ip2Y$y3O;pz78v|-tn!L+mg2NoG{KNg$9n5|a zZ$@Sj^37%=`YC=1P)p!$CIfK+9#vH!G0l8S>b|%kD9ui3!+qP~Oi)$IYf>&q zQcQ5d((%iSV|O&U`?X$L#)P*z=?;_2S2-( z3y854$W&rD+K+!;Fo8AeToL4Vbh@&4IeHT$FcsC|#ZKF0KiVTvJt2|F7u9-7Z^-d_ z7Q5d+jfB6vC4rTitn6}|;#llKUSn<=a&5pkOg!`liZ-L9p43b+2-mWBG z({bH0oM4 zpRt{siT3fdtAzSa@7y=~5>2RJoboIAw3H~TjeM+ZXU?=%O_Q|&Lv{58>A@S7@6f*c z#_(h}B`ou`uz<^~K4JE`EvYg>0VVNTeN;}F%gZq1-7?dWa-KJFk66d{VTq|xx#WsF z9m#SU>dqZ+AY4M4sQ$IsocDj#H~zcMQ9noi4F53{_)#4lvX~JT-gQf!97o5>v&>v=tXrq$#FCfTpsi|tBmL`y2OD~ z^v_aiF7=xrD7CAf)$g70XR~?4R-=p}b#8h8aa_TPD#iIKi8kgUb%MRMqnmfK?~m6d zg@O8hIx?nC>7s9qx4(n6|7^Pd4hf#^V^uG#w5y{;T=8$U`RSV}KcB%@?2Bp3&lf8v zIhF;>F%r=Q8PF|fLDbMmmccn3eJa-RNcQ+{W|iBa+S87FbPeZSUavLDEMWv4rUlCuCk{sAA9ZaF3_A=G-dTWJ`%E$!A4H^I+MQ>S#vw?-%IAbh=@YKNvIvgyY!kezz~=SRn0 z^$7(gl(JXY@ugMB$=%`O#^poN^2jZqMo9>N701>`VAd5uTIc()=-5}kv_FS)F65oh zc%LV06N?Paj+J(b{5Ne|(~kJ&B4EXE8bQ2d z+`eHd)pH@lqmr@xu5c)umt?JERM01HCAR>psc(V*x@F9NaGLvIa&%JnS5Q5Z;96+4 z0=~SIXn-n`7z!Z96XR*as*Xo+Omhul3`9dg$;@O*{N{Xr*?w*p8sQ>{^S(OrFPjGR zE18)XFo4reO+toY!P(@!0er{TY?%+?Id--v59R58FnN$r44E89(A6!s^IH)~+^yt^ z=W=E{Zw{od$&hz5>HX^mFs<4m@z%?(mbQ&VCBa<0K)6sA=sp`CnYcm-sd0H0)IkP* zrJu)5Rddq3Odp@@!INYbuY=&xryC-bZ@2_+$MV zdv;1vt7_xi>$j^V7j%inRt1dgEnDthEsZAr|Dq>`?;Urf&yt;pij?$Lo;+_@j;Mmp zU~T}n3RCvTR{(;y)vC%fRRt@N8;ER%AJ0e#n>ONmRGz^M#!0B;1E80dt1}5?RNO|K z0BO>KGw+};&zLEVWzU=V;j&jue?*gJsId63u-s;D4Kt|eL1?k<pKX|iW@x)8j)2l{O;J0|o+>6gRVbwhiED@?+BRMeBt zcjx7~gn#PZ*@Kjs@2AgyB@BYR&kyK6HRBiR`cEbM6jW5|MJ1Zno16C zhP=tULJLT*le(9H*|hY=vSJu6THJySE?l;xI)a1{_xDC0(shj)rzwQZ6;>7F$6_ zzLuS0{5K!9{m~e_<7YV}5r~K5uViS}Gt#!#_}0}o%nc?0yY=(LD=s)mg`)1D(z7b1 zo~rMpxOV~liKTy()f#Ey)4I#dguD_aBB{jC{AOxoqv07o&O|40YN%zNv&Ff==k;*D zGIxIpu!Uw$I`T=CZolf|Cz!@MO(@t|m!3?A`2JTimi9sK^F;06pEy6-k>ch_o!Iy0 z@h_0*mybT2uMTT%yeP#iqD`A~#)cI+ATIRS_hu{bXlT~-p-;~2lfjKDn^n(KCp!aT zq{((BFWyLk`vlNBdRY3Wk6Xkad69Nj&5t{43zBTuBa-<#aguy!hZom zo!}$QUSi{N%J`<}ltGj)&!1f)riF8sHC|pQ_g6A6hSOP>KK3{BSrRMLB~jQAPQ8ys zFg_H{V$0I(1ZiQmOxd4<@!F9dH7~0IBv{Hlhl}Iwi(P7WI-(d_975tTe({jHX{A59 ztx&`I(d0R}eLvT;?$I{fL2FwFRf{$S@0d=f9oiEcq%nq!& z^3#|={NCGdhA5M<-H@0#^G_M|^mz1$_Hw*z*6|)OrsjF`+T)28VI_`?h*l%myk=z$ z5LK^6O!It;>n^s3Q?7YxJD;dv1}l;udjji`%uTsmp^VKu#o2#02)l&o=_CIKdv6&Q zSF^2)q9Iu07CcyR3))yhfDi%%cX#*3J-7x51b26LcXxMpcfIpl`<%VL^_+FiJ@?nW z=efIob-*D$wlVXZ2hv^44Z`?yuu9($j3TdPXPhFKC@l%UL?&?PM3JL}_Z&Yuq zPf<~pt6w4+-2^_S;KuTcVNF;S#(t{c?=FRsjCac2gv9)E`Y6jD_|5H!Vd8~x!-pfXkuI%42rbv-@AfSB7 zCS$gwn>;hW1{G^4Oy7WwD+U?Oi0jwb5 za&}l+<<|%cA5NEsVCX&?s{9}?)(sGum|K7bB{ZFMz;h4Witv_i9P87buG_{!o_Tx$y%{_>d zkNtfCJmd^fiMT;N2Ae#x7dixpR*&HDG)9=r$=qBc$TQ|rklfTEupljstvQTu%wB*y zIPf?h=<6FeXR6mo5fH_t#O4KxCZ~=Ls#=K*)yYS3IiUr`hb{L&j=LE7BE3|zoMUed z>X{t$Z;dkz*S8tz6_f^EJn>#wSMQJas4@UoI5$mP;W;zx6$%k>FMz%MkrFrITu(I5 z)mAT`usNd?JdHO!J3JQ^U!k@z|K&b$$*fqd1@6_e)SKznd$`uW-6v;4rS#8QnE!cG z43IMQFO~eQF{=Nw8{7OSEt-Y)ROtBPnyod!RG(=A$I-rsHts~4px{QW@d$<)P$k*f zn3@f2;RqJ<|pP8n#qh7(X*phx$Z!SQ9NmqB#13pxb*L5j^85RnZ0? zpWQ})6{q9d^-M)NPkJly3T1fo3e``0ZV>wZ6WpN-%T|xRIYwpNAt`pV-bS^czUMOY zb0TmkH)Y&W#AEg=R3*f7D<;)BK(}%(&U*Wyx0_k{u2}kSRZ%@syzF}(EvMd7wp@a` zHM<%Em}dlNU3$AsJ^Fx6y;_f4Mla&be=l(x523rETH^62KbM#hpqIN5dj@h?<{Jes z#Q$ETsk2K;7Q!eFc5NylK5K*_Z{Nk<{(FqR*{=5aOc$XuU9Dh z)*H*wrzowzl{jTNQaF;RbG{uni@yorR3Gw>2pdJSvT9cUzb|C_thW(YkVo8<ZNy%>1s|u(X2rSY*#u8Myh6zIem-z~%oBF&@Yai_%P4Ti3 z@f_@Vn|<>=;xSn8hV~U|1vtC@UrGssE*yGLNoc4$?-9i%vJ#K}kltc@9?88zH8cOM z;g|;TzqLK_NGO02jL=bPiZb~jt^tkWY;trFJ5jtU2qyVz8WV6W0PKSyh2U+eOX(w zhcKNlmkhclcre-p(rsECV7v*AM}VD5efW(Xv!HO%n%eye6$+SO7b`izXB@4Y&DN^~ z?V%7xy%QAUqNtg&IB~MtsF@pD+8ki%%OM~(V!glBwl8A+V@PJTP+YV6xrS%c)eMAE zJ_1>mu0aU)H&Q*YSMd&0lGYg>xz0(n<>W{SjB@{WPzzbl8za;5OZH2il5p`n)=Zub zF|WvJscDYDsfnvTZXPm=Uu$zdAJ_LBE=n-oFK*3Z2fqsqJuGS~p87pC6kwU1n&WN` zh7QA!o4nF2a7p2>5lF3Ej<7pFDdJXMzD|blLDx6j!KanC6loi1Z)~w0c=U?=0acC`oabhW^85_Q&kRxNmcTrluI zd2uEntG}YD{~OInP=NEU33*G8Qeqa=EbMD3Xeh{dj`TEl*?@%6rH); zZopbpxdYPO!dbg76Z`SW!baIQ4JwYg;F?oo$nqF9O*`~5T}y6g&$D)S_ds7@T#rV8UIu$+B4k>^jqaX7UnHS4H*>Jc&v?8eN?R-oj2X z-djj9mEx|nthrpiII-iJVYI`J09tCqf27ZDTvuF|m;%f1}v9V)D{F`#BN~O!LWM^%jwo34a^f0EJ2XoiK zkeYZ`<|1e~57R}JXV2W_sRscmRFIiP-A9g5N-i;ug=4szGjU1b8TJS5%9~-PmVzbZ z%W@N(&6!@YNsB+Y%GwvIb8nd+dJReC52m){Jft`=vbU!cI~GhG7+sexB-D@fI~_@> zY-=hTAg z&^Hrj4>eP?b~n{O`R+Kyx^cK3X5}jpvct2(DhA>oG)(Lxjom{n!p$-A^lIVd-F3>F zU73+~%9{mAa(}PTI5+&3b10_PelSrmtP!b*t_Hq#NY5a(KE_HRDY447AXC7 z4N0QWm*q`wSY&5|hV-(N*8nj&$jOVv2Bj^`H><0WX1&8wn*8}a()ps%zU(5Hf`wiF z#ahfmt~Y@cesX#4X2XWU#9=|dB-Fg);%?mh75SyV%bK`_d_;}2v|KyI=xCktC?z_) ze5bxpZrk8EM_A)ny_n)?5$Ht(PSd}#tevV*F?21@FOFAHHX65Ek+=}io4!@-BN@$H z?7I01kc34VLi+Y`f@tr{|7dLASzy=S)Q9FD*&$oFs;=6#L@(~no9bK_u$%R`e_SQN zRg?2Jx@69^cD3>m<{x6bq{|`wevnI(qihBU;1;c8ak~ z^qwkHS4L&Zc>>N~9BOnb*%cV@P}3|_K~HL0$5z!1iUACLF8Tg)8=|fnzwZ)uKg#wj^Qv!_CU}r zX7|b?9b!FvoiOtp$8=<94ktlRVPYR$QqY1h8MGW;z4O8c(b=u))3b$l3oD~MRD)o=!#ASRUwQ^C zzVnN*o@SE#jxuu(b)B<7Nc~1|AboP*!92sqRGqBAy$l}bF12~IW30Yv=y|)Srlq0S zsZsKBo@?K#qm-!0QGdkktUTnvQJcH9tVW;~cvC(702c_n)ip{+`x;a|)c`_}%Q*V3 z#*{lVaGhV#V@fk$^DrnhqaSN^aAN8BV{dMLexqhNYEm1AW5_CJ!=0k~)ETY=$t7pDx{lL(OaOmF>aDor<9=ND1$2wv1kcxV&F4(pBu$>nL$L&kF7F? zt*Y;W;-hJ&;&`Z)9m-|K%dy{4JX&fuNIXfEYA9H2J~1O7VY~67bd%Sbs%$WTy4KN@ zoK;;YC-~Wmuy6}=oRVBhp7kc0>YM~gLoH`V<4?%cgWaK}C4NP#)c(~`!E)o=E}Qx! zgUK7TcBTF{AY+Y`X|+Nj(buW*-EZDrc~!HDL;{0s@0Fc7ZGV%UsQA^{WzV^n0fwH+ z8(&s-n-epUu!L0|y_WbX3u`;+VYS0#2^#qLSl!_6`+3x!lEK{x9Y*)Wq<5+sS7eBo z-!ewLr_7t{=b5t%)TZc%fj1Pso7a#}g3PLge6q_xiNwuS>ZzqioKlDg`>if|z)mw^ zO~NwBadwlHMT}Ljoba^tJyWjY!J#8D^-J(-eOP&knYy~#Ray|s=P4CIr3Tu41$}{@ ziNT8_T!A9Pqnw)R;*y3#^p9q0L#E=YegCp7<`U*zCl#qbHJL7S40$9y&EUaO_tXzV zbq3T*-xMedsRgAW^)-o<29`E zjjrkU3Z95;!lE9Cy^Wm*IA)G>`f)kAYL`}ZFqZ8lk`IYVi>{5_Qx3|^vTHf6jXuuV zn&~m1S@yhJ6M&P>ztF%G2d1M>Oq5*SyTdiUTm@XG6bTg?9h1{dfW%zfiAvf65}7y! z&Fn`XW0mgPnHQGXU$zxqthG3^qEfS3|Lgi+a>(HIRN8mAI{LO6C!smylCTpO1gALm zX||&L(JaezX~1(7dFLuh?keE81n{=(0I!LU>c9T^FB$xo9{m4dE_fcNM6llsFYNp zrfNw{Eto+whBmDwn8*t_*%)Np%nU)VE+Xo&F*@Oy=lcWx!o5XWn3L_2EzdaadU2D_ z>%DH`0jS!Dh$1Z?npu7+OYKo(|D-bRMfT7|KsRl_{7~H(?{easS(m*VRUkiX zNnLe{yyOcnRSwPQ{QFasO{~|K(Xm-%28(p=f)w2B#GX`hRS9Q4!hx8>Be_A!-5>;P z)`(`>nl!w3(n->cyUt%DcS%FO|kIKfAn9Y-QCycr4k? z)AN3mM&hbh8!552oPdm6`^^Q4G&cvM+Vc&4j+9exum)-gPR!wn`*8v;enQk-)B876 zC?93##?NwZ)eayDD>}22MTF^@v7yTdn2lsjTqLzCPF1XA{4A4}I!VnZ60P5cqC+9^ID%skWDT=c_EMRl4KSWH8TN%q#EUqff>SxTGomij+(5QEQkXiqN z9fSWm+~E+{K_tv9y%fNsG{xe6CX2_`zn()J`R!X(!W*XPF8n||48E}=oZ$ONBp%> zgg}EjP6`y7AsFZ1coNFBE(SIG_>=_m597q z_(OB!Upw;rYx{B%Guvgf*<}1aBIR=|TWBFctACHTgJSohO4l}&dw|2wpbSKQ43TG5aI6)FkIgCHF=j8Xg*|4fpKJAL1#YXf|Mbo zleD(-QLgx|!Bw3kz+;}<`OkH9Z_|eiX{6V1883)K{W;mslVc_#?&U6X@dPTGoZ^Jd z9><#8`>$Qfti18J_Ljus3}06TJ@&(!&0>F$fWii=^9L}j%<=|i@?jT7re|S^TqeW6 z_J!$eH|ZH>GsX%c+|7$T;^M?sOnNwpjeb%;<_R z`Rofi=7ZPj`z%6XmDEc-Yi6<~*oa`TcJ1Iu;y?nXQ)sHf*=8#_BY zYwP%g1SCX6Vj?1LZf();C`ufJkd%eBA8yguw zAulhl`1ttN*4OLn>e$%nv$M0E9YY6)>%P9P;^N|(nk4urGZPa70|TlmDmFGY7o5RdCAGw4-X}Tg@qLrIVmXg%*+OXb`}>C+qL-w z1>@r42=Vc;ad7tc_xt<%i%Uxv=jN1ERi&h*Pmhj1a&W}P#wI5x^YHSfq@>W%(T$9Z z6y)Xo$d~uL1wI3_0hkB^Ok zfnR_87y}-(va+(J<>mgK2Q#P$_>`6!l`8{J!-CI1P36%(VPqDud<*WK;c)Wqj4g#Yf{!r~$_8rtaaFfbs~ zQ&Yfb5aZ*&MMkE;43dzLczk@cw6wgvy#>ZyNl6LlVMIiPn3xzKCgYDT=H^3VV`Z6{ zn`dWZU0q)!B^h~n8)|A4KYfDs`%Ftu&&A34aDQ)OYins`MMF)Ei;XQr78wu_u(-H* zb93YG|Av6z&&-S>J3G6k=F0uOvy#&6#)d8*$?5j?^y+G9VWF#?U1fRsujFKYc6L1- z9adJ>Ux0#PVoppadENzCwgPyVEy=! zS2D5{~;6KkEjz-+v3!j};XkpH^{8g3rwg{Zgl6*7v`R6xlwi!~rtyRMi7D=%mzJiW&zaNX#(p1F^;N>0g?z@mB}{v`KI>Y$^GWFHK2bG>gbEEo zY3+wK3q#xYV!Z8wl2cU0#KSvWU)LFhcy&d>v)!D8b{$^8W1RTb14lmF3wW+PEb-9e z3c-B!e?ZgyF%L}_YpS!`^kvHF{P$+Ew^PU<6E+eK2ea;3G!CX0nwy-mveQ`;>@8`| zXT|cFuqy6%jHTH;)qj33jRl+K7)%;}c{h9|oDs8w*sX_0M9Phwbv=Pi+11-}VW0cV zj#5SeMe#!hGx_cT-xlsIoURwN>o?mYSM`9#}}X4~D?iroqQLE=D+7F8oDNwEtL4 zEIRTmyDF=$6$vh1OHQt{0fP*hQurBx)#*q`**@cEutJ=u7sfe1o`5KI8m=gcZ3pVj z7vmz?6;FS?l<_a{%(Rb~y@`<1YLOKhDiQZwk(rt=Gj7kym&cOVN|RFs*Z#~LD5$C6 zR9kRKGBLr}q+NHfC-gQNtgEx@2S!Flz>?C@9fVM{1?-FPllBN`L(@sYU<}m>?R|T6T5Vp%(Eq>B>K1( zdKYGHry02_3L|=CV%;ulwC=MEjCZ%Q%L zJZmNfh18l*mHWF$Rzk6us&E$9cna5e8rOJM#{Tewiv#vEZ}2DL>#xMqWhH0a%g9Yt z3Zj}&-a=Pk%~Jk%gzxaVc(tvp&^n0&p9%^JPFGtU@2QD4)PRqwYKzCSs*DVD5IH6r zgyJOxSuS)Jt8`$irJOeOmYF^ylH_=_u_B*pLs>3Rd|v1EHdi*AqI87G0wm{kO28O;inQ}{! z%VbkdLYor6ygYNYM~+CKKUi6&$@)WM(RhRJFdk zgGTbxHFhgoJ@yJMFHFi$>=2Jg&eb{=IIcge%AM#}LJvBE`fKVB(lcp{AiL~Dza_3t zukW4~bVx1F^a%=xagMJt_?dR#&TVQl@8?i{d$Qs!m&(F^$ee6$VzR!zlIS3OI9u9i z{CvCAq!~BqSYx#szWht4(|q<~WgoBfUyA z%1?OA9x>a+eC-mlM9EB}VbR3VB|W#MJhPRI$XKJ_n%#{dthpE8c#d^-CTVRmJwzuJ zTMNhuO9h?l0u&1srRNCsYfw&4XOC6NsyojJp(%bSD}UvJnV+Ah#0>gMiTUsE{8p0AQEt$85rBx*%6i^yh3Fe^B z^-jxTyCdU7`U$x#)$47yk5noj20>Q|T6q%SR|o);1iHTj`1z6WW7`2=T}*@kMqfC;C;q zZojHRPrjLjhEA}U;B}(Qmp`_~elc3p1C{F(j*X@0OA2_c$u}CXuTI+t63Cp*Q25YJ zdB6I%0Aw`u7C@p|xw*c`0MIVIe05HJ&ULE)QOyhTG$q0$pwQ|5Exy^ zmQ(HQox#cMHH=X}&S+j@EBeo@^>&S(P9ajGU9)m!u1WjAI^wGIyto10c#T5j5ipdTS=>06k-cxwf1c1k&y3K;k8Z{>|fI+}!@ z=sWT796KQvBLfRb3R-5X{{R6G#GEw9I5;>Q92^Q&0b5)8PGzR1rX*%)Wzda)TQE0X zQNi|gD2MpN@aXpmlF6gOW%Jg$`*Rp5D{$-9jhi`PUn}oozqaMPoJohX4rl4!uV;-( zIe#>gOa&R_xAH9zz;iWrL*&3|Ym+s1Zu$t~W(0 z_I|LTB>eAOAJ|>>*`q%W4d~?L#IJ8`pj3Fr{Au6QovVUnnAn_@{Up%c-Tk?H&t+wO zUoJBFNIrA$sCj2)861Mk_)fs>E)auaXE@QZuMO%wd5*9BC>dr1kpQ332+r=Ai)#Gd7V@%C|=HDb5!) zu*v=K_v|7UI&75f{6zM{gJ&_#!C68=Igznw9lZ6*XsRx!)e1`ez=9TokUO1$EJM z0f46i3$BM0Fv#BC(BdBCrba1_V6oVt9aEp=S{XXK$W@nqO^vps3i_1=_- z>-Q3##LRlXt7CF98XN-X6ad6vC;44HVi(CG^^rF^=nK$>5l5PH-Xo^LBFiari@q>AZnMkGfH7@d-j+}XRFs4giJ6%hJiW)} zdJ0v|lf@qx7$^iglEUwLzR|sX%>L`{?k;WT%u&+S%il-s?D1lojg2i59}b@g-lE4C zL5NW}`ZM_&_Jc9P*3F^=3yeh95NBWNa*hX1B`i3C&ue)*3itE7n?>mWFJklwr_k)5 zO+&%(;LE#niaDt3zRphJS8RB^yn=>^l<&5SoM!?I8;w=4^D30q3MZD93?+m2*^@(m z*p(Ndtu=)MK-V`eA>G2M0UG8vps4_vzz($aK0r(W)afV<%Rs|Fk9H+W8VKYM6aU2HV zr7mh3I^JOCJ>&!%9cyYkJvw@yD|D?Eup7-p?$kO%f7_xFBksMlID|jA6nWRDi>i;9 zmd%Pg4-E%1ep<$(l2=t#^%r5o4~zu%!de@;cHHN5Z806#zYy?+z>>583)5{!@Efk~ zgxt?2yE!z<-_r3`naV zNhRG=sa{@y#{KVFx_>+}{72AJfco`e95gqt;eXhzc~gp{Xy* zm;IcRX!-RD$uv#bJBq#-P+cgiOt>8F6-6r^6@zSoO}DU}BH7s5jmWqRZAH*CtVP8y zoE@T~qKh?_1{kZ^#AlC}(sg+wmCNrtI@^VZ6L_LiQ%R3-xT$9#Q1k(s(nZdt8jZoz z2vr~So&ZcT5vAJ~Qp^g?DxKOhNdboX9T^>s_2M($*@Es+H^fw$F(}~=IccKa+X}*R zFEw(0{78p~XT;7v>4%Khv5bOvue|bdkMj85%boTu%9)j`L+6%#=? zAas0pJV5Ub^hWwuBkQ{7j=I^X&G*S`4kNk>m#n3wm#6ipie zJ9Y~TFqDdlin?N#mzU(MW?(PDR*YQ1mW^M=m6tU=U^~K6Y3PDd$!m^;Y6;`0sfM76 zj!DN-;%s`ho4mfj&xQRpwt6QgiEbhmEg>UGSp9YGEt zfM!0s$iCFBgk>O^Z!UvPo|ccR&XA=AyoMj;9iCFYr5qRuHV8a^+Avs}KseyY6udD3Q5ub3IlO+|GfzANX__0vj`OzZuk83O% zsj11yu+X;%G}jyVl^E*k{ME2)m3xr2i)>GO?V?oQEBDI~gyl?aXaT@GM#O zTwNOKJMkW-zEsK-IdYmMBCY6iIzZZ1-VLkD!a*f9#BNR6&#dwy219MMHZ(jmw`y4e zhw3Td@a?b3e5ICS_-L-nmx1LQZ5<@e@*UaTCfBNWm zmeN*D{2J0fl|;V^*)qP~I6PH+hN&p5_XSz6{#dhgsUW{uGW8k%*tAXBeTQ#Ibtrp*Gk6 z1rjs_lQM@x&KjmF)N-nP(LpdAHH03mZstNfG*46&Lk zOObhZ9RjGLce8&tOipL{{1Jdb#Q>k3j_tFO62eHw;2<)*t&NQi>0918Z^u(N7F5qQ zua!v}>8WYp9LplOOyWITU2&}=uSkFQ$9L-yfF}NyP&JPfEVSPfFodhg*YaD=*3C(t z#j~%6K)tg&n){2lfc_M+etm;lMb5bn$NMJp9Al{rTJ5Ecp+y25DKbFBX&xWY2;Ow= z?CijYXWvt3AV$Z;u4=GOue|A@MjoFX`n>C%7(QQR31)fvo(5uQadvoI)cL7NWvDd1 zO{Mp1Ok6ps-0}LTO%V~X-(qo3N>WtR@OYv6H||c6bnn~|L&3r+#4G9dg)Ow8M`xh? zemQNyQ&2D;Z6eQCHsQ-DQQRc-K!JLH^Bcn9(9G+T&=5`m5 z69k6xZj-*X@Xo6#{3ZtfSSAS$4$*8r|Jp<4{y+q)&eCw=FbSsR&dyT5CvtWQU1ec#1;eT9f9a4C@y}K*swNsRw=}0Kr9uv@pJF;SMc5gabTwU3lC0-i*MUtRGKC-i8VLF0U z@?yRZ)D`+n?$Xz&P2MS&jrfvRa;)%2=-XL`bvu$CnSwsX%OBC z5U1wW8{Rov*x>bo{ia|HyAMdl=II#sx3{Ti>EVSPjpxL;9PzrBkvu#+f*Y}~7mb3j zaqvi64sN^XYjPn%%B$jAWg&O0w-(f;l#={lW}qkOBEI7HYL6n$5giG>vM`t8(DT=wy+&%(lK? z6aWj1iPd23tfA=pd}I#8i?FcE-2R=`3nsnB(z2wiFfR>i@#=PWwnW2E{|0%b=r$dMs>)I}Gz*P663nA$ZIn zB$UAL;HTBsms+=Zwg=gb5n^uc59n7G-|gj9O_Ahr_&`Z{p2tujg?n!O==r(1V4DuO zJVNEc$cXlyo?eQM&PV0ZA(V}tFv9jRZ!Tz|8)3vbF|48Kj%8>nAV3JojV>Glpqh5Xpa&`0%wE@OM0Z4)=dPP8I8SJ|-6w zB=zqCaO`)9wl|#Sx?+fMFkr|U^ECEuT-u0=yQ{{q^9paH_%&C~jMn;UtBKE*i$@tO z_=U?Zpv znkrY>v_SF;sP-;V<)P_DuVQ|xDNNo}y+Zj&mWqWsjPtL#e7R4Nu`76wvhprV`N84pAg1H_k zLr2GFtEIY??1>XLeu~gaccK)5Y%?p|Y3<+5j$ZmOh448*{MB%}Kw(Zj;pd$bx4x+< zOrx+r3N#}f6%`KtT7=2na--wn!GX3!kY^2X+sxb2sK&2x4|B2`r>iDrS;LK2FcM$F z^svs7kz>&D5Qyiz~ zX&$>B?q(;@FYAaLsbr)C=jR6pNF4LH-^VK=Zt%yuEb(aG7+4Jv1qaf*IDiampWla6 z41!QV@C>k&{u#Io%4a{rJ{9Fcyt)n#J~e&{`9!HstSkW|P#kgn^TqRSES*XM zx3k&n1VK_Pbupq`w;Sn0YRlk%S71u;+5F3Rba~Q9v_E|Drnt;D&7R~4YrL{C%ZyB* z=QSL;^!ITYF|tyZe~^=$nN@+G=U%cO+rd1UAcmI+6(p`ooDoSfK&* z{;zS2lN7Q?!modLa)NQQe&`~Bl+@Ig=ajAV^e$hTwE&~*;lWgeNW>;rrQHjv`WQ|3 zmhYI|FK0G#XWEdta8N}qm1ao@*DUKRhYU_)$c+c%_>*G6s;uRls?LI}&cqjY^^jX? zqbA`4cz~Lwj3>@3DjFId9yUP({B{kAHGYdX<015d+5MwOXADUW|@TcGKNEw6H;)rvJ{J2Fp zm_YCvZ>dVfz19ENATe%4YQmNc1Ol;LR17H^RO~!C1Iod)qw1*4y`)3S`m?GE+xU-` z0m9cm1Y|+ZPEG)0gfOc9kmP9?VJ<4fk)L;DpdnQYNvq2%yX1vG@?(jaB!2<8p1|6g zijB?9!vZWwa>}2SR%46d!NElfj)z&0*T_#uBB#Z>j|_PX=<@d665naO5<2t+KVn0& zwFdx#u-@Wu2FuV8RvV!!q8S!k1`yjC$Aa#JXw5OIilax9Ufl+9npMI9;o}y3x@FM5 zaP}RKwZDwRaKWpMw$cyh{S6%8F=s7VD9{eVbG9OC2YOt)UJhjE$l>? ze0NSq^RS4jmITOyk!SjQwFQIIoO-w!(_mMCX=ZpZu-sw*yrOpp&9AR2$LVQlWGo-n z4jjPvjNWEkC3gsJ9~c;Z3P)1&@ceNHM?Rhy_MDrb#^vB8fGVR&e%ZKue$GbB7o|8I zupM|iZ2ZVX#%48pQyr{3xFv$yXQ7hSEY@_1eFe%hH7-$a)U<1rl7h?#NL~wzp;<)F zdpwR1i>u_X%zMW%C%0qRE7L9!(9@e0eZnuV^}Mq>!ZDjI;n&w@IonlGSkBGP5AujT z8j}N)<++d^c>xh4pP*g=Ju#)%DgT`sG`CSVOu%|Y%9W}t~l@t}Bkl4x7#ePmtlIMxImF^$y zXQZX&wcTO?#laE!`C+s1Fw?UWfmAxPiuXfHgbe-p?P33CgKR2$FjObmudkHoZ=LuAI5?(f zXJ>nRcSi+ZuWoPAKp?5FU!f=>qoSfxQ>ANRi&nRQ)1!tpwkGAwN|`=X{?XFriFSb) zcE%Fa>hqlTqsiU*s#)4CIzm&OZ@X@B(u+SaF|%n&>HnH7+${=WWTf?HC4A}N-RR&Kl4KccCfpLgEdr^%El1XSpKWADp zi|8TIwW4U%J8)tw@4uOwUyPjh(_uwT--$1{btCk|5O3ue+hN^YV1Dey*1*>~ z2PRk|2n!2SX!_PCtI!T}D&W)gKLic?X3xlxtM=jH!QbB>2q`BdBrGhbn%8Dz_R0e8X1pdo}GqE*xp?s)yP%>^txKvuz)JACOi4^igl4sL~t~ z+~N0?a*yDqJ{TdB!vX#Z!tGiHS#*t}N~H|3L%aU1r{N9Vot+)Ens0#5>s9;~5fyT4 zucJ=AbbrdM!u`Y!j3!{b*!f(r9bR6!AliOEX_qm~XI!ww7))LkzGcV*)(D8)e~DX# zcR7Yf4}_*3o7)@sAk~N=d`x5erkF6AQV`T?#rMgA=##s-KQ)@r#10eN4mHU;LQ3#} z!*-y2t=bWGVqBu{yf>4uhQ+gZ>?JG7ct2^hcvq<7X;XAGrg+!T&o;O~zVci3+GthS zCqb_Q>3g!@L=3^+j~{wKK$?fBh-jKx#9sykH`-5IXmE7!`urSpc8lOF{ofKT$iX2p z-Y&mHB>M)}=fj)I~c6=sH+`Mu+{UH67pSJ8ZV*MaEkeS+p8rGt8swhu{9U#Dgr2dLb@J{G4BUql0Zb|NI6;5>yX z7I2Y0QIPMpkpnRLKxKLeD5HD^HN0t;3pzl0Npm8_PoXEe3@a_qkB$dnqq1x*%KKAnoi ziNhSO6+u7jZ*bbM5Xo4^X8u(N&B*C_(4E%wbCc(lQSmPebAw6XC^2HRCs0^v>VEolh}onAQ9rw$#s3fQALXmwR; zZs0glAJ7w%4qff)$b|&S}(ub1W?z z9z%nC>Vul<`z=GT7L169iB_5~gMz|!HOysoKY#7(1)?N(u!LuLke3Augc@HM*fx$f zg8e&BC$xYK-PWxg{mjI0AQuJ&AF2P|nQRvE?&FW6x~(irZ~aL83ZWiLt<73O7&>kr z23hJY9}G6mE@mmaFG<^?j|j7=^Q+z%`2GUByJ%IhA_`fv`2)!JEzbQ7LT6-Tk3n7b z)^I-vpk5yDoP;Uk{VZG8A#E!!Ts;UVQX%JU$%C)JD}cn`#9{40bb(GbCB58lcQchX|21RKuQ(F#nYn1|-&@zwPq;34#cH9{!JCe_ebM+tWrM zfse%ams{4nJq7;r9&M~dr7mPkI8N^_-(sNr+Dic6f2$7;rX4hMvfq2WNp*cR2Zt&A z`;)?F1hDm~JIQ|*-@`?p7LC{t($;d8xCo*@#r^swh#Xm;h>yy?4A$|BGc1;(5YQaNGp`;?Oq0x{JPq`^(V;8GUrf>&1Z@XRz8MJbI zs%o4??BC{;AyO}sZ?4g%`x4hZ8-a+2p9_FA3t;I4gB#P*(g6BDCnu-Az8=UxO;1m+ zsHgxqS70TgpnwhN{G{8{^cHSoH{F#AY6|A*SdT}knJr=o5%xIUX+iiUtFd6Z5ldQd z^@W`fjC9_OB^x4vq6G`dDNE z|J(OzsE>sh9BAfFaW6EM}}7v~)3?o|#jQchnZ_aM(b_!$W|{z5_rF zLBwQwXc=y{Jor20MgC!rP8z~R?!%ZY%i~R)6wt!vqobBU4l3dNe#D zzCr(a!1%K(4l&Z{t=)Bb?4I#lll0Js@6rSmZZuX?NCwt~8u zl2qP?^*aoWHnEinIGD#>!f&Oil5$x>&gDS14 zB5I_>w(l#be0Sz~e~uGsS0=Z#i!Bb_hEwj-^TZuit-6V(UE{Thb+039YV>Un-F1vG zqR)937ZQ42A22a6h2CDQvHH8d-oNo&_b^}Y6^NIh zfu%Z`Pi`7CM~^!*6`duR6P1rJ;DpK@yYe)*yOqq4$X1LnV35X)U40lk`t%y2_UGFp z)L&l3XxNITk_lBjL{^GsGFIq?e!{9dPi$%~3|xm5&We$iXE7A7J_&zfw3s#T`^o+D z3t0%ii%MztYpnEb?{HQdX8>Px1{tOpg&Gyq3Vp8vZd|(Eo`}{d>v%0( ztDEJs>AR-p`nhev^eulxJpFvYsBLSS7VdT8|6ZQs6h7=^Zz!9R_l_bPsz%imfkdXgScXR9IfWMn6hJRfn|sns#Zo5#PUZ=LHrx~ zuAlWkEhfD}wI8n)tTi~FO#}{3bU$b$?N_?YVO}#0h|0m3hjca^yO_4lkLOa+OE6eAtC{m<5 zGX8G2zv;=hdK1$Ne;g#04!MhmlfBtyvK8dA{gWz5gIm`X3mqbHeYw@I=J&YPF1sRq z!&uhZH^`IxGfJsQ4=)>A?$St2{^KLrm$F~oF!TqX%7*7*qh>3azWXFJ+c*6aF>p1w zvUQ*oQZq6W6`_gwg?+SBvu5XAI@@c!JAH^ai-sA7)K9gA$JyO@`Aq7ccD%yAsQ8?> z$EV}8EF74<4N}gC(Y12Ky4{zLR*KKyULku(@3PfgqUkj ztr0f-n$2ReQZGhWXI)yMi@xv)@j9|qekbjq{lKgx1%7sK1=eUWy7uMH`azkjiBYr5 zUgcK%G8SQW5^4n@ zJkPHko2+cK*yB7ZQT_3RQW`Pz z*{Fw(c8ZCRbf|D&f06u?-i%Xs?1EN)n104k$e(YHTg{O6X*ca!PL}qTvP2a*o*9Ra)9ZuB|23$$l0`#p zNiBP`b=U;*uMOfjzwytj+5ZVD^<Y&CU2iH2OM@hS6qR0Q%G)&%Aa- zcuy2*E=R$y$Om#(+=PfFSSLB!1g~07CEjb3%7s5}G4jb$(AY!n8~)3XFxio*6i$=& zzxUxh_njEr%<>FUdN`^9=S}`L?(2sS)hB{C4O<% zTa0tCO{!zax&loC9}$$EzsN84P5Pzs(*Jw#+GLx~ljR#!$(`_Gv1<70^e5C{@`~gt z${0Iz>D+JHq>ViL%2!e!OGkK~5zkaxuQ9pGpK7$=$LC;7EdEg9a@WEq9^fk5Z0^yr znz~d7nq5eAFGs$9t5fwLOU~x>l|?s+YFx_1tOOE7b_k{y|eoEoIt1-^89IYCw2G@6u}T*QS*6@n-Nwol9hxx ziYI9k8nw87>^mMF9@#5hdTEJ)-fx9JFNS@r-q;xC4-6)J&w68iXd!U@%6NUh(jILP zEBRs#H?Vbgu!(wLh7V(YIlEt7f#Xz8V-M4=p_3o?lU||~!Wp-JP&#WlACaMoFXM*e zK=Gp#I6E`&RLy}|aLl$W$#FYoFL^1XI4Hf$>wUOGMcb{VU*Z>vR$Pd7!3t~=0rh+N z+*)@<5-}uG=JoNKUKdq|4}MtWhda}QZh7`&&E+S3FdV~#798nAq4&87C_?$lB#b2| zKeyS~Q8W?zjw}hijB5k$n76b}x0uQgUS{hBrsEe4O{phLUmsa_%ZM5%vRVebja-Aa z679W5m&`v5WmTc!f|p%g87CT9hZ+l4)j4g<+e<1WO}r)Bj2qtv zg;vbbQfR{zm^`il*gL4iEfc%%JD!)&)Tq$okIYt2W-X~9AN?^86SEY$1<@T>RF?f% z*9v$|g-0$zG+iQTVRk-RRKcWplz(c-?^reKFbK=s#J3s8Urk!o71y5o4zXcZTFMw8 zC+xiYmFKpX>f^iZWyP;FfjfKNy z$s{q=1~RZ6p{a9uHipL6GGwLa=srA7vVMDd>JX;6L;fxdHN=e z_|4G(EpFg!`o&^Yf+FR1(#>3hb0}dV<#@Wx*mieH1!WYT>4ex?4U8R)D%?8UkfWSW z|K}cbXOZ<<7J9U^JUF=|o9m~7@R?#Ki|Cw^`_=WMB#BdJ<|my`T;Z2lOw-pk>6APw zFKymtMq3aB^Y#snch`{w9nbvOGK0_4DOvibc`-M1vjuf|W{mMaq#e6OaC|8+fO>lH zH1W&Rvtln5;_ozmeqsv6?-z{6Kag%wA8qTDgbK005-6E!?_uz@ldaT$z4q!w%Ol>y zar0oIy4_P{QxoOu!g=6(aI_no$u#kVJ!a$4%7baU`VuKAa@B^ZVtz1ox{roE3ZzO) zVTR;2v@&3{K7eU&$-ZkAnev(z6aMx#sKvz!dyRPK!=TN;&Y#WF)7%BZhb(>;XtuM~ z6WcLk&NeWu{&u70rSaM1mMY|0^GPqrKVD=zEIQ|%f4s)N2FAB-x&d2e-9TbB&aCZi zlqx@^58&*GC<{0^!c3TLq!&Z*<0cv7ZJSwCkH(zklywYQ)a1BMs=y>8wlY--+86M^ zLdrHMc<^oset6S{dre)Ch;kVR-X(k?oz#QX11gxI47^71VeSI=L6wz?ii+%&z}*|| zZ-<%hjOF+syV&R$hu9d21^heXUl@%@_^e3&yXh;nvy(lfVLn-kv18x7FMm~CB#+hE zm`>*Gd!!mz@PRp?8p_2gWT45sbxLO1!NQecMTL$L0yKrLXp z9sE4ef*iA}yEZrJe7<(pxSmPK_iP@qkyMuBltVy`v#n|GS1fTUtm)d4L5zJ$GqWli zFAxKkO>|K%XNRpNnMt@(yG;rJicg3{5r>s%5xDiIUvfgwNAmCPAmpgw(qr(hXeEh3%$A&bF_`mXcJQUlGK( znnfPFjJ4;qg$0(GW<((T346QElfaXti?R%Z*?C?IH_z^q6C_r!6On2?Jjcd-0sDYk z;IfP?eu0hoMa5UeAvS%s_~yHoH?h*L%a8D&S##Xi8~Z~tT$l!=dD0qM#6Ru#%(x@o z%u@=Pa=Z0bVmQUKe|A!O?q;H;w2^+>aj4vg3~M50@tZ^}c=o8=Nb=WigiC*GUnK@R zpF<44dSENrir5_^UE5-XP)U`?GZk{WHmmP5=*$5#cMwa`OzHybt_3mzFY4zje4yrV z&xjDX9&?-jn&|EQkaP19uOl?+q-zwLtEUKi(PW(Q5_(d{J z5I|`w&{%b`pQ`Rkc^>9MZ7y1KB{_b2O`7=eTm1;Us5mh!%1J=^z;Ssq<9KQ{)50iA z#0Ut@l)Gh|tFlp0V=AC8D5KzbwBg}xAHEJh9?Y+#XZZBv87B^t`cU$<^)xww@vwvJ z*9dpeNsvU!@_J@GizCuIDkZ$q4h4nh;SU2`+oj_l=QBj;qTAL3{$*$H(xy(L>U2`MD+Jb8%Q9{$H0CpQQDs?aZHa+DuZlKwX zRP_K>;`5cM^(NRX-~SHXs0?{}_|X|5^At({m}=jKOQ<%AED3M})BvpQ?>PR0h_izU?ks?mLr!LF#<|7cTFWQbN5INKMX1hxuW$P4 zL)WFzTa$Y}2%hO6Ni-P!#RJ64!4bw&qXXpTQ}Hj&UIWE^QBKEtut|mqMC5Vq(~&pK z2v>`>1%GC|q_jb800rslOi4vXU5CiKVIW^0zu!H!y7Hhozcq-SZUWzktRy`<3FZ0c zA43m1Id>IwOfw*V{3Y8qEnL#j^YD|o$Udm9MtKrQ!!axmHbdKBI1ijLDO>@1PJsBV zd+lirKy#BWgJ}c5SeK<}Jh z9Ee7!+M97b*XnikPCnS0DW$BetEokS3C>en`0746E5Ly!BO3PE2Sls7uPZYPS3dY^ zWn?CB(ERrO(vkXVB7>{^uI13ZCpgM3&?d|KLeSYuN{1Qj8Py&3oWQ2Jo$WSneShq0 z4JEFaU#PEwze@R?Oc|PT3A5C%nDQ_K2S!>+9e0E{_x>Va|<1cJEg~}hXl$G)$ zt(;WL^()}M*3`um)?IcHVIC=gqJ|T2WJOaM=h~Qf3`C8l<n-_nOncXQ_$;p3 zY@n8$r6oJxPn50PcKO19#`_D^vk>li7BS{`w*`h4K^l#;Q7UES8T57q)F>A%b%CR) z!OPFoNs?@k-fGrQl`?T#oVGum3}m*Gp4?51R&^sXJ~ekv!M9s8JIiL7iSoz*L>39^ z5%(I(v1W!I+@EKjFSw;1FyxgdcEtCtj8jZf4QZCIMz$F6{c4Sf^`|$=H>l%j^|bvA zxJRo+sx{)GELHMSZ|aY|7>IXY43(nm-9-uhAt39@w>Q8Liz!8}_dkA9|9W4@bBaKT zE4?_o|8>i;)gGkjWDko~&qB;335~_}gXL*oJImO_b?E+;?=ky5Z{6_@<6tm%DMpEL zQw})M{zO9G9h!y?4e=v5?85FyPh8&{zfVN^PmbeV zi>vR{7|!`=YQfr%%r%bLR}QOTwlH)e!C@-X(iE;;`yAAAX4r>M?E7+`_cF}z8=EK* zcVtZpINoU4N9s}uod0?e7&ez6%g-Qc2jKY|0wGK;-#Xtvn#PS^s+p{Ic1dd15*-Kz z%7WigfBI!v#w9|H2kRUu(@TH*>(#QL9_r%HFV75MIhk?*C9qqG`t8cc{+aI3RUPFn zZdo!>6MWst@a6rcXcwrk=r7>&vWezRmcHGEO*Cfuv@jA%-~Z4(j~P{!cFv!`m7W zs*-q{6xVB~c;!=O#J5K$s{Xp~0n1_Mm%WZ5G)&iBO8@$j<1A(rTIS?lDd&jvG(kWJ zk9|TZN1yEZLcP?-h$8i*qT}C%SZC+-VD>VV;*H-ok3zp%4S1D=P~l8Mu$-mNULYV9 z?P$S)B1>|@60I8sLLAKAV`jlBe=J4X28(XE1~TNISvJS{C=@2hh~&8-hLoqK1%4Ph ziE`DV+c9bgvlEG5W3nnYY2mxY06djGfcQFmvg(doV4PBaC&ddAXl^F6fugkBI)?{h zPYC1*USMl>kP{gyI0i+t$tLBgc?X%+##cu)vTzy2seOhAg$GERwKN5GJsbTlZDBCS z>J9-Rs>pMc-|bb_Hd@oeR}XQMt=<;}feZJ$3dao;p#mj;@ITZqeG^{KcIx0^0(r2c&c)d2(LB;r4BMHRV?@ZWC^7^;xh z68r!COK|-@dT9T7>r&+Ze$$#g19_FqH_QNr=YI8$h`_E&O2Ax}TO)tC_VHcxBp(@s z^v%dvdlr}BMDmhAKjs;|2F>4Ba91Ed0|_DK3Y$Ob)Q0Z) z3bs8_J)zvbk|`qOA4x6tHSw#2$odo17EjP&Q97%I=Hgn98mj5e*E{qJT+8lM#gQ+e zhR5cg&qOk*PFwSLob2qox$hYIDc}0J+)f($LmacRXq=rL`x5x-(kS3b>{~KpU1t8I z#U&-X*2=p`QYpO8(yM1{rxFWShs(C7N=?g<^YX3L%h%^t7WD@Y1XN2N@;-!8a6*Mrdg5OY z^Et`G-EQU_*OD8^$d13f{mZToHcF6f)_R|Dnu1OYJ#8UGBFeJW+sb)V=>Ap_p1{pY z^h##y$ViNZAGSXk-h^kF`pq6fv`dS>d*6<95+}a3bn~R=b1gRwmN!O5M%T;acOJWK zoV7wTu+8}W+9{$=-GFz>7|oO=zsx6>7WURK*N{Z{^g1Ihj@GQcKXFAuMlQzkKCfjAZ0BmE9i6WcqpfMxl9aN$|OA7sGhmI7;v6< zyE2oN)zT5Z2KG$AqDG-)0KdK5`WPu*yi=+RjsK~PO6E)YI4PN80DiM$@%#73UZr16 zI&DK}kiSlUtA;sRKX{bRaujH$Xwbbe9 z$#*DwmfTGp({<&U=kB*_?!s?{l~cd2KObZ1T-nlYVP@`yz9!LCHd^Nx;6+vl*})s_ zxVN<0?TPgB?FSH&YS$}H)B3YH1oc_Fd6y%s%D&zY{@CPmlOMh%C*R(l!QqG9Oc~;# zFJG}eXJnSGFTOh6-I<3AO#3}gPS0qmWSW){SaFmcBzG-;^?LF&*Y7f3(`|CRBO7xx zY19C%F}goG6?=MgY)EJN*~Uh7;_j~VL}5kjXm+X_<8ywf{-PJEnvc@dE#C_DN5tEj zSrxaY9CG)Vlw=ASEG)ai0WdO5z^XChoA-~);{OEeh6oO|wzsnpkiWn!Lw-D3`pI~< zwjy~{_j<8ubGgII+nZvXcvGg7U$*G60iO}t*C@l>H#}y(6h%LIz)e%+*_Bs(eD+OQ zL-BG*l65q-fLOqMrW>EBHUi_i)AQzPtWf2s8IAmSV;BhBeAZd_Ij;`HqpLsahu&SU z323^WC_L&5{3MBqSxE{W?sPj7a-KNTJrp(VdbLwEI|H-tfJm%#4T!V7nt50YCdEtD zl?dYzk>_Gf&=#KPmEq?L#_xD&UEEx574YigbmT3#IL>$ZoaW0U;tw`Iyn zWx)){tL_Tq4=~{ddwTYomSzYq@Q0R&YCXZMjT2=sK^YmsFa%=R%EUyXQjXZK$z^4D znOD2&&;)ammn#_yX-(rA&O7^yZ)X`$c~O5!D}2Nut}U$m6UsIB6>2Z7Bkb}~+q3Q} z1%AEC`t5l|N#*V!#L|@veS5a9Ru_%tJgu%L?IdbiO8k94MMY1TD;kJR6W7gYcztNR_(RMgH(VH+6rFt1%Q0}@kd7?W+tV+v z1DjMy;IVxWAU_P6RawnHaRPD#>}<7ie5r*E~j` z^VJNS^wPJY0)N^doBWXXId}3rnorYQgNYJh)VJ3rf6nGz>D8&4m9J;JgRFb0`1nG1 zYOA*$&SvfP;uB^}X&IXYs-QhGs;XNZe;eaKARfK7zaKVvqu#-iIScaNo776SmQjqn zFvDY`;eKPcUS2=*Z9S(mmPrZ3C_BY)A%u>05gX>tfwxeavGarFEn^euu~9~;lt;f= zOwcHP(SP_Vt1K(4p*ZE6=yJ8w$?tk;`MF%K?CK1Dhjl{^I;YJX9-6veZe%A*r4^K; z@R-`!`gEh7oQzZVXN3~C`L(}Fb-#5y<1=56NQj(+ySsyllyB^Bvn}QuQ_!$MtH|Z$ zIh)DgGEDHhNO&hiLO!iy$K!t2PB)J1ot>cts=Cw}U!S0 zw*jzeNfwP5vl{ZsgDQMh zY`OhZ>kL9CKF}Iu7i6NSe^#|Ynida!h+}wr?U*cuU|{(ByRSEz`}r?SRtlm&I$yp} z@*Q&;(sScT+yG&ZNoCdGNzZ6IyPi0foB6vNdTDoyCIsv=K5+Q~s}}*=9wPrbPnqKj z{cUA6kz+kY-@i-`V9aU6=cE9WxsM4j#B2@pPAU(8ur0_4&;a`O< z$iLYnnf5)t$Tu1NQlVO-ZQiY(hHB~yM@Jq#w13-ld<5{eIj3l7TY(VU zT&-RHYJ2F`cwq&xXAb~)DSX2d4woYvewTjHcIiTh>+fJ-%I5EnJm+X`@BaSd$7+8v z)a;JnaTPLsm{Pi-Kdh;HfC#t zHs^M=161Pld*axk3+wC3KtgF-P+c92j*%)P{rget3K12^N=0f6tPJLFoU_VcT0o{D zG&B@I8bdIvQEGjOvJH*Y}ayS&-IO+)EQ0Ad%u=F0v-`*HQ zqkuxE+uQx_b_Ib-8;CR)lZL6_?>^>&L5sgu-e(Tf^Q*0HoSclUl`RFe-OL>%C`g(& zcpI#-d=pPR&1Y@v zKt^T&;-B=|ByKzS!SgK75juJ+gG2SCZth}ZS< zRnOwh*}T%HPeFl!+Q}-;K#*`6NOiRbUY+hZ^Ai3jE-o(H)3k;2H$3LDn4^IXR-Ejg zQ=Z*!HeaKXlM)dT%~1Uw9VHzJ8_id$DlfM+d{T23IdffSIqS?A_SD+iIwm%D-g&P9 zTj1KVD~eWT?M4Dzun$Yx6|Cv^?~<%6ze&&9+BZP^EpTx#J(Co81RzalT31mkI#QMgal$qd$G%Tmg{;_?D zeCNeE+++9HZo(@kTba}3`zmm??tuxkGM4#YA#iY%6*XQmf?+fup?JQ(*xueAo_*WU z2Z@P`gFIzJ814{*!8pJD9(EMK1->U8bG`9?UgR5}GiPJQK|@wXh8!3t>a3QGXGwl- zLI6k21{3fmCML_0X1!n8>19&%cEI9ZyHi;jefgpS#%BO3PFn=6D(bSb6znr#p>Pm2 zJG@}c?uf@HCpbYst)lmt(IZSuOi?;t5{jURJHS-1u&`8?foQ@0Xb7*s`GWUqPdo@v z$w@_#kvO;CIk+^RGBv}ct2Kpy7$n%?tKGUixAR5+fZ>@LW_9wK1E?xjT1ACjiysz< zm^^+d{H{)}u6#u7!8p`nmUk>X4*Ltm+AXqrCA_*iI)mgbSfp=k2U7SXz6@o)v)`R* zrZkdR@s?Yt85tcNNQQP`y-;%N?90YH+8nWq^q8oPCB6fYEFd^|ITb>BbpVvhG#r%C^C ze_yK(NI>R1P*t*~{OAtMN90y#yrFFTBeQh&CN>a+KqLR9BhKyv`Wu&atSQgjp45fu zoc;bG8PBG2+@TT|7YC$6qBT-=4%(J%E6wjuef9iXY|PcQHTR3v_*B_aSc2wP zRuXKA0-q-kG^2?_S(C0D@zm??blL*Udc+onD_={G?zq)y2~Mq#4Gww;fy*QuOG!w; zs8Cc=vfmtGFa;7)5-S+c{nWeb?7X~(D(RV>4;v|{sh8dANYB?Z!XK~g&eomRrt;X( zah0oGP{zp^u8sO`Q4#8FDVn<&aW=yfA~?k&$%J>E9`|Tc$<$a&7W}gx6(=Fs{xbX* zdOdM3z@#PA`P5We8e%V@g=U%Xn1_oieusdNP?xah1M>i6i}h?4u|)HPmcQspk+Crn-g5DQ$KHH704knKzeSE(aIE56o3Q9`!^z_R%8E>H!1e*6dCwA}E{C1}i!Ff~2 zR|LJNi@|oYwRW-$K_N`z5KHnCGBPr+aI49pFCqCL0Gxl|Eosr)%s} zYUL#SE?*l=${Y@KoSmIFDD}p@MQ(8&yJJ;&#|@sg^gFVN1x7ACm;rn@1$P!kR??j0Bo z9)n;{r;|nygM}p=dvPE4ch7uCjf{;YCkl(-spxu6)EZX?~{X4Ky zcQC6x$N^MNf*v^?EQyL}G&sF3j|Kv)H(}dNfbK;OMNqyymnjZV{3I@Z8hmnnaTL(P zCx|-hrH*2FWM^$11=Xx6U2F}+8x*D%3-Ne&vEPDypj6ARa{yJS3JQ8SsRZY#L3P~U zshWq7^IwDE*CDW;#d{{epPxd(Zk?vT_1~?UMtu4X#?sh`1JBI#31*ET$GxyM)=;lw zv8J@24QdnDc~1D5PWl_S_AeAu!Bh0sGUor+Ql1WknNN8_w&oe26bFt!7VMq`4^LhO zPa*>G*-7r|+19BaNAV_Tt%VsgSLozF1DagF?anpS0i)zVYpp4Jvcu^{dGfNpA?d_*K(`Q3JB!{pu({BKD1Z;JY>GALP zusKLTpOPZyOoKDwOM}(!yMe|8cTp?bySux9fbE3`VwPND>_ly@fdO?n9jJs&Mj|0; zDNn<`f2Z3NS0fY6uzI(INX7D)TtASw+S3bjp%KxKRCMj?_S4$NaKdih#_qGn->xn_ zht-c~@&L@;Y&6V!i}~=OM!kcl$W%v%_%^wx>yDf5G?P>MWav?~1#}n7JEK!@2ydXQDdi`z7xH|8bbN_ggC~b|*gAwsK}swP<}{esLfP z`lClNQ;x^$AFX%;ZVFu8o&_70`<%sA#QOU(Uuwpa4C2$*Zm*x*fh-9d7Wg4sX%!I= z*TuxZ&>m;&VImy={w>_gN`5C^5R%hQKhUTQc^anbMS)(|rf4n5${C4_i-Uv1VbD9M z;q2zd55uBC?p6w%OdxRN;k3$p2fVsY(q{-J5cRF8t$pwR$>By{1*=jxcjaKY<9V}R zr+Jm>q)sTw;4T-8?s}ywy4yXS5QH^=WfeYrcyy|BdP`T7ti$7>r8S^g@9@!08C`)Q z--oNbTwDnr5*o~yH-NcK-4wC)>kE)qu3rD0;ooMd(C*#D9}aZbeqC%|0zOF4;VmYh z`c1QaNu`cNFn$qjrwCW|7{2)?!xY{XK{9CG;c*AV7CGIn9p>E4td%8r$WfPbrdVN} z^n85Du|3$Bx!}(E2f{?*d=^b2k5PoKlj4}rASB!o-@b*^lTPDRo>!QR2bqv?7(D8o ztFfU6Gydaz&Zi>MZ9}&}&tqj}r9cx-rusl?B2CEZ^z=wzWHMm|8+~}zC{I!DeoV2v}Bi9+?;he!i z;2+{*V*Jjh+kHt~OQ-8Q@t#&6eb0CY+?17{F40g^Q$wM|gp`z&1oXi#$xu!mDe5Ve zOpJ{+;BK>37Mj5aO-E&g7y8U83af(mM)yYhmrqlZpqf@(i8b%W+M56SveMF8`@MeW zP*LG+_qn2o_jkk*$bXsI$=3LE`4{h4Mpo86Z~_euwD5S+?yYR)1k=mBGlKFAgg?tg zVE|HTdD4hdk*;{5I&jyMQKfB6a$tJG(ns;g)of7AZipxek2MM=6xV^3wP=6e^5Vcw zp;(H-we4s^lTIqJb&gf{i-4t#4Kcq9chslT;slZ$pvE-xqX#Thn}VPmMY*>I4BFtF=+Ne1sb(Ww=W}1b;I8hN8A-h$z@AZP7D3vuwLl|Yb7~NH6Xxy<#eN{ zsTrP31T_Vav<|k@9fg)jvi=7Exk(O*_v&hDh3a+fCfUl6Cc2l1^z_+aDz$9XP2EtzJgqxyy7FIKkw`+aW8dq4Ii0ZK8OL9RxZOh3^ z>YF9H7g9sUSwFt{Tk{{bM~)W_4Sn)KqjLtrO5k{XaSoBrRI}&CTf`wlC4o&dl(eECB2H+#Tv!nC>0Q z6*hGxIRR5E2#mfb3q-GS*i$U(9qpAYtP1bM#>C)ja{5#HPge_J> z4%SU{H=jb$4tOixHLNd_yI)&@cX7M9EQumy)kvcSx@P)SKyAI+^?aYw<`x(?A2B*M zc2RC_iP0T^EX6ZfQc32swQU_88JVS}xDSShh9-~`5)!I!fS-zy9P`1zLjeN}7l*50 zyuYTp+QHG$*T-jqGfEQ#cK}Mbo4dNc0KyN%<)7b6+L=_=)m?!%{w;sX#sqgdVXSL# zJfh>TwwULyOT4;YaGw)v3KkYf9Y^%NiXGTcug(3YpAW$4cxBN06s8W!5v3I*fXz>U zWqr**gJPXl@_SU14E7w&RG1?MnX}o0q!@#jXJKK%^6J!V7``fKYg?Y0stMGz6cq`E zK-J_}&|(6Rwl{4C3?~;(5sf+8Q z0XaFj)o@CIjlpze7BHN=BH-0IT>}IYu7Q30tcQb4jV00>sO5s-3M0X=fQGxHo8*TN zKKf4polU<1I+s~@t4ewEUfsh20ga%VB+MTG@*n`4?)w3z3xxSlPR2$?m_L`J%TUoD zoShAHb>W;zRwO^zTurxELzoK5#5@RePe)whUcC63nThiGYbfg{l`k%iJ8OIvEp7}r z9p0O~tE2h$Gg2-*2m)+XlGX^)Z|x(d%kHf`K;>e07Mh~Zi;c|$FMZsJ*#3>j#-J}z zza$w6s84u`MxAL^+pc!UPWAMG;W2S<%K6^zJ~vb#8`$)?vnN%+9fDQibYfhF&2Qmx zDh>`4w3*J|x3sJb=zMB#Y0&Cw>(z(O+aS$Z{o?ua1(im-EdsKpmDfyMbZ9X?c0ep03fpF5;)+H#dSMP8VxZz^Y|Q8rVoc)#f*g^IAPzXWsR&~| zp6l!DAV;HK2h*O{EY-s()qio4*Nw=qI$dYaD(PR`2SC*=$nX@@14;mBm_+Q0DK5$I z5>o1lTd@2SX4clFNlB_8H&8dqg605=K<)d+GdyDX#IxZoyTx2R7BQy;xxCbXVu5mV zAs#NSvOCcFBOxV?3@x@c!qT-C%$OgH1cv&)>cNVK%Giq>LMt71lO^pjY4ww!-`p$< zpq@a&>rkABvtx~bWdiu0nAig*ak}>Q_;I(nBhKx31P$KjYq@C}Chh88U5G|Oz!Q`4 zSc^m<1L5iFYWqDh=WXBxs{6XTmnO9@_LI0QEU|9pY7ujg!KXuWa2|Yw?jbU*dgLy~ z;}{yQ0e-4$o2kjzw;~8=tqnDkKX0ohO7;*@7a}mwx?fH_`-iKN(c3_})C5O?hr+cP zV&Zyv+}xH7wT~$x!>n}1C_6p}0OUN)HUi@U*}R0lRCUMN!w?NawaR=}xdG75YQal- z0shRy6tl_FwgUJ>uJ%3vSp~fO{BvJP9-r?td!u!lIUTQi>NNrNE%zTX&mxcy$yHiU z?y=GAY;v+g|>OhAe;@D~VMC1p`!>_^3FX1)a zvl60J1Sp;}=(1=yZS(g9o?A^_{YQ&%b<=L3d~pu>}9RS&iR z_)OOuH@QU#`o`;Ey8(!du$BZP&8y~!K><{h!uoF zrJtW)e;K0LP|)cW2aIG{6Fi{hDFnvUg{TH*>1pZd%MLjV`?ZL=q2@nG5Qej)hy~nu z_uymX1W`b(GTe>N=~&`|ksXRe!zyk|*^Y~cw@R?CpmTo?z9;k`76ad{sW}g3g+bEt z8`Rz$;F{0dOqxH{D@~u7&Q)6>*TKPm*Q4@-APv#k*=abCQexBQWu1~-T+C)~e-;uF z0;U<%e0+R5cZ_5PA{^2V{tL{p;O`4ItANDBiX>R54m*$&UF%O?{Q?8L#@ibi*BiuD zhV0KE(=xOGv?zc+05D)BW;B##yM-piOx4b}5qebgDs`}*Y0#yA+_H8NE`W=K`1k|AXExG%EtC69-yh!;R5 z;8_Ad4hmc+`$HW$Kp?uAao#p`@4xNRxbpL(+Xr!UK`YDI&FCPp~ zPtWS6bz;?n`=kt5X!P3p`g)K7PWUMRoG`m?yB7E31WVLHK$k9nH;+3_<+egf78Vp< zE-s({K$oU~{$fM?IbH)4pjd6gSMEF>BIv}=Uec~00M|WQ&BHjn42nX4VbCNc!4TuG~7#%jYY+z-Pu~PiFb;Ev5?%N~{PJWEK>df^;STH7)+w z;tlJj|M>I5+(hd&XFF#m?qwI_*uwpkX>lkx80ZTG6G&Hmoa(WR@NY4uw zBK`1<8)uU63CcCakF&oPT^o+_eA&~`U#V!$N=cLj?E_YB5e*teHRxt|B%u3VILf3X zJU3|U`@5&5AP!TQalWoUMp<1Q69f+sI_`NA$KaSvBk&X<@Qs&e8@7(}Evrvl%r_GT zB_y6nP>8dA=+=aU^jq&za|(NqK|VPu>K7SjG_vw=t?kB30DHUs@$XBzU5LV%0K|5F z=*0euMLZUv7P3yOu>!Tlk&%(Z!$U9x2x=u8e5l|Y+m;Ou*qoLasT;z zOb~P)6A~&ZD|fB{Dr{wH%Ip~X&tH5-0p{}jke9~{&;98lH7{QI{L|2O`dfkG;%umB82U-a)M2RHpsxRd(D=BW2v)lT>31&jtMoKFRNg5K^dkGfpyo4OjA-wbK6lC`v)@@9i8 z`uw;u3K>*9pbq<5lE+Pe4)I@c-CZArv&#Xk1E;Dhklru{;QQm%C}2|H>01D^KjpOB znR-3(`)~y){q3&+CNgQJtxahT!qP;quArpT#m8%m`{XDvBpDeQK*m7?r>CWTR>_)E zb+ELr8ycUcS$l2q_P7wc&$7P!O0J0HachlKyUFG8#-S+LunJKOU@T6YkIBe1Dtx+|sp9tFGqepG3 zD%0m^iTEJT=EYqVNM6jPZPvjIdGx4N^y5byrtq+^)1#vv;JmxLH^+WXgRJl!#)rpX zQyP?6(GHJ}?m1Gs&Q0oH97#j25)N=;efIVq_O%24XWPNSA&u`m{x}l!r-3w- zn5gI?96ZGfxL56q`pqiiJT@LS5E>`gZ&V>Umy4iEw9ipH462;KrZRefS93qxCA~%c zNPveooGVA~qW2H0JBwd4Oc4N&WEhm@4VR&$9i&1_oJ&RL;q|taxL{Sd+uz3A93}P# z#4Va$#=uRr%pi1ytKndBV)@4ut0(z!rKX)rn^nH6D;t|eJ@?9mTr7~N;ssAD(D34| z0p$L{bzsMR7T)KfPg$FjqZLc>Krs1SHCx(x`s!*lx;gM=taW@2`xNyZWA~Y=x?lev z#xxNVdI#|O^ean{k!=x^Uqv_v1iB>Y2_d0?;~@&+(Bk7xPuR{>`ZWk^6Mn$P>0CwZ z>ilDxq=7NYt!IIzlKaN2!#l=-r6qzI5nu%{+7$s{`39@gRTkoZTtLtR^aqp#Kfe|Q z3AL<+A3i=PYOI=#^`PGsEtot>2iz7aamPR6PMcW@h= zcAGnY*e<$vnPyV&VAXk)%?L8e6ZMW|399=H$hWP!gE-*%5bJ~wB-M&2`W;VE-In{H z(ZZ0X7sW2C-S{x)qd!tJIy}aUb#K7YGzaN{-@ktYNCFabzuHScyTJB)sj+iFWJ-%d zfIEIf%n}seNe=TWyfaXUmv$*)2 zENv#m0DZeo(QC&52Zj6jC^0|26+2jmEVf=o-J2hKobZnCdW>J5pnnf&Xm zF($N#2mrHB0otf<5sm^&nucUq0`^xlm|&5LjqUNBs1rg0f@ph6QBIEFRiu~kcHPWC z-mOnFfYpY2dd1c&j8m(Ea+kv+`=LL|%53)L8Y1^4=4XO#beVY4j)|{SXgD~cV_PVr z=8xMAb;AjZG(yA(S3=X zL3F;(zDSg(h-i&yEjVG`;ix||;+~onyX?*J!LHVSQ_qwZQ3J=k{cvlw37CmgDah`d z4G)4Ga9qpT=4ekbPMJO0iYAu!mES7JY=K0kq;CZBWBzTTX+GnQ?98>;=^Jk}>|!(_ zecR2Eu6xF`3g|>jrRn6a!o^Y0Bv!n2|5T*9y0U28PZ~74gr9I|J{m>&`=ed8U4s}_ z9SgD5CU5;|`+#gZXA_(D!GDNS4TlvS? zkX(Ji3of}(geC0S_|jv9jW7x0p;pA131 zY`p;JA2`n+-o4Yd_E&pay~=2*vd$BJV^+egCd3Db@h?PQ};$qSO}o z7NAE~a1z_@Pa+;E0TsH}f)*3cp!H&xClH|nZtCaf3Pw7*2Q~gNh&maqu$Dqrjr!*T z%s$~-ge@sl&m6DM*-r^gmA7G_Qa#p*7zpxC&o~U8uE$TNdjWw$(C2fpNHA&^vlBJp z_2P|O6mphdhGI0Gl+OJfrjTeE2Fj%H=2|^QbyGYs1YYbD|AvbLsI3&*qb2sH8mz3X zEqhB0wcajH5{~4vLngJ;L8(=dMSwYzi9boJ-r;6w$^FHVByjlu+3As_xU;Qs?BrkH z2?+`PF)tS1so$21K_smD%UDm7U_1zf%@)Uu>>zvHg;>@i4Cre6NO9XSV4$ED3bx?( z_O?@L@+bm%!dULpr(Muj4AKN3_tf+A1Yn<+FAu@9jX>6g{k02uz|AV)?OA^FL~rbO zO_f0{$&!MH2gu21Pmq-8gNF}{>A>an`%CqEw2naGb)Df-|MX$XCgc&0kug47?~Wv~mv zX+uLpXqRXEDg9GWt4eeQF9MUPYX66^_m0Q9@B7Ee%&wHZN|LRtBgu|bLfM;!giuK~ zQ8J=rwNOb$MiCWJwiL-GnIUA$Jba%=o!52U_x-(pkKeb)d7giGoYirBKJW2*J=g2^ zc*mC4N$ub@g1ic<1vY2EA#t;Bx6X^P8%0w(DMB zXZ~lm$Ud9agS#=?(Ry6I#cj8Q#I-Y0;S>}UZu%!qRMbsB!K4Kd;5|RV+^)(>1H(iAGy&ves z^@4cL4A$HtwLq`L$D>ZqhxvCaqt$uAicaz$PH2pw*f0HQ4ko)ID{GvkIf#lL-Fd42 z#&?ES71VxRKlmXl+2A#|l&sTq(_4xRKR~5|emIh}PE#HIQgF`Ls$9?$m)tDQB5-*c zb~hLpi85j|oGnRDugz_K!8&kL1ZcWoNxaAcbHlqA7U#JkT6x4lOZ+n&mR*~|o>X8| zjrA;f!|M5pCZ+t zRfjzwDMXt!K012COCTgaLQ$2aB8{e&yhMd*y!&;`_Uruo{ZNV5{%MH5JQ5%zv)!f$ zR=V&%TcTpzjc5nNS#MK#fp2Nw`@c6uX8ZnM>U|kG)N4tyt~gYFeD4Hbd6P>%o6uEQ zm9+AEl267V+Sxn!SMqW3%JomXT&g2DUiz+hObmVcq#Vg}-frDrOgUd{UH-a4yb0#3 zbrzhHt$Hm13WB5#kyS61t@1kTkQ8OMdcJGz@R5N6t(7;;ch;O;rfoKv*9O|7r~u}; za~}zoyD3}&ZOo~9dH#aGoIk;4 z%X+(G@!Ya$yf5l@{WbdwSrPJq>&kI_2XsoPTN9s}9?PFyUAh3)eO#7v;C>!>RLGjl zWQadLagAGpIe76j1Y6?FXh~+KXls5@(1x+K)6&GWV@brs4dqJ_NBaeL?K%TZH{$HC zrsKzE_CK-FA?-|k{MbHT!V<3DZ*#L>>en-fOEQB23zrVrl;*W13YFE(cl^&r(&?jn z@4vf)D=6$x`A&8geEeaU&re7WkCOF0U`uGss>E@fmZ zpw#lkC(g}t%u_zsngw|A%iV2iOv$%gH_Y@MiV^a~J=VJN$!>LrZBYxEW3YPrC4K!b zS`jg5swyffu(-bJ0N(#zSqUX@1IhFO-jC0BZ7Fytz~g{3!Di=w>26gPIbQ6;j@#X3 z4Ti(Y%4Kn2QEUU5ZStxyP`0u_3QYF}r~++RXqcWSG;v~Ia9jeG1*Cf!ZwmSYKzWL* z^mpyheJqB8BG=Q4UJd7OIfbFZydQPbbRXzd;!zg(6z;|NGxR(Ny+c1IFJA~6FLc62 zAgJ99Y_8(8s#^(KlML(6&lc!6G>(ftfKWD+tKnr-*H%%ZUP(@ZO<4f`y0ET>*)*TK z_RO)bUf#aFd0cix>b@OcootZ6c`5;hbD3`4~v=k zIuDje#W4&?_T;`oRNXP;$GhibX#2YiWvYQx&fyKpnRaCdJp2^|`1#4!mw((l|4`Xq zLZXdJ8NCNPtK2WV59#}Hv;AQJR6GYNDH_(j)@*DZ%3H0PcXvKLmgM5*uQAc?4^Xc9Apr~)R%Y%EuJA47 zdOO_-Wtqk{wj+%xb(3f3J2yoro)PtC{*5l7}>CE5QHHJP&!up+9?$t%N%a^SS9Jfj|QUzzndBvV- zpj_LN{4{pKEu27g%x<9kO&)|@ZYxLk4V9s1ZwvvZ^CUI(eR96o)M_pctNIbNQ&4Tq zKuMKh@FmMCs{t*DgJ8tr3F~)01i29aO$ln6013B7?PySTJ?uP^nu4OcTCORF;`BUcsJ!a_kywhl1$Of@PJ8_GEI;2T#8@`q<$!0sww8SEfxe}D z#jO75netiVttQueUrw%9y4~E|yol?icA`GE(yL~fSqjrqLA*A2~xF?s2?h60kUc4|{iPXp%?pgEWcExbrW zUqM%%!mrb_`s4l&x%GZobKc4se$%R6vXb6YteH!sU(QtWW2i{uk81jLEGBieqMo^b zDYL?hKz7USc8N~C%e`xG3j$fcawd`|E7idt$c@j|O`G1+rJNCv5~xW2g7bW;t(l+3 z#G~%D3EZ`g)kOg+{W4$Xk>e+Py8N)O8W2AD*aBe(tjZXBfi~G;N zWt;nG$skZiF_jCLHp~K4? zv>cT^JlO9reFheE?A>eOYW-fmDr^5Wban#b3eXDqqh^x*Oy##N`Qw3YM{3WTluWC7 z6vr87i~6+}9agTXs;-v5#@*YJDcVChoovh`+-2|dAg^{+Q!Sk5C7`Pf+srq2?TcJe zZQJ+wjZ5h8lvHk0d50JOJ@b$if34~B{l8l z^87=qxTilmivvd<|szfJo2$((YmG`X~M zpjyReW=7bOC}Uc8tbUdMVW~)Xnm7}EBIg`a=UGQHu#9c#1 z;SaCpIo(gS*^iHpZ;KX_6i;v;aWpL{f#-;ixVsARQgoHgj|NSu134P z-|(Sfs;2Hc&$G--bqbOz8+0cYV@e z^5I0&S#Ftd(Ina}klb!4`mEVtz}&!OWjNcAGBq;q)lYR7Upbx;TJq8rxM;-nmeAEAUxh=)Zt8>YqRiDWS2?;@Q#0FL=dYvS( z)$Z;1SXxzOEJ4$FoZ&0H@)>P7#M)jIB=T(QuiPlY11pgQrE!^pcT1<;{gKEEsoX5h znL0S3Q?HO<@pGt|sK-OAzd0QUTg&;$XX&nz`*6(cpEBhAa?UybL0kRcwO zq)=vjMC+Y`G`V8sUD4hNFN=P4yxipzdTHzOFH+M@{k#nXqqsX+w(g-ruTdqV#{Seg z`)^6)k>yHPG*75t0B8baAm9u`J5i98Smzvi=6Z<%8xIe3Q^7rGdvp)~-6UCgp+8YG zgY^vm$k}i}avUO^r3-7z^V$^c%-z7(W5?_76Snx3v#R)`2Twf}ID8!tJDLUi9cBFi zsh;Q;sN*Da0YF-O2REx2PU2>_T3WjEqb+P`m;`7V%b0xCZl(YH)_Qc_C^6|9PbHP; z+$i#bK1%+(&yKavpG8q&LfFQ!=VT48SqY1xfD_eDTp!Zvz3Q&A85euaSKU+K^(40a zqM7!=e@fEW%9b;xeUWS2t6`{~_E5^ejv9qR++irSx$Ij~a`Wvo~ z+@=Vcx0v*Lc3HXQUg1=$zvaqfvXbfayILGme`}BZ{-5{>0k)M>w)5phHb>)bo=Mtw ziEaa5BKwaSD02#G$g>{RaDzk*3JQ9{m%)yLH%K;1s>#MSi2tjKhU$UK6P<=1iI3he zZUoja$Ug&{N#x zR(Ww%%mr>GlhE7?A=j@T{$p-t+PkZjlS!*{^Q&;bZx`yeLDngRH zS`Yo9%i1Yfv3b`kNvodNzYRqA7Z<)!mMR%E5N=chP4a@p?j_U5VMG~a*deub%a$EW zk%4NFH|Qj@J?DQ$%Ew5RoLIKb;j0*n@K9z?C~)G-_gf7u|?@Y_8P_~e7|K4^z=aa(F`3tHgMRF z|47*U`s2p!Gs3qiJY>6@B|qpEK?i|fFq^tdff>FM7KR`3p$^I>By{%4y#)E&n zBF6lOT_vdh@9e4!AEEchj|EeT%ac9ML_Y{z$BNtr?nXU$Y72cEJjahr)&G#V)3uFR zemwshjv+ZV;dAj{WUG%|G`GVB=rvFMi_Y!eQtm~Na_KH2^||NKRFe!hFwB=n>c>*F zw6p;G{;x_$yCEE`=xRNHo+!BX!Zh_nCieIKC}@L7qQry6B_&Y1p`zTmc8<8Z^jEu> zi=iK{&NT3{3hmsPr+)PGb)OS!dL|}|9i@py;(1j4=Wiz@(9*9*`R?@(|5-y^ zUl$0kk&u`p3mXXydrQrBpH_IgNW>8fm2OR{2U2!C<_ zeK;*`5If5q-&?7rlg#sje%^0ZjDAnJ$Pse*mR}bx_hcMT`}}<0?aCr-Ur>h$wVxAHh%$X2MvwjBSPw5 zt*oq|W1h?ZORBSTU#%e@bRr2ZmZRledWucY*f-Y&;)sOO4&VI8@G!z&UpaG$GBYq- zynI_n#kg>(yxr5um+|=~!9SV#QM6vS> zgWk_RV|>FeE*_~Y;kX8G6uAX;8|Dm_)nM^{{rXo`VC%{-KS`!|GcvMem-F#h3Y5>< zzBuKpbhm8T0$(KDJFp331T5sOrUduHaZkf68_u%6{)H~OUHZ16z5T$oYt$ZLGKN`- z$o!L5){dpfm=B#dKGyq;lpE0L?BpaPEsYAzcBqjSTB{ReOwgOMv$6(L0FTN4z{h5& zTv%ABZnWQPF7&|%2AB!71-xuFlC%Q+4B@JSDwvF@cr!d4F1(fwc0&SuSyyl4T=9VG zH~1@x)zwuWZdxvHbWi0?C-TM!k!no$5BT2Y*)dTu4;sNHP5XEy(L(QDRrr!>2DjdG zt*p|0dIkoY+1W?>`?tr`IypN}r{{gcZEVEL!}DC9DVHATL!CvTU1bwEsuO;A_xyOR;b6%TR}FpBL#uU^H)R##Mv@Y9e4vieNIONq7Q-I~XQ|A4O= zIZa*eWQl@Jy5fMSaSu?I$nbMH ze;$j!^vdj06LtSNl?KT_pCI_*+$-*~LbVU+j1c28Gcx+((gr9a+5uh5PalZHfT3XG ze6X=KFnegKt>MH*-wr+c#Px&cwuY za5E~z0#Hs*p9&cfLB*oA*}HeI42(&ECldWj*rO?GG{JO)XW&E&VI;WUlG)00qVwx# zxss_hmaSVuxOv%Ny*X0&_qjp`8gw0KB^=ckQKmx)xMey7c27G%vT6lE!8q{XBN3K1n%gRj$1{&wsbDFbp+& z<>Yu}9a&3#T<61K9NDN|8(36Sgq6c|kXa08So^vGw1@IXu>@{$HwNCn&%Jnb#eJ&l ze5o&b35qoO+v9z6nbxb_)*kK;*$n+T^_WhcK8+pIj-}Vy>H+oN8W+L!!z<@5CokHK z8_zmB^ITle=By?bC`(DXqF9!dm4%C%^CQiPQtDnGHI@pMgZ>1PO&n6gy#zfYBM+#* z-w%=31cHWPqr2$gv2gUOAk9T}8iLd_a3tlkcEW_{d-oLWDnfxD_riWl!C}8nt?ubr z6cckC9j=+#-Ip)-GH_j7m|H1MD_MiIL0Vcm<8rzWE!l9?D8($=Y$U&@N3O7 zg<=s_N-lYqU~=K&3&Tv=m!Vm7buHT?4Z{%?{kDr2FZO0)jyN?HRbLzkSTApH=ryez zG$&@rrD47kh^cK1j*mBng}zDx&IxZ%PyVy2Z^3nC<))@mrH3P+qM$%_TqDZlinH_c zs3>NU>xWF}s0jQ8mU+vYs6q2p?TSdm=t;m-i}Nr@xWOx1kMOS9Bp+}7{jtQl_fu|l zs%mN*MD>?nTGi`Hdsp;EOd^Xxnj0F6soTij09x~;vwW28OmXuo(SzsCiH=vt;>M%3 zsn}dKQ2K&s z)yv%7+F3p-^M`+~)|zUec-YQ<@+HC{WPg^{VrfS)~<(u$Sio38GCr#%bg7sZ9!lMt|*uo3NR-_a_0(_djC!+m+~tgtDA z-K9(OpsVx+{=NmPBTTNHTd&TJi4K1Y1cQR>`~x2SmCKjqXUh5f7FAakwaiC^6t96$ zb64AWjZ-q1X8+XUw7thNNU{5NoqZK4CT|Urj;AlU{*0HoX*aL^Am>SEg9>fB;Tgw| zG`gi16O=1kHwE!uqh0!6UQx=24h^LX2E7(4iIl$TUuFp zIfEz)M`(7axpT6z#M+O80M~`v%uQrJ9EEBiUrkz(B_AsVY{Hn}nIQJz?ue51KUr$f! z2vz0Kp-;5S%P;Pz-$M3Qx3E+92e0e@uEXquPu@rrCmj|;N*^syx`}F?D0=h8J>tv) zEf*JRw8xQ3*KSi}c!YJ72a*Mml6`u*@)a@|$bv8{HyEak!R2*2)JK(Eqnb zMcpALIJu-mH|EX9&|L>3`I|Y-vVfnrar>`5($cTt_D{3STO3~e{`Kqekv4$A ztSdWPv)K)XNRzT{n*c*ipZK}pbLsNsfobD!Vih<1NqrlFA#fNd(D3f<^_-T6lRzNN z@=!xM6KS{ImCI~>T)uyIi{HVVy1<^Xc&6E1s5#jC*>#v0tSSao&YVeu84!>?)J@S_ zUhuI4wvoC;w-OBxLjElZlV2V4VEn`G9cm0l%t$ML%9n)&j|&%OaqK&uFO|C&vU&4n z7%dttjvwD*AZeTAfl@M;pk?sZZvNxWryNcfKI5G3Nbf%_a8t>t<@Aj>xgq!G@%GZ* z3a(XcdhRL();{ZK6*eeBXZ!LrnvFq=KDgQQO=BFpiHX52 z6@G*?q26buL(~RsG#W&FQUE@uhv4KY+dMnov3HJkfj-9viq{>^WpyFTIIl$i9_rRV zb8cc|A`2`mjCa4Mlw-57^Z5I_p-#IF9C(+Ss_8bdO*H=Sq0+yHI<}JIO67EvAi=fo zLkKWMTt|W%VgG<8n*Yy3ZND;Dv*`(k=TnrJu%(I2g@2WxX(3&xLEL13FmRD>+k43I zKJ><{jvF}q(Bd9Ec#UP)Zd!7(wrXO0yf+ad4f+rq?-rwjgLlw8#Kp-Wo}sTmC{Ka) zT>Sd|e)Gy(E$?~30Y*JGQCf9t{_b~8kRX-3yz>%~)m#hWp?Vw1>P?i>uhraD;9yzU z1)&;n0~B#D&gG8aihIe|a{k+!5JL*lnn#-9x{zu`a+if&ji{-wukY$IZx8*T5)|0k z_$=3iUtfzlB(b}qf~4Z@9NY+WQJc&r7pWgpUS@x4A*rtM{C~>(n^{hON^z6dU{``K z8arZj9*(5|`7kv-9e4pq9~(-dC$6YmTB9?|&$A!!BQWT3S`(iN{V7{=I%SS!kj|z> zEd#Hm*#>3%6nR-$%_)9fR_hr3u58lzv<{CwN{z1eb}^G&GQzb+Nx!#t&kji15l`Hq z070&Zq0lj zb`Di@1zA64`O#ILW4+?Wnt5IM=5kj9h@X0cAdMH74%^axpGB5)_u=L) zDN*YBEL}97GQE>}1M77tg@Ql-+xieH@E^H9`-}hnV`(VKmywJ+V$Cd)sOn?J8Lmg1>k$QKJjZQaXd$1l#yh+VCVi%yJ4{FfA$Soxut_-Gsof{nwprD zT|-OVhrFIw#M>19tJBvD3g)r&LvDj$W?Zp`FPLP)Izsh|$$c5h)id_?$E~cgzeGUi zg?2_b?#P3E^PsR=JGe^M7P^qFm1f4v&Rzs^8+!&I$pcY%c2)gj=`Mwe7R-+Xn5=4t ziSjhbsdwbSK~fUfej$a+SB!>XzI#4i*?azq0Bw+7IMJPqqZ9hFL~dbGQAH>OduK>? z4Ge`x&3N@HY**3IEJi(1?)-c9Y<_L(;qfXessYg$Avw$XOl41Smx#ovFi}!c7V9M= zB9pxArY)iMvWJD4S=}U?iXkZECWk8Y_I)I`pNE;HW#sW^gsWO1Z{K^!`b3g0 zaeGJ0+0UP>MuYv~O@LG6gN&nHNCe}zb#ijbdj1?#H@ZJ36L0n@75u<%<6s%uzY18g z{MK+f=Z~{3f~bThUH0ymZ{J8MCl>X(02Xd$+iENhY_M-!gA&oRwy9|bqFdo3+S+=n zvubYLTh}{n?uCFMj6^sTI}Ek#Ag27+SFEKK1)^h#+XLS&y1{P+g_Ick`E%#O-85`w z$2O@uE8SnbbvT~F^+)lQ*~SV|I3Kz<*VXboYo}r}b8{f0QU;_JN4G-iJMST4#dxse z*w|QyENaQ3aM|}a_$JoM(zUX<7f}CkC54{UTp>J*Jd-|qyM5jTzaU_bD8HMTb>6H13}y9Pihdw+=TCA zVF9#wuck@uJfHJ{h$$$W&0wJ#)DyL4l2VV>s;44@Nk8H#70AVOgJ>YBy&D}rq{dFr>0}`Ub!|ki18FY1Z z6DSv_choZ5&4ak=rpbwgGtf zjusq)uVeQ88oBe}fhC@=u`!#_c8~?%esFv)I_zb&IDuow;Rey2ABj}BilNV`+y|St z(aAL5)BBBt7q-x~3Vm|~*<3zhauv`2qWBXQ$ZVAE`2iKoJB<|=8Y?d+$H~F5m5ps+ z@t;QJ`SsNAFe(5g+T!urRizXAAY$&`JbiflRIFp?wXGau1L%m_&)V4`-*V?lLATxl zS$?QT$aiH9QuXgVYAi}qu}sBJsYgWp5m~i5^HH+#;W&Hb3x7I=fe#Uz%!dl%DMF`6 zP?|lZ53G0xk5@KrZYeU@KoQpdqwO)H&OEBevZQeZq`mlMr>FO=Xtnr#_Ov}Py|B>w zF3Mo-Mt!=6h&j!#op0;bR7Yi+7SFhSl4r+B3$^yVXT2ML78TY=XAOC} zTk86SwDKZ#CfZ2_e(~!0gtdza|LsZsZGaw7j(Ps40eXJz*DserUb}lC!OH2hU%~O+xb8{&J4X=?(O0mbm7`(c7~ZFD@|khgK|dwuVfQ3A zRCK45;{crjy)oUSn}(+5?x#79WBT-^ye*4;@tIU-Nz7oobXT*$NnbmnenFD5)xUbG zbxxkujk92|SxTTzj6WH5P&u@vJpDVryUNevCwZl~SSHqxDe`3T)h3r_I2R&C*OC-@ zs(9R0+MD5R|4SpN{G9y*0#`@K`VE$Q% zbyO$mIexHOIs%$v_wFT}ipVRGS=M^KW;bx@KTVb9-=-?Ls^-qmW5JP#`qg2*{Lr;u z>o#A-&rPE8q1=tOR{g(?CrCRHV&&W|I$MUIK5v;Zv^(_AX0*R+=Yd2;fUd%y-En8# ze#k~3F#!zV1ETNVeFM%BZBct?Ctc}k=+QQlUd*2eO6>UC?1arq8HtLqWbyXNN>|Rk zefQ2vCuWj6hBS8r&nyxHYQ#|BPF7Z~ zBYAW-@R}XZb(BC*vx!G!#l(F5r(3&ImD#$3`kyr!l+TzKyh-tx*1l2bnG2uG8% zQeI!(dxFeenbKKXn|9CkcS`#fUuI^~+eXzJeO$aXNR#JPQOCHG=E>*7c5N3P(jW3e zW|S$Uv%zF{gsSwp2+8WC4SR^^a{Y-S>KK7>*iHS`i6t(x4F25({#Jt|&O(Y3|8;ga zcTQa>`P1j^Ji=mPP@v^Miss1m^ztIb%dj#J^4U35Z6%Q_GLf{%P2s?A5l1QeGjZ=3 zug5>28Pgx&dc3BK)EXEBfCL^ow2_Kp={oyeH%)LMp$(hSdZjQzHUne%=uTA)qClwX zCS%fHzbN*fU@CP~^#8c2rBD9%A17@APnNXz3{wYzJug3>yR|&iIOp2uA~;rHh34Sm zisFyKO31c5V0k5vMjIF!-c5xg~jtltGMU#bfknVQzpxs|!^6&1~dJrK4vEqkS! zGwtFigTPsei;0b|yqlYTfh1A*#O<&U%+0&-*5)H0Ad1cvA#Ad;SUlr!Id*n+nO=dE z|2uI(9{HT`7hewvLDJbzqjeP0*LIUsMv;Y3x%BF+t#!1v%1sTG0SZQG-RGZp!~@E2 zka)gk$dI;p>*0)oR$cvSmFU)L3|qhATKU|>C#-VTW;DKYDQ3&AB4i}SvXmz5!WKie z?;swLhX3PI?y~&#<@s|$G+=W@F22@%JU>18~e7w9r(Z@n)7r4k} zu77hrk=v1O3?Ry-&*S7} zg_}`PNeFQUTL1jH_zXv-%xRDkU~537$jQmY#l_*b*$=U>B9O|Y8_J;@^d`2457Wna zT7U$L^umQ@3LZziiJ>{l2stnzr%KQSe#}22RBrrN%W!Rel|-eCWDNP99R?f-9y6Gt zo9cS``K(p6FwMtr3M?_u(&~w+dj4rm*zaJYyt^_>9m4XVoXFPqol>{7qRR3)H%q3L zvqj(N)r-$_a?Z5L$jS))ZuE-O0wzL)?S+YqA6a4Dh6$z{MC~oN?mj!RFE1>}2=*ttvFV`m3v8 z-QJM@;)R-B07Z9DYN916PR!W2?QhrO5QD_7Jol5&(P@b7-hD_{w<_|(3qO*6A`WDq zzJB0Al=RLj4G0?D@fJzT=%IdcDcX{v4PB55#jlHyCTW!*)-`mXXwXqwUiy`6MhM{E z$av}EMgFKxc$KGOJN;=C)(jMX0aE5SiZZb{dS5|WLgFTm`W^)W;l1&FuZk*7E?BkJ zR#z9>LMtikp{fbuY*N_HV&~b;!_AE+_I{tNNxzZ3k4PoyDK5FINbA~=@$zXL2(HBw znr`8@+=o8!z^=J?3c!#6`}RS(ik=81Z&*uOLxk3kaz8VT&yUX-`VgWYJcvA=m3AKs zFd{PY=#e7{O4>~)a$b8(a5`<%y|pbP`xU?fgSE=7A4?)58C}k#A+8e(5TW~C* z?hJ{=NaT-T9N&h7RDww`AxNk%2l|xjJM zO4UIxf_{FjKU{KZ0>^L41)54Ck4-i9Ul>K22+iW3XLQM3TPFkFP0Rn)cD7k^MR0nwpyR zW-`|)-VdWDcQOTt#r|}I@&yX*9Y?*&ygrp0h^>uqDZ(C~aPOWsrVc?V7OH22bnKtK zy<`KornnV780JqH8jf-^I}ZJk!5qv-g+ynaUPta%+I;h^#RKl%<{jINLk&+_hbj$P zYEzjy?lK}h6iV`dG|4@CZu=*i?5AaOkfdSV$jsd4yw^mzN_^LWma2cB$f2tc0NXlh zCQAUlq#Kzv)5nUT-ub6FxN>U(i^bPz73$EFO1&x#84N|H+C8&7y6`|qW*XG(h}i=B z2H-4<2$AHA!a_C|RkLSzm&W*MP^Ft*LABlg;^tdHLLU&v950rYuhz+L-*y3}zH~wD zd;9JH20D%$S2|GrE3ZHe&2#}4Wptq{FWU?dW$1MG)P6snVSq)7*J&CH?yw=#v&bzciA6`+p9F8* zmPXxOp^egEgt|8H$B)xlr+}1|eYgmQi`##B4u2u*=`&~e5QKW}qL0u1Qr;R8wF^lC zWDN|pye_-N#huTcd->|sJLE%3c&;rMfc!W}D6`rLA6xarf8jAy=z{BPQvlvi{d`th zs{Hf)=5^Sbp*f%%Vhw?|mX{k!wSq z6*6x5;^YnNd$~8bpMpjVwVC)Y8+3|>2j8zHw>f+EMx`h&411+$it#v9@+irVX={Pm zkOg0YC>d005B6U%c+4IB+i4wwC>13D1RusSO+4_BZ&9j=Iko4eq^IAAZ9~$d^*e6* zeS2yF@7kJHt1$~)js5nw5wKfIJMiS`(+`At-MLieaVG}{70w+owXV|%()O=#vTt5! zLHK3g$!Aiq#h*0Nk+;*x@7`L91j9<3012BRZUX=0lJ7&R09U0nYi^`ZF?|X0YUD2E z)wK{P4GK@DWi5Oh+JY76s2ZZf9A0(O@XwPXuSt?DU2UqWqOJmmocT^GYi)7iFlwM( zyB^XUE^YptbYCIROY!nM$4q|Ih;uiZkGNNL8>eNs!FX~E?atrFu$oUA=-QVnNZSxRp z15?_&$-~x9tHB6D8vAloKv3`rW-5h%(W&2v^TWf#V|}q&8P&vcVJTcm_Ck!Hm3oS= zfWPRClI*u_U%!p{d_G;@zLg+Sgq3dXZ*Y_58U0X4Q-ODe8IhBM7D)wKYr$9!ZG)aL1d=vS8 z&&E}qd^RN$;hy0yn>(vQzMLtY22PbxJ17rVB_9Bu63&#@{?)f z?1@q?fYHm{e0)}6tOVN!F(wWy+N&YvtvS|w$hp|I?KDmTY^@V9vFduB&?~v|5ZnbN zY(gN{fWoe*sk4)FUPfO2UQSLuBH=-N3P|7EUx?bk#WT11XCB~ z)f7tGt?o8LG{H$+y$5J-BFiur$6tkmgJ z3JM8pVVQR%U>M{|!+PoM7KMU%0@9TlF4O;|Y~`oRLoRvv7JIn>kk8X; zFqKxHwY5!o#QiKg+bY-QJ(k*%;f*C4H8L}5M%7dN>wvrVmX_KH*O8wHakvo~ITVqT zz-`kN?7H*UZ9$qwMThO78}2&)*>daw;Dyj*$UApl1UCir69?Z`({o82%5MD{ucW(b zYY(k=f?7dy+SJrEDB_NRMqFt%<%B|YCU!2adkG0r-qGC|Ru@PCU1Imun4X;;C0QKT z^@M{gnsM$FzWiEIp#cfv=g*&UZ09E+`K|8O-j{PlB_%w*h^^lwT73$8b0j%sKQno# z%eJjs^S;i^xZnS9=?D|8p9-(UXepQGdagfByYyzyAHsP=ca}jFb91izt*d%^dSx8e zsh4SxqEwX)6VH9zX-tss(msOiyy?Urv3*6EhCe|MVH(Dsm^in<2o=aFLf4-%F#|^L z0?mU5UmX87Sk_m5-R%4`;v#NH+ej1><1ARQdcm-zMwtsIEk|0*5Oj zv)!?6#x>685rLcb0Mfcnk4o?9u@#X@wP%5>yt(;=5Dlpzo%3vXxL*A(QCZXN`T5m# z74{Ae5V^tSOtNt@v4GrN&^X!!#=PKZ^uMe!H;n^WdmIgSQ{q_~mOz5qT5&Ur z8m+(+Z@ZXEHGULD@ZN{VG}PD6Inr>oHXpaPo}8S_$*F&CD)!`@zruI)a-hvppFd~p z+#@5CkF>=NBs(=c2u%VQ5nK0tgCeBgJNhA&_*zJzkP)+^m!D#vU4F5Nm|$d-iCFN# zc{X}PX+vQrDI%hiVi__W$fMvnmE3-fhlSqr&&Mtc+bZhH@1upfp>|33jfpVAh%<2&u8juqd13H6m2?XP#k3MX#W16!__Jp)KgEu>97xr>;)9=YlbT8-vU3^=jbcy85{pzJWqP#_K+Mt zFJ-EG##5HHgoM=+{y(4ZS|gK~MNuO{Tz2i!5@XseBGR-b&L*(RLdt262(RI~474NHuNO0f<%5S8*<_2|GgNSsx4`ZMlB z%S%g#a=IljXJB3>3GQ}xpfb1jV`M=Z@)m$#_v1jCQhdcDuRV>hD7CFv$!w3R}6Dz)$$qW{MyCL-VI zsnFuFHys@r@<;{{Q@+7lKr6(8660X-dEUAYh1F)*&{PP3wZpb6@tC+93bFVl3~l0! zJdINl{i4uBK(_C0#MP7i)X!{b8q1G<0H}neL5d!iWUFJrb}LIuCFsIw2N14EvRlot z2XUye-9*G5`I~PJ>aAounGbI$h?00*3bpV)3Pm#HP6bu4{=CJ-M^NN%vnH^P2YgwQ zZDT59xug(cGg4uk@D!p;tCN2|`GdYviVB^kuV2v;r~D+alHQSk5>qF+of5V`blL+7 zq@M)ODLBxOegjrmK_k5^CBxAs#ABSSN2ikdWP-sIcUD zAA)a)H;JTLSuRPW5|S*dzzb1o>=%;894*(EtG|H zu@KGcB2jYZPR-??sEVHr@3^Fs^6gki<=Vs(i&7AFNY2AYZ*iPQq3mo`s{iBj1JQ9? zEFVvHbuZfGnow9LV6&bNGFHT7Lpl?A`%ECiM(~8)3pJbY62WV?uyz?@5)( zI7#c9+&~CDZAlMG``CLgMd)uI?>rnwNllFjf8H3qfM1r0{+5>Cz_&fm5)=_}gyss; z=!nqJ#whdiG|^l-YQi3&h z8`4wm_8@;c3h>d6OUMP9a67IZ@~Z()ksQFy%1SEGhCJ2PDFo&BATdJgA&Nn|D|r-Y%L^?y4^--! znp8e zo-;UeC(~Mjk92SXocvsc4ZOSF9z=i#G<3`09@Gc#IsFFDjSvv+chFiYDSdlZxr4Mt z^4P~FQ0AUAF=@y8Nim0Ulx)7`R4qmUsO@)bb&%O+JcD)`t}Q%8ut%{v^MkcpMn&(5 zZPU@#c7<6D&I6eqFynKjdtQ6~fWvs?aXx*bv%!PAPR8$+At*hHSjmCa=S0FB~N2i|+ zF}c0oKlC&HqgKk|8E+LoX^%YisK9ZBW!Y#ShV|s;-j;=p8jPy?VHsY%x z6Gj(v6!W@d7nhgm6dU`}-ojKllE{EY8CO96z*5*S|sD6)V}6YME{av6Gr5{#Pi-g`=TCM zo_*f}@5+%^==8_H#~H~SB8HGYeuYu{$-L<7wb#-Y53}t`N=zJWVUiQe78Dk)>FL3p z8oEzm!>Fiv2l=1qj;6djv;pq0S4rb`1~J*vRPN0pCujUYED+@y5lzZBD=R z8&1?(CP5*gpIw1}#zoLy67L`{FFK@XBXf*&J@322`rYExS!|d?eKepSaEv3P3DiDk-v?;X%L7~QiGqr(#68! z{?YLOzqi1LBW~Q-G)>aNe`iYe%Yzx&d970I+B8$Rt5g7j`I~c`NNwaD;^x5$#ew=f4Fu2V>1l zh9>FYGI<0@s!t!T4dI{Ch(a``GX26614C2G! z^;!>LRRD<+nW&kUS#qpeMY&1thy^=*V2hplNGkyF8;~96z$+g;HeYiL~BTQwl z(*FJUb|kl|uVO%5A1it|$hMwPiMvlDqY(PE6Te_)h3M_MQCH%A#ua*1rt2Gaj`#LT zT^!LHRVj+a%Tj$-eg%cay?hF?Dw+qdMFgeA5Whr!Jf4lUIVj~w!}?KPnn!Ojy)t1NwVA=lb#Kpi9Mn-1$hXJ#G8NpTk zrh#w(6eJBTb2tTXBw-BF$}YL-jT2=gf=$Ar z{pjZ{t3H@AEX(-`5?y=+ro_ni6;~iI+rrHaAFRViPUsISXivgzbmq+C9Ywjq7H5Ka zv@tIx19N*aV9U}qJ~var@eWV?*M*ktsGE17DkJ??P?wO8H#Q(H07>>Eb*l&rM4Zd{ zqm1B%HD|85T|9%(XbecHKI(%odq4ne(;#=j=t3Hm(ee}OO@8w9Rfs94I&!R)*Jco< z{fu(Rtr<|QBFwIv&VyKlqHt#BgE3fe>7^sgdupF)oON&r$cKf;6?M@8QeCuER&>d8 z&e6ax!LXD&VMjjIl~#f5=%{XmtAC3w+3njmn8GKGqRS%X>3i6vzTi^IH7LiNQ^qmjw0ajn3Py;+a2=Tr4TNc~wG*YJ3P?*m` zA2~ONEC~-|p`<%^nhPHQXZYxd-h$#+8e0&>Wdb`s^ zcEzB%*g%dYW^G~;O1E=VG(PHcecID)&F8f*TzH9O%P3`{!<_l!rJBf>*_Qu@yf=@= zvTfUkNref(D6_qk(ETSYsrjSI&5=oSdDPv@+WQs%?Gla+xG9_b~A{j!4%rbx5 zN%#HS&-*^V_g(8-zwfWFb+45>UAnIGJkI0T_iftGU|f|6od4QMZ_?7nQ3-BP9Bd!Q^7NwWP!iD)o`Bd-~=enWCU^|!eI)P#Kv`&3P+7$Tj|e#g^$tL~T&t+dBy zO-u5foSen)--D;W1@0e1VLFrB|I}l14JHC1pGT*M&oiTKzxtcr@E(_x5{5adC0{@g zr|`+%tSfE1-*5<>upblBzBNa_iF1gg=QV~M@=?wy?8dNltKoIJ0Ad^_M!0?u z!gz=$iDmID{R?(`Ylw?O*wZrRaRw+kMmR%R;If@^DQF+2s& z2cC)Bw{GnX(s)BgD;%!$xqs&dqbG)s{R-7>C6gTk7cgekzaLwU^(>DMvFv{}zm5sK zQbe7o`FhP3QYQ{|tD7%aV{D@)x?hSFT<%SA)(lnA(_5;j*+RQ@t0CroHB*0NWOgwM zpHrJ1OsTMhRvzaSY72uFpKZGP3@1fm3N$HTvgT`P zVWk|6eZY0^63czH^b49`lx%BmYlG`tP(Z-OPXB7)obMsX;148HsuvyUTUjI=^ECH=lb?K4>F|Dn>&OxMIi0;^>yp(I0s{gjCmJJ*uG&R( zXXOCjw%ab?(&7@nhnF{<-HAD&&g5DE{C=p19KgbFz~{G(Lel3|>BP4g`)VQ`=S+b$ zyc;_si{fd62|3BtGN4A+QGnfZQQIOV`~)*U&VB8*DvLaLNfyteyyz&%+RjdW@RT@N zWaZ?FnLO;w%?IH?dA1Ge3S{D$seG%f;5zAn($B*f;3Y(h=9${P4r^=uYw7)Wo~^1J z)>bdz@Gpyz^>w`^b#9wK^)JO8KZvK%&w{-6A+`CEXu41(zmxlH<}(%{9F`ELh|k*7 zfg#(rEuKv)&u$DzORR3#Lcr#ch`t=2_19P=->`Jp{&HA?rUIYS?UmfCZ45%2-3L#T zub@$fu6`Brp18~Czx0%Vi$o}gB{kq&O$WvFfb2Cr)K?(hAZ%_Imgg~SCNkJ(YNbZ@ z%wlz79`e~k3dEDk{fy;zGm+kpLg4oD(lLRjvM~?8NNh3K0#Cgi5|T&4E~=}4f%i}} z=U(LO`HzI!68pe7qZF>LjtRN=QM4V-A!lEzVVnPUXNH9wKNh8_4cq@#SdJbPg8K-| z?TG|YsZtF50LH45eGNp;Gwug4jF1m4RbW#~N({7hUiq1m6xdh&8_=h`rv{3&Z};vO z#=a!uYybjej%8>k1>dM&#nAj&U8Zb1(XyQi*+;o?BWAQuBfJ^y_S-|tXy&2AKCenP zR0tGlQ#b5lkYwOe!5e}5Vn5d9Zv6+cDMBSg@O!dnFpC1d8HjOkx?AFA>};;B#Z-?G zNNF$-4k1h!-@Fzw2n{4iNJtcL$lN0Y8@(6~`=!2qCu1200$0n|&c=T>Yjks=o4OQ= zn(Cg?)(HNK?@@jQPgq)5Kry#}T=}J%35D>4hRjNF-=hCN)Fj@#57Wsor@(a%qY)hK z?PpO*6Y_Uvq>K_=)Zh5a=~mMIYg^|LC7VimYMnPn*S~={Os&~gG0E-Juq|QVlKFrz zyf=x78|Nft7b)79M#Sw7IWvpFC^ROqK-xbikCygwqjoPrE9;blZZ6qi z`ms))Os0o^V#%A|Hzh41MQ$iGZ+BlfSO8jWA$DaEIfS5Y!TYtjl|tv;o?O(_q+#+K zsD`$V{QaBc5n}eP`pU`=!%16OTCB%bfRQ^A4!=|JJ|M}3PSS<~EpZI1X%T%u(N%zG zh6VBb&;u@9;714sjxQ*SJz;Fm&$}!h-rif<9%m9Gp=3Cgk#I#ceMA>jX_M={MlunCJK;x}DJ)!%4ZrfjLHWuUd*{0&1F$1&L9_V3YWk&%&h z>zZ{$Ya1JTMn)WovE&M;PTk+QJ=%hN>$snvpOT_tQhYpqOc5-UFeXplK8Uf)W8-U9 z_YP0IixyIfZWL+Kv!X&m8(Bouw3|5@5xN{9Xvuna5={kqK*d&4e{@!~w4FUY&(#xR zn{LB;B_kul@#7+cdWv4sXR{kW+DI*6_WiGHg3c03#QU8ZFV#-cjlsdUc;F9SKWXy6 zZFK*F@K?7ne?6*Ul9jj3@s6RDwEjARgNS`ln0jR`FkIplB^*8c|MTci#qM?7F&e#9Vk?c^r;i^%B{KvXRJ-pz?#z>tRmq z%u2I&A^o!AojdO;Y;o3N;us?Huq9=|>;x>iJnk=Gyb66jy#GjJ@^95e&~m7Z@x!Eq zgh8~(`^y_loc@k5Ns*iYb*L+J_XJ(o97NkQRf+ZkA;j!gYqj}+u8Ym`&i-|!o8 z9>~nxjeR{emDYOe59u7`{_`jTEc0jA??_ei9|_6iW&8%OTYaGho)}b5k#NmU(hn6z zNx2a+tyu1J&%%vh^=c!tLb#+KTa0^YrAS1g*y;CVQ~ z&zUlJ8l9y}CY^Iaq|Huj>EqZL9|Z*g|7Jf}LCq{;L-ByD0*XM0n_{{bZfqeo-p3`k zM4^Y?&cJ{W8|D7j=*T2@*=mhL(?RQ30#v9pSh80{NC=J2m(QPHs=dO5KaXs!v;`D$ zkPSn$L6-|hFPbl$iW`O@p1ci6=APBlWYeMtjtkj;niGc8zRgEZg@FI!+_^uLy{|7 zc9&@$PO`^vZ=y4Ltuohaw-Wy*t{F7w{`46SFu9P~#RCRL zg*35)2VYkWIcp79mb$Y@s>?pT$HL!g(>EbdMP0~US=!dxirjJrCMIni9UUz#O1I8| zfjvJ3%)IZipv>Pq2Ajx0fr5{aLiEkYWyHqaq)5~P26X=ipqeFL8zoal0?#yN7x!0< zgPxKMlCD&ENbPNW_8C+LM%c;CG!Aq?6FD>#77}tf!!&(J(wKotei7_t(4$A3*SC=> zD*?z(V<~iy`g!Wty5q->_qUOHqV@t=r6w`{ie;&TlGw0BYFA-r8w;@J&F<0a37$5`;0p#p|9t#%3u%s+?{w3DJ{k%MA)rJe`P>oAeXF1@ zDJ#2l6itWzgAWf_c0i>0%^TZ__ajE)5=wiBzxzs!DAIN7*Z-8mU<^Pw3Kn=2up2cL z7hgg~UTxuAnoiRa^X)=sQcz~Vhv*-!0=^#SJ^EIQ{=lTai@_qdlPT4qZOJ;!uG>GY zA-H2A{C;lk+dfhDM{#vaq2}bN#DGC8DRY5P5N9PHK7?kFU6aQoCAZDM>vh028j^pC zl%Od}QF-al)pbpFPB&_m{XM9_m$kaN-<`bt|K^C1R5FJ42J0bXs2O36NK$yx9YwR3 za5V}0y$eAp0}I(yb_PP+hFcMeKPG2J0k zAf7s!o14?e<9sq4nJ1sI^dG{!8k*U;vC8v^|4;ea-VWb&`xd7)*+F;ILAH`hZeFQ7nliZ^M1%!UlpEY-9jHSi?T~@xPY(4ru1g;RT0E zp2POL3Em;V;?!dp?+Ypre`tlG0`*}%nG7=>#9G+G`}>8AKQRwzZGT&U4a_0>J%U@s zoR+>C4z6nCK%NL05^ccaurME4PQK; zDVrDVtEUq*Y5MMyMm_M;_@gIZt8I1T#xd-4I^xT7O$Euixi2p4UuZ=4L;pc8*^!E0 zgixoH6CcH?Ls`8Fs(Xe0d6v$n8h9 z_7Un}OG`^7r5XS|H;u;eeBWu4KYcnQ@m^Zmp|6t5zq@H(&ttCo5J8AY{Ro5}lUOTyKaUDwU(wc-2js0I*JabE={ouT_%%Y9V;RTH$7drI6;c^^M)=^cD{POe3b?Pm#cu;nU85s~ z<(;F%S=;^>df4Qci}E+nqx-U%r6sW3d7Q6*m}NUWkf4@9wY{33ABglo6Z5M0N~1p! zTmR(HiJXt10c+(MnMlZ4ZGH|(Hq z$By}8uWk8nT~@OT(PgQ-rLi~{ZMOQ#u-WPN=*5+DJ6i1O40?`eG1=mt3qQeDpv1p_ zF%S2ciwj$NSyk1kB=v695?I$Ty}G25R-W9;HkLeZcN_GB$KTg8OHJDPKddj7>2>fg zOubl~O4=)S%i7#v>yGgD=XmBW0te!-}-;^)Z{ka zb;RydZtSecKsC@B>Gyr9zO=&l^5t8ZZkwvi&g$)(#KcDL-*}FuEN8MSnACT1pE8u| zXuk3ez1#RcDAa|)KmEmezrh57BQie1LPCHmzPQ@D`y4-JFoP?>VrY0jsAt?|2}df_ z7~5qBB$j7sEVkN0kQu`-E<2dj;}e`kc8~aQt}OjcDQrP~&`)4S^}ee66Y+j^OFw-o zZueRpHX{d78fyjLTqB!cj%{$t`Z*^`h!*^A-Qk~EXo6PH=YijN-e7CwbQH;%f|~C? z-4Z}FfWM1g3XLf0+3rwjCQ2m_hW3hudG-DqUEqd#)Ve`j`^!r*5l^-cEr zmjF>iHEAZ5tDU6obi)RjxoJLX<;Ji$^MFjf0|S)>9{c`Q#vSFperJ?rrJp?3iA~{O z-R#B5ncsk?d{Xc(=0)h`@ryU_``=|m=h285wE&Ob`I2X zbld*f)9TJo9Q*z7AHZq=Gs3Y~d)LBYR=NXw_g1FaKH7hN{dO{W=LHzoa&bJIbyP8~If30T_^GXD%Rh6rkk*v}klM?)y-RE_XVV4U-1Yao z{?PbtiT-hQT*l+n}-L{-H}Be43jz<+;Kn zoLFyOL09%3;F(Iqk2h4G1qdPDNgndX7~*0G-}o7XiIoUKSig1;^xenp9c;V~S%V3l zd!qSgg{&Nhr~p8o{^L;W73-~RTB+`~6nq1TCAH&J z_lvK|%*LO>21bY8VayPoKt^&8Vj7rvW~-mo$|WJl-I)7hQrG`n4sX3v%dvDQhb*F4 z{K*9Kv0qMX99Yv?&VCAV%#Y95BSWC?+9nyuTViwco%m$XL_v18U1y<7z%!t-<1Lb+ z?Bv6ej~)gGA3?MYwfTF>SuP!vL(46KTjJs$O#NDBOVcsDNw)L&iIkA82fcKGRTMjw z8#OGyN|u_}@|q~f?DTY&eMPHyqDXUdwPGQiFI|;~!an7#v}cc=*m6{ZLHSxoT>mT8 ziKoKthmm*WVwE46mUun%@H?@ZhW479FZ?FAc#>>tBA4@AhB&1tKroGzghYthpG=IM zoP-F7>sb_gAM5)0|w#e;o;1(@&b#y>elRhe0+j} zP2cY=1H}OL35io+d&r|l4OajM1b-IsWX`@bfAmS!3q`=Y-=P6i2*|G>_v3_Fnb?Uii95avUR5$jd-@* zSoB42Xa(?nHDxDMK9I(pJxhDX5W~b!R2~u)IWdL2Zp-FWmk9h$Lq(N)V-T@xcOp&; z^eofS)9)JjxG+2M(vitpQj$=oK@OZ92|Z%s<(Oh=n_Ljdb54*65CkxAu55`lxfO4y zh)>q3W@4=wk53PFIl7J3Gi6+%rD%UIDm%Do-n|K~L@{|<6o*ICyrHh7- z^F<}Ig4)3DfEW+imt)$n+sbL}B4ftt2jRl-CI}XQcLK}U6Nv;R$P+To_aPRgCVvAp zC8e?kSs#&Kdw1CgqgA?8iVp18~rsG30v*w)L}AL+6Ut|X=N849hp zo@3u0)}%zKCG3wOQ^|XN5`!QYD>5XymZ)0S5pVVyoq+JZ=f9ToAC1e4-dw_ckXo#D zf6HWd-yIz(k1v9Y5Q_j;qBvks_z5QWC~)2!YQCsR6G#SO=n!$1ou)q90m(;ebMwiH zQSL~Gam3cXMcebTeojlf?aP-JCN>I#&z4kO6(f=UMhviN=?ktTWICyXKs$F-kj6MF zlvk4OHEe1;AE4p7^p8tft3WNpBPI;I_BdlueEK-bU#qtrb#+pEGHf~^M}@o40NByw zwUt0*Cf&RD?x{Shp9AU!u?q<11QVNAgR=`0HJ}!+PS0X5uje`0s#(81fUJ?tR#!#E zz((`r7GeEXHml`7TLC+{VQ(SOHRLfUg^QeUw?VaSV)gb6_+ZycJlbp$j?A>Q>=iB$ zLb9<%f@DU6^i~s{8U3qxClFjkMMW^8sV$>`R!`D4vc)vjBbwlMl9C zMLw+26xuhG;b=PPZ{F*1MoKb#ozR9Mavz8H?h$U8hs^%Neo@Q*WW>!P@h3~Oc20)5 z2@hm81Z;?3ejXS1RIv$g50Hk_()u{Qpuh_1DTFH$R{+=H>AlvK{_`CWfr7r z5Mf||LFwXiv2Xn!C4^7$1(BsKZk}YbUU_SU6}=>>JGjVUMbcl{Qk|vN^^l~}{CVeY zm|Cij`O+(YcRk0SKP3^`|381FUEzYW7c@rmmX%kMkiWkr>>m=Me&Iq*k0hWVh!Ybx ztbEH^M*lx;;i-F9Ur6nOQRl$=q0WQ30<4w3%IY_m*A4bcLN^DE1h5#;&j2C}40itW zrvekN+mVNfV>r@?Uv6xQ)Kr@hqYSZBD);K2QR9GG{feaXnk4n=mz^2^x4!adDR9D6 zrMnkBv$AIV9f5^ddNaHfHftPTGC6YKeA^}=^)TMjFB9+mVT1n^dZg<0P&ZGr@#6Q{ z&4cSnNH$XZeI?VY0W@29P`cSK76AW;499l^pp+!}*6YxczAB49o5xZ$Etg=m#{gRq zW@Ww^;qEN;Wa-k`qg_pv-h6@D#DFbn!KC5VQ2Np+e!o#nJwZW2!n_sN5u5y-JI4aa zP#gl_b^X!rGVT~16C<(o`;u*YZEdHf><&p`emmMK(kPAx0Uz?pto6^%T9NcR%gk>k zE}tE?_*V%D1jZ-AGR(Pp3WsEXe{4l0;`R_5h;qJW*VWY2G&S8sE(N%y%e*-dMdOKq zaZ3blR-DF^KW7o>iWxQ#4axek!l85VmLrUkc+O%afRi{C-`j+A4hjkiw9~Nv8BIa6 zFzT4+uXr1pQV@|yFcK3JgH03KI!>t?dCBdI$9KklY5WQm6w;ujyF*d#qeLrRglhT4 zQiC1RI!v7nx4f>io2nf~>p$Rh=)uKYF*|EX)5UuOia{*i6Im-?LY*r z*p7UaXXKJMF{f>m8Suxprl`1S_=xI@)8KKU^7;w+)Y7B{#BNw8*k&_W_UXQDOr>v0 zPfRnV8GhFI6@3B_fTJkbum3omF57uWRPOv~cmXzfO;;ka+jBnf$rJe}teXe}KguGt zxLwnNN%yasTJEZRUj&ImhKWLG%{+!(hl-z>{f?WwM?7|kVkoAO zxatFQ!eRVX$P}qs<(_3`JP)FZgZD!B_a7GjG`4XN%XHn zLl&(>yokw-%;&nC!jhtVNeSo~FK400KoH)@@GyPjC}zvUrP3DfuR#+l6SPjb0)RIZ z3zCc?;SY|<-X>M;KXn1 z9M#O&T$pJ~p1ND@d>|OABip{Eq~OSyZM$rAHJ>A;F9x^mLf8{ig$V6I*VXWzp+L34HEc4uEZQkTzN`r;=htlzlF zrQL95-3{BrR~|)$W3Z~}Q0UQoaL326P{nc8LP8kc6(NxP%RX7_sH7xc2D5>vI`E49 z)2Mi(Bg#s)U1@Q>#lvDSe+K8r{E{>SBOzX5x&w44Wr1l4>V_&Z@XGR6>}zw?X6i zrh+@c?pZ7_8>O44{e=5+=epYZ@U#!7nW9cVuNZ{4IMg=Xp+EatdPnzqtgOTKXoKf@gi zJ!5@pI}|DxE?iJJitOh`_bg57$8)-!afoXCd2x?@iGDT#m4Bm_ zjt;Z^^PHR~YfqrM)YluOZRBh_aEf!!C#_lV8F;o7=9iIo0|6825oL~JdpwLIm}#3* z8vR1b+}>Ch+79|@NsRY6E8}5$k;Lquv{yvr761x?xRZn1ODVA;c(f}>V=;4&e(P2k zSG1foPrj1dM;?E8XckkIPf=4TyTdjCBSNqOW-$Dz8p|ov$cDvbcX)XXYjz=p8Df{5 zU5YfU!lMY-2~cgGLe?&KaNt8^A?1R;ff#R`<@T?0u7@@#WPPMorPWAtWc;oC@{V0M zUD@j6&{hF%WA{%_!&#KD#Wqbgs~`2MoE&*ndtwCsw$Uj@VzJ$i z6^F5})J}2_NL=fgFlQnRUy%|B9FmLMSjT`a<$@RlR z+}ywg4#VR9tokZSa#XpmOO`^*U0_lO-obunATE9hZD9R0mTx;Uz0e4~3{!bYjPXE7 zEe+!A)My0<;On!1|eG+ry~IIr$!cqS9JB zH9C}MP`ZJMG1g3=!`Yc+qVQRpGV7PB$gMh zf6ca17q-fC7r)`MNu#?c-Atle(OQ+^HsVHhG`eUjuF48f2lgIS#L+?NM z?x@B17hO}*{&btJ0OPf6gK#`uYkPfT!HN!=FY#n1+>tPaFm9FuvPiOp#;cIReR z)~iQ3wwBS?{1TJco9Q={y>@u7?-r@NJpp72i#JBT3VSX5-8i80YOpVI)1XPwRXGPV z@x|JJt>mRSBEsw=PI!ocPwZJ!92splZI5XkKs1CON)w?=&s}y+EBDBq7>hDkWcHuB z-zQgei}z^=)zI!-zWCG~O4PKIh9)NQrougFhNZUipx}#|+{epH^{`VC*oNxdSQTG^ zQ1rLWmcQ7z(hM$Lx=7w971wYF8Lp{hB%SX_tw{!+6f5iKh#|v-_d=H&Gs%~0;4<+J zAy7zz!;OpUxQG*Vhb6Rw%9@(}KYlB|F(VGH8K&y_;p#s{wfL2X2eHWAwsUE@t@)T* z($;qSqy%JsY#+z4w%7p5Yl|n((4SAFc`;FEKjfLchJ=J%npYSl(4(hM&EMpJmq}%= zC@nQY?L$Z$p-Vf$)`)87C1s3sIVt6>ANc3KSr#lFg^B<3m6!fx3T?qt-JLzCZ-L?p z>_s(`x!bz%#n`?xZH8q>&YIBE*q&!Q-4~-cEPQt2gsqje9%Dgga@cm2rsaH{3wa>8z6Y zh?vX=oCamYbOTI5$WfBIewrHErQr4#adBX5!gP0BE#o?{`%D;5FiPz3B|<3)X&{8N zJn@ltEBu$exdh|yp(^6jN;3p?eQyc`{0jtHty^brXNOsSP)N#M_O%7oi7iOwSYs@T z_}A~D4?!IUOZe>E98$LP)6)Ytm{M_8Y++zHidb?y;0+U47Pm3BGbKzsU=^MF=>q}b z=Lys_uUSw&!|*g)MKYjceHSciG@WhBjIam=9`l@V)$kB!f1iP#O}tRobp!K z5D|&@GAZeXmDNM>Qw*%gn?*o@*`Qsj+cEnIWm@hR)0?x*nQDFxU3zz6?SythcD)Rm zMd#tVp4782OD zVoXv}YO4Pv)i9sRu^_Uub8>8^W@fE0ZekxU4Q>$c?e3PLl5tXJ1VDVwBHD*dqo*PxubT`rWtv2p;ilFV42u1D?aFkT6uL z0pmfbAAc#N+(k)ZaS~TdBU$HJMo4gczaJNQK1Omu1##+r{@Q7QD;n->M#C27P6PA3 zB=SudiUS;6ApuGJX3bthS|(b;Q34$nEHy!I>ijGC1T)SvpSt72@Fwlj zV6W9x>(f)1xSZ8A8oA4w9q1-RPY4jg%ry=U7h5)B`JxPdo0C(wZdegx4Go>>mPHDa zp-H{0IL8&sgMa8)0`}AU(}}==(#HV-=VWI?!m(lRGGq-z6rbAfk#^BmLFkjJuhxVK zcMlJ@x3%%!iOIw_A&07UKNA;IX4fnGS%uQ56)_U`D*}N2CWcL)y>Wkw+T{HT7swFM z1Nt9gP>+8f;k8hno}RQA`|A-I#7{;ws@5kC?sHG>Fc6OVB!1M_SfPz)zhM(dqv$?B zJ!`wu48@r~c;-tC3*7Nh_W|qh+FV-_NYv04nxmOmV+EH+xN!-=|I+{GK&iLBehpnJFdZw&#LFn9VuBmeTBct z;NU?7c=GRk9{xa_hb0JeeM#HJ?Z@xdp9-NtJXG4R-jID-)|mICC#(yd?P^UM3@UOcUPK_o~;qe#t+bCll7KxE>dlIAvp{6OKJCEnk-EXR1gC_6fuqPl}bM zsy)NW9Dc`w3F}0D3M10$C!h@7>fSCu0GB08&6DY; z*xe#<1ra~=KBwO3N`>{$H=JqNcyzUXHN0L=t>*S$K22sYS?KRlTPr}fh2om1WH-yE z&_O43R-vW6J?WPO`(C49h~vYLSa$-cX!NR+-F+U)Oh2T$VF2fTHrHMEl^`epq}Kd> z%L(f!1b^K+5MEqUUQS!(f|>?mVFfZxd&JPbv6if58)$cd$YHUYZJGU8{HK2|()#cB z|4}>(YEBQEz51y^ly zXR5!-yh$%(TWPS?(uf=lK9fks+>JtMAEMUc9#-Gi-ijmR%5|dyVN zOgL%KR1Gjwr9^;uUq?<3&lR*Sj}Nt>F!kg$P8t8V5;u{sZ>aUbFpN+pAVST;hOyS2 zP}r|llhFYHx^ez^_maFu8QJ>9)H`m8eC=8jUh=hz4||;Rmwm>d%Y6JYxK;J#zc#g4 z6-+#ZG8|S^9gHlv$eU)$dho{2Mx0zIn=jxVYcN{Ad0;$U$?cnvoIG-2c}@dqZ+1Fq z!yCGe*C>ga3iUAEym?cBahQST&6_woacv&*wZr3GTJFSp9qy{!w^Dx2HV><-n9+z)?sbg0|M3dAnN1zOxpVWW<>W)L7@_$#RIA5GPVyNvfhm6oe&i z9|@b}m0ss4oSn{J!Bk8Vvy#%WrYl?jJg-btd(>%Y{1EE*<%_yHjqv+^pRDf}gHiPc zCd#?1jK_Quf8&iUtb8}9Sb+ntROjwR3LenQ%@eAdXgK4#51CtLeRioYR}aXv)qQL4 zP|ULn7K|DO1ZFI`WynF3f`r_?M^as#VJK?9Ncc!XO1>*gC&9Rod4xN$pwe_yv**sy zBW~~KPZ6k_`X)~vKVAY^QFxs0ZEJv~xWb$6Mfkt0=ydyLF#QXuJ%7Mz`B}-?J5fKp zkJ#Ep)>baH&ebXZ$n2i063=5BjOd+iGRyODx-a{8r7Z6a?0JU)5=eu-U%>JE&g}Cm zSg=9jB)#t<$E?Z01|-s+;??hvld@FT42`T_XQ)0CpF{z!O9; zsF0%gJ%D<7G>yDwEbWuN;>{qV?Gmn$7*Rjl>H6)d! zabC+sALhCKAliGf;_P7Zewmn<@w^>kfE1madLErkPDg0j7+$SZjP}1rIl$yj4+HZh z^yzO$z^XwO2G>GL3Ng?UMT}w`ndc**$zHdck@I)4c>Sv~^f(CL2ELb=mz5=mv>l*G z5Sp$s%XE*bq}Q00FQ1qTzB`u#oED~jxE5^SU8~;)55Mup$5Mn8ydj$yq@666U`y}o zE%k;_`+h#W3a7u8)+!)el1Mf(?7&VLxbb;kU-eVDj-KF&p~5-b4%@j%)}upCAjkgZ zy^lU+5WhX`<5L*14Aj{tf_n=F>K0F`=2@%a1bW=->!{XSx`U>}&S*FhnD=5&CU2XQ zR4$sQn)YYTP*-OYMffZMJyTj8)6Pt=(Gg%I zcq#&3SEF|q;C(bj<({>QuV;!IRR*C$@R~q7GFG|HHj3MHq&84Ml!qp0PU)iTlXGAi zm6bQ&_-LVh@}d0a`aCq#ht>uEuy($9>q7verR(rH+q}HrO$l=h?=vFvY}YM5x}rf_ z#eOxWUh;9%3>2k`_3<~$_RYl`)DhFzfc5+ z_do8&)T4X$Q9}zVZ%4-FVg$|@_NB1%)vx^rVRzJ55H)?CzI^VNDpE766)aeUmXT48 z5f~unJOqxR!I2mltj0R9k2vbOy?lHG_6`jUaNN`>a13t`$lyMB@+D`APJ2dhhzAk= zV!I=n^Z|ynw2vpp>(Y16{Z;UnPf)oFo;VVW^Y?znVcmWkky}0*2U5xA8C-SQFce`b zQe+4~gpSU~O4I#xaqgg|xH_fpT1J(gZ0PI&Ty<}~tH zMMmDnoeMM1W;3N*-n$Tck(EcZU~AItyd@srEgcJ){Cq0DQ`XKU4>~%}8Q7XL;4))U zuF+KiIdEqv;+>$E-)muR&RMKL9>OYSCzN-qUCH_%v)SmFHg^diaz#^&qgoXYXgLD_yrFo ztQbNmI{M^4oiGnjd0E~^RYv7BCewH}NKfb4@OJ}i8?yJ3R~7YN>J3iNJZjXfnD;L9 zfd=jJt>GSL)7-A5syDnI##LFXE0*O4v0_hBpL99iM*5kUoYqLaMwC~Z*gQ%d+EN{8DfK*_y^xV>~6qCG=Ec18F>>xs+ygRi!TKIEQ6E`(kfU?Rq z#H-aOGS|+4oN|7~ZnY|p=-F*n+Apt{^VZayDOo^7n^oQvVT}kJRV9J>&}*>nIj&%u z9<_gRPcYRGdz(`TLjcuO^%g}n)YJH9_`F+2C-v&fzin$P-gZ76!2ciwKrVR`U^ zoheC*uGV~fe}THSB1bIXxxompSp#TFazm;}t&WAHkhxAB-y+N& z?*w36pcyiB=&{~XY}$10`-QPv{n;x!-gn36@(T$QkJRm>RD=uD{Y;&LK2TaNg$9#3 z&BSPUF9Jwe0+1gc&l6y3Q&(H7|62nsTtY%sS=s$@!Q!S4zyk{T2*sm5$I8I4JNyyn zJJ~h`j7~O92I%)xHyVz5YCy}YIr|@geb1_OXU|CII=~~k>G-Wh6;p^CXB?YYZW^S*Ln^Mb)ZS-Y_|Gjx)d^FLe zI&_oC-NL{kcQ#s@x|Ts*Q&aQ&`CMogAO(1t>Q?wkp-E8ji~Q?vMp>6SZsG4V+x&IT znCE~aiZNm7OyUkLCzV=+6{~0FUrHTck>w3vWbW(DWO!Xqn&wREy5L@rQAtK$LF#hH za6X3TjNL?2BJ*R!vfs{;WSM?MmXWfZ)nljb$|ZMZr@TD*PHL47P!t)bSj>!xaSQ$f z&hM-i0&Cr>`tbmgY$msC4{-oxUw|HJd@FC>z<*V=YYMP4QX zHTQ5lrw?8*QKuGz;thd-#l@TuE&!unQ*UAdtR#pf%_3({)DT` z2%NDa>aCFiY?*dTptlB6CiCik7-)a;R(k!dBFF0ijh4g(wQ|zAeZx9iykuy4Pd zNU=L+^Yw;Of>0Co%)Lv&bKcM7S>sPqdkkM{Ws9}iDeCl1Lin%Nj%njD(qC)>0|Yy8 zf5rzh!n8x2W_uqMeU%R&108yefrP|kyM=v}+mF}>yyUAyz{z@e3aJ}NO-cz*nO@#+ zlomiNk!L=zz+q>}bKn4+@UGD}d4^~}O{~6NrjK|%to6Npea7D{JxDamA#~)?AVioO zHxgyO!u{`${158k0A@xbh5-(A^%dD7Ng)TI zynh1bl&1mk;g@p^WMC)HoWU5I8iY1~{J1I;ef}QxC}#V>aD=pd2EZ7Tlb|rB`XZfV zg)5aGSO>*8@IT@_2)=m7KNJMh7=(@0hNe##j064$R&hFJ=F?d`a;vYR`C-ikeU-5c z&U*OVPM{XDL9!#S?#$E_rYiP>+WGshj^k=xJNp0Og*Hm9Ad-|o^FpkGiD)SHG|LpYZ9aoPCW$8XU>Z2!8Yvhk%c6g=DA;?Sh)Udc@O@bsH$VS1bh}?{m!MU}86?EcURYIS zUK=Ha;2RToxelDViKJ2VHOtV@G*=`N8|%<8I`pwp;EPA99qd(?zCnHm7iCE$I}NAuZhLIuXi$x7(V;^f|Q26)xcF5Rc@M;&B~^JpUZRLWJNWe&~d}WPhxp ztZ}J>K_9Lh*h5Yc(|yW1%5;H;xARAC)-lgd`Qn2a4Yl+Bg6S03)lX zzojkXgM$SDY8%x z62l82Oc52G2dTtUOxui)Qz-HvrLUqeN`RAF(3jaHe^KbEx=_k_)(2IjK1+}%AAI4_ z1}X^cxnj)?;--P?Kha$EIodA07McX)GQtYNH~j_xER@Z}G5H|!*zJ3}#Bpc7eRD#Z zB<3dkG+j4VpL^5twL54r96=tVNa>se8L{h*08AdBvmlw!DTNLYDV`=!v=~7GjDXkt zLwM|9hVq_If%M1QTZSfn6Lt?MkLxHd#{Tw{RjI~(Pdu?`9DB}MAF+`LEs%NLi2GZS z73x^XQ*3cGr6sW}t9k$EP)QrmlFm$A$?+w~eto>7opja-8^U&BAZov8KBrpy$(y`G zXngMAU3~}pCB~BAT~_@=LQP?Qik;-Ffx8u@)4J|>og(bbPPwiqa=Y}--rLhkzq|&d zCj|$W2$cx(e8ODc;WQ#Z^swni`Wg;ewNryS-HOB z7DxG|(23AKrMMrw=G{6Ck^D*eKdQ=cBtqQ`krzU&6H<1?`_;pI7#hAAXIKZs2%Mv=yT{$U6Wqx z7xtc|3@QZ9ao@?#gBvAukLr-k1pB`NAaIks9CLrZuFtq@Bw^X!9N*HnIecj!#2YlmcrMD&-bIan< z&=gfCG6x6FD3j$HWu%yX^G2`f-Tq_-P9jGxXwmnX>9gKi z>h_apZo~7}bp^8z+HV~9)ufK^d-MadQZvk(sMmLn(AM+QyzRszmN!pVlEiLl(#l!k z0^hK~73tiZ*_{uZZiGdN&rD3Xkra{Uuc^57pKj7M9coawL?k4{J04lk-Eb&O=`>jh zJM&HtHu

    J43O4zT4Vw>z)2ujxP}pAATPkq#7_ge1NK8a?)ucZ}vlJ>34P!5vIuT5pTw8 z93+K>g>c13k6{ga2$~ktjdOJvRA+8~M22F4pU#!Z`^a2bg4nT2r$iFCd9J9PG}Q`3 zhSvP-EJiyRL|}4Ko36OsK>6ixW`9RbXD6IwoYQ0qOoqQ9)cwu&QeI(7Omxf^o0!*< z^5!Dxjl0ahy}glODqJ|houYe~b!|7#HolnAO0vx5QY#~QW|1SG)=kvCbnGk&Br6yG zxr8R+qdDURA`v8nn~O`|S1-flVRZ!awqv&ht_t(;oD8Lq?cT%d!TaTV!niSW>rM6c^dLailLcpr!%8oJ^s_9SZI zLguu~)lAdDh{C^vWY|1ho+KfxbhphVHZtg>5R z;~E!77yf-O@=qEgJy!B`X;9<d3N;v|CxWPdohgoiGk2RFCWXn|!shTUG!t6h$Ye*CVnUpKMc3v!b)&ye|nrnso6X36lr zJZ-PZ>NpbPvTWuQ-M(SqgC8+t9%o`#wX}&GX#-B16AF!NmcYw!Mq{iD3nVi*3;fb( zEqiarZK@z$lz8gVEw`zy+O^KmQh8fy+B2kC>mDu7;vMAMvDRL%lQ;wtx^yLzK(43N*A06qr^J4?RCDDU;G5cL)m`l8+G4#>Mj#kmqS?JM$q-LgV}WP zgr5*ie+~Bmp%l;Eg?okdx1Q=LL_#CK=;cpgPlAFry$-*&ihC~|Su5%B?EM#?X9xJVpnJJK!HC-iDw?gjlX^>f@xrN76I z@=*?1iBX5M^tsOVt4UD&?vL?p%9W79~>ki-V5Ln6z$UG=VC`4^4c zBE(Xr<5VYt&sim}SKY(Ue>NZsYzcB@gB^D;CUTl#$#-N=^f-6s3v{c83EEjZ9}~US zRYD1VeM;Ome4;d-nbv~g&^uu**2vIBiUrP3WFiw4J0hE$1PwStLtZ>0^H25&L|csH zzi!OsKECu4^NleV9mc`6npdwTHxelrr=K7UGim}ES*G9Gv8)eX;m~-N2u@#jY|;Ue zTqNm3$!G-y!q?bSj8;$9Vr&7T<~1n3V^?P9RD^TiVgcO$LB+E)?53ACfMimcqsZKK z{MZJvuTfo2N_yMB!dH#z2_NqD;%(cu8!z}?vq2Bm^h}04BQ;zbmCe9rN>Vo{GOGz8 z49KJm=FZu`rj=4>!w2v7aG{Hpb<7vA0b2FiF&~u*oA?ovzF63eZabbK$}j~*^U{KS zDW~;=Dwmm#+ccLEz#S%jhp7zx*8A4#$|aQAoT?n7{%M*mDgKnH8xr<@H4yA*#3+y* z75w11xVg#6VPwpDx_Yddq+wQOP$JJ}47XO!S5RXAP*TE9Q)riM0u^0=;g%FeGrI}x zp+67AmXgyr9Ugk|>0~>%(ljX6h(v$zXYTYBRidUKo(k7Iju5g$NFGj(?Vm_CSEEjq z^TZjk`N`v{NT;P7PkSy8B|QnT<gpOV199%{1dm zctrW(O>kdIf{4P;Pmcf6fzAf>1YefWC8GC|RHb1N*?RrU2y{|?kq~ZfXJYc&){%PA zt^E*XD>LurLlN*?jivWz?n!;KjJhguFQ+IR2X9Sr)Nyug{LrDByFr@N^#;%0|E zxs~gAS^e}rNv#%|RD-U13|tv9bZ2%>!In4;jbody;1O7Rpr`^^F~r!7dj4kxaRl#l zT>B#W{8y&@->8=)5413`iFo_^PF*qVD)Fr63+$Sb-ejpau`n>?V01Ce+_iF3Ec*y! zcrjP*AO($#wX@*J8sWlRKE1CS#_#D0k7A<2zS9>R#@sz;-|t{75|g&xh7nv<-1Xgk zvVEKR#O-k=6zB5A%=T1&G7liLyepWgRlb*fKWqetnaV;)88#dGTsF4FAX@8A=*Ugi zQbtd8s?7d`(lDM(xwI~ucI`#iAG|~mUjXI^jEv~1sU7cbcEIT3E^N~TZxk5`VZz?w z`xdf>#>PZfBr?-ax3j<_kCo|bnB3KX`E)BYtk^x&sfdBxEB|AXnf-uy+Yz%yFo1TE zU7TT(-MvDiJ+LzGA4*#1S49M3BYtg67@gAYg^Unq-_AkYOonpNk6b$~VHg#f zE;uRTpZikj5_0T-NW*Wi0rp0zr)K5!<5cGhYzF9B>3zA#Ls={hnfHhNKis`(Jk@>M zK1$S5N;F6^D@mqAXbDj?AX7zUjzlt~6=h69D1}IrF&fNcQ3z$oEJ;F!BvwM^X&*nj zujl%Y&wjOE>^{$n?(0#l^&7tDc^>C6Bra<&m;3s^8;YG|AX<&W#C^WNb)?5nJ=+n} zdXCf$4%;)xINggSB_L$N6{q^0dt>SL{gSjeCcwsl1ZB4@40~RoM=0*KQ!*sfUqi1a zxX4%vq}Pvp)z#ZcI<*HgX4v%}nr{pudQ6i0h!c8br1j;cJ}^byW~jL!CN>F#&|T=i zu?le*_gSk?R0Z)W=h$}qS~c9E-5qS{Eh9<_ss>lpm&5zA3CuY#(==ZCO2mzXi|=p0 zo|=j@2LQ2Pa>8V3>pKf-4JE;_ybFHCt|u^7HfK^p&&t z5ROoQ%0SrIAlY5X7B>lWImK@H4*`^`>lzwTz*;6Ef}Jvgq%M=K60)z9n8J=-s&>Qd zZzoU#yzzhnIs(gC;1Fn8j4AN82x@N4wN-HZQ3uTM(Xj37v1UA;y&|xUgj!}pOGT!t zCTGS~Y&a4GpPkOoqX+E*zrFq9`EkGXxj1sR?UJ3Y^rg? z7X;Tbe1BR$a4PgY{ixEKfE(UFAJ>4^O5pz3PYmdrJRG~aookabN9$MN(owIN%R0;p z1x~wP-A0FKwW{&NDw-Q43(~{4*JVC&Y`UK2zwMznHX5&x7R*CkF zYPo0=jq>bh13`ZJg%X4ZGDUdu+v{LchzYbj81k%dn-!pt10z)MBKKz%Sb8g;E)bhE!4h%O0%zS2cav_Odfsa| zsH!lri7UEjwdXO;rk+0szKpI4z?D>n^N|91qP36rbT2Sj)?6ueJ%2yHU`nuNyOooh zxYeC{8EN*%a!%vFzh~Dw?cRG^Wkx!LL_gY8>Z*T_xIOUn<&yJzsGW6sCn;j+>UOqG zEAER&9T%-#tMWp^|$8O?6e`@*mbMQCGc&%E_V(9pGx*FyT}o$^~UdM_Q!A;w_BN;RSCyhRx- zKTdZWeHh#v2rg{QqrT5O(m=6=(A9CEdCh~;ECuK8w{FMH-lK9+!n%Q7u3?uvR9~Ji z_Nc>gT4zL|wgy74D_16-L)_jT$vR zw7Jbqr<~e9|6?n- z_V@RvFK05g-dXwGoBfA`6XeqC-owbr&X)f9y=;f*sgx_%?M>M3(OD^k>q$#>Ki*`k z@`=TBpWw{rhFaD+NXlCSFXeYDF-PDW!w%j!c;Ar^?X3rOm<}m;#7PU9+n>qb|7 z%yx~4D_vPM#eC}A9|j5vV|5PbGla|(ufT!L;j=?`Zn?qV zkj23Xdp1}rz~jtN|LR$zGoWg zsSfim+PKEw9cdd3L*TU$m!0*H-3(k~`;ZRey*owsq43+I3A^O5c zE8iJ(x~r2}J}|71eB(5{Y#v6X@sk$L^H~^^e@=Vv&Tr%(GA&{q^~_4xbv9^J$EnfTvQrSng+ny2L5sWEgGVoK) zXra2E;oG$@2r^hr5Z%v#j6b*Yn`K=;gg%uc!*U6}5o@?jsW;!#f7&?N_`N8u^j_5U z83YjAuOZZOf68g&uFZV>uZNI+JgIN#O&6G!<|Q?aHnq9RLI^pkR1KWlWcv$qTdm)j zV+_Y1pJFQKRu)H{$6IeWVY8waO|(F>`W7Rmq;9A3L|@XOq`V#>5Ltm1aaw>!m*8ws>6K-SFi5f@aj)rKdjI7@~3Nc4k|!A zAD+`NKa0v8p>YRi<_|0`%>i7?FfcN%Z`pB(u_2R)(f$4BkM5As$9^1^dKrG#uNbNH z($p@$VQzcv)`sa@uU}fL1ffn!tC7H2cO6jka1A zZ01y5KewfluE5#q*Bg#nvo7bDC#dXDMz9HtpSVXSgItoz@^WM9A!`QPmnCZ|JS|?g z`+ag%c2J~})(vgeHm7WmB@Y^WuH@g?B zYxvS3;cJ%1juoMxuvuhAq%DT^HtrM=tfwK_wN@>uw9s>B5|?w4cbq zoS&bEKByGjUVAhRYKiZ`_XdW9EEmwjJBd_0Q?ku?56!@CM6}y%miURQ8Gfx)LRR)= ze0+R#bSHYrO>JRXfQ<@^YH*xRu6a6%sZcLttem#)UlU`Iz-%VKb}$D(%=z|8(+a9? z7Nfh;zf2dbTc7{Cc}y7Zd;v z<)5Rid?=4C1&9TQF6zYtE?N1ywiTYBLFx6dG}b+G>+dh?20v{xt6qxNt*bfT@m>Yo^RR=SV8D?70HruSMu=$E#H-RJ6PED(!x@aO{) zmGne@vXgGBoo>!=FAZ5cjM-#9jFF z>O}7@NZ=D39sOg9Hx)wggEj_(-W%m@{a?zl_(?EoO+Ql^7&6udSzfU2td z_~&!gbD|uN?}(JFrQbggH9D)vEVAw%oyz|@qD}DoelG{giX1R#OQBPZh?_f6{r>we z()A$afv9XZ9$(hAaG8ljn+NtfmS7A_Ocq}*FvLzt*mV}6qdz~SpIP#3s-fP=BxO!^t1HewDmId1(ER%z9%ea(1Pk1nL>E-aE}e&$@NP=bmRHA zJYpM;4>gWLL>MXn3J3qSYNocj8sHY(EVup-KMbCZr~0_yu4_BdnCp5g{^tU`J%}9; zb9rqoA+m`b1^kCqI_7|p-HV@`et#YhRx|3jk9(lnbddPZe-)?+CNgS}_>FFucl&=n zmo*lPY2fid5OdFG<l}rdCf_$KLYs+*A|fAWI)jj;IcqmZI3|L@ z74d!f;-5XRvsg(M0XocZ_=bmK6m=C33Fr0Q?QySOwH_>Jy4pkY_uqJyrpW|1GUV4M zym@1IE`M3MCvMd9FWBea$3O`O{C}q2{x}TT2w4=^w(T3Dm^(1P7K}BYMhh9{zK=}K z$0}In5V$G<0Z=8b`a26>cdOIGEV6#R*XVFEsAl=S`-WyA1AuxI#`T?X=x57f!m&IVg6zj}OsU!>%%PHO?k3M0{5ZFQwUAcw#4y)iB2I6BD)8C*zzbo$&ay zbV1Vks!urR(l6Ed=Ay=-UtLkPAe<(3agEY;88$g5J0t}%LC#m5vlcq2;&9mdLgx<3 zK*5m??TJe;fjRR7$oU`@Clo9XuDHR9dCNweNmIEnkV973Qw!S&hoYdluF$BB@bq5{&rV(VE**N{yx;7SR7-BXty?ucUGYI+Jk<+Wo6N9@8!Y zB)d)QkEHoX0j*;49YV4^R9Y{NpgWwi9;|x3h=Rc&5@G(gX83P&F#eojzFt60^Gc2N zrvo}nf_t9B77R-pjW_y-477Z3pP}1d&e_EyEc~HaP)+lFthhzrg|81`rmw zB{JdiuCJ1ZCn)aj3wUh1fUxC3blBy<4j1!S&V(WCY(P}GFrj7IK83~T5X^(10c%CZ z+b(G2n`^kXftUb@5O62K4(@%8JV)tWyM}QL4W={3jr-TaHqsWi1BvKB;!r_*jdT@` zd>B=GYbW4q%;6*JtXniwZ zy*f30C^G=h@7VD0)925X&AHgv^3cjP6I{v(^uUOx!fFCzecDbE#^pc7B<|=mRr5zd zLBUj^fDnULAA9c-jsEmA@6gVh*r1BXceN$WT_3dxT-XGq zd<;RU%wUx<8V;cQvY~YG<98Ht3l)`=&`B>>P_(c6=Vj*zp-Z}~b?L~%!&{xGf4hbK zc}z@|o_Lu7*lVPJJ5ZPEWv_aLCrp?E*`;nx^#6sV&$Xpa zzN%)yvA!peSa@i>u7j5#^x->f^@;SL<&2i=SVX)FdZOLWP&R)^kRuN^SG-`ke9%OKO-a5$CNi=Q#? z%>^L~0V2?CTx?zWa{%{zlL#b$XKhDEMt|H60>+LKA|)0o^-*6-mLLwxM=}DWLAOAj2yvGk!hX_T){F1)3b^Jb{RE2D44C^;*lr;b@atQx zTRI}-oHHP_vT}N!GLYe5j0kWzp2oc5rbrD&A`NML;FW2k23{{UwE!rAaEQa~K#%D|r0nip zyI4q|gKd$tWM;y#H(u*LAMCmp7N#x{h;n|8z};Uh>0Vb1bX#os4?-*tGOW+OE)Q!{2Q(nd$D|+_pdb{jfU;e8bD=Lnz3VK%~Vq%pEvD z?`88gb#t3XUxRq#_;nF6?IjARr@Cp2G)#S*Fs8D<%aA$=gf~wUzfj~fyObECE6pFr zzMwAgk9dy3O3(e<+vUZVZ6e)CCtm2$W)5rV>wgAz0gvCJ)?NpMzO^?t27j!$KGXZz z>_-RfqkVhcaCn@9ncxnkbhP_?kHR8Vuytl^U=tUY#_010 z4fhr}nKx_Tn|B3qh)cJ=;@1~CY*eTbSCQ)e@^I{(J|TV1lu5O5zw?cb7aspq}N zbI;7?k`iwa7XSpF5s5u}?sFc)p@2q9Mlptqnc42YI6VHb2Cq_Lg;SqBQ!0KC6;<6{ z^I$hDj@)L4RX0Q?1#49^ZI-}{Zwv&S*yzq|Fi$S142{!af=C}6qhA1P?>Qqv5inpz zMGws_I|k;g?w?)wx+TGMtLz>wyLQ1vmaxO7tiIcTF#<%kTQlE2`#q{J{GK|;ylnCZ z4)|M?dvw+8i50Y)3Z?P8^}!AvuC*`YY!qn<_sjCkIo9q9)~Pu?L?5$uK5=E%M*rE< z)jfASr8nNEk9lV=izF2PRhcz=j;u3CX^t!0+_QJgLe-ck*Y(EVxxU zDzYBy*t?dC04=$o8aV0ZJpQ|If-w%(zaXj z{Lyd@%K4|HSaU@O57TJbn3-=!%WCVlk_dijrQ1ou5%xEmxV)T8{!&OJG zYntIyg(p)L+;J-_S1~am20QIRD3NtFNH_$RIdmc{M#dfY6QH!PU|PB`q43mywU63n9P3X-)}vvXgqZgi}oH82rtdo1djG#arm z7a=Y@sQN@UY<`GQ`xv{$fW)wS)Pvs{H9LP)$VFuIjM?@VM#NN1w%Sgn)*i|}x;jdY zS=19g95`7-MK9t!fxy97sfN1_n_ecB5K0?JIxG8N}QnR?9VZ*%`8vJITZS#!0+?1Z;0` z6kYy2jGbV7wbFGrCyLToCk30wg!vzMFwm~m@!z5d=3~>-IBWGJ9M{x*+B(stsEwGKp}z;$lcWL)ftpX+cv!a6p~}`uc{GucXYr`k5hzM!Z*0 z=nKx;=%(DAB+Xy3%&x;-%PY?#Eo#5lio@KSL+O$Xv_y~)ib-E>x)@r$UbN!Xm6g}` z0YeR!FkfZ;DTI!Ar{mtFbZVJC+82OmXiQ^B)k)3B&>mT9HHk+R;BFv?tOKI1x@OkR ztkL)a`SGi{h54ZcJKpM1mbH?F5jzBWJyZ-l1ztNSrfXW+o@^Fc5wMYF?;ghfj04wH zuY2y>cxom)^w-^*dWYCUGD(3a-J)L`wB6Il+C#P^zl$shoe_GmGb8V+BB#{!!ri)= z?leIO&dX1Ym;G$7=q~D@dlePUKWZ7y>uO!7UlD62;V>`K$+*R3yk3w0EvN#9I5_;CedyMJ#uTKKPnHxWCEXQ#lfF1&E z-TLiEO-aZ1)_5KPLz^82qTsQVO>E1#1jx;yc$??*!M2w=U%6lldxd^wSXm^8lT9Cq z6vLrucuYi0=H}+l!m&r0T5@l==T7H%_^+y6a67J}}h)svZYN?}$H$Dj0gXl(ycD;E*7u<*f;c3-g8Z<%b* z3QNyTE8iZ*)nV8~?>$X`X+NoGBQ;%Mo;30fyJYO(E4|mo<>WM%lyrj*F1f0DgHMmg zqsQY}Jv0-$ZU}_Ytq`t%70+e;C&cY)PR5ssz-ZIHA^s~b*3ac$X#4hLU&*CR@GZnQ!h zmt(Uhk`u!>JdT@gQaoQ>=&>y-$*Z^~m}Lb=O~(mH9NQp9QK#+={pmyNze3g8#4GNiV1zItL&FBEy1H7~?0r(N~N<*F5` zk)4xqr7G@RX?Hnzd{u~sIY#k)rR`9n(gUHOiLN9LV-ZZ3(>rac*D}#BWLjT6dY>-x z_3S%JPQgoeQb<^r<3)8EJGbudH3F*m+#jeRwaylg8>D*Z5e?J0x;J;VygGq0ULfE_ zO|z40e@s8sH0!5mGNrBXVb!+o_4wRXUX)4q*5Kq-H$5B7-lG9tuyc9DsTol=kiVnX zLrSzaBDt^6@mvz^dI!ZXO$)Ve9w;2Q@3om-VBXK1x9OyB*YyG4oqD%;odfe9upH@L zv7fPR*^dy#80p)4Q&l)GZ}>$2BG$u~F;|#BMT^;-WrH6N3q8HQC`0+o>OS>jedE;c zZx0@HmRHbAEOecY9FlcC{U~vUV=PMG#8>Wz6HJa>CWGx#CvQ0NXCYo{d8_*z`Q@AF ze5!}~t7At`Q0B=8!xo-BAF3*Su&~x@@M~7xwPU$-&A;lY#&3^%J70NYJ7;V7tWf5Q z+pYU<-aiXJ{Cc20mPI~ex4`ryPyL!s+W7SynUazh?jApuB(*k9#p~zVxX_7!phrbM z8FZL(Fg2#Meg@5=HhfpNLBPrUjz=D_b$?8O`M_0;6JKR)v2X%)eZ;re80)6)l9tTL zAuI08!ZQo|O!n*OxeO#VIT~csvF}VuW)))R%h$?KOXpdw?}dQ*uZL@jI_PS zk2}!I0VBdZJ(}u1_x#HY^#$i77$z_`1alAK-)!WdK9aRv=2e^qG|XI1TwEMR$F*i_ z4@~72bi2C!bf0*2ZfE-Rb(Wn6{VR|5*0j?4oBe7tx|Z4hQJc)!=K08s6w+-~s3vLR z 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

    8AxF@6${vLy8kT0^5jw3ttbwWqKD{^* z>y(k|MkQ7WYmvV+@R2sQU-8L`8#)!vKc}mNatWs%X0JzNKhKcY&X7LgS>*RDyfeqT zvgdK8y1BS97~J5^o1-UzXBzr~aL9kaeFFnljc-4p2w{|1+pxS7Kv1?V5lOcq)22-guw zLVuppQfJ;(X$81NWzx>+Q4qskg%Am zq^)Pcux!Jl8_AV-NL9|0Sj8F6Zx4QVcwWn*MQl&=MHBX2^uW|kh`D((f`gF!Q`Nd} z9THl}$3J>9X?<`(8+CW>-SxsmlBY0grE?r4acJgrGSAT`me#nJcc|w|F(y#{SJ zBS>vbDJu26w*&puH+#LYJiql(XZ(3f1nD-l6zuT86jpN3>-NOw{aQf||8_1j4dFRE zcGow3{Zv023)Q6k@_FfZn> zV)UPMN&i=j=KseS{r8pGKabHbHkALxLb3C5{CgIPoBvN~(02JC`{U&#E#~wKa=LE~{6Z;BKUWtp?564O z6s=w+{X`eJf91OFmeUMBUmS>6o_xt5V8fKWE`xjPJuaT+G5r(*KiN)7zn8qVp7Rt! z^6Ji=KcN{mHXCuo%W|`OC9R&W_Ew@dKgzui`}H<4zhn^lHbPoX%7Kd+Deq>9BZ-aE zQ_E*};Z}nQfe$L{z~gS4gLWD+r$^wkW*G-S^!=UWzLcOGKTzDoz%Iuom2{L}MG*V` z#=%?fO!_BIPPtoi=Ht8*-MCx#-Up~MVq=wu`jSXMfm=7P5`HWn@q$y2JE*sk7EjteK8o%$hnck2Me zdhDSNewW;Ly-Ov4x5MX%Nx#~~#cX-x62=Y5KDxJ`LTGon$^jNZ%KRU#6L*%YM7#pV z1zfTR0T53W4|i*z@`K(Y+uGe_KshYG=p||IQq{|YK~gRtzwQXUJx=Ro_aR&7V^yHq zn*4Mh=Qrn^1>W0r*!>+`=MBpY{QeJD)K3R($lKd4rUt}lD6r+bknqn_Ji9gfWSsZQ z@Lv3@os2U~tKnOw0oels_Reln=7;vOJp|ubdzbV<^oc_1Cb75-hrsrBXmaN zU1Q#rEw~Hjx>;)vZa@$Nq5?dF{=s%f+TamqXNivq5(o~ z4{H<|+#=WJIhEgUs-5y>!A`n?e9ve!vcdzOJ4%5W@HMC(vL`o8gohRM3DQOm83bwi*NkN_Cpfa!lQyo|B$68N0 zH?6iv0YiY{L(V-p>(vJxqHW?Y$`?*b<$3!VGlJt(gMi|T;g7w`k?s`$cfg&O`@_|G z=XB*Z?BkCPE_W>pv~gCGL$f--L_fg*0DeM{EigNzlW-ij)p6%hT0;P7i}*8Z%^>Sq zy9Sb)AUoOVTRT6@&3Cz6&AIL>cWrj7(vY-u#wX$@o=_0U03eqCuxPnQ{^e(JrKRzg zPQS!91gtKflzwn9Z-XwJBy*mMmwxjDjN&;29F}I}@4OJVchVWhU;bm7yBDd$)6;u3b+ca&X0Dy?)TTX`Kff5Tzi)o(r+n$;edC$a zfA?MiO6!zuLd-VT#9>41C1ius-ct_BHRy_^Y4v*gb;@(&j=PO#q&uKB=K^YHtoZ2P z>%1{4y9;q8E=zKk$IoX10qBC1AN0Ay2#s_%M{_m}CkIJ58+sx98c4xb7QPXpL>{hm zPAkAvQ0<`FoQq87m#&s^fyq{`{q6g0yv_#7;;6-v6;d0islfo!G8a&^z*3x%?6n79 zURbk1jJvVe?6>s8Uvrw#U0TQPkPNPx^AmI=mLOGrcS1Wr*F>%C_})>

    RLX`1^|q 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¨p#(=RThCO_f@$rNgL!&Td7c2< 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 z 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 cP0Zq zG$yLRmy|lsOH&d9WD3ktG7Jo^&>%Y$fK6^6kk{t`Np=VerHAzinnpQ_*_8yo*tnJ5 zRAIfnt>ciwd*o;MiFT5fA3+bS$2#9-Vei?ST<^J8=#fmA`#SsbO~0x)JxEZHHM)%> zb$$!4Pqe=;u{UbARDBu4@b%Js@@V9`O5!2Oi^u~zx<3lCckAIvUj1<_@^K7}$+HKg zOxh6#KZJPnaP`h^K$mi5EsZS*$OU@_&3d85x~c~Eqi9J!>8!#7Js_o_KsJ8E@fKIf zrL3k@8`xWy+dFX$MiVh0hAn_MT2R8WpwBVJFi# zVJk{Xcqe8%a}C!UYc1|zJmeF!okx;m&x6n`Oj=tKI|0N>Zvg#>I8j>ove#P_8{=+R z0(|u$#ZA`NqRkZYQeDYa)-|FRD;Nfrlg)-&>*(YF6 z>ENC?S6xh-maT(~cM=BfMm19Mlie-rBAGvzZStK⁣$Z`t^s~qBPQvRNY)N7P!qD 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�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≥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. * - * * - ** GNU Lesser General Public License ** - * * - * This library 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. * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library. * - * If not, see . * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - ****************************************************************************/ -#ifndef LRLIMERENDER_H -#define LRLIMERENDER_H - -#include -#include -#include -//#include - -#include "lrreportrender.h" -#include "limerender_p.h" -#include "lrglobal.h" -#include "lrdatasourcemanagerintf.h" -#include "lrscriptenginemanagerintf.h" -#include "lrpreviewreportwidget.h" - -class QPrinter; - -namespace LimeReport { - -//class PrintRange{ -//public: -// int fromPage() const { return m_fromPage;} -// int toPage() const { return m_toPage;} -// QPrintDialog::PrintRange rangeType() const { return m_rangeType;} -// PrintRange(QAbstractPrintDialog::PrintRange rangeType=QPrintDialog::AllPages, int fromPage=0, int toPage=0); -// void setRangeType(QAbstractPrintDialog::PrintRange rangeType){ m_rangeType=rangeType;} -// void setFromPage(int fromPage){ m_fromPage = fromPage;} -// void setToPage(int toPage){ m_toPage = toPage;} -//private: -// QPrintDialog::PrintRange m_rangeType; -// int m_fromPage; -// int m_toPage; -//}; - -class DataSourceManager; -class LimeRenderPrivate; -class PageDesignIntf; -class PageItemDesignIntf; -class PreviewReportWidget; - -typedef QList< QSharedPointer > ReportPages; - -class LIMEREPORT_EXPORT LimeRender : public QObject{ - Q_OBJECT - friend class PreviewReportWidget; -public: - static void setSettings(QSettings *value){m_settings=value;} -public: - explicit LimeRender(QObject *parent = 0); - ~LimeRender(); - bool printReport(QPrinter *printer=0); - bool printPages(ReportPages pages, QPrinter *printer); - void printToFile(const QString& fileName); - PageDesignIntf *createPreviewScene(QObject *parent = 0); - bool printToPDF(const QString& fileName); - void previewReport(PreviewHints hints = PreviewBarsUserSetting); - IDataSourceManager* dataManager(); - IScriptEngineManager* scriptManager(); - bool loadFromFile(const QString& fileName, bool autoLoadPreviewOnChange = false); - bool loadFromByteArray(QByteArray *data); - bool loadFromString(const QString& data); - QString lastError(); - PreviewReportWidget *createPreviewWidget(QWidget *parent = 0); - void setPreviewWindowTitle(const QString& title); - void setPreviewWindowIcon(const QIcon& icon); - void setResultEditable(bool value); - bool resultIsEditable(); - bool isBusy(); - void setPassPharse(QString& passPharse); - QList aviableLanguages(); - bool setReportLanguage(QLocale::Language language); - Qt::LayoutDirection previewLayoutDirection(); - void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); -signals: - void renderStarted(); - void renderFinished(); - void renderPageFinished(int renderedPageCount); - void onLoad(bool& loaded); -public slots: - void cancelRender(); -protected: - LimeRenderPrivate * const d_ptr; - LimeRender(LimeRenderPrivate &dd, QObject * parent=0); -private: - Q_DECLARE_PRIVATE(LimeRender) - static QSettings* m_settings; -}; - -} // namespace LimeReport - -#endif // LRLIMERENDER_H diff --git a/limerender/limerender.pri b/limerender/limerender.pri deleted file mode 100644 index 1fffc27..0000000 --- a/limerender/limerender.pri +++ /dev/null @@ -1,156 +0,0 @@ -include(../common.pri) - -DEFINES += IS_RENDER_BUILD - -INCLUDEPATH += \ - $$REPORT_PATH/ \ - $$REPORT_PATH/items \ - $$REPORT_PATH/bands \ - $$REPORT_PATH/base \ - $$REPORT_PATH/scripteditor - -SOURCES += \ - $$REPORT_PATH/bands/lrpageheader.cpp \ - $$REPORT_PATH/bands/lrpagefooter.cpp \ - $$REPORT_PATH/bands/lrreportheader.cpp \ - $$REPORT_PATH/bands/lrreportfooter.cpp \ - $$REPORT_PATH/bands/lrdataband.cpp \ - $$REPORT_PATH/bands/lrgroupbands.cpp \ - $$REPORT_PATH/bands/lrsubdetailband.cpp \ - $$REPORT_PATH/bands/lrtearoffband.cpp \ - $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ - $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ - $$REPORT_PATH/serializators/lrxmlreader.cpp \ - $$REPORT_PATH/serializators/lrxmlwriter.cpp \ - $$REPORT_PATH/scripteditor/lrscripteditor.cpp \ - $$REPORT_PATH/scripteditor/lrcodeeditor.cpp \ - $$REPORT_PATH/scripteditor/lrscripthighlighter.cpp \ - $$REPORT_PATH/items/lrhorizontallayout.cpp \ - $$REPORT_PATH/items/editors/lritemeditorwidget.cpp \ - $$REPORT_PATH/items/editors/lrfonteditorwidget.cpp \ - $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ - $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ - $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ - $$REPORT_PATH/items/lrsimpletagparser.cpp \ - $$REPORT_PATH/items/lrimageitem.cpp \ - $$REPORT_PATH/items/lrtextitemeditor.cpp \ - $$REPORT_PATH/items/lrshapeitem.cpp \ - $$REPORT_PATH/items/lrtextitem.cpp \ - $$REPORT_PATH/lrbanddesignintf.cpp \ - $$REPORT_PATH/lrpageitemdesignintf.cpp \ - $$REPORT_PATH/lrpagedesignintf.cpp \ - $$REPORT_PATH/lrbandsmanager.cpp \ - $$REPORT_PATH/lrglobal.cpp \ - $$REPORT_PATH/lritemdesignintf.cpp \ - $$REPORT_PATH/lrdatadesignintf.cpp \ - $$REPORT_PATH/lrbasedesignintf.cpp \ - $$REPORT_PATH/lrdatasourcemanager.cpp \ - $$REPORT_PATH/lrreportrender.cpp \ - $$REPORT_PATH/lrscriptenginemanager.cpp \ - $$REPORT_PATH/lrpreviewreportwindow.cpp \ - $$REPORT_PATH/lrpreviewreportwidget.cpp \ - $$REPORT_PATH/lrgraphicsviewzoom.cpp \ - $$REPORT_PATH/lrvariablesholder.cpp \ - $$REPORT_PATH/lrgroupfunctions.cpp \ - $$REPORT_PATH/lrsimplecrypt.cpp \ - $$REPORT_PATH/lraboutdialog.cpp \ - $$REPORT_PATH/lritemscontainerdesignitf.cpp \ - $$REPORT_PATH/lrcolorindicator.cpp \ - $$REPORT_PATH/items/lrchartitem.cpp \ - $$REPORT_PATH/lrreporttranslation.cpp -# $$PWD/lrreportrender.cpp - - -contains(CONFIG, staticlib){ - SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp -} - -contains(CONFIG, zint){ - SOURCES += $$REPORT_PATH/items/lrbarcodeitem.cpp -} - -HEADERS += \ - $$REPORT_PATH/base/lrsingleton.h \ - $$REPORT_PATH/base/lrsimpleabstractfactory.h \ - $$REPORT_PATH/base/lrattribsabstractfactory.h \ - $$REPORT_PATH/bands/lrpageheader.h \ - $$REPORT_PATH/bands/lrpagefooter.h \ - $$REPORT_PATH/bands/lrreportheader.h \ - $$REPORT_PATH/bands/lrreportfooter.h \ - $$REPORT_PATH/bands/lrdataband.h \ - $$REPORT_PATH/bands/lrtearoffband.h \ - $$REPORT_PATH/bands/lrsubdetailband.h \ - $$REPORT_PATH/bands/lrgroupbands.h \ - $$REPORT_PATH/serializators/lrserializatorintf.h \ - $$REPORT_PATH/serializators/lrstorageintf.h \ - $$REPORT_PATH/serializators/lrxmlqrectserializator.h \ - $$REPORT_PATH/serializators/lrxmlserializatorsfactory.h \ - $$REPORT_PATH/serializators/lrxmlbasetypesserializators.h \ - $$REPORT_PATH/serializators/lrxmlreader.h \ - $$REPORT_PATH/serializators/lrxmlwriter.h \ - $$REPORT_PATH/scripteditor/lrscripteditor.h \ - $$REPORT_PATH/scripteditor/lrcodeeditor.h \ - $$REPORT_PATH/scripteditor/lrscripthighlighter.h \ - $$REPORT_PATH/items/editors/lritemeditorwidget.h \ - $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ - $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ - $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ - $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ - $$REPORT_PATH/items/lrtextitem.h \ - $$REPORT_PATH/items/lrhorizontallayout.h \ - $$REPORT_PATH/items/lrtextitemeditor.h \ - $$REPORT_PATH/items/lrshapeitem.h \ - $$REPORT_PATH/items/lrimageitem.h \ - $$REPORT_PATH/items/lrsimpletagparser.h \ - $$REPORT_PATH/lrfactoryinitializer.h \ - $$REPORT_PATH/lrbanddesignintf.h \ - $$REPORT_PATH/lrpageitemdesignintf.h \ - $$REPORT_PATH/lrbandsmanager.h \ - $$REPORT_PATH/lrglobal.h \ - $$REPORT_PATH/lrdatadesignintf.h \ - $$REPORT_PATH/lrcollection.h \ - $$REPORT_PATH/lrpagedesignintf.h \ - $$REPORT_PATH/lrdatasourcemanager.h \ - $$REPORT_PATH/lrreportrender.h \ - $$REPORT_PATH/lrpreviewreportwindow.h \ - $$REPORT_PATH/lrpreviewreportwidget.h \ - $$REPORT_PATH/lrpreviewreportwidget_p.h \ - $$REPORT_PATH/lrgraphicsviewzoom.h \ - $$REPORT_PATH/lrbasedesignintf.h \ - $$REPORT_PATH/lritemdesignintf.h \ - $$REPORT_PATH/lrdesignelementsfactory.h \ - $$REPORT_PATH/lrscriptenginemanager.h \ - $$REPORT_PATH/lrvariablesholder.h \ - $$REPORT_PATH/lrgroupfunctions.h \ - $$REPORT_PATH/lrdatasourcemanagerintf.h \ - $$REPORT_PATH/lrscriptenginemanagerintf.h \ - $$REPORT_PATH/lrsimplecrypt.h \ - $$REPORT_PATH/lraboutdialog.h \ - $$REPORT_PATH/lrcallbackdatasourceintf.h \ - $$REPORT_PATH/lrpreviewreportwidget_p.h \ - $$REPORT_PATH/lritemscontainerdesignitf.h \ - $$REPORT_PATH/lrcolorindicator.h \ - $$REPORT_PATH/items/lrchartitem.h \ - $$REPORT_PATH/lrreporttranslation.h -# $$PWD/limerender.h \ -# $$PWD/limerender_p.h - -contains(CONFIG, staticlib){ - HEADERS += $$REPORT_PATH/lrfactoryinitializer.h -} - -contains(CONFIG,zint){ - HEADERS += $$REPORT_PATH/items/lrbarcodeitem.h -} - -FORMS += \ - $$REPORT_PATH/lrpreviewreportwindow.ui \ - $$REPORT_PATH/lrpreviewreportwidget.ui \ - $$REPORT_PATH/items/lrtextitemeditor.ui \ - $$REPORT_PATH/lraboutdialog.ui \ - $$REPORT_PATH/scripteditor/lrscripteditor.ui - -RESOURCES += \ - $$REPORT_PATH/report.qrc \ - $$REPORT_PATH/items/items.qrc - diff --git a/limerender/limerender.pro b/limerender/limerender.pro deleted file mode 100644 index 12f8bd3..0000000 --- a/limerender/limerender.pro +++ /dev/null @@ -1,124 +0,0 @@ -contains(CONFIG,release) { - TARGET = limerender -} else { - TARGET = limerenderd -} - -TEMPLATE = lib - -contains(CONFIG, static_build){ - CONFIG += staticlib -} - -!contains(CONFIG, staticlib){ - CONFIG += lib - CONFIG += dll -} - -CONFIG += create_prl -CONFIG += link_prl - -macx{ - CONFIG -= dll - CONFIG += lib_bundle - CONFIG += plugin -} - -DEFINES += LIMEREPORT_EXPORTS - -contains(CONFIG, staticlib){ - DEFINES += HAVE_STATIC_BUILD - message(STATIC_BUILD) - DEFINES -= LIMEREPORT_EXPORTS -} - -EXTRA_FILES += \ - $$PWD/../limereport/lrglobal.cpp \ - $$PWD/../limereport/lrglobal.h \ - $$PWD/../limereport/lrdatasourcemanagerintf.h \ - $$PWD/../limereport/lrreportengine.h \ - $$PWD/../limereport/lrscriptenginemanagerintf.h \ - $$PWD/../limereport/lrcallbackdatasourceintf.h \ - $$PWD/../limereport/lrpreviewreportwidget.h - -include(limerender.pri) - -unix:{ - DESTDIR = $${DEST_LIBS} - linux{ - QMAKE_POST_LINK += mkdir -p $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t) # qmake need make mkdir -p on subdirs more than root/ - for(FILE,EXTRA_FILES){ - QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t) # inside of libs make /include/files - } - } - macx{ - for(FILE,EXTRA_FILES){ - QMAKE_POST_LINK += $$QMAKE_COPY $$quote($$FILE) $$quote($${DEST_INCLUDE_DIR}) $$escape_expand(\\n\\t) - } - QMAKE_POST_LINK += mkdir -p $$quote($${DESTDIR}/include) $$escape_expand(\\n\\t) - } - QMAKE_POST_LINK += $$QMAKE_COPY_DIR $$quote($${DEST_INCLUDE_DIR}) $$quote($${DESTDIR}) -} - -win32 { - EXTRA_FILES ~= s,/,\\,g - BUILD_DIR ~= s,/,\\,g - DESTDIR = $${DEST_LIBS} - DEST_DIR = $$DESTDIR/include - DEST_DIR ~= s,/,\\,g - DEST_INCLUDE_DIR ~= s,/,\\,g - - for(FILE,EXTRA_FILES){ - QMAKE_POST_LINK += $$QMAKE_COPY \"$$FILE\" \"$${DEST_INCLUDE_DIR}\" $$escape_expand(\\n\\t) - } - QMAKE_POST_LINK += $$QMAKE_COPY_DIR \"$${DEST_INCLUDE_DIR}\" \"$${DEST_DIR}\" -} - -contains(CONFIG,zint){ - message(zint) - INCLUDEPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt - DEPENDPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt - LIBS += -L$${DEST_LIBS} - contains(CONFIG,release) { - LIBS += -lQtZint - } else { - LIBS += -lQtZintd - } -} - -####Automatically build required translation files (*.qm) - -contains(CONFIG,build_translations){ - LANGUAGES = ru es_ES ar - - defineReplace(prependAll) { - for(a,$$1):result += $$2$${a}$$3 - return($$result) - } - - TRANSLATIONS = $$prependAll(LANGUAGES, \"$$TRANSLATIONS_PATH/limereport_,.ts\") - - qtPrepareTool(LUPDATE, lupdate) - -greaterThan(QT_MAJOR_VERSION, 4) { - ts.commands = $$LUPDATE $$shell_quote($$PWD) -ts $$TRANSLATIONS -} -lessThan(QT_MAJOR_VERSION, 5){ - ts.commands = $$LUPDATE $$quote($$PWD) -ts $$TRANSLATIONS -} - TRANSLATIONS_FILES = - qtPrepareTool(LRELEASE, lrelease) - for(tsfile, TRANSLATIONS) { - qmfile = $$tsfile - qmfile ~= s,".ts\"$",".qm\"", - qm.commands += $$LRELEASE -removeidentical $$tsfile -qm $$qmfile $$escape_expand(\\n\\t) - tmp_command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile $$escape_expand(\\n\\t) - TRANSLATIONS_FILES += $$qmfile - } - qm.depends = ts - OTHER_FILES += $$TRANSLATIONS - QMAKE_EXTRA_TARGETS += qm ts - POST_TARGETDEPS += qm -} - -#### EN AUTOMATIC TRANSLATIONS diff --git a/limerender/limerender_p.h b/limerender/limerender_p.h deleted file mode 100644 index af650b4..0000000 --- a/limerender/limerender_p.h +++ /dev/null @@ -1,192 +0,0 @@ -/*************************************************************************** - * This file is part of the Lime Report project * - * Copyright (C) 2015 by Alexander Arin * - * arin_a@bk.ru * - * * - ** GNU General Public License Usage ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - ** GNU Lesser General Public License ** - * * - * This library 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. * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library. * - * If not, see . * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - ****************************************************************************/ -#ifndef LRLIMERENDER_P_H -#define LRLIMERENDER_P_H - -#include -#include -#include - -#include "limerender.h" -#include "lrcollection.h" -#include "lrglobal.h" -#include "lrdatasourcemanager.h" -#include "lrbanddesignintf.h" -#include "serializators/lrstorageintf.h" -#include "lrscriptenginemanager.h" -#include "lrreporttranslation.h" - -class QFileSystemWatcher; - -namespace LimeReport{ - -class PageDesignIntf; -class PrintRange; -class ReportDesignWindow; - -//TODO: Add on render callback - -class LimeRenderPrivate : public QObject, public ICollectionContainer, public ITranslationContainer -{ - Q_OBJECT - Q_DECLARE_PUBLIC(ReportEngine) - Q_PROPERTY(ACollectionProperty pages READ fakeCollectionReader()) - Q_PROPERTY(QObject* datasourcesManager READ dataManager) - Q_PROPERTY(QObject* scriptContext READ scriptContext) - Q_PROPERTY(bool suppressFieldAndVarError READ suppressFieldAndVarError WRITE setSuppressFieldAndVarError) - Q_PROPERTY(ATranslationProperty translation READ fakeTranslationReader) - friend class PreviewReportWidget; -public: - static void printReport(ItemsReaderIntf::Ptr reader, QPrinter &printer); - static void printReport(ReportPages pages, QPrinter &printer); - Q_INVOKABLE QStringList aviableReportTranslations(); - Q_INVOKABLE void setReportTranslation(const QString& languageName); -public: - explicit LimeRenderPrivate(QObject *parent = 0); - virtual ~LimeRenderPrivate(); - - PageDesignIntf* appendPage(const QString& pageName=""); - bool deletePage(PageDesignIntf *page); - PageDesignIntf* createPreviewPage(); - PageDesignIntf* pageAt(int index){return (index<=(m_pages.count()-1)) ? m_pages.at(index):0;} - int pageCount() {return m_pages.count();} - DataSourceManager* dataManager(){return m_datasources;} - ScriptEngineContext* scriptContext(){return m_scriptEngineContext;} - ScriptEngineManager* scriptManager(); - IDataSourceManager* dataManagerIntf(){return m_datasources;} - - IScriptEngineManager* scriptManagerIntf(){ - ScriptEngineManager::instance().setDataManager(dataManager()); - return &ScriptEngineManager::instance(); - } - - void clearReport(); - bool printReport(QPrinter *printer=0); - bool printPages(ReportPages pages, QPrinter *printer); - void printToFile(const QString& fileName); - bool printToPDF(const QString& fileName); - void previewReport(PreviewHints hints = PreviewBarsUserSetting); - void setSettings(QSettings* value); - QSettings* settings(); - bool loadFromFile(const QString& fileName, bool autoLoadPreviewOnChange); - bool loadFromByteArray(QByteArray *data, const QString& name = ""); - bool loadFromString(const QString& report, const QString& name = ""); - QString lastError(); - ReportEngine * q_ptr; - bool emitLoadReport(); - bool hasActivePreview(){return m_activePreview;} - PageDesignIntf *createPreviewScene(QObject *parent); - PreviewReportWidget *createPreviewWidget(QWidget *parent); - QIcon previewWindowIcon() const; - void setPreviewWindowIcon(const QIcon &previewWindowIcon); - QString previewWindowTitle() const; - void setPreviewWindowTitle(const QString &previewWindowTitle); - - bool suppressFieldAndVarError() const; - void setSuppressFieldAndVarError(bool suppressFieldAndVarError); - bool isBusy(); - bool resultIsEditable() const; - void setResultEditable(bool value); - - void setPassPhrase(const QString &passPhrase); - bool addTranslationLanguage(QLocale::Language language); - bool removeTranslationLanguage(QLocale::Language language); - bool setReportLanguage(QLocale::Language language); - QList aviableLanguages(); - ReportTranslation* reportTranslation(QLocale::Language language); - void reorderPages(const QList &reorderedPages); - void clearSelection(); - Qt::LayoutDirection previewLayoutDirection(); - void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); -signals: - void pagesLoadFinished(); - void datasourceCollectionLoadFinished(const QString& collectionName); - void cleared(); - void renderStarted(); - void renderFinished(); - void renderPageFinished(int renderedPageCount); - void onLoad(bool& loaded); -public slots: - bool slotLoadFromFile(const QString& fileName); - void cancelRender(); -protected: - PageDesignIntf* createPage(const QString& pageName=""); -protected slots: - void slotDataSourceCollectionLoaded(const QString& collectionName); -private slots: - void slotPreviewWindowDestroyed(QObject *window); -private: - //ICollectionContainer - virtual QObject* createElement(const QString&,const QString&); - virtual int elementsCount(const QString&); - virtual QObject* elementAt(const QString&, int index); - virtual void collectionLoadFinished(const QString&); - void saveError(QString message); - void showError(QString message); - //ICollectionContainer - //ITranslationContainer - Translations* translations(){ return &m_translations;} - void updateTranslations(); - //ITranslationContainer - ReportPages renderToPages(); - QString renderToString(); - PageDesignIntf* getPageByName(const QString& pageName); - ATranslationProperty fakeTranslationReader(){ return ATranslationProperty();} -private: - QList m_pages; - DataSourceManager* m_datasources; - ScriptEngineContext* m_scriptEngineContext; - ReportRender::Ptr m_reportRender; - QString m_fileName; - QString m_lastError; - QSettings* m_settings; - bool m_ownedSettings; - QScopedPointer m_printer; - bool m_printerSelected; - bool m_showProgressDialog; - QString m_reportsDir; - QString m_reportName; - QMainWindow* m_activePreview; - QIcon m_previewWindowIcon; - QString m_previewWindowTitle; - QPointer m_designerWindow; - ReportSettings m_reportSettings; - bool m_LimeRendering; - bool m_resultIsEditable; - QString m_passPhrase; - QFileSystemWatcher *m_fileWatcher; - Translations m_translations; - QLocale::Language m_reportLanguage; - void activateLanguage(QLocale::Language language); - Qt::LayoutDirection m_previewLayoutDirection; -}; - -} -#endif // LRLIMERENDER_P_H diff --git a/limerender/lrreportrender.cpp b/limerender/lrreportrender.cpp deleted file mode 100644 index 782db29..0000000 --- a/limerender/lrreportrender.cpp +++ /dev/null @@ -1,1104 +0,0 @@ -/*************************************************************************** - * This file is part of the Lime Report project * - * Copyright (C) 2015 by Alexander Arin * - * arin_a@bk.ru * - * * - ** GNU General Public License Usage ** - * * - * This library is free software: you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * - * the Free Software Foundation, either version 3 of the License, or * - * (at your option) any later version. * - * You should have received a copy of the GNU General Public License * - * along with this program. If not, see . * - * * - ** GNU Lesser General Public License ** - * * - * This library 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. * - * You should have received a copy of the GNU Lesser General Public * - * License along with this library. * - * If not, see . * - * * - * This library is distributed in the hope that it will be useful, * - * but WITHOUT ANY WARRANTY; without even the implied warranty of * - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * - * GNU General Public License for more details. * - ****************************************************************************/ -#include -#include -#include -#include -#include -#include -#include - -#include "time.h" - -#include "limerender_p.h" -#include "limerender.h" - -#include "lrpagedesignintf.h" -#include "lrdatasourcemanager.h" -#include "lrreportrender.h" -#include "serializators/lrxmlwriter.h" -#include "serializators/lrxmlreader.h" -#include "lrpreviewreportwindow.h" -#include "lrpreviewreportwidget.h" -#include "lrpreviewreportwidget_p.h" - -#ifdef HAVE_STATIC_BUILD -#include "lrfactoryinitializer.h" -#endif -namespace LimeReport{ - -QSettings* LimeRender::m_settings = 0; - -LimeRenderPrivate::LimeRenderPrivate(QObject *parent) : - QObject(parent), m_fileName(""), m_settings(0), m_ownedSettings(false), - m_printer(new QPrinter(QPrinter::HighResolution)), m_printerSelected(false), - m_showProgressDialog(true), m_reportName(""), m_activePreview(0), - m_previewWindowIcon(":/report/images/logo32"), m_previewWindowTitle(tr("Preview")), - m_LimeRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), - m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage) -{ -#ifdef HAVE_STATIC_BUILD - initResources(); - initReportItems(); - initObjectInspectorProperties(); - initSerializators(); -#endif - m_datasources = new DataSourceManager(this); - m_datasources->setReportSettings(&m_reportSettings); - m_scriptEngineContext = new ScriptEngineContext(this); - - ICallbackDatasource* tableOfContens = m_datasources->createCallbackDatasource("tableofcontens"); - connect(tableOfContens, SIGNAL(getCallbackData(LimeReport::CallbackInfo,QVariant&)), - m_scriptEngineContext->tableOfContens(), SLOT(slotOneSlotDS(LimeReport::CallbackInfo,QVariant&))); - - m_datasources->setObjectName("datasources"); - connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); - connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &))); -} - -LimeRenderPrivate::~LimeRenderPrivate() -{ - if (m_activePreview){ - m_activePreview->close(); - } - foreach(PageDesignIntf* page,m_pages) delete page; - m_pages.clear(); - - foreach(ReportTranslation* translation, m_translations) - delete translation; - m_translations.clear(); - - if (m_ownedSettings&&m_settings) delete m_settings; -} - -QObject* LimeRenderPrivate::createElement(const QString &, const QString &) -{ - return appendPage(); -} - -QObject *LimeRenderPrivate::elementAt(const QString &, int index) -{ - return pageAt(index); -} - -PageDesignIntf *LimeRenderPrivate::createPage(const QString &pageName) -{ - PageDesignIntf* page =new PageDesignIntf(); - page->setObjectName(pageName); - page->pageItem()->setObjectName("Report"+pageName); - page->setReportRender(this); - page->setReportSettings(&m_reportSettings); - return page; -} - -PageDesignIntf *LimeRenderPrivate::appendPage(const QString &pageName) -{ - PageDesignIntf* page = createPage(pageName); - m_pages.append(page); - return page; -} - -bool LimeRenderPrivate::deletePage(PageDesignIntf *page){ - QList::iterator it = m_pages.begin(); - while (it != m_pages.end()){ - if (*it == page) { - it = m_pages.erase(it); - return true; - } else ++it; - } - return false; -} - -PageDesignIntf *LimeRenderPrivate::createPreviewPage() -{ - return createPage(); -} - -int LimeRenderPrivate::elementsCount(const QString &) -{ - return m_pages.count(); -} - -void LimeRenderPrivate::collectionLoadFinished(const QString &) -{ - foreach (PageDesignIntf* page, m_pages) { - page->setReportRender(this); - page->setReportSettings(&m_reportSettings); - page->setSceneRect(-Const::SCENE_MARGIN,-Const::SCENE_MARGIN, - page->pageItem()->width()+Const::SCENE_MARGIN*2, - page->pageItem()->height()+Const::SCENE_MARGIN*2); - } - emit pagesLoadFinished(); -} - -void LimeRenderPrivate::saveError(QString message) -{ - m_lastError = message; -} - -void LimeRenderPrivate::showError(QString message) -{ - QMessageBox::critical(0,tr("Error"),message); -} - -void LimeRenderPrivate::updateTranslations() -{ - foreach(ReportTranslation* translation, m_translations.values()){ - foreach(PageDesignIntf* page, m_pages){ - translation->updatePageTranslation(page); - } - } -} - -void LimeRenderPrivate::slotDataSourceCollectionLoaded(const QString &collectionName) -{ - emit datasourceCollectionLoadFinished(collectionName); -} - -void LimeRenderPrivate::slotPreviewWindowDestroyed(QObject* window) -{ - if (m_activePreview == window){ - m_activePreview = 0; - } -} - -void LimeRenderPrivate::clearReport() -{ - foreach(PageDesignIntf* page,m_pages) delete page; - m_pages.clear(); - foreach(ReportTranslation* reportTranslation, m_translations) - delete reportTranslation; - m_translations.clear(); - m_datasources->clear(DataSourceManager::Owned); - m_fileName=""; - m_scriptEngineContext->clear(); - m_reportSettings.setDefaultValues(); - - emit cleared(); -} - -void LimeRenderPrivate::printReport(ItemsReaderIntf::Ptr reader, QPrinter& printer) -{ - LimeReport::PageDesignIntf renderPage; - renderPage.setItemMode(PrintMode); - if (reader->first()){ - reader->readItem(renderPage.pageItem()); - printer.setFullPage(renderPage.pageItem()->fullPage()); - printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); - renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); - - if (renderPage.pageItem()->pageSize()==PageItemDesignIntf::Custom){ - QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? - QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): - renderPage.pageItem()->sizeMM(); - printer.setPaperSize(pageSize,QPrinter::Millimeter); - } else { - printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize()); - } - - QPainter painter(&printer); - renderPage.render(&painter); - - while (reader->next()){ - printer.newPage(); - renderPage.removeAllItems(); - reader->readItem(renderPage.pageItem()); - renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); - renderPage.render(&painter); - } - } -} - -void LimeRenderPrivate::printReport(ReportPages pages, QPrinter &printer) -{ - LimeReport::PageDesignIntf renderPage; - renderPage.setItemMode(PrintMode); - QPainter* painter=0; - - bool isFirst = true; - int currenPage = 1; - - - qreal leftMargin, topMargin, rightMargin, bottomMargin; - printer.getPageMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin, QPrinter::Millimeter); - - QRectF printerPageRect = printer.pageRect(QPrinter::Millimeter); - printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR, - (printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR); - - foreach(PageItemDesignIntf::Ptr page, pages){ - - if ( - (printer.printRange() == QPrinter::AllPages) || - ( (printer.printRange()==QPrinter::PageRange) && - (currenPage>=printer.fromPage()) && - (currenPage<=printer.toPage()) - ) - ) - { - - QPointF pagePos = page->pos(); - - page->setPos(0,0); - renderPage.setPageItem(page); - renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); - if (renderPage.pageItem()->oldPrintMode()){ - printer.setPageMargins(renderPage.pageItem()->leftMargin(), - renderPage.pageItem()->topMargin(), - renderPage.pageItem()->rightMargin(), - renderPage.pageItem()->bottomMargin(), - QPrinter::Millimeter); - printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); - QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? - QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): - renderPage.pageItem()->sizeMM(); - printer.setPaperSize(pageSize,QPrinter::Millimeter); - } else { - printer.setFullPage(renderPage.pageItem()->fullPage()); - printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); - if (renderPage.pageItem()->pageSize()==PageItemDesignIntf::Custom){ - QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? - QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): - renderPage.pageItem()->sizeMM(); - if (page->getSetPageSizeToPrinter()) - printer.setPaperSize(pageSize,QPrinter::Millimeter); - } else { - if (page->getSetPageSizeToPrinter()) - printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize()); - } - } - - if (!isFirst){ - printer.newPage(); - } else { - isFirst=false; - painter = new QPainter(&printer); - } - - if (printerPageRect.width() < page->geometry().width()){ - qreal pageWidth = page->geometry().width(); - QRectF currentPrintingRect = printerPageRect; - while (pageWidth>0){ - renderPage.render(painter, printer.pageRect(), currentPrintingRect); - currentPrintingRect.adjust(printerPageRect.size().width(),0,printerPageRect.size().width(),0); - pageWidth -= printerPageRect.size().width(); - if (pageWidth>0) printer.newPage(); - } - - } else { - renderPage.render(painter); - } - - - page->setPos(pagePos); - } - - currenPage++; - } - delete painter; -} - -QStringList LimeRenderPrivate::aviableReportTranslations() -{ - QStringList result; - foreach (QLocale::Language language, aviableLanguages()){ - result << QLocale::languageToString(language); - } - return result; -} - -void LimeRenderPrivate::setReportTranslation(const QString &languageName) -{ - foreach(QLocale::Language language, aviableLanguages()){ - if (QLocale::languageToString(language).compare(languageName) == 0){ - setReportLanguage(language); - } - } -}; - -bool LimeRenderPrivate::printReport(QPrinter* printer) -{ - if (!printer&&!m_printerSelected){ - QPrinterInfo pi; - if (!pi.defaultPrinter().isNull()) -#ifdef HAVE_QT4 - m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); -#endif -#ifdef HAVE_QT5 - m_printer.data()->setPrinterName(pi.defaultPrinterName()); -#endif - QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); - m_printerSelected = dialog.exec()!=QDialog::Rejected; - } - if (!printer&&!m_printerSelected) return false; - - printer =(printer)?printer:m_printer.data(); - if (printer&&printer->isValid()){ - try{ - dataManager()->setDesignTime(false); - ReportPages pages = renderToPages(); - dataManager()->setDesignTime(true); - if (pages.count()>0){ - printReport(pages,*printer); - } - } catch(ReportError &exception){ - saveError(exception.what()); - } - return true; - } else return false; -} - -bool LimeRenderPrivate::printPages(ReportPages pages, QPrinter *printer) -{ - if (!printer&&!m_printerSelected){ - QPrinterInfo pi; - if (!pi.defaultPrinter().isNull()) -#ifdef HAVE_QT4 - m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); -#endif -#ifdef HAVE_QT5 - m_printer.data()->setPrinterName(pi.defaultPrinterName()); -#endif - QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); - m_printerSelected = dialog.exec()!=QDialog::Rejected; - } - if (!printer&&!m_printerSelected) return false; - - printer =(printer)?printer:m_printer.data(); - if (printer&&printer->isValid()){ - try{ - if (pages.count()>0){ - printReport( - pages, - *printer - ); - } - } catch(ReportError &exception){ - saveError(exception.what()); - } - return true; - } else return false; -} - -void LimeRenderPrivate::printToFile(const QString &fileName) -{ - if (!fileName.isEmpty()){ - QFile file(fileName); - if (file.open(QIODevice::WriteOnly)){ - QTextStream out(&file); - try { - dataManager()->setDesignTime(false); - out<setDesignTime(true); - } catch( ReportError &exception){ - saveError(exception.what()); - } - } - file.close(); - } -} - -bool LimeRenderPrivate::printToPDF(const QString &fileName) -{ - if (!fileName.isEmpty()){ - QFileInfo fi(fileName); - QString fn = fileName; - if (fi.suffix().isEmpty()) - fn+=".pdf"; - QPrinter printer; - printer.setOutputFileName(fn); - printer.setOutputFormat(QPrinter::PdfFormat); - return printReport(&printer); - } - return false; -} - -void LimeRenderPrivate::previewReport(PreviewHints hints) -{ -// QTime start = QTime::currentTime(); - try{ - dataManager()->setDesignTime(false); - ReportPages pages = renderToPages(); - dataManager()->setDesignTime(true); - if (pages.count()>0){ - Q_Q(LimeRender); - PreviewReportWindow* w = new PreviewReportWindow(q,0,settings()); - w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint| Qt::WindowMinMaxButtonsHint); - w->setAttribute(Qt::WA_DeleteOnClose,true); - w->setWindowModality(Qt::ApplicationModal); - //w->setWindowIcon(QIcon(":/report/images/main.ico")); - w->setWindowIcon(m_previewWindowIcon); - w->setWindowTitle(m_previewWindowTitle); - w->setSettings(settings()); - w->setPages(pages); - w->setLayoutDirection(m_previewLayoutDirection); - if (!dataManager()->errorsList().isEmpty()){ - w->setErrorMessages(dataManager()->errorsList()); - } - - if (!hints.testFlag(PreviewBarsUserSetting)){ - w->setMenuVisible(!hints.testFlag(HidePreviewMenuBar)); - w->setStatusBarVisible(!hints.testFlag(HidePreviewStatusBar)); - w->setToolBarVisible(!hints.testFlag(HidePreviewToolBar)); - } - - w->setHideResultEditButton(resultIsEditable()); - - m_activePreview = w; - connect(w,SIGNAL(destroyed(QObject*)), this, SLOT(slotPreviewWindowDestroyed(QObject*))); - w->exec(); - } - } catch (ReportError &exception){ - saveError(exception.what()); - showError(exception.what()); - } -} - -PreviewReportWidget* LimeRenderPrivate::createPreviewWidget(QWidget* parent){ - - Q_Q(LimeRender); - PreviewReportWidget* widget = new PreviewReportWidget(q, parent); - try{ - dataManager()->setDesignTime(false); - ReportPages pages = renderToPages(); - dataManager()->setDesignTime(true); - if (pages.count()>0) - widget->d_ptr->setPages(pages); - } catch (ReportError &exception){ - saveError(exception.what()); - showError(exception.what()); - } - return widget; -} - -PageDesignIntf* LimeRenderPrivate::createPreviewScene(QObject* parent){ - PageDesignIntf* result = 0; - try { - ReportPages pages = renderToPages(); - result = new PageDesignIntf(parent); - result->setPageItems(pages); - } catch (ReportError &exception){ - saveError(exception.what()); - showError(exception.what()); - } - return result; -} - -bool LimeRenderPrivate::emitLoadReport() -{ - bool result = false; - emit onLoad(result); - return result; -} - -bool LimeRenderPrivate::slotLoadFromFile(const QString &fileName) -{ - PreviewReportWindow *currentPreview = qobject_cast(m_activePreview); - - if (!QFile::exists(fileName)) - { - if ( hasActivePreview() ) - { - QMessageBox::information( NULL, - tr( "Report File Change" ), - tr( "The report file \"%1\" has changed names or been deleted.\n\nThis preview is no longer valid." ).arg( fileName ) - ); - - clearReport(); - - currentPreview->close(); - } - - return false; - } - - clearReport(); - - ItemsReaderIntf::Ptr reader = FileXMLReader::create(fileName); - reader->setPassPhrase(m_passPhrase); - if (reader->first()){ - if (reader->readItem(this)){ - m_fileName=fileName; - QFileInfo fi(fileName); - m_reportName = fi.fileName(); - - QString dbSettingFileName = fi.absolutePath()+"/"+fi.baseName()+".db"; - if (QFile::exists(dbSettingFileName)){ - QSettings dbcredentals(dbSettingFileName, QSettings::IniFormat); - foreach (ConnectionDesc* connection, dataManager()->conections()) { - if (!connection->keepDBCredentials()){ - dbcredentals.beginGroup(connection->name()); - connection->setUserName(dbcredentals.value("user").toString()); - connection->setPassword(dbcredentals.value("password").toString()); - dbcredentals.endGroup(); - } - } - } - - dataManager()->connectAutoConnections(); - - if ( hasActivePreview() ) - { - currentPreview->reloadPreview(); - } - return true; - }; - } - m_lastError = reader->lastError(); - return false; -} - -void LimeRenderPrivate::cancelRender() -{ - if (m_LimeRender) - m_LimeRender->cancelRender(); - m_LimeRendering = false; -} - -PageDesignIntf* LimeRender::createPreviewScene(QObject* parent){ - Q_D(LimeRender); - return d->createPreviewScene(parent); -} - -void LimeRenderPrivate::setSettings(QSettings* value) -{ - if (value){ - if (m_ownedSettings&&m_settings) - delete m_settings; - m_settings = value; - m_ownedSettings = false; - } -} - -QSettings*LimeRenderPrivate::settings() -{ - if (m_settings){ - return m_settings; - } else { - m_settings = new QSettings("LimeReport",QApplication::applicationName()); - m_ownedSettings=true; - return m_settings; - } -} - -bool LimeRenderPrivate::loadFromFile(const QString &fileName, bool autoLoadPreviewOnChange) -{ - // only watch one file at a time - if ( !m_fileWatcher->files().isEmpty() ) - { - m_fileWatcher->removePaths( m_fileWatcher->files() ); - } - - if ( autoLoadPreviewOnChange ) - { - m_fileWatcher->addPath( fileName ); - } - - return slotLoadFromFile( fileName ); -} - -bool LimeRenderPrivate::loadFromByteArray(QByteArray* data, const QString &name){ - clearReport(); - - ItemsReaderIntf::Ptr reader = ByteArrayXMLReader::create(data); - reader->setPassPhrase(m_passPhrase); - if (reader->first()){ - if (reader->readItem(this)){ - m_fileName = ""; - m_reportName = name; - return true; - }; - } - return false; -} - -bool LimeRenderPrivate::loadFromString(const QString &report, const QString &name) -{ - clearReport(); - - ItemsReaderIntf::Ptr reader = StringXMLreader::create(report); - reader->setPassPhrase(m_passPhrase); - if (reader->first()){ - if (reader->readItem(this)){ - m_fileName = ""; - m_reportName = name; - return true; - }; - } - return false; -} - -QString LimeRenderPrivate::renderToString() -{ - LimeReport::LimeRender render; - dataManager()->connectAllDatabases(); - dataManager()->setDesignTime(false); - if (m_pages.count()){ - render.setDatasources(dataManager()); - render.setScriptContext(scriptContext()); - return render.renderPageToString(m_pages.at(0)); - }else return QString(); -} - -PageDesignIntf* LimeRenderPrivate::getPageByName(const QString& pageName) -{ - foreach(PageDesignIntf* page, m_pages){ - if ( page->objectName().compare(pageName, Qt::CaseInsensitive) == 0) - return page; - } - return 0; -} - -Qt::LayoutDirection LimeRenderPrivate::previewLayoutDirection() -{ - return m_previewLayoutDirection; -} - -void LimeRenderPrivate::setPreviewLayoutDirection(const Qt::LayoutDirection& layoutDirection) -{ - m_previewLayoutDirection = layoutDirection; -} - -void LimeRenderPrivate::setPassPhrase(const QString &passPhrase) -{ - m_passPhrase = passPhrase; -} - -void LimeRenderPrivate::reorderPages(const QList& reorderedPages) -{ - m_pages.clear(); - foreach(PageDesignIntf* page, reorderedPages){ - m_pages.append(page); - } -} - -void LimeRenderPrivate::clearSelection() -{ - foreach (PageDesignIntf* page, m_pages) { - foreach(QGraphicsItem* item, page->selectedItems()){ - item->setSelected(false); - } - } -} - -bool LimeRenderPrivate::addTranslationLanguage(QLocale::Language language) -{ - if (!m_translations.keys().contains(language)){ - ReportTranslation* translation = 0; - if (!m_translations.contains(QLocale::AnyLanguage)){ - translation = new ReportTranslation(QLocale::AnyLanguage,m_pages); - m_translations.insert(QLocale::AnyLanguage,translation); - } - translation = new ReportTranslation(language,m_pages); - m_translations.insert(language, translation); - return true; - } else { - m_lastError = tr("Language %1 already exists").arg(QLocale::languageToString(language)); - return false; - } -} - -bool LimeRenderPrivate::removeTranslationLanguage(QLocale::Language language) -{ - return m_translations.remove(language) != 0; -} - -void LimeRenderPrivate::activateLanguage(QLocale::Language language) -{ - if (!m_translations.keys().contains(language)) return; - ReportTranslation* translation = m_translations.value(language); - - foreach(PageTranslation* pageTranslation, translation->pagesTranslation()){ - PageDesignIntf* page = getPageByName(pageTranslation->pageName); - if (page){ - foreach(ItemTranslation* itemTranslation, pageTranslation->itemsTranslation){ - BaseDesignIntf* item = page->pageItem()->childByName(itemTranslation->itemName); - if (item) { - foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){ - item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value); - } - } - } - } - } -} - -bool LimeRenderPrivate::setReportLanguage(QLocale::Language language){ - m_reportLanguage = language; - if (!m_translations.keys().contains(language)) return false; -// activateLanguage(language); - return true; -} - -QList LimeRenderPrivate::aviableLanguages() -{ - return m_translations.keys(); -} - -ReportTranslation*LimeRenderPrivate::reportTranslation(QLocale::Language language) -{ - return m_translations.value(language); -} - -bool LimeRenderPrivate::resultIsEditable() const -{ - return m_resultIsEditable; -} - -void LimeRenderPrivate::setResultEditable(bool value) -{ - m_resultIsEditable = value; -} - -bool LimeRenderPrivate::suppressFieldAndVarError() const -{ - return m_reportSettings.suppressAbsentFieldsAndVarsWarnings(); -} - -void LimeRenderPrivate::setSuppressFieldAndVarError(bool suppressFieldAndVarError) -{ - m_reportSettings.setSuppressAbsentFieldsAndVarsWarnings(suppressFieldAndVarError); -} - -bool LimeRenderPrivate::isBusy() -{ - return m_LimeRendering; -} - -QString LimeRenderPrivate::previewWindowTitle() const -{ - return m_previewWindowTitle; -} - -void LimeRenderPrivate::setPreviewWindowTitle(const QString &previewWindowTitle) -{ - m_previewWindowTitle = previewWindowTitle; -} - -QIcon LimeRenderPrivate::previewWindowIcon() const -{ - return m_previewWindowIcon; -} - -void LimeRenderPrivate::setPreviewWindowIcon(const QIcon &previewWindowIcon) -{ - m_previewWindowIcon = previewWindowIcon; -} - -ReportPages LimeRenderPrivate::renderToPages() -{ - if (m_LimeRendering) return ReportPages(); - m_LimeRender = LimeRender::Ptr(new LimeRender); - - dataManager()->clearErrors(); - dataManager()->connectAllDatabases(); - dataManager()->setDesignTime(false); - dataManager()->updateDatasourceModel(); - - connect(m_LimeRender.data(),SIGNAL(pageRendered(int)), - this, SIGNAL(renderPageFinished(int))); - - if (m_pages.count()){ -#ifdef HAVE_UI_LOADER - m_scriptEngineContext->initDialogs(); -#endif - ReportPages result; - m_LimeRendering = true; - - m_LimeRender->setDatasources(dataManager()); - m_LimeRender->setScriptContext(scriptContext()); - - foreach (PageDesignIntf* page, m_pages) { - scriptContext()->baseDesignIntfToScript(page->pageItem()->objectName(), page->pageItem()); - } - - scriptContext()->qobjectToScript("engine",this); - - if (m_scriptEngineContext->runInitScript()){ - - activateLanguage(m_reportLanguage); - emit renderStarted(); - - foreach(PageDesignIntf* page , m_pages){ - if (!page->pageItem()->isTOC()){ - page->setReportSettings(&m_reportSettings); - result.append(m_LimeRender->renderPageToPages(page)); - } - } - - -// m_LimeRender->secondRenderPass(result); - - for (int i=0; ipageItem()->isTOC()){ - page->setReportSettings(&m_reportSettings); - if (i==0){ - PageDesignIntf* secondPage = 0; - if (m_pages.count()>1) secondPage = m_pages.at(1); - ReportPages pages = m_LimeRender->renderTOC( - page, - true, - secondPage && secondPage->pageItem()->resetPageNumber() - ); - for (int j=0; jrenderPageToPages(page)); - } - } - } - - m_LimeRender->secondRenderPass(result); - - emit renderFinished(); - m_LimeRender.clear(); - } - m_LimeRendering = false; - activateLanguage(QLocale::AnyLanguage); - return result; - } else { - return ReportPages(); - } -} - -QString LimeRenderPrivate::lastError() -{ - return m_lastError; -} - -LimeRender::LimeRender(QObject *parent) - : QObject(parent), d_ptr(new LimeRenderPrivate()) -{ - Q_D(LimeRender); - d->q_ptr=this; - connect(d, SIGNAL(renderStarted()), this, SIGNAL(renderStarted())); - connect(d, SIGNAL(renderPageFinished(int)), - this, SIGNAL(renderPageFinished(int))); - connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); - connect(d, SIGNAL(onLoad(bool&)), this, SIGNAL(onLoad(bool&))); -} - -LimeRender::~LimeRender() -{ - delete d_ptr; -} - -bool LimeRender::printReport(QPrinter *printer) -{ - Q_D(LimeRender); - return d->printReport(printer); -} - -bool LimeRender::printPages(ReportPages pages, QPrinter *printer){ - Q_D(LimeRender); - return d->printPages(pages,printer); -} - -void LimeRender::printToFile(const QString &fileName) -{ - Q_D(LimeRender); - d->printToFile(fileName); -} - -bool LimeRender::printToPDF(const QString &fileName) -{ - Q_D(LimeRender); - return d->printToPDF(fileName); -} - -void LimeRender::previewReport(PreviewHints hints) -{ - Q_D(LimeRender); - if (m_settings) - d->setSettings(m_settings); - d->previewReport(hints); -} - -void LimeRender::designReport() -{ - Q_D(LimeRender); - if (m_settings) - d->setSettings(m_settings); - d->designReport(); -} - -PreviewReportWidget* LimeRender::createPreviewWidget(QWidget *parent) -{ - Q_D(LimeRender); - return d->createPreviewWidget(parent); -} - -void LimeRender::setPreviewWindowTitle(const QString &title) -{ - Q_D(LimeRender); - d->setPreviewWindowTitle(title); -} - -void LimeRender::setPreviewWindowIcon(const QIcon &icon) -{ - Q_D(LimeRender); - d->setPreviewWindowIcon(icon); -} - -void LimeRender::setResultEditable(bool value) -{ - Q_D(LimeRender); - d->setResultEditable(value); -} - -bool LimeRender::resultIsEditable() -{ - Q_D(LimeRender); - return d->resultIsEditable(); -} - -bool LimeRender::isBusy() -{ - Q_D(LimeRender); - return d->isBusy(); -} - -void LimeRender::setPassPharse(QString &passPharse) -{ - Q_D(LimeRender); - d->setPassPhrase(passPharse); -} - -QList LimeRender::aviableLanguages() -{ - Q_D(LimeRender); - return d->aviableLanguages(); -} - -bool LimeRender::setReportLanguage(QLocale::Language language) -{ - Q_D(LimeRender); - return d->setReportLanguage(language); -} - -void LimeRender::setShowProgressDialog(bool value) -{ - Q_D(LimeRender); - d->setShowProgressDialog(value); -} - -IDataSourceManager *LimeRender::dataManager() -{ - Q_D(LimeRender); - return d->dataManagerIntf(); -} - -IScriptEngineManager *LimeRender::scriptManager() -{ - Q_D(LimeRender); - return d->scriptManagerIntf(); -} - -bool LimeRender::loadFromFile(const QString &fileName, bool autoLoadPreviewOnChange) -{ - Q_D(LimeRender); - return d->loadFromFile(fileName, autoLoadPreviewOnChange); -} - -bool LimeRender::loadFromByteArray(QByteArray* data){ - Q_D(LimeRender); - return d->loadFromByteArray(data); -} - -bool LimeRender::loadFromString(const QString &data) -{ - Q_D(LimeRender); - return d->loadFromString(data); -} - -QString LimeRender::reportFileName() -{ - Q_D(LimeRender); - return d->reportFileName(); -} - -void LimeRender::setReportFileName(const QString &fileName) -{ - Q_D(LimeRender); - return d->setReportFileName(fileName); -} - -QString LimeRender::lastError() -{ - Q_D(LimeRender); - return d->lastError(); -} - -void LimeRender::setCurrentReportsDir(const QString &dirName) -{ - Q_D(LimeRender); - return d->setCurrentReportsDir(dirName); -} - -void LimeRender::setReportName(const QString &name) -{ - Q_D(LimeRender); - return d->setReportName(name); -} - -QString LimeRender::reportName() -{ - Q_D(LimeRender); - return d->reportName(); -} - -void LimeRender::cancelRender() -{ - Q_D(LimeRender); - d->cancelRender(); -} - -LimeRender::LimeRender(LimeRenderPrivate &dd, QObject *parent) - :QObject(parent),d_ptr(&dd) -{ - Q_D(LimeRender); - d->q_ptr=this; - connect(d, SIGNAL(renderStarted()), this, SIGNAL(renderStarted())); - connect(d, SIGNAL(renderPageFinished(int)), - this, SIGNAL(renderPageFinished(int))); - connect(d, SIGNAL(renderFinished()), this, SIGNAL(renderFinished())); -} - -ScriptEngineManager*LimeReport::LimeRenderPrivate::scriptManager(){ - ScriptEngineManager::instance().setContext(scriptContext()); - ScriptEngineManager::instance().setDataManager(dataManager()); - return &ScriptEngineManager::instance(); -} - -}// namespace LimeReport - From 1e0cc1b44dc45a7aa7fc0597670283be41f83a67 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Jun 2018 16:52:54 +0300 Subject: [PATCH 178/347] Build fixed --- limereport/bands/lrdataband.cpp | 28 ++++++++++------------------ limereport/bands/lrdataband.h | 2 -- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/limereport/bands/lrdataband.cpp b/limereport/bands/lrdataband.cpp index c9e809d..058ddc5 100644 --- a/limereport/bands/lrdataband.cpp +++ b/limereport/bands/lrdataband.cpp @@ -79,23 +79,6 @@ bool DataBand::isUnique() const return false; } -void DataBand::preparePopUpMenu(QMenu &menu) -{ - DataBandDesignIntf::preparePopUpMenu(menu); - - QAction* autoSplittableAction = menu.addAction(tr("Use alternate background color")); - autoSplittableAction->setCheckable(true); - autoSplittableAction->setChecked(useAlternateBackgroundColor()); -} - -void DataBand::processPopUpAction(QAction *action) -{ - DataBandDesignIntf::processPopUpAction(action); - if (action->text().compare(tr("Use alternate background color")) == 0){ - setProperty("useAlternateBackgroundColor",action->isChecked()); - } -} - QColor DataBand::bandColor() const { return QColor(Qt::darkGreen); @@ -104,7 +87,12 @@ QColor DataBand::bandColor() const void DataBand::preparePopUpMenu(QMenu &menu) { BandDesignIntf::preparePopUpMenu(menu); - QAction* currAction = menu.addAction(tr("Keep footer together")); + + QAction* currAction = menu.addAction(tr("Use alternate background color")); + currAction->setCheckable(true); + currAction->setChecked(useAlternateBackgroundColor()); + + currAction = menu.addAction(tr("Keep footer together")); currAction->setCheckable(true); currAction->setChecked(keepFooterTogether()); @@ -133,6 +121,10 @@ void DataBand::processPopUpAction(QAction *action) setProperty("sliceLastRow",action->isChecked()); } + if (action->text().compare(tr("Use alternate background color")) == 0){ + setProperty("useAlternateBackgroundColor",action->isChecked()); + } + } BaseDesignIntf *DataBand::createSameTypeItem(QObject *owner, QGraphicsItem *parent) diff --git a/limereport/bands/lrdataband.h b/limereport/bands/lrdataband.h index 870ac9e..fc6e4ad 100644 --- a/limereport/bands/lrdataband.h +++ b/limereport/bands/lrdataband.h @@ -53,8 +53,6 @@ public: DataBand(QObject* owner = 0, QGraphicsItem* parent=0); bool isUnique() const; bool isData() const {return true;} - void preparePopUpMenu(QMenu &menu); - void processPopUpAction(QAction *action); protected: QColor bandColor() const; void preparePopUpMenu(QMenu &menu); From 39253b1f5528bcf63bac9602e7a6f141be8a30aa Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Jun 2018 22:43:41 +0300 Subject: [PATCH 179/347] lupdate parameter fixed --- limereport/limereport.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/limereport/limereport.pro b/limereport/limereport.pro index f9a6480..0b4e5cd 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -102,10 +102,10 @@ contains(CONFIG,build_translations){ qtPrepareTool(LUPDATE, lupdate) greaterThan(QT_MAJOR_VERSION, 4) { - ts.commands = $$LUPDATE $$shell_quote($$PWD) -no-obsolete -ts $$TRANSLATIONS + ts.commands = $$LUPDATE $$shell_quote($$PWD) -noobsolete -ts $$TRANSLATIONS } lessThan(QT_MAJOR_VERSION, 5){ - ts.commands = $$LUPDATE $$quote($$PWD) -no-obsolete -ts $$TRANSLATIONS + ts.commands = $$LUPDATE $$quote($$PWD) -noobsolete -ts $$TRANSLATIONS } TRANSLATIONS_FILES = qtPrepareTool(LRELEASE, lrelease) From 1a189054f7143dab9b791bf31df538adc65f4acd Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 21 Jun 2018 13:38:47 +0300 Subject: [PATCH 180/347] Designer plugin interface renamed --- designer_plugin/lrdesignerplugin.h | 4 ++-- limereport/lrdesignerplugininterface.h | 6 +++--- limereport/lrreportengine.cpp | 4 ++-- limereport/lrreportengine_p.h | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/designer_plugin/lrdesignerplugin.h b/designer_plugin/lrdesignerplugin.h index 7f17491..d23f147 100644 --- a/designer_plugin/lrdesignerplugin.h +++ b/designer_plugin/lrdesignerplugin.h @@ -4,12 +4,12 @@ #include #include -class ReportDesignerFactoryPlugin : public QObject, public LimeReportPluginInterface { +class ReportDesignerFactoryPlugin : public QObject, public LimeReportDesignerPluginInterface { Q_OBJECT #if QT_VERSION >= 0x050000 Q_PLUGIN_METADATA(IID "ru.limereport.DersignerFactoryInterface") #endif - Q_INTERFACES( LimeReportPluginInterface ) + Q_INTERFACES( LimeReportDesignerPluginInterface ) public: ~ReportDesignerFactoryPlugin(); diff --git a/limereport/lrdesignerplugininterface.h b/limereport/lrdesignerplugininterface.h index 1587c39..f9cab7e 100644 --- a/limereport/lrdesignerplugininterface.h +++ b/limereport/lrdesignerplugininterface.h @@ -17,12 +17,12 @@ namespace LimeReport { class ReportEnginePrivateInterface; } -class LimeReportPluginInterface { +class LimeReportDesignerPluginInterface { public: - virtual ~LimeReportPluginInterface() { } + virtual ~LimeReportDesignerPluginInterface() { } virtual LimeReport::ReportDesignWindowInterface* getDesignerWindow(LimeReport::ReportEnginePrivateInterface* report, QWidget *parent = 0, QSettings* settings=0) = 0; }; -Q_DECLARE_INTERFACE( LimeReportPluginInterface, "ru.limereport.LimeReport.DesignerPluginInterface/1.0" ) +Q_DECLARE_INTERFACE( LimeReportDesignerPluginInterface, "ru.limereport.LimeReport.DesignerPluginInterface/1.0" ) #endif // LRDESIGNERPLUGININTERFACE_H diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index b1955e6..45ff9f8 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -113,8 +113,8 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : foreach( const QString& pluginName, pluginsDir.entryList( QDir::Files ) ) { QPluginLoader loader( pluginsDir.absoluteFilePath( pluginName ) ); if( loader.load() ) { - if( LimeReportPluginInterface* myPlugin = qobject_cast< LimeReportPluginInterface* >( loader.instance() ) ) { - m_designerFactory = myPlugin; + if( LimeReportDesignerPluginInterface* designerPlugin = qobject_cast< LimeReportDesignerPluginInterface* >( loader.instance() ) ) { + m_designerFactory = designerPlugin; break; } } diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index ea8c854..ea2ff2a 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -264,7 +264,7 @@ private: QLocale::Language m_reportLanguage; void activateLanguage(QLocale::Language language); Qt::LayoutDirection m_previewLayoutDirection; - LimeReportPluginInterface* m_designerFactory; + LimeReportDesignerPluginInterface* m_designerFactory; QString m_styleSheet; QLocale::Language m_currentDesignerLanguage; }; From 5b818a4a15501804ad9428bb8ecd2aeb0f70f0cb Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 21 Jun 2018 14:29:00 +0300 Subject: [PATCH 181/347] Vertical Layout has been added --- limereport/images/vlayuot_4_24.png | Bin 0 -> 201 bytes limereport/items/lrabstractlayout.cpp | 321 +++++++++++++ limereport/items/lrabstractlayout.h | 68 +++ limereport/items/lrhorizontallayout.cpp | 453 ++---------------- limereport/items/lrhorizontallayout.h | 64 +-- limereport/items/lrlayoutmarker.cpp | 69 +++ limereport/items/lrlayoutmarker.h | 28 ++ limereport/items/lrtextitem.cpp | 25 +- limereport/items/lrtextitem.h | 9 +- limereport/items/lrverticallayout.cpp | 220 +++++++++ limereport/items/lrverticallayout.h | 37 ++ limereport/limereport.pri | 8 + limereport/lrbasedesignintf.cpp | 14 +- limereport/lrpagedesignintf.cpp | 139 +++++- limereport/lrpagedesignintf.h | 17 + limereport/lrreportdesignwidget.cpp | 6 + limereport/lrreportdesignwidget.h | 1 + limereport/lrreportdesignwindow.cpp | 10 + limereport/lrreportdesignwindow.h | 2 + .../objectinspector/lrobjectitemmodel.cpp | 2 + .../propertyItems/lrenumpropitem.cpp | 2 + limereport/report.qrc | 1 + 22 files changed, 1029 insertions(+), 467 deletions(-) create mode 100644 limereport/images/vlayuot_4_24.png create mode 100644 limereport/items/lrabstractlayout.cpp create mode 100644 limereport/items/lrabstractlayout.h create mode 100644 limereport/items/lrlayoutmarker.cpp create mode 100644 limereport/items/lrlayoutmarker.h create mode 100644 limereport/items/lrverticallayout.cpp create mode 100644 limereport/items/lrverticallayout.h diff --git a/limereport/images/vlayuot_4_24.png b/limereport/images/vlayuot_4_24.png new file mode 100644 index 0000000000000000000000000000000000000000..8f83e7937ea39c391537cfb2a53988e020bcf4bc GIT binary patch literal 201 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjY)RhkE)4%caKYZ?lYt_f1s;*b z3=CW!K$y{KjmZq4AbW|YuPgf_HeMk^vEz|HRsw~>JY5_^JdP(PNU*XnC>yEgEqYm> zC9zB6zsa2#u@cWhTfHux`pTEmT=P4xIl2^cM{raYnusQ{Ts*WVSVU6J{$$RKrAoil pgTENa_%2)AdY41vO`9D9!*e(3&2u+xu?O0~;OXk;vd$@?2>{8;KMw!^ literal 0 HcmV?d00001 diff --git a/limereport/items/lrabstractlayout.cpp b/limereport/items/lrabstractlayout.cpp new file mode 100644 index 0000000..02b8ca8 --- /dev/null +++ b/limereport/items/lrabstractlayout.cpp @@ -0,0 +1,321 @@ +#include "lrabstractlayout.h" + +namespace LimeReport { + +AbstractLayout::AbstractLayout(QString xmlTag, QObject* owner, QGraphicsItem* parent) + : LayoutDesignIntf(xmlTag, owner, parent), m_isRelocating(false), m_layoutType(Layout), + m_hideEmptyItems(false) +{ + setPossibleResizeDirectionFlags(AllDirections); + m_layoutMarker = new LayoutMarker(this); + m_layoutMarker->setParentItem(this); + m_layoutMarker->setColor(Qt::red); + m_layoutMarker->setHeight(height()); + m_layoutMarker->setZValue(1); +} + +AbstractLayout::~AbstractLayout() +{ + if (m_layoutMarker) { + delete m_layoutMarker; m_layoutMarker=0; + } +} + +QList& AbstractLayout::layoutsChildren() +{ + return m_children; +} + +bool AbstractLayout::isRelocating() const +{ + return m_isRelocating; +} + +void AbstractLayout::setIsRelocating(bool isRelocating) +{ + m_isRelocating = isRelocating; +} + +AbstractLayout::LayoutType AbstractLayout::layoutType() const +{ + return m_layoutType; +} + +void AbstractLayout::setLayoutType(const LayoutType& layoutType) +{ + m_layoutType = layoutType; +} + +void AbstractLayout::addChild(BaseDesignIntf* item, bool updateSize) +{ + + placeItemInLayout(item); + + m_children.append(item); + item->setParentItem(this); + item->setParent(this); + item->setFixedPos(true); + item->setPossibleResizeDirectionFlags(ResizeRight | ResizeBottom); + + connect( + item, SIGNAL(destroyed(QObject*)), + this, SLOT(slotOnChildDestroy(QObject*)) + ); + connect( + item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)), + this,SLOT(slotOnChildGeometryChanged(QObject*,QRectF,QRectF)) + ); + connect( + item, SIGNAL(itemVisibleHasChanged(BaseDesignIntf*)), + this, SLOT(slotOnChildVisibleHasChanged(BaseDesignIntf*)) + ); + connect( + item, SIGNAL(itemSelectedHasBeenChanged(BaseDesignIntf*,bool)), + this, SLOT(slotOnChildSelectionHasChanged(BaseDesignIntf*,bool)) + ); + + if (updateSize){ + relocateChildren(); + updateLayoutSize(); + } +} + +void AbstractLayout::restoreChild(BaseDesignIntf* item) +{ + if (m_children.contains(item)) return; + + m_isRelocating=true; + + insertItemInLayout(item); + + connect(item,SIGNAL(destroyed(QObject*)),this,SLOT(slotOnChildDestroy(QObject*))); + connect(item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)), + this,SLOT(slotOnChildGeometryChanged(QObject*,QRectF,QRectF))); + connect(item, SIGNAL(itemAlignChanged(BaseDesignIntf*,ItemAlign,ItemAlign)), + this, SLOT(slotOnChildItemAlignChanged(BaseDesignIntf*,ItemAlign,ItemAlign))); + + item->setFixedPos(true); + item->setPossibleResizeDirectionFlags(ResizeRight | ResizeBottom); + item->setParent(this); + item->setParentItem(this); + + updateLayoutSize(); + m_isRelocating=false; +} + +bool AbstractLayout::isEmpty() const +{ + bool isEmpty = true; + bool allItemsIsText = true; + foreach (QGraphicsItem* qgItem, childItems()) { + ContentItemDesignIntf* item = dynamic_cast(qgItem); + if (item && !item->content().isEmpty()) isEmpty = false; + if (!item && dynamic_cast(qgItem)) + allItemsIsText = false; + } + return (isEmpty && allItemsIsText); +} + +void AbstractLayout::paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget) +{ + if (isSelected()){ + foreach( BaseDesignIntf* item, m_children){ + ppainter->save(); + ppainter->setPen(Qt::red); + ppainter->drawRect( + QRectF(item->pos().x(),item->pos().y(), + item->rect().bottomRight().rx(), + item->rect().bottomRight().ry() + ) + ); + ppainter->restore(); + } + } + LayoutDesignIntf::paint(ppainter, option, widget); +} + +int AbstractLayout::childrenCount() +{ + return m_children.size(); +} + +void AbstractLayout::beforeDelete() +{ +#ifdef HAVE_QT5 + foreach (QObject *item, children()) { +#else + foreach (QObject *item, QObject::children()) { +#endif + BaseDesignIntf *bi = dynamic_cast(item); + if (bi) { + bi->setParentItem(parentItem()); + bi->setParent(parent()); + bi->setVisible(true); + bi->setPos(mapToParent(bi->pos())); + bi->setFixedPos(false); + bi->setPossibleResizeDirectionFlags(AllDirections); + } + } + m_children.clear(); +} + +void AbstractLayout::childAddedEvent(BaseDesignIntf* child) +{ + addChild(child,false); +} + +void AbstractLayout::geometryChangedEvent(QRectF newRect, QRectF) +{ + layoutMarker()->setHeight(newRect.height()); + relocateChildren(); + if (!isRelocating()){ + divideSpace(); + } +} + +void AbstractLayout::initMode(BaseDesignIntf::ItemMode mode) +{ + BaseDesignIntf::initMode(mode); + if ((mode==PreviewMode)||(mode==PrintMode)){ + layoutMarker()->setVisible(false); + } else { + layoutMarker()->setVisible(true); + } +} + +void AbstractLayout::setBorderLinesFlags(BaseDesignIntf::BorderLines flags) +{ + BaseDesignIntf::setBorderLinesFlags(flags); + if (flags!=0) + relocateChildren(); +} + +void AbstractLayout::collectionLoadFinished(const QString& collectionName) +{ + ItemDesignIntf::collectionLoadFinished(collectionName); + if (collectionName.compare("children",Qt::CaseInsensitive)==0){ +#ifdef HAVE_QT5 + foreach(QObject* obj, children()){ +#else + foreach(QObject* obj,QObject::children()){ +#endif + BaseDesignIntf* item = dynamic_cast(obj); + if (item) { + addChild(item,false); + } + } + } +} + +void AbstractLayout::objectLoadFinished() +{ + layoutMarker()->setHeight(height()); + LayoutDesignIntf::objectLoadFinished(); +} + +bool AbstractLayout::isNeedUpdateSize(RenderPass pass) const +{ + foreach (QGraphicsItem *child, childItems()) { + BaseDesignIntf* item = dynamic_cast(child); + if (item && (item->isNeedUpdateSize(pass) || item->isEmpty())) + return true; + } + return false; +} + +QVariant AbstractLayout::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) +{ + if (change == QGraphicsItem::ItemSelectedHasChanged){ + setIsRelocating(true); + foreach(BaseDesignIntf* item, layoutsChildren()){ + item->setVisible(!value.toBool()); + } + setIsRelocating(false); + } + return LayoutDesignIntf::itemChange(change, value); +} + +void AbstractLayout::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) +{ + setIsRelocating(true); + ItemDesignIntf::updateItemSize(dataManager, pass, maxHeight); + foreach(QGraphicsItem *child, childItems()){ + BaseDesignIntf* item = dynamic_cast(child); + if (item) item->updateItemSize(dataManager, pass, maxHeight); + } + updateLayoutSize(); + relocateChildren(); + setIsRelocating(false); + BaseDesignIntf::updateItemSize(dataManager, pass, maxHeight); +} + +void AbstractLayout::slotOnChildDestroy(QObject* child) +{ + m_children.removeAll(static_cast(child)); + if (m_children.count()<2){ + beforeDelete(); + } else { + relocateChildren(); + updateLayoutSize(); + } +} + +void AbstractLayout::slotOnChildGeometryChanged(QObject* item, QRectF newGeometry, QRectF oldGeometry) +{ + if (!m_isRelocating){ + if (m_layoutType == Layout){ + relocateChildren(); + updateLayoutSize(); + } else { + m_isRelocating = true; + qreal delta = newGeometry.width()-oldGeometry.width(); + BaseDesignIntf* resizingItem = findNext(dynamic_cast(item)); + if (resizingItem) { + resizingItem->setWidth(resizingItem->width()-delta); + resizingItem->setPos(resizingItem->pos().x()+delta,resizingItem->pos().y()); + } + updateLayoutSize(); + m_isRelocating = false; + } + } +} + +void AbstractLayout::slotOnChildItemAlignChanged(BaseDesignIntf* item, const BaseDesignIntf::ItemAlign&, const BaseDesignIntf::ItemAlign&) +{ + item->setPossibleResizeDirectionFlags(ResizeBottom | ResizeRight); +} + +void AbstractLayout::slotOnChildVisibleHasChanged(BaseDesignIntf*) +{ + relocateChildren(); + if (m_layoutType == Table && !m_isRelocating){ + divideSpace(); + } +} + +void AbstractLayout::slotOnChildSelectionHasChanged(BaseDesignIntf* item, bool value) +{ + item->setZValue(value ? item->zValue()+1 : item->zValue()-1); +} + +bool AbstractLayout::hideEmptyItems() const +{ + return m_hideEmptyItems; +} + +void AbstractLayout::setHideEmptyItems(bool hideEmptyItems) +{ + m_hideEmptyItems = hideEmptyItems; + + if (m_hideEmptyItems != hideEmptyItems){ + m_hideEmptyItems = hideEmptyItems; + notify("hideEmptyItems", !m_hideEmptyItems, m_hideEmptyItems); + } +} + +LayoutMarker* AbstractLayout::layoutMarker() const +{ + return m_layoutMarker; +} + +} // namespace LimeReport diff --git a/limereport/items/lrabstractlayout.h b/limereport/items/lrabstractlayout.h new file mode 100644 index 0000000..52deaed --- /dev/null +++ b/limereport/items/lrabstractlayout.h @@ -0,0 +1,68 @@ +#ifndef LRABSTRACTLAYOUT_H +#define LRABSTRACTLAYOUT_H + +#include "lritemdesignintf.h" +#include "lrlayoutmarker.h" + +namespace LimeReport{ +class AbstractLayout: public LayoutDesignIntf +{ + Q_OBJECT + Q_ENUMS(LayoutType) + Q_PROPERTY(bool hideEmptyItems READ hideEmptyItems WRITE setHideEmptyItems) +public: + enum LayoutType{Layout,Table}; + AbstractLayout(QString xmlTag, QObject *owner = 0, QGraphicsItem *parent = 0); + ~AbstractLayout(); + QList& layoutsChildren(); + LayoutMarker* layoutMarker() const; + bool isRelocating() const; + void setIsRelocating(bool isRelocating); + LayoutType layoutType() const; + void setLayoutType(const LayoutType& layoutType); + + void addChild(BaseDesignIntf *item,bool updateSize=true); + void restoreChild(BaseDesignIntf *item); + bool isEmpty() const; + void paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget); + + bool hideEmptyItems() const; + void setHideEmptyItems(bool hideEmptyItems); + +protected: + int childrenCount(); + void beforeDelete(); + void childAddedEvent(BaseDesignIntf *child); + void geometryChangedEvent(QRectF newRect, QRectF); + void initMode(ItemMode mode); + void setBorderLinesFlags(BorderLines flags); + void collectionLoadFinished(const QString &collectionName); + void objectLoadFinished(); + bool isNeedUpdateSize(RenderPass pass) const; + QVariant itemChange(GraphicsItemChange change, const QVariant &value); + void updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight); +private: + virtual void divideSpace() = 0; + virtual void updateLayoutSize() = 0; + virtual void relocateChildren() = 0; + virtual BaseDesignIntf *findNext(BaseDesignIntf *item) = 0; + virtual BaseDesignIntf *findPrior(BaseDesignIntf *item) = 0; + virtual void placeItemInLayout(BaseDesignIntf* item) = 0; + virtual void insertItemInLayout(BaseDesignIntf* item) = 0; +private slots: + void slotOnChildDestroy(QObject *child); + void slotOnChildGeometryChanged(QObject*item, QRectF newGeometry, QRectF oldGeometry); + void slotOnChildItemAlignChanged(BaseDesignIntf* item, const ItemAlign&, const ItemAlign&); + void slotOnChildVisibleHasChanged(BaseDesignIntf*); + void slotOnChildSelectionHasChanged(BaseDesignIntf* item, bool value); +private: + QList m_children; + bool m_isRelocating; + LayoutMarker* m_layoutMarker; + LayoutType m_layoutType; + bool m_hideEmptyItems; +}; + +} // namespace LimeReport + +#endif // LRABSTRACTLAYOUT_H diff --git a/limereport/items/lrhorizontallayout.cpp b/limereport/items/lrhorizontallayout.cpp index d93e545..9a6a55a 100644 --- a/limereport/items/lrhorizontallayout.cpp +++ b/limereport/items/lrhorizontallayout.cpp @@ -55,88 +55,28 @@ bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instanc namespace LimeReport { -bool lessThen(BaseDesignIntf *c1, BaseDesignIntf* c2){ +bool horizontalLessThen(BaseDesignIntf *c1, BaseDesignIntf* c2){ return c1->pos().x()pos().x(); } - HorizontalLayout::HorizontalLayout(QObject *owner, QGraphicsItem *parent) - : LayoutDesignIntf(xmlTag, owner, parent),m_isRelocating(false),m_layoutType(Layout) -{ - setPossibleResizeDirectionFlags(AllDirections); - m_layoutMarker = new LayoutMarker(this); - m_layoutMarker->setParentItem(this); - m_layoutMarker->setColor(Qt::red); - m_layoutMarker->setHeight(height()); - m_layoutMarker->setZValue(1); -} + : AbstractLayout(xmlTag, owner, parent) +{} HorizontalLayout::~HorizontalLayout() -{ - if (m_layoutMarker) { - delete m_layoutMarker; m_layoutMarker=0; - } -} +{} BaseDesignIntf *HorizontalLayout::createSameTypeItem(QObject *owner, QGraphicsItem *parent) { return new LimeReport::HorizontalLayout(owner, parent); } -void HorizontalLayout::hoverEnterEvent(QGraphicsSceneHoverEvent *event) -{ - Q_UNUSED(event) - LayoutDesignIntf::hoverEnterEvent(event); -// if ((itemMode() & LayoutEditMode) || isSelected()){ -// setChildVisibility(false); -// } -} - -void HorizontalLayout::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) -{ - Q_UNUSED(event) - LayoutDesignIntf::hoverLeaveEvent(event); -// setChildVisibility(true); -} - -void HorizontalLayout::geometryChangedEvent(QRectF newRect, QRectF ) -{ - m_layoutMarker->setHeight(newRect.height()); - relocateChildren(); - if (/*m_layoutType == Table && */!m_isRelocating){ - divideSpace(); - } -} - -void HorizontalLayout::setChildVisibility(bool value){ - foreach(QGraphicsItem* child,childItems()){ - BaseDesignIntf* item = dynamic_cast(child); - if(item) - item->setVisible(value); - } -} - -int HorizontalLayout::childrenCount() -{ - return m_children.size(); -} - -void HorizontalLayout::initMode(BaseDesignIntf::ItemMode mode) -{ - BaseDesignIntf::initMode(mode); - if ((mode==PreviewMode)||(mode==PrintMode)){ - m_layoutMarker->setVisible(false); - } else { - m_layoutMarker->setVisible(true); - } -} - bool HorizontalLayout::canBeSplitted(int height) const { foreach(QGraphicsItem* qgItem,childItems()){ BaseDesignIntf* item=dynamic_cast(qgItem); if (item) - if (!item->canBeSplitted(height-item->pos().y())) return false; + if (!item->canBeSplitted(height - item->pos().y())) return false; } return true; } @@ -198,149 +138,13 @@ void HorizontalLayout::setItemAlign(const BaseDesignIntf::ItemAlign &itemAlign) BaseDesignIntf::setItemAlign(itemAlign); } -void HorizontalLayout::setBorderLinesFlags(BaseDesignIntf::BorderLines flags) -{ - BaseDesignIntf::setBorderLinesFlags(flags); - if (flags!=0) - relocateChildren(); -} - -QVariant HorizontalLayout::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) -{ - if (change == QGraphicsItem::ItemSelectedHasChanged){ - m_isRelocating = true; - foreach(BaseDesignIntf* item, m_children){ - item->setVisible(!value.toBool()); - } - m_isRelocating = false; - } - return LayoutDesignIntf::itemChange(change, value); -} - -void HorizontalLayout::paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget) -{ - if (isSelected()){ - foreach( BaseDesignIntf* item, m_children){ - ppainter->save(); - ppainter->setPen(Qt::red); - ppainter->drawRect( - QRectF(item->pos().x(),item->pos().y(), - item->rect().bottomRight().rx(), - item->rect().bottomRight().ry() - ) - ); - ppainter->restore(); - } - } - LayoutDesignIntf::paint(ppainter, option, widget); -} - -void HorizontalLayout::restoreChild(BaseDesignIntf* item){ - if (m_children.contains(item)) return; - - m_isRelocating=true; - foreach (BaseDesignIntf* child, childBaseItems()) { - if (child->pos()==item->pos()){ - int index = m_children.indexOf(child)-1; - m_children.insert(index,item); - child->setPos(item->pos().x()+item->width(),0); - break; - } - } - - connect(item,SIGNAL(destroyed(QObject*)),this,SLOT(slotOnChildDestroy(QObject*))); - connect(item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)), - this,SLOT(slotOnChildGeometryChanged(QObject*,QRectF,QRectF))); - connect(item, SIGNAL(itemAlignChanged(BaseDesignIntf*,ItemAlign,ItemAlign)), - this, SLOT(slotOnChildItemAlignChanged(BaseDesignIntf*,ItemAlign,ItemAlign))); - - item->setFixedPos(true); - item->setPossibleResizeDirectionFlags(ResizeRight | ResizeBottom); - item->setParent(this); - item->setParentItem(this); - - updateLayoutSize(); - m_isRelocating=false; -} - -bool HorizontalLayout::isEmpty() const -{ - bool isEmpty = true; - bool allItemsIsText = true; - foreach (QGraphicsItem* qgItem, childItems()) { - ContentItemDesignIntf* item = dynamic_cast(qgItem); - if (item && !item->content().isEmpty()) isEmpty = false; - if (!item && dynamic_cast(qgItem)) - allItemsIsText = false; - } - return (isEmpty && allItemsIsText); -} - -void HorizontalLayout::addChild(BaseDesignIntf *item, bool updateSize) -{ - if (m_children.count() > 0) - item->setPos(m_children.last()->pos().x() + m_children.last()->width(), 0); - else - item->setPos(0, 0); - - m_children.append(item); - item->setParentItem(this); - item->setParent(this); - item->setFixedPos(true); - item->setPossibleResizeDirectionFlags(ResizeRight | ResizeBottom); - - connect( - item, SIGNAL(destroyed(QObject*)), - this, SLOT(slotOnChildDestroy(QObject*)) - ); - connect( - item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)), - this,SLOT(slotOnChildGeometryChanged(QObject*,QRectF,QRectF)) - ); - connect( - item, SIGNAL(itemVisibleHasChanged(BaseDesignIntf*)), - this,SLOT(slotOnChildVisibleHasChanged(BaseDesignIntf*)) - ); - connect( - item, SIGNAL(itemSelectedHasBeenChanged(BaseDesignIntf*,bool)), - this, SLOT(slotOnChildSelectionHasChanged(BaseDesignIntf*,bool)) - ); - - if (updateSize){ - relocateChildren(); - updateLayoutSize(); - } -} - -void HorizontalLayout::collectionLoadFinished(const QString &collectionName) -{ - ItemDesignIntf::collectionLoadFinished(collectionName); - if (collectionName.compare("children",Qt::CaseInsensitive)==0){ -#ifdef HAVE_QT5 - foreach(QObject* obj,children()){ -#else - foreach(QObject* obj,QObject::children()){ -#endif - BaseDesignIntf* item = dynamic_cast(obj); - if (item) { - addChild(item,false); - } - } - } -} - -void HorizontalLayout::objectLoadFinished() -{ - m_layoutMarker->setHeight(height()); - LayoutDesignIntf::objectLoadFinished(); -} - void HorizontalLayout::updateLayoutSize() { int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; int w = spaceBorder*2; qreal h = 0; - foreach(BaseDesignIntf* item, m_children){ + foreach(BaseDesignIntf* item, layoutsChildren()){ + if (item->isEmpty() && hideEmptyItems()) item->setVisible(false); if (item->isVisible()){ if (hheight()) h=item->height(); w+=item->width(); @@ -353,121 +157,60 @@ void HorizontalLayout::updateLayoutSize() void HorizontalLayout::relocateChildren() { int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; - if (m_children.count()isVisible() || itemMode() == DesignMode){ item->setPos(curX,spaceBorder); curX+=item->width(); item->setHeight(height()-(spaceBorder * 2)); } } - m_isRelocating = false; -} - -void HorizontalLayout::beforeDelete() -{ - m_children.clear(); -#ifdef HAVE_QT5 - foreach (QObject *item, children()) { -#else - foreach (QObject *item, QObject::children()) { -#endif - BaseDesignIntf *bdItem = dynamic_cast(item); - if (bdItem) { - bdItem->setParentItem(parentItem()); - bdItem->setParent(parent()); - bdItem->setVisible(true); - bdItem->setPos(mapToParent(bdItem->pos())); - bdItem->setFixedPos(false); - bdItem->setPossibleResizeDirectionFlags(AllDirections); - } - } -} - -void HorizontalLayout::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) -{ - m_isRelocating=true; - ItemDesignIntf::updateItemSize(dataManager, pass, maxHeight); - foreach(QGraphicsItem *child, childItems()){ - BaseDesignIntf* item = dynamic_cast(child); - if (item) item->updateItemSize(dataManager, pass, maxHeight); - } - updateLayoutSize(); - relocateChildren(); - m_isRelocating=false; - BaseDesignIntf::updateItemSize(dataManager, pass, maxHeight); -} - -bool HorizontalLayout::isNeedUpdateSize(RenderPass pass) const -{ - foreach (QGraphicsItem *child, childItems()) { - BaseDesignIntf* item = dynamic_cast(child); - if (item && item->isNeedUpdateSize(pass)) - return true; - } - return false; -} - -void HorizontalLayout::childAddedEvent(BaseDesignIntf *child) -{ - addChild(child,false); -} - -void HorizontalLayout::slotOnChildDestroy(QObject* child) -{ - m_children.removeAll(static_cast(child)); - if (m_children.count()<2){ - beforeDelete(); -// deleteLater(); - } else { - relocateChildren(); - updateLayoutSize(); - } + setIsRelocating(false); } BaseDesignIntf* HorizontalLayout::findNext(BaseDesignIntf* item){ - if (m_children.count()i+1){ return m_children[i+1];} + qSort(layoutsChildren().begin(),layoutsChildren().end(),horizontalLessThen); + for (int i=0; ii+1){ return layoutsChildren()[i+1];} } return 0; } BaseDesignIntf* HorizontalLayout::findPrior(BaseDesignIntf* item){ - if (m_children.count()isVisible() || itemMode() == DesignMode ){ itemsSumSize += item->width(); visibleItemsCount++; @@ -475,128 +218,34 @@ void HorizontalLayout::divideSpace(){ } qreal delta = (width() - (itemsSumSize+spaceBorder*2)) / (visibleItemsCount!=0 ? visibleItemsCount : 1); - for (int i=0; iisVisible() || itemMode() == DesignMode) - m_children[i]->setWidth(m_children[i]->width()+delta); - if ((i+1)isVisible() || itemMode() == DesignMode) - m_children[i+1]->setPos(m_children[i+1]->pos().x()+delta*(i+1),m_children[i+1]->pos().y()); + for (int i=0; iisVisible() || itemMode() == DesignMode) + layoutsChildren()[i]->setWidth(layoutsChildren()[i]->width()+delta); + if ((i+1)isVisible() || itemMode() == DesignMode) + layoutsChildren()[i+1]->setPos(layoutsChildren()[i+1]->pos().x()+delta*(i+1),layoutsChildren()[i+1]->pos().y()); } - m_isRelocating = false; + setIsRelocating(false); } -void HorizontalLayout::slotOnChildGeometryChanged(QObject *item, QRectF newGeometry, QRectF oldGeometry) + +void HorizontalLayout::placeItemInLayout(BaseDesignIntf* item) { - if (!m_isRelocating){ - //setHeight(newGeometry.height()); - if (m_layoutType == Layout){ - relocateChildren(); - updateLayoutSize(); - } else { - m_isRelocating = true; - qreal delta = newGeometry.width()-oldGeometry.width(); - BaseDesignIntf* resizingItem = findNext(dynamic_cast(item)); - if (resizingItem) { - resizingItem->setWidth(resizingItem->width()-delta); - resizingItem->setPos(resizingItem->pos().x()+delta,resizingItem->pos().y()); - } - updateLayoutSize(); - m_isRelocating = false; + if (layoutsChildren().count() > 0) + item->setPos(layoutsChildren().last()->pos().x() + layoutsChildren().last()->width(), 0); + else + item->setPos(0, 0); +} + +void HorizontalLayout::insertItemInLayout(BaseDesignIntf* item) +{ + foreach (BaseDesignIntf* child, childBaseItems()) { + if (child->pos() == item->pos()){ + int index = layoutsChildren().indexOf(child)-1; + layoutsChildren().insert(index, item); + child->setPos(item->pos().x()+item->width(), 0); + break; } } } -void HorizontalLayout::slotOnChildItemAlignChanged(BaseDesignIntf *item, const BaseDesignIntf::ItemAlign &, const BaseDesignIntf::ItemAlign&) -{ - item->setPossibleResizeDirectionFlags(ResizeBottom | ResizeRight); -} - -void HorizontalLayout::slotOnChildVisibleHasChanged(BaseDesignIntf *) -{ - relocateChildren(); - if (m_layoutType == Table && !m_isRelocating){ - divideSpace(); - } -} - -void HorizontalLayout::slotOnChildSelectionHasChanged(BaseDesignIntf* item, bool value) -{ - item->setZValue(value ? item->zValue()+1 : item->zValue()-1); -} - -HorizontalLayout::LayoutType HorizontalLayout::layoutType() const -{ - return m_layoutType; -} - -void HorizontalLayout::setLayoutType(const LayoutType &layoutType) -{ - if (m_layoutType != layoutType){ - LayoutType oldValue = m_layoutType; - m_layoutType = layoutType; - notify("layoutType",oldValue,layoutType); - } - -} - -LayoutMarker::LayoutMarker(HorizontalLayout *layout, QGraphicsItem *parent) - :QGraphicsItem(parent), m_rect(0,0,30,30), m_color(Qt::red), m_layout(layout){ - setFlag(QGraphicsItem::ItemIsMovable); -} - -void LayoutMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) -{ - painter->save(); - painter->setOpacity(Const::LAYOUT_MARKER_OPACITY); - painter->fillRect(boundingRect(),m_color); - - painter->setRenderHint(QPainter::Antialiasing); - qreal size = (boundingRect().width()isSelected()){ - painter->setOpacity(1); - QRectF r = QRectF(0,0,size,size); - painter->setBrush(Qt::white); - painter->setPen(Qt::white); - painter->drawEllipse(r.adjusted(5,5,-5,-5)); - painter->setBrush(m_color); - painter->drawEllipse(r.adjusted(7,7,-7,-7)); - } - painter->restore(); -} - -void LayoutMarker::setHeight(qreal height) -{ - if (m_rect.height()!=height){ - prepareGeometryChange(); - m_rect.setHeight(height); - } -} - -void LayoutMarker::setWidth(qreal width) -{ - if (m_rect.width()!=width){ - prepareGeometryChange(); - m_rect.setWidth(width); - } -} - -void LayoutMarker::setColor(QColor color) -{ - if (m_color!=color){ - m_color = color; - update(boundingRect()); - } -} - -void LayoutMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - if (event->button()==Qt::LeftButton) { - if (!(event->modifiers() & Qt::ControlModifier)) - m_layout->scene()->clearSelection(); - m_layout->setSelected(true); - //m_layout->setChildVisibility(false); - update(0,0,boundingRect().width(),boundingRect().width()); - } -} - } // namespace LimeReport diff --git a/limereport/items/lrhorizontallayout.h b/limereport/items/lrhorizontallayout.h index 5bfaddc..fa5edf3 100644 --- a/limereport/items/lrhorizontallayout.h +++ b/limereport/items/lrhorizontallayout.h @@ -30,89 +30,41 @@ #ifndef LRHORIZONTALLAYOUT_H #define LRHORIZONTALLAYOUT_H #include "lritemdesignintf.h" +#include "lrlayoutmarker.h" +#include "lrabstractlayout.h" namespace LimeReport { -class HorizontalLayout; - -class LayoutMarker : public QGraphicsItem{ -public: - explicit LayoutMarker(HorizontalLayout* layout, QGraphicsItem *parent=0); - virtual QRectF boundingRect() const{return m_rect;} - virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); - void setHeight(qreal height); - void setWidth(qreal width); - void setColor(QColor color); - qreal width(){return m_rect.width();} - qreal height(){return m_rect.height();} -protected: - void mousePressEvent(QGraphicsSceneMouseEvent *event); -private: - QRectF m_rect; - QColor m_color; - HorizontalLayout* m_layout; -}; - -class HorizontalLayout : public LayoutDesignIntf +class HorizontalLayout : public AbstractLayout { Q_OBJECT - Q_ENUMS(LayoutType) Q_PROPERTY(LayoutType layoutType READ layoutType WRITE setLayoutType) public: friend class LayoutMarker; - enum LayoutType{Layout,Table}; + friend class BaseDesignIntf; + HorizontalLayout(QObject *owner = 0, QGraphicsItem *parent = 0); ~HorizontalLayout(); BaseDesignIntf *createSameTypeItem(QObject *owner = 0, QGraphicsItem *parent = 0); - void hoverEnterEvent(QGraphicsSceneHoverEvent *event); - void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); - void geometryChangedEvent(QRectF newRect, QRectF); - void addChild(BaseDesignIntf *item,bool updateSize=true); - friend class BaseDesignIntf; - void restoreChild(BaseDesignIntf *item); - bool isEmpty() const; - LayoutType layoutType() const; - void setLayoutType(const LayoutType &layoutType); bool isSplittable() const { return true;} + protected: - void collectionLoadFinished(const QString &collectionName); - void objectLoadFinished(); void updateLayoutSize(); void relocateChildren(); BaseDesignIntf *findNext(BaseDesignIntf *item); BaseDesignIntf *findPrior(BaseDesignIntf *item); - void beforeDelete(); - void updateItemSize(DataSourceManager *dataManager, RenderPass pass, int maxHeight); - bool isNeedUpdateSize(RenderPass pass) const; - void childAddedEvent(BaseDesignIntf *child); - void setChildVisibility(bool value); - int childrenCount(); - void initMode(ItemMode mode); bool canBeSplitted(int height) const; BaseDesignIntf* cloneUpperPart(int height, QObject* owner=0, QGraphicsItem* parent=0); BaseDesignIntf* cloneBottomPart(int height, QObject *owner=0, QGraphicsItem *parent=0); void setItemAlign(const ItemAlign &itemAlign); - void setBorderLinesFlags(BorderLines flags); - QVariant itemChange(GraphicsItemChange change, const QVariant &value); - void paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget); -private slots: - void slotOnChildDestroy(QObject *child); - void slotOnChildGeometryChanged(QObject*item, QRectF newGeometry, QRectF oldGeometry); - void slotOnChildItemAlignChanged(BaseDesignIntf* item, const ItemAlign&, const ItemAlign&); - void slotOnChildVisibleHasChanged(BaseDesignIntf*); - void slotOnChildSelectionHasChanged(BaseDesignIntf* item, bool value); - //void slotOnPosChanged(QObject*, QPointF newPos, QPointF ); private: void divideSpace(); -private: - QList m_children; - bool m_isRelocating; - LayoutMarker* m_layoutMarker; - LayoutType m_layoutType; + void placeItemInLayout(BaseDesignIntf* item); + void insertItemInLayout(BaseDesignIntf* item); }; } //namespace LimeReport diff --git a/limereport/items/lrlayoutmarker.cpp b/limereport/items/lrlayoutmarker.cpp new file mode 100644 index 0000000..48b534c --- /dev/null +++ b/limereport/items/lrlayoutmarker.cpp @@ -0,0 +1,69 @@ +#include "lrlayoutmarker.h" +#include +#include + +namespace LimeReport{ + +LayoutMarker::LayoutMarker(BaseDesignIntf* layout, QGraphicsItem *parent) + :QGraphicsItem(parent), m_rect(0,0,30,30), m_color(Qt::red), m_layout(layout){ + setFlag(QGraphicsItem::ItemIsMovable); +} + +void LayoutMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) +{ + painter->save(); + painter->setOpacity(Const::LAYOUT_MARKER_OPACITY); + painter->fillRect(boundingRect(),m_color); + + painter->setRenderHint(QPainter::Antialiasing); + qreal size = (boundingRect().width()isSelected()){ + painter->setOpacity(1); + QRectF r = QRectF(0,0,size,size); + painter->setBrush(Qt::white); + painter->setPen(Qt::white); + painter->drawEllipse(r.adjusted(5,5,-5,-5)); + painter->setBrush(m_color); + painter->drawEllipse(r.adjusted(7,7,-7,-7)); + } + painter->restore(); +} + +void LayoutMarker::setHeight(qreal height) +{ + if (m_rect.height()!=height){ + prepareGeometryChange(); + m_rect.setHeight(height); + } +} + +void LayoutMarker::setWidth(qreal width) +{ + if (m_rect.width()!=width){ + prepareGeometryChange(); + m_rect.setWidth(width); + } +} + +void LayoutMarker::setColor(QColor color) +{ + if (m_color!=color){ + m_color = color; + update(boundingRect()); + } +} + +void LayoutMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if (event->button()==Qt::LeftButton) { + if (!(event->modifiers() & Qt::ControlModifier)) + m_layout->scene()->clearSelection(); + m_layout->setSelected(true); + //m_layout->setChildVisibility(false); + update(0,0,boundingRect().width(),boundingRect().width()); + } +} + + +} // namespace LimeReport diff --git a/limereport/items/lrlayoutmarker.h b/limereport/items/lrlayoutmarker.h new file mode 100644 index 0000000..3eb65b0 --- /dev/null +++ b/limereport/items/lrlayoutmarker.h @@ -0,0 +1,28 @@ +#ifndef LRLAYOUTMARKER_H +#define LRLAYOUTMARKER_H + +#include +#include "lrbanddesignintf.h" + +namespace LimeReport{ + +class LayoutMarker : public QGraphicsItem{ +public: + explicit LayoutMarker(BaseDesignIntf* layout, QGraphicsItem *parent=0); + virtual QRectF boundingRect() const{return m_rect;} + virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); + void setHeight(qreal height); + void setWidth(qreal width); + void setColor(QColor color); + qreal width(){return m_rect.width();} + qreal height(){return m_rect.height();} +protected: + void mousePressEvent(QGraphicsSceneMouseEvent *event); +private: + QRectF m_rect; + QColor m_color; + BaseDesignIntf* m_layout; +}; + +} // namespace LimeReport +#endif // LRLAYOUTMARKER_H diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 0745e0f..63d856f 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -62,7 +62,7 @@ namespace LimeReport{ TextItem::TextItem(QObject *owner, QGraphicsItem *parent) : ContentItemDesignIntf(xmlTag,owner,parent), m_angle(Angle0), m_trimValue(true), m_allowHTML(false), m_allowHTMLInFields(false), m_replaceCarriageReturns(false), m_followTo(""), m_follower(0), m_textIndent(0), - m_textLayoutDirection(Qt::LayoutDirectionAuto) + m_textLayoutDirection(Qt::LayoutDirectionAuto), m_hideIfEmpty(false) { PageItemDesignIntf* pageItem = dynamic_cast(parent); BaseDesignIntf* parentItem = dynamic_cast(parent); @@ -115,6 +115,11 @@ void TextItem::preparePopUpMenu(QMenu &menu) action = menu.addAction(tr("Watermark")); action->setCheckable(true); action->setChecked(isWatermark()); + + action = menu.addAction(tr("Hide if empty")); + action->setCheckable(true); + action->setChecked(hideIfEmpty()); + } void TextItem::processPopUpAction(QAction *action) @@ -144,6 +149,10 @@ void TextItem::processPopUpAction(QAction *action) if (action->text().compare(tr("Watermark")) == 0){ page()->setPropertyToSelectedItems("watermark",action->isChecked()); } + + if (action->text().compare(tr("Hide if empty")) == 0){ + page()->setPropertyToSelectedItems("hideIfEmpty",action->isChecked()); + } } void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, QWidget* widget) { @@ -329,6 +338,7 @@ void TextItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, i } } BaseDesignIntf::updateItemSize(dataManager, pass, maxHeight); + if (isEmpty() && hideIfEmpty()) setVisible(false); } void TextItem::updateLayout() @@ -538,6 +548,19 @@ TextItem::TextPtr TextItem::textDocument() const } +bool TextItem::hideIfEmpty() const +{ + return m_hideIfEmpty; +} + +void TextItem::setHideIfEmpty(bool hideEmpty) +{ + if (m_hideIfEmpty != hideEmpty){ + m_hideIfEmpty = hideEmpty; + notify("hideIfEmpty",!m_hideIfEmpty, m_hideIfEmpty); + } +} + bool TextItem::isReplaceCarriageReturns() const { return m_replaceCarriageReturns; diff --git a/limereport/items/lrtextitem.h b/limereport/items/lrtextitem.h index 3eb06e2..e57864e 100644 --- a/limereport/items/lrtextitem.h +++ b/limereport/items/lrtextitem.h @@ -74,6 +74,7 @@ class TextItem : public LimeReport::ContentItemDesignIntf, IPageInit { Q_PROPERTY(bool fillInSecondPass READ fillInSecondPass WRITE setFillInSecondPass) Q_PROPERTY(bool watermark READ isWatermark WRITE setWatermark) Q_PROPERTY(bool replaceCRwithBR READ isReplaceCarriageReturns WRITE setReplaceCarriageReturns) + Q_PROPERTY(bool hideIfEmpty READ hideIfEmpty WRITE setHideIfEmpty) public: enum AutoWidth{NoneAutoWidth,MaxWordLength,MaxStringLength}; @@ -107,7 +108,7 @@ public: bool canBeSplitted(int height) const; bool isSplittable() const { return true;} - bool isEmpty() const{return m_strText.trimmed().isEmpty() /*m_text->isEmpty()*/;} + bool isEmpty() const{return m_strText.trimmed().isEmpty();} BaseDesignIntf* cloneUpperPart(int height, QObject *owner, QGraphicsItem *parent); BaseDesignIntf* cloneBottomPart(int height, QObject *owner, QGraphicsItem *parent); BaseDesignIntf* createSameTypeItem(QObject* owner=0, QGraphicsItem* parent=0); @@ -172,6 +173,9 @@ public: bool isReplaceCarriageReturns() const; void setReplaceCarriageReturns(bool isReplaceCarriageReturns); + bool hideIfEmpty() const; + void setHideIfEmpty(bool hideIfEmpty); + protected: void updateLayout(); bool isNeedExpandContent() const; @@ -193,8 +197,6 @@ private: TextPtr textDocument() const; private: QString m_strText; - //QTextLayout m_layout; - //QTextDocument* m_text; Qt::Alignment m_alignment; bool m_autoHeight; AutoWidth m_autoWidth; @@ -217,6 +219,7 @@ private: TextItem* m_follower; qreal m_textIndent; Qt::LayoutDirection m_textLayoutDirection; + bool m_hideIfEmpty; }; diff --git a/limereport/items/lrverticallayout.cpp b/limereport/items/lrverticallayout.cpp new file mode 100644 index 0000000..547225c --- /dev/null +++ b/limereport/items/lrverticallayout.cpp @@ -0,0 +1,220 @@ +#include "lrverticallayout.h" + +#include "lrbasedesignintf.h" +#include "lrdesignelementsfactory.h" + +const QString xmlTag = "VLayout"; + +namespace { + +LimeReport::BaseDesignIntf *createVLayout(QObject *owner, LimeReport::BaseDesignIntf *parent) +{ + return new LimeReport::VerticalLayout(owner, parent); +} +bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instance().registerCreator( + xmlTag, + LimeReport::ItemAttribs(QObject::tr("VLayout"), LimeReport::Const::bandTAG), + createVLayout + ); +} + +namespace LimeReport{ + +bool verticalLessThen(BaseDesignIntf *c1, BaseDesignIntf* c2){ + return c1->pos().y()pos().y(); +} + +VerticalLayout::VerticalLayout(QObject* owner, QGraphicsItem* parent) + : AbstractLayout(xmlTag, owner, parent) +{} + +VerticalLayout::~VerticalLayout() +{} + +BaseDesignIntf* VerticalLayout::createSameTypeItem(QObject* owner, QGraphicsItem* parent) +{ + return new LimeReport::VerticalLayout(owner, parent); +} + +void VerticalLayout::updateLayoutSize() +{ + int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; + int h = spaceBorder*2; + qreal w = 0; + foreach(BaseDesignIntf* item, layoutsChildren()){ + if (item->isEmpty() && hideEmptyItems()) item->setVisible(false); + if (item->isVisible()){ + if (w < item->width()) w = item->width(); + h+=item->height(); + } + } + if (w>0) setWidth(w+spaceBorder*2); + setHeight(h); +} + +void VerticalLayout::relocateChildren() +{ + int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; + if (layoutsChildren().count() < childItems().size() - 1){ + layoutsChildren().clear(); + foreach (BaseDesignIntf* item, childBaseItems()) { + layoutsChildren().append(item); + } + } + qSort(layoutsChildren().begin(),layoutsChildren().end(), verticalLessThen); + qreal curY = spaceBorder; + setIsRelocating(true); + foreach (BaseDesignIntf* item, layoutsChildren()) { + if (item->isVisible() || itemMode() == DesignMode){ + item->setPos(spaceBorder, curY); + curY+=item->height(); + item->setWidth(width() - (spaceBorder * 2)); + } + } + setIsRelocating(false); +} + +bool VerticalLayout::canBeSplitted(int height) const +{ + if (childItems().isEmpty()) return false; + BaseDesignIntf* item = dynamic_cast(childItems().at(0)); + if (item){ + if (item->height() > height ) + return item->canBeSplitted(height); + else return true; + } + return false; +} + +BaseDesignIntf* VerticalLayout::cloneUpperPart(int height, QObject* owner, QGraphicsItem* parent) +{ + VerticalLayout* upperPart = dynamic_cast(createSameTypeItem(owner,parent)); + upperPart->initFromItem(this); + foreach(BaseDesignIntf* item, childBaseItems()){ + if ((item->geometry().bottom() <= height) ){ + item->cloneItem(item->itemMode(),upperPart,upperPart); + } else { + if ((item->geometry().top() < height) && ( item->geometry().bottom() > height)){ + int sliceHeight = height - item->geometry().top(); + if (item->isSplittable() && item->canBeSplitted(sliceHeight)){ + item->cloneUpperPart(sliceHeight,upperPart,upperPart); + } + } + } + } + + upperPart->setHeight(height); + + return upperPart; +} + +BaseDesignIntf* VerticalLayout::cloneBottomPart(int height, QObject* owner, QGraphicsItem* parent) +{ + VerticalLayout* bottomPart = dynamic_cast(createSameTypeItem(owner,parent)); + bottomPart->initFromItem(this); + + foreach(BaseDesignIntf* item,childBaseItems()){ + if ((item->geometry().top() < height) && ( item->geometry().bottom() > height )){ + int sliceHeight = height - item->geometry().top(); + if (item->canBeSplitted(sliceHeight)){ + BaseDesignIntf* tmpItem = item->cloneBottomPart(sliceHeight, bottomPart, bottomPart); + tmpItem->setPos(tmpItem->pos().x(),0); + tmpItem->setHeight(sliceHeight); + } else { + item->cloneItem(item->itemMode(), bottomPart, bottomPart); + item->setPos(item->pos().x(), 0); + } + } else { + if (item->geometry().top() >= height){ + BaseDesignIntf* tmpItem = item->cloneItem(item->itemMode(), bottomPart, bottomPart); + tmpItem->setPos(item->pos().x(), item->pos().y() - height); + } + } + } + + int currentHeight = 0; + if (!bottomPart->isEmpty()){ + foreach (BaseDesignIntf* item, bottomPart->childBaseItems()) { + currentHeight+=item->height(); + } + bottomPart->setHeight(currentHeight); + } + return bottomPart; +} + +void VerticalLayout::divideSpace() +{ + setIsRelocating(true); + qreal itemsSumSize = 0; + int visibleItemsCount = 0; + int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; + + foreach(BaseDesignIntf* item, layoutsChildren()){ + if (item->isVisible() || itemMode() == DesignMode ){ + itemsSumSize += item->height(); + visibleItemsCount++; + } + } + qreal delta = (height() - (itemsSumSize+spaceBorder*2)) / (visibleItemsCount!=0 ? visibleItemsCount : 1); + + for (int i=0; iisVisible() || itemMode() == DesignMode) + layoutsChildren()[i]->setHeight(layoutsChildren()[i]->height()+delta); + if ((i+1)isVisible() || itemMode() == DesignMode) + layoutsChildren()[i+1]->setPos(layoutsChildren()[i+1]->pos().x(), layoutsChildren()[i+1]->pos().y()+delta*(i+1)); + } + setIsRelocating(false); +} + +void VerticalLayout::placeItemInLayout(BaseDesignIntf* item) +{ + if (layoutsChildren().count() > 0) + item->setPos(0, layoutsChildren().last()->pos().y() + layoutsChildren().last()->height()); + else + item->setPos(0, 0); +} + +void VerticalLayout::insertItemInLayout(BaseDesignIntf* item) +{ + foreach (BaseDesignIntf* child, childBaseItems()) { + if (child->pos() == item->pos()){ + int index = layoutsChildren().indexOf(child)-1; + layoutsChildren().insert(index, item); + child->setPos(0, item->pos().y()+item->height()); + break; + } + } +} + +BaseDesignIntf*VerticalLayout::findNext(BaseDesignIntf* item) +{ + if (layoutsChildren().count() < childItems().size()-1){ + layoutsChildren().clear(); + foreach (BaseDesignIntf* childItem, childBaseItems()) { + layoutsChildren().append(childItem); + } + } + qSort(layoutsChildren().begin(),layoutsChildren().end(),verticalLessThen); + for (int i=0; ii+1){ return layoutsChildren()[i+1];} + } + return 0; +} + +BaseDesignIntf*VerticalLayout::findPrior(BaseDesignIntf* item) +{ + if (layoutsChildren().count()setEnabled(true); } menu.addSeparator(); - QAction* brinToTopAction = menu.addAction(QIcon(":/report//images/bringToTop"), tr("Bring to top")); - QAction* sendToBackAction = menu.addAction(QIcon(":/report//images/sendToBack"), tr("Send to back")); + QAction* brinToTopAction = menu.addAction(QIcon(":/report/images/bringToTop"), tr("Bring to top")); + QAction* sendToBackAction = menu.addAction(QIcon(":/report/images/sendToBack"), tr("Send to back")); QAction* createHLayout = 0; if( page->selectedItems().count()>1){ createHLayout = menu.addAction(QIcon(":/report/images/hlayout"), tr("Create Horizontal Layout")); } + QAction* createVLayout = 0; + if( page->selectedItems().count()>1){ + createVLayout = menu.addAction(QIcon(":/report/images/vlayout"), tr("Create Vertical Layout")); + } menu.addSeparator(); - QAction* noBordersAction = menu.addAction(QIcon(":/report//images/noLines"), tr("No borders")); - QAction* allBordersAction = menu.addAction(QIcon(":/report//images/allLines"), tr("All borders")); + QAction* noBordersAction = menu.addAction(QIcon(":/report/images/noLines"), tr("No borders")); + QAction* allBordersAction = menu.addAction(QIcon(":/report/images/allLines"), tr("All borders")); preparePopUpMenu(menu); QAction* a = menu.exec(event->screenPos()); if (a){ @@ -1255,6 +1259,8 @@ void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) page->setBorders(BaseDesignIntf::AllLines); if (a == createHLayout) page->addHLayout(); + if (a == createVLayout) + page->addVLayout(); processPopUpAction(a); } } diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 0f5f044..9f60781 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -31,6 +31,7 @@ #include "lrbasedesignintf.h" #include "lrtextitem.h" #include "lrhorizontallayout.h" +#include "lrverticallayout.h" //#include "lrbarcodeitem.h" #include "lrbanddesignintf.h" #include "lrbandsmanager.h" @@ -1546,6 +1547,46 @@ void PageDesignIntf::addHLayout() } +void PageDesignIntf::addVLayout() +{ + if (selectedItems().isEmpty()) return; + + QList si = selectedItems(); + QList::iterator it = si.begin(); + + int itemsCount = 0; + for (; it != si.end();) { + if (dynamic_cast(*it)){ + itemsCount++; + break; + } + ++it; + }; + + if (itemsCount == 0) return; + + for (; it != si.end();) { + if (!dynamic_cast(*it)) { + (*it)->setSelected(false); + it = si.erase(it); + } + else ++it; + } + + if (!si.isEmpty()){ + it = si.begin(); + QGraphicsItem* elementsParent = (*it)->parentItem(); + for (; it != si.end();++it) { + if ((*it)->parentItem()!=elementsParent){ + QMessageBox::information(0,QObject::tr("Attention!"),QObject::tr("Selected elements have different parent containers")); + return; + } + } + CommandIf::Ptr cm = InsertVLayoutCommand::create(this); + saveCommand(cm,true); + } +} + bool hLayoutLessThen(QGraphicsItem *c1, QGraphicsItem *c2) { return c1->pos().x() < c2->pos().x(); @@ -1590,6 +1631,50 @@ HorizontalLayout* PageDesignIntf::internalAddHLayout() return 0; } +bool vLayoutLessThen(QGraphicsItem *c1, QGraphicsItem *c2) +{ + return c1->pos().y() < c2->pos().y(); +} + +VerticalLayout* PageDesignIntf::internalAddVLayout() +{ + if (m_firstSelectedItem && (selectedItems().count() > 1)) { + + QList si = selectedItems(); + QList::iterator it = si.begin(); + qSort(si.begin(), si.end(), vLayoutLessThen); + it = si.begin(); + + if (si.count() > 1) { + + it = si.begin(); + ItemDesignIntf *firstElement = dynamic_cast(*it); + + VerticalLayout *layout = new VerticalLayout(firstElement->parent(), firstElement->parentItem()); + layout->setItemLocation(firstElement->itemLocation()); + layout->setPos(firstElement->pos()); + layout->setWidth(firstElement->width()); + layout->setHeight(0); + + for (; it != si.end(); ++it) { + BaseDesignIntf *bdItem = dynamic_cast(*it); + layout->addChild(bdItem); + } + + foreach(QGraphicsItem * item, selectedItems()) { + item->setSelected(false); + } + + layout->setObjectName(genObjectName(*layout)); + layout->setItemTypeName("VerticalLayout"); + layout->setSelected(true); + registerItem(layout); + return layout; + } + } + return 0; +} + void PageDesignIntf::setFont(const QFont& font) { changeSelectedGroupProperty("font",font); @@ -2240,7 +2325,59 @@ qreal ItemProjections::square(QRectF rect) qreal ItemProjections::square(BaseDesignIntf *item) { - return square(QRectF(item->pos().x(),item->pos().y(),item->width(),item->height())); + return square(QRectF(item->pos().x(),item->pos().y(),item->width(),item->height())); +} + +CommandIf::Ptr InsertVLayoutCommand::create(PageDesignIntf* page) +{ + InsertVLayoutCommand *command = new InsertVLayoutCommand(); + command->setPage(page); + + QList si = page->selectedItems(); + QList::iterator it = si.begin(); + + BaseDesignIntf* parentItem = dynamic_cast((*it)->parentItem()); + command->m_oldParentName = (parentItem)?(parentItem->objectName()):""; + + for(it = si.begin();it!=si.end();++it){ + BaseDesignIntf* bi = dynamic_cast(*it); + if (bi) + command->m_elements.insert(bi->objectName(),bi->pos()); + } + + return CommandIf::Ptr(command); +} + +bool InsertVLayoutCommand::doIt() +{ + foreach (QString itemName, m_elements.keys()) { + BaseDesignIntf* bi = page()->reportItemByName(itemName); + if (bi) + bi->setSelected(true); + } + LayoutDesignIntf* layout = page()->internalAddVLayout(); + if (layout) + m_layoutName = layout->objectName(); + return layout != 0; +} + +void InsertVLayoutCommand::undoIt() +{ + VerticalLayout* layout = dynamic_cast(page()->reportItemByName(m_layoutName)); + if (layout){ + foreach(QGraphicsItem* item, layout->childBaseItems()){ + BaseDesignIntf* bi = dynamic_cast(item); + BaseDesignIntf* parent = page()->reportItemByName(m_oldParentName); + if (bi && parent){ + bi->setParentItem(parent); + bi->setParent(parent); + bi->setPos(m_elements.value(bi->objectName())); + bi->setFixedPos(false); + bi->setPossibleResizeDirectionFlags(BaseDesignIntf::AllDirections); + } + } + page()->removeReportItem(layout,false); + } } } diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 684df0b..8e228c0 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -43,6 +43,7 @@ namespace LimeReport { class ReportEnginePrivate; class PropertyChangedCommand; class HorizontalLayout; + class VerticalLayout; class LayoutDesignIntf; class CommandIf { @@ -102,6 +103,7 @@ namespace LimeReport { public: friend class PropertyChangedCommand; friend class InsertHLayoutCommand; + friend class InsertVLayoutCommand; enum Orientation {Portrait, Landscape}; enum PageSize {A4, B5, Letter, Legal, Executive, A0, A1, A2, A3, A5, A6, A7, A8, A9, B0, B1, @@ -208,6 +210,7 @@ namespace LimeReport { void objectLoadFinished(); HorizontalLayout* internalAddHLayout(); + VerticalLayout* internalAddVLayout(); QPointF placePosOnGrid(QPointF point); QSizeF placeSizeOnGrid(QSizeF size); signals: @@ -250,6 +253,7 @@ namespace LimeReport { void sameWidth(); void sameHeight(); void addHLayout(); + void addVLayout(); void setFont(const QFont &font); void setTextAlign(const Qt::Alignment& alignment); void setBorders(const BaseDesignIntf::BorderLines& border); @@ -339,6 +343,19 @@ namespace LimeReport { QMap m_elements; }; + class InsertVLayoutCommand : public AbstractPageCommand{ + public: + static CommandIf::Ptr create(PageDesignIntf* page); + bool doIt(); + void undoIt(); + private: + InsertVLayoutCommand(){} + private: + QString m_layoutName; + QString m_oldParentName; + QMap m_elements; + }; + class InsertItemCommand : public AbstractPageCommand{ public: static CommandIf::Ptr create(PageDesignIntf* page, const QString& itemType, QPointF pos, QSizeF size); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 1a2904b..332dd27 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -630,6 +630,12 @@ void ReportDesignWidget::addHLayout() activePage()->addHLayout(); } +void ReportDesignWidget::addVLayout() +{ + if (activePage()) + activePage()->addVLayout(); +} + void ReportDesignWidget::setFont(const QFont& font) { if (activePage()) diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 6204d69..913d85b 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -150,6 +150,7 @@ public slots: void sameWidth(); void editLayoutMode(bool value); void addHLayout(); + void addVLayout(); void setFont(const QFont &font); void setTextAlign(const bool &horizontalAlign, const Qt::AlignmentFlag &alignment); void setBorders(const BaseDesignIntf::BorderLines& borders); diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index d02cbef..cf8b004 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -221,6 +221,10 @@ void ReportDesignWindow::createActions() m_addHLayout->setIcon(QIcon(":/report/images/hlayout")); connect(m_addHLayout,SIGNAL(triggered()),this,SLOT(slotHLayout())); + m_addVLayout = new QAction(tr("Vertical layout"),this); + m_addVLayout->setIcon(QIcon(":/report/images/vlayout")); + connect(m_addVLayout,SIGNAL(triggered()),this,SLOT(slotVLayout())); + m_aboutAction = new QAction(tr("About"),this); m_aboutAction->setIcon(QIcon(":/report/images/copyright")); connect(m_aboutAction,SIGNAL(triggered()),this,SLOT(slotShowAbout())); @@ -258,6 +262,7 @@ void ReportDesignWindow::createReportToolBar() createItemsActions(); m_reportToolBar->addSeparator(); m_reportToolBar->addAction(m_addHLayout); + m_reportToolBar->addAction(m_addVLayout); m_reportToolBar->addSeparator(); m_reportToolBar->addAction(m_deleteItemAction); @@ -1171,6 +1176,11 @@ void ReportDesignWindow::slotHLayout() m_reportDesignWidget->addHLayout(); } +void ReportDesignWindow::slotVLayout() +{ + m_reportDesignWidget->addVLayout(); +} + void ReportDesignWindow::slotTest() { } diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 1beb45a..e7cd514 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -92,6 +92,7 @@ private slots: void slotDelete(); void slotEditLayoutMode(); void slotHLayout(); + void slotVLayout(); void slotItemSelected(LimeReport::BaseDesignIntf *item); void slotItemPropertyChanged(const QString& objectName, const QString& propertyName, const QVariant &oldValue, const QVariant &newValue); void slotMultiItemSelected(); @@ -223,6 +224,7 @@ private: QAction* m_aboutAction; QAction* m_editLayoutMode; QAction* m_addHLayout; + QAction* m_addVLayout; QAction* m_hideLeftPanel; QAction* m_hideRightPanel; #ifdef HAVE_QTDESIGNER_INTEGRATION diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 8a1d8a7..b39c4d0 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -152,6 +152,8 @@ void QObjectPropertyModel::translatePropertyName() tr("printable"); tr("variable"); tr("replaceCRwithBR"); + tr("hideIfEmpty"); + tr("hideEmptyItems"); } void QObjectPropertyModel::clearObjectsList() diff --git a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp index 6398f12..2c6c6b0 100644 --- a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp @@ -141,6 +141,8 @@ void EnumPropItem::translateEnumItemName() tr("TitleAlignLeft"); tr("TitleAlignRight"); tr("TitleAlignCenter"); + tr("Layout"); + tr("Table"); } void EnumPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const diff --git a/limereport/report.qrc b/limereport/report.qrc index fe70d36..0d24acb 100644 --- a/limereport/report.qrc +++ b/limereport/report.qrc @@ -182,5 +182,6 @@ images/property.png images/signal.png images/object.png + images/vlayuot_4_24.png From 34917c62264e6896dc09f95011a1369371c08449 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 21 Jun 2018 22:18:07 +0300 Subject: [PATCH 182/347] no_embedded_designer building has been fixed --- designer_plugin/designer_plugin.pro | 6 +- designer_plugin/limereport.pri | 235 ---------------------------- designer_plugin/main.cpp | 13 -- limereport/designer.pri | 106 +++++++++++++ limereport/limereport.pri | 115 +------------- 5 files changed, 112 insertions(+), 363 deletions(-) delete mode 100644 designer_plugin/limereport.pri delete mode 100644 designer_plugin/main.cpp create mode 100644 limereport/designer.pri diff --git a/designer_plugin/designer_plugin.pro b/designer_plugin/designer_plugin.pro index cfcbb39..1c39b32 100644 --- a/designer_plugin/designer_plugin.pro +++ b/designer_plugin/designer_plugin.pro @@ -1,7 +1,9 @@ -include(../common.pri) -include(limereport.pri) QT += core gui +include(../common.pri) +include(../limereport/limereport.pri) +include(../limereport/designer.pri) + contains(CONFIG,release) { TARGET = designer_plugin } else { diff --git a/designer_plugin/limereport.pri b/designer_plugin/limereport.pri deleted file mode 100644 index be32632..0000000 --- a/designer_plugin/limereport.pri +++ /dev/null @@ -1,235 +0,0 @@ -include(../common.pri) - -DEFINES += HAVE_REPORT_DESIGNER - -contains(CONFIG,dialogdesigner){ - include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) -} - -DEFINES += INSPECT_BASEDESIGN - -INCLUDEPATH += \ - $$REPORT_PATH/ \ - $$REPORT_PATH/items \ - $$REPORT_PATH/bands \ - $$REPORT_PATH/base \ - $$REPORT_PATH/objectinspector \ - $$REPORT_PATH/databrowser \ - $$REPORT_PATH/scripteditor \ - $$REPORT_PATH/../designer_plugin - -SOURCES += \ - $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ - $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ - $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ - $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ - $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.cpp \ - $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrfonteditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrimageeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrcoloreditor.cpp \ - $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.cpp \ - $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.cpp \ - $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ - $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ - $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ - $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ - $$REPORT_PATH/scripteditor/lrscripteditor.cpp \ - $$REPORT_PATH/scripteditor/lrcodeeditor.cpp \ - $$REPORT_PATH/scripteditor/lrscripthighlighter.cpp \ - $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ - $$REPORT_PATH/items/lralignpropitem.cpp \ - $$REPORT_PATH/items/lrhorizontallayout.cpp \ - $$REPORT_PATH/items/editors/lritemeditorwidget.cpp \ - $$REPORT_PATH/items/editors/lrfonteditorwidget.cpp \ - $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.cpp \ - $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ - $$REPORT_PATH/items/editors/lritemsborderseditorwidget.cpp \ - $$REPORT_PATH/items/lrchartitem.cpp \ - $$REPORT_PATH/items/lrchartitemeditor.cpp \ - $$REPORT_PATH/items/lrshapeitem.cpp \ - $$REPORT_PATH/items/lrimageitem.cpp \ - $$REPORT_PATH/translationeditor/translationeditor.cpp \ - $$REPORT_PATH/lrbanddesignintf.cpp \ - $$REPORT_PATH/lrpageitemdesignintf.cpp \ - $$REPORT_PATH/lrpagedesignintf.cpp \ - $$REPORT_PATH/lrbandsmanager.cpp \ - $$REPORT_PATH/lrglobal.cpp \ - $$REPORT_PATH/lritemdesignintf.cpp \ - $$REPORT_PATH/lrdatadesignintf.cpp \ - $$REPORT_PATH/lrreportdesignwidget.cpp \ - $$REPORT_PATH/lrbasedesignintf.cpp \ - $$REPORT_PATH/lrdatasourcemanager.cpp \ - $$REPORT_PATH/lrreportdesignwindow.cpp \ - $$REPORT_PATH/lrscriptenginemanager.cpp \ - $$REPORT_PATH/lraboutdialog.cpp \ - $$REPORT_PATH/lrsettingdialog.cpp \ - $$REPORT_PATH/lritemscontainerdesignitf.cpp \ - $$REPORT_PATH/lrcolorindicator.cpp \ - $$REPORT_PATH/lrreporttranslation.cpp \ - $$REPORT_PATH/translationeditor/languageselectdialog.cpp \ - $$REPORT_PATH/serializators/lrxmlqrectserializator.cpp \ - $$REPORT_PATH/serializators/lrxmlbasetypesserializators.cpp \ - $$REPORT_PATH/serializators/lrxmlreader.cpp \ - $$REPORT_PATH/serializators/lrxmlwriter.cpp \ - $$REPORT_PATH/bands/lrpageheader.cpp \ - $$REPORT_PATH/bands/lrpagefooter.cpp \ - $$REPORT_PATH/bands/lrreportheader.cpp \ - $$REPORT_PATH/bands/lrreportfooter.cpp \ - $$REPORT_PATH/bands/lrdataband.cpp \ - $$REPORT_PATH/bands/lrgroupbands.cpp \ - $$REPORT_PATH/bands/lrsubdetailband.cpp \ - $$REPORT_PATH/bands/lrtearoffband.cpp \ - $$REPORT_PATH/lrgraphicsviewzoom.cpp \ - $$REPORT_PATH/lrvariablesholder.cpp \ - $$REPORT_PATH/lrgroupfunctions.cpp \ - $$REPORT_PATH/lrsimplecrypt.cpp \ - $$REPORT_PATH/items/lrsimpletagparser.cpp \ - $$REPORT_PATH/items/lrtextitem.cpp \ - $$REPORT_PATH/items/lrtextitemeditor.cpp \ - $$REPORT_PATH/lrreportengine.cpp \ - $$REPORT_PATH/lrpreviewreportwindow.cpp \ - $$REPORT_PATH/lrpreviewreportwidget.cpp \ - $$REPORT_PATH/lrreportrender.cpp - -HEADERS += \ - $$REPORT_PATH/base/lrsingleton.h \ - $$REPORT_PATH/base/lrsimpleabstractfactory.h \ - $$REPORT_PATH/base/lrattribsabstractfactory.h \ - $$REPORT_PATH/databrowser/lrdatabrowser.h \ - $$REPORT_PATH/databrowser/lrsqleditdialog.h \ - $$REPORT_PATH/databrowser/lrconnectiondialog.h \ - $$REPORT_PATH/databrowser/lrvariabledialog.h \ - $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ - $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrimageeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrcoloreditor.h \ - $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ - $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.h \ - $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.h \ - $$REPORT_PATH/objectinspector/lrobjectitemmodel.h \ - $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ - $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ - $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ - $$REPORT_PATH/scripteditor/lrscripteditor.h \ - $$REPORT_PATH/scripteditor/lrcodeeditor.h \ - $$REPORT_PATH/scripteditor/lrscripthighlighter.h \ - $$REPORT_PATH/items/editors/lritemeditorwidget.h \ - $$REPORT_PATH/items/editors/lrfonteditorwidget.h \ - $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ - $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ - $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ - $$REPORT_PATH/items/lrtextitem.h \ - $$REPORT_PATH/items/lrtextitemeditor.h \ - $$REPORT_PATH/items/lrsubitemparentpropitem.h \ - $$REPORT_PATH/items/lralignpropitem.h \ - $$REPORT_PATH/items/lrhorizontallayout.h \ - $$REPORT_PATH/items/lrchartitem.h \ - $$REPORT_PATH/items/lrchartitemeditor.h \ - $$REPORT_PATH/items/lrshapeitem.h \ - $$REPORT_PATH/items/lrimageitem.h \ - $$REPORT_PATH/translationeditor/translationeditor.h \ - $$REPORT_PATH/lrbanddesignintf.h \ - $$REPORT_PATH/lrpageitemdesignintf.h \ - $$REPORT_PATH/lrbandsmanager.h \ - $$REPORT_PATH/lrglobal.h \ - $$REPORT_PATH/lrdatadesignintf.h \ - $$REPORT_PATH/lrpagedesignintf.h \ - $$REPORT_PATH/lrreportdesignwidget.h \ - $$REPORT_PATH/lrdatasourcemanager.h \ - $$REPORT_PATH/lrreportdesignwindow.h \ - $$REPORT_PATH/lrgraphicsviewzoom.h \ - $$REPORT_PATH/lrbasedesignintf.h \ - $$REPORT_PATH/lritemdesignintf.h \ - $$REPORT_PATH/lrscriptenginemanager.h \ - $$REPORT_PATH/lrgroupfunctions.h \ - $$REPORT_PATH/lrdatasourcemanagerintf.h \ - $$REPORT_PATH/lrscriptenginemanagerintf.h \ - $$REPORT_PATH/lraboutdialog.h \ - $$REPORT_PATH/lrcallbackdatasourceintf.h \ - $$REPORT_PATH/lrsettingdialog.h \ - $$REPORT_PATH/lritemscontainerdesignitf.h \ - $$REPORT_PATH/lrcolorindicator.h \ - $$REPORT_PATH/lrreporttranslation.h \ - $$REPORT_PATH/translationeditor/languageselectdialog.h \ - $$REPORT_PATH/serializators/lrserializatorintf.h \ - $$REPORT_PATH/serializators/lrstorageintf.h \ - $$REPORT_PATH/serializators/lrxmlqrectserializator.h \ - $$REPORT_PATH/serializators/lrxmlserializatorsfactory.h \ - $$REPORT_PATH/serializators/lrxmlbasetypesserializators.h \ - $$REPORT_PATH/serializators/lrxmlreader.h \ - $$REPORT_PATH/serializators/lrxmlwriter.h \ - $$REPORT_PATH/bands/lrpageheader.h \ - $$REPORT_PATH/bands/lrpagefooter.h \ - $$REPORT_PATH/bands/lrreportheader.h \ - $$REPORT_PATH/bands/lrreportfooter.h \ - $$REPORT_PATH/bands/lrdataband.h \ - $$REPORT_PATH/bands/lrtearoffband.h \ - $$REPORT_PATH/bands/lrsubdetailband.h \ - $$REPORT_PATH/bands/lrgroupbands.h \ - $$REPORT_PATH/lrvariablesholder.h \ - $$REPORT_PATH/lrsimplecrypt.h \ - $$REPORT_PATH/items/lrsimpletagparser.h \ - $$REPORT_PATH/lrreportengine_p.h \ - $$REPORT_PATH/lrreportengine.h \ - $$REPORT_PATH/lrpreviewreportwindow.h \ - $$REPORT_PATH/lrpreviewreportwidget.h \ - $$REPORT_PATH/lrreportrender.h - -FORMS += \ - $$REPORT_PATH/items/lrtextitemeditor.ui \ - $$REPORT_PATH/items/lrchartitemeditor.ui \ - $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ - $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ - $$REPORT_PATH/databrowser/lrdatabrowser.ui \ - $$REPORT_PATH/databrowser/lrvariabledialog.ui \ - $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ - $$REPORT_PATH/lraboutdialog.ui \ - $$REPORT_PATH/lrsettingdialog.ui \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ - $$REPORT_PATH/translationeditor/translationeditor.ui \ - $$REPORT_PATH/translationeditor/languageselectdialog.ui \ - $$REPORT_PATH/scripteditor/lrscripteditor.ui \ - $$REPORT_PATH/lrpreviewreportwindow.ui \ - $$REPORT_PATH/lrpreviewreportwidget.ui -RESOURCES += \ - $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ - $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ - $$REPORT_PATH/report.qrc \ - $$REPORT_PATH/items/items.qrc \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \ - $$REPORT_PATH/translationeditor/translationeditor.qrc diff --git a/designer_plugin/main.cpp b/designer_plugin/main.cpp deleted file mode 100644 index 6ecf8ef..0000000 --- a/designer_plugin/main.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include -#include - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - LimeReport::ReportEngine report; - if (a.arguments().count()>1){ - report.loadFromFile(a.arguments().at(1)); - } - report.designReport(); - return a.exec(); -} diff --git a/limereport/designer.pri b/limereport/designer.pri new file mode 100644 index 0000000..5fb31ad --- /dev/null +++ b/limereport/designer.pri @@ -0,0 +1,106 @@ +DEFINES+=HAVE_REPORT_DESIGNER + +contains(CONFIG,dialogdesigner){ + include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) +} + +INCLUDEPATH += $$REPORT_PATH/objectinspector \ + $$REPORT_PATH/databrowser + +SOURCES += \ + $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ + $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ + $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ + $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ + $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.cpp \ + $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrfonteditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrimageeditor.cpp \ + $$REPORT_PATH/objectinspector/editors/lrcoloreditor.cpp \ + $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.cpp \ + $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.cpp \ + $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ + $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ + $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ + $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ + $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ + $$REPORT_PATH/items/lralignpropitem.cpp \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ + $$REPORT_PATH/translationeditor/translationeditor.cpp \ + $$REPORT_PATH/translationeditor/languageselectdialog.cpp \ + $$REPORT_PATH/lrreportdesignwidget.cpp \ + $$REPORT_PATH/lrreportdesignwindow.cpp + +HEADERS += \ + $$REPORT_PATH/databrowser/lrdatabrowser.h \ + $$REPORT_PATH/databrowser/lrsqleditdialog.h \ + $$REPORT_PATH/databrowser/lrconnectiondialog.h \ + $$REPORT_PATH/databrowser/lrvariabledialog.h \ + $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ + $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrimageeditor.h \ + $$REPORT_PATH/objectinspector/editors/lrcoloreditor.h \ + $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ + $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.h \ + $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.h \ + $$REPORT_PATH/objectinspector/lrobjectitemmodel.h \ + $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ + $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ + $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ + $$REPORT_PATH/translationeditor/translationeditor.h \ + $$REPORT_PATH/translationeditor/languageselectdialog.h \ + $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ + $$REPORT_PATH/items/lrsubitemparentpropitem.h \ + $$REPORT_PATH/items/lralignpropitem.h \ + $$REPORT_PATH/lrreportdesignwidget.h \ + $$REPORT_PATH/lrreportdesignwindow.h + +FORMS += \ + $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ + $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ + $$REPORT_PATH/databrowser/lrdatabrowser.ui \ + $$REPORT_PATH/databrowser/lrvariabledialog.ui \ + $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ + $$REPORT_PATH/translationeditor/translationeditor.ui \ + $$REPORT_PATH/translationeditor/languageselectdialog.ui + +RESOURCES += \ + $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ + $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ + $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \ + $$REPORT_PATH/translationeditor/translationeditor.qrc diff --git a/limereport/limereport.pri b/limereport/limereport.pri index dd033d3..df07a93 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -1,9 +1,7 @@ include(../common.pri) contains(CONFIG, embedded_designer){ - contains(CONFIG,dialogdesigner){ - include($$REPORT_PATH/dialogdesigner/dialogdesigner.pri) - } + include(designer.pri) } DEFINES += INSPECT_BASEDESIGN @@ -14,10 +12,6 @@ INCLUDEPATH += \ $$REPORT_PATH/bands \ $$REPORT_PATH/base \ $$REPORT_PATH/scripteditor -contains(CONFIG, embedded_designer){ - INCLUDEPATH += $$REPORT_PATH/objectinspector \ - $$REPORT_PATH/databrowser -} SOURCES += \ $$REPORT_PATH/bands/lrpageheader.cpp \ @@ -74,50 +68,6 @@ SOURCES += \ $$REPORT_PATH/items/lrchartitemeditor.cpp \ $$REPORT_PATH/lrreporttranslation.cpp - -contains(CONFIG, embedded_designer){ -SOURCES += \ - $$REPORT_PATH/databrowser/lrdatabrowser.cpp \ - $$REPORT_PATH/databrowser/lrsqleditdialog.cpp \ - $$REPORT_PATH/databrowser/lrconnectiondialog.cpp \ - $$REPORT_PATH/databrowser/lrvariabledialog.cpp \ - $$REPORT_PATH/databrowser/lrdatabrowsertree.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ - $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.cpp \ - $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrfonteditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrimageeditor.cpp \ - $$REPORT_PATH/objectinspector/editors/lrcoloreditor.cpp \ - $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.cpp \ - $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.cpp \ - $$REPORT_PATH/objectinspector/lrobjectitemmodel.cpp \ - $$REPORT_PATH/objectinspector/lrobjectpropitem.cpp \ - $$REPORT_PATH/objectinspector/lrpropertydelegate.cpp \ - $$REPORT_PATH/objectsbrowser/lrobjectbrowser.cpp \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.cpp \ - $$REPORT_PATH/items/lrsubitemparentpropitem.cpp \ - $$REPORT_PATH/items/lralignpropitem.cpp \ - $$REPORT_PATH/items/editors/lritemsaligneditorwidget.cpp \ - $$REPORT_PATH/translationeditor/translationeditor.cpp \ - $$REPORT_PATH/translationeditor/languageselectdialog.cpp \ - $$REPORT_PATH/lrreportdesignwidget.cpp \ - $$REPORT_PATH/lrreportdesignwindow.cpp -} - contains(CONFIG, staticlib){ SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp } @@ -196,50 +146,6 @@ HEADERS += \ $$REPORT_PATH/lrreporttranslation.h \ $$REPORT_PATH/lrreportdesignwindowintrerface.h - -contains(CONFIG, embedded_designer){ -HEADERS += \ - $$REPORT_PATH/databrowser/lrdatabrowser.h \ - $$REPORT_PATH/databrowser/lrsqleditdialog.h \ - $$REPORT_PATH/databrowser/lrconnectiondialog.h \ - $$REPORT_PATH/databrowser/lrvariabledialog.h \ - $$REPORT_PATH/databrowser/lrdatabrowsertree.h \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrstringpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrrectproptem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrfontpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrimagepropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrintpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrenumpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrboolpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrflagspropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ - $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ - $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrbuttonlineeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrimageeditor.h \ - $$REPORT_PATH/objectinspector/editors/lrcoloreditor.h \ - $$REPORT_PATH/objectinspector/editors/lrfonteditor.h \ - $$REPORT_PATH/objectinspector/lrbasedesignobjectmodel.h \ - $$REPORT_PATH/objectinspector/lrobjectinspectorwidget.h \ - $$REPORT_PATH/objectinspector/lrobjectitemmodel.h \ - $$REPORT_PATH/objectinspector/lrobjectpropitem.h \ - $$REPORT_PATH/objectinspector/lrpropertydelegate.h \ - $$REPORT_PATH/objectsbrowser/lrobjectbrowser.h \ - $$REPORT_PATH/translationeditor/translationeditor.h \ - $$REPORT_PATH/translationeditor/languageselectdialog.h \ - $$REPORT_PATH/items/editors/lritemsaligneditorwidget.h \ - $$REPORT_PATH/items/lrsubitemparentpropitem.h \ - $$REPORT_PATH/items/lralignpropitem.h \ - $$REPORT_PATH/lrreportdesignwidget.h \ - $$REPORT_PATH/lrreportdesignwindow.h -} - contains(CONFIG, staticlib){ HEADERS += $$REPORT_PATH/lrfactoryinitializer.h } @@ -256,25 +162,8 @@ FORMS += \ $$REPORT_PATH/lrsettingdialog.ui \ $$REPORT_PATH/items/lrchartitemeditor.ui \ $$REPORT_PATH/scripteditor/lrscripteditor.ui -contains(CONFIG, embedded_designer){ -FORMS += \ - $$REPORT_PATH/databrowser/lrsqleditdialog.ui \ - $$REPORT_PATH/databrowser/lrconnectiondialog.ui \ - $$REPORT_PATH/databrowser/lrdatabrowser.ui \ - $$REPORT_PATH/databrowser/lrvariabledialog.ui \ - $$REPORT_PATH/objectinspector/editors/ltextitempropertyeditor.ui \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.ui \ - $$REPORT_PATH/translationeditor/translationeditor.ui \ - $$REPORT_PATH/translationeditor/languageselectdialog.ui -} RESOURCES += \ $$REPORT_PATH/report.qrc \ $$REPORT_PATH/items/items.qrc -contains(CONFIG, embedded_designer){ -RESOURCES += \ - $$REPORT_PATH/objectinspector/lobjectinspector.qrc \ - $$REPORT_PATH/databrowser/lrdatabrowser.qrc \ - $$REPORT_PATH/scriptbrowser/lrscriptbrowser.qrc \ - $$REPORT_PATH/translationeditor/translationeditor.qrc -} + From 7c4b750697f2382730b82cc3223efdb14e2ecee0 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 21 Jun 2018 22:31:56 +0300 Subject: [PATCH 183/347] Russian translation updated --- translations/limereport_ru.ts | 134 +++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 57 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 95ef10a..2d3a406 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -147,19 +147,7 @@ p, li { white-space: pre-wrap; } <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Генератор отчетов для </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - кросс-платформенная С++ библиотека, написанная с использованием Qt framework и предназначенная для разработчиков программного обеспечения, которые хотят добавить в свое Qt приложение возможность формирования отчетов или печатных форм, генерируемых на основании шаблона.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Официальный веб-сайт : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">Эта библиотека распространяется в надежде, что она будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии КОММЕРЧЕСКОЙ ЦЕННОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. Все права защищены.</span></p></body></html> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> @@ -374,7 +362,7 @@ p, li { white-space: pre-wrap; } TearOffBand - Полоса для отрывания + Полоса отрыва SubDetailBand @@ -390,11 +378,11 @@ p, li { white-space: pre-wrap; } Keep bottom space - Сохранять нижний отступ + Сохранять отступ снизу Print if empty - Печатать если пустой + @@ -431,6 +419,10 @@ p, li { white-space: pre-wrap; } Create Horizontal Layout Создать Горизонтальную Компановку + + Create Vertical Layout + + LimeReport::ConnectionDesc @@ -451,7 +443,7 @@ p, li { white-space: pre-wrap; } Connection Name - Название + Наименование Соединения Driver @@ -495,7 +487,7 @@ p, li { white-space: pre-wrap; } Connection Name is empty - Наименование соединения не указано + Наименование Соединения не указано Connection with name @@ -532,29 +524,29 @@ p, li { white-space: pre-wrap; } Data Данные + + Use alternate background color + Использовать альтернативный цвет фона + Keep footer together - Привязать колонтитул к данными + Keep subdetail together - Привязать подчиненные данные + Slice last row - Разрезать последнюю запись + Start from new page - Начинать с новой страницы + Начинать с новой страницы Start new page - Начинать новую станицу - - - Use alternate background color - Использовать альтернативную заливку + Начинать новую страницу @@ -569,7 +561,7 @@ p, li { white-space: pre-wrap; } Add new datasource - Добавить новый источник данных + Добавить источник данных View data @@ -593,7 +585,7 @@ p, li { white-space: pre-wrap; } Add new variable - Добавить новую переменную + Добавить переменную Edit variable @@ -652,7 +644,7 @@ p, li { white-space: pre-wrap; } Print always - Печатать всегда + @@ -663,15 +655,15 @@ p, li { white-space: pre-wrap; } Reprint on each page - Печать на каждой странице + Repeat on each row - Повторять на каждой строке + Print always - Печатать всегда + @@ -977,6 +969,14 @@ p, li { white-space: pre-wrap; } TitleAlignCenter Название по центру + + Layout + + + + Table + + LimeReport::FlagsPropItem @@ -1002,7 +1002,7 @@ p, li { white-space: pre-wrap; } AllLines - Внешние границы + @@ -1169,7 +1169,7 @@ p, li { white-space: pre-wrap; } No borders - Удалить границы + Нет границ All borders @@ -1180,11 +1180,11 @@ p, li { white-space: pre-wrap; } LimeReport::MasterDetailProxyModel Field: "%1" not found in "%2" child datasource - Поле: "%1" не найдено в подчиненном источнике данных "%2" + Поле "%1" не найдено в подчиненном источнике данных "%2" Field: "%1" not found in "%2" master datasource - Поле: "%1" не найдено в главном источнике данных "%2" + Поле "%1" не найдено в главном источнике данных "%2" @@ -1333,11 +1333,11 @@ p, li { white-space: pre-wrap; } Preview - Предосмотр + Предпросмотр Ctrl+P - + Ctrl+P Fit page width @@ -1703,7 +1703,7 @@ p, li { white-space: pre-wrap; } columnCount - Количество колонок + Количество столбцов securityLevel @@ -1795,7 +1795,7 @@ p, li { white-space: pre-wrap; } setPageSizeToPrinter - Отправить параметры страницы в принтер + Оправитьпараметры страницы в принтер fillInSecondPass @@ -1831,7 +1831,7 @@ p, li { white-space: pre-wrap; } watermark - Водяной знак + водяной знак keepTopSpace @@ -1839,15 +1839,23 @@ p, li { white-space: pre-wrap; } printable - Печатать + variable - Переменная + replaceCRwithBR - Заменять CR на BR + + + + hideIfEmpty + + + + hideEmptyItems + @@ -1876,7 +1884,7 @@ p, li { white-space: pre-wrap; } LimeReport::ReportDesignWidget Report file name - Файл отчета + Имя файла отчета Script @@ -2127,15 +2135,15 @@ p, li { white-space: pre-wrap; } Report has been modified! Do you want save the report? - Отчет был изменен! Хотите его сохранить? + Отчет был изменен! Сохранить изменения? Hide left panel | Alt+L - Скрыть левую панель | Alt+L + Спрятать левую панель | Alt+L Hide right panel | Alt+R - Скрыть правую панель | Alt+R + Спрятать правую панель | Alt+R Delete dialog @@ -2143,7 +2151,7 @@ p, li { white-space: pre-wrap; } Add new dialog - Добавить новый диалог + Добавить диалог Widget Box @@ -2167,7 +2175,11 @@ p, li { white-space: pre-wrap; } Dialog Designer Tools - Инструменты дизайнера диалогов + Панель Инструментов + + + Vertical layout + @@ -2178,7 +2190,7 @@ p, li { white-space: pre-wrap; } Preview - Предосмотр + Предпросмотр Report File Change @@ -2225,7 +2237,7 @@ This preview is no longer valid. Wrong using function %1 - Не правильное использование функции %1 + Неверное использование функции %1 page index out of range @@ -2304,7 +2316,7 @@ This preview is no longer valid. Preview - Предосмотр + Предпросмотр ... @@ -2626,11 +2638,11 @@ This preview is no longer valid. TextItem " %1 " already has folower " %2 " - Текстовый элемент "%1" уже следует за "%2" + Текстовый элемент %1 уже следует за %2 TextItem " %1 " not found! - Текстовый элемент "%1" не найден! + Текстовый элемент %1 не найден! Transparent @@ -2640,6 +2652,10 @@ This preview is no longer valid. Watermark Водный знак + + Hide if empty + + LimeReport::TextItemEditor @@ -2934,7 +2950,7 @@ This preview is no longer valid. Wrong file format - Неправильный формат файла + Неверный формат файла Master datasource "%1" not found! @@ -2964,5 +2980,9 @@ This preview is no longer valid. Datasource manager not found Менеджер источников данных не найден + + VLayout + + From 44e37178d07d30d1c7d1af4f02f83c53d05d883f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 22 Jun 2018 12:47:23 +0300 Subject: [PATCH 184/347] French language updated --- translations/limereport_fr.ts | 366 +++++++++++++++++++++------------- 1 file changed, 228 insertions(+), 138 deletions(-) diff --git a/translations/limereport_fr.ts b/translations/limereport_fr.ts index a2b2989..eada105 100644 --- a/translations/limereport_fr.ts +++ b/translations/limereport_fr.ts @@ -54,7 +54,7 @@ Labels field - Libellés + Valeurs @@ -355,12 +355,12 @@ p, li { white-space: pre-wrap; } ReportHeader - En-tête du rapport + En-tête de rapport ReportFooter - Pied du rapport + Pied de rapport @@ -408,50 +408,38 @@ p, li { white-space: pre-wrap; } Connecté à - + Bring to top Placer au premier-plan - + Send to back Placer en arrière-plan - - + + Auto height Hauteur automatique - - + + Splittable Divisible - - + + Keep bottom space Conserver l'espace inférieur - - - Keep top space - - - - - - Start from new page - Démarrer depuis une nouvelle page - - - - - Start new page - Démarrer une nouvelle page + + + Print if empty + Imprimer si vide @@ -484,15 +472,20 @@ p, li { white-space: pre-wrap; } Create Horizontal Layout - + Créer une disposition horizontale - + + Create Vertical Layout + Créer une disposition verticale + + + No borders Aucune bordure - + All borders Toutes les bordures @@ -537,7 +530,7 @@ p, li { white-space: pre-wrap; } Port - + @@ -567,7 +560,7 @@ p, li { white-space: pre-wrap; } Dont keep credentals in lrxml - Ne pas enregistrer les informations personnelles + Ne pas enregistrer les informations personnelles dans lrxml @@ -624,10 +617,40 @@ p, li { white-space: pre-wrap; } Données - - + + Use alternate background color - + Utiliser les Couleurs de fond alternative + + + + + Keep footer together + Joindre avec le pied + + + + + Keep subdetail together + Joindre avec le sous-détail + + + + + Slice last row + Couper la dernière rangée + + + + + Start from new page + Démarrer depuis une nouvelle page + + + + + Start new page + Démarrer une nouvelle page @@ -758,18 +781,42 @@ p, li { white-space: pre-wrap; } LimeReport::DataFooterBand - + DataFooter Pied de données + + + + Print always + Toujours imprimé + LimeReport::DataHeaderBand - + DataHeader En-tête de données + + + + Reprint on each page + Imprimer dans chaque page + + + + + Repeat on each row + Répéter dans chaque ligne + + + + + Print always + Toujours imprimé + LimeReport::DataSourceManager @@ -846,7 +893,7 @@ p, li { white-space: pre-wrap; } Object Inspector - Inspecteur d'objet + Explorateur d'objets @@ -1151,6 +1198,16 @@ p, li { white-space: pre-wrap; } TitleAlignCenter Aligner le titre au centre + + + Layout + Disposition + + + + Table + Tableau + LimeReport::FlagsPropItem @@ -1182,7 +1239,7 @@ p, li { white-space: pre-wrap; } AllLines - + Toutes les lignes @@ -1286,7 +1343,7 @@ p, li { white-space: pre-wrap; } Watermark - + Filigrane @@ -1433,13 +1490,13 @@ p, li { white-space: pre-wrap; } Print on first page - + Imprimer dans la première page Print on last page - + Imprimer dans la dernière page @@ -1461,7 +1518,7 @@ p, li { white-space: pre-wrap; } Page is TOC - Table des contenus + Table de contenus @@ -2204,35 +2261,50 @@ p, li { white-space: pre-wrap; } watermark - + Filigrane keepTopSpace - + Garder l'espace inférieur printable - + Imprimable variable - + Variable - + + replaceCRwithBR + Remplacer CR par BR + + + + hideIfEmpty + Masquer si vide + + + + hideEmptyItems + Masquer les éléments vides + + + Property Name - Nom de la propriété + Propriété - + Property value - Valeur de la propriété + Valeur - + Warning Avertissement @@ -2280,17 +2352,17 @@ p, li { white-space: pre-wrap; } Traductions - + Report file name Nom du rapport - + Error Erreur - + Wrong file format Format de fichier incorrect @@ -2409,233 +2481,238 @@ p, li { white-space: pre-wrap; } + Vertical layout + Disposition verticale + + + About A propos - + Hide left panel | Alt+L - + Masquer le volet gauche - + Hide right panel | Alt+R - + Masquer le volet droite - + Delete dialog Supprimer la boite du dialogue - + Add new dialog Ajouter une boite de dialogue - + Report Tools Outils de rapport - + Main Tools Outils principales - + Font Police - + Text alignment Alignement de texte - + Items alignment Alignement des éléments - + Borders Bordures - + Report bands Bandesde rapport - + Report Header En-tête du rapport - + Report Footer Pied de rapport - + Page Header En-tête de page - + Page Footer Pied de page - + Data Données - + Data Header En-tête de données - + Data Footer Pied de données - + SubDetail Sous-détails - + SubDetailHeader En-tête de sous-détails - + SubDetailFooter Pied de sous-détails - + GroupHeader En-tête de groupe - + GroupFooter Pied de groupe - + Tear-off Band Bande détachable - + File Fichier - + Edit Edition - + Info - + Recent Files Fichiers récents - - + + Object Inspector Inspecteur d'objets - + Report structure Structure du rapport - + Widget Box Boite de Widget - + Property Editor Editeur de propriété - + Action Editor Editeur d'action - + Resource Editor Editeur de ressource - + SignalSlot Editor Editeur de Signaux & Slots - + Dialog Designer Tools Boite à outils du Designer - + Data Browser Navigateur de données - + Script Browser Navigateur de script - + Report has been modified! Do you want save the report? Le rapport a été modifié! Voulez-vous l'enregistrer? - - + + Report file name Nom du fichier du rapport - + Rendering report Afficher l'aperçu du rapport - + Abort Quitter - + page rendered du rendu de la page - + Warning Avertissement - + File "%1" not found! Fichier "%1" introuvable! @@ -2653,12 +2730,12 @@ p, li { white-space: pre-wrap; } Erreur - + Report File Change Nom du fichier changé - + The report file "%1" has changed names or been deleted. This preview is no longer valid. @@ -2667,12 +2744,12 @@ This preview is no longer valid. Cet aperçu n'est plus valide. - + Designer not found! Designer introuvable! - + Language %1 already exists La langue %1 existe déja @@ -2696,24 +2773,24 @@ Cet aperçu n'est plus valide. LimeReport::ReportRender - - - + + + Error Erreur - + page index out of range Indice de la page dépassé - + Databand "%1" not found Bande de données "%1 introuvable - + Wrong using function %1 Utilisation incorrecte de la fonction "%1" @@ -2974,7 +3051,7 @@ Cet aperçu n'est plus valide. Function manager with name "%1" already exists! - + la fonction avec le nom \"%1\" existe déja @@ -3132,7 +3209,7 @@ Cet aperçu n'est plus valide. Language - Langue + Langue @@ -3211,60 +3288,66 @@ Cet aperçu n'est plus valide. LimeReport::TextItem - - + + Edit Edition - - + + Auto height Hauteur automatique - - + + Allow HTML Interpréter HTML - - + + Allow HTML in fields Interpréter HTML dans les champs - - + + Stretch to max height Etirer à la hauteur maximale - - + + Transparent Transparent - - + + Watermark - + Filigrane - - + + + Hide if empty + Masquer si vide + + + + Error Erreur - + TextItem " %1 " already has folower " %2 " L'élément texte " %1 " a toujours un copain " %2 " - + TextItem " %1 " not found! Elément "%1" introuvable! @@ -3654,17 +3737,19 @@ Cet aperçu n'est plus valide. - + + Attention! - + + Selected elements have different parent containers Les éléments sélectionnés ont un parent différent - + Object with name %1 already exists! L'objet avec le nom "%1" existe déja! @@ -3724,5 +3809,10 @@ Cet aperçu n'est plus valide. Thrid Troisième + + + VLayout + + From fef507dde00f56ed8c2a43e3f4320ba531254823 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 23 Jun 2018 00:04:28 +0300 Subject: [PATCH 185/347] Exporters infrastructure has been added --- limereport/exporters/lrpdfexporter.cpp | 38 ++++++++++++++++++ limereport/exporters/lrpdfexporter.h | 35 +++++++++++++++++ limereport/items/lrhorizontallayout.h | 1 + limereport/limereport.pri | 8 +++- limereport/lrbanddesignintf.cpp | 3 +- limereport/lrbanddesignintf.h | 2 +- limereport/lrbasedesignintf.cpp | 28 ++++++++++++++ limereport/lrbasedesignintf.h | 9 +++-- limereport/lrdesignelementsfactory.h | 1 - limereport/lrexporterintf.h | 21 ++++++++++ limereport/lrexportersfactory.h | 34 +++++++++++++++++ limereport/lrfactoryinitializer.cpp | 17 +++++++++ limereport/lrfactoryinitializer.h | 1 + limereport/lrpageitemdesignintf.h | 2 +- limereport/lrpreviewreportwidget.cpp | 48 ++++++++++++++++------- limereport/lrpreviewreportwidget.h | 4 +- limereport/lrpreviewreportwidget_p.h | 1 + limereport/lrpreviewreportwindow.ui | 4 +- limereport/lrreportengine.cpp | 53 ++++++++++++++++++-------- limereport/lrreportengine.h | 1 + limereport/lrreportengine_p.h | 4 ++ 21 files changed, 275 insertions(+), 40 deletions(-) create mode 100644 limereport/exporters/lrpdfexporter.cpp create mode 100644 limereport/exporters/lrpdfexporter.h create mode 100644 limereport/lrexporterintf.h create mode 100644 limereport/lrexportersfactory.h diff --git a/limereport/exporters/lrpdfexporter.cpp b/limereport/exporters/lrpdfexporter.cpp new file mode 100644 index 0000000..d97bf7b --- /dev/null +++ b/limereport/exporters/lrpdfexporter.cpp @@ -0,0 +1,38 @@ +#include + +#include "lrpdfexporter.h" +#include "lrexportersfactory.h" +#include "lrreportengine_p.h" + +namespace{ + +LimeReport::ReportExporterInterface* createPDFExporter(LimeReport::ReportEnginePrivate* parent){ + return new LimeReport::PDFExporter(parent); +} + +bool VARIABLE_IS_NOT_USED registred = LimeReport::ExportersFactory::instance().registerCreator("PDF", LimeReport::ExporterAttribs(QObject::tr("Export to PDF"), "PDFExporter"), createPDFExporter); + +} + +namespace LimeReport{ + +PDFExporter::PDFExporter(ReportEnginePrivate *parent) : QObject(parent), m_reportEngine(parent) +{} + +bool PDFExporter::exportPages(ReportPages pages, const QString &fileName, const QMap ¶ms) +{ + Q_UNUSED(params); + if (!fileName.isEmpty()){ + QPrinter printer; + printer.setOutputFileName(fileName); + printer.setOutputFormat(QPrinter::PdfFormat); + if (!pages.isEmpty()){ + m_reportEngine->printReport(pages, printer); + } + m_reportEngine->emitPrintedToPDF(fileName); + return true; + } + return false; +} + +} diff --git a/limereport/exporters/lrpdfexporter.h b/limereport/exporters/lrpdfexporter.h new file mode 100644 index 0000000..225c80b --- /dev/null +++ b/limereport/exporters/lrpdfexporter.h @@ -0,0 +1,35 @@ +#ifndef LRPDFEXPORTER_H +#define LRPDFEXPORTER_H + +#include +#include "lrexporterintf.h" + +namespace LimeReport{ +class ReportEnginePrivate; + +class PDFExporter : public QObject, public ReportExporterInterface +{ + Q_OBJECT +public: + explicit PDFExporter(ReportEnginePrivate *parent = nullptr); + // ReportExporterInterface interface + bool exportPages(ReportPages pages, const QString &fileName, const QMap ¶ms); + QString exporterName() + { + return "PDF"; + } + QString exporterFileExt() + { + return "pdf"; + } + QString hint() + { + return tr("Export to PDF"); + } +private: + ReportEnginePrivate* m_reportEngine; +}; + +} //namespace LimeReport + +#endif // LRPDFEXPORTER_H diff --git a/limereport/items/lrhorizontallayout.h b/limereport/items/lrhorizontallayout.h index fa5edf3..1e4c536 100644 --- a/limereport/items/lrhorizontallayout.h +++ b/limereport/items/lrhorizontallayout.h @@ -48,6 +48,7 @@ public: ~HorizontalLayout(); BaseDesignIntf *createSameTypeItem(QObject *owner = 0, QGraphicsItem *parent = 0); bool isSplittable() const { return true;} + bool canContainChildren() const { return true;} protected: void updateLayoutSize(); diff --git a/limereport/limereport.pri b/limereport/limereport.pri index df07a93..5e086a7 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -66,7 +66,8 @@ SOURCES += \ $$REPORT_PATH/lrcolorindicator.cpp \ $$REPORT_PATH/items/lrchartitem.cpp \ $$REPORT_PATH/items/lrchartitemeditor.cpp \ - $$REPORT_PATH/lrreporttranslation.cpp + $$REPORT_PATH/lrreporttranslation.cpp \ + $$REPORT_PATH/exporters/lrpdfexporter.cpp contains(CONFIG, staticlib){ SOURCES += $$REPORT_PATH/lrfactoryinitializer.cpp @@ -144,7 +145,10 @@ HEADERS += \ $$REPORT_PATH/items/editors/lrtextalignmenteditorwidget.h \ $$REPORT_PATH/items/editors/lritemsborderseditorwidget.h \ $$REPORT_PATH/lrreporttranslation.h \ - $$REPORT_PATH/lrreportdesignwindowintrerface.h + $$REPORT_PATH/lrreportdesignwindowintrerface.h \ + $$REPORT_PATH/lrexporterintf.h \ + $$REPORT_PATH/lrexportersfactory.h \ + $$REPORT_PATH/exporters/lrpdfexporter.h contains(CONFIG, staticlib){ HEADERS += $$REPORT_PATH/lrfactoryinitializer.h diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index e983b41..67d78c0 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -1015,12 +1015,11 @@ void BandDesignIntf::setKeepFooterTogether(bool value) } } - void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) { qreal spaceBorder=0; if (keepBottomSpaceOption()) spaceBorder = bottomSpace(); - spaceBorder = spaceBorder>0 ? spaceBorder : 0; + spaceBorder = spaceBorder > 0 ? spaceBorder : 0; if (borderLines()!=0){ spaceBorder += borderLineSize(); } diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index f3750b0..c62fb1c 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -234,7 +234,7 @@ public: bool startFromNewPage() const; void setStartFromNewPage(bool startFromNewPage); - bool canContainChildren(){ return true;} + bool canContainChildren() const{ return true;} bool printAlways() const; void setPrintAlways(bool printAlways); bool repeatOnEachRow() const; diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 9d0d98d..1ad1ee5 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -227,6 +227,16 @@ qreal BaseDesignIntf::getItemPosY() return y() / mmFactor(); } +qreal BaseDesignIntf::getAbsolutePosX() +{ + return calcAbsolutePosX(0,this); +} + +qreal BaseDesignIntf::getAbsolutePosY() +{ + return calcAbsolutePosY(0,this); +} + QString BaseDesignIntf::setItemPosX(qreal xValue) { setItemPos(xValue * mmFactor(),y()); @@ -1485,6 +1495,24 @@ void BaseDesignIntf::addChildItems(QList* list){ } } +qreal BaseDesignIntf::calcAbsolutePosY(qreal currentOffset, BaseDesignIntf *item) +{ + BaseDesignIntf* parent = dynamic_cast(item->parent()); + if (parent) + return calcAbsolutePosY(currentOffset + item->getItemPosY(), parent); + else + return currentOffset + item->getItemPosY(); +} + +qreal BaseDesignIntf::calcAbsolutePosX(qreal currentOffset, BaseDesignIntf *item) +{ + BaseDesignIntf* parent = dynamic_cast(item->parent()); + if (parent) + return calcAbsolutePosX(currentOffset + item->getItemPosX(), parent); + else + return currentOffset + item->getItemPosX(); +} + QList BaseDesignIntf::allChildBaseItems() { QList resList; diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index af80022..df37850 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -268,7 +268,7 @@ public: QColor borderColor() const; void setBorderColor(const QColor &borderColor); void setItemVisible(const bool& value); - virtual bool canContainChildren(){ return false;} + virtual bool canContainChildren() const { return false;} ReportSettings* reportSettings() const; void setReportSettings(ReportSettings *reportSettings); void setZValueProperty(qreal value); @@ -288,6 +288,8 @@ public: Q_INVOKABLE qreal getItemHeight(); Q_INVOKABLE qreal getItemPosX(); Q_INVOKABLE qreal getItemPosY(); + Q_INVOKABLE qreal getAbsolutePosX(); + Q_INVOKABLE qreal getAbsolutePosY(); Q_INVOKABLE QString setItemPosX(qreal xValue); Q_INVOKABLE QString setItemPosY(qreal yValue); @@ -352,7 +354,8 @@ protected: virtual void processPopUpAction(QAction* action){Q_UNUSED(action)} void addChildItems(QList* list); - + qreal calcAbsolutePosY(qreal currentOffset, BaseDesignIntf* item); + qreal calcAbsolutePosX(qreal currentOffset, BaseDesignIntf* item); private: void updateSelectionMarker(); int resizeDirectionFlags(QPointF position); @@ -410,7 +413,7 @@ private: QString m_patternName; BaseDesignIntf* m_patternItem; bool m_fillInSecondPass; - bool m_watermark; + bool m_watermark; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); diff --git a/limereport/lrdesignelementsfactory.h b/limereport/lrdesignelementsfactory.h index 9a647a2..986c354 100644 --- a/limereport/lrdesignelementsfactory.h +++ b/limereport/lrdesignelementsfactory.h @@ -31,7 +31,6 @@ #define LRDESIGNELEMENTSFACTORY_H #include "lrbanddesignintf.h" -//#include "lrpageheader.h" #include "lrattribsabstractfactory.h" #include "lrsimpleabstractfactory.h" #include "lrsingleton.h" diff --git a/limereport/lrexporterintf.h b/limereport/lrexporterintf.h new file mode 100644 index 0000000..bbeb043 --- /dev/null +++ b/limereport/lrexporterintf.h @@ -0,0 +1,21 @@ +#ifndef LREXPORTERINTF_H +#define LREXPORTERINTF_H + +#include +#include +#include +#include "lrpageitemdesignintf.h" + +namespace LimeReport { + +class ReportExporterInterface { +public: + virtual ~ReportExporterInterface(){} + virtual bool exportPages(LimeReport::ReportPages pages, const QString& fileName, const QMap& params = QMap()) = 0; + virtual QString exporterName() = 0; + virtual QString exporterFileExt() = 0; + virtual QString hint() = 0; +}; + +} // namespace LimeReport +#endif // LREXPORTERINTF_H diff --git a/limereport/lrexportersfactory.h b/limereport/lrexportersfactory.h new file mode 100644 index 0000000..bbb5e56 --- /dev/null +++ b/limereport/lrexportersfactory.h @@ -0,0 +1,34 @@ +#ifndef LREXPORTERSFACTORY_H +#define LREXPORTERSFACTORY_H + +#include "lrattribsabstractfactory.h" +#include "lrexporterintf.h" + +namespace LimeReport{ + +typedef ReportExporterInterface* (*CreateExporter)(ReportEnginePrivate* parent); + +struct ExporterAttribs{ + QString m_alias; + QString m_tag; + ExporterAttribs(){} + ExporterAttribs(const QString& alias, const QString& tag):m_alias(alias),m_tag(tag){} + bool operator==( const ExporterAttribs &right) const { + return (m_alias==right.m_alias) && (m_tag==right.m_tag); + } +}; + +class ExportersFactory : public AttribsAbstractFactory +{ +private: + friend class Singleton; +private: + ExportersFactory(){} + ~ExportersFactory(){} + ExportersFactory(const ExportersFactory&){} + ExportersFactory& operator = (const ExportersFactory&){return *this;} +}; + +} // namespace LimeReport + +#endif // LREXPORTERSFACTORY_H diff --git a/limereport/lrfactoryinitializer.cpp b/limereport/lrfactoryinitializer.cpp index 8f11ec8..f91e7e6 100644 --- a/limereport/lrfactoryinitializer.cpp +++ b/limereport/lrfactoryinitializer.cpp @@ -41,6 +41,10 @@ #include "serializators/lrxmlqrectserializator.h" #include "serializators/lrxmlserializatorsfactory.h" +#include "lrexportersfactory.h" +#include "lrexporterintf.h" +#include "exporters/lrpdfexporter.h" + void initResources(){ Q_INIT_RESOURCE(report); #ifdef HAVE_REPORT_DESIGNER @@ -442,4 +446,17 @@ void initSerializators() XMLAbstractSerializatorFactory::instance().registerCreator("QRectF", createQRectSerializator); } +LimeReport::ReportExporterInterface* createPDFExporter(ReportEnginePrivate* parent){ + return new LimeReport::PDFExporter(parent); +} + +void initExporters() +{ + ExportersFactory::instance().registerCreator( + "PDF", + LimeReport::ExporterAttribs(QObject::tr("Export to PDF"), "PDFExporter"), + createPDFExporter + ); +} + } //namespace LimeReport diff --git a/limereport/lrfactoryinitializer.h b/limereport/lrfactoryinitializer.h index 679d657..8810e55 100644 --- a/limereport/lrfactoryinitializer.h +++ b/limereport/lrfactoryinitializer.h @@ -3,4 +3,5 @@ namespace LimeReport{ void initReportItems(); void initObjectInspectorProperties(); void initSerializators(); + void initExporters(); } // namespace LimeReport diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 4204d06..abcdb72 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -120,7 +120,7 @@ public: bool oldPrintMode() const; void setOldPrintMode(bool oldPrintMode); - bool canContainChildren(){ return true;} + bool canContainChildren() const{ return true;} bool resetPageNumber() const; void setResetPageNumber(bool resetPageNumber); void updateSubItemsSize(RenderPass pass, DataSourceManager *dataManager); diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 5ef2693..756a4ac 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -13,6 +13,9 @@ #include "lrpreviewreportwidget_p.h" #include "serializators/lrxmlwriter.h" +#include "lrexportersfactory.h" + + namespace LimeReport { bool PreviewReportWidgetPrivate::pageIsVisible(){ @@ -60,6 +63,11 @@ PageItemDesignIntf::Ptr PreviewReportWidgetPrivate::currentPage() else return PageItemDesignIntf::Ptr(0); } +QList PreviewReportWidgetPrivate::aviableExporters() +{ + return ExportersFactory::instance().map().keys(); +} + PreviewReportWidget::PreviewReportWidget(ReportEngine *report, QWidget *parent) : QWidget(parent), ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this)) @@ -86,6 +94,31 @@ PreviewReportWidget::~PreviewReportWidget() delete ui; } +QList PreviewReportWidget::aviableExporters() +{ + return d_ptr->aviableExporters(); +} + +bool PreviewReportWidget::exportReport(QString exporterName, const QMap ¶ms) +{ + if (ExportersFactory::instance().map().contains(exporterName)){ + + ReportExporterInterface* e = ExportersFactory::instance().objectCreator(exporterName)(d_ptr->m_report); + + QString filter = QString("%1 (*.%2)").arg(e->exporterName()).arg(e->exporterFileExt()); + QString fileName = QFileDialog::getSaveFileName(this,tr("%1 file name").arg(e->exporterName()),"",filter); + if (!fileName.isEmpty()){ + QFileInfo fi(fileName); + if (fi.suffix().isEmpty()) + fileName += QString(".%1").arg(e->exporterFileExt()); + bool result = e->exportPages(d_ptr->m_reportPages, fileName, params); + delete e; + return result; + } + } + return false; +} + void PreviewReportWidget::initPreview() { if (ui->graphicsView->scene()!=d_ptr->m_previewPage) @@ -185,22 +218,11 @@ void PreviewReportWidget::print() void PreviewReportWidget::printToPDF() { - QString filter = "PDF (*.pdf)"; - QString fileName = QFileDialog::getSaveFileName(this,tr("PDF file name"),"","PDF (*.pdf)"); - if (!fileName.isEmpty()){ - QFileInfo fi(fileName); - if (fi.suffix().isEmpty()) - fileName+=".pdf"; - QPrinter printer; - printer.setOutputFileName(fileName); - printer.setOutputFormat(QPrinter::PdfFormat); - if (!d_ptr->m_reportPages.isEmpty()){ - ReportEnginePrivate::printReport(d_ptr->m_reportPages,printer); - } + if (!d_ptr->m_reportPages.isEmpty()){ + exportReport("PDF"); foreach(PageItemDesignIntf::Ptr pageItem, d_ptr->m_reportPages){ d_ptr->m_previewPage->reactivatePageItem(pageItem); } - d_ptr->m_report->emitPrintedToPDF(fileName); } } diff --git a/limereport/lrpreviewreportwidget.h b/limereport/lrpreviewreportwidget.h index e33f75f..c1b571d 100644 --- a/limereport/lrpreviewreportwidget.h +++ b/limereport/lrpreviewreportwidget.h @@ -22,7 +22,9 @@ class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget friend class PreviewReportWidgetPrivate; public: explicit PreviewReportWidget(ReportEngine *report, QWidget *parent = 0); - ~PreviewReportWidget(); + ~PreviewReportWidget(); + QList aviableExporters(); + bool exportReport(QString exporterName, const QMap& params = QMap()); public slots: void refreshPages(); void zoomIn(); diff --git a/limereport/lrpreviewreportwidget_p.h b/limereport/lrpreviewreportwidget_p.h index 9557a5d..c7c2ce1 100644 --- a/limereport/lrpreviewreportwidget_p.h +++ b/limereport/lrpreviewreportwidget_p.h @@ -20,6 +20,7 @@ public: QRectF calcPageShift(); void setPages( ReportPages pages); PageItemDesignIntf::Ptr currentPage(); + QList aviableExporters(); public: PageDesignIntf* m_previewPage; ReportPages m_reportPages; diff --git a/limereport/lrpreviewreportwindow.ui b/limereport/lrpreviewreportwindow.ui index 50487cb..5c6cc24 100644 --- a/limereport/lrpreviewreportwindow.ui +++ b/limereport/lrpreviewreportwindow.ui @@ -35,7 +35,7 @@ 0 0 800 - 19 + 20 @@ -283,6 +283,8 @@ + + diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 45ff9f8..c9b44b1 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include "time.h" @@ -55,6 +56,8 @@ #include "lrpreviewreportwindow.h" #include "lrpreviewreportwidget.h" #include "lrpreviewreportwidget_p.h" +#include "lrexporterintf.h" +#include "lrexportersfactory.h" #ifdef BUILD_WITH_EASY_PROFILER #include "easy/profiler.h" @@ -63,7 +66,6 @@ # define EASY_END_BLOCK #endif - #ifdef HAVE_STATIC_BUILD #include "lrfactoryinitializer.h" #endif @@ -102,7 +104,6 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : connect(m_datasources,SIGNAL(loadCollectionFinished(QString)),this,SLOT(slotDataSourceCollectionLoaded(QString))); connect(m_fileWatcher,SIGNAL(fileChanged(const QString &)),this,SLOT(slotLoadFromFile(const QString &))); -#ifndef HAVE_REPORT_DESIGNER QDir pluginsDir = QCoreApplication::applicationDirPath(); pluginsDir.cd("../lib" ); if (!pluginsDir.exists()){ @@ -113,13 +114,15 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : foreach( const QString& pluginName, pluginsDir.entryList( QDir::Files ) ) { QPluginLoader loader( pluginsDir.absoluteFilePath( pluginName ) ); if( loader.load() ) { +#ifndef HAVE_REPORT_DESIGNER if( LimeReportDesignerPluginInterface* designerPlugin = qobject_cast< LimeReportDesignerPluginInterface* >( loader.instance() ) ) { m_designerFactory = designerPlugin; break; } - } - } #endif + } + } + } ReportEnginePrivate::~ReportEnginePrivate() @@ -476,17 +479,31 @@ void ReportEnginePrivate::printToFile(const QString &fileName) bool ReportEnginePrivate::printToPDF(const QString &fileName) { - if (!fileName.isEmpty()){ - QFileInfo fi(fileName); - QString fn = fileName; - if (fi.suffix().isEmpty()) - fn+=".pdf"; - QPrinter printer; - printer.setOutputFileName(fn); - printer.setOutputFormat(QPrinter::PdfFormat); - bool success = printReport(&printer); - if(success) emitPrintedToPDF(fileName); - return success; + return exportReport("PDF"); +} + +bool ReportEnginePrivate::exportReport(QString exporterName, const QString &fileName, const QMap ¶ms) +{ + QString fn = fileName; + if (ExportersFactory::instance().map().contains(exporterName)){ + ReportExporterInterface* e = ExportersFactory::instance().objectCreator(exporterName)(this); + if (fn.isEmpty()){ + QString filter = QString("%1 (*.%2)").arg(e->exporterName()).arg(e->exporterFileExt()); + QString fn = QFileDialog::getSaveFileName(0,tr("%1 file name").arg(e->exporterName()),"",filter); + if (!fn.isEmpty()){ + QFileInfo fi(fn); + if (fi.suffix().isEmpty()) + fn += QString(".%1").arg(e->exporterFileExt()); + + bool designTime = dataManager()->designTime(); + dataManager()->setDesignTime(false); + ReportPages pages = renderToPages(); + dataManager()->setDesignTime(designTime); + bool result = e->exportPages(pages, fn, params); + delete e; + return result; + } + } } return false; } @@ -1221,6 +1238,12 @@ bool ReportEngine::printToPDF(const QString &fileName) return d->printToPDF(fileName); } +bool ReportEngine::exportReport(QString exporterName, const QString &fileName, const QMap ¶ms) +{ + Q_D(ReportEngine); + return d->exportReport(exporterName, fileName, params); +} + void ReportEngine::previewReport(PreviewHints hints) { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index a319dd1..e3d4ec4 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -84,6 +84,7 @@ public: void printToFile(const QString& fileName); PageDesignIntf *createPreviewScene(QObject *parent = 0); bool printToPDF(const QString& fileName); + bool exportReport(QString exporterName, const QString &fileName = "", const QMap& params = QMap()); void previewReport(PreviewHints hints = PreviewBarsUserSetting); void designReport(); ReportDesignWindowInterface* getDesignerWindow(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index ea2ff2a..4756b20 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -48,11 +48,13 @@ class QFileSystemWatcher; + namespace LimeReport{ class PageDesignIntf; class PrintRange; class ReportDesignWindow; +class ReportExporterInterface; class ReportEnginePrivateInterface { public: @@ -132,6 +134,7 @@ public: bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); bool printToPDF(const QString& fileName); + bool exportReport(QString exporterName, const QString &fileName = "", const QMap& params = QMap()); void previewReport(PreviewHints hints = PreviewBarsUserSetting); ReportDesignWindowInterface* getDesignerWindow(); @@ -267,6 +270,7 @@ private: LimeReportDesignerPluginInterface* m_designerFactory; QString m_styleSheet; QLocale::Language m_currentDesignerLanguage; + QMap exporters; }; } From 3bd6472b3e8b044a0b0bdce4f1dd8f4e69dab52f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 23 Jun 2018 00:05:40 +0300 Subject: [PATCH 186/347] Russian translation has been updated --- translations/limereport_ru.ts | 158 +++++++++++++++++++++------------- 1 file changed, 99 insertions(+), 59 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 2d3a406..09538b9 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -381,9 +381,21 @@ p, li { white-space: pre-wrap; } Сохранять отступ снизу - Print if empty - + Start from new page + Начинать с новой страницы + + Start new page + Начинать новую страницу + + + Keep top space + Сохранять отступ сверху + + + Print if empty + Печатать, если пустое + LimeReport::BaseDesignIntf @@ -421,8 +433,8 @@ p, li { white-space: pre-wrap; } Create Vertical Layout - - + Создать Вертикальную Компановку + LimeReport::ConnectionDesc @@ -528,26 +540,26 @@ p, li { white-space: pre-wrap; } Use alternate background color Использовать альтернативный цвет фона - - Keep footer together - - Keep subdetail together - - + Привязать подчиненные данные + - Slice last row - - + Keep footer together + Привязать завершение данных + Start from new page - Начинать с новой страницы + Начинать с новой страницы Start new page - Начинать новую страницу + Начинать новую страницу + + Slice last row + Разрезать последнюю запись + LimeReport::DataBrowser @@ -644,8 +656,8 @@ p, li { white-space: pre-wrap; } Print always - - + Печатать всегда + LimeReport::DataHeaderBand @@ -655,16 +667,16 @@ p, li { white-space: pre-wrap; } Reprint on each page - + Печатать на каждой странице Repeat on each row - + Повторять на каждой строке Print always - - + Печатать всегда + LimeReport::DataSourceManager @@ -757,6 +769,14 @@ p, li { white-space: pre-wrap; } Landscape Альбомная + + Layout + Компановка + + + Table + Таблица + NoneAutoWidth Нет @@ -969,17 +989,13 @@ p, li { white-space: pre-wrap; } TitleAlignCenter Название по центру - - Layout - - - - Table - - LimeReport::FlagsPropItem + + AllLines + Все границы + NoLine Нет границ @@ -1000,10 +1016,6 @@ p, li { white-space: pre-wrap; } RightLine Правая граница - - AllLines - - LimeReport::FontEditorWidget @@ -1673,6 +1685,10 @@ p, li { white-space: pre-wrap; } shapeBrushColor Цвет кисти + + replaceCRwithBR + Заменять CR на BR + allowHTML Разрешить HTML @@ -1771,7 +1787,7 @@ p, li { white-space: pre-wrap; } repeatOnEachRow - Печатать на каждой странице + Повторять на каждой строке Property value @@ -1831,7 +1847,7 @@ p, li { white-space: pre-wrap; } watermark - водяной знак + Водяной знак keepTopSpace @@ -1839,24 +1855,20 @@ p, li { white-space: pre-wrap; } printable - - - - variable - - - - replaceCRwithBR - - + Печатать + hideIfEmpty - - + Скрывать, если пустое + + + variable + Переменная + hideEmptyItems - - + Скрывать пустые элементы + LimeReport::RectMMPropItem @@ -1989,10 +2001,22 @@ p, li { white-space: pre-wrap; } Horizontal layout Горизонтальная компановка + + Vertical layout + Вертикальная компановка + About О программе + + Hide left panel + Спрятать левую панель + + + Hide right panel + Спрятать правую панель + Report Tools Элементы отчета @@ -2177,10 +2201,6 @@ p, li { white-space: pre-wrap; } Dialog Designer Tools Панель Инструментов - - Vertical layout - - LimeReport::ReportEnginePrivate @@ -2210,6 +2230,14 @@ This preview is no longer valid. Language %1 already exists Язык %1 уже существует + + Warning + Предупреждение + + + The language will change after the application is restarted + Язык будет изменен после перезапуска приложения + LimeReport::ReportFooter @@ -2620,6 +2648,10 @@ This preview is no longer valid. Auto height Автоматическая высота + + ReplaceCRwithBR + Заменять CR на BR> + Allow HTML Разрешить HTML @@ -2654,8 +2686,8 @@ This preview is no longer valid. Hide if empty - - + Скрывать, если пустое + LimeReport::TextItemEditor @@ -2667,6 +2699,10 @@ This preview is no longer valid. Content Содержимое + + Functions + Функции + Editor settings Настройки @@ -2679,6 +2715,10 @@ This preview is no longer valid. Cancel Отмена + + Data + Данные + ... ... @@ -2820,6 +2860,10 @@ This preview is no longer valid. HLayout Горизонтальная компоновка + + VLayout + Вертикальная компоновка + Image Item Элемент изображение @@ -2980,9 +3024,5 @@ This preview is no longer valid. Datasource manager not found Менеджер источников данных не найден - - VLayout - - From 1b2a9b9ba39bb2565b450eb594bb5c567bfcd0ec Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 23 Jun 2018 00:18:46 +0300 Subject: [PATCH 187/347] Russian translation updated --- translations/limereport_ru.ts | 105 +++++++++++++--------------------- 1 file changed, 40 insertions(+), 65 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 09538b9..cca8845 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -380,22 +380,10 @@ p, li { white-space: pre-wrap; } Keep bottom space Сохранять отступ снизу - - Start from new page - Начинать с новой страницы - - - Start new page - Начинать новую страницу - - - Keep top space - Сохранять отступ сверху - Print if empty Печатать, если пустое - + LimeReport::BaseDesignIntf @@ -434,7 +422,7 @@ p, li { white-space: pre-wrap; } Create Vertical Layout Создать Вертикальную Компановку - + LimeReport::ConnectionDesc @@ -543,11 +531,11 @@ p, li { white-space: pre-wrap; } Keep subdetail together Привязать подчиненные данные - + Keep footer together Привязать завершение данных - + Start from new page Начинать с новой страницы @@ -559,7 +547,7 @@ p, li { white-space: pre-wrap; } Slice last row Разрезать последнюю запись - + LimeReport::DataBrowser @@ -657,7 +645,7 @@ p, li { white-space: pre-wrap; } Print always Печатать всегда - + LimeReport::DataHeaderBand @@ -676,7 +664,7 @@ p, li { white-space: pre-wrap; } Print always Печатать всегда - + LimeReport::DataSourceManager @@ -771,12 +759,12 @@ p, li { white-space: pre-wrap; } Layout - Компановка - + Компоновка + Table Таблица - + NoneAutoWidth Нет @@ -992,7 +980,7 @@ p, li { white-space: pre-wrap; } LimeReport::FlagsPropItem - + AllLines Все границы @@ -1213,6 +1201,13 @@ p, li { white-space: pre-wrap; } Объекты + + LimeReport::PDFExporter + + Export to PDF + Экспортировать в PDF + + LimeReport::PageFooter @@ -1264,14 +1259,14 @@ p, li { white-space: pre-wrap; } Form Форма - - PDF file name - Имя PDF файла - Report file name Имя файла отчета + + %1 file name + %1 имя файла + LimeReport::PreviewReportWindow @@ -1685,10 +1680,10 @@ p, li { white-space: pre-wrap; } shapeBrushColor Цвет кисти - + replaceCRwithBR Заменять CR на BR - + allowHTML Разрешить HTML @@ -1856,19 +1851,19 @@ p, li { white-space: pre-wrap; } printable Печатать - + hideIfEmpty Скрывать, если пустое - + variable Переменная - + hideEmptyItems Скрывать пустые элементы - + LimeReport::RectMMPropItem @@ -1995,28 +1990,20 @@ p, li { white-space: pre-wrap; } Edit layouts mode - Режим редактирования компановок + Режим редактирования компоновок Horizontal layout - Горизонтальная компановка + Горизонтальная компоновка Vertical layout - Вертикальная компановка - + Вертикальная компоновка + About О программе - - Hide left panel - Спрятать левую панель - - - Hide right panel - Спрятать правую панель - Report Tools Элементы отчета @@ -2231,12 +2218,8 @@ This preview is no longer valid. Язык %1 уже существует - Warning - Предупреждение - - - The language will change after the application is restarted - Язык будет изменен после перезапуска приложения + %1 file name + %1 имя файла @@ -2648,10 +2631,6 @@ This preview is no longer valid. Auto height Автоматическая высота - - ReplaceCRwithBR - Заменять CR на BR> - Allow HTML Разрешить HTML @@ -2687,7 +2666,7 @@ This preview is no longer valid. Hide if empty Скрывать, если пустое - + LimeReport::TextItemEditor @@ -2699,10 +2678,6 @@ This preview is no longer valid. Content Содержимое - - Functions - Функции - Editor settings Настройки @@ -2715,10 +2690,6 @@ This preview is no longer valid. Cancel Отмена - - Data - Данные - ... ... @@ -2863,7 +2834,7 @@ This preview is no longer valid. VLayout Вертикальная компоновка - + Image Item Элемент изображение @@ -3024,5 +2995,9 @@ This preview is no longer valid. Datasource manager not found Менеджер источников данных не найден + + Export to PDF + Экспортировать в PDF + From df87822b37daf46c47e176b597fa3d65fdb301ec Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 23 Jun 2018 13:09:27 +0300 Subject: [PATCH 188/347] Designer icon added --- include/lrpreviewreportwidget.h | 4 +++- include/lrreportengine.h | 1 + limereport/images/designer.png | Bin 0 -> 12941 bytes limereport/report.qrc | 3 ++- 4 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 limereport/images/designer.png diff --git a/include/lrpreviewreportwidget.h b/include/lrpreviewreportwidget.h index e33f75f..c1b571d 100644 --- a/include/lrpreviewreportwidget.h +++ b/include/lrpreviewreportwidget.h @@ -22,7 +22,9 @@ class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget friend class PreviewReportWidgetPrivate; public: explicit PreviewReportWidget(ReportEngine *report, QWidget *parent = 0); - ~PreviewReportWidget(); + ~PreviewReportWidget(); + QList aviableExporters(); + bool exportReport(QString exporterName, const QMap& params = QMap()); public slots: void refreshPages(); void zoomIn(); diff --git a/include/lrreportengine.h b/include/lrreportengine.h index a319dd1..e3d4ec4 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -84,6 +84,7 @@ public: void printToFile(const QString& fileName); PageDesignIntf *createPreviewScene(QObject *parent = 0); bool printToPDF(const QString& fileName); + bool exportReport(QString exporterName, const QString &fileName = "", const QMap& params = QMap()); void previewReport(PreviewHints hints = PreviewBarsUserSetting); void designReport(); ReportDesignWindowInterface* getDesignerWindow(); diff --git a/limereport/images/designer.png b/limereport/images/designer.png new file mode 100644 index 0000000000000000000000000000000000000000..90c7744c60707026c286ec3947b552e2d364db19 GIT binary patch literal 12941 zcmZvDbySqy7w*uALrHfjAuWw`2ucc)(%oIs-6`E5Eg>o0j7W#1bf=`0)IIb4?ppVs z>vGm8@67w2v(Mho-uu}P5z2}(m>8rO5C{bGt*n#^1cCtmi2y-I1#db|rDos_)ksc8 z3cQ0qH;O&Wntd=tb!bS&wA$Sytx`7{}xx7`7Mq5WE!a(Ljj<>lsL%Z|G&Tal?HO-=cE|Okj_O~aap#CF2y`T&8K$=#0d3hEKZ-0X#}8R(+ki% zdLwjp1iAnhPGoUeEF}Kl>Q7jZ^l&6`f;YMR=^DR=(+CmlNy_5Ef57QaCmH(AK;T5a z4@YHd5<|j?xN8EM54}e9kbsKgd>(?tnxSvuN_yb%Kb1|8V@Dq_g!Eg{upm>SqC)JN z2?FB{P~)?+D-}g&Cu{QRkhVpHGWEoMQ7B_8=#N z4|k7gzEc zv59CG$-?OXIUfbODhusZe(~akRd*oDeu50;d&yAfdrM2p8s6ahu4qqIe`m5SLj7a|jk&Z*a;Lo4Rgi$Y2LLI1$(D{&-ibAN-SuG$k>*qI9#R{2IAMM+V ze#DTK2)ZAU55>Y9ge99;jnJ{0rvt|&P#vD*{E5&7p4+ z#|`Nb(GC}wlaSZHz?FrNknpR3^LDA%al6LF@rr))(vc=<59KP70b)FBD0MhOeI5dN zOl|F}28#*Wiz!v5GQ-}`GPgg!VS_k<7tpnqaGJTz37kHN_BbTAu(wOl{axwF9n#4RSpIad+ga&z^q$e3yvU;%KIXQN#PT-tj z-TcqdQTo@fGfy}A3zELn*C#bt&%W}ywCT9nCIg3AR#_=LA!(UL_hgAPjHDp68vUAF zGa`M#;HNGwST%YSOhR3qus|lx?C4)PO(XA!@DYd84bdtUq?voGZ|{?YgHd;-k|;Q=EWp*H@^ zQlgevj1gaD#rL*S(BmX;(p5MglSVN;ZdtZ`RgDule}qg-O)dGIoSZ6Fn53z>d3lX- z|5ql};?k|5)bhzm6;t9jJ){y@uc+F)uDXWO2vT2%)1cdqLSirP*;3_PkC%00s6_SJ zZ?-e7F7~Itf@3oL@BTbpf~y3ph$aby`IV$y6W^1P@TXhd?Oiuw_`a5@mVAvNPQ05(VzN42k_-R8&+}H!3K%^l2yC>fhhJm-rYjDrov>&TB}WOHZ{7 zh{qM7;ugP9mHmEkD)b8e^Fsu@pmdHO2^x?Cj>fp_s#&d~u)7w`;&Lef|11!wUTmoev6;LDiNf zN(GvkA))qCY%^&+wJdskcpt|(XN&C6vsF$5oK;*B*{5Q%)G8_}#M~A*L8zGP0ce!e zIOx@0S9U3Ex`QB=wHmAlLPA1zTb8E?d%}NS(r$Ba@uaDxb|QW^8dU&J9xTE#ZNCQ((t>&cyy*2snx zr8$u~Av6iHN=oL}Cu>kDku39^PpIE!hhiySUvFpHr}0=5Ha9mXB_$aUzcI$lr!%8T zVm=`0dAa&4oaPX~CKApwXk5SKvJ{zy5aLtK0czXND*ucC+o_^a`!I&@W%U{BU6rqz#S7k7|xYsHX|+rp9oX`=ePophd8_ z<>a`XZtetLXHoihfe!q`0P8htj8M4Dh7Dkm1cytlsmikdATY>p;w^$?d;*F-v${10 z{*$Jq!eUQ{)+K)O*h20Q5EhXL=n-L62fHn?E5{`jZR8xUr^vC;>>8t{lJJEn`LM!5 zM^bc(9V&+VNw~}$ZvQk!A)wph^>UyiBO)UrynOi*J3VkIme~lyE{?3E*s$)!>`P+` zL6KFdXewvxmo zeC(Vgd>uv1)+M%Lxc3Gz1@{_S^%z=NSqB)g_>b7h{Nh$o5h^V9a1hkxCpW?{f=CQI z3S@gM+6CrQx7cx;@#>tXA>v?#JqhdeXxEF38p&O-;myhjUD%-K;Xz3qN}h5i0FO_L z&smQB``3-JXxuehj5>UFr}yIlj0zombNu3(9lhe9azfbgvt|d-txiw6yEsLPhJn zW2u0B&8lPTTRAy89-iciM8)+&@Y+mNq-SPM{Cm0Q5zBc#X4SAh#hsP$MqB&0p%FAh z;`$Dut)b!i&KDTJrK+DNngfdDN9`|)Q(BIXpWU_TB=A;2p?kxv;KiB_3a7uiB0qU? zZSCi!)~jmZ+A~!nrW-#n59jN`Kq6>c)|SYZ{9+w_@As2Z8|xIJsjoww0;=qGF8XcJH=U z@Lq-NA{Y1Wyp)osd4UqwA5?7lN<$nTh=jYCa7L-uj-09jrf7mE4>HAp76Jbs-9mKgY}YyfVJ zYgj!TXEd850anzSoElvoEd{L{$9dV`C2X&P$1~2!iFfO5kKU7q^@{f^W;dPmL^W+^ zSQ9%ge=;#~v4~f$P-o64&Zhu&$1I&WfbE>)K~Xmd-;i5Z1uoh3ZaFz?H`;I_a{ABl z9J9CDkl)-a0Dy^I$gD04mY~77Jldieo6z@HEQHrDKHAfRp%ZN*VeXb=jfrv$6C8WJDKr3z41m~ zCw>FKTOxRH@ZGZCBbE2rK>z0E<_Rd^oJR$EjRfz^>a=R+vzoFLf0s1Arj15lJI_qa z@O}_m3XcGx-iOn<(!bc8dp^SVv}xU3<7{C?WHc`TX@gLSitie$F5I*%hQS~j@7}EL6kwNdU7ZUodLGyc-E1bh9C|oKWyeh$b?-Z@I`Cs1)JKQn zBKT3iB3+}y#~8vCnsH5%qvj6X-?v)!*cgN3HYibE=r}55jzkXaJr{1L&=qw5B6Ia? z?^kQdCNbF7$Xjsq^hzCx)(r9n{ju3j;-Hel?pBudOwJ4daP0?hy6-1$+s({^%}PyF zPY>;&&B zZx1WU@y)2HsOWXVZxhkiG+oPA5p!fM{^r&QG9u&Z%47d<&#L$D zn23p)Sx&Y_CehXNavxTmdlxJoG+I2C-oCe3hF4Z*iK%FH>gfZ}Y~$inSy@$neMNL& zAR@2*^6=Hl4oLZCScC+)=*UKs+#2s{47xS&2?);4n7@6_&h{Dh!R)0b=0-=AoSK@V zbQ2!NH+Zc$60z{7=Z~9o?fv0rR2I~64rs5z!`(NJ>$R}?YC|6h*cZi;#KS{Xl1~pe zI)Y|UNxxS~quGKRZmo)?T8F1iryh%8PhMpdf)FgLDl^mX_ErC;H3CX(%^Gh37z{1b zM`EN{fvowUYM|}(hyLC~flPtI=6DZ10ysG=Yo0k9b?&gxUweHUj^KDExa+2=X+nr0 zkXvl>)tenXgWvV;r?>Y{PE(W=6imDP19Ti=1kufZRY0BgHnJb@eB%wnMAH)6gkBkU_wl9RDi;k>UjMK0*F+f|erYdD-Xk(81GFB%^nW08 z_ET=L`}rguEh)v_wDTQMqwY@zU|*EX?M^JiS>zus zXmqh3ccvntVb%Y9961b6$_n7MhJ+fPz}nbJlDQ%+e-(e98|GH{#eday?y<8}w&|NY zlr*ciRZ;h^z%o|dRhR+`Z6}K>Ywwq+!RhBB9rvY+rX>b5WE2#yPj{#NAd#qyDM|Qm z7kvMolB(yMtfBv@3}hsbtsfs;P*ZiBI29GF@vuWj%#2UwgFGJZ{c3G)oG88ia;C8B z&ur4b78|V7&VHA-T`hByW63OK-7Al?MDCy8(h>OdxYl$~qdLfcw;eJ++Z4@a4q_kYn#3=}H^&fs_PLDoUHTL=ei{1Qd zPR&hMIjuiQToK^)^on;~-URKGYqo}-Z^Zk8Hwj$(fyS3IQbSRe8E;-PiH7eLNM=ra z-uLzMH{g(EtUZaSr_}cA>{A?0F7~ayI9ifv)?st4SZVAlw#<0R#PohZLP4SO-}E=X z0&WHC$%}pG?ewpuy9V;3tQ7|@anQeJWN52tt5;qA5zTWu`d#Uw`#3RHsaf;oK_Jwh zjTVN??Ju?X3Hy=%-q`Crd=p?|w{;7F^rw#fh= z&=Zjstb&uR;2y2zKOsc{7S(Ile^k9O#f^$Z{&V5+ymQfWXauzGyw_>gvsG*NkGK8< z?#ncMc_ z(h)ceRa*M!xJ*bd`ds+rJo_62tsQtMK{l3n>zx!@UF z$dZ4Yf9_9POBi<2(x^S9hd(CSOr3H6C903vyq7yJ5Fg zjgk8t9aA@{qJpHem6?9XlHsTz{<9fK3xYnReZ#5RuB68Au_Kt-(&vkdMQ$uep7ms>Aux*n>V$H$x^h<2$txl z#uxFt_bZ=%x5DKm$4n!RnMcHdwu^g!q*bZT)_UkvEdMEnMiRAA04bbp;oew+3mRg$ z8{8{sC@jy9PfrZRg`!|{MeU9os*V`_jHl80w58^Kz1B%u@AvTCc5`dXaYoBL;$`Ab zh$qrxMA)@18xgkf9lDap=|^WFp(mWirVz4zuZcH_PG6XB_FME)+lg#-cX9CqOjv#x zDx9|-b!5V#h#XhD9yW45@{^nWD9N4d^z$oQPJE6!PLW1|ed@j&->v_6$yb%>z^Y!J z3~Gz!^ZtBamDt`j3x6%fq*v$%Etb$V4p3RFYji&FDBWG2qBcAyWcwGYuXev(eJDor zgFS>$@Mtd~O>}$xc)py-x$`=Ztg2Jds4FcaWM1{yN$~C4Q+VG}Q6UeKiJj-w-mko4 zCRQfHU&S$i30rk)c94xY;hjh1e=&I|N;iYO^)q3I%XNP$ZMFa}R>9NrHKq5e_)*7g z)kg6iX=rz&Tii;Iij_H#ldLwZ{%vuFBys@&0`os6gT}G1DvN{ZDQ1 zN(^Jqu_Ly`L4)VM;>`Yd^&q-8o*$%XhdAEh<3+ESHJ9ge^=F}f#`b1}G}6S(OqO_} z2Xz&B8Idh|OPm}lW<~g%Tvg8tv+<)D9>cT7Wlv@%CZ_%+cEF>YWQI6(|BgqP^Ct>8 z@K2ks9@<(DS$WK1$n_vEQB8cEY4CS{IuX<vJ-DhoO6X9hOGT$j})UC4v<|=q?aFHD6{%o(< z@(Q}|$peNnF7x>&pdjkZz5OaZ?+!~Rvvy-HZHQP+an|i3YC@SCzb--w*O*w#xY`u8|6TrC2DmZIX~pLNgBkg6eZ5YedVC)OE1ds@YkT7q}lU&)M+0-1ie5vM|nhEfR)TF?aFX{e7l@Mu@~e*kHMROok>T4)wZY zSoWa1TJnk;KCmxx*`F#C7kHGGmVQ;#m`u`DmX_#aB#5+AZ?|OPIxh!?9#ouP^q8cDjBEA{gveB|pXXY(A z5AG~cyxtbY8oHV-NDhpaEWh3lH6)emGfB#)z1?%ojZr76)nq9wET*_3m&nHnrD64- zF@Wqq;_!McJ0!d#rpLAG)h4T!PBE#8p$X~f;;n9fhEwG0QSdmQotvYEsxbD7au6K~KWs9-Fx7`^79skd(U`#jqTn##7yB)dfd6S^uVQF;rGnbzZz* zv~w?*MaNlRL4=?~j*-lbV^Q&QRdYf<}X&^0)c6uAvsiS#|MNx=?gJ$F!LQsv_gg}hkhLQD1*RR^O;*Y(V!kztj zQY8|bFet>6!Xl+Nv}Y}Xc$Bq|8cxd_XPjudPVY%X_KSi{=$ZNL9p zQ9CBS@Z4b~e0nfjX+QqiMz_@^L9t8S2J#+ifa$=*LFj=+?2wewf7NwNdpqQBtIGb} zuxdE*=kWb{6l#O=Mt4#Yzqzqo13l4>g@qBoiQ>D7y^pdIV`9+B_jS* zy=ZMDPoDaQ2^gKY6rxbqI|6cXzQI`r3E6t1{+D9n)0t3hh^Pml|B7)jw#H9eSuD^_ z$=llgalCRCqi`w(h65*W2p->XF%yS7u{nHl{Fp?l7%s= zzZCiYOBNQRhtzY@dV4VBxc_&l@Z;{D4u(C>HbYPC1IW6YRsF{=ZEbDhw^)K+9D93z zKC9mmJ{96wHTmJD@Ol#2mll<}UJz7HpU&<5tQ~xN01=<~=Z|07buNj=E9|SG_4b64 zJ{U5b!+YhtE&ttq%znHBqy!z$y|hBYNBhy?9z+XuIURX1s8~2jLxWzieEQ@niU=x{ z_~+gL7t%@EdfYQ?uwWdcAN{%BJuR-7nOn9snoWl5Qse_QI9-k~D)#>_OPHz=unRqU z2Wecrm9y?w)6ipDkE?s~lOu2Zkg>?);MktRo#fM^>_Pcck}uW}NbrTj zruo;SD^GqKLUHkFl9(G3h#LFf>hb%(b`j&va~7vmmWX`pOsnTU(-#V>!J+7Y*To4n ztXd2b{CmPe5@>aVA0R3u}qCw64Z--X>TWEUYsx@!#oyf{P)W+`^!HLs4A`sLW~ z-GjUy{IECK=CklFR>E?v z+C{5}_Nt0zSYQa@NOW}ObsTpZ@_PuiXIC!H(4EGYuJz{($ z9MTaY{o###G^*z~=-m6xlu8)(cU$bBR*JmdFhFF--V0w)XE^0H$RhT4kYLfT3Cy(5 zky2CJPd>Z%Fgqf$;Tk78XhyvJg8sy!6Gz(OYtpM6=JUOV+qk?yAwnN2W}#g72o^;nD%v@b>)Na%bU$^xJ6D63$-8sEs=&tS zHx#K4rG8t+F43#J8ycIRX}?+RyQ`4Z%9}cncx(U$RWTx=OLjZ?VU%m@a%?oj(C?RW zGxRWa)bStaAri=l;;MZK9{l7OxL7iozlwh*zuM23?)Sv|rdboXBJ#ipCYTD(9)+)# z$9QJ-GUJ&EBCbI|KR4YXV9>#pWrBhEkH=o;qnLt%LSofh>wL$m$&yfS(3-w;?7;89Pi}#Q=GKY{+TIZ}F4ZWy zw+amYnAg~=mP7wNbpt+7h+xRs1lzXw{KV#WQvfCzFNecw*G5NC0qpgmTdP)EuVJM2 zFLM4vESpP>{kU?k!hy-J5q9()5E@rF(;HVj>n6B%y+x?Tgs-5-?N>@*{1#2< zBWJBGH9qn$CAJdjdBC-JG2&AhOQ#jbehLM)sb*o(T)u}p^A@)~`Bb)SfxSW&z>_6p zd=4Di>RaPbpq}W{fB!zgWj&Qp?DLaW-;p*8wDev(-d61Pq7e_z{ra+K65&wLz4HCj zr1HC?*@@wgyFG4gRD&Yf{jQIQz+<4#h93cOM)5?4Ps{w@8NlYez6>9)l=*NcK$-p8 z)#$g^F{jyI3or;Lb)^K(Rg&u&={zQ!nlFjU(00w`62ppWv6OuO@`9;L&NHJ9|yE&jlf4q<{czQ5VNvON!c=mMO zypHrjs|f%2@tjJ>;o%0*+N>jNcB-p_`O4u2j8b5fL5!YZ*_|Js{>p|J0OG%#`Bpo| z_y2_wVqAakf_>)*N&y?S-^UG=z@TpGIH5C+-Z1Q)VXj+l?Zq{RaD#DtcWUD2_yhNR z(UO)ulZU_yjpTPmv#)nV9|lZQbphOOJPQT|b<>~k3)kyW?4TOvfl)ARg3(E)!Xho$ z8%-z}4M)%FdBwCI{gW;*$Eeb24n(8$jz^>PsAdxiXCULVUGK>v2fP?fj?j#RWaidd z^=R;uS*L|R?%bZ1;~kRR zZF#Tp`QUQlc=dKs2hP&%KKQS6o(O?~axrMf9B(>pS30s6>{~-3BQbD0iN%~ETYbZ{ z8S#IBVICA2ol<%cvwO?wbn%@11oXOK_I~u{5)J?S?tJXDU$i53;g8(|y{$=4V(*%P zmv0AfZt71bH+LV@)u!>>`BgsrvbZ#JFHy|)*q-0H*}A_{`S@|6bc{{^k`*Mi)bgr- zp9I_{R)Rze!G4$ArB60;WOgL ziyr5gjKg1b=Io=d?fc?7V79y;b?NgLw)*y*z6cDH#B86f_NUbTy#x{O*kx1$2gq8( zr7Q1$d!1xcgS*S^ufIL+jk)YiqO>l>77I8CWN&{I`rK&{RbjA*FLehhI3X(P%$P7r z-(WCLi_dJml(`b#O0ofS`I5iKv+VR25UD$bU9JQfO^eAO$1gPMJ_yAemsZy+WQ#u3*=DAe4}=gVg0v-8_dYfb_a^^)1P7nyq{Ii48yo%g)6 zicN&MvtD!VrY0t5-Dp$}qbF;e0vh00{Kt{M2ybJBA(d={Vd$ERAYBMAS+0opys7c0 z!-;-C;+r1~MiiBlaJl~Gc5-?Xag8Srw(xdbJ}x%GT6>fA$R#6$k0Q2Zh0nZv?X;iD z^n80nKKB8^t}&DE;Y@>#$~_(A)c-JB_SA!aE2)Z~4v|mJw7)U4f6wKtM6?~S?Fe=m z+!169%Q%U(25=`{LkEP}vvnasH=%SAE|DVLRyR(j9acC#KFhlNvmjR|+6}{g1!b(K zg&Q<5Tpu1};n&jt??3f=V3H5?Rx%3Dp8+DB1O;bZ0t~g=+OojSYQR_(uJmYeJ(z2- zCgRPE5%#*wv&?`)sKp2vZ3A)-eu0e7ZWBc93qHP7@GSuEij4UGy3Jp4aczx&2iDWO z=$3r>5(vIrZTX8HuKEBp@E8ze0ELRZ%d`R9!14aXq2kigD8Rwtwqen#4PIQ-aXXw7 z2en&(Sl)c>3;4dYm3NbqlkxHKtAU(_kX=vS&W>%N(Y~aEvdjh?_%~DIU=}=0I)%45nc1!OZ9XWY;cq%U+|JzJ#ctliG z6nu5e8dWA+gURqufB8adWo5PA@jWNJ(-vg@ybz$sDk>}tZfg@#uhJQaBw(Ivab*U> z-VYiYjZFDbAXR)O{5C6RY032I(K{16azk^|)IDI4n5X6Ox5kf5B^c*Z7aKtmoeT3ST*S%f2 z3oYPL8BdDvKYq7Kcsjw`m-|6h7$V-6TL|B=)ZJSa;FJ0Dj)K`uOGh(ozM^>yz4xC* zAo&BJ42Ek6fsmzNnn<^=^nC$(Snu84j%feRc?12aS3r9gUzfZAj{^{3;OsAN5`wXh z*jSD*30MVCniczj`N!cLZtIeF^p~4EQ&ZDQ(=0#I6SiuEQtBt3_b^B>YC=ZFJJ6&O z^V$%n>UlB+p0Sy4Ue-L3diM?kAjwN0x!NcZy|>g|)brD9(d( z0dHS&T}LDSytb|3^Xk84RIFbP56c5n$tWsf2?z-M{j-o79SyCRnH$~02Kh;nyig#{qyp(Ya+x_bA;K~nx4QYJ#lurp+sDac7G`^@lz9*~QZGR`_qRIHM zzRfOtp{EA^VL{;N1@aJFN@n~cdM(R&bS;`|lv-F=n5`ch84(`Q-ZxHgfz?;Faz;i* zi?dgHvpUY0zyiZL!mZK@pwvK(chIbyDfsaxJw2T>ZlU1AhY#_osr|G1ej};+z5~E! zOsuT7DT7jAz~{K}1EIe3NjPxXXS8h>QC&CQVkp~0rZ+P_g`Mf!=F7)>mfv0TUSRS=)!2+A8QI|`Yg}= zGRKI80-)3Zs;+@`SQK2RWj#}oUtN7tn(fN4&fFzp@PdO%6U`f?NhX&32FW?9a_a3@MC^9*{!?UL9L%0?rRtx73L`N!RR#p2Gu2CEe1sv+ zUq-1$#RH+Vot-!iNb*_yr=|KhfDHf+*vD;mywJ!F{Fau1Aq)r}5< zcR28|0!wY3v7)bEBLS?yd+o($XRSs%3XnKz80n6X&gcRkNi}glZSXy}t42(P0Ny$( zQBiPD#yvLVzwKtQhUx>YAjl5jD=(`0XI!%Z&N(?d9|#_Nw_l-*k`^K`E6U7HX!60T zMrDk-tEzE9QABFGI~yWP5}3>Sp9}E<7QWr{B66q()a$R^k4!)>4^)U@ARe4oyAXQT z99Xb4Fl`XF5p$6;0|x0a9?(2dZ6IKP>)IMuNEtNCSgkq@%7u z1qU}F3&@@@w_k47ybQuynKDiWVGwaYHizQF{DqI&vReCx#t*EXG0;_M69h6&|7~taFUJQ< z%QEd+lL*htdGqOTT)Gc$-h=`YxrXqLaP<*k!+*505G5r*AgdIzb?Pw{i1O6P2oX<7 ziRkp{h&`m+K>5#nos7@f0K@+G1v^!re}CVzr81`&X(Ws`H+1FtGt&mz$6%kE$~>$X znIc~B;&%Q;;Lgs-AO*T*t$GXGI`c6zU?6f(q^f7TPT_gGOpdUudgVpWK?h)oPh=i| zJnfa;BEQ*Kj)J11Vqyn3J_a!3*kCgATP3A$xebh*o%ImXWyEn;T>>EV2C~^Q&=81W zlDv`vZ8GfNA3FoZYAq}wBq-7(jp4o#FA=Z7SWT6r@kd19*H%C+X|>)L@zr@}ROV^( z<_P;;6N1obAKpuLb|r;OUIm3T4)JWa-|Cr=+g)2+vo5E&VMT53=EZ5jlvRza&tTuRx3#ukX8{t5|s@LP^c@?k_pyyAY`oN*WQ9_yf zlkun1>igmJV65iC2$|YpWGE!0t1&Hvy(6YAq2~;pJn=!yc#x7rOuR7HM6mj$5p^K3 zSQNT1(RR{rt+ZsjchV;@M&3x5Wj$F3C*o4qtrnV&xZ=<}tumDFM#ZqvIP?x;5*fRf zgv0ZZGS6az&2y2cWcu{!Qsu(Usr&=9u8mkvUUFdU`n$a3VPKHae*bdPDFag;QBgc} z576)C9}3HwY0kFOqtemz6%KMuQ%kcj+EBd_ZN8YQ#E0images/delete2.png images/addBand2.png images/edit_control_4_24.png - images/logo_32x32_1.png + images/logo_32x32_1.png images/addDialog.png images/deleteDialog.png images/copy3.png @@ -183,5 +183,6 @@ images/signal.png images/object.png images/vlayuot_4_24.png + images/designer.png From 9df96f1daff034386b982a318991c236f101da15 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 23 Jun 2018 13:32:34 +0300 Subject: [PATCH 189/347] French language updated --- translations/limereport_fr.ts | 137 +++++++++++++++++++--------------- 1 file changed, 78 insertions(+), 59 deletions(-) diff --git a/translations/limereport_fr.ts b/translations/limereport_fr.ts index eada105..5ea10c5 100644 --- a/translations/limereport_fr.ts +++ b/translations/limereport_fr.ts @@ -445,47 +445,47 @@ p, li { white-space: pre-wrap; } LimeReport::BaseDesignIntf - + Copy Copier - + Cut Couper - + Paste Coller - + Bring to top Placer au premier-plan - + Send to back Placer en arrière-plan - + Create Horizontal Layout Créer une disposition horizontale - + Create Vertical Layout Créer une disposition verticale - + No borders Aucune bordure - + All borders Toutes les bordures @@ -1479,6 +1479,14 @@ p, li { white-space: pre-wrap; } Objets + + LimeReport::PDFExporter + + + Export to PDF + Exporter au format PDF + + LimeReport::PageFooter @@ -1547,12 +1555,12 @@ p, li { white-space: pre-wrap; } Formulaire - - PDF file name - Nom du fichier PDF + + %1 file name + %1 nom de fichier - + Report file name Nom du fichier du rapport @@ -2301,7 +2309,7 @@ p, li { white-space: pre-wrap; } Property value - Valeur + Valeur @@ -2720,22 +2728,27 @@ p, li { white-space: pre-wrap; } LimeReport::ReportEnginePrivate - + Preview Aperçu avant impression - + Error Erreur - + + %1 file name + %1 nom de fichier + + + Report File Change Nom du fichier changé - + The report file "%1" has changed names or been deleted. This preview is no longer valid. @@ -2744,12 +2757,12 @@ This preview is no longer valid. Cet aperçu n'est plus valide. - + Designer not found! Designer introuvable! - + Language %1 already exists La langue %1 existe déja @@ -3108,7 +3121,7 @@ Cet aperçu n'est plus valide. DATE&TIME - DATE&HEURE + Date&Heure @@ -3124,7 +3137,7 @@ Cet aperçu n'est plus valide. GENERAL - + General @@ -3487,45 +3500,45 @@ Cet aperçu n'est plus valide. - + Data Données - + DataHeader En-tête de données - + DataFooter Pied de données - + GroupHeader En-tête de groupe - + GroupFooter Pied de groupe - + Page Footer Pied de page - + Page Header En-tête de page @@ -3544,67 +3557,67 @@ Cet aperçu n'est plus valide. - + SubDetail Sous-détails - + SubDetailHeader En-tête de sous-détails - + SubDetailFooter Pied de sous-détails - + Tear-off Band Bande détachable - + alignment Alignement - + Barcode Item Elément de code barre - + HLayout - + Image Item - + Shape Item - + itemLocation - + Text Item @@ -3640,26 +3653,26 @@ Cet aperçu n'est plus valide. Source de donnée "%1" introuvable! - + bool - + QColor - + content Contenu - - + + @@ -3667,71 +3680,71 @@ Cet aperçu n'est plus valide. Source de donnée - - + + field Champ - + enum - + flags - + QFont - + QImage - + int - - + + qreal - + QRect - + QRectF - + geometry - + QString @@ -3790,7 +3803,7 @@ Cet aperçu n'est plus valide. - + Chart Item Elément du graphe @@ -3814,5 +3827,11 @@ Cet aperçu n'est plus valide. VLayout + + + + Export to PDF + Exporter au format PDF + From 13bf652cb60411d025e3c9fc11a9163b7be8ebbf Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 28 Jun 2018 21:35:06 +0300 Subject: [PATCH 190/347] Dark theme updated --- .../dark_style_sheet/qdarkstyle/style.qss | 93 +++++++++---------- 1 file changed, 45 insertions(+), 48 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index fd9d694..3aae6a7 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -321,7 +321,7 @@ QAbstractItemView alternate-background-color: #383838; color: #eff0f1; border: 1px solid 3A3939; - border-radius: 2px; +\\ border-radius: 2px; } QWidget:focus, QMenuBar:focus @@ -344,7 +344,7 @@ QLineEdit margin: 1px; border-style: solid; border: 1px solid #2b2b2b; - border-radius: 2px; +\\ border-radius: 2px; color: #eff0f1; } @@ -372,7 +372,7 @@ QGroupBox::title { QAbstractScrollArea { - border-radius: 2px; +\\ border-radius: 2px; border: 1px solid #2b2b2b; background-color: transparent; } @@ -520,7 +520,7 @@ QPlainTextEdit { background-color: #232629;; color: #eff0f1; - border-radius: 2px; +\\ border-radius: 2px; border: 1px solid #2b2b2b; } @@ -581,7 +581,7 @@ QFrame QFrame[frameShape="0"] { - border-radius: 2px; +\\ border-radius: 2px; border: 1px transparent #2b2b2b; } @@ -626,7 +626,7 @@ QPushButton border-color: #2b2b2b; border-style: solid; padding: 5px; - border-radius: 2px; +\\ border-radius: 2px; outline: none; } @@ -640,7 +640,7 @@ QPushButton:disabled padding-bottom: 5px; padding-left: 10px; padding-right: 10px; - border-radius: 2px; +\\ border-radius: 2px; color: #454545; } @@ -661,7 +661,7 @@ QComboBox selection-background-color: #2e2e2e; border-style: solid; border: 1px solid #2b2b2b; - border-radius: 2px; +\\ border-radius: 2px; padding-right: 5px; padding-left: 5px; padding-top: 1px; @@ -691,7 +691,7 @@ QComboBox:on QComboBox QAbstractItemView { background-color: #232629; - border-radius: 2px; +\\ border-radius: 2px; border: 1px solid #2b2b2b; selection-background-color: #89ae30; } @@ -729,7 +729,7 @@ QAbstractSpinBox { border: 1px solid #2b2b2b; background-color: #232629; color: #eff0f1; - border-radius: 2px; +\\ border-radius: 2px; } QAbstractSpinBox:up-button @@ -826,19 +826,20 @@ QTabBar::tab:top { border-bottom: 1px transparent black; background-color: #404040; padding: 5px; - min-width: 50px; - border-top-left-radius: 2px; - border-top-right-radius: 2px; +\\ border-top-left-radius: 2px; +\\ border-top-right-radius: 2px; + min-width: 10px; + margin-bottom: -1; } QTabBar::tab:top:!selected { color: #eff0f1; background-color: #383838; - border: 1px transparent #2b2b2b; - border-bottom: 1px transparent #2b2b2b; - border-top-left-radius: 2px; - border-top-right-radius: 2px; + border: 1px solid #383838; +\\ border-bottom: 1px transparent #2b2b2b; +\\ border-top-left-radius: 2px; +\\ border-top-right-radius: 2px; } @@ -853,19 +854,15 @@ QTabBar::tab:bottom { border-top: 1px solid #404040; background-color: #404040; padding: 5px; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; - min-width: 50px; + min-width: 10px; + margin-top: -1; } QTabBar::tab:bottom:!selected { color: #eff0f1; background-color: #383838; - border: 1px transparent #2b2b2b; - border-top: 1px transparent #2b2b2b; - border-bottom-left-radius: 2px; - border-bottom-right-radius: 2px; + border: 1px solid #383838; } QTabBar::tab:bottom:!selected:hover { @@ -876,22 +873,22 @@ QTabBar::tab:bottom:!selected:hover { QTabBar::tab:left { color: #eff0f1; border: 1px solid #2b2b2b; - border-left: 1px transparent black; - background-color: #383838; + border-left: 1px solid #404040; + background-color: #404040; padding: 5px; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; - min-height: 50px; +\\ border-top-right-radius: 2px; +\\ border-bottom-right-radius: 2px; + min-height: 10px; } QTabBar::tab:left:!selected { color: #eff0f1; - background-color: #54575B; - border: 1px solid #2b2b2b; - border-left: 1px transparent black; - border-top-right-radius: 2px; - border-bottom-right-radius: 2px; + background-color: #383838; + border: 1px solid #383838; +\\ border-left: 1px transparent black; +\\ border-top-right-radius: 2px; +\\ border-bottom-right-radius: 2px; } QTabBar::tab:left:!selected:hover { @@ -903,22 +900,22 @@ QTabBar::tab:left:!selected:hover { QTabBar::tab:right { color: #eff0f1; border: 1px solid #2b2b2b; - border-right: 1px transparent black; - background-color: #383838; + border-right: 1px solid #404040; + background-color: #404040; padding: 5px; - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; - min-height: 50px; +\\ border-top-left-radius: 2px; +\\ border-bottom-left-radius: 2px; + min-height: 10px; } QTabBar::tab:right:!selected { color: #eff0f1; - background-color: #54575B; - border: 1px solid #2b2b2b; - border-right: 1px transparent black; - border-top-left-radius: 2px; - border-bottom-left-radius: 2px; + background-color: #383838; + border: 1px solid #383838; +\\ border-right: 1px transparent black; +\\ border-top-left-radius: 2px; +\\ border-bottom-left-radius: 2px; } QTabBar::tab:right:!selected:hover { @@ -927,19 +924,19 @@ QTabBar::tab:right:!selected:hover { QTabBar QToolButton::right-arrow:enabled { image: url(:/qss_icons/rc/right_arrow.png); - } +} QTabBar QToolButton::left-arrow:enabled { image: url(:/qss_icons/rc/left_arrow.png); - } +} QTabBar QToolButton::right-arrow:disabled { image: url(:/qss_icons/rc/right_arrow_disabled.png); - } +} QTabBar QToolButton::left-arrow:disabled { image: url(:/qss_icons/rc/left_arrow_disabled.png); - } +} QDockWidget { From 9bb0a43856960c04466e47b36de19ac6114bbdd9 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 28 Jun 2018 22:54:44 +0300 Subject: [PATCH 191/347] Dark theme updated --- 3rdparty/dark_style_sheet/qdarkstyle/style.qss | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 3aae6a7..01a637b 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -26,8 +26,8 @@ QToolTip border: 1px solid #2b2b2b; background-color: #383838; color: white; - padding: 5px; -\\ opacity: 200; +\\ padding: 5px; + } QWidget @@ -1064,7 +1064,7 @@ QToolButton { background-color: #383838; color : white; border: 1px solid #383838; - border-radius: 2px; +\\ border-radius: 2px; margin: 2px; padding: 2px; } From 977be6cf773973d856c2d388078c17eb06c022d7 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 28 Jun 2018 23:17:03 +0300 Subject: [PATCH 192/347] Dark theme updated --- 3rdparty/dark_style_sheet/qdarkstyle/style.qss | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 01a637b..dfca1ac 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -591,8 +591,8 @@ QStackedWidget } QToolBar { - border: 1px transparent #2b2b2b; -\\ background: 1px solid #383838; +\\ border: 1px transparent #2b2b2b; +\\ background: #383838; font-weight: bold; border-bottom: 1px solid #2b2b2b; } @@ -1061,9 +1061,9 @@ QSlider::handle:vertical { } QToolButton { - background-color: #383838; +\\ background: #404040; color : white; - border: 1px solid #383838; + border: 1px solid #404040; \\ border-radius: 2px; margin: 2px; padding: 2px; @@ -1088,6 +1088,11 @@ QToolButton:disabled{ background-color: transparent; border: 1px transparent #2b2b2b; } + + +QToolBar QToolButton{ + border: 1px solid #383838; +} \\ \\QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ \\ padding-right: 20px; /* make way for the popup button */ From bac39060bf7ddf18a01c4b95d5edcbdd470b0287 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 28 Jun 2018 23:58:05 +0300 Subject: [PATCH 193/347] Dark theme updated --- 3rdparty/dark_style_sheet/qdarkstyle/style.qss | 11 +++-------- limereport/lrbasedesignintf.cpp | 6 +++--- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index dfca1ac..f664d1c 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -267,12 +267,13 @@ QMenu::separator { QMenu::indicator { width: 18px; height: 18px; + padding-left: 4px; } /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ QMenu::indicator:non-exclusive:unchecked { - image: url(:/qss_icons/rc/checkbox_unchecked.png); + image: url(:/qss_icons/rc/checkbox_unchecked.png); } QMenu::indicator:non-exclusive:unchecked:selected { @@ -1061,10 +1062,8 @@ QSlider::handle:vertical { } QToolButton { -\\ background: #404040; color : white; - border: 1px solid #404040; -\\ border-radius: 2px; + border: 1px solid transparent; margin: 2px; padding: 2px; } @@ -1089,10 +1088,6 @@ QToolButton:disabled{ border: 1px transparent #2b2b2b; } - -QToolBar QToolButton{ - border: 1px solid #383838; -} \\ \\QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ \\ padding-right: 20px; /* make way for the popup button */ diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 1ad1ee5..0dbea41 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1219,12 +1219,12 @@ void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) page->clearSelection(); this->setSelected(true); } - QMenu menu; - QAction* copyAction = menu.addAction(QIcon(":/report/images/copy.png"), tr("Copy")); + QMenu menu(event->widget()); + QAction* copyAction = menu.addAction(QIcon(":/report/images/copy"), tr("Copy")); copyAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_C)); QAction* cutAction = menu.addAction(QIcon(":/report/images/cut"), tr("Cut")); cutAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_X)); - QAction* pasteAction = menu.addAction(QIcon(":/report/images/paste.png"), tr("Paste")); + QAction* pasteAction = menu.addAction(QIcon(":/report/images/paste"), tr("Paste")); pasteAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_V)); pasteAction->setEnabled(false); From 9b4d2c934cb7917c20ef7dbc5f2bc30001062bb0 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Fri, 29 Jun 2018 00:51:09 +0300 Subject: [PATCH 194/347] Dark theme updated --- .../dark_style_sheet/qdarkstyle/style.qss | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index f664d1c..c1b2d26 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -676,7 +676,9 @@ QPushButton:checked{ border-color: #6A6969; } -QComboBox:hover,QPushButton:hover,QAbstractSpinBox:hover,QLineEdit:hover,QTextEdit:hover,QPlainTextEdit:hover,QAbstractView:hover,QTreeView:hover +QComboBox:hover,QPushButton:hover,QAbstractSpinBox:hover,QLineEdit:hover, +QTextEdit:hover,QPlainTextEdit:hover,QAbstractView:hover,QTreeView:hover, +QTableView:hover, QTableWidget::hover, QListWidget::hover { border: 1px solid #4b6807; color: #eff0f1; @@ -824,11 +826,9 @@ QTabBar::close-button:pressed { QTabBar::tab:top { color: #eff0f1; border: 1px solid #2b2b2b; - border-bottom: 1px transparent black; + border-bottom: 1px solid transparent; background-color: #404040; padding: 5px; -\\ border-top-left-radius: 2px; -\\ border-top-right-radius: 2px; min-width: 10px; margin-bottom: -1; } @@ -837,11 +837,7 @@ QTabBar::tab:top:!selected { color: #eff0f1; background-color: #383838; - border: 1px solid #383838; -\\ border-bottom: 1px transparent #2b2b2b; -\\ border-top-left-radius: 2px; -\\ border-top-right-radius: 2px; - + border: 1px solid transparent; } QTabBar::tab:top:!selected:hover { @@ -863,7 +859,7 @@ QTabBar::tab:bottom:!selected { color: #eff0f1; background-color: #383838; - border: 1px solid #383838; + border: 1px solid transparent; } QTabBar::tab:bottom:!selected:hover { @@ -877,8 +873,6 @@ QTabBar::tab:left { border-left: 1px solid #404040; background-color: #404040; padding: 5px; -\\ border-top-right-radius: 2px; -\\ border-bottom-right-radius: 2px; min-height: 10px; } @@ -886,17 +880,13 @@ QTabBar::tab:left:!selected { color: #eff0f1; background-color: #383838; - border: 1px solid #383838; -\\ border-left: 1px transparent black; -\\ border-top-right-radius: 2px; -\\ border-bottom-right-radius: 2px; + border: 1px solid transparent; } QTabBar::tab:left:!selected:hover { background-color: #2e2e2e; } - /* RIGHT TABS */ QTabBar::tab:right { color: #eff0f1; @@ -904,8 +894,6 @@ QTabBar::tab:right { border-right: 1px solid #404040; background-color: #404040; padding: 5px; -\\ border-top-left-radius: 2px; -\\ border-bottom-left-radius: 2px; min-height: 10px; } @@ -913,10 +901,7 @@ QTabBar::tab:right:!selected { color: #eff0f1; background-color: #383838; - border: 1px solid #383838; -\\ border-right: 1px transparent black; -\\ border-top-left-radius: 2px; -\\ border-bottom-left-radius: 2px; + border: 1px solid transparent; } QTabBar::tab:right:!selected:hover { @@ -1153,6 +1138,9 @@ QTableView::item:selected:active, QListView::item:selected:active { color: #eff0f1; } +QTableView::focus{ + border: 1px solid #4b6807 +} QHeaderView { From 2a5b83296bf7d90c17089049306b13b550c462a1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 9 Jul 2018 22:52:47 +0300 Subject: [PATCH 195/347] Script completion has been fixed --- limereport/scripteditor/lrcodeeditor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index 0b7af1a..97deeb5 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -170,7 +170,7 @@ QString CodeEditor::textUnderCursor() const currentText = blockText.at(i-1) + currentText; else break; } - return currentText; + return currentText.trimmed(); } bool CodeEditor::matchLeftParenthesis(QTextBlock currentBlock, QChar parenthesisType, int i, int numLeftParentheses) From 90ec21d2abc4a569fc85e43cc89f743953eec5a5 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 11 Jul 2018 13:29:12 +0300 Subject: [PATCH 196/347] Font editors has been fixed --- limereport/items/editors/lrfonteditorwidget.cpp | 1 - limereport/items/editors/lrfonteditorwidget.h | 4 ++-- limereport/items/editors/lrtextalignmenteditorwidget.cpp | 1 - limereport/items/editors/lrtextalignmenteditorwidget.h | 4 ++-- limereport/items/lrtextitem.cpp | 2 +- limereport/lrbasedesignintf.cpp | 6 ++++-- limereport/lrreportengine.cpp | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/limereport/items/editors/lrfonteditorwidget.cpp b/limereport/items/editors/lrfonteditorwidget.cpp index be54949..5d1a306 100644 --- a/limereport/items/editors/lrfonteditorwidget.cpp +++ b/limereport/items/editors/lrfonteditorwidget.cpp @@ -158,7 +158,6 @@ void FontEditorWidgetForPage::slotFontAttribsChanged(bool value) #ifdef HAVE_REPORT_DESIGNER void FontEditorWidgetForDesigner::initEditor() { - FontEditorWidget::initEditor(); connect(m_reportEditor,SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); } diff --git a/limereport/items/editors/lrfonteditorwidget.h b/limereport/items/editors/lrfonteditorwidget.h index d319ff0..f8f9b96 100644 --- a/limereport/items/editors/lrfonteditorwidget.h +++ b/limereport/items/editors/lrfonteditorwidget.h @@ -51,7 +51,7 @@ public: protected: void setItemEvent(BaseDesignIntf *item); QFontComboBox* fontNameEditor(){return m_fontNameEditor;} - virtual void initEditor(); + void initEditor(); protected slots: virtual void slotFontChanged(const QFont&); virtual void slotFontSizeChanged(const QString& value); @@ -94,7 +94,7 @@ class FontEditorWidgetForDesigner : public FontEditorWidget{ Q_OBJECT public: explicit FontEditorWidgetForDesigner(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0) - : FontEditorWidget(title, parent), m_reportEditor(reportEditor){} + : FontEditorWidget(title, parent), m_reportEditor(reportEditor){initEditor();} protected: void initEditor(); diff --git a/limereport/items/editors/lrtextalignmenteditorwidget.cpp b/limereport/items/editors/lrtextalignmenteditorwidget.cpp index 8eb424b..8874d13 100644 --- a/limereport/items/editors/lrtextalignmenteditorwidget.cpp +++ b/limereport/items/editors/lrtextalignmenteditorwidget.cpp @@ -197,7 +197,6 @@ void TextAlignmentEditorWidgetForPage::slotTextVAttribsChanged(bool value) #ifdef HAVE_REPORT_DESIGNER void TextAlignmentEditorWidgetForDesigner::initEditor() { - TextAlignmentEditorWidget::initEditor(); connect(m_reportEditor,SIGNAL(itemPropertyChanged(QString,QString,QVariant,QVariant)), this,SLOT(slotPropertyChanged(QString,QString,QVariant,QVariant))); diff --git a/limereport/items/editors/lrtextalignmenteditorwidget.h b/limereport/items/editors/lrtextalignmenteditorwidget.h index 97f13f5..4590be3 100644 --- a/limereport/items/editors/lrtextalignmenteditorwidget.h +++ b/limereport/items/editors/lrtextalignmenteditorwidget.h @@ -45,7 +45,7 @@ public: int flag() const; protected: void setItemEvent(BaseDesignIntf *item); - virtual void initEditor(); + void initEditor(); bool m_textAttibutesIsChanging; private: void updateValues(const Qt::Alignment& align); @@ -84,7 +84,7 @@ class TextAlignmentEditorWidgetForDesigner: public TextAlignmentEditorWidget{ Q_OBJECT public: TextAlignmentEditorWidgetForDesigner(ReportDesignWidget* reportEditor, const QString &title, QWidget *parent = 0) - :TextAlignmentEditorWidget(title, parent), m_reportEditor(reportEditor){} + :TextAlignmentEditorWidget(title, parent), m_reportEditor(reportEditor){initEditor();} protected: void initEditor(); protected slots: diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 63d856f..9e559cd 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -971,7 +971,7 @@ void TextItem::setTextItemFont(QFont value) if (font()!=value){ QFont oldValue = font(); setFont(value); - update(); + if (!isLoading()) update(); notify("font",oldValue,value); } } diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 0dbea41..43ceb68 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -164,8 +164,10 @@ QFont BaseDesignIntf::font() const void BaseDesignIntf::setFont(QFont &font) { - m_font = font; - update(); + if (m_font != font){ + m_font = font; + if (!isLoading()) update(); + } } qreal BaseDesignIntf::width() const diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index c89fc83..d46d507 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -480,7 +480,7 @@ void ReportEnginePrivate::printToFile(const QString &fileName) bool ReportEnginePrivate::printToPDF(const QString &fileName) { - return exportReport("PDF"); + return exportReport("PDF", fileName); } bool ReportEnginePrivate::exportReport(QString exporterName, const QString &fileName, const QMap ¶ms) From 16249c7f05944189e6158482bbe01c17a2a3d910 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 12 Jul 2018 00:00:19 +0300 Subject: [PATCH 197/347] Endless cycle if null value has been fixed --- limereport/lrscriptenginemanager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index fa78023..9819cd3 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -416,7 +416,7 @@ QString ScriptEngineManager::expandDataFields(QString context, ExpandType expand QString fieldValue; varValue = dataManager()->fieldData(field); if (expandType == EscapeSymbols) { - if (dataManager()->fieldData(field).isNull()) { + if (varValue.isNull()) { fieldValue="\"\""; } else { fieldValue = escapeSimbols(varValue.toString()); @@ -437,8 +437,8 @@ QString ScriptEngineManager::expandDataFields(QString context, ExpandType expand fieldValue = replaceHTMLSymbols(varValue.toString()); else fieldValue = varValue.toString(); } - if (varValue.isValid()) - context.replace(rx.cap(0),fieldValue); + + context.replace(rx.cap(0),fieldValue); } else { QString error; From 7f122003fff3783769eb8f06aab96d08337d4e9c Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 12 Jul 2018 00:12:24 +0300 Subject: [PATCH 198/347] PageItem border has been changed --- limereport/lrpageitemdesignintf.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 2c22102..1844ab0 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -109,8 +109,8 @@ void PageItemDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsIte ppainter->fillRect(rect(),Qt::white); QPen pen; pen.setColor(Qt::gray); - pen.setWidth(2); - pen.setStyle(Qt::DotLine); + pen.setWidth(1); + pen.setStyle(Qt::SolidLine); ppainter->setPen(pen); QRectF tmpRect = rect(); tmpRect.adjust(-4,-4,4,4); From 4c5a6b0183c8a45739af1440cae2998674c15748 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Tue, 21 Aug 2018 23:08:29 +0300 Subject: [PATCH 199/347] currencyUSBasedFormat has been fixed --- limereport/lrscriptenginemanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 9819cd3..ae3abad 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -733,7 +733,7 @@ bool ScriptEngineManager::createCurrencyUSBasedFormatFunction(){ fd.setDescription("currencyUSBasedFormat(\""+tr("Value")+",\""+tr("CurrencySymbol")+"\")"); fd.setScriptWrapper(QString("function currencyUSBasedFormat(value, currencySymbol){" " if(typeof(currencySymbol)==='undefined') currencySymbol = \"\"; " - "return %1.currencyFormat(value,currencySymbol);}" + "return %1.currencyUSBasedFormat(value,currencySymbol);}" ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); return addFunction(fd); From c4a24b1f3b840804ab25d44ba9dbb909670cf6ed Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Wed, 22 Aug 2018 20:35:59 +0300 Subject: [PATCH 200/347] bandAt added --- limereport/lrpagedesignintf.cpp | 17 +++++++++++------ limereport/lrpagedesignintf.h | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index a0ee81f..d712528 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -482,12 +482,7 @@ QSizeF PageDesignIntf::placeSizeOnGrid(QSizeF size){ BaseDesignIntf *PageDesignIntf::addReportItem(const QString &itemType, QPointF pos, QSizeF size) { - BandDesignIntf *band=0; - foreach(QGraphicsItem * item, items(pos)) { - band = dynamic_cast(item); - if (band) break; - } - + BandDesignIntf *band = bandAt(pos); if (band) { BaseDesignIntf *reportItem = addReportItem(itemType, band, band); // QPointF insertPos = band->mapFromScene(pos); @@ -1733,6 +1728,16 @@ QList PageDesignIntf::reportItemsByName(const QString &name){ return result; } +BandDesignIntf *PageDesignIntf::bandAt(QPointF pos) +{ + BandDesignIntf *band=0; + foreach(QGraphicsItem * item, items(pos)) { + band = dynamic_cast(item); + if (band) break; + } + return band; +} + void CommandIf::addCommand(Ptr command, bool execute) { Q_UNUSED(command) diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 37eb7b1..962b066 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -140,6 +140,7 @@ namespace LimeReport { BaseDesignIntf::ItemMode itemMode(){return m_itemMode;} BaseDesignIntf* reportItemByName(const QString& name); QList reportItemsByName(const QString &name); + BandDesignIntf* bandAt(QPointF pos); BaseDesignIntf* addReportItem(const QString& itemType, QPointF pos, QSizeF size); BaseDesignIntf* addReportItem(const QString& itemType, QObject *owner=0, BaseDesignIntf *parent=0); BaseDesignIntf* createReportItem(const QString& itemType, QObject *owner=0, BaseDesignIntf *parent=0); From 3c22c63600af11f577e587aa4cb588a32dc56aa4 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 23 Aug 2018 00:49:38 +0300 Subject: [PATCH 201/347] Translation has been fixed --- limereport/lrreporttranslation.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrreporttranslation.cpp b/limereport/lrreporttranslation.cpp index 5c8fee8..81fd2c4 100644 --- a/limereport/lrreporttranslation.cpp +++ b/limereport/lrreporttranslation.cpp @@ -69,7 +69,7 @@ PageTranslation* ReportTranslation::findPageTranslation(const QString& page_name void ReportTranslation::updatePageTranslation(PageDesignIntf* page) { - PageTranslation* pageTranslation = findPageTranslation(page->objectName()); + PageTranslation* pageTranslation = findPageTranslation(page->pageItem()->objectName()); if (!pageTranslation){ pageTranslation = createPageTranslation(page); m_pagesTranslation.append(pageTranslation); From a337ef39a425394e22f120141fc2aba18d84705e Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Thu, 23 Aug 2018 00:53:27 +0300 Subject: [PATCH 202/347] Report structure browser has been modified --- limereport/objectsbrowser/lrobjectbrowser.cpp | 23 +++++++++++++++++-- limereport/objectsbrowser/lrobjectbrowser.h | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/limereport/objectsbrowser/lrobjectbrowser.cpp b/limereport/objectsbrowser/lrobjectbrowser.cpp index 2b51db5..a7e39ba 100644 --- a/limereport/objectsbrowser/lrobjectbrowser.cpp +++ b/limereport/objectsbrowser/lrobjectbrowser.cpp @@ -90,7 +90,7 @@ void ObjectBrowser::fillNode(QTreeWidgetItem* parentNode, BaseDesignIntf* report foreach (BaseDesignIntf* item, reportItem->childBaseItems()) { if (item != ignoredItem){ - ObjectBrowserNode* treeItem = new ObjectBrowserNode(parentNode); + ObjectBrowserNode* treeItem = new ObjectBrowserNode(/*parentNode*/); treeItem->setText(0,item->objectName()); treeItem->setObject(item); treeItem->setIcon(0,QIcon(":/items/"+extractClassName(item->metaObject()->className()))); @@ -102,7 +102,26 @@ void ObjectBrowser::fillNode(QTreeWidgetItem* parentNode, BaseDesignIntf* report this, SLOT(slotItemParentChanged(BaseDesignIntf*,BaseDesignIntf*)), Qt::UniqueConnection); } m_itemsMap.insert(item,treeItem); - parentNode->addChild(treeItem); + + BandDesignIntf* band = dynamic_cast(item); + + QSet subBands; + subBands << BandDesignIntf::SubDetailBand << + BandDesignIntf::SubDetailHeader << + BandDesignIntf::SubDetailFooter; + + if (band && subBands.contains(band->bandType())){ + ObjectBrowserNode* parentBandNode = 0; + if (band->bandType() == BandDesignIntf::SubDetailBand){ + parentBandNode = m_itemsMap.value(band->parentBand()); + } else { + parentBandNode = m_itemsMap.value(band->parentBand()->parentBand()); + } + if(parentBandNode) + parentBandNode->addChild(treeItem); + } else { + parentNode->addChild(treeItem); + } if (!item->childBaseItems().isEmpty()) fillNode(treeItem,item, ignoredItem); } diff --git a/limereport/objectsbrowser/lrobjectbrowser.h b/limereport/objectsbrowser/lrobjectbrowser.h index c82fb27..3616c41 100644 --- a/limereport/objectsbrowser/lrobjectbrowser.h +++ b/limereport/objectsbrowser/lrobjectbrowser.h @@ -42,7 +42,7 @@ public: void setObject(QObject* value); QObject* object() const; explicit ObjectBrowserNode(QTreeWidget *view); - explicit ObjectBrowserNode(QTreeWidgetItem *parent); + explicit ObjectBrowserNode(QTreeWidgetItem *parent = 0); bool operator <(const QTreeWidgetItem& other) const; private: QObject* m_object; From 7566cfd8866b7d998d43b549b74e2caddba01391 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 1 Sep 2018 12:36:25 +0300 Subject: [PATCH 203/347] Translation has been fixed --- limereport/lrreportengine.cpp | 3 ++- limereport/lrreporttranslation.cpp | 8 +++++++- .../translationeditor/images/question.png | Bin 542 -> 1974 bytes .../translationeditor/translationeditor.cpp | 14 ++++++++++---- .../translationeditor/translationeditor.qrc | 7 ++++--- .../translationeditor/translationeditor.ui | 9 +++++++-- 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 3bd6af9..a128d46 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -908,6 +908,7 @@ bool ReportEnginePrivate::isNeedToSave() QString ReportEnginePrivate::renderToString() { LimeReport::ReportRender render; + updateTranslations(); dataManager()->connectAllDatabases(); dataManager()->setDesignTime(false); if (m_pages.count()){ @@ -1120,6 +1121,7 @@ ReportPages ReportEnginePrivate::renderToPages() { if (m_reportRendering) return ReportPages(); m_reportRender = ReportRender::Ptr(new ReportRender); + updateTranslations(); dataManager()->clearErrors(); dataManager()->connectAllDatabases(); @@ -1160,7 +1162,6 @@ ReportPages ReportEnginePrivate::renderToPages() } } - for (int i=0; iisTOC()){ diff --git a/limereport/lrreporttranslation.cpp b/limereport/lrreporttranslation.cpp index 81fd2c4..db54b37 100644 --- a/limereport/lrreporttranslation.cpp +++ b/limereport/lrreporttranslation.cpp @@ -82,8 +82,14 @@ void ReportTranslation::updatePageTranslation(PageDesignIntf* page) if (itemTranslation){ foreach(QString propertyName, stringsForTranslation.keys()){ PropertyTranslation* propertyTranslation = itemTranslation->findProperty(propertyName); + if (propertyTranslation->checked) + propertyTranslation->sourceHasBeenChanged = propertyTranslation->sourceValue != stringsForTranslation.value(propertyName); + if (propertyTranslation->sourceHasBeenChanged) + propertyTranslation->checked = false; propertyTranslation->sourceValue = stringsForTranslation.value(propertyName); - propertyTranslation->sourceHasBeenChanged = propertyTranslation->value != propertyTranslation->sourceValue; + + if ( language() == QLocale::AnyLanguage ) + propertyTranslation->value = propertyTranslation->sourceValue; } } else { createItemTranslation(item, pageTranslation); diff --git a/limereport/translationeditor/images/question.png b/limereport/translationeditor/images/question.png index badcba0370684a7f24dabbe20055263908f98998..1b358c84d9c725fce04224fe08eb6c858ad354e3 100644 GIT binary patch delta 1924 zcmV-~2YdLQ1hx;5BYy>wdQ@0+Qek%>aB^>EX>4U6ba`-PAZ2)IW&i+q+O1bxlH@21 z{O1&V1SIhg$Ke?sff-?QzU&H)^hdEi}eAJLauy|Z@ zi8C5%*OQMoS$Dj5$DWN(a&rwZM1opYSHqTf$Qko_%j?#YA%FJ|ic;SL6p4N2qU7V4fq_V{52{LFkgi5z^O=SZh7;_2ByF_|MWmM{&B(AY-xhk?)X^_jd181#pk6&uX9ObwvFc=~WI zIfxca^r%-HQEXcQOaufTU`W7#4J4id*~n}n5e%syC<8i+;{sa9du{;9P9%UFL;=>u zH<6C1?0C!d3a8DSyBFf(e75?%B$ z#27WEn2m}$^%^v)YSNrI2{Nuvh{vQUrJS*7hUSc~GbZF*xJYrumr!ESl1i>@s#I5f z4K-G+spiH_8sfNx7Mr%za;FYg>aP19dhFU$&wm51He|TrM;LMFNM_`VwN2|&`3=@+ zv&IKgb7H($gEYod1ESoj9Wg~R+IkSAbfBYPLvS0I-@vlaS14DTQb zVRd{}q?M!H6T4Gc9cyVgicnrtaby={?bS(&L;uE>cZe^9<~3(hR;%=(9WK3Lb-vxR z`6{S!X;4>0_a3@+J^g^y)LZlYge^zs$$udgP+4)TmpDyz-t`PD|c zXdQvp&?etF`c&2kVls$X^2$EdxY|hhi2pfb-o|cf%44Z-g0MzFn)R*AfsYxuDg}Q` z_Uux1OLxNLu4$pnp?f;Ei|fKjg*R)2$gJGf7de##+bvDKQXj-^W2kY7hqzFKJAXSi z)Y&o+ZnPpLAq#lCxnQI7Aa*Z_Y!G* z*|y)|$dr2Ae%TFfqW;#lO}Dp1kVqSAjPztuTCoPtseOeY&asH#3`>C~$eZj{3**Lh z=SqfjPqQhUyNK1M#&kny*fb2+abyQspP0r;e~Qp|YV$@Iy@K@=P3A6~$bX)}irf3% ziv*nMCwv;-pL-0k8Qd#Yf(&x`2`vfkFcnAs@(P7hyQkEj&V!>Fv53fC;_16^p{K;& zw>OW{k;dANnWFmOs^rSd_4*&oF24YJ`L;%VF$^air)>UQz000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2jU3<2_Gj#b(KevTPS~kNkl@3|7L zC>H0Jff%p~sMfU(6o8bbRUe&r$(4KpBp4p2npWNKBPbTt6^5z9p!qXjw)0x4=%~>Wl8I4wlB76eYOxHgre-)1Tl}*ZG?z)OP!gX zVP|az?}Qisl%Icq9H87R(`YqtVOM2)RCdFh(f(?axzA8;mN{NL#y9E1g;nKY^Gcj0 zxO%-Jx0xdx3J=71ER$fGmA=Qfk2lnDmFQ9wdF)5afz@TpVGD+l?;BtCF#F3m^Y*de z0a6{-a}49D3u?BSNJkRVk%U<{d%WN9%UFUD|wXJ`h-h|!&0000< KMNUMnLSTZbm!(Po delta 457 zcmV;)0XF`&51s^&BM<-vVoOIv0RI600RN!9r<0S>1s)3F2m}u%CbUui^^^GpD1U}Y zL_t(I%e9k1NRx3G#(%njj`+lq2hmQ0posbo2_{9GG&2WI2TunPGMsG(pWFNLzR&yeJnswVfiMhZ ztrZ|Z)>?&OsMBhD|4n2v8O3N&oPRB#jXP*#lH&9MJJok&vss-vIiJtVzdWFypJ&v3 zi(VE{w1V{hiYiMekw~0P;QPMr-@Tx{RWx@GrBW%G6w-&Q+Ioia*HA8(J3$ivJMcV@ z#TWa`mv*_BgmgMhf9w||uhTsI#Md8i$?xx6Ok<2*J$)cm`t)!b8DsQc5r2>2oYO>M zkg=gEU$&Yol#e#-7}i>q9^KadI-0tLJkL8-z<4`?R;xu{W0}S0@Z^o5UjNq9)iF8e zWQ>t9M$Wmm_Ql&ZkKS;MkBmZnh4SkNaEhX+rz3(|t;WR75ypla99Fk!>_K_0Mpqg% zzdvU4Bh+_c=XaOS6a>Ms=N^J1|AQdVxqR*)EH;^@C!splitter_2->setStretchFactor(1,2); ui->splitter->setStretchFactor(0,2); QTableWidgetItem* item = new QTableWidgetItem(); - item->setIcon(QIcon(":/translationeditor/images/checked.png")); + item->setIcon(QIcon(":/translationeditor/checked")); ui->tbStrings->setColumnCount(4); ui->tbStrings->setColumnWidth(0,30); ui->tbStrings->setColumnWidth(1,100); @@ -132,8 +132,14 @@ void TranslationEditor::activatePage(PageTranslation* pageTranslation) ui->tbStrings->setRowCount(rowIndex+1); foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){ QTableWidgetItem* checkItem = new QTableWidgetItem(); - if (propertyTranslation->checked) - checkItem->setIcon(QIcon(":/translationeditor/images/checked.png")); + + if (propertyTranslation->sourceHasBeenChanged){ + checkItem->setIcon(QIcon(":/translationeditor/question")); + } + if (propertyTranslation->checked){ + checkItem->setIcon(QIcon(":/translationeditor/checked")); + } + ui->tbStrings->setItem(rowIndex,0,checkItem); ui->tbStrings->setItem(rowIndex,1,new QTableWidgetItem(itemTranslation->itemName)); ui->tbStrings->setItem(rowIndex,2,new QTableWidgetItem(propertyTranslation->propertyName)); @@ -179,7 +185,7 @@ void TranslationEditor::on_cbChecked_toggled(bool checked) { if (m_currentPropertyTranslation){ m_currentPropertyTranslation->checked = checked; - ui->tbStrings->item(ui->tbStrings->currentRow(),0)->setIcon(checked ? QIcon(":/translationeditor/images/checked.png"):QIcon()); + ui->tbStrings->item(ui->tbStrings->currentRow(),0)->setIcon(checked ? QIcon(":/translationeditor/checked"):QIcon()); } } diff --git a/limereport/translationeditor/translationeditor.qrc b/limereport/translationeditor/translationeditor.qrc index 706f7af..af0f804 100644 --- a/limereport/translationeditor/translationeditor.qrc +++ b/limereport/translationeditor/translationeditor.qrc @@ -1,8 +1,9 @@ - images/add.png - images/remove.png + images/add.png + images/remove.png images/checked.png - images/question.png + images/question.png + images/green_check.png diff --git a/limereport/translationeditor/translationeditor.ui b/limereport/translationeditor/translationeditor.ui index 86f7a2f..944fec4 100644 --- a/limereport/translationeditor/translationeditor.ui +++ b/limereport/translationeditor/translationeditor.ui @@ -62,7 +62,7 @@ - :/translationeditor/images/add.png:/translationeditor/images/add.png + :/translationeditor/add:/translationeditor/add true @@ -76,7 +76,7 @@ - :/translationeditor/images/remove.png:/translationeditor/images/remove.png + :/translationeditor/remove:/translationeditor/remove true @@ -158,6 +158,10 @@ + + + :/translationeditor/checked:/translationeditor/checked + @@ -215,6 +219,7 @@ + From 4b38f75a9c2f5521c8504b58feec7e67d9e65c09 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 1 Sep 2018 23:15:41 +0300 Subject: [PATCH 204/347] QtScriptEngine -> QtScript/QScriptEngine --- limereport/lrglobal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 65a04d2..de0ac9d 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -46,7 +46,7 @@ //#include #include #else -#include +#include #endif namespace LimeReport { From ea2a38758d499ea4504c64d62d235b9562f7e2ce Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 1 Sep 2018 23:21:52 +0300 Subject: [PATCH 205/347] Translation has been fixed --- include/lrglobal.h | 2 +- limereport/lrreporttranslation.cpp | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index 65a04d2..de0ac9d 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -46,7 +46,7 @@ //#include #include #else -#include +#include #endif namespace LimeReport { diff --git a/limereport/lrreporttranslation.cpp b/limereport/lrreporttranslation.cpp index db54b37..aa6cfdd 100644 --- a/limereport/lrreporttranslation.cpp +++ b/limereport/lrreporttranslation.cpp @@ -82,14 +82,13 @@ void ReportTranslation::updatePageTranslation(PageDesignIntf* page) if (itemTranslation){ foreach(QString propertyName, stringsForTranslation.keys()){ PropertyTranslation* propertyTranslation = itemTranslation->findProperty(propertyName); + bool translated = propertyTranslation->sourceValue != propertyTranslation->value; if (propertyTranslation->checked) propertyTranslation->sourceHasBeenChanged = propertyTranslation->sourceValue != stringsForTranslation.value(propertyName); if (propertyTranslation->sourceHasBeenChanged) propertyTranslation->checked = false; propertyTranslation->sourceValue = stringsForTranslation.value(propertyName); - - if ( language() == QLocale::AnyLanguage ) - propertyTranslation->value = propertyTranslation->sourceValue; + if (!translated) propertyTranslation->value = propertyTranslation->sourceValue; } } else { createItemTranslation(item, pageTranslation); From b878cf95aedc195f483918ec38c8a9599894f34a Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 6 Sep 2018 23:07:19 +0300 Subject: [PATCH 206/347] Translation has been changed --- .../demo_reports/change_lang_from_script.lrxml | 14 -------------- limereport/lrreportengine.cpp | 13 +++++++------ limereport/serializators/lrxmlwriter.cpp | 15 +++++++++------ 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/demo_r1/demo_reports/change_lang_from_script.lrxml b/demo_r1/demo_reports/change_lang_from_script.lrxml index a5d3704..dd97e87 100644 --- a/demo_r1/demo_reports/change_lang_from_script.lrxml +++ b/demo_r1/demo_reports/change_lang_from_script.lrxml @@ -108,20 +108,6 @@ Dialog.exec() == 1; - - - - - - - - - - - - - -

  2. diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index a128d46..4ccaf30 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1010,7 +1010,8 @@ void ReportEnginePrivate::activateLanguage(QLocale::Language language) BaseDesignIntf* item = page->childByName(itemTranslation->itemName); if (item) { foreach(PropertyTranslation* propertyTranslation, itemTranslation->propertyesTranslation){ - item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value); + if (propertyTranslation->checked) + item->setProperty(propertyTranslation->propertyName.toLatin1(), propertyTranslation->value); } } } @@ -1123,11 +1124,6 @@ ReportPages ReportEnginePrivate::renderToPages() m_reportRender = ReportRender::Ptr(new ReportRender); updateTranslations(); - dataManager()->clearErrors(); - dataManager()->connectAllDatabases(); - dataManager()->setDesignTime(false); - dataManager()->updateDatasourceModel(); - connect(m_reportRender.data(),SIGNAL(pageRendered(int)), this, SIGNAL(renderPageFinished(int))); @@ -1152,6 +1148,11 @@ ReportPages ReportEnginePrivate::renderToPages() if (m_scriptEngineContext->runInitScript()){ + dataManager()->clearErrors(); + dataManager()->connectAllDatabases(); + dataManager()->setDesignTime(false); + dataManager()->updateDatasourceModel(); + activateLanguage(m_reportLanguage); emit renderStarted(); diff --git a/limereport/serializators/lrxmlwriter.cpp b/limereport/serializators/lrxmlwriter.cpp index 2f77dd1..84062da 100644 --- a/limereport/serializators/lrxmlwriter.cpp +++ b/limereport/serializators/lrxmlwriter.cpp @@ -232,14 +232,17 @@ void XMLWriter::saveTranslation(QString propertyName, QObject* item, QDomElement languageNode.appendChild(pageNode); foreach(ItemTranslation* item, page->itemsTranslation){ QDomElement itemNode = m_doc->createElement(item->itemName); - pageNode.appendChild(itemNode); foreach(PropertyTranslation* property, item->propertyesTranslation){ - QDomElement propertyNode = m_doc->createElement(property->propertyName); - propertyNode.setAttribute("Value",property->value); - propertyNode.setAttribute("SourceValue", property->sourceValue); - propertyNode.setAttribute("Checked", property->checked ? "Y":"N"); - itemNode.appendChild(propertyNode); + if (property->sourceValue.compare(property->value) != 0){ + QDomElement propertyNode = m_doc->createElement(property->propertyName); + propertyNode.setAttribute("Value",property->value); + propertyNode.setAttribute("SourceValue", property->sourceValue); + propertyNode.setAttribute("Checked", property->checked ? "Y":"N"); + itemNode.appendChild(propertyNode); + } } + if (!itemNode.childNodes().isEmpty()) + pageNode.appendChild(itemNode); } } } From 7928796be4067e1feac7916cc68dc8371f1275f2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 7 Sep 2018 00:54:32 +0300 Subject: [PATCH 207/347] Demo reports updated --- .../change_lang_from_script.lrxml | 134 ++++++++++-------- 1 file changed, 75 insertions(+), 59 deletions(-) diff --git a/demo_r1/demo_reports/change_lang_from_script.lrxml b/demo_r1/demo_reports/change_lang_from_script.lrxml index dd97e87..d09801f 100644 --- a/demo_r1/demo_reports/change_lang_from_script.lrxml +++ b/demo_r1/demo_reports/change_lang_from_script.lrxml @@ -5,76 +5,82 @@ page1 - - - - - - + + + + + + Reportpage1 - + TextItem1 - + - - + + Reportpage1 - - - - - - + + + + + + Test - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - + - - - - + + + + + + + - - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + @@ -92,7 +98,7 @@ Dialog - + function OnAccept(){ @@ -106,8 +112,18 @@ comboBox.addItems(engine.aviableReportTranslations()); Dialog.exec() == 1; - + + + + + + + + + + +
    From 4c402e982643ab5a68089d4fb9fe0982d0ef63f4 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Fri, 7 Sep 2018 01:03:33 +0300 Subject: [PATCH 208/347] Demo reports cleared --- demo_r1/demo_reports/1/111.lrxml | 143 -- demo_r1/demo_reports/1/test_js.lrxml | 139 -- demo_r1/demo_reports/1/test_js.zip | Bin 1304 -> 0 bytes demo_r1/demo_reports/andrey/analysis.lrxml | 1646 -------------- demo_r1/demo_reports/andrey/northwind.db | Bin 925696 -> 0 bytes demo_r1/demo_reports/andrey/test_dialog.lrxml | 66 - demo_r1/demo_reports/pu/database.sql | 76 - demo_r1/demo_reports/pu/database1.sql | 123 -- demo_r1/demo_reports/pu/mylite.py | 46 - demo_r1/demo_reports/pu/out.db | Bin 22528 -> 0 bytes demo_r1/demo_reports/pu/test.lrxml | 1525 ------------- demo_r1/demo_reports/pu/test1.lrxml | 1953 ----------------- demo_r1/demo_reports/pu/test_new.lrxml | 1953 ----------------- demo_r1/demo_reports/pu/test_new1.lrxml | 1870 ---------------- 14 files changed, 9540 deletions(-) delete mode 100644 demo_r1/demo_reports/1/111.lrxml delete mode 100644 demo_r1/demo_reports/1/test_js.lrxml delete mode 100644 demo_r1/demo_reports/1/test_js.zip delete mode 100644 demo_r1/demo_reports/andrey/analysis.lrxml delete mode 100644 demo_r1/demo_reports/andrey/northwind.db delete mode 100644 demo_r1/demo_reports/andrey/test_dialog.lrxml delete mode 100644 demo_r1/demo_reports/pu/database.sql delete mode 100644 demo_r1/demo_reports/pu/database1.sql delete mode 100644 demo_r1/demo_reports/pu/mylite.py delete mode 100644 demo_r1/demo_reports/pu/out.db delete mode 100644 demo_r1/demo_reports/pu/test.lrxml delete mode 100644 demo_r1/demo_reports/pu/test1.lrxml delete mode 100644 demo_r1/demo_reports/pu/test_new.lrxml delete mode 100644 demo_r1/demo_reports/pu/test_new1.lrxml diff --git a/demo_r1/demo_reports/1/111.lrxml b/demo_r1/demo_reports/1/111.lrxml deleted file mode 100644 index 4e82ef6..0000000 --- a/demo_r1/demo_reports/1/111.lrxml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - page1 - - - - - - - - Reportpage1 - - - - TextItem1 - - - - - Reportpage1 - - - - - - - $S{intTest();} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem2 - - - - - Reportpage1 - - - - - - - $S{stringTest();} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - - - - - - - function intTest(){return 42;} -function stringTest(){return "testString";} - - - - - diff --git a/demo_r1/demo_reports/1/test_js.lrxml b/demo_r1/demo_reports/1/test_js.lrxml deleted file mode 100644 index bb95b22..0000000 --- a/demo_r1/demo_reports/1/test_js.lrxml +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - page1 - - - - - - - - Reportpage1 - - - - TextItem1 - - - - - Reportpage1 - - - - - - - $S{testString()} - - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem2 - - - - - Reportpage1 - - - - - - - $S{testInt()} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - - - - - - - function testString(){ - return "Test"; -} - -function testInt(){ - return 42; -} - - - - diff --git a/demo_r1/demo_reports/1/test_js.zip b/demo_r1/demo_reports/1/test_js.zip deleted file mode 100644 index 8f51201bef0082d6d0097168b78b74d51efa9aed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1304 zcmWIWW@Zs#U|`^2P%NM2(;cO^x`Ks)Azzw-ffp!Rl3H96pH-}vQ&f?g^ET4E|FVI= zzVG2Kjm$C&`j^^Vc0CZ(cx4l}WZ0R`1H>R0=c#H^LW)6SW0=H=pG^_{jY@%N0N$4yno zSf+S=z0TDp^W@eO@c>&}0j+~e^Cvuhyq#yQW?AsH>~opxp1qjhB>4Py-nqFR+nSjV zc?hu1->}W~w7+K^N6)K_l9GG(JN}363KM+G_tDR2xyV=MEdI|7+8a+FwyO*i{igDw zT2X$vqP~Tt-NJPT*4XXMo>bGiebu!Ser;(oT4!>MN~02ARQ$3q6MduIqnqmUcEE$WV8_A!Sy+Z@*6iZd+to2V{*(uw8OmUJh^)q;B(9(7ON7PIRy*G88*#YqmL zp;wRYxMouzAwF}_M_<2^bdmo;mxA8u>}cLHU;EBwjWDgosgKwH5X!xORP#dAiRz&E zz(=NCH6c@#3xXQg=eIpx_cuCm<)quy-~UG(7Kum_P+*i@!QrylWJxGbgYV>7>FJ?U zCO(QU-Spkp()Y&s>Dz7J#d9`gyw$W{r=$L)<~s|!=XAxQj$5Is-&V{lIvIP%{2|w? zWij`U?3ePF4OQu=6#3r!q>Z~~&g4%V+su#oIEuG=wU-_(y|HVO<4%^U-Jcy7Pu;ZD z^vvsuX-~I(v0)Zm`sexXt3?;DPMh<bsxaTfI^K<`vzehf`x`&z|O@akTkd!NS=t=_W^Kze}+7jOAjA z%bV-smKyZ-znyAkWz&vrhZ0-UCQD!Nbv_c z?TDgjC)!@#`z4roqS39R=i1$Xg%56vT`_HXneHp?aBahzVu22u=O0vP zU-r4Q=X7Jg8pEcx)+J|h+3%gS5o=XU+0$cfGUbK1$~~@wvoF~h%i7K7-TXeio-x3i zk;$F`S0SYWET%v}0ZgJ5SzJ(IMg|E6gZr=7h2Fi)`1IlnFg=B#4onAlv$BEoG6G>d LkX{Td{}>nmapY1D diff --git a/demo_r1/demo_reports/andrey/analysis.lrxml b/demo_r1/demo_reports/andrey/analysis.lrxml deleted file mode 100644 index cbf59fb..0000000 --- a/demo_r1/demo_reports/andrey/analysis.lrxml +++ /dev/null @@ -1,1646 +0,0 @@ - - - - - - - page1 - - - - - - - - ReportPage1 - - - - ReportHeader1 - - - - TextItem1 - - - - - ReportHeader1 - - - - - - - Комитет по здравоохранению Санкт-Петербурга -СПб ГБУЗ "Северо-Западный центр по контролю качества лекарственных средств" ( СПб ГБУЗ "СЗЦККЛС") -Испытательная лаборатория (ИЛ) - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem2 - - - - - ReportHeader1 - - - - - - - 198216, Санкт-Петербург -Ленинский пр., 140 -тел.: 376-94-98 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem3 - - - - - ReportHeader1 - - - - - - - Аттестат аккредитации -испытательной лаборатории -№ RA.RU.21ФМ18 от 23.08.2016 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem4 - - - - - ReportHeader1 - - - - - - - ПРОТОКОЛ ИСПЫТАНИЙ № $V{NUM_PROT} от $V{DATE_PROT} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem27 - - - - - ReportHeader1 - - - - - - - $S{ -if (Dialog.groupBox_TypeObj.radioObjType1.checked) - {Dialog.groupBox_TypeObj.radioObjType1.text} -else - {Dialog.groupBox_TypeObj.radioObjType2.text} - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem28 - - - - - ReportHeader1 - - - - - - - СЕРИЯ: $V{SER} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem29 - - - - - ReportHeader1 - - - - - - - $S{ -function GODEN_FORMAT(){ - if (Dialog.groupBox.radio_GodenDo_dd_mm_gggg.checked) { - return '$V{GODENDO_DD_MM_YYYY}'; - } else if (Dialog.groupBox.radio_GodenDo_mm_gggg.checked) { - return '$V{GODENDO_MM_YYYY}'; - } else { - return ''; - } -} - -function IFNN(str){ - if (!str || str.length === 0 ) - return '' - else - return 'ГОДЕН ДО: ' + str -} -IFNN(GODEN_FORMAT()) -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem30 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (!str || str.length === 0 || !'$V{REGDATE}' || '$V{REGDATE}'.length ===0 ) - return '' - else - return 'РЕГИСТРАЦИОННЫЙ НОМЕР: ' + str -} -IFNN('$V{REG_N}') -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem31 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (!str || str.length === 0) - return '' - else if ('$V{REGDATE}' || '$V{REGDATE}'.length >0 ) - return 'ДАТА РЕГИСТРАЦИИ: ' + '$V{REGDATE}' - else return '' - - -} - - -IFNN('$V{REG_N}') -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem33 - - - - - ReportHeader1 - - - - - - - КОЛИЧЕСТВО ОБРАЗЦА: $V{KOL_OBR} $V{ED_IZM1} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem34 - - - - - ReportHeader1 - - - - - - - Дата поступления: $V{D_REG} $V{VOTBOR} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem36 - - - - - ReportHeader1 - - - - - - - ВОЗВРАТ ОБРАЗЦА: $V{WOZWRAT} $V{ED_IZM1} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem37 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (str.length === 0) - return '' - else - return 'НД НА ПРОДУКЦИЮ: ' + str -} -function JOIN(str){ - if (str.length === 0) - return '' - else - return ' ' + str -} - - -var nod = getVariable('NODJ').toString() -var nod_dobav_reg = getVariable('NODJ_DOBAV_REG').toString() -var nod_dobav_analiz = getVariable('NODJ_DOBAV_ANALIZ').toString() - - -IFNN(nod + nod_dobav_reg + JOIN(nod_dobav_analiz) ) -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem5 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (str.length === 0) - return '' - else - return 'НД НА ИСПЫТАНИЯ: ' + str -} - -var nd_testing = getVariable('ND_TESTING').toString() - -IFNN(nd_testing) -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem35 - - - - - ReportHeader1 - - - - - - - НД НА ИСПЫТАНИЯ: ГФ ХI, вып.1, с.159, 165, 175, 176, 198, ОФС 42-0022-04, ОФС 42-0002-00, USP29-NF24, ГФ ХII ОФС 42-0067-07 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem38 - - - - - ReportHeader1 - - - - - - - Натрия хлорид субстанция-порошок, 1кг - мешки полипропиленовые - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem39 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (!str || str.length === 0) - return '' - else - return 'Номер заявки № ' + str -} -IFNN('$V{NUM_ZAY}') -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem40 - - - - - ReportHeader1 - - - - - - - ПРОИЗВОДИТЕЛЬ: $V{FIRMA} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem41 - - - - - ReportHeader1 - - - - - - - СТРАНА: $V{LAND} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem42 - - - - - ReportHeader1 - - - - - - - ЗАЯВИТЕЛЬ: $V{PST} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - DataBand1 - - - - HorizontalLayout17 - - - - TextItem9 - - - - - HorizontalLayout17 - - - - - - - $D{test.pokaz} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem10 - - - - - HorizontalLayout17 - - - - - - - $D{test.tzn} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem11 - - - - - HorizontalLayout17 - - - - - - - $D{test.rez} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataBand1 - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - test - - - - - - - - - - - - DataHeaderBand1 - - - - HorizontalLayout16 - - - - TextItem6 - - - - - HorizontalLayout16 - - - - - - - Наименование показателей качества -по нормативному документу - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem12 - - - - - HorizontalLayout16 - - - - - - - Требование к качеству -по нормативному документу - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem8 - - - - - HorizontalLayout16 - - - - - - - Результаты анализа - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataHeaderBand1 - - - - - - - - - - HorizontalLayout14 - - - - TextItem7 - - - - - HorizontalLayout14 - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem13 - - - - - HorizontalLayout14 - - - - - - - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem14 - - - - - HorizontalLayout14 - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataHeaderBand1 - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - - - - - - - - DataFooterBand17 - - - - TextItem18 - - - - - DataFooterBand17 - - - - - - - $S{ -function IFNN(str){ - if (str.length === 0) - return '' - else - return 'Химик-эксперт ' + str -} - -var xim_eks = getVariable('XIM_EKS').toString() -IFNN(xim_eks) -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - - - - - - PageFooter1 - - - - TextItem15 - - - - - PageFooter1 - - - - - - - Стр. $V{#PAGE} из $V{#PAGE_COUNT} Протокол испытаний № $V{NUM_PROT} от $V{DATE_PROT} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - test - QSQLITE - F:/KALAB/forum_limereport/northwind.db - - - - - - - - - - - - test - select * from test - test - - - - - - - - NUM_PROT - - - - - DATE_PROT - - - - - LESJ - - - - - SER - - - - - LAND - - - - - DECLARER - - - - - KOL_OBR - - - - - NUM_REG - - - - - D_REG - - - - - NODJ - - - - - WOZWRAT - - - - - REGDATE - - - - - VOTBOR - - - - - EKS - - - - - WR_BAK - - - - - XIM_EKS - - - - - REZ_AN - - - - - REZ_A - - - - - - - - - - Dialog - - - - Dialog.exec()==1 - - - - diff --git a/demo_r1/demo_reports/andrey/northwind.db b/demo_r1/demo_reports/andrey/northwind.db deleted file mode 100644 index 20b7fe9db3f9604032c77e0680f214db4c23b54e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 925696 zcmeFa34B~vbwB==(Tqlx#;ZJ*Wn0gdYBAZFWM^fB%KH(#L+^ zbML(6zPp@zwtL^$O#|s-$~u?J&m@ahP;+Ryt{t^3P1BBQn)v|m)xdj!2k~FWfBSDK zZRf4Tqgtzes>=A3W*Sb@xNIIVoQ6|3%y1)bIy;%VG?^+)4@AORm%X%Wlm-Uw7+KT$Ic9b=tQZ>#H|3zFpzY3|j8CD!jv`ZoWP zgkIXcQIj*k!b4dH^puA%XL)@<&4@`^RybqaLx zN>)+%l+0@yaXG!s&HCvjMY^q!x^pg-olqrQNbX!#2=(6fxsBQ6OllueP3G@u_;)Au zq^UJddg0WPn=gCc$EgO&)?Ryqr(Jiks)MGP3YWLKS}z@1s5q)4YuPP0=f9@X@M@!I zr)MlY?f+{tHI?C(W#%_=G(KVeoB7Y?56$m!5;?1Xt2MA%1OH2EzzAZf8&wV*Dosq} z_ZT?btykdn%FSnL=8w#8n1615*nGSBYV*a&Sp8eAfz=xLZ>fPbX01M!N}kK*Cd-K) z$>%2LCQ`0-W`jPMN*3Eja&wtt{<3p}*`)X6lj&@sts|9BB{PLG%IZv}^Or4oRk7e$ zYu4)>x$L>r1j(TV(_`+W^kjM_l`R&GDzi>+PhCjmlT#3HY5uP?|A^jm$Kw2Ne%<`C z`FZezPnjQ=KmNB=#Ogy$2 z%8G14@z-uK!+PREt2LP`SOar~WO6cD*k=WTYvug^ZF})Qv0hep~nuvVrr)@(ALvQkCsTsl+e&Vyy;)9?>l9dLUm=PnH<^XF5=bau)bOlD!r z%m+enI%kp-DXTw|Je$go74yl$+1y-yDiZbie7FN#%duE%#MkN%w+8)-WZ-URrT4(j zaMSiGZ|%;V?E{J9W9^ybTq0eIeDI%NO8zFBJ2wRyc}sWv5f=nMf??i}a)rVUfM;iv;{FzE~*YQ&c<3Td+4ITSj_G{5fcH&W_HV=aNt7@#iSPpa zl20OHfqt61P`H5l$XZrxfMmR}mUuX31p;FiQZ*xPq zxu&Xiy%34f;p5|pd=6!>iqk2pHTm1*VLIhQ^1764_!do6e!8 z^Qmmk8c(9-^U37$?BR>qRDLj7Orjnzv0*;*2L_Xu(i1tWv$ea`7xo2$gDFZkhUKG! z@nE2|)~NK})Zp#m$2BB|662!@RO@(t?v8XOle4;JsOL>4X|lX*O{X$MEj@#uo47EU z#Dto%GD!>Obu>+JZX%t`qNW2YOW|K$icmBVUno&D6uzuidV>vNQG@PRU!NH0?(a)v z&Y=het9!194s{;wn?i?AC#?jAM*fDKZy0?(Wuezo-$O^pq_h4&z!$fBUeMR#^F>3! zfZr#{NH`Rx@n5d(MWl~eYdpvB>JMr^*M18b*Zo~wTj_0SXb#t{ud5MN9m9izeI4iy z`3Y*JbT*aF=SEVK`J9zFhuX-={*fpYa;TJI>PEuHSTYArG?&SZjrhVSSBozcY|kgJ zq%)0vyQ@S((KDV(Z(E(Wp}MNNzP_rXcX(v1V>&n6QkY9!wmPQq=tAmr5`5q!4%{@o z$+_7g55hnk6_E}4{OJAZ;uTa%GCS!Dh4HK?y?$w3Ri!u4+;%|rg$_inbaY@e<25F7 zGby}WGJ`%iQA}N#n@KVYNf*$)I;Qcg>p0L@8i7CA zFuSJGE84^zd6eJiM0$eaqtG1-(-(93;`EK!L3eU4Tg+f+qM0C& z&J`p>=;{bq;i2&*48b4pV^mgDdZTTAf8F}pnx>}q;qmdoc1%&ZnU>C6CX>vA%@e~f zbY;?4z}}0~)<8Ntk;`Ng6BFQ4%VvV0HC{+wB>6XMwP!9&wk{;wJH`XuR%|fT!R^x+ z@r5L3;4!(73Sv~AcUO9ATfE^qIWvJLjkF`KD>*wmkemZo!bCHWI-5pM;7;cc?6dNi zo)98twddw0rZG%W^;P-`gM8uBfY{tM-m-Xp@>1Qy_>w;$;1 zY)@v=ljv%8qvuo9?r4A9wFo{lmYYEj*t@JS$GQ@ z<8m~CGg+~~LMrY@@1*hXLWrN4HGW`RGRpPe)LSXy?^ofkw03i)_xMh~Usg(Y-`H4! z4_0^bEP8#?>dS&Twp!?X6VvI5X$+0A)JY< z^>*bk-Ox-6DQPrEEX^8BQ9_PFB@ZoC0>O^1#Ax8pfi0$!QOvq6!B8M<6Orsjdb4`; zKbriz5@X{XT}hH@q)e65jaD}=mQOp)={Sp4qwmEJ=Q!3H_ic8(@GIy>`8 z4A$(~%v^Dqs5f>2++(;{%%oFiZy;)&g!?^}znGe`0{#TwAsp~U7UaA@2y$L9?hgcg zOorp3K&-TO9hh8mxJOoV$1oa`WQQC^Iwr|UNLiUl)aDW<*PhQ^R9tV55><$PgZ9>!%XR7KM?i?QL$&qN(ftj7ersOP!BGihcCFlR{eCl#OwX7>*)Q!?~ zn%jrjXe@OBEHN4KVExW1vbysK z!o{=?K`5EWtdzssf(1{_rLHWihGQshdd8wD9P%oT*;XqU7)V1)N%}D)M=+DlO(h}z zG+DuLs3i~%hL+Ib%e9r>CJ_!2Kdi6s9!(65@tiW92H%?n=Nn1pAiomV%NNt~(aSr{ z2^4%VN28`4qACQLU}zlkcs55;fv*phblK4ip&*`=7Rj9_$6HfL2!3Jv`7q+?~suw{jEH*14qB+m2_UItMVvL-1k- zl{^pq3tbILKnSdS;(ThXB^H9F6;;YtBu;!6X)ukF;e}u;qKCY)PBG{A-~k9ax2B-A zLR*9=foDLnL6xD@$%SczW;~phASuotL#<-&n=2HOBz;)pxHy|k50KmujxX@T0My<{ ztDlaGWK_=ootpU^bEEMf^#9wnKhZiD2LF>HN?Jpux2vVOrFwf+?e@Cf<3l~ey>rIoSQ(KDVY^LaiTv3by~fQtt!NT>gAV zt`+p#US~+hA$)ZV1gH-0xlQ-PqJbMd(mP=*V5pp}+Ud%wkYL zJ%U1cI#PrA`Cfr$Y!D=Js^n=9ZOVSfapI}Nd`*xHquN@s^hV2u!MEj84Ys(P^eW1t7Yc13iU^B8p92-8!# zNN?^UIJz~Ky$qfFI?fY_1_PKSz!Ibm(lv+SnxbwK@&%W5n<)CuTpbv!Xl~xl>UGcX z@zH@E;sUUL4G_o5Wx?hOi7e(h6d_wkO{^R@q++9T3#0^uLV=Ft%q-^T!q|u}gnDg> z#_X!Mm20$lK#u?Ont6}8-gq{~|0V4Q+W99n?4RmMC1W4WA>oE5=Hvriy@O)|scG=J zY=J8jDm$8MG?j%Y1cA0tfOY3aqjNAh1tUS0M6W2b{d02|*~!*HnD)Yfn9bB9VCsQT zI1ceokrsP zj42W=CZ?h9pCr!Tks|H4AbHj}nIC5$e=L@2VN&pe*IUEM^TeS}(BwXc39`N8M6lZm z^!r!pyKHt?(09r3aHR>Hs!2p)1jQ6TkQhw#4J56ZWE!)ZHQAadq*G7;n9+tBWiOBhyg$ zX2D~z@JRJfw1G5p4JPN#rZVUmtyY|rIdGrsSy-U`p=fkLHK3Wo7sr?^X?s|YLvHjo(aE3iH{4ox3jp%)T9OcI^1HJU3$oE#p zug5qzvDx(N;kYu$pdTd8o=sj(9j9#DPBTZQ6*S>QYMky7#njrFJOP_hTJr1BTJr!q zP5Zz_r4oUL#pD+9hi};~ z%NN9=sDpFoNFp7`w)T+QcPR(h%ddK!A*^DP*`lxXl(^{q17TS-GHyY7$Yqbw`v)S( zh7*O2jgw^e%#%4F&bL`H!C6$U04&Vpp&&j6Mik||m_G^|aRxWFI`gdw@M+Li>MjY#rKe9?>6H0@%6LjO#b% z4UN>pp2)JWf!=kcP})GPi6$7K`bUZF4jFEtH;KhjQ)yIHVFLVzisz%^A^TYB+&M5K zR0Kw;eNkYLYANnR-sJQg+(&dpFI|zyfXTp&%=$LVVmT=KvAF**U9n=uucNA=ypG%~ zBdwhe>IvT<_15TeMx^4~iQt%lyddDG&&!J0%!vi$1mRpU>spDR69^Fjuyv%;H zgLqR1v056;P}X4ggN9I;hAqRtztv3Q$0w_-)CbJ;!s+29x=lOGns9Ge^^tH(JZ24G zQp|xXrJgJgUDlfd_aN~i5C}Dz$MwGKRIAkkt8VfFIZH9w;~iq*7`XNb z1UDG9S`ra@#T(n6wn_Q_kY+w;eA_sse^&3&KCT^ll7qVB4nlru3i`L#kPtiAHQF@- zA%)@#$ifG+Ne@9SBuVKF} zxKiWp{^67?Sw`2G7NyIT9T(ZsZ0)JKN-c8LqQR< z(=Cv*3RXB6XwT1Gg4CTVw72;EF<*NM`u^NZqmPtCpC7gz=(o#Ku~LPfOdxFs$V$3% z=U}2Ikzh3idP*7=5MFyln)GOTE}KT&MLKr@qCC=YmS-|c#Cav!k)dv2ZZda)oY`se zL1G>W1c)yrXL7J8+txZb?;;_1dVD^c@|ScUjNJ9Yzg_A$!$VyoFbJm#Fu|f%kTq#R zk0$*IdPW8nwM?A9eg-4sB#EY^zy|zrsoyBOM?4%2F4{ffkx-=MX(PLb_dv5CHGZIP zXtKfuUDO6}myr!ZLFOo|6;|xva#qfOkDt>|<9uI?xnqv6vj1gYy&OI6Pv- zB&?ObMXf#t+i9pJ96^vnqom`(7PwXSw8Glf>`ymT%K{A~#s>OeQy80@MQ8@ZK+K8C zqSBMYP|T#RTyNyCIop$CRj@SU)e30*Vh+4384UYkiv@)?7!3MbU=oCvNz&0kIFe~W zIUAr1vH4-3YkUk^aogj~OM9XMjo*OuQ1+jJZgN#_>S>Yv)tTjwwPV!adXPN+kAofdh=c8ADe$+e&9q5SAzG35l?YfI)p-k!$savoFr=SUhh}Ul`P2CToZB5ls6K&%@}_7?jFtzLnl)MMrFGwuBk^=qU@mm-LS8RF#}ZA#Z?-&CV7MQ1MoBQa=g7J@ACXV>FXPXHZ7f z{q({xXQE3`^p;a5!IAqB*pct03RO=O6BQnz9Cx2=M_Q$zOmoFL#(~Ze?_bo6lS3)!RlT9!SqwCv(}U zAsYPy=_}Sy`cf`CNM~abUt*lzNezvu3l9RTK>>9tp3K0sK;EM*@+$N!YBI<_*~z$l zm2Gn0rLH3Pl8pT*w{v(-Crgi4T?8v8tYGjCkJC6ph+GjJ9dl(7uJr5~nFlrh3dL?g zvdE^}`9g}JKo^A<`bsCM4uj;wga;=(g(Eo^Q41r~+hJaZ_}_OHbv;IfSmt=FrCJzwR`TthUe7?EHDCpnO3);VE zw?4sGeJVedy!#Q=6bv7d(RCwTqkSEiTGA8bytLz*CNgkYz(#oko_!(Y4F_>Jpvp$!NX5IOY+4 zV`>^1{}>EEBV6gNZ)#StIYYyv<6}e6d8XUoU`2rAvSF*rVw?T>4BHM5Rm{3+E(Ki@ zL259=%UGPTlTph*dS*#X6ygnn3$Zu|_3-6GsF&toJx4lJ4Gxd?^n*D=N0o6{J*fhM zvCroU#l&)17c-{YVf~u{ry6JddM?W80NDD+PzAbBB zucD48W$Y#+#0Jbq#Uv z1%rn1Vmi58Lb^d;OFW*9dU=3jEQ&6-GQbh$m3YZ>2m`Ohe?Z0^pah*=C;_n~;>9af zrt9CBBM(S6$fnO>CV^?2tZISlA`k*W1ouRuc8s|lbbv6(z(NE9f)v8fI7k6#VHxsO zg)I(;`bHp1VqZc;oJt`cZldX2VWmWWqyEr!L(`&)`HF@k%VWMGFkA#f=>xEx)QkG< z9P&BR*U>RNl15M$V!LQL#th~F4!4wQkbJ7`5?nMhBL52c9ufRu$9+b^kw6Q~H<-sH z5hVG4pZ;Y{|1x}hr;KUig7Hk_WyTwfx54Z8u<>Ezs`1yx_f1XzcXPeD1Dkm6g%==U z_M0b+cKH4B`q#~S&6n!mH|mT{=4;HiLhpYJdj@^h{EGP<^Ph~Cr_LQ#ulO&k0d}C0 zsscT>kj|b@pP>Zeg3ps7Zhw~72aXz($p0mWyF8I#2`8L3JUb6OqRg0y(II{ALqf|pM zD{<&d9Tfx$OcLVhPI@|ppf%7V7MSW0stAq;+fAjCF+LUv+9V2|Ux-ZEN0(C+_9nV~ z!9Bl+#Pk)m%{Drfq`DYAUQOR2Ub0VC4KF=M@{etcCw38h#QZ4s5Br+=1H=>jIUcb3x3UJPnKQ6@ z+)7>UB6h4!DKvxnz0b0?|)j1@6#VF@pupl&e=eV}lh zP8fjPG)`H`JmQDO_|zoDTOE98! zQ>T$@CAwHeUKZcivG{BGBDq;Tg5qs!=n;4vuZVO~$skI|#WC&`B{No}%@t|311@=! z{d{ZXHVV??WoYq+MRM!HJH?m2s!wY6Q>3ML@j8z7>)&nH^;w7LCieV#fNruZ>ayO> zSukL>ENhCj%Tm?LQir+DWr+L^vg?gOkdw<;UGzROT)UPEU`JOq(G3<>I8{(;A^vMG z-C{BPsgbI3Nw8Wo>HpQccv3nOpIajhSda!kiv*5s1V-*mZvJK?lQ?}MR?7AK#`&7r7m*U`Ri$Efe@p^gI%ZPiVduQ#Tq-8f5w1b*68f0yQo|hQK^Vlhqm_!sGDG-I_ zR`>;P_0qWe8wA?iSmTIsBp|J7wKa}l2`(UO=Y9_!SNjM6*+ zR>t8hnIfjoq*n*}V2-89^e*jA{BpHUs_wo>;Ot%Mva=F5IZ&%0YI2PF> zrW8Ug;>B~9Z12M20~dPX4Wi#zj2|3Fu(QukRt|(bOKuX5VF}Sf3X5KX`9Z{N)U_Sq z;D9PTy1kDc-JYI;mn{WpW6_ndU{_M_`nd6Hw&=jI0kQ-OYa)UXTHHIp>;-FSYiirt z#*UASc4BZ-1T7*fVQz(Pz0zTDJ$t!PAk%`@(%ypgN{gWyw8kxfRft$<6F|^Lqi=bJ z|DJv<#Pf>=4)Sjr8yV;u9h-&O*BV9W3VbkVgguDcNL}y8UB-S!T89yIpSwhyTdGVa zPsdeNJYYdaLIWL@y=~+ZPEZeHqzD6iIr%!>Dii8Yay?5$u4#W z)h5@4Z7vw2BTJ0Y(bjO7H@@((G1^WBd?f$Z=-<>3>(_0ZG|n6Mz_0fv`1L+xd;@yG z&rK*O#xD5v(&jUb4dyG%hs{r#e{Fsrm#qH%`YGv_j`RyTrh5hk9rBC(sv5w8~Q z49f5qvYMSD36X?Mj&KadPO>aJlbkAKa#Il3LSc6JEn|Dbq(v`Xm9dYWw_;-sXpH3a zToNBIs07zLG-7n(vdt`Xy8qIl)=v>_H(uSz)`X?YtgFd&{5U4ULsU*x2lm3HUF7Az zK~PwL?(;Z1JXBG9<`X&r!c^iL&)4nbDqLx`Jwi`=oFFg`ak#-s&RVLbrGj-IWkA|r zSf|X+#iffBw@Clryk?#={=zt~|1R??2c zE85`q%XOb8`i8p3(P{IfSdA}N2d|r29IEVsUQ6M7r%am1KR?^cz?CrCJ<>2 zMQOhyzi*NB7sfIBG}My|68go7zK-!O+R<$rxlZWJ#6OGa8-EgQi7Fi^t(_@IxtQW$|TH=XBcX!u`B%-8tzcZGg|2#Zfb6m0g%|}P$K?oT{ z(ee$ut&ATD=H@v;z|JQ6B*AUZli*e4FHLk$^|3c&C*bCro#(QA@|Ag^bcmTcy%iq77PIDdN{C1nI zX3T6i2VnWT-Mqsrnoq~>K@Z})A#XAtGT(3h5xyGmdGqV|j?h2i8*i*5igy56&lK%JvVkbx{bVCkwA;!i zqIj>DYNlu#8s0${TLSd;csY+Y2iU?C?N3l+Q=@Emgz+zU7y=g{k3zGl`pJ z-oRl08K!#s#yd_kg_ZezrW!&MSYkt4*Vk{yK44Y!7mZ#_ z-Ek42AZZSrmeJGXPo)2WTM$wM~ z(x5*HUF3Y)vd$#$NM4zIocL?Lc!hDnc4zva^!Ni?`ouVbva_bt7Ym&imF!50ov{Vh0nsmJ-M|qC1 z|3@qujJ5rRtM9t{n0+zP$i46CJM8?&uD&0odFa{$xayrK53a_Y z9=!IvtM8^lU44(rfB4!wZh~Tc=-TseS3dFT!{@e@X=BOo)i>c z_GuqlemOsF#VwKdzB{*;X^GozyZU<6%i=3Mf}*LmxcVx*#=FpdkF9(%PO`4P6aP?5 zRN#|7v2>`$rNv9fOJ&rSxD-u|+FWS;t8e7K^AK8Vp4;V76!c+w`opN(_oD_MLEpgn z4_W)I3V*9b9Sc=_FY@1KH7-5x+Ka5KFKMzW0yyc7+>_{}cVBxRUq(+y&!cvyC!w=E zpYD3?MST9_{#v?yi%V;nFDr?wuSIvJj-tBA4Vn|ZlR6zv!XqBS<34chdFWj9&fFs? zjZ&{X2^Tz@x(1CP`uRiLvmQg&MJJXQzSp|?Ufl6RDDeGPA8Ms%|L1Rpf&F?P4zF#* z0kR&BhWT9$U;h5C`D62|NUr{&1|Gb_aE2ee^}$;)KCb6)ujAhOPHsEyM;5pb+J^=Y zMhRG;g?4|Kh->$%(MCKBJzp{|8nX{`ixQhce`&S2b6dE_2f>Z*qs!^0#7*Cejsq@s z?S;gx@Hljo58`UNnPP6l8lUKSC;~n2-Kr=L?Xz(0JFYz!+*FS24_^HM@~HHWV$|W@ zJjx!T5qRx|`z*em`y;X1chjT!R*&E!Dh7&k?OvS4)q*jLLHHovig+Y-?;BUq!Yfn9 zel{NdFhtQ1{^!E49De2S4J-aNRI~4(F~!d(UXEAC{lPS@-G@9HM<|a4c2CuYo8G7v zRoUoeh^NV0V2~}T&g)tTuZPj8>JhCiDHLRpp*%(d`1<}r*`uf_YP9#D5$@v(A)b$# zWR8an*&FCysCzCKv6_XS(F^R-U3(Gk^=_QP{v`8%5VUc~Bt%KV7=I~2EXeqogftk%G44g4zA z00%kq{wJv-hxjM3ZAI#$LGi+ByR@|wAbbp)0j0B5E_0(ko}O7lVd1oag`0jG#Zr!Z zk>iN5w6d?!Z#o6JYe&-^OA`D$5KYvBKO4bT|JMu!uK$>5>i zJx99^@X*J4dfF&tEsgVbtT$$#=NPtMpXMzBI&+f+{y>YHPM|L}xQLOoV~r@nE9~)) z`TsHVW9DZt`@h@#7W9BG{ok(d)wf@*fnT*6AnzSwjluzrm!Ms({TxlfAGhPE2Ktnm zkH!VvIF!XFY+((LKn>+j|5wNh}!eDmg>qjYWUy<6_vgPR9#zB ztJmA}g_IhXIiCD+gqHhoIX2SfYKymExz-aD(%uh)JK&OqSD{!4ixsf_qAcRr++}Qs zsuupJ5~6(qt)-o=jaqdLH87WOW9@cSCQWTpyuDGx9A40e?*X<3RNEpLGZ6p9g;XPE zNg*kYG=ykUSw`B7CW(oZ>32{M3g^d)ynfy6PomtgF%M7bas8$RDSe5xPSF zA)DAmzQynR1r09iQVsGY#SGCO))~lR!WoJ^$q{9V71@ygsWMR;!B&5;mBv5z_Js}5 zc)i*GRL9!t`Tq-QptN<(M$Nl%C&p7Xxxm4kw(IpQLPCMWCaM{D!V!t>k4G`e(LeDO z8S0$y?PKxe6AW~G+@;9OF|?dH2Juz1NFd@5%HE03!O*U4{PiH(VJwCI83o_NQ1!Q# z8mnlq`%$><+Yzk1v9<;Si3DA#=Pt$pbYhQt`Y0hfH#jExcZ`aOAXo}Pc%owVCb7vG zwvTU57FtH}{RN&zWgv4bX2pW^&mRd!qlz)%kx;NtB`+X6TMi|ZlQ?H!Ehe7YIEuPc z7PS_9Ny+C*Lr+YC?_%diFe_SQ#_N3wMHCqU+VYjT$e4Vdu*kHKK&}a1EHvh)g+kNS z`1BVRmqrxB@5KJVnRE^dqbDw-&>>U~o)_cs@7MoUgU#0^;sy6kkY)I0AaX4xqnNSWbxg+4tKB<@ z#3BcO+`V0q!I*m+lZdyEx@(!l9O!dz1?h}oceaqbMv@TC+*^o*oa_s^y^2I}HcQfv z+-i`nh!4AFxi?7?34E&ox%h6JFMw?!nT-45?)5~*eIZ}iy^cxLNf_H2P;LmzZQULw zA)d$FRf-IU+?9&NyR89PPV!z1hB}ZTED;VM&Y4K8;fzCl2Z`^&p=2(QZp8M7;%=uT zvFg(e8^6~bius~pw?mO=A$+BSa&a=u{~*Jt-k@8TWGEP4i2vP-INie-x1)#zeh)?Q zBW8C=^gnj?u+*vmdyT+3j`)|c{tr>Kzr8MiR|+g$8^Eguep#J=^|?>I21wUrcENGD z%q=)Jmzf2}>tbAB%H#9=U=myFVvA&>!@n-%tfUlVBC5qVuN1ij6;Ar$9F$s=P z4-${ysP!PR2##cD4#Cmw*l^GnRss|N} zail%=zYaw?`rc2Bfg|#nFL0DTxKY^8k^9UQIGUgJZI19q6rV4|QUA;mcqKr@2bxz0 zFhk%K1K7R67w1(3%no>EL7cb&uQp(2z`8p2N%X~dRRXARNNVk2+>lo&b$Ay3@~QX2)hkwO;6Gmj z?DO{X(MLz4jgPH-Y~kZRJ~s1lFCUxeXg2au@No|x8|diR&BuB^?xJJaPCiSjI<=18|#68+_DB|99wb)%3UGn?F6~dzaMrZ624`8`MjB8f#)N zrLZO1Bo3L}+r40489+Y<+q5to+&I+&Fb#siS~gmYcbzytg5hR`R3%@L=m^^8yfHG z=^C|$hR3a;;{yZOW&IpBy((J1eRLv!zWEoQb{wDPz)p{_#PRy8>u=UdRzSWZzD|OT zYVnoOU-0Bk`uGCAEBJVK_G(s=H8*Qs%?z9rpC-D$DWJLxMw z3ulg|@I8)vYI1q**fhQ-aHC9GV{ey@Z;3D2@P}-vdvFF_I)q(J79T-5iAi|o3x(yG z{E4E4lF(_`s0T}rm!CC)?R}G(jvQ8@FFUtGeVmdq(HnX;qBqnSX>Ps=^7zZvD`>A< z)^zfxg_c9TFR4K42Q>bj2>CU)8@FQj@4NL)Pb&U*37dFgay9;!W4Ko1e>vK1HU9UP z9{;-{m>70{ZL9I8CPwiK%}QwWo#so7zr%gxi{~!v_%mz#i}5}4j5%z4 z&3rRtelJ!G{@DEX6OaDYUsr43zq1Bj0ehHH?LLEN9wE}B$3fmfWVEat|ht%K_b_2z!d z`3xfWo20P6l*mISh4E`F_wOGE^#J8=apgdc6KR>x0y$4)gZm92?@>)`iR{+C z;xmxgVY~uI?N#sreB1o8dCmMNzTES6^9}eWz;p0j@H_F%&(r20cKr^UP527vdb7;< zDeV7W!;V28#}~lffqjDc26U6vzttM}ud0EUyRas`xxRvi;I9$A_vaPupkK`N7v1Di zdOp+dc0UjFbD4gD+YkC#Oi!184)lFYA1l8H^wXJcD6a>7h3KZAyFL#3BGX^u(Nkpl zQCBtcXPJJb^8=t~n7-glf}Uo2n3+b3>6Ws$BR|RXhO#lxw-Vj>J;zT$-^}!%I_OcN$*?-9@zcnQB8b0_1))^W+d|$;^!al4&q`zK& zF}@o(tKY7V=tp%Qz9zU%*R&sKU)8Q^AI5hEU$4Cw4^)4im`gXXI6-d}4LxhioSvvk zw}^(_RlCbP5tTk58g}XdhbOGk71+BG)(%f-@%oDDTEi1m>0_cnuRN%G0xInmyVq5E z43A%>*NWZc+bVRAPo+1D`u?&_x~EO0%f+t1nhL|ys?ud**BVc^?rBkJr`XwF)@XY6 zsq{{<^Qd=+;b~TBhuGO#zC-uyRq1YFbz*C5Pm@Zo6V~Bf0mIX%(%Xb}XyaPlBUHLw z)E#rxlzH~3bV$_oRjhS*8dQ3%sB3a=GCjLhx?I$4F>4G@y-M#Fb!$9$|6MA*QS4|! zn|pSubd}h#q1mB(ER{}(?ah|U@YJdFcCo$58PGjDRJvAdYpmR1dbX?dZn3St67RcB zrFF4wqtmZ@YE}BEsNG$K_uZ<}<)U_@bFJa2QR#%J-OyaAd$uh6zO`p9>f5{U`_^U) z?Xy{>Em0F}!1JnA+9_(hPPE4+mDa_UAU-GN*{IT9v8CFD=WS5w!(xkP9ol!jO1BB` zksUaHol5T%-tcDJf2~R%72e9Ns2`6?w~EbyH4ej5rP496xypg^RjTwhQGIxqQ}?V< zX@}T!WQWu6RH*c3v1$8>dfnqz=>uXTzkj((Zx9=L)~+=@E|uOTHi*iNhR3PWwPHhE zIr>MLN|%fEN4=E}k3*$*i1i2dY=LuLrF+Es#>(A>$581tVttK!ukO)Rx>KxMU+ZA| z-!FCi&#Lm2iT%L_^zWQXZxQ?VRiVFSRr;vdkN$3WW>nfQ_E$M-bWcX54~ckm9nL?m z()A+VM(5w5(nmymuN&v5ReGa{#kSTPp6P|_V>>oryiBQdw}>9zh5A0H(wjwOpwjK| zq*U4?B5^9;q)I15WOr4$;h9kB9U`**1p3cemEI=8+v+L}Pg121i?C6J{&TxZcZpDV zbEWCIO{F)9P{@J%Jx!%|i%_sZ*FCqYv?+p3&PIpl7M0#0g1g`r_uQ<~Wg@u7gZDe5 z(m@fdsK$6ctJL zU_6bh^nTISy9MKCOr_U~HjHQ8Gpf=t(b{Y|9iE$1dXH$WD@QQNh)Q>h)-@iy@32Zo zMQfP{{Bua9J4H)>nZxu9s&utzSyx$Rcm`CuLA0##pnm#QdWYE8S&sTXrqWen--c$C zw@;7%0gs2BXaN2ML2`Jfm4xm%?Vie}We?&(tLV`6V-xuJVHRXQx1 zw$&Mir$eP1Mbo-Uynnk&_ld^X)`O-eq0$wiF}xY|c~qs>i$>;mM^t)?5It*6({p&? ze9`0te>|kp`-RwDh4(qA(k)_7Y^%fJIiS*IVozWV_}hM!-Y53>J$PPRr8kQ`)viYN z|4r!qn%<8uexAmhJ*8*$IoJX3)1Rxq1YZMto&F~M?fSd*59lA!KaLsxbNXNFf2)5_ z|402_4IN(uUW+(^?Z$4S8Sy@G$OApb5bq^8fp3J~XBmz93oySwq0)5H=5*9p*9fCion0L;TSU_87bi ze#PfNGWiYjwdNb)aeNnI6#f7ficgz=37zF{uzLANCJ9=J_Y+|UXmav&& zt5?DnhT0klTP4&oY}+PbyM!GK+v_A)3_Es8*u_v+FJZTY1_^s42nMTB0tp|wu=XhILw z2l@U_^iS!3p?^vL2D}A7gwId|4_IexffmpRT_6Sy&&^UUbcbtOuF%2E$5;TzqFzR0p zt>i7xO&)=U@-gTspNF>cE$A#i`Q;6FP1aya!a0U0EIz36*tCQ+L;Ma2Feu@-c!pvB zjD)O&oP=4119wV*NeCAlC@>r>N|=*yf#J|a36~^XmT-mP@Ldw_W;k+>gr`e*2CITc zw0jwkY9+>mHqY2DRc6tyJyWIcSIBC$=+K_c=??7yh0kH^lq$IB)Sjo(te%T5?FF3f z(q5?WMU352l^5OGOE}%5J*be?ebKAEl+(T1%NYB#Usw1WjK?%K5r|{jD^&WG3SXu0 z)r|exYZSg#;p-R&wAU+qgTmir9Mpb`aY*}Zg>O{&CdOgy%?jV5@U4s^+V3d*U4?H` z_;$vdwBJ+s`wAao9M#^T@SO_Z#W<$DTj9eB-@`bry;tEQjK{V2DSSWU3GD+4KdA6g z#*^A(3O}Uq!=(R5w9CIh|2KYa{Dbjj%-SC?e#dwPM)XDO6@1+2#Mi)gA;MSFzYnS4 zlllk2C0?mNN52Fq;)LF%hxB@VgRVpO|BCi0?NRM*+N-qZ;$igXDcPEBuNaE1gQQZj zRonGqDA)ketz_%A5iwNeDc3zETe+Kaut_D(uvOjNqW8!Sh{h#b*EL1&R+8mQwzAtHdV&p5{!6yD+aP+%w?UdO+3M~Q z(cQa+>eSYEyF_=-TFBQWTjAX&y4avmvNhhI=!&j`L|d{|-WJgX6$O{rI`2-=*P>qO^4?-^WTYrV)=S4mZ9tG(T#Besoq*&>Kp&;wwZ)m4gaqYrbL8 zKIpDMCEKd6F536I1GtB+`|cO*AqQmJlCAuhDf*baxe1 zp{CB*Espe67!J=fRCh6@Y79~?wH zuxC!C4~v7nTcE!cRXQdPx~kE?3o6|w4s1UGdqQ5Nw}}HaZghY66UME^B)&6} zH!edqcsBMLf0^-W5RG`B`CRiQkP=?^M7jY*Jn0-`rEequhpyc(;hz|Eh`q!- zAmI`~S|fneMF6Rb08$qLq%HzTT?CU79+mJ#3ID-hKo7tv2J`>|$nymEN_dfk_c54% z&ftK^h*KO8(+K{Iq0A#;qXdYB_^nJ{=af%y$~SUCZpCj-NCE`!k)Y1JDpQ}4@OcTc zxUManazSFjbuI`C1kaT490{+GAg^=%9jD4$B|yT(1?8`m@R)>;GPvctyCLu56gLDV zg4av<07C_IAY@i-mH?rfQnHdOAooxT0uO<#vx-m3)VBx>jc;aXUy`ZsFzB~PfJlW? z^lva2Ts?*X5geH&m&`Evv4;78%;fho98hU+N*Tm+g5QwvatZPYPOdY& zJ-EQd?{2ub{S4QSIkP+};gW<8GE_jp!37m6^;a?_FR1u;>aymolxIq>pQ&+UnmSjK zso&1O>D+Fn{&ty?rx+0Yah>ra3IE7o_DVP*;Y}p}&uUPdf2wQXjUK&P--cOxukP1l z`VqZbAJoV7oAtAL8W#PF`qTCM_2=uqhFSg%`djqh*WZJ&{}KIT`lt23#P>h{M*l9p zAof$}1TZ8U)mZ&gkG;SB&q3LZxN);_7Au5iAwN7FyA40z_%-8|#v7m+{61C@ zJ!<@s@u&Fi&=;T^d=v7ZZ%AGB=sEh(TzAeh@VeV9pTO9@0kyqA2k0E>zJO{G9cfdyM^iCA#XaK&zWVLBtXAI^_4+0BY+f6 z@aqy@C*dayPVOtF^N>vOSTLOs_i=&qxe{I=;o}UhH4<7F%Bv-C&oRr7$<%L3VAf>1 zYdPiqeTIs^qi*5gxK9U1uR6G_4((C;-JyL_!rwFK%rzW(mrU_Eau^Oy86ROVYb5Yf z945bx!+fL6d^3Y%odoXl4o57S4(e&I6X8JsfaC2--&41TFHa|36Z zzs=ytNw`PCKQNT-U~tM)oZOenTzfgw#cZ<7^#`0P=gKH6{|lM=E`wVZu;SxXb|(iA zJGnzSwO7&!PVMayn8!MG?p{tk%bCU<5?)O5e^|RqGrx}*pHE`s{4V17p98&n3Sal= zLhOG%>~cD0;;$H=!U%mE?0C<`%sq{7g>@TY*!?zwx&9EozfbFr!A|&UNCsEHD^BS> zdPHx4Bw<3X_!>NaAHr8fU!y%AkFx(fCEHf*6Ul@Jw$0KRC7eV>a>oW3-%GZ&daJm7 z#|C&eO18N=Aa1YRdJvb`_UamOyHQ1AqiwLR5w{)mlB8){tPhCW+MFA3iEXlO6t{Vu zbct=V?h#Kr=q<-3w$a)po)&B%mB6-IH;AV-K`!-_Y_s(macf;U0!>P`-8v#})mhK5 z4cArTmPQE7o|0|3c8Hq~?=tWd+jLzkZiZ_L_poi(`^3%ej%r+D8?TRwGke_!Ap+ah z>-FMHlaure+kCxKoY`X1J#71RpEy&#jU-;%fPGk;KI(--pk!OHBjR*;Gdvz8+l0MI zoN95_<0-Zc`=~gzwR!`d(yrQNt2nixnS}L(%IFoR)>Xo*QnJn1hs4Q9nFp8HcI@rq z&mI5zJ-jNHahp>k~Wng#7%1} z=qar#BPMRrE2FriMP)d}NOuK1d!>CUW1Sc|ip2t+QnSkF6C;r_dhA}6u~Cd{F-bFP zQW-HZES0%Nm2p@Mchyi&7Aj+n7;bV}Z2v#4$283LNA+IV|4zXNFpatX5`6d%z?1)S zNcnGpSN{>%{yql#|K~B*zXfmq|7FV`I2hYcPH7)e_=gJri1D=cQH6iZct-mZg&$M+ zafP2?yjlBGg@2~-lZ>}$pJKdK`?SKVj8D_9Dg2DWKWDs6`>evhQ23XOw`-qM_<4n2 zU`%RXRQOj4zr=V}`?A8nR`?Z#UuB%ozNYZ&3csQ7Zx|=Fzg75m3csoFTZ}2~+X}y< z@VkuXwC^eWd&Vj49~6FH;SU(6wI3?{5o22WM}`)lajBY4|n2K~(cPK1V=v3%ZSk9Qk;v70Zr&lOk zqp*^3RMHz}-ExLKiB;TDB8j0JtGod03}`^EGBCyftc zrT;69=fJ8z1wFnCD~9Wh4N!o80KNaIS^r@Fo3|}dLfi>Uh3=WREm6&47NHWRXWq6% z?Gm#*+0WaSs17m9ll{DHiP|c1o#n8u%-fczZjpq9VJsdJAr9TcSEecB7LDW?Q0qM7GMY4L7wdQLQ3dz71aU zdD{{d5i{YhwnwcK=eJgq0nj!`HH-6GOq%{} zi&VR~qpyPOY_>_NP291LLVilNO{z}ZQBm#2J#3@YZgGc$octx*Dy55bi<9PZ+bmTj z(tF)-)0b?!)Mk;csHV5G4O5nw-sL9yr)`;P71PoHIIE_rb}@C(i)t_BRK_MTwaZO& zXjWzH7E@cWz1`Z<3}xW`9pW6`pH9iBQ@X^t@@-{!?s=85R-_Q1fV}J zs|>G5LCC@-(<)<+m^|o3j7n)rWz>nuNEykP=Tyc~G3i-HHIz~rJz~-zH+^YRW%$HI zAJ*A=N)sw0E+)`+xW`$Qv0Y4{+HsGh$|w^PMirT^Z&w+;;;giY-lj6T#o6u(1TU1H zrZPIj*)|qTZdDm;#o09;5-D#{8HPx9SFGi5;#uuqH2nLSUZz*-8}+UFPQ6iYgZzF- z@BD>v0q@uU;J;M=zlL2!zHEHsKWY7Y6XKTNZGHgz7=IjI!pDycVC~0os|2=MIUOI8 zDb^L8Wsh*GjI}wZleIvnYm75p_eyxDgpVvFJt%H_D3PjSdI9iQY>*)9pK5;79F0$pYD zdCr$|rt=LFSS5A2xUO6-t{s<)HD6bGl20jT&DT}_YMJ_126vSNu6URG&p1^vAc0%a zRq+<8mU3R`TFwh>%X!IdIWO8RXJxru-%6L1>w^;RlECj-!{d{kZi@GR3{st$&qM27mu6tX+9B z^S`bC-+2E2l>VsxHvLtI8oCVq;Up}FVSP8aiJ|=vk-wkT9@E~gy;^%79;N;~^R^=D z5ckC?bZ*{OL@jY&Y%8>=d0P=R#XR%sd0P?f6!T3^%x3epB6>v3vpZ(qRz!D+Qhg=- zBlET*dQg-&0Bqh?M30Dj>&Z7YZ!4mQ#4`@>0>7WP7128J^xiEVOy0I48W&GzSLM8| zh}Mgzv#L68E219p^a@f{=WRu_Qry#DhFNvqRzwrxp6&{mGUjbXbceX7vm7qMd0P<; zi+lFE5!yO$E20r`ch6clGv{qZv`yTN;4z$GE26u_U7h8Kj-Iy_(M{s6qh7dw=50lE zv$%^D;(1#UEfaT{E_!`i5v>td4(!4FH*YJVjp9nRizFml5p|2p98)=OE26dH^0qp7 z(dKPMbiKGVPzi_Vyse0C5|=^_gt5)rifBk&s&c>#F>foPPI1Yo>ekoJ@1dCqb9cMA zDCh3^1~pezh>INSHoseCbczcH_E5vrtBl>^g1~Bc&-^Zxu}56keu7?Rr^?X91&-I9 zw^W8l%=K=85H(+?GQ46=ucW5ip)z)f;y@(~HS^mS?or%+0!D@TZ7QQm6gPVyRLs|^ zjLo9J2BZ0{Dx+K!>MJ4c%-5)lsK_7K<92%Hx2TLpk&kVSLhSUa44=q{H@D#BHmi(g zk>6bf`ER~@@gCOZMwDZd%Gf6IE|z6Cstkv?6UH9gV}r`*5qBQggYd)o^(v!7+!=CI z8f5=p)&Fgt^yHECr=q@1;dX^P80Yjlg%;xleW$`*3hNc_X1u63DBQz%Nf!zm6*ei{ z%XnFDR=AJxir%8ImGLgUO`%VrUtxgpZat_l#CVS$Rv1wjRTyJ@x*k`!U*Q3T2N|EC zA7Z>$Kg?Ltk0?CKIIkxZwkzylyie~`*rl+W@tJy$!d``a3Xd_~ulFk)P&ml=EPY7f zu)-0AH!(h2A5}QU_<%mH@Hpdh^b-nCGCo&7#rQn^w8AqAZ)SYHev86e6+Vse1^R6Y zZ)bd=o>X{N;RNH0^ht#&#uw}76iz9eW_*dBW_(b;L*aRa8OC4JXB1`?<``e9&nmoA zVP0W@@nw4ParOUm=5hGhgYdhp$LgQ&;~U^ltp7jp{J%2#hxC725sisga3uM>t%&|V z_TBI)xvhn|N zZA5KxY)4_x3NI%kiZ792aV)+>WQ3rds4I>w^`Qe=uAS(xI0k!s;BTaMqHW@sSf zYa<#Ghgn`UqRX`rwZx$+{Lx0VKpg5TmajW)L_w^WYs(9yji_I&i05J=diftlbVU?j zpP}U&@SDjHvzRi$Ro4GQDDY!fmgVdHA!OFbEX%qpg_#0BHpXAR&PrjrJtC7TYqL-& zri)@Swp)vZOp$5|VcKE&nk= z!u>8}p+!vEVHxd>vk(yp3`23hV=Q!uM4N-zp5>z~)QAK|Ot_5^7UqgXz9p~nFbkt% zVlnoglkfknjn*_{HO%~PVr*sXXzXF^XDr87d`B3^8>boPVpM;%ant|l@{Mt$6>IuE zW)O3L1=#*qV8`lKv&URuj+?7t3*b$#jo^+rBIthRa?BYXVIFUuhCPKZF|Rgn!cjvX zFdsLcL#O|a`7w?+_9M0f_G0Iy92|43!m2hF7(G@K*7nc)zp@_yd8fd;5`n<;3YRPK zB7%9f0)6H;U!syl{@8DkJNH{;%l$T4VZTl0({EFT!0!yx3J#?k{LZ?nL}t+MAq(sG zP|dL4OL+#rk4&rIw<#^@Qy$O1fJ*-B6qMr&*nmUVG~lR%@a#yRdDQBjD^=+hg*z0~!TYwPlJ7!-KU<+&VNih*5dlA4 zqCjAE5(8?}fo1X{rPJV9>0|W&z2)cWX_Q1rPdi_go*)=26etIhZqRw88~2fDmMPFZ zPB-bfNjI-jBHgldtDQ;~9Z0&RKC|8>(auyjRN;MvuLus^<8&vkN_#3CP4M(9Q0^q% zYyXw?{}bAZ#>8dmvai>KwxSEfrDFkX;W?qLs3k6~2%=e=&{otdE;Tdo6)>T#Xu7xr z{VlGdt!P+WVu$e+FrlqzuDFCMo+q>w^@@wB3+RNlq9x+u-g5laoFFTTKh`7S;+nWT zus@vWMcC^L_oAI>rnsm*f~}n#gm$7qaY2Iz-_;Y^iFS(%VwrLk?L>#g`Pdr{m(WghOq@?|zzOX{$HaLH za3I*wgm$8N;=I;eOifQ{Co05wC2L~*7~v(PTiD)(b`|3rv|T5%TD-ArV#5EExoVrC-9Lb^B;V<=oDorN-SW;lTE zej>m^i#P+@f8)9MS!fbxwC2hu$j8EfI3wS}RKmTF6)97VBVY1LDPNj~969x;_;?$xTMvN0_EVPSL zN_~Lu?t@sED^A9yEhrqwLajIn+r#7Q{s0!d;-pI1`gr;NEaZq2NAt0{@$&sx@QD)# zu@32P|NqZ>{{Ofn`=`B##~FJQk2jVPPcZf&o@ngL+>g0G@g(B_=7GeMjf04%7zYzi zH4b4eC!S_ZFcZYnjY(#bc!n{>OfjdKGsH8ES>_7np~SO{!BcuV7xuyoz}>@p9uD=C#BtjO&=!6R$LG zVBW~QiFlQ9GxHYat;DO1+nBdA?_l0ZyvDeTc&%|a^B&@L#=Xq@nD-N}Hy&U<$b5)+ zgYhu)5$2=B8;!^0_kUgE zjFbP{>hqq*Hj3}!NaJ7s#XWuh;}60A-2Y{u77S3eQZVqgD!oY2Ti{xPH=?jF!9Pb~ zTZI!8J|P4uC4xqW!s!Z+5KIcFgBAsbL5o_<2CZl5Gm8TFpj}HPn+!$JrT{kRq><=Q zOVXfoq$-iQ33{lyE$Eph(L>%S=-q-!-m?^LRd_?;3xaPQg{2B=(>@BVgT9-Tc$dQC z1b?BzdO4xRf%|9#i;+pn8F181JYOd9MtEu2_aSMxwc!!b1d$ zPAkJ2QKhXE=qNL+JE&ySRmrfMRf(KWhP}Hg(Z$KIZ>Ew%4lct{yY=`<^lYl|8o^7a zmEm2iO6w|+55)R1D)}~1Aj6U2--b&5s|f+Gf?7SWsw!9fD3p<%ru=tg2H{+2XeB4y>7+_#+i{TR0#Cah-~) z6}NU*$#_?%qQ=CnSn-5Q=u}jhxMdXUqeBxq6;sitUFr=nbOOPL{EhE7G5iJNmn z^1yT|$`vUNkjnSfNTta7}#>5Saf*2!C=uA{l+yFuBlQy9DGt}XCmc5`C>$|bI8@JQD+z`~HY8tXstf$3+VSX|wc*ND6A zV}8x znIm^QmxUs6x$L_anrLC6Ra}Pl#|cd|v(PRs!-h$C`b{hph|ACr;DI%=kS8va21$MY zm;EdC|NmV3e_j8td;i{&c5&KCY13)T)C)6|&^EMNJZ}W&8=-`@p#|bOszXj_8(J@( z>nOx*cS76HTJfB0{vA$`4Mkg3CZ5BrD&B~M_Ms8+Y!^=V5=v+vIv}2{_hH^Sp?zqH zcs2)TQVA!>hvG(x#4|EAi|c43+AW^Rx2ka+ZA2sDnLrL^ViVekdd1V&RvV9mj3{oT zR6LCv!D@ztcA|!OYN!CecM0u8`^8gpZA@Jxv=c28PhxX!+^=?`<>JYj_)fTrcA|CS zNh4T?t7s?MFP<0p`EB99xKBp z8li-CqK0_1Qg)$8XeZhv9_cN|Z)QR}(Jt{wzJ(P46WWQ!#KSdl`Lm;)s8>8(A%|U? z&`#744|NpEFQRs$W8$Ia^awtQ+KG;ehk()!`|_iS0=BBeZS2Fsh%S{dpc7GHzm57HY-)0h|^nG_eZ{{o=mb44H=6nT0HIAO4o%5<9UF5cful zWKLzrKLlI$yPnvAg$!{IHJO~)e&sgqiBPUJ)wx)=(a0Yxw}74{)TMBLP*>- zhDR2f*qVhwaTitHOl-wMxws1}GjNqHS?Csb#&bQC|KGwGO*2-(9{U>^TNv9LyI~8S zgN-TUFymP4&vUkMk%7L(xZSu9+xR|XyllK>e26W6zc+p}9nAe_nT2K#vrd4)Fdy=_m!t@P-@;QbW!ViO#IT zNd(nFEaX{TmDF*1?xK=+O5sq2BM3gVx}UP&A^*-K`Y93*`5#v$3Oz%9GAf}!I*9>w zxPe_%X;*~_8G43kE{!nF%n@Egeh^Nhx`1%n$5b-t=)%TDR5Bd}I;^nyj4C}xu;}Q* z_9axZKP5Pm3O^G(`zbuB@I1l0mjYeBu=i3`qRSBW!Ko zs8=Az6b{hc4hL?R=NNJ2N0GD{1v<<~8riN$8XavUjgBv3jME|}Jr5C+>LVg%xf1y^ zx=j(2_7kz_35Zx^A|e*ugNV~YD>&;Y{7CQ|N$}FGh%b* z^K0S*#y8Awncoo~G`?s4!2FT;knt1qXXY==Ux^PJzcGI&K4PXZ4dSEN@m}_;dCatk zkDE5rAwFSxm|o(OrjO}o28d7L=-YBTPnkjD(`E)UM0~~!Gb79>@mVvInZ?W|K4)U2 ziQ9Y5%w^^=^NG)!1*>I_QybA-@e#(17ZU8>wmXd^mbyxZuD zp=BT=ik4wiyo;6rO=u_DE8bo#YdaI#i4KXkad=8x zMLW?f@wSjPQ3>rtyTw}z{4pn#&`xxLc&jr5BlCoIq9}+Uw$({!CpsYB3PrGcQ$jn@ zdE%|~kld(tq8;MRxwf=s+KG;dH?evPSJ6(iRlI4)2Cxb3L_xfPO|?+aPIOGXUhl*9 zK8XenO)JFf)Kx1{zcN;Romz+`>R6a3UL)I)sAZu{yjCs~0*M+H0^-%NKn0#{H4E+H z)!y;~JX@EAe(@?kb+}vjLx7+>Tfstwc(v3gkF<(~UhztI6;?|p=CH6pyi(`E#6+T! zg=+Cisc#rpsbHZ|ygV$s`zFd+h=`Z7JERROV@s`Ean=&_J zZchBlT*};nxg~Qe=GMfo&25<562CFGV{T9U*4%-)Bk?fW2snW!A`Rd-c2zKC@us$P6mX5`?DSZAWL#aE?195N)a1;3gy#aAV3%k<|` z78=A?{sq|FJFz(njpED2{yyC3W-LU+mve2bA4+V>Lb>>|+TV^F-Gl{8e5rzpjagVA zzN85q5*xA5E51-s*M=;_#TWS&HpEG6z(S|^yaPKGh7#+u5D=eJQZca}3nSw5Xc1Pg zCDvtOf%wc0uZrig4hy~FGuhoKlvtaExcC$=GH!G&7X0GV_6X)w6Kk^2Dn7+zKCZF` z3+dt$e3EgM)mdl}pOhIglwFO54)KYKm{w(>NPLV5V_anw7EJMRO+1_P|9{Q+Ka)BV zoeP;xbO68ZIue}+nPwQT{G^UV(;>PTdn<<~btIYxQ4zwxds0WD0f-h=;4?C*BT+v@ z7Gr8YG^r!ebcnRdgzx0aNEE`|wb%h*Qb(d82v>%&(qK|YqU8{dWMF(ZsUy*12%BNN z6_Yv=4M1qzhnd$&9f@{As67iSd?s}ynh7DwyHDy!G#xUUA{dHI>PWN~GDHXizDXU4 zHbX|KtYw_kk*I)RPmx?jN1~$;EW<|Ep-CNyc0n+^AAidxbtIYx=>u|9)kz(R)Bsw3`b0b(~FsUQa5eN)KPWN~eATk^{-lmX2f#z1qpJwm|aEg)W?Pf2I2(rjr!(89o495rC+1$%Kz)YC4=26CKIA-wa*!KTo^D6U390B}(982t3 z^A+sn|B?A6&Nu$M<@pyz`TI}D`23UM{D0qSGRqoGw^g#0+PFk~Z>SPAriu9Pr;?vi z*pYzB_y)EmF|fPL9!L9SA)0os!h-~(T7j~_QG@cnQFD|;^B9G<6+R+Zt14VhuxAvg zK%q%NE#lu!l@3y%G7i@a|;Ek zrN}fdR;70pz9m?ck_MV)H^D=VXEHqzRiX=>>7mv(nVv(G zm{NF4;bVgLWQC6iK5Czo=~JuwJ|NK_Q|MIKTH$>{pjKg0o^uvWGM+`xMpoKI@{=rs zc9Ug%P9?L8UzOw&ZzN`!H!*J}W}CM#Z)M)byq%b1 z-od<+m}}m}yqkFsG0(i0c^~tB<^#lh^FiiA!~*kS<|D*H^HE}v`55zY<`cwX^GW7Y z#1ivq<}<{Y`7HA}VyXE&F>b!Ve3AJQvCMp#`O07F|Fsj%2B6^!C$$sp1raTkQImF} zc~CVL#O&>)cA`Z|Z!2&A3p2vl{~%J5b@(LSiE4M%Vr+KI+tPOp%LKs!+siYsN9 zt(|BlRN@#BxP*41wNM$zm&c)+tC$$sphO#nK#_rmQmO@!+K%Sg-q8(5c$j2_yliG>; zAwF7!4FV^%6Rn4MX+TEi+KG-sJiA|px7vyNp|s4D+t5xl46&L@X)3f69f4S-Y^yS< zooEiWf)~42lB>!m3Y-hSOCb2Wn=Zn)K&O!NT_&{? z#rf8Tit(x?wG$nJjz|V3^OD+$+R%|6!F!X`PP7c#J7QQ@mDEnuhPH(sj}uC2Ct43} zJw3UiCbZ#C7w$zn(K=`|LYcTx?L?cP6*r38&`z`lTKg(6t(4SG z)PdG~3x9`_+KJXeYi6@NQtd<=U~YClJ~T<~L_^ThQjJeyQae!}wA6;Ny<<{4(JpAA zlu%MT(QIg5EXVsxY9}h7xk>u}WPqQME@&=UD$hkb(F$mGMz8^Q&Kz8 zVQ8}Cw5Lh!MC+k(Fks;l+KCoJW1E9dVp2O%FErHqG%~%nk=+HLnK4q zeS?K=sP7f>`AB0S4)qnGE%5O^h=l;uwH8+5cjiDAVo(Pm`FnT(3%P&|D)Has{w%aW z?Sgb1LvnII7TTb;r%3(`@5{m{)YgV&Zf74BN}#r=LcSlCu`mWTqeVEn-{jsbgrKIU z2y2Wd_gcA)nk=uh>U*+~2{mEa?09ky796PVlnsI>cW1$Z>R7h?<=$)HMW4=x-H{W2s zNvts6V!lnRG~Z#qOPpiA$9$hyWq!c?koghwW1=uWA%giS^E2k>MA!U+`6cr!Vzv1- z^BZD~`7QH1=J(7Wh_&XA%%7M)Gk+o0nZGiBWByL8x72m1w+t#bSSHhA+Qdf7VS0#7 zmY3-xHd}sXfSJw=5?ibcW{4Rk&b1=MRx8TPWM(n5iEUO6Gnbji%x4x5+pR)khgHNZ zW|j~;tr)YE*k#3;Wz2GB1+m+zWX>V>SXE3xoM!>kCH7j?%o=7bvCpbw)-xN3I9oTf ziP=mXuv(aNnXSb6R-5$y+ZvT=#)z@RSj*VZSZZu%?24m*A7mtrPHY~2=>KcBk6Vp< zjE9YL}6ezDtRf( zmG51lN=GU@qd;k>eBXCe@>6mt-@mIW9iecQ%=r{hTi}8;N)HyKJug2hFsP|%fkEk~ z0^>?0UZ?OC!OT}Um0;y5lqpbBsle(}rP~##8()E~_TU6abTSnvp;q9Wtx9Tt&Z|`N z3@cCyt-!O4N?x@;Z=))msi5}YrFOXmz9l63_EI=b;XH!>K!sZs)B*aRl%>M7YZRz? zZeiMss`LxN2r8_tK!;ms-bN*h@|cCzQ&h5B71|Yg6s8oYeQu#miPl1gQj3M2Hu}s% zNxDK0r5y`B?~&-G9A}}IZbzY)(vF4R3+OXnOo6hmg+8@0A7wQQeV?e$=#CZoqg3+m ztw7ILVSt7%E%L}mp@=qBl=g^Rpvb6EpvzHYd_*Oawozo#-iplQl}Ne4B8wiHBI^_q z?Ougr2+mxERsYiXUpvteSY=U2#{b%hTChrSB~~jZwG(ZJRiZf0MkuMBs0&LL$@;&f zcA|x_#FdTrl7BeS#W*`W3fhTAU{S9?pPAH7GzyETHY=%}Xd^5fmeu`9?L^06VL1*( z5la5yM8|st*4`ww6U~M3F4@f{sh#Ko7>^goSXDdG7>rehW$dn<=v)|G=#g=^cA^%H zw#qs2lG=%8z-UdSjNP>p9fr~3N@+~A6YYbMp<>K3B()Qb!$@^H#)wJnMB^~rE3ji? zQajNa7>>vZ$CKKL_Q23c6lXI`Y9|_mp_)o;?wHh0v;c;x)1|4Ope6P*hSlp)Yg6ktKGkO$Vmq3JlxZ^LnXL&GBCkgs3j@%HE(2GoWuX9iYbvqd zU9yISZ0Ien#H2#9nuT%bjh4z)Toy86UPnyYA7CK{^FYo+k`ydtLC;`7E>XooJ@m|% zJ-3o`SQvqBN{}QgS+Joy%ZpAWS;2x2x-hB0J7`(alDSaA^K1ZA5EevpLztc4$f)Q4=<+4C8lbN*mFB*sL%g zze7{nh{j>FJe=@6G^LHG7dEx!jQ3O8h&IC}E!B;9+9fD0tWy8xU zZA1lZf^ETZ8`_A@hm8kid(WgcqIt0KT*rqOUK>#tHX4ayU4Bv<(Rr{Dre<&zZA3$` zQAjrKNopfn3>!9hvCCXi8_{amusU6?qK#+}Hq30650N&a?XUs%DMUdV(JELUFCng? zjc6ULUzm?swxl+qb6~xWSkMk9$%tZQbpxzdmG+eUVbV@?0jw9x_Tfgf6CHu|vSfpR zq;{h9ur8iIuA-f239LI1kyc$h(KxKzU5hOQlG=&Z!8-U8ia$F$@}n7obz<4*nUg!P z;D>e6Bbe_>ZqGsh)-l8K%e);68L;+34>lP{Zp%Uqtlb&LuFJ`7SjdF6?I>nDlUuXk z!djz6fIoj*t=z_1r2!leD7hsIaaar6GT=tHV4)e-%D^#mL&>EqCBUxvycO8 z_EoHk8{LeBVpy}g7UzFRZpuPGtXc1u@48J`$cHs6Lh`k=F$VHDO7 z((WfWWC37}f^CO25Q${JxgKxT4%7F<|;u52=tT#tn+SgnG7L)K-X8CD&M#{QoF z=il-F^Q{i@Q46e2W*2eL>Sp#3hpc(bUS=P&pE*Drw&pVz5J#**<`8kz8fK0#N10>9 zF>9PSZY^XkVlE~ww3aYeAuh63Wv)hCY^_dQVy(eklemht7ISUpIz*hOow%B{9&vSR zec~F{2Fwka8xhyEHfC7sc%q^K)F}EhJZEeHcmbo2q9cz2$4$K{y zI}z8lc4qFv+?BYVwHtGH<{r#FiR)W?G502JU@aqVXzjz?m$@HtBWr)=0n7u58(Rl4 z4<>G69l~7BoM0x1n_82^&8#GIikV_gGiQjKTeHj+#HH4u%)^+66SuIAkp6!MBPZ>@ znB}t%X9c|#XZd{)=lOfqc*S_z_y}kH`{7?{1%z#Y&M?n6FEg*jd4%r9c}0hD&ao!* zA@d2G@#8h~UGo$3Yx5_Z@zZC8tz4_bs3ObYge3`@E|K` z9cmq8oot zg5@Y|ra-BUV(Vxs+0=iy*vX)hGoY{$!Q)dPhh6MZd+?mA#Cr%{Q(+&40|`Dup+bS| zda-X8RZ@HRy-g)QU9V!l`piF}#B&tr>J0!jjPR0@p93lYPq%kl3* z`n#0=?khizrJYJJD7z6e4psjDpPK(m&;Rj{`v1Ld{KxozYaB~p$e4@Y#!N$x|8Z;D zC21$8&7|$aFWk_S_MyG7cO(P5|4nHhngM&MSpE+mx>vajcc=dFp?hHk8Lsk&58bn; z2%7^;{ozCREX>FFZ%X^n2<#ciM~gJ2edr+UF;pxagZ822ut$3qMt4)%hX!De(tun= z`_OjSy;BY;I;DMR2zJl6Fb*_8I7^I$gvd(4HW$cJK3T@JfqP>sRt zls2O2uq#zVPH7|B3AZ(Kqf(fP28I$doP zRmMUmY!@xXt_xFf7Rq7U>U50Er%GAqg>AFE*vx(^#zH1+>x&QLDkUpd*#-q%qL_su z*v5`xgMg_b7JRTZHB6W)WFZDy56VGSrV3bSfUWxr(K1ctvrq$DwP#^;Kb6OV7q-HR zYdo-A7II;$(m)4pBZq|mY-NV!HO*$B47Nl+giB%U3LI2?D#XGNERB}R)6Za`8kXA8z~AxzzZ3s& zVI4(r)RxxK%wvdKS;sPuV;;{ufw;AGBJ(8X$;54}Q<$d`x3x}Vp3XdjxSe$-^DN@_ z*4fN+nCCLjBko|G&%A)Rqje#1C+i~S#l)ShOPH53FJoR#+{Lni5e#NDiG znAZ|_x2|JePu#=0fq5hICgPsf&CFYvw-WcVZe!lgyo0#6btm&K=H0|));-L7nfEd8 zXFfpO$9j-;(^vP%x8%QSD61dUlhC2L$^ zbp?v(V|FQ(>>Cv*MvmEEQ^}d5K*4Iv=~ATy3RG(qa~`FVr%xfN@U+5<3a=_qoF4Oh zrAprsylM~LdR1CeVRwaV3BEyvwF!Q|!a52RF~|JJsgeq9{ijhWKrwP@8U@a!Y2Qn+ zG>tAusnJ6vLtR$mIVzdtZAwkrU#Y2XfOQ#tX454owdvB8I^85Xbke2H2C8(3!YKsL zi3*<*ymZv1-e0KXqng@MpIXHCB#C}of&55mpk0RSa(phsjHl5hiyL%capN%(O**}} zNtY#VZm2}6o{XDx&T%V^L~E`B-M6@P&S(SBHg)n6Ez=tOiEtcYdH#5^UUvCmXC%u-*rDV>K7!E9fJjP7+FdI8M3UKum# zJai|_j6^XrJEil`c`z+xyUQt^hpvTbYW+K<^U(7lRT`+qRdgPD1g5a18m^-A(Dg7C z%9PQr&O?_#vP-thozi(|A0(A!(0S-qm>h}9XjkW<=fPxG0Ef_=(s}3#NQ@R$V+^VD z&>=|l6b)P9Dau1*IF}9y4Bat@KBW`UeUQlR$2!F+ortzzqB1N`S0|#oVEMRDx*MH{ zu7~CQg;-TJr4!M(gbLktBH9awbi|||(23{;a7f8g8CB{;bN~+SFT`2prgS2D2o6R= zgnQA6=s9q3ab*T>LnopI9Gv6B%=DB_M7P30ivwQVhE7DAa1ix6oLYw?({4BjCpW@v ztj$6r98{hz!~eBd2*QDj16av8wI&M|95^7ydYxK>1p^L9kH{!{bruR?|B_FY3^2Kp%?aB6vCRisa05rz*5(vrUDpT;9k8q^QelUu zhNXbdLjf$q=K(8OriOTtF<4fz6gz584YJS&%Ze-I*)3SPk-dA0R>f83v(N~8mj;Ia z(*D0G?L_@>`d|Rt?xwU8t$@?ovzD2mly;(}a9V|&Ata@p=m4DBQjHHuN;}a;IF%YW zr?eC8hEqn1uxD;cJJC)!WhB~zt7s=`!YNcEnEJzso;*~HS%j2!qJ403YazO(ly;&P zoLuiO#^caVv#u{9!wk(oS?3PAo{r z*^g4%iB`jjq0DOBsCJ?`a3a-rrL+^xffI&`@wrNACu+m-88-fArnD2yhvTqA0PaOQ z(GVP0@2|tXXeSDAT!m~Ao6=5n4jflXw?RA6aX1#+L*O?4aH7Zd3j9?`X(yTm$F^tT z4`50=Q5%j8RS zsdN@<;OOpJ{A#8GD<9sYiz_|24L=Jm98I09Q$7~v!cmkmN_klrhojUI9u_*_$iaZT z*$xY}a3nVO#f{o5w8N3!d`wKFEEeX%5j{onY|WLc9Fg5G9|wblI2?|t3*2ZL3mI@Y z=2Y;Tc@PUhIGmbcPaVj@030^%YsT;U0W7q^Vc4eve&ivJi*EoM;@s?)$LN3x|&Tu;I$oG8P751>MT2y;;bD6+K02{LjDV|NPfOdGb$F z)+fwQi7D$d;s#h`%7BP#NCCnJ{B)gOuC!TDVG0T}1#8d1_ z<{V}f@l;zdfq0tjGOLNF+cnHuW*xJhc!u4;Y-BbO&$OGFEzG&hR^nN98?&8ww%x(( zB%Wh;F}s;P#B=R=#PjT4W*@VkIl!DxJl|fx98~fDztR3D%QUej@C~dNyv?{2#|xe{ z_BFP}(F8_}He-&FZCGhvrM>wN=l@RWNVFHOYVcxAl+uxCD_muUWjvrG(OS52aR39) zl#WC_aOGeCyLY5?B$^FZ*85E}oT5k+gCs9pDf8^O5gm$_z!jaciBL+1q9bqxH7iT$ zP&5EnWXU#!DIJPd!{yi!506ZTq6^^iXekcFpVFad6I@niVtk*{p=dc=hW$Hm2_1?8 zT)HTPzuqYwik8Bq)OjVPL(vdiYJ@OYP3cf{4qOtF(|x6MDB1-VV~!ZNp+nICTwE(V zNTqZr+5i`0e>Yr3hoS~t)Ln}fDWyZva=56>#33P4Iuwn=g*iTqZ&NxHt%eIja;mPB z4n-^Af?k0QaZ)-I&4vrw9Qod*P!yfn2wX5nHpENmNVE#h$9Ffbq9f4|oR8hGa1|Yi z2I2g4*{Uw3Bhh|14?-peNCW(8vf;eSFm}XA^|R0o=M`60<3{^f7=`n4a16yzs+WZ# zIM0yHTT=5_$boY$pS=4$EEK{y*q9Hu(ak~+oKr1lYE5;qumH{}lr==DP8Mq5>_!Zc zL#YlH^5JZ1nUiW~p%BjMtH6P4Qf(|$!dZE8+SOF+$|cUkpcBt!E(>uule}!Ig@sx; zvm++=(#%2zoJsaK)x?4q&QOQm$bt{fs0d-WpK4&C63!@DicN-6^(=J4>5Bt6L3*l= zg)%sOQApm(S{8zEI=26z{y$qAEouMW*xy*+*Mj4J_xyji{QqZK{o@$qqsD;IWffUv zmayurR;%a#!udZba}xMTqAWm3xU#^Fs{nSDtyPvrNwBgsI<7Kf zmKHH6(N$(Vqe{;c%z#3Ug4&o>NG0nSf*n_&>g_Un3su@p;UI<6363gx4yKalW`$n~ z-X4Vk1-dn5-jk^0qs(8KZ$6d$X$ptQ(<}GV-}R(aZcrMp+@NDFH|RQ-8!`1+zXGL2 z%MD7zm78h>b5r`vyj+2|@fiqBYa<$h`y(0nGMm;$6op_6J>#@CqJwZBj&6mkXd@bc`=}G?v^Ju(a38gR zp4LXR4(_G#z^1hkO^16HdeAaYYa?pGJ(x4YjcOxW2={cv@SQQOjc63^srO^zX<8f6 zI=FkZ2valD+K3Lp-MMl!w`pxe3*l~@DF9c|Msx`7S`@-m#$_{^R(E0{0N0lW&_t(pWFZ9C73Rz6ZwD5J;aciKo!Xv-47e7bDZFIcv5*JXVo-q_ z-Ij%JxHij+T{%+QurMF48Iyxdr?zHc0InGh%EZK0EcC)PILQcZV@np|aE*VlyoOt_ zPzG0HTNYemDGPOQbx)Bzxy@M+aMid^=2SLg!GNpg?uX72+lKs>Dm})tIX@*C1YIugP4Cc)7hca~xixbe;3a#y*Kd|dl~UodmrY$#M|usnENvi zU>-=k-9CtUF!K=N9rkkO1o2KgLA=YJWG0Ds+f&RGbDDUMJ;R)3u3#QYyw^UAc%OYZ z^9bgV#QW`|m`5{@VIE6-z&?(7Jo5zRiNpu(lZX%5Co@lBo=SY!K25#<|C;eXr?nFu zfS0h6%n40vCt3(Eb;R)3YFazd5qJr^rs3;MJJCvb2`f184XB-H5MCnpHm#j#9A50M z#ag3j?L?d5g{BCO-Y~75Xd}FkBj;6~)=sn!o<~oFyVXt<;Q4vESid!`o#+TW-&%-o zz-jG7J@7nME8;e^6YYWL>iseR&`z`oo}(PXw05Gs@LWVr#Wby*Xa+nx9K=?2)7ptP z!?TS68Qo|n8iQwQ!&~4I+KHCKGsTs13GGC4;pxSJc06?LM91Ojfe5w$o7PS=3QuF@ z9d1KAQ5&AdN*3IPcA_ot6uJ9p?L^DrsX)FwQtd51E zz{4uID`8;_9-5zl!wyXsvycN1wK>?9ak_|wN_dDeCewv16vKl>6&Sir7qAe32j=Cj zk4Ku%LL43_S&B82(|Ig3!2^*D41cC`S;&P4%y8Y`?f?GuS3j*mzn_oTXE4uXp2a+y z_^5pj^IYO%_Ib?nnHMlGBtC9m#Jre!3GoU0Qs!mEC+*9bS1_+6K4o9Uyqfs5eGT(k z=5@^LiO<+KFmEJ2Yv07YnfRQ23-eayZN%s8+nIMT?_}OZe8Ik(c@ObL`(ENp_I=Fz znGY}@WIjZE*?yS$2=h_mEB0f|$BD1nPcWZkK1F=Zewz6V@pb!I=5xe1?B|&;FkfW8 zM10eJnfVIyRpx8V*NJc0Z!q5^zHPt7e4F@={SNb8;=A^H%=eie5Z|*uWPZf_nE1Z^ z3G-9p2li*o&xs$}UogKUeq?{e{F?a<^IPJ__IJ$hnLo((f7=^bX~yctdd8;4*2Yf8 zp2q&hgfU|rX)HA684U&)g+`Wff^oWW9%lHjF>W^Q!hS$c7|$E88SfgO7+)Jdp~do< zVKdh(F)Pg)%!hZH{pN_d#9YhV&|GS6XYOh)GY>Kbu}+}OOqz$9$CxLZXPFn8SD4qE zx0&~vkC;!JFPU$eADEw;-;ArJr1f+S<9!UG$lA55d!@ zpw7=rjow@@H6wGqyU=G|bx1z7F<%RbKDCIC(p|3aDH8prf>3xzfi8g?z+8`ERvVN< ztTv`p=}3ZEsX!UUYHMFAS%(sAtiQ(f>@fvu6IgB2#j1ANNOW#j_*j8j(p7sZsN|sw zQthEsShbhZdDY%r`pgRo)XJ{fyMrq2uW*IJhXh}m!XkoSt?utqrBMaCN;PTM$x=<) zPXvSdG}RciLXAO7)|hlgH6|tLYRo0Hq)AUfjg>_ut5u;*VZOq)3eyUdN3OA+q>`Pk z(5Y~#!b=3F;-Aj{y^dpc-)dfh-`juG|L4D||9c|s_O#2=PEA{pwy%EShNmeLMY);J zF*k!XFVi{|)drubz*DE9#^F;8voW60sVEP8n&XqfyiP?`z^BxlZCar_-d zd;}qEWi+i*Q8DfCshWDw9%(Tu#jlug~S$Q?BGf@lRz5YTOtLjWtAH0|6m9eVM zMET*p%x1ZY&O{BuyEuX>uA(zh>F_R1e=w~xQFZVx4Z}FCGf|`P4i0~a8`YVpc6bLz z2*8c%OjIqrU63x%R%fDO@HWjMJgqZP74R13P;rS(IW*0Ox6crDK> zpVKv1sDsxsY#a||dUY0B;nnsm8UL@wLO#42%f=BxrdMTQ6kb(6brlx+;FX0Q?3gsY zgoQY~G8mA%UCe?PUdF)#8v&!LDWJWvDF4tooKUb71zmaXeSzS&1yL$%#3!TUf0BV zMsOAFL_1s)v;DY=cA^VhV{riO{)~2_gRVh?X3S_O8g-41m|R6W(U_Y?Z9-?X6U~O- zv27}DLp#wt_#Fo(!rf{o>Vx0&+w- zd_|-C%y?Lc!XY!-&$3v3UGOIR$_!xvcFgG-n!l)&d$bA@MX zu+RygqUqEz>zNHi%V}gb5pAcL*+O)jxkQiC%4}n{6TMCcvy|yL^{*2>%V2gJv$11ietZJ*t>ahB(VQaCqrnP~!xwWme3-&=e(3-SXSVvnY zS!Y@oSeIMZS+`pE7?&95S`S-KTF+arTJQWDqkQ~}-}wKA#ii$}4Um7Y4UpHa30$qj zS@L56^0&2tO;kzwzW{l|x&Rrtx`48XK57k8*w>9r+$n;*SJ> zjsm&kT7SDLt)@WkxYkehz1IJMygGH%(XOsXE>M?78?G~bRI+GOb=FR*v=_l%sz95n zv+4TP*-tC+Wd&;cQ)hoqCC94}QMgZmE_j`X@-uZFN?g===t|dlC_PZ;eT|m%?X7Sp z!C$42P&h_`@)vah8Zxv#B+sgTF8%G0pVz0+ZLK$KDj8=g+(a<*{#X3}8~?EV?~FF0 z4Q_sGTn6Uah>pAY`8Jx!8Er)UZeCBh42ZQ66>eTfm5h2?L-IM+-v=eQ1v#X`?oY79S*v)qRSbH<0ooJhzo!N^mb7!;@Ep@Yc%GY#4GunxkyIEys z1cNp0L`U7MqMBv6QSC(iZdOG0BAn4qG~#CYHm>hCz|I*8vOE_YA2fIM(Tsud1Yp$6Lll`w)8{e9GaH9VIRo5 zJ;uVA8}`QJZbw;|=Z5WEtN@!CVZm}k3%!-N#4rnfH&n78*8a{6u@G`Iit8*C23g2) zgCbML?h9CmxxoyNJdXJ+EO65sgYtnHV4>Jeuc?=gsh@>>H!vK=acXD!SSWP^1#+^7 znO+vMTz_wq-0eITMqJ;#Vw}llriX=I*Vh`CXWPAU8@?Plapg=G3o+McW=Zqg$-;o^ z9mtVRrGteg*Bi<&>#6hS{H6YXRy)zC>yDP= ztQxc0iOzN1t_=KE&1xrF>bfnhc=)s0iFUhgX%HRHtahRy7kbLEi@>aQqP7cVCi=Ts z?L)lL+JU=`lZS?xqES9G^yweqZXq9v~A%tA9itDWemD?mOpv)YNKyCOXY zpTt@1M2Fm}HZR`JS?xrFZk1X^JJEW#Dpr8c*{pV=WA2=>Fjm&iYA5P*=Zu!)*rl`D ziB`FD=y{*jPIR7IIX^0w&`vbuR>lhCxo9V9yA|E-nC+a^PPD}>UzCZnNX}{}+U=Il zlLH{lYA4#^me3jB7@Y9|_Y%Z4iD$!RAVcgqIpnrbIH?v}O7`u|z& zMEl(MXgPLWnAJ|S)Q#itHnjr!c5%8ZY<=v zMcJ##%f2rOtuOgNSkG zVCEsr<-{^)f|+1W63d+=bBdW_P7^Df8Dga~%UnU6;~dI7jCnY*$~l60B=abuaE@jk z!#tLG91)!3nI|w$WS&HHos*fTFi&Nk#yp)^?VQ0plUU=N#XOsN4)a`Mt#cmpeC7qr z3yF2kMa+wtm#FyvACCXGmNjU#U{9Qg`Mdd<`6|}Y-;Cq?oQN}d>}_s^HT#1&9#A>X z{E=pSjx7Nm#qonKHvWb2KW23t8h5+%ZTyLx)p2N!+nwddz;sr}p-pagC{MoZbsXC4 zb}i1p@$Y7J9J;{m>TQzmG98E3yIpy*zGGI$p)t2Bg5w>BW_27|;dWMJ;@n=dIu31g zJ29ldjp{gb(Cy64k?&<4hvE{ED298pIu4Dyo#{F9t*hhEKDT3`7hheoIu5OKJBBJT zAe_~4sO`4bW?{|Dtd2unx4j}$9;uE)Gu`$`RK9g}9O}Al^NQu!>NqsRZOg$H0-;$Q zhjzMcS@PF?R>z^$Zd+8~>u*-ap)GD}OKT&pqT|qEx3$iXO$ujq99rbImIm8#6&;5T zyK`N?JX;-ycDr-SWhc8?9fuljOJx?;m(J=q)Z@0qjrWvt?+D( z6mXeZw+;;?y206MUSzIYmv3V(f7WH8!L1z(;!qv4!0QCvT3km)p@J7_b!!Vt(Yel6 zvC!kzT5{Bd**Pq9x;0JN7(>ifvQX&Ol$mJ5W-C}IaBFhpursseEX3WK43E6sWh~UY z)uZJ&|KDt!1=p<}#&|O{Tgrmvx?^F#BlCaT7&ZTR{+~mQV~mrHvy2OkD~#*0fA77< zBgWIlOU9eV2RJuS4Sw&x{qtjl8O>^xus=6G7>*5gx^Hz&~QOSR@!V3y?r5n>I|JIoHjuab>JcZ>7 z*DJiL@D{g>g(6&RlD_4E2KtWHGSsmQ}|5bbAq3)M5Di4mDW{I2Oluy?Q7amYE8y8!887 z?EJ?3UD1<9T;eg9Cevct#8o^F)ALuh|5>3kQN`{mi!w35U7<5kneHm1x%>S*>nWz$XmF{-TiLTI@sHnT7zYL?M6*?1@&P0v5 z;~iBp(AJr#Tz6cBuR0So#~oWlakb7wdEBwmpo~p*CTheT4U}SS$E?moRl6hI?J_pk znW$WMq@@+xyUprMRGvFh8kC`_&P27l!+4``6`hF+xWk#f*#2i$XQJ}l;q)B2Tb+sO zafkZLz~g;96G zT(1oHw_>5gT~L`NH@YPYS?+wi`?$mwEL6Gku^SdHv6O`_cc7&eD-~upXQA62sFj_F zXE$TPcKdsqWSG4v3%zbXCgO03O;{*$``Yv6$!*L+v)kwT<-OgAg#x#CER2(^&2GrT zxZB$r&%_620~Q9{-nrxu)@LE$_O`T2L-_x&cb4IC9NW5{?w)CqG?GTl3{@k^7BjPK z$9C+*i31KewiCy8I8GeLVbo|wqj8v-nVFfHnVAy@@2XX+oco-!_c=Sc`<(o^`J>nM zO?OYjxNCi@XiE~RS=Tg2T-+8Uq_fT$qD$Ga3w{@RiiF?UoP;LU0U2ZvHY34i?a*Kb z=P{oIFxl`eUQz$A^8DoS`~()q(UPYUs zfse1#k>BTBiK2^Uv(sH5epg)q{JTB=-CKO#<+(rty>pl6J}hZ?B3*hpmUKLkE`5P4 zZ6ks2gf1N~pi4)S*rnehKYK*t6A3h`U54D!xD!R=35g8|?{*SPB;-+i@@svV`RMY! zfuH$)LzqE{IthFybeU6Fvi6l&CvgM9K1Sk3go9a&E=S%1=L;#yL%aCjrOTB^aW573 zs(Tl)MYm^C0?)5o>%x-OD}gV-Zf%t;orTcxAl>?jvV@o3t>dqw+mO2(_(SM6Zo^HC zdnE9U((Oez-|f8%MepMhA0d1`i9;mrN0_@xd@b=k!pf7#m%wM*Z7r0g6D08G)NNfa zOY)1X&t>UHgk2zU&|ez=t6a3fmNkhvQN~p+x`r)<=nVvwi>_x&AUg}OyUIlmu_ZY{ zXm=l1x#(=RQ*Ro~5j(DO(Wz{w))WYm##Ju5mhFVu+HsYO&Sr}tSr5CYTy!p5+#Q50 z@wm!Gcd^ASRWUIT_cG(5c zWolfdqC41jiDE^}ag~a0W{a9E@FC-viiTaLu|<$*hh0=Ax`Qn;#Pl}fDidA8ww)!0 zKaHzQbOqa16Y~&`t4y@PwkZjS2cp&MYUW}_ubOYOJmgvec zt}@X*Y%6T<7+0C-3bs{t0raUF&!^Bdg)MBrpF`e8VasU_G_#E7lAy6I3gX4n&mkd| zEx?Wm#B38py^INEl*sG5#NqC!v+ig}zL%OB@L!Y)(}Q z3`-k#NoZhmu=C5fLqYxw)A^%tS6QvxwQm9OM>eE^n5DSS#$gRy{ zVhM5^vlO|lSw<{JE;1{Kl|+Wz&g8@(a(lCiSWT=!?qE(MPDk!&))MQ8^~l9$1F@0V zgxtw&Cbke;kxR@rVmorF*@0YUb`ragJDc6a9^@`&FLJrrN9;%LY7P(wkt@t0;xKW9 zIEq|pjuB@NXChabvxu7zXA|cT=OTAAH%0Dl&LhqzZid{$+#I>5xq!F@aZBW0=0f6D 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�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 z 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

    =b?bLjD!ad99Ujj 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 @VdJfgH1$sq|=G5{e)QvACttwRI z{kX}GSYW3BZhR(Q_0)XY^fk3#yyEk)7FqJO2O;(I4r0G})YYd<0FI(oAI)+Iuu;D^ zq|Se4@X^qp;!wdJBQnCr0_;iWnN6AM)i-TgXc1QbYHk7$nUyn23x+4&m_`zgHMDuz z|2XB3rBL_GbLZzkWHzB7ua5(>F0ILmZ8sls0RnL%zH5AZWbjg0d2FafnfQnpU)b@u zNW|c2YPYX#vgdDq8L?d{x`?-Qne=ZG@=ir9(p>a8u;{LBww$P)Wme{<#cR!ckhqL2sJ@H!78IgBk4|^Z6 zcf&M$mi?QCi2g~1M^Zj>O(8p93`+2Gx?*LVm$oHCx~m{&A^E=FbhY)jf~pq zStbttag^cZHc?f~J8GJ!m`m8fFxNR4NvrU5xZ-t^lyKROmPGMi5X7%xd9~uxLN;p@ zC4%R**Q>*j$4$Amw=BiLTKP0Os4o0u*zj25hs%&aN-1k!jmx06=Y9V5x(=C~+W_!i z?uo*S#S~r!pXwy+V8jAPg*>Gp?`!?!wI-hP?kj3p=bK*OVrnr^^=`!)BCOX;zc75|G1G7Jo+FiE6jO$ZV=zO)AcC2ySsb4 z%L)C-$;rQe|EQAh-@m;NdH>>g;!r1MGjd)hIA>mwaIk}$&!u&XJ!(D1AnA4 z3W^a&pP%L9iL=uSW zDB$WbR2`RBamc9&lk_25@krR{G**}4t3J{0P>@sW91*dtW{h$aEES!WoY>>Bf&%HR zJ)K;IPqHsA77{sa$~?S6LGuM9qJcI>Vo(mtGG-o2L0WE=aX!f8O85eGV#$MG?9^s9 zTvjBGP83w|ID=g-iifu(pHc!pA#YoZH5fR{Z{(EHFJG@kr5xVMJ1W4eX~IdkZPEdE zIu8D#o9)Q|{QyTQV8qK=LpPbz&|393-=G#Ue2m&6u`D(s{|SW$n|#9{b&Yr!)-Sw0 z&v4h!@ht#ei0ww-&_09bd0)wsjl1bZh+oH72m2Wch)06=Y?{|EUTd()p20Hs&h96DHSZplH znS(GShqpg$lYYtdiL5zAA|?Ch^!8{0>9~NmvCw)L`}!_eG>2m*1p(=Nkv3F|4GsN7l`bwq$5tuRTKAMBJOxho)2s8s+^Gdm?$wvjEm| z=3S3D*t&{JW(N+wO&f0hm7?@mXrz@vGR4)KW(1$gR&Nv6nFlO#CDjFc!vh?YD$WH`rVX^BCjRh3Q} zvj!uz$x=v-+ZDegJrKNf_$T_D@}C+It4(0CaIqayj=swk3<#WSSmVvFny*=65`NT& z4X$SpU6PByf{ng1l94bm3k-)Zh*dWV1khwp02UGjOthI5wU)YfL}yT&=YL)ifx$`i zOh&ls%dyzV%wqge6{y+V{3p^W*DfONQB2dnlADm<$Ln778`YBH!hmdb>WkB=PoM5{R5jI-f_$oY2k^|reg6Fe16Zn}zA4Z_z9=X@gY)0-Zh7!DzlV9u zf5WH8*`|pwaYJXL1g2DUDO}`4e)EA~>)D31;lnul8^V>(sLPjHwG@Qi%XAVxd#C4V z5&O*zF?s1SGMCdQkw4%3<7n}RPYLn(3;AhcjAPAXPm73DWB_E8CL!1`fKSNyzu=i^ zHK;~)tWC;es6Ho(DFlioOuG?9%LI!{v0!B238W{!_K4&u=`}M=CU)Ls)Aieeihzop z8*D|F;jj8fd$8i+T9H}|*Joual+D9C#EWeQa6ycBmpV&ax%jx!;(N3zqm*#LC~D&2 zwoAI*L8Tx2`yti0VTmoRmmnk?QZPhqUz1`RoT9C}YuP;$azj~?X`^FJ8v92tOw4+a zpDLDnr&yV^%#tkkK`}&JEc>`L1p}FS^N;s-GsCYC>*T}1pg4_*Po;@dFh?G+EgI!X zD2kxPl`*8ew=CESRp}777bF|KiUh{u1%6w&&lom%6DZkLulOB2AIoAzvEdIW0mi~h zMAh8so%!Xo;5|$gDpLhQ`QpkRm@LlWich>TPNIQUsk_-UC^V$8^0_!$vqs^(cxIy4 zNAzy;+h{{?0oMo9&VIfzEh%QON0tnnL)-D4m0~0R$VfRpZPF-7m^UGJ5aF=1YJ3h2 z$ejBldb$TTm!;V$mhSbC%WQc>{q#tuHC=6FP7~Y8cSJ#+5DH@k;o##7!_Cxc8(IoN z3K!$%TP{kUW{ez+Yb)8=pVHOqeWCsIvaK5o#s6bR!@$h@;LLT`<_p=<(sIYmFwXB@ z->fc=vz_GqyNxcrPS*^JJYRehw1v3Z_Y30dYmq_@+L+x@t<^rUoLMw;wW#D;rq!hCn&R9Y!&fuqD_U zxXo6p5Zph$b6;3cJ_pCYnTOEZPhrUrIjvFKP0d+*$m!Y@(iWz)ShjFAV*rL`RcDLB zDZ?=po>EAeM6{V=l4JIwFn??rrMOCz=6yEt!=%poZ0RR8d0$6d?N<#msa=NxDjogR zqWZ^5X28u(g_%|NS?;3os((9rgea(jg~GtdrXEj+7+JtR`{(_amBR0o<&MV1`;m{ zy}fNRJrxLjrGlLmG=0B_w^^>mg3o06lDmI(U|`tUH(rx@kank*AFhw ziuZeRA)u1npEdl-GV!wdUNeP$_NQm6N4L%MxT0+3&+7KT9h~TUNE)=M+wp(<`i51b zC1ZqeeUj#N|C;st!7xfq0!`ShU^2~r$7`C69Sf-!&$+df*<9NqUO|IIULA5yVDA%| z7?d;{_-6Ry>KNtP#pUK%vf4%agr8ryc=42rR9Ra`TM7vV>G|0JEt9@F4^sAtbjw;2 zbFBOE>7=^4rjg^5s(}_I-ojCIQITXTxp4myZ;lF1YLySOMq+WWQ9wV*8eWQ-HcK?X zNyRW^a7(0EPcuUMfCDTIPKCZ$b^R}Y!QzlFaz#U{fVLly+9ODC@I7RS~}-cLSMs8&1PsFsYyR~EFAst6X>i|x@w zkTM>8LWD&HSZ9A=0BUJtVlWH{L^LF>30gD7^G7RC@xZGjRDLk0Dw+$Jvz&0vT%fpF z-4rt9%D|LG27KpDZLH*Ip`Yg3X;!A!EWWD})L{v(M-L!=3X&{#8AiP>cKR{WWbttS z235_LPkGC1!&~w{4?kFjH}Ec!|1U_JNO1U6#QXkI@BbIeo@@VlAaQ1^UZwZdEeB0AJ}N&Ghy=cv zE$Pul0ad6g3J~V%DJ4S}5s5EC=IR}OhZ;SrKFs^>Q4}nRwNoi7N7}YXY2iVDOX-jl z&7VUV_rldJK2CuMZ5tb@=q=jC({NJMs+2Tb#(6!PufFGewnovM)!GflBkVBFZU8Ol zPwZ+u7U&UqDH3`NY%v~z9tU)wS45^5)1`(Pr&{TKPe+eVhUH>C3x}QqrpaN8RC8zeDWti zEHH_#n0*B3e>tp_S>`2_OgMlRKm%w;U0*B(_^uJz-(nfc_FuPA!{e5aV1dw5Sq~%u zFI(2YeBWJZuMIQnYF@LU)Gt1vA|qJ+^Pn5G7m4@&6?2rZNf0ehB=QL7>M?rNR6-qB zJ9YRT&S!J%R-_pO9LnFz8~h-VFe5_<)&TRGK{T}J+`vW2)RQj7&E+SN9P^wyrM(RK*+^OYV4ep&yHp=j`V+;3LWa5YDW@uRWnIp|s?wCqtGo z@n)M3Sjyx8G!%!J2;rKEC!|TKM=yomwz!dw4O+p6S5nv8uJy2WE!S>q!-kAr$+R0q zxuCjOv3aQ+4?t^`$(8d{8)yt_YhCp@^RitZaPzUX!s_5$?}AQiBhsDuT@5NW z?IZSOK`gAWGZr8sPC=3V#{&W24 ze{Gud0Tor^bqRHKKXuGBxtYbeCa6_rw$xCio+MbPW=!FC-=BHAf|gg>zagx*$`_@} zS+y=LH2|}KEQ|^xQF+h8O-JF^3pC9Yatnc-mFcVsjlhw6lEY3Z9bz2To_e0IhGhKE z`iUFLKV{{y<{1;eZzyL{Kk8T?gJWN(63}--k`KXG{aJ!k2}Ta6G_Dks%|IzZJ?_lc zLQqKiJW*JZU&)iRfA`-LdaKl$1_QZCktLXtwWQRg^x1pLX)DU-+GAx6@NvyTv@#oO z)pShOMWypAjuQ(r=gx1vwnx$kF_z?ZlB2FsZ71nsu@QqvgSRpW3@9_$%To}S2Y>Na zYGsp>C0GbxB*w(>y0_KEA8-yC*@Z6$fxpd6`I zm!$g0zjKO)-j4Bs0hnt>BMa}WlQw&e1B`{HMCyt5yWa}+Z$TBAy}<4lz3^rUZ8n*- zvcLxjH7#9_9%01L;ynE^lqBRfTU{GCe*A$m0CVNPxRfP z{e3|7&{gR7n(l6fg?)T6Q)#p3%LQl6G~&=7#O+b#;Fe0Zw{>-m2oMuCN2g4>GsJK} zZJ0=BnGi+_h`P7awa{XLYz5z7En+hJm^ekre0(dvV`(T zRCQMif6^3ark+aVgnK#8kQYCUliT5vm2+x0ElX3#h|qrx_wALp_iC~3@@Es2CkuPX zl})h0h>KnMyZpGf&$7gtT zl_^Ih>d`p%p#67`ZxG)fPq^nbUh`d?;O2*c`#xDFVxP-f2aRFw%=Nxb z^vPwJ1GQz!8?HdEPjzo7(X)gZM&)ye@We&vu;2R)k4cMeuQpLr=kN@J`^!-(VQJ7t z!xam#14@@7fjKm+LGg%_Fh<|$&_`E1F;-gjO7HFKp*8beRce-j-Nsy9$z#?+SYYSk zZ}@=Wj~1Kd$HO9|ztSULdavBhes@f692iKUjK2*)@&87pvF|FR58`t_MCTI_6s0wg zY8JG+0+!X{8Tq5HD-$Z09_l3R2_!uR)-TXm@-kheHzk=68_9vKn+@*lZUsd$Pjs8R z>?RuXYi%04M_cV|*G-;}-BeU$ZSB!4TfBdJpGh}|T9T_1M7pmS3+7(jsrpHfPE|Ap zTR3d|?b>`M2j^Zqvip)(MqfU11_@#2)Vz#j>ZMe|QrRd2kWZv9 z*TI2@>D}BadcN=QdZiyF45Z9wJlQ+SkxhmKpFai+Hwce53G{CEf0RJ9k({7rP@uLh zDX)xt^a-7(BMBm}Wrh6QPc{pk<8{+FPTql1z^IMDf2m>DkYS^ie_`f4LpTx&j+|}V75>OS+>q0is|&FABBR0Z;8Zp*uFj-^VJtq zWt}AvxackK-TcEM$y$GTYV(WQP15}Hb~NL8R@?8ub9j&B>6bKO{JoNQ+(;#6rwECn zp`k&#YS9#w)6mv7=EHeV=Fm4(_d4njFO5Y&K)`<{2-|bhL65V)>$0>I+PtR!=V@G5 z*w^_-(kmQPwtaUgwu1@0G*wXlTWwc8cjV>-L?szmcrE+g>yrFAY@8x0!NvRS~+eLU_Bc?}s32AfsW{+o6hjdQ|9$99TcowsWAzjN&fG3TF+`pgA)5K43(2I+M; zRm8e6+V49gQX7bfN=ti5!7574q98t8dG6SB3lYwBo0 z`~~2NMW{XBc@_-|lXdkLxdOtKtaQ1jSc+PR>N+~RhVROOJZhcIJhHr!xpGy;8?$*L z$6MgmDBsxs%xtowxXS2Hg%h{{b+KDBCoRVrZN~=a13RJNtf4TAqDdfUG}}4aS=~&9 zrlI#uGR?nj16C?V4aGF3x&Jer%wj(2m1VSGqf$TtXPbKq}(de`~{+kQ%kS*4`U);(;|dc&%4xIWTugB~D}La86uV>3MU3 zbN0tK^)!bpSJ-dZmTPA_==pc2TbTLb?n>aesg$~T_xk`6R4$uVQSMrh&`GSUz0k`N zj>?Fhfk<&D*Fs2cJonG^V{>zzpQn`tbMRYP<6%b^P^VQ@A07tafQpVM`@A|e_$ruc zRhbinnAl@34Q5G~rV`IbaNqd8K6Ux#9Y<3O(#7J;1L>#mhv$+kX`rbf zCKRdy3)UWNWs)l}S%aZ(*DYZu1XK=SB5N*B5FBc?vqrI9m(f;?L(vSXO*;tZ1mqNs ztARs?Db3_F%*q?7G6c=Pfn5YL9L;ZiSAJ_;< ztk5h&K$ANGbBdckom16QOrH5w#I_t>dSb7t;ZNTE>O{PM3TNWTqF(XP#8~{b3f99< z6eqbcH|xRq6{bnv5ItwE1OuK7=ToX!mlc47ZGgFe-v z>y?$2eC?l*uM}5*=b)O`+JQFIYsP>R+1T%F+bCQ#cj06kcmBTh+>I5f zEkp2ETA{+`cW4|Iug(KBfd&@szWWE3DEu4|wJ35izee7@c8L_Gn$ph5~r%CfUvYxD% zO$_4bm5|jbRfSTM+M^_s259;hrK9zQPGgx+okkB;bwv%I61`H1v!q}G6%E#kJ&LlG zX3i_J9=&n3|5qYMTfHQKP+h^ib|wBEBY{ymmtGkDNGed zP#lFIkF9A+q+n*LNfRShfT@rlB4f!h4`gBbwko;Hk0DNzkJsuboX1#kgucA;XRWkN zG=G6)>jrW5$pbar0##zObirODBAZ_YYj89j`QYFHZ5h2S-4aw zx1Ae3vei;-X~QahNd}99EmmS<4v>EwsHLfyLXGBC8vzrgZ1ntEa7EUi6AU3Rl|Qi* zs8cs`06j|Y!CG=P2~(Iy9*#+-M+MjjbmhiitZ*Kn_=lkyJT+eJO9zGd$J?Pl{Y4&A&AWKm zhEq|+PzNJ+=KsKnODP##GdoMKsmDY5g+7DL&8 zOWf{)fXhu)$`xRt3D$ixxuV!i&E#j9FWZ>71_Btf?MmQROA+( z8M;n=6RSxr%dTWw7HDnv_=(o8&K(X{6w3$N|?2i9qs=(7uCwr-MAlo?!Dj zeagbKR<>x)ut9tF%uRcJb(nF;m5UAy+O&?Wjw3@-x4p@`*4LwD4kj=2xP}fRi-u@= zZ=SyJiwc$Dg=S}yH)#Xgo%c{A0uDNEo_tA{_b)CmYoKj+(lBS~bVX!h{+tQ%qOJX> zA)CHe@9_HPBX2N0cdlsX%v({Mz_+XPxg(}kV+DqI?a4wRX-Iwe!OsKDLd);T^({T) z*E5^DDQUR}6N~y%O%Z0e^R$L|X}u}Ezb8#N7^7>;CrLdx0z6^n^Cz{PJGA#IWgXq|W`1Z`W56s4JiH{2lf1n62kJx+CE)cna=ZMhC=hG`| zEqP!kY%|PJsOEHx5YVBv>wIH!(JQk_ zn-+-AR5MK+yIjmj`-5KI+_G)CVFOWKry-m>*wu04gO!&d>kMSf<p_XXZnbd5 zT_JgFANGC+cqImtL7DJf9bAZ#`rp5?QoOLo3UmK3<|gVv|C;19r){JK*Nm1eA4_!8>iOcB7j+qK4V7LC5Q_?Cs?BHsWi@^tv>OHB3+z6h=Q9sHO|w1vs3Zaj|Ji?M zy#yot!i4|4%bhL$F-MBFiD=%9h%DErx#!=flV(mQl@%LSq2FZRZ9TQ+V?ddYwvExv z$vgjcvc>(O_=k=0BE1|yI(NRGw)=p1a)O5B8_6?*4i}8|Sy~*lVIi8QiO*ZRQ3SLV zW;eBH7tb!vCe4Wlhu+4BBucB~{v2l+aLt?}v29GZ0F0F^k^xB~hY9w{>-j%z7g4+g2tqh=mE@Yz3l$=E1f&zT_^80nw`?{DvI1i$yZH_dS4x0|@Pcs~Cd#7Z`+2l7sxZv@iBCi3!`Uu^B|v8VPu zYbT!^>${Uesiw5j)&PN8ai=WHM7F1x&EJH5UefzD51EY{(qU%L?*)W}Bo$!7C*KI8 zRLX)*I(f2`clgb*%(A}%Js(rpF{P1T{o?Nbc;_9tj&5|_x4WMb*Y0v=s0fIPj^4vQ z1(C~G{dt+|GvfG1T{3(v?C#+~1l?ska53=OGZTF}6!l7V+B*i5jup5aMTopSm`u;i zAp201*s!rp%P+t$yLeuX5IB-X(L(nN!g-XLs2(D2hNg-~g$1kbQ@71RJ=6KTf>#Ddm?Buss}H~}nTgiu;(W4Cw5m z%ax-PKT0>l4WzQHYPYIg8+5?u_(~t+o+VSIxN_9wwnyxhyI|FIC>YvCwaI@wSN zqc-05rt4-+S*D0H3i6YB>ha=Iv$4=nRQ2!{w)Y~$TiD}3Fcpe_xRQt4&1cp8b=_|g zZZKvlxxje*mDpmoR2xkteQIUpEw3$s{Cz`gS8)6YR;*)qQ!;Ss5CiE@11hTiBChHS zbtF5!M*Vkc_scb!3DvYp+}&@$lgHS^#e`|)yKLFQ-p=3fQ{A>7Wt!1iavn!1B?M3b z24}MW@Fm*3DMBMMX~BearU;0lH)g~^xFv}1*M~G1irvUK;%2wsM3lbg#S%;@PfaWy zU(A6h(s09)$92i%OAg!vGlds^BcyA=%81I6^Yps*YU}0Agks56aRPB8rttWgVEFIa?q zZ{XM6>w!^2Lz1JrX4XWZ%JfOdZT1_~u_mGqTX4CezCTTU1`Ij!mvuq$#3ujcuJfLI za!BgcP854%n+LiH&w2MX27C7fY#hZWa}yJs^;ReSu+vjz;Y|}BL0Q1~(GjPc{w_br zD%08VA^G+7wS*lX9?A$E3U$By*8k&ojqdld+ji)VlpRBltNq(|o4oH)cXJ0iYN3a+ zGU70reCCnnf&B~-gXFgqmOGnnZLMNk;ilRIaU2Rmd+5#|>fpdV;z%wNu8i3e^h;fs za$<*jlexC)NC=#!3>%mFN0)@ZGM`m}zal{QG)LkQ78<8yES_DZxbKMt&ja7mZu zeQl{K4xv?m2Gsb|KKal9)UBcHVTZa7LI3nFTaZhBb@-a+$#%bi`u?+=7g4;T z*J%Ck^2P41iHfQ!GHl#|6_peB|9J&+yC#zuRMS-$R$8U?!JonMb<2BO{nU~BJXusj zE#zJaoL_&cRnjYK-t3)YN~1yxhJ}TNo}ONQi;Pu^tynX3`(R0ZvB@&Y`E^uzFb17? z3dG)fBRrjtDh;0m7wIYC;~pT610tD}2;bd85M}*JLyWO!ysDW>$0?m@OwtprLWVTv zu%!)S)D^<&L)-&`XIow69J$H1b(O-Mv2@Q2C{(h6F8sMxTn549ykYE(Fd@bytL1(* ztc->T(?tvKm|`TAJrt;dOD(O`NrK4W0qCu)hj(jeVZMVcyqz`i$2YmQe2^ z7?N0qcP+2d_o=wsmiI>@)RAG?CIm3S0TC0Lq|fX}Pk)q4B-});Cqtb~{N3vkRroo2 zH~KXQuJEVY4yP)wLMUlmDWEOrCJTOpYWe(k$wtRhhAzuB3!V1JA=Mbg=0Og{+XwI{ z?E==gtwh4lib%8qmS8idgGT~>5fKa0n2y)qE_!`VS*IjztE)Ys2cYyRn!+{8*Z3pq zfm;c4bqSC50X$aE_n?meSY?Nv;aJqAwp!!Wz(=HeB4rwTgTB^mglaUc3QG^9>}ZC6 z8=XV`m#S|pwu&5`{1#lqmkVv1r9U-*>jUn7~*rZd| zjIOn^wZ-%lHGuBr78)o)xkgT`aoRz5;2jj5*JOe{RGnP#Q!su_^6pMB%)_aHM}Nax z?8P#3@;MJX4Pu48Fp}m3z<+32xQKH=ZcLXOqTACLv~;CQzr5sQN3GeVze=M<78(kR z8ej;aMregLGG6MXjhhbEH$|}0S*dgC=?=A!LO*`t%t_6zn8GOChqS}a*V zGG0#{F`iys6-a_8X?-Wa(Eb~$!x+3wRR^!J!V?7Q@}6Jz8BGmfs#qXTbPkC{9BHM-e3xsE4y`geD= zb7&;lWMo_!zzh96hG*GkA-iN(?afs)505Nrd6=mwp&3VazrisIk*$Zn@ttf=`cbqI z=_=f?Gac0c6lgMl=9ZnSOFe1z{99+Zpe5q<)}#Apr83RTDMYgbtTE&%^Q5FC$8;tQWE?#5S`t-7=?}ZHs38{JAE--Y)aOLaM zmlH{7|J`7hB~vuu(R)p1;Qy+~Lrku-4CVK(glS?;gl9||(s85}n|f+(pzjBilSIo@ zqm^XehHjZT6|nsja9vbp>wwN-A7$+>0S15mPA`8Tb?vfNpuEz|#7#1rY$lT+V~AU8 zu?;~f+r#z@9bLljY3#4Hfli8fxm-dbFzQZz5Ap6z^4SE0W{2ocQrApgb6aao>~r?F z@q# z$A%T zf_mcpZ@&C!p$?6>oe4J|7$+iZ~FhW z6ILP0ou?S`&0AkzSM!3Fy07L@({+;Q1g2EdHmbg?Zu(Djo%aqge57dV>4`Y^@_FR* z!)f06dt~zV`04$tfXFAwB8V;tM^?;uQ?h%PvO4a~H<2r0*@?X%y41MW#>4yPyh!at z+UPNpR*$xbT?8GLWM)VGxNbQp6A4}MPG#tR+hfOO#dqzpOQbat&D-I}9)sW`>(s>e z^i;VD+CkNTt}pj1{#S$nP%l4WoQ^}DnJ zCq-}nfIuM2VD!MyAd_|Y-pTPxs%3XRPC?1^NXlmQlKqE6tPT65(^I!AQ>E0O6;;vv z(1iSrN03ZvXe5<55uqI<-7KahAf4&t=^QP<54DPbnLZnEuRN1(JH{+MGR?a<=|y!7 z>6(rqnG%>VgVju#YEL-wR5M~n+iS;M)zzc|H(2b3fQYOqJ+lC}I{(vsW*7@%) zL(9Uz-MUoaR8Ly3nAW}}c%jQV#8h;<$HRZr69ip!GbmiOx(w=j5_Ralr1$2ly&hrj z9*ui{lKr7`F&|au=;%63VDO9$-PAqzyJyc(8MC!>&@e@YHuT1#dpkG5U%vV!5E%GH zKya_;#y)!PrF;o5L?|1RwY9aKMS~N4e1I{c+1g)Z$<8ImlI3i3&_B3&NI!B7wu8tq zK|Sn8u1{7xB`xNHIrB%Za*4tAZBZwk&>pL6p-=*Sz>#m$`O0)65J6w>Cy7Ycp zxFYKR?x%t%gts3Rax`m$<*hi-g&Aer(VFsJ>KDXa4pMO-H-^qVAnCI+h{O*UfgA8eepcX3m)Qf@j z^FR(IdKYrx2lx_P-F1?Gwhr6giT*E0??j!o0>0e?AN%h4e9l7B9(P#kF1Freg}Xm~ z^?HqZIm&xM_J0cVAI@LiE_3J^Klth!Vqw3zGrA~J$s=z3Fk0suQ>g(JtNgAO@|;fB zcw5^*t6ff6LqTOe2VdU=JnT21is#M>M(+8p7dcoRQ+m#M+(3Qy)E!DGLH!r!&x|eA zxZuUTGy8nTtCBprni3A}_!8tb!sE*Qo$5hC%))+bV*wI#NU}7FCr_s6x{$6Vl*1+( zV+iYh9F5CRlKpq4XVwndTKmHbUHDpATPv=_Rm~MGWaPq+LP#2ihvFZp1UE(oZqoTj zl zBUqH`m8FZeoW!bZ=(gi&y_a@7JYxxg{rBOcn%&ol8Z!ygXi9SWsw@6a@XPLpu3b=) zBbftDppXCH?p8P7R=8ojetir>c&WA3^XiauN+xR6bb4;!vQdPNRjs6ek$Ij+l4;75 zhyKJI+DI6Ddn1qCRl}u&et@PjlZ#k6Jdvi^VET@T1~XN11%-)OIyH?p3Q)odRkXce zU!c(`-<}#o=YGEnS8F zWt`%b6FSdpx_h)fUZoinEdt~U1?C%$(4Mm6%7mZ)aerRBxH-~flc9k&;a*TF=l)DY zF@wI?NeMhG?0o>*z2=^tQK<)t>$5*w3(pkQruiyCQmKN)0N;1{^CGn}O9^qI3xRS> zqIMo?X*7~LP{2~7Wqk&RBrlbu{gPn1wURt>6f1#lIGZ;?Crwkx z=;|twI!~Vxa$15oc(Hk%)#p<&BgziH0m`o#f>;_+WgL;2Q5W={)Ug~A-G86F`Zp}< zOuX^SlCb#Beh17oSi#Xvs-0(wmag9E_YbT6RUm#io0IiH5C~XN& zK7Mlg$t$grxO4#8N)5EIlbbb>L}(iP<2KJor318V(NQ9BQ7B4RVrX6`OV%JICvEEO z6~`Tc8jlYUFeUnWZE^034uPjY>EnQVrtIF<*%Al-bkYXXNB;k0X1s3{8jzG?jL33G1+~hWf zh9Bb4hKQ|9#hXj0m=ZUNzkOW+FDlk#K){d=hlGZ6r+cA~eB3M9UJXYuK$zFMu=0s+ zBCHf5r>o~_kLkz5lh!mY7RBH|EL!yv9V_*kmUjPltlMvK2@wzw2&2QTOo@_`lPi^m zct)+Nt^MwX+h;fLMRdC%DGvsUf56iFrp3{zgVS!#asn{MzDTafN3L$+rZLJ#y!T-- zk0zP0&_+KVF=47&;op=Wy{ig{4~5?+3-( z^{2lf?7}lGWx3|X91~MFs*#8<;juR0&a<`NAiEZU8B>IPV4i} z?BB6%zP_<^-^?q@RpyEDOE9Mtte+$*lrWwVcs2W^HO#?o=f~-kNHLR-xB-b{P#S^W z|=liZsd%J5FS>iZtASGqw&WG|BzrHjjow}y3F2$}5nT2jFp%uo;KqEp+ z-$@tB+|~?wpcD6Kls3WUJU!QoSvIYi?2#4 zD?vDgxVHnN(-%Y=F>I{9mP6m8LV#&`j~@SO+4+6uV8{(#r-rRV4?~|XBP(Z&!`SLl)fV|HH`vS=llx5i|&p}8>7@^_d9?r0!4RRGi3^gmVq4ymsUO3aJ_yzU+ zYL`yWYaq!tdL55P{r+ljutCDRKWbXoz*vcG`0X3<7tF(E9iQF%cW?9D*O0!J@jCze z4^p16!~ttQiI~Tz3wq`)XMhz@Y}8!L#dY5_>T$d%p)Q)GFLoR zZfESQR3A)=O#Yy1<63>T{t+ox^0|~laCCH+*Y9HDejMGR-EkWzIW+X|^pu8js~wil zUT^H+`nn{oSE{3ZM#!N@oS*RTd9&!3C3mcm#hTLzNy+<6$B<3bA zLFP^4|8CG=@&cDmsExL@>HVaomIbx{hqbqktLka@h5=FOmJozZ2#6b`MA)=+cXw=H z)37&PN;d-1B_J)`A|Tx@CEX?6{Ve?5_qoq=-t*V)emBCTbd|2r`DE=z7q6 z{dcGI`97~u1T?=&2aS~5eG<3Hh zML42&v45ibC|xaEJK0&z3~A(wVKmf+gwiMj`j5^?WKrAD-X=wFM$D$o{N2m03=aeK z;Mz;|bLbZ84QTSgYrJlKIlj9uSQpkkN0{wpi;of-2~6>1`IX3YpU6gCyyE7xueYvDmjb3l(za ztUv6!>vzhN6fa2ZSWV?d%mdo#DN2i9<&E1{wpGKcuV1%S(D6*H(~0Z=x|pLF*rxw_ zdJFNSIM-(8!js9Dad_W@Myb>${7a$0jkn-;+eHXV#kVho7!}{JPM}$gS<>v@8SlZ* zMQadeF14Eo2x=RCXKpS&Dw&d^J(zstbd)Jv99wT+xhQ_h^G9!X+{Uk zV#d)RbNRGvR^2bGkVpcom8u!U>uZYmTG+2MSas2#KgDBPZwuZrAt21)E_%F!>?_ay zp^PsJlTvi-UsYg`UE&I>5o=Y(7nFw2A#?IU-n9z#s$xW5AOF9Qao^t(7pyZ&3A*v2u8@LnNpOLtDbIEqprqmkE7#5Z%Nx#e()8B1R*-}7l zjE{|R0%7(QKyO^2NeL&wk>Ig@P8X|1Fx~7$ceB7V+UQvq0YeO5+dy{dL%)G!ycJf> zrNHSvzDqr1ww{hDW(|WUlJS|U{-VPY)ibnYQMC1C%?(`>oy0RK)z6}l>sCL=l`edTJ3lmh zXS+Kl7-nJUv5gQT!hhMKa|Eh8`EC;vLT3s280^1&Tu7osFoM8tJ0Yf?lJFf>Ws=KQ zW57EavjFrTV;uRTD!UURZ3|t~gWtHEyFitojkV0?n$fCAs(C^1cMYNF7$>-oh9c5f z3({zd+gEjP`6KhA4XKdVa!wv4+uc_1fq0tsgxx%NN-A&x#XfoGquTIhMJ;q&M%LH0Zc z3}NG0OsS{0(td+FrypSIn!Y=Zom|beRF7v)EFUZN^|IFI$UGHN-3`yUPwm1K3zWp_ zaJ?}M7%8B5`qbl_cbzmV#cG20*1l4an%i#mBsZA&vh!Wj$KZ~^PRO)u;Hd=e#Ylsl z3L_S+G(q8zLc^R0_6aE&l}IJHQ;twdc@yy)3#!cLee)rw;XK&?7CbnV9gGtLUetI7 zo@;lu2Dgb5h@uqYiU@{IRLgn_Jkxu}4W`7ydV+TG$ih8Jl__Km0(f5VBSiVx@A7@O zVS3AlsL3OFW5=jzF-*$Esv)AZ{xs;ia@o^`v>5ZKa(F+sva=YGERq9Z$r5psO5+>f zFK*M(C-bf>s`(zf&=EYD&F+WT@kT*C3Q|4_k*b|hKWC9&XpaVuZgFRBqTo)xBV`F6 zvra*LS1fjJ!9NJ{%uif(G|Cc*4G)hX_@oMX@j_T}^UNdh^a(f1_ld5S)=py&mq&EL z9khl#bTn)+Tbwhz4XOMtADhg|;F@&l{e}o9=NcE-WJ-R;2PP?tIe}n;prE(OFR<0( zKcSMTJZ*mSaUsJPfe8Pl7^+C4&@c%~lr*|_M_4D>4z<*PQHj7hxw>2UA@rMXp(rhk zybURchPNol$ZZx%g$W}OEVnh{c`U;_o%J{ESSu=(C$iCS5|(oNZLF3}$j2|{qg2nO zIa0~8W_FcIRSW*uesM~{=!7W%-+3ju)o_=MAB{Ro1 zU#w@u4y;|;dGC`0vFqjEuRZ|@?v+jD!bQ`@X6}Kid@U>0YAmVE-8VPrmgDTx*6Ht! zP&3{L<;`U(7aJ$j3tlgW5#iz}d3irS#V}MUQvb9@_qwmobX3E^`e~md5Hc*pDpWct z!ogSX%NSupz?YJ&}iWYJ}AK?0%1n@=2DuMe+oz3CYkre|hWZZ40%eFH{5 zrV)$J0} z-*%F2{`@J5Cq(oZRTxEAw@Y~Jx~?R`(!))5+Vi8(umUwCeCulX>I;m$q&PM=YEn`Hudh&T-B&?{{h)vwhQVd^26_Ok?sxlu>C4!}z@K-{0lc;Qa7%~i0Kzeg zMq&@%D0Eb!_tXHQfSjt>dm>H%EV2HEb>q#z;gyx0@r(`73Z^x7G%l~*PxeeQITd2L ztYLKDRdLS9u89oE;scoaGLR>H%AWL90Qz)6L}lgSfn`4Gxoc&xws+*!+JjXeO%b?r z_$maES`dQXDjd*LK&BnXLQc+08rag_j(Y2zuy7Hvuo!i>dB4cJa7nx*2{?vtHM-Xw z0aV7ZozptkLjsMArcMK&^U`{cYsvydOhVHIL9u#@&y~Wx`CX6T<$j%u51HIfrKeAl zBwcT}#Yaq%Jd4`js}+yAxF#-Fv!m+omgG7a@`j^)SAY?Zw_zrg-y>d?sdIIcan6}= zywvcF7p)}1k+Y}L#^VcAInuS%wwCu39|fi?xtv`>CP)Sq1$q1QDq2znqHTenr(A%w z_l6XU1`UO9g)lhlsl0bHm5AVPXda_QvNPu#;S=@%U;+cxYBy%{Z2?6~UUVy~w$;3# ziS7mobT~Dds_&~)VBsV5B-BiAT9EEO^zF^FWaY2m7SeG%eqK$VOx8{%OMv|ne|Y3K zq#;F)qSiNC)xrg5#Qk~J>(LS}RwqKO&jp`*O)Ir3>S0XPOaala+}#t}l#@QZ>Gv)V zgsQVKhdGW3DL+$yL2h2{FOwS z(oS-$#Jp$k0}bg2!1VWn(eb=zCu=Qp|4Ku>9L?I2FU?7ry-+C`CA(~aA|n%}=~dU8 z)WH!xG_Z(9zyIS%&v*oB=~EQ;^=H0X0A}zXj120P?Ch^GZh>$&JT+NDUBHEH$^MRC zc=!z=&SQ&TO#XgMQ}n0O5g{W)2`m{<3$tWP}l*^qR}Rx{sd;did#Vnsysk+3*!^}Ifj zi>3N;%4H*GZe|pHBZ({)&+5+Kub-ep<=ws9!|_!a*1IN>JU~DF2QP}M6tGVk8Q!7R z6JzZZl<}-sX^M>Pz?8McFtICY()GkXPQO%vlfVQHkFBpKtkPkgn4D~Jnx3CG0v4K* zbkf`uOHWJhK8f=6`USlPB2IaMi1j;`CCSfJcLz^@6+Ro?;`GjtrjJ`b>c9;4l_{Of z)Gww91ubI<^*W?}^f};WA^S0FGwJkHE#h4@9G~tm_+aAcS>g)QH|^q>9@8hYsD|Z3_#tU=Uz!@nM*DO3$|i>Cp8?Qh$kJ+C3T3kS1&$)uq?N80t<(;Plj;K^U)5 z{YbLAFqmCHjGjmtR?YNh-=@M~*2vvCP?0lyHFl(!^0X6qCgnVTl54o?5s{dP+LyZK zAVU%QEp%;_5N>#7Wp`+M_Y^7roME$Or~OYyQOk(I=qV?{ner_QujDzdLsMV%qL7F5 z!JhUD?z;~e7GP;cqJu!B5zZiJ(&3@ZAL|6Ig;{D+9D;)$)!vshBcQRdm5VmO5B-+Q zc`sY%EoY;=gHLRk!TTMAB3+U-B+BNuC@p$tCwgY~&!T z!`-Xg&fKZFDH;kKr6P@~IX!c0=fvnr2GTxJyccO73R&NAC_vIPwJkxfF(TysMEN4I zI18QFMPOKSLX(Y%sF89u`F=TvGK01X2wF)9)2sHZwr*)O3B^PTDlx1s!4!f!Rf(O^ zsfAo^rcqdJz5DJfQLXl9)9-Z%7q)eEmEJJr7)Rrl7;H@J z&H&q2Wk65{n1DK?ucGEGQM@`-;q-@74U}flSZf{WGeWP+Ne^(+at{3UXC&vknchZg zVFPD@AR~z&J^cJX{_!oLeuRcZ`&q`n%TmP7)(mQbfZ5r?Rh-O?96=`kc>sdhnpiuT zLP2mBC=>w(!5<1R8ymr)rXVvrJ5x9qcu4LP1V&CnIZXHxSea0ks7g!9j3a zBNMB?8Wd5O4>wbwd0t z1a*PgnuE-pY`}jX!|iOK2$&5NsMiDvGI4|&*|1<>s9HclYPK*0&_a2mzrA7rN!cQx zj<$dAjI2Q_2%u6UM^oUjsS_OG2m_vpSR29NFf*9R-$EceGmx;gHAoB~g`Ew|1SAa5 z#~FqI8Vh2SQjrpQ1%jJcKy9EPMn|YK3=Yr^#Q6$j@~=vOQpR=&i~n@%pXUA#;zAwW z9*Fc%9f%E(_kWY}UnGZv5I|3CjBK6Ej7$(t0DXZ*{THGB*7%>h|F8_GmG|G|{VzT~ ze9GR@&K~LrVl**wG_rwO|D`lgffI0HYX>y#fy8EZ0AXwaJ_Afe03`i4TV6e|=)Y0l z-Vq9iIyyga<1d?lD*m$Q?+wTv`nUQA&e<4QJrw%Cng_DBbBEfR14Mc#VQ&OS08u

    C;(01E@3!U5l6gd?)I09<(&@?F#6%acs8_*cIz4e0*{7YLN z*a>KU*+2T9h=i1gB=xBHQQD)l|3@qE|MP3UIf|%gNUuVa{9E`$jbMPxDLUGjI+-Bg z!XVSX_kavO+=J{KK{haJs|T6g~2W#@L`v=?NXlL_}{67=}1mDKU#>U7R5E3>$ z&_8wm>s>&K{+sEsfSFr>ptev)b2nx;7}VPIuZaGqY6P4GB>eBsK4`7IH6ZW6#~uHE z4XD!u3fKWaWFNly@NJ-JfW%n?Z8G{-CxEj5zI@P3J4ZL5PJ1IqpqhtP8v}L-jxYmW zfZ3V>mH$f$ESvyUeozFsla2j@S$g=w|3wwRi~+2+b8<8R-nDmx*%&#(0BidHAq9~A z0@UdO2$&ES%XBKvj@PBOTKN@ceSj-0%`tR>O zC?R01fXe<&SIMGc~n_g2aGs16KAQ+YFdi*h7Dv z0OM#2eK07{2f6?T4+f~t-#*FN*_zu~|F=>)?0OGe0IVXwQ9$q!)=*|ETRRuqhtDA# zjZ6UpY-bCo|HGF+!tnq0Doco>yaYDJa|}SFv85zM0UtRs7`QG$Ljit2!pjo_{z10~ z0&9?vSZE*qBD>}YIs*@%BBbQR{-S9;rNPej0m}U|>wQ4ek}0E`c6jMLdn>-W;Z>-A zTQn@lIgI^5ln{gzN)>JvPP8F`okIqb733&3%L$OBFaDaNuH9>z8&DOOr2d>ELe_*p zOo`$X2VDeRI2{rJC?&!cDPnJXyU_hUAqn4ME{gaa4ZDHUM{C#<(DO8$FW(NB44M*> zmX^GuGT^$B#^f_ood$ZFXUtQbTs2a45jNJbK)))0`9H4qy9i-1r+)qy@Z1AVQvZ$wMY8Is^9>VFwT2xPOtku0)@vOd z&!hQk>tdTP=hxvx7@}qy+&~JEDrY2}%x9c4DY_NOif+H4b96=m^~%9pos3}{uAZ+k ziQnbvdD~Cg=|)6TcP0hbCyG6O^)6och! zB^tFm_RbZp0q<|`!6s>@ePTg@)cU&F<)R-hu#XKaF|p6!*4nRFmn7fe1rh};WvEuk2||Mr)TE6YOFguJ2$Huu%H#-Qt;UR zncIG&i`&5>wU?Yo{L6<}OCZYgauzR!@d!9eVfnlO^@eFlF<8A)c(`;KGLIOl_$JKz z80&{?*Rxn~pIfKlxt#*aYkLRdVn&}P*H$6 zu&P?lwDqX13%`Ke&I&h{kfhqU@RLi2A~G~oMZuhJOVhyAjCIVLCqex-KGs8 zKGX~z83Cv1hvnq(TH6*Y6;Tc6Qw>}1javL!Qjyz^6RFtZi(gk10DoLrR#C$V70Vi7 z3^SKkDXqR(ozTM?dr1%(D}~D;=#h+YOzq$pVs|-07w;mG>X0bI3J@O05E`ua25}CVQgD8kWjX-dVim1zc>tJ4ddk_#v+TRtDD?NeHY4HHkO-hn?i5%cHqU z3tbN2m=K~R#c)YRIVSxt>b8W6ZK;j+N!>{*sGcn1P6_UCTs@cI_Rho|%Ar^VeG{WS&K%=_9FHA}KNE*Vi?M3DI-UDrE0~>VqRVunJj*638PR)!1Bckp zf<;&I??CWl%$q(zK>zWsG^Xkd7n5N>7nnU`wJ{eLx-ECrBg6S6H^DZOPuR_@sA|Ry5?2$j5t{Ybjq&3|q zy2w6^!3ANQO#Cs_nA1Skv4N4JajJ2-WaYRS0vrTO;{5%9qV!5*`zt$7XQw$MmV#j- zOJhmT`k6q%D(O-?9`4>;ixbwMfmeKEwHiSZR?B;26Auy<4mO*QQ36`acSp}%_W2E0 z%eqvn!+R#cIU*EJXhRfd7XWC;!#^YjSt_uDv}X5!AQ|SE0;62|b)Nb}3B1R^ zc_|}rgCse{oB^nw7HVHZAe2b7S;NfI^RsPUOR<8$@=+Yex81#w{9ot++2N70O0TH! zFvO(RIMSWv9JO@n`<8YVUTTmUo7)kJOp+yWcZFPXFcxNb*9H`dyIuA*BNfW#>57K> zYwCE1&%+Oj@S;TVJ_vzAVb9Sb18AfzZs*NgNACUEsH=Ce-HVB{80{5jP1jo3H(2yc zjoqJ*ISxDdX@Xlqrg;E!Z_gZSmMw3|*w>$Pe6sVFU4)Dvgxka8+An?+$ir?H49?2` zv$yAPdnJd^+gQ$#0phvuE~4%e9qVN|3D$rj845Wg)(1iNH$H1ur{oU@xlB5_Ed`Jy z8tAT;-W@F*+T9H_uNN6yvKKpt?WWm)`}!i@BuKZ@DAm-|9K6EFQ(%sfepxO@*fu;| zO<4oQ=6VO`lS*eJkifU=t+lzuJv_dEdd)=tTzz* zDGd28K8cNr?2DYFC@G95Yi34Y=dpuRvO8>T@#9WAZfOZs@VGTBRS+J>kym1Ts>;;h zb;TSeULC+lDw!n>B3;@ZFX9d+l2OBI%T=~2uk`w0GzF~tO)QB~Xp;Wmd1ZH{=}b<~ z>xoUyaJyqR8!R4X^D>I3I2LzrXG1AV=FQ!0ecKg%0Wjalf-N!m=7YC@{^R?94>4h6 z%*yazZwW@5o zL(|(IwbW4b!ik?VgI&_DZ**}xtb@linnbA~tu4YyfFsCHyuLz;oqp7EPm#s$XhdQk zFdkaE+%in>KGH}eY1eiC&VE}M$9|~!xwW6OqgYLQji7=Kl=1}dl&LUmz*J`dtSv(9 z>n&#|RiAKINEAUhzT8H)tn7Vp`Swkk%6IbJCpot-P?6tLQ(Z1mjE$)b~NpZVQSf-Q?X zlPWjx9^-eNdb%y#tiN;HpL3~q-epQ)(W4_kFRyHD10qUdhs;UIn9C}D^be4~t8>}F zNi*|nYZ@)!$yP1C?2Te$!a>tg!%{Nm9iCiu8>})CTAy?SX=cIbDVd*27KLh z?qi+FV=EB_1#;P5RD13Hv~s<bH507t{i9$Ap|my!meeCE^eutj^aw$oR;axqtqWz z(!SePG?x37Xo(WQT9@cnRybr+AyG3yAD(xWoT3G)bcenNQDz#oXc42< zX`?`e)Vpu3SFk9HlY;m#w5in!7)76{okz;k*SKUas2K3j*!bT@&`A-6i2+cUTLFHLY}mycp8_ zMwt}j*MbzH`B}T#lL&CAgwd3k(4yU-8otor^aa+T_cxrGyJ9u2R4!3<#VetkbuW%3 z9T$XJ7qzT@^!8NsBVV|sCUMr;;R5R#6oNTqg*D_{Zq0XrJ6kJ}_pUnwVyL2sfiII| zWwKU^PUyb1UpYw62(d2gZ2(&&4JI)1F!8&+eUWvDR^N(ONX7L|<8rl=_cN}uMXi-= z_y)e{3z2;Qz6=0bEH3s+9uNpIjf`%k%TbPCDB%lO;kGWZDZg_K8aS16ykvVnVx(Na zcW56fX^Wa!#3sPimLsF_ib|C%Db@V2U_%l$=Eu=4m9dkoy_&VEb~Q%QAvn}{n7Mew zb}v@iznnQulrOw6^v?@h<>GxKO}Xs>_AS+zo&p$=)>^DiZEzRiMV8X`IQxJ+rWA4h zc&{o`5Rj=H8{CB!fC3hDZJ+Ar`wp$BZ0NZ2#+N0Lfp1lT_ZGa6O4_sI)b`%Y9n%*U zi)hagh}6@CZaZ%5b)nftg^a0u9W~NErQw~i;&UzgIANEWC? z0>J#oHqgaLeNW>WQ;7uz&xE7`SYaGNv01DvwlWMn;}TElx;ESB2W28W9j)_QEc8ANz>KEC=^%jLaKW=bs7=K2a_U zUYJq{$-Ed@g~(_eD7ObaU@%(zf_PU0^CTH66K^T|aQA?*ipR+^a4AFyr)HwSDJvD? zmMjVGJv*a6wTydDEdkjR+0h8`hsH#6ru5a4z8Fy9a|PzC>m%Eb_T~&kh+Y6%AOB@p zn%#F<1YP{c)CM3w_w6vF=ANZHuE+@n;sa_3PO*5bhf4yt(-k;QJ59Sda$AFpjEa^B z{V2`OC&l2Z!@v*@Pw_b$x+D1s_4M?uuh(+di^$1&i2%|KY~e?%uL{SR7Ov-AdNu(4 zCxjD;2LcF95WA*J2r&ORPK7uTC=qp=1#O9I@X))|{} z^h*J#Isn#ay@SMH^=wz?&z?2h)n14_4n!6u-=81gD-es^4E9Cny%6ZF> z>)+)gm~KHSIJ6Ry=~RU;dD2Qp=)puA|peEA6A$u&>Xz&H*orNw!sH;WINj>MK*({r~eO8;JipYn3B2iu`Rw> z$!JMw`Hvg?CBvU#+kM$-qKrAZ7pfuvn*^z=1`#N!Hak z^~>v{izO3Ooz>O)F#i=YiaEfsh@pjX^v>s)RzBS=UVp*J#U<)>!W$)~-HPVs!4N{i zRNiJuCc>BaQ8AM3TW5%hdi>-8%GWY7sGbDcd17E2?loesH~R zLoRt7FDY0QOEuiC3MZY3aL)=p%jhSxp2R~B;(!&RO$rbSfP;IEuXk`g zj=bpk{Uu+CcjOq30Jdi9NHUNoDvYG2_HMqQ@0v9| zk8k%^QiFf)PdP?TgiqJLr=PCZY4biQFhLJ2EX*&IW+W9=7qy-=q|2av7NRmcPyGj% zm5W^*g!g_7u){9+b4Z8XXayIX8gG0;^!u_(Yhg|)fHnhN7PFS<9M(&(bBxF<@uJk> z2)Up`=tJLRI<1Riv?{xB zt&&8%D3(Z`deI21+U@25|DCOOclRb5E)^drUACeU(0`)J2-xNYR50L%k#L2B=)CWb zO#&%-3UyL9Vc4ogsTb@&m`2H;x`U{KB8;1@C-<9c7$0>hz?PY5uP1+u~= zCY_8&NLNf&!0Fm_DSeJBSJ=eFB%e$J6a<c2Cy#R2b$PI+>E>xeH;4)DP;{jeMi|+!U{wS%_mExZ*hQl%( z+`SrtPq^BKpN@aZ>VEWzH=Y4N>G2EOsY~A+bHYa=S+YRc>|vtQIX>a4Noj&T-J7UDeAMfVYl@~189G#YdD={l>-FZF>Nr~7_EchViHWIMy8DhkZV~p3 z{y>I<*D2G&{ru~?c$vl#U@f?a+kqw#YZ{1wXn0=uroB4BVAVq9e$)bivhExr()5cpbiIKWj6cCLPGr72g5HZBFZW&{g%(MD;BQ3?2Ii)pHzTN zNS~z1n;+~02T4oCFIl|NZx|ONf{Kph%$&zOx9;n7;J@qTE3D(3Gk-21^dzVEQe!>_k9J7}PCSMKlRB%Sh zEvsx&ipSLyRnuLsUJ)65o*HJ16qM4gC3}&vs&HTG(`R=(0n8%mdzM4svcX(A>M4y; z`v)Bv*HC(KhAB_asKXHOR%%r9O&>1zlvnqk6D@)zlv2-)X9DMcFu#tu+0I>lYIeI; za~F>_vx__QFhM-m^Zkf6MtICgZiDg>^-eLly83O+xi!6cR^1)y_Z>S2!7)-eMoBC(GJUIX zo~v7&T3es@MdOP}8vT9C6wz156{yggO#=@+e|Xz<_j60p;&@o z0`1biy$LRrSQA-=@bdDS!R)6prpm7zfg`BZ{e*rh)Xs?iwA$w!coe?!R;!EditXc` znrJU5bCeU@o_)6ODt!TCztK!^nx&+y{oLg(XqOofwu2$@tT^%;W1_@l9op0*<2y;S zj~aUQ6dfQ;6kj@H9xiV+F?GPlb@yu}rLIJTo0NJHb6Mk7lu*gm8xgDFeStA4_#-5% zm+$l>7I5Y{9$#St?cpyTcwPF#&#cC6&%CL#Kt;j$`9WK=Tg0+3zTOxR*hhoh+;b-! zZM$G>ti) zG<6j>WPH)#M{QZ|yxt$#*$$QtPJhy^G^pzxKYM`HWSCq)m^bzNmE+DC{~0ch#jhRR z#w*T%Rz{H(+F93oW@ndo(T~I2i#w;f(EwBdAHQE0oKnJufQ#1<>~B_;WRSZ2Cy8g> ztc&c8=~gZ8kE`Ayia%8LnqYPad++8H_dCJ*0Hf`jn>Y9DJ=T$HacW=5SVIEV0&L~sr!0%2i=gFOd5`$O0dPKR1>M`h&;vMB=d zv^x>u9m&s|5S$vAuZ`P{XtP42`g=T7NFyb`p2V0Og|4WS_|7@MNl{5?E?V`q?b9lG7S-gy>467#*ZUQ$%|GKX6G+L(Rsj7c zUR{2*p0_bIJM~q+prWz9tCs`q z*BGhz_&vDsA!^BDjQmR}y5(OxPNGU*CJ#kZ0l$WL_EHWx#mflF83*f`+=YEyVyW)X zaF{j-Lr~a}%Hukcr(A*XLVss-E7zZPfd)-;0{qbe%+T+6woh zrhX1{s@RKkN*O#^3^NweI~+bF|UGERG1|T4gqe|HCW%`ugdQ(+T>HN7#Me zR#a{_lLzjELlEw0r~z|nUPqTw={J`P!f5NR``30#Of_|9tHPKL}1#Q?zQ)l<`7&QDFWtypSQ1UV_9`gZ^FUA?XrcDw1iSPG&X!# zP_XY~dvK+LtJ%f;Y3Dn)#6BtVQRaVfQC8c(s%N}9isuDs826?6$Q8# zBPR9p)QZ_ZO9C;vfE{#CP-X8)(D#hq>XEuiWAPrB;EG*pord$B_rK+uq|7|`AUZz- z(io_ge^a*T6piEAYia4P&o@HN%<1tXciD2;J|O`x&hM%19?4~ofGBWqiT1h{0oVPH z)KkL`>Xq18tf2ZR15LpRjSxSKow_UtvAc8(C#YBMn9*DY?-LaLcWx0i=HW)e!kWJvY6+oKp#` z-)i?gyNiI6ev{{E^F#SOPd+WRvcB=T>;um=w?$BSeOTC7>1e(`pLQ*4Jq2)?5Q@gf zhs2kyj5U}!%1JH@%^$yZ1MpzSUt^VsMwa>s6YL`h7B0H(gAEzmbxND%A!Oo?z({8v zjT+Z8BIV3gTM*wzG^t(>Uy%S8&*qI4Qv>=>g7$>JSfpXPl?tu0u_w$*-#zFg8iM3ZxCAvgo{l%^DW2Gi0ODk(CTDC^;tzIX% z-B=_DURO4+<_Yo`*_I6Mc~ebVEvrFNQ^jT%X4fyQ`yUeTn@+3@a#V|HnK6qwRMSm# z2CF2!YBX<~m8!g<5U@>uRiCm&TrBj}l7+0|tCf0zxiOAW@Y7dpt)TGE&D7BSMQtuA zPVwY$rF|l)$l+IR1S9#M-7a%Ty0h4V8hBGFUySBYB<&;eCkr?EpahYw*QYbzz|0j* zKV%8Se%uf8hF?DdPVgSl3gis5R9v_Bi5f8!dLHE8#__~lV)k~CAB?kNS5qpyEC%(#WQ_E>PkB20hxg!sy zU%EF6jIyAmZGg|=uahv-Cl<0OQtd9RyXr3laxm<5yN$0CU*AsS>=f)V4-IXRY%dG2 zJ)TNyWy`3%ZG+~Yk55RvKoWD@dK&4XzpHq=QKl;^$9 zAI-bD#42!Quts+2HkQj1oWrV7h>4$D+s-eoB7%l|?#O^m;2FUi!WzN4fx8h}cXN*^ z`PP;thCh@7s}eq^PwJl!^Ybo_tORk#0|9~YuQf^mFpSyt!*!NBI#c_p6`9f>opGnH zJ$F+KOx(Oe-Ywja^;uzhZg?yR1+!((Q$D>;vEW#0JGVXF1`att{^O*JncOtc`I|tB zd;Ru&-eh>^aD6vp%=TBoWZ!JlEu_{i1B4{g`ujIUgt*^;g24K%%Yq37lfL^_7zO2v zgZT!#@|q^e`t8xJUobAKo5iPsLKrDsQ7 X~0fNfQH*8uaA%+51;qJ2jMsE1OhUc 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�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 - - - - - - page1 - - - - - - - - Reportpage1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - - - - - - - - - Dialog - - - - var printForm = getVariable("showFormDialog"); - -if (printForm == "1" ) { Dialog.exec() == 1; } - - - - - diff --git a/demo_r1/demo_reports/pu/database.sql b/demo_r1/demo_reports/pu/database.sql deleted file mode 100644 index 403e3d4..0000000 --- a/demo_r1/demo_reports/pu/database.sql +++ /dev/null @@ -1,76 +0,0 @@ --- -------------------------------------------------------- --- Hôte : 127.0.0.1 --- Version du serveur: 5.1.37-community-log - MySQL Community Server (GPL) --- SE du serveur: Win32 --- HeidiSQL Version: 9.4.0.5125 --- -------------------------------------------------------- - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET NAMES utf8 */; -/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; -/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; - --- Export de données de la table essai.resultatglobale : 56 rows -/*!40000 ALTER TABLE `resultatglobale` DISABLE KEYS */; -INSERT INTO `resultatglobale` (`CODE_MALADE`, `noms`, `nom`, `CODE_PARAMETRE`, `Valeur1`, `val2`, `val3`, `val4`, `date1`, `date2`, `date3`, `date4`, `unite`, `groupe`, `bornemin`, `bornemax`, `code_dossier`, `TYPE`, `sous_groupe`, `Date_prelevement`, `date_analyse`, `sexe`, `age`, `mois`, `lieu_de_naissance`, `laboratoire`, `MedecinTraitant`, `TELEPHONE`, `Date_de_Prescription`, `DATE_CREATION`, `hosp`, `commentaire`, `CODE_ECHANTILLONS`, `MATRICULE_ANALYSE`, `CODE_MEDECIN`, `SERVICES`) VALUES - ('00003P18', 'Mr KAMDOUM Jules', 'Protéinuries', 'CZ', '5.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mol/l', 'Urine', 'N/A', 'N/A', '001DS05-01-18', 'Biochimie', '', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'BIOCHIMIE', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001CZ05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'poly. neutrophile (PNN)', 'BF', '215.10', '27.46', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BF05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', '% polynucléaire neutrophile PNN', 'AB', '45.00', '42.25', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AB05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'poly. éosinophiles (PNE)', 'BH', '124.27', '196.46', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BH05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', '% polynucléaire éosinophile (PNE', 'AC', '26.00', '302.25', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AC05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'poly. Basophile (PNB)', 'BG', '162.52', '196.30', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BG05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', '% polynucléaire Basophile (PNB)', 'AD', '34.00', '302.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AD05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'lymphocyte', 'BI', '4.78', '277.15', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BI05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', '% lymphocyte (Lympho)', 'AF', '1.00', '426.39', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AF05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'monocyte', 'BJ', '23.89', '1.68', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'G/l', 'Formule leucoytaire', '0.2', '0.8', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BJ05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', '% monocyte (Mono)', 'AE', '5.00', '2.58', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AE05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'Hématies', 'AT', '124.00', '4.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'téra/l', 'Numerisation globulaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AT05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'Hémoglobine', 'AU', '78.00', '64.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'g/dl', 'Numerisation globulaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AU05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'Hematocrite', 'AV', '45.00', '342.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Numerisation globulaire', '0.37', '0.46', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AV05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'VGM', 'AW', '76.00', '54.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'u3', 'Numerisation globulaire', '85', '95', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AW05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'CCMH', 'AY', '98.00', '8.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, NULL, 'Numerisation globulaire', '18', '22', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AY05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'TCMH', 'AX', '76.00', '6.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'pg', 'Numerisation globulaire', '27', '32', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AX05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'Indice de distribution GR', 'AZ', '87.00', '4.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '', 'Numerisation globulaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AZ05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'IDR-DS', 'BA', '23.00', '5.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '', 'Numerisation globulaire', '19000', '90000', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BA05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'Nombres de Globule Blanc', 'AA', '478.00', '65.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Numerisation globulaire', '13400', '123000', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AA05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'Plaquette', 'BB', '98.00', '54.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BB05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'VMP', 'BC', '45.00', '1.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BC05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'IDP', 'BD', '31.00', '46.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BD05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00003P18', 'Mr KAMDOUM Jules', 'PCT', 'BE', '8.00', '548.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BE05-01-18', 'P001', '001MD18', 'Chirurgie A'), - ('00004P18', 'Mme/Mlle NGO\'SEAM Madeleine', 'Temps de Saignement', 'AI', '6.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mm/s', 'TS/TC', 'N/A', 'N/A', '002DS05-01-18', 'TS/TC', 'Hémostase', '2018-01-05', '2018-01-05', 'F', '30 ans', 360, 'TOUGANG', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Externe', '', '001AI05-01-18', 'P001', '001MD18', 'HBD'), - ('00004P18', 'Mme/Mlle NGO\'SEAM Madeleine', 'Temps de Coagulation', 'AJ', '8.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mm/s', 'TS/TC', 'N/A', 'N/A', '002DS05-01-18', 'TS/TC', 'Hémostase', '2018-01-05', '2018-01-05', 'F', '30 ans', 360, 'TOUGANG', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Externe', '', '001AJ05-01-18', 'P001', '001MD18', 'HBD'), - ('00004P18', 'Mme/Mlle NGO\'SEAM Madeleine', 'Prémiere Heures', 'AH', '4.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mm/s', 'Vitesse de sedimentation', '3', '7', '002DS05-01-18', 'VS', 'Hémostase', '2018-01-05', '2018-01-05', 'F', '30 ans', 360, 'TOUGANG', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Externe', '', '001AH05-01-18', 'P001', '001MD18', 'HBD'), - ('00004P18', 'Mme/Mlle NGO\'SEAM Madeleine', 'Deuxieme Heures', 'AG', '5.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mm/s', 'Vitesse de sedimentation', 'N/A', 'N/A', '002DS05-01-18', 'VS', 'Hémostase', '2018-01-05', '2018-01-05', 'F', '30 ans', 360, 'TOUGANG', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Externe', '', '001AG05-01-18', 'P001', '001MD18', 'HBD'), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Groupe Sanguin et Rhesus', 'AM', 'A+', '', '', '', '2018-01-08', NULL, NULL, NULL, NULL, 'GS', 'N/A', 'N/A', '001DS06-01-18', 'GS', 'GS', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AM08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Temps de cephaline activer', 'AK', '24.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'S', 'TCK/TQ', 'N/A', 'N/A', '001DS08-01-18', 'TCK/TQ', 'Hémostase', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'SIKATI Paul Rene', '6 89 85 87 47', '2018-01-08', '2018-01-08', 'Interne', '', '001AK08-01-18', 'P001', '002MD18', 'médecine F'), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Temps de quit', 'AL', '12.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'S', 'TCK/TQ', 'N/A', 'N/A', '001DS08-01-18', 'TCK/TQ', 'Hémostase', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'SIKATI Paul Rene', '6 89 85 87 47', '2018-01-08', '2018-01-08', 'Interne', '', '001AL08-01-18', 'P001', '002MD18', 'médecine F'), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Prémiere Heures', 'AH', '4.00', '', '', '', '2018-01-06', NULL, NULL, NULL, 'mm/s', 'Vitesse de sedimentation', '3', '7', '001DS06-01-18', 'VS', 'Hémostase', '2018-01-06', '2018-01-06', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-06', '2018-01-06', 'Interne', '', '001AH06-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Deuxieme Heures', 'AG', '5.00', '', '', '', '2018-01-06', NULL, NULL, NULL, 'mm/s', 'Vitesse de sedimentation', 'N/A', 'N/A', '001DS06-01-18', 'VS', 'Hémostase', '2018-01-06', '2018-01-06', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-06', '2018-01-06', 'Interne', '', '001AG06-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'poly. neutrophile (PNN)', 'BF', '1108.52', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BF08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', '% polynucléaire neutrophile PNN', 'AB', '74.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AB08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'poly. éosinophiles (PNE)', 'BH', '674.09', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BH08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', '% polynucléaire éosinophile (PNE', 'AC', '45.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AC08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'poly. Basophile (PNB)', 'BG', '74.90', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BG08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', '% polynucléaire Basophile (PNB)', 'AD', '5.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AD08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'lymphocyte', 'BI', '614.17', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BI08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', '% lymphocyte (Lympho)', 'AF', '41.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AF08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'monocyte', 'BJ', '629.15', '', '', '', '2018-01-08', NULL, NULL, NULL, 'G/l', 'Formule leucoytaire', '0.2', '0.8', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BJ08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', '% monocyte (Mono)', 'AE', '42.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AE08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Hématies', 'AT', '5.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'téra/l', 'Numerisation globulaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AT08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Hémoglobine', 'AU', '62.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'g/dl', 'Numerisation globulaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AU08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Hematocrite', 'AV', '41.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Numerisation globulaire', '0.37', '0.46', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AV08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'VGM', 'AW', '12.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'u3', 'Numerisation globulaire', '85', '95', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AW08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'CCMH', 'AY', '44.00', '', '', '', '2018-01-08', NULL, NULL, NULL, NULL, 'Numerisation globulaire', '18', '22', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AY08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'TCMH', 'AX', '74.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'pg', 'Numerisation globulaire', '27', '32', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AX08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Indice de distribution GR', 'AZ', '45.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '', 'Numerisation globulaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AZ08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'IDR-DS', 'BA', '41.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '', 'Numerisation globulaire', '19000', '90000', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BA08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Nombres de Globule Blanc', 'AA', '1498.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Numerisation globulaire', '13400', '123000', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AA08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'Plaquette', 'BB', '7.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BB08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'VMP', 'BC', '12.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BC08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'IDP', 'BD', '54.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BD08-01-18', 'P001', '003MD18', ''), - ('00005P18', 'Mr BOLOGA Pierre Marie', 'PCT', 'BE', '74.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BE08-01-18', 'P001', '003MD18', ''); -/*!40000 ALTER TABLE `resultatglobale` ENABLE KEYS */; - -/*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; -/*!40014 SET FOREIGN_KEY_CHECKS=IF(@OLD_FOREIGN_KEY_CHECKS IS NULL, 1, @OLD_FOREIGN_KEY_CHECKS) */; -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; diff --git a/demo_r1/demo_reports/pu/database1.sql b/demo_r1/demo_reports/pu/database1.sql deleted file mode 100644 index ec8f7be..0000000 --- a/demo_r1/demo_reports/pu/database1.sql +++ /dev/null @@ -1,123 +0,0 @@ --- phpMyAdmin SQL Dump --- version 3.2.1 --- http://www.phpmyadmin.net --- --- Serveur: localhost --- Généré le : Dim 14 Janvier 2018 à 17:34 --- Version du serveur: 5.1.37 --- Version de PHP: 5.3.0 - -SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; - --- --- Base de données: `essai` --- -CREATE DATABASE `essai` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci; -USE `essai`; - --- -------------------------------------------------------- - --- --- Structure de la table `resultatglobale` --- - -CREATE TABLE IF NOT EXISTS `resultatglobale` ( - `CODE_MALADE` char(10) DEFAULT NULL, - `noms` varchar(266) DEFAULT NULL, - `nom` char(32) DEFAULT NULL, - `CODE_PARAMETRE` char(15) DEFAULT NULL, - `Valeur1` varbinary(57) DEFAULT NULL, - `val2` varbinary(19) DEFAULT NULL, - `val3` varbinary(19) DEFAULT NULL, - `val4` varbinary(19) DEFAULT NULL, - `date1` date DEFAULT NULL, - `date2` date DEFAULT NULL, - `date3` date DEFAULT NULL, - `date4` date DEFAULT NULL, - `unite` char(32) DEFAULT NULL, - `groupe` varchar(35) DEFAULT NULL, - `bornemin` varbinary(12) DEFAULT NULL, - `bornemax` varbinary(12) DEFAULT NULL, - `code_dossier` char(20) DEFAULT NULL, - `TYPE` varchar(50) DEFAULT NULL, - `sous_groupe` varchar(35) DEFAULT NULL, - `Date_prelevement` date DEFAULT NULL, - `date_analyse` date DEFAULT NULL, - `sexe` char(1) DEFAULT NULL, - `age` varbinary(25) DEFAULT NULL, - `mois` bigint(21) DEFAULT NULL, - `lieu_de_naissance` varchar(128) DEFAULT NULL, - `laboratoire` varchar(20) DEFAULT NULL, - `MedecinTraitant` varchar(257) DEFAULT NULL, - `TELEPHONE` char(32) DEFAULT NULL, - `Date_de_Prescription` date DEFAULT NULL, - `DATE_CREATION` date DEFAULT NULL, - `hosp` varchar(20) DEFAULT NULL, - `commentaire` text, - `CODE_ECHANTILLONS` char(50) DEFAULT NULL, - `MATRICULE_ANALYSE` char(50) DEFAULT NULL, - `CODE_MEDECIN` varchar(15) DEFAULT NULL, - `SERVICES` varchar(25) DEFAULT NULL -) ENGINE=MyISAM DEFAULT CHARSET=latin1; - --- --- Contenu de la table `resultatglobale` --- - -INSERT INTO `resultatglobale` (`CODE_MALADE`, `noms`, `nom`, `CODE_PARAMETRE`, `Valeur1`, `val2`, `val3`, `val4`, `date1`, `date2`, `date3`, `date4`, `unite`, `groupe`, `bornemin`, `bornemax`, `code_dossier`, `TYPE`, `sous_groupe`, `Date_prelevement`, `date_analyse`, `sexe`, `age`, `mois`, `lieu_de_naissance`, `laboratoire`, `MedecinTraitant`, `TELEPHONE`, `Date_de_Prescription`, `DATE_CREATION`, `hosp`, `commentaire`, `CODE_ECHANTILLONS`, `MATRICULE_ANALYSE`, `CODE_MEDECIN`, `SERVICES`) VALUES -('00003P18', 'Mr KAMDOUM Jules', 'Protéinuries', 'CZ', '5.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mol/l', 'Urine', 'N/A', 'N/A', '001DS05-01-18', 'Biochimie', '', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'BIOCHIMIE', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001CZ05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'poly. neutrophile (PNN)', 'BF', '215.10', '27.46', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BF05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', '% polynucléaire neutrophile PNN', 'AB', '45.00', '42.25', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AB05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'poly. éosinophiles (PNE)', 'BH', '124.27', '196.46', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BH05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', '% polynucléaire éosinophile (PNE', 'AC', '26.00', '302.25', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AC05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'poly. Basophile (PNB)', 'BG', '162.52', '196.30', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BG05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', '% polynucléaire Basophile (PNB)', 'AD', '34.00', '302.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AD05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'lymphocyte', 'BI', '4.78', '277.15', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BI05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', '% lymphocyte (Lympho)', 'AF', '1.00', '426.39', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AF05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'monocyte', 'BJ', '23.89', '1.68', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'G/l', 'Formule leucoytaire', '0.2', '0.8', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BJ05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', '% monocyte (Mono)', 'AE', '5.00', '2.58', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AE05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'Hématies', 'AT', '124.00', '4.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'téra/l', 'Numerisation globulaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AT05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'Hémoglobine', 'AU', '78.00', '64.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'g/dl', 'Numerisation globulaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AU05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'Hematocrite', 'AV', '45.00', '342.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Numerisation globulaire', '0.37', '0.46', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AV05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'VGM', 'AW', '76.00', '54.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'u3', 'Numerisation globulaire', '85', '95', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AW05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'CCMH', 'AY', '98.00', '8.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, NULL, 'Numerisation globulaire', '18', '22', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AY05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'TCMH', 'AX', '76.00', '6.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'pg', 'Numerisation globulaire', '27', '32', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AX05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'Indice de distribution GR', 'AZ', '87.00', '4.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '', 'Numerisation globulaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AZ05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'IDR-DS', 'BA', '23.00', '5.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '', 'Numerisation globulaire', '19000', '90000', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BA05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'Nombres de Globule Blanc', 'AA', '478.00', '65.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Numerisation globulaire', '13400', '123000', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001AA05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'Plaquette', 'BB', '98.00', '54.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, 'giga/l', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BB05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'VMP', 'BC', '45.00', '1.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BC05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'IDP', 'BD', '31.00', '46.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BD05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00003P18', 'Mr KAMDOUM Jules', 'PCT', 'BE', '8.00', '548.00', '', '', '2018-01-05', '2018-01-05', NULL, NULL, '%', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS05-01-18', 'NFS', 'Numération formule sanguine', '2018-01-05', '2018-01-05', 'M', '18 ans', 216, '', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Interne', '', '001BE05-01-18', 'P001', '001MD18', 'Chirurgie A'), -('00004P18', 'Mme/Mlle NGO''SEAM Madeleine', 'Temps de Saignement', 'AI', '6.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mm/s', 'TS/TC', 'N/A', 'N/A', '002DS05-01-18', 'TS/TC', 'Hémostase', '2018-01-05', '2018-01-05', 'F', '30 ans', 360, 'TOUGANG', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Externe', '', '001AI05-01-18', 'P001', '001MD18', 'HBD'), -('00004P18', 'Mme/Mlle NGO''SEAM Madeleine', 'Temps de Coagulation', 'AJ', '8.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mm/s', 'TS/TC', 'N/A', 'N/A', '002DS05-01-18', 'TS/TC', 'Hémostase', '2018-01-05', '2018-01-05', 'F', '30 ans', 360, 'TOUGANG', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Externe', '', '001AJ05-01-18', 'P001', '001MD18', 'HBD'), -('00004P18', 'Mme/Mlle NGO''SEAM Madeleine', 'Prémiere Heures', 'AH', '4.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mm/s', 'Vitesse de sedimentation', '3', '7', '002DS05-01-18', 'VS', 'Hémostase', '2018-01-05', '2018-01-05', 'F', '30 ans', 360, 'TOUGANG', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Externe', '', '001AH05-01-18', 'P001', '001MD18', 'HBD'), -('00004P18', 'Mme/Mlle NGO''SEAM Madeleine', 'Deuxieme Heures', 'AG', '5.00', '', '', '', '2018-01-05', NULL, NULL, NULL, 'mm/s', 'Vitesse de sedimentation', 'N/A', 'N/A', '002DS05-01-18', 'VS', 'Hémostase', '2018-01-05', '2018-01-05', 'F', '30 ans', 360, 'TOUGANG', 'Hématologie', 'TAMOKWE Germie', '6 99 87 87 87', '2018-01-05', '2018-01-05', 'Externe', '', '001AG05-01-18', 'P001', '001MD18', 'HBD'), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Groupe Sanguin et Rhesus', 'AM', 'A+', '', '', '', '2018-01-08', NULL, NULL, NULL, NULL, 'GS', 'N/A', 'N/A', '001DS06-01-18', 'GS', 'GS', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AM08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Temps de cephaline activer', 'AK', '24.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'S', 'TCK/TQ', 'N/A', 'N/A', '001DS08-01-18', 'TCK/TQ', 'Hémostase', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'SIKATI Paul Rene', '6 89 85 87 47', '2018-01-08', '2018-01-08', 'Interne', '', '001AK08-01-18', 'P001', '002MD18', 'médecine F'), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Temps de quit', 'AL', '12.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'S', 'TCK/TQ', 'N/A', 'N/A', '001DS08-01-18', 'TCK/TQ', 'Hémostase', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'SIKATI Paul Rene', '6 89 85 87 47', '2018-01-08', '2018-01-08', 'Interne', '', '001AL08-01-18', 'P001', '002MD18', 'médecine F'), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Prémiere Heures', 'AH', '4.00', '', '', '', '2018-01-06', NULL, NULL, NULL, 'mm/s', 'Vitesse de sedimentation', '3', '7', '001DS06-01-18', 'VS', 'Hémostase', '2018-01-06', '2018-01-06', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-06', '2018-01-06', 'Interne', '', '001AH06-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Deuxieme Heures', 'AG', '5.00', '', '', '', '2018-01-06', NULL, NULL, NULL, 'mm/s', 'Vitesse de sedimentation', 'N/A', 'N/A', '001DS06-01-18', 'VS', 'Hémostase', '2018-01-06', '2018-01-06', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-06', '2018-01-06', 'Interne', '', '001AG06-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'poly. neutrophile (PNN)', 'BF', '1108.52', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BF08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', '% polynucléaire neutrophile PNN', 'AB', '74.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AB08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'poly. éosinophiles (PNE)', 'BH', '674.09', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BH08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', '% polynucléaire éosinophile (PNE', 'AC', '45.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AC08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'poly. Basophile (PNB)', 'BG', '74.90', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BG08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', '% polynucléaire Basophile (PNB)', 'AD', '5.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AD08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'lymphocyte', 'BI', '614.17', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BI08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', '% lymphocyte (Lympho)', 'AF', '41.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AF08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'monocyte', 'BJ', '629.15', '', '', '', '2018-01-08', NULL, NULL, NULL, 'G/l', 'Formule leucoytaire', '0.2', '0.8', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BJ08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', '% monocyte (Mono)', 'AE', '42.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Formule leucoytaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AE08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Hématies', 'AT', '5.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'téra/l', 'Numerisation globulaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AT08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Hémoglobine', 'AU', '62.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'g/dl', 'Numerisation globulaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AU08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Hematocrite', 'AV', '41.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Numerisation globulaire', '0.37', '0.46', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AV08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'VGM', 'AW', '12.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'u3', 'Numerisation globulaire', '85', '95', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AW08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'CCMH', 'AY', '44.00', '', '', '', '2018-01-08', NULL, NULL, NULL, NULL, 'Numerisation globulaire', '18', '22', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AY08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'TCMH', 'AX', '74.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'pg', 'Numerisation globulaire', '27', '32', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AX08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Indice de distribution GR', 'AZ', '45.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '', 'Numerisation globulaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AZ08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'IDR-DS', 'BA', '41.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '', 'Numerisation globulaire', '19000', '90000', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BA08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Nombres de Globule Blanc', 'AA', '1498.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Numerisation globulaire', '13400', '123000', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001AA08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'Plaquette', 'BB', '7.00', '', '', '', '2018-01-08', NULL, NULL, NULL, 'giga/l', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BB08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'VMP', 'BC', '12.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BC08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'IDP', 'BD', '54.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BD08-01-18', 'P001', '003MD18', ''), -('00005P18', 'Mr BOLOGA Pierre Marie', 'PCT', 'BE', '74.00', '', '', '', '2018-01-08', NULL, NULL, NULL, '%', 'Numerisation Plaquettaire', 'N/A', 'N/A', '001DS06-01-18', 'NFS', 'Numération formule sanguine', '2018-01-08', '2018-01-08', 'M', '20 ans', 240, 'BAMYAN', 'Hématologie', 'FOTSO DEFO Kevin', '6 55 84 58 74', '2018-01-08', '2018-01-06', 'Interne', '', '001BE08-01-18', 'P001', '003MD18', ''); diff --git a/demo_r1/demo_reports/pu/mylite.py b/demo_r1/demo_reports/pu/mylite.py deleted file mode 100644 index 5ad9db9..0000000 --- a/demo_r1/demo_reports/pu/mylite.py +++ /dev/null @@ -1,46 +0,0 @@ -#! /usr/bin/python -# coding: utf-8 - -"""Copy table from mysql to sqlite. -Require: -* SQLAlchemy -* MySQLdb or PyMySQL -Usage: -mylite.py "mysql+pymysql://user:password@host/db?charset=utf8" "sqlite:///out.db" table_name [table_name2...] -""" - -import sqlalchemy as sa -from sqlalchemy.ext.compiler import compiles -from sqlalchemy.dialects import mysql - -@compiles(mysql.TINYINT, 'sqlite') -@compiles(mysql.SMALLINT, 'sqlite') -def compile_sqlite_tinyint(type_, compiler, **kw): - return 'INTEGER' - -@compiles(mysql.LONGBLOB, 'sqlite') -def compile_sqlite_tinyint(type_, compiler, **kw): - return 'BLOB' - - -def copy_table(my_engine, lite_engine, table_name): - meta = sa.MetaData(my_engine) - table = sa.Table(table_name, meta, autoload=True) - - lite_engine.execute("DROP TABLE IF EXISTS " + table_name) - table.create(lite_engine) - - rows = my_engine.execute(table.select()).fetchall() - with lite_engine.begin() as con: - for row in rows: - con.execute(table.insert().values(**row)) - -def main(): - import sys - mysql = sa.create_engine(sys.argv[1]) - lite = sa.create_engine(sys.argv[2]) - for table in sys.argv[3:]: - copy_table(mysql, lite, table) - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/demo_r1/demo_reports/pu/out.db b/demo_r1/demo_reports/pu/out.db deleted file mode 100644 index 66379f88d96d932ca63065c0b0bff4582f5e90d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22528 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 diff --git a/demo_r1/demo_reports/pu/test.lrxml b/demo_r1/demo_reports/pu/test.lrxml deleted file mode 100644 index 88d17ed..0000000 --- a/demo_r1/demo_reports/pu/test.lrxml +++ /dev/null @@ -1,1525 +0,0 @@ - - - - - - page1 - - - - - - - ReportPage1 - - - - ReportFooter1 - - - - TextItem1 - - - - - ReportFooter1 - - - - - - - pied de rapport - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - PageHeader1 - - - - TextItem16 - - - - - PageHeader1 - - - - - - - Unite de laboratoire - - - - - - - - - - - - - - - - - ShapeItem1 - - - - - PageHeader1 - - - - - - - - - - - - - - - - - TextItem4 - - - - - PageHeader1 - - - - - - - $D{data1.noms} - - - - - - - - - - - - - - - - - TextItem15 - - - - - PageHeader1 - - - - - - - $D{data1.CODE_MALADE} - - - - - - - - - - - - - - - - - TextItem17 - - - - - PageHeader1 - - - - - - - InformationS PersonnelleS - - - - - - - - - - - - - - - - - TextItem18 - - - - - PageHeader1 - - - - - - - Code: - - - - - - - - - - - - - - - - - TextItem19 - - - - - PageHeader1 - - - - - - - Noms et prénoms: - - - - - - - - - - - - - - - - - TextItem20 - - - - - PageHeader1 - - - - - - - $D{data1.CODE_DOSSIER} - - - - - - - - - - - - - - - - - TextItem21 - - - - - PageHeader1 - - - - - - - Dossier N°: - - - - - - - - - - - - - - - - - TextItem22 - - - - - PageHeader1 - - - - - - - Date d'analyse: - - - - - - - - - - - - - - - - - TextItem23 - - - - - PageHeader1 - - - - - - - Sexe: - - - - - - - - - - - - - - - - - TextItem24 - - - - - PageHeader1 - - - - - - - $D{data1.age} - - - - - - - - - - - - - - - - - TextItem25 - - - - - PageHeader1 - - - - - - - $D{data1.SEXE} - - - - - - - - - - - - - - - - - TextItem26 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.date1},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - TextItem27 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.Date_prelevement},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - TextItem28 - - - - - PageHeader1 - - - - - - - Age: - - - - - - - - - - - - - - - - - TextItem29 - - - - - PageHeader1 - - - - - - - Date de prélèvement: - - - - - - - - - - - - - - - - - ShapeItem2 - - - - - PageHeader1 - - - - - - - - - - - - - - - - - TextItem14 - - - - - PageHeader1 - - - - - - - Médecin traitant: - - - - - - - - - - - - - - - - - TextItem30 - - - - - PageHeader1 - - - - - - - $D{data1.MedecinTraitant} - - - - - - - - - - - - - - - - - TextItem35 - - - - - PageHeader1 - - - - - - - Date de Prescription: - - - - - - - - - - - - - - - - - TextItem36 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.Date_de_Prescription},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - TextItem37 - - - - - PageHeader1 - - - - - - - Statut: - - - - - - - - - - - - - - - - - TextItem38 - - - - - PageHeader1 - - - - - - - $D{data1.hosp} ($D{data1.SERVICES}) - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - PageFooter1 - - - - TextItem2 - - - - - PageFooter1 - - - - - - - page $V{#PAGE}/$V{#PAGE_COUNT} - - - - - - - - - - - - - - - - - TextItem3 - - - - - PageFooter1 - - - - - - - $S{dateFormat(now()," dddd d MMMM yyyy")} - - - - - - - - - - - - - - - - - TextItem34 - - - - - PageFooter1 - - - - - - - Le Biologiste - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - DataBand1 - - - - TextItem13 - - - - - DataBand1 - - - - - - - $D{data1.val4} - - - - - - - - - - - - - - - - - TextItem12 - - - - - DataBand1 - - - - - - - $D{data1.val3} - - - - - - - - - - - - - - - - - TextItem11 - - - - - DataBand1 - - - - - - - $D{data1.val2} - - - - - - - - - - - - - - - - - TextItem31 - - - - - DataBand1 - - - - - - - $D{data1.UNITE} - - - - - - - - - - - - - - - - - TextItem32 - - - - - DataBand1 - - - - - - - (VR $D{data1.bornemin} à $D{data1.BORNEMAX}) - - - - - - - - - - - - - - - - - - TextItem10 - - - - - DataBand1 - - - - - - - $D{data1.Valeur1} - - - - - - - - - - - - - - - - - - TextItem8 - - - - - DataBand1 - - - - - - - $D{data1.NOM} - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - data1 - - - - - - - - - - GroupBandHeader1 - - - - TextItem5 - - - - - GroupBandHeader1 - - - - - - - $D{data1.LABORATOIRE} - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - LABORATOIRE - - - - - - - - GroupBandHeader2 - - - - - ReportPage1 - - - - - - - DataBand1 - - - CODE_MALADE - - - - - - - - GroupBandHeader3 - - - - TextItem6 - - - - - GroupBandHeader3 - - - - - - - $D{data1.sous_groupe} - - - - - - - - - - - - - - - - - ShapeItem3 - - - - - GroupBandHeader3 - - - - - - - - - - - - - - - - - TextItem39 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date2},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - TextItem41 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date3},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - TextItem42 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date4},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - sous_groupe - - - - - - - - GroupBandHeader4 - - - - TextItem7 - - - - - GroupBandHeader4 - - - - - - - $D{data1.GROUPE} - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - GROUPE - - - - - - - - GroupBandFooter1 - - - - TextItem9 - - - - - GroupBandFooter1 - - - - - - - $D{data1.commentaire} - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - GroupBandHeader2 - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - test - QODBC - connection - pierre - - 127.0.0.1 - - - - - - - data1 - SELECT * from resultatglobale where resultatglobale.date_analyse BETWEEN $V{DateDebut} and $V{DateFin} order by resultatglobale.date_analyse desc - test - - - - - - - - TestName - TestValue - - - - line_groupbandheader1 - - - - - line_groupbandheader2 - - - - - line_groupbandheader3 - - - - - line_groupbandheader4 - - - - - line_groupbandheader5 - - - - - DateDebut - 2017-01-14 - - - - DateFin - 2018-01-14 - - - - - diff --git a/demo_r1/demo_reports/pu/test1.lrxml b/demo_r1/demo_reports/pu/test1.lrxml deleted file mode 100644 index 567a7d5..0000000 --- a/demo_r1/demo_reports/pu/test1.lrxml +++ /dev/null @@ -1,1953 +0,0 @@ - - - - - - - page1 - - - - - - - - ReportPage1 - - - - ReportFooter1 - - - - TextItem1 - - - - - ReportFooter1 - - - - - - - pied de rapport - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - PageHeader1 - - - - TextItem16 - - - - - PageHeader1 - - - - - - - Unite de laboratoire - - - - - - - - - - - - - - - - - - - - - - - - - - - ShapeItem1 - - - - - PageHeader1 - - - - - - - - - - - - - - - - - TextItem4 - - - - - PageHeader1 - - - - - - - $D{data1.noms} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem15 - - - - - PageHeader1 - - - - - - - $D{data1.CODE_MALADE} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem17 - - - - - PageHeader1 - - - - - - - InformationS PersonnelleS - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem18 - - - - - PageHeader1 - - - - - - - Code: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem19 - - - - - PageHeader1 - - - - - - - Noms et prénoms: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem20 - - - - - PageHeader1 - - - - - - - $D{data1.CODE_DOSSIER} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem21 - - - - - PageHeader1 - - - - - - - Dossier N°: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem22 - - - - - PageHeader1 - - - - - - - Date d'analyse: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem23 - - - - - PageHeader1 - - - - - - - Sexe: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem24 - - - - - PageHeader1 - - - - - - - $D{data1.age} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem25 - - - - - PageHeader1 - - - - - - - $D{data1.SEXE} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem26 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.date1},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem27 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.Date_prelevement},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem28 - - - - - PageHeader1 - - - - - - - Age: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem29 - - - - - PageHeader1 - - - - - - - Date de prélèvement: - - - - - - - - - - - - - - - - - - - - - - - - - - - ShapeItem2 - - - - - PageHeader1 - - - - - - - - - - - - - - - - - TextItem14 - - - - - PageHeader1 - - - - - - - Médecin traitant: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem30 - - - - - PageHeader1 - - - - - - - $D{data1.MedecinTraitant} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem35 - - - - - PageHeader1 - - - - - - - Date de Prescription: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem36 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.Date_de_Prescription},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem37 - - - - - PageHeader1 - - - - - - - Statut: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem38 - - - - - PageHeader1 - - - - - - - $D{data1.hosp} ($D{data1.SERVICES}) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - PageFooter1 - - - - TextItem2 - - - - - PageFooter1 - - - - - - - page $V{#PAGE}/$V{#PAGE_COUNT} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem3 - - - - - PageFooter1 - - - - - - - $S{dateFormat(now()," dddd d MMMM yyyy")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem34 - - - - - PageFooter1 - - - - - - - Le Biologiste - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - DataBand1 - - - - TextItem13 - - - - - DataBand1 - - - - - - - $D{data1.val4} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem12 - - - - - DataBand1 - - - - - - - $D{data1.val3} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem11 - - - - - DataBand1 - - - - - - - $D{data1.val2} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem31 - - - - - DataBand1 - - - - - - - $D{data1.UNITE} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem32 - - - - - DataBand1 - - - - - - - (VR $D{data1.bornemin} à $D{data1.BORNEMAX}) - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem10 - - - - - DataBand1 - - - - - - - $D{data1.Valeur1} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem8 - - - - - DataBand1 - - - - - - - $D{data1.NOM} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - data1 - - - - - - - - - - - - GroupBandHeader1 - - - - TextItem5 - - - - - GroupBandHeader1 - - - - - - - $D{data1.LABORATOIRE} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - LABORATOIRE - - - - - - - - - GroupBandHeader2 - - - - - ReportPage1 - - - - - - - DataBand1 - - - - CODE_MALADE - - - - - - - - - GroupBandHeader3 - - - - TextItem6 - - - - - GroupBandHeader3 - - - - - - - $D{data1.sous_groupe} - - - - - - - - - - - - - - - - - - - - - - - - - - - ShapeItem3 - - - - - GroupBandHeader3 - - - - - - - - - - - - - - - - - TextItem39 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date2},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem41 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date3},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem42 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date4},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - sous_groupe - - - - - - - - - GroupBandHeader4 - - - - TextItem7 - - - - - GroupBandHeader4 - - - - - - - $D{data1.GROUPE} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - GROUPE - - - - - - - - - GroupBandFooter1 - - - - TextItem9 - - - - - GroupBandFooter1 - - - - - - - $D{data1.commentaire} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - GroupBandHeader2 - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - test - QSQLITE - E:/LimeReportGitHub1/demo_r1/demo_reports/pu/out.db - pierre - - 127.0.0.1 - - - - - - - - data1 - SELECT * from resultatglobale where resultatglobale.date_analyse BETWEEN $V{DateDebut} and $V{DateFin} order by resultatglobale.date_analyse desc, CODE_MALADE, LABORATOIRE, sous_groupe, GROUPE - test - - - - - - - - TestName - TestValue - - - - line_groupbandheader1 - - - - - line_groupbandheader2 - - - - - line_groupbandheader3 - - - - - line_groupbandheader4 - - - - - line_groupbandheader5 - - - - - DateDebut - 2017-01-14 - - - - DateFin - 2018-01-14 - - - - - - - - - - - diff --git a/demo_r1/demo_reports/pu/test_new.lrxml b/demo_r1/demo_reports/pu/test_new.lrxml deleted file mode 100644 index 3d96b7b..0000000 --- a/demo_r1/demo_reports/pu/test_new.lrxml +++ /dev/null @@ -1,1953 +0,0 @@ - - - - - - - page1 - - - - - - - - ReportPage1 - - - - ReportFooter1 - - - - TextItem1 - - - - - ReportFooter1 - - - - - - - pied de rapport - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - PageHeader1 - - - - TextItem16 - - - - - PageHeader1 - - - - - - - Unite de laboratoire - - - - - - - - - - - - - - - - - - - - - - - - - - - ShapeItem1 - - - - - PageHeader1 - - - - - - - - - - - - - - - - - TextItem4 - - - - - PageHeader1 - - - - - - - $D{data1.noms} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem15 - - - - - PageHeader1 - - - - - - - $D{data1.CODE_MALADE} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem17 - - - - - PageHeader1 - - - - - - - InformationS PersonnelleS - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem18 - - - - - PageHeader1 - - - - - - - Code: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem19 - - - - - PageHeader1 - - - - - - - Noms et prénoms: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem20 - - - - - PageHeader1 - - - - - - - $D{data1.CODE_DOSSIER} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem21 - - - - - PageHeader1 - - - - - - - Dossier N°: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem22 - - - - - PageHeader1 - - - - - - - Date d'analyse: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem23 - - - - - PageHeader1 - - - - - - - Sexe: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem24 - - - - - PageHeader1 - - - - - - - $D{data1.age} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem25 - - - - - PageHeader1 - - - - - - - $D{data1.SEXE} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem26 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.date1},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem27 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.Date_prelevement},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem28 - - - - - PageHeader1 - - - - - - - Age: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem29 - - - - - PageHeader1 - - - - - - - Date de prélèvement: - - - - - - - - - - - - - - - - - - - - - - - - - - - ShapeItem2 - - - - - PageHeader1 - - - - - - - - - - - - - - - - - TextItem14 - - - - - PageHeader1 - - - - - - - Médecin traitant: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem30 - - - - - PageHeader1 - - - - - - - $D{data1.MedecinTraitant} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem35 - - - - - PageHeader1 - - - - - - - Date de Prescription: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem36 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.Date_de_Prescription},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem37 - - - - - PageHeader1 - - - - - - - Statut: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem38 - - - - - PageHeader1 - - - - - - - $D{data1.hosp} ($D{data1.SERVICES}) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - PageFooter1 - - - - TextItem2 - - - - - PageFooter1 - - - - - - - page $V{#PAGE}/$V{#PAGE_COUNT} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem3 - - - - - PageFooter1 - - - - - - - $S{dateFormat(now()," dddd d MMMM yyyy")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem34 - - - - - PageFooter1 - - - - - - - Le Biologiste - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - DataBand1 - - - - TextItem13 - - - - - DataBand1 - - - - - - - $D{data1.val4} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem12 - - - - - DataBand1 - - - - - - - $D{data1.val3} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem11 - - - - - DataBand1 - - - - - - - $D{data1.val2} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem31 - - - - - DataBand1 - - - - - - - $D{data1.UNITE} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem32 - - - - - DataBand1 - - - - - - - (VR $D{data1.bornemin} à $D{data1.BORNEMAX}) - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem10 - - - - - DataBand1 - - - - - - - $D{data1.Valeur1} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem8 - - - - - DataBand1 - - - - - - - $D{data1.NOM} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - data1 - - - - - - - - - - - - GroupBandHeader1 - - - - TextItem5 - - - - - GroupBandHeader1 - - - - - - - $D{data1.LABORATOIRE} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - LABORATOIRE - - - - - - - - - GroupBandHeader2 - - - - - ReportPage1 - - - - - - - DataBand1 - - - - CODE_MALADE - - - - - - - - - GroupBandHeader3 - - - - TextItem6 - - - - - GroupBandHeader3 - - - - - - - $D{data1.sous_groupe} - - - - - - - - - - - - - - - - - - - - - - - - - - - ShapeItem3 - - - - - GroupBandHeader3 - - - - - - - - - - - - - - - - - TextItem39 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date2},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem41 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date3},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem42 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date4},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - sous_groupe - - - - - - - - - GroupBandHeader4 - - - - TextItem7 - - - - - GroupBandHeader4 - - - - - - - $D{data1.GROUPE} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - GROUPE - - - - - - - - - GroupBandFooter1 - - - - TextItem9 - - - - - GroupBandFooter1 - - - - - - - $D{data1.commentaire} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - GroupBandHeader2 - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - test - QSQLITE - E:/LimeReportGitHub1/demo_r1/demo_reports/pu/out.db - pierre - - 127.0.0.1 - - - - - - - - data1 - SELECT * from resultatglobale where resultatglobale.date_analyse BETWEEN $V{DateDebut} and $V{DateFin} order by resultatglobale.date_analyse desc - test - - - - - - - - TestName - TestValue - - - - line_groupbandheader1 - - - - - line_groupbandheader2 - - - - - line_groupbandheader3 - - - - - line_groupbandheader4 - - - - - line_groupbandheader5 - - - - - DateDebut - 2017-01-14 - - - - DateFin - 2018-01-14 - - - - - - - - - - - diff --git a/demo_r1/demo_reports/pu/test_new1.lrxml b/demo_r1/demo_reports/pu/test_new1.lrxml deleted file mode 100644 index 52376a1..0000000 --- a/demo_r1/demo_reports/pu/test_new1.lrxml +++ /dev/null @@ -1,1870 +0,0 @@ - - - - - - - page1 - - - - - - - - ReportPage1 - - - - ReportFooter1 - - - - TextItem1 - - - - - ReportFooter1 - - - - - - - pied de rapport - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - PageHeader1 - - - - TextItem16 - - - - - PageHeader1 - - - - - - - Unite de laboratoire - - - - - - - - - - - - - - - - - - - - - - - - - - - ShapeItem1 - - - - - PageHeader1 - - - - - - - - - - - - - - - - - TextItem4 - - - - - PageHeader1 - - - - - - - $D{data1.noms} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem15 - - - - - PageHeader1 - - - - - - - $D{data1.CODE_MALADE} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem17 - - - - - PageHeader1 - - - - - - - InformationS PersonnelleS - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem18 - - - - - PageHeader1 - - - - - - - Code: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem19 - - - - - PageHeader1 - - - - - - - Noms et prénoms: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem20 - - - - - PageHeader1 - - - - - - - $D{data1.CODE_DOSSIER} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem21 - - - - - PageHeader1 - - - - - - - Dossier N°: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem22 - - - - - PageHeader1 - - - - - - - Date d'analyse: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem23 - - - - - PageHeader1 - - - - - - - Sexe: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem24 - - - - - PageHeader1 - - - - - - - $D{data1.age} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem25 - - - - - PageHeader1 - - - - - - - $D{data1.SEXE} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem26 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.date1},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem27 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.Date_prelevement},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem28 - - - - - PageHeader1 - - - - - - - Age: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem29 - - - - - PageHeader1 - - - - - - - Date de prélèvement: - - - - - - - - - - - - - - - - - - - - - - - - - - - ShapeItem2 - - - - - PageHeader1 - - - - - - - - - - - - - - - - - TextItem14 - - - - - PageHeader1 - - - - - - - Médecin traitant: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem30 - - - - - PageHeader1 - - - - - - - $D{data1.MedecinTraitant} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem35 - - - - - PageHeader1 - - - - - - - Date de Prescription: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem36 - - - - - PageHeader1 - - - - - - - $S{dateFormat($D{data1.Date_de_Prescription},"dd MMMM yyyy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem37 - - - - - PageHeader1 - - - - - - - Statut: - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem38 - - - - - PageHeader1 - - - - - - - $D{data1.hosp} ($D{data1.SERVICES}) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - PageFooter1 - - - - TextItem2 - - - - - PageFooter1 - - - - - - - page $V{#PAGE}/$V{#PAGE_COUNT} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem3 - - - - - PageFooter1 - - - - - - - $S{dateFormat(now()," dddd d MMMM yyyy")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem34 - - - - - PageFooter1 - - - - - - - Le Biologiste - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - DataBand1 - - - - TextItem13 - - - - - DataBand1 - - - - - - - $D{data1.val4} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem12 - - - - - DataBand1 - - - - - - - $D{data1.val3} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem11 - - - - - DataBand1 - - - - - - - $D{data1.val2} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem31 - - - - - DataBand1 - - - - - - - $D{data1.UNITE} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem32 - - - - - DataBand1 - - - - - - - (VR $D{data1.bornemin} à $D{data1.BORNEMAX}) - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem10 - - - - - DataBand1 - - - - - - - $D{data1.Valeur1} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem8 - - - - - DataBand1 - - - - - - - $D{data1.NOM} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - data1 - - - - - - - - - - - - GroupBandHeader1 - - - - TextItem5 - - - - - GroupBandHeader1 - - - - - - - $D{data1.LABORATOIRE} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - LABORATOIRE - - - - - - - - - GroupBandHeader3 - - - - TextItem6 - - - - - GroupBandHeader3 - - - - - - - $D{data1.sous_groupe} - - - - - - - - - - - - - - - - - - - - - - - - - - - ShapeItem3 - - - - - GroupBandHeader3 - - - - - - - - - - - - - - - - - TextItem39 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date2},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem41 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date3},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem42 - - - - - GroupBandHeader3 - - - - - - - $S{dateFormat($D{data1.date4},"dd/MM/yy ")} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - sous_groupe - - - - - - - - - GroupBandHeader4 - - - - TextItem7 - - - - - GroupBandHeader4 - - - - - - - $D{data1.GROUPE} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - GROUPE - - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - test - QSQLITE - E:/LimeReportGitHub1/demo_r1/demo_reports/pu/out.db - pierre - - 127.0.0.1 - - - - - - - - data1 - SELECT * from resultatglobale where resultatglobale.date_analyse BETWEEN $V{DateDebut} and $V{DateFin} order by resultatglobale.date_analyse desc - test - - - - - - - - TestName - TestValue - - - - line_groupbandheader1 - - - - - line_groupbandheader2 - - - - - line_groupbandheader3 - - - - - line_groupbandheader4 - - - - - line_groupbandheader5 - - - - - DateDebut - 2017-01-14 - - - - DateFin - 2018-01-14 - - - - - - - - - - - From 878670f5d7b9da530292e935e47fc644cbb1dd35 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Fri, 7 Sep 2018 01:05:15 +0300 Subject: [PATCH 209/347] Demo reports cleared --- demo_r1/demo_reports/123.lrxml | 164 -- demo_r1/demo_reports/analysis.lrxml | 1646 -------------------- demo_r1/demo_reports/test_connection.lrxml | 105 -- demo_r1/demo_reports/test_customers.lrxml | 123 -- demo_r1/demo_reports/test_js.lrxml | 139 -- demo_r1/demo_reports/test_js.zip | Bin 1304 -> 0 bytes 6 files changed, 2177 deletions(-) delete mode 100644 demo_r1/demo_reports/123.lrxml delete mode 100644 demo_r1/demo_reports/analysis.lrxml delete mode 100644 demo_r1/demo_reports/test_connection.lrxml delete mode 100644 demo_r1/demo_reports/test_customers.lrxml delete mode 100644 demo_r1/demo_reports/test_js.lrxml delete mode 100644 demo_r1/demo_reports/test_js.zip diff --git a/demo_r1/demo_reports/123.lrxml b/demo_r1/demo_reports/123.lrxml deleted file mode 100644 index d027e5a..0000000 --- a/demo_r1/demo_reports/123.lrxml +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - page1 - - - - - - - - ReportPage1 - - - - DataBand1 - - - - TextItem1 - - - - - DataBand1 - - - - - - - <style> -p { text-indent: 100px; } -</style> -<p>1. Настоящий Федеральный закон регулирует отношения, направленные на обеспечение государственных и муниципальных нужд в целях повышения эффективности, результативности осуществления закупок товаров, работ, услуг, обеспечения гласности и прозрачности осуществления таких закупок, предотвращения коррупции и других злоупотреблений в сфере таких закупок, в части, касающейся:</p> -<p>1) планирования закупок товаров, работ, услуг;</p> -<p>2) определения поставщиков (подрядчиков, исполнителей)</p> -<p>3) заключения гражданско-правового договора, предметом которого являются поставка товара, выполнение работы, оказание услуги (в том числе приобретение недвижимого имущества или аренда имущества), от имени Российской Федерации, субъекта Российской Федерации или муниципального образования, а также бюджетным учреждением, государственным, муниципальным унитарными предприятиями, за исключением федеральных государственных унитарных предприятий, имеющих существенное значение для обеспечения прав и законных интересов граждан Российской Федерации, обороноспособности и безопасности государства, перечень которых утверждается Правительством Российской Федерации по согласованию с Администрацией Президента Российской Федерации, либо иным юридическим лицом в соответствии с частями 1, 2.1, 4 и 5 статьи 15 настоящего Федерального закона (далее - контракт);</p> -(в ред. Федеральных законов от 03.07.2016 N 321-ФЗ, от 28.12.2016 N 474-ФЗ) -<p>4) особенностей исполнения контрактов;</p> -<p>5) мониторинга закупок товаров, работ, услуг;</p> -<p>6) аудита в сфере закупок товаров, работ, услуг;</p> -<p>7) контроля за соблюдением законодательства Российской Федерации и иных нормативных правовых актов о контрактной системе в сфере закупок товаров, работ, услуг для обеспечения государственных и муниципальных нужд (далее - контроль в сфере закупок).</p> -<p>2. Настоящий Федеральный закон не применяется к отношениям, связанным с:</p> -<p>1) оказанием услуг международными финансовыми организациями, созданными в соответствии с международными договорами, участником которых является Российская Федерация, а также международными финансовыми организациями, с которыми Российская Федерация заключила международные договоры;</p> -<p>2) закупкой товаров, работ, услуг для обеспечения безопасности лиц, подлежащих государственной защите, в соответствии с Федеральным законом от 20 августа 2004 года N 119-ФЗ "О государственной защите потерпевших, свидетелей и иных участников уголовного судопроизводства" и Федеральным законом от 20 апреля 1995 года N 45-ФЗ "О государственной защите судей, должностных лиц правоохранительных и контролирующих органов";</p> -<p>3) закупкой драгоценных металлов и драгоценных камней для пополнения Государственного фонда драгоценных металлов и драгоценных камней Российской Федерации и государственных фондов драгоценных металлов и драгоценных камней соответствующих субъектов Российской Федерации, на территориях которых были добыты драгоценные металлы и драгоценные камни;</p> -(п. 3 введен Федеральным законом от 28.12.2013 N 396-ФЗ; в ред. Федерального закона от 23.06.2016 N 203-ФЗ) -<p>4) назначением адвоката органом дознания, органом предварительного следствия, судом для участия в качестве защитника в уголовном судопроизводстве в соответствии с Уголовно-процессуальным кодексом Российской Федерации либо судом для участия в качестве представителя в гражданском судопроизводстве в соответствии с Гражданским процессуальным кодексом Российской Федерации или в административном судопроизводстве в соответствии с Кодексом административного судопроизводства Российской Федерации;</p> -(п. 4 введен Федеральным законом от 28.12.2013 N 396-ФЗ, в ред. Федерального закона от 08.03.2015 N 23-ФЗ) -<p>5) привлечением адвоката к оказанию гражданам юридической помощи бесплатно в соответствии с Федеральным законом от 21 ноября 2011 года N 324-ФЗ "О бесплатной юридической помощи в Российской Федерации";</p> -(п. 5 введен Федеральным законом от 28.12.2013 N 396-ФЗ) -<p>6) закупкой товаров, работ, услуг участковыми избирательными комиссиями, территориальными избирательными комиссиями, в том числе при возложении на них полномочий иной избирательной комиссии, окружными избирательными комиссиями, избирательными комиссиями муниципальных образований (за исключением избирательных комиссий муниципальных образований, являющихся административными центрами (столицами) субъектов Российской Федерации) во исполнение полномочий, предусмотренных законодательством Российской Федерации о выборах и референдумах;</p> -(п. 6 введен Федеральным законом от 04.06.2014 N 140-ФЗ) -<p>7) привлечением избирательными комиссиями, комиссиями референдума граждан к выполнению работ и оказанию услуг, связанных с обеспечением полномочий избирательных комиссий, комиссий референдума в период подготовки и проведения выборов, референдума, по гражданско-правовым договорам, заключаемым с физическими лицами, в соответствии с Федеральным законом от 12 июня 2002 года N 67-ФЗ "Об основных гарантиях избирательных прав и права на участие в референдуме граждан Российской Федерации";</p> -(п. 7 введен Федеральным законом от 09.03.2016 N 66-ФЗ) -<p>8) осуществлением строительного контроля в процессе строительства, реконструкции и (или) капитального ремонта объектов инфраструктуры, предназначенных для подготовки и проведения чемпионата мира по футболу FIFA 2018 года и Кубка конфедераций FIFA 2017 года, закупкой товаров, работ, услуг, связанных с изготовлением, учетом, выдачей, заменой, использованием и поддержкой (обеспечением) функционирования персонифицированных карт зрителей чемпионата мира по футболу FIFA 2018 года и Кубка конфедераций FIFA 2017 года, созданием и эксплуатацией -необходимых информационных систем в соответствии с Федеральным законом от 7 июня 2013 года N 108-ФЗ "О подготовке и проведении в Российской Федерации чемпионата мира по футболу FIFA 2018 года, Кубка конфедераций FIFA 2017 года и внесении изменений в отдельные законодательные акты Российской Федерации"; </p> -(п. 8 введен Федеральным законом от 03.07.2016 N 266-ФЗ) -<p>9) закупкой товаров, работ, услуг Центральной избирательной комиссией Российской Федерации, избирательными комиссиями субъектов Российской Федерации, в том числе при возложении на них полномочий окружной избирательной комиссии, при проведении выборов в федеральные органы государственной власти.</p> -(п. 9 введен Федеральным законом от 28.12.2016 N 474-ФЗ) -<p>3. Особенности регулирования отношений, указанных в части 1 настоящей статьи, в случаях, предусмотренных настоящим Федеральным законом, могут быть установлены отдельными федеральными законами.</p> -(часть 3 в ред. Федерального закона от 28.12.2013 N 396-ФЗ) - -<p>Статья 2. Законодательство Российской Федерации и иные нормативные правовые акты о контрактной системе в сфере закупок товаров, работ, услуг для обеспечения государственных и муниципальных нужд</p> - -<p>1. Законодательство Российской Федерации о контрактной системе в сфере закупок товаров, работ, услуг для обеспечения государственных и муниципальных нужд (далее - законодательство Российской Федерации о контрактной системе в сфере закупок) основывается на положениях Конституции Российской Федерации, Гражданского кодекса Российской Федерации, Бюджетного кодекса Российской Федерации и состоит из настоящего Федерального закона и других федеральных законов, регулирующих отношения, указанные в части 1 статьи 1 настоящего Федерального закона. Нормы права, содержащиеся в других федеральных законах и регулирующие указанные отношения, должны соответствовать настоящему Федеральному закону.</p> -<p>2. В случаях, предусмотренных законодательством Российской Федерации о контрактной системе в сфере закупок, Президент Российской Федерации, Правительство Российской Федерации, федеральные органы исполнительной власти, Государственная корпорация по атомной энергии "Росатом", Государственная корпорация по космической деятельности "Роскосмос" вправе принимать нормативные правовые акты, регулирующие отношения, указанные в части 1 статьи 1 настоящего Федерального закона (далее - нормативные правовые акты о контрактной системе в сфере закупок).</p> -(в ред. Федерального закона от 13.07.2015 N 216-ФЗ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - - - - - Data - "" - - - - - - - - - - - diff --git a/demo_r1/demo_reports/analysis.lrxml b/demo_r1/demo_reports/analysis.lrxml deleted file mode 100644 index cbf59fb..0000000 --- a/demo_r1/demo_reports/analysis.lrxml +++ /dev/null @@ -1,1646 +0,0 @@ - - - - - - - page1 - - - - - - - - ReportPage1 - - - - ReportHeader1 - - - - TextItem1 - - - - - ReportHeader1 - - - - - - - Комитет по здравоохранению Санкт-Петербурга -СПб ГБУЗ "Северо-Западный центр по контролю качества лекарственных средств" ( СПб ГБУЗ "СЗЦККЛС") -Испытательная лаборатория (ИЛ) - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem2 - - - - - ReportHeader1 - - - - - - - 198216, Санкт-Петербург -Ленинский пр., 140 -тел.: 376-94-98 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem3 - - - - - ReportHeader1 - - - - - - - Аттестат аккредитации -испытательной лаборатории -№ RA.RU.21ФМ18 от 23.08.2016 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem4 - - - - - ReportHeader1 - - - - - - - ПРОТОКОЛ ИСПЫТАНИЙ № $V{NUM_PROT} от $V{DATE_PROT} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem27 - - - - - ReportHeader1 - - - - - - - $S{ -if (Dialog.groupBox_TypeObj.radioObjType1.checked) - {Dialog.groupBox_TypeObj.radioObjType1.text} -else - {Dialog.groupBox_TypeObj.radioObjType2.text} - -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem28 - - - - - ReportHeader1 - - - - - - - СЕРИЯ: $V{SER} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem29 - - - - - ReportHeader1 - - - - - - - $S{ -function GODEN_FORMAT(){ - if (Dialog.groupBox.radio_GodenDo_dd_mm_gggg.checked) { - return '$V{GODENDO_DD_MM_YYYY}'; - } else if (Dialog.groupBox.radio_GodenDo_mm_gggg.checked) { - return '$V{GODENDO_MM_YYYY}'; - } else { - return ''; - } -} - -function IFNN(str){ - if (!str || str.length === 0 ) - return '' - else - return 'ГОДЕН ДО: ' + str -} -IFNN(GODEN_FORMAT()) -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem30 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (!str || str.length === 0 || !'$V{REGDATE}' || '$V{REGDATE}'.length ===0 ) - return '' - else - return 'РЕГИСТРАЦИОННЫЙ НОМЕР: ' + str -} -IFNN('$V{REG_N}') -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem31 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (!str || str.length === 0) - return '' - else if ('$V{REGDATE}' || '$V{REGDATE}'.length >0 ) - return 'ДАТА РЕГИСТРАЦИИ: ' + '$V{REGDATE}' - else return '' - - -} - - -IFNN('$V{REG_N}') -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem33 - - - - - ReportHeader1 - - - - - - - КОЛИЧЕСТВО ОБРАЗЦА: $V{KOL_OBR} $V{ED_IZM1} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem34 - - - - - ReportHeader1 - - - - - - - Дата поступления: $V{D_REG} $V{VOTBOR} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem36 - - - - - ReportHeader1 - - - - - - - ВОЗВРАТ ОБРАЗЦА: $V{WOZWRAT} $V{ED_IZM1} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem37 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (str.length === 0) - return '' - else - return 'НД НА ПРОДУКЦИЮ: ' + str -} -function JOIN(str){ - if (str.length === 0) - return '' - else - return ' ' + str -} - - -var nod = getVariable('NODJ').toString() -var nod_dobav_reg = getVariable('NODJ_DOBAV_REG').toString() -var nod_dobav_analiz = getVariable('NODJ_DOBAV_ANALIZ').toString() - - -IFNN(nod + nod_dobav_reg + JOIN(nod_dobav_analiz) ) -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem5 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (str.length === 0) - return '' - else - return 'НД НА ИСПЫТАНИЯ: ' + str -} - -var nd_testing = getVariable('ND_TESTING').toString() - -IFNN(nd_testing) -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem35 - - - - - ReportHeader1 - - - - - - - НД НА ИСПЫТАНИЯ: ГФ ХI, вып.1, с.159, 165, 175, 176, 198, ОФС 42-0022-04, ОФС 42-0002-00, USP29-NF24, ГФ ХII ОФС 42-0067-07 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem38 - - - - - ReportHeader1 - - - - - - - Натрия хлорид субстанция-порошок, 1кг - мешки полипропиленовые - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem39 - - - - - ReportHeader1 - - - - - - - $S{ -function IFNN(str){ - if (!str || str.length === 0) - return '' - else - return 'Номер заявки № ' + str -} -IFNN('$V{NUM_ZAY}') -} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem40 - - - - - ReportHeader1 - - - - - - - ПРОИЗВОДИТЕЛЬ: $V{FIRMA} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem41 - - - - - ReportHeader1 - - - - - - - СТРАНА: $V{LAND} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem42 - - - - - ReportHeader1 - - - - - - - ЗАЯВИТЕЛЬ: $V{PST} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - DataBand1 - - - - HorizontalLayout17 - - - - TextItem9 - - - - - HorizontalLayout17 - - - - - - - $D{test.pokaz} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem10 - - - - - HorizontalLayout17 - - - - - - - $D{test.tzn} - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem11 - - - - - HorizontalLayout17 - - - - - - - $D{test.rez} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataBand1 - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - test - - - - - - - - - - - - DataHeaderBand1 - - - - HorizontalLayout16 - - - - TextItem6 - - - - - HorizontalLayout16 - - - - - - - Наименование показателей качества -по нормативному документу - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem12 - - - - - HorizontalLayout16 - - - - - - - Требование к качеству -по нормативному документу - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem8 - - - - - HorizontalLayout16 - - - - - - - Результаты анализа - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataHeaderBand1 - - - - - - - - - - HorizontalLayout14 - - - - TextItem7 - - - - - HorizontalLayout14 - - - - - - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem13 - - - - - HorizontalLayout14 - - - - - - - 2 - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem14 - - - - - HorizontalLayout14 - - - - - - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataHeaderBand1 - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - - - - - - - - DataFooterBand17 - - - - TextItem18 - - - - - DataFooterBand17 - - - - - - - $S{ -function IFNN(str){ - if (str.length === 0) - return '' - else - return 'Химик-эксперт ' + str -} - -var xim_eks = getVariable('XIM_EKS').toString() -IFNN(xim_eks) -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - DataBand1 - - - - - - - - - PageFooter1 - - - - TextItem15 - - - - - PageFooter1 - - - - - - - Стр. $V{#PAGE} из $V{#PAGE_COUNT} Протокол испытаний № $V{NUM_PROT} от $V{DATE_PROT} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - test - QSQLITE - F:/KALAB/forum_limereport/northwind.db - - - - - - - - - - - - test - select * from test - test - - - - - - - - NUM_PROT - - - - - DATE_PROT - - - - - LESJ - - - - - SER - - - - - LAND - - - - - DECLARER - - - - - KOL_OBR - - - - - NUM_REG - - - - - D_REG - - - - - NODJ - - - - - WOZWRAT - - - - - REGDATE - - - - - VOTBOR - - - - - EKS - - - - - WR_BAK - - - - - XIM_EKS - - - - - REZ_AN - - - - - REZ_A - - - - - - - - - - Dialog - - - - Dialog.exec()==1 - - - - diff --git a/demo_r1/demo_reports/test_connection.lrxml b/demo_r1/demo_reports/test_connection.lrxml deleted file mode 100644 index cd2dae7..0000000 --- a/demo_r1/demo_reports/test_connection.lrxml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - page1 - - - - - - - - Reportpage1 - - - - TextItem1 - - - - - Reportpage1 - - - - - - - Test connecton - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - test - QMYSQL - test - root - - localhost - - - - - - - - - - - - - - - - - - diff --git a/demo_r1/demo_reports/test_customers.lrxml b/demo_r1/demo_reports/test_customers.lrxml deleted file mode 100644 index f726672..0000000 --- a/demo_r1/demo_reports/test_customers.lrxml +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - page1 - - - - - - - - ReportPage1 - - - - DataBand1 - - - - TextItem1 - - - - - DataBand1 - - - - - - - $D{customers.CompanyName} - - - - - - - - - - - - - - - - - - - - - ReportPage1 - - - - - - - - - - customers - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - test - QSQLITE - /home/alex/Work/C++Projects/LimeReport/demo_r1/demo_reports/northwind.db - - - - - - - - - - customers - Select * from customers - test - - - - - - - - - diff --git a/demo_r1/demo_reports/test_js.lrxml b/demo_r1/demo_reports/test_js.lrxml deleted file mode 100644 index bb95b22..0000000 --- a/demo_r1/demo_reports/test_js.lrxml +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - page1 - - - - - - - - Reportpage1 - - - - TextItem1 - - - - - Reportpage1 - - - - - - - $S{testString()} - - - - - - - - - - - - - - - - - - - - - - - - - - - - TextItem2 - - - - - Reportpage1 - - - - - - - $S{testInt()} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - datasources - - - - - - - - - - function testString(){ - return "Test"; -} - -function testInt(){ - return 42; -} - - - - diff --git a/demo_r1/demo_reports/test_js.zip b/demo_r1/demo_reports/test_js.zip deleted file mode 100644 index 8f51201bef0082d6d0097168b78b74d51efa9aed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1304 zcmWIWW@Zs#U|`^2P%NM2(;cO^x`Ks)Azzw-ffp!Rl3H96pH-}vQ&f?g^ET4E|FVI= zzVG2Kjm$C&`j^^Vc0CZ(cx4l}WZ0R`1H>R0=c#H^LW)6SW0=H=pG^_{jY@%N0N$4yno zSf+S=z0TDp^W@eO@c>&}0j+~e^Cvuhyq#yQW?AsH>~opxp1qjhB>4Py-nqFR+nSjV zc?hu1->}W~w7+K^N6)K_l9GG(JN}363KM+G_tDR2xyV=MEdI|7+8a+FwyO*i{igDw zT2X$vqP~Tt-NJPT*4XXMo>bGiebu!Ser;(oT4!>MN~02ARQ$3q6MduIqnqmUcEE$WV8_A!Sy+Z@*6iZd+to2V{*(uw8OmUJh^)q;B(9(7ON7PIRy*G88*#YqmL zp;wRYxMouzAwF}_M_<2^bdmo;mxA8u>}cLHU;EBwjWDgosgKwH5X!xORP#dAiRz&E zz(=NCH6c@#3xXQg=eIpx_cuCm<)quy-~UG(7Kum_P+*i@!QrylWJxGbgYV>7>FJ?U zCO(QU-Spkp()Y&s>Dz7J#d9`gyw$W{r=$L)<~s|!=XAxQj$5Is-&V{lIvIP%{2|w? zWij`U?3ePF4OQu=6#3r!q>Z~~&g4%V+su#oIEuG=wU-_(y|HVO<4%^U-Jcy7Pu;ZD z^vvsuX-~I(v0)Zm`sexXt3?;DPMh<bsxaTfI^K<`vzehf`x`&z|O@akTkd!NS=t=_W^Kze}+7jOAjA z%bV-smKyZ-znyAkWz&vrhZ0-UCQD!Nbv_c z?TDgjC)!@#`z4roqS39R=i1$Xg%56vT`_HXneHp?aBahzVu22u=O0vP zU-r4Q=X7Jg8pEcx)+J|h+3%gS5o=XU+0$cfGUbK1$~~@wvoF~h%i7K7-TXeio-x3i zk;$F`S0SYWET%v}0ZgJ5SzJ(IMg|E6gZr=7h2Fi)`1IlnFg=B#4onAlv$BEoG6G>d LkX{Td{}>nmapY1D From 92788d100b7ee6f447cbc4362c1ea3108e434ce1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 14 Oct 2018 00:06:27 +0300 Subject: [PATCH 210/347] Export report has been fixed --- limereport/lrreportengine.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 4ccaf30..06fc9bc 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -491,19 +491,19 @@ bool ReportEnginePrivate::exportReport(QString exporterName, const QString &file if (fn.isEmpty()){ QString filter = QString("%1 (*.%2)").arg(e->exporterName()).arg(e->exporterFileExt()); QString fn = QFileDialog::getSaveFileName(0,tr("%1 file name").arg(e->exporterName()),"",filter); - if (!fn.isEmpty()){ - QFileInfo fi(fn); - if (fi.suffix().isEmpty()) - fn += QString(".%1").arg(e->exporterFileExt()); + } + if (!fn.isEmpty()){ + QFileInfo fi(fn); + if (fi.suffix().isEmpty()) + fn += QString(".%1").arg(e->exporterFileExt()); - bool designTime = dataManager()->designTime(); - dataManager()->setDesignTime(false); - ReportPages pages = renderToPages(); - dataManager()->setDesignTime(designTime); - bool result = e->exportPages(pages, fn, params); - delete e; - return result; - } + bool designTime = dataManager()->designTime(); + dataManager()->setDesignTime(false); + ReportPages pages = renderToPages(); + dataManager()->setDesignTime(designTime); + bool result = e->exportPages(pages, fn, params); + delete e; + return result; } } return false; From e4c8ec366b04697436111a6be9912188fd6b9d29 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 11 Dec 2018 02:34:27 +0300 Subject: [PATCH 211/347] Designer building has been fixed --- designer/designer.pro | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/designer/designer.pro b/designer/designer.pro index d3b9e26..844b299 100644 --- a/designer/designer.pro +++ b/designer/designer.pro @@ -27,12 +27,6 @@ macx{ } unix:{ - LIBS += -L$${DEST_LIBS} -llimereport - !contains(CONFIG, static_build){ - contains(CONFIG,zint){ - LIBS += -L$${DEST_LIBS} -lQtZint - } - } DESTDIR = $$DEST_DIR linux{ #Link share lib to ../lib rpath @@ -52,18 +46,21 @@ win32 { DESTDIR = $$DEST_DIR RC_FILE += mainicon.rc - !contains(CONFIG, static_build){ - contains(CONFIG,zint){ +} + +LIBS += -L$${DEST_LIBS} +CONFIG(debug, debug|release) { + LIBS += -llimereportd +} else { + LIBS += -llimereport +} + +!contains(CONFIG, static_build){ + contains(CONFIG,zint){ + CONFIG(debug, debug|release) { + LIBS += -L$${DEST_LIBS} -lQtZintd + } else { LIBS += -L$${DEST_LIBS} -lQtZint } } - LIBS += -L$${DEST_LIBS} - contains(CONFIG,release) { - LIBS += -llimereport - } else { - LIBS += -llimereportd - } } - - - From 3b23470e2a269c295ed9bf4bc559900a955c0fa7 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 11 Dec 2018 20:04:44 +0300 Subject: [PATCH 212/347] Built by Qt 4.8 fixed --- limereport/lrsettingdialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/limereport/lrsettingdialog.cpp b/limereport/lrsettingdialog.cpp index b05fa74..9040fb0 100644 --- a/limereport/lrsettingdialog.cpp +++ b/limereport/lrsettingdialog.cpp @@ -96,7 +96,11 @@ void SettingDialog::setDesignerLanguages(QList languages, QLo if (language != currentLanguage) ui->designerLanguage->addItem(QLocale::languageToString(language)); } +#ifdef HAVE_QT4 + ui->designerLanguage->setCurrentIndex(ui->designerLanguage->findText(QLocale::languageToString(currentLanguage))); +#else ui->designerLanguage->setCurrentText(QLocale::languageToString(currentLanguage)); +#endif } } // namespace LimeReport From 0d1db25d89c2858af24dfea1bbb8794f21ff4d9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Skowro=C5=84ski?= Date: Sun, 23 Dec 2018 09:41:24 +0100 Subject: [PATCH 213/347] Fix typo. s/brin/bring. --- limereport/items/editors/lritemsaligneditorwidget.cpp | 6 +++--- limereport/items/editors/lritemsaligneditorwidget.h | 2 +- limereport/lrbasedesignintf.cpp | 4 ++-- limereport/lrreportdesignwidget.cpp | 2 +- limereport/lrreportdesignwidget.h | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/limereport/items/editors/lritemsaligneditorwidget.cpp b/limereport/items/editors/lritemsaligneditorwidget.cpp index e4c681f..5595928 100644 --- a/limereport/items/editors/lritemsaligneditorwidget.cpp +++ b/limereport/items/editors/lritemsaligneditorwidget.cpp @@ -55,9 +55,9 @@ ItemsAlignmentEditorWidget::ItemsAlignmentEditorWidget(PageDesignIntf* page, QWi initEditor(); } -void ItemsAlignmentEditorWidget::slotBrinToFront() +void ItemsAlignmentEditorWidget::slotBringToFront() { - if (m_reportEditor) m_reportEditor->brinToFront(); + if (m_reportEditor) m_reportEditor->bringToFront(); if (m_page) m_page->bringToFront(); } @@ -119,7 +119,7 @@ void ItemsAlignmentEditorWidget::initEditor() { m_bringToFront = new QAction(tr("Bring to top"),this); m_bringToFront->setIcon(QIcon(":/report/images/bringToTop")); - connect(m_bringToFront,SIGNAL(triggered()),this,SLOT(slotBrinToFront())); + connect(m_bringToFront,SIGNAL(triggered()),this,SLOT(slotBringToFront())); addAction(m_bringToFront); m_sendToBack = new QAction(tr("Send to back"),this); diff --git a/limereport/items/editors/lritemsaligneditorwidget.h b/limereport/items/editors/lritemsaligneditorwidget.h index 3dda383..5231d2f 100644 --- a/limereport/items/editors/lritemsaligneditorwidget.h +++ b/limereport/items/editors/lritemsaligneditorwidget.h @@ -45,7 +45,7 @@ public: explicit ItemsAlignmentEditorWidget(PageDesignIntf* page, const QString &title, QWidget *parent = 0); explicit ItemsAlignmentEditorWidget(PageDesignIntf* page, QWidget *parent = 0); private slots: - void slotBrinToFront(); + void slotBringToFront(); void slotSendToBack(); void slotAlignToLeft(); void slotAlignToRight(); diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index b8e3bc9..ba3b71d 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1238,7 +1238,7 @@ void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) pasteAction->setEnabled(true); } menu.addSeparator(); - QAction* brinToTopAction = menu.addAction(QIcon(":/report/images/bringToTop"), tr("Bring to top")); + QAction* bringToTopAction = menu.addAction(QIcon(":/report/images/bringToTop"), tr("Bring to top")); QAction* sendToBackAction = menu.addAction(QIcon(":/report/images/sendToBack"), tr("Send to back")); QAction* createHLayout = 0; if( page->selectedItems().count()>1){ @@ -1263,7 +1263,7 @@ void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) page->copy(); if (a == pasteAction) page->paste(); - if (a == brinToTopAction) + if (a == bringToTopAction) page->bringToFront(); if (a == sendToBackAction) page->sendToBack(); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 332dd27..64e04f6 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -555,7 +555,7 @@ void ReportDesignWidget::cut() activePage()->cut(); } -void ReportDesignWidget::brinToFront() +void ReportDesignWidget::bringToFront() { if (activePage()) activePage()->bringToFront(); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 913d85b..da9719f 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -138,7 +138,7 @@ public slots: void copy(); void paste(); void cut(); - void brinToFront(); + void bringToFront(); void sendToBack(); void alignToLeft(); void alignToRight(); From 8b09176b592dc9a312f775f6da4a4385d1dbd38d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Skowro=C5=84ski?= Date: Sun, 23 Dec 2018 18:06:57 +0100 Subject: [PATCH 214/347] Fix GCC 8 warning: catching polymorphic type by value [-Wcatch-value=] --- limereport/lrbasedesignintf.cpp | 2 +- limereport/lrdatasourcemanager.cpp | 6 +++--- limereport/lrscriptenginemanager.cpp | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index ba3b71d..0427d2b 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1372,7 +1372,7 @@ QObject *BaseDesignIntf::createElement(const QString& /*collectionName*/, const obj = LimeReport::DesignElementsFactory::instance().objectCreator(elementType)(this, this); connect(obj,SIGNAL(propertyChanged(QString,QVariant,QVariant)),page(),SLOT(slotItemPropertyChanged(QString,QVariant,QVariant))); } - } catch (ReportError error){ + } catch (ReportError &error){ qDebug()<autoconnect()) { try { connectConnection(conn); - } catch(ReportError e){ + } catch(ReportError &e){ setLastError(e.what()); putError(e.what()); qDebug()<putError(e.what()); if (!dataManager()->reportSettings() || dataManager()->reportSettings()->suppressAbsentFieldsAndVarsWarnings()) context.replace(rx.cap(0),e.what()); From 8b3a8a138e83da377aa87e4c85a196800408a166 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 3 Jan 2019 00:14:18 +0300 Subject: [PATCH 215/347] build fixed --- limereport/limereport.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 4ea7447..533bd97 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -87,7 +87,7 @@ contains(CONFIG,zint){ INCLUDEPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt DEPENDPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt LIBS += -L$${DEST_LIBS} - contains(CONFIG,release) { + CONFIG(release, debug|release){ LIBS += -lQtZint } else { LIBS += -lQtZintd From 896aa656c77ca9c13aa053f256e7c3bdb27e43a1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 8 Jan 2019 18:02:12 +0300 Subject: [PATCH 216/347] Image variable can contain a resource path. --- limereport/items/lrimageitem.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/limereport/items/lrimageitem.cpp b/limereport/items/lrimageitem.cpp index a271cda..0c61d00 100644 --- a/limereport/items/lrimageitem.cpp +++ b/limereport/items/lrimageitem.cpp @@ -105,7 +105,11 @@ void ImageItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, m_picture = QImage(m_resourcePath); } else if (!m_variable.isEmpty()){ QVariant data = dataManager->variable(m_variable); - loadPictureFromVariant(data); + if (data.type() == QVariant::String){ + m_picture = QImage(data.toString()); + } else if (data.type() == QVariant::Image){ + loadPictureFromVariant(data); + } } } if (m_autoSize){ @@ -140,7 +144,7 @@ void ImageItem::setVariable(const QString& content) QString oldValue = m_variable; m_variable=content; update(); - notify("content", oldValue, m_variable); + notify("variable", oldValue, m_variable); } } From ce1656d2ef43c1f9d6bda8cfa4827c17794a1db1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 12 Dec 2018 22:55:03 +0300 Subject: [PATCH 217/347] External drawing feature added to ImageItem --- include/lrglobal.h | 14 +++++++- include/lrreportengine.h | 2 ++ limereport/databrowser/lrdatabrowser.cpp | 3 ++ limereport/items/lrimageitem.cpp | 35 ++++++++++++++++---- limereport/items/lrimageitem.h | 12 ++++++- limereport/items/lrsubitemparentpropitem.cpp | 1 + limereport/limereport.pro | 6 ++-- limereport/lrglobal.cpp | 4 +++ limereport/lrglobal.h | 14 +++++++- limereport/lrreportengine.cpp | 25 +++++++++++++- limereport/lrreportengine.h | 2 ++ limereport/lrreportengine_p.h | 9 ++++- limereport/lrreportrender.h | 2 +- 13 files changed, 113 insertions(+), 16 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index 3ecebb1..d1cb8b9 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -119,7 +119,7 @@ namespace Const{ class ReportError : public std::runtime_error{ public: - ReportError(const QString& message):std::runtime_error(message.toStdString()){} + ReportError(const QString& message); }; class ReportSettings{ @@ -132,6 +132,18 @@ namespace Const{ bool m_suppressAbsentFieldsAndVarsWarnings; }; + class IExternalPainter{ + public: + virtual void paintByExternalPainter(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem* options) = 0; + virtual ~IExternalPainter(); + }; + + class IPainterProxy{ + public: + virtual void setExternalPainter(IExternalPainter* externalPainter) = 0; + virtual ~IPainterProxy(); + }; + #ifdef HAVE_QT4 typedef QStyleOptionViewItemV4 StyleOptionViewItem; #else diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 38f8c1b..2abf45b 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -135,6 +135,8 @@ signals: void currentDefaulLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); + void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); + public slots: void cancelRender(); protected: diff --git a/limereport/databrowser/lrdatabrowser.cpp b/limereport/databrowser/lrdatabrowser.cpp index 50eaa6a..10de89e 100644 --- a/limereport/databrowser/lrdatabrowser.cpp +++ b/limereport/databrowser/lrdatabrowser.cpp @@ -661,6 +661,8 @@ void DataBrowser::applyChanges(SQLEditResult result) break; case SQLEditResult::SubProxy: changeProxy(result); + break; + default: break; } } else { removeDatasource(result.datasourceName); @@ -679,6 +681,7 @@ void DataBrowser::addDatasource(SQLEditResult result) break; case SQLEditResult::SubProxy: addProxy(result); + break; default: break; } diff --git a/limereport/items/lrimageitem.cpp b/limereport/items/lrimageitem.cpp index 0c61d00..ca92e71 100644 --- a/limereport/items/lrimageitem.cpp +++ b/limereport/items/lrimageitem.cpp @@ -48,11 +48,15 @@ bool VARIABLE_IS_NOT_USED registred = LimeReport::DesignElementsFactory::instanc namespace LimeReport{ ImageItem::ImageItem(QObject* owner,QGraphicsItem* parent) - :ItemDesignIntf(xmlTag,owner,parent),m_autoSize(false), m_scale(true), m_keepAspectRatio(true), m_center(true), m_format(Binary){} + :ItemDesignIntf(xmlTag,owner,parent), m_useExternalPainter(false), m_externalPainter(0), + m_autoSize(false), m_scale(true), + m_keepAspectRatio(true), m_center(true), m_format(Binary){} BaseDesignIntf *ImageItem::createSameTypeItem(QObject *owner, QGraphicsItem *parent) { - return new ImageItem(owner,parent); + ImageItem* result = new ImageItem(owner,parent); + result->setExternalPainter(m_externalPainter); + return result; } void ImageItem::loadPictureFromVariant(QVariant& data){ @@ -91,12 +95,26 @@ void ImageItem::processPopUpAction(QAction *action) } } +bool ImageItem::useExternalPainter() const +{ + return m_useExternalPainter; +} + +void ImageItem::setUseExternalPainter(bool value) +{ + if (m_useExternalPainter != value){ + m_useExternalPainter = value; + notify("useExternalPainter",!value, value); + update(); + } +} + void ImageItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) { - if (m_picture.isNull()){ - if (!m_datasource.isEmpty() && !m_field.isEmpty()){ - IDataSource* ds = dataManager->dataSource(m_datasource); + if (m_picture.isNull()){ + if (!m_datasource.isEmpty() && !m_field.isEmpty()){ + IDataSource* ds = dataManager->dataSource(m_datasource); if (ds) { QVariant data = ds->data(m_field); loadPictureFromVariant(data); @@ -293,10 +311,13 @@ void ImageItem::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *option ppainter->setPen(Qt::black); if (!datasource().isEmpty() && !field().isEmpty()) text = datasource()+"."+field(); - else text = tr("Image"); + else if (m_useExternalPainter) text = tr("Ext."); else text = tr("Image"); ppainter->drawText(rect().adjusted(4,4,-4,-4), Qt::AlignCenter, text ); } else { - ppainter->drawImage(point,img); + if (m_externalPainter && m_useExternalPainter) + m_externalPainter->paintByExternalPainter(this->patternName(), ppainter, option); + else + ppainter->drawImage(point,img); } ItemDesignIntf::paint(ppainter,option,widget); ppainter->restore(); diff --git a/limereport/items/lrimageitem.h b/limereport/items/lrimageitem.h index f6713df..91a3d92 100644 --- a/limereport/items/lrimageitem.h +++ b/limereport/items/lrimageitem.h @@ -33,7 +33,7 @@ namespace LimeReport{ -class ImageItem : public LimeReport::ItemDesignIntf +class ImageItem : public LimeReport::ItemDesignIntf, public IPainterProxy { Q_OBJECT Q_ENUMS(Format) @@ -49,6 +49,8 @@ class ImageItem : public LimeReport::ItemDesignIntf Q_PROPERTY(QString resourcePath READ resourcePath WRITE setResourcePath) Q_PROPERTY(QString variable READ variable WRITE setVariable) Q_PROPERTY(bool watermark READ isWatermark WRITE setWatermark) + Q_PROPERTY(bool useExternalPainter READ useExternalPainter WRITE setUseExternalPainter) + public: enum Format { Binary = 0, @@ -81,6 +83,12 @@ public: QString variable(){ return m_variable;} void setVariable(const QString& variable); + + void setExternalPainter(IExternalPainter* externalPainter){ m_externalPainter = externalPainter;} + + bool useExternalPainter() const; + void setUseExternalPainter(bool value); + protected: BaseDesignIntf* createSameTypeItem(QObject *owner, QGraphicsItem *parent); void updateItemSize(DataSourceManager *dataManager, RenderPass pass, int maxHeight); @@ -91,6 +99,8 @@ protected: void processPopUpAction(QAction *action); private: QImage m_picture; + bool m_useExternalPainter; + IExternalPainter* m_externalPainter; QString m_resourcePath; QString m_datasource; QString m_field; diff --git a/limereport/items/lrsubitemparentpropitem.cpp b/limereport/items/lrsubitemparentpropitem.cpp index b02cfa7..61ff802 100644 --- a/limereport/items/lrsubitemparentpropitem.cpp +++ b/limereport/items/lrsubitemparentpropitem.cpp @@ -77,6 +77,7 @@ void LimeReport::ItemLocationPropItem::setPropertyEditorData(QWidget *propertyEd } void LimeReport::ItemLocationPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index){ + Q_UNUSED(propertyEditor) model->setData(index,object()->property(propertyName().toLatin1())); setValueToObject(propertyName(), propertyValue()); } diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 533bd97..3c324b0 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -1,7 +1,7 @@ -CONFIG(release, debug|release){ - TARGET = limereport -} else { +CONFIG(debug, debug|release){ TARGET = limereportd +} else { + TARGET = limereport } TEMPLATE = lib diff --git a/limereport/lrglobal.cpp b/limereport/lrglobal.cpp index 55ab31b..4d8da61 100644 --- a/limereport/lrglobal.cpp +++ b/limereport/lrglobal.cpp @@ -85,4 +85,8 @@ bool isColorDark(QColor color){ } } +ReportError::ReportError(const QString& message):std::runtime_error(message.toStdString()){} +IExternalPainter::~IExternalPainter(){} +IPainterProxy::~IPainterProxy(){} + } //namespace LimeReport diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 3ecebb1..d1cb8b9 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -119,7 +119,7 @@ namespace Const{ class ReportError : public std::runtime_error{ public: - ReportError(const QString& message):std::runtime_error(message.toStdString()){} + ReportError(const QString& message); }; class ReportSettings{ @@ -132,6 +132,18 @@ namespace Const{ bool m_suppressAbsentFieldsAndVarsWarnings; }; + class IExternalPainter{ + public: + virtual void paintByExternalPainter(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem* options) = 0; + virtual ~IExternalPainter(); + }; + + class IPainterProxy{ + public: + virtual void setExternalPainter(IExternalPainter* externalPainter) = 0; + virtual ~IPainterProxy(); + }; + #ifdef HAVE_QT4 typedef QStyleOptionViewItemV4 StyleOptionViewItem; #else diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 06fc9bc..ab09828 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1118,12 +1118,32 @@ PageItemDesignIntf* ReportEnginePrivate::createRenderingPage(PageItemDesignIntf* return result; } +void ReportEnginePrivate::initReport() +{ + for(int index = 0; index < pageCount(); ++index){ + PageDesignIntf* page = pageAt(index); + if (page != 0){ + foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()) { + IPainterProxy *proxyItem = dynamic_cast(item); + if (proxyItem){ + proxyItem->setExternalPainter(this); + } + } + } + } +} + +void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem* options) +{ + emit externalPaint(objectName, painter, options); +} + ReportPages ReportEnginePrivate::renderToPages() { if (m_reportRendering) return ReportPages(); + initReport(); m_reportRender = ReportRender::Ptr(new ReportRender); updateTranslations(); - connect(m_reportRender.data(),SIGNAL(pageRendered(int)), this, SIGNAL(renderPageFinished(int))); @@ -1232,6 +1252,9 @@ ReportEngine::ReportEngine(QObject *parent) connect(d, SIGNAL(getCurrentDefaultLanguage()), this, SIGNAL(getCurrentDefaultLanguage())); + connect(d, SIGNAL(externalPaint(const QString&, QPainter*, const QStyleOptionGraphicsItem*)), + this, SIGNAL(externalPaint(const QString&, QPainter*, const QStyleOptionGraphicsItem*))); + } ReportEngine::~ReportEngine() diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 38f8c1b..2abf45b 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -135,6 +135,8 @@ signals: void currentDefaulLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); + void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); + public slots: void cancelRender(); protected: diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index ef2d85e..9afe41e 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -93,7 +93,10 @@ public: virtual void setCurrentDesignerLanguage(QLocale::Language language) = 0; }; -class ReportEnginePrivate : public QObject, public ICollectionContainer, public ITranslationContainer, +class ReportEnginePrivate : public QObject, + public ICollectionContainer, + public ITranslationContainer, + public IExternalPainter, public ReportEnginePrivateInterface { Q_OBJECT @@ -214,6 +217,8 @@ signals: void currentDefaulLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); + void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); + public slots: bool slotLoadFromFile(const QString& fileName); void cancelRender(); @@ -242,6 +247,8 @@ private: PageItemDesignIntf *getPageByName(const QString& pageName); ATranslationProperty fakeTranslationReader(){ return ATranslationProperty();} PageItemDesignIntf *createRenderingPage(PageItemDesignIntf *page); + void initReport(); + void paintByExternalPainter(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem* options); private: QList m_pages; QList m_renderingPages; diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 80c4538..6c14bda 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -193,7 +193,7 @@ private: QList m_ranges; QVector m_columnedBandItems; unsigned long long m_currentNameIndex; - bool m_newPageStarted; + bool m_newPageStarted; bool m_renderingFirstTOC; }; From 10015ed78388d50fc204cad66f30d86e062016f8 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 14 Jan 2019 23:36:27 +0300 Subject: [PATCH 218/347] Layout space division has been changed --- limereport/items/lrhorizontallayout.cpp | 32 +++++++++++++++++-------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/limereport/items/lrhorizontallayout.cpp b/limereport/items/lrhorizontallayout.cpp index 9a6a55a..0fd3207 100644 --- a/limereport/items/lrhorizontallayout.cpp +++ b/limereport/items/lrhorizontallayout.cpp @@ -141,7 +141,7 @@ void HorizontalLayout::setItemAlign(const BaseDesignIntf::ItemAlign &itemAlign) void HorizontalLayout::updateLayoutSize() { int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; - int w = spaceBorder*2; + qreal w = spaceBorder*2; qreal h = 0; foreach(BaseDesignIntf* item, layoutsChildren()){ if (item->isEmpty() && hideEmptyItems()) item->setVisible(false); @@ -150,8 +150,15 @@ void HorizontalLayout::updateLayoutSize() w+=item->width(); } } - if (h>0) setHeight(h+spaceBorder*2); - setWidth(w); + if (h>0) setHeight(h+spaceBorder*2); + if (layoutType() == Layout) + setWidth(w); + else{ + relocateChildren(); + if (!isRelocating()){ + divideSpace(); + } + } } void HorizontalLayout::relocateChildren() @@ -216,14 +223,19 @@ void HorizontalLayout::divideSpace(){ visibleItemsCount++; } } - qreal delta = (width() - (itemsSumSize+spaceBorder*2)) / (visibleItemsCount!=0 ? visibleItemsCount : 1); - for (int i=0; iisVisible() || itemMode() == DesignMode) - layoutsChildren()[i]->setWidth(layoutsChildren()[i]->width()+delta); - if ((i+1)isVisible() || itemMode() == DesignMode) - layoutsChildren()[i+1]->setPos(layoutsChildren()[i+1]->pos().x()+delta*(i+1),layoutsChildren()[i+1]->pos().y()); + if (itemMode() == DesignMode && !layoutsChildren().isEmpty()){ + qreal delta = (width() - (itemsSumSize+spaceBorder*2)); + layoutsChildren().last()->setWidth(layoutsChildren().last()->width()+delta); + } else { + qreal delta = (width() - (itemsSumSize+spaceBorder*2)) / (visibleItemsCount!=0 ? visibleItemsCount : 1); + for (int i=0; iisVisible() || itemMode() == DesignMode) + layoutsChildren()[i]->setWidth(layoutsChildren()[i]->width()+delta); + if ((i+1)isVisible() || itemMode() == DesignMode) + layoutsChildren()[i+1]->setPos(layoutsChildren()[i+1]->pos().x()+delta*(i+1),layoutsChildren()[i+1]->pos().y()); + } } setIsRelocating(false); } From 7bc3a7e1cd9590afa6eac052e7bcc86b29031b7e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 15 Jan 2019 13:59:00 +0300 Subject: [PATCH 219/347] Layout painting has been refactored --- limereport/items/lrabstractlayout.cpp | 36 +++++++++++++++++---------- limereport/items/lrabstractlayout.h | 3 ++- limereport/lrpagedesignintf.cpp | 2 ++ 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/limereport/items/lrabstractlayout.cpp b/limereport/items/lrabstractlayout.cpp index 02b8ca8..47283b7 100644 --- a/limereport/items/lrabstractlayout.cpp +++ b/limereport/items/lrabstractlayout.cpp @@ -116,22 +116,32 @@ bool AbstractLayout::isEmpty() const return (isEmpty && allItemsIsText); } -void AbstractLayout::paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget) +void AbstractLayout::paintChild(BaseDesignIntf *child, QPointF parentPos, QPainter *painter) { - if (isSelected()){ - foreach( BaseDesignIntf* item, m_children){ - ppainter->save(); - ppainter->setPen(Qt::red); - ppainter->drawRect( - QRectF(item->pos().x(),item->pos().y(), - item->rect().bottomRight().rx(), - item->rect().bottomRight().ry() - ) - ); - ppainter->restore(); + if (!child->childBaseItems().isEmpty()){ + foreach (BaseDesignIntf* item, child->childBaseItems()) { + paintChild(item, child->pos(),painter); } } - LayoutDesignIntf::paint(ppainter, option, widget); + painter->drawRect( + QRectF(parentPos.x()+child->pos().x(), parentPos.y()+child->pos().y(), + child->rect().bottomRight().rx(), + child->rect().bottomRight().ry() + ) + ); +} + +void AbstractLayout::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) +{ + if (isSelected()){ + painter->save(); + painter->setPen(Qt::red); + foreach( BaseDesignIntf* item, m_children){ + paintChild(item, QPointF(0,0), painter); + } + painter->restore(); + } + LayoutDesignIntf::paint(painter, option, widget); } int AbstractLayout::childrenCount() diff --git a/limereport/items/lrabstractlayout.h b/limereport/items/lrabstractlayout.h index 52deaed..6f5e796 100644 --- a/limereport/items/lrabstractlayout.h +++ b/limereport/items/lrabstractlayout.h @@ -24,7 +24,8 @@ public: void addChild(BaseDesignIntf *item,bool updateSize=true); void restoreChild(BaseDesignIntf *item); bool isEmpty() const; - void paint(QPainter* ppainter, const QStyleOptionGraphicsItem* option, QWidget* widget); + void paintChild(BaseDesignIntf* child, QPointF parentPos, QPainter* painter); + void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget); bool hideEmptyItems() const; void setHideEmptyItems(bool hideEmptyItems); diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index d712528..6581029 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -2200,6 +2200,7 @@ void InsertHLayoutCommand::undoIt() bi->setPos(m_elements.value(bi->objectName())); bi->setFixedPos(false); bi->setPossibleResizeDirectionFlags(BaseDesignIntf::AllDirections); + bi->setVisible(true); } } page()->removeReportItem(layout,false); @@ -2384,6 +2385,7 @@ void InsertVLayoutCommand::undoIt() bi->setPos(m_elements.value(bi->objectName())); bi->setFixedPos(false); bi->setPossibleResizeDirectionFlags(BaseDesignIntf::AllDirections); + bi->setVisible(true); } } page()->removeReportItem(layout,false); From a79a4f6b6823abcf81e7997c1aa242041dfac762 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 16 Jan 2019 04:00:54 +0300 Subject: [PATCH 220/347] designer_plugin.pro fixed --- designer_plugin/designer_plugin.pro | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/designer_plugin/designer_plugin.pro b/designer_plugin/designer_plugin.pro index 1c39b32..219a796 100644 --- a/designer_plugin/designer_plugin.pro +++ b/designer_plugin/designer_plugin.pro @@ -38,9 +38,9 @@ contains(CONFIG,zint){ INCLUDEPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt DEPENDPATH += $$ZINT_PATH/backend $$ZINT_PATH/backend_qt LIBS += -L$${DEST_LIBS} - contains(CONFIG,release) { - LIBS += -lQtZint - } else { + CONFIG(debug, debug|release){ LIBS += -lQtZintd + } else { + LIBS += -lQtZint } } From 83fd13589e9d8b869528123466e80288375e938a Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 16 Jan 2019 03:58:54 +0300 Subject: [PATCH 221/347] PagesRanges object has been added --- limereport/lrreportengine.cpp | 19 +++++-- limereport/lrreportengine_p.h | 1 + limereport/lrreportrender.cpp | 102 +++++++++++++++++++++++++++++++++- limereport/lrreportrender.h | 20 +++++++ 4 files changed, 134 insertions(+), 8 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index ab09828..9b1ab37 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -82,7 +82,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage), m_previewLayoutDirection(Qt::LayoutDirectionAuto), m_designerFactory(0), - m_previewScaleType(FitWidth), m_previewScalePercent(0) + m_previewScaleType(FitWidth), m_previewScalePercent(0), m_startTOCPage(0) { #ifdef HAVE_STATIC_BUILD initResources(); @@ -1140,6 +1140,9 @@ void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPai ReportPages ReportEnginePrivate::renderToPages() { + int startTOCPage = -1; + int pageAfterTOCIndex = -1; + if (m_reportRendering) return ReportPages(); initReport(); m_reportRender = ReportRender::Ptr(new ReportRender); @@ -1176,10 +1179,15 @@ ReportPages ReportEnginePrivate::renderToPages() activateLanguage(m_reportLanguage); emit renderStarted(); - foreach(PageItemDesignIntf* page , m_renderingPages){ + for(int i = 0; i < m_renderingPages.count(); ++i){ + PageItemDesignIntf* page = m_renderingPages.at(i); if (!page->isTOC() && page->isPrintable()){ page->setReportSettings(&m_reportSettings); result.append(m_reportRender->renderPageToPages(page)); + } else { + startTOCPage = result.count(); + pageAfterTOCIndex = i+1; + m_reportRender->createTOCMarker(page->resetPageNumber()); } } @@ -1187,16 +1195,17 @@ ReportPages ReportEnginePrivate::renderToPages() PageItemDesignIntf* page = m_renderingPages.at(i); if (page->isTOC()){ page->setReportSettings(&m_reportSettings); - if (i==0){ + if (i < m_renderingPages.count()){ PageItemDesignIntf* secondPage = 0; - if (m_pages.count()>1) secondPage = m_renderingPages.at(1); + if ( m_renderingPages.count() > (pageAfterTOCIndex)) + secondPage = m_renderingPages.at(pageAfterTOCIndex); ReportPages pages = m_reportRender->renderTOC( page, true, secondPage && secondPage->resetPageNumber() ); for (int j=0; j exporters; ScaleType m_previewScaleType; int m_previewScalePercent; + int m_startTOCPage; }; } diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index a2d1c7f..6bfbc44 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -193,11 +193,14 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool m_currentNameIndex = 0; m_patternPageItem = patternPage; m_renderingFirstTOC = isTOC && isFirst; - if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) { resetPageNumber(PageReset); } + if (m_patternPageItem->resetPageNumber() && !isTOC && m_pageCount == 0){ + m_pagesRanges.startNewRange(); + } + if (m_renderingFirstTOC && resetPageNumbers){ PagesRange range; range.firstPage = 0; @@ -249,8 +252,8 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool savePage(true); if (m_renderingFirstTOC && resetPageNumbers && m_ranges.count()>1){ - m_ranges[1].firstPage = m_ranges.at(0).lastPage+1; - m_ranges[1].lastPage += m_ranges.at(0).lastPage+1; + m_ranges[1].firstPage = m_ranges.first().lastPage+1; + m_ranges[1].lastPage += m_ranges.first().lastPage+1; } #ifndef USE_QJSENGINE @@ -1153,6 +1156,11 @@ void ReportRender::secondRenderPass(ReportPages renderedPages) } } +void ReportRender::createTOCMarker(bool startNewRange) +{ + m_pagesRanges.addTOCMarker(startNewRange); +} + BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, int height, BandDesignIntf* patternBand) { int sliceHeight = height; @@ -1256,6 +1264,7 @@ void ReportRender::startNewPage(bool isFirst) void ReportRender::resetPageNumber(ResetPageNuberType resetType) { + m_pagesRanges.startNewRange(); PagesRange range; if (!m_ranges.isEmpty()){ currentRange().lastPage = (resetType == BandReset)? m_pageCount : m_pageCount-1; @@ -1406,6 +1415,10 @@ void ReportRender::moveTearOffBand(){ void ReportRender::savePage(bool isLast) { + if (m_renderPageItem->isTOC()) + m_pagesRanges.addTOCPage(); + else + m_pagesRanges.addPage(); m_datasources->setReportVariable("#IS_LAST_PAGEFOOTER",isLast); m_datasources->setReportVariable("#IS_FIRST_PAGEFOOTER",m_datasources->variable("#PAGE").toInt()==1); @@ -1478,4 +1491,87 @@ void ReportRender::cancelRender(){ m_renderCanceled = true; } +int PagesRanges::findLastPageNumber(int index) +{ + foreach (PagesRange range, m_ranges) { + if ( range.firstPage<= (index) && range.lastPage>= (index) ) + return (range.lastPage-(range.firstPage))+1; + } + return 0; +} + +int PagesRanges::findPageNumber(int index) +{ + foreach (PagesRange range, m_ranges) { + if ( range.firstPage <= (index) && range.lastPage >= (index) ) + return (index - range.firstPage)+1; + } + return 0; +} + +void PagesRanges::startNewRange(bool isTOC) +{ + PagesRange range; + if (!m_ranges.isEmpty()){ + range.firstPage = 0; + range.lastPage = m_ranges.last().lastPage + 1; + } else { + range.firstPage = 0; + range.lastPage = 0; + } + range.isTOC = isTOC; + m_ranges.append(range); + if (isTOC) m_TOCRangeIndex = m_ranges.size()-1; +} + +void PagesRanges::addTOCMarker(bool addNewRange) +{ + if ( addNewRange || m_ranges.isEmpty()){ + startNewRange(true); + } else { + m_TOCRangeIndex = m_ranges.size()-1; + m_ranges.last().isTOC = true; + } +} + +void PagesRanges::addPage() +{ + if (m_ranges.isEmpty()) startNewRange(); + if (m_ranges.last().firstPage == 0){ + m_ranges.last().firstPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage; + m_ranges.last().lastPage = m_ranges.last().lastPage == 0 ? 1 : m_ranges.last().lastPage; + } else { + m_ranges.last().lastPage++; + } +} + +void PagesRanges::shiftRangesNextToTOC(){ + for(int i = m_TOCRangeIndex+1; i < m_ranges.size(); ++i){ + m_ranges[i].firstPage++; + m_ranges[i].lastPage++; + } +} + +void PagesRanges::addTOCPage() +{ + Q_ASSERT(m_TOCRangeIndex != -1); + if (m_TOCRangeIndex != -1){ + PagesRange& tocRange = m_ranges[m_TOCRangeIndex]; + if (tocRange.firstPage == 0) { + tocRange.firstPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; + tocRange.lastPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; + if (tocRange.lastPage == 1 and tocRange.lastPage == 1) + shiftRangesNextToTOC(); + } else { + tocRange.lastPage++; + shiftRangesNextToTOC(); + } + } +} + +void PagesRanges::clear() +{ + m_ranges.clear(); +} + } // namespace LimeReport diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 6c14bda..a55baa4 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -61,6 +61,24 @@ private: struct PagesRange{ int firstPage; int lastPage; + bool isTOC; +}; + +class PagesRanges{ +public: + PagesRanges(): m_TOCRangeIndex(-1) {} + int findLastPageNumber(int index); + int findPageNumber(int index); + void startNewRange(bool isTOC = false); + void addTOCMarker(bool addNewRange); + void addPage(); + void addTOCPage(); + void clear(); +private: + void shiftRangesNextToTOC(); +private: + QVector m_ranges; + int m_TOCRangeIndex; }; class ReportRender: public QObject @@ -84,6 +102,7 @@ public: ReportPages renderPageToPages(PageItemDesignIntf *patternPage); ReportPages renderTOC(PageItemDesignIntf *patternPage, bool first, bool resetPages); void secondRenderPass(ReportPages renderedPages); + void createTOCMarker(bool startNewRange); signals: void pageRendered(int renderedPageCount); public slots: @@ -191,6 +210,7 @@ private: QVector m_currentStartDataPos; int m_currentColumn; QList m_ranges; + PagesRanges m_pagesRanges; QVector m_columnedBandItems; unsigned long long m_currentNameIndex; bool m_newPageStarted; From ed05f5442e6d30d72d8e9c24e29c697a2bfdf429 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 17 Jan 2019 00:26:27 +0300 Subject: [PATCH 222/347] Old page ranges have been removed --- limereport/lrpagedesignintf.h | 9 +++-- limereport/lrreportrender.cpp | 65 +++++++++-------------------------- limereport/lrreportrender.h | 9 +++-- 3 files changed, 27 insertions(+), 56 deletions(-) diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 962b066..8330509 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -223,7 +223,10 @@ namespace LimeReport { void multiItemsSelected(QList* objectsList); void miltiItemsSelectionFinished(); void commandHistoryChanged(); - void itemPropertyChanged(const QString& objectName, const QString& propertyName, const QVariant& oldValue, const QVariant& newValue); + void itemPropertyChanged(const QString& objectName, + const QString& propertyName, + const QVariant& oldValue, + const QVariant& newValue); void itemAdded(LimeReport::PageDesignIntf* page, LimeReport::BaseDesignIntf* item); void itemRemoved(LimeReport::PageDesignIntf* page, LimeReport::BaseDesignIntf* item); void bandAdded(LimeReport::PageDesignIntf* page, LimeReport::BandDesignIntf* band); @@ -275,7 +278,9 @@ namespace LimeReport { void checkSizeOrPosChanges(); CommandIf::Ptr createChangePosCommand(); CommandIf::Ptr createChangeSizeCommand(); - void saveChangeProppertyCommand(const QString& objectName, const QString& propertyName, const QVariant& oldPropertyValue, const QVariant& newPropertyValue); + void saveChangeProppertyCommand(const QString& objectName, const QString& propertyName, + const QVariant& oldPropertyValue, + const QVariant& newPropertyValue); void changeSelectedGroupProperty(const QString& name,const QVariant& value); private: diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 6bfbc44..e2a302b 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -148,7 +148,7 @@ void ReportRender::renameChildItems(BaseDesignIntf *item){ ReportRender::ReportRender(QObject *parent) :QObject(parent), m_renderPageItem(0), m_pageCount(0), - m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false), m_renderingFirstTOC(false) + m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false) { initColumns(); } @@ -192,7 +192,7 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool { m_currentNameIndex = 0; m_patternPageItem = patternPage; - m_renderingFirstTOC = isTOC && isFirst; + if (m_patternPageItem->resetPageNumber() && m_pageCount>0 && !isTOC) { resetPageNumber(PageReset); } @@ -201,14 +201,6 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool m_pagesRanges.startNewRange(); } - if (m_renderingFirstTOC && resetPageNumbers){ - PagesRange range; - range.firstPage = 0; - range.lastPage = 0; - m_ranges.insert(0,range); - m_pageCount = 0; - } - m_renderCanceled = false; BandDesignIntf* reportFooter = m_patternPageItem->bandByType(BandDesignIntf::ReportFooter); m_reportFooterHeight = 0; @@ -251,11 +243,6 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool savePage(true); - if (m_renderingFirstTOC && resetPageNumbers && m_ranges.count()>1){ - m_ranges[1].firstPage = m_ranges.first().lastPage+1; - m_ranges[1].lastPage += m_ranges.first().lastPage+1; - } - #ifndef USE_QJSENGINE ScriptEngineManager::instance().scriptEngine()->popContext(); #endif @@ -1141,15 +1128,15 @@ void ReportRender::secondRenderPass(ReportPages renderedPages) for(int i=0; ichildBaseItems()){ - updateTOC(item, findPageNumber(i)); + updateTOC(item, m_pagesRanges.findPageNumber(i)); } } } for(int i=0; isetReportVariable("#PAGE",findPageNumber(i)); - m_datasources->setReportVariable("#PAGE_COUNT",findLastPageNumber(i)); + m_datasources->setReportVariable("#PAGE",m_pagesRanges.findPageNumber(i)); + m_datasources->setReportVariable("#PAGE_COUNT",m_pagesRanges.findLastPageNumber(i)); foreach(BaseDesignIntf* item, page->childBaseItems()){ item->updateItemSize(m_datasources, SecondPass); } @@ -1265,37 +1252,10 @@ void ReportRender::startNewPage(bool isFirst) void ReportRender::resetPageNumber(ResetPageNuberType resetType) { m_pagesRanges.startNewRange(); - PagesRange range; - if (!m_ranges.isEmpty()){ - currentRange().lastPage = (resetType == BandReset)? m_pageCount : m_pageCount-1; - range.firstPage = m_pageCount+((resetType == BandReset)? 1 : 0); - } else { - range.firstPage = m_pageCount; - } - range.lastPage = (resetType == BandReset)? 0 : m_pageCount; - m_ranges.append(range); if (resetType == PageReset) m_datasources->setReportVariable("#PAGE",1); } -int ReportRender::findLastPageNumber(int currentPage) -{ - foreach (PagesRange range, m_ranges) { - if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) ) - return (range.lastPage-(range.firstPage))+1; - } - return 0; -} - -int ReportRender::findPageNumber(int currentPage) -{ - foreach (PagesRange range, m_ranges) { - if ( range.firstPage<= (currentPage) && range.lastPage>= (currentPage) ) - return (currentPage - range.firstPage)+1; - } - return 0; -} - void ReportRender::cutGroups() { m_popupedExpression.clear(); @@ -1440,14 +1400,12 @@ void ReportRender::savePage(bool isLast) } } - if (currentRange(m_renderingFirstTOC).lastPage==0 && m_ranges.count()>1) { + if (m_pagesRanges.currentRange(m_patternPageItem->isTOC()).firstPage == 0) { m_datasources->setReportVariable("#PAGE",1); } else { m_datasources->setReportVariable("#PAGE",m_datasources->variable("#PAGE").toInt()+1); } - currentRange(m_renderingFirstTOC).lastPage = m_pageCount; - BandDesignIntf* pageFooter = m_renderPageItem->bandByType(BandDesignIntf::PageFooter); if (pageFooter) pageFooter->setBandIndex(++m_currentIndex); m_renderedPages.append(PageItemDesignIntf::Ptr(m_renderPageItem)); @@ -1493,8 +1451,9 @@ void ReportRender::cancelRender(){ int PagesRanges::findLastPageNumber(int index) { + index++; foreach (PagesRange range, m_ranges) { - if ( range.firstPage<= (index) && range.lastPage>= (index) ) + if ( range.firstPage <= (index) && range.lastPage>= (index) ) return (range.lastPage-(range.firstPage))+1; } return 0; @@ -1502,6 +1461,7 @@ int PagesRanges::findLastPageNumber(int index) int PagesRanges::findPageNumber(int index) { + index++; foreach (PagesRange range, m_ranges) { if ( range.firstPage <= (index) && range.lastPage >= (index) ) return (index - range.firstPage)+1; @@ -1509,6 +1469,13 @@ int PagesRanges::findPageNumber(int index) return 0; } +PagesRange&PagesRanges::currentRange(bool isTOC) +{ + Q_ASSERT( (isTOC && m_TOCRangeIndex!=-1) || !isTOC); + if (isTOC && m_TOCRangeIndex !=-1) return m_ranges[m_TOCRangeIndex]; + return m_ranges.last(); +} + void PagesRanges::startNewRange(bool isTOC) { PagesRange range; diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index a55baa4..8cbbc0f 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -69,6 +69,7 @@ public: PagesRanges(): m_TOCRangeIndex(-1) {} int findLastPageNumber(int index); int findPageNumber(int index); + PagesRange& currentRange(bool isTOC); void startNewRange(bool isTOC = false); void addTOCMarker(bool addNewRange); void addPage(); @@ -166,8 +167,8 @@ private: void startNewColumn(); void startNewPage(bool isFirst = false); void resetPageNumber(ResetPageNuberType resetType); - int findLastPageNumber(int currentPage); - int findPageNumber(int currentPage); + //int findLastPageNumber(int currentPage); + //int findPageNumber(int currentPage); void savePage(bool isLast = false); QString toString(); void initColumns(); @@ -180,7 +181,7 @@ private: void renameChildItems(BaseDesignIntf *item); void renderGroupFooterByHeader(BandDesignIntf *groupHeader); void updateTOC(BaseDesignIntf* item, int pageNumber); - PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();} + //PagesRange& currentRange(bool isTOC = false){ return (isTOC) ? m_ranges.first(): m_ranges.last();} void placeBandOnPage(BandDesignIntf *band, int columnIndex); private: DataSourceManager* m_datasources; @@ -209,12 +210,10 @@ private: QVector m_maxHeightByColumn; QVector m_currentStartDataPos; int m_currentColumn; - QList m_ranges; PagesRanges m_pagesRanges; QVector m_columnedBandItems; unsigned long long m_currentNameIndex; bool m_newPageStarted; - bool m_renderingFirstTOC; }; } // namespace LimeReport From 7aeb938f86accc0c5d557c786a8dd40ed1b8db3b Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 21 Jan 2019 00:12:54 +0300 Subject: [PATCH 223/347] and -> && --- limereport/lrreportrender.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 6bfbc44..c5b59a3 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -1560,7 +1560,7 @@ void PagesRanges::addTOCPage() if (tocRange.firstPage == 0) { tocRange.firstPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; tocRange.lastPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; - if (tocRange.lastPage == 1 and tocRange.lastPage == 1) + if (tocRange.lastPage == 1 && tocRange.lastPage == 1) shiftRangesNextToTOC(); } else { tocRange.lastPage++; From e5a0d2943d5a27e80894066df8c92deb197c12bb Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 24 Jan 2019 22:10:15 +0300 Subject: [PATCH 224/347] IDataSource extracted to own file --- include/lrdatasourcemanagerintf.h | 6 ++- limereport/limereport.pri | 1 + limereport/limereport.pro | 1 + limereport/lrdatadesignintf.h | 69 ++++++++++++++-------------- limereport/lrdatasourceintf.h | 47 +++++++++++++++++++ limereport/lrdatasourcemanager.h | 1 + limereport/lrdatasourcemanagerintf.h | 6 ++- 7 files changed, 95 insertions(+), 36 deletions(-) create mode 100644 limereport/lrdatasourceintf.h diff --git a/include/lrdatasourcemanagerintf.h b/include/lrdatasourcemanagerintf.h index f86e51e..a10cb05 100644 --- a/include/lrdatasourcemanagerintf.h +++ b/include/lrdatasourcemanagerintf.h @@ -32,6 +32,7 @@ #include "lrcallbackdatasourceintf.h" #include "lrglobal.h" +#include "lrdatasourceintf.h" class QVariant; class QString; @@ -40,12 +41,14 @@ namespace LimeReport{ class IDbCredentialsProvider{ public: + virtual ~IDbCredentialsProvider(){} virtual QString getUserName(const QString& connectionName) = 0; virtual QString getPassword(const QString& connectionName) = 0; }; class IDataSourceManager{ public: + virtual ~IDataSourceManager(){} virtual void setReportVariable(const QString& name, const QVariant& value) = 0; virtual void setDefaultDatabasePath(const QString &defaultDatabasePath) = 0; virtual void deleteVariable(const QString& name) = 0; @@ -57,12 +60,13 @@ public: virtual void clearUserVariables()=0; virtual ICallbackDatasource* createCallbackDatasource(const QString& name) = 0; virtual void registerDbCredentialsProvider(IDbCredentialsProvider* provider) = 0; - virtual QStringList variableNames() = 0; virtual bool variableIsMandatory(const QString& name) = 0; virtual VariableDataType variableDataType(const QString& name) = 0; virtual bool variableIsSystem(const QString& name) = 0; + virtual IDataSource* dataSource(const QString& name) = 0; }; } #endif // LRDATASOURCEMANAGERINTF_H + diff --git a/limereport/limereport.pri b/limereport/limereport.pri index 5e086a7..bc752e2 100644 --- a/limereport/limereport.pri +++ b/limereport/limereport.pri @@ -131,6 +131,7 @@ HEADERS += \ $$REPORT_PATH/lrvariablesholder.h \ $$REPORT_PATH/lrgroupfunctions.h \ $$REPORT_PATH/lrreportengine.h \ + $$REPORT_PATH/lrdatasourceintf.h \ $$REPORT_PATH/lrdatasourcemanagerintf.h \ $$REPORT_PATH/lrscriptenginemanagerintf.h \ $$REPORT_PATH/lrsimplecrypt.h \ diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 3c324b0..f790982 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -34,6 +34,7 @@ contains(CONFIG, staticlib){ EXTRA_FILES += \ $$PWD/lrglobal.h \ + $$PWD/lrdatasourceintf.h \ $$PWD/lrdatasourcemanagerintf.h \ $$PWD/lrreportengine.h \ $$PWD/lrscriptenginemanagerintf.h \ diff --git a/limereport/lrdatadesignintf.h b/limereport/lrdatadesignintf.h index 2336ad5..85d7957 100644 --- a/limereport/lrdatadesignintf.h +++ b/limereport/lrdatadesignintf.h @@ -40,46 +40,47 @@ #include #include "lrcollection.h" #include "lrcallbackdatasourceintf.h" +#include "lrdatasourceintf.h" namespace LimeReport{ class DataSourceManager; -class IDataSource { -public: - enum DatasourceMode{DESIGN_MODE,RENDER_MODE}; - typedef QSharedPointer Ptr; - virtual ~IDataSource(){} - virtual bool next() = 0; - virtual bool hasNext() = 0; - virtual bool prior() = 0; - virtual void first() = 0; - virtual void last() = 0; - virtual bool bof() = 0; - virtual bool eof() = 0; - virtual QVariant data(const QString& columnName) = 0; - virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0; - virtual int columnCount() = 0; - virtual QString columnNameByIndex(int columnIndex) = 0; - virtual int columnIndexByName(QString name) = 0; - virtual bool isInvalid() const = 0; - virtual QString lastError() = 0; - virtual QAbstractItemModel* model() = 0; -}; +//class IDataSource { +//public: +// enum DatasourceMode{DESIGN_MODE,RENDER_MODE}; +// typedef QSharedPointer Ptr; +// virtual ~IDataSource(){} +// virtual bool next() = 0; +// virtual bool hasNext() = 0; +// virtual bool prior() = 0; +// virtual void first() = 0; +// virtual void last() = 0; +// virtual bool bof() = 0; +// virtual bool eof() = 0; +// virtual QVariant data(const QString& columnName) = 0; +// virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0; +// virtual int columnCount() = 0; +// virtual QString columnNameByIndex(int columnIndex) = 0; +// virtual int columnIndexByName(QString name) = 0; +// virtual bool isInvalid() const = 0; +// virtual QString lastError() = 0; +// virtual QAbstractItemModel* model() = 0; +//}; -class IDataSourceHolder { -public: - virtual IDataSource* dataSource(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE) = 0; - virtual QString lastError() const = 0; - virtual bool isInvalid() const = 0; - virtual bool isOwned() const = 0; - virtual bool isEditable() const = 0; - virtual bool isRemovable() const = 0; - virtual void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false) = 0; - virtual void update() = 0; - virtual void clearErrors() = 0; - virtual ~IDataSourceHolder(){} -}; +//class IDataSourceHolder { +//public: +// virtual IDataSource* dataSource(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE) = 0; +// virtual QString lastError() const = 0; +// virtual bool isInvalid() const = 0; +// virtual bool isOwned() const = 0; +// virtual bool isEditable() const = 0; +// virtual bool isRemovable() const = 0; +// virtual void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false) = 0; +// virtual void update() = 0; +// virtual void clearErrors() = 0; +// virtual ~IDataSourceHolder(){} +//}; class ModelHolder: public QObject, public IDataSourceHolder{ Q_OBJECT diff --git a/limereport/lrdatasourceintf.h b/limereport/lrdatasourceintf.h new file mode 100644 index 0000000..c2a6c90 --- /dev/null +++ b/limereport/lrdatasourceintf.h @@ -0,0 +1,47 @@ +#ifndef LRDATASOURCEINTF_H +#define LRDATASOURCEINTF_H +#include +#include +namespace LimeReport { + +class IDataSource { +public: + enum DatasourceMode{DESIGN_MODE,RENDER_MODE}; + typedef QSharedPointer Ptr; + virtual ~IDataSource() {} + virtual bool next() = 0; + virtual bool hasNext() = 0; + virtual bool prior() = 0; + virtual void first() = 0; + virtual void last() = 0; + virtual bool bof() = 0; + virtual bool eof() = 0; + virtual QVariant data(const QString& columnName) = 0; + virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0; + virtual int columnCount() = 0; + virtual QString columnNameByIndex(int columnIndex) = 0; + virtual int columnIndexByName(QString name) = 0; + virtual bool isInvalid() const = 0; + virtual QString lastError() = 0; + virtual QAbstractItemModel* model() = 0; +}; + +class IDataSourceHolder { +public: + virtual ~IDataSourceHolder(){} + virtual IDataSource* dataSource(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE) = 0; + virtual QString lastError() const = 0; + virtual bool isInvalid() const = 0; + virtual bool isOwned() const = 0; + virtual bool isEditable() const = 0; + virtual bool isRemovable() const = 0; + virtual void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false) = 0; + virtual void update() = 0; + virtual void clearErrors() = 0; +}; + +} // namespace LimeReport + +#endif // LRDATASOURCEINTF_H + + diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index 628a5f5..74dfe20 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -38,6 +38,7 @@ #include "lrvariablesholder.h" #include "lrgroupfunctions.h" #include "lrdatasourcemanagerintf.h" +#include "lrdatasourceintf.h" namespace LimeReport{ diff --git a/limereport/lrdatasourcemanagerintf.h b/limereport/lrdatasourcemanagerintf.h index f86e51e..a10cb05 100644 --- a/limereport/lrdatasourcemanagerintf.h +++ b/limereport/lrdatasourcemanagerintf.h @@ -32,6 +32,7 @@ #include "lrcallbackdatasourceintf.h" #include "lrglobal.h" +#include "lrdatasourceintf.h" class QVariant; class QString; @@ -40,12 +41,14 @@ namespace LimeReport{ class IDbCredentialsProvider{ public: + virtual ~IDbCredentialsProvider(){} virtual QString getUserName(const QString& connectionName) = 0; virtual QString getPassword(const QString& connectionName) = 0; }; class IDataSourceManager{ public: + virtual ~IDataSourceManager(){} virtual void setReportVariable(const QString& name, const QVariant& value) = 0; virtual void setDefaultDatabasePath(const QString &defaultDatabasePath) = 0; virtual void deleteVariable(const QString& name) = 0; @@ -57,12 +60,13 @@ public: virtual void clearUserVariables()=0; virtual ICallbackDatasource* createCallbackDatasource(const QString& name) = 0; virtual void registerDbCredentialsProvider(IDbCredentialsProvider* provider) = 0; - virtual QStringList variableNames() = 0; virtual bool variableIsMandatory(const QString& name) = 0; virtual VariableDataType variableDataType(const QString& name) = 0; virtual bool variableIsSystem(const QString& name) = 0; + virtual IDataSource* dataSource(const QString& name) = 0; }; } #endif // LRDATASOURCEMANAGERINTF_H + From eb9744932cde75d24d1cbf910a4e71c99ee956c6 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 24 Jan 2019 23:48:01 +0300 Subject: [PATCH 225/347] Data source holder from now is accessible via IDataSourceManager --- include/lrdatasourcemanagerintf.h | 1 + limereport/lrdatadesignintf.h | 36 ---------------------------- limereport/lrdatasourcemanagerintf.h | 1 + 3 files changed, 2 insertions(+), 36 deletions(-) diff --git a/include/lrdatasourcemanagerintf.h b/include/lrdatasourcemanagerintf.h index a10cb05..040dd1d 100644 --- a/include/lrdatasourcemanagerintf.h +++ b/include/lrdatasourcemanagerintf.h @@ -65,6 +65,7 @@ public: virtual VariableDataType variableDataType(const QString& name) = 0; virtual bool variableIsSystem(const QString& name) = 0; virtual IDataSource* dataSource(const QString& name) = 0; + virtual IDataSourceHolder* dataSourceHolder(const QString& name) = 0; }; } diff --git a/limereport/lrdatadesignintf.h b/limereport/lrdatadesignintf.h index 85d7957..06edc3d 100644 --- a/limereport/lrdatadesignintf.h +++ b/limereport/lrdatadesignintf.h @@ -46,42 +46,6 @@ namespace LimeReport{ class DataSourceManager; -//class IDataSource { -//public: -// enum DatasourceMode{DESIGN_MODE,RENDER_MODE}; -// typedef QSharedPointer Ptr; -// virtual ~IDataSource(){} -// virtual bool next() = 0; -// virtual bool hasNext() = 0; -// virtual bool prior() = 0; -// virtual void first() = 0; -// virtual void last() = 0; -// virtual bool bof() = 0; -// virtual bool eof() = 0; -// virtual QVariant data(const QString& columnName) = 0; -// virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0; -// virtual int columnCount() = 0; -// virtual QString columnNameByIndex(int columnIndex) = 0; -// virtual int columnIndexByName(QString name) = 0; -// virtual bool isInvalid() const = 0; -// virtual QString lastError() = 0; -// virtual QAbstractItemModel* model() = 0; -//}; - -//class IDataSourceHolder { -//public: -// virtual IDataSource* dataSource(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE) = 0; -// virtual QString lastError() const = 0; -// virtual bool isInvalid() const = 0; -// virtual bool isOwned() const = 0; -// virtual bool isEditable() const = 0; -// virtual bool isRemovable() const = 0; -// virtual void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false) = 0; -// virtual void update() = 0; -// virtual void clearErrors() = 0; -// virtual ~IDataSourceHolder(){} -//}; - class ModelHolder: public QObject, public IDataSourceHolder{ Q_OBJECT public: diff --git a/limereport/lrdatasourcemanagerintf.h b/limereport/lrdatasourcemanagerintf.h index a10cb05..040dd1d 100644 --- a/limereport/lrdatasourcemanagerintf.h +++ b/limereport/lrdatasourcemanagerintf.h @@ -65,6 +65,7 @@ public: virtual VariableDataType variableDataType(const QString& name) = 0; virtual bool variableIsSystem(const QString& name) = 0; virtual IDataSource* dataSource(const QString& name) = 0; + virtual IDataSourceHolder* dataSourceHolder(const QString& name) = 0; }; } From 8486d8dd941e56aaffeab179ef84c4a1b8992e6b Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 25 Jan 2019 01:47:34 +0300 Subject: [PATCH 226/347] Attempt to ignore printer rectangle if page size is equal to printer page size --- limereport/lrreportengine.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index ab09828..0cd8628 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -323,14 +323,14 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) renderPage.pageItem()->rightMargin(), renderPage.pageItem()->bottomMargin(), QPrinter::Millimeter); - printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); + printer.setOrientation(static_cast(renderPage.pageItem()->pageOrientation())); QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): renderPage.pageItem()->sizeMM(); printer.setPaperSize(pageSize,QPrinter::Millimeter); } else { printer.setFullPage(renderPage.pageItem()->fullPage()); - printer.setOrientation((QPrinter::Orientation)renderPage.pageItem()->pageOrientation()); + printer.setOrientation(static_cast(renderPage.pageItem()->pageOrientation())); if (renderPage.pageItem()->pageSize()==PageItemDesignIntf::Custom){ QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): @@ -339,7 +339,7 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) printer.setPaperSize(pageSize,QPrinter::Millimeter); } else { if (page->getSetPageSizeToPrinter() || printer.outputFormat() == QPrinter::PdfFormat) - printer.setPaperSize((QPrinter::PageSize)renderPage.pageItem()->pageSize()); + printer.setPaperSize(static_cast(renderPage.pageItem()->pageSize())); } } @@ -354,7 +354,9 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR, (printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR); - if (printerPageRect.width() < page->geometry().width()){ + if (printer.pageSize() != static_cast(page->pageSize()) && + printerPageRect.width() < page->geometry().width()) + { qreal pageWidth = page->geometry().width(); QRectF currentPrintingRect = printerPageRect; while (pageWidth>0){ From b3303a7ef6330fcf6be3a6f4d5872e05d7ff8380 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 26 Jan 2019 23:22:49 +0300 Subject: [PATCH 227/347] Unexpected object destruction by script engine has been fixed --- include/lrglobal.h | 2 +- limereport/lrglobal.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index d1cb8b9..80568c5 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -156,7 +156,7 @@ namespace Const{ template static inline QJSValue getJSValue(QJSEngine &e, T *p) { - QJSValue res = e.newQObject(p); + QJSValue res = e.toScriptValue(p); return res; } #else diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index d1cb8b9..80568c5 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -156,7 +156,7 @@ namespace Const{ template static inline QJSValue getJSValue(QJSEngine &e, T *p) { - QJSValue res = e.newQObject(p); + QJSValue res = e.toScriptValue(p); return res; } #else From 37b3ea9fa483a47c1c83a887f1195a01ceb17d06 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 26 Jan 2019 23:30:13 +0300 Subject: [PATCH 228/347] Qt 5 lower 5.3 building has been fixed --- limereport/lrpreviewreportwidget.cpp | 4 ++++ limereport/lrreportengine.cpp | 14 +++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index c8c2378..fb24404 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -203,7 +203,11 @@ void PreviewReportWidget::print() printer.setPrinterName(pi.defaultPrinter().printerName()); #endif #ifdef HAVE_QT5 +#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) printer.setPrinterName(pi.defaultPrinterName()); +#else + printer.setPrinterName(pi.defaultPrinter().printerName()); +#endif #endif QPrintDialog dialog(&printer,QApplication::activeWindow()); if (dialog.exec()==QDialog::Accepted){ diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index ab09828..5e43a60 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -404,7 +404,11 @@ bool ReportEnginePrivate::printReport(QPrinter* printer) m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); #endif #ifdef HAVE_QT5 +#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) m_printer.data()->setPrinterName(pi.defaultPrinterName()); +#else + m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); +#endif #endif QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); m_printerSelected = dialog.exec()!=QDialog::Rejected; @@ -437,7 +441,11 @@ bool ReportEnginePrivate::printPages(ReportPages pages, QPrinter *printer) m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); #endif #ifdef HAVE_QT5 +#if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) m_printer.data()->setPrinterName(pi.defaultPrinterName()); +#else + m_printer.data()->setPrinterName(pi.defaultPrinter().printerName()); +#endif #endif QPrintDialog dialog(m_printer.data(),QApplication::activeWindow()); m_printerSelected = dialog.exec()!=QDialog::Rejected; @@ -1210,9 +1218,9 @@ ReportPages ReportEnginePrivate::renderToPages() emit renderFinished(); m_reportRender.clear(); - foreach(PageItemDesignIntf* page, m_renderingPages){ - delete page; - } + //foreach(PageItemDesignIntf* page, m_renderingPages){ + // delete page; + //} m_renderingPages.clear(); } m_reportRendering = false; From 0d0ba64bac924db2fda337646d3070fb1eae9bf5 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 26 Jan 2019 23:45:20 +0300 Subject: [PATCH 229/347] Russian translation updated --- designer/main.cpp | 15 +++++++++++---- .../objectinspector/lrobjectitemmodel.cpp | 1 + translations/limereport_ru.qm | Bin 53777 -> 119638 bytes translations/limereport_ru.ts | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/designer/main.cpp b/designer/main.cpp index d36ee1d..413f33f 100644 --- a/designer/main.cpp +++ b/designer/main.cpp @@ -10,17 +10,24 @@ int main(int argc, char *argv[]) DesignerSettingManager manager; QTranslator limeReportTranslator; - QTranslator qtTranslator; + QTranslator qtBaseTranslator; + QTranslator qtDesignerTranslator; + QTranslator qtLinguistTranslator; + QString translationPath = QApplication::applicationDirPath(); - translationPath.append("/languages"); + translationPath.append("/translations"); Qt::LayoutDirection layoutDirection = QLocale::system().textDirection(); QString designerTranslation = QLocale(manager.getCurrentDefaultLanguage()).name(); if (limeReportTranslator.load("limereport_"+designerTranslation, translationPath)){ - qtTranslator.load("qt_" + designerTranslation, translationPath); - a.installTranslator(&qtTranslator); + qtBaseTranslator.load("qtbase_" + designerTranslation, translationPath); + qtDesignerTranslator.load("designer_"+designerTranslation,translationPath); + + a.installTranslator(&qtBaseTranslator); + a.installTranslator(&qtDesignerTranslator); a.installTranslator(&limeReportTranslator); + Qt::LayoutDirection layoutDirection = QLocale(manager.getCurrentDefaultLanguage()).textDirection(); a.setLayoutDirection(layoutDirection); } diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index b39c4d0..2addb1e 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -154,6 +154,7 @@ void QObjectPropertyModel::translatePropertyName() tr("replaceCRwithBR"); tr("hideIfEmpty"); tr("hideEmptyItems"); + tr("useExternalPainter"); } void QObjectPropertyModel::clearObjectsList() diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index 0b912bd5f6646bef0e8f9b119eba6832b305f7a2..aa82093da4e9e32b51a035b5c7afa1bfe12005ef 100644 GIT binary patch literal 119638 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 E2aOHO#Q*>R delta 6613 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 diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index cca8845..9d72224 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -384,6 +384,14 @@ p, li { white-space: pre-wrap; } Print if empty Печатать, если пустое + + Cut + Вырезать + + + Copy + Копировать + LimeReport::BaseDesignIntf @@ -1086,6 +1094,10 @@ p, li { white-space: pre-wrap; } LimeReport::ImageItem + + Ext. + Внешний + Image Изображение @@ -1864,6 +1876,10 @@ p, li { white-space: pre-wrap; } hideEmptyItems Скрывать пустые элементы + + useExternalPainter + Использовать внешний отрисовщик + LimeReport::RectMMPropItem From dd5c1f6ca05cb61d3c643888a21961d75951ab9b Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Sun, 27 Jan 2019 00:09:43 +0300 Subject: [PATCH 230/347] getJSValue() has been fixed --- include/lrglobal.h | 3 ++- limereport/lrglobal.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index 80568c5..103edfc 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -156,7 +156,8 @@ namespace Const{ template static inline QJSValue getJSValue(QJSEngine &e, T *p) { - QJSValue res = e.toScriptValue(p); + QJSValue res = e.newQObject(p); + QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); return res; } #else diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 80568c5..103edfc 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -156,7 +156,8 @@ namespace Const{ template static inline QJSValue getJSValue(QJSEngine &e, T *p) { - QJSValue res = e.toScriptValue(p); + QJSValue res = e.newQObject(p); + QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); return res; } #else From 91a1798bf0a90294edcb5e1b2f4786edd966c614 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 28 Jan 2019 21:48:58 +0300 Subject: [PATCH 231/347] Qt 5 lower 5.6 building has been fixed --- common.pri | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/common.pri b/common.pri index f0cd913..2cebc25 100644 --- a/common.pri +++ b/common.pri @@ -32,13 +32,12 @@ contains(CONFIG, easy_profiler){ !contains(CONFIG, qtscriptengine){ greaterThan(QT_MAJOR_VERSION, 4){ +greaterThan(QT_MINOR_VERSION, 5){ CONFIG *= qjsengine -#greaterThan(QT_MINOR_VERSION, 5){ -# CONFIG *= qjsengine -#} -#lessThan(QT_MINOR_VERSION, 6){ -# CONFIG *= qtscriptengine -#} +} +lessThan(QT_MINOR_VERSION, 6){ + CONFIG *= qtscriptengine +} } lessThan(QT_MAJOR_VERSION, 5){ CONFIG *= qtscriptengine From b81de4680c1cd64b5dd72cd81fc7c5c4c9aa03ef Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 29 Jan 2019 23:18:24 +0300 Subject: [PATCH 232/347] All settings are merged in one place --- include/lrglobal.h | 1 + limereport/items/lrtextitemeditor.cpp | 45 +-- limereport/items/lrtextitemeditor.h | 5 +- limereport/items/lrtextitemeditor.ui | 67 +-- limereport/lrglobal.h | 1 + limereport/lrreportdesignwidget.cpp | 38 +- limereport/lrreportdesignwidget.h | 6 +- limereport/lrreportdesignwindow.cpp | 4 +- limereport/lrreportengine.cpp | 1 - limereport/lrsettingdialog.cpp | 60 ++- limereport/lrsettingdialog.h | 10 + limereport/lrsettingdialog.ui | 380 +++++++++++------- .../propertyItems/lrcontentpropitem.cpp | 1 - limereport/scripteditor/lrscripteditor.cpp | 101 ++--- limereport/scripteditor/lrscripteditor.h | 6 +- 15 files changed, 393 insertions(+), 333 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index 103edfc..bf23065 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -95,6 +95,7 @@ namespace Const{ const int SCENE_MARGIN = 50; const QString FUNCTION_MANAGER_NAME = "LimeReport"; const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); + const int DEFAULT_TAB_INDENTION = 4; } QString extractClassName(QString className); diff --git a/limereport/items/lrtextitemeditor.cpp b/limereport/items/lrtextitemeditor.cpp index 8b2e28b..8299fbc 100644 --- a/limereport/items/lrtextitemeditor.cpp +++ b/limereport/items/lrtextitemeditor.cpp @@ -118,8 +118,6 @@ void TextItemEditor::initUI() { QStringList dataWords; - ui->toolButton->setChecked(false); - ui->gbSettings->setVisible(false); LimeReport::DataSourceManager* dm = m_page->datasourceManager(); LimeReport::ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); se.setDataManager(dm); @@ -152,13 +150,19 @@ void TextItemEditor::readSetting() if (v.isValid()){ ui->codeEditor->restoreState(v.toByteArray()); } - - QVariant fontName = settings()->value("FontName"); + settings()->endGroup(); + settings()->beginGroup("ScriptEditor"); + QVariant fontName = settings()->value("DefaultFontName"); if (fontName.isValid()){ - QVariant fontSize = settings()->value("FontSize"); + QVariant fontSize = settings()->value("DefaultFontSize"); ui->codeEditor->setEditorFont(QFont(fontName.toString(),fontSize.toInt())); - ui->editorFont->setCurrentFont(ui->codeEditor->editorFont()); - ui->editorFontSize->setValue(fontSize.toInt()); + } + + QVariant tabIndention = settings()->value("TabIndention"); + if (tabIndention.isValid()){ + ui->codeEditor->setTabIndention(tabIndention.toInt()); + } else { + ui->codeEditor->setTabIndention(LimeReport::Const::DEFAULT_TAB_INDENTION); } settings()->endGroup(); @@ -175,33 +179,6 @@ void TextItemEditor::writeSetting() } } -void TextItemEditor::on_editorFont_currentFontChanged(const QFont &f) -{ - if (m_isReadingSetting) return; - QFont tmp = f; - tmp.setPointSize(ui->editorFontSize->value()); - ui->codeEditor->setEditorFont(tmp); - settings()->beginGroup("TextItemEditor"); - settings()->setValue("FontName",ui->codeEditor->editorFont().family()); - settings()->setValue("FontSize",ui->editorFontSize->value()); - settings()->endGroup(); -} - -void TextItemEditor::on_editorFontSize_valueChanged(int arg1) -{ - if (m_isReadingSetting) return; - ui->codeEditor->setEditorFont(QFont(ui->codeEditor->editorFont().family(),arg1)); - settings()->beginGroup("TextItemEditor"); - settings()->setValue("FontName",ui->codeEditor->editorFont().family()); - settings()->setValue("FontSize",ui->editorFontSize->value()); - settings()->endGroup(); -} - -void TextItemEditor::on_toolButton_clicked(bool checked) -{ - ui->gbSettings->setVisible(checked); -} - void TextItemEditor::slotSplitterMoved(int, int) { writeSetting(); diff --git a/limereport/items/lrtextitemeditor.h b/limereport/items/lrtextitemeditor.h index 43b41ad..b9e2750 100644 --- a/limereport/items/lrtextitemeditor.h +++ b/limereport/items/lrtextitemeditor.h @@ -69,7 +69,7 @@ public: QSettings* settings=0, QWidget *parent = 0); ~TextItemEditor(); void setSettings(QSettings* value); - QSettings* settings(); + QSettings* settings(); protected: void resizeEvent(QResizeEvent *); void moveEvent(QMoveEvent *); @@ -78,9 +78,6 @@ protected: private slots: void on_pbOk_clicked(); void on_pbCancel_clicked(); - void on_editorFont_currentFontChanged(const QFont &f); - void on_editorFontSize_valueChanged(int arg1); - void on_toolButton_clicked(bool checked); void slotSplitterMoved(int, int); private: void initUI(); diff --git a/limereport/items/lrtextitemeditor.ui b/limereport/items/lrtextitemeditor.ui index f9d74e4..403ea63 100644 --- a/limereport/items/lrtextitemeditor.ui +++ b/limereport/items/lrtextitemeditor.ui @@ -17,7 +17,7 @@ Text Item Editor - + :/items/images/insert-text_3.png:/items/images/insert-text_3.png @@ -58,68 +58,8 @@ - - - - Editor settings - - - - - - - - Editor font - - - - - - - - - - 11 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - - - - ... - - - - :/items/images/settings.png:/items/images/settings.png - - - true - - - true - - - @@ -169,6 +109,9 @@ pbOk pbCancel - + + + + diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 103edfc..bf23065 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -95,6 +95,7 @@ namespace Const{ const int SCENE_MARGIN = 50; const QString FUNCTION_MANAGER_NAME = "LimeReport"; const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); + const int DEFAULT_TAB_INDENTION = 4; } QString extractClassName(QString className); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 64e04f6..750ae0a 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -51,12 +51,13 @@ namespace LimeReport { // ReportDesignIntf -ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QMainWindow *mainWindow, QWidget *parent) : +ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QSettings* settings, QMainWindow *mainWindow, QWidget *parent) : QWidget(parent), #ifdef HAVE_QTDESIGNER_INTEGRATION m_dialogDesignerManager(new DialogDesignerManager(this)), #endif - m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), m_dialogChanged(false), m_useDarkTheme(false) + m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), + m_dialogChanged(false), m_useDarkTheme(false), m_settings(settings) { #ifdef HAVE_QT4 m_tabWidget = new LimeReportTabWidget(this); @@ -205,41 +206,55 @@ void ReportDesignWidget::applySettings() parentWidget()->setStyleSheet(""); m_report->setStyleSheet(""); } + + if (m_settings){ + m_settings->beginGroup("ScriptEditor"); + QVariant v = m_settings->value("DefaultFontName"); + if (v.isValid()){ + QVariant fontSize = m_settings->value("DefaultFontSize"); + m_scriptEditor->setEditorFont(QFont(v.toString(),fontSize.toInt())); + } + v = m_settings->value("TabIndention"); + if (v.isValid()){ + m_scriptEditor->setTabIndention(v.toInt()); + } + m_settings->endGroup(); + } } -void ReportDesignWidget::loadState(QSettings* settings) +void ReportDesignWidget::loadState() { - settings->beginGroup("DesignerWidget"); - QVariant v = settings->value("hGridStep"); + m_settings->beginGroup("DesignerWidget"); + QVariant v = m_settings->value("hGridStep"); if (v.isValid()){ m_horizontalGridStep = v.toInt(); } - v = settings->value("vGridStep"); + v = m_settings->value("vGridStep"); if (v.isValid()){ m_verticalGridStep = v.toInt(); } - v = settings->value("defaultFont"); + v = m_settings->value("defaultFont"); if (v.isValid()){ m_defaultFont = v.value(); } - v = settings->value("useGrid"); + v = m_settings->value("useGrid"); if (v.isValid()){ m_useGrid = v.toBool(); } - v = settings->value("useDarkTheme"); + v = m_settings->value("useDarkTheme"); if (v.isValid()){ m_useDarkTheme = v.toBool(); } - v = settings->value("ScriptEditorState"); + v = m_settings->value("ScriptEditorState"); if (v.isValid()){ m_scriptEditor->restoreState(v.toByteArray()); } - settings->endGroup(); + m_settings->endGroup(); applySettings(); } @@ -720,6 +735,7 @@ void ReportDesignWidget::deleteCurrentPage() void ReportDesignWidget::editSetting() { SettingDialog setting(this); + setting.setSettings(m_settings); setting.setVerticalGridStep(m_verticalGridStep); setting.setHorizontalGridStep(m_horizontalGridStep); setting.setDefaultFont(m_defaultFont); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index da9719f..0352158 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -84,7 +84,8 @@ public: Translations, TabTypeCount }; - ReportDesignWidget(ReportEnginePrivateInterface* report, QMainWindow *mainWindow, QWidget *parent = 0); + ReportDesignWidget(ReportEnginePrivateInterface* report, QSettings* settings, + QMainWindow *mainWindow, QWidget *parent = 0); ~ReportDesignWidget(); void createStartPage(); void clear(); @@ -112,7 +113,7 @@ public: bool emitSaveReportAs(); bool emitLoadReport(); void saveState(QSettings *settings); - void loadState(QSettings *settings); + void loadState(); void applySettings(); void applyUseGrid(); bool useGrid(){ return m_useGrid;} @@ -227,6 +228,7 @@ private: bool m_useMagnet; bool m_dialogChanged; bool m_useDarkTheme; + QSettings* m_settings; }; } // namespace LimeReport diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 86f5863..416c6c8 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -472,7 +472,7 @@ void ReportDesignWindow::createMainMenu() void ReportDesignWindow::initReportEditor(ReportEnginePrivateInterface* report) { - m_reportDesignWidget=new ReportDesignWidget(report,this,this); + m_reportDesignWidget=new ReportDesignWidget(report, m_settings, this,this); setCentralWidget(m_reportDesignWidget); connect(m_reportDesignWidget,SIGNAL(itemSelected(LimeReport::BaseDesignIntf*)), this,SLOT(slotItemSelected(LimeReport::BaseDesignIntf*))); @@ -822,7 +822,7 @@ void ReportDesignWindow::restoreSetting() } settings()->endGroup(); - m_reportDesignWidget->loadState(settings()); + m_reportDesignWidget->loadState(); m_useGridAction->setChecked(m_reportDesignWidget->useGrid()); createRecentFilesMenu(); } diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 5e43a60..b3c5d39 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -252,7 +252,6 @@ void ReportEnginePrivate::clearReport() m_fileName=""; m_scriptEngineContext->clear(); m_reportSettings.setDefaultValues(); - emit cleared(); } diff --git a/limereport/lrsettingdialog.cpp b/limereport/lrsettingdialog.cpp index 9040fb0..b7ad816 100644 --- a/limereport/lrsettingdialog.cpp +++ b/limereport/lrsettingdialog.cpp @@ -1,11 +1,12 @@ #include "lrsettingdialog.h" #include "ui_lrsettingdialog.h" +#include "lrglobal.h" #include namespace LimeReport{ SettingDialog::SettingDialog(QWidget *parent) : - QDialog(parent), + QDialog(parent), m_settings(0), ui(new Ui::SettingDialog) { ui->setupUi(this); @@ -13,6 +14,7 @@ SettingDialog::SettingDialog(QWidget *parent) : if (!theme.exists()){ ui->cbbUseDarkTheme->setVisible(false); } + ui->indentSize->setRange(0,10); } SettingDialog::~SettingDialog() @@ -37,6 +39,18 @@ QFont SettingDialog::defaultFont() return result; } +QFont SettingDialog::scriptFont() +{ + QFont result = ui->scriptFont->currentFont(); + result.setPointSize(ui->scriptFontSize->value()); + return result; +} + +int SettingDialog::tabIndention() +{ + return ui->indentSize->value(); +} + bool SettingDialog::userDarkTheme() { return ui->cbbUseDarkTheme->isChecked(); @@ -76,6 +90,17 @@ void SettingDialog::setDefaultFont(const QFont &value) ui->defaultFontSize->setValue(value.pointSize()); } +void SettingDialog::setScriptFont(const QFont& value) +{ + ui->scriptFont->setCurrentFont(value); + ui->scriptFontSize->setValue(value.pointSize()); +} + +void SettingDialog::setScritpTabIndention(int size) +{ + ui->indentSize->setValue(size); +} + void SettingDialog::setUseDarkTheme(bool value) { ui->cbbUseDarkTheme->setChecked(value); @@ -103,4 +128,37 @@ void SettingDialog::setDesignerLanguages(QList languages, QLo #endif } +void SettingDialog::setSettings(QSettings* settings){ + m_settings = settings; + if (m_settings){ + m_settings->beginGroup("ScriptEditor"); + QVariant fontName = m_settings->value("DefaultFontName"); + if (fontName.isValid()){ + QVariant fontSize = m_settings->value("DefaultFontSize"); + ui->scriptFont->setCurrentFont(QFont(fontName.toString(),fontSize.toInt())); + ui->scriptFontSize->setValue(fontSize.toInt()); + } + QVariant indentSize = m_settings->value("TabIndention"); + if (indentSize.isValid()){ + ui->indentSize->setValue(indentSize.toInt()); + } else { + ui->indentSize->setValue(LimeReport::Const::DEFAULT_TAB_INDENTION); + } + m_settings->endGroup(); + } +} + +void SettingDialog::on_bbOkCancel_accepted() +{ + if (m_settings){ + m_settings->beginGroup("ScriptEditor"); + m_settings->setValue("DefaultFontName", ui->scriptFont->currentFont().family()); + m_settings->setValue("DefaultFontSize", ui->scriptFontSize->value()); + m_settings->setValue("TabIndention", ui->indentSize->value()); + m_settings->endGroup(); + } +} + } // namespace LimeReport + + diff --git a/limereport/lrsettingdialog.h b/limereport/lrsettingdialog.h index d4c89e3..bc4e862 100644 --- a/limereport/lrsettingdialog.h +++ b/limereport/lrsettingdialog.h @@ -3,6 +3,7 @@ #include #include +#include namespace LimeReport{ @@ -20,6 +21,8 @@ public: int verticalGridStep(); int horizontalGridStep(); QFont defaultFont(); + QFont scriptFont(); + int tabIndention(); bool userDarkTheme(); bool suppressAbsentFieldsAndVarsWarnings(); QLocale::Language designerLanguage(); @@ -27,12 +30,19 @@ public: void setHorizontalGridStep(int value); void setVerticalGridStep(int value); void setDefaultFont(const QFont& value); + void setScriptFont(const QFont& value); + void setScritpTabIndention(int size); void setUseDarkTheme(bool value); void setDesignerLanguages(QList languages, QLocale::Language currentLanguage); + void setSettings(QSettings* settings); +private slots: + void on_bbOkCancel_accepted(); + private: Ui::SettingDialog *ui; QList m_aviableLanguages; QLocale::Language m_currentLanguage; + QSettings* m_settings; }; } // namespace LimeReport diff --git a/limereport/lrsettingdialog.ui b/limereport/lrsettingdialog.ui index 19d27fe..12af083 100644 --- a/limereport/lrsettingdialog.ui +++ b/limereport/lrsettingdialog.ui @@ -6,8 +6,8 @@ 0 0 - 397 - 345 + 419 + 362 @@ -19,164 +19,260 @@ Designer setting - - - QLayout::SetDefaultConstraint - + - - - Designer Setting + + + 0 - - - - - - - Default font - - - - - - - - - - 10 - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - - - Grid - - + + + + 0 + 0 + 401 + 218 + + + + Designer settings + + + + - - - - - Vertical grid step - - - - - - - 10 - - - - - - - Horizontal grid step - - - - - - - 10 - - - - + + + Default font + + - + + + + + + 10 + + + + + Qt::Horizontal - 73 + 40 20 - - - - - - - - Language - - - - - - - - 0 - 0 - - - - - - - - - - Use dark theme - - - - + + + + + Grid + + + + + + + + Vertical grid step + + + + + + + 10 + + + + + + + Horizontal grid step + + + + + + + 10 + + + + + + + + + Qt::Horizontal + + + + 73 + 20 + + + + + + + + + + + + + Language + + + + + + + + 0 + 0 + + + + + + + + + + Use dark theme + + + + + + + + + 0 + 0 + 401 + 218 + + + + Script editor settings + + + + + + + + Font + + + + + + + + + + 10 + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + Indent size + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Vertical + + + + 20 + 123 + + + + + + + + + + 0 + 0 + 401 + 218 + + + + Report settings + + + + + 10 + 10 + 280 + 23 + + + + Suppress absent fields and variables warning + + + - - - - Report Setting - - - - - - Suppress absent fields and variables warning - - - - - - - - - - Qt::Vertical - - - - 20 - 4 - - - - diff --git a/limereport/objectinspector/propertyItems/lrcontentpropitem.cpp b/limereport/objectinspector/propertyItems/lrcontentpropitem.cpp index 53c9806..cc50ced 100644 --- a/limereport/objectinspector/propertyItems/lrcontentpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrcontentpropitem.cpp @@ -26,7 +26,6 @@ void ContentEditor::editButtonClicked() dialog->setLayout(new QVBoxLayout()); dialog->layout()->setContentsMargins(1,1,1,1); dialog->setAttribute(Qt::WA_DeleteOnClose); - //dialog->setGeometry(QStyle::alignedRect(Qt::LeftToRight, Qt::AlignCenter, dialog->size(), QApplication::desktop()->availableGeometry())); dialog->setWindowTitle(propertyName()); QWidget* editor = dynamic_cast(m_object)->defaultEditor(); dialog->layout()->addWidget(editor); diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index f40068a..c73a225 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -14,12 +14,13 @@ namespace LimeReport{ ScriptEditor::ScriptEditor(QWidget *parent) : QWidget(parent), - ui(new Ui::ScriptEditor), m_reportEngine(0), m_page(0) + ui(new Ui::ScriptEditor), m_reportEngine(0), m_page(0), m_tabIndention(4) { ui->setupUi(this); setFocusProxy(ui->textEdit); m_completer = new ReportStructureCompleater(this); ui->textEdit->setCompleter(m_completer); + ui->textEdit->setTabStopWidth(ui->textEdit->fontMetrics().width("0")*m_tabIndention); connect(ui->splitter, SIGNAL(splitterMoved(int,int)), this, SIGNAL(splitterMoved(int,int))); } @@ -79,58 +80,16 @@ void ScriptEditor::setPageBand(BandDesignIntf* band) } } +void ScriptEditor::setTabIndention(int charCount) +{ + if (m_tabIndention != charCount){ + ui->textEdit->setTabStopWidth(ui->textEdit->fontMetrics().width("W")*charCount); + m_tabIndention = charCount; + } +} + void ScriptEditor::initCompleter() { -// QStringList dataWords; - -// DataSourceManager* dm = 0; -// if (m_reportEngine) -// dm = m_reportEngine->dataManager(); -// if (m_page) -// dm = m_page->datasourceManager(); - -//#ifdef USE_QJSENGINE -// ScriptEngineManager& se = LimeReport::ScriptEngineManager::instance(); -// QJSValue globalObject = se.scriptEngine()->globalObject(); -// QJSValueIterator it(globalObject); -// while (it.hasNext()){ -// it.next(); -// if (it.value().isCallable() ){ -// dataWords << it.name(); -// } -// } -//#endif -// foreach(const QString &dsName,dm->dataSourceNames()){ -// dataWords << dsName; -// foreach(const QString &field, dm->fieldNames(dsName)){ -// dataWords<variableNames()) { -// dataWords << varName.remove("#"); -// } - -// if (m_reportEngine){ -// for ( int i = 0; i < m_reportEngine->pageCount(); ++i){ -// PageDesignIntf* page = m_reportEngine->pageAt(i); -// dataWords << page->pageItem()->objectName(); -// QMetaObject const * mo = page->pageItem()->metaObject(); -// for(int i = mo->methodOffset(); i < mo->methodCount(); ++i) -// { -// if (mo->method(i).methodType() == QMetaMethod::Signal) { -// dataWords << page->pageItem()->objectName() +"."+QString::fromLatin1(mo->method(i).name()); -// } -// } -// dataWords << page->pageItem()->objectName()+".beforeRender"; -// dataWords << page->pageItem()->objectName()+".afterRender"; -// foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ -// addItemToCompleater(page->pageItem()->objectName(), item, dataWords); -// } -// } -// } - -// dataWords.sort(); if (m_reportEngine) m_completer->updateCompleaterModel(m_reportEngine); else @@ -167,26 +126,26 @@ QString ScriptEditor::toPlainText() return ui->textEdit->toPlainText(); } -void ScriptEditor::addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords) -{ - BandDesignIntf* band = dynamic_cast(item); - if (band){ - dataWords << band->objectName(); - dataWords << pageName+"_"+band->objectName(); - dataWords << pageName+"_"+band->objectName()+".beforeRender"; - dataWords << pageName+"_"+item->objectName()+".afterData"; - dataWords << pageName+"_"+band->objectName()+".afterRender"; - foreach (BaseDesignIntf* child, band->childBaseItems()){ - addItemToCompleater(pageName, child, dataWords); - } - } else { - dataWords << item->objectName(); - dataWords << pageName+"_"+item->objectName(); - dataWords << pageName+"_"+item->objectName()+".beforeRender"; - dataWords << pageName+"_"+item->objectName()+".afterData"; - dataWords << pageName+"_"+item->objectName()+".afterRender"; - } -} +//void ScriptEditor::addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords) +//{ +// BandDesignIntf* band = dynamic_cast(item); +// if (band){ +// dataWords << band->objectName(); +// dataWords << pageName+"_"+band->objectName(); +// dataWords << pageName+"_"+band->objectName()+".beforeRender"; +// dataWords << pageName+"_"+item->objectName()+".afterData"; +// dataWords << pageName+"_"+band->objectName()+".afterRender"; +// foreach (BaseDesignIntf* child, band->childBaseItems()){ +// addItemToCompleater(pageName, child, dataWords); +// } +// } else { +// dataWords << item->objectName(); +// dataWords << pageName+"_"+item->objectName(); +// dataWords << pageName+"_"+item->objectName()+".beforeRender"; +// dataWords << pageName+"_"+item->objectName()+".afterData"; +// dataWords << pageName+"_"+item->objectName()+".afterRender"; +// } +//} void ScriptEditor::on_twData_doubleClicked(const QModelIndex &index) { diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index e9e0aa6..8233d8e 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -52,6 +52,7 @@ public: void setReportEngine(LimeReport::ReportEnginePrivateInterface* reportEngine); void setReportPage(PageDesignIntf* page); void setPageBand(BandDesignIntf* band); + void setTabIndention(int charCount); void initCompleter(); QByteArray saveState(); void restoreState(QByteArray state); @@ -68,13 +69,14 @@ private slots: void on_twData_doubleClicked(const QModelIndex &index); void on_twScriptEngine_doubleClicked(const QModelIndex &index); void slotOnCurrentChanged(const QModelIndex& to, const QModelIndex&); -private: - void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); +//private: +// void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); private: Ui::ScriptEditor *ui; ReportEnginePrivateInterface* m_reportEngine; PageDesignIntf* m_page; ReportStructureCompleater* m_completer; + int m_tabIndention; }; } // namespace LimeReport From b6787a191919975e2b76b785e61072504588dea3 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 30 Jan 2019 01:10:52 +0300 Subject: [PATCH 233/347] Q_INVOKABLE functions have been added to code completer --- limereport/scripteditor/lrscripteditor.cpp | 57 +++++++++++----------- limereport/scripteditor/lrscripteditor.h | 4 +- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index c73a225..c5f8273 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -126,27 +126,6 @@ QString ScriptEditor::toPlainText() return ui->textEdit->toPlainText(); } -//void ScriptEditor::addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords) -//{ -// BandDesignIntf* band = dynamic_cast(item); -// if (band){ -// dataWords << band->objectName(); -// dataWords << pageName+"_"+band->objectName(); -// dataWords << pageName+"_"+band->objectName()+".beforeRender"; -// dataWords << pageName+"_"+item->objectName()+".afterData"; -// dataWords << pageName+"_"+band->objectName()+".afterRender"; -// foreach (BaseDesignIntf* child, band->childBaseItems()){ -// addItemToCompleater(pageName, child, dataWords); -// } -// } else { -// dataWords << item->objectName(); -// dataWords << pageName+"_"+item->objectName(); -// dataWords << pageName+"_"+item->objectName()+".beforeRender"; -// dataWords << pageName+"_"+item->objectName()+".afterData"; -// dataWords << pageName+"_"+item->objectName()+".afterRender"; -// } -//} - void ScriptEditor::on_twData_doubleClicked(const QModelIndex &index) { if (!index.isValid()) return; @@ -192,7 +171,7 @@ QStringList ReportStructureCompleater::splitPath(const QString &path) const return path.split("."); } -void ReportStructureCompleater::addAdditionalDatawords(DataSourceManager* dataManager){ +void ReportStructureCompleater::addAdditionalDatawords(QStandardItemModel* model, DataSourceManager* dataManager){ foreach(const QString &dsName,dataManager->dataSourceNames()){ QStandardItem* dsNode = new QStandardItem; @@ -202,13 +181,13 @@ void ReportStructureCompleater::addAdditionalDatawords(DataSourceManager* dataMa fieldNode->setText(field); dsNode->appendRow(fieldNode); } - m_model.invisibleRootItem()->appendRow(dsNode); + model->invisibleRootItem()->appendRow(dsNode); } foreach (QString varName, dataManager->variableNames()) { QStandardItem* varNode = new QStandardItem; varNode->setText(varName.remove("#")); - m_model.invisibleRootItem()->appendRow(varNode); + model->invisibleRootItem()->appendRow(varNode); } #ifdef USE_QJSENGINE @@ -219,8 +198,30 @@ void ReportStructureCompleater::addAdditionalDatawords(DataSourceManager* dataMa it.next(); if (it.value().isCallable() ){ QStandardItem* itemNode = new QStandardItem; - itemNode->setText(it.name()); - m_model.invisibleRootItem()->appendRow(itemNode); + itemNode->setText(it.name()+"()"); + model->invisibleRootItem()->appendRow(itemNode); + } + if (it.value().isQObject()){ + if (it.value().toQObject()){ + QStandardItem* objectNode = new QStandardItem; + objectNode->setText(it.name()); + for (int i = 0; i< it.value().toQObject()->metaObject()->methodCount();++i){ + if (it.value().toQObject()->metaObject()->method(i).methodType() == QMetaMethod::Method){ + QStandardItem* methodNode = new QStandardItem; + QMetaMethod m = it.value().toQObject()->metaObject()->method(i); + QString methodSignature = m.name() + "("; + bool isFirst = true; + for (int j = 0; j < m.parameterCount(); ++j){ + methodSignature += (isFirst ? "" : ",") + m.parameterTypes()[j]+" "+m.parameterNames()[j]; + if (isFirst) isFirst = false; + } + methodSignature += ")"; + methodNode->setText(methodSignature); + objectNode->appendRow(methodNode); + } + } + model->invisibleRootItem()->appendRow(objectNode); + } } } #endif @@ -233,7 +234,7 @@ void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterfa m_model.clear(); QIcon signalIcon(":/report/images/signal"); QIcon propertyIcon(":/report/images/property"); - addAdditionalDatawords(report->dataManager()); + addAdditionalDatawords(&m_model, report->dataManager()); for ( int i = 0; i < report->pageCount(); ++i){ PageDesignIntf* page = report->pageAt(i); @@ -268,7 +269,7 @@ void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterfa void ReportStructureCompleater::updateCompleaterModel(DataSourceManager *dataManager) { m_model.clear(); - addAdditionalDatawords(dataManager); + addAdditionalDatawords(&m_model, dataManager); } QStringList ReportStructureCompleater::extractSignalNames(BaseDesignIntf *item) diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index 8233d8e..10a7ad1 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -36,7 +36,7 @@ protected: QStringList extractSignalNames(BaseDesignIntf* item); QStringList extractProperties(BaseDesignIntf* item); void addChildItem(BaseDesignIntf *item, const QString &pageName, QStandardItem *parent); - void addAdditionalDatawords(DataSourceManager *dataManager); + void addAdditionalDatawords(QStandardItemModel* model, DataSourceManager *dataManager); private: QStandardItemModel m_model; QMap m_properties; @@ -69,8 +69,6 @@ private slots: void on_twData_doubleClicked(const QModelIndex &index); void on_twScriptEngine_doubleClicked(const QModelIndex &index); void slotOnCurrentChanged(const QModelIndex& to, const QModelIndex&); -//private: -// void addItemToCompleater(const QString& pageName, BaseDesignIntf* item, QStringList& dataWords); private: Ui::ScriptEditor *ui; ReportEnginePrivateInterface* m_reportEngine; From f48e414114a9d49c4266b6243b96cf2893052de8 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 30 Jan 2019 01:53:21 +0300 Subject: [PATCH 234/347] moveQObjectToScript() has been added to ScriptManager --- include/lrscriptenginemanagerintf.h | 2 ++ limereport/lrscriptenginemanager.cpp | 7 +++++++ limereport/lrscriptenginemanager.h | 2 +- limereport/lrscriptenginemanagerintf.h | 2 ++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/lrscriptenginemanagerintf.h b/include/lrscriptenginemanagerintf.h index 4c2767a..1d306bd 100644 --- a/include/lrscriptenginemanagerintf.h +++ b/include/lrscriptenginemanagerintf.h @@ -46,7 +46,9 @@ public: virtual bool addFunction(const QString &name, const QString& script, const QString &category="", const QString &description="") = 0; virtual const QString& lastError() const = 0; + virtual ScriptValueType moveQObjectToScript(QObject* object, const QString objectName) = 0; virtual ~IScriptEngineManager(){} + }; } //namespace LimeReport diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index ae3abad..30cd800 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -562,6 +562,13 @@ void ScriptEngineManager::clearTableOfContents(){ } } +ScriptValueType ScriptEngineManager::moveQObjectToScript(QObject* object, const QString objectName) +{ + ScriptValueType result = scriptEngine()->newQObject(object); + scriptEngine()->globalObject().setProperty(objectName, result); + return result; +} + void ScriptEngineManager::updateModel() { diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 2241c85..076ee21 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -377,7 +377,7 @@ public: QVariant evaluateScript(const QString &script); void addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent); void clearTableOfContents(); - + ScriptValueType moveQObjectToScript(QObject* object, const QString objectName); protected: void updateModel(); bool containsFunction(const QString &functionName); diff --git a/limereport/lrscriptenginemanagerintf.h b/limereport/lrscriptenginemanagerintf.h index 4c2767a..1d306bd 100644 --- a/limereport/lrscriptenginemanagerintf.h +++ b/limereport/lrscriptenginemanagerintf.h @@ -46,7 +46,9 @@ public: virtual bool addFunction(const QString &name, const QString& script, const QString &category="", const QString &description="") = 0; virtual const QString& lastError() const = 0; + virtual ScriptValueType moveQObjectToScript(QObject* object, const QString objectName) = 0; virtual ~IScriptEngineManager(){} + }; } //namespace LimeReport From 22eb936d1ca3ccff8575bb1f7dd8f790a5c8953f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 30 Jan 2019 22:49:20 +0300 Subject: [PATCH 235/347] Parameter "nobind" has been added to variable --- include/lrdatasourceintf.h | 47 ++++++++++++++++++++++++ include/lrglobal.h | 5 ++- limereport/designer.pri | 1 + limereport/lrdatadesignintf.cpp | 59 +++--------------------------- limereport/lrdatasourcemanager.cpp | 35 ++++++++++++------ limereport/lrglobal.h | 5 ++- 6 files changed, 83 insertions(+), 69 deletions(-) create mode 100644 include/lrdatasourceintf.h diff --git a/include/lrdatasourceintf.h b/include/lrdatasourceintf.h new file mode 100644 index 0000000..c2a6c90 --- /dev/null +++ b/include/lrdatasourceintf.h @@ -0,0 +1,47 @@ +#ifndef LRDATASOURCEINTF_H +#define LRDATASOURCEINTF_H +#include +#include +namespace LimeReport { + +class IDataSource { +public: + enum DatasourceMode{DESIGN_MODE,RENDER_MODE}; + typedef QSharedPointer Ptr; + virtual ~IDataSource() {} + virtual bool next() = 0; + virtual bool hasNext() = 0; + virtual bool prior() = 0; + virtual void first() = 0; + virtual void last() = 0; + virtual bool bof() = 0; + virtual bool eof() = 0; + virtual QVariant data(const QString& columnName) = 0; + virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0; + virtual int columnCount() = 0; + virtual QString columnNameByIndex(int columnIndex) = 0; + virtual int columnIndexByName(QString name) = 0; + virtual bool isInvalid() const = 0; + virtual QString lastError() = 0; + virtual QAbstractItemModel* model() = 0; +}; + +class IDataSourceHolder { +public: + virtual ~IDataSourceHolder(){} + virtual IDataSource* dataSource(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE) = 0; + virtual QString lastError() const = 0; + virtual bool isInvalid() const = 0; + virtual bool isOwned() const = 0; + virtual bool isEditable() const = 0; + virtual bool isRemovable() const = 0; + virtual void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed = false) = 0; + virtual void update() = 0; + virtual void clearErrors() = 0; +}; + +} // namespace LimeReport + +#endif // LRDATASOURCEINTF_H + + diff --git a/include/lrglobal.h b/include/lrglobal.h index bf23065..a82998f 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -82,8 +82,8 @@ namespace Const{ const qreal BAND_NAME_TEXT_OPACITY = 0.6; const qreal SELECTION_OPACITY = 0.3; const QString FIELD_RX = "\\$D\\s*\\{\\s*([^{}]*)\\s*\\}"; - const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}"; - const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; + const QString VARIABLE_RX = "\\$V\\s*\\{\\s*(?:([^\\{\\},]*)|(?:([^\\{\\}]*)\\s*,\\s*([^\\{\\}]*)))\\s*\\}"; + const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(?:(%1)|(?:(%1)\\s*,\\s*([^\\{\\}]*)))\\s*\\}"; const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*..*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))(?:(?:\\s*,\\s*(?:(\\w*)))|(?:))\\)"; const int DATASOURCE_INDEX = 3; @@ -94,6 +94,7 @@ namespace Const{ const QString GROUP_FUNCTION_NAME_RX = "%1\\s*\\((.*[^\\)])\\)"; const int SCENE_MARGIN = 50; const QString FUNCTION_MANAGER_NAME = "LimeReport"; + const QString DATAFUNCTIONS_MANAGER_NAME = "DatasourceFunctions"; const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); const int DEFAULT_TAB_INDENTION = 4; diff --git a/limereport/designer.pri b/limereport/designer.pri index 5fb31ad..f377546 100644 --- a/limereport/designer.pri +++ b/limereport/designer.pri @@ -1,3 +1,4 @@ +include(../common.pri) DEFINES+=HAVE_REPORT_DESIGNER contains(CONFIG,dialogdesigner){ diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index 5f695e8..23b1e76 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -77,10 +77,8 @@ bool QueryHolder::runQuery(IDataSource::DatasourceMode mode) return false; } - if (!m_prepared){ - extractParams(); - if (!m_prepared) return false; - } + extractParams(); + if (!m_prepared) return false; query.prepare(m_preparedSQL); fillParams(&query); @@ -152,35 +150,13 @@ void QueryHolder::fillParams(QSqlQuery *query) void QueryHolder::extractParams() { - m_preparedSQL = replaceVariables(m_queryText); + m_preparedSQL = dataManager()->replaceVariables(m_queryText, m_aliasesToParam); m_prepared = true; } QString QueryHolder::replaceVariables(QString query) { - QRegExp rx(Const::VARIABLE_RX); - int curentAliasIndex = 0; - if (query.contains(rx)){ - int pos = -1; - while ((pos=rx.indexIn(query))!=-1){ - - QString variable=rx.cap(0); - variable.remove("$V{"); - variable.remove("}"); - - if (m_aliasesToParam.contains(variable)){ - curentAliasIndex++; - m_aliasesToParam.insert(variable+"_alias"+QString::number(curentAliasIndex),variable); - variable += "_alias"+QString::number(curentAliasIndex); - } else { - m_aliasesToParam.insert(variable,variable); - } - - query.replace(pos,rx.cap(0).length(),":"+variable); - - } - } - return query; + return dataManager()->replaceVariables(query, m_aliasesToParam); } QString QueryHolder::queryText() @@ -450,32 +426,7 @@ QString SubQueryHolder::extractField(QString source) QString SubQueryHolder::replaceFields(QString query) { - QRegExp rx(Const::FIELD_RX); - int curentAliasIndex=0; - if (query.contains(rx)){ - int pos; - while ((pos=rx.indexIn(query))!=-1){ - QString field=rx.cap(0); - field.remove("$D{"); - field.remove("}"); - - if (!m_aliasesToParam.contains(field)){ - if (field.contains(".")) - m_aliasesToParam.insert(field,field); - else - m_aliasesToParam.insert(field,m_masterDatasource+"."+field); - } else { - curentAliasIndex++; - if (field.contains(".")) - m_aliasesToParam.insert(field+"_alias"+QString::number(curentAliasIndex),field); - else - m_aliasesToParam.insert(field+"_alias"+QString::number(curentAliasIndex),m_masterDatasource+"."+field); - field+="_alias"+QString::number(curentAliasIndex); - } - query.replace(pos,rx.cap(0).length(),":"+extractField(field)); - } - } - return query; + return dataManager()->replaceFields(query, m_aliasesToParam); } SubQueryDesc::SubQueryDesc(QString queryName, QString queryText, QString connection, QString masterDatasourceName) diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index ad1cd58..bcb71fb 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -450,17 +450,32 @@ QString DataSourceManager::replaceVariables(QString query, QMap QString var=rx.cap(0); var.remove("$V{"); var.remove("}"); - - if (aliasesToParam.contains(var)){ - curentAliasIndex++; - aliasesToParam.insert(var+"_v_alias"+QString::number(curentAliasIndex),var); - var += "_v_alias"+QString::number(curentAliasIndex); + if (!rx.cap(1).isEmpty()){ + if (aliasesToParam.contains(var)){ + curentAliasIndex++; + aliasesToParam.insert(var+"_v_alias"+QString::number(curentAliasIndex),var); + var += "_v_alias"+QString::number(curentAliasIndex); + } else { + aliasesToParam.insert(var,var); + } + query.replace(pos,rx.cap(0).length(),":"+var); } else { - aliasesToParam.insert(var,var); + QString varName = rx.cap(2).trimmed(); + QString varParam = rx.cap(3).trimmed(); + if (!varName.isEmpty()){ + if (!varParam.isEmpty() && varParam.compare("nobind") == 0 ){ + query.replace(pos,rx.cap(0).length(), variable(varName).toString()); + } else { + query.replace(pos,rx.cap(0).length(), + QString(tr("Uknown parametr \"%1\" for variable \"%2\" found!") + .arg(varName) + .arg(varParam)) + ); + } + } else { + query.replace(pos,rx.cap(0).length(),QString(tr("Variable \"%1\" not found!").arg(var))); + } } - - query.replace(pos,rx.cap(0).length(),":"+var); - } } return query; @@ -1291,13 +1306,11 @@ void DataSourceManager::invalidateQueriesContainsVariable(const QString& variabl void DataSourceManager::slotVariableHasBeenAdded(const QString& variableName) { - //qDebug()<< "variable has been added"<< variableName; invalidateQueriesContainsVariable(variableName); } void DataSourceManager::slotVariableHasBeenChanged(const QString& variableName) { - //qDebug()<< "variable has been changed"<< variableName; invalidateQueriesContainsVariable(variableName); } diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index bf23065..a82998f 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -82,8 +82,8 @@ namespace Const{ const qreal BAND_NAME_TEXT_OPACITY = 0.6; const qreal SELECTION_OPACITY = 0.3; const QString FIELD_RX = "\\$D\\s*\\{\\s*([^{}]*)\\s*\\}"; - const QString VARIABLE_RX = "\\$V\\s*\\{\\s*([^{}]*)\\s*\\}"; - const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(%1)\\s*\\}"; + const QString VARIABLE_RX = "\\$V\\s*\\{\\s*(?:([^\\{\\},]*)|(?:([^\\{\\}]*)\\s*,\\s*([^\\{\\}]*)))\\s*\\}"; + const QString NAMED_VARIABLE_RX = "\\$V\\s*\\{\\s*(?:(%1)|(?:(%1)\\s*,\\s*([^\\{\\}]*)))\\s*\\}"; const QString SCRIPT_RX = "\\$S\\s*\\{(.*)\\}"; const QString GROUP_FUNCTION_PARAM_RX = "\\(\\s*((?:(?:\\\")|(?:))(?:(?:\\$(?:(?:D\\{\\s*\\w*..*\\})|(?:V\\{\\s*\\w*\\s*\\})|(?:S\\{.+\\})))|(?:\\w*))(?:(?:\\\")|(?:)))(?:(?:\\s*,\\s*(?:\\\"(\\w*)\\\"))|(?:))(?:(?:\\s*,\\s*(?:(\\w*)))|(?:))\\)"; const int DATASOURCE_INDEX = 3; @@ -94,6 +94,7 @@ namespace Const{ const QString GROUP_FUNCTION_NAME_RX = "%1\\s*\\((.*[^\\)])\\)"; const int SCENE_MARGIN = 50; const QString FUNCTION_MANAGER_NAME = "LimeReport"; + const QString DATAFUNCTIONS_MANAGER_NAME = "DatasourceFunctions"; const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); const int DEFAULT_TAB_INDENTION = 4; From ab8d64e48e5cfca10b614985a9b3ec1ca5f24361 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 30 Jan 2019 22:50:22 +0300 Subject: [PATCH 236/347] Data source management functions have been added to ScriptManager --- limereport/lrscriptenginemanager.cpp | 22 +++++++++++++++++----- limereport/lrscriptenginemanager.h | 12 ++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 30cd800..3c16fbb 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -353,7 +353,7 @@ void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ ); addFunction(describer); } - + moveQObjectToScript(new DatasourceFunctions(dataManager), LimeReport::Const::DATAFUNCTIONS_MANAGER_NAME); } } } @@ -564,6 +564,9 @@ void ScriptEngineManager::clearTableOfContents(){ ScriptValueType ScriptEngineManager::moveQObjectToScript(QObject* object, const QString objectName) { + + ScriptValueType obj = scriptEngine()->globalObject().property(objectName); + if (!obj.isNull()) delete obj.toQObject(); ScriptValueType result = scriptEngine()->newQObject(object); scriptEngine()->globalObject().setProperty(objectName, result); return result; @@ -866,7 +869,6 @@ ScriptEngineManager::ScriptEngineManager() m_scriptEngine->setDefaultPrototype(qMetaTypeId(), m_scriptEngine->newQObject(new ComboBoxPrototype())); #endif - createLineFunction(); createNumberFomatFunction(); createDateFormatFunction(); @@ -1786,8 +1788,6 @@ void LimeReport::TableOfContents::clear(){ } -//#ifdef USE_QJSENGINE - QObject* ComboBoxWrapperCreator::createWrapper(QObject *item) { QComboBox* comboBox = dynamic_cast(item); @@ -1797,7 +1797,19 @@ QObject* ComboBoxWrapperCreator::createWrapper(QObject *item) return 0; } -//#endif +bool DatasourceFunctions::next(const QString &datasourceName){ + if (m_dataManager && m_dataManager->dataSource(datasourceName)) + return m_dataManager->dataSource(datasourceName)->next(); + return false; +} + +bool DatasourceFunctions::isEOF(const QString &datasourceName) +{ + if (m_dataManager && m_dataManager->dataSource(datasourceName)) + return m_dataManager->dataSource(datasourceName)->eof(); + return false; +} + #ifndef USE_QJSENGINE void ComboBoxPrototype::addItem(const QString &text) diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 076ee21..30c5d38 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -52,6 +52,8 @@ #include "lrscriptenginemanagerintf.h" #include "lrcallbackdatasourceintf.h" #include "lrcollection.h" +#include "lrdatasourceintf.h" +#include "lrdatasourcemanagerintf.h" namespace LimeReport{ @@ -296,6 +298,16 @@ private: QObject* createWrapper(QObject* item); }; +class DatasourceFunctions : public QObject{ + Q_OBJECT +public: + explicit DatasourceFunctions(IDataSourceManager* dataManager): m_dataManager(dataManager){} + Q_INVOKABLE bool next(const QString& datasourceName); + Q_INVOKABLE bool isEOF(const QString& datasourceName); +private: + IDataSourceManager* m_dataManager; +}; + class ScriptFunctionsManager : public QObject{ Q_OBJECT public: From 22dd68647006c78df8bcd0d4d979a3b17ce14615 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 31 Jan 2019 22:30:41 +0300 Subject: [PATCH 237/347] Some additional datasource management functions have been added --- limereport/lrscriptenginemanager.cpp | 24 ++++++++++++++++++++++++ limereport/lrscriptenginemanager.h | 4 ++++ 2 files changed, 28 insertions(+) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 3c16fbb..94dc11f 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1797,12 +1797,28 @@ QObject* ComboBoxWrapperCreator::createWrapper(QObject *item) return 0; } +bool DatasourceFunctions::first(const QString& datasourceName) +{ + if (m_dataManager && m_dataManager->dataSource(datasourceName)){ + m_dataManager->dataSource(datasourceName)->first(); + return true; + } + return false; +} + bool DatasourceFunctions::next(const QString &datasourceName){ if (m_dataManager && m_dataManager->dataSource(datasourceName)) return m_dataManager->dataSource(datasourceName)->next(); return false; } +bool DatasourceFunctions::prior(const QString& datasourceName) +{ + if (m_dataManager && m_dataManager->dataSource(datasourceName)) + return m_dataManager->dataSource(datasourceName)->prior(); + return false; +} + bool DatasourceFunctions::isEOF(const QString &datasourceName) { if (m_dataManager && m_dataManager->dataSource(datasourceName)) @@ -1810,6 +1826,14 @@ bool DatasourceFunctions::isEOF(const QString &datasourceName) return false; } +bool DatasourceFunctions::invalidate(const QString& datasourceName) +{ + if (m_dataManager && m_dataManager->dataSource(datasourceName)){ + m_dataManager->dataSourceHolder(datasourceName)->invalidate(IDataSource::DatasourceMode::RENDER_MODE); + return true; + } + return false; +} #ifndef USE_QJSENGINE void ComboBoxPrototype::addItem(const QString &text) diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 30c5d38..bbdef99 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -302,8 +302,12 @@ class DatasourceFunctions : public QObject{ Q_OBJECT public: explicit DatasourceFunctions(IDataSourceManager* dataManager): m_dataManager(dataManager){} + Q_INVOKABLE bool first(const QString& datasourceName); Q_INVOKABLE bool next(const QString& datasourceName); + Q_INVOKABLE bool prior(const QString& datasourceName); Q_INVOKABLE bool isEOF(const QString& datasourceName); + Q_INVOKABLE bool invalidate(const QString& datasourceName); + private: IDataSourceManager* m_dataManager; }; From 14c1b56c83583a08eb26a942b8ce2422f0c97ae9 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Feb 2019 21:59:37 +0300 Subject: [PATCH 238/347] Checking painter before render the report has been added --- limereport/lrreportengine.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 0cd8628..b45fcdd 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -348,6 +348,10 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) } else { isFirst=false; painter = new QPainter(&printer); + if (!painter->isActive()){ + delete painter; + return; + } } QRectF printerPageRect = printer.pageRect(QPrinter::Millimeter); From 72fb6692c670cabb23d9fe06c7d8d2e1855631d6 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 2 Feb 2019 00:28:30 +0300 Subject: [PATCH 239/347] Layouts have been refactored --- limereport/items/lrabstractlayout.cpp | 35 +++++++++++++++++++++++ limereport/items/lrabstractlayout.h | 8 ++++-- limereport/items/lrhorizontallayout.cpp | 33 ++++------------------ limereport/items/lrhorizontallayout.h | 5 +--- limereport/items/lrverticallayout.cpp | 37 ++++--------------------- limereport/items/lrverticallayout.h | 5 +--- 6 files changed, 53 insertions(+), 70 deletions(-) diff --git a/limereport/items/lrabstractlayout.cpp b/limereport/items/lrabstractlayout.cpp index 47283b7..3b143c7 100644 --- a/limereport/items/lrabstractlayout.cpp +++ b/limereport/items/lrabstractlayout.cpp @@ -259,6 +259,34 @@ void AbstractLayout::updateItemSize(DataSourceManager* dataManager, RenderPass p BaseDesignIntf::updateItemSize(dataManager, pass, maxHeight); } +void AbstractLayout::rebuildChildrenIfNeeded(){ + if (layoutsChildren().count() < childItems().size()-1){ + layoutsChildren().clear(); + foreach (BaseDesignIntf* childItem, childBaseItems()) { + layoutsChildren().append(childItem); + } + sortChildren(); + } +} + +BaseDesignIntf *AbstractLayout::findNext(BaseDesignIntf *item) +{ + rebuildChildrenIfNeeded(); + for (int i=0; ii+1){ return layoutsChildren()[i+1];} + } + return 0; +} + +BaseDesignIntf *AbstractLayout::findPrior(BaseDesignIntf *item) +{ + rebuildChildrenIfNeeded(); + for (int i=0; i(child)); @@ -323,6 +351,13 @@ void AbstractLayout::setHideEmptyItems(bool hideEmptyItems) } } +BaseDesignIntf *AbstractLayout::at(int index) +{ + rebuildChildrenIfNeeded(); + if (layoutsChildren().size() > index) return layoutsChildren()[index]; + return 0; +} + LayoutMarker* AbstractLayout::layoutMarker() const { return m_layoutMarker; diff --git a/limereport/items/lrabstractlayout.h b/limereport/items/lrabstractlayout.h index 6f5e796..90d9b9d 100644 --- a/limereport/items/lrabstractlayout.h +++ b/limereport/items/lrabstractlayout.h @@ -29,7 +29,7 @@ public: bool hideEmptyItems() const; void setHideEmptyItems(bool hideEmptyItems); - + BaseDesignIntf* at(int index); protected: int childrenCount(); void beforeDelete(); @@ -42,12 +42,14 @@ protected: bool isNeedUpdateSize(RenderPass pass) const; QVariant itemChange(GraphicsItemChange change, const QVariant &value); void updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight); + void rebuildChildrenIfNeeded(); private: + virtual void sortChildren() = 0; virtual void divideSpace() = 0; virtual void updateLayoutSize() = 0; virtual void relocateChildren() = 0; - virtual BaseDesignIntf *findNext(BaseDesignIntf *item) = 0; - virtual BaseDesignIntf *findPrior(BaseDesignIntf *item) = 0; + virtual BaseDesignIntf* findNext(BaseDesignIntf *item); + virtual BaseDesignIntf* findPrior(BaseDesignIntf *item); virtual void placeItemInLayout(BaseDesignIntf* item) = 0; virtual void insertItemInLayout(BaseDesignIntf* item) = 0; private slots: diff --git a/limereport/items/lrhorizontallayout.cpp b/limereport/items/lrhorizontallayout.cpp index 0fd3207..e5cd0af 100644 --- a/limereport/items/lrhorizontallayout.cpp +++ b/limereport/items/lrhorizontallayout.cpp @@ -138,6 +138,11 @@ void HorizontalLayout::setItemAlign(const BaseDesignIntf::ItemAlign &itemAlign) BaseDesignIntf::setItemAlign(itemAlign); } +void HorizontalLayout::sortChildren() +{ + qSort(layoutsChildren().begin(),layoutsChildren().end(),horizontalLessThen); +} + void HorizontalLayout::updateLayoutSize() { int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; @@ -183,34 +188,6 @@ void HorizontalLayout::relocateChildren() setIsRelocating(false); } -BaseDesignIntf* HorizontalLayout::findNext(BaseDesignIntf* item){ - if (layoutsChildren().count() < childItems().size()-1){ - layoutsChildren().clear(); - foreach (BaseDesignIntf* childItem, childBaseItems()) { - layoutsChildren().append(childItem); - } - } - qSort(layoutsChildren().begin(),layoutsChildren().end(),horizontalLessThen); - for (int i=0; ii+1){ return layoutsChildren()[i+1];} - } - return 0; -} - -BaseDesignIntf* HorizontalLayout::findPrior(BaseDesignIntf* item){ - if (layoutsChildren().count()i+1){ return layoutsChildren()[i+1];} - } - return 0; -} - -BaseDesignIntf*VerticalLayout::findPrior(BaseDesignIntf* item) -{ - if (layoutsChildren().count() Date: Mon, 4 Feb 2019 19:40:29 +0300 Subject: [PATCH 240/347] Abstract layout has been changed --- limereport/items/lrabstractlayout.cpp | 2 +- limereport/items/lrabstractlayout.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/limereport/items/lrabstractlayout.cpp b/limereport/items/lrabstractlayout.cpp index 3b143c7..7529533 100644 --- a/limereport/items/lrabstractlayout.cpp +++ b/limereport/items/lrabstractlayout.cpp @@ -351,7 +351,7 @@ void AbstractLayout::setHideEmptyItems(bool hideEmptyItems) } } -BaseDesignIntf *AbstractLayout::at(int index) +QObject* AbstractLayout::at(int index) { rebuildChildrenIfNeeded(); if (layoutsChildren().size() > index) return layoutsChildren()[index]; diff --git a/limereport/items/lrabstractlayout.h b/limereport/items/lrabstractlayout.h index 90d9b9d..2c88abe 100644 --- a/limereport/items/lrabstractlayout.h +++ b/limereport/items/lrabstractlayout.h @@ -29,9 +29,9 @@ public: bool hideEmptyItems() const; void setHideEmptyItems(bool hideEmptyItems); - BaseDesignIntf* at(int index); -protected: + Q_INVOKABLE QObject* at(int index); int childrenCount(); +protected: void beforeDelete(); void childAddedEvent(BaseDesignIntf *child); void geometryChangedEvent(QRectF newRect, QRectF); From d09ae57d0fb3e668566b4d1d52d25725c6c51c8a Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 5 Feb 2019 01:00:32 +0300 Subject: [PATCH 241/347] New signal preparedForRender has been added to band --- limereport/lrbanddesignintf.cpp | 2 ++ limereport/lrbanddesignintf.h | 1 + 2 files changed, 3 insertions(+) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 25db826..af4c72f 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -1053,6 +1053,8 @@ void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass p spaceBorder += m_bottomSpace; restoreLinks(); snapshotItemsLayout(); + BandDesignIntf* patternBand = dynamic_cast(patternItem()); + if (patternBand) emit(patternBand->preparedForRender()); arrangeSubItems(pass, dataManager); if (autoHeight()){ if (!keepTopSpace()) { diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index c550143..dcdeac8 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -258,6 +258,7 @@ public: void setBootomSpace(int bootomSpace); signals: void bandRendered(BandDesignIntf* band); + void preparedForRender(); void bandRegistred(); protected: void trimToMaxHeight(int maxHeight); From 5a5c9e76df621092606a0c70dbe5327674c904c9 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 5 Feb 2019 01:04:23 +0300 Subject: [PATCH 242/347] DatasourceFunctions have been extended --- limereport/lrscriptenginemanager.cpp | 70 +++++++++++++++++++++++++++- limereport/lrscriptenginemanager.h | 25 +++++++++- 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 94dc11f..882bc66 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -31,6 +31,7 @@ #include #include +#include #ifndef USE_QJSENGINE #include #endif @@ -1823,7 +1824,7 @@ bool DatasourceFunctions::isEOF(const QString &datasourceName) { if (m_dataManager && m_dataManager->dataSource(datasourceName)) return m_dataManager->dataSource(datasourceName)->eof(); - return false; + return true; } bool DatasourceFunctions::invalidate(const QString& datasourceName) @@ -1835,6 +1836,73 @@ bool DatasourceFunctions::invalidate(const QString& datasourceName) return false; } +QObject* DatasourceFunctions::createTableBuilder(BaseDesignIntf* horizontalLayout) +{ + return new TableBuilder(dynamic_cast(horizontalLayout), dynamic_cast(m_dataManager)); +} + +QObject* TableBuilder::addRow() +{ + checkBaseLayout(); + HorizontalLayout* newRow = new HorizontalLayout(m_baseLayout, m_baseLayout); + for(int i = 0; i < m_horizontalLayout->childrenCount(); ++i){ + BaseDesignIntf* item = dynamic_cast(m_horizontalLayout->at(i)); + BaseDesignIntf* cloneItem = item->cloneItem(item->itemMode(), newRow, newRow); + newRow->addChild(cloneItem); + } + m_baseLayout->addChild(newRow); + return newRow; +} + +QObject* TableBuilder::currentRow() +{ + checkBaseLayout(); + if (m_baseLayout && m_baseLayout->childrenCount()>0) + return m_baseLayout->at(m_baseLayout->childrenCount()-1); + return 0; +} + +void TableBuilder::fillInRowData(QObject* row) +{ + HorizontalLayout* layout = dynamic_cast(row); + if (layout){ + for (int i = 0; i < layout->childrenCount(); ++i) { + BaseDesignIntf* item = dynamic_cast(layout->at(i)); + DataSourceManager* dm = dynamic_cast(m_dataManager); + if (item && dm) + item->updateItemSize(dm); + } + } +} + +void TableBuilder::buildTable(const QString& datasourceName) +{ + checkBaseLayout(); + m_dataManager->dataSource(datasourceName)->first(); + while(!m_dataManager->dataSource(datasourceName)->eof()){ + fillInRowData(addRow()); + m_dataManager->dataSource(datasourceName)->next(); + } + m_horizontalLayout->setVisible(false); +} + +void TableBuilder::checkBaseLayout() +{ + if (!m_baseLayout){ + m_baseLayout = dynamic_cast(m_horizontalLayout->parentItem()); + if (!m_baseLayout){ + m_baseLayout = new VerticalLayout(m_horizontalLayout->parent(), m_horizontalLayout->parentItem()); + m_baseLayout->setItemLocation(m_horizontalLayout->itemLocation()); + m_baseLayout->setPos(m_horizontalLayout->pos()); + m_baseLayout->setWidth(m_horizontalLayout->width()); + m_baseLayout->setHeight(0); + m_baseLayout->addChild(m_horizontalLayout); + m_baseLayout->setObjectName(QUuid::createUuid().toString()); + m_baseLayout->setItemTypeName("VerticalLayout"); + } + } +} + #ifndef USE_QJSENGINE void ComboBoxPrototype::addItem(const QString &text) { diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index bbdef99..b9a06c9 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -54,6 +54,8 @@ #include "lrcollection.h" #include "lrdatasourceintf.h" #include "lrdatasourcemanagerintf.h" +#include "lrhorizontallayout.h" +#include "lrverticallayout.h" namespace LimeReport{ @@ -298,16 +300,35 @@ private: QObject* createWrapper(QObject* item); }; +class TableBuilder: public QObject{ + Q_OBJECT +public: + TableBuilder(LimeReport::HorizontalLayout* layout, DataSourceManager* dataManager) + : m_horizontalLayout(layout), m_baseLayout(0), m_dataManager(dataManager){} + ~TableBuilder(){} + Q_INVOKABLE QObject* addRow(); + Q_INVOKABLE QObject* currentRow(); + Q_INVOKABLE void fillInRowData(QObject* row); + Q_INVOKABLE void buildTable(const QString& datasourceName); +private: + void checkBaseLayout(); +private: + LimeReport::HorizontalLayout* m_horizontalLayout; + LimeReport::VerticalLayout* m_baseLayout; + DataSourceManager* m_dataManager; +}; + class DatasourceFunctions : public QObject{ Q_OBJECT public: - explicit DatasourceFunctions(IDataSourceManager* dataManager): m_dataManager(dataManager){} + explicit DatasourceFunctions(IDataSourceManager* dataManager) + : m_dataManager(dataManager){} Q_INVOKABLE bool first(const QString& datasourceName); Q_INVOKABLE bool next(const QString& datasourceName); Q_INVOKABLE bool prior(const QString& datasourceName); Q_INVOKABLE bool isEOF(const QString& datasourceName); Q_INVOKABLE bool invalidate(const QString& datasourceName); - + Q_INVOKABLE QObject *createTableBuilder(BaseDesignIntf* horizontalLayout); private: IDataSourceManager* m_dataManager; }; From 2ed1b4b05fd29d3bf1b122485378d83332fd7ce1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 5 Feb 2019 19:54:36 +0300 Subject: [PATCH 243/347] TableBuilder has been fixed --- limereport/lrscriptenginemanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 882bc66..4fe90e3 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1878,6 +1878,7 @@ void TableBuilder::fillInRowData(QObject* row) void TableBuilder::buildTable(const QString& datasourceName) { checkBaseLayout(); + m_dataManager->dataSourceHolder(datasourceName)->invalidate(IDataSource::RENDER_MODE); m_dataManager->dataSource(datasourceName)->first(); while(!m_dataManager->dataSource(datasourceName)->eof()){ fillInRowData(addRow()); From 87d0bd5f2869be161bafdf005de5d7be5053796f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 5 Feb 2019 21:51:46 +0300 Subject: [PATCH 244/347] Changes tracking has been fixed --- limereport/lrdatasourcemanager.h | 2 +- limereport/lrreportdesignwidget.cpp | 6 ++++++ limereport/lrreportdesignwidget.h | 1 + limereport/lrreportdesignwindow.cpp | 2 ++ limereport/lrreportengine.cpp | 12 +++++++----- limereport/lrreportengine_p.h | 1 + limereport/lrscriptenginemanager.cpp | 7 +++++-- limereport/lrscriptenginemanager.h | 8 ++++++-- limereport/scripteditor/lrcodeeditor.cpp | 4 ++-- limereport/scripteditor/lrscripteditor.cpp | 3 +++ limereport/scripteditor/lrscripteditor.h | 4 ++++ 11 files changed, 38 insertions(+), 12 deletions(-) diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index 046cd3e..6dd6518 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -214,7 +214,7 @@ public: ReportSettings *reportSettings() const; void setReportSettings(ReportSettings *reportSettings); - bool isHasChanges(){ return m_hasChanges; } + bool hasChanges(){ return m_hasChanges; } void dropChanges(){ m_hasChanges = false; } signals: void loadCollectionFinished(const QString& collectionName); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 750ae0a..f13ed02 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -284,6 +284,7 @@ void ReportDesignWidget::createTabs(){ } m_scriptEditor = new ScriptEditor(this); + connect(m_scriptEditor, SIGNAL(textChanged()), this, SLOT(slotScriptTextChanged())); m_scriptEditor->setReportEngine(m_report); pageIndex = m_tabWidget->addTab(m_scriptEditor,QIcon(),tr("Script")); m_tabWidget->setTabWhatsThis(pageIndex,"script"); @@ -882,6 +883,11 @@ void ReportDesignWidget::slotReportLoaded() m_dialogChanged = false; } +void ReportDesignWidget::slotScriptTextChanged() +{ + m_report->scriptContext()->setInitScript(m_scriptEditor->toPlainText()); +} + #ifdef HAVE_QTDESIGNER_INTEGRATION void ReportDesignWidget::addNewDialog() diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 0352158..f1b092c 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -173,6 +173,7 @@ private slots: void slotSceneRectChanged(QRectF); void slotCurrentTabChanged(int index); void slotReportLoaded(); + void slotScriptTextChanged(); #ifdef HAVE_QTDESIGNER_INTEGRATION void slotDialogChanged(QString); void slotDialogNameChanged(QString oldName, QString newName); diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 685ac93..3aa1660 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -662,6 +662,8 @@ void ReportDesignWindow::startNewReport() m_editorTabType = ReportDesignWidget::Page; showDefaultToolBars(); m_reportDesignWidget->report()->dataManager()->dropChanges(); + m_reportDesignWidget->report()->scriptContext()->dropChanges(); + } void ReportDesignWindow::writePosition() diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 330d757..6c62d4a 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -717,7 +717,7 @@ bool ReportEnginePrivate::slotLoadFromFile(const QString &fileName) EASY_BLOCK("Connect auto connections") dataManager()->connectAutoConnections(); EASY_END_BLOCK; - dataManager()->dropChanges(); + dropChanges(); if ( hasActivePreview() ) { @@ -881,7 +881,7 @@ bool ReportEnginePrivate::saveToFile(const QString &fileName) page->setToSaved(); } } - m_datasources->dropChanges(); + dropChanges(); return saved; } @@ -896,7 +896,7 @@ QByteArray ReportEnginePrivate::saveToByteArray() page->setToSaved(); } } - m_datasources->dropChanges(); + dropChanges(); return result; } @@ -910,7 +910,7 @@ QString ReportEnginePrivate::saveToString(){ page->setToSaved(); } } - m_datasources->dropChanges(); + dropChanges(); return result; } @@ -919,9 +919,11 @@ bool ReportEnginePrivate::isNeedToSave() foreach(PageDesignIntf* page, m_pages){ if (page->isHasChanges()) return true; } - if (dataManager()->isHasChanges()){ + if (dataManager()->hasChanges()){ return true; } + if (scriptContext()->hasChanges()) + return true; return false; } diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 9580cb6..461fd69 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -249,6 +249,7 @@ private: PageItemDesignIntf *createRenderingPage(PageItemDesignIntf *page); void initReport(); void paintByExternalPainter(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem* options); + void dropChanges(){ m_datasources->dropChanges(); m_scriptEngineContext->dropChanges();} private: QList m_pages; QList m_renderingPages; diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 4fe90e3..d69f3af 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1390,7 +1390,10 @@ QString ScriptEngineContext::initScript() const void ScriptEngineContext::setInitScript(const QString& initScript) { - m_initScript = initScript; + if (m_initScript != initScript){ + m_initScript = initScript; + m_hasChanges = true; + } } DialogDescriber::Ptr DialogDescriber::create(const QString& name, const QByteArray& desc) { @@ -1884,7 +1887,7 @@ void TableBuilder::buildTable(const QString& datasourceName) fillInRowData(addRow()); m_dataManager->dataSource(datasourceName)->next(); } - m_horizontalLayout->setVisible(false); + m_horizontalLayout->setHeight(0); } void TableBuilder::checkBaseLayout() diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index b9a06c9..3e8db0c 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -174,7 +174,9 @@ public: #ifdef HAVE_UI_LOADER typedef QSharedPointer DialogPtr; #endif - explicit ScriptEngineContext(QObject* parent=0):QObject(parent), m_tableOfContents(new TableOfContents(this)){} + explicit ScriptEngineContext(QObject* parent=0): + QObject(parent), + m_tableOfContents(new TableOfContents(this)), m_hasChanges(false) {} #ifdef HAVE_UI_LOADER void addDialog(const QString& name, const QByteArray& description); bool changeDialog(const QString& name, const QByteArray &description); @@ -200,7 +202,8 @@ public: void setCurrentPage(PageItemDesignIntf* currentPage); TableOfContents* tableOfContents() const; void setTableOfContents(TableOfContents* tableOfContents); - + void dropChanges(){ m_hasChanges = false;} + bool hasChanges(){ return m_hasChanges;} #ifdef HAVE_UI_LOADER signals: void dialogNameChanged(QString dialogName); @@ -227,6 +230,7 @@ private: BandDesignIntf* m_currentBand; PageItemDesignIntf* m_currentPage; TableOfContents* m_tableOfContents; + bool m_hasChanges; }; class JSFunctionDesc{ diff --git a/limereport/scripteditor/lrcodeeditor.cpp b/limereport/scripteditor/lrcodeeditor.cpp index 97deeb5..308f376 100644 --- a/limereport/scripteditor/lrcodeeditor.cpp +++ b/limereport/scripteditor/lrcodeeditor.cpp @@ -282,8 +282,8 @@ void CodeEditor::insertCompletion(const QString &completion) return; QTextCursor tc = textCursor(); int extra = completion.length() - m_compleater->completionPrefix().length(); - tc.movePosition(QTextCursor::Left); - tc.movePosition(QTextCursor::EndOfWord); + //tc.movePosition(QTextCursor::Left); + //tc.movePosition(QTextCursor::EndOfWord); tc.insertText(completion.right(extra)); setTextCursor(tc); } diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index c5f8273..5f96a33 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -22,6 +22,7 @@ ScriptEditor::ScriptEditor(QWidget *parent) : ui->textEdit->setCompleter(m_completer); ui->textEdit->setTabStopWidth(ui->textEdit->fontMetrics().width("0")*m_tabIndention); connect(ui->splitter, SIGNAL(splitterMoved(int,int)), this, SIGNAL(splitterMoved(int,int))); + connect(ui->textEdit, SIGNAL(textChanged()), this, SIGNAL(textChanged())); } ScriptEditor::~ScriptEditor() @@ -361,3 +362,5 @@ void ReportStructureCompleater::addChildItem(BaseDesignIntf *item, const QString + + diff --git a/limereport/scripteditor/lrscripteditor.h b/limereport/scripteditor/lrscripteditor.h index 10a7ad1..10dcd5a 100644 --- a/limereport/scripteditor/lrscripteditor.h +++ b/limereport/scripteditor/lrscripteditor.h @@ -60,8 +60,11 @@ public: void setEditorFont(QFont font); QFont editorFont(); QString toPlainText(); + bool hasChanges() const; + void setHasChanges(bool hasChanges); signals: void splitterMoved(int, int); + void textChanged(); protected: void initEditor(DataSourceManager* dm); @@ -69,6 +72,7 @@ private slots: void on_twData_doubleClicked(const QModelIndex &index); void on_twScriptEngine_doubleClicked(const QModelIndex &index); void slotOnCurrentChanged(const QModelIndex& to, const QModelIndex&); + private: Ui::ScriptEditor *ui; ReportEnginePrivateInterface* m_reportEngine; From 65a3a367706bf248779c07b26839ec0bf4557c67 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 5 Feb 2019 22:34:38 +0300 Subject: [PATCH 245/347] TableBuilder has been fixed --- limereport/items/lrhorizontallayout.cpp | 2 +- limereport/lrscriptenginemanager.cpp | 16 +++++++++++++--- limereport/lrscriptenginemanager.h | 6 +++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/limereport/items/lrhorizontallayout.cpp b/limereport/items/lrhorizontallayout.cpp index e5cd0af..c981e40 100644 --- a/limereport/items/lrhorizontallayout.cpp +++ b/limereport/items/lrhorizontallayout.cpp @@ -169,7 +169,7 @@ void HorizontalLayout::updateLayoutSize() void HorizontalLayout::relocateChildren() { int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; - if (layoutsChildren().count()(horizontalLayout), dynamic_cast(m_dataManager)); } +TableBuilder::TableBuilder(HorizontalLayout* layout, DataSourceManager* dataManager) + : m_horizontalLayout(layout), m_baseLayout(0), m_dataManager(dataManager) +{ + if (m_horizontalLayout) + m_patternLayout = dynamic_cast(m_horizontalLayout->cloneItem(m_horizontalLayout->itemMode())); +} + QObject* TableBuilder::addRow() { checkBaseLayout(); HorizontalLayout* newRow = new HorizontalLayout(m_baseLayout, m_baseLayout); for(int i = 0; i < m_horizontalLayout->childrenCount(); ++i){ - BaseDesignIntf* item = dynamic_cast(m_horizontalLayout->at(i)); + BaseDesignIntf* item = dynamic_cast(m_patternLayout->at(i)); BaseDesignIntf* cloneItem = item->cloneItem(item->itemMode(), newRow, newRow); newRow->addChild(cloneItem); } @@ -1883,11 +1890,14 @@ void TableBuilder::buildTable(const QString& datasourceName) checkBaseLayout(); m_dataManager->dataSourceHolder(datasourceName)->invalidate(IDataSource::RENDER_MODE); m_dataManager->dataSource(datasourceName)->first(); + bool firstTime = true; + QObject* row = m_horizontalLayout; while(!m_dataManager->dataSource(datasourceName)->eof()){ - fillInRowData(addRow()); + if (!firstTime) row = addRow(); + else firstTime = false; + fillInRowData(row); m_dataManager->dataSource(datasourceName)->next(); } - m_horizontalLayout->setHeight(0); } void TableBuilder::checkBaseLayout() diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 3e8db0c..0295055 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -307,9 +307,8 @@ private: class TableBuilder: public QObject{ Q_OBJECT public: - TableBuilder(LimeReport::HorizontalLayout* layout, DataSourceManager* dataManager) - : m_horizontalLayout(layout), m_baseLayout(0), m_dataManager(dataManager){} - ~TableBuilder(){} + TableBuilder(LimeReport::HorizontalLayout* layout, DataSourceManager* dataManager); + ~TableBuilder(){delete m_patternLayout;} Q_INVOKABLE QObject* addRow(); Q_INVOKABLE QObject* currentRow(); Q_INVOKABLE void fillInRowData(QObject* row); @@ -318,6 +317,7 @@ private: void checkBaseLayout(); private: LimeReport::HorizontalLayout* m_horizontalLayout; + LimeReport::HorizontalLayout* m_patternLayout; LimeReport::VerticalLayout* m_baseLayout; DataSourceManager* m_dataManager; }; From 867448d0fdd7436b9a0478abe7a46885fee7d94f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 5 Feb 2019 23:25:18 +0300 Subject: [PATCH 246/347] Layout spacing property has been added to layouts --- limereport/items/lrabstractlayout.cpp | 18 +++++++++++++++++- limereport/items/lrabstractlayout.h | 5 +++++ limereport/items/lrhorizontallayout.cpp | 8 ++++++-- limereport/items/lrverticallayout.cpp | 8 ++++++-- limereport/lrscriptenginemanager.cpp | 18 ++++++++++-------- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/limereport/items/lrabstractlayout.cpp b/limereport/items/lrabstractlayout.cpp index 7529533..43e749e 100644 --- a/limereport/items/lrabstractlayout.cpp +++ b/limereport/items/lrabstractlayout.cpp @@ -4,7 +4,7 @@ namespace LimeReport { AbstractLayout::AbstractLayout(QString xmlTag, QObject* owner, QGraphicsItem* parent) : LayoutDesignIntf(xmlTag, owner, parent), m_isRelocating(false), m_layoutType(Layout), - m_hideEmptyItems(false) + m_hideEmptyItems(false), m_layoutSpacing(0) { setPossibleResizeDirectionFlags(AllDirections); m_layoutMarker = new LayoutMarker(this); @@ -336,6 +336,22 @@ void AbstractLayout::slotOnChildSelectionHasChanged(BaseDesignIntf* item, bool v item->setZValue(value ? item->zValue()+1 : item->zValue()-1); } +int AbstractLayout::layoutSpacing() const +{ + return m_layoutSpacing; +} + +void AbstractLayout::setLayoutSpacing(int layoutSpacing) +{ + if (m_layoutSpacing != layoutSpacing){ + int oldValue = m_layoutSpacing; + m_layoutSpacing = layoutSpacing; + int delta = (m_layoutSpacing - oldValue) * (m_children.count()-1); + notify("layoutSpacing", oldValue, m_layoutSpacing); + setWidth(width() + delta); + } +} + bool AbstractLayout::hideEmptyItems() const { return m_hideEmptyItems; diff --git a/limereport/items/lrabstractlayout.h b/limereport/items/lrabstractlayout.h index 2c88abe..2067559 100644 --- a/limereport/items/lrabstractlayout.h +++ b/limereport/items/lrabstractlayout.h @@ -10,6 +10,7 @@ class AbstractLayout: public LayoutDesignIntf Q_OBJECT Q_ENUMS(LayoutType) Q_PROPERTY(bool hideEmptyItems READ hideEmptyItems WRITE setHideEmptyItems) + Q_PROPERTY(int layoutSpacing READ layoutSpacing WRITE setLayoutSpacing) public: enum LayoutType{Layout,Table}; AbstractLayout(QString xmlTag, QObject *owner = 0, QGraphicsItem *parent = 0); @@ -31,6 +32,9 @@ public: void setHideEmptyItems(bool hideEmptyItems); Q_INVOKABLE QObject* at(int index); int childrenCount(); + int layoutSpacing() const; + void setLayoutSpacing(int layoutSpacing); + protected: void beforeDelete(); void childAddedEvent(BaseDesignIntf *child); @@ -64,6 +68,7 @@ private: LayoutMarker* m_layoutMarker; LayoutType m_layoutType; bool m_hideEmptyItems; + int m_layoutSpacing; }; } // namespace LimeReport diff --git a/limereport/items/lrhorizontallayout.cpp b/limereport/items/lrhorizontallayout.cpp index c981e40..4e4ff3f 100644 --- a/limereport/items/lrhorizontallayout.cpp +++ b/limereport/items/lrhorizontallayout.cpp @@ -148,16 +148,18 @@ void HorizontalLayout::updateLayoutSize() int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; qreal w = spaceBorder*2; qreal h = 0; + int visibleItemCount = 0; foreach(BaseDesignIntf* item, layoutsChildren()){ if (item->isEmpty() && hideEmptyItems()) item->setVisible(false); if (item->isVisible()){ if (hheight()) h=item->height(); w+=item->width(); + visibleItemCount++; } } if (h>0) setHeight(h+spaceBorder*2); if (layoutType() == Layout) - setWidth(w); + setWidth(w + layoutSpacing() * (visibleItemCount-1)); else{ relocateChildren(); if (!isRelocating()){ @@ -181,7 +183,7 @@ void HorizontalLayout::relocateChildren() foreach (BaseDesignIntf* item, layoutsChildren()) { if (item->isVisible() || itemMode() == DesignMode){ item->setPos(curX,spaceBorder); - curX+=item->width(); + curX += item->width() + layoutSpacing(); item->setHeight(height()-(spaceBorder * 2)); } } @@ -201,6 +203,8 @@ void HorizontalLayout::divideSpace(){ } } + itemsSumSize += layoutSpacing() * (visibleItemsCount-1); + if (itemMode() == DesignMode && !layoutsChildren().isEmpty()){ qreal delta = (width() - (itemsSumSize+spaceBorder*2)); layoutsChildren().last()->setWidth(layoutsChildren().last()->width()+delta); diff --git a/limereport/items/lrverticallayout.cpp b/limereport/items/lrverticallayout.cpp index 1958e0e..2e658b1 100644 --- a/limereport/items/lrverticallayout.cpp +++ b/limereport/items/lrverticallayout.cpp @@ -41,15 +41,17 @@ void VerticalLayout::updateLayoutSize() int spaceBorder = (borderLines() != 0) ? borderLineSize() : 0; int h = spaceBorder*2; qreal w = 0; + int visibleItemCount = 0; foreach(BaseDesignIntf* item, layoutsChildren()){ if (item->isEmpty() && hideEmptyItems()) item->setVisible(false); if (item->isVisible()){ if (w < item->width()) w = item->width(); h+=item->height(); + visibleItemCount++; } } if (w>0) setWidth(w+spaceBorder*2); - setHeight(h); + setHeight(h + layoutSpacing() *(visibleItemCount-1)); } void VerticalLayout::relocateChildren() @@ -67,7 +69,7 @@ void VerticalLayout::relocateChildren() foreach (BaseDesignIntf* item, layoutsChildren()) { if (item->isVisible() || itemMode() == DesignMode){ item->setPos(spaceBorder, curY); - curY+=item->height(); + curY+=item->height() + layoutSpacing(); item->setWidth(width() - (spaceBorder * 2)); } } @@ -160,6 +162,8 @@ void VerticalLayout::divideSpace() visibleItemsCount++; } } + + itemsSumSize += layoutSpacing() * (visibleItemsCount - 1); qreal delta = (height() - (itemsSumSize+spaceBorder*2)) / (visibleItemsCount!=0 ? visibleItemsCount : 1); for (int i=0; ichildrenCount(); ++i){ - BaseDesignIntf* item = dynamic_cast(m_patternLayout->at(i)); - BaseDesignIntf* cloneItem = item->cloneItem(item->itemMode(), newRow, newRow); - newRow->addChild(cloneItem); - } - m_baseLayout->addChild(newRow); - return newRow; + if (m_baseLayout && m_patternLayout){ + HorizontalLayout* newRow = new HorizontalLayout(m_baseLayout, m_baseLayout); + for(int i = 0; i < m_horizontalLayout->childrenCount(); ++i){ + BaseDesignIntf* item = dynamic_cast(m_patternLayout->at(i)); + BaseDesignIntf* cloneItem = item->cloneItem(item->itemMode(), newRow, newRow); + newRow->addChild(cloneItem); + } + m_baseLayout->addChild(newRow); + return newRow; + } else return 0; } QObject* TableBuilder::currentRow() From 8a4daa889f6434733f76b29490ef5475baea3216 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 5 Feb 2019 23:53:36 +0300 Subject: [PATCH 247/347] Emitting band's signal preparedForRender has been fixed --- limereport/lrbanddesignintf.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index af4c72f..a0a73fe 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -1054,7 +1054,7 @@ void BandDesignIntf::updateItemSize(DataSourceManager* dataManager, RenderPass p restoreLinks(); snapshotItemsLayout(); BandDesignIntf* patternBand = dynamic_cast(patternItem()); - if (patternBand) emit(patternBand->preparedForRender()); + if (patternBand && pass == FirstPass) emit(patternBand->preparedForRender()); arrangeSubItems(pass, dataManager); if (autoHeight()){ if (!keepTopSpace()) { From 35cd54919afc388751ede2537a13799579b8a334 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 6 Feb 2019 18:41:56 +0300 Subject: [PATCH 248/347] Layout spacing has been fixed --- limereport/items/lrabstractlayout.h | 2 +- limereport/items/lrhorizontallayout.cpp | 6 +++--- limereport/items/lrverticallayout.cpp | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/limereport/items/lrabstractlayout.h b/limereport/items/lrabstractlayout.h index 2067559..742055a 100644 --- a/limereport/items/lrabstractlayout.h +++ b/limereport/items/lrabstractlayout.h @@ -34,7 +34,7 @@ public: int childrenCount(); int layoutSpacing() const; void setLayoutSpacing(int layoutSpacing); - + qreal layoutSpacingMM(){ return m_layoutSpacing * mmFactor();} protected: void beforeDelete(); void childAddedEvent(BaseDesignIntf *child); diff --git a/limereport/items/lrhorizontallayout.cpp b/limereport/items/lrhorizontallayout.cpp index 4e4ff3f..f4f51ef 100644 --- a/limereport/items/lrhorizontallayout.cpp +++ b/limereport/items/lrhorizontallayout.cpp @@ -159,7 +159,7 @@ void HorizontalLayout::updateLayoutSize() } if (h>0) setHeight(h+spaceBorder*2); if (layoutType() == Layout) - setWidth(w + layoutSpacing() * (visibleItemCount-1)); + setWidth(w + layoutSpacingMM() * (visibleItemCount-1)); else{ relocateChildren(); if (!isRelocating()){ @@ -183,7 +183,7 @@ void HorizontalLayout::relocateChildren() foreach (BaseDesignIntf* item, layoutsChildren()) { if (item->isVisible() || itemMode() == DesignMode){ item->setPos(curX,spaceBorder); - curX += item->width() + layoutSpacing(); + curX += item->width() + layoutSpacingMM(); item->setHeight(height()-(spaceBorder * 2)); } } @@ -203,7 +203,7 @@ void HorizontalLayout::divideSpace(){ } } - itemsSumSize += layoutSpacing() * (visibleItemsCount-1); + itemsSumSize += layoutSpacingMM() * (visibleItemsCount-1); if (itemMode() == DesignMode && !layoutsChildren().isEmpty()){ qreal delta = (width() - (itemsSumSize+spaceBorder*2)); diff --git a/limereport/items/lrverticallayout.cpp b/limereport/items/lrverticallayout.cpp index 2e658b1..65d75d9 100644 --- a/limereport/items/lrverticallayout.cpp +++ b/limereport/items/lrverticallayout.cpp @@ -51,7 +51,7 @@ void VerticalLayout::updateLayoutSize() } } if (w>0) setWidth(w+spaceBorder*2); - setHeight(h + layoutSpacing() *(visibleItemCount-1)); + setHeight(h + layoutSpacingMM() *(visibleItemCount-1)); } void VerticalLayout::relocateChildren() @@ -69,7 +69,7 @@ void VerticalLayout::relocateChildren() foreach (BaseDesignIntf* item, layoutsChildren()) { if (item->isVisible() || itemMode() == DesignMode){ item->setPos(spaceBorder, curY); - curY+=item->height() + layoutSpacing(); + curY+=item->height() + layoutSpacingMM(); item->setWidth(width() - (spaceBorder * 2)); } } @@ -163,7 +163,7 @@ void VerticalLayout::divideSpace() } } - itemsSumSize += layoutSpacing() * (visibleItemsCount - 1); + itemsSumSize += layoutSpacingMM() * (visibleItemsCount - 1); qreal delta = (height() - (itemsSumSize+spaceBorder*2)) / (visibleItemsCount!=0 ? visibleItemsCount : 1); for (int i=0; i Date: Wed, 6 Feb 2019 19:09:32 +0300 Subject: [PATCH 249/347] Internationalization has been fixed --- limereport/objectinspector/lrobjectitemmodel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 2addb1e..212f48f 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -155,6 +155,7 @@ void QObjectPropertyModel::translatePropertyName() tr("hideIfEmpty"); tr("hideEmptyItems"); tr("useExternalPainter"); + tr("layoutSpacing"); } void QObjectPropertyModel::clearObjectsList() From d85b8bbd872bdcd59318189acb56d06edb7c4e16 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 6 Feb 2019 20:46:38 +0300 Subject: [PATCH 250/347] Typo has been fixed --- limereport/lrdatasourcemanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 95a1a02..6e2babc 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -468,7 +468,7 @@ QString DataSourceManager::replaceVariables(QString query, QMap query.replace(pos,rx.cap(0).length(), variable(varName).toString()); } else { query.replace(pos,rx.cap(0).length(), - QString(tr("Uknown parametr \"%1\" for variable \"%2\" found!") + QString(tr("Unknown parameter \"%1\" for variable \"%2\" found!") .arg(varName) .arg(varParam)) ); From 362c7217f31cd34753aced6101577fc8a0073fd5 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 6 Feb 2019 23:48:52 +0300 Subject: [PATCH 251/347] Multi printers print process has been added --- demo_r1/mainwindow.cpp | 8 ++ include/lrreportengine.h | 1 + limereport/lrpageitemdesignintf.cpp | 10 ++ limereport/lrpageitemdesignintf.h | 5 + limereport/lrreportengine.cpp | 203 +++++++++++++++++----------- limereport/lrreportengine.h | 1 + limereport/lrreportengine_p.h | 18 ++- 7 files changed, 167 insertions(+), 79 deletions(-) diff --git a/demo_r1/mainwindow.cpp b/demo_r1/mainwindow.cpp index 7f35de3..05488ce 100644 --- a/demo_r1/mainwindow.cpp +++ b/demo_r1/mainwindow.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #ifdef BUILD_WITH_EASY_PROFILER #include "easy/profiler.h" @@ -148,6 +149,13 @@ void MainWindow::on_pushButton_2_clicked() #ifdef BUILD_WITH_EASY_PROFILER profiler::dumpBlocksToFile("test.prof"); #endif +// QPrinter* printer = new QPrinter; +// QPrintDialog dialog(printer); +// if (dialog.exec()){ +// QMap printers; +// printers.insert("default",printer); +// report->printReport(printers); +// } report->previewReport(); } } diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 2abf45b..aa8bd6a 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -80,6 +80,7 @@ public: explicit ReportEngine(QObject *parent = 0); ~ReportEngine(); bool printReport(QPrinter *printer=0); + bool printReport(QMap printers); bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); PageDesignIntf *createPreviewScene(QObject *parent = 0); diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index d6e993c..0f8d98a 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -342,6 +342,16 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } +QString PageItemDesignIntf::printerName() const +{ + return m_printerName; +} + +void PageItemDesignIntf::setPrinterName(const QString& printerName) +{ + m_printerName = printerName; +} + bool PageItemDesignIntf::isPrintable() const { return m_printable; diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 24ab7ae..39c0fe3 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -60,6 +60,7 @@ class PageItemDesignIntf : public LimeReport::ItemsContainerDesignInft Q_PROPERTY(bool setPageSizeToPrinter READ getSetPageSizeToPrinter WRITE setSetPageSizeToPrinter ) Q_PROPERTY(bool endlessHeight READ endlessHeight WRITE setEndlessHeight) Q_PROPERTY(bool printable READ isPrintable WRITE setPrintable) + Q_PROPERTY(QString printerName READ printerName WRITE setPrinterName) friend class ReportRender; public: enum Orientation { Portrait = QPrinter::Portrait, Landscape = QPrinter::Landscape }; @@ -151,6 +152,9 @@ public: bool isPrintable() const; void setPrintable(bool printable); + QString printerName() const; + void setPrinterName(const QString& printerName); + signals: void beforeFirstPageRendered(); void afterLastPageRendered(); @@ -190,6 +194,7 @@ private: bool m_setPageSizeToPrinter; bool m_endlessHeight; bool m_printable; + QString m_printerName; }; typedef QList ReportPages; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 6c62d4a..c7a1233 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -289,19 +289,10 @@ void ReportEnginePrivate::printReport(ItemsReaderIntf::Ptr reader, QPrinter& pri void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) { - LimeReport::PageDesignIntf renderPage; - renderPage.setItemMode(PrintMode); - QPainter* painter=0; - - bool isFirst = true; int currenPage = 1; - - - qreal leftMargin, topMargin, rightMargin, bottomMargin; - printer.getPageMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin, QPrinter::Millimeter); - + QMap> printProcessors; + printProcessors.insert("default",QSharedPointer(new PrintProcessor(&printer))); foreach(PageItemDesignIntf::Ptr page, pages){ - if ( (printer.printRange() == QPrinter::AllPages) || ( (printer.printRange()==QPrinter::PageRange) && @@ -310,76 +301,32 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) ) ) { - - QPointF pagePos = page->pos(); - - page->setPos(0,0); - renderPage.setPageItem(page); - renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); - if (renderPage.pageItem()->oldPrintMode()){ - printer.setPageMargins(renderPage.pageItem()->leftMargin(), - renderPage.pageItem()->topMargin(), - renderPage.pageItem()->rightMargin(), - renderPage.pageItem()->bottomMargin(), - QPrinter::Millimeter); - printer.setOrientation(static_cast(renderPage.pageItem()->pageOrientation())); - QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? - QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): - renderPage.pageItem()->sizeMM(); - printer.setPaperSize(pageSize,QPrinter::Millimeter); - } else { - printer.setFullPage(renderPage.pageItem()->fullPage()); - printer.setOrientation(static_cast(renderPage.pageItem()->pageOrientation())); - if (renderPage.pageItem()->pageSize()==PageItemDesignIntf::Custom){ - QSizeF pageSize = (renderPage.pageItem()->pageOrientation()==PageItemDesignIntf::Landscape)? - QSizeF(renderPage.pageItem()->sizeMM().height(),renderPage.pageItem()->sizeMM().width()): - renderPage.pageItem()->sizeMM(); - if (page->getSetPageSizeToPrinter() || printer.outputFormat() == QPrinter::PdfFormat) - printer.setPaperSize(pageSize,QPrinter::Millimeter); - } else { - if (page->getSetPageSizeToPrinter() || printer.outputFormat() == QPrinter::PdfFormat) - printer.setPaperSize(static_cast(renderPage.pageItem()->pageSize())); - } - } - - if (!isFirst){ - printer.newPage(); - } else { - isFirst=false; - painter = new QPainter(&printer); - if (!painter->isActive()){ - delete painter; - return; - } - } - - QRectF printerPageRect = printer.pageRect(QPrinter::Millimeter); - printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR, - (printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR); - - if (printer.pageSize() != static_cast(page->pageSize()) && - printerPageRect.width() < page->geometry().width()) - { - qreal pageWidth = page->geometry().width(); - QRectF currentPrintingRect = printerPageRect; - while (pageWidth>0){ - renderPage.render(painter, printer.pageRect(), currentPrintingRect); - currentPrintingRect.adjust(printerPageRect.size().width(),0,printerPageRect.size().width(),0); - pageWidth -= printerPageRect.size().width(); - if (pageWidth>0) printer.newPage(); - } - - } else { - renderPage.render(painter); - } - - - page->setPos(pagePos); + printProcessors["default"]->printPage(page); } + currenPage++; + } +} + +void ReportEnginePrivate::printReport(ReportPages pages, QMap printers) +{ + if (printers.values().isEmpty()) return; + int currenPage = 1; + QMap> printProcessors; + for (int i = 0; i < printers.keys().count(); ++i) { + printProcessors.insert(printers.keys()[i],QSharedPointer(new PrintProcessor(printers[printers.keys()[i]]))); + } + + PrintProcessor* defaultProcessor = 0; + if (printProcessors.contains("default")) defaultProcessor = printProcessors["default"].data(); + else defaultProcessor = printProcessors.values().at(0).data(); + foreach(PageItemDesignIntf::Ptr page, pages){ + + if (printProcessors.contains(page->printerName())) + printProcessors[page->printerName()]->printPage(page); + else defaultProcessor->printPage(page); currenPage++; } - delete painter; } QStringList ReportEnginePrivate::aviableReportTranslations() @@ -437,6 +384,23 @@ bool ReportEnginePrivate::printReport(QPrinter* printer) } else return false; } +bool ReportEnginePrivate::printReport(QMap printers) +{ + try{ + bool designTime = dataManager()->designTime(); + dataManager()->setDesignTime(false); + ReportPages pages = renderToPages(); + dataManager()->setDesignTime(designTime); + if (pages.count()>0){ + printReport(pages,printers); + } + } catch(ReportError &exception){ + saveError(exception.what()); + return false; + } + return true; +} + bool ReportEnginePrivate::printPages(ReportPages pages, QPrinter *printer) { if (!printer&&!m_printerSelected){ @@ -1299,6 +1263,12 @@ bool ReportEngine::printReport(QPrinter *printer) return d->printReport(printer); } +bool ReportEngine::printReport(QMap printers) +{ + Q_D(ReportEngine); + return d->printReport(printers); +} + bool ReportEngine::printPages(ReportPages pages, QPrinter *printer){ Q_D(ReportEngine); return d->printPages(pages,printer); @@ -1553,5 +1523,84 @@ ScriptEngineManager*LimeReport::ReportEnginePrivate::scriptManager(){ return &ScriptEngineManager::instance(); } +PrintProcessor::PrintProcessor(QPrinter* printer) + : m_printer(printer), m_painter(new QPainter(m_printer)), m_firstPage(true) +{} + + +bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) +{ + if (m_painter && !m_painter->isActive()) return false; + LimeReport::PageDesignIntf renderPage; + + renderPage.setItemMode(PrintMode); + initPrinter(renderPage.pageItem()); + + QPointF backupPagePos = page->pos(); + page->setPos(0,0); + renderPage.setPageItem(page); + renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); + + if (!m_firstPage){ + m_printer->newPage(); + } else { + m_firstPage = false; + } + + qreal leftMargin, topMargin, rightMargin, bottomMargin; + m_printer->getPageMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin, QPrinter::Millimeter); + + QRectF printerPageRect = m_printer->pageRect(QPrinter::Millimeter); + printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR, + (printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR); + + if (m_printer->pageSize() != static_cast(page->pageSize()) && + printerPageRect.width() < page->geometry().width()) + { + qreal pageWidth = page->geometry().width(); + QRectF currentPrintingRect = printerPageRect; + while (pageWidth>0){ + renderPage.render(m_painter, m_printer->pageRect(), currentPrintingRect); + currentPrintingRect.adjust(printerPageRect.size().width(),0,printerPageRect.size().width(),0); + pageWidth -= printerPageRect.size().width(); + if (pageWidth>0) m_printer->newPage(); + } + + } else { + renderPage.render(m_painter); + } + page->setPos(backupPagePos); + return true; +} + +void PrintProcessor::initPrinter(PageItemDesignIntf* page) +{ + if (page->oldPrintMode()){ + m_printer->setPageMargins(page->leftMargin(), + page->topMargin(), + page->rightMargin(), + page->bottomMargin(), + QPrinter::Millimeter); + m_printer->setOrientation(static_cast(page->pageOrientation())); + QSizeF pageSize = (page->pageOrientation()==PageItemDesignIntf::Landscape)? + QSizeF(page->sizeMM().height(),page->sizeMM().width()): + page->sizeMM(); + m_printer->setPaperSize(pageSize,QPrinter::Millimeter); + } else { + m_printer->setFullPage(page->fullPage()); + m_printer->setOrientation(static_cast(page->pageOrientation())); + if (page->pageSize()==PageItemDesignIntf::Custom){ + QSizeF pageSize = (page->pageOrientation()==PageItemDesignIntf::Landscape)? + QSizeF(page->sizeMM().height(),page->sizeMM().width()): + page->sizeMM(); + if (page->getSetPageSizeToPrinter() || m_printer->outputFormat() == QPrinter::PdfFormat) + m_printer->setPaperSize(pageSize,QPrinter::Millimeter); + } else { + if (page->getSetPageSizeToPrinter() || m_printer->outputFormat() == QPrinter::PdfFormat) + m_printer->setPaperSize(static_cast(page->pageSize())); + } + } +} + }// namespace LimeReport diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 2abf45b..aa8bd6a 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -80,6 +80,7 @@ public: explicit ReportEngine(QObject *parent = 0); ~ReportEngine(); bool printReport(QPrinter *printer=0); + bool printReport(QMap printers); bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); PageDesignIntf *createPreviewScene(QObject *parent = 0); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 461fd69..93acb9b 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -93,6 +93,19 @@ public: virtual void setCurrentDesignerLanguage(QLocale::Language language) = 0; }; +class PrintProcessor{ +public: + explicit PrintProcessor(QPrinter* printer); + ~PrintProcessor(){ if (m_painter) delete m_painter;} + bool printPage(LimeReport::PageItemDesignIntf::Ptr page); +private: + void initPrinter(PageItemDesignIntf* page); +private: + QPrinter* m_printer; + QPainter* m_painter; + bool m_firstPage; +}; + class ReportEnginePrivate : public QObject, public ICollectionContainer, public ITranslationContainer, @@ -111,6 +124,7 @@ class ReportEnginePrivate : public QObject, public: static void printReport(ItemsReaderIntf::Ptr reader, QPrinter &printer); static void printReport(ReportPages pages, QPrinter &printer); + static void printReport(ReportPages pages, QMapprinters); Q_INVOKABLE QStringList aviableReportTranslations(); Q_INVOKABLE void setReportTranslation(const QString& languageName); public: @@ -134,6 +148,7 @@ public: void clearReport(); bool printReport(QPrinter *printer=0); + bool printReport(QMapprinters); bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); bool printToPDF(const QString& fileName); @@ -198,7 +213,7 @@ public: void setCurrentDesignerLanguage(QLocale::Language language); ScaleType previewScaleType(); int previewScalePercent(); - void setPreviewScaleType(const ScaleType &previewScaleType, int percent = 0); + void setPreviewScaleType(const ScaleType &previewScaleType, int percent = 0); signals: void pagesLoadFinished(); void datasourceCollectionLoadFinished(const QString& collectionName); @@ -216,7 +231,6 @@ signals: void getAviableLanguages(QList* languages); void currentDefaulLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); - void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); public slots: From a43368751c695403a2495e4b8dcac8722fa25f3b Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 9 Feb 2019 23:57:19 +0300 Subject: [PATCH 252/347] printToAllPrinters flag has been added to printReport method --- include/lrreportengine.h | 2 +- limereport/lrreportengine.cpp | 25 ++++++++++++++++--------- limereport/lrreportengine.h | 2 +- limereport/lrreportengine_p.h | 4 ++-- 4 files changed, 20 insertions(+), 13 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index aa8bd6a..178dcc2 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -80,7 +80,7 @@ public: explicit ReportEngine(QObject *parent = 0); ~ReportEngine(); bool printReport(QPrinter *printer=0); - bool printReport(QMap printers); + bool printReport(QMap printers, bool printToAllPrinters = false); bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); PageDesignIntf *createPreviewScene(QObject *parent = 0); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index c7a1233..7c3e104 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -307,7 +307,7 @@ void ReportEnginePrivate::printReport(ReportPages pages, QPrinter &printer) } } -void ReportEnginePrivate::printReport(ReportPages pages, QMap printers) +void ReportEnginePrivate::printReport(ReportPages pages, QMap printers, bool printToAllPrinters) { if (printers.values().isEmpty()) return; int currenPage = 1; @@ -317,13 +317,20 @@ void ReportEnginePrivate::printReport(ReportPages pages, QMapprinterName())) - printProcessors[page->printerName()]->printPage(page); - else defaultProcessor->printPage(page); + if (!printToAllPrinters){ + if (printProcessors.contains(page->printerName())) + printProcessors[page->printerName()]->printPage(page); + else defaultProcessor->printPage(page); + } else { + printProcessors.values().at(currentPrinter)->printPage(page); + if (currentPrinter < printers.values().count()-1) + currentPrinter++; + else currentPrinter = 0; + } currenPage++; } @@ -384,7 +391,7 @@ bool ReportEnginePrivate::printReport(QPrinter* printer) } else return false; } -bool ReportEnginePrivate::printReport(QMap printers) +bool ReportEnginePrivate::printReport(QMap printers, bool printToAllPrinters) { try{ bool designTime = dataManager()->designTime(); @@ -392,7 +399,7 @@ bool ReportEnginePrivate::printReport(QMap printers) ReportPages pages = renderToPages(); dataManager()->setDesignTime(designTime); if (pages.count()>0){ - printReport(pages,printers); + printReport(pages, printers, printToAllPrinters); } } catch(ReportError &exception){ saveError(exception.what()); @@ -1263,10 +1270,10 @@ bool ReportEngine::printReport(QPrinter *printer) return d->printReport(printer); } -bool ReportEngine::printReport(QMap printers) +bool ReportEngine::printReport(QMap printers, bool printToAllPrinters) { Q_D(ReportEngine); - return d->printReport(printers); + return d->printReport(printers, printToAllPrinters); } bool ReportEngine::printPages(ReportPages pages, QPrinter *printer){ diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index aa8bd6a..178dcc2 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -80,7 +80,7 @@ public: explicit ReportEngine(QObject *parent = 0); ~ReportEngine(); bool printReport(QPrinter *printer=0); - bool printReport(QMap printers); + bool printReport(QMap printers, bool printToAllPrinters = false); bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); PageDesignIntf *createPreviewScene(QObject *parent = 0); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 93acb9b..27aa8ff 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -124,7 +124,7 @@ class ReportEnginePrivate : public QObject, public: static void printReport(ItemsReaderIntf::Ptr reader, QPrinter &printer); static void printReport(ReportPages pages, QPrinter &printer); - static void printReport(ReportPages pages, QMapprinters); + static void printReport(ReportPages pages, QMapprinters, bool printToAllPrinters = false); Q_INVOKABLE QStringList aviableReportTranslations(); Q_INVOKABLE void setReportTranslation(const QString& languageName); public: @@ -148,7 +148,7 @@ public: void clearReport(); bool printReport(QPrinter *printer=0); - bool printReport(QMapprinters); + bool printReport(QMapprinters, bool printToAllPrinters); bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); bool printToPDF(const QString& fileName); From 931f09384848c5eb1c8112f8973caf5a4ddd6c30 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 10 Feb 2019 04:50:04 +0300 Subject: [PATCH 253/347] Russian translation has been updated --- translations/limereport_ru.qm | Bin 119638 -> 120040 bytes translations/limereport_ru.ts | 48 ++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index aa82093da4e9e32b51a035b5c7afa1bfe12005ef..e93b12c696cdedb7200a98965b5885142282b74d 100644 GIT binary patch delta 5667 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 diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 9d72224..93c2128 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -704,6 +704,10 @@ p, li { white-space: pre-wrap; } Datasource with name "%1" already exists! Источник данных "%1" уже существует! + + Unknown parameter "%1" for variable "%2" found! + Обнаружен неизвестный параметр "%1" для переменной "%2"! + LimeReport::DataSourceModel @@ -1880,6 +1884,10 @@ p, li { white-space: pre-wrap; } useExternalPainter Использовать внешний отрисовщик + + layoutSpacing + Интервал + LimeReport::RectMMPropItem @@ -2568,14 +2576,6 @@ This preview is no longer valid. Horizontal grid step Горизонтальный шаг сетки - - Designer Setting - Настройки дизайнера - - - Report Setting - Настройки отчета - Suppress absent fields and variables warning Не выводить сообщения об отсутствии полей или переменных @@ -2588,6 +2588,26 @@ This preview is no longer valid. Use dark theme Использовать Темную тему + + Designer settings + Настройки дизайнера + + + Script editor settings + Настройки редактора скриптов + + + Font + Шрифт + + + Indent size + Отступ + + + Report settings + Настройки отчета + LimeReport::SubDetailBand @@ -2694,22 +2714,10 @@ This preview is no longer valid. Content Содержимое - - Editor settings - Настройки - - - Editor font - Шрифт редактора - Cancel Отмена - - ... - ... - Ok Ок From 8ba0449019e5ef7c0819751531f15c413899da68 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 10 Feb 2019 04:50:40 +0300 Subject: [PATCH 254/347] Layout spacing has been fixed --- limereport/items/lrabstractlayout.cpp | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/limereport/items/lrabstractlayout.cpp b/limereport/items/lrabstractlayout.cpp index 43e749e..02d8e97 100644 --- a/limereport/items/lrabstractlayout.cpp +++ b/limereport/items/lrabstractlayout.cpp @@ -225,12 +225,8 @@ void AbstractLayout::objectLoadFinished() bool AbstractLayout::isNeedUpdateSize(RenderPass pass) const { - foreach (QGraphicsItem *child, childItems()) { - BaseDesignIntf* item = dynamic_cast(child); - if (item && (item->isNeedUpdateSize(pass) || item->isEmpty())) - return true; - } - return false; + Q_UNUSED(pass) + return true; } QVariant AbstractLayout::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant& value) @@ -251,7 +247,8 @@ void AbstractLayout::updateItemSize(DataSourceManager* dataManager, RenderPass p ItemDesignIntf::updateItemSize(dataManager, pass, maxHeight); foreach(QGraphicsItem *child, childItems()){ BaseDesignIntf* item = dynamic_cast(child); - if (item) item->updateItemSize(dataManager, pass, maxHeight); + if (item && item->isNeedUpdateSize(pass)) + item->updateItemSize(dataManager, pass, maxHeight); } updateLayoutSize(); relocateChildren(); @@ -300,7 +297,7 @@ void AbstractLayout::slotOnChildDestroy(QObject* child) void AbstractLayout::slotOnChildGeometryChanged(QObject* item, QRectF newGeometry, QRectF oldGeometry) { - if (!m_isRelocating){ + if (!m_isRelocating && !isLoading()){ if (m_layoutType == Layout){ relocateChildren(); updateLayoutSize(); @@ -343,12 +340,15 @@ int AbstractLayout::layoutSpacing() const void AbstractLayout::setLayoutSpacing(int layoutSpacing) { - if (m_layoutSpacing != layoutSpacing){ + if (m_layoutSpacing != layoutSpacing){ int oldValue = m_layoutSpacing; m_layoutSpacing = layoutSpacing; - int delta = (m_layoutSpacing - oldValue) * (m_children.count()-1); - notify("layoutSpacing", oldValue, m_layoutSpacing); - setWidth(width() + delta); + if (!isLoading()){ + int delta = (m_layoutSpacing - oldValue) * (m_children.count()-1); + notify("layoutSpacing", oldValue, m_layoutSpacing); + setWidth(width() + delta); + } + relocateChildren(); } } From d2ba19019b3337adb66e70eadfd1fbf4c9f3fdcf Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Feb 2019 04:36:49 +0300 Subject: [PATCH 255/347] Print process has been fixed --- limereport/lrreportengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 7c3e104..8454f5a 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1539,7 +1539,7 @@ bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) { if (m_painter && !m_painter->isActive()) return false; LimeReport::PageDesignIntf renderPage; - + renderPage.setPageItem(page); renderPage.setItemMode(PrintMode); initPrinter(renderPage.pageItem()); From e87b78030ef4b80cc06bcb88dd134a3d435f3ae2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Feb 2019 04:39:12 +0300 Subject: [PATCH 256/347] Redundant code has been removed --- limereport/lrreportengine.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 8454f5a..75751bc 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1545,7 +1545,6 @@ bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) QPointF backupPagePos = page->pos(); page->setPos(0,0); - renderPage.setPageItem(page); renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); if (!m_firstPage){ From b839694e59989a681d045d56fffddc2fd85fac5c Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Feb 2019 19:28:38 +0300 Subject: [PATCH 257/347] Print process has been fixed --- limereport/lrreportengine.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 75751bc..0d83e30 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1531,25 +1531,28 @@ ScriptEngineManager*LimeReport::ReportEnginePrivate::scriptManager(){ } PrintProcessor::PrintProcessor(QPrinter* printer) - : m_printer(printer), m_painter(new QPainter(m_printer)), m_firstPage(true) + : m_printer(printer), m_painter(0), m_firstPage(true) {} bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) { - if (m_painter && !m_painter->isActive()) return false; + if (!m_firstPage && !m_painter->isActive()) return false; + LimeReport::PageDesignIntf renderPage; - renderPage.setPageItem(page); renderPage.setItemMode(PrintMode); - initPrinter(renderPage.pageItem()); QPointF backupPagePos = page->pos(); page->setPos(0,0); + renderPage.setPageItem(page); renderPage.setSceneRect(renderPage.pageItem()->mapToScene(renderPage.pageItem()->rect()).boundingRect()); + initPrinter(renderPage.pageItem()); if (!m_firstPage){ m_printer->newPage(); } else { + m_painter = new QPainter(m_printer); + if (!m_painter->isActive()) return false; m_firstPage = false; } From edbba49114be2cf4d77515aa578fbb349733fa22 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Feb 2019 22:28:16 +0300 Subject: [PATCH 258/347] Save and restore of Designer widget have been fixed --- limereport/lrreportdesignwidget.cpp | 26 +++++++++++++++++--------- limereport/lrreportdesignwidget.h | 2 +- limereport/lrreportdesignwindow.cpp | 5 +++-- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index f13ed02..343789a 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -178,16 +178,16 @@ void ReportDesignWidget::setUseMagnet(bool useMagnet) } } -void ReportDesignWidget::saveState(QSettings* settings) +void ReportDesignWidget::saveState() { - settings->beginGroup("DesignerWidget"); - settings->setValue("hGridStep",m_horizontalGridStep); - settings->setValue("vGridStep",m_verticalGridStep); - settings->setValue("defaultFont",m_defaultFont); - settings->setValue("useGrid",m_useGrid); - settings->setValue("useDarkTheme",m_useDarkTheme); - settings->setValue("ScriptEditorState", m_scriptEditor->saveState()); - settings->endGroup(); + m_settings->beginGroup("DesignerWidget"); + m_settings->setValue("hGridStep",m_horizontalGridStep); + m_settings->setValue("vGridStep",m_verticalGridStep); + m_settings->setValue("defaultFont",m_defaultFont); + m_settings->setValue("useGrid",m_useGrid); + m_settings->setValue("useDarkTheme",m_useDarkTheme); + m_settings->setValue("ScriptEditorState", m_scriptEditor->saveState()); + m_settings->endGroup(); } void ReportDesignWidget::applySettings() @@ -284,6 +284,14 @@ void ReportDesignWidget::createTabs(){ } m_scriptEditor = new ScriptEditor(this); + +// m_settings->beginGroup("DesignerWidget"); +// QVariant v = m_settings->value("ScriptEditorState"); +// if (v.isValid()){ +// m_scriptEditor->restoreState(v.toByteArray()); +// } +// m_settings->endGroup(); + connect(m_scriptEditor, SIGNAL(textChanged()), this, SLOT(slotScriptTextChanged())); m_scriptEditor->setReportEngine(m_report); pageIndex = m_tabWidget->addTab(m_scriptEditor,QIcon(),tr("Script")); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index f1b092c..7f41456 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -112,7 +112,7 @@ public: bool emitSaveReport(); bool emitSaveReportAs(); bool emitLoadReport(); - void saveState(QSettings *settings); + void saveState(); void loadState(); void applySettings(); void applyUseGrid(); diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 3aa1660..a6524c9 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -650,6 +650,7 @@ void ReportDesignWindow::updateRedoUndo() void ReportDesignWindow::startNewReport() { + m_reportDesignWidget->saveState(); m_reportDesignWidget->clear(); m_reportDesignWidget->createStartPage(); m_lblReportName->setText(""); @@ -663,6 +664,7 @@ void ReportDesignWindow::startNewReport() showDefaultToolBars(); m_reportDesignWidget->report()->dataManager()->dropChanges(); m_reportDesignWidget->report()->scriptContext()->dropChanges(); + m_reportDesignWidget->loadState(); } @@ -670,7 +672,6 @@ void ReportDesignWindow::writePosition() { settings()->beginGroup("DesignerWindow"); settings()->setValue("Geometry",saveGeometry()); -// settings()->setValue("State",saveState()); settings()->endGroup(); } @@ -706,7 +707,7 @@ void ReportDesignWindow::writeState() ++it; } settings()->endGroup(); - m_reportDesignWidget->saveState(settings()); + m_reportDesignWidget->saveState(); } void ReportDesignWindow::createRecentFilesMenu() From 9be042819b40f4a6fe8ccb7c8a10075dd913fb93 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Feb 2019 22:28:43 +0300 Subject: [PATCH 259/347] Script editor has been fixed --- limereport/scripteditor/lrscripteditor.cpp | 38 ++++++++++++---------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index 5f96a33..c1a7141 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -204,24 +204,27 @@ void ReportStructureCompleater::addAdditionalDatawords(QStandardItemModel* model } if (it.value().isQObject()){ if (it.value().toQObject()){ - QStandardItem* objectNode = new QStandardItem; - objectNode->setText(it.name()); - for (int i = 0; i< it.value().toQObject()->metaObject()->methodCount();++i){ - if (it.value().toQObject()->metaObject()->method(i).methodType() == QMetaMethod::Method){ - QStandardItem* methodNode = new QStandardItem; - QMetaMethod m = it.value().toQObject()->metaObject()->method(i); - QString methodSignature = m.name() + "("; - bool isFirst = true; - for (int j = 0; j < m.parameterCount(); ++j){ - methodSignature += (isFirst ? "" : ",") + m.parameterTypes()[j]+" "+m.parameterNames()[j]; - if (isFirst) isFirst = false; + if (model->findItems(it.name()).isEmpty()){ + QStandardItem* objectNode = new QStandardItem; + objectNode->setText(it.name()); + objectNode->setIcon(QIcon(":/report/images/object")); + for (int i = 0; i< it.value().toQObject()->metaObject()->methodCount();++i){ + if (it.value().toQObject()->metaObject()->method(i).methodType() == QMetaMethod::Method){ + QStandardItem* methodNode = new QStandardItem; + QMetaMethod m = it.value().toQObject()->metaObject()->method(i); + QString methodSignature = m.name() + "("; + bool isFirst = true; + for (int j = 0; j < m.parameterCount(); ++j){ + methodSignature += (isFirst ? "" : ",") + m.parameterTypes()[j]+" "+m.parameterNames()[j]; + if (isFirst) isFirst = false; + } + methodSignature += ")"; + methodNode->setText(methodSignature); + objectNode->appendRow(methodNode); } - methodSignature += ")"; - methodNode->setText(methodSignature); - objectNode->appendRow(methodNode); } + model->invisibleRootItem()->appendRow(objectNode); } - model->invisibleRootItem()->appendRow(objectNode); } } } @@ -235,7 +238,6 @@ void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterfa m_model.clear(); QIcon signalIcon(":/report/images/signal"); QIcon propertyIcon(":/report/images/property"); - addAdditionalDatawords(&m_model, report->dataManager()); for ( int i = 0; i < report->pageCount(); ++i){ PageDesignIntf* page = report->pageAt(i); @@ -262,8 +264,10 @@ void ReportStructureCompleater::updateCompleaterModel(ReportEnginePrivateInterfa foreach (BaseDesignIntf* item, page->pageItem()->childBaseItems()){ addChildItem(item, itemNode->text(), m_model.invisibleRootItem()); } - } + + addAdditionalDatawords(&m_model, report->dataManager()); + m_model.sort(0); } } From 3aee2b62d73f307e54b090785ca1236573124b67 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Feb 2019 22:45:35 +0300 Subject: [PATCH 260/347] TOC Refactored --- limereport/lrbanddesignintf.cpp | 13 ------------- limereport/lrbanddesignintf.h | 6 ------ limereport/lrbasedesignintf.cpp | 14 ++++++++++++++ limereport/lrbasedesignintf.h | 16 +++++++++++++++- limereport/lritemscontainerdesignitf.h | 5 +++-- limereport/lrreportrender.cpp | 10 +++++----- limereport/lrscriptenginemanager.cpp | 4 ++++ limereport/lrscriptenginemanager.h | 2 +- 8 files changed, 42 insertions(+), 28 deletions(-) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index a0a73fe..c77f86c 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -184,13 +184,6 @@ QString BandDesignIntf::translateBandName(const BaseDesignIntf* item) const{ } } -void BandDesignIntf::copyBookmarks(BandDesignIntf* sourceBand) -{ - foreach(QString key, sourceBand->bookmarks()){ - addBookmark(key,sourceBand->getBookMark(key)); - } -} - void BandDesignIntf::setBackgroundModeProperty(BaseDesignIntf::BGMode value) { if (value!=backgroundMode()){ @@ -843,12 +836,6 @@ qreal BandDesignIntf::bottomSpace() const return height()-findMaxBottom(); } -QVariant BandDesignIntf::getBookMark(const QString& key){ - if (m_bookmarks.contains(key)) - return m_bookmarks.value(key); - else return QVariant(); -} - void BandDesignIntf::slotPropertyObjectNameChanged(const QString &, const QString& newName) { update(); diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index dcdeac8..16009a5 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -248,12 +248,6 @@ public: qreal bottomSpace() const; void setBackgroundModeProperty(BGMode value); void setBackgroundOpacity(int value); - - void addBookmark(const QString& key, const QVariant& value){ m_bookmarks.insert(key, value);} - QList bookmarks(){ return m_bookmarks.keys();} - QVariant getBookMark(const QString& key); - void copyBookmarks(BandDesignIntf* sourceBand); - int bootomSpace() const; void setBootomSpace(int bootomSpace); signals: diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index cb8cdac..0cb6c09 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -1639,4 +1639,18 @@ QMap BaseDesignIntf::getStringForTranslation(){ return QMap(); } +QVariant BookmarkContainerDesignIntf::getBookMark(const QString& key) +{ + if (m_bookmarks.contains(key)) + return m_bookmarks.value(key); + else return QVariant(); +} + +void BookmarkContainerDesignIntf::copyBookmarks(BookmarkContainerDesignIntf* source) +{ + foreach(QString key, source->bookmarks()){ + addBookmark(key,source->getBookMark(key)); + } +} + } //namespace LimeReport diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 1c00f0e..9bfb288 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -356,6 +356,7 @@ protected: void addChildItems(QList* list); qreal calcAbsolutePosY(qreal currentOffset, BaseDesignIntf* item); qreal calcAbsolutePosX(qreal currentOffset, BaseDesignIntf* item); + private: void updateSelectionMarker(); int resizeDirectionFlags(QPointF position); @@ -414,7 +415,7 @@ private: BaseDesignIntf* m_patternItem; bool m_fillInSecondPass; bool m_watermark; - + signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanging(QObject* object, QPointF newPos, QPointF oldPos); @@ -434,6 +435,19 @@ signals: void afterRender(); }; +class BookmarkContainerDesignIntf: public BaseDesignIntf{ + Q_OBJECT +public: + BookmarkContainerDesignIntf(const QString& storageTypeName, QObject* owner = 0, QGraphicsItem* parent = 0) + :BaseDesignIntf(storageTypeName, owner, parent){} + void addBookmark(const QString& key, const QVariant& value){ m_bookmarks.insert(key, value);} + QList bookmarks(){ return m_bookmarks.keys();} + QVariant getBookMark(const QString& key); + void copyBookmarks(BookmarkContainerDesignIntf* source); +private: + QMap m_bookmarks; +}; + } //namespace LimeReport #endif // LRBASEDESIGNINTF_H diff --git a/limereport/lritemscontainerdesignitf.h b/limereport/lritemscontainerdesignitf.h index ff5c2e2..b9aa421 100644 --- a/limereport/lritemscontainerdesignitf.h +++ b/limereport/lritemscontainerdesignitf.h @@ -37,10 +37,11 @@ struct ItemSortContainer { typedef QSharedPointer< ItemSortContainer > PItemSortContainer; bool itemSortContainerLessThen(const PItemSortContainer c1, const PItemSortContainer c2); -class ItemsContainerDesignInft : public BaseDesignIntf{ +class ItemsContainerDesignInft : public BookmarkContainerDesignIntf{ + Q_OBJECT public: ItemsContainerDesignInft(const QString& xmlTypeName, QObject* owner = 0, QGraphicsItem* parent=0): - BaseDesignIntf(xmlTypeName, owner, parent){} + BookmarkContainerDesignIntf(xmlTypeName, owner, parent){} protected: void snapshotItemsLayout(); void arrangeSubItems(RenderPass pass, DataSourceManager *dataManager, ArrangeType type = AsNeeded); diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 6f01c71..7c3ed0a 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -1112,21 +1112,21 @@ BandDesignIntf* ReportRender::sliceBand(BandDesignIntf *band, BandDesignIntf* pa } void ReportRender::updateTOC(BaseDesignIntf* item, int pageNumber){ - BandDesignIntf* band = dynamic_cast(item); - if (band){ + BookmarkContainerDesignIntf* bookmarkContainer = dynamic_cast(item); + if (bookmarkContainer){ TableOfContents* toc = m_scriptEngineContext->tableOfContents(); - foreach (QString key, band->bookmarks()){ - toc->setItem(key, band->getBookMark(key).toString(), pageNumber); + foreach (QString key, bookmarkContainer->bookmarks()){ + toc->setItem(key, bookmarkContainer->getBookMark(key).toString(), pageNumber); } } } void ReportRender::secondRenderPass(ReportPages renderedPages) { - if (!m_scriptEngineContext->tableOfContents()->isEmpty()){ for(int i=0; ichildBaseItems()){ updateTOC(item, m_pagesRanges.findPageNumber(i)); } diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 9079b71..18f113b 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -553,6 +553,9 @@ void ScriptEngineManager::addTableOfContentsItem(const QString& uniqKey, const Q m_context->tableOfContents()->setItem(uniqKey, content, 0, indent); if (currentBand) currentBand->addBookmark(uniqKey, content); + else if (m_context->getCurrentPage()) { + m_context->getCurrentPage()->addBookmark(uniqKey, content); + } } } @@ -1236,6 +1239,7 @@ PageItemDesignIntf* ScriptEngineContext::getCurrentPage() const void ScriptEngineContext::setCurrentPage(PageItemDesignIntf* currentPage) { m_currentPage = currentPage; + m_currentBand = 0; } BandDesignIntf* ScriptEngineContext::getCurrentBand() const diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 0295055..bb60dee 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -175,7 +175,7 @@ public: typedef QSharedPointer DialogPtr; #endif explicit ScriptEngineContext(QObject* parent=0): - QObject(parent), + QObject(parent), m_currentBand(0), m_currentPage(0), m_tableOfContents(new TableOfContents(this)), m_hasChanges(false) {} #ifdef HAVE_UI_LOADER void addDialog(const QString& name, const QByteArray& description); From 397005f010a3553f985cfedf6db47d7794b22190 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Feb 2019 22:59:26 +0300 Subject: [PATCH 261/347] Rendering pages has been fixed --- limereport/lrreportengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 0d83e30..07a743d 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1153,7 +1153,7 @@ ReportPages ReportEnginePrivate::renderToPages() m_reportRender->setDatasources(dataManager()); m_reportRender->setScriptContext(scriptContext()); - + m_renderingPages.clear(); foreach (PageDesignIntf* page, m_pages) { PageItemDesignIntf* rp = createRenderingPage(page->pageItem()); m_renderingPages.append(rp); From 47ae56ab265dc41863a92262e336789e173aed9e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Feb 2019 23:07:24 +0300 Subject: [PATCH 262/347] printerName has exported for translation --- limereport/lrreportengine.cpp | 1 - limereport/objectinspector/lrobjectitemmodel.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 07a743d..2c3890c 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1150,7 +1150,6 @@ ReportPages ReportEnginePrivate::renderToPages() #endif ReportPages result; m_reportRendering = true; - m_reportRender->setDatasources(dataManager()); m_reportRender->setScriptContext(scriptContext()); m_renderingPages.clear(); diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 212f48f..22d147a 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -156,6 +156,7 @@ void QObjectPropertyModel::translatePropertyName() tr("hideEmptyItems"); tr("useExternalPainter"); tr("layoutSpacing"); + tr("printerName"); } void QObjectPropertyModel::clearObjectsList() From 7a512eca0b7c7d0ff96db88248bafd2e4ff98c0b Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 14 Feb 2019 00:21:57 +0300 Subject: [PATCH 263/347] Property filter has been added --- limereport/lrreportdesignwindow.cpp | 28 +++++++++++++++++-- limereport/lrreportdesignwindow.h | 10 ++++++- .../lrobjectinspectorwidget.cpp | 2 +- .../objectinspector/lrobjectitemmodel.cpp | 2 ++ .../objectinspector/lrpropertydelegate.cpp | 4 +-- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index a6524c9..8a795f3 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -40,6 +40,8 @@ #include #include #include +#include +#include #include "lrreportdesignwindow.h" #include "lrbandsmanager.h" @@ -504,13 +506,23 @@ void ReportDesignWindow::createObjectInspector() m_validator = new ObjectNameValidator(); m_propertyModel->setValidator(m_validator); m_propertyModel->setSubclassesAsLevel(false); -// connect(m_propertyModel,SIGNAL(objectPropetyChanged(QString,QVariant,QVariant)),this,SLOT(slotItemDataChanged(QString,QVariant,QVariant))); - m_objectInspector->setModel(m_propertyModel); + m_filterModel = new PropertyFilterModel(this); + m_filterModel->setSourceModel(m_propertyModel); + m_filterModel->setFilterRegExp(QRegExp("", Qt::CaseInsensitive, QRegExp::FixedString)); + m_filterModel->setRecursiveFilteringEnabled(false); + m_objectInspector->setModel(m_filterModel); m_objectInspector->setAlternatingRowColors(true); m_objectInspector->setRootIsDecorated(!m_propertyModel->subclassesAsLevel()); QDockWidget *objectDoc = new QDockWidget(this); QWidget* w = new QWidget(objectDoc); QVBoxLayout* l = new QVBoxLayout(w); + QLineEdit* le = new QLineEdit(w); + le->setPlaceholderText(tr("Filter")); + connect(le, SIGNAL(textChanged(const QString&)), this, SLOT(slotFilterTextChanged(const QString&))); +// QHBoxLayout* h = new QHBoxLayout(w); +// h->addWidget(new QLabel(tr("Filter"))); +// h->addWidget(le); + l->addWidget(le); l->addWidget(m_objectInspector); l->setContentsMargins(2,2,2,2); w->setLayout(l); @@ -1470,6 +1482,11 @@ void ReportDesignWindow::slotPageDeleted() m_deletePageAction->setEnabled(m_reportDesignWidget->report()->pageCount()>1); } +void ReportDesignWindow::slotFilterTextChanged(const QString& filter) +{ + m_filterModel->setFilterRegExp(QRegExp(filter, Qt::CaseInsensitive, QRegExp::FixedString)); +} + #ifdef HAVE_QTDESIGNER_INTEGRATION void ReportDesignWindow::slotDeleteDialog() { @@ -1541,5 +1558,12 @@ bool ObjectNameValidator::validate(const QString &propName, const QVariant &prop return true; } +bool PropertyFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); + if (sourceParent.isValid()) return true; + return sourceModel()->data(index).toString().contains(filterRegExp()); +} + } diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index e7cd514..f3bf87e 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -120,6 +120,7 @@ private slots: void slotLoadRecentFile(const QString fileName); void slotPageAdded(PageDesignIntf* ); void slotPageDeleted(); + void slotFilterTextChanged(const QString& filter); #ifdef HAVE_QTDESIGNER_INTEGRATION void slotDeleteDialog(); void slotAddNewDialog(); @@ -273,12 +274,19 @@ private: bool m_reportItemIsLocked; QMap m_leftDocVisibleState; QMap m_rightDocVisibleState; - + QSortFilterProxyModel* m_filterModel; }; class ObjectNameValidator : public ValidatorIntf{ bool validate(const QString &propName, const QVariant &propValue, QObject *object, QString &msg); }; + +class PropertyFilterModel: public QSortFilterProxyModel{ +public: + PropertyFilterModel(QObject* parent = 0): QSortFilterProxyModel(parent){} +protected: + bool filterAcceptsRow(int sourceRow,const QModelIndex &sourceParent) const; +}; } #endif // LRREPORTEDITORWINDOW_H diff --git a/limereport/objectinspector/lrobjectinspectorwidget.cpp b/limereport/objectinspector/lrobjectinspectorwidget.cpp index 325ec1e..81de3e9 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.cpp +++ b/limereport/objectinspector/lrobjectinspectorwidget.cpp @@ -134,7 +134,7 @@ void ObjectInspectorWidget::reset() ObjectPropItem * ObjectInspectorWidget::nodeFromIndex(QModelIndex index) const { - return static_cast(index.internalPointer()); + return qvariant_cast(index.data(Qt::UserRole)); } void ObjectInspectorWidget::keyPressEvent(QKeyEvent *event) diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 22d147a..b4d429c 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -303,6 +303,8 @@ QVariant QObjectPropertyModel::data(const QModelIndex &index, int role) const return node->iconValue(); }else return QIcon(); break; + case Qt::UserRole: + return QVariant::fromValue(node); default: return QVariant(); } diff --git a/limereport/objectinspector/lrpropertydelegate.cpp b/limereport/objectinspector/lrpropertydelegate.cpp index acb9c20..5270200 100644 --- a/limereport/objectinspector/lrpropertydelegate.cpp +++ b/limereport/objectinspector/lrpropertydelegate.cpp @@ -51,7 +51,7 @@ void LimeReport::PropertyDelegate::paint(QPainter *painter, const QStyleOptionVi QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); - LimeReport::ObjectPropItem *node = static_cast(index.internalPointer()); + LimeReport::ObjectPropItem *node = qvariant_cast(index.data(Qt::UserRole)); if (node){ if (!node->isHaveValue()){ if (index.column()==0) { @@ -137,7 +137,7 @@ QSize LimeReport::PropertyDelegate::sizeHint(const QStyleOptionViewItem &option, QWidget * LimeReport::PropertyDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const { - m_editingItem=static_cast(index.internalPointer()); + m_editingItem = qvariant_cast(index.data(Qt::UserRole)); connect(m_editingItem,SIGNAL(destroyed(QObject*)), this, SLOT(slotItemDeleted(QObject*))); QWidget *editor=m_editingItem->createProperyEditor(parent); if (editor){ From 5f9ee85dba8fd3827efba7b5e671be59aec7379e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 14 Feb 2019 16:48:31 +0300 Subject: [PATCH 264/347] Clear button has been added --- limereport/lrreportdesignwindow.cpp | 13 +++++++++---- limereport/objectinspector/images/clear.png | Bin 959 -> 168 bytes 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 8a795f3..607af45 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include "lrreportdesignwindow.h" #include "lrbandsmanager.h" @@ -517,12 +518,16 @@ void ReportDesignWindow::createObjectInspector() QWidget* w = new QWidget(objectDoc); QVBoxLayout* l = new QVBoxLayout(w); QLineEdit* le = new QLineEdit(w); + QPushButton * pbClear = new QPushButton(QIcon(":/items/clear.png"),"",w); + pbClear->setToolTip(tr("Clear")); + connect(pbClear, SIGNAL(clicked()), le, SLOT(clear())); le->setPlaceholderText(tr("Filter")); connect(le, SIGNAL(textChanged(const QString&)), this, SLOT(slotFilterTextChanged(const QString&))); -// QHBoxLayout* h = new QHBoxLayout(w); -// h->addWidget(new QLabel(tr("Filter"))); -// h->addWidget(le); - l->addWidget(le); + QHBoxLayout* h = new QHBoxLayout(); + h->setSpacing(2); + h->addWidget(le); + h->addWidget(pbClear); + l->addLayout(h); l->addWidget(m_objectInspector); l->setContentsMargins(2,2,2,2); w->setLayout(l); diff --git a/limereport/objectinspector/images/clear.png b/limereport/objectinspector/images/clear.png index d6c0c3112560eca4e6b3e7ac393a0c38c06b5ddb..b72a5a5d155fc7037913ba34e1ffa83988815991 100644 GIT binary patch delta 151 zcmdnbzJhUrWIY=L1B3kM|A|0~Ey>&61xN$IPv_nBK#H@#BeIx*fm;}a85w5HkpK#^ zmw5WRvOi|x;}T~N$S$@43YmJkIEGl9PEJ@LVDM;?#@+n?@-y$ht(YLVp7Dhg2jh%J vA0B32iH|>LPx!p@QEMQx8}9-x28N{TJQ4!GDw380ObP0l+XkK)PpS4 literal 959 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>f2fPOcEiU|=}AUU6B8;=%&O?hu9+KZallh7EOk6XW@S_HFNFn3W=Q zdW~TnE9<5fhU3fldl*$p;ewvkwSBrkqu2WCzJF5w|Gm$(y%s==`Vtu4 zT~+RIW!Too@ad-Ry<;M~CNMldC;s5H;>E3cKm`zRVTalIjm$e{3Bd$FbU_ru?W3x< z_6rQ7-q7uNPbVX)p`bo_qUAxe~S3^H1N}Hx7&w>?w$;KaoP6E z9jh1T)UNFneS9hX)?vLjmsRf_l)ZIO{_+m#XV)@r9Td28Q0DDT$D0S0o?myqzSr{M zX_uP^bYEPHe{kCU_CbsP|Nnn`mt_ldOjt>fA1F$pV0mqnr{L9eN%;d`8ChmMdAqwbr0$&uj9doJ0*}aI1_qUvAj}w`^85!-kiEpy*OmPN zH;XVIx2f8=IQN{F#mlT2TQU zo~+!>1w9@*%^FTFJ~n!Gj!d4@mxL_Z;xkDnrlr$SFEY;2(A9Hhqo~rMV+$tDnznA% z#FfVm@QFQ02snS~#JP)S&R$M>(2{lfx}Jv4B~87Hte?Mp;pOo@eM-AWYjuxfjc~AW zad(#Y>RD0Q($Urn8um6Xp1j#RcJJ!hyW5xBd35fbzP*3_{QbN8XF5A59PzQ8tib&D z!GwTR1!;y^N0n3x!nh5AzELf4jVMV;EJ?LWE=mPb3`PcqX1az3x`t*UMn+Z!=2k`~ o+6Kl}1_pI6t2Ux&$jwj5OsmALfq%;(UZ4gBPgg&ebxsLQ0JAz$y#N3J From 4208b98f4a2596105e2db1450cab536989917fc2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 14 Feb 2019 20:50:01 +0300 Subject: [PATCH 265/347] ObjectInspector has been wrapped by QWidget --- limereport/lrreportdesignwindow.cpp | 64 +++----- limereport/lrreportdesignwindow.h | 9 +- .../lrobjectinspectorwidget.cpp | 139 ++++++++++++++++-- .../objectinspector/lrobjectinspectorwidget.h | 43 +++++- .../objectinspector/lrpropertydelegate.cpp | 2 +- .../objectinspector/lrpropertydelegate.h | 6 +- 6 files changed, 195 insertions(+), 68 deletions(-) diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 607af45..be7cb77 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -503,31 +503,16 @@ void ReportDesignWindow::initReportEditor(ReportEnginePrivateInterface* report) void ReportDesignWindow::createObjectInspector() { m_objectInspector = new ObjectInspectorWidget(this); - m_propertyModel = new BaseDesignPropertyModel(this); + //m_propertyModel = new BaseDesignPropertyModel(this); m_validator = new ObjectNameValidator(); - m_propertyModel->setValidator(m_validator); - m_propertyModel->setSubclassesAsLevel(false); - m_filterModel = new PropertyFilterModel(this); - m_filterModel->setSourceModel(m_propertyModel); - m_filterModel->setFilterRegExp(QRegExp("", Qt::CaseInsensitive, QRegExp::FixedString)); - m_filterModel->setRecursiveFilteringEnabled(false); - m_objectInspector->setModel(m_filterModel); + m_objectInspector->setValidator(m_validator); + m_objectInspector->setSubclassesAsLevel(false); + //m_objectInspector->setModel(m_propertyModel); m_objectInspector->setAlternatingRowColors(true); - m_objectInspector->setRootIsDecorated(!m_propertyModel->subclassesAsLevel()); + m_objectInspector->setRootIsDecorated(!m_objectInspector->subclassesAsLevel()); QDockWidget *objectDoc = new QDockWidget(this); QWidget* w = new QWidget(objectDoc); QVBoxLayout* l = new QVBoxLayout(w); - QLineEdit* le = new QLineEdit(w); - QPushButton * pbClear = new QPushButton(QIcon(":/items/clear.png"),"",w); - pbClear->setToolTip(tr("Clear")); - connect(pbClear, SIGNAL(clicked()), le, SLOT(clear())); - le->setPlaceholderText(tr("Filter")); - connect(le, SIGNAL(textChanged(const QString&)), this, SLOT(slotFilterTextChanged(const QString&))); - QHBoxLayout* h = new QHBoxLayout(); - h->setSpacing(2); - h->addWidget(le); - h->addWidget(pbClear); - l->addLayout(h); l->addWidget(m_objectInspector); l->setContentsMargins(2,2,2,2); w->setLayout(l); @@ -707,11 +692,11 @@ void ReportDesignWindow::writeState() setDocWidgetsVisibility(true); m_editorsStates[m_editorTabType] = saveState(); - settings()->setValue("PageEditorsState", m_editorsStates[ReportDesignWidget::Page]); - settings()->setValue("DialogEditorsState", m_editorsStates[ReportDesignWidget::Dialog]); - settings()->setValue("ScriptEditorsState", m_editorsStates[ReportDesignWidget::Script]); - settings()->setValue("TranslationEditorsState", m_editorsStates[ReportDesignWidget::Translations]); - settings()->setValue("InspectorFirsColumnWidth",m_objectInspector->columnWidth(0)); + settings()->setValue("PageEditorsState", m_editorsStates[ReportDesignWidget::Page]); + settings()->setValue("DialogEditorsState", m_editorsStates[ReportDesignWidget::Dialog]); + settings()->setValue("ScriptEditorsState", m_editorsStates[ReportDesignWidget::Script]); + settings()->setValue("TranslationEditorsState", m_editorsStates[ReportDesignWidget::Translations]); + settings()->setValue("InspectorFirsColumnWidth", m_objectInspector->columnWidth(0)); settings()->endGroup(); settings()->beginGroup("RecentFiles"); settings()->setValue("filesCount",m_recentFiles.count()); @@ -950,7 +935,7 @@ void ReportDesignWindow::slotNewBand(int bandType) void ReportDesignWindow::slotItemSelected(LimeReport::BaseDesignIntf *item) { - if (m_propertyModel->currentObject()!=item){ + if (m_objectInspector->currentObject()!=item){ m_newSubDetail->setEnabled(false); m_newSubDetailHeader->setEnabled(false); @@ -961,9 +946,9 @@ void ReportDesignWindow::slotItemSelected(LimeReport::BaseDesignIntf *item) m_newDataFooter->setEnabled(false); m_objectInspector->commitActiveEditorData(); - m_propertyModel->setObject(item); + m_objectInspector->setObject(item); - if (m_propertyModel->subclassesAsLevel()) + if (m_objectInspector->subclassesAsLevel()) m_objectInspector->expandToDepth(0); QSet bs; @@ -997,7 +982,7 @@ void ReportDesignWindow::slotItemSelected(LimeReport::BaseDesignIntf *item) m_fontEditorBar->setItem(item); m_textAlignmentEditorBar->setItem(item); m_itemsBordersEditorBar->setItem(item); - } else {m_propertyModel->clearObjectsList();} + } else {m_objectInspector->clearObjectsList();} } void ReportDesignWindow::slotItemPropertyChanged(const QString &objectName, const QString &propertyName, const QVariant& oldValue, const QVariant& newValue ) @@ -1005,8 +990,8 @@ void ReportDesignWindow::slotItemPropertyChanged(const QString &objectName, cons Q_UNUSED(oldValue) Q_UNUSED(newValue) - if (m_propertyModel->currentObject()&&(m_propertyModel->currentObject()->objectName()==objectName)){ - m_propertyModel->updateProperty(propertyName); + if (m_objectInspector->currentObject()&&(m_objectInspector->currentObject()->objectName()==objectName)){ + m_objectInspector->updateProperty(propertyName); } } @@ -1019,8 +1004,8 @@ void ReportDesignWindow::slotMultiItemSelected() QObject* oi = dynamic_cast(gi); if (oi) selectionList.append(oi); } - m_propertyModel->setMultiObjects(&selectionList); - if (m_propertyModel->subclassesAsLevel()) + m_objectInspector->setMultiObjects(&selectionList); + if (m_objectInspector->subclassesAsLevel()) m_objectInspector->expandToDepth(0); } @@ -1112,7 +1097,7 @@ void ReportDesignWindow::slotLoadReport() m_reportDesignWidget->clear(); if (m_reportDesignWidget->loadFromFile(fileName)){ m_lblReportName->setText(fileName); - m_propertyModel->setObject(0); + m_objectInspector->setObject(0); updateRedoUndo(); setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); if (!m_recentFiles.contains(fileName)){ @@ -1336,7 +1321,7 @@ void ReportDesignWindow::showDefaultEditors(){ void ReportDesignWindow::slotActivePageChanged() { - m_propertyModel->setObject(0); + m_objectInspector->setObject(0); updateRedoUndo(); updateAvaibleBands(); @@ -1464,7 +1449,7 @@ void ReportDesignWindow::slotLoadRecentFile(const QString fileName) m_reportDesignWidget->clear(); m_reportDesignWidget->loadFromFile(fileName); m_lblReportName->setText(fileName); - m_propertyModel->setObject(0); + m_objectInspector->setObject(0); updateRedoUndo(); unsetCursor(); setWindowTitle(m_reportDesignWidget->report()->reportName() + " - Lime Report Designer"); @@ -1563,12 +1548,5 @@ bool ObjectNameValidator::validate(const QString &propName, const QVariant &prop return true; } -bool PropertyFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const -{ - QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); - if (sourceParent.isValid()) return true; - return sourceModel()->data(index).toString().contains(filterRegExp()); -} - } diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index f3bf87e..18df464 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -238,7 +238,7 @@ private: QSignalMapper* m_recentFilesSignalMap; ObjectInspectorWidget* m_objectInspector; - QObjectPropertyModel* m_propertyModel; + //QObjectPropertyModel* m_propertyModel; ReportDesignWidget* m_reportDesignWidget; DataBrowser * m_dataBrowser; @@ -281,12 +281,5 @@ class ObjectNameValidator : public ValidatorIntf{ bool validate(const QString &propName, const QVariant &propValue, QObject *object, QString &msg); }; - -class PropertyFilterModel: public QSortFilterProxyModel{ -public: - PropertyFilterModel(QObject* parent = 0): QSortFilterProxyModel(parent){} -protected: - bool filterAcceptsRow(int sourceRow,const QModelIndex &sourceParent) const; -}; } #endif // LRREPORTEDITORWINDOW_H diff --git a/limereport/objectinspector/lrobjectinspectorwidget.cpp b/limereport/objectinspector/lrobjectinspectorwidget.cpp index 81de3e9..4ca3fff 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.cpp +++ b/limereport/objectinspector/lrobjectinspectorwidget.cpp @@ -30,6 +30,10 @@ #include #include #include +#include +#include +#include +#include #include "lrglobal.h" #include "lrobjectinspectorwidget.h" @@ -37,7 +41,7 @@ namespace LimeReport{ -ObjectInspectorWidget::ObjectInspectorWidget(QWidget *parent) +ObjectInspectorTreeView::ObjectInspectorTreeView(QWidget *parent) :QTreeView(parent), m_propertyDelegate(0) { setRootIsDecorated(false); @@ -54,9 +58,9 @@ ObjectInspectorWidget::ObjectInspectorWidget(QWidget *parent) setPalette(p); } -ObjectInspectorWidget::~ObjectInspectorWidget(){} +ObjectInspectorTreeView::~ObjectInspectorTreeView(){} -void ObjectInspectorWidget::drawRow(QPainter *painter, const QStyleOptionViewItem &options, const QModelIndex &index) const +void ObjectInspectorTreeView::drawRow(QPainter *painter, const QStyleOptionViewItem &options, const QModelIndex &index) const { ObjectPropItem *node = nodeFromIndex(index); StyleOptionViewItem so = options; @@ -84,7 +88,7 @@ void ObjectInspectorWidget::drawRow(QPainter *painter, const QStyleOptionViewIte painter->restore(); } -void ObjectInspectorWidget::mousePressEvent(QMouseEvent *event) +void ObjectInspectorTreeView::mousePressEvent(QMouseEvent *event) { if ((event->button()==Qt::LeftButton)){ @@ -106,7 +110,7 @@ void ObjectInspectorWidget::mousePressEvent(QMouseEvent *event) QTreeView::mousePressEvent(event); } -void ObjectInspectorWidget::initColorMap() +void ObjectInspectorTreeView::initColorMap() { m_colors.reserve(6); m_colors.push_back(QColor(255,230,191)); @@ -117,12 +121,12 @@ void ObjectInspectorWidget::initColorMap() m_colors.push_back(QColor(255,191,239)); } -QColor ObjectInspectorWidget::getColor(const int index) const +QColor ObjectInspectorTreeView::getColor(const int index) const { return m_colors[index]; } -void ObjectInspectorWidget::reset() +void ObjectInspectorTreeView::reset() { QTreeView::reset(); for (int i=0;irowCount();i++){ @@ -132,12 +136,12 @@ void ObjectInspectorWidget::reset() } } -ObjectPropItem * ObjectInspectorWidget::nodeFromIndex(QModelIndex index) const +ObjectPropItem * ObjectInspectorTreeView::nodeFromIndex(QModelIndex index) const { return qvariant_cast(index.data(Qt::UserRole)); } -void ObjectInspectorWidget::keyPressEvent(QKeyEvent *event) +void ObjectInspectorTreeView::keyPressEvent(QKeyEvent *event) { if (event->key()==Qt::Key_Return){ if(!m_propertyDelegate->isEditing()){ @@ -149,10 +153,125 @@ void ObjectInspectorWidget::keyPressEvent(QKeyEvent *event) } else QTreeView::keyPressEvent(event); } -void ObjectInspectorWidget::commitActiveEditorData(){ +void ObjectInspectorTreeView::commitActiveEditorData(){ if (state()==QAbstractItemView::EditingState){ commitData(indexWidget(currentIndex())); } } +bool PropertyFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const +{ + QModelIndex index = sourceModel()->index(sourceRow, 0, sourceParent); + if (sourceParent.isValid()) return true; + return sourceModel()->data(index).toString().contains(filterRegExp()); +} + +ObjectInspectorWidget::ObjectInspectorWidget(QWidget *parent) + :QWidget(parent), m_filterModel(0) +{ + m_objectInspectorView = new ObjectInspectorTreeView(this); + m_propertyModel = new BaseDesignPropertyModel(this); + m_filterModel = new PropertyFilterModel(this); + m_filterModel->setSourceModel(m_propertyModel); + m_filterModel->setFilterRegExp(QRegExp("", Qt::CaseInsensitive, QRegExp::FixedString)); + m_objectInspectorView->setModel(m_filterModel); + QVBoxLayout* l = new QVBoxLayout(); + QLineEdit* le = new QLineEdit(this); + QPushButton * pbClear = new QPushButton(QIcon(":/items/clear.png"),"",this); + pbClear->setToolTip(tr("Clear")); + connect(pbClear, SIGNAL(clicked()), le, SLOT(clear())); + le->setPlaceholderText(tr("Filter")); + connect(le, SIGNAL(textChanged(const QString&)), this, SLOT(slotFilterTextChanged(const QString&))); + QHBoxLayout* h = new QHBoxLayout(); + h->setSpacing(2); + h->addWidget(le); + h->addWidget(pbClear); + l->addLayout(h); + l->addWidget(m_objectInspectorView); + l->setContentsMargins(2,2,2,2); + this->setLayout(l); +} + +void ObjectInspectorWidget::setModel(QAbstractItemModel *model) +{ + + m_filterModel->setSourceModel(model); + +} + +void ObjectInspectorWidget::setAlternatingRowColors(bool value) +{ + m_objectInspectorView->setAlternatingRowColors(value); +} + +void ObjectInspectorWidget::setRootIsDecorated(bool value) +{ + m_objectInspectorView->setRootIsDecorated(value); +} + +void ObjectInspectorWidget::setColumnWidth(int column, int width) +{ + m_objectInspectorView->setColumnWidth(column, width); +} + +int ObjectInspectorWidget::columnWidth(int column) +{ + return m_objectInspectorView->columnWidth(column); +} + +void ObjectInspectorWidget::expandToDepth(int depth) +{ + m_objectInspectorView->expandToDepth(depth); +} + +void ObjectInspectorWidget::commitActiveEditorData() +{ + m_objectInspectorView->commitActiveEditorData(); +} + +void ObjectInspectorWidget::setValidator(ValidatorIntf *validator) +{ + m_propertyModel->setValidator(validator); +} + +bool ObjectInspectorWidget::subclassesAsLevel() +{ + return m_propertyModel->subclassesAsLevel(); +} + +void ObjectInspectorWidget::setSubclassesAsLevel(bool value) +{ + m_propertyModel->setSubclassesAsLevel(value); +} + +const QObject *ObjectInspectorWidget::currentObject(){ + return m_propertyModel->currentObject(); +} + +void ObjectInspectorWidget::setObject(QObject *object) +{ + m_propertyModel->setObject(object); +} + +void ObjectInspectorWidget::setMultiObjects(QList *list) +{ + m_propertyModel->setMultiObjects(list); +} + +void ObjectInspectorWidget::clearObjectsList() +{ + m_propertyModel->clearObjectsList(); +} + +void ObjectInspectorWidget::updateProperty(const QString &propertyName) +{ + m_propertyModel->updateProperty(propertyName); +} + +void ObjectInspectorWidget::slotFilterTextChanged(const QString &filter) +{ + if (m_filterModel) + m_filterModel->setFilterRegExp(QRegExp(filter, Qt::CaseInsensitive, QRegExp::FixedString)); +} + } //namespace LimeReport diff --git a/limereport/objectinspector/lrobjectinspectorwidget.h b/limereport/objectinspector/lrobjectinspectorwidget.h index d6e4495..fcb0c48 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.h +++ b/limereport/objectinspector/lrobjectinspectorwidget.h @@ -32,17 +32,20 @@ #include #include +#include + #include "lrobjectitemmodel.h" +#include "lrbasedesignobjectmodel.h" #include "lrpropertydelegate.h" namespace LimeReport{ -class ObjectInspectorWidget : public QTreeView +class ObjectInspectorTreeView : public QTreeView { Q_OBJECT public: - ObjectInspectorWidget(QWidget * parent=0); - ~ObjectInspectorWidget(); + ObjectInspectorTreeView(QWidget * parent=0); + ~ObjectInspectorTreeView(); QColor getColor(const int index) const; virtual void reset(); virtual void commitActiveEditorData(); @@ -59,6 +62,40 @@ private: PropertyDelegate *m_propertyDelegate; }; +class PropertyFilterModel: public QSortFilterProxyModel{ +public: + PropertyFilterModel(QObject* parent = 0): QSortFilterProxyModel(parent){} +protected: + bool filterAcceptsRow(int sourceRow,const QModelIndex &sourceParent) const; +}; + +class ObjectInspectorWidget: public QWidget{ + Q_OBJECT +public: + ObjectInspectorWidget(QWidget* parent = 0); + void setModel(QAbstractItemModel* model); + void setAlternatingRowColors(bool value); + void setRootIsDecorated(bool value); + void setColumnWidth(int column, int width); + int columnWidth(int column); + void expandToDepth(int depth); + void commitActiveEditorData(); + void setValidator(ValidatorIntf *validator); + bool subclassesAsLevel(); + void setSubclassesAsLevel(bool value); + void setObject(QObject* object); + const QObject* currentObject(); + void setMultiObjects(QList* list); + void clearObjectsList(); + void updateProperty(const QString &propertyName); +private slots: + void slotFilterTextChanged(const QString& filter); +private: + ObjectInspectorTreeView* m_objectInspectorView; + QSortFilterProxyModel* m_filterModel; + BaseDesignPropertyModel* m_propertyModel; +}; + } //namespace LimeReport #endif // LROBJECTINSPECTORWIDGET_H diff --git a/limereport/objectinspector/lrpropertydelegate.cpp b/limereport/objectinspector/lrpropertydelegate.cpp index 5270200..3a67cdc 100644 --- a/limereport/objectinspector/lrpropertydelegate.cpp +++ b/limereport/objectinspector/lrpropertydelegate.cpp @@ -173,7 +173,7 @@ void LimeReport::PropertyDelegate::updateEditorGeometry(QWidget *editor, const Q if (m_editingItem) m_editingItem->updateEditorGeometry(editor,option,index); } -void LimeReport::PropertyDelegate::setObjectInspector(ObjectInspectorWidget* objectInspector) +void LimeReport::PropertyDelegate::setObjectInspector(ObjectInspectorTreeView* objectInspector) { m_objectInspector=objectInspector; } diff --git a/limereport/objectinspector/lrpropertydelegate.h b/limereport/objectinspector/lrpropertydelegate.h index d9d9b66..b64cdae 100644 --- a/limereport/objectinspector/lrpropertydelegate.h +++ b/limereport/objectinspector/lrpropertydelegate.h @@ -39,14 +39,14 @@ namespace LimeReport{ -class ObjectInspectorWidget; +class ObjectInspectorTreeView; //class PropertyDelegate : public QItemDelegate class PropertyDelegate : public QStyledItemDelegate { Q_OBJECT public: PropertyDelegate(QObject *parent=0); - void setObjectInspector(ObjectInspectorWidget* objectInspector); + void setObjectInspector(ObjectInspectorTreeView* objectInspector); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const; @@ -60,7 +60,7 @@ private slots: void slotEditorDeleted(); void slotItemDeleted(QObject* item); private: - LimeReport::ObjectInspectorWidget* m_objectInspector; + LimeReport::ObjectInspectorTreeView* m_objectInspector; mutable LimeReport::ObjectPropItem* m_editingItem; mutable bool m_isEditing; }; From deddd22eb4efeddfa655aa9d2f367b55e6a3feae Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 14 Feb 2019 20:51:30 +0300 Subject: [PATCH 266/347] Comments have been removed --- limereport/lrreportdesignwindow.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index be7cb77..517628a 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -503,11 +503,9 @@ void ReportDesignWindow::initReportEditor(ReportEnginePrivateInterface* report) void ReportDesignWindow::createObjectInspector() { m_objectInspector = new ObjectInspectorWidget(this); - //m_propertyModel = new BaseDesignPropertyModel(this); m_validator = new ObjectNameValidator(); m_objectInspector->setValidator(m_validator); m_objectInspector->setSubclassesAsLevel(false); - //m_objectInspector->setModel(m_propertyModel); m_objectInspector->setAlternatingRowColors(true); m_objectInspector->setRootIsDecorated(!m_objectInspector->subclassesAsLevel()); QDockWidget *objectDoc = new QDockWidget(this); @@ -615,6 +613,7 @@ void ReportDesignWindow::createDialogDesignerToolBar() } #endif + void ReportDesignWindow::createDataWindow() { QDockWidget *dataDoc = new QDockWidget(this); From 2bbd963c18d7b431df310addadda8a5e87997e29 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 14 Feb 2019 21:00:33 +0300 Subject: [PATCH 267/347] currentObject -> object --- limereport/lrreportdesignwindow.cpp | 4 ++-- limereport/lrreportdesignwindow.h | 2 -- limereport/objectinspector/lrobjectinspectorwidget.cpp | 2 +- limereport/objectinspector/lrobjectinspectorwidget.h | 4 ++-- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 517628a..5eba0e7 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -934,7 +934,7 @@ void ReportDesignWindow::slotNewBand(int bandType) void ReportDesignWindow::slotItemSelected(LimeReport::BaseDesignIntf *item) { - if (m_objectInspector->currentObject()!=item){ + if (m_objectInspector->object()!=item){ m_newSubDetail->setEnabled(false); m_newSubDetailHeader->setEnabled(false); @@ -989,7 +989,7 @@ void ReportDesignWindow::slotItemPropertyChanged(const QString &objectName, cons Q_UNUSED(oldValue) Q_UNUSED(newValue) - if (m_objectInspector->currentObject()&&(m_objectInspector->currentObject()->objectName()==objectName)){ + if (m_objectInspector->object()&&(m_objectInspector->object()->objectName()==objectName)){ m_objectInspector->updateProperty(propertyName); } } diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index 18df464..d5dc790 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -238,8 +238,6 @@ private: QSignalMapper* m_recentFilesSignalMap; ObjectInspectorWidget* m_objectInspector; - //QObjectPropertyModel* m_propertyModel; - ReportDesignWidget* m_reportDesignWidget; DataBrowser * m_dataBrowser; ScriptBrowser* m_scriptBrowser; diff --git a/limereport/objectinspector/lrobjectinspectorwidget.cpp b/limereport/objectinspector/lrobjectinspectorwidget.cpp index 4ca3fff..cfc528a 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.cpp +++ b/limereport/objectinspector/lrobjectinspectorwidget.cpp @@ -244,7 +244,7 @@ void ObjectInspectorWidget::setSubclassesAsLevel(bool value) m_propertyModel->setSubclassesAsLevel(value); } -const QObject *ObjectInspectorWidget::currentObject(){ +const QObject *ObjectInspectorWidget::object(){ return m_propertyModel->currentObject(); } diff --git a/limereport/objectinspector/lrobjectinspectorwidget.h b/limereport/objectinspector/lrobjectinspectorwidget.h index fcb0c48..88ef97a 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.h +++ b/limereport/objectinspector/lrobjectinspectorwidget.h @@ -83,8 +83,8 @@ public: void setValidator(ValidatorIntf *validator); bool subclassesAsLevel(); void setSubclassesAsLevel(bool value); - void setObject(QObject* object); - const QObject* currentObject(); + void setObject(QObject* setObject); + const QObject* object(); void setMultiObjects(QList* list); void clearObjectsList(); void updateProperty(const QString &propertyName); From 4e9170138752d9954ae37e422dd0990534c2a4a6 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 18 Feb 2019 13:55:53 +0300 Subject: [PATCH 268/347] ObjectInspector QPushButton -> QToolButton --- limereport/objectinspector/lrobjectinspectorwidget.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/limereport/objectinspector/lrobjectinspectorwidget.cpp b/limereport/objectinspector/lrobjectinspectorwidget.cpp index cfc528a..2fbfff0 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.cpp +++ b/limereport/objectinspector/lrobjectinspectorwidget.cpp @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include "lrglobal.h" #include "lrobjectinspectorwidget.h" @@ -177,8 +177,9 @@ ObjectInspectorWidget::ObjectInspectorWidget(QWidget *parent) m_objectInspectorView->setModel(m_filterModel); QVBoxLayout* l = new QVBoxLayout(); QLineEdit* le = new QLineEdit(this); - QPushButton * pbClear = new QPushButton(QIcon(":/items/clear.png"),"",this); + QToolButton * pbClear = new QToolButton(this); pbClear->setToolTip(tr("Clear")); + pbClear->setIcon(QIcon(":/items/clear.png")); connect(pbClear, SIGNAL(clicked()), le, SLOT(clear())); le->setPlaceholderText(tr("Filter")); connect(le, SIGNAL(textChanged(const QString&)), this, SLOT(slotFilterTextChanged(const QString&))); @@ -189,6 +190,7 @@ ObjectInspectorWidget::ObjectInspectorWidget(QWidget *parent) l->addLayout(h); l->addWidget(m_objectInspectorView); l->setContentsMargins(2,2,2,2); + l->setSpacing(2); this->setLayout(l); } From b8900b1e96ac0de3e81810ff76d972fa5614c2f2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 18 Feb 2019 15:16:55 +0300 Subject: [PATCH 269/347] Added the ability to change the background color of the preview page --- include/lrpreviewreportwidget.h | 5 ++++- include/lrreportengine.h | 1 + limereport/lrpreviewreportwidget.cpp | 13 ++++++++++++- limereport/lrpreviewreportwidget.h | 5 ++++- limereport/lrpreviewreportwidget_p.h | 4 ++-- limereport/lrpreviewreportwindow.cpp | 13 ++++++++++++- limereport/lrpreviewreportwindow.h | 4 ++-- limereport/lrreportengine.cpp | 20 +++++++++++++++++++- limereport/lrreportengine.h | 1 + limereport/lrreportengine_p.h | 3 +++ 10 files changed, 60 insertions(+), 9 deletions(-) diff --git a/include/lrpreviewreportwidget.h b/include/lrpreviewreportwidget.h index 395af7d..306af9c 100644 --- a/include/lrpreviewreportwidget.h +++ b/include/lrpreviewreportwidget.h @@ -29,6 +29,8 @@ public: ScaleType scaleType() const; int scalePercent() const; void setScaleType(const ScaleType &scaleType, int percent = 0); + void setPreviewPageBackgroundColor(QColor color); + QColor previewPageBackgroundColor(); public slots: void refreshPages(); void zoomIn(); @@ -67,7 +69,8 @@ private: PreviewReportWidgetPrivate* d_ptr; ScaleType m_scaleType; int m_scalePercent; - QTimer m_resizeTimer; + QTimer m_resizeTimer; + QColor m_previewPageBackgroundColor; }; } // namespace LimeReport diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 178dcc2..a36d1b0 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -107,6 +107,7 @@ public: PreviewReportWidget *createPreviewWidget(QWidget *parent = 0); void setPreviewWindowTitle(const QString& title); void setPreviewWindowIcon(const QIcon& icon); + void setPreviewPageBackgroundColor(QColor color); void setResultEditable(bool value); bool resultIsEditable(); bool isBusy(); diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index fb24404..6799a62 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -71,7 +71,7 @@ QList PreviewReportWidgetPrivate::aviableExporters() PreviewReportWidget::PreviewReportWidget(ReportEngine *report, QWidget *parent) : QWidget(parent), ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this)), - m_scaleType(FitWidth), m_scalePercent(0) + m_scaleType(FitWidth), m_scalePercent(0), m_previewPageBackgroundColor(Qt::white) { ui->setupUi(this); d_ptr->m_report = report->d_ptr; @@ -127,6 +127,7 @@ void PreviewReportWidget::initPreview() ui->graphicsView->setScene(d_ptr->m_previewPage); ui->graphicsView->resetMatrix(); ui->graphicsView->centerOn(0, 0); + ui->graphicsView->scene()->setBackgroundBrush(QColor(m_previewPageBackgroundColor)); setScalePercent(d_ptr->m_scalePercent); } @@ -322,6 +323,16 @@ void PreviewReportWidget::setScaleType(const ScaleType &scaleType, int percent) m_scalePercent = percent; } +void PreviewReportWidget::setPreviewPageBackgroundColor(QColor color) +{ + m_previewPageBackgroundColor = color; +} + +QColor PreviewReportWidget::previewPageBackgroundColor() +{ + return m_previewPageBackgroundColor; +} + void PreviewReportWidget::refreshPages() { if (d_ptr->m_report){ diff --git a/limereport/lrpreviewreportwidget.h b/limereport/lrpreviewreportwidget.h index 395af7d..306af9c 100644 --- a/limereport/lrpreviewreportwidget.h +++ b/limereport/lrpreviewreportwidget.h @@ -29,6 +29,8 @@ public: ScaleType scaleType() const; int scalePercent() const; void setScaleType(const ScaleType &scaleType, int percent = 0); + void setPreviewPageBackgroundColor(QColor color); + QColor previewPageBackgroundColor(); public slots: void refreshPages(); void zoomIn(); @@ -67,7 +69,8 @@ private: PreviewReportWidgetPrivate* d_ptr; ScaleType m_scaleType; int m_scalePercent; - QTimer m_resizeTimer; + QTimer m_resizeTimer; + QColor m_previewPageBackgroundColor; }; } // namespace LimeReport diff --git a/limereport/lrpreviewreportwidget_p.h b/limereport/lrpreviewreportwidget_p.h index c7c2ce1..078ce5e 100644 --- a/limereport/lrpreviewreportwidget_p.h +++ b/limereport/lrpreviewreportwidget_p.h @@ -15,7 +15,7 @@ public: PreviewReportWidgetPrivate(PreviewReportWidget* previewReportWidget): m_previewPage(NULL), m_report(NULL), m_zoomer(NULL), m_currentPage(1), m_changingPage(false), m_priorScrolValue(0), m_scalePercent(50), - q_ptr(previewReportWidget) {} + q_ptr(previewReportWidget), m_previePageColor(Qt::white) {} bool pageIsVisible(); QRectF calcPageShift(); void setPages( ReportPages pages); @@ -31,7 +31,7 @@ public: int m_priorScrolValue; int m_scalePercent; PreviewReportWidget* q_ptr; - + QColor m_previePageColor; }; } diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index c81591e..71fed64 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -47,7 +47,8 @@ namespace LimeReport{ PreviewReportWindow::PreviewReportWindow(ReportEngine *report, QWidget *parent, QSettings *settings, Qt::WindowFlags flags) : QMainWindow(parent,flags), - ui(new Ui::PreviewReportWindow), m_settings(settings), m_ownedSettings(false), m_scalePercentChanging(false) + ui(new Ui::PreviewReportWindow), m_settings(settings), m_ownedSettings(false), + m_scalePercentChanging(false) { ui->setupUi(this); setWindowTitle("Lime Report Preview"); @@ -362,6 +363,16 @@ void PreviewReportWindow::setPreviewScaleType(const ScaleType &previewScaleType, m_previewReportWidget->setScaleType(previewScaleType, percent); } +QColor PreviewReportWindow::previewPageBackgroundColor() +{ + return m_previewReportWidget->previewPageBackgroundColor(); +} + +void PreviewReportWindow::setPreviewPageBackgroundColor(QColor color) +{ + m_previewReportWidget->setPreviewPageBackgroundColor(color); +} + void PreviewReportWindow::on_actionSaveToFile_triggered() { m_previewReportWidget->saveToFile(); diff --git a/limereport/lrpreviewreportwindow.h b/limereport/lrpreviewreportwindow.h index a42ccde..dc210ce 100644 --- a/limereport/lrpreviewreportwindow.h +++ b/limereport/lrpreviewreportwindow.h @@ -73,7 +73,8 @@ public: QSettings* settings(); ScaleType previewScaleType() const; void setPreviewScaleType(const ScaleType &previewScaleType, int percent = 0); - + QColor previewPageBackgroundColor(); + void setPreviewPageBackgroundColor(QColor color); protected: void writeSetting(); void restoreSetting(); @@ -124,7 +125,6 @@ private: ScaleType m_previewScaleType; int m_previewScalePercent; bool m_scalePercentChanging; - }; } //namespace LimeReport #endif // LRPREVIEWREPORTWINDOW_H diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 2c3890c..9591c13 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -82,7 +82,8 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_reportRendering(false), m_resultIsEditable(true), m_passPhrase("HjccbzHjlbyfCkjy"), m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage), m_previewLayoutDirection(Qt::LayoutDirectionAuto), m_designerFactory(0), - m_previewScaleType(FitWidth), m_previewScalePercent(0), m_startTOCPage(0) + m_previewScaleType(FitWidth), m_previewScalePercent(0), m_startTOCPage(0), + m_previewPageBackgroundColor(Qt::white) { #ifdef HAVE_STATIC_BUILD initResources(); @@ -503,6 +504,7 @@ void ReportEnginePrivate::previewReport(PreviewHints hints) if (pages.count()>0){ Q_Q(ReportEngine); PreviewReportWindow* w = new PreviewReportWindow(q,0,settings()); + w->setPreviewPageBackgroundColor(m_previewPageBackgroundColor); w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint| Qt::WindowMinMaxButtonsHint); w->setAttribute(Qt::WA_DeleteOnClose,true); w->setWindowModality(Qt::ApplicationModal); @@ -1094,6 +1096,16 @@ void ReportEnginePrivate::setPreviewWindowTitle(const QString &previewWindowTitl m_previewWindowTitle = previewWindowTitle; } +QColor ReportEnginePrivate::previewWindowPageBackground() +{ + return m_previewPageBackgroundColor; +} + +void ReportEnginePrivate::setPreviewWindowPageBackground(QColor color) +{ + m_previewPageBackgroundColor = color; +} + QIcon ReportEnginePrivate::previewWindowIcon() const { return m_previewWindowIcon; @@ -1338,6 +1350,12 @@ void ReportEngine::setPreviewWindowIcon(const QIcon &icon) d->setPreviewWindowIcon(icon); } +void ReportEngine::setPreviewPageBackgroundColor(QColor color) +{ + Q_D(ReportEngine); + d->setPreviewWindowPageBackground(color); +} + void ReportEngine::setResultEditable(bool value) { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 178dcc2..a36d1b0 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -107,6 +107,7 @@ public: PreviewReportWidget *createPreviewWidget(QWidget *parent = 0); void setPreviewWindowTitle(const QString& title); void setPreviewWindowIcon(const QIcon& icon); + void setPreviewPageBackgroundColor(QColor color); void setResultEditable(bool value); bool resultIsEditable(); bool isBusy(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 27aa8ff..1813f81 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -189,6 +189,8 @@ public: void setPreviewWindowIcon(const QIcon &previewWindowIcon); QString previewWindowTitle() const; void setPreviewWindowTitle(const QString &previewWindowTitle); + QColor previewWindowPageBackground(); + void setPreviewWindowPageBackground(QColor color); bool suppressFieldAndVarError() const; void setSuppressFieldAndVarError(bool suppressFieldAndVarError); @@ -299,6 +301,7 @@ private: ScaleType m_previewScaleType; int m_previewScalePercent; int m_startTOCPage; + QColor m_previewPageBackgroundColor; }; } From 0a0e1504fa5b0711ef78d70e3081c3c0d1d87920 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 18 Feb 2019 18:31:32 +0300 Subject: [PATCH 270/347] Script object naming has been fixed --- limereport/lrscriptenginemanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 18f113b..c73b660 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1304,7 +1304,7 @@ void ScriptEngineContext::baseDesignIntfToScript(const QString& pageName, BaseDe engine->newQObject(sItem, item); } else { sItem = engine->newQObject(item); - engine->globalObject().setProperty(pageName+"_"+item->patternName(),sItem); + engine->globalObject().setProperty(on,sItem); } #endif foreach(BaseDesignIntf* child, item->childBaseItems()){ From e0ef984fcaddac42e105bed494a056a75b0b4a37 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 19 Feb 2019 02:23:53 +0300 Subject: [PATCH 271/347] Building for different script engine has been fixed --- common.pri | 1 + include/lrglobal.h | 24 +--------------- include/lrscriptenginemanagerintf.h | 36 ++++++++++++++++++++++-- limereport/items/lrtextitem.cpp | 3 -- limereport/lrglobal.h | 24 +--------------- limereport/lrreportengine.cpp | 7 ++++- limereport/lrreportrender.cpp | 7 ++--- limereport/lrscriptenginemanager.cpp | 39 ++++++++++++++++++++------ limereport/lrscriptenginemanager.h | 12 ++++---- limereport/lrscriptenginemanagerintf.h | 36 ++++++++++++++++++++++-- 10 files changed, 114 insertions(+), 75 deletions(-) diff --git a/common.pri b/common.pri index 3e4ae74..dca1d40 100644 --- a/common.pri +++ b/common.pri @@ -47,6 +47,7 @@ lessThan(QT_MAJOR_VERSION, 5){ contains(CONFIG, qtscriptengine){ CONFIG -= qjsengine QT *= script + DEFINES *= USE_QTSCRIPTENGINE message(qtscriptengine) } diff --git a/include/lrglobal.h b/include/lrglobal.h index a82998f..ba5a363 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -42,13 +42,6 @@ # define LIMEREPORT_EXPORT /**/ #endif -#ifdef USE_QJSENGINE -//#include -#include -#else -#include -#endif - namespace LimeReport { #ifdef __GNUC__ @@ -146,27 +139,12 @@ namespace Const{ virtual ~IPainterProxy(); }; -#ifdef HAVE_QT4 +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) typedef QStyleOptionViewItemV4 StyleOptionViewItem; #else typedef QStyleOptionViewItem StyleOptionViewItem; #endif -#ifdef USE_QJSENGINE - typedef QJSEngine ScriptEngineType; - typedef QJSValue ScriptValueType; - template - static inline QJSValue getJSValue(QJSEngine &e, T *p) - { - QJSValue res = e.newQObject(p); - QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); - return res; - } -#else - typedef QScriptEngine ScriptEngineType; - typedef QScriptValue ScriptValueType; -#endif - #if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0) Q_NAMESPACE #endif diff --git a/include/lrscriptenginemanagerintf.h b/include/lrscriptenginemanagerintf.h index 1d306bd..a8a7c63 100644 --- a/include/lrscriptenginemanagerintf.h +++ b/include/lrscriptenginemanagerintf.h @@ -29,17 +29,47 @@ ****************************************************************************/ #ifndef LRSCRIPTENGINEMANAGERINTF_H #define LRSCRIPTENGINEMANAGERINTF_H +#include "qglobal.h" -//#include -#include "lrglobal.h" +#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) + #ifndef USE_QTSCRIPTENGINE + #ifndef USE_QJSENGINE + #define USE_QJSENGINE + #endif + #endif +#else + #ifndef USE_QTSCRIPTENGINE + #define USE_QTSCRIPTENGINE + #endif +#endif + +#ifdef USE_QJSENGINE +#include +#else +#include +#endif namespace LimeReport{ +#ifdef USE_QJSENGINE + typedef QJSEngine ScriptEngineType; + typedef QJSValue ScriptValueType; + template + static inline QJSValue getJSValue(QJSEngine &e, T *p) + { + QJSValue res = e.newQObject(p); + QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); + return res; + } +#else + typedef QScriptEngine ScriptEngineType; + typedef QScriptValue ScriptValueType; +#endif class IScriptEngineManager{ public: virtual ScriptEngineType* scriptEngine() = 0; -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE virtual bool addFunction(const QString& name, ScriptEngineType::FunctionSignature function, const QString& category="", const QString& description="") = 0; #endif diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index ee729e8..6fca5b5 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -29,9 +29,6 @@ ****************************************************************************/ #include #include -#ifndef USE_QJSENGINE -#include -#endif #include #include #include diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index a82998f..ba5a363 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -42,13 +42,6 @@ # define LIMEREPORT_EXPORT /**/ #endif -#ifdef USE_QJSENGINE -//#include -#include -#else -#include -#endif - namespace LimeReport { #ifdef __GNUC__ @@ -146,27 +139,12 @@ namespace Const{ virtual ~IPainterProxy(); }; -#ifdef HAVE_QT4 +#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) typedef QStyleOptionViewItemV4 StyleOptionViewItem; #else typedef QStyleOptionViewItem StyleOptionViewItem; #endif -#ifdef USE_QJSENGINE - typedef QJSEngine ScriptEngineType; - typedef QJSValue ScriptValueType; - template - static inline QJSValue getJSValue(QJSEngine &e, T *p) - { - QJSValue res = e.newQObject(p); - QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); - return res; - } -#else - typedef QScriptEngine ScriptEngineType; - typedef QScriptValue ScriptValueType; -#endif - #if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0) Q_NAMESPACE #endif diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 9591c13..a17a911 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1172,7 +1172,9 @@ ReportPages ReportEnginePrivate::renderToPages() } scriptContext()->qobjectToScript("engine",this); - +#ifdef USE_QTSCRIPTENGINE + ScriptEngineManager::instance().scriptEngine()->pushContext(); +#endif if (m_scriptEngineContext->runInitScript()){ dataManager()->clearErrors(); @@ -1230,6 +1232,9 @@ ReportPages ReportEnginePrivate::renderToPages() } m_reportRendering = false; //activateLanguage(QLocale::AnyLanguage); +#ifdef USE_QTSCRIPTENGINE + ScriptEngineManager::instance().scriptEngine()->popContext(); +#endif return result; } else { return ReportPages(); diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 7c3ed0a..96f83f7 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -243,10 +243,6 @@ void ReportRender::renderPage(PageItemDesignIntf* patternPage, bool isTOC, bool savePage(true); -#ifndef USE_QJSENGINE - ScriptEngineManager::instance().scriptEngine()->popContext(); -#endif - } int ReportRender::pageCount() @@ -1422,7 +1418,8 @@ void ReportRender::savePage(bool isLast) moveTearOffBand(); m_scriptEngineContext->setCurrentPage(m_renderPageItem); emit m_patternPageItem->afterRender(); - if (isLast) emit m_patternPageItem->afterLastPageRendered(); + if (isLast) + emit m_patternPageItem->afterLastPageRendered(); if (isLast && m_patternPageItem->endlessHeight()){ qreal pageHeight = 0; foreach (BandDesignIntf* band, m_renderPageItem->bands()) { diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index c73b660..2689501 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -32,7 +32,7 @@ #include #include #include -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE #include #endif #include @@ -50,7 +50,7 @@ Q_DECLARE_METATYPE(QColor) Q_DECLARE_METATYPE(QFont) Q_DECLARE_METATYPE(LimeReport::ScriptEngineManager *) -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE QScriptValue constructColor(QScriptContext *context, QScriptEngine *engine) { QColor color(context->argument(0).toString()); @@ -278,7 +278,7 @@ bool ScriptEngineManager::containsFunction(const QString& functionName){ return false; } -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE #if QT_VERSION > 0x050600 Q_DECL_DEPRECATED #endif @@ -818,6 +818,23 @@ bool ScriptEngineManager::createGetFieldByKeyFunction() return addFunction(fd); } +bool ScriptEngineManager::createGetFieldByRowIndex() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory(tr("GENERAL")); + fd.setName("getFieldByRowIndex"); + fd.setDescription("getFieldByRowIndex(\""+tr("FieldName")+"\", \""+ + tr("RowIndex")+"\")" + ); + fd.setScriptWrapper(QString("function getFieldByRowIndex(fieldName, rowIndex){" + "return %1.getFieldByRowIndex(fieldName, rowIndex);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + bool ScriptEngineManager::createAddTableOfContentsItemFunction() { JSFunctionDesc fd; @@ -869,7 +886,7 @@ ScriptEngineManager::ScriptEngineManager() m_scriptEngine = new ScriptEngineType; m_functionManager = new ScriptFunctionsManager(this); m_functionManager->setScriptEngineManager(this); -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE m_scriptEngine->setDefaultPrototype(qMetaTypeId(), m_scriptEngine->newQObject(new ComboBoxPrototype())); #endif @@ -887,9 +904,10 @@ ScriptEngineManager::ScriptEngineManager() #endif createSetVariableFunction(); createGetFieldFunction(); + createGetFieldByRowIndex(); createGetFieldByKeyFunction(); createGetVariableFunction(); -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE QScriptValue colorCtor = m_scriptEngine->newFunction(constructColor); m_scriptEngine->globalObject().setProperty("QColor", colorCtor); @@ -1362,9 +1380,6 @@ bool ScriptEngineContext::runInitScript(){ ScriptEngineManager::instance().setContext(this); m_tableOfContents->clear(); -#ifndef USE_QJSENGINE - engine->pushContext(); -#endif ScriptValueType res = engine->evaluate(initScript()); if (res.isBool()) return res.toBool(); #ifdef USE_QJSENGINE @@ -1595,6 +1610,12 @@ QVariant ScriptFunctionsManager::getFieldByKeyField(const QString& datasourceNam return dm->fieldDataByKey(datasourceName, valueFieldName, keyFieldName, keyValue); } +QVariant ScriptFunctionsManager::getFieldByRowIndex(const QString &fieldName, int rowIndex) +{ + DataSourceManager* dm = scriptEngineManager()->dataManager(); + return dm->fieldDataByRowIndex(fieldName, rowIndex); +} + void ScriptFunctionsManager::reopenDatasource(const QString& datasourceName) { DataSourceManager* dm = scriptEngineManager()->dataManager(); @@ -1923,7 +1944,7 @@ void TableBuilder::checkBaseLayout() } } -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE void ComboBoxPrototype::addItem(const QString &text) { QComboBox* comboBox = qscriptvalue_cast(thisObject()); diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index bb60dee..bcddffb 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -29,7 +29,7 @@ ****************************************************************************/ #ifndef LRSCRIPTENGINEMANAGER_H #define LRSCRIPTENGINEMANAGER_H -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE #include #include #endif @@ -272,7 +272,7 @@ private: QString m_scriptWrapper; }; -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE class ComboBoxPrototype : public QObject, public QScriptable{ Q_OBJECT public: @@ -363,6 +363,7 @@ public: Q_INVOKABLE QVariant getVariable(const QString& name); Q_INVOKABLE QVariant getField(const QString& field); Q_INVOKABLE QVariant getFieldByKeyField(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue); + Q_INVOKABLE QVariant getFieldByRowIndex(const QString& fieldName, int rowIndex); Q_INVOKABLE void reopenDatasource(const QString& datasourceName); Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} Q_INVOKABLE void addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent = 0); @@ -399,7 +400,7 @@ public: void deleteFunction(const QString& functionsName); bool addFunction(const JSFunctionDesc& functionsDescriber); -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE bool addFunction(const QString &name, QScriptEngine::FunctionSignature function, const QString &category, const QString &description); #endif bool addFunction(const QString &name, const QString& script, @@ -438,6 +439,7 @@ private: bool createGetVariableFunction(); bool createGetFieldFunction(); bool createGetFieldByKeyFunction(); + bool createGetFieldByRowIndex(); bool createAddTableOfContentsItemFunction(); bool createClearTableOfContentsFunction(); bool createReopenDatasourceFunction(); @@ -483,7 +485,7 @@ private: }; -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE class QFontPrototype : public QObject, public QScriptable { Q_OBJECT Q_PROPERTY(QString family READ family) @@ -533,7 +535,7 @@ public: #endif } -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE Q_DECLARE_METATYPE(LimeReport::ComboBoxPrototype*) Q_DECLARE_METATYPE(QComboBox*) #endif diff --git a/limereport/lrscriptenginemanagerintf.h b/limereport/lrscriptenginemanagerintf.h index 1d306bd..a8a7c63 100644 --- a/limereport/lrscriptenginemanagerintf.h +++ b/limereport/lrscriptenginemanagerintf.h @@ -29,17 +29,47 @@ ****************************************************************************/ #ifndef LRSCRIPTENGINEMANAGERINTF_H #define LRSCRIPTENGINEMANAGERINTF_H +#include "qglobal.h" -//#include -#include "lrglobal.h" +#if QT_VERSION >= QT_VERSION_CHECK(5, 6, 0) + #ifndef USE_QTSCRIPTENGINE + #ifndef USE_QJSENGINE + #define USE_QJSENGINE + #endif + #endif +#else + #ifndef USE_QTSCRIPTENGINE + #define USE_QTSCRIPTENGINE + #endif +#endif + +#ifdef USE_QJSENGINE +#include +#else +#include +#endif namespace LimeReport{ +#ifdef USE_QJSENGINE + typedef QJSEngine ScriptEngineType; + typedef QJSValue ScriptValueType; + template + static inline QJSValue getJSValue(QJSEngine &e, T *p) + { + QJSValue res = e.newQObject(p); + QQmlEngine::setObjectOwnership(p, QQmlEngine::CppOwnership); + return res; + } +#else + typedef QScriptEngine ScriptEngineType; + typedef QScriptValue ScriptValueType; +#endif class IScriptEngineManager{ public: virtual ScriptEngineType* scriptEngine() = 0; -#ifndef USE_QJSENGINE +#ifdef USE_QTSCRIPTENGINE virtual bool addFunction(const QString& name, ScriptEngineType::FunctionSignature function, const QString& category="", const QString& description="") = 0; #endif From 3bd49b6ffd82224dea060cefc7e9ccaa543c98da Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 19 Feb 2019 02:43:16 +0300 Subject: [PATCH 272/347] getFieldByRowIndex() has been added --- include/lrdatasourceintf.h | 1 + limereport/lrdatadesignintf.cpp | 22 ++++++++++++++++++++++ limereport/lrdatadesignintf.h | 2 ++ limereport/lrdatasourceintf.h | 1 + limereport/lrdatasourcemanager.cpp | 11 +++++++++++ limereport/lrdatasourcemanager.h | 1 + 6 files changed, 38 insertions(+) diff --git a/include/lrdatasourceintf.h b/include/lrdatasourceintf.h index c2a6c90..26f7a65 100644 --- a/include/lrdatasourceintf.h +++ b/include/lrdatasourceintf.h @@ -17,6 +17,7 @@ public: virtual bool bof() = 0; virtual bool eof() = 0; virtual QVariant data(const QString& columnName) = 0; + virtual QVariant dataByRowIndex(const QString& columnName, int rowIndex) = 0; virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0; virtual int columnCount() = 0; virtual QString columnNameByIndex(int columnIndex) = 0; diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index 23b1e76..9fae29e 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -258,6 +258,13 @@ QVariant ModelToDataSource::data(const QString &columnName) return m_model->data(m_model->index(currentRow(),columnIndexByName(columnName))); } +QVariant ModelToDataSource::dataByRowIndex(const QString &columnName, int rowIndex) +{ + if (m_model->rowCount() > rowIndex) + return m_model->data(m_model->index(rowIndex, columnIndexByName(columnName))); + return QVariant(); +} + QVariant ModelToDataSource::dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) { for( int i=0; i < m_model->rowCount(); ++i ){ @@ -693,6 +700,21 @@ QVariant CallbackDatasource::data(const QString& columnName) return result; } +QVariant CallbackDatasource::dataByRowIndex(const QString &columnName, int rowIndex) +{ + int backupCurrentRow = m_currentRow; + QVariant result = QVariant(); + first(); + for (int i = 0; i < rowIndex && !eof(); ++i, next()){} + if (!eof()) result = callbackData(columnName, rowIndex); + first(); + if (backupCurrentRow != -1){ + for (int i = 0; i < backupCurrentRow; ++i) + next(); + } + return result; +} + QVariant CallbackDatasource::dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) { int backupCurrentRow = m_currentRow; diff --git a/limereport/lrdatadesignintf.h b/limereport/lrdatadesignintf.h index 06edc3d..a05c81e 100644 --- a/limereport/lrdatadesignintf.h +++ b/limereport/lrdatadesignintf.h @@ -328,6 +328,7 @@ public: bool eof(); bool bof(); QVariant data(const QString& columnName); + QVariant dataByRowIndex(const QString &columnName, int rowIndex); QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData); int columnCount(); QString columnNameByIndex(int columnIndex); @@ -360,6 +361,7 @@ public: bool bof(){return m_currentRow == -1;} bool eof(){return m_eof;} QVariant data(const QString &columnName); + QVariant dataByRowIndex(const QString& columnName, int rowIndex); QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData); int columnCount(); QString columnNameByIndex(int columnIndex); diff --git a/limereport/lrdatasourceintf.h b/limereport/lrdatasourceintf.h index c2a6c90..26f7a65 100644 --- a/limereport/lrdatasourceintf.h +++ b/limereport/lrdatasourceintf.h @@ -17,6 +17,7 @@ public: virtual bool bof() = 0; virtual bool eof() = 0; virtual QVariant data(const QString& columnName) = 0; + virtual QVariant dataByRowIndex(const QString& columnName, int rowIndex) = 0; virtual QVariant dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) = 0; virtual int columnCount() = 0; virtual QString columnNameByIndex(int columnIndex) = 0; diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 6e2babc..4f9b147 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -1469,6 +1469,17 @@ QVariant DataSourceManager::fieldData(const QString &fieldName) return QVariant(); } +QVariant DataSourceManager::fieldDataByRowIndex(const QString &fieldName, int rowIndex) +{ + if (containsField(fieldName)){ + IDataSource* ds = dataSource(extractDataSource(fieldName)); + if (ds){ + return ds->dataByRowIndex(extractFieldName(fieldName), rowIndex); + } + } + return QVariant(); +} + QVariant DataSourceManager::fieldDataByKey(const QString& datasourceName, const QString& valueFieldName, const QString& keyFieldName, QVariant keyValue) { IDataSource* ds = dataSource(datasourceName); diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index 6dd6518..001e09e 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -167,6 +167,7 @@ public: QStringList fieldNames(const QString& datasourceName); bool containsField(const QString& fieldName); QVariant fieldData(const QString& fieldName); + QVariant fieldDataByRowIndex(const QString& fieldName, int rowIndex); QVariant fieldDataByKey( const QString& datasourceName, const QString& valueFieldName, From fdaee730addcb9aa26a50be2ab7541630fae2a63 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 19 Feb 2019 03:02:46 +0300 Subject: [PATCH 273/347] Default preview background color has been changed --- limereport/lrreportengine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index a17a911..da6a32e 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -83,7 +83,7 @@ ReportEnginePrivate::ReportEnginePrivate(QObject *parent) : m_fileWatcher( new QFileSystemWatcher( this ) ), m_reportLanguage(QLocale::AnyLanguage), m_previewLayoutDirection(Qt::LayoutDirectionAuto), m_designerFactory(0), m_previewScaleType(FitWidth), m_previewScalePercent(0), m_startTOCPage(0), - m_previewPageBackgroundColor(Qt::white) + m_previewPageBackgroundColor(Qt::gray) { #ifdef HAVE_STATIC_BUILD initResources(); From b5f2f50993a10966fd2bf3419b39c36234b695c0 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 19 Feb 2019 15:44:23 +0300 Subject: [PATCH 274/347] checkLostHeadersInPrevColumn() has been added --- limereport/lrreportrender.cpp | 33 +++++++++++++++++++++++++++++++++ limereport/lrreportrender.h | 1 + 2 files changed, 34 insertions(+) diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 96f83f7..08333c9 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -1201,6 +1201,7 @@ BandDesignIntf *ReportRender::renderData(BandDesignIntf *patternBand) void ReportRender::startNewColumn(){ if (m_currentColumn < m_maxHeightByColumn.size()-1){ m_currentColumn++; + checkLostHeadersInPrevColumn(); } else { savePage(); startNewPage(); @@ -1339,6 +1340,38 @@ void ReportRender::checkLostHeadersOnPrevPage() } +void ReportRender::checkLostHeadersInPrevColumn() +{ + QVector lostHeaders; + + QMutableListIteratorit(m_renderPageItem->bands()); + + it.toBack(); + if (it.hasPrevious()){ + if (it.previous()->isFooter()){ + if (it.hasPrevious()) it.previous(); + else return; + } + } + + while (it.hasPrevious()){ + if (it.value()->isHeader()){ + if (it.value()->reprintOnEachPage()){ + delete it.value(); + } else { lostHeaders.append(it.value());} + it.remove(); + it.previous(); + } else break; + } + + if (lostHeaders.size() > 0){ + qSort(lostHeaders.begin(), lostHeaders.end(), bandLessThen); + foreach(BandDesignIntf* header, lostHeaders){ + registerBand(header); + } + } +} + BandDesignIntf* ReportRender::findEnclosingGroup() { BandDesignIntf* result=0; diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 8cbbc0f..541f325 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -157,6 +157,7 @@ private: void checkFooterGroup(BandDesignIntf* groupBand); void pasteGroups(); void checkLostHeadersOnPrevPage(); + void checkLostHeadersInPrevColumn(); BandDesignIntf* findEnclosingGroup(); bool registerBand(BandDesignIntf* band, bool registerInChildren=true); From c30bfc9a0624fe6238942f8d8d11c1b41d0cece4 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Feb 2019 13:54:26 +0300 Subject: [PATCH 275/347] previewReport(QPrinter* printer, PreviewHints hints = PreviewBarsUserSetting) has been added to the report engine. --- include/lrpreviewreportwidget.h | 5 ++ include/lrreportengine.h | 1 + limereport/lrpreviewreportwidget.cpp | 54 +++++++++++----- limereport/lrpreviewreportwidget.h | 5 ++ limereport/lrpreviewreportwindow.cpp | 5 ++ limereport/lrpreviewreportwindow.h | 2 + limereport/lrreportengine.cpp | 92 ++++++++++++++++------------ limereport/lrreportengine.h | 1 + limereport/lrreportengine_p.h | 1 + 9 files changed, 110 insertions(+), 56 deletions(-) diff --git a/include/lrpreviewreportwidget.h b/include/lrpreviewreportwidget.h index 306af9c..9c50adb 100644 --- a/include/lrpreviewreportwidget.h +++ b/include/lrpreviewreportwidget.h @@ -3,6 +3,7 @@ #include #include +#include #include "lrglobal.h" namespace LimeReport { @@ -31,6 +32,8 @@ public: void setScaleType(const ScaleType &scaleType, int percent = 0); void setPreviewPageBackgroundColor(QColor color); QColor previewPageBackgroundColor(); + QPrinter *defaultPrinter() const; + void setDefaultPrinter(QPrinter *defaultPrinter); public slots: void refreshPages(); void zoomIn(); @@ -71,6 +74,8 @@ private: int m_scalePercent; QTimer m_resizeTimer; QColor m_previewPageBackgroundColor; + QPrinter* m_defaultPrinter; + void printPages(QPrinter *printer); }; } // namespace LimeReport diff --git a/include/lrreportengine.h b/include/lrreportengine.h index a36d1b0..00185d8 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -87,6 +87,7 @@ public: bool printToPDF(const QString& fileName); bool exportReport(QString exporterName, const QString &fileName = "", const QMap& params = QMap()); void previewReport(PreviewHints hints = PreviewBarsUserSetting); + void previewReport(QPrinter* printer, PreviewHints hints = PreviewBarsUserSetting); void designReport(); ReportDesignWindowInterface* getDesignerWindow(); void setShowProgressDialog(bool value); diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 6799a62..7b3290d 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -71,7 +71,8 @@ QList PreviewReportWidgetPrivate::aviableExporters() PreviewReportWidget::PreviewReportWidget(ReportEngine *report, QWidget *parent) : QWidget(parent), ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this)), - m_scaleType(FitWidth), m_scalePercent(0), m_previewPageBackgroundColor(Qt::white) + m_scaleType(FitWidth), m_scalePercent(0), m_previewPageBackgroundColor(Qt::white), + m_defaultPrinter(0) { ui->setupUi(this); d_ptr->m_report = report->d_ptr; @@ -193,32 +194,41 @@ void PreviewReportWidget::lastPage() d_ptr->m_changingPage=false; } -void PreviewReportWidget::print() +void PreviewReportWidget::printPages(QPrinter* printer) { + if (!d_ptr->m_reportPages.isEmpty()) + ReportEnginePrivate::printReport( + d_ptr->m_reportPages, + *printer + ); + foreach(PageItemDesignIntf::Ptr pageItem, d_ptr->m_reportPages){ + d_ptr->m_previewPage->reactivatePageItem(pageItem); + } +} - QPrinterInfo pi; - QPrinter printer(QPrinter::HighResolution); +void PreviewReportWidget::print() +{ + if (m_defaultPrinter){ + printPages(m_defaultPrinter); + } else { - if (!pi.defaultPrinter().isNull()) + QPrinterInfo pi; + QPrinter printer(QPrinter::HighResolution); + + if (!pi.defaultPrinter().isNull()) #ifdef HAVE_QT4 - printer.setPrinterName(pi.defaultPrinter().printerName()); + printer.setPrinterName(pi.defaultPrinter().printerName()); #endif #ifdef HAVE_QT5 #if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - printer.setPrinterName(pi.defaultPrinterName()); + printer.setPrinterName(pi.defaultPrinterName()); #else - printer.setPrinterName(pi.defaultPrinter().printerName()); + printer.setPrinterName(pi.defaultPrinter().printerName()); #endif #endif - QPrintDialog dialog(&printer,QApplication::activeWindow()); - if (dialog.exec()==QDialog::Accepted){ - if (!d_ptr->m_reportPages.isEmpty()) - ReportEnginePrivate::printReport( - d_ptr->m_reportPages, - printer - ); - foreach(PageItemDesignIntf::Ptr pageItem, d_ptr->m_reportPages){ - d_ptr->m_previewPage->reactivatePageItem(pageItem); + QPrintDialog dialog(&printer,QApplication::activeWindow()); + if (dialog.exec()==QDialog::Accepted){ + printPages(&printer); } } } @@ -307,6 +317,16 @@ void PreviewReportWidget::emitPageSet() emit pagesSet(d_ptr->m_reportPages.count()); } +QPrinter *PreviewReportWidget::defaultPrinter() const +{ + return m_defaultPrinter; +} + +void PreviewReportWidget::setDefaultPrinter(QPrinter *defaultPrinter) +{ + m_defaultPrinter = defaultPrinter; +} + ScaleType PreviewReportWidget::scaleType() const { return m_scaleType; diff --git a/limereport/lrpreviewreportwidget.h b/limereport/lrpreviewreportwidget.h index 306af9c..9c50adb 100644 --- a/limereport/lrpreviewreportwidget.h +++ b/limereport/lrpreviewreportwidget.h @@ -3,6 +3,7 @@ #include #include +#include #include "lrglobal.h" namespace LimeReport { @@ -31,6 +32,8 @@ public: void setScaleType(const ScaleType &scaleType, int percent = 0); void setPreviewPageBackgroundColor(QColor color); QColor previewPageBackgroundColor(); + QPrinter *defaultPrinter() const; + void setDefaultPrinter(QPrinter *defaultPrinter); public slots: void refreshPages(); void zoomIn(); @@ -71,6 +74,8 @@ private: int m_scalePercent; QTimer m_resizeTimer; QColor m_previewPageBackgroundColor; + QPrinter* m_defaultPrinter; + void printPages(QPrinter *printer); }; } // namespace LimeReport diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 71fed64..035a5e0 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -209,6 +209,11 @@ void PreviewReportWindow::setPages(ReportPages pages) } } +void PreviewReportWindow::setDefaultPrinter(QPrinter *printer) +{ + m_previewReportWidget->setDefaultPrinter(printer); +} + void PreviewReportWindow::exec() { bool deleteOnClose = testAttribute(Qt::WA_DeleteOnClose); diff --git a/limereport/lrpreviewreportwindow.h b/limereport/lrpreviewreportwindow.h index dc210ce..eb5b2e6 100644 --- a/limereport/lrpreviewreportwindow.h +++ b/limereport/lrpreviewreportwindow.h @@ -36,6 +36,7 @@ #include #include #include +#include #include "serializators/lrxmlreader.h" @@ -61,6 +62,7 @@ public: ~PreviewReportWindow(); void setReportReader(ItemsReaderIntf::Ptr reader); void setPages(ReportPages pages); + void setDefaultPrinter(QPrinter* printer); void exec(); void initPreview(int pagesCount); void reloadPreview(); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index da6a32e..e83aadf 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -496,48 +496,54 @@ bool ReportEnginePrivate::exportReport(QString exporterName, const QString &file void ReportEnginePrivate::previewReport(PreviewHints hints) { -// QTime start = QTime::currentTime(); - try{ - dataManager()->setDesignTime(false); - ReportPages pages = renderToPages(); - dataManager()->setDesignTime(true); - if (pages.count()>0){ - Q_Q(ReportEngine); - PreviewReportWindow* w = new PreviewReportWindow(q,0,settings()); - w->setPreviewPageBackgroundColor(m_previewPageBackgroundColor); - w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint| Qt::WindowMinMaxButtonsHint); - w->setAttribute(Qt::WA_DeleteOnClose,true); - w->setWindowModality(Qt::ApplicationModal); - //w->setWindowIcon(QIcon(":/report/images/main.ico")); - w->setWindowIcon(m_previewWindowIcon); - w->setWindowTitle(m_previewWindowTitle); - w->setSettings(settings()); - w->setPages(pages); - w->setLayoutDirection(m_previewLayoutDirection); + previewReport(0, hints); +} - if (!dataManager()->errorsList().isEmpty()){ - w->setErrorMessages(dataManager()->errorsList()); +void ReportEnginePrivate::previewReport(QPrinter *printer, PreviewHints hints) +{ + // QTime start = QTime::currentTime(); + try{ + dataManager()->setDesignTime(false); + ReportPages pages = renderToPages(); + dataManager()->setDesignTime(true); + if (pages.count()>0){ + Q_Q(ReportEngine); + PreviewReportWindow* w = new PreviewReportWindow(q,0,settings()); + w->setPreviewPageBackgroundColor(m_previewPageBackgroundColor); + w->setWindowFlags(Qt::Dialog|Qt::WindowMaximizeButtonHint|Qt::WindowCloseButtonHint| Qt::WindowMinMaxButtonsHint); + w->setAttribute(Qt::WA_DeleteOnClose,true); + w->setWindowModality(Qt::ApplicationModal); + w->setDefaultPrinter(printer); + //w->setWindowIcon(QIcon(":/report/images/main.ico")); + w->setWindowIcon(m_previewWindowIcon); + w->setWindowTitle(m_previewWindowTitle); + w->setSettings(settings()); + w->setPages(pages); + w->setLayoutDirection(m_previewLayoutDirection); + + if (!dataManager()->errorsList().isEmpty()){ + w->setErrorMessages(dataManager()->errorsList()); + } + + if (!hints.testFlag(PreviewBarsUserSetting)){ + w->setMenuVisible(!hints.testFlag(HidePreviewMenuBar)); + w->setStatusBarVisible(!hints.testFlag(HidePreviewStatusBar)); + w->setToolBarVisible(!hints.testFlag(HidePreviewToolBar)); + } + + w->setHideResultEditButton(resultIsEditable()); + w->setStyleSheet(m_styleSheet); + m_activePreview = w; + + w->setPreviewScaleType(m_previewScaleType, m_previewScalePercent); + + connect(w,SIGNAL(destroyed(QObject*)), this, SLOT(slotPreviewWindowDestroyed(QObject*))); + w->exec(); } - - if (!hints.testFlag(PreviewBarsUserSetting)){ - w->setMenuVisible(!hints.testFlag(HidePreviewMenuBar)); - w->setStatusBarVisible(!hints.testFlag(HidePreviewStatusBar)); - w->setToolBarVisible(!hints.testFlag(HidePreviewToolBar)); - } - - w->setHideResultEditButton(resultIsEditable()); - w->setStyleSheet(m_styleSheet); - m_activePreview = w; - - w->setPreviewScaleType(m_previewScaleType, m_previewScalePercent); - - connect(w,SIGNAL(destroyed(QObject*)), this, SLOT(slotPreviewWindowDestroyed(QObject*))); - w->exec(); + } catch (ReportError &exception){ + saveError(exception.what()); + showError(exception.what()); } - } catch (ReportError &exception){ - saveError(exception.what()); - showError(exception.what()); - } } ReportDesignWindowInterface*ReportEnginePrivate::getDesignerWindow() @@ -1323,6 +1329,14 @@ void ReportEngine::previewReport(PreviewHints hints) d->previewReport(hints); } +void ReportEngine::previewReport(QPrinter *printer, PreviewHints hints) +{ + Q_D(ReportEngine); + if (m_settings) + d->setSettings(m_settings); + d->previewReport(printer, hints); +} + void ReportEngine::designReport() { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index a36d1b0..00185d8 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -87,6 +87,7 @@ public: bool printToPDF(const QString& fileName); bool exportReport(QString exporterName, const QString &fileName = "", const QMap& params = QMap()); void previewReport(PreviewHints hints = PreviewBarsUserSetting); + void previewReport(QPrinter* printer, PreviewHints hints = PreviewBarsUserSetting); void designReport(); ReportDesignWindowInterface* getDesignerWindow(); void setShowProgressDialog(bool value); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 1813f81..69831b7 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -154,6 +154,7 @@ public: bool printToPDF(const QString& fileName); bool exportReport(QString exporterName, const QString &fileName = "", const QMap& params = QMap()); void previewReport(PreviewHints hints = PreviewBarsUserSetting); + void previewReport(QPrinter* printer, PreviewHints hints = PreviewBarsUserSetting); ReportDesignWindowInterface* getDesignerWindow(); void designReport(); From 0ca4366ad8eebc9a4c488e3550c6811a3c8583ec Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 20 Feb 2019 21:06:18 +0300 Subject: [PATCH 276/347] Console demo has been refactored and added to the limereport.pro --- console/console.pro | 36 ++++++++++---------- console/main.cpp | 80 +++++++++++++++++++++++++++------------------ limereport.pro | 1 + 3 files changed, 68 insertions(+), 49 deletions(-) diff --git a/console/console.pro b/console/console.pro index 80bf88b..cea280f 100644 --- a/console/console.pro +++ b/console/console.pro @@ -1,33 +1,35 @@ -QT += core widgets +include(../common.pri) +QT += core QT -= gui -CONFIG += c++11 - -TARGET = console +TARGET = limereport CONFIG += console CONFIG -= app_bundle TEMPLATE = app - SOURCES += main.cpp -# The following define makes your compiler emit warnings if you use -# any feature of Qt which as been marked deprecated (the exact warnings -# depend on your compiler). Please consult the documentation of the -# deprecated API in order to know how to port your code away from it. DEFINES += QT_DEPRECATED_WARNINGS -include(../common.pri) +DESTDIR = $${DEST_BINS} + INCLUDEPATH += $$PWD/../include DEPENDPATH += $$PWD/../include -LIBS += -L$${DEST_LIBS} -llimereport + +LIBS += -L$${DEST_LIBS} + +CONFIG(debug, debug|release) { + LIBS += -llimereportd +} else { + LIBS += -llimereport +} !contains(CONFIG, static_build){ contains(CONFIG,zint){ - LIBS += -L$${DEST_LIBS} -lQtZint + LIBS += -L$${DEST_LIBS} + CONFIG(debug, debug|release) { + LIBS += -lQtZintd + } else { + LIBS += -lQtZint + } } } - -# You can also make your code fail to compile if you use deprecated APIs. -# In order to do so, uncomment the following line. -# You can also select to disable deprecated APIs only up to a certain version of Qt. -#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 diff --git a/console/main.cpp b/console/main.cpp index 574b599..526eb81 100644 --- a/console/main.cpp +++ b/console/main.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #ifdef _WIN32 #include @@ -14,49 +15,64 @@ int main(int argc, char *argv[]) { QApplication a(argc, argv); + QApplication::setApplicationVersion(LIMEREPORT_VERSION_STR); QStringList vars; + + QCommandLineParser parser; + parser.addHelpOption(); + parser.addVersionOption(); + QCommandLineOption sourceOption(QStringList() << "s" << "source", + QCoreApplication::translate("main", "Limereport pattern file name"), + QCoreApplication::translate("main", "source")); + parser.addOption(sourceOption); + QCommandLineOption destinationOption(QStringList() << "d" << "destination", + QCoreApplication::translate("main", "Output file name"), + QCoreApplication::translate("main", "destination")); + parser.addOption(destinationOption); + QCommandLineOption variablesOption(QStringList() << "p" << "param", + QCoreApplication::translate("main", "Report parameter (can be more than one)"), + QCoreApplication::translate("main", "param_name=param_value")); + parser.addOption(variablesOption); + parser.process(a); + LimeReport::ReportEngine report; - if (a.arguments().count() < 2 ){ - std::cerr<<"Error! Report file is not specified !!"; + + if (parser.value(sourceOption).isEmpty()){ + std::cerr<<"Error! Report file is not specified !! \n"; return 1; } - if (a.arguments().count()>2){ - vars = a.arguments().at(2).split(";"); - qDebug()<setReportVariable(varItem.at(0),varItem.at(1)); + if (varItem.size() == 2) + report.dataManager()->setReportVariable(varItem.at(0),varItem.at(1)); } } - QString reportFile = a.arguments().at(1); - - if (!report.loadFromFile(reportFile)){ - qDebug()< Date: Wed, 20 Feb 2019 21:37:32 +0300 Subject: [PATCH 277/347] Qt version check has been added for console demo --- console/main.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/console/main.cpp b/console/main.cpp index 526eb81..764fc36 100644 --- a/console/main.cpp +++ b/console/main.cpp @@ -18,6 +18,7 @@ int main(int argc, char *argv[]) QApplication::setApplicationVersion(LIMEREPORT_VERSION_STR); QStringList vars; +#if QT_VERSION > QT_VERSION_CHECK(5, 2, 0) QCommandLineParser parser; parser.addHelpOption(); parser.addVersionOption(); @@ -60,7 +61,9 @@ int main(int argc, char *argv[]) } else { report.printToPDF(parser.value(destinationOption)); } - +#else + std::cerr<<"This demo intended for Qt 5.2 and higher\n"; +#endif // QUuid uid = QUuid::createUuid(); // QString uidStr = uid.toString()+".pdf"; // report.printToPDF(uidStr); From 83a57b5cbe3b770d51a361b624c5bb2a19c45331 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 21 Feb 2019 03:20:26 +0300 Subject: [PATCH 278/347] Added the ability to add text elements in preview (in edit mode) --- include/lrpreviewreportwidget.h | 1 + limereport/lrpagedesignintf.cpp | 32 +++++++++++++------ limereport/lrpagedesignintf.h | 4 +++ limereport/lrpreviewreportwidget.cpp | 14 ++++++++ limereport/lrpreviewreportwidget.h | 1 + limereport/lrpreviewreportwidget_p.h | 1 + limereport/lrpreviewreportwindow.cpp | 11 ++++++- limereport/lrpreviewreportwindow.h | 1 + limereport/lrpreviewreportwindow.ui | 48 +++++++++++++++++++++++++++- 9 files changed, 101 insertions(+), 12 deletions(-) diff --git a/include/lrpreviewreportwidget.h b/include/lrpreviewreportwidget.h index 9c50adb..faa26c7 100644 --- a/include/lrpreviewreportwidget.h +++ b/include/lrpreviewreportwidget.h @@ -34,6 +34,7 @@ public: QColor previewPageBackgroundColor(); QPrinter *defaultPrinter() const; void setDefaultPrinter(QPrinter *defaultPrinter); + void startInsertTextItem(); public slots: void refreshPages(); void zoomIn(); diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 1bb5558..b379c3a 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -91,7 +91,8 @@ PageDesignIntf::PageDesignIntf(QObject *parent): m_movedItem(0), m_joinItem(0), m_magneticMovement(false), - m_reportSettings(0) + m_reportSettings(0), + m_currentPage(0) { m_reportEditor = dynamic_cast(parent); updatePageRect(); @@ -240,7 +241,9 @@ void PageDesignIntf::startInsertMode(const QString &ItemType) m_insertItemType = ItemType; m_itemInsertRect = this->addRect(0, 0, 200, 50); m_itemInsertRect->setVisible(false); - m_itemInsertRect->setParentItem(pageItem()); + PageItemDesignIntf* page = pageItem() ? pageItem() : getCurrentPage(); + if (page) + m_itemInsertRect->setParentItem(page); } void PageDesignIntf::startEditMode() @@ -258,6 +261,7 @@ PageItemDesignIntf *PageDesignIntf::pageItem() void PageDesignIntf::setPageItem(PageItemDesignIntf::Ptr pageItem) { + if (pageItem.isNull()) return; if (!m_pageItem.isNull()) { removeItem(m_pageItem.data()); m_pageItem->setParent(0); @@ -334,13 +338,15 @@ void PageDesignIntf::mouseMoveEvent(QGraphicsSceneMouseEvent *event) m_selectionRect->setRect(selectionRect); } - if ((m_insertMode) && (pageItem()->rect().contains(pageItem()->mapFromScene(event->scenePos())))) { + PageItemDesignIntf* page = pageItem() ? pageItem() : getCurrentPage(); + if ((m_insertMode) && (page && page->rect().contains(page->mapFromScene(event->scenePos())))) { if (!m_itemInsertRect->isVisible()) m_itemInsertRect->setVisible(true); - qreal posY = div(pageItem()->mapFromScene(event->scenePos()).y(), verticalGridStep()).quot * verticalGridStep(); - qreal posX = div(pageItem()->mapFromScene(event->scenePos()).x(), verticalGridStep()).quot * horizontalGridStep(); + qreal posY = div(page->mapFromScene(event->scenePos()).y(), verticalGridStep()).quot * verticalGridStep(); + qreal posX = div(page->mapFromScene(event->scenePos()).x(), verticalGridStep()).quot * horizontalGridStep(); m_itemInsertRect->setPos(posX,posY); + } else { + if (m_insertMode) m_itemInsertRect->setVisible(false); } - else { if (m_insertMode) m_itemInsertRect->setVisible(false); } QGraphicsScene::mouseMoveEvent(event); } @@ -481,10 +487,6 @@ BaseDesignIntf *PageDesignIntf::addReportItem(const QString &itemType, QPointF p BandDesignIntf *band = bandAt(pos); if (band) { BaseDesignIntf *reportItem = addReportItem(itemType, band, band); -// QPointF insertPos = band->mapFromScene(pos); -// insertPos = QPointF(div(insertPos.x(), horizontalGridStep()).quot * horizontalGridStep(), -// div(insertPos.y(), verticalGridStep()).quot * verticalGridStep()); - reportItem->setPos(placePosOnGrid(band->mapFromScene(pos))); reportItem->setSize(placeSizeOnGrid(size)); return reportItem; @@ -1057,6 +1059,16 @@ void PageDesignIntf::changeSelectedGroupProperty(const QString &name, const QVar } } +PageItemDesignIntf* PageDesignIntf::getCurrentPage() const +{ + return m_currentPage; +} + +void PageDesignIntf::setCurrentPage(PageItemDesignIntf* currentPage) +{ + m_currentPage = currentPage; +} + ReportSettings *PageDesignIntf::getReportSettings() const { return m_reportSettings; diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 901ddbc..c9c4aab 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -175,6 +175,9 @@ namespace LimeReport { void setPropertyToSelectedItems(const char *name, const QVariant &value); + PageItemDesignIntf* getCurrentPage() const; + void setCurrentPage(PageItemDesignIntf* currentPage); + protected: virtual void keyPressEvent(QKeyEvent *event); @@ -312,6 +315,7 @@ namespace LimeReport { JoinType m_joinType; bool m_magneticMovement; ReportSettings* m_reportSettings; + PageItemDesignIntf* m_currentPage; }; class AbstractPageCommand : public CommandIf{ diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 7b3290d..24420fe 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -68,6 +68,11 @@ QList PreviewReportWidgetPrivate::aviableExporters() return ExportersFactory::instance().map().keys(); } +void PreviewReportWidgetPrivate::startInsertTextItem() +{ + m_previewPage->startInsertMode("TextItem"); +} + PreviewReportWidget::PreviewReportWidget(ReportEngine *report, QWidget *parent) : QWidget(parent), ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this)), @@ -332,6 +337,11 @@ ScaleType PreviewReportWidget::scaleType() const return m_scaleType; } +void PreviewReportWidget::startInsertTextItem() +{ + d_ptr->startInsertTextItem(); +} + int PreviewReportWidget::scalePercent() const { return m_scalePercent; @@ -389,6 +399,10 @@ void PreviewReportWidget::slotSliderMoved(int value) d_ptr->m_changingPage = true; emit pageChanged(d_ptr->m_currentPage); + PageDesignIntf* page = dynamic_cast(ui->graphicsView->scene()); + if (page) + page->setCurrentPage(d_ptr->currentPage().data()); + d_ptr->m_changingPage = false; d_ptr->m_priorScrolValue = value; } diff --git a/limereport/lrpreviewreportwidget.h b/limereport/lrpreviewreportwidget.h index 9c50adb..faa26c7 100644 --- a/limereport/lrpreviewreportwidget.h +++ b/limereport/lrpreviewreportwidget.h @@ -34,6 +34,7 @@ public: QColor previewPageBackgroundColor(); QPrinter *defaultPrinter() const; void setDefaultPrinter(QPrinter *defaultPrinter); + void startInsertTextItem(); public slots: void refreshPages(); void zoomIn(); diff --git a/limereport/lrpreviewreportwidget_p.h b/limereport/lrpreviewreportwidget_p.h index 078ce5e..dba8bd8 100644 --- a/limereport/lrpreviewreportwidget_p.h +++ b/limereport/lrpreviewreportwidget_p.h @@ -21,6 +21,7 @@ public: void setPages( ReportPages pages); PageItemDesignIntf::Ptr currentPage(); QList aviableExporters(); + void startInsertTextItem(); public: PageDesignIntf* m_previewPage; ReportPages m_reportPages; diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 035a5e0..df61773 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -57,6 +57,7 @@ PreviewReportWindow::PreviewReportWindow(ReportEngine *report, QWidget *parent, m_pagesNavigator->setPrefix(tr("Page: ")); m_pagesNavigator->setMinimumWidth(120); ui->toolBar->insertWidget(ui->actionNextPage,m_pagesNavigator); + ui->editModeTools->hide(); ui->actionShowMessages->setVisible(false); connect(m_pagesNavigator,SIGNAL(valueChanged(int)),this,SLOT(slotPageNavigatorChanged(int))); @@ -326,7 +327,9 @@ void PreviewReportWindow::on_actionEdit_Mode_triggered(bool checked) m_previewReportWidget->d_ptr->m_previewPage->setItemMode((checked)?ItemModes(DesignMode):PreviewMode); m_textAlignmentEditor->setVisible(checked); m_fontEditor->setVisible(checked); - //m_reportPages.at(m_currentPage)->setItemMode((checked)?DesignMode:PreviewMode); + if (checked) + ui->editModeTools->show(); + else ui->editModeTools->hide(); } void PreviewReportWindow::slotSelectionChanged() @@ -403,6 +406,11 @@ void PreviewReportWindow::slotPageChanged(int pageIndex) m_pagesNavigator->setValue(pageIndex); } +void PreviewReportWindow::slotInsertNewTextItem() +{ + m_previewReportWidget->startInsertTextItem(); +} + void PreviewReportWindow::on_actionFit_page_width_triggered() { m_previewReportWidget->fitWidth(); @@ -439,6 +447,7 @@ void PreviewReportWindow::slotScalePercentChanged(int percent) void PreviewReportWindow::on_actionShowMessages_toggled(bool value) { m_previewReportWidget->setErrorsMesagesVisible(value); + m_previewReportWidget->startInsertTextItem(); } void PreviewReportWindow::on_actionShow_Toolbar_triggered() diff --git a/limereport/lrpreviewreportwindow.h b/limereport/lrpreviewreportwindow.h index eb5b2e6..2104669 100644 --- a/limereport/lrpreviewreportwindow.h +++ b/limereport/lrpreviewreportwindow.h @@ -100,6 +100,7 @@ public slots: void slotLastPage(); void slotPrintToPDF(); void slotPageChanged(int pageIndex); + void slotInsertNewTextItem(); private slots: void on_actionFit_page_width_triggered(); void on_actionFit_page_triggered(); diff --git a/limereport/lrpreviewreportwindow.ui b/limereport/lrpreviewreportwindow.ui index 5c6cc24..23550ec 100644 --- a/limereport/lrpreviewreportwindow.ui +++ b/limereport/lrpreviewreportwindow.ui @@ -35,7 +35,7 @@ 0 0 800 - 20 + 22 @@ -93,6 +93,21 @@ + + + true + + + toolBar_2 + + + LeftToolBarArea + + + false + + + @@ -279,11 +294,25 @@ Show toolbar + + + + :/items/TextItem:/items/TextItem + + + InsertTextItem + + + Add new TextItem + + + + @@ -431,6 +460,22 @@ + + actionInsertTextItem + triggered() + LimeReport::PreviewReportWindow + slotInsertNewTextItem() + + + -1 + -1 + + + 399 + 299 + + + slotNextPage() @@ -441,5 +486,6 @@ slotFirstPage() slotLastPage() slotPrintToPDF() + slotInsertNewTextItem() From b74a72531cb20aa4f5e2d387483b3e027a114992 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 21 Feb 2019 19:15:31 +0300 Subject: [PATCH 279/347] Preview printer initialization changed --- limereport/lrpreviewreportwidget.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 24420fe..0ba6426 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -213,29 +213,29 @@ void PreviewReportWidget::printPages(QPrinter* printer) void PreviewReportWidget::print() { - if (m_defaultPrinter){ - printPages(m_defaultPrinter); - } else { + QPrinterInfo pi; + QPrinter lp(QPrinter::HighResolution); - QPrinterInfo pi; - QPrinter printer(QPrinter::HighResolution); - - if (!pi.defaultPrinter().isNull()) + if (!pi.defaultPrinter().isNull()){ #ifdef HAVE_QT4 - printer.setPrinterName(pi.defaultPrinter().printerName()); + lp.setPrinterName(pi.defaultPrinter().printerName()); #endif #ifdef HAVE_QT5 #if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - printer.setPrinterName(pi.defaultPrinterName()); + lp.setPrinterName(pi.defaultPrinterName()); #else - printer.setPrinterName(pi.defaultPrinter().printerName()); + lp.setPrinterName(pi.defaultPrinter().printerName()); #endif #endif - QPrintDialog dialog(&printer,QApplication::activeWindow()); - if (dialog.exec()==QDialog::Accepted){ - printPages(&printer); - } } + + QPrinter* printer = m_defaultPrinter ? m_defaultPrinter : &lp; + + QPrintDialog dialog(printer,QApplication::activeWindow()); + if (dialog.exec()==QDialog::Accepted){ + printPages(printer); + } + } void PreviewReportWidget::printToPDF() From fed80a8be168a8fe85b04d346dd57b4c744a2a12 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 21 Feb 2019 19:21:09 +0300 Subject: [PATCH 280/347] Preview printer initialization changed --- limereport/lrpreviewreportwidget.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 7b3290d..3f2a984 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -208,29 +208,29 @@ void PreviewReportWidget::printPages(QPrinter* printer) void PreviewReportWidget::print() { - if (m_defaultPrinter){ - printPages(m_defaultPrinter); - } else { + QPrinterInfo pi; + QPrinter lp(QPrinter::HighResolution); - QPrinterInfo pi; - QPrinter printer(QPrinter::HighResolution); - - if (!pi.defaultPrinter().isNull()) + if (!pi.defaultPrinter().isNull()){ #ifdef HAVE_QT4 - printer.setPrinterName(pi.defaultPrinter().printerName()); + lp.setPrinterName(pi.defaultPrinter().printerName()); #endif #ifdef HAVE_QT5 #if (QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)) - printer.setPrinterName(pi.defaultPrinterName()); + lp.setPrinterName(pi.defaultPrinterName()); #else - printer.setPrinterName(pi.defaultPrinter().printerName()); + lp.setPrinterName(pi.defaultPrinter().printerName()); #endif #endif - QPrintDialog dialog(&printer,QApplication::activeWindow()); - if (dialog.exec()==QDialog::Accepted){ - printPages(&printer); - } } + + QPrinter* printer = m_defaultPrinter ? m_defaultPrinter : &lp; + + QPrintDialog dialog(printer,QApplication::activeWindow()); + if (dialog.exec()==QDialog::Accepted){ + printPages(printer); + } + } void PreviewReportWidget::printToPDF() From 78cac1126cf9d066eef1ede2e16f81eea021ca49 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 21 Feb 2019 22:44:43 +0300 Subject: [PATCH 281/347] TextItem placement on a page has been fixed --- limereport/lritemdesignintf.cpp | 12 +++++++----- limereport/lrpagedesignintf.cpp | 21 +++++++++++++-------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/limereport/lritemdesignintf.cpp b/limereport/lritemdesignintf.cpp index a2b51f2..f90a90d 100644 --- a/limereport/lritemdesignintf.cpp +++ b/limereport/lritemdesignintf.cpp @@ -66,11 +66,13 @@ void ItemDesignIntf::setItemLocation(LocationType location) } else { if (scene()){ PageItemDesignIntf* page = dynamic_cast(scene())->pageItem(); - QPointF parentPos = page->mapFromItem(parentItem(),x(),y()); - setParentItem(page); - setParent(page); - setPos(parentPos); - emit itemLocationChanged(this, page); + if (page){ + QPointF parentPos = page->mapFromItem(parentItem(),x(),y()); + setParentItem(page); + setParent(page); + setPos(parentPos); + emit itemLocationChanged(this, page); + } } } notify("locationType",oldValue,location); diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index b379c3a..85ba475 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -491,13 +491,16 @@ BaseDesignIntf *PageDesignIntf::addReportItem(const QString &itemType, QPointF p reportItem->setSize(placeSizeOnGrid(size)); return reportItem; } else { - BaseDesignIntf *reportItem = addReportItem(itemType, pageItem(), pageItem()); - reportItem->setPos(placePosOnGrid(pageItem()->mapFromScene(pos))); - reportItem->setSize(placeSizeOnGrid(size)); - ItemDesignIntf* ii = dynamic_cast(reportItem); - if (ii) - ii->setItemLocation(ItemDesignIntf::Page); - return reportItem; + PageItemDesignIntf* page = pageItem() ? pageItem() : m_currentPage; + if (page){ + BaseDesignIntf *reportItem = addReportItem(itemType, page, page); + reportItem->setPos(placePosOnGrid(page->mapFromScene(pos))); + reportItem->setSize(placeSizeOnGrid(size)); + ItemDesignIntf* ii = dynamic_cast(reportItem); + if (ii) + ii->setItemLocation(ItemDesignIntf::Page); + return reportItem; + } } return 0; @@ -1066,7 +1069,9 @@ PageItemDesignIntf* PageDesignIntf::getCurrentPage() const void PageDesignIntf::setCurrentPage(PageItemDesignIntf* currentPage) { - m_currentPage = currentPage; + if (m_currentPage != currentPage ){ + m_currentPage = currentPage; + } } ReportSettings *PageDesignIntf::getReportSettings() const From 9bd392f4aca430133d7608ba7b05d0e2137fc9a5 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 22 Feb 2019 20:30:09 +0300 Subject: [PATCH 282/347] Lost headers moving has been fixed --- limereport/lrreportrender.cpp | 26 +++++++++++++++++++++++--- limereport/lrreportrender.h | 1 + 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index 08333c9..81523df 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -148,7 +148,8 @@ void ReportRender::renameChildItems(BaseDesignIntf *item){ ReportRender::ReportRender(QObject *parent) :QObject(parent), m_renderPageItem(0), m_pageCount(0), - m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), m_currentColumn(0), m_newPageStarted(false) + m_lastRenderedHeader(0), m_lastDataBand(0), m_lastRenderedFooter(0), + m_currentColumn(0), m_newPageStarted(false), m_lostHeadersMoved(false) { initColumns(); } @@ -490,7 +491,11 @@ BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesign bandClone->columnsFillDirection()==BandDesignIntf::VerticalUniform)) { startNewColumn(); - if (patternBand->bandHeader() && patternBand->bandHeader()->columnsCount()>1){ + if (patternBand->bandHeader() && + patternBand->bandHeader()->columnsCount()>1 && + !m_lostHeadersMoved && + patternBand->bandNestingLevel() == 0 + ){ renderBand(patternBand->bandHeader(), 0, mode); } } else { @@ -1164,7 +1169,15 @@ BandDesignIntf *ReportRender::saveUppperPartReturnBottom(BandDesignIntf *band, i if (band->columnsCount()>1 && (band->columnsFillDirection()==BandDesignIntf::Vertical || band->columnsFillDirection()==BandDesignIntf::VerticalUniform)){ - startNewColumn(); + startNewColumn(); + if (patternBand->bandHeader() && + patternBand->bandHeader()->columnsCount()>1 && + !m_lostHeadersMoved && + patternBand->bandNestingLevel() == 0 + ){ + renderBand(patternBand->bandHeader(), 0, StartNewPageAsNeeded); + } + } else { savePage(); startNewPage(); @@ -1332,12 +1345,16 @@ void ReportRender::checkLostHeadersOnPrevPage() } if (lostHeaders.size() > 0){ + m_lostHeadersMoved = true; qSort(lostHeaders.begin(), lostHeaders.end(), bandLessThen); foreach(BandDesignIntf* header, lostHeaders){ registerBand(header); } + } else { + m_lostHeadersMoved = false; } + } void ReportRender::checkLostHeadersInPrevColumn() @@ -1365,10 +1382,13 @@ void ReportRender::checkLostHeadersInPrevColumn() } if (lostHeaders.size() > 0){ + m_lostHeadersMoved = true; qSort(lostHeaders.begin(), lostHeaders.end(), bandLessThen); foreach(BandDesignIntf* header, lostHeaders){ registerBand(header); } + } else { + m_lostHeadersMoved = false; } } diff --git a/limereport/lrreportrender.h b/limereport/lrreportrender.h index 541f325..d31efce 100644 --- a/limereport/lrreportrender.h +++ b/limereport/lrreportrender.h @@ -215,6 +215,7 @@ private: QVector m_columnedBandItems; unsigned long long m_currentNameIndex; bool m_newPageStarted; + bool m_lostHeadersMoved; }; } // namespace LimeReport From 005e65f3e344be33cbe67c271603fd35db78f36f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 25 Feb 2019 16:22:10 +0300 Subject: [PATCH 283/347] Init commit --- include/lrglobal.h | 4 +- limereport/lrbanddesignintf.cpp | 21 ++++++--- limereport/lrbanddesignintf.h | 3 ++ limereport/lrbasedesignintf.cpp | 67 ++++++++++++++++++++++++----- limereport/lrbasedesignintf.h | 9 ++-- limereport/lrglobal.h | 4 +- limereport/lrpageitemdesignintf.cpp | 6 +++ limereport/lrpageitemdesignintf.h | 1 + 8 files changed, 93 insertions(+), 22 deletions(-) diff --git a/include/lrglobal.h b/include/lrglobal.h index ba5a363..76af327 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -52,8 +52,8 @@ namespace LimeReport { namespace Const{ - int const RESIZE_HANDLE_SIZE = 10; - int const SELECTION_PEN_SIZE = 4; + int const RESIZE_HANDLE_SIZE = 5; + int const SELECTION_PEN_SIZE = 1; int const MINIMUM_ITEM_WIDTH = 2*RESIZE_HANDLE_SIZE; int const MINIMUM_ITEM_HEIGHT = 2*RESIZE_HANDLE_SIZE; double const RESIZE_ZONE_OPACITY = 0.5; diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index c77f86c..94dc795 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -304,6 +304,12 @@ bool BandDesignIntf::isUnique() const return true; } +void BandDesignIntf::setItemMode(BaseDesignIntf::ItemMode mode) +{ + ItemsContainerDesignInft::setItemMode(mode); + updateBandMarkerGeometry(); +} + QString BandDesignIntf::datasourceName(){ return m_dataSourceName; } @@ -728,14 +734,19 @@ BandDesignIntf* BandDesignIntf::findParentBand() return 0; } +void BandDesignIntf::updateBandMarkerGeometry() +{ + if (parentItem() && m_bandMarker){ + QPointF sp = parentItem()->mapToScene(pos()); + m_bandMarker->setPos((sp.x()-m_bandMarker->boundingRect().width()),sp.y()); + m_bandMarker->setHeight(rect().height()); + } +} + void BandDesignIntf::geometryChangedEvent(QRectF, QRectF ) { if (((itemMode()&DesignMode) || (itemMode()&EditMode))&&parentItem()){ - QPointF sp = parentItem()->mapToScene(pos()); - if (m_bandMarker){ - m_bandMarker->setPos((sp.x()-m_bandMarker->boundingRect().width()),sp.y()); - m_bandMarker->setHeight(rect().height()); - } + updateBandMarkerGeometry(); } foreach (BaseDesignIntf* item, childBaseItems()) { if (item->itemAlign()!=DesignedItemAlign){ diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index 16009a5..193cf9c 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -142,6 +142,7 @@ public: virtual QString bandTitle() const; virtual QIcon bandIcon() const; virtual bool isUnique() const; + void setItemMode(BaseDesignIntf::ItemMode mode); void updateItemSize(DataSourceManager *dataManager, RenderPass pass=FirstPass, int maxHeight=0); void restoreItems(); void recalcItems(DataSourceManager* dataManager); @@ -250,6 +251,8 @@ public: void setBackgroundOpacity(int value); int bootomSpace() const; void setBootomSpace(int bootomSpace); + void updateBandMarkerGeometry(); + signals: void bandRendered(BandDesignIntf* band); void preparedForRender(); diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 0cb6c09..5c00bd6 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -81,7 +81,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_patternName(""), m_patternItem(0), m_fillInSecondPass(false), - m_watermark(false) + m_watermark(false), + m_hovered(false) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -104,7 +105,7 @@ QRectF BaseDesignIntf::boundingRect() const } BaseDesignIntf::~BaseDesignIntf(void) { - delete m_selectionMarker; + //delete m_selectionMarker; delete m_joinMarker; } @@ -394,6 +395,9 @@ void BaseDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *o drawBorder(ppainter, rect()); if (isSelected()) {drawSelection(ppainter, rect());} drawResizeZone(ppainter); +// if (m_hovered) ppainter->drawImage( +// QRectF(QPointF(rect().topRight().x()-24, rect().bottomLeft().y()-24), +// QSizeF(24, 24)),QImage(":/items/images/settings.png")); } QColor calcColor(QColor color){ @@ -480,6 +484,14 @@ void BaseDesignIntf::hoverLeaveEvent(QGraphicsSceneHoverEvent *) m_resizeDirectionFlags = 0; scene()->update(sceneBoundingRect()); m_resizeAreas.clear(); + m_hovered = false; + update(); +} + +void BaseDesignIntf::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +{ + m_hovered = true; + update(); } @@ -710,6 +722,7 @@ void BaseDesignIntf::turnOnSelectionMarker(bool value) if (value && !m_selectionMarker){ m_selectionMarker = new SelectionMarker(this); m_selectionMarker->setColor(selectionMarkerColor()); + m_selectionMarker->setZValue(zValue()-1); updateSelectionMarker(); m_selectionMarker->setVisible(true); } else { @@ -1119,6 +1132,28 @@ void BaseDesignIntf::drawSelection(QPainter *painter, QRectF /*rect*/) const // painter->drawLine(rect.right(),rect.bottom()-m_resizeHandleSize,rect.right(),rect.bottom()); // painter->setOpacity(Consts::SELECTION_COLOR_OPACITY); // painter->fillRect(rect,selectionColor()); + + QPen pen(Qt::red,m_selectionPenSize); + painter->setPen(pen); + painter->setBrush(QBrush(Qt::red)); + const int markerSize = Const::RESIZE_HANDLE_SIZE; + painter->drawRect(QRectF(-markerSize,-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().right()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().right()-markerSize,rect().top()-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().left()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().left()-markerSize, + rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().right()-markerSize, + rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, + rect().top()-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, + rect().bottom()-markerSize,markerSize*2,markerSize*2)); + + pen.setStyle(Qt::DotLine); + painter->setPen(pen); + painter->setBrush(QBrush(Qt::transparent)); + painter->drawRect(rect()); painter->restore(); } @@ -1298,13 +1333,13 @@ void BaseDesignIntf::setMarginSize(int value) void BaseDesignIntf::updateSelectionMarker() { - if (m_selectionMarker && (itemMode() & DesignMode || itemMode() & EditMode)) { - if ((!m_selectionMarker->scene()) && scene()) scene()->addItem(m_selectionMarker); - if (parentItem()) { - m_selectionMarker->setRect(rect()); - m_selectionMarker->setPos(0,0); - } - } +// if (m_selectionMarker && (itemMode() & DesignMode || itemMode() & EditMode)) { +// if ((!m_selectionMarker->scene()) && scene()) scene()->addItem(m_selectionMarker); +// if (parentItem()) { +// m_selectionMarker->setRect(rect()); +// m_selectionMarker->setPos(0,0); +// } +// } } void BaseDesignIntf::drawResizeZone(QPainter* /*painter*/) @@ -1561,6 +1596,18 @@ void SelectionMarker::hoverMoveEvent(QGraphicsSceneHoverEvent *event) if(baseItem) baseItem->hoverMoveEvent(event); } +void SelectionMarker::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +{ + BaseDesignIntf* baseItem = dynamic_cast(parentItem()); + if (baseItem) baseItem->hoverLeaveEvent(event); +} + +void SelectionMarker::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +{ + BaseDesignIntf* baseItem = dynamic_cast(parentItem()); + if (baseItem) baseItem->hoverEnterEvent(event); +} + void SelectionMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) { parentItem()->setSelected(true); @@ -1596,7 +1643,7 @@ QRectF Marker::boundingRect() const void Marker::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) { QPen pen; - const int markerSize = 5; + const int markerSize = Const::RESIZE_HANDLE_SIZE; pen.setColor(color()); pen.setWidth(2); pen.setStyle(Qt::DotLine); diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 9bfb288..9b7d599 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -70,6 +70,8 @@ public: SelectionMarker(QGraphicsItem* parent=0); protected: void hoverMoveEvent(QGraphicsSceneHoverEvent *event); + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + void hoverEnterEvent(QGraphicsSceneHoverEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); @@ -204,7 +206,7 @@ public: void setItemPos(const QPointF &newPos); void setItemPos(qreal x, qreal y); - void setItemMode(LimeReport::BaseDesignIntf::ItemMode mode); + virtual void setItemMode(LimeReport::BaseDesignIntf::ItemMode mode); ItemMode itemMode() const {return m_itemMode;} virtual void setBorderLinesFlags(LimeReport::BaseDesignIntf::BorderLines flags); @@ -305,10 +307,11 @@ protected: void mousePressEvent(QGraphicsSceneMouseEvent* event); void hoverMoveEvent(QGraphicsSceneHoverEvent* event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); - //void virtual hoverEnterEvent(QGraphicsSceneHoverEvent *event); + void hoverEnterEvent(QGraphicsSceneHoverEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent* event); void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); + void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); virtual void geometryChangedEvent(QRectF newRect, QRectF oldRect); @@ -415,7 +418,7 @@ private: BaseDesignIntf* m_patternItem; bool m_fillInSecondPass; bool m_watermark; - + bool m_hovered; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanging(QObject* object, QPointF newPos, QPointF oldPos); diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index ba5a363..76af327 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -52,8 +52,8 @@ namespace LimeReport { namespace Const{ - int const RESIZE_HANDLE_SIZE = 10; - int const SELECTION_PEN_SIZE = 4; + int const RESIZE_HANDLE_SIZE = 5; + int const SELECTION_PEN_SIZE = 1; int const MINIMUM_ITEM_WIDTH = 2*RESIZE_HANDLE_SIZE; int const MINIMUM_ITEM_HEIGHT = 2*RESIZE_HANDLE_SIZE; double const RESIZE_ZONE_OPACITY = 0.5; diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 0f8d98a..c3ad3cb 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -164,6 +164,12 @@ QRectF PageItemDesignIntf::boundingRect() const } } +void PageItemDesignIntf::setItemMode(BaseDesignIntf::ItemMode mode) +{ + ItemsContainerDesignInft::setItemMode(mode); + relocateBands(); +} + void PageItemDesignIntf::clear() { foreach(QGraphicsItem* item, childItems()){ diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 39c0fe3..09fa2d6 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -90,6 +90,7 @@ public: virtual QColor pageBorderColor() const; virtual QColor gridColor() const; virtual QRectF boundingRect() const; + void setItemMode(LimeReport::BaseDesignIntf::ItemMode mode); void clear(); const BandsList& childBands() const {return m_bands;} BandDesignIntf * bandByType(BandDesignIntf::BandsType bandType) const; From f85b56480855ee902c18d46a4ca13bff27d3e485 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 26 Feb 2019 20:29:13 +0300 Subject: [PATCH 284/347] Selection border painting has been fixed --- limereport/lrbasedesignintf.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 5c00bd6..fdd0bf4 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -52,7 +52,7 @@ namespace LimeReport BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, QGraphicsItem *parent) : QObject(owner), QGraphicsItem(parent), - m_resizeHandleSize(Const::RESIZE_HANDLE_SIZE), + m_resizeHandleSize(Const::RESIZE_HANDLE_SIZE*2), m_selectionPenSize(Const::SELECTION_PEN_SIZE), m_possibleResizeDirectionFlags(ResizeTop | ResizeBottom | ResizeLeft | ResizeRight), m_possibleMoveDirectionFlags(All), @@ -1136,6 +1136,7 @@ void BaseDesignIntf::drawSelection(QPainter *painter, QRectF /*rect*/) const QPen pen(Qt::red,m_selectionPenSize); painter->setPen(pen); painter->setBrush(QBrush(Qt::red)); + painter->setOpacity(1); const int markerSize = Const::RESIZE_HANDLE_SIZE; painter->drawRect(QRectF(-markerSize,-markerSize,markerSize*2,markerSize*2)); painter->drawRect(QRectF(rect().right()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); From 6ce77268fdd3c15e04e57e28392e72330cfea614 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 27 Feb 2019 00:50:59 +0300 Subject: [PATCH 285/347] Join & selection marker has been removed --- limereport/lrbasedesignintf.cpp | 176 ++++------------------------ limereport/lrbasedesignintf.h | 38 +----- limereport/lrpagedesignintf.cpp | 92 ++++++++++++--- limereport/lrpagedesignintf.h | 5 +- limereport/lrpageitemdesignintf.cpp | 2 +- 5 files changed, 102 insertions(+), 211 deletions(-) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index fdd0bf4..55aed88 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -69,8 +69,6 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_storageTypeName(storageTypeName), m_itemMode(DesignMode), m_objectState(ObjectCreated), - m_selectionMarker(0), - m_joinMarker(0), m_backgroundBrushStyle(SolidPattern), m_backgroundColor(Qt::white), m_margin(4), @@ -82,7 +80,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_patternItem(0), m_fillInSecondPass(false), m_watermark(false), - m_hovered(false) + m_hovered(false), + m_joinMarkerOn(false) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -106,7 +105,7 @@ QRectF BaseDesignIntf::boundingRect() const BaseDesignIntf::~BaseDesignIntf(void) { //delete m_selectionMarker; - delete m_joinMarker; + //delete m_joinMarker; } void BaseDesignIntf::setParentReportItem(const QString &value) @@ -391,10 +390,13 @@ void BaseDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *o { Q_UNUSED(option); Q_UNUSED(widget); + ppainter->save(); setupPainter(ppainter); drawBorder(ppainter, rect()); - if (isSelected()) {drawSelection(ppainter, rect());} + if (m_joinMarkerOn) { drawMarker(ppainter, Const::JOIN_COLOR);} + if (isSelected() && !m_joinMarkerOn) {drawMarker(ppainter, Const::SELECTION_COLOR);} drawResizeZone(ppainter); + ppainter->restore(); // if (m_hovered) ppainter->drawImage( // QRectF(QPointF(rect().topRight().x()-24, rect().bottomLeft().y()-24), // QSizeF(24, 24)),QImage(":/items/images/settings.png")); @@ -573,6 +575,7 @@ void BaseDesignIntf::mouseMoveEvent(QGraphicsSceneMouseEvent *event) moveSelectedItems(tmpPos - pos()); if (page()->selectedItems().count()==1 && (page()->magneticMovement())) page()->itemMoved(this); + } } } @@ -673,15 +676,17 @@ QPointF BaseDesignIntf::modifyPosForAlignedItem(const QPointF& pos){ void BaseDesignIntf::turnOnJoinMarker(bool value) { - if (value){ - m_joinMarker = new Marker(this); - m_joinMarker->setColor(Const::JOIN_COLOR); - m_joinMarker->setRect(rect()); - m_joinMarker->setVisible(true); - } else { - delete m_joinMarker; - m_joinMarker = 0; - } + m_joinMarkerOn = value; + update(); +// if (value){ +// m_joinMarker = new Marker(this); +// m_joinMarker->setColor(Const::JOIN_COLOR); +// m_joinMarker->setRect(rect()); +// m_joinMarker->setVisible(true); +// } else { +// delete m_joinMarker; +// m_joinMarker = 0; +// } } void BaseDesignIntf::updateItemAlign(){ @@ -717,20 +722,6 @@ void BaseDesignIntf::updatePossibleDirectionFlags(){ } } -void BaseDesignIntf::turnOnSelectionMarker(bool value) -{ - if (value && !m_selectionMarker){ - m_selectionMarker = new SelectionMarker(this); - m_selectionMarker->setColor(selectionMarkerColor()); - m_selectionMarker->setZValue(zValue()-1); - updateSelectionMarker(); - m_selectionMarker->setVisible(true); - } else { - delete m_selectionMarker; - m_selectionMarker = 0; - } -} - bool BaseDesignIntf::fillInSecondPass() const { return m_fillInSecondPass; @@ -988,7 +979,6 @@ void BaseDesignIntf::setGeometry(QRectF rect) m_leftRect = QRectF(0-resizeHandleSize(), 0-resizeHandleSize(), resizeHandleSize()*2, height()+resizeHandleSize()*2); m_rightRect = QRectF(width() - resizeHandleSize(), 0-resizeHandleSize(), resizeHandleSize()*2, height()+resizeHandleSize()*2); m_boundingRect = QRectF(); - updateSelectionMarker(); if (!isLoading()){ geometryChangedEvent(geometry(), m_oldGeometry); emit geometryChanged(this, geometry(), m_oldGeometry); @@ -1074,11 +1064,9 @@ void BaseDesignIntf::initMode(ItemMode mode) QVariant BaseDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { if (change == QGraphicsItem::ItemPositionHasChanged) { - updateSelectionMarker(); } if (change == QGraphicsItem::ItemSelectedChange) { - turnOnSelectionMarker(value.toBool()); emit itemSelectedHasBeenChanged(this, value.toBool()); } if (change == QGraphicsItem::ItemParentHasChanged) { @@ -1118,24 +1106,13 @@ QPainterPath BaseDesignIntf::shape() const return path; } -void BaseDesignIntf::drawSelection(QPainter *painter, QRectF /*rect*/) const +void BaseDesignIntf::drawMarker(QPainter *painter, QColor color) const { painter->save(); - // painter->setPen(QPen(Qt::red,m_selectionPenSize)); - // painter->drawLine(QPointF(m_resizeHandleSize,0),QPointF(0,0)); - // painter->drawLine(QPointF(0,m_resizeHandleSize),QPointF(0,0)); - // painter->drawLine(rect.right()-m_resizeHandleSize,0,rect.right(),0); - // painter->drawLine(rect.right(),m_resizeHandleSize,rect.right(),0); - // painter->drawLine(0,rect.bottom(),0,rect.bottom()-10); - // painter->drawLine(0,rect.bottom(),m_resizeHandleSize,rect.bottom()); - // painter->drawLine(rect.right()-m_resizeHandleSize,rect.bottom(),rect.right(),rect.bottom()); - // painter->drawLine(rect.right(),rect.bottom()-m_resizeHandleSize,rect.right(),rect.bottom()); - // painter->setOpacity(Consts::SELECTION_COLOR_OPACITY); - // painter->fillRect(rect,selectionColor()); - QPen pen(Qt::red,m_selectionPenSize); + QPen pen(color, m_selectionPenSize); painter->setPen(pen); - painter->setBrush(QBrush(Qt::red)); + painter->setBrush(QBrush(color)); painter->setOpacity(1); const int markerSize = Const::RESIZE_HANDLE_SIZE; painter->drawRect(QRectF(-markerSize,-markerSize,markerSize*2,markerSize*2)); @@ -1202,7 +1179,6 @@ void BaseDesignIntf::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) QRectF newGeometry = geometry(); if (newGeometry != m_oldGeometry) { geometryChangedEvent(newGeometry, m_oldGeometry); - updateSelectionMarker(); emit(posChanged(this, newGeometry.topLeft(), m_oldGeometry.topLeft())); } QGraphicsItem::mouseReleaseEvent(event); @@ -1332,17 +1308,6 @@ void BaseDesignIntf::setMarginSize(int value) } } -void BaseDesignIntf::updateSelectionMarker() -{ -// if (m_selectionMarker && (itemMode() & DesignMode || itemMode() & EditMode)) { -// if ((!m_selectionMarker->scene()) && scene()) scene()->addItem(m_selectionMarker); -// if (parentItem()) { -// m_selectionMarker->setRect(rect()); -// m_selectionMarker->setPos(0,0); -// } -// } -} - void BaseDesignIntf::drawResizeZone(QPainter* /*painter*/) { @@ -1585,103 +1550,6 @@ void BaseDesignIntf::notify(const QVector& propertyNames) emit propertyesChanged(propertyNames); } -SelectionMarker::SelectionMarker(QGraphicsItem *parent)//, QGraphicsScene *scene) - : Marker(parent) -{ - setAcceptHoverEvents(true); -} - -void SelectionMarker::hoverMoveEvent(QGraphicsSceneHoverEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->hoverMoveEvent(event); -} - -void SelectionMarker::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if (baseItem) baseItem->hoverLeaveEvent(event); -} - -void SelectionMarker::hoverEnterEvent(QGraphicsSceneHoverEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if (baseItem) baseItem->hoverEnterEvent(event); -} - -void SelectionMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - parentItem()->setSelected(true); - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->mousePressEvent(event); - QGraphicsItem::mousePressEvent(event); -} - -void SelectionMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->mouseReleaseEvent(event); -} - -void SelectionMarker::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->mouseDoubleClickEvent(event); - QGraphicsItem::mouseDoubleClickEvent(event); -} - -void SelectionMarker::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - BaseDesignIntf* baseItem = dynamic_cast(parentItem()); - if(baseItem) baseItem->mouseMoveEvent(event); -} - -QRectF Marker::boundingRect() const -{ - return m_rect.adjusted(-15,-15,15,15); -} - -void Marker::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) -{ - QPen pen; - const int markerSize = Const::RESIZE_HANDLE_SIZE; - pen.setColor(color()); - pen.setWidth(2); - pen.setStyle(Qt::DotLine); - painter->setPen(pen); - painter->setOpacity(Const::SELECTION_COLOR_OPACITY); - painter->drawRect(rect()); - painter->setBrush(color()); - painter->setPen(Qt::transparent); - painter->setOpacity(1); - painter->drawRect(QRectF(-markerSize,-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize,rect().top()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()-markerSize, - rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().right()-markerSize, - rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, - rect().top()-markerSize,markerSize*2,markerSize*2)); - painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, - rect().bottom()-markerSize,markerSize*2,markerSize*2)); -} - -QRectF Marker::rect() const -{ - return m_rect; -} - -QColor Marker::color() const -{ - return m_color; -} - -BaseDesignIntf *Marker::object() const -{ - return m_object; -} QMap BaseDesignIntf::getStringForTranslation(){ return QMap(); diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 9b7d599..becf95a 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -47,37 +47,6 @@ enum ItemModes{ DesignMode=1, PreviewMode=2, PrintMode=4, EditMode=8, LayoutEdit class ReportEnginePrivate; class PageDesignIntf; -class BaseDesignIntf; - -class Marker : public QGraphicsItem{ -public: - Marker(QGraphicsItem* parent=0):QGraphicsItem(parent),m_object(NULL){} - QRectF boundingRect() const; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); - void setRect(QRectF rect){prepareGeometryChange();m_rect=rect;} - void setColor(QColor color){m_color=color;} - QRectF rect() const; - QColor color() const; - BaseDesignIntf *object() const; -private: - QRectF m_rect; - QColor m_color; - BaseDesignIntf* m_object; -}; - -class SelectionMarker : public Marker{ -public: - SelectionMarker(QGraphicsItem* parent=0); -protected: - void hoverMoveEvent(QGraphicsSceneHoverEvent *event); - void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); - void hoverEnterEvent(QGraphicsSceneHoverEvent *event); - void mousePressEvent(QGraphicsSceneMouseEvent *event); - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); - void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); - void mouseMoveEvent(QGraphicsSceneMouseEvent *event); -}; - class DataSourceManager; class ReportRender; @@ -334,7 +303,7 @@ protected: void drawDesignModeBorder(QPainter* painter, QRectF rect) const; void drawRenderModeBorder(QPainter *painter, QRectF rect) const; void drawResizeZone(QPainter*); - void drawSelection(QPainter* painter, QRectF) const; + void drawMarker(QPainter* painter, QColor color) const; void drawPinArea(QPainter* painter) const; void initResizeZones(); @@ -361,12 +330,10 @@ protected: qreal calcAbsolutePosX(qreal currentOffset, BaseDesignIntf* item); private: - void updateSelectionMarker(); int resizeDirectionFlags(QPointF position); void moveSelectedItems(QPointF delta); Qt::CursorShape getPossibleCursor(int cursorFlags); void updatePossibleDirectionFlags(); - void turnOnSelectionMarker(bool value); private: QPointF m_startPos; int m_resizeHandleSize; @@ -401,8 +368,6 @@ private: ItemMode m_itemMode; ObjectState m_objectState; - SelectionMarker* m_selectionMarker; - Marker* m_joinMarker; BrushStyle m_backgroundBrushStyle; QColor m_backgroundColor; @@ -419,6 +384,7 @@ private: bool m_fillInSecondPass; bool m_watermark; bool m_hovered; + bool m_joinMarkerOn; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanging(QObject* object, QPointF newPos, QPointF oldPos); diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 1bb5558..b8a164c 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -339,6 +339,15 @@ void PageDesignIntf::mouseMoveEvent(QGraphicsSceneMouseEvent *event) qreal posY = div(pageItem()->mapFromScene(event->scenePos()).y(), verticalGridStep()).quot * verticalGridStep(); qreal posX = div(pageItem()->mapFromScene(event->scenePos()).x(), verticalGridStep()).quot * horizontalGridStep(); m_itemInsertRect->setPos(posX,posY); + if (magneticMovement()){ + rectMoved( + QRectF(m_itemInsertRect->pos().x(), + m_itemInsertRect->pos().y(), + m_itemInsertRect->boundingRect().width(), + m_itemInsertRect->boundingRect().height() + ) + ); + } } else { if (m_insertMode) m_itemInsertRect->setVisible(false); } @@ -1102,9 +1111,53 @@ void PageDesignIntf::endUpdate() emit pageUpdateFinished(this); } + +void PageDesignIntf::activateItemToJoin(QRectF itemRect, QList& items){ + QRectF r1(itemRect.x(), itemRect.y()-50, itemRect.width(), itemRect.height()+100); + QRectF r2(itemRect.x()-50, itemRect.y(), itemRect.width()+100, itemRect.height()); + qreal maxSquare = 0; + + if (m_joinItem) { + m_joinItem->turnOnJoinMarker(false); + m_joinItem = 0; + } + + foreach(ItemProjections p, items){ + qreal tmpSquare = qMax(p.square(r1)/itemRect.width(),p.square(r2)/itemRect.height()); + if (tmpSquare>maxSquare) { + maxSquare = tmpSquare; + m_joinItem = p.item(); + if (p.square(r1)/itemRect.width() > p.square(r2) / itemRect.height()) + m_joinType = Width; + else + m_joinType = Height; + } + } + + if (m_joinItem) m_joinItem->turnOnJoinMarker(true); +} + +void PageDesignIntf::rectMoved(QRectF itemRect, BaseDesignIntf* container){ + if (!container){ + container = bandAt(QPointF(itemRect.topLeft())); + if (!container) container = this->pageItem(); + } + + if (container){ + m_projections.clear(); + foreach(BaseDesignIntf* bi, container->childBaseItems()){ + m_projections.append(ItemProjections(bi)); + } + } + + activateItemToJoin(itemRect, m_projections); + +} + void PageDesignIntf::itemMoved(BaseDesignIntf *item) { if (m_movedItem!=item){ + m_movedItem = item; BaseDesignIntf* curItem = dynamic_cast(item->parentItem()); ; while (curItem){ m_movedItemContainer = dynamic_cast(curItem); @@ -1122,28 +1175,29 @@ void PageDesignIntf::itemMoved(BaseDesignIntf *item) } } - QRectF r1(item->pos().x(),item->pos().y()-50,item->width(),item->height()+100); - QRectF r2(item->pos().x()-50,item->pos().y(),item->width()+100,item->height()); - qreal maxSquare = 0; + activateItemToJoin(item->geometry(), m_projections); +// QRectF r1(item->pos().x(),item->pos().y()-50,item->width(),item->height()+100); +// QRectF r2(item->pos().x()-50,item->pos().y(),item->width()+100,item->height()); +// qreal maxSquare = 0; - if (m_joinItem) { - m_joinItem->turnOnJoinMarker(false); - m_joinItem = 0; - } +// if (m_joinItem) { +// m_joinItem->turnOnJoinMarker(false); +// m_joinItem = 0; +// } - foreach(ItemProjections p, m_projections){ - qreal tmpSquare = qMax(p.square(r1)/item->width(),p.square(r2)/item->height()); - if (tmpSquare>maxSquare) { - maxSquare = tmpSquare; - m_joinItem = p.item(); - if (p.square(r1)/item->width()>p.square(r2)/item->height()) - m_joinType = Width; - else - m_joinType = Height; - } - } +// foreach(ItemProjections p, m_projections){ +// qreal tmpSquare = qMax(p.square(r1)/item->width(),p.square(r2)/item->height()); +// if (tmpSquare>maxSquare) { +// maxSquare = tmpSquare; +// m_joinItem = p.item(); +// if (p.square(r1)/item->width()>p.square(r2)/item->height()) +// m_joinType = Width; +// else +// m_joinType = Height; +// } +// } - if (m_joinItem) m_joinItem->turnOnJoinMarker(true); +// if (m_joinItem) m_joinItem->turnOnJoinMarker(true); } diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 901ddbc..49f8031 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -166,6 +166,7 @@ namespace LimeReport { bool isUpdating(){return m_updating;} void endUpdate(); + void rectMoved(QRectF itemRect, BaseDesignIntf* container = 0); void itemMoved(BaseDesignIntf* item); bool magneticMovement() const; void setMagneticMovement(bool magneticMovement); @@ -175,6 +176,7 @@ namespace LimeReport { void setPropertyToSelectedItems(const char *name, const QVariant &value); + protected: virtual void keyPressEvent(QKeyEvent *event); @@ -272,7 +274,7 @@ namespace LimeReport { const QVariant& oldPropertyValue, const QVariant& newPropertyValue); void changeSelectedGroupProperty(const QString& name,const QVariant& value); - + void activateItemToJoin(QRectF itemRect, QList& items); private: enum JoinType{Width, Height}; LimeReport::PageItemDesignIntf::Ptr m_pageItem; @@ -312,6 +314,7 @@ namespace LimeReport { JoinType m_joinType; bool m_magneticMovement; ReportSettings* m_reportSettings; + }; class AbstractPageCommand : public CommandIf{ diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index c3ad3cb..d0f949e 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -479,7 +479,7 @@ void PageItemDesignIntf::relocateBands() { if (isLoading()) return; - int bandSpace = (itemMode() & DesignMode)?4:0; + int bandSpace = (itemMode() & DesignMode)?0:0; QVector posByColumn; From 1c2aed14f49835f2cf07d6c305943e19fb33bf7c Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 27 Feb 2019 22:34:34 +0300 Subject: [PATCH 286/347] TableBuilder has been fixed --- limereport/lrscriptenginemanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 2689501..f6197e9 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -1881,6 +1881,7 @@ QObject* TableBuilder::addRow() checkBaseLayout(); if (m_baseLayout && m_patternLayout){ HorizontalLayout* newRow = new HorizontalLayout(m_baseLayout, m_baseLayout); + newRow->setLayoutSpacing(m_horizontalLayout->layoutSpacing()); for(int i = 0; i < m_horizontalLayout->childrenCount(); ++i){ BaseDesignIntf* item = dynamic_cast(m_patternLayout->at(i)); BaseDesignIntf* cloneItem = item->cloneItem(item->itemMode(), newRow, newRow); From 8c278f847302ae9d9e965b9a4ac0b327c302affc Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 28 Feb 2019 12:28:38 +0300 Subject: [PATCH 287/347] common.pri has been changed --- common.pri | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common.pri b/common.pri index dca1d40..ddf7199 100644 --- a/common.pri +++ b/common.pri @@ -132,7 +132,7 @@ TRANSLATIONS_PATH = $$PWD/translations greaterThan(QT_MAJOR_VERSION, 4) { DEFINES *= HAVE_QT5 - QT *= printsupport widgets qml + QT *= printsupport widgets contains(QT,uitools){ message(uitools) DEFINES *= HAVE_UI_LOADER @@ -140,6 +140,7 @@ greaterThan(QT_MAJOR_VERSION, 4) { contains(CONFIG, qjsengine){ message(qjsengine) DEFINES *= USE_QJSENGINE + QT *= qml } } From 1bb6fc8f5a8bab925b398392071b7b1aef0e7077 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Mar 2019 02:47:19 +0300 Subject: [PATCH 288/347] Band marker has been refactored Selection & join markers have been returned back --- limereport/lrbanddesignintf.cpp | 37 ++++++++- limereport/lrbanddesignintf.h | 6 +- limereport/lrbasedesignintf.cpp | 129 ++++++++++++++++++++++++++++---- limereport/lrbasedesignintf.h | 35 ++++++++- 4 files changed, 188 insertions(+), 19 deletions(-) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 94dc795..f4a0038 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -39,7 +39,9 @@ namespace LimeReport { BandMarker::BandMarker(BandDesignIntf *band, QGraphicsItem* parent) :QGraphicsItem(parent),m_rect(0,0,30,30),m_band(band) -{} +{ + setAcceptHoverEvents(true); +} QRectF BandMarker::boundingRect() const { @@ -52,6 +54,13 @@ void BandMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem* /**opt painter->setOpacity(Const::BAND_MARKER_OPACITY); painter->fillRect(boundingRect(),m_color); painter->setOpacity(1); + painter->setPen(QPen(QBrush(Qt::white),2)); + painter->fillRect(QRectF( + boundingRect().bottomLeft().x(), + boundingRect().bottomLeft().y()-4, + boundingRect().width(),4), Qt::white + ); + painter->setRenderHint(QPainter::Antialiasing); qreal size = (boundingRect().width()setBrush(LimeReport::Const::SELECTION_COLOR); painter->drawEllipse(r.adjusted(7,7,-7,-7)); } + painter->restore(); } @@ -104,6 +114,31 @@ void BandMarker::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) m_band->contextMenuEvent(event); } +void BandMarker::hoverMoveEvent(QGraphicsSceneHoverEvent* event) +{ + if (QRectF(0, height()-10, width(), 10).contains(event->pos())){ + setCursor(Qt::SizeVerCursor); + } else { + unsetCursor(); + } +} + +void BandMarker::mouseMoveEvent(QGraphicsSceneMouseEvent* event) +{ + qreal delta = event->pos().y() - event->lastPos().y(); + if (hasCursor()){ + m_band->setHeight(m_band->height() + delta); + } else { + if (!m_band->isFixedPos()) + m_band->setItemPos(QPointF(m_band->pos().x(),m_band->pos().y()+delta)); + } +} + +void BandMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) +{ + m_band->posChanged(m_band, m_band->pos(), m_band->pos()); +} + BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, QObject* owner, QGraphicsItem *parent) : ItemsContainerDesignInft(xmlTypeName, owner,parent), m_bandType(bandType), diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index 193cf9c..33bca63 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -62,8 +62,12 @@ public: qreal width(){return m_rect.width();} qreal height(){return m_rect.height();} protected: - void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mousePressEvent(QGraphicsSceneMouseEvent *event); void contextMenuEvent(QGraphicsSceneContextMenuEvent *event); + + void hoverMoveEvent(QGraphicsSceneHoverEvent* event); + void mouseMoveEvent(QGraphicsSceneMouseEvent* event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); private: QRectF m_rect; QColor m_color; diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 55aed88..efebfd8 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -81,7 +81,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_fillInSecondPass(false), m_watermark(false), m_hovered(false), - m_joinMarkerOn(false) + m_joinMarkerOn(false), + m_selectionMarker(0) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -104,8 +105,7 @@ QRectF BaseDesignIntf::boundingRect() const } BaseDesignIntf::~BaseDesignIntf(void) { - //delete m_selectionMarker; - //delete m_joinMarker; + } void BaseDesignIntf::setParentReportItem(const QString &value) @@ -393,8 +393,8 @@ void BaseDesignIntf::paint(QPainter *ppainter, const QStyleOptionGraphicsItem *o ppainter->save(); setupPainter(ppainter); drawBorder(ppainter, rect()); - if (m_joinMarkerOn) { drawMarker(ppainter, Const::JOIN_COLOR);} - if (isSelected() && !m_joinMarkerOn) {drawMarker(ppainter, Const::SELECTION_COLOR);} +// if (m_joinMarkerOn) { drawMarker(ppainter, Const::JOIN_COLOR);} +// if (isSelected() && !m_joinMarkerOn) {drawMarker(ppainter, Const::SELECTION_COLOR);} drawResizeZone(ppainter); ppainter->restore(); // if (m_hovered) ppainter->drawImage( @@ -677,16 +677,15 @@ QPointF BaseDesignIntf::modifyPosForAlignedItem(const QPointF& pos){ void BaseDesignIntf::turnOnJoinMarker(bool value) { m_joinMarkerOn = value; - update(); -// if (value){ -// m_joinMarker = new Marker(this); -// m_joinMarker->setColor(Const::JOIN_COLOR); -// m_joinMarker->setRect(rect()); -// m_joinMarker->setVisible(true); -// } else { -// delete m_joinMarker; -// m_joinMarker = 0; -// } + if (value){ + m_joinMarker = new Marker(this, this); + m_joinMarker->setColor(Const::JOIN_COLOR); + m_joinMarker->setRect(rect()); + m_joinMarker->setVisible(true); + } else { + delete m_joinMarker; + m_joinMarker = 0; + } } void BaseDesignIntf::updateItemAlign(){ @@ -750,6 +749,31 @@ void BaseDesignIntf::setWatermark(bool watermark) } } +void BaseDesignIntf::updateSelectionMarker() +{ + if (m_selectionMarker && (itemMode() & DesignMode || itemMode() & EditMode)) { + if ((!m_selectionMarker->scene()) && scene()) scene()->addItem(m_selectionMarker); + if (parentItem()) { + m_selectionMarker->setRect(rect()); + m_selectionMarker->setPos(0,0); + } + } +} + +void BaseDesignIntf::turnOnSelectionMarker(bool value) +{ + if (value && !m_selectionMarker){ + m_selectionMarker = new SelectionMarker(this, this); + m_selectionMarker->setColor(selectionMarkerColor()); + updateSelectionMarker(); + m_selectionMarker->setVisible(true); + m_selectionMarker->setZValue(10000); + } else { + delete m_selectionMarker; + m_selectionMarker = 0; + } +} + QString BaseDesignIntf::patternName() const { return (m_patternName.isEmpty()) ? objectName() : m_patternName; @@ -979,6 +1003,7 @@ void BaseDesignIntf::setGeometry(QRectF rect) m_leftRect = QRectF(0-resizeHandleSize(), 0-resizeHandleSize(), resizeHandleSize()*2, height()+resizeHandleSize()*2); m_rightRect = QRectF(width() - resizeHandleSize(), 0-resizeHandleSize(), resizeHandleSize()*2, height()+resizeHandleSize()*2); m_boundingRect = QRectF(); + updateSelectionMarker(); if (!isLoading()){ geometryChangedEvent(geometry(), m_oldGeometry); emit geometryChanged(this, geometry(), m_oldGeometry); @@ -1064,9 +1089,11 @@ void BaseDesignIntf::initMode(ItemMode mode) QVariant BaseDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { if (change == QGraphicsItem::ItemPositionHasChanged) { + updateSelectionMarker(); } if (change == QGraphicsItem::ItemSelectedChange) { + turnOnSelectionMarker(value.toBool()); emit itemSelectedHasBeenChanged(this, value.toBool()); } if (change == QGraphicsItem::ItemParentHasChanged) { @@ -1179,7 +1206,7 @@ void BaseDesignIntf::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) QRectF newGeometry = geometry(); if (newGeometry != m_oldGeometry) { geometryChangedEvent(newGeometry, m_oldGeometry); - emit(posChanged(this, newGeometry.topLeft(), m_oldGeometry.topLeft())); + emit posChanged(this, newGeometry.topLeft(), m_oldGeometry.topLeft()); } QGraphicsItem::mouseReleaseEvent(event); } @@ -1569,4 +1596,74 @@ void BookmarkContainerDesignIntf::copyBookmarks(BookmarkContainerDesignIntf* sou } } +QRectF Marker::boundingRect() const +{ + return m_rect.adjusted(-15,-15,15,15); +} + +void Marker::paint(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget*) +{ + QPen pen; + const int markerSize = 5; + pen.setColor(color()); + pen.setWidth(2); + pen.setStyle(Qt::DotLine); + painter->setPen(pen); + painter->setOpacity(Const::SELECTION_COLOR_OPACITY); + painter->drawRect(rect()); + painter->setBrush(color()); + painter->setPen(Qt::transparent); + painter->setOpacity(1); + painter->drawRect(QRectF(-markerSize,-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().right()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().right()-markerSize,rect().top()-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().left()-markerSize,rect().bottom()-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().left()-markerSize, + rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().right()-markerSize, + rect().bottom()-rect().height()/2-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, + rect().top()-markerSize,markerSize*2,markerSize*2)); + painter->drawRect(QRectF(rect().left()+rect().width()/2-markerSize, + rect().bottom()-markerSize,markerSize*2,markerSize*2)); +} + +SelectionMarker::SelectionMarker(QGraphicsItem* parent, BaseDesignIntf* owner) + : Marker(parent, owner) +{ + setAcceptHoverEvents(true); +} + +void SelectionMarker::hoverMoveEvent(QGraphicsSceneHoverEvent *event) +{ + if (owner()) owner()->hoverMoveEvent(event); + QGraphicsItem::hoverMoveEvent(event); +} + +void SelectionMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if (owner()){ + owner()->setSelected(true); + owner()->mousePressEvent(event); + } + QGraphicsItem::mousePressEvent(event); +} + +void SelectionMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + if (owner()) owner()->mouseReleaseEvent(event); +} + +void SelectionMarker::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) +{ + if (owner()) owner()->mouseDoubleClickEvent(event); + QGraphicsItem::mouseDoubleClickEvent(event); +} + +void SelectionMarker::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + qDebug() << "mouse move"; + if (owner()) owner()->mouseMoveEvent(event); +} + } //namespace LimeReport diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index becf95a..b3f5b35 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -47,6 +47,35 @@ enum ItemModes{ DesignMode=1, PreviewMode=2, PrintMode=4, EditMode=8, LayoutEdit class ReportEnginePrivate; class PageDesignIntf; +class BaseDesignIntf; + +class Marker : public QGraphicsItem{ +public: + Marker(QGraphicsItem* parent = 0, BaseDesignIntf* owner = 0): QGraphicsItem(parent), m_owner(owner){} + QRectF boundingRect() const; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *); + void setRect(QRectF rect){prepareGeometryChange();m_rect=rect;} + void setColor(QColor color){m_color=color;} + QRectF rect() const {return m_rect;} + QColor color() const {return m_color;} + BaseDesignIntf* owner() const {return m_owner;} +private: + QRectF m_rect; + QColor m_color; + BaseDesignIntf* m_owner; +}; + +class SelectionMarker : public Marker{ +public: + SelectionMarker(QGraphicsItem* parent=0, BaseDesignIntf* owner = 0); +protected: + void hoverMoveEvent(QGraphicsSceneHoverEvent *event); + void mousePressEvent(QGraphicsSceneMouseEvent *event); + void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event); + void mouseMoveEvent(QGraphicsSceneMouseEvent *event); +}; + class DataSourceManager; class ReportRender; @@ -151,6 +180,7 @@ public: virtual QPainterPath shape() const; void setFixedPos(bool fixedPos); + bool isFixedPos(){return m_fixedPos;} int resizeHandleSize() const; void setMMFactor(qreal mmFactor); @@ -252,7 +282,8 @@ public: void setFillInSecondPass(bool fillInSecondPass); bool isWatermark() const; virtual void setWatermark(bool watermark); - + void updateSelectionMarker(); + void turnOnSelectionMarker(bool value); Q_INVOKABLE QString setItemWidth(qreal width); Q_INVOKABLE QString setItemHeight(qreal height); Q_INVOKABLE qreal getItemWidth(); @@ -385,6 +416,8 @@ private: bool m_watermark; bool m_hovered; bool m_joinMarkerOn; + SelectionMarker* m_selectionMarker; + Marker* m_joinMarker; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanging(QObject* object, QPointF newPos, QPointF oldPos); From ed28faf784d6732043a3f8f8ba2c233fce967341 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Mar 2019 17:32:48 +0300 Subject: [PATCH 289/347] Default band's background filling mode changed to transparent --- limereport/lrbanddesignintf.cpp | 6 ++++-- limereport/lrbasedesignintf.cpp | 15 +++++++++++++-- limereport/lrbasedesignintf.h | 4 ++++ limereport/lrpagedesignintf.cpp | 2 +- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index f4a0038..9e3323a 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -54,11 +54,11 @@ void BandMarker::paint(QPainter *painter, const QStyleOptionGraphicsItem* /**opt painter->setOpacity(Const::BAND_MARKER_OPACITY); painter->fillRect(boundingRect(),m_color); painter->setOpacity(1); - painter->setPen(QPen(QBrush(Qt::white),2)); + painter->setPen(QPen(QBrush(Qt::lightGray),2)); painter->fillRect(QRectF( boundingRect().bottomLeft().x(), boundingRect().bottomLeft().y()-4, - boundingRect().width(),4), Qt::white + boundingRect().width(),4), Qt::lightGray ); painter->setRenderHint(QPainter::Antialiasing); @@ -175,6 +175,8 @@ BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, Q if (parentItem) setWidth(parentItem->width()); } + setBackgroundMode(BGMode::TransparentMode); + setFillTransparentInDesignMode(false); setHeight(100); setFixedPos(true); setFlag(QGraphicsItem::ItemClipsChildrenToShape); diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index efebfd8..5426419 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -82,7 +82,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_watermark(false), m_hovered(false), m_joinMarkerOn(false), - m_selectionMarker(0) + m_selectionMarker(0), + m_fillTransparentInDesignMode(true) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -430,7 +431,7 @@ void BaseDesignIntf::prepareRect(QPainter *painter, const QStyleOptionGraphicsIt qreal o = (itemMode() & DesignMode) ? 0.5 : qreal(m_opacity) / 100; painter->setOpacity(o); painter->fillRect(r, brush); - } else if (itemMode() & DesignMode){ + } else if ((itemMode() & DesignMode) && fillTransparentInDesignMode()){ painter->setOpacity(0.1); painter->fillRect(r, QBrush(QPixmap(":/report/images/empty"))); } @@ -721,6 +722,16 @@ void BaseDesignIntf::updatePossibleDirectionFlags(){ } } +bool BaseDesignIntf::fillTransparentInDesignMode() const +{ + return m_fillTransparentInDesignMode; +} + +void BaseDesignIntf::setFillTransparentInDesignMode(bool fillTransparentInDesignMode) +{ + m_fillTransparentInDesignMode = fillTransparentInDesignMode; +} + bool BaseDesignIntf::fillInSecondPass() const { return m_fillInSecondPass; diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index b3f5b35..6209b97 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -295,6 +295,9 @@ public: Q_INVOKABLE QString setItemPosX(qreal xValue); Q_INVOKABLE QString setItemPosY(qreal yValue); + bool fillTransparentInDesignMode() const; + void setFillTransparentInDesignMode(bool fillTransparentInDesignMode); + protected: //ICollectionContainer @@ -418,6 +421,7 @@ private: bool m_joinMarkerOn; SelectionMarker* m_selectionMarker; Marker* m_joinMarker; + bool m_fillTransparentInDesignMode; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanging(QObject* object, QPointF newPos, QPointF oldPos); diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index b8a164c..0e039d8 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -2481,7 +2481,7 @@ CommandIf::Ptr BandMoveFromToCommand::create(PageDesignIntf* page, int from, int bool BandMoveFromToCommand::doIt() { - if (page() && from != to) { + if (page() && page()->pageItem() && from != to) { page()->pageItem()->moveBandFromTo(from, to); return true; } From 76d542ce761b9693ffab4fd4e49dccf5b9392e0e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Mar 2019 17:44:49 +0300 Subject: [PATCH 290/347] Selection marker has been fixed --- limereport/lrbasedesignintf.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 5426419..e70199b 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -778,7 +778,6 @@ void BaseDesignIntf::turnOnSelectionMarker(bool value) m_selectionMarker->setColor(selectionMarkerColor()); updateSelectionMarker(); m_selectionMarker->setVisible(true); - m_selectionMarker->setZValue(10000); } else { delete m_selectionMarker; m_selectionMarker = 0; From c7045ec1d6375c4ee82d8796829c7ab6b7e4f2a1 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Mar 2019 19:41:27 +0300 Subject: [PATCH 291/347] Edit mode changed --- limereport/lrbanddesignintf.cpp | 3 ++- limereport/lrbanddesignintf.h | 1 + limereport/lrpagedesignintf.cpp | 22 ++++++++++++++-------- limereport/lrpreviewreportwindow.cpp | 3 +-- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 9e3323a..37f14d4 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -105,6 +105,7 @@ void BandMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) if (!(event->modifiers() & Qt::ControlModifier)) m_band->scene()->clearSelection(); m_band->setSelected(true); + m_oldBandPos = m_band->pos(); update(0,0,boundingRect().width(),boundingRect().width()); } } @@ -136,7 +137,7 @@ void BandMarker::mouseMoveEvent(QGraphicsSceneMouseEvent* event) void BandMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { - m_band->posChanged(m_band, m_band->pos(), m_band->pos()); + m_band->posChanged(m_band, m_band->pos(), m_oldBandPos); } BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, QObject* owner, QGraphicsItem *parent) : diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index 33bca63..8faf9c8 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -72,6 +72,7 @@ private: QRectF m_rect; QColor m_color; BandDesignIntf* m_band; + QPointF m_oldBandPos; }; class BandNameLabel : public QGraphicsItem{ diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 08ac13b..260584d 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -256,7 +256,7 @@ void PageDesignIntf::startEditMode() PageItemDesignIntf *PageDesignIntf::pageItem() { - return m_pageItem.data(); + return m_currentPage ? m_currentPage : m_pageItem.data(); } void PageDesignIntf::setPageItem(PageItemDesignIntf::Ptr pageItem) @@ -1079,7 +1079,11 @@ PageItemDesignIntf* PageDesignIntf::getCurrentPage() const void PageDesignIntf::setCurrentPage(PageItemDesignIntf* currentPage) { if (m_currentPage != currentPage ){ + if (m_currentPage) m_currentPage->setItemMode(PreviewMode); m_currentPage = currentPage; + if (m_itemMode == DesignMode){ + m_currentPage->setItemMode(DesignMode); + } } } @@ -1766,13 +1770,14 @@ void PageDesignIntf::removeAllItems() void PageDesignIntf::setItemMode(BaseDesignIntf::ItemMode state) { m_itemMode = state; - foreach(QGraphicsItem * item, items()) { - BaseDesignIntf *reportItem = dynamic_cast(item); +// foreach(QGraphicsItem * item, items()) { +// BaseDesignIntf *reportItem = dynamic_cast(item); - if (reportItem) { - reportItem->setItemMode(itemMode()); - } - } +// if (reportItem) { +// reportItem->setItemMode(itemMode()); +// } +// } + if (m_currentPage) m_currentPage->setItemMode(state); } BaseDesignIntf* PageDesignIntf::reportItemByName(const QString &name) @@ -2507,7 +2512,8 @@ bool BandMoveFromToCommand::doIt() void BandMoveFromToCommand::undoIt() { - if (page()) page()->pageItem()->moveBandFromTo(to, from); + if (page() && page()->pageItem()) + page()->pageItem()->moveBandFromTo(to, from); } } diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index df61773..0e6c4cc 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -261,6 +261,7 @@ void PreviewReportWindow::moveEvent(QMoveEvent* e) void PreviewReportWindow::showEvent(QShowEvent *) { m_fontEditor->setVisible(ui->actionEdit_Mode->isChecked()); + ui->editModeTools->setVisible(false); m_textAlignmentEditor->setVisible(ui->actionEdit_Mode->isChecked()); switch (m_previewScaleType) { case FitWidth: @@ -458,5 +459,3 @@ void PreviewReportWindow::on_actionShow_Toolbar_triggered() }// namespace LimeReport - - From 495cf4e35e6045dd835b6b20885e214d2fcd4525 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Mar 2019 19:48:49 +0300 Subject: [PATCH 292/347] Band movement has been fixed --- limereport/lrbanddesignintf.cpp | 3 ++- limereport/lrbanddesignintf.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 9e3323a..37f14d4 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -105,6 +105,7 @@ void BandMarker::mousePressEvent(QGraphicsSceneMouseEvent *event) if (!(event->modifiers() & Qt::ControlModifier)) m_band->scene()->clearSelection(); m_band->setSelected(true); + m_oldBandPos = m_band->pos(); update(0,0,boundingRect().width(),boundingRect().width()); } } @@ -136,7 +137,7 @@ void BandMarker::mouseMoveEvent(QGraphicsSceneMouseEvent* event) void BandMarker::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) { - m_band->posChanged(m_band, m_band->pos(), m_band->pos()); + m_band->posChanged(m_band, m_band->pos(), m_oldBandPos); } BandDesignIntf::BandDesignIntf(BandsType bandType, const QString &xmlTypeName, QObject* owner, QGraphicsItem *parent) : diff --git a/limereport/lrbanddesignintf.h b/limereport/lrbanddesignintf.h index 33bca63..8faf9c8 100644 --- a/limereport/lrbanddesignintf.h +++ b/limereport/lrbanddesignintf.h @@ -72,6 +72,7 @@ private: QRectF m_rect; QColor m_color; BandDesignIntf* m_band; + QPointF m_oldBandPos; }; class BandNameLabel : public QGraphicsItem{ From c6c5e2b2067c1c49401600d3f9d9d635462dc927 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Mar 2019 23:48:28 +0300 Subject: [PATCH 293/347] Finished add new text item in preview mode --- include/lrpreviewreportwidget.h | 6 +++ limereport/lrpreviewreportwidget.cpp | 46 ++++++++++++++++--- limereport/lrpreviewreportwidget.h | 6 +++ limereport/lrpreviewreportwidget_p.h | 2 + limereport/lrpreviewreportwindow.cpp | 37 +++++++++++++-- limereport/lrpreviewreportwindow.h | 4 ++ limereport/lrpreviewreportwindow.ui | 69 +++++++++++++++++++++++++++- 7 files changed, 158 insertions(+), 12 deletions(-) diff --git a/include/lrpreviewreportwidget.h b/include/lrpreviewreportwidget.h index faa26c7..e7ff76e 100644 --- a/include/lrpreviewreportwidget.h +++ b/include/lrpreviewreportwidget.h @@ -15,6 +15,7 @@ class PreviewReportWidget; class PreviewReportWidgetPrivate; class ReportEnginePrivate; class ReportEngine; +class PageDesignIntf; class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget { @@ -35,6 +36,10 @@ public: QPrinter *defaultPrinter() const; void setDefaultPrinter(QPrinter *defaultPrinter); void startInsertTextItem(); + void activateItemSelectionMode(); + void deleteSelectedItems(); + void activateCurrentPage(); + public slots: void refreshPages(); void zoomIn(); @@ -58,6 +63,7 @@ signals: void pageChanged(int page); void scalePercentChanged(int percent); void pagesSet(int pageCount); + void itemInserted(LimeReport::PageDesignIntf* report, QPointF pos, const QString& ItemType); private slots: void slotSliderMoved(int value); void reportEngineDestroyed(QObject* object); diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 0ba6426..328eb1f 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -53,6 +53,7 @@ void PreviewReportWidgetPrivate::setPages(ReportPages pages) m_changingPage = false; q_ptr->initPreview(); q_ptr->emitPageSet(); + q_ptr->activateCurrentPage(); } } @@ -73,6 +74,16 @@ void PreviewReportWidgetPrivate::startInsertTextItem() m_previewPage->startInsertMode("TextItem"); } +void PreviewReportWidgetPrivate::activateItemSelectionMode() +{ + m_previewPage->startEditMode(); +} + +void PreviewReportWidgetPrivate::deleteSelectedItems() +{ + m_previewPage->deleteSelected(); +} + PreviewReportWidget::PreviewReportWidget(ReportEngine *report, QWidget *parent) : QWidget(parent), ui(new Ui::PreviewReportWidget), d_ptr(new PreviewReportWidgetPrivate(this)), @@ -135,6 +146,10 @@ void PreviewReportWidget::initPreview() ui->graphicsView->centerOn(0, 0); ui->graphicsView->scene()->setBackgroundBrush(QColor(m_previewPageBackgroundColor)); setScalePercent(d_ptr->m_scalePercent); + PageDesignIntf* page = dynamic_cast(ui->graphicsView->scene()); + if (page) + connect(page, SIGNAL(itemInserted(LimeReport::PageDesignIntf*, QPointF, QString)), + this, SIGNAL(itemInserted(LimeReport::PageDesignIntf*, QPointF, QString))); } void PreviewReportWidget::setErrorsMesagesVisible(bool visible) @@ -342,6 +357,16 @@ void PreviewReportWidget::startInsertTextItem() d_ptr->startInsertTextItem(); } +void PreviewReportWidget::activateItemSelectionMode() +{ + d_ptr->activateItemSelectionMode(); +} + +void PreviewReportWidget::deleteSelectedItems() +{ + d_ptr->deleteSelectedItems(); +} + int PreviewReportWidget::scalePercent() const { return m_scalePercent; @@ -380,8 +405,16 @@ void PreviewReportWidget::refreshPages() } } +void PreviewReportWidget::activateCurrentPage() +{ + PageDesignIntf* page = dynamic_cast(ui->graphicsView->scene()); + if (page) + page->setCurrentPage(d_ptr->currentPage().data()); +} + void PreviewReportWidget::slotSliderMoved(int value) { + int curPage = d_ptr->m_currentPage; if (ui->graphicsView->verticalScrollBar()->minimum()==value){ d_ptr->m_currentPage = 1; } else if (ui->graphicsView->verticalScrollBar()->maximum()==value){ @@ -396,14 +429,13 @@ void PreviewReportWidget::slotSliderMoved(int value) } } - d_ptr->m_changingPage = true; - emit pageChanged(d_ptr->m_currentPage); + if (curPage != d_ptr->m_currentPage){ + d_ptr->m_changingPage = true; + emit pageChanged(d_ptr->m_currentPage); + activateCurrentPage(); + d_ptr->m_changingPage = false; + } - PageDesignIntf* page = dynamic_cast(ui->graphicsView->scene()); - if (page) - page->setCurrentPage(d_ptr->currentPage().data()); - - d_ptr->m_changingPage = false; d_ptr->m_priorScrolValue = value; } diff --git a/limereport/lrpreviewreportwidget.h b/limereport/lrpreviewreportwidget.h index faa26c7..e7ff76e 100644 --- a/limereport/lrpreviewreportwidget.h +++ b/limereport/lrpreviewreportwidget.h @@ -15,6 +15,7 @@ class PreviewReportWidget; class PreviewReportWidgetPrivate; class ReportEnginePrivate; class ReportEngine; +class PageDesignIntf; class LIMEREPORT_EXPORT PreviewReportWidget : public QWidget { @@ -35,6 +36,10 @@ public: QPrinter *defaultPrinter() const; void setDefaultPrinter(QPrinter *defaultPrinter); void startInsertTextItem(); + void activateItemSelectionMode(); + void deleteSelectedItems(); + void activateCurrentPage(); + public slots: void refreshPages(); void zoomIn(); @@ -58,6 +63,7 @@ signals: void pageChanged(int page); void scalePercentChanged(int percent); void pagesSet(int pageCount); + void itemInserted(LimeReport::PageDesignIntf* report, QPointF pos, const QString& ItemType); private slots: void slotSliderMoved(int value); void reportEngineDestroyed(QObject* object); diff --git a/limereport/lrpreviewreportwidget_p.h b/limereport/lrpreviewreportwidget_p.h index dba8bd8..d7dc719 100644 --- a/limereport/lrpreviewreportwidget_p.h +++ b/limereport/lrpreviewreportwidget_p.h @@ -22,6 +22,8 @@ public: PageItemDesignIntf::Ptr currentPage(); QList aviableExporters(); void startInsertTextItem(); + void activateItemSelectionMode(); + void deleteSelectedItems(); public: PageDesignIntf* m_previewPage; ReportPages m_reportPages; diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index 0e6c4cc..7d01c0c 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -82,10 +82,13 @@ PreviewReportWindow::PreviewReportWindow(ReportEngine *report, QWidget *parent, ui->toolBar->insertWidget(ui->actionZoomOut, m_scalePercent); initPercentCombobox(); -// connect(ui->graphicsView->verticalScrollBar(),SIGNAL(valueChanged(int)), this, SLOT(slotSliderMoved(int))); connect(ui->actionShowMessages, SIGNAL(triggered()), this, SLOT(slotShowErrors())); connect(m_previewReportWidget, SIGNAL(scalePercentChanged(int)), this, SLOT(slotScalePercentChanged(int))); connect(m_scalePercent, SIGNAL(currentIndexChanged(QString)), this, SLOT(scaleComboboxChanged(QString))); + connect(m_previewReportWidget, SIGNAL(pageChanged(int)), this, SLOT(slotCurrentPageChanged(int))); + connect(m_previewReportWidget, SIGNAL(itemInserted(LimeReport::PageDesignIntf*, QPointF, QString)), + this, SLOT(slotItemInserted(LimeReport::PageDesignIntf*, QPointF, QString))); + restoreSetting(); selectStateIcon(); } @@ -110,10 +113,13 @@ void PreviewReportWindow::restoreSetting() int screenWidth = desktop->screenGeometry().width(); int screenHeight = desktop->screenGeometry().height(); - int x = screenWidth*0.1; - int y = screenHeight*0.1; + int x = static_cast(screenWidth*0.1); + int y = static_cast(screenHeight*0.1); - resize(screenWidth*0.8, screenHeight*0.8); + resize( + static_cast(screenWidth*0.8), + static_cast(screenHeight*0.8) + ); move(x, y); } v = settings()->value("State"); @@ -410,6 +416,19 @@ void PreviewReportWindow::slotPageChanged(int pageIndex) void PreviewReportWindow::slotInsertNewTextItem() { m_previewReportWidget->startInsertTextItem(); + ui->actionSelection_Mode->setChecked(false); +} + +void PreviewReportWindow::slotActivateItemSelectionMode() +{ + m_previewReportWidget->activateItemSelectionMode(); + ui->actionSelection_Mode->setChecked(true); + ui->actionInsertTextItem->setChecked(false); +} + +void PreviewReportWindow::slotDeleteSelectedItems() +{ + m_previewReportWidget->deleteSelectedItems(); } void PreviewReportWindow::on_actionFit_page_width_triggered() @@ -457,5 +476,15 @@ void PreviewReportWindow::on_actionShow_Toolbar_triggered() writeSetting(); } +void PreviewReportWindow::slotCurrentPageChanged(int page) +{ + slotActivateItemSelectionMode(); +} + +void PreviewReportWindow::slotItemInserted(PageDesignIntf *, QPointF, const QString&) +{ + slotActivateItemSelectionMode(); +} + }// namespace LimeReport diff --git a/limereport/lrpreviewreportwindow.h b/limereport/lrpreviewreportwindow.h index 2104669..992a34d 100644 --- a/limereport/lrpreviewreportwindow.h +++ b/limereport/lrpreviewreportwindow.h @@ -101,6 +101,8 @@ public slots: void slotPrintToPDF(); void slotPageChanged(int pageIndex); void slotInsertNewTextItem(); + void slotActivateItemSelectionMode(); + void slotDeleteSelectedItems(); private slots: void on_actionFit_page_width_triggered(); void on_actionFit_page_triggered(); @@ -109,6 +111,8 @@ private slots: void slotScalePercentChanged(int percent); void on_actionShowMessages_toggled(bool value); void on_actionShow_Toolbar_triggered(); + void slotCurrentPageChanged(int page); + void slotItemInserted(LimeReport::PageDesignIntf* report, QPointF pos, const QString& ItemType); private: ItemsReaderIntf* reader(); void initPercentCombobox(); diff --git a/limereport/lrpreviewreportwindow.ui b/limereport/lrpreviewreportwindow.ui index 23550ec..8ce8873 100644 --- a/limereport/lrpreviewreportwindow.ui +++ b/limereport/lrpreviewreportwindow.ui @@ -35,7 +35,7 @@ 0 0 800 - 22 + 20 @@ -106,7 +106,10 @@ false + + + @@ -295,6 +298,9 @@ + + true + :/items/TextItem:/items/TextItem @@ -306,6 +312,33 @@ Add new TextItem + + + true + + + true + + + + :/report/images/editMode:/report/images/editMode + + + Selection Mode + + + + + + :/report/images/delete:/report/images/delete + + + Delete Item + + + Del + + @@ -476,6 +509,38 @@ + + actionSelection_Mode + triggered() + LimeReport::PreviewReportWindow + slotActivateItemSelectionMode() + + + -1 + -1 + + + 399 + 299 + + + + + actionDelete_Item + triggered() + LimeReport::PreviewReportWindow + slotDeleteSelectedItems() + + + -1 + -1 + + + 399 + 299 + + + slotNextPage() @@ -487,5 +552,7 @@ slotLastPage() slotPrintToPDF() slotInsertNewTextItem() + slotActivateItemSelectionMode() + slotDeleteSelectedItems() From bf3e34677a6b180e23ec36f4485f5c1f657882fe Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 1 Mar 2019 23:54:41 +0300 Subject: [PATCH 294/347] Current page activation has been fixed --- limereport/lrpreviewreportwidget.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/limereport/lrpreviewreportwidget.cpp b/limereport/lrpreviewreportwidget.cpp index 328eb1f..4109dbd 100644 --- a/limereport/lrpreviewreportwidget.cpp +++ b/limereport/lrpreviewreportwidget.cpp @@ -177,6 +177,7 @@ void PreviewReportWidget::firstPage() d_ptr->m_currentPage=1; ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); emit pageChanged(d_ptr->m_currentPage); + activateCurrentPage(); } d_ptr->m_changingPage=false; } @@ -188,6 +189,7 @@ void PreviewReportWidget::priorPage() d_ptr->m_currentPage--; ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); emit pageChanged(d_ptr->m_currentPage); + activateCurrentPage(); } d_ptr->m_changingPage=false; } @@ -199,6 +201,7 @@ void PreviewReportWidget::nextPage() d_ptr->m_currentPage++; ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); emit pageChanged(d_ptr->m_currentPage); + activateCurrentPage(); } d_ptr->m_changingPage=false; } @@ -210,6 +213,7 @@ void PreviewReportWidget::lastPage() d_ptr->m_currentPage=d_ptr->m_reportPages.count(); ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); emit pageChanged(d_ptr->m_currentPage); + activateCurrentPage(); } d_ptr->m_changingPage=false; } @@ -269,6 +273,7 @@ void PreviewReportWidget::pageNavigatorChanged(int value) d_ptr->m_changingPage = true; if ((!d_ptr->m_reportPages.isEmpty())&&(d_ptr->m_reportPages.count() >= value) && value>0){ d_ptr->m_currentPage = value; + activateCurrentPage(); ui->graphicsView->ensureVisible(d_ptr->calcPageShift(), 0, 0); } d_ptr->m_changingPage=false; From 424665d03834bf9e4044efec713c97b70ebb1879 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 2 Mar 2019 00:29:18 +0300 Subject: [PATCH 295/347] Band marker has been fixed --- limereport/lrbanddesignintf.cpp | 3 +-- limereport/lrpageitemdesignintf.cpp | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 37f14d4..61f6b0a 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -775,8 +775,7 @@ BandDesignIntf* BandDesignIntf::findParentBand() void BandDesignIntf::updateBandMarkerGeometry() { if (parentItem() && m_bandMarker){ - QPointF sp = parentItem()->mapToScene(pos()); - m_bandMarker->setPos((sp.x()-m_bandMarker->boundingRect().width()),sp.y()); + m_bandMarker->setPos(pos().x()-m_bandMarker->width(),pos().y()); m_bandMarker->setHeight(rect().height()); } } diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index d0f949e..b0cdff8 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -479,7 +479,7 @@ void PageItemDesignIntf::relocateBands() { if (isLoading()) return; - int bandSpace = (itemMode() & DesignMode)?0:0; + int bandSpace = 0; QVector posByColumn; From ed902b4ef13e5346501668e7ecf20d2255b7406f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 2 Mar 2019 01:08:20 +0300 Subject: [PATCH 296/347] Script editor has been changed for preview mode --- limereport/lrreportengine.cpp | 7 ++++--- limereport/lrreportengine_p.h | 2 +- limereport/lrscriptenginemanager.cpp | 2 +- limereport/scripteditor/lrscripteditor.cpp | 6 ++++-- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index e83aadf..b07c607 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -155,12 +155,13 @@ QObject *ReportEnginePrivate::elementAt(const QString &, int index) return pageAt(index); } -PageDesignIntf *ReportEnginePrivate::createPage(const QString &pageName) +PageDesignIntf *ReportEnginePrivate::createPage(const QString &pageName, bool preview) { PageDesignIntf* page =new PageDesignIntf(); page->setObjectName(pageName); page->pageItem()->setObjectName("Report"+pageName); - page->setReportEditor(this); + if (!preview) + page->setReportEditor(this); page->setReportSettings(&m_reportSettings); return page; } @@ -185,7 +186,7 @@ bool ReportEnginePrivate::deletePage(PageDesignIntf *page){ PageDesignIntf *ReportEnginePrivate::createPreviewPage() { - return createPage(); + return createPage("preview",true); } int ReportEnginePrivate::elementsCount(const QString &) diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 69831b7..3210e64 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -240,7 +240,7 @@ public slots: bool slotLoadFromFile(const QString& fileName); void cancelRender(); protected: - PageDesignIntf* createPage(const QString& pageName=""); + PageDesignIntf* createPage(const QString& pageName="", bool preview = false); protected slots: void slotDataSourceCollectionLoaded(const QString& collectionName); private slots: diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index f6197e9..0f3aa1a 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -336,7 +336,7 @@ QStringList ScriptEngineManager::functionsNames() } void ScriptEngineManager::setDataManager(DataSourceManager *dataManager){ - if (m_dataManager != dataManager){ + if (dataManager && m_dataManager != dataManager){ m_dataManager = dataManager; if (m_dataManager){ foreach(QString func, m_dataManager->groupFunctionNames()){ diff --git a/limereport/scripteditor/lrscripteditor.cpp b/limereport/scripteditor/lrscripteditor.cpp index c1a7141..7c9656d 100644 --- a/limereport/scripteditor/lrscripteditor.cpp +++ b/limereport/scripteditor/lrscripteditor.cpp @@ -54,14 +54,16 @@ void ScriptEditor::setReportEngine(ReportEnginePrivateInterface* reportEngine) { m_reportEngine = reportEngine; DataSourceManager* dm = m_reportEngine->dataManager(); - initEditor(dm); + if (dm) initEditor(dm); + else ui->tabWidget->setVisible(false); } void ScriptEditor::setReportPage(PageDesignIntf* page) { m_page = page; DataSourceManager* dm = page->datasourceManager(); - initEditor(dm); + if (dm) initEditor(dm); + else ui->tabWidget->setVisible(false); } void ScriptEditor::setPageBand(BandDesignIntf* band) From 5f56f36a4925d9fa71f8c83083f67f6e6f2d4c98 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 6 Mar 2019 22:16:30 +0300 Subject: [PATCH 297/347] addBookmark() && findPageIndexByBookmark() have been added to the script --- limereport/lrreportengine.cpp | 1 + limereport/lrscriptenginemanager.cpp | 79 ++++++++++++++++++++++++++-- limereport/lrscriptenginemanager.h | 14 ++++- 3 files changed, 90 insertions(+), 4 deletions(-) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index b07c607..7cd13a4 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1191,6 +1191,7 @@ ReportPages ReportEnginePrivate::renderToPages() activateLanguage(m_reportLanguage); emit renderStarted(); + m_scriptEngineContext->setReportPages(&result); for(int i = 0; i < m_renderingPages.count(); ++i){ PageItemDesignIntf* page = m_renderingPages.at(i); diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 0f3aa1a..8a8b1d1 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -545,18 +545,39 @@ QVariant ScriptEngineManager::evaluateScript(const QString& script){ return QVariant(); } -void ScriptEngineManager::addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent) -{ +void ScriptEngineManager::addBookMark(const QString& uniqKey, const QString& content){ Q_ASSERT(m_context != 0); if (m_context){ BandDesignIntf* currentBand = m_context->getCurrentBand(); - m_context->tableOfContents()->setItem(uniqKey, content, 0, indent); if (currentBand) currentBand->addBookmark(uniqKey, content); else if (m_context->getCurrentPage()) { m_context->getCurrentPage()->addBookmark(uniqKey, content); } } + +} + +int ScriptEngineManager::findPageIndexByBookmark(const QString &uniqKey) +{ + for (int i=0; i < m_context->reportPages()->size(); ++i){ + if (m_context->reportPages()->at(i)->bookmarks().contains(uniqKey)) + return i+1; + foreach(BandDesignIntf* band, m_context->reportPages()->at(i)->bands()){ + if (band->bookmarks().contains(uniqKey)) + return i+1; + } + } + return -1; +} + +void ScriptEngineManager::addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent) +{ + Q_ASSERT(m_context != 0); + if (m_context){ + m_context->tableOfContents()->setItem(uniqKey, content, 0, indent); + addBookMark(uniqKey, content); + } } void ScriptEngineManager::clearTableOfContents(){ @@ -835,6 +856,36 @@ bool ScriptEngineManager::createGetFieldByRowIndex() return addFunction(fd); } +bool ScriptEngineManager::createAddBookmarkFunction() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory(tr("GENERAL")); + fd.setName("addBookmark"); + fd.setDescription("addBookmark(\""+tr("Unique identifier")+" \""+tr("Content")+"\")"); + fd.setScriptWrapper(QString("function addBookmark(uniqKey, content){" + "return %1.addBookmark(uniqKey, content);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + +bool ScriptEngineManager::createFindPageIndexByBookmark() +{ + JSFunctionDesc fd; + fd.setManager(m_functionManager); + fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); + fd.setCategory(tr("GENERAL")); + fd.setName("findPageIndexByBookmark"); + fd.setDescription("findPageIndexByBookmark(\""+tr("Unique identifier")+"\")"); + fd.setScriptWrapper(QString("function findPageIndexByBookmark(uniqKey){" + "return %1.findPageIndexByBookmark(uniqKey);}" + ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) + ); + return addFunction(fd); +} + bool ScriptEngineManager::createAddTableOfContentsItemFunction() { JSFunctionDesc fd; @@ -916,6 +967,8 @@ ScriptEngineManager::ScriptEngineManager() QScriptValue fontConstructor = m_scriptEngine->newFunction(QFontPrototype::constructorQFont, fontProto); m_scriptEngine->globalObject().setProperty("QFont", fontConstructor); #endif + createAddBookmarkFunction(); + createFindPageIndexByBookmark(); createAddTableOfContentsItemFunction(); createClearTableOfContentsFunction(); createReopenDatasourceFunction(); @@ -1204,6 +1257,16 @@ void ScriptEngineContext::collectionLoadFinished(const QString& collectionName) Q_UNUSED(collectionName); } +ReportPages* ScriptEngineContext::reportPages() const +{ + return m_reportPages; +} + +void ScriptEngineContext::setReportPages(ReportPages *value) +{ + m_reportPages = value; +} + #ifdef HAVE_UI_LOADER QDialog* ScriptEngineContext::createDialog(DialogDescriber* cont) { @@ -1622,6 +1685,16 @@ void ScriptFunctionsManager::reopenDatasource(const QString& datasourceName) return dm->reopenDatasource(datasourceName); } +void ScriptFunctionsManager::addBookmark(const QString &uniqKey, const QString &content) +{ + scriptEngineManager()->addBookMark(uniqKey, content); +} + +int ScriptFunctionsManager::findPageIndexByBookmark(const QString &uniqKey) +{ + return scriptEngineManager()->findPageIndexByBookmark(uniqKey); +} + void ScriptFunctionsManager::addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent) { scriptEngineManager()->addTableOfContentsItem(uniqKey, content, indent); diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index bcddffb..760ffc0 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -165,6 +165,8 @@ private : QByteArray m_description; }; +typedef QList< QSharedPointer > ReportPages; + class ScriptEngineContext : public QObject, public ICollectionContainer { Q_OBJECT @@ -204,7 +206,9 @@ public: void setTableOfContents(TableOfContents* tableOfContents); void dropChanges(){ m_hasChanges = false;} bool hasChanges(){ return m_hasChanges;} -#ifdef HAVE_UI_LOADER + ReportPages* reportPages() const; + void setReportPages(ReportPages* value); +#ifdef HAVE_UI_LOADER signals: void dialogNameChanged(QString dialogName); void dialogDeleted(QString dialogName); @@ -231,6 +235,7 @@ private: PageItemDesignIntf* m_currentPage; TableOfContents* m_tableOfContents; bool m_hasChanges; + ReportPages* m_reportPages; }; class JSFunctionDesc{ @@ -366,6 +371,8 @@ public: Q_INVOKABLE QVariant getFieldByRowIndex(const QString& fieldName, int rowIndex); Q_INVOKABLE void reopenDatasource(const QString& datasourceName); Q_INVOKABLE QVariant color(const QString& color){ return QColor(color);} + Q_INVOKABLE void addBookmark(const QString& uniqKey, const QString& content); + Q_INVOKABLE int findPageIndexByBookmark(const QString &uniqKey); Q_INVOKABLE void addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent = 0); Q_INVOKABLE void clearTableOfContents(); Q_INVOKABLE QFont font(const QString& family, int pointSize = -1, bool bold = false, bool italic = false, bool underLine = false); @@ -417,9 +424,12 @@ public: QString expandDataFields(QString context, ExpandType expandType, QVariant &varValue, QObject* reportItem); QString expandScripts(QString context, QVariant &varValue, QObject* reportItem); QVariant evaluateScript(const QString &script); + void addBookMark(const QString &uniqKey, const QString &content); + int findPageIndexByBookmark(const QString& uniqKey); void addTableOfContentsItem(const QString& uniqKey, const QString& content, int indent); void clearTableOfContents(); ScriptValueType moveQObjectToScript(QObject* object, const QString objectName); + protected: void updateModel(); bool containsFunction(const QString &functionName); @@ -440,6 +450,8 @@ private: bool createGetFieldFunction(); bool createGetFieldByKeyFunction(); bool createGetFieldByRowIndex(); + bool createAddBookmarkFunction(); + bool createFindPageIndexByBookmark(); bool createAddTableOfContentsItemFunction(); bool createClearTableOfContentsFunction(); bool createReopenDatasourceFunction(); From ee77ad5e5f5a8b1f859ded3b8016c08bfca68e2f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 11 Mar 2019 22:12:35 +0300 Subject: [PATCH 298/347] createPreviewScene(QObject *parent = 0); from now return QGraphicsScene* --- include/lrreportengine.h | 3 ++- limereport/lrpagedesignintf.cpp | 24 ++++++++++++++---------- limereport/lrreportengine.cpp | 4 +++- limereport/lrreportengine.h | 3 ++- limereport/lrreportengine_p.h | 2 +- 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 00185d8..79090f9 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -42,6 +42,7 @@ #include "lrreportdesignwindowintrerface.h" class QPrinter; +class QGraphicsScene; namespace LimeReport { @@ -83,7 +84,7 @@ public: bool printReport(QMap printers, bool printToAllPrinters = false); bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); - PageDesignIntf *createPreviewScene(QObject *parent = 0); + QGraphicsScene* createPreviewScene(QObject *parent = 0); bool printToPDF(const QString& fileName); bool exportReport(QString exporterName, const QString &fileName = "", const QMap& params = QMap()); void previewReport(PreviewHints hints = PreviewBarsUserSetting); diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 6ef7815..8d87789 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -1767,17 +1767,21 @@ void PageDesignIntf::removeAllItems() m_commandsList.clear(); } -void PageDesignIntf::setItemMode(BaseDesignIntf::ItemMode state) +void PageDesignIntf::setItemMode(BaseDesignIntf::ItemMode mode) { - m_itemMode = state; -// foreach(QGraphicsItem * item, items()) { -// BaseDesignIntf *reportItem = dynamic_cast(item); - -// if (reportItem) { -// reportItem->setItemMode(itemMode()); -// } -// } - if (m_currentPage) m_currentPage->setItemMode(state); + if (m_itemMode != mode){ + m_itemMode = mode; + if (m_currentPage) { + m_currentPage->setItemMode(mode); + } else { + foreach(QGraphicsItem * item, items()) { + BaseDesignIntf *reportItem = dynamic_cast(item); + if (reportItem) { + reportItem->setItemMode(itemMode()); + } + } + } + } } BaseDesignIntf* PageDesignIntf::reportItemByName(const QString &name) diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 7cd13a4..3420639 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include "time.h" @@ -593,6 +594,7 @@ PageDesignIntf* ReportEnginePrivate::createPreviewScene(QObject* parent){ ReportPages pages = renderToPages(); result = new PageDesignIntf(parent); result->setPageItems(pages); + result->setItemMode(PrintMode); } catch (ReportError &exception){ saveError(exception.what()); showError(exception.what()); @@ -719,7 +721,7 @@ void ReportEnginePrivate::cancelRender() m_reportRendering = false; } -PageDesignIntf* ReportEngine::createPreviewScene(QObject* parent){ +QGraphicsScene* ReportEngine::createPreviewScene(QObject* parent){ Q_D(ReportEngine); return d->createPreviewScene(parent); } diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 00185d8..79090f9 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -42,6 +42,7 @@ #include "lrreportdesignwindowintrerface.h" class QPrinter; +class QGraphicsScene; namespace LimeReport { @@ -83,7 +84,7 @@ public: bool printReport(QMap printers, bool printToAllPrinters = false); bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); - PageDesignIntf *createPreviewScene(QObject *parent = 0); + QGraphicsScene* createPreviewScene(QObject *parent = 0); bool printToPDF(const QString& fileName); bool exportReport(QString exporterName, const QString &fileName = "", const QMap& params = QMap()); void previewReport(PreviewHints hints = PreviewBarsUserSetting); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 3210e64..4c82a0e 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -147,7 +147,7 @@ public: } void clearReport(); - bool printReport(QPrinter *printer=0); + bool printReport(QPrinter* printer=0); bool printReport(QMapprinters, bool printToAllPrinters); bool printPages(ReportPages pages, QPrinter *printer); void printToFile(const QString& fileName); From a045c4fd0c4cbd93b398814f3c490e765658eb76 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 11 Mar 2019 23:01:32 +0300 Subject: [PATCH 299/347] PageDesignIntf has been fixed --- limereport/lrpagedesignintf.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 8d87789..46fe876 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -291,6 +291,8 @@ void PageDesignIntf::setPageItems(QList pages) if (curWidthwidth()) curWidth=pageItem->width(); } setSceneRect(QRectF(0,0,curWidth,curHeight).adjusted(-10*Const::mmFACTOR,-10*Const::mmFACTOR,10*Const::mmFACTOR,10*Const::mmFACTOR)); + if (m_reportPages.count()>0) + m_currentPage = m_reportPages.at(0).data(); } From 68411d800293599c82f1a6507a3eb5cfdcff03b4 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 11 Mar 2019 23:30:03 +0300 Subject: [PATCH 300/347] QLineEdit has been changed to QPlainTextEdit in the variable editor dialog --- limereport/databrowser/lrvariabledialog.cpp | 6 +++--- limereport/databrowser/lrvariabledialog.ui | 18 +++--------------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/limereport/databrowser/lrvariabledialog.cpp b/limereport/databrowser/lrvariabledialog.cpp index d039315..7c5b1a0 100644 --- a/limereport/databrowser/lrvariabledialog.cpp +++ b/limereport/databrowser/lrvariabledialog.cpp @@ -76,8 +76,8 @@ void LRVariableDialog::showEvent(QShowEvent *) ui->leName->setText(m_variableName); static int enumIndex = LimeReport::Enums::staticMetaObject.indexOfEnumerator("VariableDataType"); QMetaEnum enumerator = LimeReport::Enums::staticMetaObject.enumerator(enumIndex); - if (!m_variableName.isEmpty()&&m_variablesContainer&&m_variablesContainer->containsVariable(m_variableName)){ - ui->leValue->setText(m_variablesContainer->variable(m_variableName).toString()); + if (!m_variableName.isEmpty()&&m_variablesContainer&&m_variablesContainer->containsVariable(m_variableName)){ + ui->leValue->setPlainText(m_variablesContainer->variable(m_variableName).toString()); #ifdef HAVE_QT5 ui->cbbType->setCurrentText(enumerator.valueToKey(m_variablesContainer->variableDataType(m_variableName))); #endif @@ -120,5 +120,5 @@ void LRVariableDialog::accept() QVariant LRVariableDialog::value() { - return ui->leValue->text(); + return ui->leValue->toPlainText(); } diff --git a/limereport/databrowser/lrvariabledialog.ui b/limereport/databrowser/lrvariabledialog.ui index f372c73..08bf6c7 100644 --- a/limereport/databrowser/lrvariabledialog.ui +++ b/limereport/databrowser/lrvariabledialog.ui @@ -7,7 +7,7 @@ 0 0 328 - 173 + 222 @@ -38,7 +38,7 @@ - + @@ -59,19 +59,6 @@ - - - - Qt::Vertical - - - - 20 - 0 - - - - @@ -86,6 +73,7 @@ + From f1701aabbd5f6faff04990cd2e39899a9f66c1d9 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 12 Mar 2019 19:28:46 +0300 Subject: [PATCH 301/347] Russian translation has been updated --- translations/limereport_ru.qm | Bin 120040 -> 120136 bytes translations/limereport_ru.ts | 43 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index e93b12c696cdedb7200a98965b5885142282b74d..09d747fdbe26bd02019e13a453cff90be9979da7 100644 GIT binary patch delta 3419 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 ML&>0@aewgt0PEc~i~s-t delta 3431 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 V_(8&3i^{ha=s&q~)Av{!{(oYzM+*P| diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 93c2128..e9a5c3b 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1217,6 +1217,17 @@ p, li { white-space: pre-wrap; } Объекты + + LimeReport::ObjectInspectorWidget + + Clear + + + + Filter + + + LimeReport::PDFExporter @@ -1398,6 +1409,30 @@ p, li { white-space: pre-wrap; } Show toolbar Показать панель инструментов + + toolBar_2 + + + + InsertTextItem + + + + Add new TextItem + + + + Selection Mode + + + + Delete Item + + + + Del + + LimeReport::ProxyHolder @@ -1888,6 +1923,10 @@ p, li { white-space: pre-wrap; } layoutSpacing Интервал + + printerName + Имя принтера + LimeReport::RectMMPropItem @@ -2553,6 +2592,10 @@ This preview is no longer valid. datasourceName Имя источника данных + + RowIndex + + LimeReport::SettingDialog From f1f1e443acfa0b0f8d0871e0eda9fc697698addc Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 30 Mar 2019 09:37:40 +0300 Subject: [PATCH 302/347] Added the ability to add watermarks to all reports. --- include/lrreportengine.h | 60 ++++++++++++ limereport/lrreportengine.cpp | 168 ++++++++++++++++++++++++++++++++++ limereport/lrreportengine.h | 60 ++++++++++++ limereport/lrreportengine_p.h | 4 + 4 files changed, 292 insertions(+) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 79090f9..83adadb 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -61,6 +61,64 @@ private: int m_toPage; }; +class LIMEREPORT_EXPORT ItemGeometry{ +public: + enum Type{Milimeters, Pixels}; + ItemGeometry(qreal x, qreal y, qreal width, qreal height, Type type = Milimeters) + :m_x(x), m_y(y), m_width(width), m_height(height), m_type(type){} + ItemGeometry(): m_x(0), m_y(0), m_width(0), m_height(0), m_type(Milimeters){} + + qreal x() const; + void setX(const qreal &x); + + qreal y() const; + void setY(const qreal &y); + + qreal width() const; + void setWidth(const qreal &width); + + qreal height() const; + void setHeight(const qreal &height); + + Type type() const; + void setType(const Type &type); + +private: + qreal m_x; + qreal m_y; + qreal m_width; + qreal m_height; + Type m_type; +}; + +class LIMEREPORT_EXPORT WatermarkSetting{ +public: + WatermarkSetting(const QString& text, const ItemGeometry& geometry, const QFont& font) + : m_text(text), m_font(font), m_opacity(50), m_geomerty(geometry), m_color(QColor(Qt::black)){} + WatermarkSetting(): m_font(QFont()), m_opacity(50), m_geomerty(ItemGeometry()){} + QString text() const; + void setText(const QString &text); + + QFont font() const; + void setFont(const QFont &font); + + int opacity() const; + void setOpacity(const int &opacity); + + ItemGeometry geomerty() const; + void setGeomerty(const ItemGeometry &geomerty); + + QColor color() const; + void setColor(const QColor &color); + +private: + QString m_text; + QFont m_font; + int m_opacity; + ItemGeometry m_geomerty; + QColor m_color; +}; + class DataSourceManager; class ReportEnginePrivate; class PageDesignIntf; @@ -123,6 +181,8 @@ public: ScaleType previewScaleType(); int previewScalePercent(); void setPreviewScaleType(const ScaleType &previewScaleType, int percent = 0); + void addWatermark(const WatermarkSetting& watermarkSetting); + void clearWatermarks(); signals: void cleared(); void renderStarted(); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 3420639..08ae3b1 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -939,6 +939,16 @@ void ReportEnginePrivate::setPreviewScaleType(const ScaleType &scaleType, int pe m_previewScalePercent = percent; } +void ReportEnginePrivate::addWatermark(const WatermarkSetting &watermarkSetting) +{ + m_watermarks.append(watermarkSetting); +} + +void ReportEnginePrivate::clearWatermarks() +{ + m_watermarks.clear(); +} + PageItemDesignIntf* ReportEnginePrivate::getPageByName(const QString& pageName) { foreach(PageItemDesignIntf* page, m_renderingPages){ @@ -1152,6 +1162,38 @@ void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPai emit externalPaint(objectName, painter, options); } +BaseDesignIntf* ReportEnginePrivate::createWatermark(PageDesignIntf* page, WatermarkSetting watermarkSetting) +{ + QPointF pos; + QSizeF size; + switch (watermarkSetting.geomerty().type()) { + case ItemGeometry::Milimeters: + pos.setX(watermarkSetting.geomerty().x() * LimeReport::Const::mmFACTOR); + pos.setY(watermarkSetting.geomerty().y() * LimeReport::Const::mmFACTOR); + size.setWidth(watermarkSetting.geomerty().width() * LimeReport::Const::mmFACTOR); + size.setHeight(watermarkSetting.geomerty().height() * LimeReport::Const::mmFACTOR); + break; + case ItemGeometry::Pixels: + pos.setX(watermarkSetting.geomerty().x()); + pos.setY(watermarkSetting.geomerty().y()); + size.setWidth(watermarkSetting.geomerty().width()); + size.setHeight(watermarkSetting.geomerty().height()); + break; + } + + BaseDesignIntf* watermark = page->addReportItem("TextItem",pos,size); + if (watermark){ + watermark->setProperty("content", watermarkSetting.text()); + watermark->setProperty("font",watermark->font()); + watermark->setProperty("watermark",true); + watermark->setProperty("itemLocation",1); + watermark->setProperty("foregroundOpacity", watermarkSetting.opacity()); + watermark->setProperty("fontColor", watermarkSetting.color()); + } + return watermark; + +} + ReportPages ReportEnginePrivate::renderToPages() { int startTOCPage = -1; @@ -1175,7 +1217,20 @@ ReportPages ReportEnginePrivate::renderToPages() m_reportRender->setScriptContext(scriptContext()); m_renderingPages.clear(); foreach (PageDesignIntf* page, m_pages) { + + QVector watermarks; + if (!m_watermarks.isEmpty()){ + foreach(WatermarkSetting watermarkSetting, m_watermarks){ + watermarks.append(createWatermark(page, watermarkSetting)); + } + } + PageItemDesignIntf* rp = createRenderingPage(page->pageItem()); + + + qDeleteAll(watermarks.begin(),watermarks.end()); + watermarks.clear(); + m_renderingPages.append(rp); scriptContext()->baseDesignIntfToScript(rp->objectName(), rp); } @@ -1457,6 +1512,18 @@ void ReportEngine::setPreviewScaleType(const ScaleType &previewScaleType, int pe d->setPreviewScaleType(previewScaleType, percent); } +void ReportEngine::addWatermark(const WatermarkSetting &watermarkSetting) +{ + Q_D(ReportEngine); + d->addWatermark(watermarkSetting); +} + +void ReportEngine::clearWatermarks() +{ + Q_D(ReportEngine); + d->clearWatermarks(); +} + void ReportEngine::setShowProgressDialog(bool value) { @@ -1651,5 +1718,106 @@ void PrintProcessor::initPrinter(PageItemDesignIntf* page) } } +qreal ItemGeometry::x() const +{ + return m_x; +} + +void ItemGeometry::setX(const qreal &x) +{ + m_x = x; +} + +qreal ItemGeometry::y() const +{ + return m_y; +} + +void ItemGeometry::setY(const qreal &y) +{ + m_y = y; +} + +qreal ItemGeometry::width() const +{ + return m_width; +} + +void ItemGeometry::setWidth(const qreal &width) +{ + m_width = width; +} + +qreal ItemGeometry::height() const +{ + return m_height; +} + +void ItemGeometry::setHeight(const qreal &height) +{ + m_height = height; +} + +ItemGeometry::Type ItemGeometry::type() const +{ + return m_type; +} + +void ItemGeometry::setType(const Type &type) +{ + m_type = type; +} + +QString WatermarkSetting::text() const +{ + return m_text; +} + +void WatermarkSetting::setText(const QString &text) +{ + m_text = text; +} + +QFont WatermarkSetting::font() const +{ + return m_font; +} + +void WatermarkSetting::setFont(const QFont &font) +{ + m_font = font; +} + +int WatermarkSetting::opacity() const +{ + return m_opacity; +} + +void WatermarkSetting::setOpacity(const int &opacity) +{ + m_opacity = opacity; +} + +ItemGeometry WatermarkSetting::geomerty() const +{ + return m_geomerty; +} + +void WatermarkSetting::setGeomerty(const ItemGeometry &geomerty) +{ + m_geomerty = geomerty; +} + +QColor WatermarkSetting::color() const +{ + return m_color; +} + +void WatermarkSetting::setColor(const QColor &color) +{ + m_color = color; +} + + }// namespace LimeReport diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 79090f9..83adadb 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -61,6 +61,64 @@ private: int m_toPage; }; +class LIMEREPORT_EXPORT ItemGeometry{ +public: + enum Type{Milimeters, Pixels}; + ItemGeometry(qreal x, qreal y, qreal width, qreal height, Type type = Milimeters) + :m_x(x), m_y(y), m_width(width), m_height(height), m_type(type){} + ItemGeometry(): m_x(0), m_y(0), m_width(0), m_height(0), m_type(Milimeters){} + + qreal x() const; + void setX(const qreal &x); + + qreal y() const; + void setY(const qreal &y); + + qreal width() const; + void setWidth(const qreal &width); + + qreal height() const; + void setHeight(const qreal &height); + + Type type() const; + void setType(const Type &type); + +private: + qreal m_x; + qreal m_y; + qreal m_width; + qreal m_height; + Type m_type; +}; + +class LIMEREPORT_EXPORT WatermarkSetting{ +public: + WatermarkSetting(const QString& text, const ItemGeometry& geometry, const QFont& font) + : m_text(text), m_font(font), m_opacity(50), m_geomerty(geometry), m_color(QColor(Qt::black)){} + WatermarkSetting(): m_font(QFont()), m_opacity(50), m_geomerty(ItemGeometry()){} + QString text() const; + void setText(const QString &text); + + QFont font() const; + void setFont(const QFont &font); + + int opacity() const; + void setOpacity(const int &opacity); + + ItemGeometry geomerty() const; + void setGeomerty(const ItemGeometry &geomerty); + + QColor color() const; + void setColor(const QColor &color); + +private: + QString m_text; + QFont m_font; + int m_opacity; + ItemGeometry m_geomerty; + QColor m_color; +}; + class DataSourceManager; class ReportEnginePrivate; class PageDesignIntf; @@ -123,6 +181,8 @@ public: ScaleType previewScaleType(); int previewScalePercent(); void setPreviewScaleType(const ScaleType &previewScaleType, int percent = 0); + void addWatermark(const WatermarkSetting& watermarkSetting); + void clearWatermarks(); signals: void cleared(); void renderStarted(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 4c82a0e..ab2679e 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -217,6 +217,8 @@ public: ScaleType previewScaleType(); int previewScalePercent(); void setPreviewScaleType(const ScaleType &previewScaleType, int percent = 0); + void addWatermark(const WatermarkSetting& watermarkSetting); + void clearWatermarks(); signals: void pagesLoadFinished(); void datasourceCollectionLoadFinished(const QString& collectionName); @@ -303,6 +305,8 @@ private: int m_previewScalePercent; int m_startTOCPage; QColor m_previewPageBackgroundColor; + QVector m_watermarks; + BaseDesignIntf *createWatermark(PageDesignIntf *page, WatermarkSetting watermarkSetting); }; } From de5cc0e0ca1bec89fcba1d1358af53ded0e9decb Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 2 Apr 2019 22:56:12 +0300 Subject: [PATCH 303/347] Anchor has been added to ItemGeometry --- include/lrreportengine.h | 16 +++++- limereport/lrreportengine.cpp | 96 ++++++++++++++++++++++++++++------- limereport/lrreportengine.h | 16 +++++- limereport/lrreportengine_p.h | 18 +++++++ 4 files changed, 124 insertions(+), 22 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 83adadb..75cd41c 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -64,8 +64,8 @@ private: class LIMEREPORT_EXPORT ItemGeometry{ public: enum Type{Milimeters, Pixels}; - ItemGeometry(qreal x, qreal y, qreal width, qreal height, Type type = Milimeters) - :m_x(x), m_y(y), m_width(width), m_height(height), m_type(type){} + ItemGeometry(qreal x, qreal y, qreal width, qreal height, Qt::Alignment anchor, Type type = Milimeters) + :m_x(x), m_y(y), m_width(width), m_height(height), m_type(type), m_anchor(anchor){} ItemGeometry(): m_x(0), m_y(0), m_width(0), m_height(0), m_type(Milimeters){} qreal x() const; @@ -83,12 +83,16 @@ public: Type type() const; void setType(const Type &type); + Qt::Alignment anchor() const; + void setAnchor(const Qt::Alignment &anchor); + private: qreal m_x; qreal m_y; qreal m_width; qreal m_height; Type m_type; + Qt::Alignment m_anchor; }; class LIMEREPORT_EXPORT WatermarkSetting{ @@ -119,6 +123,14 @@ private: QColor m_color; }; +class ItemBuilder{ + virtual void setProperty(QString name, QVariant value) = 0; + virtual QVariant property(QString name) = 0; + virtual void setGeometry(ItemGeometry geometry) = 0; + virtual ItemGeometry geometry() = 0; +}; + + class DataSourceManager; class ReportEnginePrivate; class PageDesignIntf; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 08ae3b1..ee7473d 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1164,27 +1164,13 @@ void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPai BaseDesignIntf* ReportEnginePrivate::createWatermark(PageDesignIntf* page, WatermarkSetting watermarkSetting) { - QPointF pos; - QSizeF size; - switch (watermarkSetting.geomerty().type()) { - case ItemGeometry::Milimeters: - pos.setX(watermarkSetting.geomerty().x() * LimeReport::Const::mmFACTOR); - pos.setY(watermarkSetting.geomerty().y() * LimeReport::Const::mmFACTOR); - size.setWidth(watermarkSetting.geomerty().width() * LimeReport::Const::mmFACTOR); - size.setHeight(watermarkSetting.geomerty().height() * LimeReport::Const::mmFACTOR); - break; - case ItemGeometry::Pixels: - pos.setX(watermarkSetting.geomerty().x()); - pos.setY(watermarkSetting.geomerty().y()); - size.setWidth(watermarkSetting.geomerty().width()); - size.setHeight(watermarkSetting.geomerty().height()); - break; - } - BaseDesignIntf* watermark = page->addReportItem("TextItem",pos,size); + ItemGeometryHelper geometry(watermarkSetting.geomerty()); + + BaseDesignIntf* watermark = page->addReportItem("TextItem", geometry.mapToPage(*page->pageItem()), geometry.sceneSize()); if (watermark){ watermark->setProperty("content", watermarkSetting.text()); - watermark->setProperty("font",watermark->font()); + watermark->setProperty("font",watermarkSetting.font()); watermark->setProperty("watermark",true); watermark->setProperty("itemLocation",1); watermark->setProperty("foregroundOpacity", watermarkSetting.opacity()); @@ -1768,6 +1754,16 @@ void ItemGeometry::setType(const Type &type) m_type = type; } +Qt::Alignment ItemGeometry::anchor() const +{ + return m_anchor; +} + +void ItemGeometry::setAnchor(const Qt::Alignment &anchor) +{ + m_anchor = anchor; +} + QString WatermarkSetting::text() const { return m_text; @@ -1818,6 +1814,70 @@ void WatermarkSetting::setColor(const QColor &color) m_color = color; } +qreal ItemGeometryHelper::sceneX() +{ + return valueToPixels(m_geometry.x()); +} + +qreal ItemGeometryHelper::sceneY() +{ + return valueToPixels(m_geometry.y()); +} + +qreal ItemGeometryHelper::sceneWidth() +{ + return valueToPixels(m_geometry.width()); +} + +qreal ItemGeometryHelper::sceneHeight() +{ + return valueToPixels(m_geometry.height()); +} + +QPointF ItemGeometryHelper::scenePos() +{ + return (QPointF(sceneX(), sceneY())); +} + +QSizeF ItemGeometryHelper::sceneSize() +{ + return (QSizeF(sceneWidth(), sceneHeight())); +} + +QPointF ItemGeometryHelper::mapToPage(const PageItemDesignIntf &page) +{ + qreal startX = 0; + qreal startY = 0; + + if ( m_geometry.anchor() & Qt::AlignLeft){ + startX = 0; + } else if (m_geometry.anchor() & Qt::AlignRight){ + startX = page.geometry().width(); + } else { + startX = page.geometry().width() / 2; + } + + if ( m_geometry.anchor() & Qt::AlignTop){ + startY = 0; + } else if (m_geometry.anchor() & Qt::AlignBottom){ + startY = page.geometry().height(); + } else { + startY = page.geometry().height() / 2; + } + + return QPointF(startX + sceneX(), startY + sceneY()); +} + +qreal ItemGeometryHelper::valueToPixels(qreal value) +{ + switch (m_geometry.type()) { + case LimeReport::ItemGeometry::Milimeters: + return value * Const::mmFACTOR; + case LimeReport::ItemGeometry::Pixels: + return value; + } +} + }// namespace LimeReport diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 83adadb..75cd41c 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -64,8 +64,8 @@ private: class LIMEREPORT_EXPORT ItemGeometry{ public: enum Type{Milimeters, Pixels}; - ItemGeometry(qreal x, qreal y, qreal width, qreal height, Type type = Milimeters) - :m_x(x), m_y(y), m_width(width), m_height(height), m_type(type){} + ItemGeometry(qreal x, qreal y, qreal width, qreal height, Qt::Alignment anchor, Type type = Milimeters) + :m_x(x), m_y(y), m_width(width), m_height(height), m_type(type), m_anchor(anchor){} ItemGeometry(): m_x(0), m_y(0), m_width(0), m_height(0), m_type(Milimeters){} qreal x() const; @@ -83,12 +83,16 @@ public: Type type() const; void setType(const Type &type); + Qt::Alignment anchor() const; + void setAnchor(const Qt::Alignment &anchor); + private: qreal m_x; qreal m_y; qreal m_width; qreal m_height; Type m_type; + Qt::Alignment m_anchor; }; class LIMEREPORT_EXPORT WatermarkSetting{ @@ -119,6 +123,14 @@ private: QColor m_color; }; +class ItemBuilder{ + virtual void setProperty(QString name, QVariant value) = 0; + virtual QVariant property(QString name) = 0; + virtual void setGeometry(ItemGeometry geometry) = 0; + virtual ItemGeometry geometry() = 0; +}; + + class DataSourceManager; class ReportEnginePrivate; class PageDesignIntf; diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index ab2679e..1432bd2 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -56,6 +56,24 @@ class PrintRange; class ReportDesignWindow; class ReportExporterInterface; + +class ItemGeometryHelper{ +public: + ItemGeometryHelper(const ItemGeometry& geometry) + : m_geometry(geometry){} + qreal sceneX(); + qreal sceneY(); + qreal sceneWidth(); + qreal sceneHeight(); + QPointF scenePos(); + QSizeF sceneSize(); + QPointF mapToPage(const PageItemDesignIntf &page); +private: + qreal valueToPixels(qreal value); +private: + const ItemGeometry& m_geometry; +}; + class ReportEnginePrivateInterface { public: virtual PageDesignIntf* appendPage(const QString& pageName="") = 0; From 51b2effa3c4b05eee205246c375e456eefea3e5f Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 4 Apr 2019 04:37:18 +0300 Subject: [PATCH 304/347] Added ability to create CSV data source --- limereport/databrowser/lrdatabrowser.cpp | 51 +- limereport/databrowser/lrdatabrowser.h | 5 +- limereport/databrowser/lrsqleditdialog.cpp | 46 +- limereport/databrowser/lrsqleditdialog.h | 6 +- limereport/databrowser/lrsqleditdialog.ui | 656 ++++++++++++--------- limereport/lrdatadesignintf.cpp | 114 ++++ limereport/lrdatadesignintf.h | 65 +- limereport/lrdatasourcemanager.cpp | 107 +++- limereport/lrdatasourcemanager.h | 16 +- 9 files changed, 737 insertions(+), 329 deletions(-) diff --git a/limereport/databrowser/lrdatabrowser.cpp b/limereport/databrowser/lrdatabrowser.cpp index 10de89e..5e335f2 100644 --- a/limereport/databrowser/lrdatabrowser.cpp +++ b/limereport/databrowser/lrdatabrowser.cpp @@ -46,7 +46,6 @@ #include "lrconnectiondialog.h" #include "lrreportengine_p.h" #include "lrvariabledialog.h" -#include "lrdatabrowsertree.h" namespace LimeReport{ @@ -596,8 +595,8 @@ void DataBrowser::changeQuery(SQLEditResult result) { try { m_report->dataManager()->removeDatasource(result.oldDatasourceName); - m_report->dataManager()->addQuery(result.datasourceName, result.sql, result.connectionName); - }catch(ReportError &exception){ + addQuery(result); + } catch(ReportError &exception){ qDebug()<dataManager()->removeDatasource(result.oldDatasourceName); - m_report->dataManager()->addSubQuery(result.datasourceName, result.sql, result.connectionName, result.masterDatasource); - }catch(ReportError &exception){ + addSubQuery(result); + } catch(ReportError &exception){ qDebug()<dataManager()->removeDatasource(result.oldDatasourceName); - m_report->dataManager()->addProxy(result.datasourceName,result.masterDatasource,result.childDataSource,result.fieldMap); + addProxy(result); + } catch(ReportError &exception){ + qDebug()<dataManager()->addCSV( + result.datasourceName, + result.csv, + result.separator, + result.firstRowIsHeader + ); + } catch(ReportError &exception){ + qDebug()<dataManager()->removeDatasource(result.oldDatasourceName); + addCSV(result); } catch(ReportError &exception){ qDebug()<dataManager()->isQuery(datasourceName)) return SQLEditResult::Query; if (m_report->dataManager()->isSubQuery(datasourceName)) return SQLEditResult::SubQuery; if (m_report->dataManager()->isProxy(datasourceName)) return SQLEditResult::SubProxy; + if (m_report->dataManager()->isCSV(datasourceName)) return SQLEditResult::CSVText; return SQLEditResult::Undefined; } @@ -662,12 +686,16 @@ void DataBrowser::applyChanges(SQLEditResult result) case SQLEditResult::SubProxy: changeProxy(result); break; + case SQLEditResult::CSVText: + changeCSV(result); + break; default: break; } } else { removeDatasource(result.datasourceName); addDatasource(result); } + activateItem(result.datasourceName, DataBrowserTree::Table); } void DataBrowser::addDatasource(SQLEditResult result) @@ -682,21 +710,32 @@ void DataBrowser::addDatasource(SQLEditResult result) case SQLEditResult::SubProxy: addProxy(result); break; + case SQLEditResult::CSVText: + addCSV(result); + break; default: break; } + activateItem(result.datasourceName, DataBrowserTree::Table); +} + +void DataBrowser::activateItem(const QString& name, DataBrowserTree::NodeType type){ + QTreeWidgetItem* item = findByNameAndType(name, type); + item->treeWidget()->setCurrentItem(item); } void DataBrowser::addConnectionDesc(ConnectionDesc *connection) { m_report->dataManager()->addConnectionDesc(connection); updateDataTree(); + activateItem(connection->name(), DataBrowserTree::Connection); } void DataBrowser::changeConnectionDesc(ConnectionDesc *connection) { if (connection->autoconnect()) m_report->dataManager()->connectConnection(connection->name()); updateDataTree(); + activateItem(connection->name(), DataBrowserTree::Connection); } bool DataBrowser::checkConnectionDesc(ConnectionDesc *connection) diff --git a/limereport/databrowser/lrdatabrowser.h b/limereport/databrowser/lrdatabrowser.h index 3e4bfd3..f0c5144 100644 --- a/limereport/databrowser/lrdatabrowser.h +++ b/limereport/databrowser/lrdatabrowser.h @@ -37,6 +37,7 @@ #include "lrreportdesignwidget.h" #include "lrsqleditdialog.h" +#include "lrdatabrowsertree.h" namespace LimeReport{ @@ -105,7 +106,8 @@ private: void changeSubQuery(SQLEditResult result); void addProxy(SQLEditResult result); void changeProxy(SQLEditResult result); - + void addCSV(SQLEditResult result); + void changeCSV(SQLEditResult result); SQLEditResult::ResultMode currentDatasourceType(const QString& datasourceName); void applyChanges(SQLEditResult result); @@ -115,6 +117,7 @@ private: void changeConnectionDesc(ConnectionDesc *connection); bool checkConnectionDesc(ConnectionDesc *connection); bool containsDefaultConnection(); + void activateItem(const QString &name, DataBrowserTree::NodeType type); private: Ui::DataBrowser* ui; diff --git a/limereport/databrowser/lrsqleditdialog.cpp b/limereport/databrowser/lrsqleditdialog.cpp index 2a05e69..d53bc3d 100644 --- a/limereport/databrowser/lrsqleditdialog.cpp +++ b/limereport/databrowser/lrsqleditdialog.cpp @@ -86,7 +86,7 @@ QSettings *SQLEditDialog::settings(){ void SQLEditDialog::setSettings(QSettings *value, bool owned){ if (m_settings && m_ownedSettings) delete m_settings; - m_settings=value; + m_settings = value; m_ownedSettings = owned; } @@ -94,24 +94,29 @@ void SQLEditDialog::accept() { SQLEditResult result; - if (!ui->cbSubdetail->isChecked()){ + if (ui->tabWidget->currentIndex() == 1){ + result.resultMode = SQLEditResult::CSVText; + } else if (!ui->cbSubdetail->isChecked()){ result.resultMode=SQLEditResult::Query; } else { - if (ui->rbSubQuery->isChecked()) result.resultMode=SQLEditResult::SubQuery; + if (ui->rbSubQuery->isChecked()) result.resultMode = SQLEditResult::SubQuery; else result.resultMode=SQLEditResult::SubProxy; } result.connectionName = ConnectionDesc::connectionNameForReport(ui->cbbConnection->currentText()); result.datasourceName=ui->leDatasourceName->text(); - result.sql=ui->textEditSQL->toPlainText(); - result.dialogMode=m_dialogMode; - result.oldDatasourceName=m_oldDatasourceName; + result.sql = ui->sqlText->toPlainText(); + result.csv = ui->csvText->toPlainText(); + result.dialogMode = m_dialogMode; + result.oldDatasourceName = m_oldDatasourceName; result.subdetail = ui->cbSubdetail->isChecked(); result.masterDatasource=ui->leMaster->text(); result.childDataSource=ui->leChild->text(); + result.separator = ui->leSeparator->text(); + result.firstRowIsHeader = ui->cbUseFirstRowAsHeader->isChecked(); - if (ui->fieldsMap->rowCount()>0){ - for(int i=0;ifieldsMap->rowCount();++i){ + if (ui->fieldsMap->rowCount() > 0){ + for(int i=0; i< ui->fieldsMap->rowCount(); ++i){ LimeReport::FieldsCorrelation fieldsCorrelation; fieldsCorrelation.master = ui->fieldsMap->item(i,0) ? ui->fieldsMap->item(i,0)->data(Qt::DisplayRole).toString() : ""; fieldsCorrelation.detail = ui->fieldsMap->item(i,1) ? ui->fieldsMap->item(i,1)->data(Qt::DisplayRole).toString() : ""; @@ -148,7 +153,7 @@ void SQLEditDialog::hideEvent(QHideEvent *) void SQLEditDialog::check() { if (ui->leDatasourceName->text().isEmpty()) throw LimeReport::ReportError(tr("Datasource Name is empty!")); - if (ui->textEditSQL->toPlainText().isEmpty() && (!ui->rbProxy) ) throw LimeReport::ReportError(tr("SQL is empty!")); + if (ui->sqlText->toPlainText().isEmpty() && (!ui->rbProxy) ) throw LimeReport::ReportError(tr("SQL is empty!")); if (m_dialogMode==AddMode){ if (m_datasources->containsDatasource(ui->leDatasourceName->text())){ throw LimeReport::ReportError(QString(tr("Datasource with name: \"%1\" already exists!")).arg(ui->leDatasourceName->text())); @@ -180,10 +185,12 @@ void SQLEditDialog::setDataSources(LimeReport::DataSourceManager *dataSources, Q m_datasources=dataSources; if (!datasourceName.isEmpty()){ ui->cbSubdetail->setEnabled(true); - initQueryMode(); m_oldDatasourceName=datasourceName; ui->leDatasourceName->setText(datasourceName); - ui->textEditSQL->setText(dataSources->queryText(datasourceName)); + ui->sqlText->setText(dataSources->queryText(datasourceName)); + if (dataSources->isQuery(datasourceName)){ + initQueryMode(); + } if (dataSources->isSubQuery(datasourceName)){ initSubQueryMode(); ui->leMaster->setText(dataSources->subQueryByName(datasourceName)->master()); @@ -201,6 +208,12 @@ void SQLEditDialog::setDataSources(LimeReport::DataSourceManager *dataSources, Q curIndex++; } } + if (dataSources->isCSV(datasourceName)){ + ui->csvText->setPlainText(dataSources->csvByName(datasourceName)->csvText()); + ui->leSeparator->setText(dataSources->csvByName(datasourceName)->separator()); + ui->cbUseFirstRowAsHeader->setChecked(dataSources->csvByName(datasourceName)->firstRowIsHeader()); + initCSVMode(); + } } } @@ -254,6 +267,7 @@ void SQLEditDialog::on_pbAddField_clicked() ui->fieldsMap->setRowCount(ui->fieldsMap->rowCount()+1); } + void SQLEditDialog::initQueryMode() { ui->gbSQL->setVisible(true); @@ -264,6 +278,7 @@ void SQLEditDialog::initQueryMode() ui->cbSubdetail->setChecked(false); ui->leMaster->setVisible(false); ui->lbMaster->setVisible(false); + ui->tabWidget->removeTab(1); } void SQLEditDialog::initSubQueryMode() @@ -278,6 +293,7 @@ void SQLEditDialog::initSubQueryMode() ui->leMaster->setVisible(true); ui->leMaster->setEnabled(true); ui->lbMaster->setVisible(true); + ui->tabWidget->removeTab(1); } void SQLEditDialog::initProxyMode() @@ -293,6 +309,12 @@ void SQLEditDialog::initProxyMode() ui->leMaster->setEnabled(true); ui->lbMaster->setVisible(true); ui->cbSubdetail->setEnabled(false); + ui->tabWidget->removeTab(1); +} + +void SQLEditDialog::initCSVMode() +{ + ui->tabWidget->removeTab(0); } void SQLEditDialog::slotPreviewData() @@ -303,7 +325,7 @@ void SQLEditDialog::slotPreviewData() } m_previewModel = m_datasources->previewSQL( ConnectionDesc::connectionNameForReport(ui->cbbConnection->currentText()), - ui->textEditSQL->toPlainText(), + ui->sqlText->toPlainText(), ui->leMaster->text() ); if (m_previewModel){ diff --git a/limereport/databrowser/lrsqleditdialog.h b/limereport/databrowser/lrsqleditdialog.h index 55166a9..28dcffd 100644 --- a/limereport/databrowser/lrsqleditdialog.h +++ b/limereport/databrowser/lrsqleditdialog.h @@ -77,6 +77,7 @@ private slots: void initQueryMode(); void initSubQueryMode(); void initProxyMode(); + void initCSVMode(); void slotPreviewData(); void slotHidePreview(); private: @@ -96,17 +97,20 @@ private: }; struct SQLEditResult{ - enum ResultMode{Query, SubQuery, SubProxy, Undefined}; + enum ResultMode{Query, SubQuery, SubProxy, CSVText, Undefined}; QString connectionName; QString datasourceName; QString oldDatasourceName; QString sql; + QString csv; bool subdetail; ResultMode resultMode; QString masterDatasource; QString childDataSource; SQLEditDialog::SQLDialogMode dialogMode; QList fieldMap; + QString separator; + bool firstRowIsHeader; }; } // namespace LimeReport diff --git a/limereport/databrowser/lrsqleditdialog.ui b/limereport/databrowser/lrsqleditdialog.ui index e1353aa..d6c6a91 100644 --- a/limereport/databrowser/lrsqleditdialog.ui +++ b/limereport/databrowser/lrsqleditdialog.ui @@ -6,8 +6,8 @@ 0 0 - 411 - 617 + 422 + 622 @@ -21,30 +21,6 @@ - - - - - - Connection - - - - - - - - 0 - 0 - - - - Qt::NoFocus - - - - - @@ -207,6 +183,15 @@ + + + + 0 + 0 + 0 + + + @@ -344,6 +329,15 @@ + + + + 0 + 0 + 0 + + + @@ -481,6 +475,15 @@ + + + + 0 + 0 + 0 + + + @@ -498,253 +501,351 @@ - - - - - Subdetail - - - - - + + + 0 + + + + SQL + + - - - Master datasource + + + + + Connection + + + + + + + + 0 + 0 + + + + Qt::NoFocus + + + + + + + + + + + Subdetail + + + + + + + + + Master datasource + + + + + + + false + + + + + + + + + false + + + Subquery mode + + + + + + + false + + + Filter mode + + + + + + + + + SQL + + + 4 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Preview + + + + + + + Hide Preview + + + + + + - - - false + + + QFrame::NoFrame + + QFrame::Raised + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + Child datasource + + + + + + + + + + + + + + + Fields map + + + + 4 + + + 4 + + + 4 + + + 4 + + + + + 2 + + + + + + + + + + + ... + + + + :/databrowser/images/add.png:/databrowser/images/add.png + + + true + + + + + + + ... + + + + :/databrowser/images/remove.png:/databrowser/images/remove.png + + + true + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + Data preview + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + - - - - - false - - - Subquery mode - - - - - - - false - - - Filter mode - - - - - - - - - SQL - - - - 4 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - - - - - Preview - - - - - - - Hide Preview - - - - - - - - - - - - QFrame::NoFrame - - - QFrame::Raised - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - Child datasource - - - - - - - - - - - - - - - Fields map - - - - 4 - - - 4 - - - 4 - - - 4 - - - - - 2 - - - - - - - - - - - ... - - - - :/databrowser/images/add.png:/databrowser/images/add.png - - - true - - - - - - - ... - - - - :/databrowser/images/remove.png:/databrowser/images/remove.png - - - true - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - Data preview - - - - 2 - - - 2 - - - 2 - - - 2 - - - 2 - - - - - + + + + CSV + + + + + + + + Separator + + + + + + + + 0 + 0 + + + + + 30 + 16777215 + + + + ; + + + + + + + Use first row as header + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + @@ -787,39 +888,14 @@ - leDatasourceName - cbSubdetail - leMaster - rbSubQuery - rbProxy - textEditSQL - leChild - fieldsMap - pbAddField - pbDelField pushButton_2 pushButton + - - leDatasourceName - textChanged(QString) - LimeReport::SQLEditDialog - slotDataSourceNameEditing() - - - 259 - 54 - - - 289 - 32 - - - pushButton clicked() diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index 9fae29e..718f1f4 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -831,4 +831,118 @@ bool CallbackDatasource::checkIfEmpty(){ } } +QString CSVDesc::name() const +{ + return m_csvName; +} + +void CSVDesc::setName(const QString &csvName) +{ + m_csvName = csvName; +} + +QString CSVDesc::csvText() const +{ + return m_csvText; +} + +void CSVDesc::setCsvText(const QString &csvText) +{ + m_csvText = csvText; + emit cvsTextChanged(m_csvName, m_csvText); +} + +QString CSVDesc::separator() const +{ + return m_separator; +} + +void CSVDesc::setSeparator(const QString &separator) +{ + m_separator = separator; +} + +bool CSVDesc::firstRowIsHeader() const +{ + return m_firstRowIsHeader; +} + +void CSVDesc::setFirstRowIsHeader(bool firstRowIsHeader) +{ + m_firstRowIsHeader = firstRowIsHeader; +} + +void CSVHolder::updateModel() +{ + m_model.clear(); + QString sep = (separator().compare("\\t") == 0) ? "\t" : separator(); + bool firstRow = true; + QList columns; + QStringList headers; + foreach(QString line, m_csvText.split('\n')){ + columns.clear(); + foreach(QString item, line.split(sep)){ + columns.append(new QStandardItem(item)); + if (firstRow && m_firstRowIsHeader) headers.append(item); + } + + if (firstRow){ + if (!headers.isEmpty()){ + m_model.setHorizontalHeaderLabels(headers); + firstRow = false; + } else { + m_model.appendRow(columns); + } + } else { + m_model.appendRow(columns); + } + + } + + +} + +bool CSVHolder::firsRowIsHeader() const +{ + return m_firstRowIsHeader; +} + +void CSVHolder::setFirsRowIsHeader(bool firstRowIsHeader) +{ + m_firstRowIsHeader = firstRowIsHeader; +} + +CSVHolder::CSVHolder(const CSVDesc &desc, DataSourceManager *dataManager) + : m_csvText(desc.csvText()), + m_separator(desc.separator()), + m_dataManager(dataManager), + m_firstRowIsHeader(desc.firstRowIsHeader()) +{ + m_dataSource = IDataSource::Ptr(new ModelToDataSource(&m_model, false)); + updateModel(); +} + +void CSVHolder::setCSVText(QString csvText) +{ + m_csvText = csvText; + updateModel(); +} + +QString CSVHolder::separator() const +{ + return m_separator; +} + +void CSVHolder::setSeparator(const QString &separator) +{ + m_separator = separator; + updateModel(); +} + +IDataSource *CSVHolder::dataSource(IDataSource::DatasourceMode mode) +{ + Q_UNUSED(mode); + return m_dataSource.data(); +} + } //namespace LimeReport diff --git a/limereport/lrdatadesignintf.h b/limereport/lrdatadesignintf.h index a05c81e..8665bc1 100644 --- a/limereport/lrdatadesignintf.h +++ b/limereport/lrdatadesignintf.h @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -131,6 +132,64 @@ public: virtual QString lastError() const = 0; }; +class CSVDesc: public QObject{ + Q_OBJECT + Q_PROPERTY(QString name READ name WRITE setName) + Q_PROPERTY(QString csvText READ csvText WRITE setCsvText) + Q_PROPERTY(QString separator READ separator WRITE setSeparator) + Q_PROPERTY(bool firstRowIsHeader READ firstRowIsHeader WRITE setFirstRowIsHeader) +public: + CSVDesc(const QString name, const QString csvText, QString separator, bool firstRowIsHeader) + : m_csvName(name), m_csvText(csvText), m_separator(separator), m_firstRowIsHeader(firstRowIsHeader){} + explicit CSVDesc(QObject* parent = 0):QObject(parent) {} + QString name() const; + void setName(const QString &name); + QString csvText() const; + void setCsvText(const QString &csvText); + QString separator() const; + void setSeparator(const QString &separator); + bool firstRowIsHeader() const; + void setFirstRowIsHeader(bool firstRowIsHeader); +signals: + void cvsTextChanged(const QString& cvsName, const QString& cvsText); +private: + QString m_csvName; + QString m_csvText; + QString m_separator; + bool m_firstRowIsHeader; +}; + +class CSVHolder: public IDataSourceHolder{ +public: + CSVHolder(const CSVDesc& desc, DataSourceManager* dataManager); + void setCSVText(QString csvText); + QString csvText() { return m_csvText;} + QString separator() const; + void setSeparator(const QString &separator); + bool firsRowIsHeader() const; + void setFirsRowIsHeader(bool firstRowIsHeader); + // IDataSourceHolder interface +public: + IDataSource *dataSource(IDataSource::DatasourceMode mode = IDataSource::RENDER_MODE); + QString lastError() const {return "";} + bool isInvalid() const {return false;} + bool isOwned() const {return true;} + bool isEditable() const {return true;} + bool isRemovable() const {return true;} + void invalidate(IDataSource::DatasourceMode mode, bool dbWillBeClosed){ updateModel();} + void update(){ updateModel(); } + void clearErrors(){} +private: + void updateModel(); +private: + QString m_csvText; + QStandardItemModel m_model; + QString m_separator; + IDataSource::Ptr m_dataSource; + DataSourceManager* m_dataManager; + bool m_firstRowIsHeader; +}; + class QueryDesc : public QObject{ Q_OBJECT Q_PROPERTY(QString queryName READ queryName WRITE setQueryName) @@ -140,11 +199,11 @@ public: QueryDesc(QString queryName, QString queryText, QString connection); explicit QueryDesc(QObject* parent=0):QObject(parent){} void setQueryName(QString value){m_queryName=value;} - QString queryName(){return m_queryName;} + QString queryName() const {return m_queryName;} void setQueryText(QString value){m_queryText=value; emit queryTextChanged(m_queryName, m_queryText);} - QString queryText(){return m_queryText;} + QString queryText() const {return m_queryText;} void setConnectionName(QString value){m_connectionName=value;} - QString connectionName(){return m_connectionName;} + QString connectionName() const {return m_connectionName;} signals: void queryTextChanged(const QString& queryName, const QString& queryText); private: diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index 4f9b147..b020550 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -179,7 +179,7 @@ DataNode* DataSourceModel::nodeFromIndex(const QModelIndex& index) const void DataSourceModel::fillFields(DataNode* parent) { foreach(QString name, m_dataManager->fieldNames(parent->name())){ - parent->addChild(name,DataNode::Field,QIcon(":/report/images/field")); + parent->addChild(name, DataNode::Field,QIcon(":/report/images/field")); } } @@ -537,7 +537,7 @@ void DataSourceManager::addSubQuery(const QString &name, const QString &sqlText, emit datasourcesChanged(); } -void DataSourceManager::addProxy(const QString &name, QString master, QString detail, QList fields) +void DataSourceManager::addProxy(const QString &name, const QString &master, const QString &detail, QList fields) { ProxyDesc *proxyDesc = new ProxyDesc(); proxyDesc->setName(name); @@ -552,6 +552,15 @@ void DataSourceManager::addProxy(const QString &name, QString master, QString de emit datasourcesChanged(); } +void DataSourceManager::addCSV(const QString& name, const QString& csvText, const QString &separator, bool firstRowIsHeader) +{ + CSVDesc* csvDesc = new CSVDesc(name, csvText, separator, firstRowIsHeader); + putCSVDesc(csvDesc); + putHolder(name, new CSVHolder(*csvDesc, this)); + m_hasChanges = true; + emit datasourcesChanged(); +} + QString DataSourceManager::queryText(const QString &dataSourceName) { if (isQuery(dataSourceName)) return queryByName(dataSourceName)->queryText(); @@ -559,16 +568,16 @@ QString DataSourceManager::queryText(const QString &dataSourceName) else return QString(); } -QueryDesc *DataSourceManager::queryByName(const QString &dataSourceName) +QueryDesc *DataSourceManager::queryByName(const QString &datasourceName) { - int queryIndex = queryIndexByName(dataSourceName); + int queryIndex = queryIndexByName(datasourceName); if (queryIndex!=-1) return m_queries.at(queryIndex); return 0; } -SubQueryDesc* DataSourceManager::subQueryByName(const QString &dataSourceName) +SubQueryDesc* DataSourceManager::subQueryByName(const QString &datasourceName) { - int queryIndex = subQueryIndexByName(dataSourceName); + int queryIndex = subQueryIndexByName(datasourceName); if (queryIndex!=-1) return m_subqueries.at(queryIndex); return 0; } @@ -607,6 +616,15 @@ int DataSourceManager::proxyIndexByName(const QString &dataSourceName) return -1; } +int DataSourceManager::csvIndexByName(const QString &dataSourceName) +{ + for(int i=0; i < m_csvs.count();++i){ + CSVDesc* desc=m_csvs.at(i); + if (desc->name().compare(dataSourceName,Qt::CaseInsensitive)==0) return i; + } + return -1; +} + int DataSourceManager::connectionIndexByName(const QString &connectionName) { for(int i=0;i-1) return m_proxies.at(proxyIndex); + if (proxyIndex > -1) return m_proxies.at(proxyIndex); + else return 0; +} + +CSVDesc *DataSourceManager::csvByName(const QString &datasourceName) +{ + int csvIndex = csvIndexByName(datasourceName); + if (csvIndex > -1) return m_csvs.at(csvIndex); else return 0; } @@ -671,6 +696,11 @@ void DataSourceManager::removeDatasource(const QString &name) delete m_proxies.at(proxyIndex); m_proxies.removeAt(proxyIndex); } + if (isCSV(name)){ + int csvIndex=csvIndexByName(name); + delete m_csvs.at(csvIndex); + m_csvs.removeAt(csvIndex); + } m_hasChanges = true; emit datasourcesChanged(); } @@ -763,6 +793,15 @@ void DataSourceManager::putProxyDesc(ProxyDesc *proxyDesc) } else throw ReportError(tr("Datasource with name \"%1\" already exists!").arg(proxyDesc->name())); } +void DataSourceManager::putCSVDesc(CSVDesc *csvDesc) +{ + if (!containsDatasource(csvDesc->name())){ + m_csvs.append(csvDesc); + connect(csvDesc, SIGNAL(cvsTextChanged(QString, QString)), + this, SLOT(slotCSVTextChanged(QString, QString))); + } else throw ReportError(tr("Datasource with name \"%1\" already exists!").arg(csvDesc->name())); +} + bool DataSourceManager::initAndOpenDB(QSqlDatabase& db, ConnectionDesc& connectionDesc){ bool connected = false; @@ -933,17 +972,22 @@ bool DataSourceManager::containsDatasource(const QString &dataSourceName) bool DataSourceManager::isSubQuery(const QString &dataSourceName) { - return subQueryIndexByName(dataSourceName.toLower())!=-1; + return subQueryIndexByName(dataSourceName) != -1; } bool DataSourceManager::isProxy(const QString &dataSourceName) { - return proxyIndexByName(dataSourceName)!=-1; + return proxyIndexByName(dataSourceName) != -1; +} + +bool DataSourceManager::isCSV(const QString &datasourceName) +{ + return csvIndexByName(datasourceName) != -1; } bool DataSourceManager::isConnection(const QString &connectionName) { - return connectionIndexByName(connectionName)!=-1; + return connectionIndexByName(connectionName) != -1; } bool DataSourceManager::isConnectionConnected(const QString &connectionName) @@ -1045,7 +1089,7 @@ QStringList DataSourceManager::fieldNames(const QString &datasourceName) QStringList result; IDataSource* ds = dataSource(datasourceName); if (ds && !ds->isInvalid()){ - for(int i=0;icolumnCount();i++){ + for(int i=0; i < ds->columnCount(); i++){ result.append(ds->columnNameByIndex(i)); } result.sort(); @@ -1089,6 +1133,12 @@ QObject *DataSourceManager::createElement(const QString& collectionName, const Q return var; } + if (collectionName=="csvs"){ + CSVDesc* csvDesc = new CSVDesc; + m_csvs.append(csvDesc); + return csvDesc; + } + return 0; } @@ -1109,6 +1159,9 @@ int DataSourceManager::elementsCount(const QString &collectionName) if (collectionName=="variables"){ return m_reportVariables.variablesCount(); } + if (collectionName=="csvs"){ + return m_csvs.count(); + } return 0; } @@ -1129,6 +1182,9 @@ QObject* DataSourceManager::elementAt(const QString &collectionName, int index) if (collectionName=="variables"){ return m_reportVariables.variableAt(index); } + if (collectionName=="csvs"){ + return m_csvs.at(index); + } return 0; } @@ -1206,6 +1262,25 @@ void DataSourceManager::collectionLoadFinished(const QString &collectionName) m_tempVars.clear(); } EASY_END_BLOCK; + + if (collectionName.compare("csvs", Qt::CaseInsensitive) == 0){ + QMutableListIterator it(m_csvs); + while (it.hasNext()){ + it.next(); + if (!m_datasources.contains(it.value()->name().toLower())){ + connect(it.value(), SIGNAL(cvsTextChanged(QString,QString)), + this, SLOT(slotCSVTextChanged(QString,QString))); + putHolder( + it.value()->name(), + new CSVHolder(*it.value(), this) + ); + } else { + delete it.value(); + it.remove(); + } + } + } + if (designTime()){ EASY_BLOCK("emit datasourcesChanged()"); emit datasourcesChanged(); @@ -1328,6 +1403,14 @@ void DataSourceManager::slotVariableHasBeenChanged(const QString& variableName) m_hasChanges = true; } +void DataSourceManager::slotCSVTextChanged(const QString &csvName, const QString &csvText) +{ + CSVHolder* holder = dynamic_cast(m_datasources.value(csvName)); + if (holder){ + holder->setCSVText(csvText); + } +} + void DataSourceManager::clear(ClearMethod method) { DataSourcesMap::iterator dit; diff --git a/limereport/lrdatasourcemanager.h b/limereport/lrdatasourcemanager.h index 001e09e..de708fe 100644 --- a/limereport/lrdatasourcemanager.h +++ b/limereport/lrdatasourcemanager.h @@ -100,6 +100,7 @@ class DataSourceManager : public QObject, public ICollectionContainer, public IV Q_PROPERTY(ACollectionProperty subqueries READ fakeCollectionReader) Q_PROPERTY(ACollectionProperty subproxies READ fakeCollectionReader) Q_PROPERTY(ACollectionProperty variables READ fakeCollectionReader) + Q_PROPERTY(ACollectionProperty csvs READ fakeCollectionReader) friend class ReportEnginePrivate; friend class ReportRender; public: @@ -112,7 +113,8 @@ public: bool checkConnectionDesc(ConnectionDesc *connection); void addQuery(const QString& name, const QString& sqlText, const QString& connectionName=""); void addSubQuery(const QString& name, const QString& sqlText, const QString& connectionName, const QString& masterDatasource); - void addProxy(const QString& name, QString master, QString detail, QList fields); + void addProxy(const QString& name, const QString& master, const QString& detail, QList fields); + void addCSV(const QString& name, const QString& csvText, const QString& separator, bool firstRowIsHeader); bool addModel(const QString& name, QAbstractItemModel *model, bool owned); void removeModel(const QString& name); ICallbackDatasource* createCallbackDatasource(const QString &name); @@ -143,18 +145,21 @@ public: bool containsDatasource(const QString& dataSourceName); bool isSubQuery(const QString& dataSourceName); bool isProxy(const QString& dataSourceName); + bool isCSV(const QString& datasourceName); bool isConnection(const QString& connectionName); bool isConnectionConnected(const QString& connectionName); bool connectConnection(const QString &connectionName); void connectAutoConnections(); void disconnectConnection(const QString &connectionName); - QueryDesc* queryByName(const QString& dataSourceName); - SubQueryDesc* subQueryByName(const QString& dataSourceName); - ProxyDesc* proxyByName(QString datasourceName); + QueryDesc* queryByName(const QString& datasourceName); + SubQueryDesc* subQueryByName(const QString& datasourceName); + ProxyDesc* proxyByName(const QString& datasourceName); + CSVDesc* csvByName(const QString& datasourceName); ConnectionDesc *connectionByName(const QString& connectionName); int queryIndexByName(const QString& dataSourceName); int subQueryIndexByName(const QString& dataSourceName); int proxyIndexByName(const QString& dataSourceName); + int csvIndexByName(const QString& dataSourceName); int connectionIndexByName(const QString& connectionName); QList &conections(); @@ -226,6 +231,7 @@ protected: void putQueryDesc(QueryDesc *queryDesc); void putSubQueryDesc(SubQueryDesc *subQueryDesc); void putProxyDesc(ProxyDesc *proxyDesc); + void putCSVDesc(CSVDesc* csvDesc); bool connectConnection(ConnectionDesc* connectionDesc); void clearReportVariables(); QList childDatasources(const QString& datasourceName); @@ -246,6 +252,7 @@ private slots: void slotQueryTextChanged(const QString& queryName, const QString& queryText); void slotVariableHasBeenAdded(const QString& variableName); void slotVariableHasBeenChanged(const QString& variableName); + void slotCSVTextChanged(const QString& csvName, const QString& csvText); private: explicit DataSourceManager(QObject *parent = 0); bool initAndOpenDB(QSqlDatabase &db, ConnectionDesc &connectionDesc); @@ -256,6 +263,7 @@ private: QList m_subqueries; QList m_proxies; QList m_tempVars; + QList m_csvs; QMultiMap m_groupFunctions; GroupFunctionFactory m_groupFunctionFactory; From 93a9a002027c4cffb98cd5163721085a603ee139 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 4 Apr 2019 17:16:38 +0300 Subject: [PATCH 305/347] Build for Qt < 5.12 has been fixed --- limereport/databrowser/lrsqleditdialog.ui | 27 ----------------------- 1 file changed, 27 deletions(-) diff --git a/limereport/databrowser/lrsqleditdialog.ui b/limereport/databrowser/lrsqleditdialog.ui index d6c6a91..f0abfbe 100644 --- a/limereport/databrowser/lrsqleditdialog.ui +++ b/limereport/databrowser/lrsqleditdialog.ui @@ -183,15 +183,6 @@ - - - - 0 - 0 - 0 - - - @@ -329,15 +320,6 @@ - - - - 0 - 0 - 0 - - - @@ -475,15 +457,6 @@ - - - - 0 - 0 - 0 - - - From 602e8a82f6c52bacca321533fa167b081e263d9c Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 6 Apr 2019 00:28:02 +0300 Subject: [PATCH 306/347] Watermark has been fixed --- include/lrreportengine.h | 10 ++++---- limereport/lrreportengine.cpp | 46 +++++++++++++++++------------------ limereport/lrreportengine.h | 10 ++++---- limereport/lrreportengine_p.h | 8 +++--- 4 files changed, 37 insertions(+), 37 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 75cd41c..cea1052 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -98,8 +98,8 @@ private: class LIMEREPORT_EXPORT WatermarkSetting{ public: WatermarkSetting(const QString& text, const ItemGeometry& geometry, const QFont& font) - : m_text(text), m_font(font), m_opacity(50), m_geomerty(geometry), m_color(QColor(Qt::black)){} - WatermarkSetting(): m_font(QFont()), m_opacity(50), m_geomerty(ItemGeometry()){} + : m_text(text), m_font(font), m_opacity(50), m_geometry(geometry), m_color(QColor(Qt::black)){} + WatermarkSetting(): m_font(QFont()), m_opacity(50), m_geometry(ItemGeometry()){} QString text() const; void setText(const QString &text); @@ -109,8 +109,8 @@ public: int opacity() const; void setOpacity(const int &opacity); - ItemGeometry geomerty() const; - void setGeomerty(const ItemGeometry &geomerty); + ItemGeometry geometry() const; + void setGeometry(const ItemGeometry &geometry); QColor color() const; void setColor(const QColor &color); @@ -119,7 +119,7 @@ private: QString m_text; QFont m_font; int m_opacity; - ItemGeometry m_geomerty; + ItemGeometry m_geometry; QColor m_color; }; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index ee7473d..a8dabb4 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1165,9 +1165,9 @@ void ReportEnginePrivate::paintByExternalPainter(const QString& objectName, QPai BaseDesignIntf* ReportEnginePrivate::createWatermark(PageDesignIntf* page, WatermarkSetting watermarkSetting) { - ItemGeometryHelper geometry(watermarkSetting.geomerty()); + WatermarkHelper watermarkHelper(watermarkSetting); - BaseDesignIntf* watermark = page->addReportItem("TextItem", geometry.mapToPage(*page->pageItem()), geometry.sceneSize()); + BaseDesignIntf* watermark = page->addReportItem("TextItem", watermarkHelper.mapToPage(*page->pageItem()), watermarkHelper.sceneSize()); if (watermark){ watermark->setProperty("content", watermarkSetting.text()); watermark->setProperty("font",watermarkSetting.font()); @@ -1794,14 +1794,14 @@ void WatermarkSetting::setOpacity(const int &opacity) m_opacity = opacity; } -ItemGeometry WatermarkSetting::geomerty() const +ItemGeometry WatermarkSetting::geometry() const { - return m_geomerty; + return m_geometry; } -void WatermarkSetting::setGeomerty(const ItemGeometry &geomerty) +void WatermarkSetting::setGeometry(const ItemGeometry &geometry) { - m_geomerty = geomerty; + m_geometry = geometry; } QColor WatermarkSetting::color() const @@ -1814,52 +1814,52 @@ void WatermarkSetting::setColor(const QColor &color) m_color = color; } -qreal ItemGeometryHelper::sceneX() +qreal WatermarkHelper::sceneX() { - return valueToPixels(m_geometry.x()); + return valueToPixels(m_watermark.geometry().x()); } -qreal ItemGeometryHelper::sceneY() +qreal WatermarkHelper::sceneY() { - return valueToPixels(m_geometry.y()); + return valueToPixels(m_watermark.geometry().y()); } -qreal ItemGeometryHelper::sceneWidth() +qreal WatermarkHelper::sceneWidth() { - return valueToPixels(m_geometry.width()); + return valueToPixels(m_watermark.geometry().width()); } -qreal ItemGeometryHelper::sceneHeight() +qreal WatermarkHelper::sceneHeight() { - return valueToPixels(m_geometry.height()); + return valueToPixels(m_watermark.geometry().height()); } -QPointF ItemGeometryHelper::scenePos() +QPointF WatermarkHelper::scenePos() { return (QPointF(sceneX(), sceneY())); } -QSizeF ItemGeometryHelper::sceneSize() +QSizeF WatermarkHelper::sceneSize() { return (QSizeF(sceneWidth(), sceneHeight())); } -QPointF ItemGeometryHelper::mapToPage(const PageItemDesignIntf &page) +QPointF WatermarkHelper::mapToPage(const PageItemDesignIntf &page) { qreal startX = 0; qreal startY = 0; - if ( m_geometry.anchor() & Qt::AlignLeft){ + if ( m_watermark.geometry().anchor() & Qt::AlignLeft){ startX = 0; - } else if (m_geometry.anchor() & Qt::AlignRight){ + } else if ( m_watermark.geometry().anchor() & Qt::AlignRight){ startX = page.geometry().width(); } else { startX = page.geometry().width() / 2; } - if ( m_geometry.anchor() & Qt::AlignTop){ + if ( m_watermark.geometry().anchor() & Qt::AlignTop){ startY = 0; - } else if (m_geometry.anchor() & Qt::AlignBottom){ + } else if (m_watermark.geometry().anchor() & Qt::AlignBottom){ startY = page.geometry().height(); } else { startY = page.geometry().height() / 2; @@ -1868,9 +1868,9 @@ QPointF ItemGeometryHelper::mapToPage(const PageItemDesignIntf &page) return QPointF(startX + sceneX(), startY + sceneY()); } -qreal ItemGeometryHelper::valueToPixels(qreal value) +qreal WatermarkHelper::valueToPixels(qreal value) { - switch (m_geometry.type()) { + switch (m_watermark.geometry().type()) { case LimeReport::ItemGeometry::Milimeters: return value * Const::mmFACTOR; case LimeReport::ItemGeometry::Pixels: diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 75cd41c..cea1052 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -98,8 +98,8 @@ private: class LIMEREPORT_EXPORT WatermarkSetting{ public: WatermarkSetting(const QString& text, const ItemGeometry& geometry, const QFont& font) - : m_text(text), m_font(font), m_opacity(50), m_geomerty(geometry), m_color(QColor(Qt::black)){} - WatermarkSetting(): m_font(QFont()), m_opacity(50), m_geomerty(ItemGeometry()){} + : m_text(text), m_font(font), m_opacity(50), m_geometry(geometry), m_color(QColor(Qt::black)){} + WatermarkSetting(): m_font(QFont()), m_opacity(50), m_geometry(ItemGeometry()){} QString text() const; void setText(const QString &text); @@ -109,8 +109,8 @@ public: int opacity() const; void setOpacity(const int &opacity); - ItemGeometry geomerty() const; - void setGeomerty(const ItemGeometry &geomerty); + ItemGeometry geometry() const; + void setGeometry(const ItemGeometry &geometry); QColor color() const; void setColor(const QColor &color); @@ -119,7 +119,7 @@ private: QString m_text; QFont m_font; int m_opacity; - ItemGeometry m_geomerty; + ItemGeometry m_geometry; QColor m_color; }; diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 1432bd2..686a757 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -57,10 +57,10 @@ class ReportDesignWindow; class ReportExporterInterface; -class ItemGeometryHelper{ +class WatermarkHelper{ public: - ItemGeometryHelper(const ItemGeometry& geometry) - : m_geometry(geometry){} + WatermarkHelper(const WatermarkSetting& watermark) + : m_watermark(watermark){} qreal sceneX(); qreal sceneY(); qreal sceneWidth(); @@ -71,7 +71,7 @@ public: private: qreal valueToPixels(qreal value); private: - const ItemGeometry& m_geometry; + const WatermarkSetting& m_watermark; }; class ReportEnginePrivateInterface { From 271b765722ec46a78e97b27562187823fa1a5e01 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 16 Apr 2019 16:59:35 +0300 Subject: [PATCH 307/347] The rendering process, if the not sliced band is moved to a new page, has been changed --- limereport/lrreportrender.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index e75bd33..fc314d9 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -428,6 +428,7 @@ void ReportRender::replaceGroupsFunction(BandDesignIntf *band) BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesignIntf* bandData, ReportRender::DataRenderMode mode, bool isLast) { QCoreApplication::processEvents(); + bool bandIsSliced = false; if (patternBand){ if (patternBand->isHeader()) @@ -474,7 +475,8 @@ BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesign if (patternBand && patternBand->isHeader() && patternBand->reprintOnEachPage()) m_reprintableBands.removeOne(patternBand); if (bandClone->canBeSplitted(m_maxHeightByColumn[m_currentColumn])){ - bandClone = sliceBand(bandClone,patternBand,isLast); + bandClone = sliceBand(bandClone, patternBand, isLast); + bandIsSliced = true; } else { qreal percent = (bandClone->height()-m_maxHeightByColumn[m_currentColumn])/(bandClone->height()/100); if (bandClone->maxScalePercent()>=percent){ @@ -504,6 +506,10 @@ BandDesignIntf* ReportRender::renderBand(BandDesignIntf *patternBand, BandDesign } else { savePage(); startNewPage(); + if (!bandIsSliced){ + delete bandClone; + bandClone = renderData(patternBand); + } } if (!registerBand(bandClone)) { BandDesignIntf* upperPart = dynamic_cast(bandClone->cloneUpperPart(m_maxHeightByColumn[m_currentColumn])); From 5e7ee21463d3e13978b4111d74ab9a882dd5ff70 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Tue, 30 Apr 2019 13:52:26 +0300 Subject: [PATCH 308/347] qzint.pri has been fixed --- qzint.pri | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/qzint.pri b/qzint.pri index 51a6a50..6dc3a08 100644 --- a/qzint.pri +++ b/qzint.pri @@ -6,33 +6,35 @@ DEFINES += _CRT_SECURE_NO_WARNINGS _CRT_NONSTDC_NO_WARNINGS ZINT_VERSION=\\\"$$ INCLUDEPATH += \ $$ZINT_PATH/backend \ - $$ZINT_PATH/backend_qt4 + $$ZINT_PATH/backend_qt HEADERS += $$ZINT_PATH/backend/aztec.h \ - $$ZINT_PATH/backend/code1.h \ + $$ZINT_PATH/backend/bmp.h \ $$ZINT_PATH/backend/code49.h \ $$ZINT_PATH/backend/common.h \ $$ZINT_PATH/backend/composite.h \ $$ZINT_PATH/backend/dmatrix.h \ + $$ZINT_PATH/backend/eci.h \ $$ZINT_PATH/backend/font.h \ - $$ZINT_PATH/backend/gb2312.h \ $$ZINT_PATH/backend/gridmtx.h \ $$ZINT_PATH/backend/gs1.h \ + $$ZINT_PATH/backend/hanxin.h \ $$ZINT_PATH/backend/large.h \ $$ZINT_PATH/backend/maxicode.h \ - $$ZINT_PATH/backend/maxipng.h \ - $$ZINT_PATH/backend/ms_stdint.h \ + $$ZINT_PATH/backend/pcx.h \ $$ZINT_PATH/backend/pdf417.h \ - $$ZINT_PATH/backend/qr.h \ $$ZINT_PATH/backend/reedsol.h \ $$ZINT_PATH/backend/rss.h \ $$ZINT_PATH/backend/sjis.h \ + $$ZINT_PATH/backend/stdint_msvc.h \ $$ZINT_PATH/backend/zint.h \ - $$ZINT_PATH/backend_qt4/qzint.h + $$ZINT_PATH/backend_qt/qzint.h SOURCES += $$ZINT_PATH/backend/2of5.c \ $$ZINT_PATH/backend/auspost.c \ $$ZINT_PATH/backend/aztec.c \ + $$ZINT_PATH/backend/bmp.c \ + $$ZINT_PATH/backend/codablock.c \ $$ZINT_PATH/backend/code.c \ $$ZINT_PATH/backend/code1.c \ $$ZINT_PATH/backend/code128.c \ @@ -40,25 +42,33 @@ SOURCES += $$ZINT_PATH/backend/2of5.c \ $$ZINT_PATH/backend/code49.c \ $$ZINT_PATH/backend/common.c \ $$ZINT_PATH/backend/composite.c \ + $$ZINT_PATH/backend/dllversion.c \ $$ZINT_PATH/backend/dmatrix.c \ + $$ZINT_PATH/backend/dotcode.c \ + $$ZINT_PATH/backend/eci.c \ + $$ZINT_PATH/backend/emf.c \ + $$ZINT_PATH/backend/gif.c \ $$ZINT_PATH/backend/gridmtx.c \ $$ZINT_PATH/backend/gs1.c \ + $$ZINT_PATH/backend/hanxin.c \ $$ZINT_PATH/backend/imail.c \ $$ZINT_PATH/backend/large.c \ $$ZINT_PATH/backend/library.c \ $$ZINT_PATH/backend/maxicode.c \ $$ZINT_PATH/backend/medical.c \ + $$ZINT_PATH/backend/pcx.c \ $$ZINT_PATH/backend/pdf417.c \ $$ZINT_PATH/backend/plessey.c \ + $$ZINT_PATH/backend/png.c \ $$ZINT_PATH/backend/postal.c \ $$ZINT_PATH/backend/ps.c \ $$ZINT_PATH/backend/qr.c \ + $$ZINT_PATH/backend/raster.c \ $$ZINT_PATH/backend/reedsol.c \ $$ZINT_PATH/backend/render.c \ $$ZINT_PATH/backend/rss.c \ $$ZINT_PATH/backend/svg.c \ $$ZINT_PATH/backend/telepen.c \ + $$ZINT_PATH/backend/tif.c \ $$ZINT_PATH/backend/upcean.c \ - $$ZINT_PATH/backend/dllversion.c \ - $$ZINT_PATH/backend/png.c \ - $$ZINT_PATH/backend_qt4/qzint.cpp + $$ZINT_PATH/backend_qt/qzint.cpp From 356e48bee3d75639551ee3dac3cb285b93d84df6 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Sat, 4 May 2019 11:54:52 +0300 Subject: [PATCH 309/347] fontLetterSpacing property has been added to TextItem --- limereport/items/lrtextitem.cpp | 20 +++++++++++++++++++- limereport/items/lrtextitem.h | 12 ++++++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 6fca5b5..0376655 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -59,7 +59,7 @@ namespace LimeReport{ TextItem::TextItem(QObject *owner, QGraphicsItem *parent) : ContentItemDesignIntf(xmlTag,owner,parent), m_angle(Angle0), m_trimValue(true), m_allowHTML(false), m_allowHTMLInFields(false), m_replaceCarriageReturns(false), m_followTo(""), m_follower(0), m_textIndent(0), - m_textLayoutDirection(Qt::LayoutDirectionAuto), m_hideIfEmpty(false) + m_textLayoutDirection(Qt::LayoutDirectionAuto), m_hideIfEmpty(false), m_fontLetterSpacing(0) { PageItemDesignIntf* pageItem = dynamic_cast(parent); BaseDesignIntf* parentItem = dynamic_cast(parent); @@ -547,6 +547,23 @@ TextItem::TextPtr TextItem::textDocument() const } +int TextItem::fontLetterSpacing() const +{ + return m_fontLetterSpacing; +} + +void TextItem::setFontLetterSpacing(int value) +{ + if (m_fontLetterSpacing != value){ + int oldValue = m_fontLetterSpacing; + m_fontLetterSpacing = value; + QFont curFont = font(); + curFont.setLetterSpacing(QFont::AbsoluteSpacing, m_fontLetterSpacing); + setFont(curFont); + notify("fontLetterSpacing", oldValue, value); + } +} + bool TextItem::hideIfEmpty() const { return m_hideIfEmpty; @@ -969,6 +986,7 @@ void TextItem::setTextItemFont(QFont value) { if (font()!=value){ QFont oldValue = font(); + value.setLetterSpacing(QFont::AbsoluteSpacing, m_fontLetterSpacing); setFont(value); if (!isLoading()) update(); notify("font",oldValue,value); diff --git a/limereport/items/lrtextitem.h b/limereport/items/lrtextitem.h index e57864e..abc1211 100644 --- a/limereport/items/lrtextitem.h +++ b/limereport/items/lrtextitem.h @@ -75,11 +75,12 @@ class TextItem : public LimeReport::ContentItemDesignIntf, IPageInit { Q_PROPERTY(bool watermark READ isWatermark WRITE setWatermark) Q_PROPERTY(bool replaceCRwithBR READ isReplaceCarriageReturns WRITE setReplaceCarriageReturns) Q_PROPERTY(bool hideIfEmpty READ hideIfEmpty WRITE setHideIfEmpty) + Q_PROPERTY(int fontLetterSpacing READ fontLetterSpacing WRITE setFontLetterSpacing) public: - enum AutoWidth{NoneAutoWidth,MaxWordLength,MaxStringLength}; - enum AngleType{Angle0,Angle90,Angle180,Angle270,Angle45,Angle315}; - enum ValueType{Default,DateTime,Double}; + enum AutoWidth{NoneAutoWidth, MaxWordLength, MaxStringLength}; + enum AngleType{Angle0, Angle90, Angle180, Angle270, Angle45, Angle315}; + enum ValueType{Default, DateTime, Double}; void Init(); TextItem(QObject* owner=0, QGraphicsItem* parent=0); @@ -176,6 +177,9 @@ public: bool hideIfEmpty() const; void setHideIfEmpty(bool hideIfEmpty); + int fontLetterSpacing() const; + void setFontLetterSpacing(int fontLetterSpacing); + protected: void updateLayout(); bool isNeedExpandContent() const; @@ -220,7 +224,7 @@ private: qreal m_textIndent; Qt::LayoutDirection m_textLayoutDirection; bool m_hideIfEmpty; - + int m_fontLetterSpacing; }; } From 22c020569d0a01f3c435fc893e7d0297300d3419 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Sun, 5 May 2019 11:07:27 +0300 Subject: [PATCH 310/347] fontLetterSpacing ready for translation --- limereport/objectinspector/lrobjectitemmodel.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index b4d429c..6a632c9 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -157,6 +157,7 @@ void QObjectPropertyModel::translatePropertyName() tr("useExternalPainter"); tr("layoutSpacing"); tr("printerName"); + tr("fontLetterSpacing"); } void QObjectPropertyModel::clearObjectsList() From afd4d5805847d875aaa843ff886ef73ef0b2dd59 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 23 May 2019 11:57:27 +0300 Subject: [PATCH 311/347] Russian translation has been updated --- translations/limereport_ru.ts | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index e9a5c3b..37c87ec 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1221,11 +1221,11 @@ p, li { white-space: pre-wrap; } LimeReport::ObjectInspectorWidget Clear - + Очистить Filter - + Фильтр @@ -1411,27 +1411,27 @@ p, li { white-space: pre-wrap; } toolBar_2 - + Редактирование InsertTextItem - + Вставить текстовый элемент Add new TextItem - + Текстовый элемент Selection Mode - + Режим выбора Delete Item - + Удалить элемент Del - + Удалить @@ -1927,6 +1927,14 @@ p, li { white-space: pre-wrap; } printerName Имя принтера + + fontLetterSpacing + Межсимвольный интервал + + + hideText + Скрывать текст + LimeReport::RectMMPropItem @@ -2594,7 +2602,7 @@ This preview is no longer valid. RowIndex - + Индекс строки From 5da4d132e6a84c2a46df2dc349f21e710693dd93 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 23 May 2019 19:01:07 +0300 Subject: [PATCH 312/347] Dark theme has been changed --- .../dark_style_sheet/qdarkstyle/style.qss | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index c1b2d26..acc358b 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -1211,16 +1211,28 @@ QToolBox { QToolBox::tab { color: #eff0f1; + font-weight: bold; background-color: #383838; - border: 1px solid #2b2b2b; - border-bottom: 1px transparent #383838; - border-top-left-radius: 5px; - border-top-right-radius: 5px; +\\ background-color: #2b2b2b; + border: 1px solid #d0d0d0; + border-top: 1px transparent #383838; + border-left: 1px transparent #383838; + border-right: 1px transparent #383838; +\\ border-bottom: 1px transparent #383838; +\\ border-top-left-radius: 5px; +\\ border-top-right-radius: 5px; +} + +QToolBox::tab:hover{ + background-color: #2b2b2b; + border-color: #7faa18; } QToolBox::tab:selected { /* italicize selected tabs */ - font: italic; - background-color: #383838; +\\ font: italic; + font-weight: bold; +\\ background-color: #383838; + background-color: #2b2b2b; border-color: #7faa18; } From 70eb749c67b3ca58b4694a8d9afb991c8a5a0a0c Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 26 May 2019 15:15:06 +0300 Subject: [PATCH 313/347] Light theme has been added --- .../qdarkstyle/rc/close-hover.png | Bin 598 -> 763 bytes .../dark_style_sheet/qdarkstyle/rc/close.png | Bin 586 -> 771 bytes .../qdarkstyle/rc/undock-hover.png | Bin 0 -> 741 bytes .../dark_style_sheet/qdarkstyle/rc/undock.png | Bin 578 -> 760 bytes .../dark_style_sheet/qdarkstyle/style.qrc | 3 +- .../dark_style_sheet/qdarkstyle/style.qss | 215 ++- 3rdparty/light_style_sheet/COPYING | 21 + .../qlightstyle/lightstyle.qrc | 48 + .../qlightstyle/lightstyle.qss | 1425 +++++++++++++++++ .../qlightstyle/rc/Hmovetoolbar.png | Bin 0 -> 180 bytes .../qlightstyle/rc/Hsepartoolbar.png | Bin 0 -> 147 bytes .../qlightstyle/rc/Vmovetoolbar.png | Bin 0 -> 179 bytes .../qlightstyle/rc/Vsepartoolbar.png | Bin 0 -> 150 bytes .../qlightstyle/rc/branch_closed-on.png | Bin 0 -> 147 bytes .../qlightstyle/rc/branch_closed.png | Bin 0 -> 160 bytes .../qlightstyle/rc/branch_open-on.png | Bin 0 -> 150 bytes .../qlightstyle/rc/branch_open.png | Bin 0 -> 166 bytes .../qlightstyle/rc/checkbox_checked.png | Bin 0 -> 492 bytes .../rc/checkbox_checked_disabled.png | Bin 0 -> 491 bytes .../qlightstyle/rc/checkbox_checked_focus.png | Bin 0 -> 252 bytes .../qlightstyle/rc/checkbox_indeterminate.png | Bin 0 -> 493 bytes .../rc/checkbox_indeterminate_disabled.png | Bin 0 -> 492 bytes .../rc/checkbox_indeterminate_focus.png | Bin 0 -> 249 bytes .../qlightstyle/rc/checkbox_unchecked.png | Bin 0 -> 464 bytes .../rc/checkbox_unchecked_disabled.png | Bin 0 -> 464 bytes .../rc/checkbox_unchecked_focus.png | Bin 0 -> 240 bytes .../qlightstyle/rc/cloce.png | Bin 0 -> 1166 bytes .../qlightstyle/rc/close-hover.png | Bin 0 -> 763 bytes .../qlightstyle/rc/close-pressed.png | Bin 0 -> 598 bytes .../qlightstyle/rc/close.png | Bin 0 -> 771 bytes .../qlightstyle/rc/down_arrow.png | Bin 0 -> 165 bytes .../qlightstyle/rc/down_arrow_disabled.png | Bin 0 -> 166 bytes .../qlightstyle/rc/extend.png | Bin 0 -> 195 bytes .../qlightstyle/rc/left_arrow.png | Bin 0 -> 166 bytes .../qlightstyle/rc/left_arrow_disabled.png | Bin 0 -> 166 bytes .../qlightstyle/rc/radio_checked.png | Bin 0 -> 940 bytes .../qlightstyle/rc/radio_checked_disabled.png | Bin 0 -> 972 bytes .../qlightstyle/rc/radio_checked_focus.png | Bin 0 -> 903 bytes .../qlightstyle/rc/radio_unchecked.png | Bin 0 -> 728 bytes .../rc/radio_unchecked_disabled.png | Bin 0 -> 760 bytes .../qlightstyle/rc/radio_unchecked_focus.png | Bin 0 -> 703 bytes .../qlightstyle/rc/right_arrow.png | Bin 0 -> 160 bytes .../qlightstyle/rc/right_arrow_disabled.png | Bin 0 -> 160 bytes .../qlightstyle/rc/sizegrip.png | Bin 0 -> 129 bytes .../qlightstyle/rc/stylesheet-branch-end.png | Bin 0 -> 224 bytes .../qlightstyle/rc/stylesheet-branch-more.png | Bin 0 -> 182 bytes .../qlightstyle/rc/stylesheet-vline.png | Bin 0 -> 239 bytes .../qlightstyle/rc/transparent.png | Bin 0 -> 195 bytes .../qlightstyle/rc/undock-hover.png | Bin 0 -> 741 bytes .../qlightstyle/rc/undock.png | Bin 0 -> 760 bytes .../qlightstyle/rc/up_arrow.png | Bin 0 -> 158 bytes .../qlightstyle/rc/up_arrow_disabled.png | Bin 0 -> 159 bytes .../svg/checkbox_checked.svg | 96 ++ .../svg/checkbox_checked_disabled.svg | 96 ++ .../svg/checkbox_checked_focus.svg | 96 ++ .../svg/checkbox_indeterminate.svg | 96 ++ .../svg/checkbox_indeterminate_disabled.svg | 96 ++ .../svg/checkbox_indeterminate_focus.svg | 96 ++ .../svg/checkbox_unchecked.svg | 71 + .../svg/checkbox_unchecked_disabled.svg | 71 + .../svg/checkbox_unchecked_focus.svg | 71 + .../light_style_sheet/svg/radio_checked.svg | 73 + .../svg/radio_checked_disabled.svg | 73 + .../svg/radio_checked_focus.svg | 73 + .../light_style_sheet/svg/radio_unchecked.svg | 67 + .../svg/radio_unchecked_disabled.svg | 67 + .../svg/radio_unchecked_focus.svg | 67 + include/lrglobal.h | 2 +- limereport/databrowser/lrdatabrowser.cpp | 2 + limereport/lrglobal.h | 2 +- limereport/lrreportdesignwidget.cpp | 60 +- limereport/lrreportdesignwidget.h | 5 +- limereport/lrreportdesignwindow.cpp | 2 +- limereport/lrsettingdialog.cpp | 42 +- limereport/lrsettingdialog.h | 8 +- limereport/lrsettingdialog.ui | 86 +- .../lrobjectinspectorwidget.cpp | 2 +- limereport/objectsbrowser/lrobjectbrowser.cpp | 2 +- limereport/scriptbrowser/lrscriptbrowser.cpp | 1 + translations/limereport_ru.ts | 32 +- 80 files changed, 3038 insertions(+), 129 deletions(-) create mode 100644 3rdparty/dark_style_sheet/qdarkstyle/rc/undock-hover.png create mode 100644 3rdparty/light_style_sheet/COPYING create mode 100644 3rdparty/light_style_sheet/qlightstyle/lightstyle.qrc create mode 100644 3rdparty/light_style_sheet/qlightstyle/lightstyle.qss create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/Hmovetoolbar.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/Hsepartoolbar.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/Vmovetoolbar.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/Vsepartoolbar.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/branch_closed-on.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/branch_closed.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/branch_open-on.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/branch_open.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/checkbox_checked.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/checkbox_checked_disabled.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/checkbox_checked_focus.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/checkbox_indeterminate.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/checkbox_indeterminate_disabled.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/checkbox_indeterminate_focus.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/checkbox_unchecked.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/checkbox_unchecked_disabled.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/checkbox_unchecked_focus.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/cloce.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/close-hover.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/close-pressed.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/close.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/down_arrow.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/down_arrow_disabled.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/extend.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/left_arrow.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/left_arrow_disabled.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/radio_checked.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/radio_checked_disabled.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/radio_checked_focus.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked_disabled.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked_focus.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/right_arrow.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/right_arrow_disabled.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/sizegrip.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-branch-end.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-branch-more.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-vline.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/transparent.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/undock-hover.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/undock.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/up_arrow.png create mode 100644 3rdparty/light_style_sheet/qlightstyle/rc/up_arrow_disabled.png create mode 100644 3rdparty/light_style_sheet/svg/checkbox_checked.svg create mode 100644 3rdparty/light_style_sheet/svg/checkbox_checked_disabled.svg create mode 100644 3rdparty/light_style_sheet/svg/checkbox_checked_focus.svg create mode 100644 3rdparty/light_style_sheet/svg/checkbox_indeterminate.svg create mode 100644 3rdparty/light_style_sheet/svg/checkbox_indeterminate_disabled.svg create mode 100644 3rdparty/light_style_sheet/svg/checkbox_indeterminate_focus.svg create mode 100644 3rdparty/light_style_sheet/svg/checkbox_unchecked.svg create mode 100644 3rdparty/light_style_sheet/svg/checkbox_unchecked_disabled.svg create mode 100644 3rdparty/light_style_sheet/svg/checkbox_unchecked_focus.svg create mode 100644 3rdparty/light_style_sheet/svg/radio_checked.svg create mode 100644 3rdparty/light_style_sheet/svg/radio_checked_disabled.svg create mode 100644 3rdparty/light_style_sheet/svg/radio_checked_focus.svg create mode 100644 3rdparty/light_style_sheet/svg/radio_unchecked.svg create mode 100644 3rdparty/light_style_sheet/svg/radio_unchecked_disabled.svg create mode 100644 3rdparty/light_style_sheet/svg/radio_unchecked_focus.svg diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/close-hover.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/close-hover.png index 657943a668b734138256aa7bb178661030fd4a1f..fbd746354babf5a9558fe51d507cd8594d6c286f 100644 GIT binary patch delta 729 zcmV;~0w(>|1p5VliBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVE_ODglR)V zP)S2WAaHVTW@&6?001bFeUUv#!$2IxU(*&vD-L#0amY}eEQpFYN)?M>p|llRbuhW~ z3z{?}DK3tJYr(;f#j1mgv#t)Vf*|+-;^OM0=prTlFDbNti1FaKAMfrx?%n}Hqry}( zFafBVWu)RUF`HWzyIv8*5PA_pKw_qzNH1pKIlk`UFFH z6jh^qA?vb#!g-6cTB)(tJ^2emd2J=lb($lHV+jc)AwotCWmI4xN~=bSi4^U}Jp99s zKS?f`TxBqFET9S%lH&*egWuhng{et5DHH>OFSh+L3UuuP&AM%WAKP~G1n@rtS6bU& zZ2+^Mq}SV8G?f`>Nx@1U>j1?(+-Q(TeoxS~grq$mM7JzbspmpGjks&aD;{_QM6c%`(JwX5f02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{007fTL_t(I%cYaM4Z<)GhCdz> zJ1_`cL>5RL#0+#)E~u}f%MOq_3nWq`HemqefcemZb7*U@NJ z88^(OnMmV1$fLtH(nka409#K}S`8sq*-v8)X2m*qXL@F~J$|V}Ksh3q1}Qs$b661- zXqt3}@~#Xu5N8r57)kuc#xEXi`#C4c3)lgN0W04eR4dQ@nHI+vKSDmldGhct00000 LNkvXXu0mjfdABd6 delta 564 zcmV-40?YmT1=a*1iBL{Q4GJ0x0000DNk~Le0000$0000$2nGNE0IF$m-jlHbFn`|! z84wi!+`j+o0000TX;fHrLvL+uWo~o;00000Lvm$dbY)~9cWHEJAV*0}P-HG;2LJ#8 zx=BPqRCwC$n_H3sAq+)L);BIl7oZE${pp`&IodpudlP8#J(cDh9zzfghZQSU>^X$_ zvD@kNsQJ6&^(s>cs0EG`B3YqXGJj+gaFhrc5#CdRj0o;2LPm$TN|4dPts-P5_#O!| z8+@w-U0dM^d%tBAh!y_ta(U&rpU)Ig@82wawA_jKn)xdK16_JA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaS zCSoLLra2!WK{LTeNN_t8MSsj;?|jfhQN#kq7zvsco+aUDg4$`os^_iW`Sl}d$eCb< zd_@74n^&mD_U7GU(d<2s&TqaTkv&Qyd0mmIO}1`{O&aT>WNY$WUzN=)f_7OtqlA#_ z@>wKUA5E+$Gu{o`?V~BAjG>;*c?e-XoLsT@cmhYTTL(HsJ^=s#00{s|MNUMnLSTYk CO6^ww diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/close.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/close.png index bc0f5761096ef24b8b4461d9252b42dad48d0d45..2a5f8ed30f681040e6b304ed23ecf09aad998d0b 100644 GIT binary patch delta 737 zcmV<70v`R!1cL^DiBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVE_ODglR)V zP)S2WAaHVTW@&6?001bFeUUv#!$2IxU(*&vD-L#0amY}eEQpFYN)?M>p|llRbuhW~ z3z{?}DK3tJYr(;f#j1mgv#t)Vf*|+-;^OM0=prTlFDbNti1FaKAMfrx?%n}Hqry}( zFafBVWu)RUF`HWzyIv8*5PA_pKw_qzNH1pKIlk`UFFH z6jh^qA?vb#!g-6cTB)(tJ^2emd2J=lb($lHV+jc)AwotCWmI4xN~=bSi4^U}Jp99s zKS?f`TxBqFET9S%lH&*egWuhng{et5DHH>OFSh+L3UuuP&AM%WAKP~G1n@rtS6bU& zZ2+^Mq}SV8G?f`>Nx@1U>j1?(+-Q(TeoxS~grq$mM7JzbspmpGjks&aD;{_QM6CxH>Uo!vz02y>e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{007%bL_t(I%cYYs5`r)kM4#x4 zchE~fV=K3Sj=|asP*_vh(KG4b7EsZ`CA_=m9WAZaCtHXN~hBFAP1@yvMbg5oy2|^#=!R^JK(4iHy7oH8RgBNX>+{+90fs+ T)D5SB00000NkvXXu0mjf;&DKU delta 551 zcmV+?0@(e72Fe5>iBL{Q4GJ0x0000DNk~Le0000$0000$2nGNE0IF$m-jlHbFn`|! z84wg2IL9~80000TX;fHrLvL+uWo~o;00000Lvm$dbY)~9cWHEJAV*0}P-HG;2LJ#8 zu1Q2eRCwC$n@N(xAPhw#UEKD`)4Q%z1}5o$35?cVGVdX1An zJ6S?ND{!O`$qLPqA+vy^M97Tro_`W#MsQCNGCRCgg3JzX6(K9Zk4TW!;Cm(LUJ5VR z`#n`4R`}yM{&QT{MG^J-&DwWs64bk4?~OylTSF10kCHHwx5l8Taqlg`lCQ*K9s;HD z=Ov+($2#wbSMQ@5>6!Q2gy=R2A}Rsd^N{}no)Q@FUx$FlqQ}~JB>ej@fPXB7EtSCP zdH7ynL;@Qgz8UI~5CQ)&2cR}RH8?i>>pVc&4v)?WjLjA8JfIhbwX>uih_phn;OPQd z;F$0s0xau*=>@dHF(qg=c(w$MhG(27gbHYZkCXt}4UYCaV^Kue4UWP@RDxz2^AQp> z6MTdOw?k3H81~KwJrqSuV0?^9(5&z*2~sGRXEeO$cYggy8geF>AzxL1<>nQtv7>oQ zESkON(fQ36B(g`XlJ^yvj%53m*ov_)N)9By?^W5%B50STGfD`#E}un$_0hzBG6QJX pJs(XWWlZ&K&O-?E;pC3H#~=QPTH?*`97zBG002ovPDHLkV1g8(^Kt+H diff --git a/3rdparty/dark_style_sheet/qdarkstyle/rc/undock-hover.png b/3rdparty/dark_style_sheet/qdarkstyle/rc/undock-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..1dfd69895d1b7039b50a2a9ebc2992a37fd92679 GIT binary patch literal 741 zcmVEX>4Tx04R}tkv&MmKpe$i(-uW54t7v+$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JWDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@ z;xRFsTNS%r5yTLB5kf#>rk+SIX5cx#?&0I>U6f~epZjz4DS49tK9P8i>4rtTK|Hf* z>74h8!>lAJ#OK8023?T&k?XR{Z=8z`3p_JyWK#3QVPdh^!Ey()lA#h$6Gs$PqkJLj zvch?bvs$UK);;+PLwRi_&2^e1h+_!}Bq2gZ4P{hdAxf)8iis5M$2|PQjz38*nOtQs zax9<<6_Voz|AXJ%nuV!JHz^bYf-koHF$#3;0?oQ@e;?a+^91le16NwxUu^)hpQP8@ zTI2}m-v%zO+nT%wT zj1?(+-Q(TeoxS~grq$mM7JzbspmpGj00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;{_QM76w-#Pp1F?02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{006y7L_t(I%cYaC4TCTcMPC>rdr-#%(32t3xkA*)RXPt5 zdIo^ndt{BIIiibW1A#A{WZ8G$=YQXD5U12;HEX>4Tx04R}tkv&MmKpe$i(-uW54t7v+$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JWDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@ z;xRFsTNS%r5yTLB5kf#>rk+SIX5cx#?&0I>U6f~epZjz4DS49tK9P8i>4rtTK|Hf* z>74h8!>lAJ#OK8023?T&k?XR{Z=8z`3p_JyWK#3QVPdh^!Ey()lA#h$6Gs$PqkJLj zvch?bvs$UK);;+PLwRi_&2^e1h+_!}Bq2gZ4P{hdAxf)8iis5M$2|PQjz38*nOtQs zax9<<6_Voz|AXJ%nuV!JHz^bYf-koHF$#3;0?oQ@e;?a+^91le16NwxUu^)hpQP8@ zTI2}m-v%zO+nT%wT zj1?(+-Q(TeoxS~grq$mM7JzbspmpGj00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;{_QM6%!HB_>TYp02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{007WQL_t(I%cYYs5`r)gMW0xB2fYL|w&oVlF<5&63TrAm zdL|v*0xDX#gcsld+5}xQ1`+_GAOw_2)j(Bf-Apz};&>0F zz{PQ44rGPa_c5`x4&Q+D#KcG75cq!E_5A?giOm#sJrc!;$sv~I=; zLPxO-8=<727QCRcHCO~syz{@PWrNCLG8s0iR|Dg)d_q85$b59A)F1=O8Kak`_S1=7 q-w%QBx4_Og&SmARwDRiDv>H!c&_IbJTWWUz0000WFU8GbZ8()Nlj2>E@cM*00E{+L_t(|+U=X$4#OY} zLz`&--S*43w`rPoNlWaQLS8pfd~hg*uq-oX%osV0`LJ!+SPR{}9r(JUC& zi*OVO>rs3r1nW_FCJ5_Yd@BU&U3e=9yOQ`b5bSE=k3zUrc5+?UXD9c4F9B>-qyH)% z1tH=BQxRVU!7FWl=67leWRLz4ahXo| zoe{&T7oZ-FMxDSsBBvjZ{}acq6e%f?_~rzJ_LzyflS`(bcuN3?R&llQTw-2U8((=NC3B QV*mgE07*qoM6N<$f{lRZzyJUM diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qrc b/3rdparty/dark_style_sheet/qdarkstyle/style.qrc index 6294039..6520860 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qrc +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qrc @@ -1,5 +1,5 @@ - + rc/up_arrow_disabled.png rc/Hmovetoolbar.png rc/stylesheet-branch-end.png @@ -40,6 +40,7 @@ rc/radio_unchecked_focus.png rc/radio_unchecked.png rc/extend.png + rc/undock-hover.png style.qss diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index acc358b..1c2fa3a 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -80,7 +80,7 @@ QCheckBox::indicator{ QCheckBox::indicator:unchecked { - image: url(:/qss_icons/rc/checkbox_unchecked.png); + image: url(:/qss_qdark_icons/rc/checkbox_unchecked.png); } QCheckBox::indicator:unchecked:hover, @@ -91,12 +91,12 @@ QGroupBox::indicator:unchecked:focus, QGroupBox::indicator:unchecked:pressed { border: none; - image: url(:/qss_icons/rc/checkbox_unchecked_focus.png); + image: url(:/qss_qdark_icons/rc/checkbox_unchecked_focus.png); } QCheckBox::indicator:checked { - image: url(:/qss_icons/rc/checkbox_checked.png); + image: url(:/qss_qdark_icons/rc/checkbox_checked.png); } QCheckBox::indicator:checked:hover, @@ -107,32 +107,32 @@ QGroupBox::indicator:checked:focus, QGroupBox::indicator:checked:pressed { border: none; - image: url(:/qss_icons/rc/checkbox_checked_focus.png); + image: url(:/qss_qdark_icons/rc/checkbox_checked_focus.png); } QCheckBox::indicator:indeterminate { - image: url(:/qss_icons/rc/checkbox_indeterminate.png); + image: url(:/qss_qdark_icons/rc/checkbox_indeterminate.png); } QCheckBox::indicator:indeterminate:focus, QCheckBox::indicator:indeterminate:hover, QCheckBox::indicator:indeterminate:pressed { - image: url(:/qss_icons/rc/checkbox_indeterminate_focus.png); + image: url(:/qss_qdark_icons/rc/checkbox_indeterminate_focus.png); } QCheckBox::indicator:checked:disabled, QGroupBox::indicator:checked:disabled { - image: url(:/qss_icons/rc/checkbox_checked_disabled.png); + image: url(:/qss_qdark_icons/rc/checkbox_checked_disabled.png); } QCheckBox::indicator:unchecked:disabled, QGroupBox::indicator:unchecked:disabled { - image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); + image: url(:/qss_qdark_icons/rc/checkbox_unchecked_disabled.png); } QGroupBox::indicator @@ -166,7 +166,7 @@ QRadioButton::indicator QRadioButton::indicator:unchecked { - image: url(:/qss_icons/rc/radio_unchecked.png); + image: url(:/qss_qdark_icons/rc/radio_unchecked.png); } QRadioButton::indicator:unchecked:hover, @@ -175,14 +175,14 @@ QRadioButton::indicator:unchecked:pressed { border: none; outline: none; - image: url(:/qss_icons/rc/radio_unchecked_focus.png); + image: url(:/qss_qdark_icons/rc/radio_unchecked_focus.png); } QRadioButton::indicator:checked { border: none; outline: none; - image: url(:/qss_icons/rc/radio_checked.png); + image: url(:/qss_qdark_icons/rc/radio_checked.png); } QRadioButton::indicator:checked:hover, @@ -191,18 +191,18 @@ QRadioButton::indicator:checked:pressed { border: none; outline: none; - image: url(:/qss_icons/rc/radio_checked_focus.png); + image: url(:/qss_qdark_icons/rc/radio_checked_focus.png); } QRadioButton::indicator:checked:disabled { outline: none; - image: url(:/qss_icons/rc/radio_checked_disabled.png); + image: url(:/qss_qdark_icons/rc/radio_checked_disabled.png); } QRadioButton::indicator:unchecked:disabled { - image: url(:/qss_icons/rc/radio_unchecked_disabled.png); + image: url(:/qss_qdark_icons/rc/radio_unchecked_disabled.png); } QMenuBar @@ -273,41 +273,41 @@ QMenu::indicator { /* non-exclusive indicator = check box style indicator (see QActionGroup::setExclusive) */ QMenu::indicator:non-exclusive:unchecked { - image: url(:/qss_icons/rc/checkbox_unchecked.png); + image: url(:/qss_qdark_icons/rc/checkbox_unchecked.png); } QMenu::indicator:non-exclusive:unchecked:selected { - image: url(:/qss_icons/rc/checkbox_unchecked_disabled.png); + image: url(:/qss_qdark_icons/rc/checkbox_unchecked_disabled.png); } QMenu::indicator:non-exclusive:checked { - image: url(:/qss_icons/rc/checkbox_checked.png); + image: url(:/qss_qdark_icons/rc/checkbox_checked.png); } QMenu::indicator:non-exclusive:checked:selected { - image: url(:/qss_icons/rc/checkbox_checked_disabled.png); + image: url(:/qss_qdark_icons/rc/checkbox_checked_disabled.png); } /* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ QMenu::indicator:exclusive:unchecked { - image: url(:/qss_icons/rc/radio_unchecked.png); + image: url(:/qss_qdark_icons/rc/radio_unchecked.png); } QMenu::indicator:exclusive:unchecked:selected { - image: url(:/qss_icons/rc/radio_unchecked_disabled.png); + image: url(:/qss_qdark_icons/rc/radio_unchecked_disabled.png); } QMenu::indicator:exclusive:checked { - image: url(:/qss_icons/rc/radio_checked.png); + image: url(:/qss_qdark_icons/rc/radio_checked.png); } QMenu::indicator:exclusive:checked:selected { - image: url(:/qss_icons/rc/radio_checked_disabled.png); + image: url(:/qss_qdark_icons/rc/radio_checked_disabled.png); } QMenu::right-arrow { margin: 5px; - image: url(:/qss_icons/rc/right_arrow.png) + image: url(:/qss_qdark_icons/rc/right_arrow.png) } @@ -397,7 +397,7 @@ QScrollBar::handle:horizontal QScrollBar::add-line:horizontal { margin: 0px 3px 0px 3px; - border-image: url(:/qss_icons/rc/right_arrow_disabled.png); + border-image: url(:/qss_qdark_icons/rc/right_arrow_disabled.png); width: 10px; height: 10px; subcontrol-position: right; @@ -407,7 +407,7 @@ QScrollBar::add-line:horizontal QScrollBar::sub-line:horizontal { margin: 0px 3px 0px 3px; - border-image: url(:/qss_icons/rc/left_arrow_disabled.png); + border-image: url(:/qss_qdark_icons/rc/left_arrow_disabled.png); height: 10px; width: 10px; subcontrol-position: left; @@ -416,7 +416,7 @@ QScrollBar::sub-line:horizontal QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on { - border-image: url(:/qss_icons/rc/right_arrow.png); + border-image: url(:/qss_qdark_icons/rc/right_arrow.png); height: 10px; width: 10px; subcontrol-position: right; @@ -426,7 +426,7 @@ QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on { - border-image: url(:/qss_icons/rc/left_arrow.png); + border-image: url(:/qss_qdark_icons/rc/left_arrow.png); height: 10px; width: 10px; subcontrol-position: left; @@ -463,7 +463,7 @@ QScrollBar::handle:vertical QScrollBar::sub-line:vertical { margin: 3px 0px 3px 0px; - border-image: url(:/qss_icons/rc/up_arrow_disabled.png); + border-image: url(:/qss_qdark_icons/rc/up_arrow_disabled.png); height: 10px; width: 10px; subcontrol-position: top; @@ -473,7 +473,7 @@ QScrollBar::sub-line:vertical QScrollBar::add-line:vertical { margin: 3px 0px 3px 0px; - border-image: url(:/qss_icons/rc/down_arrow_disabled.png); + border-image: url(:/qss_qdark_icons/rc/down_arrow_disabled.png); height: 10px; width: 10px; subcontrol-position: bottom; @@ -483,7 +483,7 @@ QScrollBar::add-line:vertical QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on { - border-image: url(:/qss_icons/rc/up_arrow.png); + border-image: url(:/qss_qdark_icons/rc/up_arrow.png); height: 10px; width: 10px; subcontrol-position: top; @@ -493,7 +493,7 @@ QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on { - border-image: url(:/qss_icons/rc/down_arrow.png); + border-image: url(:/qss_qdark_icons/rc/down_arrow.png); height: 10px; width: 10px; subcontrol-position: bottom; @@ -534,7 +534,7 @@ QHeaderView::section } QSizeGrip { - image: url(:/qss_icons/rc/sizegrip.png); + image: url(:/qss_qdark_icons/rc/sizegrip.png); width: 12px; height: 12px; } @@ -598,17 +598,33 @@ QToolBar { border-bottom: 1px solid #2b2b2b; } +QToolBar:top{ + border-bottom: 1px solid #2b2b2b; +} + +QToolBar:left{ + border-right: 1px solid #2b2b2b; +} + +QToolBar:right{ + border-left: 1px solid #2b2b2b; +} + +QToolBar:bottom{ + border-top: 1px solid #2b2b2b; +} + QToolBar::handle:horizontal { - image: url(:/qss_icons/rc/Hmovetoolbar.png); + image: url(:/qss_qdark_icons/rc/Hmovetoolbar.png); } QToolBar::handle:vertical { - image: url(:/qss_icons/rc/Vmovetoolbar.png); + image: url(:/qss_qdark_icons/rc/Vmovetoolbar.png); } QToolBar::separator:horizontal { - image: url(:/qss_icons/rc/Hsepartoolbar.png); + image: url(:/qss_qdark_icons/rc/Hsepartoolbar.png); } QToolBar::separator:vertical { - image: url(:/qss_icons/rc/Vsepartoolbar.png); + image: url(:/qss_qdark_icons/rc/Vsepartoolbar.png); } QToolButton#qt_toolbar_ext_button { @@ -616,7 +632,7 @@ QToolButton#qt_toolbar_ext_button { min-width: 8px; width: 8px; padding: 1px; - qproperty-icon: url(:/qss_icons/rc/extend.png); + qproperty-icon: url(:/qss_qdark_icons/rc/extend.png); } QPushButton @@ -714,13 +730,13 @@ QComboBox::drop-down QComboBox::down-arrow { - image: url(:/qss_icons/rc/down_arrow_disabled.png); + image: url(:/qss_qdark_icons/rc/down_arrow_disabled.png); } QComboBox::down-arrow:on, QComboBox::down-arrow:hover, QComboBox::down-arrow:focus { - image: url(:/qss_icons/rc/down_arrow.png); + image: url(:/qss_qdark_icons/rc/down_arrow.png); } QAbstractSpinBox { @@ -750,25 +766,25 @@ QAbstractSpinBox:down-button } QAbstractSpinBox::up-arrow,QAbstractSpinBox::up-arrow:disabled,QAbstractSpinBox::up-arrow:off { - image: url(:/qss_icons/rc/up_arrow_disabled.png); + image: url(:/qss_qdark_icons/rc/up_arrow_disabled.png); width: 10px; height: 10px; } QAbstractSpinBox::up-arrow:hover { - image: url(:/qss_icons/rc/up_arrow.png); + image: url(:/qss_qdark_icons/rc/up_arrow.png); } QAbstractSpinBox::down-arrow,QAbstractSpinBox::down-arrow:disabled,QAbstractSpinBox::down-arrow:off { - image: url(:/qss_icons/rc/down_arrow_disabled.png); + image: url(:/qss_qdark_icons/rc/down_arrow_disabled.png); width: 10px; height: 10px; } QAbstractSpinBox::down-arrow:hover { - image: url(:/qss_icons/rc/down_arrow.png); + image: url(:/qss_qdark_icons/rc/down_arrow.png); } @@ -807,18 +823,18 @@ QTabBar:focus } QTabBar::close-button { - image: url(:/qss_icons/rc/close.png); + image: url(:/qss_qdark_icons/rc/close.png); background: transparent; } QTabBar::close-button:hover { - image: url(:/qss_icons/rc/close-hover.png); + image: url(:/qss_qdark_icons/rc/close-hover.png); background: transparent; } QTabBar::close-button:pressed { - image: url(:/qss_icons/rc/close-pressed.png); + image: url(:/qss_qdark_icons/rc/close-pressed.png); background: transparent; } @@ -844,6 +860,16 @@ QTabBar::tab:top:!selected:hover { background-color: #2e2e2e; } +QTabBar::tab:top:!selected:hover { + background-color: #505050; +} + +QTabBar::tab::top:selected +{ + border-top: 2px solid #8fa876; + background-color: #2b2b2b; +} + /* BOTTOM TABS */ QTabBar::tab:bottom { color: #eff0f1; @@ -863,7 +889,13 @@ QTabBar::tab:bottom:!selected } QTabBar::tab:bottom:!selected:hover { - background-color: #2e2e2e; + background-color: #819a67; +} + +QTabBar::tab::bottom:selected +{ + border-bottom: 2px solid #8fa876; + background-color: #2b2b2b; } /* LEFT TABS */ @@ -887,6 +919,16 @@ QTabBar::tab:left:!selected:hover { background-color: #2e2e2e; } +QTabBar::tab:left:!selected:hover { + background-color: #505050; +} + +QTabBar::tab::left:selected +{ + border-left: 2px solid #8fa876; + background-color: #2b2b2b; +} + /* RIGHT TABS */ QTabBar::tab:right { color: #eff0f1; @@ -908,33 +950,44 @@ QTabBar::tab:right:!selected:hover { background-color: #2e2e2e; } +QTabBar::tab:right:!selected:hover { + background-color: #505050; +} + +QTabBar::tab::right:selected +{ + border-bottom: 2px solid #8fa876; + background-color: #2b2b2b; +} + QTabBar QToolButton::right-arrow:enabled { - image: url(:/qss_icons/rc/right_arrow.png); + image: url(:/qss_qdark_icons/rc/right_arrow.png); } QTabBar QToolButton::left-arrow:enabled { - image: url(:/qss_icons/rc/left_arrow.png); + image: url(:/qss_qdark_icons/rc/left_arrow.png); } QTabBar QToolButton::right-arrow:disabled { - image: url(:/qss_icons/rc/right_arrow_disabled.png); + image: url(:/qss_qdark_icons/rc/right_arrow_disabled.png); } QTabBar QToolButton::left-arrow:disabled { - image: url(:/qss_icons/rc/left_arrow_disabled.png); + image: url(:/qss_qdark_icons/rc/left_arrow_disabled.png); } QDockWidget { background: #383838; border: 1px solid #403F3F; - titlebar-close-icon: url(:/qss_icons/rc/close.png); - titlebar-normal-icon: url(:/qss_icons/rc/undock.png); + titlebar-close-icon: url(:/qss_qdark_icons/rc/transparent.png); + titlebar-normal-icon: url(:/qss_qdark_icons/rc/transparent.png); } QDockWidget::title{ background: #383838; padding-left: 5px; + padding-top: 4px; margin-top: 4px; } @@ -946,7 +999,7 @@ QDockWidget::close-button, QDockWidget::float-button { } QDockWidget::close-button:hover, QDockWidget::float-button:hover { - background: rgba(255, 255, 255, 10); +\\ background: rgba(255, 255, 255, 10); } QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { @@ -954,8 +1007,24 @@ QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { background: rgba(255, 255, 255, 10); } +QDockWidget::close-button { + image: url(:/qss_qdark_icons/rc/close.png); +} + +QDockWidget::close-button:hover { + image: url(:/qss_qdark_icons/rc/close-hover.png); +} + +QDockWidget::float-button { + image: url(:/qss_qdark_icons/rc/undock.png); +} + +QDockWidget::float-button:hover { + image: url(:/qss_qdark_icons/rc/undock-hover.png); +} + QLabel#limeReportLabel{ - color: #7faa18; + color: #8fa876; } QTreeView, QListView @@ -981,35 +1050,35 @@ QTreeView::branch:!selected:hover, QTreeView::item:!selected:hover{ } QTreeView::branch:has-siblings:!adjoins-item { - border-image: url(:/qss_icons/rc/transparent.png); + border-image: url(:/qss_qdark_icons/rc/transparent.png); } QTreeView::branch:has-siblings:adjoins-item { - border-image: url(:/qss_icons/rc/transparent.png); + border-image: url(:/qss_qdark_icons/rc/transparent.png); } QTreeView::branch:!has-children:!has-siblings:adjoins-item { - border-image: url(:/qss_icons/rc/transparent.png); + border-image: url(:/qss_qdark_icons/rc/transparent.png); } QTreeView::branch:has-children:!has-siblings:closed, QTreeView::branch:closed:has-children:has-siblings { - image: url(:/qss_icons/rc/branch_closed.png); + image: url(:/qss_qdark_icons/rc/branch_closed.png); } QTreeView::branch:open:has-children:!has-siblings, QTreeView::branch:open:has-children:has-siblings { - image: url(:/qss_icons/rc/branch_open.png); + image: url(:/qss_qdark_icons/rc/branch_open.png); } QTreeView::branch:has-children:!has-siblings:closed:hover, QTreeView::branch:closed:has-children:has-siblings:hover { - image: url(:/qss_icons/rc/branch_closed-on.png); + image: url(:/qss_qdark_icons/rc/branch_closed-on.png); } QTreeView::branch:open:has-children:!has-siblings:hover, QTreeView::branch:open:has-children:has-siblings:hover { - image: url(:/qss_icons/rc/branch_open-on.png); + image: url(:/qss_qdark_icons/rc/branch_open-on.png); } QSlider::groove:horizontal { @@ -1055,13 +1124,13 @@ QToolButton { QToolButton:hover, QToolButton::menu-button:hover { background-color: #2b2b2b; - border: 1px solid #7faa18; + border: 1px solid #8fa876; } QToolButton:checked, QToolButton:pressed, QToolButton::menu-button:pressed { background-color: #2e2e2e; - border: 1px solid #7faa18; + border: 1px solid #8fa876; } QToolButton:text{ @@ -1087,7 +1156,7 @@ QToolButton:disabled{ \\ \\/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ \\QToolButton::menu-indicator { -\\ image: url(:/qss_icons/rc/down_arrow.png); +\\ image: url(:/qss_qdark_icons/rc/down_arrow.png); \\ top: -7px; left: -2px; /* shift it a bit */ \\} \\ @@ -1102,7 +1171,7 @@ QToolButton:disabled{ \\} \\ \\QToolButton::menu-arrow { -\\ image: url(:/qss_icons/rc/down_arrow.png); +\\ image: url(:/qss_qdark_icons/rc/down_arrow.png); \\} \\ \\QToolButton::menu-arrow:open { @@ -1190,11 +1259,11 @@ QHeaderView::section:checked /* style the sort indicator */ QHeaderView::down-arrow { - image: url(:/qss_icons/rc/down_arrow.png); + image: url(:/qss_qdark_icons/rc/down_arrow.png); } QHeaderView::up-arrow { - image: url(:/qss_icons/rc/up_arrow.png); + image: url(:/qss_qdark_icons/rc/up_arrow.png); } @@ -1214,7 +1283,7 @@ QToolBox::tab { font-weight: bold; background-color: #383838; \\ background-color: #2b2b2b; - border: 1px solid #d0d0d0; + border: 2px solid #d0d0d0; border-top: 1px transparent #383838; border-left: 1px transparent #383838; border-right: 1px transparent #383838; @@ -1225,7 +1294,7 @@ QToolBox::tab { QToolBox::tab:hover{ background-color: #2b2b2b; - border-color: #7faa18; + border-color: #8fa876; } QToolBox::tab:selected { /* italicize selected tabs */ @@ -1233,7 +1302,7 @@ QToolBox::tab:selected { /* italicize selected tabs */ font-weight: bold; \\ background-color: #383838; background-color: #2b2b2b; - border-color: #7faa18; + border-color: #8fa876; } QStatusBar::item { @@ -1312,11 +1381,11 @@ QDateEdit::drop-down QDateEdit::down-arrow { - image: url(:/qss_icons/rc/down_arrow_disabled.png); + image: url(:/qss_qdark_icons/rc/down_arrow_disabled.png); } QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, QDateEdit::down-arrow:focus { - image: url(:/qss_icons/rc/down_arrow.png); + image: url(:/qss_qdark_icons/rc/down_arrow.png); } diff --git a/3rdparty/light_style_sheet/COPYING b/3rdparty/light_style_sheet/COPYING new file mode 100644 index 0000000..49f878c --- /dev/null +++ b/3rdparty/light_style_sheet/COPYING @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) <2013-2017> + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/3rdparty/light_style_sheet/qlightstyle/lightstyle.qrc b/3rdparty/light_style_sheet/qlightstyle/lightstyle.qrc new file mode 100644 index 0000000..dcc7c27 --- /dev/null +++ b/3rdparty/light_style_sheet/qlightstyle/lightstyle.qrc @@ -0,0 +1,48 @@ + + + rc/up_arrow_disabled.png + rc/Hmovetoolbar.png + rc/stylesheet-branch-end.png + rc/branch_closed-on.png + rc/stylesheet-vline.png + rc/branch_closed.png + rc/branch_open-on.png + rc/transparent.png + rc/right_arrow_disabled.png + rc/sizegrip.png + rc/close.png + rc/close-hover.png + rc/close-pressed.png + rc/down_arrow.png + rc/Vmovetoolbar.png + rc/left_arrow.png + rc/stylesheet-branch-more.png + rc/up_arrow.png + rc/right_arrow.png + rc/left_arrow_disabled.png + rc/Hsepartoolbar.png + rc/branch_open.png + rc/Vsepartoolbar.png + rc/down_arrow_disabled.png + rc/undock.png + rc/undock-hover.png + rc/checkbox_checked_disabled.png + rc/checkbox_checked_focus.png + rc/checkbox_checked.png + rc/checkbox_indeterminate.png + rc/checkbox_indeterminate_focus.png + rc/checkbox_unchecked_disabled.png + rc/checkbox_unchecked_focus.png + rc/checkbox_unchecked.png + rc/radio_checked_disabled.png + rc/radio_checked_focus.png + rc/radio_checked.png + rc/radio_unchecked_disabled.png + rc/radio_unchecked_focus.png + rc/radio_unchecked.png + rc/extend.png + + + lightstyle.qss + + diff --git a/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss b/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss new file mode 100644 index 0000000..61af1cb --- /dev/null +++ b/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss @@ -0,0 +1,1425 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) <2013-2014> + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +QToolTip +{ + border: 1px solid #b6b6b6; + background-color: #f0f0f0; + color: #000; +\\ padding: 5px; + +} + +QWidget +{ + color: #000; + background-color: #f0f0f0; + selection-background-color:#000; + selection-color: #000; + background-clip: border; + border-image: none; + border: 0px transparent black; + outline: 0; +} + +QWidget:item:hover +{ + background-color: #b5da91; + color: #000; +} + +QWidget:item:selected +{ + background-color: #b5da91; +} + +QCheckBox +{ + spacing: 5px; + outline: none; + color: #000; + margin-right: 2px; + +} + +QCheckBox::item{ + background-color: #ffffff; +} + +QCheckBox:disabled +{ + color: #494949; +} + +QCheckBox::indicator{ + width: 16px; + height: 16px; + color: #222222; +} + + +QCheckBox::indicator:unchecked +{ + image: url(:/qss_qlight_icons/rc/checkbox_unchecked.png); +} + +QCheckBox::indicator:unchecked:hover, +QCheckBox::indicator:unchecked:focus, +QCheckBox::indicator:unchecked:pressed, +QGroupBox::indicator:unchecked:hover, +QGroupBox::indicator:unchecked:focus, +QGroupBox::indicator:unchecked:pressed +{ + border: none; + image: url(:/qss_qlight_icons/rc/checkbox_unchecked_focus.png); +} + +QCheckBox::indicator:checked +{ + image: url(:/qss_qlight_icons/rc/checkbox_checked.png); +} + +QCheckBox::indicator:checked:hover, +QCheckBox::indicator:checked:focus, +QCheckBox::indicator:checked:pressed, +QGroupBox::indicator:checked:hover, +QGroupBox::indicator:checked:focus, +QGroupBox::indicator:checked:pressed +{ + border: none; + image: url(:/qss_qlight_icons/rc/checkbox_checked_focus.png); +} + + +QCheckBox::indicator:indeterminate +{ + image: url(:/qss_qlight_icons/rc/checkbox_indeterminate.png); +} + +QCheckBox::indicator:indeterminate:focus, +QCheckBox::indicator:indeterminate:hover, +QCheckBox::indicator:indeterminate:pressed +{ + image: url(:/qss_qlight_icons/rc/checkbox_indeterminate_focus.png); +} + +QCheckBox::indicator:checked:disabled, +QGroupBox::indicator:checked:disabled +{ + image: url(:/qss_qlight_icons/rc/checkbox_checked_disabled.png); +} + +QCheckBox::indicator:unchecked:disabled, +QGroupBox::indicator:unchecked:disabled +{ + image: url(:/qss_qlight_icons/rc/checkbox_unchecked_disabled.png); +} + +QGroupBox::indicator +{ + width: 18px; + height: 18px; +} +QGroupBox::indicator +{ + margin-left: 2px; +} + +QRadioButton +{ + spacing: 5px; + outline: none; + color: #000; + margin-bottom: 2px; +} + +QRadioButton:disabled +{ + color: #b6b6b6; +} + +QRadioButton::indicator +{ + width: 16px; + height: 16px; +} + +QRadioButton::indicator:unchecked +{ + image: url(:/qss_qlight_icons/rc/radio_unchecked.png); +} + +QRadioButton::indicator:unchecked:hover, +QRadioButton::indicator:unchecked:focus, +QRadioButton::indicator:unchecked:pressed +{ + border: none; + outline: none; + image: url(:/qss_qlight_icons/rc/radio_unchecked_focus.png); +} + +QRadioButton::indicator:checked +{ + border: none; + outline: none; + image: url(:/qss_qlight_icons/rc/radio_checked.png); +} + +QRadioButton::indicator:checked:hover, +QRadioButton::indicator:checked:focus, +QRadioButton::indicator:checked:pressed +{ + border: none; + outline: none; + image: url(:/qss_qlight_icons/rc/radio_checked_focus.png); +} + +QRadioButton::indicator:checked:disabled +{ + outline: none; + image: url(:/qss_qlight_icons/rc/radio_checked_disabled.png); +} + +QRadioButton::indicator:unchecked:disabled +{ + image: url(:/qss_qlight_icons/rc/radio_unchecked_disabled.png); +} + +QMenuBar +{ + background-color: #f9f9f9; + color: #000; + border-bottom: 1px solid #b6b6b6; +} + +QMenuBar::item +{ + background: transparent; +} + +QMenuBar::item:selected +{ + background: transparent; + background-color: #75bf3f; + border: 1px solid #b6b6b6; +} + +QMenuBar::item:pressed +{ + border: 1px solid #b6b6b6; +\\ background-color: #f9f9f9; + background-color: #75bf3f; + color: #000; + margin-bottom:-1px; + padding-bottom:1px; +} + +QMenu +{ + border: 1px solid #b6b6b6; + color: #000; +\\ margin: 2px; +} + +QMenu::icon +{ + margin: 5px; +} + +QMenu::item +{ + padding: 5px 30px 5px 30px; + border: 1px solid transparent; /* reserve space for selection border */ +} + +QMenu::item:selected +{ + color: #000; +} + +QMenu::separator { + height: 2px; + background: lightblue; + margin-left: 10px; + margin-right: 5px; +} + +QMenu::indicator { + width: 18px; + height: 18px; + padding-left: 4px; +} + +/* non-exclusive indicator = check box style indicator + (see QActionGroup::setExclusive) */ +QMenu::indicator:non-exclusive:unchecked { + image: url(:/qss_qlight_icons/rc/checkbox_unchecked.png); +} + +QMenu::indicator:non-exclusive:unchecked:selected { + image: url(:/qss_qlight_icons/rc/checkbox_unchecked_disabled.png); +} + +QMenu::indicator:non-exclusive:checked { + image: url(:/qss_qlight_icons/rc/checkbox_checked.png); +} + +QMenu::indicator:non-exclusive:checked:selected { + image: url(:/qss_qlight_icons/rc/checkbox_checked_disabled.png); +} + +/* exclusive indicator = radio button style indicator (see QActionGroup::setExclusive) */ +QMenu::indicator:exclusive:unchecked { + image: url(:/qss_qlight_icons/rc/radio_unchecked.png); +} + +QMenu::indicator:exclusive:unchecked:selected { + image: url(:/qss_qlight_icons/rc/radio_unchecked_disabled.png); +} + +QMenu::indicator:exclusive:checked { + image: url(:/qss_qlight_icons/rc/radio_checked.png); +} + +QMenu::indicator:exclusive:checked:selected { + image: url(:/qss_qlight_icons/rc/radio_checked_disabled.png); +} + +QMenu::right-arrow { + margin: 5px; + image: url(:/qss_qlight_icons/rc/right_arrow.png) +} + + +QWidget:disabled +{ + color: #7a7a7a; + background-color: #ffffff; +} + +QAbstractItemView +{ + alternate-background-color: #f0f0f0; + color: #000; + border: 1px solid 3A3939; +\\ border-radius: 2px; +} + +QWidget:focus, QMenuBar:focus +{ + border: 1px solid #4b6807; +} + +QTabWidget:focus, QCheckBox:focus, QRadioButton:focus, QSlider:focus +{ + border: none; +} + +QLineEdit +{ + background-color: #ffffff; + padding-right: 5px; + padding-left: 5px; + padding-top: 1px; + padding-bottom: 1px; + margin: 1px; + border-style: solid; + border: 1px solid #b6b6b6; +\\ border-radius: 2px; + color: #000; +} + +QLineEdit:disabled{ + color: #858585; +} + +QAbstractItemView QLineEdit +{ + padding: 0; +} + +QGroupBox { + margin-top: 1.5em; +} + +QGroupBox::title { + subcontrol-origin: margin; + subcontrol-position: top left; + padding-left: 0px; + padding-right: 0px; + margin-top: 2px; + margin-bottom: 2px; +} + +QAbstractScrollArea +{ +\\ border-radius: 2px; + border: 1px solid #b6b6b6; + background-color: transparent; +} + +QScrollBar:horizontal +{ + height: 15px; + margin: 3px 15px 3px 15px; + border: 1px transparent #efefef; + border-radius: 4px; + background-color: #efefef; +} + +QScrollBar::handle:horizontal +{ + background-color: #8f8f8f; + min-width: 5px; + border-radius: 4px; +} + +QScrollBar::add-line:horizontal +{ + margin: 0px 3px 0px 3px; + border-image: url(:/qss_qlight_icons/rc/right_arrow_disabled.png); + width: 10px; + height: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal +{ + margin: 0px 3px 0px 3px; + border-image: url(:/qss_qlight_icons/rc/left_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::add-line:horizontal:hover,QScrollBar::add-line:horizontal:on +{ + border-image: url(:/qss_qlight_icons/rc/right_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: right; + subcontrol-origin: margin; +} + + +QScrollBar::sub-line:horizontal:hover, QScrollBar::sub-line:horizontal:on +{ + border-image: url(:/qss_qlight_icons/rc/left_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:horizontal, QScrollBar::down-arrow:horizontal +{ + background: none; +} + + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal +{ + background: none; +} + +QScrollBar:vertical +{ + background-color: #efefef; + width: 15px; + margin: 15px 3px 15px 3px; + border: 1px transparent #efefef; + border-radius: 4px; +} + +QScrollBar::handle:vertical +{ + background-color: #8f8f8f; + min-height: 5px; + border-radius: 4px; +} + +QScrollBar::sub-line:vertical +{ + margin: 3px 0px 3px 0px; + border-image: url(:/qss_qlight_icons/rc/up_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + +QScrollBar::add-line:vertical +{ + margin: 3px 0px 3px 0px; + border-image: url(:/qss_qlight_icons/rc/down_arrow_disabled.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical:hover,QScrollBar::sub-line:vertical:on +{ + + border-image: url(:/qss_qlight_icons/rc/up_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: top; + subcontrol-origin: margin; +} + + +QScrollBar::add-line:vertical:hover, QScrollBar::add-line:vertical:on +{ + border-image: url(:/qss_qlight_icons/rc/down_arrow.png); + height: 10px; + width: 10px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical +{ + background: none; +} + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical +{ + background: none; +} + +QTextEdit +{ + background-color: #ffffff; + color: #000; + border: 1px solid #b6b6b6; +} + +QPlainTextEdit +{ + background-color: #ffffff;; + color: #000; +\\ border-radius: 2px; + border: 1px solid #b6b6b6; +} + +QHeaderView::section +{ + background-color: #b6b6b6; + color: #000; + padding: 5px; + border: 1px solid #b6b6b6; +} + +QSizeGrip { + image: url(:/qss_qlight_icons/rc/sizegrip.png); + width: 12px; + height: 12px; +} + + +QMainWindow::separator +{ + background-color: #f0f0f0; + color: white; + padding-left: 4px; + spacing: 2px; + border: 1px dashed #b6b6b6; +} + +QMainWindow::separator:hover +{ + + background-color: #787876; + color: white; + padding-left: 4px; + border: 1px solid #b6b6b6; + spacing: 2px; +} + + +QMenu::separator +{ + height: 1px; + background-color: #b6b6b6; + color: white; + padding-left: 4px; + margin-left: 10px; + margin-right: 5px; +} + + +QFrame +{ + border-radius: 0px; +\\ border-top: 1px solid #494949; +\\ border-left: 1px solid #494949; + border-top: 1px solid #b6b6b6; + border-left: 1px solid #b6b6b6; + border-bottom: 1px solid #b6b6b6; + border-right: 1px solid #b6b6b6; +} + +QFrame[frameShape="0"] +{ +\\ border-radius: 2px; + border: 1px transparent #b6b6b6; +} + +QStackedWidget +{ + border: 1px transparent black; +} + +QToolBar { +\\ border: 1px solid #b6b6b6; +\\ background: #f0f0f0; + font-weight: bold; + border-bottom: 1px solid #b6b6b6; +} + +QToolBar:top{ + border-bottom: 1px solid #b6b6b6; +} + +QToolBar:left{ + border-right: 1px solid #b6b6b6; +} + +QToolBar:right{ + border-left: 1px solid #b6b6b6; +} + +QToolBar:bottom{ + border-top: 1px solid #b6b6b6; +} + +QToolBar::handle:horizontal { + image: url(:/qss_qlight_icons/rc/Hmovetoolbar.png); +} +QToolBar::handle:vertical { + image: url(:/qss_qlight_icons/rc/Vmovetoolbar.png); +} +QToolBar::separator:horizontal { + image: url(:/qss_qlight_icons/rc/Hsepartoolbar.png); +} +QToolBar::separator:vertical { + image: url(:/qss_qlight_icons/rc/Vsepartoolbar.png); +} + +QToolButton#qt_toolbar_ext_button { + background: transparent; + min-width: 8px; + width: 8px; + padding: 1px; + qproperty-icon: url(:/qss_qlight_icons/rc/extend.png); +} + +QPushButton +{ + color: #000; + background-color: #ffffff; + border-width: 1px; + border-color: #b6b6b6; + border-style: solid; + padding: 5px; +\\ border-radius: 2px; + outline: none; +} + +QPushButton:disabled +{ + background-color: #f0f0f0; + border-width: 1px; + border-color: #454545; + border-style: solid; + padding-top: 5px; + padding-bottom: 5px; + padding-left: 10px; + padding-right: 10px; +\\ border-radius: 2px; + color: #454545; +} + +QPushButton:focus { + background-color: #b5da91; + color: #000; +} + +QPushButton:pressed +{ + background-color: #f9f9f9; + padding-top: -15px; + padding-bottom: -17px; +} + +QComboBox +{ + background-color: #fff; + selection-background-color: #f9f9f9; + border-style: solid; + border: 1px solid #b6b6b6; +\\ border-radius: 2px; + padding-right: 5px; + padding-left: 5px; + padding-top: 1px; + padding-bottom: 1px; + margin: 1px; + min-width: 75px; +} + +QPushButton:checked{ + background-color: #b6b6b6; + border-color: #6A6969; +} + +QComboBox:hover,QPushButton:hover,QAbstractSpinBox:hover,QLineEdit:hover, +QTextEdit:hover,QPlainTextEdit:hover,QAbstractView:hover,QTreeView:hover, +QTableView:hover, QTableWidget::hover, QListWidget::hover +{ + border: 1px solid #75bf3f; + color: #000; +} + +QPushButton:hover +{ + background-color: #c3e9a7; +} + +QComboBox:on +{ + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QAbstractItemView +{ + background-color: #ffffff; +\\ border-radius: 2px; + border: 1px solid #b6b6b6; + selection-color: #000; + selection-background-color: #b5da91; +} + +QComboBox QAbstractItemView +{ + background-color: #ffffff; +\\ border-radius: 2px; + border: 1px solid #b6b6b6; + selection-color: #000; + selection-background-color: #b5da91; +} + +QComboBox::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QComboBox::down-arrow +{ + image: url(:/qss_qlight_icons/rc/down_arrow_disabled.png); +} + +QComboBox::down-arrow:on, QComboBox::down-arrow:hover, +QComboBox::down-arrow:focus +{ +\\ image: url(:/qss_qlight_icons/rc/down_arrow.png); +} + +QAbstractSpinBox { + padding-right: 5px; + padding-left: 5px; + padding-top: 1px; + padding-bottom: 1px; + margin: 1px; + border: 1px solid #b6b6b6; + background-color: #ffffff; + color: #000; +\\ border-radius: 2px; +} + +QAbstractSpinBox:up-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: top right; +} + +QAbstractSpinBox:down-button +{ + background-color: transparent; + subcontrol-origin: border; + subcontrol-position: bottom right; +} + +QAbstractSpinBox::up-arrow,QAbstractSpinBox::up-arrow:disabled,QAbstractSpinBox::up-arrow:off { + image: url(:/qss_qlight_icons/rc/up_arrow_disabled.png); + width: 10px; + height: 10px; +} +QAbstractSpinBox::up-arrow:hover +{ + image: url(:/qss_qlight_icons/rc/up_arrow.png); +} + + +QAbstractSpinBox::down-arrow,QAbstractSpinBox::down-arrow:disabled,QAbstractSpinBox::down-arrow:off +{ + image: url(:/qss_qlight_icons/rc/down_arrow_disabled.png); + width: 10px; + height: 10px; +} +QAbstractSpinBox::down-arrow:hover +{ + image: url(:/qss_qlight_icons/rc/down_arrow.png); +} + + +QLabel +{ + border: 0px solid black; +} + +QTabWidget{ + border: 0px transparent black; +} + +QTabWidget::pane { + border: 1px solid #b6b6b6; + background-color: #ffffff; + padding: 5px; +} + +QTabWidget QWidget{ + background-color: #ffffff; +} + +QTabWidget::tab-bar { + left: 5px; /* move to the right by 5px */ +} + +QTabBar +{ + qproperty-drawBase: 0; + border-radius: 3px; +} + +QTabBar:focus +{ + border: 0px transparent black; +} + +QTabBar::close-button { + image: url(:/qss_qlight_icons/rc/close.png); + background: transparent; +} + +QTabBar::close-button:hover +{ + image: url(:/qss_qlight_icons/rc/close-hover.png); + background: transparent; +} + +QTabBar::close-button:pressed { + image: url(:/qss_qlight_icons/rc/close-pressed.png); + background: transparent; +} + +/* TOP TABS */ +QTabBar::tab:top { + color: #000; + border: 1px solid #b6b6b6; + border-bottom: 1px solid transparent; + background-color: #ffffff; + padding: 5px; + min-width: 10px; + margin-bottom: -1; +} + +QTabBar::tab:top:!selected +{ + color: #000; + background-color: #f8f8f8; + border: 1px solid transparent; +} + +QTabBar::tab:top:selected:hover { + background-color: #c3e9a7; +} + +QTabBar::tab:top:!selected:hover { + background-color: #c3e9a7; +} + +QTabBar::tab::top:selected +{ + border-top: 2px solid #75bf3f; + background-color: #fff; + +} + +/* BOTTOM TABS */ +QTabBar::tab:bottom { + color: #000; + border: 1px solid #b6b6b6; + border-top: 1px solid #ffffff; + background-color: #ffffff; + padding: 5px; + min-width: 10px; + margin-top: -1; +} + +QTabBar::tab:bottom:!selected +{ + color: #000; + background-color: #f3f3f3; + border: 1px solid transparent; +} + +QTabBar::tab:bottom:selected:hover { + background-color: #c3e9a7; +} + +QTabBar::tab:bottom:!selected:hover { + background-color: #c3e9a7; +} + +QTabBar::tab::bottom:selected +{ + border-bottom: 2px solid #75bf3f; + background-color: #fff; +} + +/* LEFT TABS */ +QTabBar::tab:left { + color: #000; + border: 1px solid #b6b6b6; + border-left: 1px solid #ffffff; + background-color: #ffffff; + padding: 5px; + min-height: 10px; +} + +QTabBar::tab:left:!selected +{ + color: #000; + background-color: #f8f8f8; + border: 1px solid transparent; +} + +QTabBar::tab:left:selected:hover { + background-color: #c3e9a7; +} + +QTabBar::tab:left:!selected:hover { + background-color: #c3e9a7; +} + +QTabBar::tab::left:selected +{ + border-left: 2px solid #75bf3f; + background-color: #fff; +} + +/* RIGHT TABS */ +QTabBar::tab:right { + color: #000; + border: 1px solid #b6b6b6; + border-right: 1px solid #ffffff; + background-color: #ffffff; + padding: 5px; + min-height: 10px; +} + +QTabBar::tab:right:!selected +{ + color: #000; + background-color: #f8f8f8; + border: 1px solid transparent; +} + +QTabBar::tab:right:!selected:hover { + background-color: #c3e9a7; +} + +QTabBar::tab:right:!selected:hover { + background-color: #c3e9a7; +} + +QTabBar::tab::right:selected +{ + border-bottom: 2px solid #75bf3f; + background-color: #fff; +} + +QTabBar QToolButton::right-arrow:enabled { + image: url(:/qss_qlight_icons/rc/right_arrow.png); +} + + QTabBar QToolButton::left-arrow:enabled { + image: url(:/qss_qlight_icons/rc/left_arrow.png); +} + +QTabBar QToolButton::right-arrow:disabled { + image: url(:/qss_qlight_icons/rc/right_arrow_disabled.png); +} + + QTabBar QToolButton::left-arrow:disabled { + image: url(:/qss_qlight_icons/rc/left_arrow_disabled.png); +} + + +QDockWidget { + background: #f0f0f0; + border: 1px solid #403F3F; + titlebar-close-icon: url(:/qss_qlight_icons/rc/transparent.png); + titlebar-normal-icon: url(:/qss_qlight_icons/rc/transparent.png); +} + +QDockWidget::title{ +\\ background: #f0f0f0; + background-color: #d2d2d2; + padding-left: 5px; + padding-top: 4px; + margin-top: 4px; +} + + +QDockWidget::close-button, QDockWidget::float-button { + border: 1px solid transparent; + border-radius: 2px; + background: transparent; +} + +QDockWidget::close-button:hover, QDockWidget::float-button:hover { +\\ background: rgba(255, 255, 255, 10); +\\ background-color: #fff; +} + +QDockWidget::close-button { + image: url(:/qss_qlight_icons/rc/close.png); +} + +QDockWidget::close-button:hover { + image: url(:/qss_qlight_icons/rc/close-hover.png); +} + +QDockWidget::float-button { + image: url(:/qss_qlight_icons/rc/undock.png); +} + +QDockWidget::float-button:hover { + image: url(:/qss_qlight_icons/rc/undock-hover.png); +} + +QDockWidget::close-button:pressed, QDockWidget::float-button:pressed { + padding: 1px -1px -1px 1px; + background: rgba(255, 255, 255, 10); +} + +QLabel#limeReportLabel{ + color: #75bf3f; +} + +QTreeView, QListView +{ + border-top: 1px solid #b6b6b6; + border-left: 1px solid #b6b6b6; + border-bottom: 1px solid #b6b6b6; + border-right: 1px solid #b6b6b6; + background-color: #ffffff; +} + +QTreeView::item, QListView::item{ + height: 25px; +} + +QTreeView::branch:selected{ + background-color: #b5da91; +} + +QTreeView::branch:!selected:hover, QTreeView::item:!selected:hover{ +\\ background-color: #287399; + background-color: #b5da91; +} + +QTreeView::branch:has-siblings:!adjoins-item { + border-image: url(:/qss_qlight_icons/rc/transparent.png); +} + +QTreeView::branch:has-siblings:adjoins-item { + border-image: url(:/qss_qlight_icons/rc/transparent.png); +} + +QTreeView::branch:!has-children:!has-siblings:adjoins-item { + border-image: url(:/qss_qlight_icons/rc/transparent.png); +} + +QTreeView::branch:has-children:!has-siblings:closed, +QTreeView::branch:closed:has-children:has-siblings { + image: url(:/qss_qlight_icons/rc/branch_closed.png); +} + +QTreeView::branch:open:has-children:!has-siblings, +QTreeView::branch:open:has-children:has-siblings { + image: url(:/qss_qlight_icons/rc/branch_open.png); +} + +QTreeView::branch:has-children:!has-siblings:closed:hover, +QTreeView::branch:closed:has-children:has-siblings:hover { + image: url(:/qss_qlight_icons/rc/branch_closed-on.png); +} + +QTreeView::branch:open:has-children:!has-siblings:hover, +QTreeView::branch:open:has-children:has-siblings:hover { + image: url(:/qss_qlight_icons/rc/branch_open-on.png); +} + +QSlider::groove:horizontal { + border: 1px solid #565a5e; + height: 4px; + background: #565a5e; + margin: 0px; + border-radius: 2px; +} + +QSlider::handle:horizontal { + background: #ffffff; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: -8px 0; + border-radius: 9px; +} + +QSlider::groove:vertical { + border: 1px solid #565a5e; + width: 4px; + background: #565a5e; + margin: 0px; + border-radius: 3px; +} + +QSlider::handle:vertical { + background: #ffffff; + border: 1px solid #565a5e; + width: 16px; + height: 16px; + margin: 0 -8px; + border-radius: 9px; +} + +QToolButton { + color : #000; + border: 1px solid transparent; + margin: 2px; + padding: 2px; +} + +QToolButton:hover, QToolButton::menu-button:hover { + background-color: #c3e9a7;; + border: 1px solid #75bf3f; +} + +QToolButton:checked, QToolButton:pressed, + QToolButton::menu-button:pressed { + background-color: #fff; + border: 1px solid #75bf3f; +} + +QToolButton:hover:checked +{ + background-color: #c3e9a7;; +} + +QToolButton:text{ + color: #000; +} + +QToolButton:disabled{ + background-color: transparent; + border: 1px transparent #b6b6b6; +} + +\\ +\\QToolButton[popupMode="1"] { /* only for MenuButtonPopup */ +\\ padding-right: 20px; /* make way for the popup button */ +\\ border: 1px #b6b6b6; +\\ border-radius: 5px; +\\} +\\ +\\QToolButton[popupMode="2"] { /* only for InstantPopup */ +\\ padding-right: 10px; /* make way for the popup button */ +\\ border: 1px #b6b6b6; +\\} +\\ +\\/* the subcontrol below is used only in the InstantPopup or DelayedPopup mode */ +\\QToolButton::menu-indicator { +\\ image: url(:/qss_qlight_icons/rc/down_arrow.png); +\\ top: -7px; left: -2px; /* shift it a bit */ +\\} +\\ +\\/* the subcontrols below are used only in the MenuButtonPopup mode */ +\\QToolButton::menu-button { +\\ border: 1px transparent #b6b6b6; +\\ border-top-right-radius: 6px; +\\ border-bottom-right-radius: 6px; +\\ /* 16px width + 4px for border = 20px allocated above */ +\\ width: 16px; +\\ outline: none; +\\} +\\ +\\QToolButton::menu-arrow { +\\ image: url(:/qss_qlight_icons/rc/down_arrow.png); +\\} +\\ +\\QToolButton::menu-arrow:open { +\\ border: 1px solid #b6b6b6; +\\} + +QPushButton::menu-indicator { + subcontrol-origin: padding; + subcontrol-position: bottom right; + left: 8px; +} + +QTableView +{ + border: 1px solid #b6b6b6; + gridline-color: #f0f0f0; + background-color: #ffffff; +} + + +QTableView, QHeaderView +{ + border-radius: 0px; +} + +QTableView::item:pressed, QListView::item:pressed { + background: #b5da91; + color: #000; +} + +QTableView::item:selected:active, QListView::item:selected:active { + background: #b5da91; + color: #000; +} + +QTableView::focus{ + border: 1px solid #4b6807 +} + +QHeaderView +{ + background-color: #f0f0f0; + border: 1px transparent; + border-radius: 0px; + margin: 0px; + padding: 0px; + +} + +QHeaderView::section { + background-color: #f0f0f0; +\\ background-color: #000; + color: #000; + padding: 5px; + border-top: 1px transparent #b6b6b6; + border-left: 1px solid #b6b6b6; + border-right: 1px solid #b6b6b6; + border-bottom: 1px solid #b6b6b6; + border-radius: 0px; + text-align: center; +} + +QHeaderView::section::vertical::first, QHeaderView::section::vertical::only-one +{ + border-top: 1px transparent #b6b6b6; +} + +QHeaderView::section::vertical +{ + border-top: transparent; +} + +QHeaderView::section::horizontal::first, QHeaderView::section::horizontal::only-one +{ + border-left: 1px transparent #b6b6b6; +} + +QHeaderView::section::horizontal +{ + border-left: transparent; +} + + +QHeaderView::section:checked + { + color: white; + background-color: #334e5e; + } + + /* style the sort indicator */ +QHeaderView::down-arrow { + image: url(:/qss_qlight_icons/rc/down_arrow.png); +} + +QHeaderView::up-arrow { + image: url(:/qss_qlight_icons/rc/up_arrow.png); +} + + +QTableCornerButton::section { + background-color: #f0f0f0; + border: 1px transparent #b6b6b6; + border-radius: 0px; +} + +QToolBox { + padding: 5px; + border: 1px transparent black; +} + +QToolBox::tab { + color: #000; + font-weight: bold; + background-color: #f0f0f0; +\\ background-color: #b6b6b6; + border: 2px solid #d0d0d0; + border-top: 1px transparent #f0f0f0; + border-left: 1px transparent #f0f0f0; + border-right: 1px transparent #f0f0f0; +\\ border-bottom: 1px transparent #f0f0f0; +\\ border-top-left-radius: 5px; +\\ border-top-right-radius: 5px; +} + +QToolBox::tab:hover{ + background-color: #c3e9a7; + border-color: #75bf3f; +} + +QToolBox::tab:selected { /* italicize selected tabs */ +\\ font: italic; + font-weight: bold; +\\ background-color: #f0f0f0; + background-color: #fff; + border-color: #75bf3f; + } + +QStatusBar::item { + border: 0px transparent dark; + } + + +QFrame[height="3"], QFrame[width="3"] { + background-color: #b6b6b6; +} + + +QSplitter::handle { + border: 1px dashed #b6b6b6; +} + +QSplitter::handle:hover { + background-color: #787876; + border: 1px solid #b6b6b6; +} + +QSplitter::handle:horizontal { + width: 1px; +} + +QSplitter::handle:vertical { + height: 1px; +} + +QProgressBar { + border: 1px solid #b6b6b6; + border-radius: 5px; + text-align: center; +} + +QProgressBar::chunk { + background-color: #05B8CC; +} + +QDateEdit +{ + selection-background-color: #f9f9f9; + border-style: solid; + border: 1px solid #3375A3; + border-radius: 2px; + padding: 1px; + min-width: 75px; +} + +QDateEdit:on +{ + padding-top: 3px; + padding-left: 4px; + selection-background-color: #4a4a4a; +} + +QDateEdit QAbstractItemView +{ + background-color: #ffffff; + border-radius: 2px; + border: 1px solid #3375A3; + selection-background-color: #f9f9f9; +} + +QDateEdit::drop-down +{ + subcontrol-origin: padding; + subcontrol-position: top right; + width: 15px; + border-left-width: 0px; + border-left-color: darkgray; + border-left-style: solid; + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} + +QDateEdit::down-arrow +{ + image: url(:/qss_qlight_icons/rc/down_arrow_disabled.png); +} + +QDateEdit::down-arrow:on, QDateEdit::down-arrow:hover, +QDateEdit::down-arrow:focus +{ + image: url(:/qss_qlight_icons/rc/down_arrow.png); +} diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/Hmovetoolbar.png b/3rdparty/light_style_sheet/qlightstyle/rc/Hmovetoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..349b9f02cf57392ad3739b4e89eeb542747c26aa GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^JU}eO!3HGrSK5O(Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPt7qfthQepbFUqB&8PZ!4!jq_J0UgTmB5Mbe#x4K_u z|7wq?l3FiN}K1 Uj$Y0702;>N>FVdQ&MBb@0JDcT2mk;8 literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/Hsepartoolbar.png b/3rdparty/light_style_sheet/qlightstyle/rc/Hsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..70465de9d30b4cc6cbf9e7e71980abe8de2ba43b GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^96&6{!3HEBTzh*1NUlU;2PT3Z5>GAsXkC6BcN7^!NXlmzV!9 mAKBA6VObz+Nw9+@1H<1{XE)7O>#As4eKKhIsRC)O# z(@UES6k1%=)%F~f3|jf2(rt}n5YvsmyNtPIl|^fJWmxAve|JjV`_**2f63WA`THbZ Ui0KqJ1I=RaboFyt=akR{07cX{`2YX_ literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/Vsepartoolbar.png b/3rdparty/light_style_sheet/qlightstyle/rc/Vsepartoolbar.png new file mode 100644 index 0000000000000000000000000000000000000000..14b9d1341d49d1afca119d4d53ad4eb7113d0d7a GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^f{XE)7O>#As4f#fC#fqQ9V#d+0(@_MB{vNf<#z@;IWSW{{Q}~ np0#p|8yOh@fng6*2?N93sVpq5+S*@%${9Re{an^LB{Ts5Z$u=u literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/branch_closed-on.png b/3rdparty/light_style_sheet/qlightstyle/rc/branch_closed-on.png new file mode 100644 index 0000000000000000000000000000000000000000..d081e9b3b90d774450a8ea48f1184019e33a755a GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq?nSt-CYAmd+F5V%0wNv=peG!PC{xWt~$(69A|)Be?(o literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/branch_closed.png b/3rdparty/light_style_sheet/qlightstyle/rc/branch_closed.png new file mode 100644 index 0000000000000000000000000000000000000000..d652159a365396a046329cfc7695c89ee54431ca GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S90ZA8lL>4nJ za0`PlBg3pY5H=O_B-6{JiOAS{|sjWh15M=978y+r}k{*WnkcFe(-;BX~D)* rS0)5haD*y~YzrxP=F!`JhM)Jr2M#8aN7~DQS{OWC{an^LB{Ts5zf35P literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/branch_open.png b/3rdparty/light_style_sheet/qlightstyle/rc/branch_open.png new file mode 100644 index 0000000000000000000000000000000000000000..66f8e1ac619d242f3d5a31ffb11291c09ea40468 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>w z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac*foG2iHXppcfQi(?4K_2h&D z3_UzN#dZqZOE?US3>3JRaTpjFIL#0^D8eWr9I$mUBg3(s>=R~}U&3=E8!o-U3d z5v^~hTl*b$5NO-KaZ$^2My7CvC3jk<^u2WvDUf$c)s+rzv%V1E9{A4TMP-Z4lZ6F6 zJvyqaW~@Kfmu*$9pTBmh4fB87Nq1MQib$?;e-iXiZ<}* z4@CWD;9;1v<$&N$mS=`@#Ch2ZV#{}RJvQ4QaCNnQ-mU-(MmI+R8*yI$%dfxAYY;s7 z_m>{S8>aWE2aPM4zg_apbyj4!CUG}xvu2#YiDkvbx1hxrj-4fv9WXW}Qu2zs*=;EB~B@C9lD4Pt3jc#EK9uo4$63*ah<+ zss)BhMo2G`V&I;1@X1nvU9S{R&b}_{bpE^krGqN=vm#%w`~A&$lHbmbGYy8TuE%Y! g4!>ah-@}e^jYL&g^Ys^bz?fn1boFyt=akR{0GqMPK>z>% literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_checked_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_checked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..cb63cc2fac47ad304451f864be5fb9b9085910ee GIT binary patch literal 491 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8!3Q zuY)k7lg8`{prB-lYeY$Kep*R+Vo@qXd3m{BW?pu2a$-TMUVc&f>~}U&3=E7Jo-U3d z5v^~h`}!SnkZ7B~UO?mu^MY^z;cfGr%T7e}s1?W?8ZIpHm|nqi{YV9S;d_3jiRW9V zC@j#CiOINs*XRD1%4NQnC4ao1_;X|a8O{J^t^>=I&uJH^EA=Yy=q@QJXMe6{= z3nu?QmTiqn8yL4lU7L4ID46lSggggJ-lhEfrK>ewSvD~j#OXbEpLgByNx%V?Yugz2 z%=F`x=yC0fIn20j(F*mKC7cqgJZ$I97rnv0D^bF3N854ErU!Bp^;Wf}GDU{OUt^u0 zW>d#j^wD7Ns`t{1S6kg*n)>$7^lzH?%EjxII~|lJaHueWsWo@_*Zi9Q-(<7@f_{&8 zrO0b9HEPU+9v)SBw)%l|Fntmmjz{W9#jS ei>v=l+`}wZn5FJg^3NX_F$|urelF{r5}E*p0K`TB literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_checked_focus.png b/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_checked_focus.png new file mode 100644 index 0000000000000000000000000000000000000000..5b04d83c1159a47483fd9a22115b1538257ba8fb GIT binary patch literal 252 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzwj^(N7l!{JxM1({$v_d#0*}aI zppNSx%;=;sy88?SFVW)>&{AC oGQ+aMO0DGetcwq3^Yy%*$?9v7vi2H2P(8128Bb|(G4PNvN{@ZTf(3sn_sOi&WJR5%589C1Db zhCs&)0xKfAB%rDi8*{57O<)4_5qWijS3LmgKot?w^!;`wQO?#_V**LxkEL?C;d$Q3 z34D<_j%&$$-a|FC);<7TfKs-gBytH%5;%7a2k<;^G*6NSFcsCSFK#waI05=$7(Tm( zXKA)Hc7gXz!E<>7_ErgOC56D&1`2f;J-djcl1whQ1*)tmxvW08H=aDaB2-ihxwfOi!+%lfAUc7T48B=@f2S)wSqMWl~v zZI(b4)#rJ^CmD~QfYn(73rQ)kZ~?z)ATUOY#(t96+Wf5x{DKuI1xkTZpzt0jI=8N~ z@D(TpewDxrBCCa!&WPR`@bXPS;RdLmG@G0AVz*kYZB*;P;G2LaatSOCE0wD-47cV1 zuZZ-3B^9~I`tuKy4iEtEUw^L;PUs>VUo&4)=p@!2lYf|GrJ*qgDsqPEE>LwM@VVy$ iRL|pXH+A&QKavmPo@ys59Ed6a0000&lYofly%1lkY&oejdns92`W8=x4azJu+ z=7QpbE12D64>;xQTN-U9~}U&3=E9Eo-U3d z5v^~hTl*b$5Mg-k8hGeCL!&lB&^xD7y>BB#3gn$qXZC6ymd#kPSfgCwOO2D=r^N+5 zJw7|dgetV6qbk!>#or&Sckj|)rDfLlx9!BzLz){NpZKh3z}$B1``V5SO@~m`&d1TB zFPXg)nog`1-usI20_&}gBemzbKX;_n9XqyBf99W!7jwS#7#6F4()FBFa_MYZPgcU( zS_U_U-aih`PlO_t6}*e$OX!)Ie`yQ*8keuHPS3X2n8Pqxfn#3m>Ec5MHB4$L|F3^% zND!}B?-loe_r`C{2jMH2Uo}`Q;Db^cY&se~TB4iwmri9$b1?Uu;sB%_cFATAov~jhym_YEdgAln?ixeQ z^=a2;y}eWCW~RA2fzc;$?>Dw)YxnzqlxvtK94R$eY;o}lF!UKbUHx3vIVCg!09=m0 AT>t<8 literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_unchecked_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..ade721e81ba47fa792d4586516b8744f8c49c8bb GIT binary patch literal 464 zcmV;>0WbcEP)z3Xli7-6*p9aNvlr>Itd;TFIVxd-y|OyrCsEBb@QA; zCyb(7HXkO*sBg@biZoF@2MSgIU*CL)>Rq?ji!Gh`NAd|iaAZN1hu>)c0000&lYofly%1lkY&oejdns92`W8=x4azJu+ z=7QpbE12D64PG?_viDdeTwz?yCsBG}1@jD!t#O$*jgCn&Z7E>UGiLWc-jWwEX>4Tx04R}tkv&MmKpe$i(-uW54t7v+$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JWDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@ z;xRFsTNS%r5yTLB5kf#>rk+SIX5cx#?&0I>U6f~epZjz4DS49tK9P8i>4rtTK|Hf* z>74h8!>lAJ#OK8023?T&k?XR{Z=8z`3p_JyWK#3QVPdh^!Ey()lA#h$6Gs$PqkJLj zvch?bvs$UK);;+PLwRi_&2^e1h+_!}Bq2gZ4P{hdAxf)8iis5M$2|PQjz38*nOtQs zax9<<6_Voz|AXJ%nuV!JHz^bYf-koHF$#3;0?oQ@e;?a+^91le16NwxUu^)hpQP8@ zTI2}m-v%zO+nT%wT zj1?(+-Q(TeoxS~grq$mM7JzbspmpGj00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;{_QLGdO$vlx_e302y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00L%7L_t(I%cYaOYZOrw#eeVJd9#^u*+twyf+!{g6+#jM zMvK6@je;oXUtuGutSn5iRw=Af`Ue*HGMy4Jep(}~C+Fk!9z zHa!K`d&iVgF3YmfJkL!K$FcTmhhCF2z->={>Nhy&Yi9rrgx1b3WI7?U|p+L?lX*q}0ZkJPgA(&beLS9dOsb|GdX{ zJ$~%*JLlZ4|5&-y>vf8v_*kperbJ{=YyCkf)c|e*Gr&>cB=E^OH&ztIscyHszPY)1 zZ)opXtE?z?mDb6J+V-EMci*Xu1=YgZN)7J9#U;cv{ev9Yll gMbV$l^sjdQ0WiECr7ejYM*si-07*qoM6N<$f^3c)@Bjb+ literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/close-hover.png b/3rdparty/light_style_sheet/qlightstyle/rc/close-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..fbd746354babf5a9558fe51d507cd8594d6c286f GIT binary patch literal 763 zcmVEX>4Tx04R}tkv&MmKpe$i(-uW54t7v+$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JWDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@ z;xRFsTNS%r5yTLB5kf#>rk+SIX5cx#?&0I>U6f~epZjz4DS49tK9P8i>4rtTK|Hf* z>74h8!>lAJ#OK8023?T&k?XR{Z=8z`3p_JyWK#3QVPdh^!Ey()lA#h$6Gs$PqkJLj zvch?bvs$UK);;+PLwRi_&2^e1h+_!}Bq2gZ4P{hdAxf)8iis5M$2|PQjz38*nOtQs zax9<<6_Voz|AXJ%nuV!JHz^bYf-koHF$#3;0?oQ@e;?a+^91le16NwxUu^)hpQP8@ zTI2}m-v%zO+nT%wT zj1?(+-Q(TeoxS~grq$mM7JzbspmpGj00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;{_QM6c%`(JwX5f02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{007fTL_t(I%cYaM4Z<)GhCdz>J1_`cL>5RL#0+#)E~u}f z%MOq_3nWq`Hemq$WFqfBfGfTOr;)Coz|}+6!G@Voj5}j~I&d@B(P&l~H_WA(NaH)mqr*1RM+4>n zTTfG34Ix(9Ph$;c#X5LrdSOynskQpt_(F0XA&kDN&Lsg tFCK0CIVZ^r*a3$DE8kQr&;6Me#}_|BKE!$Q@Gk%W002ovPDHLkV1hF(HDv$* literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/close-pressed.png b/3rdparty/light_style_sheet/qlightstyle/rc/close-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..937d0059839ba44ac5cf03f8c047ee05815954d9 GIT binary patch literal 598 zcmV-c0;&CpP)WFU8GbZ8()Nlj2>E@cM*00Fv5L_t(|+U=WLk^&(N zMNJl_8_?B`8_ zy6%Wq@1q*&nfKd*=(Y$VMgp?uA^!zDB{1N>P63ZikG1hg_|Ito*$P`m0;}iYwLp&q zHaxr-YLO5D|8EUI6+I<5HvIcKKq-fN*91m!MLQ2@g<(~e)B}-PC>A_jKn)xdK16_J zA27UtS~#Wz%?8hwpwaM*^Mp_VHSm!VAk|=R&oeeflxnaSCSoLLra2!WK{LTeNN_t8 zMa*IEe9%Kt!~(_`37Qq2CE;g++G)V5=dIuQ^&@G>nP7%|MFEzZSE$DJ=G|h^>^+ap zZ@wUrJxU{aU6H9xwr+_{8tbBDYw}%RmCY=Ic3C>3gpljEX>4Tx04R}tkv&MmKpe$i(-uW54t7v+$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JWDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@ z;xRFsTNS%r5yTLB5kf#>rk+SIX5cx#?&0I>U6f~epZjz4DS49tK9P8i>4rtTK|Hf* z>74h8!>lAJ#OK8023?T&k?XR{Z=8z`3p_JyWK#3QVPdh^!Ey()lA#h$6Gs$PqkJLj zvch?bvs$UK);;+PLwRi_&2^e1h+_!}Bq2gZ4P{hdAxf)8iis5M$2|PQjz38*nOtQs zax9<<6_Voz|AXJ%nuV!JHz^bYf-koHF$#3;0?oQ@e;?a+^91le16NwxUu^)hpQP8@ zTI2}m-v%zO+nT%wT zj1?(+-Q(TeoxS~grq$mM7JzbspmpGj00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;{_QM6CxH>Uo!vz02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{007%bL_t(I%cYYs5`r)kM4#x4chE~fV=K3Sj=|asP*_vh z(KG4b7EsZ`CAsV4%Ju)-Q}c`^k`r_%Hw z2dWjaE7kj*#C{mY!1p`gs1i39<%b#N&7Wy=y#X8rL5|c7r-1+f002ovPDHLkV1g_a BM#KOB literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/down_arrow.png b/3rdparty/light_style_sheet/qlightstyle/rc/down_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..e271f7f90b4132c9d740058d8b6c915dbdd626d2 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>w z1e^Sc1@brxJR*x37`TN&n2}-D90{Nxdx@v7EBhS|ac(A-+!@lDKp{;}7sn8e>&XcR z7pulY;Wn^IBG(*7A%~?b^VC!N=hHC=sm-IdEdjT~uc)I$ztaD0e F0ssj2CNKa1 literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/down_arrow_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/down_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..5805d9842bb3c8bdf9ae741ebabc690a4929585a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^oIuRR!2%?ApR4f$QjEnx?oJHr&dIz4a+s35-CY>| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAyZcdU741BJ9aT^vI=t|uoP zVCdoDDYjGKUczBuWT3#kjKjddz-flSK@mm~;ef4+85xf4WS1|%O$WD@{VY)RhkE)4M?c;Dn$FG#w;BeIx* zfm;}a85w5HkpK#^mw5WRvOnZv5j2u@?~$1Y6bkTkaSV~TJhlHIZ-W63vwrG^WzJI- zUj+D0eB0To`msDR_F-mcngoGnGkCiCxvXF7(8A5T-G@y GGywodVJqnX literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/left_arrow_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/left_arrow_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..f5b9af8a34edb5f8dd767bf6afa303b89a31d38f GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9bR`<_$&i(E==bj5a^zeU&bwdtch>=_qAH5C#I(A02SZ= z-pqyvve{!vh3V|K2(Z;?j0;|Hq>tJ+4>OtTGCRJHZF@ZOcP8^q5Cr`I<~ScB9o=p= z&m^6bC_rXoz*@WDo;`Hvf?xzGIc?G2OIwY`1pwD|f5YrH(7gbIoJl|JS(+dUbvmTb zB5r&Bqu`aU1z`4E`<=%)mdf9?a};sgxR2RT5LuX#bWVMU#oQ*xD``&)6vecw1(rnna}5U zBv}}JUU#-zt!rHi$mjDrIL<6^D(>w}Oik4Xve{RW-j%cpG=ZjI)y&=*IB?)K*LCj$ zRDHh$oRrzj^z?Kq>70&LUiJM2-~*uKdfs9uz9g&qe#y)}0Tx})E2Z%}7S+9tjgq8G zz(UpczpGZOFDG$V%H`Y_mC6rh_9@YK{BbA$PyEhTe19x7TSPh3(2no@8jnJ}d` zxvz`)Xu-@3Q@U%O-8ttu@B6#&eeXFJcD1YLUFyZ`x^CY1#GHEIZf^VJ)fa|)EWFnC_vkwH{ z6N%(XrPA_FUeEIm3uZ8T)68avQmNeZ^mN!MezY4vBl-Klxl+0Oc_(iW1WUkMr#lwA61mWP^6gmcikThUVXxDm7!9M*?_AgI18~gF z1H*|#;zYYVZ2=^WVYb|CxN5a}7PC=xsG2|quMNcGX92#vbZHT|j#=*jKpN?%*2wG> z^-_116auGOL$e=c_Il3%1~2LHcaC7B3vd(Eku=gAhHwvQuxEgJEbHl{+%bXUhz^zO z1aMzw`&uyYd#6AxNnr@rTl>rgF}wdX0Kb}a^ohVmh_EiNtnd~J1gWB9;< zQeQOsw@G^iF9MGY79E(`tkvF|pP&B+z|Uqc0A~cJFP2I-+U4om@B3+mVcy`Fr2H#G zLmzjg?Ph4o^Sm*c%>u*JKeMaA-Ny3E)PG1ufSZlmvu)!&6#&$4$V4J>LSZw|^@l zli5^w5ukA6;81obn5jl}fg{7Ve_=NjQME=gE z!gm4k-;a$%kzNO4fCG#-cYqO*sxhR3WLWbgZm8TYnr$rkx%F}%GM0qOvzi*#f&zK%biH3UBH&Ab=}9`sB=9lrsGT3+(avxYznms;e* zK-e<@W2Gd9{paV$4gd@c%B+Y~MMOJ@ zd(}V;Us@~0AQ=YT{%q%N_;4do#|5B}n@jwdn@haap?SrZYt^5`kh4~bkN&M^w{svF zSJfi0PaU_#a8pG7@n3C^|1qP$9bj@gUB320MzWz@_PChMk!+-8B>UZ1DOoF5JH@<@ dKKghX{{bx`O0-M#l&Js!002ovPDHLkV1g-XnR@^L literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked.png b/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked.png new file mode 100644 index 0000000000000000000000000000000000000000..9a4def65c64a9d55441f82fe66fc7f46e5b73a75 GIT binary patch literal 728 zcmV;}0w?{6P)@!=&7gwT^7eV48y+tYIRCxlLiT(zip~u_E}K!eZQ1UCJ)XWpcn*qFv|mj2Hymm zGOGZ1&1OGlqk`+ej=|zgCiDDE0Kzalw_mH}fqMq8tl7*>&(3Zg z<=pb}a>SKCQhxe=1 zDZv#_S~^K`0Q0>2NJI5nZ6eAi5Q&W)Tj`Fao}46Y)*j1A!XehJuV&-U1oWX;y{+O9Vm8?gbB$>af^ zw*ZW{XL~Faoy!4ZGMk^9n`^`d07#`$FMw5G<+u=%tPliCX7&)sr_<@k@^=LQ*e#cH zlGcEH(Ye>fV(~_l?|Kj7Dkc) literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..6ece890e750b0685bbd818f22e5fbf999ccd35e1 GIT binary patch literal 760 zcmV6Hyq3pRX0tGI#@4O=(z(ra$opASN0&l!V!~ zGsFupMi4Yn7A{E9xN<|Zbl8%Z;>x%YH!O_WHWI)PKm&#gz*M7gJ{PpnM5bj5JNs=u!`ga zdVmk2x~L*MwQ&UK2QB~`Dl%3m6rLT6fN7e+lZKH~)f)mY2nNUV`F!P|tYujVfhklk ztLk(#78{?OoOB!Qf1;T{t^7JLns=NBjk1M8p$uFZv8+*G>eJ>Xz*wU-!A3(nlNkmc z35?D<&ckN1bxP&(QZkYFE+Y35$z-KmF0XlIJs*K-nw{NUU8}&yS;x70*z&)zv)PwG z&(~_T&+A|YycTzd!$Uw!g29Pa$^inZw}4*5Fa|v{UIP(HqgwGgaEIaP+*}D*M%BLn zkV52jtL1e>^_8ez^ev!pO8&g(E#tx$L?XTg094i2O?hBJARzl5{sneL_4H8%R5gO? zZYu(BRiyu@0>FU48{Yx~Mc}+;S&3GgZQD)(=Mi(Ony70 zgw)FKi^z1|aUM4cH~kt$W3lniTU)BCIV+pJ6jU9r-EjY4+jdG^H>WTlBDu5C=s2S%SwytG|&qy1B<|RZG49PACf*`UEpTkaXb%RO9HU}g)|IfP+T{SND8Rm6FUm; qM77uv3N6gc%>4ATZ<{v%H@^W&H{IQg@q%gq0000P-GUfBNf8-Hhe#dK#X>w~xu#@cP`dD5mq$o2qcd)&_IrK5_j{lD{hJ?DRn`A4 z5ytrXgO+`@bu~$#6KDnM&CwDtB_!^~df6TBDQ;C9z$w_5v|en%F!kaT?6g)43Q01X z^4!n>rr_p<ms|V_Q~F&t)qX-NoTx3P6}Nz<+Paz!KN}fv zzZ018E4bY#*X>OMb3i13Rv~#^fm!nkI1>fnm{x!Kd@uU6ZD550K*(^DGQfw50tz?rz l;#x5|5|s0*s;cU5{RYw7%@@7YeC+@L002ovPDHLkV1iYHH}(Jk literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/right_arrow.png b/3rdparty/light_style_sheet/qlightstyle/rc/right_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..9b0a4e6a7a8097818d9c0626c84f19f4d690dd31 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^Y(UJ(!2%?APo63Uq!^2X+?^QKos)S9wUkJ;l%oZHT?}(3D>Wp7T%b9XV|~Y(T_!;F44$rjF6*2UngIS-C?Eg; literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/sizegrip.png b/3rdparty/light_style_sheet/qlightstyle/rc/sizegrip.png new file mode 100644 index 0000000000000000000000000000000000000000..350583aaac4aa474ac449eaea2cc7ddd060276b9 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;TYyi9E0A8dZe4lyHC-T!u_VYZ zn8D%MjWi%f)6>Nz(!sM1rC-2ha+zM<2rMwpeI*@Z@PO%TWH}e*?iSqXK(y9 XcW6R37#&FAr-gY z-rUH`puoZ4SQyZj9Qd}kRkgExspwA+*PdmovgYQ`l$1@M%Pi(EdF8VmvF&CX@A%e}M=bpY`_UHx3vIVCg!0H#+y$^ZZW literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-branch-more.png b/3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-branch-more.png new file mode 100644 index 0000000000000000000000000000000000000000..62711409d7ed69ec98979394795822630458d9eb GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^5PiX%b9eR9<JS%C8jVk7;fc! UBk#RM6lem2r>mdKI;Vst0ANBkrT_o{ literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-vline.png b/3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-vline.png new file mode 100644 index 0000000000000000000000000000000000000000..87536cce16aabb3710663f720f8d354b1bb0b757 GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^fk14@;zM~Ln>~) zy|9s&!GMF=@x%h2gO1`OFspnaH4_oY}#FfpL8m Q-wTkir>mdKI;Vst0J6j{!2kdN literal 0 HcmV?d00001 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/undock-hover.png b/3rdparty/light_style_sheet/qlightstyle/rc/undock-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..1dfd69895d1b7039b50a2a9ebc2992a37fd92679 GIT binary patch literal 741 zcmVEX>4Tx04R}tkv&MmKpe$i(-uW54t7v+$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JWDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@ z;xRFsTNS%r5yTLB5kf#>rk+SIX5cx#?&0I>U6f~epZjz4DS49tK9P8i>4rtTK|Hf* z>74h8!>lAJ#OK8023?T&k?XR{Z=8z`3p_JyWK#3QVPdh^!Ey()lA#h$6Gs$PqkJLj zvch?bvs$UK);;+PLwRi_&2^e1h+_!}Bq2gZ4P{hdAxf)8iis5M$2|PQjz38*nOtQs zax9<<6_Voz|AXJ%nuV!JHz^bYf-koHF$#3;0?oQ@e;?a+^91le16NwxUu^)hpQP8@ zTI2}m-v%zO+nT%wT zj1?(+-Q(TeoxS~grq$mM7JzbspmpGj00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;{_QM76w-#Pp1F?02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{006y7L_t(I%cYaC4TCTcMPC>rdr-#%(32t3xkA*)RXPt5 zdIo^ndt{BIIiibW1A#A{WZ8G$=YQXD5U12;HEX>4Tx04R}tkv&MmKpe$i(-uW54t7v+$WWauh>AE$6^me@v=v%)FuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JWDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@ z;xRFsTNS%r5yTLB5kf#>rk+SIX5cx#?&0I>U6f~epZjz4DS49tK9P8i>4rtTK|Hf* z>74h8!>lAJ#OK8023?T&k?XR{Z=8z`3p_JyWK#3QVPdh^!Ey()lA#h$6Gs$PqkJLj zvch?bvs$UK);;+PLwRi_&2^e1h+_!}Bq2gZ4P{hdAxf)8iis5M$2|PQjz38*nOtQs zax9<<6_Voz|AXJ%nuV!JHz^bYf-koHF$#3;0?oQ@e;?a+^91le16NwxUu^)hpQP8@ zTI2}m-v%zO+nT%wT zj1?(+-Q(TeoxS~grq$mM7JzbspmpGj00006VoOIv0RI600RN!9r;`8x010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;{_QM6%!HB_>TYp02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{007WQL_t(I%cYYs5`r)gMW0xB2fYL|w&oVlF<5&63TrAm zdL|v*0xDX#gcsld+5}xQ1`+_GAOw_2)j(Bf-Apz};&>0F zz{PQ44rGPa_c5`x4&Q+D#KcG75cq!E_5A?giOm#sJrc!;$sv~I=; zLPxO-8=<727QCRcHCO~syz{@PWrNCLG8s0iR|Dg)d_q85$b59A)F1=O8Kak`_S1=7 q-w%QBx4_Og&SmARwDRiDv>H!c&_IbJTWWUz0000| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;vAy| zxA&jf59DzcctjR6FmMZlFeAgPITAoY_7YEDSN1y`;v6FKKb3EC1BH}5T^vI=t|uoP z;C)upuu) + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/checkbox_checked_disabled.svg b/3rdparty/light_style_sheet/svg/checkbox_checked_disabled.svg new file mode 100644 index 0000000..79e23f2 --- /dev/null +++ b/3rdparty/light_style_sheet/svg/checkbox_checked_disabled.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/checkbox_checked_focus.svg b/3rdparty/light_style_sheet/svg/checkbox_checked_focus.svg new file mode 100644 index 0000000..2683c6b --- /dev/null +++ b/3rdparty/light_style_sheet/svg/checkbox_checked_focus.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/checkbox_indeterminate.svg b/3rdparty/light_style_sheet/svg/checkbox_indeterminate.svg new file mode 100644 index 0000000..648734a --- /dev/null +++ b/3rdparty/light_style_sheet/svg/checkbox_indeterminate.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/checkbox_indeterminate_disabled.svg b/3rdparty/light_style_sheet/svg/checkbox_indeterminate_disabled.svg new file mode 100644 index 0000000..79f9afb --- /dev/null +++ b/3rdparty/light_style_sheet/svg/checkbox_indeterminate_disabled.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/checkbox_indeterminate_focus.svg b/3rdparty/light_style_sheet/svg/checkbox_indeterminate_focus.svg new file mode 100644 index 0000000..22d7337 --- /dev/null +++ b/3rdparty/light_style_sheet/svg/checkbox_indeterminate_focus.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/checkbox_unchecked.svg b/3rdparty/light_style_sheet/svg/checkbox_unchecked.svg new file mode 100644 index 0000000..b365e1b --- /dev/null +++ b/3rdparty/light_style_sheet/svg/checkbox_unchecked.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/checkbox_unchecked_disabled.svg b/3rdparty/light_style_sheet/svg/checkbox_unchecked_disabled.svg new file mode 100644 index 0000000..a2a2059 --- /dev/null +++ b/3rdparty/light_style_sheet/svg/checkbox_unchecked_disabled.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/checkbox_unchecked_focus.svg b/3rdparty/light_style_sheet/svg/checkbox_unchecked_focus.svg new file mode 100644 index 0000000..ffb2523 --- /dev/null +++ b/3rdparty/light_style_sheet/svg/checkbox_unchecked_focus.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/radio_checked.svg b/3rdparty/light_style_sheet/svg/radio_checked.svg new file mode 100644 index 0000000..062c7ec --- /dev/null +++ b/3rdparty/light_style_sheet/svg/radio_checked.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/radio_checked_disabled.svg b/3rdparty/light_style_sheet/svg/radio_checked_disabled.svg new file mode 100644 index 0000000..c0d9720 --- /dev/null +++ b/3rdparty/light_style_sheet/svg/radio_checked_disabled.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/radio_checked_focus.svg b/3rdparty/light_style_sheet/svg/radio_checked_focus.svg new file mode 100644 index 0000000..458c051 --- /dev/null +++ b/3rdparty/light_style_sheet/svg/radio_checked_focus.svg @@ -0,0 +1,73 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/radio_unchecked.svg b/3rdparty/light_style_sheet/svg/radio_unchecked.svg new file mode 100644 index 0000000..83db993 --- /dev/null +++ b/3rdparty/light_style_sheet/svg/radio_unchecked.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/radio_unchecked_disabled.svg b/3rdparty/light_style_sheet/svg/radio_unchecked_disabled.svg new file mode 100644 index 0000000..0297243 --- /dev/null +++ b/3rdparty/light_style_sheet/svg/radio_unchecked_disabled.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/3rdparty/light_style_sheet/svg/radio_unchecked_focus.svg b/3rdparty/light_style_sheet/svg/radio_unchecked_focus.svg new file mode 100644 index 0000000..3f5e289 --- /dev/null +++ b/3rdparty/light_style_sheet/svg/radio_unchecked_focus.svg @@ -0,0 +1,67 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/include/lrglobal.h b/include/lrglobal.h index 76af327..da6ab47 100644 --- a/include/lrglobal.h +++ b/include/lrglobal.h @@ -90,7 +90,7 @@ namespace Const{ const QString DATAFUNCTIONS_MANAGER_NAME = "DatasourceFunctions"; const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); const int DEFAULT_TAB_INDENTION = 4; - + const int DOCKWIDGET_MARGINS = 4; } QString extractClassName(QString className); QString escapeSimbols(const QString& value); diff --git a/limereport/databrowser/lrdatabrowser.cpp b/limereport/databrowser/lrdatabrowser.cpp index 5e335f2..2deebd6 100644 --- a/limereport/databrowser/lrdatabrowser.cpp +++ b/limereport/databrowser/lrdatabrowser.cpp @@ -63,6 +63,8 @@ DataBrowser::DataBrowser(QWidget *parent) : connect(ui->changeConnection,SIGNAL(clicked()),this,SLOT(slotChangeConnection())); connect(ui->pbConnect,SIGNAL(clicked()),this,SLOT(slotChangeConnectionState())); + ui->verticalLayout_2->setMargin(Const::DOCKWIDGET_MARGINS); + ui->dataTree->setHeaderLabel(tr("Datasources")); ui->pbConnect->setEnabled(false); } diff --git a/limereport/lrglobal.h b/limereport/lrglobal.h index 76af327..da6ab47 100644 --- a/limereport/lrglobal.h +++ b/limereport/lrglobal.h @@ -90,7 +90,7 @@ namespace Const{ const QString DATAFUNCTIONS_MANAGER_NAME = "DatasourceFunctions"; const QString EOW("~!@#$%^&*()+{}|:\"<>?,/;'[]\\-="); const int DEFAULT_TAB_INDENTION = 4; - + const int DOCKWIDGET_MARGINS = 4; } QString extractClassName(QString className); QString escapeSimbols(const QString& value); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 343789a..42e6297 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -57,7 +57,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QSe m_dialogDesignerManager(new DialogDesignerManager(this)), #endif m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), - m_dialogChanged(false), m_useDarkTheme(false), m_settings(settings) + m_dialogChanged(false), m_theme("Default"), m_settings(settings) { #ifdef HAVE_QT4 m_tabWidget = new LimeReportTabWidget(this); @@ -100,6 +100,10 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QSe connect(m_dialogDesignerManager, SIGNAL(dialogNameChanged(QString,QString)), this, SLOT(slotDialogNameChanged(QString,QString))); #endif + + m_themes.insert("Default",""); + initThemeIfExist("Dark", ":/qdarkstyle/style.qss"); + initThemeIfExist("Light", ":/qlightstyle/lightstyle.qss"); } #ifdef HAVE_QTDESIGNER_INTEGRATION @@ -185,7 +189,7 @@ void ReportDesignWidget::saveState() m_settings->setValue("vGridStep",m_verticalGridStep); m_settings->setValue("defaultFont",m_defaultFont); m_settings->setValue("useGrid",m_useGrid); - m_settings->setValue("useDarkTheme",m_useDarkTheme); + m_settings->setValue("theme",m_theme); m_settings->setValue("ScriptEditorState", m_scriptEditor->saveState()); m_settings->endGroup(); } @@ -196,17 +200,27 @@ void ReportDesignWidget::applySettings() m_report->pageAt(i)->pageItem()->setFont(m_defaultFont); } applyUseGrid(); - if (m_useDarkTheme) { - QFile theme(":/qdarkstyle/style.qss"); - theme.open(QIODevice::ReadOnly); - QString styleSheet = theme.readAll(); - parentWidget()->setStyleSheet(styleSheet); - m_report->setStyleSheet(styleSheet); + + if (m_themes.contains(m_theme)){ + parentWidget()->setStyleSheet(m_themes.value(m_theme)); + m_report->setStyleSheet(m_themes.value(m_theme)); } else { + m_theme = "Default"; parentWidget()->setStyleSheet(""); m_report->setStyleSheet(""); } +// if (m_theme.compare("Dark") == 0) { +// QFile theme(":/qdarkstyle/style.qss"); +// theme.open(QIODevice::ReadOnly); +// QString styleSheet = theme.readAll(); +// parentWidget()->setStyleSheet(styleSheet); +// m_report->setStyleSheet(styleSheet); +// } else { +// parentWidget()->setStyleSheet(""); +// m_report->setStyleSheet(""); +// } + if (m_settings){ m_settings->beginGroup("ScriptEditor"); QVariant v = m_settings->value("DefaultFontName"); @@ -244,9 +258,9 @@ void ReportDesignWidget::loadState() m_useGrid = v.toBool(); } - v = m_settings->value("useDarkTheme"); + v = m_settings->value("theme"); if (v.isValid()){ - m_useDarkTheme = v.toBool(); + m_theme = v.toString(); } v = m_settings->value("ScriptEditorState"); @@ -684,6 +698,17 @@ void ReportDesignWidget::prepareReport() report()->clearSelection(); } +void ReportDesignWidget::initThemeIfExist(const QString &themeName, const QString &path) +{ + QFile theme(path); + if (theme.exists()){ + theme.open(QIODevice::ReadOnly); + QString styleSheet = theme.readAll(); + m_themes.insert(themeName, styleSheet); + m_localToEng.insert(QObject::tr(themeName.toLatin1()), themeName); + } +} + void ReportDesignWidget::previewReport() { prepareReport(); @@ -749,14 +774,25 @@ void ReportDesignWidget::editSetting() setting.setHorizontalGridStep(m_horizontalGridStep); setting.setDefaultFont(m_defaultFont); setting.setSuppressAbsentFieldsAndVarsWarnings(m_report->suppressFieldAndVarError()); - setting.setUseDarkTheme(m_useDarkTheme); + + QStringList themes; + themes.append(QObject::tr("Default")); + foreach(QString theme, m_themes.keys()) + if (!themes.contains(QObject::tr(theme.toLatin1()))) + themes.append(QObject::tr(theme.toLatin1())); + + setting.setDesignerThemes(themes, QObject::tr(m_theme.toLatin1())); setting.setDesignerLanguages(m_report->designerLanguages(), m_report->currentDesignerLanguage()); if (setting.exec()){ m_horizontalGridStep = setting.horizontalGridStep(); m_verticalGridStep = setting.verticalGridStep(); m_defaultFont = setting.defaultFont(); - m_useDarkTheme = setting.userDarkTheme(); + if (m_localToEng.contains(setting.theme())){ + m_theme = m_localToEng.value(setting.theme()); + } else { + m_theme = "Default"; + } m_report->setSuppressFieldAndVarError(setting.suppressAbsentFieldsAndVarsWarnings()); if (m_report->currentDesignerLanguage() != setting.designerLanguage() ){ m_report->setCurrentDesignerLanguage(setting.designerLanguage()); diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 7f41456..5229ce8 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -206,6 +206,7 @@ protected: private: bool eventFilter(QObject *target, QEvent *event); void prepareReport(); + void initThemeIfExist(const QString& themeName, const QString& path); private: ReportEnginePrivateInterface* m_report; QGraphicsView *m_view; @@ -228,8 +229,10 @@ private: bool m_useGrid; bool m_useMagnet; bool m_dialogChanged; - bool m_useDarkTheme; + QString m_theme; QSettings* m_settings; + QMap m_themes; + QMap m_localToEng; }; } // namespace LimeReport diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 5eba0e7..1b79168 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -512,7 +512,7 @@ void ReportDesignWindow::createObjectInspector() QWidget* w = new QWidget(objectDoc); QVBoxLayout* l = new QVBoxLayout(w); l->addWidget(m_objectInspector); - l->setContentsMargins(2,2,2,2); + l->setMargin(0); w->setLayout(l); objectDoc->setWindowTitle(tr("Object Inspector")); objectDoc->setWidget(w); diff --git a/limereport/lrsettingdialog.cpp b/limereport/lrsettingdialog.cpp index b7ad816..ee54096 100644 --- a/limereport/lrsettingdialog.cpp +++ b/limereport/lrsettingdialog.cpp @@ -2,6 +2,7 @@ #include "ui_lrsettingdialog.h" #include "lrglobal.h" #include +#include namespace LimeReport{ @@ -10,10 +11,14 @@ SettingDialog::SettingDialog(QWidget *parent) : ui(new Ui::SettingDialog) { ui->setupUi(this); - QFile theme(":/qdarkstyle/style.qss"); - if (!theme.exists()){ - ui->cbbUseDarkTheme->setVisible(false); - } + ui->toolBox->setCurrentIndex(0); +// ui->cbTheme->addItem(QObject::tr("Default")); +// if (isFileExists(":/qdarkstyle/style.qss")){ +// ui->cbTheme->addItem(QObject::tr("Dark")); +// } +// if (isFileExists(":/qlightstyle/lightstyle.qss")){ +// ui->cbTheme->addItem(QObject::tr("Light")); +// } ui->indentSize->setRange(0,10); } @@ -51,9 +56,9 @@ int SettingDialog::tabIndention() return ui->indentSize->value(); } -bool SettingDialog::userDarkTheme() +QString SettingDialog::theme() { - return ui->cbbUseDarkTheme->isChecked(); + return ui->cbTheme->currentText(); } bool SettingDialog::suppressAbsentFieldsAndVarsWarnings() @@ -101,9 +106,13 @@ void SettingDialog::setScritpTabIndention(int size) ui->indentSize->setValue(size); } -void SettingDialog::setUseDarkTheme(bool value) +void SettingDialog::setTheme(const QString &theme) { - ui->cbbUseDarkTheme->setChecked(value); +#ifdef HAVE_QT4 + ui->cbTheme->setCurrentIndex(ui->cbTheme->findText(theme)); +#else + ui->cbTheme->setCurrentText(theme); +#endif } void SettingDialog::setDesignerLanguages(QList languages, QLocale::Language currentLanguage) @@ -128,6 +137,17 @@ void SettingDialog::setDesignerLanguages(QList languages, QLo #endif } +void SettingDialog::setDesignerThemes(QList themes, const QString ¤tTheme) +{ + ui->cbTheme->clear(); + ui->cbTheme->addItems(themes); +#ifdef HAVE_QT4 + ui->cbTheme->setCurrentIndex(ui->cbTheme->findText(currentTheme)); +#else + ui->cbTheme->setCurrentText(currentTheme); +#endif +} + void SettingDialog::setSettings(QSettings* settings){ m_settings = settings; if (m_settings){ @@ -159,6 +179,12 @@ void SettingDialog::on_bbOkCancel_accepted() } } +bool SettingDialog::isFileExists(const QString &path) +{ + QFileInfo check_file(path); + return check_file.exists() && check_file.isFile(); +} + } // namespace LimeReport diff --git a/limereport/lrsettingdialog.h b/limereport/lrsettingdialog.h index bc4e862..3049d87 100644 --- a/limereport/lrsettingdialog.h +++ b/limereport/lrsettingdialog.h @@ -23,7 +23,7 @@ public: QFont defaultFont(); QFont scriptFont(); int tabIndention(); - bool userDarkTheme(); + QString theme(); bool suppressAbsentFieldsAndVarsWarnings(); QLocale::Language designerLanguage(); void setSuppressAbsentFieldsAndVarsWarnings(bool value); @@ -32,12 +32,14 @@ public: void setDefaultFont(const QFont& value); void setScriptFont(const QFont& value); void setScritpTabIndention(int size); - void setUseDarkTheme(bool value); + void setTheme(const QString& theme); void setDesignerLanguages(QList languages, QLocale::Language currentLanguage); + void setDesignerThemes(QList themes, const QString& currentTheme); void setSettings(QSettings* settings); private slots: void on_bbOkCancel_accepted(); - +private: + bool isFileExists(const QString& path); private: Ui::SettingDialog *ui; QList m_aviableLanguages; diff --git a/limereport/lrsettingdialog.ui b/limereport/lrsettingdialog.ui index 12af083..86fe2e2 100644 --- a/limereport/lrsettingdialog.ui +++ b/limereport/lrsettingdialog.ui @@ -7,7 +7,7 @@ 0 0 419 - 362 + 378 @@ -23,7 +23,7 @@ - 0 + 2 @@ -31,7 +31,7 @@ 0 0 401 - 218 + 250 @@ -148,11 +148,44 @@ - - - Use dark theme + + + + + + 0 + 0 + + + + Theme + + + + + + + + 0 + 0 + + + + + + + + + + Qt::Vertical - + + + 20 + 40 + + + @@ -162,7 +195,7 @@ 0 0 401 - 218 + 250 @@ -251,25 +284,34 @@ 0 0 401 - 218 + 250 Report settings - - - - 10 - 10 - 280 - 23 - - - - Suppress absent fields and variables warning - - + + + + + Suppress absent fields and variables warning + + + + + + + Qt::Vertical + + + + 20 + 204 + + + + + diff --git a/limereport/objectinspector/lrobjectinspectorwidget.cpp b/limereport/objectinspector/lrobjectinspectorwidget.cpp index 2fbfff0..d4158f0 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.cpp +++ b/limereport/objectinspector/lrobjectinspectorwidget.cpp @@ -189,7 +189,7 @@ ObjectInspectorWidget::ObjectInspectorWidget(QWidget *parent) h->addWidget(pbClear); l->addLayout(h); l->addWidget(m_objectInspectorView); - l->setContentsMargins(2,2,2,2); + l->setMargin(Const::DOCKWIDGET_MARGINS); l->setSpacing(2); this->setLayout(l); } diff --git a/limereport/objectsbrowser/lrobjectbrowser.cpp b/limereport/objectsbrowser/lrobjectbrowser.cpp index a7e39ba..a86fac3 100644 --- a/limereport/objectsbrowser/lrobjectbrowser.cpp +++ b/limereport/objectsbrowser/lrobjectbrowser.cpp @@ -40,7 +40,7 @@ ObjectBrowser::ObjectBrowser(QWidget *parent) { QVBoxLayout *layout = new QVBoxLayout(this); setLayout(layout); - layout->setMargin(2); + layout->setMargin(Const::DOCKWIDGET_MARGINS); m_treeView = new QTreeWidget(this); layout->addWidget(m_treeView); m_treeView->headerItem()->setText(0,tr("Objects")); diff --git a/limereport/scriptbrowser/lrscriptbrowser.cpp b/limereport/scriptbrowser/lrscriptbrowser.cpp index 148ddb7..4407170 100644 --- a/limereport/scriptbrowser/lrscriptbrowser.cpp +++ b/limereport/scriptbrowser/lrscriptbrowser.cpp @@ -43,6 +43,7 @@ ScriptBrowser::ScriptBrowser(QWidget *parent) : ui(new Ui::ScriptBrowser) { ui->setupUi(this); + ui->verticalLayout->setMargin(Const::DOCKWIDGET_MARGINS); #ifndef HAVE_UI_LOADER ui->tpDialogs->setVisible(false); ui->tabWidget->removeTab(ui->tabWidget->indexOf(ui->tpDialogs)); diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 37c87ec..65d08fd 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1935,6 +1935,10 @@ p, li { white-space: pre-wrap; } hideText Скрывать текст + + option3 + + LimeReport::RectMMPropItem @@ -2428,6 +2432,22 @@ This preview is no longer valid. Datasource with name %1 already exist Источник данных %1 уже существует + + CSV + + + + Separator + Разделитель + + + ; + ; + + + Use first row as header + Первая строка как заголовок + LimeReport::ScriptBrowser @@ -2635,10 +2655,6 @@ This preview is no longer valid. Language Язык - - Use dark theme - Использовать Темную тему - Designer settings Настройки дизайнера @@ -2659,6 +2675,10 @@ This preview is no longer valid. Report settings Настройки отчета + + Theme + Тема + LimeReport::SubDetailBand @@ -3074,5 +3094,9 @@ This preview is no longer valid. Export to PDF Экспортировать в PDF + + Default + По умолчанию + From b4b22f4d6bf549d4eb0e7e6d89a45ef5e4de98e5 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 26 May 2019 20:57:06 +0300 Subject: [PATCH 314/347] Light theme has been added to designer --- designer/designer.pro | 1 + 1 file changed, 1 insertion(+) diff --git a/designer/designer.pro b/designer/designer.pro index 844b299..3f9cb8e 100644 --- a/designer/designer.pro +++ b/designer/designer.pro @@ -18,6 +18,7 @@ INCLUDEPATH += $$PWD/../include DEPENDPATH += $$PWD/../include RESOURCES += $$PWD/../3rdparty/dark_style_sheet/qdarkstyle/style.qrc +RESOURCES += $$PWD/../3rdparty/light_style_sheet/qlightstyle/lightstyle.qrc DEST_DIR = $${DEST_BINS} REPORTS_DIR = $${DEST_DIR} From 16df5920979bab9a65bc685a18874e11dc4e8172 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 29 May 2019 22:56:27 +0300 Subject: [PATCH 315/347] Spanish translation has been updated --- designer/designersettingmanager.cpp | 1 + translations/limereport_es.ts | 3648 ++++++++++++++------------- translations/limereport_es_ES.ts | 2919 --------------------- 3 files changed, 1843 insertions(+), 4725 deletions(-) delete mode 100644 translations/limereport_es_ES.ts diff --git a/designer/designersettingmanager.cpp b/designer/designersettingmanager.cpp index bdbd680..02251b2 100644 --- a/designer/designersettingmanager.cpp +++ b/designer/designersettingmanager.cpp @@ -18,6 +18,7 @@ void DesignerSettingManager::getAviableLanguages(QList* langu languages->append(QLocale::Arabic); languages->append(QLocale::French); languages->append(QLocale::Chinese); + languages->append(QLocale::Spanish); } QLocale::Language DesignerSettingManager::getCurrentDefaultLanguage() diff --git a/translations/limereport_es.ts b/translations/limereport_es.ts index 83c3364..3ed4a16 100644 --- a/translations/limereport_es.ts +++ b/translations/limereport_es.ts @@ -1,48 +1,134 @@ + + $ClassName$ + + $ClassName$ + + + + + ChartItemEditor + + Series + + + + Add + Agregar + + + Delete + Eliminar + + + Name + Nombre + + + Values field + Valores del campo + + + Color + + + + Type + Tipo + + + Labels field + Etiquetas del campo + + + Ok + Aceptar + + + Series editor + Editor de Series + + + Series name + Nombre de la Serie + + LRVariableDialog - Variable - + Variable - Name - + Nombre - Value - + Valor - Type - + Tipo - Attention - + Atención + + + Mandatory + Obligatorio + + + + LanguageSelectDialog + + Dialog + Dialogo + + + Language + Idioma LimeReport::AboutDialog - About - + Acerca de + + + Author + Autor + + + License + Licencia + + + Close + Cerrar - Lime Report - + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> + + + + Version 1.1.1 + - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -56,30 +142,21 @@ p, li { white-space: pre-wrap; } <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> <p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> <p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - - - - - Author - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } </style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> - +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Motor de informes para el entorno de trabajo de </span> <span style = "font-size: 12pt; font-weight: 600; color: # 7faa18;"> Qt </span> <span style = "font-size: 12pt; font-weight : 600; "></span> </p> +<p align = "justify" style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;" > <span style = "font-size: 11pt;"> LimeReport es una biblioteca de C ++ multiplataforma escrita para el entorno de trabajo de Qt y diseñada para desarrolladores de software que deseen agregar en su aplicación la capacidad para crear informes o imprimir formularios generados mediante plantillas. < / span> </p> +<p align = "justify" style = "- qt -agraph-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px; font-size: 11pt; "> <br /> </p> +<p align = "justify" style = "- qt -agraph-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px; font-size: 11pt; "> <br /> </p> +<p align = "justify" style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;" > <span style = "font-size: 11pt;"> Sitio web oficial: </span> <a href="www.limereport.ru"> <span style = "font-size: 11pt; text-decoration: underline ; color: # 0000ff; "> www.limereport.ru </span> </a> </p> +<p align = "justify" style = "- qt -agraph-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; texto-sangría: 0px; fuente-tamaño: 11 puntos; texto-decoración: subrayado; color: # 0000ff; "> <br /> </p> +<p align = "justify" style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;" > <span style = "font-size: 10pt; font-weight: 600;"> Esta biblioteca se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; sin ni siquiera la garantía implícita de COMERCIABILIDAD o APTITUD PARA UN PROPÓSITO PARTICULAR. </span> </p> +<p align = "justify" style = "- qt -agraph-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px; font-size: 10pt; font-weight: 600; color: # 000000; "> <br /> </p> +<p align = "justify" style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;" > <span style = "font-size: 10pt;">Derechos reservados 2015 Arin Alexander. Todos los derechos reservados. - - License - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } @@ -194,2986 +271,2945 @@ p, li { white-space: pre-wrap; } <p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">signature of Ty Coon</span><span style=" font-family:'monospace';">, 1 April 1990</span></p> <p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Ty Coon, President of Vice</span></p> <p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">That's all there is to it!</span></p></body></html> - - - - - Close - - - - - Version 1.1.1 - + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600;">G</span><span style=" font-family:'sans-serif'; font-weight:600;">LICENCIA PUBLICA GENERAL DE MENORES DE NU</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Versión 2.1, febrero de 1999</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Todos están autorizados a copiar y distribuir copias textuales.</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">de este documento de licencia, pero no está permitido cambiarlo.</span></p> +<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">[Esta es la primera versión lanzada de Lesser GPL. Tambien cuenta</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> como el sucesor de la Licencia Pública de la Biblioteca GNU, versión 2, de ahí</span></p> +<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> el número de versión 2.1.]</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600;">P</span><span style=" font-family:'sans-serif'; font-weight:600;">reamble</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Las licencias para la mayoría de los programas están diseñadas para quitarle la libertad de compartir y cambiar. Por el contrario, las licencias públicas generales de GNU están destinadas a garantizar su libertad de compartir y cambiar el software libre, para garantizar que el software sea gratuito para todos sus usuarios. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Esta licencia, la Licencia de Público General Menor, se aplica a algunos paquetes de software especialmente designados, generalmente bibliotecas, de la Free Software Foundation y otros autores que deciden usarla. También puede usarlo, pero le sugerimos que primero piense detenidamente si esta licencia o la Licencia pública general es la mejor estrategia para usar en un caso particular, según las explicaciones a continuación. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Cuando hablamos de software libre, nos referimos a la libertad de uso, no al precio. Nuestras licencias públicas generales están diseñadas para garantizar que usted tenga la libertad de distribuir copias de software gratuito (y puede cobrar por este servicio si lo desea); que recibe el código fuente o puede obtenerlo si lo desea; que puede cambiar el software y usar partes de él en nuevos programas gratuitos; y que está informado de que puede hacer estas cosas. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Para proteger sus derechos, necesitamos hacer restricciones que prohíban a los distribuidores negarle estos derechos o pedirle que renuncie a estos derechos. Estas restricciones se traducen en ciertas responsabilidades para usted si distribuye copias de la biblioteca o si la modifica.</span></p> + +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Por ejemplo, si distribuye copias de la biblioteca, ya sea de forma gratuita o por una tarifa, debe otorgar a los destinatarios todos los derechos que le otorgamos. Debe asegurarse de que ellos también reciban o puedan obtener el código fuente. Si vincula otro código con la biblioteca, debe proporcionar archivos de objetos completos a los destinatarios, para que puedan volver a vincularlos con la biblioteca después de realizar cambios en la biblioteca y volver a compilarla. Y debe mostrarles estos términos para que conozcan sus derechos. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Protegemos sus derechos con un método de dos pasos: (1) protegemos los derechos de autor de la biblioteca y (2) le ofrecemos esta licencia, que le da permiso legal para copiar, distribuir y / o modificar la biblioteca. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Para proteger a cada distribuidor, queremos dejar muy claro que no hay garantía para la biblioteca gratuita. Además, si la biblioteca es modificada por alguien más y se transmite, los destinatarios deben saber que lo que tienen no es la versión original, por lo que la reputación del autor original no se verá afectada por problemas que puedan ser introducidos por otros. </ Span > </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Finalmente, las patentes de software representan una amenaza constante para la existencia de cualquier programa gratuito. Deseamos asegurarnos de que una empresa no pueda restringir efectivamente a los usuarios de un programa gratuito al obtener una licencia restrictiva de un titular de una patente. Por lo tanto, insistimos en que cualquier licencia de patente obtenida para una versión de la biblioteca debe ser consistente con la plena libertad de uso especificada en esta licencia. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> La mayoría del software GNU, incluidas algunas bibliotecas, está cubierto por la Licencia Pública General de GNU. Esta licencia, la licencia pública general menor de GNU, se aplica a ciertas bibliotecas designadas y es bastante diferente de la licencia pública general ordinaria. Utilizamos esta licencia para ciertas bibliotecas con el fin de permitir la vinculación de esas bibliotecas con programas no libres.</span></p> + +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Cuando un programa está vinculado con una biblioteca, ya sea estáticamente o utilizando una biblioteca compartida, la combinación de los dos es legalmente una obra combinada, un derivado de la biblioteca original. Por lo tanto, la Licencia Pública General ordinaria permite dicha vinculación solo si la combinación completa cumple con sus criterios de libertad. La licencia pública general de Lesser permite criterios más laxos para vincular otro código con la biblioteca. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Llamamos a esta licencia el & quot; Lesser & quot; Licencia pública general porque hace menos para proteger la libertad del usuario que la licencia pública general ordinaria. También proporciona a otros desarrolladores de software libre una ventaja menor sobre los programas no gratuitos de la competencia. Estas desventajas son la razón por la que usamos la Licencia Pública General ordinaria para muchas bibliotecas. Sin embargo, la licencia Lesser ofrece ventajas en ciertas circunstancias especiales. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Por ejemplo, en raras ocasiones, puede haber una necesidad especial de fomentar el uso más amplio posible de una determinada biblioteca, para que se convierta en un estándar de facto. Para lograr esto, se debe permitir que los programas no libres utilicen la biblioteca. Un caso más frecuente es que una biblioteca gratuita hace el mismo trabajo que las bibliotecas no libres ampliamente utilizadas. En este caso, hay poco que ganar al limitar la biblioteca gratuita únicamente al software libre, por lo que usamos la Licencia pública general menor. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> En otros casos, el permiso para usar una biblioteca particular en programas no libres permite que una mayor cantidad de personas utilicen una gran cantidad de software libre. Por ejemplo, el permiso para usar la Biblioteca GNU C en programas no libres permite que muchas más personas utilicen todo el sistema operativo GNU, así como su variante, el sistema operativo GNU / Linux.</span></p> + +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Aunque la Licencia pública general menor protege menos la libertad de los usuarios, garantiza que el usuario de un programa vinculado a la Biblioteca tenga la libertad y los medios para ejecutar dicho programa utilizando una versión modificada de la Biblioteca. </ span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Los términos y condiciones precisos para la copia, distribución y modificación se encuentran a continuación. Preste mucha atención a la diferencia entre un trabajo basado en la biblioteca & quot; y un & quot; trabajo que utiliza la biblioteca & quot ;. El primero contiene código derivado de la biblioteca, mientras que el último debe combinarse con la biblioteca para poder ejecutarse. </span> </p> +<p style = "margin-top: 15px; margin-bottom: 15px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <a name = "SEC3"> </a> <span style = "font-family: 'sans-serif'; font-weight: 600; color: # 333333;"> T </span> <span style = "font-family: 'sans-serif'; font-weight: 600; color: # 333333; "> ERMS Y CONDICIONES PARA LA COPIA, DISTRIBUCIÓN Y MODIFICACIÓN </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 0. </span> <span style = "font-family: 'sans-serif';"> Este Acuerdo de licencia se aplica a cualquier biblioteca de software u otro programa que contenga un aviso colocado por el titular de los derechos de autor u otra parte autorizada que indique que se puede distribuir de acuerdo con los términos de esta Licencia pública general menor (también denominada "esta Licencia"). Cada licenciatario se direcciona como & quot; usted & quot ;. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> A & quot; library & quot; significa una colección de funciones de software y / o datos preparados para estar convenientemente vinculados con programas de aplicación (que utilizan algunas de esas funciones y datos) para formar ejecutables. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> La & quot; Biblioteca & quot ;, a continuación, se refiere a cualquier biblioteca de software o trabajo que se haya distribuido bajo estos términos. Un "trabajo basado en la Biblioteca" significa la Biblioteca o cualquier trabajo derivado bajo la ley de derechos de autor: es decir, un trabajo que contiene la Biblioteca o una parte de ella, ya sea textualmente o con modificaciones y / o traducido directamente a otro idioma. (De aquí en adelante, la traducción se incluye sin limitación en el término "modificación").</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">& quot; Código fuente & quot; para un trabajo significa la forma preferida del trabajo para hacer modificaciones al mismo. Para una biblioteca, el código fuente completo significa todo el código fuente de todos los módulos que contiene, más cualquier archivo de definición de interfaz asociado, además de los scripts utilizados para controlar la compilación e instalación de la biblioteca. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Las actividades que no sean la copia, distribución y modificación no están cubiertas por esta Licencia; Están fuera de su alcance. El acto de ejecutar un programa utilizando la Biblioteca no está restringido, y la salida de dicho programa está cubierta solo si su contenido constituye un trabajo basado en la Biblioteca (independientemente del uso de la Biblioteca en una herramienta para escribirlo). Si eso es cierto, depende de lo que haga la Biblioteca y del programa que la utiliza. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 1. </span> <span style = "font-family: 'sans-serif';"> Puede copiar y distribuir copias literales de el código fuente completo de la Biblioteca a medida que lo reciba, en cualquier medio, siempre que publique de forma visible y adecuada en cada copia un aviso de copyright y una renuncia de garantía adecuados; mantenga intactos todos los avisos que se refieren a esta Licencia ya la ausencia de cualquier garantía; y distribuya una copia de esta Licencia junto con la Biblioteca. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Usted puede cobrar una tarifa por el acto físico de transferir una copia, y puede, a opción suya, ofrecer una garantía de protección a cambio de una tarifa.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">2.</span><span style=" font-family:'sans-serif';">Puede modificar su copia o copias de la Biblioteca o cualquier parte de ella, formando así un trabajo basado en la Biblioteca, y copiar y distribuir dichas modificaciones o trabajos según los términos de la Sección 1 anterior, siempre que cumpla con todas estas condiciones : </span> </p> +<ul style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"> <li style = "font-family: ' sans-serif '; " style = "margin-top: 19px; margin-bottom: 0px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> a) </span> <span style =" font-size: 16px; "> El trabajo modificado debe ser una biblioteca de software. </span> </li> +<li style = "font-family: 'sans-serif';" style = "margin-top: 0px; margin-bottom: 0px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> b) </span> <span style =" font-size: 16px; "> Debe hacer que los archivos modificados contengan avisos importantes que indiquen que cambió los archivos y fecha de cualquier cambio. </span> </li> +<li style = "font-family: 'sans-serif';" style = "margin-top: 0px; margin-bottom: 0px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> c) </span> <span style =" font-size: 16px; "> Debe hacer que la totalidad del trabajo tenga licencia sin cargo para todos los terceros bajo los términos de esta Licencia. </span> </li> +<li style = "font-family: 'sans-serif';" style = "margin-top: 0px; margin-bottom: 19px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> d) </span> <span style =" font-size: 16px; "> Si una instalación en la Biblioteca modificada se refiere a una función o una tabla de datos, suministrado por un programa de aplicación que utiliza la instalación, aparte de como un argumento pasado cuando se invoca la instalación, debe hacer un esfuerzo de buena fe para asegurarse de que, en el caso de que una aplicación no suministre dicha función o tabla, la instalación aún opera, y realiza cualquier parte de su propósito sigue siendo significativa. </span> </li> </ul> +<p style = "margin-top: 15px; margin-bottom: 15px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 1; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> (Por ejemplo, una función en una biblioteca para calcular raíces cuadradas tiene un propósito que está completamente bien definido independientemente de la aplicación. Por lo tanto, la Subsección 2d requiere que cualquier aplicación sea suministrada la función o tabla utilizada por esta función debe ser opcional: si la aplicación no la proporciona, la función de raíz cuadrada aún debe calcular las raíces cuadradas.)</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Estos requisitos se aplican a la obra modificada en su conjunto. Si las secciones identificables de ese trabajo no se derivan de la Biblioteca, y pueden considerarse razonablemente trabajos independientes e independientes en sí mismas, entonces esta Licencia y sus términos no se aplican a esas secciones cuando los distribuye como trabajos separados. Pero cuando distribuye las mismas secciones como parte de un todo, que es un trabajo basado en la Biblioteca, la distribución del todo debe estar en los términos de esta Licencia, cuyos permisos para otros licenciatarios se extienden a todo el conjunto y, por lo tanto, a cada uno. y cada parte, independientemente de quién lo escribió. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Por lo tanto, no es la intención de esta sección reclamar derechos o impugnar sus derechos a trabajar escritos completamente por usted; más bien, la intención es ejercer el derecho de controlar la distribución de trabajos derivados o colectivos basados ​​en la Biblioteca. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Además, la mera agregación de otro trabajo no basado en la Biblioteca con la Biblioteca (o con un trabajo basado en la Biblioteca) en un volumen de un medio de almacenamiento o distribución no lo hace ponga el otro trabajo bajo el alcance de esta Licencia. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 3. </span> <span style = "font-family: 'sans-serif';"> Puede optar por aplicar los términos de la Licencia Pública General GNU ordinaria en lugar de esta Licencia a una copia dada de la Biblioteca. Para hacer esto, debe modificar todos los avisos que se refieren a esta Licencia, de modo que se refieran a la Licencia Pública General de GNU ordinaria, versión 2, en lugar de a esta Licencia. (Si ha aparecido una versión más nueva que la versión 2 de la Licencia Pública General de GNU ordinaria, puede especificar esa versión si lo desea). No haga ningún otro cambio en estos avisos. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Una vez que se realiza este cambio en una copia dada, es irreversible para esa copia, por lo que la Licencia Pública General GNU ordinaria se aplica a todas las copias subsiguientes y trabajos derivados realizados a partir de esa copia.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Esta opción es útil cuando desea copiar parte del código de la Biblioteca en un programa que no es una biblioteca. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 4. </span> <span style = "font-family: 'sans-serif';"> Puede copiar y distribuir la Biblioteca ( o una parte o derivado de él, en la Sección 2) en código objeto o en forma ejecutable bajo los términos de las Secciones 1 y 2 anteriores, siempre que lo acompañe con el código fuente completo legible por máquina correspondiente, que debe ser distribuido bajo los términos de Las secciones 1 y 2 anteriores en un medio utilizado habitualmente para el intercambio de software. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Si la distribución del código del objeto se realiza ofreciendo acceso a la copia desde un lugar designado, el acceso equivalente para copiar el código fuente desde el mismo lugar satisface el requisito de distribuir la fuente código, aunque los terceros no están obligados a copiar la fuente junto con el código objeto. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 5. </span> <span style = "font-family: 'sans-serif';"> Un programa que no contiene ningún derivado La parte de la Biblioteca, pero está diseñada para trabajar con la Biblioteca al compilarse o vincularse con ella, se denomina trabajo que utiliza la Biblioteca & quot ;. Tal trabajo, de forma aislada, no es un trabajo derivado de la Biblioteca y, por lo tanto, queda fuera del alcance de esta Licencia. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Sin embargo, al vincular un trabajo & quot; que utiliza la Biblioteca & quot; con la Biblioteca crea un ejecutable que es un derivado de la Biblioteca (porque contiene partes de la Biblioteca), en lugar de un trabajo que usa la biblioteca & quot ;. El ejecutable está cubierto por esta Licencia. La Sección 6 establece los términos para la distribución de tales ejecutables.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Cuando un & quot; trabajo que utiliza la Biblioteca & quot; utiliza material de un archivo de encabezado que forma parte de la Biblioteca, el código objeto para el trabajo puede ser un trabajo derivado de la Biblioteca, aunque el código fuente no lo sea. Si esto es cierto es especialmente significativo si el trabajo se puede vincular sin la Biblioteca, o si el trabajo es en sí mismo una biblioteca. El umbral para que esto sea cierto no está definido con precisión por la ley. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Si tal archivo de objeto usa solo parámetros numéricos, estructuras de datos y elementos de acceso, y macros pequeñas y funciones en línea pequeñas (diez líneas o menos de longitud), entonces el uso de el archivo de objeto no está restringido, independientemente de si es legalmente un trabajo derivado. (Los archivos ejecutables que contienen este código de objeto más partes de la Biblioteca aún se incluirán en la Sección 6). </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> De lo contrario, si el trabajo es un derivado de la Biblioteca, puede distribuir el código objeto para el trabajo según los términos de la Sección 6. Cualquier archivo ejecutable que contenga ese trabajo también está incluido en la Sección 6, estén o no vinculados directamente con la propia Biblioteca. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 6. </span> <span style = "font-family: 'sans-serif';"> Como excepción a las Secciones anteriores, también puede combinar o vincular un trabajo & quot; que utiliza la Biblioteca & quot; con la Biblioteca para producir un trabajo que contenga partes de la Biblioteca, y distribuir ese trabajo según los términos que usted elija, siempre que los términos permitan la modificación del trabajo para el uso propio del cliente y la ingeniería inversa para depurar dichas modificaciones.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Debe dar un aviso destacado con cada copia del trabajo que se utiliza en la Biblioteca y que la Biblioteca y su uso están cubiertos por esta Licencia. Debe proporcionar una copia de esta Licencia. Si el trabajo durante la ejecución muestra avisos de derechos de autor, debe incluir entre ellos el aviso de copyright de la Biblioteca, así como una referencia que indique al usuario la copia de esta Licencia. Además, debes hacer una de estas cosas: </span> </p> +<ul style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"> <li style = "font-family: ' sans-serif '; " style = "margin-top: 19px; margin-bottom: 0px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> a) </span> <span style =" font-size: 16px; "> Acompañe el trabajo con el código fuente completo legible por máquina correspondiente para la Biblioteca, incluidos los cambios se utilizaron en el trabajo (que debe distribuirse en las Secciones 1 y 2 anteriores); y, si el trabajo es un ejecutable vinculado con la Biblioteca, con el trabajo completo "legible por máquina" que utiliza la Biblioteca como código de objeto y / o código fuente, para que el usuario pueda modificar la Biblioteca y luego volver a vincular para producir un ejecutable modificado que contiene la biblioteca modificada. (Se entiende que el usuario que cambia el contenido de los archivos de definiciones en la Biblioteca no necesariamente podrá recompilar la aplicación para usar las definiciones modificadas). </span> </li> +<li style = "font-family: 'sans-serif';" style = "margin-top: 0px; margin-bottom: 0px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> b) </span> <span style =" font-size: 16px; "> Use un mecanismo de biblioteca compartida adecuado para enlazar con la Biblioteca. Un mecanismo adecuado es uno que (1) utiliza en tiempo de ejecución una copia de la biblioteca ya presente en el sistema informático del usuario, en lugar de copiar las funciones de la biblioteca en el ejecutable, y (2) funcionará correctamente con una versión modificada de la biblioteca, si el usuario instala uno, siempre que la versión modificada sea compatible con la interfaz con la versión con la que se realizó el trabajo. </span> </li> +<li style = "font-family: 'sans-serif';" style = "margin-top: 0px; margin-bottom: 0px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> c) </span> <span style =" font-size: 16px; "> Acompañe el trabajo con una oferta por escrito, válida por al menos tres años, para dar el mismo usuario los materiales especificados en la subsección 6a, arriba, por un cargo que no supera el costo de realizar esta distribución.</span></li> +<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> Si la distribución del trabajo se realiza ofreciendo acceso a la copia desde un lugar designado, ofrezca un acceso equivalente para copiar los materiales especificados anteriormente desde el mismo lugar. </span> </li> +<li style = "font-family: 'sans-serif';" style = "margin-top: 0px; margin-bottom: 19px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> e) </span> <span style =" font-size: 16px; "> Verifique que el usuario ya haya recibido una copia de estos materiales o que ya haya enviado este usuario es una copia. </span> </li> </ul> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Para un ejecutable, la forma requerida del trabajo & quot; que utiliza la Biblioteca & quot; debe incluir todos los datos y programas de utilidad necesarios para reproducir el ejecutable desde él. Sin embargo, como excepción especial, los materiales a distribuir no necesitan incluir nada que se distribuya normalmente (en forma de fuente o binario) con los componentes principales (compilador, kernel, etc.) del sistema operativo en el que se ejecuta el ejecutable. , a menos que ese componente acompañe al ejecutable. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Puede suceder que este requisito contradiga las restricciones de licencia de otras bibliotecas propietarias que normalmente no acompañan al sistema operativo. Tal contradicción significa que no puede usarlos a ellos y a la Biblioteca juntos en un ejecutable que distribuya.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">7.</span><span style=" font-family:'sans-serif';"> Puede ubicar las instalaciones de la biblioteca que son un trabajo basado en la biblioteca lado a lado en una sola biblioteca junto con otras instalaciones de la biblioteca que no están cubiertas por esta Licencia, y distribuir dicha biblioteca combinada, siempre que la distribución separada del trabajo basada en la Biblioteca y de las demás instalaciones de la biblioteca están permitidas, y siempre que haga estas dos cosas: </span> </p> +<ul style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"> <li style = "font-family: ' sans-serif '; " style = "margin-top: 19px; margin-bottom: 0px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> a) </span> <span style =" font-size: 16px; "> Acompañe la biblioteca combinada con una copia del mismo trabajo basado en la Biblioteca, sin combinar Cualquier otra biblioteca. Esto debe distribuirse según los términos de las Secciones anteriores. </span> </li> +<li style = "font-family: 'sans-serif';" style = "margin-top: 0px; margin-bottom: 19px; margin-left: 38px; margin-right: 19px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font -size: 16px; font-weight: 600; "> b) </span> <span style =" font-size: 16px; "> Dé un aviso destacado a la biblioteca combinada sobre el hecho de que parte de ella se basa en el trabajo en la Biblioteca, y explicando dónde encontrar la forma no combinada que acompaña al mismo trabajo. </span> </li> </ul> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 8. </span> <span style = "font-family: 'sans-serif';"> No puede copiar, modificar, sublicenciar , haga un enlace o distribuya la Biblioteca, excepto lo dispuesto expresamente en esta Licencia. Cualquier intento de copiar, modificar, sublicenciar, vincular o distribuir la Biblioteca de otra manera será nulo y terminará automáticamente sus derechos bajo esta Licencia. Sin embargo, a las partes que hayan recibido copias o derechos de usted bajo esta Licencia no se les dará por terminadas sus licencias siempre y cuando dichas partes sigan cumpliendo con todos los requisitos.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">9.</span><span style=" font-family:'sans-serif';"> No está obligado a aceptar esta Licencia, ya que no la ha firmado. Sin embargo, nada más le otorga permiso para modificar o distribuir la Biblioteca o sus trabajos derivados. Estas acciones están prohibidas por la ley si no acepta esta Licencia. Por lo tanto, al modificar o distribuir la Biblioteca (o cualquier trabajo basado en la Biblioteca), usted indica que acepta esta Licencia para hacerlo, y todos sus términos y condiciones para copiar, distribuir o modificar la Biblioteca o los trabajos basados ​​en ella. < / span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 10. </span> <span style = "font-family: 'sans-serif';"> Cada vez que redistribuya la Biblioteca (o cualquier trabajo basado en la Biblioteca), el destinatario recibe automáticamente una licencia del licenciador original para copiar, distribuir, vincular o modificar la Biblioteca sujeto a estos términos y condiciones. No puede imponer restricciones adicionales al ejercicio de los derechos de los beneficiarios otorgados en este documento. Usted no es responsable de hacer cumplir el cumplimiento de esta Licencia por parte de terceros. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 11. </span> <span style = "font-family: 'sans-serif';"> If, como consecuencia de un tribunal Sentencia o alegación de infracción de patente o por cualquier otro motivo (no limitado a cuestiones de patentes), se le imponen condiciones (ya sea por orden judicial, acuerdo o de otra manera) que contradigan las condiciones de esta Licencia, no lo eximen de las condiciones. de esta Licencia. Si no puede realizar la distribución para satisfacer simultáneamente sus obligaciones bajo esta Licencia y cualquier otra obligación pertinente, como consecuencia, no podrá distribuir la Biblioteca en absoluto. Por ejemplo, si una licencia de patente no permitiera la redistribución de la Biblioteca de todos los que reciben copias directa o indirectamente a través de usted, la única forma en que podría satisfacerla y esta Licencia sería abstenerse totalmente de la distribución de la Biblioteca. Biblioteca. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Si alguna parte de esta sección se considera inválida o inaplicable en cualquier circunstancia particular, se pretende que el resto de la sección se aplique, y la sección en su totalidad se debe aplicar en otras circunstancias</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">No es el propósito de esta sección inducirlo a infringir ninguna patente u otros reclamos de derechos de propiedad o impugnar la validez de dichos reclamos; Esta sección tiene el único propósito de proteger la integridad del sistema de distribución de software libre que se implementa mediante prácticas de licencia pública. Muchas personas han hecho contribuciones generosas a la amplia gama de software distribuido a través de ese sistema, confiando en la aplicación consistente de ese sistema; Depende del autor / donante decidir si está dispuesto a distribuir software a través de cualquier otro sistema y un licenciatario no puede imponer esa elección. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Esta sección pretende aclarar completamente lo que se cree que es una consecuencia del resto de esta Licencia. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 12. </span> <span style = "font-family: 'sans-serif';"> Si la distribución y / o uso de la Biblioteca está restringida en ciertos países ya sea por patentes o por interfaces con derechos de autor, el titular original de los derechos de autor que coloca a la Biblioteca bajo esta Licencia puede agregar una limitación de distribución geográfica explícita excluyendo esos países, de modo que la distribución se permite solo en o entre países no excluidos. . En tal caso, esta Licencia incorpora la limitación como si estuviera escrita en el cuerpo de esta Licencia. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 13. </span> <span style = "font-family: 'sans-serif';"> La Free Software Foundation puede publicar revisados ​​y / o nuevas versiones de la Licencia Pública General Menor de vez en cuando. Estas nuevas versiones serán similares en espíritu a la versión actual, pero pueden diferir en detalle para abordar nuevos problemas o inquietudes. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> A cada versión se le asigna un número de versión distintivo. Si la Biblioteca especifica un número de versión de esta Licencia que se le aplica y & quot; cualquier versión posterior & quot ;, tiene la opción de seguir los términos y condiciones de esa versión o de cualquier versión posterior publicada por la Free Software Foundation. Si la Biblioteca no especifica un número de versión de licencia, puede elegir cualquier versión publicada por la Free Software Foundation.</span></p> +<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">14.</span><span style=" font-family:'sans-serif';"> Si desea incorporar partes de la Biblioteca a otros programas gratuitos cuyas condiciones de distribución son incompatibles con estos, escriba al autor para pedirle permiso. Para el software cuyo copyright es Free Software Foundation, escriba a Free Software Foundation; A veces hacemos excepciones para esto. Nuestra decisión se guiará por los dos objetivos de preservar el estado gratuito de todos los derivados de nuestro software libre y de promover el uso compartido y la reutilización del software en general. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> SIN GARANTÍA </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 15. </span> <span style = "font-family: 'sans-serif';"> PORQUE LA BIBLIOTECA TIENE LICENCIA GRATUITA , NO EXISTE GARANTÍA PARA LA BIBLIOTECA, HASTA EL GRADO PERMITIDO POR LA LEY APLICABLE. EXCEPTO CUANDO OTRA MANERA ESTABLECIDO EN ESCRIBIR LOS TITULARES DEL DERECHO DE AUTOR Y / O OTRAS PARTES PROPORCIONAN LA BIBLIOTECA "COMO ESTÁ" SIN GARANTÍA DE NINGÚN TIPO, YA SEA EXPRESA O IMPLÍCITA, INCLUYENDO, PERO NO LIMITADO A, LAS GARANTÍAS IMPLÍCITAS DE COMERCIABILIDAD Y ADECUACIÓN PARA UN PROPÓSITO PARTICULAR. TODO EL RIESGO EN CUANTO A LA CALIDAD Y EL RENDIMIENTO DE LA BIBLIOTECA ESTÁ CON USTED. DEBE QUE LA BIBLIOTECA PRUEBA DEFECTUOSO, USTED ASUME EL COSTO DE TODO EL SERVICIO, LA REPARACIÓN O LA CORRECCIÓN NECESARIOS. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif'; font-weight: 600;"> 16. </span> <span style = "font-family: 'sans-serif';"> EN NINGÚN CASO, A MENOS QUE ES NECESARIO LA LEY APLICABLE O ESTÁ DE ACUERDO EN ESCRIBIR CUALQUIER RESPONSABLE DE DERECHOS DE AUTOR, O CUALQUIER OTRA PARTE QUE PUEDE MODIFICAR Y / O REDISTRAR LA BIBLIOTECA PERMITIDA ANTERIORMENTE, SERÁ RESPONSABLE DE DAÑOS POR ARCHIVOS, INCLUYENDO DAÑOS GENERALES, ESPECIALES, INCIDENTALES O CONSEQUÍTICOS, DEFECTUIDOS EN EL ARTÍCULO NO SE PUEDE UTILIZAR LA BIBLIOTECA (INCLUYENDO PERO NO LIMITADA A LA PÉRDIDA DE DATOS O LOS DATOS QUE SE RENDIDOS NO PRECISO O PÉRDIDAS SOSTENIDAS POR USTED O TERCERAS PARTES O LA FALTA DE LA BIBLIOTECA PARA OPERAR CON CUALQUIER OTRO SOFTWARE), INCLUSO SI HAY ALGÚN VENDEDOR U OTRA PARTE. AVISO DE LA POSIBILIDAD DE DICHOS DAÑOS.</span></p> +<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">FIN DE LOS TÉRMINOS Y CONDICIONES </span> </p> +<p style = "margin-top: 15px; margin-bottom: 15px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <a name = "SEC4"> </a> <span style = "font-family: 'sans-serif'; font-weight: 600; color: # 333333;"> H </span> <span style = "font-family: 'sans-serif'; font-weight: 600; color: # 333333; "> Cómo aplicar estos términos a sus nuevas bibliotecas </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Si desarrolla una nueva biblioteca y desea que sea de la mayor utilidad posible para el público, le recomendamos que sea un software gratuito que todos puedan redistribuir y cambiar. Puede hacerlo permitiendo la redistribución bajo estos términos (o, alternativamente, bajo los términos de la Licencia Pública General ordinaria). </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> Para aplicar estos términos, adjunte los siguientes avisos a la biblioteca. Es más seguro adjuntarlos al inicio de cada archivo fuente para transmitir de manera más efectiva la exclusión de la garantía; y cada archivo debe tener al menos el & quot; copyright & quot; línea y un puntero donde se encuentra el aviso completo. </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace'; font-style: italic;"> una línea para dar el nombre de la biblioteca y una idea de lo que hace. </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> Copyright (C) </span> <span style = "font-family: 'monospace'; font-style: italic;"> year </span> <span style = " font-family: 'monospace'; "> </span> <span style =" font-family: 'monospace'; font-style: italic; "> nombre del autor </span> </p> +<p style = "- qt -agraph-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; font-family: 'monospace'; font-style: italic; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> Esta biblioteca es software libre; puedes redistribuirlo y / o</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">modifíquelo bajo los términos del Público General Menor GNU </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';">> licencia publicada por la Free Software Foundation; ya sea </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> versión 2.1 de la Licencia, o (a su elección) cualquier versión posterior. </span> </p> +<p style = "- qt -agraph-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; font-family: 'monospace'; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> Esta biblioteca se distribuye con la esperanza de que sea útil, </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> MERCHANTABILITY o FITNESS PARA UN PROPÓSITO PARTICULAR. Ver el GNU </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> Lesser General Public License para más detalles. </span> </p> +<p style = "- qt -agraph-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; font-family: 'monospace'; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> Debería haber recibido una copia del Público General Menor de GNU</span></p> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Licencia junto con esta biblioteca; si no, escriba al Software Libre </span> </p> +<p style = "margin-top: 0px; margin-bottom: 15px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 EE. UU. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> También agregue información sobre cómo contactarlo por correo electrónico y en papel. </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> También debe hacer que su empleador (si trabaja como programador) o su escuela, si corresponde, firme un & quot; renuncia de derechos de autor & quot; para la biblioteca, si es necesario. Aquí hay una muestra; alterar los nombres: </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> Yoyodyne, Inc., por la presente renuncia a todo interés de copyright en </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> la biblioteca `Frob '(una biblioteca para ajustes de mandos) escrita </span> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> por James Random Hacker. </span> </p> +<p style = "- qt -agraph-type: empty; margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent : 0px; font-family: 'monospace'; "> <br /> </p> +<p style = "margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace'; font-style: italic;"> firma de Ty Coon </span> <span style = "font-family: 'monospace';">, 1 de abril de 1990 </span> </ p> +<p style = "margin-top: 0px; margin-bottom: 15px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'monospace';"> Ty Coon, Presidente de Vice </span> </p> +<p style = "margin-top: 19px; margin-bottom: 19px; margin-left: 0px; margin-right: 0px; -qt-block-indent: 0; text-indent: 0px;"> <span style = "font-family: 'sans-serif';"> ¡Eso es todo!</span></p></body></html> LimeReport::AlignmentPropItem - Left - + Izquierda - Right - + Derecha - - Center - + Centro - Justify - + Justificado - Top - + Arriba - Botom - + Abajo - horizontal - + horizontal - vertical - + vertical LimeReport::BandDesignIntf - - DataBand - - - - - DataHeaderBand - - - - - DataFooterBand - - - - - ReportHeader - - - - - ReportFooter - - - - - PageHeader - - - - - PageFooter - - - - - SubDetailBand - - - - - SubDetailHeaderBand - - - - - SubDetailFooterBand - - - - - GroupBandHeader - - - - - GroupBandFooter - - - - - TearOffBand - - - - connected to - + conectado a - Bring to top - + Traer al frente - Send to back - + Enviar al fondo - - Auto height - + Alto automático - - Splittable - + Separable + + + DataBand + Banda de Datos + + + DataHeaderBand + Banda de datos Encabezado + + + DataFooterBand + Banda de datos Pie + + + ReportHeader + Encabezado del reporte + + + ReportFooter + Pie del reporte + + + PageHeader + Encabezado de Página + + + PageFooter + Pie de página + + + SubDetailBand + Banda de Sub detalle + + + SubDetailHeaderBand + Banda de sub detalle Encabezado + + + SubDetailFooterBand + Banda de sub detalle Pie + + + GroupBandHeader + Banda de grupo Encabezado + + + GroupBandFooter + Banda de grupo Pie + + + TearOffBand + Banda de cortado - - Keep bottom space - + Mantener espacio inferior - - - Start from new page - + Cut + Cortar - - - Start new page - + Copy + Copiar + + + Print if empty + Imprimir si está vacío LimeReport::BaseDesignIntf - Copy - + Copiar - Cut - + Cortar - Paste - + Pegar - Bring to top - + Traer al frente - Send to back - + Enviar atras - No borders - + Sin bordes - All borders - + Todos los bordes + + + Create Horizontal Layout + Crear diseño horizontal + + + Create Vertical Layout + Crear diseño vertical LimeReport::ConnectionDesc - - defaultConnection - + Conexión por defecto LimeReport::ConnectionDialog - - Connection - + Conexión - Connection Name - + Nombre de conexión - - Use default application connection - - - - - Driver - - - - Server - + Servidor - - Port - - - - User - + Usuario - Password - + Contraseña - Database - + Base de Datos - - ... - - - - Auto connect - + Auto conectar - - Dont keep credentals in lrxml - - - - Check connection - + Probar conexión - Cancel - + Cancelar - - Ok - - - - - - Error - - - - Connection succsesfully established! - + Conexión establecida satisfactoriamente! - Connection Name is empty - + El Nombre de la conexión esta vacía + + + Driver + + + + ... + + + + Ok + + + + Error + - Connection with name - + Conexión con nombre - - already exists! - + Use default application connection + Utilice la conexión de aplicación predeterminada + + + Dont keep credentals in lrxml + No mantener credentals en el lrxml - defaultConnection - + Conexión por defecto + + + already exists! + ¡ya existe! + + + Port + Puerto LimeReport::DataBand - Data - + Datos + + + Use alternate background color + Usar color de fondo alternativo + + + Keep footer together + Mantener pie de página junto + + + Keep subdetail together + Mantener subdetalles juntos + + + Slice last row + Cortar la última fila + + + Start from new page + Empezar desde nueva página + + + Start new page + Inciar nueva página LimeReport::DataBrowser - - - - Datasources - - - - - Add database connection - - - - - - - - - - - - - - - - - ... - - - - - Add new datasource - - - - - View data - - - - - Change datasource - - - - - Delete datasource - - - - - Show error - - - - - Variables - - - - - Add new variable - - - - - Edit variable - - - - - Delete variable - - - - - Grab variable - - - - - - - Attention - + Atención - - Do you really want to delete "%1" connection? - + Datasources + Orígenes de Datos - - Report variables - + Add database connection + Agregar conexion a base de datos + + + ... + + + + Add new datasource + Agregar origen de datos + + + View data + Ver datos + + + Change datasource + Cambiar origen de datos + + + Delete datasource + Eliminar origen de datos + + + Show error + Mostrar error + + + Variables + + + + Add new variable + Agregar variable + + + Edit variable + Editar variable + + + Delete variable + Borrarvariable - System variables - + Variables del sistema - - External variables - - - - - Do you really want to delete "%1" datasource? - - - - - Do you really want to delete variable "%1"? - - - - Error - + + + + Grab variable + Capturar variable + + + Report variables + Variables de informe + + + External variables + Variables externas + + + Do you really want to delete "%1" connection? + Realmente quieres eliminar la conexión "%1"? + + + Do you really want to delete "%1" datasource? + ¿Realmente quieres eliminar el origen de datos "%1"? + + + Do you really want to delete variable "%1"? + ¿Realmente quieres eliminar la variable "%1"? LimeReport::DataFooterBand - DataFooter - + Pie de datos + + + Print always + Imprimir siempre LimeReport::DataHeaderBand - DataHeader - + Encabezado de datos + + + Reprint on each page + Re-imprimir en cada página + + + Repeat on each row + Repetir en cada fila + + + Print always + Imprimir simpre LimeReport::DataSourceManager - Connection "%1" is not open - + La conexión "%1" no está abierta - Variable "%1" not found! - + ¡No se encontró la variable "%1"! - - - Datasource "%1" not found! - - - - - Connection with name "%1" already exists! - - - - - - - - Datasource with name "%1" already exists! - - - - - Database "%1" not found - - - - invalid connection - + conexión inválida + + + Database "%1" not found + No se encontró la base de datos "%1" + + + Datasource "%1" not found! + ¡Fuente de datos "%1" no encontrada! + + + Connection with name "%1" already exists! + ¡La conexión con el nombre "%1" ya existe! + + + Datasource with name "%1" already exists! + ¡La fuente de datos con nombre "%1" ya existe! + + + Unknown parameter "%1" for variable "%2" found! + Se encontró un parámetro desconocido "%1" para la variable "%2". LimeReport::DataSourceModel - Datasources - + Orígenes de Datos - Variables - + - External variables - + Variables externas + + + + LimeReport::DialogDesignerManager + + Edit Widgets + Editar objeto + + + Widget Box + Caja de objeto + + + Object Inspector + Inspector de objeto + + + Property Editor + Editor de propiedades + + + Signals && Slots Editor + Editor de Señales y eventos + + + Resource Editor + Editor de recursos + + + Action Editor + Editor de acciones LimeReport::EnumPropItem - Default - + Por defecto - Portrait - + Retrato - Landscape - + Apaisado (Horizontal) - NoneAutoWidth - + Sin ancho automático - MaxWordLength - + Max. largo palabra - MaxStringLength - + Max. Largo cadena - TransparentMode - + Modo transparente - OpaqueMode - + Modo opaco - Angle0 - + Angulo 0 - Angle90 - + Angulo 90 - Angle180 - + Angulo 180 - Angle270 - + Angulo 270 - Angle45 - + Angulo 45 - Angle315 - + Angulo 315 - DateTime - + FechaHora - Double - + Doble - NoBrush - + Sin brocha - SolidPattern - + Patrón sólido - Dense1Pattern - + Patrón Denso1 - Dense2Pattern - + Patrón Denso2 - Dense3Pattern - + Patrón Denso3 - Dense4Pattern - + Patrón Denso4 - Dense5Pattern - + Patrón Denso5 - Dense6Pattern - + Patrón Denso6 - Dense7Pattern - + Patrón Denso7 - HorPattern - + Patrón Horizontal - VerPattern - + Patrón Vertical - CrossPattern - + Patrón cruzado - BDiagPattern - + Patrón Diag.B - FDiagPattern - + Patrón Diag.F - LeftToRight - + Izquierda A Derecha - RightToLeft - + Derecha A Izquierda - LayoutDirectionAuto - + Dirección diseño automática - LeftItemAlign - + Alinear objeto a la izquierda - RightItemAlign - + Alinear objeto a la derecha - CenterItemAlign - + Centrar objeto - ParentWidthItemAlign - + Alinear objeto con acho de padre - DesignedItemAlign - + Personalizado - HorizontalLine - + Linea horizontal - VerticalLine - + Linea vertical - Ellipse - + Elipse - Rectangle - + Rectangulo - Page - + Página - Band - + Banda - Horizontal - + - Vertical - + - VerticalUniform - + Vertical uniforme + + + Pie + Pastel + + + VerticalBar + Barra vertical + + + HorizontalBar + Barra horizontal + + + LegendAlignTop + Alinear Leyenda Arriba + + + LegendAlignCenter + Centrar leyenda + + + LegendAlignBottom + Alinear Leyenda Abajo + + + TitleAlignLeft + Alinear titulo a la izquierda + + + TitleAlignRight + Alinear titulo a la derecha + + + TitleAlignCenter + Centrar titulo + + + Layout + Diseño + + + Table + Tabla LimeReport::FlagsPropItem - NoLine - + Sin borde - TopLine - + Borde superior - BottomLine - + Borde inferior - LeftLine - + Borde izquierdo - RightLine - + Borde derecho + + + AllLines + Todos los bordes LimeReport::FontEditorWidget - Font bold - + Negrita - Font Italic - + Cursiva - Font Underline - + Subrayada LimeReport::FontPropItem - bold - + negrita - italic - + cursiva - underline - + subrayada - size - + tamaño - family - + familia LimeReport::GroupBandFooter - GroupFooter - + Pie de grupo LimeReport::GroupBandHeader - GroupHeader - + Encabezado de grupo - Group field not found - + Campo de grupo no encontrado - Datasource "%1" not found! - + ¡Fuente de datos "%1" no encontrada! LimeReport::GroupFunction - Field "%1" not found - + Campo "%1" no encontrado - Variable "%1" not found - + Variable "%1" no encontrada - - Wrong script syntax "%1" - - - - Item "%1" not found - + Objeto "%1" no encontrado + + + Wrong script syntax "%1" + Sintaxis de la secuencia de comandos incorrecta "%1" LimeReport::ImageItem - Image - + Imagen + + + Watermark + Marca de agua + + + Ext. + Ext. LimeReport::ItemLocationPropItem - Band - + Banda - Page - + Página LimeReport::ItemsAlignmentEditorWidget - Bring to top - + Traer al frente - Send to back - + Enviar al fondo - Align to left - + Alinear a la izquierda - Align to right - + Alinear a la derecha - Align to vertical center - + Centrar verticalmente - Align to top - + Alinear arriba - Align to bottom - + Alinear abajo - Align to horizontal center - + Centrar horizontalmente - Set same height - + Fijar mismo alto - Set same width - + Fijar mismo ancho LimeReport::ItemsBordersEditorWidget - Top line - + Linea superior - Bottom line - + Linea inferior - Left line - + Linea izquierda - Right line - + Linea derecha - No borders - + Sin bordes - All borders - + Todos los bordes LimeReport::MasterDetailProxyModel - Field: "%1" not found in "%2" child datasource - + Campo: "%1" no ha encontrado en la fuente de datos secundaria "%2" - Field: "%1" not found in "%2" master datasource - + Campo: "%1" no encontrado en la fuente de datos maestra "%2" LimeReport::ModelToDataSource - model is destroyed - + modelo esta destruido LimeReport::ObjectBrowser - Objects - + Objetos + + + + LimeReport::ObjectInspectorWidget + + Clear + Limpiar + + + Filter + Filtrar + + + + LimeReport::PDFExporter + + Export to PDF + Exportar a PDF LimeReport::PageFooter - Page Footer - + Pie de página + + + Print on first page + Imprimir en primera página + + + Print on last page + Imprimir en última página LimeReport::PageHeader - Page Header - + Encabezado de página LimeReport::PageItemDesignIntf - Paste - + Pegar + + + Page is TOC + Página es TOC + + + Reset page number + Restablecer número de página + + + Full page + Página completa + + + Set page size to printer + Establecer el tamaño de página a la impresora LimeReport::PreviewReportWidget - Form - + Desde - - PDF file name - - - - Report file name - + Nombre del archivo del reporte + + + %1 file name + %1 nombre de archivo LimeReport::PreviewReportWindow - Preview - + Vista previa - View - + Ver - Report - + Reporte - toolBar - + Barra herramientas - Print - + Imprimir - Ctrl+P - + - Zoom In - + Acercar - Zoom Out - + Alejar - - Prior Page - + Página anterior - - Next Page - + Página siguiente - - Close Preview - + Cerrar vista previa - - Esc - - - - Edit Mode - + Modo edición - - Save to file - + Guardar en archivo - - Show errors - + Mostrar errores - First Page - + Primera página - First page - + Primera página - - Last Page - + Ultima página - Print To PDF - + Imprimir en PDF - - Fit page width - - - - - Fit page - - - - - One to one - - - - - Show Toolbar - - - - - Show toolbar - - - - Page: - + Página: - - Font - - - - - Text align - - - - of %1 - + de %1 + + + Fit page width + Ajustar ancho de página + + + Fit page + Ajustar a página + + + One to one + Tamaño real + + + Font + Fuente + + + Text align + Alinear texto + + + Esc + + + + Show Toolbar + Mostrar barra herramientas + + + Show toolbar + Mostrar barra herramientas + + + toolBar_2 + barra herramientas_2 + + + InsertTextItem + Insertar objeto de texto + + + Add new TextItem + Agregar nuevo objeto de texto + + + Selection Mode + Modo de selección + + + Delete Item + Eliminar objeto + + + Del + Supr LimeReport::ProxyHolder - Datasource has been invalidated - + Fuente de datos ha sido invalidada LimeReport::QObjectPropertyModel - leftMargin - + Margen izquierdo - rightMargin - + Margen derecho - topMargin - + Margen superior - bottomMargin - + Margen inferior - objectName - + Nombre del objeto - borders - + Bordes - geometry - + geometria - itemAlign - + Alineación del objeto - pageOrientation - + Orientación de la página - pageSize - + Tamaño de página - TopLine - + Linea superior - BottomLine - + Linea inferior - LeftLine - + Linea izquierda - RightLine - + Linea derecha - reprintOnEachPage - + Re-imprimir en cada página - borderLineSize - + Grosor de borde - autoHeight - + Alto automático - backgroundColor - + Color de fondo - - columnCount - + Cantidad de columnas - columnsFillDirection - + Dirección llenado columnas - datasource - + fuente de datos - keepBottomSpace - + Conservar espacio inferior - keepFooterTogether - + Mantener pie junto - keepSubdetailTogether - + Mantener sub-detalle junto - printIfEmpty - + imprimir si está vacío - sliceLastRow - + cortar la última fila - splittable - + Separable - alignment - + Alineación - angle - + Angulo - autoWidth - + Ancho automático - backgroundMode - + Modo de fondo - backgroundOpacity - + Opacidad de fondo - content - + contenido - font - + fuente - fontColor - + Color de fuente - foregroundOpacity - + opacidad de primer plano - itemLocation - + Ubicación del objeto - margin - + margen - stretchToMaxHeight - + estirar a la altura máxima - trimValue - + Recortar Valor - lineWidth - + Ancho de linea - opacity - + opacidad - penStyle - + estilo de pluma - shape - + forma - shapeBrush - + forma del pincel - shapeBrushColor - + forma del pincel color - - gridStep - - - - - fullPage - - - - - oldPrintMode - - - - - borderColor - - - - - resetPageNumber - - - - - alternateBackgroundColor - - - - - - backgroundBrushStyle - - - - - startFromNewPage - - - - - startNewPage - - - - - adaptFontToSize - - - - - allowHTML - - - - - allowHTMLInFields - - - - - followTo - - - - - format - - - - - lineSpacing - - - - - textIndent - - - - - textLayoutDirection - - - - - underlineLineSize - - - - - underlines - - - - - valueType - - - - - securityLevel - - - - - testValue - - - - - whitespace - - - - - resourcePath - - - - - scale - - - - - cornerRadius - - - - - shapeColor - - - - - layoutType - - - - - barcodeType - - - - - barcodeWidth - - - - - foregroundColor - - - - - inputMode - - - - - pdf417CodeWords - - - - - autoSize - - - - - center - - - - - field - - - - - image - - - - - keepAspectRatio - - - - - columnsCount - - - - - useAlternateBackgroundColor - - - - - printBeforePageHeader - - - - - maxScalePercent - - - - - printOnFirstPage - - - - - printOnLastPage - - - - - printAlways - - - - - repeatOnEachRow - - - - - condition - - - - - groupFieldName - - - - - keepGroupTogether - - - - Property Name - + Propiedad - Property value - + Valor - Warning - + Advertencia + + + gridStep + Distancia en rejilla + + + fullPage + Página completa + + + oldPrintMode + Modo de impresión viejo + + + borderColor + Color de borde + + + resetPageNumber + Restablecer número de página + + + alternateBackgroundColor + Color de fondo alternativo + + + backgroundBrushStyle + Estilo de bocha de fondo + + + startFromNewPage + Empezar desde nueva página + + + startNewPage + empezar nueva página + + + adaptFontToSize + adaptar fuente al tamaño + + + allowHTML + Permitir HTML + + + allowHTMLInFields + permitir HTML en campos + + + followTo + Permitir hasta + + + format + formato + + + lineSpacing + Espaciado entre líneas + + + textIndent + sangría de texto + + + textLayoutDirection + Dirección del diseño del texto + + + underlineLineSize + grosor del subrayado + + + underlines + subrayar + + + valueType + Tipo de valor + + + securityLevel + nivel seguridad + + + testValue + valor de prueba + + + whitespace + espacio en blanco + + + resourcePath + ruta de recursos + + + scale + escala + + + cornerRadius + radio de esquina + + + shapeColor + color de la forma + + + layoutType + tipo de diseño + + + barcodeType + tipo código barrras + + + barcodeWidth + ancho código barras + + + foregroundColor + color de primer plano + + + inputMode + modo de entrada + + + pdf417CodeWords + palabras del código pdf417 + + + autoSize + tamaño automático + + + center + centrado + + + field + campo + + + image + imagen + + + keepAspectRatio + mantener la relación de aspecto + + + columnsCount + recuento de columnas + + + useAlternateBackgroundColor + usar color de fondo alternativo + + + printBeforePageHeader + imprimir antes del encabezado de página + + + maxScalePercent + porcentaje máximo de escala + + + printOnFirstPage + Imprimir en la primera página + + + printOnLastPage + Imprimir en la última página + + + printAlways + imprimir siempre + + + repeatOnEachRow + repetir en cada fila + + + condition + condición + + + groupFieldName + nombre del grupo de campos + + + keepGroupTogether + mantener grupo junto + + + endlessHeight + altura sin fin + + + extendedHeight + alto extendido + + + isExtendedInDesignMode + es el modo de diseño extendido + + + pageIsTOC + la página es TOC + + + setPageSizeToPrinter + ajsutar tamaño de página a la impresora + + + fillInSecondPass + completar segundo paso + + + chartTitle + Titulo del gráfico + + + chartType + tipo gráfico + + + drawLegendBorder + dibujar borde de leyenda + + + labelsField + campo de etiquetas + + + legendAlign + Alinear leyenda + + + series + series + + + titleAlign + alinear titulo + + + watermark + marca de agua + + + keepTopSpace + conservar espacio superior + + + printable + imprimible + + + variable + + + + replaceCRwithBR + reemplazar CR con BR + + + hideIfEmpty + ocultar si está vacío + + + hideEmptyItems + ocultar objetos vacíos + + + useExternalPainter + utilizar pintor externo + + + layoutSpacing + espaciado de diseño + + + printerName + nombre impresora + + + fontLetterSpacing + espaciado entre letra y fuente LimeReport::RectMMPropItem - - - width - + ancho - - - height - + alto LimeReport::RectPropItem - width - + ancho - height - + alto LimeReport::ReportDesignWidget - - Script - - - - Report file name - + Nombre de archivo del reporte + + + Script + - Error - + - Wrong file format - + Formato de archivo incorrecto + + + Translations + Traducciones LimeReport::ReportDesignWindow - - New Report - - - - - New Report Page - - - - - Delete Report Page - - - - - Edit Mode - - - - - Undo - - - - - Redo - - - - - Copy - - - - - Paste - - - - - Cut - - - - - Settings - - - - - Use grid - - - - - Use magnet - - - - - Text Item - - - - - Save Report - - - - - Save Report As - - - - - Load Report - - - - - Delete item - - - - - Zoom In - - - - - Zoom Out - - - - - Render Report - - - - - Edit layouts mode - - - - - Horizontal layout - - - - About - + Acerca de - - Hide left panel - + New Report + Nuevo Reporte - - Hide right panel - + Edit Mode + Modo de edición + + + Undo + Deshacer + + + Redo + Rehacer + + + Copy + Copiar + + + Paste + Pegar + + + Cut + Cortar + + + Settings + Configuración + + + Use grid + Usar cuadricula + + + Use magnet + Usar Imán + + + Text Item + Elemento de texto + + + Save Report + Guardar Reporte + + + Save Report As + Guardar reporte como + + + Load Report + Cargar Reporte + + + Delete item + Eliminar elemento + + + Zoom In + Acercarse + + + Zoom Out + Alejarse + + + Render Report + Generar reporte + + + Edit layouts mode + Modo de edición de diseño + + + Horizontal layout + Diseño horizontal - Report Tools - + Herramientas de reporte - Main Tools - + Herramientas principales - Font - + Fuente - Text alignment - + Alineación del texto - Items alignment - + Alineación de elementos - Borders - + Bordes - Report bands - + Bandas del reporte - Report Header - + Encabezado del reporte - Report Footer - + Pie del Reporte - Page Header - + Encabezado de página - Page Footer - + Pie de página - Data - + Datos - Data Header - + Encabezado de Datos - Data Footer - + Pie de Datos - SubDetail - + Sub-Detalle - SubDetailHeader - + Encabezado de Sub-Detalle - SubDetailFooter - + Pie de Sub-Detalle - GroupHeader - + Encabezado de grupo - GroupFooter - + Pie de Grupo - - Tear-off Band - - - - File - + Archivo - Edit - + Editar - Info - + Información - Recent Files - + Archivos recientes - Object Inspector - + Inspector de objectos - Report structure - + Estructura del reporte - Data Browser - + Navegador de datos - - Script Browser - - - - - Report has been modified! Do you want save the report? - - - - - Report file name - + Nombre de archivo del reporte - Rendering report - + Generando reporte - Abort - + Abortar - page rendered - + página generada - Warning - + Advertencia - File "%1" not found! - + ¡No se encontró el archivo "%1"! + + + New Report Page + Nueva página para el reporte + + + Delete Report Page + Eliminar página del reporte + + + Script Browser + Navegador de Script + + + Tear-off Band + Banda de corte + + + Delete dialog + Eliminar dialogo + + + Add new dialog + Agregar nuevo dialogo + + + Widget Box + Caja de Widget + + + Property Editor + Editor de propiedades + + + Action Editor + Editor de acción + + + Resource Editor + Editor de recursos + + + SignalSlot Editor + Editor de señales + + + Dialog Designer Tools + Herramientas de diseño de Dialogos + + + Report has been modified! Do you want save the report? + ¡El reporte ha sido modificado! ¿Quieres guardar el reporte? + + + Hide left panel | Alt+L + Ocultar panel izquierdo | Alt + L + + + Hide right panel | Alt+R + Ocultar panel derecho | Alt + L + + + Vertical layout + Diseño vertical LimeReport::ReportEnginePrivate - - Preview - - - - Error - + + + + Preview + Vista previa - Report File Change - + Repore cambios en archivo - The report file "%1" has changed names or been deleted. This preview is no longer valid. - + El archivo del informe "%1" ha cambiado los nombres o se ha eliminado. + +Esta vista previa ya no es válida. + + + Language %1 already exists + El idioma %1 ya existe + + + Designer not found! + Diseñador no encontrado! + + + %1 file name + Nombre de archivo %1 LimeReport::ReportFooter - Report Footer - + Pie reporte LimeReport::ReportHeader - Report Header - + Encabezado reporte LimeReport::ReportRender - - - - Error - + - - page index out of range - - - - Databand "%1" not found - + Banda de datos "%1" no encontrada - Wrong using function %1 - + Error al utilizar la función %1 + + + page index out of range + índice de página fuera de rango LimeReport::SQLEditDialog - - Datasource - - - - Connection - + Conexión - - Datasource Name - - - - - Subdetail - - - - - Master datasource - - - - - Subquery mode - - - - - Filter mode - - - - - SQL - - - - - - Preview - - - - - Hide Preview - - - - - Child datasource - - - - - Fields map - - - - - - ... - - - - - Data preview - - - - Cancel - + Cancelar - - Ok - - - - - Error - - - - - Datasource Name is empty! - - - - - SQL is empty! - - - - - Datasource with name: "%1" already exists! - - - - - defaultConnection - - - - - Datasource with name %1 already exist - - - - - Attention - + Atención + + + Datasource + Fuente de datos + + + Datasource Name + Nombre de fuente de datos + + + Subdetail + Sub-detalle + + + Master datasource + Fuente de datos primaria + + + Subquery mode + Modo de sub consulta + + + Filter mode + Modo de filtrado + + + SQL + SQL + + + Preview + Vista previa + + + Hide Preview + Ocultar vista previa + + + Child datasource + Fuente de datos hija + + + Fields map + Mapa de campos + + + ... + + + + Data preview + Vista previa de datos + + + Ok + Aceptar + + + Error + + + + Datasource with name %1 already exist + La fuente de datos con el nombre %1 ya existe - Connection is not specified - + La conexión no está especificada - Refresh - + Refrescar + + + defaultConnection + Conexión por defecto + + + Datasource Name is empty! + Nombre de la fuente de datos está vacío! + + + SQL is empty! + SQL está vacío! + + + Datasource with name: "%1" already exists! + Fuente de datos con nombre: "%1" ya existe! + + + CSV + + + + Separator + Separador + + + ; + + + + Use first row as header + Usa la primera fila como encabezado LimeReport::ScriptBrowser - Form - + De - Functions - + Funciones - - - - - - ... - + - Dialogs - + Dialogos - Type - + Tipo - Name - + Nombre - NO CATEGORY - + NO CATEGORIA - - - Error - + - Dialog with name: %1 already exists - + Diálogo con nombre: %1 ya existe - ui file must cointain QDialog instead QWidget or QMainWindow - + El archivo ui debe contener QDialog en lugar de QWidget o QMainWindow - wrong file format - + formato de archivo incorrecto + + + + LimeReport::ScriptEditor + + Form + De + + + Data + Datos + + + Functions + Funciones LimeReport::ScriptEngineContext - Dialog with name: %1 can`t be created - + Diálogo con nombre: %1 no puede ser creado + + + Error + LimeReport::ScriptEngineManager - - GROUP FUNCTIONS - - - - - - - - - - - Value - + Valor - - BandName - + Nombre de banda - - Variable %1 not found - - - - - SYSTEM - - - - - - - NUMBER - - - - - - - - Format - + Formato - Precision - + Precisión - - Locale - + Idioma - - - - - - - DATE&TIME - - - - - Seconds - - - - CurrencySymbol - + Símbolo de moneda - - - - GENERAL - + Variable %1 not found + Variable %1 no encontrada - - - Name - + Nombre + + + GROUP FUNCTIONS + Funciones de grupo + + + FieldName + Nombre campo + + + Field %1 not found in %2! + ¡El campo %1 no se encuentra en %2! + + + SYSTEM + SISTEMA + + + NUMBER + NUMEROS + + + DATE&TIME + FECHA Y HORA + + + GENERAL + + + + Datasource + Fuente datos + + + ValueField + Valor campo + + + KeyField + Campo clave + + + KeyFieldValue + Valor campo clave + + + Unique identifier + Identificador único + + + Content + Contenido + + + Indent + Sangrar + + + datasourceName + Nombre de fuente de datos + + + Function manager with name "%1" already exists! + ¡El administrador de funciones con el nombre "%1" ya existe! + + + RowIndex + Índice de fila LimeReport::SettingDialog - Designer setting - + Configuración de diseñador - - Designer Setting - - - - Default font - + Fuente predeterminada - Grid - + Cuadrícula - Vertical grid step - + Espaciado de rejilla vertical - Horizontal grid step - + Espaciado de rejilla horizontal - - Report Setting - - - - Suppress absent fields and variables warning - + Suprimir campos ausentes y variables de advertencia. + + + Use dark theme + Usar tema oscuro + + + Language + Idioma + + + Designer settings + Configuracion del diseñador + + + Script editor settings + Configuracion del editor de scripts + + + Font + Fuente + + + Indent size + Tamaño de sangría + + + Report settings + Configuración de informes LimeReport::SubDetailBand - SubDetail - + Sub-Detalle LimeReport::SubDetailHeaderBand - SubDetailHeader - + Encabezado sub-detalle LimeReport::TearOffBand - Tear-off Band - + Banda de corte LimeReport::TextAlignmentEditorWidget - Text align left - + Alinear texto a la izquierda - - Text align center - + Centrar texto - Text align right - + Alinear texto a la derecha - Text align justify - + Justificar texto - Text align top - + Alinear texto arriba - Text align bottom - + Alinear texto abajo LimeReport::TextItem - - Edit - + Editar - - Auto height - + Altura automática - - Allow HTML - + Permitir HTML - - Allow HTML in fields - + Permitir HTML en los campos - - Stretch to max height - + Estirar a la altura máxima - - Error - + - TextItem " %1 " already has folower " %2 " - + Objeto de texto "%1" ya tiene el siguiente "%2" + + + Transparent + Transparente - TextItem " %1 " not found! - + Objeto de texto "%1" no encontrado! + + + Watermark + Marca de agua + + + Hide if empty + Ocultar si está vacío LimeReport::TextItemEditor - - Text Item Editor - - - - - Content - - - - - Data - - - - - Functions - - - - - Editor settings - - - - - Editor font - - - - - ... - - - - - Ok - - - - - Ctrl+Return - - - - Cancel - + Cancelar + + + Text Item Editor + Editor de objeto de texto + + + Content + Contenido + + + Ok + Aceptar + + + Ctrl+Return + Ctrl+Intro - Esc - + + + + + LimeReport::TranslationEditor + + Form + De + + + Languages + Idiomas + + + ... + + + + Pages + Páginas + + + Strings + Cadenas + + + Source Text + Texto fuente + + + Translation + Traducción + + + Checked + Revisada + + + Report Item + Objeto del reporte + + + Property + Propiedad + + + Source text + Texto fuente LimeReport::VariablesHolder - - - - variable with name - + variable con el nombre - already exists! - + ¡ya existe! - - - does not exists! - + no existe! QObject - - - Data - + Datos - - DataHeader - + Encabezado datos - - DataFooter - + Pie datos - - GroupHeader - + Encabezado grupo - - GroupFooter - + Pie grupo - - - Page Footer - + Pie de página - - - Page Header - + Encabezado de página - - Report Footer - + Pie de reporte - - Report Header - + Cabezado de reporte - - - SubDetail - + Sub-Detalle - - SubDetailHeader - + Encabezado sub-detalle - - SubDetailFooter - + Pie sub-detalle - - - Tear-off Band - - - - - alignment - + alineación - - Barcode Item - + Objeto código barras - - HLayout - + diseño horizontal - - Image Item - + Objeto Imagen - - Shape Item - + Objeto de forma - - itemLocation - + Ubicación del objeto - - Text Item - + Objeto de texto - - Invalid connection! %1 - + ¡Conexión inválida! %1 - - Master datasource "%1" not found! - - - - Master datasouce "%1" not found! - + No se encontró la fuente de datos maestra "%1"! - Child - + Hijo - and child - + y hijo - datasouce "%1" not found! - + fuente de datos "%1" no encontrada! - - - bool - - - - - - QColor - - - - - - content - - - - - - - - datasource - - - - - - - - field - - - - - - enum - - - - - - flags - - - - - - QFont - - - - - - QImage - - - - - - int - - - - - - - - qreal - - - - - - QRect - - - - - - QRectF - - - - - - geometry - - - - - - QString - - - - Attention! - + ¡Atención! - Selected elements have different parent containers - + Los elementos seleccionados tienen diferentes contenedores padre - - Object with name %1 already exists! - - - - Function %1 not found or have wrong arguments - + La función %1 no se encuentra o tiene argumentos incorrectos + + + bool + + + + QColor + + + + content + contenido + + + datasource + fuente datos + + + field + campo + + + enum + enumerar + + + flags + opciones + + + QFont + + + + QImage + + + + int + + + + qreal + + + + QRect + + + + QRectF + + + + geometry + geometria - mm - + - - Wrong file format - + QString + - File %1 not opened - + Archivo %1 no abierto - Content string is empty - + La cadena de contenido está vacía - Content is empty - + El contenido esta vacio + + + Wrong file format + Formato de archivo incorrecto + + + Tear-off Band + Banda de corte + + + Chart Item + Objeto gráfico + + + First + Primero + + + Second + Segundo + + + Thrid + Tercero + + + Master datasource "%1" not found! + ¡No se encontró la fuente de datos maestra "%1"! + + + Object with name %1 already exists! + ¡El objeto con nombre %1 ya existe! + + + Datasource manager not found + Administrador de fuente de datos no encontrado + + + Export to PDF + Exportar a PDF + + + VLayout + Diseño vertical diff --git a/translations/limereport_es_ES.ts b/translations/limereport_es_ES.ts deleted file mode 100644 index 2dd6548..0000000 --- a/translations/limereport_es_ES.ts +++ /dev/null @@ -1,2919 +0,0 @@ - - - - - $ClassName$ - - $ClassName$ - - - - - ChartItemEditor - - Series - - - - Add - - - - Delete - - - - Name - Nombre - - - Values field - - - - Color - - - - Type - Tipo - - - Labels field - - - - Ok - - - - Series editor - - - - Series name - - - - - LRVariableDialog - - Variable - Variable - - - Name - Nombre - - - Value - Valor - - - Type - Tipo - - - Attention - Atención - - - Mandatory - - - - - LanguageSelectDialog - - Dialog - - - - Language - - - - - LimeReport::AboutDialog - - About - Acerca de - - - Author - Autor - - - License - Licencia - - - Close - Cerrar - - - Lime Report - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> - - - - Version 1.1.1 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600;">G</span><span style=" font-family:'sans-serif'; font-weight:600;">NU LESSER GENERAL PUBLIC LICENSE</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Version 2.1, February 1999</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Everyone is permitted to copy and distribute verbatim copies</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">of this license document, but changing it is not allowed.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">[This is the first released version of the Lesser GPL. It also counts</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> as the successor of the GNU Library Public License, version 2, hence</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> the version number 2.1.]</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600;">P</span><span style=" font-family:'sans-serif'; font-weight:600;">reamble</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">0.</span><span style=" font-family:'sans-serif';"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">1.</span><span style=" font-family:'sans-serif';"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">2.</span><span style=" font-family:'sans-serif';"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif';">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">3.</span><span style=" font-family:'sans-serif';"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">4.</span><span style=" font-family:'sans-serif';"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">5.</span><span style=" font-family:'sans-serif';"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">6.</span><span style=" font-family:'sans-serif';"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">7.</span><span style=" font-family:'sans-serif';"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">8.</span><span style=" font-family:'sans-serif';"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">9.</span><span style=" font-family:'sans-serif';"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">10.</span><span style=" font-family:'sans-serif';"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">11.</span><span style=" font-family:'sans-serif';"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">12.</span><span style=" font-family:'sans-serif';"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">13.</span><span style=" font-family:'sans-serif';"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">14.</span><span style=" font-family:'sans-serif';"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">NO WARRANTY</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">15.</span><span style=" font-family:'sans-serif';"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">16.</span><span style=" font-family:'sans-serif';"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">END OF TERMS AND CONDITIONS</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">one line to give the library's name and an idea of what it does.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic;">year</span><span style=" font-family:'monospace';"> </span><span style=" font-family:'monospace'; font-style:italic;">name of author</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is free software; you can redistribute it and/or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">modify it under the terms of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License as published by the Free Software Foundation; either</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">version 2.1 of the License, or (at your option) any later version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is distributed in the hope that it will be useful,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Lesser General Public License for more details.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">You should have received a copy of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License along with this library; if not, write to the Free Software</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Also add information on how to contact you by electronic and paper mail.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">the library `Frob' (a library for tweaking knobs) written</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">by James Random Hacker.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">signature of Ty Coon</span><span style=" font-family:'monospace';">, 1 April 1990</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Ty Coon, President of Vice</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">That's all there is to it!</span></p></body></html> - - - - - LimeReport::AlignmentPropItem - - Left - Izquierda - - - Right - Derecha - - - Center - Centro - - - Justify - Justificado - - - Top - Arriba - - - Botom - Abajo - - - horizontal - horizontal - - - vertical - vertical - - - - LimeReport::BandDesignIntf - - connected to - conectado a - - - Bring to top - - - - Send to back - - - - Auto height - - - - Splittable - - - - DataBand - - - - DataHeaderBand - - - - DataFooterBand - - - - ReportHeader - - - - ReportFooter - - - - PageHeader - - - - PageFooter - - - - SubDetailBand - - - - SubDetailHeaderBand - - - - SubDetailFooterBand - - - - GroupBandHeader - - - - GroupBandFooter - - - - TearOffBand - - - - Keep bottom space - - - - Start from new page - - - - Start new page - - - - Keep top space - - - - - LimeReport::BaseDesignIntf - - Copy - - - - Cut - - - - Paste - - - - Bring to top - - - - Send to back - - - - No borders - - - - All borders - - - - Create Horizontal Layout - - - - - LimeReport::ConnectionDesc - - defaultConnection - - - - - LimeReport::ConnectionDialog - - Connection - Conexión - - - Connection Name - Nombre de conexión - - - Server - Servidor - - - User - Usuario - - - Password - Contraseña - - - Database - Base de Datos - - - Auto connect - Auto conectar - - - Check connection - Probar conexión - - - Cancel - Cancelar - - - Connection succsesfully established! - Conexión establecida satisfactoriamente! - - - Connection Name is empty - El Nombre de la conexión esta vacía - - - Driver - - - - ... - - - - Ok - - - - Error - - - - Connection with name - - - - Use default application connection - - - - Dont keep credentals in lrxml - - - - defaultConnection - - - - already exists! - - - - Port - - - - - LimeReport::DataBand - - Data - Datos - - - Use alternate background color - - - - - LimeReport::DataBrowser - - Attention - Atención - - - Datasources - Orígenes de Datos - - - Add database connection - Agregar conexion a base de datos - - - ... - - - - Add new datasource - Agregar origen de datos - - - View data - Ver datos - - - Change datasource - Cambiar origen de datos - - - Delete datasource - Eliminar origen de datos - - - Show error - Mostrar error - - - Variables - - - - Add new variable - Agregar variable - - - Edit variable - Editar variable - - - Delete variable - Borrarvariable - - - System variables - Variables del sistema - - - Error - - - - Grab variable - - - - Report variables - - - - External variables - - - - Do you really want to delete "%1" connection? - - - - Do you really want to delete "%1" datasource? - - - - Do you really want to delete variable "%1"? - - - - - LimeReport::DataFooterBand - - DataFooter - - - - - LimeReport::DataHeaderBand - - DataHeader - - - - - LimeReport::DataSourceManager - - Connection "%1" is not open - - - - Variable "%1" not found! - - - - invalid connection - - - - Database "%1" not found - - - - Datasource "%1" not found! - - - - Connection with name "%1" already exists! - - - - Datasource with name "%1" already exists! - - - - - LimeReport::DataSourceModel - - Datasources - Orígenes de Datos - - - Variables - - - - External variables - - - - - LimeReport::DialogDesignerManager - - Edit Widgets - - - - Widget Box - - - - Object Inspector - - - - Property Editor - - - - Signals && Slots Editor - - - - Resource Editor - - - - Action Editor - - - - - LimeReport::EnumPropItem - - Default - - - - Portrait - - - - Landscape - - - - NoneAutoWidth - - - - MaxWordLength - - - - MaxStringLength - - - - TransparentMode - - - - OpaqueMode - - - - Angle0 - - - - Angle90 - - - - Angle180 - - - - Angle270 - - - - Angle45 - - - - Angle315 - - - - DateTime - - - - Double - - - - NoBrush - - - - SolidPattern - - - - Dense1Pattern - - - - Dense2Pattern - - - - Dense3Pattern - - - - Dense4Pattern - - - - Dense5Pattern - - - - Dense6Pattern - - - - Dense7Pattern - - - - HorPattern - - - - VerPattern - - - - CrossPattern - - - - BDiagPattern - - - - FDiagPattern - - - - LeftToRight - - - - RightToLeft - - - - LayoutDirectionAuto - - - - LeftItemAlign - - - - RightItemAlign - - - - CenterItemAlign - - - - ParentWidthItemAlign - - - - DesignedItemAlign - - - - HorizontalLine - - - - VerticalLine - - - - Ellipse - - - - Rectangle - - - - Page - - - - Band - - - - Horizontal - - - - Vertical - - - - VerticalUniform - - - - Pie - - - - VerticalBar - - - - HorizontalBar - - - - LegendAlignTop - - - - LegendAlignCenter - - - - LegendAlignBottom - - - - TitleAlignLeft - - - - TitleAlignRight - - - - TitleAlignCenter - - - - - LimeReport::FlagsPropItem - - NoLine - - - - TopLine - - - - BottomLine - - - - LeftLine - - - - RightLine - - - - AllLines - - - - - LimeReport::FontEditorWidget - - Font bold - - - - Font Italic - - - - Font Underline - - - - - LimeReport::FontPropItem - - bold - - - - italic - - - - underline - - - - size - - - - family - - - - - LimeReport::GroupBandFooter - - GroupFooter - - - - - LimeReport::GroupBandHeader - - GroupHeader - - - - Group field not found - - - - Datasource "%1" not found! - - - - - LimeReport::GroupFunction - - Field "%1" not found - - - - Variable "%1" not found - - - - Item "%1" not found - - - - Wrong script syntax "%1" - - - - - LimeReport::ImageItem - - Image - - - - Watermark - - - - - LimeReport::ItemLocationPropItem - - Band - - - - Page - - - - - LimeReport::ItemsAlignmentEditorWidget - - Bring to top - - - - Send to back - - - - Align to left - - - - Align to right - - - - Align to vertical center - - - - Align to top - - - - Align to bottom - - - - Align to horizontal center - - - - Set same height - - - - Set same width - - - - - LimeReport::ItemsBordersEditorWidget - - Top line - - - - Bottom line - - - - Left line - - - - Right line - - - - No borders - - - - All borders - - - - - LimeReport::MasterDetailProxyModel - - Field: "%1" not found in "%2" child datasource - - - - Field: "%1" not found in "%2" master datasource - - - - - LimeReport::ModelToDataSource - - model is destroyed - - - - - LimeReport::ObjectBrowser - - Objects - - - - - LimeReport::PageFooter - - Page Footer - - - - Print on first page - - - - Print on last page - - - - - LimeReport::PageHeader - - Page Header - - - - - LimeReport::PageItemDesignIntf - - Paste - - - - Page is TOC - - - - Reset page number - - - - Full page - - - - Set page size to printer - - - - - LimeReport::PreviewReportWidget - - Form - - - - PDF file name - - - - Report file name - - - - - LimeReport::PreviewReportWindow - - Preview - - - - View - - - - Report - - - - toolBar - - - - Print - - - - Ctrl+P - - - - Zoom In - - - - Zoom Out - - - - Prior Page - - - - Next Page - - - - Close Preview - - - - Edit Mode - - - - Save to file - - - - Show errors - - - - First Page - - - - First page - - - - Last Page - - - - Print To PDF - - - - Page: - - - - of %1 - - - - Fit page width - - - - Fit page - - - - One to one - - - - Font - - - - Text align - - - - Esc - - - - Show Toolbar - - - - Show toolbar - - - - - LimeReport::ProxyHolder - - Datasource has been invalidated - - - - - LimeReport::QObjectPropertyModel - - leftMargin - - - - rightMargin - - - - topMargin - - - - bottomMargin - - - - objectName - - - - borders - - - - geometry - - - - itemAlign - - - - pageOrientation - - - - pageSize - - - - TopLine - - - - BottomLine - - - - LeftLine - - - - RightLine - - - - reprintOnEachPage - - - - borderLineSize - - - - autoHeight - - - - backgroundColor - - - - columnCount - - - - columnsFillDirection - - - - datasource - - - - keepBottomSpace - - - - keepFooterTogether - - - - keepSubdetailTogether - - - - printIfEmpty - - - - sliceLastRow - - - - splittable - - - - alignment - - - - angle - - - - autoWidth - - - - backgroundMode - - - - backgroundOpacity - - - - content - - - - font - - - - fontColor - - - - foregroundOpacity - - - - itemLocation - - - - margin - - - - stretchToMaxHeight - - - - trimValue - - - - lineWidth - - - - opacity - - - - penStyle - - - - shape - - - - shapeBrush - - - - shapeBrushColor - - - - Property Name - - - - Property value - - - - Warning - - - - gridStep - - - - fullPage - - - - oldPrintMode - - - - borderColor - - - - resetPageNumber - - - - alternateBackgroundColor - - - - backgroundBrushStyle - - - - startFromNewPage - - - - startNewPage - - - - adaptFontToSize - - - - allowHTML - - - - allowHTMLInFields - - - - followTo - - - - format - - - - lineSpacing - - - - textIndent - - - - textLayoutDirection - - - - underlineLineSize - - - - underlines - - - - valueType - - - - securityLevel - - - - testValue - - - - whitespace - - - - resourcePath - - - - scale - - - - cornerRadius - - - - shapeColor - - - - layoutType - - - - barcodeType - - - - barcodeWidth - - - - foregroundColor - - - - inputMode - - - - pdf417CodeWords - - - - autoSize - - - - center - - - - field - - - - image - - - - keepAspectRatio - - - - columnsCount - - - - useAlternateBackgroundColor - - - - printBeforePageHeader - - - - maxScalePercent - - - - printOnFirstPage - - - - printOnLastPage - - - - printAlways - - - - repeatOnEachRow - - - - condition - - - - groupFieldName - - - - keepGroupTogether - - - - endlessHeight - - - - extendedHeight - - - - isExtendedInDesignMode - - - - pageIsTOC - - - - setPageSizeToPrinter - - - - fillInSecondPass - - - - chartTitle - - - - chartType - - - - drawLegendBorder - - - - labelsField - - - - legendAlign - - - - series - - - - titleAlign - - - - watermark - - - - keepTopSpace - - - - printable - - - - variable - - - - - LimeReport::RectMMPropItem - - width - - - - height - - - - - LimeReport::RectPropItem - - width - - - - height - - - - - LimeReport::ReportDesignWidget - - Report file name - - - - Script - - - - Error - - - - Wrong file format - - - - Translations - - - - - LimeReport::ReportDesignWindow - - About - Acerca de - - - New Report - - - - Edit Mode - - - - Undo - - - - Redo - - - - Copy - - - - Paste - - - - Cut - - - - Settings - - - - Use grid - - - - Use magnet - - - - Text Item - - - - Save Report - - - - Save Report As - - - - Load Report - - - - Delete item - - - - Zoom In - - - - Zoom Out - - - - Render Report - - - - Edit layouts mode - - - - Horizontal layout - - - - Report Tools - - - - Main Tools - - - - Font - - - - Text alignment - - - - Items alignment - - - - Borders - - - - Report bands - - - - Report Header - - - - Report Footer - - - - Page Header - - - - Page Footer - - - - Data - Datos - - - Data Header - - - - Data Footer - - - - SubDetail - - - - SubDetailHeader - - - - SubDetailFooter - - - - GroupHeader - - - - GroupFooter - - - - File - - - - Edit - - - - Info - - - - Recent Files - - - - Object Inspector - - - - Report structure - - - - Data Browser - - - - Report file name - - - - Rendering report - - - - Abort - - - - page rendered - - - - Warning - - - - File "%1" not found! - - - - New Report Page - - - - Delete Report Page - - - - Script Browser - - - - Tear-off Band - - - - Delete dialog - - - - Add new dialog - - - - Widget Box - - - - Property Editor - - - - Action Editor - - - - Resource Editor - - - - SignalSlot Editor - - - - Dialog Designer Tools - - - - Report has been modified! Do you want save the report? - - - - Hide left panel | Alt+L - - - - Hide right panel | Alt+R - - - - - LimeReport::ReportEnginePrivate - - Error - - - - Preview - - - - Report File Change - - - - The report file "%1" has changed names or been deleted. - -This preview is no longer valid. - - - - Language %1 already exists - - - - Designer not found! - - - - - LimeReport::ReportFooter - - Report Footer - - - - - LimeReport::ReportHeader - - Report Header - - - - - LimeReport::ReportRender - - Error - - - - Databand "%1" not found - - - - Wrong using function %1 - - - - page index out of range - - - - - LimeReport::SQLEditDialog - - Connection - Conexión - - - Cancel - Cancelar - - - Attention - Atención - - - Datasource - - - - Datasource Name - - - - Subdetail - - - - Master datasource - - - - Subquery mode - - - - Filter mode - - - - SQL - - - - Preview - - - - Hide Preview - - - - Child datasource - - - - Fields map - - - - ... - - - - Data preview - - - - Ok - - - - Error - - - - Datasource with name %1 already exist - - - - Connection is not specified - - - - Refresh - - - - defaultConnection - - - - Datasource Name is empty! - - - - SQL is empty! - - - - Datasource with name: "%1" already exists! - - - - - LimeReport::ScriptBrowser - - Form - - - - Functions - - - - ... - - - - Dialogs - - - - Type - Tipo - - - Name - Nombre - - - NO CATEGORY - - - - Error - - - - Dialog with name: %1 already exists - - - - ui file must cointain QDialog instead QWidget or QMainWindow - - - - wrong file format - - - - - LimeReport::ScriptEditor - - Form - - - - Data - Datos - - - Functions - - - - - LimeReport::ScriptEngineContext - - Dialog with name: %1 can`t be created - - - - Error - - - - - LimeReport::ScriptEngineManager - - Value - Valor - - - BandName - - - - Format - - - - Precision - - - - Locale - - - - CurrencySymbol - - - - Variable %1 not found - Variable %1 no encontrada - - - Name - Nombre - - - GROUP FUNCTIONS - - - - FieldName - - - - Field %1 not found in %2! - - - - SYSTEM - - - - NUMBER - - - - DATE&TIME - - - - GENERAL - - - - Datasource - - - - ValueField - - - - KeyField - - - - KeyFieldValue - - - - Unique identifier - - - - Content - - - - Indent - - - - datasourceName - - - - Function manager with name "%1" already exists! - - - - - LimeReport::SettingDialog - - Designer setting - - - - Default font - - - - Grid - - - - Vertical grid step - - - - Horizontal grid step - - - - Designer Setting - - - - Report Setting - - - - Suppress absent fields and variables warning - - - - Use dark theme - - - - Language - - - - - LimeReport::SubDetailBand - - SubDetail - - - - - LimeReport::SubDetailHeaderBand - - SubDetailHeader - - - - - LimeReport::TearOffBand - - Tear-off Band - - - - - LimeReport::TextAlignmentEditorWidget - - Text align left - - - - Text align center - - - - Text align right - - - - Text align justify - - - - Text align top - - - - Text align bottom - - - - - LimeReport::TextItem - - Edit - - - - Auto height - - - - Allow HTML - - - - Allow HTML in fields - - - - Stretch to max height - - - - Error - - - - TextItem " %1 " already has folower " %2 " - - - - Transparent - - - - TextItem " %1 " not found! - - - - Watermark - - - - - LimeReport::TextItemEditor - - Cancel - Cancelar - - - Text Item Editor - - - - Content - - - - Editor settings - - - - Editor font - - - - ... - - - - Ok - - - - Ctrl+Return - - - - Esc - - - - - LimeReport::TranslationEditor - - Form - - - - Languages - - - - ... - - - - Pages - - - - Strings - - - - Source Text - - - - Translation - - - - Checked - - - - Report Item - - - - Property - - - - Source text - - - - - LimeReport::VariablesHolder - - variable with name - variable con el nombre - - - already exists! - - - - does not exists! - - - - - QObject - - Data - Datos - - - DataHeader - - - - DataFooter - - - - GroupHeader - - - - GroupFooter - - - - Page Footer - - - - Page Header - - - - Report Footer - - - - Report Header - - - - SubDetail - - - - SubDetailHeader - - - - SubDetailFooter - - - - alignment - - - - Barcode Item - - - - HLayout - - - - Image Item - - - - Shape Item - - - - itemLocation - - - - Text Item - - - - Invalid connection! %1 - - - - Master datasouce "%1" not found! - - - - Child - - - - and child - - - - datasouce "%1" not found! - - - - Attention! - - - - Selected elements have different parent containers - - - - Function %1 not found or have wrong arguments - - - - bool - - - - QColor - - - - content - - - - datasource - - - - field - - - - enum - - - - flags - - - - QFont - - - - QImage - - - - int - - - - qreal - - - - QRect - - - - QRectF - - - - geometry - - - - mm - - - - QString - - - - File %1 not opened - - - - Content string is empty - - - - Content is empty - - - - Wrong file format - - - - Tear-off Band - - - - Chart Item - - - - First - - - - Second - - - - Thrid - - - - Master datasource "%1" not found! - - - - Object with name %1 already exists! - - - - Datasource manager not found - - - - From 89e899e66014fa626601de9b02351a664077dc93 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 29 May 2019 23:03:22 +0300 Subject: [PATCH 316/347] es_ES changed to es --- limereport/limereport.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/limereport.pro b/limereport/limereport.pro index c4963e1..1407b72 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -112,7 +112,7 @@ INSTALLS += target ####Automatically build required translation files (*.qm) contains(CONFIG,build_translations){ - LANGUAGES = ru es_ES ar fr zh pl + LANGUAGES = ru es ar fr zh pl defineReplace(prependAll) { for(a,$$1):result += $$2$${a}$$3 From 48f4c6c1d3d6d544dcbbd61a4a8c90dab107946e Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 30 May 2019 20:36:43 +0300 Subject: [PATCH 317/347] limereport_es_ES.qm removed --- translations/limereport_es_ES.qm | Bin 6052 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 translations/limereport_es_ES.qm diff --git a/translations/limereport_es_ES.qm b/translations/limereport_es_ES.qm deleted file mode 100644 index 176f1c23a596f2ff3e376f890d7c977100627782..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6052 zcmc&&ZERat8GfDEiQ_tno1|OYm2zU%RD#(~ST+gQ4NL57O-b4`Ni$f-=(T+k-{tyV z_uk_=S;Q}d7*qeDRiF*QCJ@t*n9u-G#Fu~yZ2}3wr2axfEuisZLlZ>^CIrv9*B{qT zYTt+-B#KXb?|I+%dB2|Xk@|lA;Ol>V{@GuT9{I_|7k>2n8KSNrQQ!j6zI%u!28ene zamMf`i7s3u>Uov?FTFq%9&^V1Z#d)dMQ1#4jshQg1M|ixaOwe)KhF4~GY-AwjKj}S z;HMmKC#&NPXB>vyYd?eiTlC1)Ul4Uy$NkUH+y*cNmgw|@&l35wH2(pkbS*q_izxE3t{=Sk zccOtmbp7-Cb?E&{_ea^+i3Y#se{4*LzLfvUE3o4q^M7&fhls~-opI=KXB_#m|M|y& zH}D1jH!r}>$W8yXFusSr<^ORA@e6J`g5S9E z0Onr^zI+SM_nis;VkMhpgf5RDv4ulWAi+qek!&h&ggWf-f-}{aacn|d#UVQ@i4h{U}Ux;(> z_TVqCeirfC9=!E|YtVOGB|5O(4UJ(sLk1NoOD1uY2ZD(|{~4vod-2a;x}cb1PVnMv zUKNJvlQKbCA(cvGH0G~tmF_%0LenIOlTJCv{f+dxT;H@1ToGrm1Y3RSK%$F{`BHc#@S&9;=v2=>+?9C3sbwR7Vk;lA_lw+dfsHJ_xAMscBQy*|f$t6(}(g5KKorO8+;&=n4H( z%0tUM@M?pGe8+zo+G6NmyW=aY+{c}!U(X5UsZ;=UJuj`AcXPT}^K~~>OLsgTml8+Z5@|;t zipbTMhwDwnS^zcLB#b6AYH+-%jiBEYyInZeGk4GRq!m5KHE(K;(xR+CyOd3YrxvnJ z#NEAwN74nJ+o(aTuH>DamnfYav?>fWg5?eAz3wfH!*6Zy4mQ-Y+AgOv+=pov!DPEy zl0n`PA3Wi9|H*fkF(XHByGra}3ks%Mj2BD7ZphAX7F(m|GM5EVS=lP;S{k?TDQUn0 z5l9#|i{rb3U7tfUoJQ+ybgv7TRnFxsZmpFyZHsYBU}L6Q1)d-EmY2gc10xoU*lP|x zGd2{1th%{iMuA$zq45rWH?>($##ApmbhsC>z^rLHYt~+*y3THRb9tni7fIcY>+iaf z9$Zu`t74dWZ^|OHjM$l|9+^t_(%Xw|7o4}5se>P2q5(ROER+FAa%N)<@SnFl1rRDi zyQI!9QztzcaWkEKDEaXYtk|^J+jC8$0vPtf_Yeqi9UwVACD`Vsl57E%#-ChW-DM@~ zTvm0XtnQx9=UKj5S}okv7D9Xn1jHRtTen-KR>wOH4oQPLuh>Q{qip7O?rmD#Wjkz1 zo{-iQxQHgMcS)qC{c`nqB*Wg;53fhAwo2mmN+QpO5|Ye^w_xnYp;2Gwdx=Gq&ceXk z)i_J$ti^gKXY7-KbYg6E48*ui+$y+EMg8o_iwxJe*pnAWz<4r5_Ey(s{oS%TSXJyf znMdJ69{A;6MP}hnWzsLt=*+X)!?Ylq25KF=a>bI^;X%FfLdylC!g!4|+m_1*?IX0y z<9Zh5%4xv?X^SHjjjdK>dCS7Sw+^~PLYtO=zS?C$2O;#z5THrtWKp$pMc=Ag?c0vU z^uJW;J*_OcY_r6Ik>{Gte%_90N8M_iql~i^eH2Gtqhf1n%hp~Lcx8`6ZZON|=4Ji4 zHn^U4q8@a3+9!6<)8Q7WSvqH`B{Ab#nc7?@b&zbEi-S$^v#q+W**ZXe|1QEhE>ZY` zqATmwCAIyvmM0Y--qF^Kj?n~qNe5L((vU}UnInft&|!7@I8bX*c5H&_hQK{hS+}=8 zo=kfxpr)hQ3T}H^ZY%F= Date: Thu, 30 May 2019 20:38:48 +0300 Subject: [PATCH 318/347] Spanish translation has been updated --- translations/limereport_es.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/translations/limereport_es.ts b/translations/limereport_es.ts index 3ed4a16..5123997 100644 --- a/translations/limereport_es.ts +++ b/translations/limereport_es.ts @@ -2054,6 +2054,14 @@ p, li { white-space: pre-wrap; } fontLetterSpacing espaciado entre letra y fuente + + hideText + Ocultar texto + + + option3 + Opción3 + LimeReport::RectMMPropItem @@ -2770,7 +2778,7 @@ Esta vista previa ya no es válida. Use dark theme - Usar tema oscuro + Usar tema oscuro Language @@ -2796,6 +2804,10 @@ Esta vista previa ya no es válida. Report settings Configuración de informes + + Theme + Tema + LimeReport::SubDetailBand @@ -3211,5 +3223,9 @@ Esta vista previa ya no es válida. VLayout Diseño vertical + + Default + Por defecto + From b929ac308baf00a396d01b75ad462c09a66a22a3 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 2 Jun 2019 09:34:42 +0300 Subject: [PATCH 319/347] Translation build has been changed --- limereport/limereport.pro | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/limereport/limereport.pro b/limereport/limereport.pro index 1407b72..d1ac03d 100644 --- a/limereport/limereport.pro +++ b/limereport/limereport.pro @@ -119,7 +119,7 @@ contains(CONFIG,build_translations){ return($$result) } - TRANSLATIONS = $$prependAll(LANGUAGES, \"$$TRANSLATIONS_PATH/limereport_,.ts\") + TRANSLATIONS = $$prependAll(LANGUAGES, $$TRANSLATIONS_PATH/limereport_,.ts) qtPrepareTool(LUPDATE, lupdate) @@ -133,7 +133,7 @@ lessThan(QT_MAJOR_VERSION, 5){ qtPrepareTool(LRELEASE, lrelease) for(tsfile, TRANSLATIONS) { qmfile = $$tsfile - qmfile ~= s,".ts\"$",".qm\"", + qmfile ~= s,".ts$",".qm", qm.commands += $$LRELEASE -removeidentical $$tsfile -qm $$qmfile $$escape_expand(\\n\\t) tmp_command = $$LRELEASE -removeidentical $$tsfile -qm $$qmfile $$escape_expand(\\n\\t) TRANSLATIONS_FILES += $$qmfile From cff2b379d4d00ba68bead6f6127d554624172dc1 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Mon, 3 Jun 2019 19:25:10 +0300 Subject: [PATCH 320/347] Themes have been changed --- .../dark_style_sheet/qdarkstyle/style.qss | 24 +++++++++++-- .../qlightstyle/lightstyle.qss | 34 +++++++++++++++++-- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 1c2fa3a..44d1983 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -349,6 +349,11 @@ QLineEdit color: #eff0f1; } +QLineEdit[text=""] +{ + color: #fff; +} + QLineEdit:disabled{ color: #858585; } @@ -976,7 +981,6 @@ QTabBar QToolButton::right-arrow:disabled { image: url(:/qss_qdark_icons/rc/left_arrow_disabled.png); } - QDockWidget { background: #383838; border: 1px solid #403F3F; @@ -989,15 +993,31 @@ QDockWidget::title{ padding-left: 5px; padding-top: 4px; margin-top: 4px; + icon-size: 16px; } - QDockWidget::close-button, QDockWidget::float-button { border: 1px solid transparent; border-radius: 2px; background: transparent; } +QDockWidget::close-button { + subcontrol-position: top right; + subcontrol-origin: margin; + position: absolute; + top: 4px; left: 0px; bottom: 0px; right: 2px; + width: 16px; +} + +QDockWidget::float-button { + subcontrol-position: top right; + subcontrol-origin: margin; + position: absolute; + top: 4px; left: 0px; bottom: 0px; right: 18px; + width: 16px; +} + QDockWidget::close-button:hover, QDockWidget::float-button:hover { \\ background: rgba(255, 255, 255, 10); } diff --git a/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss b/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss index 61af1cb..223d324 100644 --- a/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss +++ b/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss @@ -349,6 +349,11 @@ QLineEdit color: #000; } +QLineEdit[text=""] +{ + color:#000; +} + QLineEdit:disabled{ color: #858585; } @@ -1007,21 +1012,44 @@ QDockWidget { titlebar-normal-icon: url(:/qss_qlight_icons/rc/transparent.png); } -QDockWidget::title{ +\\QDockWidget::title{ \\ background: #f0f0f0; - background-color: #d2d2d2; +\\ background-color: #d2d2d2; +\\ padding-left: 5px; +\\ padding-top: 4px; +\\ margin-top: 4px; +\\} + +QDockWidget::title{ + background: #f0f0f0; padding-left: 5px; padding-top: 4px; margin-top: 4px; + icon-size: 16px; } - QDockWidget::close-button, QDockWidget::float-button { border: 1px solid transparent; border-radius: 2px; background: transparent; } +QDockWidget::close-button { + subcontrol-position: top right; + subcontrol-origin: margin; + position: absolute; + top: 4px; left: 0px; bottom: 0px; right: 2px; + width: 16px; +} + +QDockWidget::float-button { + subcontrol-position: top right; + subcontrol-origin: margin; + position: absolute; + top: 4px; left: 0px; bottom: 0px; right: 18px; + width: 16px; +} + QDockWidget::close-button:hover, QDockWidget::float-button:hover { \\ background: rgba(255, 255, 255, 10); \\ background-color: #fff; From b3d19d3a67b143495d01804efd8831e5f9624b3d Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Mon, 3 Jun 2019 22:30:50 +0300 Subject: [PATCH 321/347] Printing prepared pages has been added --- include/lrreportengine.h | 1 + limereport/lrreportengine.cpp | 11 +++++++++++ limereport/lrreportengine.h | 1 + limereport/lrreportengine_p.h | 1 + 4 files changed, 14 insertions(+) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index 07fcf91..c36d7bb 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -206,6 +206,7 @@ public: IPreparedPages* preparedPages(); bool showPreparedPages(PreviewHints hints = PreviewBarsUserSetting); bool prepareReportPages(); + bool printPreparedPages(); signals: void cleared(); void renderStarted(); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 6442f68..6f189c7 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -996,6 +996,11 @@ bool ReportEnginePrivate::prepareReportPages() return !m_preparedPages.isEmpty(); } +bool ReportEnginePrivate::printPreparedPages() +{ + return printPages(m_preparedPages, 0); +} + Qt::LayoutDirection ReportEnginePrivate::previewLayoutDirection() { return m_previewLayoutDirection; @@ -1633,6 +1638,12 @@ bool ReportEngine::prepareReportPages() return d->prepareReportPages(); } +bool ReportEngine::printPreparedPages() +{ + Q_D(ReportEngine); + return d->printPreparedPages(); +} + void ReportEngine::setShowProgressDialog(bool value) { Q_D(ReportEngine); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index 07fcf91..c36d7bb 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -206,6 +206,7 @@ public: IPreparedPages* preparedPages(); bool showPreparedPages(PreviewHints hints = PreviewBarsUserSetting); bool prepareReportPages(); + bool printPreparedPages(); signals: void cleared(); void renderStarted(); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 47cf6c3..82a7bd4 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -247,6 +247,7 @@ public: IPreparedPages* preparedPages(); bool showPreparedPages(PreviewHints hints); bool prepareReportPages(); + bool printPreparedPages(); signals: void pagesLoadFinished(); void datasourceCollectionLoadFinished(const QString& collectionName); From 1377a8b25220344184dcf9a4343815db74ddecae Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 7 Jun 2019 00:27:28 +0300 Subject: [PATCH 322/347] Redundant translations have been deleted --- limereport/limereport_ar.ts | 3724 -------------------------------- limereport/limereport_es_ES.ts | 3724 -------------------------------- limereport/limereport_fr.ts | 3724 -------------------------------- limereport/limereport_ru.ts | 3724 -------------------------------- limereport/limereport_zh.ts | 3724 -------------------------------- 5 files changed, 18620 deletions(-) delete mode 100644 limereport/limereport_ar.ts delete mode 100644 limereport/limereport_es_ES.ts delete mode 100644 limereport/limereport_fr.ts delete mode 100644 limereport/limereport_ru.ts delete mode 100644 limereport/limereport_zh.ts diff --git a/limereport/limereport_ar.ts b/limereport/limereport_ar.ts deleted file mode 100644 index d860324..0000000 --- a/limereport/limereport_ar.ts +++ /dev/null @@ -1,3724 +0,0 @@ - - - - - ChartItemEditor - - - Series editor - - - - - Series - - - - - Add - - - - - Delete - - - - - Name - - - - - Values field - - - - - Color - - - - - Type - - - - - Labels field - - - - - Ok - - - - - Series name - - - - - LRVariableDialog - - - Variable - - - - - Name - - - - - Value - - - - - Type - - - - - Mandatory - - - - - Attention - - - - - LanguageSelectDialog - - - Dialog - - - - - Language - - - - - LimeReport::AboutDialog - - - About - - - - - Lime Report - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - - - - - Author - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> - - - - - License - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600;">G</span><span style=" font-family:'sans-serif'; font-weight:600;">NU LESSER GENERAL PUBLIC LICENSE</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Version 2.1, February 1999</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Everyone is permitted to copy and distribute verbatim copies</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">of this license document, but changing it is not allowed.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">[This is the first released version of the Lesser GPL. It also counts</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> as the successor of the GNU Library Public License, version 2, hence</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> the version number 2.1.]</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600;">P</span><span style=" font-family:'sans-serif'; font-weight:600;">reamble</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">0.</span><span style=" font-family:'sans-serif';"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">1.</span><span style=" font-family:'sans-serif';"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">2.</span><span style=" font-family:'sans-serif';"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif';">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">3.</span><span style=" font-family:'sans-serif';"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">4.</span><span style=" font-family:'sans-serif';"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">5.</span><span style=" font-family:'sans-serif';"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">6.</span><span style=" font-family:'sans-serif';"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">7.</span><span style=" font-family:'sans-serif';"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">8.</span><span style=" font-family:'sans-serif';"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">9.</span><span style=" font-family:'sans-serif';"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">10.</span><span style=" font-family:'sans-serif';"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">11.</span><span style=" font-family:'sans-serif';"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">12.</span><span style=" font-family:'sans-serif';"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">13.</span><span style=" font-family:'sans-serif';"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">14.</span><span style=" font-family:'sans-serif';"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">NO WARRANTY</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">15.</span><span style=" font-family:'sans-serif';"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">16.</span><span style=" font-family:'sans-serif';"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">END OF TERMS AND CONDITIONS</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">one line to give the library's name and an idea of what it does.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic;">year</span><span style=" font-family:'monospace';"> </span><span style=" font-family:'monospace'; font-style:italic;">name of author</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is free software; you can redistribute it and/or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">modify it under the terms of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License as published by the Free Software Foundation; either</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">version 2.1 of the License, or (at your option) any later version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is distributed in the hope that it will be useful,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Lesser General Public License for more details.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">You should have received a copy of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License along with this library; if not, write to the Free Software</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Also add information on how to contact you by electronic and paper mail.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">the library `Frob' (a library for tweaking knobs) written</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">by James Random Hacker.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">signature of Ty Coon</span><span style=" font-family:'monospace';">, 1 April 1990</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Ty Coon, President of Vice</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">That's all there is to it!</span></p></body></html> - - - - - Close - - - - - Version 1.1.1 - - - - - LimeReport::AlignmentPropItem - - - Left - - - - - Right - - - - - - Center - - - - - Justify - - - - - Top - - - - - Botom - - - - - horizontal - - - - - vertical - - - - - LimeReport::BandDesignIntf - - - DataBand - - - - - DataHeaderBand - - - - - DataFooterBand - - - - - ReportHeader - - - - - ReportFooter - - - - - PageHeader - - - - - PageFooter - - - - - SubDetailBand - - - - - SubDetailHeaderBand - - - - - SubDetailFooterBand - - - - - GroupBandHeader - - - - - GroupBandFooter - - - - - TearOffBand - - - - - connected to - - - - - Bring to top - - - - - Send to back - - - - - - Auto height - - - - - - Splittable - - - - - - Keep bottom space - - - - - - Keep top space - - - - - - Start from new page - - - - - - Start new page - - - - - LimeReport::BaseDesignIntf - - - Copy - - - - - Cut - - - - - Paste - - - - - Bring to top - - - - - Send to back - - - - - Create Horizontal Layout - - - - - No borders - - - - - All borders - - - - - LimeReport::ConnectionDesc - - - - defaultConnection - - - - - LimeReport::ConnectionDialog - - - - Connection - - - - - Connection Name - - - - - Use default application connection - - - - - Driver - - - - - Server - - - - - Port - - - - - User - - - - - Password - - - - - Database - - - - - ... - - - - - Auto connect - - - - - Dont keep credentals in lrxml - - - - - Check connection - - - - - Cancel - - - - - Ok - - - - - - Error - - - - - Connection succsesfully established! - - - - - Connection Name is empty - - - - - Connection with name - - - - - already exists! - - - - - defaultConnection - - - - - LimeReport::DataBand - - - Data - - - - - - Use alternate background color - - - - - LimeReport::DataBrowser - - - - - Datasources - - - - - Add database connection - - - - - - - - - - - - - - - - - ... - - - - - Add new datasource - - - - - View data - - - - - Change datasource - - - - - Delete datasource - - - - - Show error - - - - - Variables - - - - - Add new variable - - - - - Edit variable - - - - - Delete variable - - - - - Grab variable - - - - - - - - Attention - - - - - Do you really want to delete "%1" connection? - - - - - Report variables - - - - - System variables - - - - - External variables - - - - - Do you really want to delete "%1" datasource? - - - - - Do you really want to delete variable "%1"? - - - - - Error - - - - - LimeReport::DataFooterBand - - - DataFooter - - - - - LimeReport::DataHeaderBand - - - DataHeader - - - - - LimeReport::DataSourceManager - - - Connection "%1" is not open - - - - - Variable "%1" not found! - - - - - - Datasource "%1" not found! - - - - - Connection with name "%1" already exists! - - - - - - - - Datasource with name "%1" already exists! - - - - - Database "%1" not found - - - - - invalid connection - - - - - LimeReport::DataSourceModel - - - Datasources - - - - - Variables - - - - - External variables - - - - - LimeReport::DialogDesignerManager - - - Edit Widgets - - - - - Widget Box - - - - - Object Inspector - - - - - Property Editor - - - - - Signals && Slots Editor - - - - - Resource Editor - - - - - Action Editor - - - - - LimeReport::EnumPropItem - - - Default - - - - - Portrait - - - - - Landscape - - - - - NoneAutoWidth - - - - - MaxWordLength - - - - - MaxStringLength - - - - - TransparentMode - - - - - OpaqueMode - - - - - Angle0 - - - - - Angle90 - - - - - Angle180 - - - - - Angle270 - - - - - Angle45 - - - - - Angle315 - - - - - DateTime - - - - - Double - - - - - NoBrush - - - - - SolidPattern - - - - - Dense1Pattern - - - - - Dense2Pattern - - - - - Dense3Pattern - - - - - Dense4Pattern - - - - - Dense5Pattern - - - - - Dense6Pattern - - - - - Dense7Pattern - - - - - HorPattern - - - - - VerPattern - - - - - CrossPattern - - - - - BDiagPattern - - - - - FDiagPattern - - - - - LeftToRight - - - - - RightToLeft - - - - - LayoutDirectionAuto - - - - - LeftItemAlign - - - - - RightItemAlign - - - - - CenterItemAlign - - - - - ParentWidthItemAlign - - - - - DesignedItemAlign - - - - - HorizontalLine - - - - - VerticalLine - - - - - Ellipse - - - - - Rectangle - - - - - Page - - - - - Band - - - - - Horizontal - - - - - Vertical - - - - - VerticalUniform - - - - - Pie - - - - - VerticalBar - - - - - HorizontalBar - - - - - LegendAlignTop - - - - - LegendAlignCenter - - - - - LegendAlignBottom - - - - - TitleAlignLeft - - - - - TitleAlignRight - - - - - TitleAlignCenter - - - - - LimeReport::FlagsPropItem - - - NoLine - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - AllLines - - - - - LimeReport::FontEditorWidget - - - Font bold - - - - - Font Italic - - - - - Font Underline - - - - - LimeReport::FontPropItem - - - bold - - - - - italic - - - - - underline - - - - - size - - - - - family - - - - - LimeReport::GroupBandFooter - - - GroupFooter - - - - - LimeReport::GroupBandHeader - - - GroupHeader - - - - - Group field not found - - - - - Datasource "%1" not found! - - - - - LimeReport::GroupFunction - - - Field "%1" not found - - - - - Variable "%1" not found - - - - - Wrong script syntax "%1" - - - - - Item "%1" not found - - - - - LimeReport::ImageItem - - - - Watermark - - - - - Image - - - - - LimeReport::ItemLocationPropItem - - - Band - - - - - Page - - - - - LimeReport::ItemsAlignmentEditorWidget - - - Bring to top - - - - - Send to back - - - - - Align to left - - - - - Align to right - - - - - Align to vertical center - - - - - Align to top - - - - - Align to bottom - - - - - Align to horizontal center - - - - - Set same height - - - - - Set same width - - - - - LimeReport::ItemsBordersEditorWidget - - - Top line - - - - - Bottom line - - - - - Left line - - - - - Right line - - - - - No borders - - - - - All borders - - - - - LimeReport::MasterDetailProxyModel - - - Field: "%1" not found in "%2" child datasource - - - - - Field: "%1" not found in "%2" master datasource - - - - - LimeReport::ModelToDataSource - - - model is destroyed - - - - - LimeReport::ObjectBrowser - - - Objects - - - - - LimeReport::PageFooter - - - Page Footer - - - - - - Print on first page - - - - - - Print on last page - - - - - LimeReport::PageHeader - - - Page Header - - - - - LimeReport::PageItemDesignIntf - - - Paste - - - - - - Page is TOC - - - - - - Reset page number - - - - - - Full page - - - - - - Set page size to printer - - - - - LimeReport::PreviewReportWidget - - - Form - - - - - PDF file name - - - - - Report file name - - - - - LimeReport::PreviewReportWindow - - - Preview - - - - - View - - - - - Report - - - - - toolBar - - - - - Print - - - - - Ctrl+P - - - - - Zoom In - - - - - Zoom Out - - - - - - Prior Page - - - - - - Next Page - - - - - - Close Preview - - - - - Esc - - - - - Edit Mode - - - - - - Save to file - - - - - - Show errors - - - - - First Page - - - - - First page - - - - - - Last Page - - - - - Print To PDF - - - - - Fit page width - - - - - Fit page - - - - - One to one - - - - - Show Toolbar - - - - - Show toolbar - - - - - Page: - - - - - Font - - - - - Text align - - - - - of %1 - - - - - LimeReport::ProxyHolder - - - Datasource has been invalidated - - - - - LimeReport::QObjectPropertyModel - - - leftMargin - - - - - rightMargin - - - - - topMargin - - - - - bottomMargin - - - - - objectName - - - - - borders - - - - - geometry - - - - - itemAlign - - - - - pageOrientation - - - - - pageSize - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - reprintOnEachPage - - - - - borderLineSize - - - - - autoHeight - - - - - backgroundColor - - - - - - columnCount - - - - - columnsFillDirection - - - - - datasource - - - - - keepBottomSpace - - - - - keepFooterTogether - - - - - keepSubdetailTogether - - - - - printIfEmpty - - - - - sliceLastRow - - - - - splittable - - - - - alignment - - - - - angle - - - - - autoWidth - - - - - backgroundMode - - - - - backgroundOpacity - - - - - content - - - - - font - - - - - fontColor - - - - - foregroundOpacity - - - - - itemLocation - - - - - margin - - - - - stretchToMaxHeight - - - - - trimValue - - - - - lineWidth - - - - - opacity - - - - - penStyle - - - - - shape - - - - - shapeBrush - - - - - shapeBrushColor - - - - - gridStep - - - - - fullPage - - - - - oldPrintMode - - - - - borderColor - - - - - resetPageNumber - - - - - alternateBackgroundColor - - - - - - backgroundBrushStyle - - - - - startFromNewPage - - - - - startNewPage - - - - - adaptFontToSize - - - - - allowHTML - - - - - allowHTMLInFields - - - - - followTo - - - - - format - - - - - lineSpacing - - - - - textIndent - - - - - textLayoutDirection - - - - - underlineLineSize - - - - - underlines - - - - - valueType - - - - - securityLevel - - - - - testValue - - - - - whitespace - - - - - resourcePath - - - - - scale - - - - - cornerRadius - - - - - shapeColor - - - - - layoutType - - - - - barcodeType - - - - - barcodeWidth - - - - - foregroundColor - - - - - inputMode - - - - - pdf417CodeWords - - - - - autoSize - - - - - center - - - - - field - - - - - image - - - - - keepAspectRatio - - - - - columnsCount - - - - - useAlternateBackgroundColor - - - - - printBeforePageHeader - - - - - maxScalePercent - - - - - printOnFirstPage - - - - - printOnLastPage - - - - - printAlways - - - - - repeatOnEachRow - - - - - condition - - - - - groupFieldName - - - - - keepGroupTogether - - - - - endlessHeight - - - - - extendedHeight - - - - - isExtendedInDesignMode - - - - - pageIsTOC - - - - - setPageSizeToPrinter - - - - - fillInSecondPass - - - - - chartTitle - - - - - chartType - - - - - drawLegendBorder - - - - - labelsField - - - - - legendAlign - - - - - series - - - - - titleAlign - - - - - watermark - - - - - keepTopSpace - - - - - printable - - - - - variable - - - - - - Warning - - - - - The language will change after the application is restarted - - - - - Property Name - - - - - Property value - - - - - LimeReport::RectMMPropItem - - - - - width - - - - - - - height - - - - - LimeReport::RectPropItem - - - width - - - - - height - - - - - LimeReport::ReportDesignWidget - - - Script - - - - - Translations - - - - - Report file name - - - - - Error - - - - - Wrong file format - - - - - LimeReport::ReportDesignWindow - - - New Report - - - - - New Report Page - - - - - Delete Report Page - - - - - Edit Mode - - - - - Undo - - - - - Redo - - - - - Copy - - - - - Paste - - - - - Cut - - - - - Settings - - - - - Use grid - - - - - Use magnet - - - - - Text Item - - - - - Save Report - - - - - Save Report As - - - - - Load Report - - - - - Delete item - - - - - Zoom In - - - - - Zoom Out - - - - - Render Report - - - - - Edit layouts mode - - - - - Horizontal layout - - - - - About - - - - - Hide left panel | Alt+L - - - - - Hide right panel | Alt+R - - - - - Delete dialog - - - - - Add new dialog - - - - - Report Tools - - - - - Main Tools - - - - - Font - - - - - Text alignment - - - - - Items alignment - - - - - Borders - - - - - Report bands - - - - - Report Header - - - - - Report Footer - - - - - Page Header - - - - - Page Footer - - - - - Data - - - - - Data Header - - - - - Data Footer - - - - - SubDetail - - - - - SubDetailHeader - - - - - SubDetailFooter - - - - - GroupHeader - - - - - GroupFooter - - - - - Tear-off Band - - - - - File - - - - - Edit - - - - - Info - - - - - Recent Files - - - - - - Object Inspector - - - - - Report structure - - - - - Widget Box - - - - - Property Editor - - - - - Action Editor - - - - - Resource Editor - - - - - SignalSlot Editor - - - - - Dialog Designer Tools - - - - - Data Browser - - - - - Script Browser - - - - - Report has been modified! Do you want save the report? - - - - - - Report file name - - - - - Rendering report - - - - - Abort - - - - - page rendered - - - - - Warning - - - - - File "%1" not found! - - - - - LimeReport::ReportEnginePrivate - - - Preview - - - - - Error - - - - - Report File Change - - - - - The report file "%1" has changed names or been deleted. - -This preview is no longer valid. - - - - - Designer not found! - - - - - Language %1 already exists - - - - - LimeReport::ReportFooter - - - Report Footer - - - - - LimeReport::ReportHeader - - - Report Header - - - - - LimeReport::ReportRender - - - - - Error - - - - - page index out of range - - - - - Databand "%1" not found - - - - - Wrong using function %1 - - - - - LimeReport::SQLEditDialog - - - Datasource - - - - - Connection - - - - - Datasource Name - - - - - Subdetail - - - - - Master datasource - - - - - Subquery mode - - - - - Filter mode - - - - - SQL - - - - - - Preview - - - - - Hide Preview - - - - - Child datasource - - - - - Fields map - - - - - - ... - - - - - Data preview - - - - - Cancel - - - - - Ok - - - - - Error - - - - - Datasource Name is empty! - - - - - SQL is empty! - - - - - Datasource with name: "%1" already exists! - - - - - defaultConnection - - - - - Datasource with name %1 already exist - - - - - - Attention - - - - - Connection is not specified - - - - - Refresh - - - - - LimeReport::ScriptBrowser - - - Form - - - - - Functions - - - - - - - - - - ... - - - - - Dialogs - - - - - Type - - - - - Name - - - - - NO CATEGORY - - - - - - - Error - - - - - Dialog with name: %1 already exists - - - - - ui file must cointain QDialog instead QWidget or QMainWindow - - - - - wrong file format - - - - - LimeReport::ScriptEditor - - - Form - - - - - Data - - - - - Functions - - - - - LimeReport::ScriptEngineContext - - - Dialog with name: %1 can`t be created - - - - - - Error - - - - - LimeReport::ScriptEngineManager - - - Function manager with name "%1" already exists! - - - - - GROUP FUNCTIONS - - - - - FieldName - - - - - - BandName - - - - - Variable %1 not found - - - - - Field %1 not found in %2! - - - - - SYSTEM - - - - - - - NUMBER - - - - - - - - - - - - Value - - - - - - - - - Format - - - - - Precision - - - - - - Locale - - - - - - - - - - DATE&TIME - - - - - CurrencySymbol - - - - - - - - - - - GENERAL - - - - - - - Name - - - - - Datasource - - - - - ValueField - - - - - KeyField - - - - - KeyFieldValue - - - - - Unique identifier - - - - - Content - - - - - Indent - - - - - datasourceName - - - - - LimeReport::SettingDialog - - - Designer setting - - - - - Designer Setting - - - - - Default font - - - - - Grid - - - - - Vertical grid step - - - - - Horizontal grid step - - - - - Language - - - - - Use dark theme - - - - - Report Setting - - - - - Suppress absent fields and variables warning - - - - - LimeReport::SubDetailBand - - - SubDetail - - - - - LimeReport::SubDetailHeaderBand - - - SubDetailHeader - - - - - LimeReport::TearOffBand - - - Tear-off Band - - - - - LimeReport::TextAlignmentEditorWidget - - - Text align left - - - - - - Text align center - - - - - Text align right - - - - - Text align justify - - - - - Text align top - - - - - Text align bottom - - - - - LimeReport::TextItem - - - - Edit - - - - - - Auto height - - - - - - Allow HTML - - - - - - Allow HTML in fields - - - - - - Stretch to max height - - - - - - Transparent - - - - - - Watermark - - - - - - Error - - - - - TextItem " %1 " already has folower " %2 " - - - - - TextItem " %1 " not found! - - - - - LimeReport::TextItemEditor - - - Text Item Editor - - - - - Content - - - - - Editor settings - - - - - Editor font - - - - - ... - - - - - Ok - - - - - Ctrl+Return - - - - - Cancel - - - - - Esc - - - - - LimeReport::TranslationEditor - - - Form - - - - - Languages - - - - - - ... - - - - - Pages - - - - - Strings - - - - - Source Text - - - - - Translation - - - - - Checked - - - - - Report Item - - - - - Property - - - - - Source text - - - - - LimeReport::VariablesHolder - - - - - - variable with name - - - - - already exists! - - - - - - - does not exists! - - - - - QObject - - - - - Data - - - - - - DataHeader - - - - - - DataFooter - - - - - - GroupHeader - - - - - - GroupFooter - - - - - - - Page Footer - - - - - - - Page Header - - - - - - Report Footer - - - - - - Report Header - - - - - - - SubDetail - - - - - - SubDetailHeader - - - - - - SubDetailFooter - - - - - - Tear-off Band - - - - - - alignment - - - - - - Barcode Item - - - - - - Chart Item - - - - - First - - - - - Second - - - - - Thrid - - - - - - HLayout - - - - - - Image Item - - - - - - Shape Item - - - - - - itemLocation - - - - - - Text Item - - - - - - Invalid connection! %1 - - - - - Master datasource "%1" not found! - - - - - Master datasouce "%1" not found! - - - - - Child - - - - - and child - - - - - datasouce "%1" not found! - - - - - - bool - - - - - - QColor - - - - - - content - - - - - - - - - datasource - - - - - - - - field - - - - - - enum - - - - - - flags - - - - - - QFont - - - - - - QImage - - - - - - int - - - - - - - - qreal - - - - - - QRect - - - - - - QRectF - - - - - - geometry - - - - - - QString - - - - - Attention! - - - - - Selected elements have different parent containers - - - - - Object with name %1 already exists! - - - - - Function %1 not found or have wrong arguments - - - - - Datasource manager not found - - - - - mm - - - - - Wrong file format - - - - - File %1 not opened - - - - - Content string is empty - - - - - Content is empty - - - - diff --git a/limereport/limereport_es_ES.ts b/limereport/limereport_es_ES.ts deleted file mode 100644 index f0f7364..0000000 --- a/limereport/limereport_es_ES.ts +++ /dev/null @@ -1,3724 +0,0 @@ - - - - - ChartItemEditor - - - Series editor - - - - - Series - - - - - Add - - - - - Delete - - - - - Name - - - - - Values field - - - - - Color - - - - - Type - - - - - Labels field - - - - - Ok - - - - - Series name - - - - - LRVariableDialog - - - Variable - - - - - Name - - - - - Value - - - - - Type - - - - - Mandatory - - - - - Attention - - - - - LanguageSelectDialog - - - Dialog - - - - - Language - - - - - LimeReport::AboutDialog - - - About - - - - - Lime Report - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - - - - - Author - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> - - - - - License - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600;">G</span><span style=" font-family:'sans-serif'; font-weight:600;">NU LESSER GENERAL PUBLIC LICENSE</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Version 2.1, February 1999</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Everyone is permitted to copy and distribute verbatim copies</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">of this license document, but changing it is not allowed.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">[This is the first released version of the Lesser GPL. It also counts</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> as the successor of the GNU Library Public License, version 2, hence</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> the version number 2.1.]</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600;">P</span><span style=" font-family:'sans-serif'; font-weight:600;">reamble</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">0.</span><span style=" font-family:'sans-serif';"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">1.</span><span style=" font-family:'sans-serif';"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">2.</span><span style=" font-family:'sans-serif';"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif';">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">3.</span><span style=" font-family:'sans-serif';"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">4.</span><span style=" font-family:'sans-serif';"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">5.</span><span style=" font-family:'sans-serif';"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">6.</span><span style=" font-family:'sans-serif';"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">7.</span><span style=" font-family:'sans-serif';"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">8.</span><span style=" font-family:'sans-serif';"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">9.</span><span style=" font-family:'sans-serif';"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">10.</span><span style=" font-family:'sans-serif';"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">11.</span><span style=" font-family:'sans-serif';"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">12.</span><span style=" font-family:'sans-serif';"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">13.</span><span style=" font-family:'sans-serif';"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">14.</span><span style=" font-family:'sans-serif';"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">NO WARRANTY</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">15.</span><span style=" font-family:'sans-serif';"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">16.</span><span style=" font-family:'sans-serif';"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">END OF TERMS AND CONDITIONS</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">one line to give the library's name and an idea of what it does.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic;">year</span><span style=" font-family:'monospace';"> </span><span style=" font-family:'monospace'; font-style:italic;">name of author</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is free software; you can redistribute it and/or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">modify it under the terms of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License as published by the Free Software Foundation; either</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">version 2.1 of the License, or (at your option) any later version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is distributed in the hope that it will be useful,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Lesser General Public License for more details.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">You should have received a copy of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License along with this library; if not, write to the Free Software</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Also add information on how to contact you by electronic and paper mail.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">the library `Frob' (a library for tweaking knobs) written</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">by James Random Hacker.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">signature of Ty Coon</span><span style=" font-family:'monospace';">, 1 April 1990</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Ty Coon, President of Vice</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">That's all there is to it!</span></p></body></html> - - - - - Close - - - - - Version 1.1.1 - - - - - LimeReport::AlignmentPropItem - - - Left - - - - - Right - - - - - - Center - - - - - Justify - - - - - Top - - - - - Botom - - - - - horizontal - - - - - vertical - - - - - LimeReport::BandDesignIntf - - - DataBand - - - - - DataHeaderBand - - - - - DataFooterBand - - - - - ReportHeader - - - - - ReportFooter - - - - - PageHeader - - - - - PageFooter - - - - - SubDetailBand - - - - - SubDetailHeaderBand - - - - - SubDetailFooterBand - - - - - GroupBandHeader - - - - - GroupBandFooter - - - - - TearOffBand - - - - - connected to - - - - - Bring to top - - - - - Send to back - - - - - - Auto height - - - - - - Splittable - - - - - - Keep bottom space - - - - - - Keep top space - - - - - - Start from new page - - - - - - Start new page - - - - - LimeReport::BaseDesignIntf - - - Copy - - - - - Cut - - - - - Paste - - - - - Bring to top - - - - - Send to back - - - - - Create Horizontal Layout - - - - - No borders - - - - - All borders - - - - - LimeReport::ConnectionDesc - - - - defaultConnection - - - - - LimeReport::ConnectionDialog - - - - Connection - - - - - Connection Name - - - - - Use default application connection - - - - - Driver - - - - - Server - - - - - Port - - - - - User - - - - - Password - - - - - Database - - - - - ... - - - - - Auto connect - - - - - Dont keep credentals in lrxml - - - - - Check connection - - - - - Cancel - - - - - Ok - - - - - - Error - - - - - Connection succsesfully established! - - - - - Connection Name is empty - - - - - Connection with name - - - - - already exists! - - - - - defaultConnection - - - - - LimeReport::DataBand - - - Data - - - - - - Use alternate background color - - - - - LimeReport::DataBrowser - - - - - Datasources - - - - - Add database connection - - - - - - - - - - - - - - - - - ... - - - - - Add new datasource - - - - - View data - - - - - Change datasource - - - - - Delete datasource - - - - - Show error - - - - - Variables - - - - - Add new variable - - - - - Edit variable - - - - - Delete variable - - - - - Grab variable - - - - - - - - Attention - - - - - Do you really want to delete "%1" connection? - - - - - Report variables - - - - - System variables - - - - - External variables - - - - - Do you really want to delete "%1" datasource? - - - - - Do you really want to delete variable "%1"? - - - - - Error - - - - - LimeReport::DataFooterBand - - - DataFooter - - - - - LimeReport::DataHeaderBand - - - DataHeader - - - - - LimeReport::DataSourceManager - - - Connection "%1" is not open - - - - - Variable "%1" not found! - - - - - - Datasource "%1" not found! - - - - - Connection with name "%1" already exists! - - - - - - - - Datasource with name "%1" already exists! - - - - - Database "%1" not found - - - - - invalid connection - - - - - LimeReport::DataSourceModel - - - Datasources - - - - - Variables - - - - - External variables - - - - - LimeReport::DialogDesignerManager - - - Edit Widgets - - - - - Widget Box - - - - - Object Inspector - - - - - Property Editor - - - - - Signals && Slots Editor - - - - - Resource Editor - - - - - Action Editor - - - - - LimeReport::EnumPropItem - - - Default - - - - - Portrait - - - - - Landscape - - - - - NoneAutoWidth - - - - - MaxWordLength - - - - - MaxStringLength - - - - - TransparentMode - - - - - OpaqueMode - - - - - Angle0 - - - - - Angle90 - - - - - Angle180 - - - - - Angle270 - - - - - Angle45 - - - - - Angle315 - - - - - DateTime - - - - - Double - - - - - NoBrush - - - - - SolidPattern - - - - - Dense1Pattern - - - - - Dense2Pattern - - - - - Dense3Pattern - - - - - Dense4Pattern - - - - - Dense5Pattern - - - - - Dense6Pattern - - - - - Dense7Pattern - - - - - HorPattern - - - - - VerPattern - - - - - CrossPattern - - - - - BDiagPattern - - - - - FDiagPattern - - - - - LeftToRight - - - - - RightToLeft - - - - - LayoutDirectionAuto - - - - - LeftItemAlign - - - - - RightItemAlign - - - - - CenterItemAlign - - - - - ParentWidthItemAlign - - - - - DesignedItemAlign - - - - - HorizontalLine - - - - - VerticalLine - - - - - Ellipse - - - - - Rectangle - - - - - Page - - - - - Band - - - - - Horizontal - - - - - Vertical - - - - - VerticalUniform - - - - - Pie - - - - - VerticalBar - - - - - HorizontalBar - - - - - LegendAlignTop - - - - - LegendAlignCenter - - - - - LegendAlignBottom - - - - - TitleAlignLeft - - - - - TitleAlignRight - - - - - TitleAlignCenter - - - - - LimeReport::FlagsPropItem - - - NoLine - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - AllLines - - - - - LimeReport::FontEditorWidget - - - Font bold - - - - - Font Italic - - - - - Font Underline - - - - - LimeReport::FontPropItem - - - bold - - - - - italic - - - - - underline - - - - - size - - - - - family - - - - - LimeReport::GroupBandFooter - - - GroupFooter - - - - - LimeReport::GroupBandHeader - - - GroupHeader - - - - - Group field not found - - - - - Datasource "%1" not found! - - - - - LimeReport::GroupFunction - - - Field "%1" not found - - - - - Variable "%1" not found - - - - - Wrong script syntax "%1" - - - - - Item "%1" not found - - - - - LimeReport::ImageItem - - - - Watermark - - - - - Image - - - - - LimeReport::ItemLocationPropItem - - - Band - - - - - Page - - - - - LimeReport::ItemsAlignmentEditorWidget - - - Bring to top - - - - - Send to back - - - - - Align to left - - - - - Align to right - - - - - Align to vertical center - - - - - Align to top - - - - - Align to bottom - - - - - Align to horizontal center - - - - - Set same height - - - - - Set same width - - - - - LimeReport::ItemsBordersEditorWidget - - - Top line - - - - - Bottom line - - - - - Left line - - - - - Right line - - - - - No borders - - - - - All borders - - - - - LimeReport::MasterDetailProxyModel - - - Field: "%1" not found in "%2" child datasource - - - - - Field: "%1" not found in "%2" master datasource - - - - - LimeReport::ModelToDataSource - - - model is destroyed - - - - - LimeReport::ObjectBrowser - - - Objects - - - - - LimeReport::PageFooter - - - Page Footer - - - - - - Print on first page - - - - - - Print on last page - - - - - LimeReport::PageHeader - - - Page Header - - - - - LimeReport::PageItemDesignIntf - - - Paste - - - - - - Page is TOC - - - - - - Reset page number - - - - - - Full page - - - - - - Set page size to printer - - - - - LimeReport::PreviewReportWidget - - - Form - - - - - PDF file name - - - - - Report file name - - - - - LimeReport::PreviewReportWindow - - - Preview - - - - - View - - - - - Report - - - - - toolBar - - - - - Print - - - - - Ctrl+P - - - - - Zoom In - - - - - Zoom Out - - - - - - Prior Page - - - - - - Next Page - - - - - - Close Preview - - - - - Esc - - - - - Edit Mode - - - - - - Save to file - - - - - - Show errors - - - - - First Page - - - - - First page - - - - - - Last Page - - - - - Print To PDF - - - - - Fit page width - - - - - Fit page - - - - - One to one - - - - - Show Toolbar - - - - - Show toolbar - - - - - Page: - - - - - Font - - - - - Text align - - - - - of %1 - - - - - LimeReport::ProxyHolder - - - Datasource has been invalidated - - - - - LimeReport::QObjectPropertyModel - - - leftMargin - - - - - rightMargin - - - - - topMargin - - - - - bottomMargin - - - - - objectName - - - - - borders - - - - - geometry - - - - - itemAlign - - - - - pageOrientation - - - - - pageSize - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - reprintOnEachPage - - - - - borderLineSize - - - - - autoHeight - - - - - backgroundColor - - - - - - columnCount - - - - - columnsFillDirection - - - - - datasource - - - - - keepBottomSpace - - - - - keepFooterTogether - - - - - keepSubdetailTogether - - - - - printIfEmpty - - - - - sliceLastRow - - - - - splittable - - - - - alignment - - - - - angle - - - - - autoWidth - - - - - backgroundMode - - - - - backgroundOpacity - - - - - content - - - - - font - - - - - fontColor - - - - - foregroundOpacity - - - - - itemLocation - - - - - margin - - - - - stretchToMaxHeight - - - - - trimValue - - - - - lineWidth - - - - - opacity - - - - - penStyle - - - - - shape - - - - - shapeBrush - - - - - shapeBrushColor - - - - - gridStep - - - - - fullPage - - - - - oldPrintMode - - - - - borderColor - - - - - resetPageNumber - - - - - alternateBackgroundColor - - - - - - backgroundBrushStyle - - - - - startFromNewPage - - - - - startNewPage - - - - - adaptFontToSize - - - - - allowHTML - - - - - allowHTMLInFields - - - - - followTo - - - - - format - - - - - lineSpacing - - - - - textIndent - - - - - textLayoutDirection - - - - - underlineLineSize - - - - - underlines - - - - - valueType - - - - - securityLevel - - - - - testValue - - - - - whitespace - - - - - resourcePath - - - - - scale - - - - - cornerRadius - - - - - shapeColor - - - - - layoutType - - - - - barcodeType - - - - - barcodeWidth - - - - - foregroundColor - - - - - inputMode - - - - - pdf417CodeWords - - - - - autoSize - - - - - center - - - - - field - - - - - image - - - - - keepAspectRatio - - - - - columnsCount - - - - - useAlternateBackgroundColor - - - - - printBeforePageHeader - - - - - maxScalePercent - - - - - printOnFirstPage - - - - - printOnLastPage - - - - - printAlways - - - - - repeatOnEachRow - - - - - condition - - - - - groupFieldName - - - - - keepGroupTogether - - - - - endlessHeight - - - - - extendedHeight - - - - - isExtendedInDesignMode - - - - - pageIsTOC - - - - - setPageSizeToPrinter - - - - - fillInSecondPass - - - - - chartTitle - - - - - chartType - - - - - drawLegendBorder - - - - - labelsField - - - - - legendAlign - - - - - series - - - - - titleAlign - - - - - watermark - - - - - keepTopSpace - - - - - printable - - - - - variable - - - - - - Warning - - - - - The language will change after the application is restarted - - - - - Property Name - - - - - Property value - - - - - LimeReport::RectMMPropItem - - - - - width - - - - - - - height - - - - - LimeReport::RectPropItem - - - width - - - - - height - - - - - LimeReport::ReportDesignWidget - - - Script - - - - - Translations - - - - - Report file name - - - - - Error - - - - - Wrong file format - - - - - LimeReport::ReportDesignWindow - - - New Report - - - - - New Report Page - - - - - Delete Report Page - - - - - Edit Mode - - - - - Undo - - - - - Redo - - - - - Copy - - - - - Paste - - - - - Cut - - - - - Settings - - - - - Use grid - - - - - Use magnet - - - - - Text Item - - - - - Save Report - - - - - Save Report As - - - - - Load Report - - - - - Delete item - - - - - Zoom In - - - - - Zoom Out - - - - - Render Report - - - - - Edit layouts mode - - - - - Horizontal layout - - - - - About - - - - - Hide left panel | Alt+L - - - - - Hide right panel | Alt+R - - - - - Delete dialog - - - - - Add new dialog - - - - - Report Tools - - - - - Main Tools - - - - - Font - - - - - Text alignment - - - - - Items alignment - - - - - Borders - - - - - Report bands - - - - - Report Header - - - - - Report Footer - - - - - Page Header - - - - - Page Footer - - - - - Data - - - - - Data Header - - - - - Data Footer - - - - - SubDetail - - - - - SubDetailHeader - - - - - SubDetailFooter - - - - - GroupHeader - - - - - GroupFooter - - - - - Tear-off Band - - - - - File - - - - - Edit - - - - - Info - - - - - Recent Files - - - - - - Object Inspector - - - - - Report structure - - - - - Widget Box - - - - - Property Editor - - - - - Action Editor - - - - - Resource Editor - - - - - SignalSlot Editor - - - - - Dialog Designer Tools - - - - - Data Browser - - - - - Script Browser - - - - - Report has been modified! Do you want save the report? - - - - - - Report file name - - - - - Rendering report - - - - - Abort - - - - - page rendered - - - - - Warning - - - - - File "%1" not found! - - - - - LimeReport::ReportEnginePrivate - - - Preview - - - - - Error - - - - - Report File Change - - - - - The report file "%1" has changed names or been deleted. - -This preview is no longer valid. - - - - - Designer not found! - - - - - Language %1 already exists - - - - - LimeReport::ReportFooter - - - Report Footer - - - - - LimeReport::ReportHeader - - - Report Header - - - - - LimeReport::ReportRender - - - - - Error - - - - - page index out of range - - - - - Databand "%1" not found - - - - - Wrong using function %1 - - - - - LimeReport::SQLEditDialog - - - Datasource - - - - - Connection - - - - - Datasource Name - - - - - Subdetail - - - - - Master datasource - - - - - Subquery mode - - - - - Filter mode - - - - - SQL - - - - - - Preview - - - - - Hide Preview - - - - - Child datasource - - - - - Fields map - - - - - - ... - - - - - Data preview - - - - - Cancel - - - - - Ok - - - - - Error - - - - - Datasource Name is empty! - - - - - SQL is empty! - - - - - Datasource with name: "%1" already exists! - - - - - defaultConnection - - - - - Datasource with name %1 already exist - - - - - - Attention - - - - - Connection is not specified - - - - - Refresh - - - - - LimeReport::ScriptBrowser - - - Form - - - - - Functions - - - - - - - - - - ... - - - - - Dialogs - - - - - Type - - - - - Name - - - - - NO CATEGORY - - - - - - - Error - - - - - Dialog with name: %1 already exists - - - - - ui file must cointain QDialog instead QWidget or QMainWindow - - - - - wrong file format - - - - - LimeReport::ScriptEditor - - - Form - - - - - Data - - - - - Functions - - - - - LimeReport::ScriptEngineContext - - - Dialog with name: %1 can`t be created - - - - - - Error - - - - - LimeReport::ScriptEngineManager - - - Function manager with name "%1" already exists! - - - - - GROUP FUNCTIONS - - - - - FieldName - - - - - - BandName - - - - - Variable %1 not found - - - - - Field %1 not found in %2! - - - - - SYSTEM - - - - - - - NUMBER - - - - - - - - - - - - Value - - - - - - - - - Format - - - - - Precision - - - - - - Locale - - - - - - - - - - DATE&TIME - - - - - CurrencySymbol - - - - - - - - - - - GENERAL - - - - - - - Name - - - - - Datasource - - - - - ValueField - - - - - KeyField - - - - - KeyFieldValue - - - - - Unique identifier - - - - - Content - - - - - Indent - - - - - datasourceName - - - - - LimeReport::SettingDialog - - - Designer setting - - - - - Designer Setting - - - - - Default font - - - - - Grid - - - - - Vertical grid step - - - - - Horizontal grid step - - - - - Language - - - - - Use dark theme - - - - - Report Setting - - - - - Suppress absent fields and variables warning - - - - - LimeReport::SubDetailBand - - - SubDetail - - - - - LimeReport::SubDetailHeaderBand - - - SubDetailHeader - - - - - LimeReport::TearOffBand - - - Tear-off Band - - - - - LimeReport::TextAlignmentEditorWidget - - - Text align left - - - - - - Text align center - - - - - Text align right - - - - - Text align justify - - - - - Text align top - - - - - Text align bottom - - - - - LimeReport::TextItem - - - - Edit - - - - - - Auto height - - - - - - Allow HTML - - - - - - Allow HTML in fields - - - - - - Stretch to max height - - - - - - Transparent - - - - - - Watermark - - - - - - Error - - - - - TextItem " %1 " already has folower " %2 " - - - - - TextItem " %1 " not found! - - - - - LimeReport::TextItemEditor - - - Text Item Editor - - - - - Content - - - - - Editor settings - - - - - Editor font - - - - - ... - - - - - Ok - - - - - Ctrl+Return - - - - - Cancel - - - - - Esc - - - - - LimeReport::TranslationEditor - - - Form - - - - - Languages - - - - - - ... - - - - - Pages - - - - - Strings - - - - - Source Text - - - - - Translation - - - - - Checked - - - - - Report Item - - - - - Property - - - - - Source text - - - - - LimeReport::VariablesHolder - - - - - - variable with name - - - - - already exists! - - - - - - - does not exists! - - - - - QObject - - - - - Data - - - - - - DataHeader - - - - - - DataFooter - - - - - - GroupHeader - - - - - - GroupFooter - - - - - - - Page Footer - - - - - - - Page Header - - - - - - Report Footer - - - - - - Report Header - - - - - - - SubDetail - - - - - - SubDetailHeader - - - - - - SubDetailFooter - - - - - - Tear-off Band - - - - - - alignment - - - - - - Barcode Item - - - - - - Chart Item - - - - - First - - - - - Second - - - - - Thrid - - - - - - HLayout - - - - - - Image Item - - - - - - Shape Item - - - - - - itemLocation - - - - - - Text Item - - - - - - Invalid connection! %1 - - - - - Master datasource "%1" not found! - - - - - Master datasouce "%1" not found! - - - - - Child - - - - - and child - - - - - datasouce "%1" not found! - - - - - - bool - - - - - - QColor - - - - - - content - - - - - - - - - datasource - - - - - - - - field - - - - - - enum - - - - - - flags - - - - - - QFont - - - - - - QImage - - - - - - int - - - - - - - - qreal - - - - - - QRect - - - - - - QRectF - - - - - - geometry - - - - - - QString - - - - - Attention! - - - - - Selected elements have different parent containers - - - - - Object with name %1 already exists! - - - - - Function %1 not found or have wrong arguments - - - - - Datasource manager not found - - - - - mm - - - - - Wrong file format - - - - - File %1 not opened - - - - - Content string is empty - - - - - Content is empty - - - - diff --git a/limereport/limereport_fr.ts b/limereport/limereport_fr.ts deleted file mode 100644 index a406e88..0000000 --- a/limereport/limereport_fr.ts +++ /dev/null @@ -1,3724 +0,0 @@ - - - - - ChartItemEditor - - - Series editor - - - - - Series - - - - - Add - - - - - Delete - - - - - Name - - - - - Values field - - - - - Color - - - - - Type - - - - - Labels field - - - - - Ok - - - - - Series name - - - - - LRVariableDialog - - - Variable - - - - - Name - - - - - Value - - - - - Type - - - - - Mandatory - - - - - Attention - - - - - LanguageSelectDialog - - - Dialog - - - - - Language - - - - - LimeReport::AboutDialog - - - About - - - - - Lime Report - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - - - - - Author - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> - - - - - License - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600;">G</span><span style=" font-family:'sans-serif'; font-weight:600;">NU LESSER GENERAL PUBLIC LICENSE</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Version 2.1, February 1999</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Everyone is permitted to copy and distribute verbatim copies</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">of this license document, but changing it is not allowed.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">[This is the first released version of the Lesser GPL. It also counts</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> as the successor of the GNU Library Public License, version 2, hence</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> the version number 2.1.]</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600;">P</span><span style=" font-family:'sans-serif'; font-weight:600;">reamble</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">0.</span><span style=" font-family:'sans-serif';"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">1.</span><span style=" font-family:'sans-serif';"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">2.</span><span style=" font-family:'sans-serif';"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif';">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">3.</span><span style=" font-family:'sans-serif';"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">4.</span><span style=" font-family:'sans-serif';"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">5.</span><span style=" font-family:'sans-serif';"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">6.</span><span style=" font-family:'sans-serif';"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">7.</span><span style=" font-family:'sans-serif';"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">8.</span><span style=" font-family:'sans-serif';"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">9.</span><span style=" font-family:'sans-serif';"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">10.</span><span style=" font-family:'sans-serif';"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">11.</span><span style=" font-family:'sans-serif';"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">12.</span><span style=" font-family:'sans-serif';"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">13.</span><span style=" font-family:'sans-serif';"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">14.</span><span style=" font-family:'sans-serif';"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">NO WARRANTY</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">15.</span><span style=" font-family:'sans-serif';"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">16.</span><span style=" font-family:'sans-serif';"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">END OF TERMS AND CONDITIONS</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">one line to give the library's name and an idea of what it does.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic;">year</span><span style=" font-family:'monospace';"> </span><span style=" font-family:'monospace'; font-style:italic;">name of author</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is free software; you can redistribute it and/or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">modify it under the terms of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License as published by the Free Software Foundation; either</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">version 2.1 of the License, or (at your option) any later version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is distributed in the hope that it will be useful,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Lesser General Public License for more details.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">You should have received a copy of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License along with this library; if not, write to the Free Software</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Also add information on how to contact you by electronic and paper mail.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">the library `Frob' (a library for tweaking knobs) written</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">by James Random Hacker.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">signature of Ty Coon</span><span style=" font-family:'monospace';">, 1 April 1990</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Ty Coon, President of Vice</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">That's all there is to it!</span></p></body></html> - - - - - Close - - - - - Version 1.1.1 - - - - - LimeReport::AlignmentPropItem - - - Left - - - - - Right - - - - - - Center - - - - - Justify - - - - - Top - - - - - Botom - - - - - horizontal - - - - - vertical - - - - - LimeReport::BandDesignIntf - - - DataBand - - - - - DataHeaderBand - - - - - DataFooterBand - - - - - ReportHeader - - - - - ReportFooter - - - - - PageHeader - - - - - PageFooter - - - - - SubDetailBand - - - - - SubDetailHeaderBand - - - - - SubDetailFooterBand - - - - - GroupBandHeader - - - - - GroupBandFooter - - - - - TearOffBand - - - - - connected to - - - - - Bring to top - - - - - Send to back - - - - - - Auto height - - - - - - Splittable - - - - - - Keep bottom space - - - - - - Keep top space - - - - - - Start from new page - - - - - - Start new page - - - - - LimeReport::BaseDesignIntf - - - Copy - - - - - Cut - - - - - Paste - - - - - Bring to top - - - - - Send to back - - - - - Create Horizontal Layout - - - - - No borders - - - - - All borders - - - - - LimeReport::ConnectionDesc - - - - defaultConnection - - - - - LimeReport::ConnectionDialog - - - - Connection - - - - - Connection Name - - - - - Use default application connection - - - - - Driver - - - - - Server - - - - - Port - - - - - User - - - - - Password - - - - - Database - - - - - ... - - - - - Auto connect - - - - - Dont keep credentals in lrxml - - - - - Check connection - - - - - Cancel - - - - - Ok - - - - - - Error - - - - - Connection succsesfully established! - - - - - Connection Name is empty - - - - - Connection with name - - - - - already exists! - - - - - defaultConnection - - - - - LimeReport::DataBand - - - Data - - - - - - Use alternate background color - - - - - LimeReport::DataBrowser - - - - - Datasources - - - - - Add database connection - - - - - - - - - - - - - - - - - ... - - - - - Add new datasource - - - - - View data - - - - - Change datasource - - - - - Delete datasource - - - - - Show error - - - - - Variables - - - - - Add new variable - - - - - Edit variable - - - - - Delete variable - - - - - Grab variable - - - - - - - - Attention - - - - - Do you really want to delete "%1" connection? - - - - - Report variables - - - - - System variables - - - - - External variables - - - - - Do you really want to delete "%1" datasource? - - - - - Do you really want to delete variable "%1"? - - - - - Error - - - - - LimeReport::DataFooterBand - - - DataFooter - - - - - LimeReport::DataHeaderBand - - - DataHeader - - - - - LimeReport::DataSourceManager - - - Connection "%1" is not open - - - - - Variable "%1" not found! - - - - - - Datasource "%1" not found! - - - - - Connection with name "%1" already exists! - - - - - - - - Datasource with name "%1" already exists! - - - - - Database "%1" not found - - - - - invalid connection - - - - - LimeReport::DataSourceModel - - - Datasources - - - - - Variables - - - - - External variables - - - - - LimeReport::DialogDesignerManager - - - Edit Widgets - - - - - Widget Box - - - - - Object Inspector - - - - - Property Editor - - - - - Signals && Slots Editor - - - - - Resource Editor - - - - - Action Editor - - - - - LimeReport::EnumPropItem - - - Default - - - - - Portrait - - - - - Landscape - - - - - NoneAutoWidth - - - - - MaxWordLength - - - - - MaxStringLength - - - - - TransparentMode - - - - - OpaqueMode - - - - - Angle0 - - - - - Angle90 - - - - - Angle180 - - - - - Angle270 - - - - - Angle45 - - - - - Angle315 - - - - - DateTime - - - - - Double - - - - - NoBrush - - - - - SolidPattern - - - - - Dense1Pattern - - - - - Dense2Pattern - - - - - Dense3Pattern - - - - - Dense4Pattern - - - - - Dense5Pattern - - - - - Dense6Pattern - - - - - Dense7Pattern - - - - - HorPattern - - - - - VerPattern - - - - - CrossPattern - - - - - BDiagPattern - - - - - FDiagPattern - - - - - LeftToRight - - - - - RightToLeft - - - - - LayoutDirectionAuto - - - - - LeftItemAlign - - - - - RightItemAlign - - - - - CenterItemAlign - - - - - ParentWidthItemAlign - - - - - DesignedItemAlign - - - - - HorizontalLine - - - - - VerticalLine - - - - - Ellipse - - - - - Rectangle - - - - - Page - - - - - Band - - - - - Horizontal - - - - - Vertical - - - - - VerticalUniform - - - - - Pie - - - - - VerticalBar - - - - - HorizontalBar - - - - - LegendAlignTop - - - - - LegendAlignCenter - - - - - LegendAlignBottom - - - - - TitleAlignLeft - - - - - TitleAlignRight - - - - - TitleAlignCenter - - - - - LimeReport::FlagsPropItem - - - NoLine - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - AllLines - - - - - LimeReport::FontEditorWidget - - - Font bold - - - - - Font Italic - - - - - Font Underline - - - - - LimeReport::FontPropItem - - - bold - - - - - italic - - - - - underline - - - - - size - - - - - family - - - - - LimeReport::GroupBandFooter - - - GroupFooter - - - - - LimeReport::GroupBandHeader - - - GroupHeader - - - - - Group field not found - - - - - Datasource "%1" not found! - - - - - LimeReport::GroupFunction - - - Field "%1" not found - - - - - Variable "%1" not found - - - - - Wrong script syntax "%1" - - - - - Item "%1" not found - - - - - LimeReport::ImageItem - - - - Watermark - - - - - Image - - - - - LimeReport::ItemLocationPropItem - - - Band - - - - - Page - - - - - LimeReport::ItemsAlignmentEditorWidget - - - Bring to top - - - - - Send to back - - - - - Align to left - - - - - Align to right - - - - - Align to vertical center - - - - - Align to top - - - - - Align to bottom - - - - - Align to horizontal center - - - - - Set same height - - - - - Set same width - - - - - LimeReport::ItemsBordersEditorWidget - - - Top line - - - - - Bottom line - - - - - Left line - - - - - Right line - - - - - No borders - - - - - All borders - - - - - LimeReport::MasterDetailProxyModel - - - Field: "%1" not found in "%2" child datasource - - - - - Field: "%1" not found in "%2" master datasource - - - - - LimeReport::ModelToDataSource - - - model is destroyed - - - - - LimeReport::ObjectBrowser - - - Objects - - - - - LimeReport::PageFooter - - - Page Footer - - - - - - Print on first page - - - - - - Print on last page - - - - - LimeReport::PageHeader - - - Page Header - - - - - LimeReport::PageItemDesignIntf - - - Paste - - - - - - Page is TOC - - - - - - Reset page number - - - - - - Full page - - - - - - Set page size to printer - - - - - LimeReport::PreviewReportWidget - - - Form - - - - - PDF file name - - - - - Report file name - - - - - LimeReport::PreviewReportWindow - - - Preview - - - - - View - - - - - Report - - - - - toolBar - - - - - Print - - - - - Ctrl+P - - - - - Zoom In - - - - - Zoom Out - - - - - - Prior Page - - - - - - Next Page - - - - - - Close Preview - - - - - Esc - - - - - Edit Mode - - - - - - Save to file - - - - - - Show errors - - - - - First Page - - - - - First page - - - - - - Last Page - - - - - Print To PDF - - - - - Fit page width - - - - - Fit page - - - - - One to one - - - - - Show Toolbar - - - - - Show toolbar - - - - - Page: - - - - - Font - - - - - Text align - - - - - of %1 - - - - - LimeReport::ProxyHolder - - - Datasource has been invalidated - - - - - LimeReport::QObjectPropertyModel - - - leftMargin - - - - - rightMargin - - - - - topMargin - - - - - bottomMargin - - - - - objectName - - - - - borders - - - - - geometry - - - - - itemAlign - - - - - pageOrientation - - - - - pageSize - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - reprintOnEachPage - - - - - borderLineSize - - - - - autoHeight - - - - - backgroundColor - - - - - - columnCount - - - - - columnsFillDirection - - - - - datasource - - - - - keepBottomSpace - - - - - keepFooterTogether - - - - - keepSubdetailTogether - - - - - printIfEmpty - - - - - sliceLastRow - - - - - splittable - - - - - alignment - - - - - angle - - - - - autoWidth - - - - - backgroundMode - - - - - backgroundOpacity - - - - - content - - - - - font - - - - - fontColor - - - - - foregroundOpacity - - - - - itemLocation - - - - - margin - - - - - stretchToMaxHeight - - - - - trimValue - - - - - lineWidth - - - - - opacity - - - - - penStyle - - - - - shape - - - - - shapeBrush - - - - - shapeBrushColor - - - - - gridStep - - - - - fullPage - - - - - oldPrintMode - - - - - borderColor - - - - - resetPageNumber - - - - - alternateBackgroundColor - - - - - - backgroundBrushStyle - - - - - startFromNewPage - - - - - startNewPage - - - - - adaptFontToSize - - - - - allowHTML - - - - - allowHTMLInFields - - - - - followTo - - - - - format - - - - - lineSpacing - - - - - textIndent - - - - - textLayoutDirection - - - - - underlineLineSize - - - - - underlines - - - - - valueType - - - - - securityLevel - - - - - testValue - - - - - whitespace - - - - - resourcePath - - - - - scale - - - - - cornerRadius - - - - - shapeColor - - - - - layoutType - - - - - barcodeType - - - - - barcodeWidth - - - - - foregroundColor - - - - - inputMode - - - - - pdf417CodeWords - - - - - autoSize - - - - - center - - - - - field - - - - - image - - - - - keepAspectRatio - - - - - columnsCount - - - - - useAlternateBackgroundColor - - - - - printBeforePageHeader - - - - - maxScalePercent - - - - - printOnFirstPage - - - - - printOnLastPage - - - - - printAlways - - - - - repeatOnEachRow - - - - - condition - - - - - groupFieldName - - - - - keepGroupTogether - - - - - endlessHeight - - - - - extendedHeight - - - - - isExtendedInDesignMode - - - - - pageIsTOC - - - - - setPageSizeToPrinter - - - - - fillInSecondPass - - - - - chartTitle - - - - - chartType - - - - - drawLegendBorder - - - - - labelsField - - - - - legendAlign - - - - - series - - - - - titleAlign - - - - - watermark - - - - - keepTopSpace - - - - - printable - - - - - variable - - - - - - Warning - - - - - The language will change after the application is restarted - - - - - Property Name - - - - - Property value - - - - - LimeReport::RectMMPropItem - - - - - width - - - - - - - height - - - - - LimeReport::RectPropItem - - - width - - - - - height - - - - - LimeReport::ReportDesignWidget - - - Script - - - - - Translations - - - - - Report file name - - - - - Error - - - - - Wrong file format - - - - - LimeReport::ReportDesignWindow - - - New Report - - - - - New Report Page - - - - - Delete Report Page - - - - - Edit Mode - - - - - Undo - - - - - Redo - - - - - Copy - - - - - Paste - - - - - Cut - - - - - Settings - - - - - Use grid - - - - - Use magnet - - - - - Text Item - - - - - Save Report - - - - - Save Report As - - - - - Load Report - - - - - Delete item - - - - - Zoom In - - - - - Zoom Out - - - - - Render Report - - - - - Edit layouts mode - - - - - Horizontal layout - - - - - About - - - - - Hide left panel | Alt+L - - - - - Hide right panel | Alt+R - - - - - Delete dialog - - - - - Add new dialog - - - - - Report Tools - - - - - Main Tools - - - - - Font - - - - - Text alignment - - - - - Items alignment - - - - - Borders - - - - - Report bands - - - - - Report Header - - - - - Report Footer - - - - - Page Header - - - - - Page Footer - - - - - Data - - - - - Data Header - - - - - Data Footer - - - - - SubDetail - - - - - SubDetailHeader - - - - - SubDetailFooter - - - - - GroupHeader - - - - - GroupFooter - - - - - Tear-off Band - - - - - File - - - - - Edit - - - - - Info - - - - - Recent Files - - - - - - Object Inspector - - - - - Report structure - - - - - Widget Box - - - - - Property Editor - - - - - Action Editor - - - - - Resource Editor - - - - - SignalSlot Editor - - - - - Dialog Designer Tools - - - - - Data Browser - - - - - Script Browser - - - - - Report has been modified! Do you want save the report? - - - - - - Report file name - - - - - Rendering report - - - - - Abort - - - - - page rendered - - - - - Warning - - - - - File "%1" not found! - - - - - LimeReport::ReportEnginePrivate - - - Preview - - - - - Error - - - - - Report File Change - - - - - The report file "%1" has changed names or been deleted. - -This preview is no longer valid. - - - - - Designer not found! - - - - - Language %1 already exists - - - - - LimeReport::ReportFooter - - - Report Footer - - - - - LimeReport::ReportHeader - - - Report Header - - - - - LimeReport::ReportRender - - - - - Error - - - - - page index out of range - - - - - Databand "%1" not found - - - - - Wrong using function %1 - - - - - LimeReport::SQLEditDialog - - - Datasource - - - - - Connection - - - - - Datasource Name - - - - - Subdetail - - - - - Master datasource - - - - - Subquery mode - - - - - Filter mode - - - - - SQL - - - - - - Preview - - - - - Hide Preview - - - - - Child datasource - - - - - Fields map - - - - - - ... - - - - - Data preview - - - - - Cancel - - - - - Ok - - - - - Error - - - - - Datasource Name is empty! - - - - - SQL is empty! - - - - - Datasource with name: "%1" already exists! - - - - - defaultConnection - - - - - Datasource with name %1 already exist - - - - - - Attention - - - - - Connection is not specified - - - - - Refresh - - - - - LimeReport::ScriptBrowser - - - Form - - - - - Functions - - - - - - - - - - ... - - - - - Dialogs - - - - - Type - - - - - Name - - - - - NO CATEGORY - - - - - - - Error - - - - - Dialog with name: %1 already exists - - - - - ui file must cointain QDialog instead QWidget or QMainWindow - - - - - wrong file format - - - - - LimeReport::ScriptEditor - - - Form - - - - - Data - - - - - Functions - - - - - LimeReport::ScriptEngineContext - - - Dialog with name: %1 can`t be created - - - - - - Error - - - - - LimeReport::ScriptEngineManager - - - Function manager with name "%1" already exists! - - - - - GROUP FUNCTIONS - - - - - FieldName - - - - - - BandName - - - - - Variable %1 not found - - - - - Field %1 not found in %2! - - - - - SYSTEM - - - - - - - NUMBER - - - - - - - - - - - - Value - - - - - - - - - Format - - - - - Precision - - - - - - Locale - - - - - - - - - - DATE&TIME - - - - - CurrencySymbol - - - - - - - - - - - GENERAL - - - - - - - Name - - - - - Datasource - - - - - ValueField - - - - - KeyField - - - - - KeyFieldValue - - - - - Unique identifier - - - - - Content - - - - - Indent - - - - - datasourceName - - - - - LimeReport::SettingDialog - - - Designer setting - - - - - Designer Setting - - - - - Default font - - - - - Grid - - - - - Vertical grid step - - - - - Horizontal grid step - - - - - Language - - - - - Use dark theme - - - - - Report Setting - - - - - Suppress absent fields and variables warning - - - - - LimeReport::SubDetailBand - - - SubDetail - - - - - LimeReport::SubDetailHeaderBand - - - SubDetailHeader - - - - - LimeReport::TearOffBand - - - Tear-off Band - - - - - LimeReport::TextAlignmentEditorWidget - - - Text align left - - - - - - Text align center - - - - - Text align right - - - - - Text align justify - - - - - Text align top - - - - - Text align bottom - - - - - LimeReport::TextItem - - - - Edit - - - - - - Auto height - - - - - - Allow HTML - - - - - - Allow HTML in fields - - - - - - Stretch to max height - - - - - - Transparent - - - - - - Watermark - - - - - - Error - - - - - TextItem " %1 " already has folower " %2 " - - - - - TextItem " %1 " not found! - - - - - LimeReport::TextItemEditor - - - Text Item Editor - - - - - Content - - - - - Editor settings - - - - - Editor font - - - - - ... - - - - - Ok - - - - - Ctrl+Return - - - - - Cancel - - - - - Esc - - - - - LimeReport::TranslationEditor - - - Form - - - - - Languages - - - - - - ... - - - - - Pages - - - - - Strings - - - - - Source Text - - - - - Translation - - - - - Checked - - - - - Report Item - - - - - Property - - - - - Source text - - - - - LimeReport::VariablesHolder - - - - - - variable with name - - - - - already exists! - - - - - - - does not exists! - - - - - QObject - - - - - Data - - - - - - DataHeader - - - - - - DataFooter - - - - - - GroupHeader - - - - - - GroupFooter - - - - - - - Page Footer - - - - - - - Page Header - - - - - - Report Footer - - - - - - Report Header - - - - - - - SubDetail - - - - - - SubDetailHeader - - - - - - SubDetailFooter - - - - - - Tear-off Band - - - - - - alignment - - - - - - Barcode Item - - - - - - Chart Item - - - - - First - - - - - Second - - - - - Thrid - - - - - - HLayout - - - - - - Image Item - - - - - - Shape Item - - - - - - itemLocation - - - - - - Text Item - - - - - - Invalid connection! %1 - - - - - Master datasource "%1" not found! - - - - - Master datasouce "%1" not found! - - - - - Child - - - - - and child - - - - - datasouce "%1" not found! - - - - - - bool - - - - - - QColor - - - - - - content - - - - - - - - - datasource - - - - - - - - field - - - - - - enum - - - - - - flags - - - - - - QFont - - - - - - QImage - - - - - - int - - - - - - - - qreal - - - - - - QRect - - - - - - QRectF - - - - - - geometry - - - - - - QString - - - - - Attention! - - - - - Selected elements have different parent containers - - - - - Object with name %1 already exists! - - - - - Function %1 not found or have wrong arguments - - - - - Datasource manager not found - - - - - mm - - - - - Wrong file format - - - - - File %1 not opened - - - - - Content string is empty - - - - - Content is empty - - - - diff --git a/limereport/limereport_ru.ts b/limereport/limereport_ru.ts deleted file mode 100644 index eef0ad8..0000000 --- a/limereport/limereport_ru.ts +++ /dev/null @@ -1,3724 +0,0 @@ - - - - - ChartItemEditor - - - Series editor - - - - - Series - - - - - Add - - - - - Delete - - - - - Name - - - - - Values field - - - - - Color - - - - - Type - - - - - Labels field - - - - - Ok - - - - - Series name - - - - - LRVariableDialog - - - Variable - - - - - Name - - - - - Value - - - - - Type - - - - - Mandatory - - - - - Attention - - - - - LanguageSelectDialog - - - Dialog - - - - - Language - - - - - LimeReport::AboutDialog - - - About - - - - - Lime Report - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - - - - - Author - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> - - - - - License - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600;">G</span><span style=" font-family:'sans-serif'; font-weight:600;">NU LESSER GENERAL PUBLIC LICENSE</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Version 2.1, February 1999</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Everyone is permitted to copy and distribute verbatim copies</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">of this license document, but changing it is not allowed.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">[This is the first released version of the Lesser GPL. It also counts</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> as the successor of the GNU Library Public License, version 2, hence</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> the version number 2.1.]</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600;">P</span><span style=" font-family:'sans-serif'; font-weight:600;">reamble</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">0.</span><span style=" font-family:'sans-serif';"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">1.</span><span style=" font-family:'sans-serif';"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">2.</span><span style=" font-family:'sans-serif';"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif';">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">3.</span><span style=" font-family:'sans-serif';"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">4.</span><span style=" font-family:'sans-serif';"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">5.</span><span style=" font-family:'sans-serif';"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">6.</span><span style=" font-family:'sans-serif';"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">7.</span><span style=" font-family:'sans-serif';"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">8.</span><span style=" font-family:'sans-serif';"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">9.</span><span style=" font-family:'sans-serif';"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">10.</span><span style=" font-family:'sans-serif';"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">11.</span><span style=" font-family:'sans-serif';"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">12.</span><span style=" font-family:'sans-serif';"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">13.</span><span style=" font-family:'sans-serif';"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">14.</span><span style=" font-family:'sans-serif';"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">NO WARRANTY</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">15.</span><span style=" font-family:'sans-serif';"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">16.</span><span style=" font-family:'sans-serif';"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">END OF TERMS AND CONDITIONS</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">one line to give the library's name and an idea of what it does.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic;">year</span><span style=" font-family:'monospace';"> </span><span style=" font-family:'monospace'; font-style:italic;">name of author</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is free software; you can redistribute it and/or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">modify it under the terms of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License as published by the Free Software Foundation; either</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">version 2.1 of the License, or (at your option) any later version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is distributed in the hope that it will be useful,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Lesser General Public License for more details.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">You should have received a copy of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License along with this library; if not, write to the Free Software</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Also add information on how to contact you by electronic and paper mail.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">the library `Frob' (a library for tweaking knobs) written</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">by James Random Hacker.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">signature of Ty Coon</span><span style=" font-family:'monospace';">, 1 April 1990</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Ty Coon, President of Vice</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">That's all there is to it!</span></p></body></html> - - - - - Close - - - - - Version 1.1.1 - - - - - LimeReport::AlignmentPropItem - - - Left - - - - - Right - - - - - - Center - - - - - Justify - - - - - Top - - - - - Botom - - - - - horizontal - - - - - vertical - - - - - LimeReport::BandDesignIntf - - - DataBand - - - - - DataHeaderBand - - - - - DataFooterBand - - - - - ReportHeader - - - - - ReportFooter - - - - - PageHeader - - - - - PageFooter - - - - - SubDetailBand - - - - - SubDetailHeaderBand - - - - - SubDetailFooterBand - - - - - GroupBandHeader - - - - - GroupBandFooter - - - - - TearOffBand - - - - - connected to - - - - - Bring to top - - - - - Send to back - - - - - - Auto height - - - - - - Splittable - - - - - - Keep bottom space - - - - - - Keep top space - - - - - - Start from new page - - - - - - Start new page - - - - - LimeReport::BaseDesignIntf - - - Copy - - - - - Cut - - - - - Paste - - - - - Bring to top - - - - - Send to back - - - - - Create Horizontal Layout - - - - - No borders - - - - - All borders - - - - - LimeReport::ConnectionDesc - - - - defaultConnection - - - - - LimeReport::ConnectionDialog - - - - Connection - - - - - Connection Name - - - - - Use default application connection - - - - - Driver - - - - - Server - - - - - Port - - - - - User - - - - - Password - - - - - Database - - - - - ... - - - - - Auto connect - - - - - Dont keep credentals in lrxml - - - - - Check connection - - - - - Cancel - - - - - Ok - - - - - - Error - - - - - Connection succsesfully established! - - - - - Connection Name is empty - - - - - Connection with name - - - - - already exists! - - - - - defaultConnection - - - - - LimeReport::DataBand - - - Data - - - - - - Use alternate background color - - - - - LimeReport::DataBrowser - - - - - Datasources - - - - - Add database connection - - - - - - - - - - - - - - - - - ... - - - - - Add new datasource - - - - - View data - - - - - Change datasource - - - - - Delete datasource - - - - - Show error - - - - - Variables - - - - - Add new variable - - - - - Edit variable - - - - - Delete variable - - - - - Grab variable - - - - - - - - Attention - - - - - Do you really want to delete "%1" connection? - - - - - Report variables - - - - - System variables - - - - - External variables - - - - - Do you really want to delete "%1" datasource? - - - - - Do you really want to delete variable "%1"? - - - - - Error - - - - - LimeReport::DataFooterBand - - - DataFooter - - - - - LimeReport::DataHeaderBand - - - DataHeader - - - - - LimeReport::DataSourceManager - - - Connection "%1" is not open - - - - - Variable "%1" not found! - - - - - - Datasource "%1" not found! - - - - - Connection with name "%1" already exists! - - - - - - - - Datasource with name "%1" already exists! - - - - - Database "%1" not found - - - - - invalid connection - - - - - LimeReport::DataSourceModel - - - Datasources - - - - - Variables - - - - - External variables - - - - - LimeReport::DialogDesignerManager - - - Edit Widgets - - - - - Widget Box - - - - - Object Inspector - - - - - Property Editor - - - - - Signals && Slots Editor - - - - - Resource Editor - - - - - Action Editor - - - - - LimeReport::EnumPropItem - - - Default - - - - - Portrait - - - - - Landscape - - - - - NoneAutoWidth - - - - - MaxWordLength - - - - - MaxStringLength - - - - - TransparentMode - - - - - OpaqueMode - - - - - Angle0 - - - - - Angle90 - - - - - Angle180 - - - - - Angle270 - - - - - Angle45 - - - - - Angle315 - - - - - DateTime - - - - - Double - - - - - NoBrush - - - - - SolidPattern - - - - - Dense1Pattern - - - - - Dense2Pattern - - - - - Dense3Pattern - - - - - Dense4Pattern - - - - - Dense5Pattern - - - - - Dense6Pattern - - - - - Dense7Pattern - - - - - HorPattern - - - - - VerPattern - - - - - CrossPattern - - - - - BDiagPattern - - - - - FDiagPattern - - - - - LeftToRight - - - - - RightToLeft - - - - - LayoutDirectionAuto - - - - - LeftItemAlign - - - - - RightItemAlign - - - - - CenterItemAlign - - - - - ParentWidthItemAlign - - - - - DesignedItemAlign - - - - - HorizontalLine - - - - - VerticalLine - - - - - Ellipse - - - - - Rectangle - - - - - Page - - - - - Band - - - - - Horizontal - - - - - Vertical - - - - - VerticalUniform - - - - - Pie - - - - - VerticalBar - - - - - HorizontalBar - - - - - LegendAlignTop - - - - - LegendAlignCenter - - - - - LegendAlignBottom - - - - - TitleAlignLeft - - - - - TitleAlignRight - - - - - TitleAlignCenter - - - - - LimeReport::FlagsPropItem - - - NoLine - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - AllLines - - - - - LimeReport::FontEditorWidget - - - Font bold - - - - - Font Italic - - - - - Font Underline - - - - - LimeReport::FontPropItem - - - bold - - - - - italic - - - - - underline - - - - - size - - - - - family - - - - - LimeReport::GroupBandFooter - - - GroupFooter - - - - - LimeReport::GroupBandHeader - - - GroupHeader - - - - - Group field not found - - - - - Datasource "%1" not found! - - - - - LimeReport::GroupFunction - - - Field "%1" not found - - - - - Variable "%1" not found - - - - - Wrong script syntax "%1" - - - - - Item "%1" not found - - - - - LimeReport::ImageItem - - - - Watermark - - - - - Image - - - - - LimeReport::ItemLocationPropItem - - - Band - - - - - Page - - - - - LimeReport::ItemsAlignmentEditorWidget - - - Bring to top - - - - - Send to back - - - - - Align to left - - - - - Align to right - - - - - Align to vertical center - - - - - Align to top - - - - - Align to bottom - - - - - Align to horizontal center - - - - - Set same height - - - - - Set same width - - - - - LimeReport::ItemsBordersEditorWidget - - - Top line - - - - - Bottom line - - - - - Left line - - - - - Right line - - - - - No borders - - - - - All borders - - - - - LimeReport::MasterDetailProxyModel - - - Field: "%1" not found in "%2" child datasource - - - - - Field: "%1" not found in "%2" master datasource - - - - - LimeReport::ModelToDataSource - - - model is destroyed - - - - - LimeReport::ObjectBrowser - - - Objects - - - - - LimeReport::PageFooter - - - Page Footer - - - - - - Print on first page - - - - - - Print on last page - - - - - LimeReport::PageHeader - - - Page Header - - - - - LimeReport::PageItemDesignIntf - - - Paste - - - - - - Page is TOC - - - - - - Reset page number - - - - - - Full page - - - - - - Set page size to printer - - - - - LimeReport::PreviewReportWidget - - - Form - - - - - PDF file name - - - - - Report file name - - - - - LimeReport::PreviewReportWindow - - - Preview - - - - - View - - - - - Report - - - - - toolBar - - - - - Print - - - - - Ctrl+P - - - - - Zoom In - - - - - Zoom Out - - - - - - Prior Page - - - - - - Next Page - - - - - - Close Preview - - - - - Esc - - - - - Edit Mode - - - - - - Save to file - - - - - - Show errors - - - - - First Page - - - - - First page - - - - - - Last Page - - - - - Print To PDF - - - - - Fit page width - - - - - Fit page - - - - - One to one - - - - - Show Toolbar - - - - - Show toolbar - - - - - Page: - - - - - Font - - - - - Text align - - - - - of %1 - - - - - LimeReport::ProxyHolder - - - Datasource has been invalidated - - - - - LimeReport::QObjectPropertyModel - - - leftMargin - - - - - rightMargin - - - - - topMargin - - - - - bottomMargin - - - - - objectName - - - - - borders - - - - - geometry - - - - - itemAlign - - - - - pageOrientation - - - - - pageSize - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - reprintOnEachPage - - - - - borderLineSize - - - - - autoHeight - - - - - backgroundColor - - - - - - columnCount - - - - - columnsFillDirection - - - - - datasource - - - - - keepBottomSpace - - - - - keepFooterTogether - - - - - keepSubdetailTogether - - - - - printIfEmpty - - - - - sliceLastRow - - - - - splittable - - - - - alignment - - - - - angle - - - - - autoWidth - - - - - backgroundMode - - - - - backgroundOpacity - - - - - content - - - - - font - - - - - fontColor - - - - - foregroundOpacity - - - - - itemLocation - - - - - margin - - - - - stretchToMaxHeight - - - - - trimValue - - - - - lineWidth - - - - - opacity - - - - - penStyle - - - - - shape - - - - - shapeBrush - - - - - shapeBrushColor - - - - - gridStep - - - - - fullPage - - - - - oldPrintMode - - - - - borderColor - - - - - resetPageNumber - - - - - alternateBackgroundColor - - - - - - backgroundBrushStyle - - - - - startFromNewPage - - - - - startNewPage - - - - - adaptFontToSize - - - - - allowHTML - - - - - allowHTMLInFields - - - - - followTo - - - - - format - - - - - lineSpacing - - - - - textIndent - - - - - textLayoutDirection - - - - - underlineLineSize - - - - - underlines - - - - - valueType - - - - - securityLevel - - - - - testValue - - - - - whitespace - - - - - resourcePath - - - - - scale - - - - - cornerRadius - - - - - shapeColor - - - - - layoutType - - - - - barcodeType - - - - - barcodeWidth - - - - - foregroundColor - - - - - inputMode - - - - - pdf417CodeWords - - - - - autoSize - - - - - center - - - - - field - - - - - image - - - - - keepAspectRatio - - - - - columnsCount - - - - - useAlternateBackgroundColor - - - - - printBeforePageHeader - - - - - maxScalePercent - - - - - printOnFirstPage - - - - - printOnLastPage - - - - - printAlways - - - - - repeatOnEachRow - - - - - condition - - - - - groupFieldName - - - - - keepGroupTogether - - - - - endlessHeight - - - - - extendedHeight - - - - - isExtendedInDesignMode - - - - - pageIsTOC - - - - - setPageSizeToPrinter - - - - - fillInSecondPass - - - - - chartTitle - - - - - chartType - - - - - drawLegendBorder - - - - - labelsField - - - - - legendAlign - - - - - series - - - - - titleAlign - - - - - watermark - - - - - keepTopSpace - - - - - printable - - - - - variable - - - - - - Warning - - - - - The language will change after the application is restarted - - - - - Property Name - - - - - Property value - - - - - LimeReport::RectMMPropItem - - - - - width - - - - - - - height - - - - - LimeReport::RectPropItem - - - width - - - - - height - - - - - LimeReport::ReportDesignWidget - - - Script - - - - - Translations - - - - - Report file name - - - - - Error - - - - - Wrong file format - - - - - LimeReport::ReportDesignWindow - - - New Report - - - - - New Report Page - - - - - Delete Report Page - - - - - Edit Mode - - - - - Undo - - - - - Redo - - - - - Copy - - - - - Paste - - - - - Cut - - - - - Settings - - - - - Use grid - - - - - Use magnet - - - - - Text Item - - - - - Save Report - - - - - Save Report As - - - - - Load Report - - - - - Delete item - - - - - Zoom In - - - - - Zoom Out - - - - - Render Report - - - - - Edit layouts mode - - - - - Horizontal layout - - - - - About - - - - - Hide left panel | Alt+L - - - - - Hide right panel | Alt+R - - - - - Delete dialog - - - - - Add new dialog - - - - - Report Tools - - - - - Main Tools - - - - - Font - - - - - Text alignment - - - - - Items alignment - - - - - Borders - - - - - Report bands - - - - - Report Header - - - - - Report Footer - - - - - Page Header - - - - - Page Footer - - - - - Data - - - - - Data Header - - - - - Data Footer - - - - - SubDetail - - - - - SubDetailHeader - - - - - SubDetailFooter - - - - - GroupHeader - - - - - GroupFooter - - - - - Tear-off Band - - - - - File - - - - - Edit - - - - - Info - - - - - Recent Files - - - - - - Object Inspector - - - - - Report structure - - - - - Widget Box - - - - - Property Editor - - - - - Action Editor - - - - - Resource Editor - - - - - SignalSlot Editor - - - - - Dialog Designer Tools - - - - - Data Browser - - - - - Script Browser - - - - - Report has been modified! Do you want save the report? - - - - - - Report file name - - - - - Rendering report - - - - - Abort - - - - - page rendered - - - - - Warning - - - - - File "%1" not found! - - - - - LimeReport::ReportEnginePrivate - - - Preview - - - - - Error - - - - - Report File Change - - - - - The report file "%1" has changed names or been deleted. - -This preview is no longer valid. - - - - - Designer not found! - - - - - Language %1 already exists - - - - - LimeReport::ReportFooter - - - Report Footer - - - - - LimeReport::ReportHeader - - - Report Header - - - - - LimeReport::ReportRender - - - - - Error - - - - - page index out of range - - - - - Databand "%1" not found - - - - - Wrong using function %1 - - - - - LimeReport::SQLEditDialog - - - Datasource - - - - - Connection - - - - - Datasource Name - - - - - Subdetail - - - - - Master datasource - - - - - Subquery mode - - - - - Filter mode - - - - - SQL - - - - - - Preview - - - - - Hide Preview - - - - - Child datasource - - - - - Fields map - - - - - - ... - - - - - Data preview - - - - - Cancel - - - - - Ok - - - - - Error - - - - - Datasource Name is empty! - - - - - SQL is empty! - - - - - Datasource with name: "%1" already exists! - - - - - defaultConnection - - - - - Datasource with name %1 already exist - - - - - - Attention - - - - - Connection is not specified - - - - - Refresh - - - - - LimeReport::ScriptBrowser - - - Form - - - - - Functions - - - - - - - - - - ... - - - - - Dialogs - - - - - Type - - - - - Name - - - - - NO CATEGORY - - - - - - - Error - - - - - Dialog with name: %1 already exists - - - - - ui file must cointain QDialog instead QWidget or QMainWindow - - - - - wrong file format - - - - - LimeReport::ScriptEditor - - - Form - - - - - Data - - - - - Functions - - - - - LimeReport::ScriptEngineContext - - - Dialog with name: %1 can`t be created - - - - - - Error - - - - - LimeReport::ScriptEngineManager - - - Function manager with name "%1" already exists! - - - - - GROUP FUNCTIONS - - - - - FieldName - - - - - - BandName - - - - - Variable %1 not found - - - - - Field %1 not found in %2! - - - - - SYSTEM - - - - - - - NUMBER - - - - - - - - - - - - Value - - - - - - - - - Format - - - - - Precision - - - - - - Locale - - - - - - - - - - DATE&TIME - - - - - CurrencySymbol - - - - - - - - - - - GENERAL - - - - - - - Name - - - - - Datasource - - - - - ValueField - - - - - KeyField - - - - - KeyFieldValue - - - - - Unique identifier - - - - - Content - - - - - Indent - - - - - datasourceName - - - - - LimeReport::SettingDialog - - - Designer setting - - - - - Designer Setting - - - - - Default font - - - - - Grid - - - - - Vertical grid step - - - - - Horizontal grid step - - - - - Language - - - - - Use dark theme - - - - - Report Setting - - - - - Suppress absent fields and variables warning - - - - - LimeReport::SubDetailBand - - - SubDetail - - - - - LimeReport::SubDetailHeaderBand - - - SubDetailHeader - - - - - LimeReport::TearOffBand - - - Tear-off Band - - - - - LimeReport::TextAlignmentEditorWidget - - - Text align left - - - - - - Text align center - - - - - Text align right - - - - - Text align justify - - - - - Text align top - - - - - Text align bottom - - - - - LimeReport::TextItem - - - - Edit - - - - - - Auto height - - - - - - Allow HTML - - - - - - Allow HTML in fields - - - - - - Stretch to max height - - - - - - Transparent - - - - - - Watermark - - - - - - Error - - - - - TextItem " %1 " already has folower " %2 " - - - - - TextItem " %1 " not found! - - - - - LimeReport::TextItemEditor - - - Text Item Editor - - - - - Content - - - - - Editor settings - - - - - Editor font - - - - - ... - - - - - Ok - - - - - Ctrl+Return - - - - - Cancel - - - - - Esc - - - - - LimeReport::TranslationEditor - - - Form - - - - - Languages - - - - - - ... - - - - - Pages - - - - - Strings - - - - - Source Text - - - - - Translation - - - - - Checked - - - - - Report Item - - - - - Property - - - - - Source text - - - - - LimeReport::VariablesHolder - - - - - - variable with name - - - - - already exists! - - - - - - - does not exists! - - - - - QObject - - - - - Data - - - - - - DataHeader - - - - - - DataFooter - - - - - - GroupHeader - - - - - - GroupFooter - - - - - - - Page Footer - - - - - - - Page Header - - - - - - Report Footer - - - - - - Report Header - - - - - - - SubDetail - - - - - - SubDetailHeader - - - - - - SubDetailFooter - - - - - - Tear-off Band - - - - - - alignment - - - - - - Barcode Item - - - - - - Chart Item - - - - - First - - - - - Second - - - - - Thrid - - - - - - HLayout - - - - - - Image Item - - - - - - Shape Item - - - - - - itemLocation - - - - - - Text Item - - - - - - Invalid connection! %1 - - - - - Master datasource "%1" not found! - - - - - Master datasouce "%1" not found! - - - - - Child - - - - - and child - - - - - datasouce "%1" not found! - - - - - - bool - - - - - - QColor - - - - - - content - - - - - - - - - datasource - - - - - - - - field - - - - - - enum - - - - - - flags - - - - - - QFont - - - - - - QImage - - - - - - int - - - - - - - - qreal - - - - - - QRect - - - - - - QRectF - - - - - - geometry - - - - - - QString - - - - - Attention! - - - - - Selected elements have different parent containers - - - - - Object with name %1 already exists! - - - - - Function %1 not found or have wrong arguments - - - - - Datasource manager not found - - - - - mm - - - - - Wrong file format - - - - - File %1 not opened - - - - - Content string is empty - - - - - Content is empty - - - - diff --git a/limereport/limereport_zh.ts b/limereport/limereport_zh.ts deleted file mode 100644 index d1bae34..0000000 --- a/limereport/limereport_zh.ts +++ /dev/null @@ -1,3724 +0,0 @@ - - - - - ChartItemEditor - - - Series editor - - - - - Series - - - - - Add - - - - - Delete - - - - - Name - - - - - Values field - - - - - Color - - - - - Type - - - - - Labels field - - - - - Ok - - - - - Series name - - - - - LRVariableDialog - - - Variable - - - - - Name - - - - - Value - - - - - Type - - - - - Mandatory - - - - - Attention - - - - - LanguageSelectDialog - - - Dialog - - - - - Language - - - - - LimeReport::AboutDialog - - - About - - - - - Lime Report - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><img src=":/report/images/logo_100.png" height="100" style="float: left;" /><span style=" font-size:12pt; font-weight:600;">Report engine for </span><span style=" font-size:12pt; font-weight:600; color:#7faa18;">Qt</span><span style=" font-size:12pt; font-weight:600;"> framework</span></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">LimeReport - multi-platform C++ library written using Qt framework and intended for software developers that would like to add into their application capability to form report or print forms generated using templates.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">Official web site : </span><a href="www.limereport.ru"><span style=" font-size:11pt; text-decoration: underline; color:#0000ff;">www.limereport.ru</span></a></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; text-decoration: underline; color:#0000ff;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt; font-weight:600;">This library 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.</span></p> -<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:10pt; font-weight:600; color:#000000;"><br /></p> -<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:10pt;">Copyright 2015 Arin Alexander. All rights reserved.</span></p></body></html> - - - - - Author - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Arin Alexander</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">arin_a@bk.ru</p></body></html> - - - - - License - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(c) 2015 Arin Alexander arin_a@bk.ru</p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC1"></a><span style=" font-family:'sans-serif'; font-weight:600;">G</span><span style=" font-family:'sans-serif'; font-weight:600;">NU LESSER GENERAL PUBLIC LICENSE</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Version 2.1, February 1999</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) 1991, 1999 Free Software Foundation, Inc.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Everyone is permitted to copy and distribute verbatim copies</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">of this license document, but changing it is not allowed.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">[This is the first released version of the Lesser GPL. It also counts</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> as the successor of the GNU Library Public License, version 2, hence</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';"> the version number 2.1.]</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC2"></a><span style=" font-family:'sans-serif'; font-weight:600;">P</span><span style=" font-family:'sans-serif'; font-weight:600;">reamble</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">We call this license the &quot;Lesser&quot; General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a &quot;work based on the library&quot; and a &quot;work that uses the library&quot;. The former contains code derived from the library, whereas the latter must be combined with the library in order to run.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC3"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">T</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">0.</span><span style=" font-family:'sans-serif';"> This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called &quot;this License&quot;). Each licensee is addressed as &quot;you&quot;.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">A &quot;library&quot; means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">The &quot;Library&quot;, below, refers to any such software library or work which has been distributed under these terms. A &quot;work based on the Library&quot; means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term &quot;modification&quot;.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">&quot;Source code&quot; for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">1.</span><span style=" font-family:'sans-serif';"> You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">2.</span><span style=" font-family:'sans-serif';"> You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> The modified work must itself be a software library.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.</span></li></ul> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:38px; margin-right:19px; -qt-block-indent:1; text-indent:0px;"><span style=" font-family:'sans-serif';">(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">3.</span><span style=" font-family:'sans-serif';"> You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This option is useful when you wish to copy part of the code of the Library into a program that is not a library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">4.</span><span style=" font-family:'sans-serif';"> You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">5.</span><span style=" font-family:'sans-serif';"> A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a &quot;work that uses the Library&quot;. Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">However, linking a &quot;work that uses the Library&quot; with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a &quot;work that uses the library&quot;. The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">When a &quot;work that uses the Library&quot; uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">6.</span><span style=" font-family:'sans-serif';"> As an exception to the Sections above, you may also combine or link a &quot;work that uses the Library&quot; with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable &quot;work that uses the Library&quot;, as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">c)</span><span style=" font-size:16px;"> Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">d)</span><span style=" font-size:16px;"> If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">e)</span><span style=" font-size:16px;"> Verify that the user has already received a copy of these materials or that you have already sent this user a copy.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">For an executable, the required form of the &quot;work that uses the Library&quot; must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">7.</span><span style=" font-family:'sans-serif';"> You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:</span></p> -<ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" font-family:'sans-serif';" style=" margin-top:19px; margin-bottom:0px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">a)</span><span style=" font-size:16px;"> Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.</span></li> -<li style=" font-family:'sans-serif';" style=" margin-top:0px; margin-bottom:19px; margin-left:38px; margin-right:19px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16px; font-weight:600;">b)</span><span style=" font-size:16px;"> Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.</span></li></ul> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">8.</span><span style=" font-family:'sans-serif';"> You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">9.</span><span style=" font-family:'sans-serif';"> You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">10.</span><span style=" font-family:'sans-serif';"> Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">11.</span><span style=" font-family:'sans-serif';"> If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">12.</span><span style=" font-family:'sans-serif';"> If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">13.</span><span style=" font-family:'sans-serif';"> The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and &quot;any later version&quot;, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">14.</span><span style=" font-family:'sans-serif';"> If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">NO WARRANTY</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">15.</span><span style=" font-family:'sans-serif';"> BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY &quot;AS IS&quot; WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600;">16.</span><span style=" font-family:'sans-serif';"> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">END OF TERMS AND CONDITIONS</span></p> -<p style=" margin-top:15px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a name="SEC4"></a><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">H</span><span style=" font-family:'sans-serif'; font-weight:600; color:#333333;">ow to Apply These Terms to Your New Libraries</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the &quot;copyright&quot; line and a pointer to where the full notice is found.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">one line to give the library's name and an idea of what it does.</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Copyright (C) </span><span style=" font-family:'monospace'; font-style:italic;">year</span><span style=" font-family:'monospace';"> </span><span style=" font-family:'monospace'; font-style:italic;">name of author</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace'; font-style:italic;"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is free software; you can redistribute it and/or</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">modify it under the terms of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License as published by the Free Software Foundation; either</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">version 2.1 of the License, or (at your option) any later version.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">This library is distributed in the hope that it will be useful,</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">but WITHOUT ANY WARRANTY; without even the implied warranty of</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Lesser General Public License for more details.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">You should have received a copy of the GNU Lesser General Public</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">License along with this library; if not, write to the Free Software</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">Also add information on how to contact you by electronic and paper mail.</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">You should also get your employer (if you work as a programmer) or your school, if any, to sign a &quot;copyright disclaimer&quot; for the library, if necessary. Here is a sample; alter the names:</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Yoyodyne, Inc., hereby disclaims all copyright interest in</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">the library `Frob' (a library for tweaking knobs) written</span></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">by James Random Hacker.</span></p> -<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'monospace';"><br /></p> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace'; font-style:italic;">signature of Ty Coon</span><span style=" font-family:'monospace';">, 1 April 1990</span></p> -<p style=" margin-top:0px; margin-bottom:15px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'monospace';">Ty Coon, President of Vice</span></p> -<p style=" margin-top:19px; margin-bottom:19px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'sans-serif';">That's all there is to it!</span></p></body></html> - - - - - Close - - - - - Version 1.1.1 - - - - - LimeReport::AlignmentPropItem - - - Left - - - - - Right - - - - - - Center - - - - - Justify - - - - - Top - - - - - Botom - - - - - horizontal - - - - - vertical - - - - - LimeReport::BandDesignIntf - - - DataBand - - - - - DataHeaderBand - - - - - DataFooterBand - - - - - ReportHeader - - - - - ReportFooter - - - - - PageHeader - - - - - PageFooter - - - - - SubDetailBand - - - - - SubDetailHeaderBand - - - - - SubDetailFooterBand - - - - - GroupBandHeader - - - - - GroupBandFooter - - - - - TearOffBand - - - - - connected to - - - - - Bring to top - - - - - Send to back - - - - - - Auto height - - - - - - Splittable - - - - - - Keep bottom space - - - - - - Keep top space - - - - - - Start from new page - - - - - - Start new page - - - - - LimeReport::BaseDesignIntf - - - Copy - - - - - Cut - - - - - Paste - - - - - Bring to top - - - - - Send to back - - - - - Create Horizontal Layout - - - - - No borders - - - - - All borders - - - - - LimeReport::ConnectionDesc - - - - defaultConnection - - - - - LimeReport::ConnectionDialog - - - - Connection - - - - - Connection Name - - - - - Use default application connection - - - - - Driver - - - - - Server - - - - - Port - - - - - User - - - - - Password - - - - - Database - - - - - ... - - - - - Auto connect - - - - - Dont keep credentals in lrxml - - - - - Check connection - - - - - Cancel - - - - - Ok - - - - - - Error - - - - - Connection succsesfully established! - - - - - Connection Name is empty - - - - - Connection with name - - - - - already exists! - - - - - defaultConnection - - - - - LimeReport::DataBand - - - Data - - - - - - Use alternate background color - - - - - LimeReport::DataBrowser - - - - - Datasources - - - - - Add database connection - - - - - - - - - - - - - - - - - ... - - - - - Add new datasource - - - - - View data - - - - - Change datasource - - - - - Delete datasource - - - - - Show error - - - - - Variables - - - - - Add new variable - - - - - Edit variable - - - - - Delete variable - - - - - Grab variable - - - - - - - - Attention - - - - - Do you really want to delete "%1" connection? - - - - - Report variables - - - - - System variables - - - - - External variables - - - - - Do you really want to delete "%1" datasource? - - - - - Do you really want to delete variable "%1"? - - - - - Error - - - - - LimeReport::DataFooterBand - - - DataFooter - - - - - LimeReport::DataHeaderBand - - - DataHeader - - - - - LimeReport::DataSourceManager - - - Connection "%1" is not open - - - - - Variable "%1" not found! - - - - - - Datasource "%1" not found! - - - - - Connection with name "%1" already exists! - - - - - - - - Datasource with name "%1" already exists! - - - - - Database "%1" not found - - - - - invalid connection - - - - - LimeReport::DataSourceModel - - - Datasources - - - - - Variables - - - - - External variables - - - - - LimeReport::DialogDesignerManager - - - Edit Widgets - - - - - Widget Box - - - - - Object Inspector - - - - - Property Editor - - - - - Signals && Slots Editor - - - - - Resource Editor - - - - - Action Editor - - - - - LimeReport::EnumPropItem - - - Default - - - - - Portrait - - - - - Landscape - - - - - NoneAutoWidth - - - - - MaxWordLength - - - - - MaxStringLength - - - - - TransparentMode - - - - - OpaqueMode - - - - - Angle0 - - - - - Angle90 - - - - - Angle180 - - - - - Angle270 - - - - - Angle45 - - - - - Angle315 - - - - - DateTime - - - - - Double - - - - - NoBrush - - - - - SolidPattern - - - - - Dense1Pattern - - - - - Dense2Pattern - - - - - Dense3Pattern - - - - - Dense4Pattern - - - - - Dense5Pattern - - - - - Dense6Pattern - - - - - Dense7Pattern - - - - - HorPattern - - - - - VerPattern - - - - - CrossPattern - - - - - BDiagPattern - - - - - FDiagPattern - - - - - LeftToRight - - - - - RightToLeft - - - - - LayoutDirectionAuto - - - - - LeftItemAlign - - - - - RightItemAlign - - - - - CenterItemAlign - - - - - ParentWidthItemAlign - - - - - DesignedItemAlign - - - - - HorizontalLine - - - - - VerticalLine - - - - - Ellipse - - - - - Rectangle - - - - - Page - - - - - Band - - - - - Horizontal - - - - - Vertical - - - - - VerticalUniform - - - - - Pie - - - - - VerticalBar - - - - - HorizontalBar - - - - - LegendAlignTop - - - - - LegendAlignCenter - - - - - LegendAlignBottom - - - - - TitleAlignLeft - - - - - TitleAlignRight - - - - - TitleAlignCenter - - - - - LimeReport::FlagsPropItem - - - NoLine - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - AllLines - - - - - LimeReport::FontEditorWidget - - - Font bold - - - - - Font Italic - - - - - Font Underline - - - - - LimeReport::FontPropItem - - - bold - - - - - italic - - - - - underline - - - - - size - - - - - family - - - - - LimeReport::GroupBandFooter - - - GroupFooter - - - - - LimeReport::GroupBandHeader - - - GroupHeader - - - - - Group field not found - - - - - Datasource "%1" not found! - - - - - LimeReport::GroupFunction - - - Field "%1" not found - - - - - Variable "%1" not found - - - - - Wrong script syntax "%1" - - - - - Item "%1" not found - - - - - LimeReport::ImageItem - - - - Watermark - - - - - Image - - - - - LimeReport::ItemLocationPropItem - - - Band - - - - - Page - - - - - LimeReport::ItemsAlignmentEditorWidget - - - Bring to top - - - - - Send to back - - - - - Align to left - - - - - Align to right - - - - - Align to vertical center - - - - - Align to top - - - - - Align to bottom - - - - - Align to horizontal center - - - - - Set same height - - - - - Set same width - - - - - LimeReport::ItemsBordersEditorWidget - - - Top line - - - - - Bottom line - - - - - Left line - - - - - Right line - - - - - No borders - - - - - All borders - - - - - LimeReport::MasterDetailProxyModel - - - Field: "%1" not found in "%2" child datasource - - - - - Field: "%1" not found in "%2" master datasource - - - - - LimeReport::ModelToDataSource - - - model is destroyed - - - - - LimeReport::ObjectBrowser - - - Objects - - - - - LimeReport::PageFooter - - - Page Footer - - - - - - Print on first page - - - - - - Print on last page - - - - - LimeReport::PageHeader - - - Page Header - - - - - LimeReport::PageItemDesignIntf - - - Paste - - - - - - Page is TOC - - - - - - Reset page number - - - - - - Full page - - - - - - Set page size to printer - - - - - LimeReport::PreviewReportWidget - - - Form - - - - - PDF file name - - - - - Report file name - - - - - LimeReport::PreviewReportWindow - - - Preview - - - - - View - - - - - Report - - - - - toolBar - - - - - Print - - - - - Ctrl+P - - - - - Zoom In - - - - - Zoom Out - - - - - - Prior Page - - - - - - Next Page - - - - - - Close Preview - - - - - Esc - - - - - Edit Mode - - - - - - Save to file - - - - - - Show errors - - - - - First Page - - - - - First page - - - - - - Last Page - - - - - Print To PDF - - - - - Fit page width - - - - - Fit page - - - - - One to one - - - - - Show Toolbar - - - - - Show toolbar - - - - - Page: - - - - - Font - - - - - Text align - - - - - of %1 - - - - - LimeReport::ProxyHolder - - - Datasource has been invalidated - - - - - LimeReport::QObjectPropertyModel - - - leftMargin - - - - - rightMargin - - - - - topMargin - - - - - bottomMargin - - - - - objectName - - - - - borders - - - - - geometry - - - - - itemAlign - - - - - pageOrientation - - - - - pageSize - - - - - TopLine - - - - - BottomLine - - - - - LeftLine - - - - - RightLine - - - - - reprintOnEachPage - - - - - borderLineSize - - - - - autoHeight - - - - - backgroundColor - - - - - - columnCount - - - - - columnsFillDirection - - - - - datasource - - - - - keepBottomSpace - - - - - keepFooterTogether - - - - - keepSubdetailTogether - - - - - printIfEmpty - - - - - sliceLastRow - - - - - splittable - - - - - alignment - - - - - angle - - - - - autoWidth - - - - - backgroundMode - - - - - backgroundOpacity - - - - - content - - - - - font - - - - - fontColor - - - - - foregroundOpacity - - - - - itemLocation - - - - - margin - - - - - stretchToMaxHeight - - - - - trimValue - - - - - lineWidth - - - - - opacity - - - - - penStyle - - - - - shape - - - - - shapeBrush - - - - - shapeBrushColor - - - - - gridStep - - - - - fullPage - - - - - oldPrintMode - - - - - borderColor - - - - - resetPageNumber - - - - - alternateBackgroundColor - - - - - - backgroundBrushStyle - - - - - startFromNewPage - - - - - startNewPage - - - - - adaptFontToSize - - - - - allowHTML - - - - - allowHTMLInFields - - - - - followTo - - - - - format - - - - - lineSpacing - - - - - textIndent - - - - - textLayoutDirection - - - - - underlineLineSize - - - - - underlines - - - - - valueType - - - - - securityLevel - - - - - testValue - - - - - whitespace - - - - - resourcePath - - - - - scale - - - - - cornerRadius - - - - - shapeColor - - - - - layoutType - - - - - barcodeType - - - - - barcodeWidth - - - - - foregroundColor - - - - - inputMode - - - - - pdf417CodeWords - - - - - autoSize - - - - - center - - - - - field - - - - - image - - - - - keepAspectRatio - - - - - columnsCount - - - - - useAlternateBackgroundColor - - - - - printBeforePageHeader - - - - - maxScalePercent - - - - - printOnFirstPage - - - - - printOnLastPage - - - - - printAlways - - - - - repeatOnEachRow - - - - - condition - - - - - groupFieldName - - - - - keepGroupTogether - - - - - endlessHeight - - - - - extendedHeight - - - - - isExtendedInDesignMode - - - - - pageIsTOC - - - - - setPageSizeToPrinter - - - - - fillInSecondPass - - - - - chartTitle - - - - - chartType - - - - - drawLegendBorder - - - - - labelsField - - - - - legendAlign - - - - - series - - - - - titleAlign - - - - - watermark - - - - - keepTopSpace - - - - - printable - - - - - variable - - - - - - Warning - - - - - The language will change after the application is restarted - - - - - Property Name - - - - - Property value - - - - - LimeReport::RectMMPropItem - - - - - width - - - - - - - height - - - - - LimeReport::RectPropItem - - - width - - - - - height - - - - - LimeReport::ReportDesignWidget - - - Script - - - - - Translations - - - - - Report file name - - - - - Error - - - - - Wrong file format - - - - - LimeReport::ReportDesignWindow - - - New Report - - - - - New Report Page - - - - - Delete Report Page - - - - - Edit Mode - - - - - Undo - - - - - Redo - - - - - Copy - - - - - Paste - - - - - Cut - - - - - Settings - - - - - Use grid - - - - - Use magnet - - - - - Text Item - - - - - Save Report - - - - - Save Report As - - - - - Load Report - - - - - Delete item - - - - - Zoom In - - - - - Zoom Out - - - - - Render Report - - - - - Edit layouts mode - - - - - Horizontal layout - - - - - About - - - - - Hide left panel | Alt+L - - - - - Hide right panel | Alt+R - - - - - Delete dialog - - - - - Add new dialog - - - - - Report Tools - - - - - Main Tools - - - - - Font - - - - - Text alignment - - - - - Items alignment - - - - - Borders - - - - - Report bands - - - - - Report Header - - - - - Report Footer - - - - - Page Header - - - - - Page Footer - - - - - Data - - - - - Data Header - - - - - Data Footer - - - - - SubDetail - - - - - SubDetailHeader - - - - - SubDetailFooter - - - - - GroupHeader - - - - - GroupFooter - - - - - Tear-off Band - - - - - File - - - - - Edit - - - - - Info - - - - - Recent Files - - - - - - Object Inspector - - - - - Report structure - - - - - Widget Box - - - - - Property Editor - - - - - Action Editor - - - - - Resource Editor - - - - - SignalSlot Editor - - - - - Dialog Designer Tools - - - - - Data Browser - - - - - Script Browser - - - - - Report has been modified! Do you want save the report? - - - - - - Report file name - - - - - Rendering report - - - - - Abort - - - - - page rendered - - - - - Warning - - - - - File "%1" not found! - - - - - LimeReport::ReportEnginePrivate - - - Preview - - - - - Error - - - - - Report File Change - - - - - The report file "%1" has changed names or been deleted. - -This preview is no longer valid. - - - - - Designer not found! - - - - - Language %1 already exists - - - - - LimeReport::ReportFooter - - - Report Footer - - - - - LimeReport::ReportHeader - - - Report Header - - - - - LimeReport::ReportRender - - - - - Error - - - - - page index out of range - - - - - Databand "%1" not found - - - - - Wrong using function %1 - - - - - LimeReport::SQLEditDialog - - - Datasource - - - - - Connection - - - - - Datasource Name - - - - - Subdetail - - - - - Master datasource - - - - - Subquery mode - - - - - Filter mode - - - - - SQL - - - - - - Preview - - - - - Hide Preview - - - - - Child datasource - - - - - Fields map - - - - - - ... - - - - - Data preview - - - - - Cancel - - - - - Ok - - - - - Error - - - - - Datasource Name is empty! - - - - - SQL is empty! - - - - - Datasource with name: "%1" already exists! - - - - - defaultConnection - - - - - Datasource with name %1 already exist - - - - - - Attention - - - - - Connection is not specified - - - - - Refresh - - - - - LimeReport::ScriptBrowser - - - Form - - - - - Functions - - - - - - - - - - ... - - - - - Dialogs - - - - - Type - - - - - Name - - - - - NO CATEGORY - - - - - - - Error - - - - - Dialog with name: %1 already exists - - - - - ui file must cointain QDialog instead QWidget or QMainWindow - - - - - wrong file format - - - - - LimeReport::ScriptEditor - - - Form - - - - - Data - - - - - Functions - - - - - LimeReport::ScriptEngineContext - - - Dialog with name: %1 can`t be created - - - - - - Error - - - - - LimeReport::ScriptEngineManager - - - Function manager with name "%1" already exists! - - - - - GROUP FUNCTIONS - - - - - FieldName - - - - - - BandName - - - - - Variable %1 not found - - - - - Field %1 not found in %2! - - - - - SYSTEM - - - - - - - NUMBER - - - - - - - - - - - - Value - - - - - - - - - Format - - - - - Precision - - - - - - Locale - - - - - - - - - - DATE&TIME - - - - - CurrencySymbol - - - - - - - - - - - GENERAL - - - - - - - Name - - - - - Datasource - - - - - ValueField - - - - - KeyField - - - - - KeyFieldValue - - - - - Unique identifier - - - - - Content - - - - - Indent - - - - - datasourceName - - - - - LimeReport::SettingDialog - - - Designer setting - - - - - Designer Setting - - - - - Default font - - - - - Grid - - - - - Vertical grid step - - - - - Horizontal grid step - - - - - Language - - - - - Use dark theme - - - - - Report Setting - - - - - Suppress absent fields and variables warning - - - - - LimeReport::SubDetailBand - - - SubDetail - - - - - LimeReport::SubDetailHeaderBand - - - SubDetailHeader - - - - - LimeReport::TearOffBand - - - Tear-off Band - - - - - LimeReport::TextAlignmentEditorWidget - - - Text align left - - - - - - Text align center - - - - - Text align right - - - - - Text align justify - - - - - Text align top - - - - - Text align bottom - - - - - LimeReport::TextItem - - - - Edit - - - - - - Auto height - - - - - - Allow HTML - - - - - - Allow HTML in fields - - - - - - Stretch to max height - - - - - - Transparent - - - - - - Watermark - - - - - - Error - - - - - TextItem " %1 " already has folower " %2 " - - - - - TextItem " %1 " not found! - - - - - LimeReport::TextItemEditor - - - Text Item Editor - - - - - Content - - - - - Editor settings - - - - - Editor font - - - - - ... - - - - - Ok - - - - - Ctrl+Return - - - - - Cancel - - - - - Esc - - - - - LimeReport::TranslationEditor - - - Form - - - - - Languages - - - - - - ... - - - - - Pages - - - - - Strings - - - - - Source Text - - - - - Translation - - - - - Checked - - - - - Report Item - - - - - Property - - - - - Source text - - - - - LimeReport::VariablesHolder - - - - - - variable with name - - - - - already exists! - - - - - - - does not exists! - - - - - QObject - - - - - Data - - - - - - DataHeader - - - - - - DataFooter - - - - - - GroupHeader - - - - - - GroupFooter - - - - - - - Page Footer - - - - - - - Page Header - - - - - - Report Footer - - - - - - Report Header - - - - - - - SubDetail - - - - - - SubDetailHeader - - - - - - SubDetailFooter - - - - - - Tear-off Band - - - - - - alignment - - - - - - Barcode Item - - - - - - Chart Item - - - - - First - - - - - Second - - - - - Thrid - - - - - - HLayout - - - - - - Image Item - - - - - - Shape Item - - - - - - itemLocation - - - - - - Text Item - - - - - - Invalid connection! %1 - - - - - Master datasource "%1" not found! - - - - - Master datasouce "%1" not found! - - - - - Child - - - - - and child - - - - - datasouce "%1" not found! - - - - - - bool - - - - - - QColor - - - - - - content - - - - - - - - - datasource - - - - - - - - field - - - - - - enum - - - - - - flags - - - - - - QFont - - - - - - QImage - - - - - - int - - - - - - - - qreal - - - - - - QRect - - - - - - QRectF - - - - - - geometry - - - - - - QString - - - - - Attention! - - - - - Selected elements have different parent containers - - - - - Object with name %1 already exists! - - - - - Function %1 not found or have wrong arguments - - - - - Datasource manager not found - - - - - mm - - - - - Wrong file format - - - - - File %1 not opened - - - - - Content string is empty - - - - - Content is empty - - - - From 9f00119fbc309e03156d536e1d5b1282343fc885 Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Tue, 11 Jun 2019 21:28:58 +0300 Subject: [PATCH 323/347] Typos have been fixed --- designer/designersettingmanager.cpp | 4 ++-- designer/designersettingmanager.h | 4 ++-- designer/main.cpp | 8 ++++---- include/lrreportengine.h | 8 ++++---- limereport/lrreportengine.cpp | 18 +++++++++--------- limereport/lrreportengine.h | 8 ++++---- limereport/lrreportengine_p.h | 4 ++-- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/designer/designersettingmanager.cpp b/designer/designersettingmanager.cpp index 02251b2..550772e 100644 --- a/designer/designersettingmanager.cpp +++ b/designer/designersettingmanager.cpp @@ -11,7 +11,7 @@ DesignerSettingManager::~DesignerSettingManager() delete m_setting; } -void DesignerSettingManager::getAviableLanguages(QList* languages) +void DesignerSettingManager::getAvailableLanguages(QList* languages) { languages->append(QLocale::Russian); languages->append(QLocale::English); @@ -33,7 +33,7 @@ QLocale::Language DesignerSettingManager::getCurrentDefaultLanguage() } } -void DesignerSettingManager::currentDefaulLanguageChanged(QLocale::Language language) +void DesignerSettingManager::currentDefaultLanguageChanged(QLocale::Language language) { QMessageBox::information(0, tr("Warning") , tr("The language will change after the application is restarted")); m_setting->beginGroup("ReportDesigner"); diff --git a/designer/designersettingmanager.h b/designer/designersettingmanager.h index 2443718..d5c13c9 100644 --- a/designer/designersettingmanager.h +++ b/designer/designersettingmanager.h @@ -14,9 +14,9 @@ public: ~DesignerSettingManager(); void setApplicationInstance(QApplication* application); public slots: - void getAviableLanguages(QList* languages); + void getAvailableLanguages(QList* languages); QLocale::Language getCurrentDefaultLanguage(); - void currentDefaulLanguageChanged(QLocale::Language language); + void currentDefaultLanguageChanged(QLocale::Language language); private: QApplication* m_app; QSettings* m_setting; diff --git a/designer/main.cpp b/designer/main.cpp index 413f33f..9795432 100644 --- a/designer/main.cpp +++ b/designer/main.cpp @@ -38,14 +38,14 @@ int main(int argc, char *argv[]) if (a.arguments().count()>1){ report.loadFromFile(a.arguments().at(1)); } - QObject::connect(&report, SIGNAL(getAviableLanguages(QList*)), - &manager, SLOT(getAviableLanguages(QList*))); + QObject::connect(&report, SIGNAL(getAvailableLanguages(QList*)), + &manager, SLOT(getAvailableLanguages(QList*))); QObject::connect(&report, SIGNAL(getCurrentDefaultLanguage()), &manager, SLOT(getCurrentDefaultLanguage())); - QObject::connect(&report, SIGNAL(currentDefaulLanguageChanged(QLocale::Language)), - &manager, SLOT(currentDefaulLanguageChanged(QLocale::Language))); + QObject::connect(&report, SIGNAL(currentDefaultLanguageChanged(QLocale::Language)), + &manager, SLOT(currentDefaultLanguageChanged(QLocale::Language))); report.designReport(); return a.exec(); diff --git a/include/lrreportengine.h b/include/lrreportengine.h index c36d7bb..d2097ad 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -191,8 +191,8 @@ public: void setPrintVisible(bool value); bool printIsVisible(); bool isBusy(); - void setPassPharse(QString& passPharse); - QList aviableLanguages(); + void setPassPhrase(QString& passPhrase); + QList availableLanguages(); bool setReportLanguage(QLocale::Language language); Qt::LayoutDirection previewLayoutDirection(); void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); @@ -220,8 +220,8 @@ signals: void loadFinished(); void printedToPDF(QString fileName); - void getAviableLanguages(QList* languages); - void currentDefaulLanguageChanged(QLocale::Language); + void getAvailableLanguages(QList* languages); + void currentDefaultLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 6f189c7..6a7fb72 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1080,7 +1080,7 @@ QList ReportEnginePrivate::designerLanguages() { QList result; - emit getAviableLanguages(&result); + emit getAvailableLanguages(&result); return result; } @@ -1093,7 +1093,7 @@ QLocale::Language ReportEnginePrivate::currentDesignerLanguage() void ReportEnginePrivate::setCurrentDesignerLanguage(QLocale::Language language) { m_currentDesignerLanguage = language; - emit currentDefaulLanguageChanged(language); + emit currentDefaultLanguageChanged(language); } QString ReportEnginePrivate::styleSheet() const @@ -1387,10 +1387,10 @@ ReportEngine::ReportEngine(QObject *parent) connect(d, SIGNAL(cleared()), this, SIGNAL(cleared())); connect(d, SIGNAL(printedToPDF(QString)), this, SIGNAL(printedToPDF(QString))); - connect(d, SIGNAL(getAviableLanguages(QList*)), - this, SIGNAL(getAviableLanguages(QList*))); - connect(d, SIGNAL(currentDefaulLanguageChanged(QLocale::Language)), - this, SIGNAL(currentDefaulLanguageChanged(QLocale::Language))); + connect(d, SIGNAL(getAvailableLanguages(QList*)), + this, SIGNAL(getAvailableLanguages(QList*))); + connect(d, SIGNAL(currentDefaultLanguageChanged(QLocale::Language)), + this, SIGNAL(currentDefaultLanguageChanged(QLocale::Language))); connect(d, SIGNAL(getCurrentDefaultLanguage()), this, SIGNAL(getCurrentDefaultLanguage())); @@ -1548,13 +1548,13 @@ bool ReportEngine::isBusy() return d->isBusy(); } -void ReportEngine::setPassPharse(QString &passPharse) +void ReportEngine::setPassPhrase(QString &passPhrase) { Q_D(ReportEngine); - d->setPassPhrase(passPharse); + d->setPassPhrase(passPhrase); } -QList ReportEngine::aviableLanguages() +QList ReportEngine::availableLanguages() { Q_D(ReportEngine); return d->aviableLanguages(); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index c36d7bb..d2097ad 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -191,8 +191,8 @@ public: void setPrintVisible(bool value); bool printIsVisible(); bool isBusy(); - void setPassPharse(QString& passPharse); - QList aviableLanguages(); + void setPassPhrase(QString& passPhrase); + QList availableLanguages(); bool setReportLanguage(QLocale::Language language); Qt::LayoutDirection previewLayoutDirection(); void setPreviewLayoutDirection(const Qt::LayoutDirection& previewLayoutDirection); @@ -220,8 +220,8 @@ signals: void loadFinished(); void printedToPDF(QString fileName); - void getAviableLanguages(QList* languages); - void currentDefaulLanguageChanged(QLocale::Language); + void getAvailableLanguages(QList* languages); + void currentDefaultLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index 82a7bd4..bd812f0 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -263,8 +263,8 @@ signals: void loadFinished(); void printedToPDF(QString fileName); - void getAviableLanguages(QList* languages); - void currentDefaulLanguageChanged(QLocale::Language); + void getAvailableLanguages(QList* languages); + void currentDefaultLanguageChanged(QLocale::Language); QLocale::Language getCurrentDefaultLanguage(); void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); From 693e45d6d7f42881df988acba9a7bddc9766844e Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Tue, 11 Jun 2019 21:55:59 +0300 Subject: [PATCH 324/347] Some service signals have been renamed. --- designer/main.cpp | 6 +++--- include/lrreportengine.h | 6 +++--- limereport/lrreportengine.cpp | 18 +++++++++--------- limereport/lrreportengine.h | 6 +++--- limereport/lrreportengine_p.h | 6 +++--- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/designer/main.cpp b/designer/main.cpp index 9795432..8d06579 100644 --- a/designer/main.cpp +++ b/designer/main.cpp @@ -38,13 +38,13 @@ int main(int argc, char *argv[]) if (a.arguments().count()>1){ report.loadFromFile(a.arguments().at(1)); } - QObject::connect(&report, SIGNAL(getAvailableLanguages(QList*)), + QObject::connect(&report, SIGNAL(getAvailableDesignerLanguages(QList*)), &manager, SLOT(getAvailableLanguages(QList*))); - QObject::connect(&report, SIGNAL(getCurrentDefaultLanguage()), + QObject::connect(&report, SIGNAL(getCurrentDefaultDesignerLanguage()), &manager, SLOT(getCurrentDefaultLanguage())); - QObject::connect(&report, SIGNAL(currentDefaultLanguageChanged(QLocale::Language)), + QObject::connect(&report, SIGNAL(currentDefaultDesignerLanguageChanged(QLocale::Language)), &manager, SLOT(currentDefaultLanguageChanged(QLocale::Language))); report.designReport(); diff --git a/include/lrreportengine.h b/include/lrreportengine.h index d2097ad..aaa77d7 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -220,9 +220,9 @@ signals: void loadFinished(); void printedToPDF(QString fileName); - void getAvailableLanguages(QList* languages); - void currentDefaultLanguageChanged(QLocale::Language); - QLocale::Language getCurrentDefaultLanguage(); + void getAvailableDesignerLanguages(QList* languages); + void currentDefaultDesignerLanguageChanged(QLocale::Language); + QLocale::Language getCurrentDefaultDesignerLanguage(); void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 6a7fb72..e5deb00 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1080,20 +1080,20 @@ QList ReportEnginePrivate::designerLanguages() { QList result; - emit getAvailableLanguages(&result); + emit getAvailableDesignerLanguages(&result); return result; } QLocale::Language ReportEnginePrivate::currentDesignerLanguage() { - QLocale::Language result = emit getCurrentDefaultLanguage(); + QLocale::Language result = emit getCurrentDefaultDesignerLanguage(); return result; } void ReportEnginePrivate::setCurrentDesignerLanguage(QLocale::Language language) { m_currentDesignerLanguage = language; - emit currentDefaultLanguageChanged(language); + emit currentDefaultDesignerLanguageChanged(language); } QString ReportEnginePrivate::styleSheet() const @@ -1387,12 +1387,12 @@ ReportEngine::ReportEngine(QObject *parent) connect(d, SIGNAL(cleared()), this, SIGNAL(cleared())); connect(d, SIGNAL(printedToPDF(QString)), this, SIGNAL(printedToPDF(QString))); - connect(d, SIGNAL(getAvailableLanguages(QList*)), - this, SIGNAL(getAvailableLanguages(QList*))); - connect(d, SIGNAL(currentDefaultLanguageChanged(QLocale::Language)), - this, SIGNAL(currentDefaultLanguageChanged(QLocale::Language))); - connect(d, SIGNAL(getCurrentDefaultLanguage()), - this, SIGNAL(getCurrentDefaultLanguage())); + connect(d, SIGNAL(getAvailableDesignerLanguages(QList*)), + this, SIGNAL(getAvailableDesignerLanguages(QList*))); + connect(d, SIGNAL(currentDefaultDesignerLanguageChanged(QLocale::Language)), + this, SIGNAL(currentDefaultDesignerLanguageChanged(QLocale::Language))); + connect(d, SIGNAL(getCurrentDefaultDesignerLanguage()), + this, SIGNAL(getCurrentDefaultDesignerLanguage())); connect(d, SIGNAL(externalPaint(const QString&, QPainter*, const QStyleOptionGraphicsItem*)), this, SIGNAL(externalPaint(const QString&, QPainter*, const QStyleOptionGraphicsItem*))); diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index d2097ad..aaa77d7 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -220,9 +220,9 @@ signals: void loadFinished(); void printedToPDF(QString fileName); - void getAvailableLanguages(QList* languages); - void currentDefaultLanguageChanged(QLocale::Language); - QLocale::Language getCurrentDefaultLanguage(); + void getAvailableDesignerLanguages(QList* languages); + void currentDefaultDesignerLanguageChanged(QLocale::Language); + QLocale::Language getCurrentDefaultDesignerLanguage(); void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); diff --git a/limereport/lrreportengine_p.h b/limereport/lrreportengine_p.h index bd812f0..3ffec70 100644 --- a/limereport/lrreportengine_p.h +++ b/limereport/lrreportengine_p.h @@ -263,9 +263,9 @@ signals: void loadFinished(); void printedToPDF(QString fileName); - void getAvailableLanguages(QList* languages); - void currentDefaultLanguageChanged(QLocale::Language); - QLocale::Language getCurrentDefaultLanguage(); + void getAvailableDesignerLanguages(QList* languages); + void currentDefaultDesignerLanguageChanged(QLocale::Language); + QLocale::Language getCurrentDefaultDesignerLanguage(); void externalPaint(const QString& objectName, QPainter* painter, const QStyleOptionGraphicsItem*); public slots: From 5f268a5b1acd6dcce52cd9bc80b3fd21c011d17d Mon Sep 17 00:00:00 2001 From: Arin Alex Date: Tue, 11 Jun 2019 22:18:54 +0300 Subject: [PATCH 325/347] Typo has been fixed --- include/lrreportengine.h | 6 +++--- limereport/lrreportengine.cpp | 2 +- limereport/lrreportengine.h | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/lrreportengine.h b/include/lrreportengine.h index aaa77d7..a4c314f 100644 --- a/include/lrreportengine.h +++ b/include/lrreportengine.h @@ -64,10 +64,10 @@ private: class LIMEREPORT_EXPORT ItemGeometry{ public: - enum Type{Milimeters, Pixels}; - ItemGeometry(qreal x, qreal y, qreal width, qreal height, Qt::Alignment anchor, Type type = Milimeters) + enum Type{Millimeters, Pixels}; + ItemGeometry(qreal x, qreal y, qreal width, qreal height, Qt::Alignment anchor, Type type = Millimeters) :m_x(x), m_y(y), m_width(width), m_height(height), m_type(type), m_anchor(anchor){} - ItemGeometry(): m_x(0), m_y(0), m_width(0), m_height(0), m_type(Milimeters){} + ItemGeometry(): m_x(0), m_y(0), m_width(0), m_height(0), m_type(Millimeters){} qreal x() const; void setX(const qreal &x); diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index e5deb00..05418e5 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -2004,7 +2004,7 @@ QPointF WatermarkHelper::mapToPage(const PageItemDesignIntf &page) qreal WatermarkHelper::valueToPixels(qreal value) { switch (m_watermark.geometry().type()) { - case LimeReport::ItemGeometry::Milimeters: + case LimeReport::ItemGeometry::Millimeters: return value * Const::mmFACTOR; case LimeReport::ItemGeometry::Pixels: return value; diff --git a/limereport/lrreportengine.h b/limereport/lrreportengine.h index aaa77d7..a4c314f 100644 --- a/limereport/lrreportengine.h +++ b/limereport/lrreportengine.h @@ -64,10 +64,10 @@ private: class LIMEREPORT_EXPORT ItemGeometry{ public: - enum Type{Milimeters, Pixels}; - ItemGeometry(qreal x, qreal y, qreal width, qreal height, Qt::Alignment anchor, Type type = Milimeters) + enum Type{Millimeters, Pixels}; + ItemGeometry(qreal x, qreal y, qreal width, qreal height, Qt::Alignment anchor, Type type = Millimeters) :m_x(x), m_y(y), m_width(width), m_height(height), m_type(type), m_anchor(anchor){} - ItemGeometry(): m_x(0), m_y(0), m_width(0), m_height(0), m_type(Milimeters){} + ItemGeometry(): m_x(0), m_y(0), m_width(0), m_height(0), m_type(Millimeters){} qreal x() const; void setX(const qreal &x); From 0c4786582f4e6e5fc06c8c68fb5174c9e44d56d2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 21 Jun 2019 22:12:04 +0300 Subject: [PATCH 326/347] relocateBands function has been fixed --- limereport/lrpageitemdesignintf.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index f0904c8..8c11ade 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -400,7 +400,7 @@ void PageItemDesignIntf::relocateBands() { if (isLoading()) return; - int bandSpace = (itemMode() & DesignMode)?4:0; + int bandSpace = (itemMode() & DesignMode) ? 0 : 0; QVector posByColumn; @@ -443,8 +443,8 @@ void PageItemDesignIntf::relocateBands() m_bands[i+1]->setPos(pageRect().x(),posByColumn[0]); posByColumn[0] += m_bands[i+1]->height()+bandSpace; } else { - m_bands[i+1]->setPos(pageRect().x(),posByColumn[0]+2); - posByColumn[0] += m_bands[i+1]->height()+bandSpace+2; + m_bands[i+1]->setPos(pageRect().x(),posByColumn[0]); + posByColumn[0] += m_bands[i+1]->height()+bandSpace; } } else { m_bands[i+1]->setPos(m_bands[i+1]->pos().x(),posByColumn[m_bands[i+1]->columnIndex()]); From ae2eb2b2cfcc8c7cd1307c8133ec11462bca6318 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 21 Jun 2019 22:13:54 +0300 Subject: [PATCH 327/347] Version has been changed --- common.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common.pri b/common.pri index 207b6b6..556482b 100644 --- a/common.pri +++ b/common.pri @@ -84,7 +84,7 @@ RCC_DIR = $${ARCH_DIR}/$${BUILD_TYPE}/rcc LIMEREPORT_VERSION_MAJOR = 1 LIMEREPORT_VERSION_MINOR = 4 -LIMEREPORT_VERSION_RELEASE = 134 +LIMEREPORT_VERSION_RELEASE = 136 LIMEREPORT_VERSION = '\\"$${LIMEREPORT_VERSION_MAJOR}.$${LIMEREPORT_VERSION_MINOR}.$${LIMEREPORT_VERSION_RELEASE}\\"' DEFINES += LIMEREPORT_VERSION_STR=\"$${LIMEREPORT_VERSION}\" From 5aee8112a158d1fe414420153b1854da5af37307 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 22 Jun 2019 00:21:45 +0300 Subject: [PATCH 328/347] Test code has been removed --- limereport/lrpreviewreportwindow.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/limereport/lrpreviewreportwindow.cpp b/limereport/lrpreviewreportwindow.cpp index a4666bb..2f6f391 100644 --- a/limereport/lrpreviewreportwindow.cpp +++ b/limereport/lrpreviewreportwindow.cpp @@ -492,7 +492,6 @@ void PreviewReportWindow::slotScalePercentChanged(int percent) void PreviewReportWindow::on_actionShowMessages_toggled(bool value) { m_previewReportWidget->setErrorsMesagesVisible(value); - m_previewReportWidget->startInsertTextItem(); } void PreviewReportWindow::on_actionShow_Toolbar_triggered() From 667a655e4a5fe0acba82bb4b5866ca406d663863 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 21 Jun 2019 20:18:23 +0300 Subject: [PATCH 329/347] Rulers and inches support has been added --- .../dark_style_sheet/qdarkstyle/style.qss | 2 +- .../qlightstyle/lightstyle.qss | 2 +- limereport/designer.pri | 2 + limereport/items/lrabstractlayout.h | 2 +- limereport/lrbasedesignintf.cpp | 75 ++++--- limereport/lrbasedesignintf.h | 21 +- limereport/lrfactoryinitializer.cpp | 2 +- limereport/lrpagedesignintf.cpp | 25 ++- limereport/lrpageitemdesignintf.cpp | 49 +++-- limereport/lrpageitemdesignintf.h | 2 + limereport/lrreportdesignwidget.cpp | 177 ++++++++++++++- limereport/lrreportdesignwidget.h | 40 ++++ limereport/lrreportengine.cpp | 4 +- limereport/lrreportrender.cpp | 11 +- .../objectinspector/lrobjectitemmodel.cpp | 1 + .../propertyItems/lrenumpropitem.cpp | 2 + .../propertyItems/lrmarginpropitem.cpp | 102 +++++++++ .../propertyItems/lrmarginpropitem.h | 28 +++ .../propertyItems/lrqrealpropitem.cpp | 4 +- .../propertyItems/lrqrealpropitem.h | 2 - .../propertyItems/lrrectproptem.cpp | 202 ++++++++++++------ .../propertyItems/lrrectproptem.h | 21 +- translations/limereport_ru.qm | Bin 120136 -> 121800 bytes translations/limereport_ru.ts | 24 ++- 24 files changed, 652 insertions(+), 148 deletions(-) create mode 100644 limereport/objectinspector/propertyItems/lrmarginpropitem.cpp create mode 100644 limereport/objectinspector/propertyItems/lrmarginpropitem.h diff --git a/3rdparty/dark_style_sheet/qdarkstyle/style.qss b/3rdparty/dark_style_sheet/qdarkstyle/style.qss index 44d1983..0140e4f 100644 --- a/3rdparty/dark_style_sheet/qdarkstyle/style.qss +++ b/3rdparty/dark_style_sheet/qdarkstyle/style.qss @@ -34,7 +34,7 @@ QWidget { color: #eff0f1; background-color: #383838; - selection-background-color:#000; + selection-background-color:#819a67; selection-color: #eff0f1; background-clip: border; border-image: none; diff --git a/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss b/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss index 223d324..1c768a4 100644 --- a/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss +++ b/3rdparty/light_style_sheet/qlightstyle/lightstyle.qss @@ -34,7 +34,7 @@ QWidget { color: #000; background-color: #f0f0f0; - selection-background-color:#000; + selection-background-color:#b5da91; selection-color: #000; background-clip: border; border-image: none; diff --git a/limereport/designer.pri b/limereport/designer.pri index f377546..1c7e279 100644 --- a/limereport/designer.pri +++ b/limereport/designer.pri @@ -27,6 +27,7 @@ SOURCES += \ $$REPORT_PATH/objectinspector/propertyItems/lrdatasourcepropitem.cpp \ $$REPORT_PATH/objectinspector/propertyItems/lrgroupfieldpropitem.cpp \ $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.cpp \ + $$REPORT_PATH/objectinspector/propertyItems/lrmarginpropitem.cpp \ $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.cpp \ $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.cpp \ $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.cpp \ @@ -69,6 +70,7 @@ HEADERS += \ $$REPORT_PATH/objectinspector/propertyItems/lrcontentpropitem.h \ $$REPORT_PATH/objectinspector/propertyItems/lrqrealpropitem.h \ $$REPORT_PATH/objectinspector/propertyItems/lrcolorpropitem.h \ + $$REPORT_PATH/objectinspector/propertyItems/lrmarginpropitem.h \ $$REPORT_PATH/objectinspector/editors/lrtextitempropertyeditor.h \ $$REPORT_PATH/objectinspector/editors/lrcomboboxeditor.h \ $$REPORT_PATH/objectinspector/editors/lrcheckboxeditor.h \ diff --git a/limereport/items/lrabstractlayout.h b/limereport/items/lrabstractlayout.h index 742055a..1324ff7 100644 --- a/limereport/items/lrabstractlayout.h +++ b/limereport/items/lrabstractlayout.h @@ -34,7 +34,7 @@ public: int childrenCount(); int layoutSpacing() const; void setLayoutSpacing(int layoutSpacing); - qreal layoutSpacingMM(){ return m_layoutSpacing * mmFactor();} + qreal layoutSpacingMM(){ return m_layoutSpacing * unitFactor();} protected: void beforeDelete(); void childAddedEvent(BaseDesignIntf *child); diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index e0c943b..18d5130 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -60,7 +60,6 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_width(200), m_height(50), m_fontColor(Qt::black), - m_mmFactor(Const::mmFACTOR), m_fixedPos(false), m_borderLineSize(1), m_BGMode(OpaqueMode), @@ -83,7 +82,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_hovered(false), m_joinMarkerOn(false), m_selectionMarker(0), - m_fillTransparentInDesignMode(true) + m_fillTransparentInDesignMode(true), + m_unitType(Millimeters) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -100,7 +100,6 @@ QRectF BaseDesignIntf::boundingRect() const qreal halfpw = pen().widthF() / 2; halfpw += 2; m_boundingRect = rect(); - m_boundingRect.adjust(-halfpw, -halfpw, halfpw, halfpw); }; return m_boundingRect; } @@ -185,7 +184,7 @@ void BaseDesignIntf::setWidth(qreal width) QString BaseDesignIntf::setItemWidth(qreal width) { - setWidth(width * mmFactor()); + setWidth(width * unitFactor()); return QString(); } @@ -194,9 +193,9 @@ qreal BaseDesignIntf::height() const return rect().height(); } -QRectF BaseDesignIntf::geometry() const +QRect BaseDesignIntf::geometry() const { - return QRectF(pos().x(), pos().y(), width(), height()); + return QRect(pos().x(), pos().y(), width(), height()); } void BaseDesignIntf::setHeight(qreal height) @@ -206,28 +205,28 @@ void BaseDesignIntf::setHeight(qreal height) QString BaseDesignIntf::setItemHeight(qreal height) { - setHeight(height * mmFactor()); + setHeight(height * unitFactor()); return QString(); } qreal BaseDesignIntf::getItemWidth() { - return width() / mmFactor(); + return width() / unitFactor(); } qreal BaseDesignIntf::getItemHeight() { - return height() / mmFactor(); + return height() / unitFactor(); } qreal BaseDesignIntf::getItemPosX() { - return x() / mmFactor(); + return x() / unitFactor(); } qreal BaseDesignIntf::getItemPosY() { - return y() / mmFactor(); + return y() / unitFactor(); } qreal BaseDesignIntf::getAbsolutePosX() @@ -242,13 +241,13 @@ qreal BaseDesignIntf::getAbsolutePosY() QString BaseDesignIntf::setItemPosX(qreal xValue) { - setItemPos(xValue * mmFactor(),y()); + setItemPos(xValue * unitFactor(),y()); return QString(); } QString BaseDesignIntf::setItemPosY(qreal yValue) { - setItemPos(x(),yValue * mmFactor()); + setItemPos(x(),yValue * unitFactor()); return QString(); } @@ -337,32 +336,46 @@ QSizeF BaseDesignIntf::size() const QSizeF BaseDesignIntf::sizeMM() const { - return QSizeF(width() / m_mmFactor, height() / m_mmFactor); + return QSizeF(width() / Const::mmFACTOR, height() / Const::mmFACTOR); } qreal BaseDesignIntf::widthMM() const { - return width() / m_mmFactor; + return width() / Const::mmFACTOR; } qreal BaseDesignIntf::heightMM() const { - return height() / m_mmFactor; + return height() / Const::mmFACTOR; } -void BaseDesignIntf::setMMFactor(qreal mmFactor) +//void BaseDesignIntf::setUnitFactor(qreal unitFactor) +//{ +// m_unitFactor = unitFactor; +//} + +qreal BaseDesignIntf::unitFactor() const { - m_mmFactor = mmFactor; + if (m_unitType == Millimeters) + return Const::mmFACTOR; + else return Const::mmFACTOR * 2.54; } -qreal BaseDesignIntf::mmFactor() const +void BaseDesignIntf::setUnitType(BaseDesignIntf::UnitType value) { - return m_mmFactor; + foreach(BaseDesignIntf* child, childBaseItems()) + child->setUnitType(value); + m_unitType = value; +} + +BaseDesignIntf::UnitType BaseDesignIntf::unitType() +{ + return m_unitType; } QPointF BaseDesignIntf::posMM() const { - return QPointF(pos().x() / m_mmFactor, pos().y() / m_mmFactor); + return QPointF(pos().x() / Const::mmFACTOR, pos().y() / Const::mmFACTOR); } QRectF BaseDesignIntf::rect() const @@ -652,8 +665,8 @@ QPointF BaseDesignIntf::modifyPosForAlignedItem(const QPointF& pos){ BaseDesignIntf* parent = dynamic_cast(parentItem()); PageItemDesignIntf* parentPage = dynamic_cast(parentItem()); if (parent){ - qreal leftBorder = parentPage?parentPage->leftMargin()*mmFactor():0; - qreal rightBorder = parentPage?parentPage->rightMargin()*mmFactor():0; + qreal leftBorder = parentPage ? parentPage->leftMargin() * Const::mmFACTOR : 0; + qreal rightBorder = parentPage ? parentPage->rightMargin() * Const::mmFACTOR : 0; qreal avaibleSpace = parent->width()-(leftBorder+rightBorder); switch(m_itemAlign){ @@ -694,10 +707,9 @@ void BaseDesignIntf::updateItemAlign(){ PageItemDesignIntf* parentPage = dynamic_cast(parentItem()); m_changingItemAlign = true; if (parent){ - qreal leftBorder = parentPage?parentPage->leftMargin()*mmFactor():0; - qreal rightBorder = parentPage?parentPage->rightMargin()*mmFactor():0; + qreal leftBorder = parentPage ? parentPage->leftMargin() * Const::mmFACTOR : 0; + qreal rightBorder = parentPage ? parentPage->rightMargin() * Const::mmFACTOR : 0; qreal aviableSpace = parent->width()-(leftBorder+rightBorder); - setPos(modifyPosForAlignedItem(pos())); if (m_itemAlign == ParentWidthItemAlign) setWidth(aviableSpace); @@ -732,6 +744,11 @@ void BaseDesignIntf::setFillTransparentInDesignMode(bool fillTransparentInDesign m_fillTransparentInDesignMode = fillTransparentInDesignMode; } +void BaseDesignIntf::emitPosChanged(QPointF oldPos, QPointF newPos) +{ + emit posChanged(this, oldPos, newPos); +} + bool BaseDesignIntf::fillInSecondPass() const { return m_fillInSecondPass; @@ -1031,9 +1048,9 @@ void BaseDesignIntf::beforeDelete() } -void BaseDesignIntf::setGeometryProperty(QRectF rect) +void BaseDesignIntf::setGeometryProperty(QRect rect) { - if (rect!=geometry()){ + if ( rect != m_itemGeometry ){ QRectF oldValue = geometry(); if ((rect.x() != geometry().x()) || (rect.y() != geometry().y())) setPos(rect.x(), rect.y()); @@ -1098,8 +1115,10 @@ void BaseDesignIntf::initMode(ItemMode mode) QVariant BaseDesignIntf::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { + if (change == QGraphicsItem::ItemPositionHasChanged) { updateSelectionMarker(); + emit geometryChanged(this, geometry(), geometry()); } if (change == QGraphicsItem::ItemSelectedChange) { diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 6209b97..01dfc0f 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -88,7 +88,8 @@ class BaseDesignIntf : Q_ENUMS(BrushStyle) Q_ENUMS(ItemAlign) Q_FLAGS(BorderLines) - Q_PROPERTY(QRectF geometry READ geometry WRITE setGeometryProperty NOTIFY geometryChanged) + Q_ENUMS(UnitType) + Q_PROPERTY(QRect geometry READ geometry WRITE setGeometryProperty NOTIFY geometryChanged) Q_PROPERTY(ACollectionProperty children READ fakeCollectionReader DESIGNABLE false) Q_PROPERTY(qreal zOrder READ zValue WRITE setZValueProperty DESIGNABLE false) Q_PROPERTY(BorderLines borders READ borderLines WRITE setBorderLinesFlags) @@ -137,6 +138,7 @@ public: }; enum ObjectState {ObjectLoading, ObjectLoaded, ObjectCreated}; enum ItemAlign {LeftItemAlign,RightItemAlign,CenterItemAlign,ParentWidthItemAlign,DesignedItemAlign}; + enum UnitType {Millimeters, Inches}; // enum ExpandType {EscapeSymbols, NoEscapeSymbols, ReplaceHTMLSymbols}; Q_DECLARE_FLAGS(BorderLines, BorderSide) Q_DECLARE_FLAGS(ItemMode,ItemModes) @@ -183,12 +185,13 @@ public: bool isFixedPos(){return m_fixedPos;} int resizeHandleSize() const; - void setMMFactor(qreal mmFactor); - qreal mmFactor() const; - virtual QRectF geometry() const; + qreal unitFactor() const; + void setUnitType(UnitType unitType); + UnitType unitType(); + virtual QRect geometry() const; void setGeometry(QRectF rect); - QRectF rect()const; + QRectF rect() const; void setupPainter(QPainter* painter) const; virtual QRectF boundingRect() const; @@ -209,7 +212,7 @@ public: ItemMode itemMode() const {return m_itemMode;} virtual void setBorderLinesFlags(LimeReport::BaseDesignIntf::BorderLines flags); - void setGeometryProperty(QRectF rect); + void setGeometryProperty(QRect rect); PageDesignIntf* page(); BorderLines borderLines() const; @@ -297,6 +300,7 @@ public: bool fillTransparentInDesignMode() const; void setFillTransparentInDesignMode(bool fillTransparentInDesignMode); + void emitPosChanged(QPointF oldPos, QPointF newPos); protected: @@ -380,7 +384,6 @@ private: QPen m_pen; QFont m_font; QColor m_fontColor; - qreal m_mmFactor; bool m_fixedPos; int m_borderLineSize; @@ -421,7 +424,9 @@ private: bool m_joinMarkerOn; SelectionMarker* m_selectionMarker; Marker* m_joinMarker; - bool m_fillTransparentInDesignMode; + bool m_fillTransparentInDesignMode; + QRect m_itemGeometry; + UnitType m_unitType; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanging(QObject* object, QPointF newPos, QPointF oldPos); diff --git a/limereport/lrfactoryinitializer.cpp b/limereport/lrfactoryinitializer.cpp index f91e7e6..f244d1a 100644 --- a/limereport/lrfactoryinitializer.cpp +++ b/limereport/lrfactoryinitializer.cpp @@ -294,7 +294,7 @@ ObjectPropItem * createReqtItem( ObjectPropItem * createReqtMMItem( QObject*object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly ){ - return new LimeReport::RectMMPropItem(object, objects, name, displayName, data, parent, readonly); + return new LimeReport::RectUnitPropItem(object, objects, name, displayName, data, parent, readonly); } ObjectPropItem * createStringPropItem( diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 46fe876..0e478bf 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -268,7 +268,10 @@ void PageDesignIntf::setPageItem(PageItemDesignIntf::Ptr pageItem) } m_pageItem = pageItem; m_pageItem->setItemMode(itemMode()); - setSceneRect(pageItem->rect().adjusted(-10*Const::mmFACTOR,-10*Const::mmFACTOR,10*Const::mmFACTOR,10*Const::mmFACTOR)); + setSceneRect(pageItem->rect().adjusted(-10 * Const::mmFACTOR, + -10 * Const::mmFACTOR, + 10 * Const::mmFACTOR, + 10 * Const::mmFACTOR)); addItem(m_pageItem.data()); registerItem(m_pageItem.data()); } @@ -290,7 +293,10 @@ void PageDesignIntf::setPageItems(QList pages) curHeight+=pageItem->height()+20; if (curWidthwidth()) curWidth=pageItem->width(); } - setSceneRect(QRectF(0,0,curWidth,curHeight).adjusted(-10*Const::mmFACTOR,-10*Const::mmFACTOR,10*Const::mmFACTOR,10*Const::mmFACTOR)); + setSceneRect(QRectF( 0, 0, curWidth,curHeight).adjusted( -10 * Const::mmFACTOR, + -10 * Const::mmFACTOR, + 10 * Const::mmFACTOR, + 10 * Const::mmFACTOR)); if (m_reportPages.count()>0) m_currentPage = m_reportPages.at(0).data(); @@ -500,6 +506,7 @@ BaseDesignIntf *PageDesignIntf::addReportItem(const QString &itemType, QPointF p BaseDesignIntf *reportItem = addReportItem(itemType, band, band); reportItem->setPos(placePosOnGrid(band->mapFromScene(pos))); reportItem->setSize(placeSizeOnGrid(size)); + reportItem->setUnitType(pageItem()->unitType()); return reportItem; } else { PageItemDesignIntf* page = pageItem() ? pageItem() : m_currentPage; @@ -507,6 +514,7 @@ BaseDesignIntf *PageDesignIntf::addReportItem(const QString &itemType, QPointF p BaseDesignIntf *reportItem = addReportItem(itemType, page, page); reportItem->setPos(placePosOnGrid(page->mapFromScene(pos))); reportItem->setSize(placeSizeOnGrid(size)); + reportItem->setUnitType(pageItem()->unitType()); ItemDesignIntf* ii = dynamic_cast(reportItem); if (ii) ii->setItemLocation(ItemDesignIntf::Page); @@ -522,6 +530,7 @@ BaseDesignIntf *PageDesignIntf::addReportItem(const QString &itemType, QObject * BaseDesignIntf *item = LimeReport::DesignElementsFactory::instance().objectCreator(itemType)((owner) ? owner : pageItem(), (parent) ? parent : pageItem()); item->setObjectName(genObjectName(*item)); item->setItemTypeName(itemType); + item->setUnitType(pageItem()->unitType()); registerItem(item); return item; } @@ -2087,7 +2096,11 @@ bool PosChangedCommand::doIt() for (int i = 0; i < m_newPos.count(); i++) { BaseDesignIntf *reportItem = page()->reportItemByName(m_newPos[i].objectName); - if (reportItem && (reportItem->pos() != m_newPos[i].pos)) reportItem->setPos(m_newPos[i].pos); + if (reportItem && (reportItem->pos() != m_newPos[i].pos)){ + QPointF oldValue = reportItem->pos(); + reportItem->setPos(m_newPos[i].pos); + emit reportItem->posChanged(reportItem, oldValue, reportItem->pos()); + } } return true; @@ -2098,7 +2111,11 @@ void PosChangedCommand::undoIt() for (int i = 0; i < m_oldPos.count(); i++) { BaseDesignIntf *reportItem = page()->reportItemByName(m_oldPos[i].objectName); - if (reportItem && (reportItem->pos() != m_oldPos[i].pos)) reportItem->setPos(m_oldPos[i].pos); + if (reportItem && (reportItem->pos() != m_oldPos[i].pos)){ + QPointF oldValue = reportItem->pos(); + reportItem->setPos(m_oldPos[i].pos); + reportItem->emitPosChanged(oldValue, reportItem->pos()); + } } } diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index 0641424..ac3ba68 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -544,8 +544,8 @@ void PageItemDesignIntf::relocateBands() m_bands[i+1]->setPos(pageRect().x(),posByColumn[0]); posByColumn[0] += m_bands[i+1]->height()+bandSpace; } else { - m_bands[i+1]->setPos(pageRect().x(),posByColumn[0]+2); - posByColumn[0] += m_bands[i+1]->height()+bandSpace+2; + m_bands[i+1]->setPos(pageRect().x(),posByColumn[0]); + posByColumn[0] += m_bands[i+1]->height()+bandSpace; } } else { m_bands[i+1]->setPos(m_bands[i+1]->pos().x(),posByColumn[m_bands[i+1]->columnIndex()]); @@ -904,6 +904,18 @@ void PageItemDesignIntf::bandGeometryChanged(QObject* object, QRectF newGeometry bandPositionChanged(object, newGeometry.topLeft(), oldGeometry.topLeft()); } +void PageItemDesignIntf::setUnitTypeProperty(BaseDesignIntf::UnitType value) +{ + if (unitType() != value){ + UnitType oldValue = unitType(); + setUnitType(value); + if (!isLoading()){ + update(); + notify("units", oldValue, value); + } + } +} + void PageItemDesignIntf::collectionLoadFinished(const QString &collectionName) { if (collectionName.compare("children",Qt::CaseInsensitive)==0){ @@ -925,8 +937,12 @@ void PageItemDesignIntf::collectionLoadFinished(const QString &collectionName) void PageItemDesignIntf::updateMarginRect() { m_pageRect = rect(); - m_pageRect.adjust(m_leftMargin*mmFactor(),m_topMargin*mmFactor(), - -m_rightMargin*mmFactor(),-m_bottomMargin*mmFactor()); + m_pageRect.adjust( leftMargin() * Const::mmFACTOR, + topMargin() * Const::mmFACTOR, + -rightMargin() * Const::mmFACTOR, + -bottomMargin() * Const::mmFACTOR + ); + foreach(BandDesignIntf* band,m_bands){ band->setWidth(pageRect().width()/band->columnsCount()); relocateBands(); @@ -944,20 +960,27 @@ void PageItemDesignIntf::paintGrid(QPainter *ppainter, QRectF rect) ppainter->save(); ppainter->setPen(QPen(gridColor())); ppainter->setOpacity(0.5); - for (int i=0;i<=(rect.height()-50)/100;i++){ - ppainter->drawLine(rect.x(),(i*100)+rect.y()+50,rect.right(),i*100+rect.y()+50); + for (int i = 0; i <= (rect.height() - 5 * unitFactor()) / (10 * unitFactor()); ++i){ + if (i * 10 * unitFactor() + 5 * unitFactor() >= topMargin() * Const::mmFACTOR) + ppainter->drawLine(rect.x(), (i * 10 * unitFactor()) + ( (rect.y() + 5 * unitFactor()) - (topMargin() * Const::mmFACTOR)), + rect.right(), i * 10 * unitFactor() +( (rect.y() + 5 * unitFactor()) - (topMargin() * Const::mmFACTOR))); }; - for (int i=0;i<=((rect.width()-50)/100);i++){ - ppainter->drawLine(i*100+rect.x()+50,rect.y(),i*100+rect.x()+50,rect.bottom()); + for (int i=0; i<=((rect.width() - 5 * unitFactor()) / (10 * unitFactor())); ++i){ + if (i * 10 * unitFactor() + 5 * unitFactor() >= leftMargin() * Const::mmFACTOR) + ppainter->drawLine(i * 10 * unitFactor() + ((rect.x() + 5 * unitFactor()) - (leftMargin() * Const::mmFACTOR)), rect.y(), + i * 10 * unitFactor() + ((rect.x() + 5 * unitFactor()) - (leftMargin() * Const::mmFACTOR)), rect.bottom()); }; - ppainter->setPen(QPen(gridColor())); ppainter->setOpacity(1); - for (int i=0;i<=(rect.width()/100);i++){ - ppainter->drawLine(i*100+rect.x(),rect.y(),i*100+rect.x(),rect.bottom()); + for (int i = 0; i <= (rect.width() / (10 * unitFactor())); ++i){ + if (i * 10 * unitFactor() >= leftMargin() * Const::mmFACTOR) + ppainter->drawLine(i * 10 * unitFactor() + (rect.x() - (leftMargin() * Const::mmFACTOR)), rect.y(), + i * 10 * unitFactor() + (rect.x() - (leftMargin() * Const::mmFACTOR)), rect.bottom()); }; - for (int i=0;i<=rect.height()/100;i++){ - ppainter->drawLine(rect.x(),i*100+rect.y(),rect.right(),i*100+rect.y()); + for (int i = 0; i <= rect.height() / (10 * unitFactor()); ++i){ + if (i * 10 * unitFactor() >= topMargin() * Const::mmFACTOR) + ppainter->drawLine(rect.x(), i * 10 * unitFactor() + (rect.y() - (topMargin() * Const::mmFACTOR)), + rect.right(), i * 10 * unitFactor() + (rect.y() - (topMargin() * Const::mmFACTOR))); }; ppainter->drawRect(rect); ppainter->restore(); diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 7e2510d..466b360 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -61,6 +61,7 @@ class PageItemDesignIntf : public ItemsContainerDesignInft Q_PROPERTY(bool endlessHeight READ endlessHeight WRITE setEndlessHeight) Q_PROPERTY(bool printable READ isPrintable WRITE setPrintable) Q_PROPERTY(QString printerName READ printerName WRITE setPrinterName) + Q_PROPERTY(UnitType units READ unitType WRITE setUnitTypeProperty) friend class ReportRender; public: enum Orientation { Portrait = QPrinter::Portrait, Landscape = QPrinter::Landscape }; @@ -169,6 +170,7 @@ protected slots: void bandDeleted(QObject* band); void bandPositionChanged(QObject* object, QPointF newPos, QPointF oldPos); void bandGeometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); + void setUnitTypeProperty(BaseDesignIntf::UnitType value); protected: void collectionLoadFinished(const QString& collectionName); QRectF& pageRect(){return m_pageRect;} diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index 42e6297..c98c9da 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -277,10 +277,12 @@ void ReportDesignWidget::createTabs(){ m_tabWidget->clear(); int pageIndex = -1; for (int i = 0; ipageCount();++i){ - QGraphicsView* view = new QGraphicsView(qobject_cast(this)); +// QGraphicsView* view = new QGraphicsView(qobject_cast(this)); + PageView* view = new PageView(qobject_cast(this)); view->setBackgroundBrush(QBrush(Qt::gray)); view->setFrameShape(QFrame::NoFrame); view->setScene(m_report->pageAt(i)); + view->setPageItem(m_report->pageAt(i)->pageItem()); // foreach(QGraphicsItem* item, m_report->pageAt(i)->selectedItems()){ // item->setSelected(false); @@ -1017,6 +1019,179 @@ void ReportDesignWidget::clear() m_scriptEditor->setPlainText(""); } +void PageView::setPageItem(PageItemDesignIntf *pageItem) +{ + if (!pageItem) return; + m_pageItem = pageItem; + if (!m_horizontalRuller){ + m_horizontalRuller = new Ruler(Ruler::Horizontal, this); + m_horizontalRuller->setPage(pageItem); + } + if (!m_verticalRuller){ + m_verticalRuller = new Ruler(Ruler::Vertical, this); + m_verticalRuller->setPage(pageItem); + } +} + +bool PageView::viewportEvent(QEvent *event) +{ + switch (event->type()) { + case QEvent::MouseMove: + m_horizontalRuller->setMousePos(dynamic_cast(event)->pos()); + m_verticalRuller->setMousePos(dynamic_cast(event)->pos()); + m_horizontalRuller->update(); + m_verticalRuller->update(); + break; + //case QEvent::Resize: + case QEvent::Paint: + if (m_horizontalRuller){ + int x = mapFromScene(m_pageItem->boundingRect().x(),m_pageItem->boundingRect().y()).x(); + int y = mapFromScene(m_pageItem->boundingRect().x(),m_pageItem->boundingRect().y()).y(); + int width = mapFromScene(m_pageItem->boundingRect().bottomRight().x(),m_pageItem->boundingRect().bottomRight().y()).x(); + int height = mapFromScene(m_pageItem->boundingRect().bottomRight().x(),m_pageItem->boundingRect().bottomRight().y()).y(); + + x = x < 0 ? 0 : x; + y = y < 0 ? 0 : y; + + m_horizontalRuller->setGeometry(x+20, 0, (width-x), 20); + m_verticalRuller->setGeometry(0, y+20, 20, (height - y)); + m_verticalRuller->update(); + m_horizontalRuller->update(); + } + break; + default: + break; + } + + return QGraphicsView::viewportEvent(event); +} + +void Ruler::setPage(PageItemDesignIntf *page) +{ + m_page = page; + +} + +void Ruler::paintEvent(QPaintEvent *event){ + QPainter painter(this); + painter.setBrush(palette().background()); + painter.setPen(Qt::NoPen); + painter.drawRect(event->rect()); +// painter.setPen(palette().foreground().color()); + + if (m_page){ + qreal rulerWidth = m_page->geometry().width() / m_page->unitFactor(); + qreal rulerHeight = m_page->geometry().height() / m_page->unitFactor(); + + QGraphicsView* view = qobject_cast(parent()); + + int hStartPos = view->mapFromScene(0,0).x(); + int vStartPos = view->mapFromScene(0,0).y(); + + QFont font = painter.font(); + font.setPointSize(7); + painter.setFont(font); + + switch (m_type) { + case Horizontal: + painter.setPen(Qt::NoPen); + + if (isColorDark(palette().background().color())) + painter.setBrush(QColor("#64893d")); + else + painter.setBrush(QColor("#b5da91")); + + drawItemWithChildren(&painter, m_page); + painter.setPen(palette().foreground().color()); + + for (int i = 0; i < rulerWidth / 10; ++i){ + int hs10 = view->mapFromScene(QPointF(m_page->geometry().topLeft().x() + i * 10 * m_page->unitFactor(), 0)).x(); + int hs5 = view->mapFromScene(QPointF(m_page->geometry().topLeft().x() + i * 10 * m_page->unitFactor() + 5 * m_page->unitFactor(), 0)).x(); + if (hs10 > 0){ + if (hStartPos > 0){ + hs10 -= hStartPos; + hs5 -= hStartPos; + } + painter.drawLine(hs10, 15, hs10, 20); + painter.drawLine(hs5, 10, hs5, 20); + if ( i > 0) + painter.drawText(QPoint(hs10 - (painter.fontMetrics().width(QString::number(i))/2), 12), + QString::number(i)); + } + } + painter.setPen(Qt::black); + painter.drawLine(m_mousePos.x() - (hStartPos > 0 ? hStartPos : 0) , 0, + m_mousePos.x() - (hStartPos > 0 ? hStartPos : 0) , 20); + break; + case Vertical: + painter.setPen(Qt::NoPen); + + if (isColorDark(palette().background().color())) + painter.setBrush(QColor("#64893d")); + else + painter.setBrush(QColor("#b5da91")); + + drawItemWithChildren(&painter, m_page); + painter.setPen(palette().foreground().color()); + for (int i = 0; i < rulerHeight / 10; ++i){ + int vs10 = view->mapFromScene(QPointF(0, m_page->geometry().topLeft().y()+i * 10 * m_page->unitFactor())).y(); + int vs5 = view->mapFromScene(QPointF(0, m_page->geometry().topLeft().y()+i * 10 * m_page->unitFactor() + 5 * m_page->unitFactor())).y(); + if (vs10 > 0){ + if (vStartPos > 0){ + vs10 -= vStartPos; + vs5 -= vStartPos; + } + painter.drawLine(15, vs10, 20, vs10); + if ( i > 0 ) + painter.drawText(QPoint( (15 - painter.fontMetrics().width(QString::number(i))) / 2 , + vs10 + (painter.fontMetrics().height()/2)), QString::number(i)); + painter.drawLine(10, vs5, 20, vs5); + } + } + painter.setPen(Qt::black); + painter.drawLine(0, m_mousePos.y() - (vStartPos > 0 ? vStartPos : 0), + 20, m_mousePos.y() - (vStartPos > 0 ? vStartPos : 0)); + break; + } + } +} + +void Ruler::drawItemWithChildren(QPainter* painter, BaseDesignIntf *item) +{ + foreach(BaseDesignIntf* child, item->childBaseItems()){ + if (!child->childBaseItems().isEmpty()) + drawItemWithChildren(painter, child); + else drawItem(painter, child); + + } + drawItem(painter, item); +} + +void Ruler::drawItem(QPainter* painter, BaseDesignIntf *item) +{ + if (!item->isSelected()) return; + + QGraphicsView* view = qobject_cast(parent()); + int hStartPos = view->mapFromScene(0,0).x(); + int vStartPos = view->mapFromScene(0,0).y(); + + switch (m_type) { + case Horizontal: + if (item->isSelected()) + painter->drawRect(view->mapFromScene(item->mapToScene(0,0)).x() - hStartPos, 0, + view->mapFromScene(item->geometry().bottomRight().x() - item->pos().x(), 0).x() - hStartPos, 20); + + + break; + case Vertical: + if (item->isSelected()) + painter->drawRect(0, view->mapFromScene(item->mapToScene(0, 0)).y() - vStartPos, + 20, view->mapFromScene(0, item->geometry().bottomRight().y() - item->pos().y()).y() - vStartPos); + break; + + } +} + } diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 5229ce8..3429cae 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -64,6 +64,46 @@ class TranslationEditor; class ScriptEditor; +class Ruler: public QWidget{ +public: + enum RulerType{Horizontal, Vertical}; + Ruler(RulerType type, QWidget* parent = 0): QWidget(parent), m_page(0), m_type(type){} + void setPage(PageItemDesignIntf* page); + void setMousePos(QPoint mousePos){ m_mousePos = mousePos;} +protected: + void paintEvent(QPaintEvent* event); + void drawItemWithChildren(QPainter *painter, BaseDesignIntf* item); + void drawItem(QPainter *painter, BaseDesignIntf* item); +private: + PageItemDesignIntf* m_page; + RulerType m_type; + QPoint m_mousePos; +}; + +class PageView: public QGraphicsView{ +public: + PageView(QWidget *parent = nullptr): QGraphicsView(parent), + m_horizontalRuller(0), m_verticalRuller(0) + { + setViewportMargins(20,20,0,0); + } + PageView(QGraphicsScene *scene, QWidget *parent = nullptr): + QGraphicsView(scene, parent), + m_horizontalRuller(0), m_verticalRuller(0) + { + setViewportMargins(20,20,0,0); + } + void setPageItem(PageItemDesignIntf* pageItem); +protected: +// void mouseMoveEvent(QMouseEvent *event); +// void resizeEvent(QResizeEvent *event); + bool viewportEvent(QEvent *event); +private: + PageItemDesignIntf* m_pageItem; + Ruler* m_horizontalRuller; + Ruler* m_verticalRuller; +}; + class ReportDesignWidget : public QWidget { Q_OBJECT diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index 05418e5..d997639 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1786,8 +1786,8 @@ bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) m_printer->getPageMargins(&leftMargin, &topMargin, &rightMargin, &bottomMargin, QPrinter::Millimeter); QRectF printerPageRect = m_printer->pageRect(QPrinter::Millimeter); - printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * Const::mmFACTOR, - (printerPageRect.size().height() + bottomMargin +topMargin) * Const::mmFACTOR); + printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * page->unitFactor(), + (printerPageRect.size().height() + bottomMargin +topMargin) * page->unitFactor()); if (m_printer->pageSize() != static_cast(page->pageSize()) && printerPageRect.width() < page->geometry().width()) diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index d4566ef..bf74151 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -1241,9 +1241,9 @@ void ReportRender::startNewPage(bool isFirst) emit m_patternPageItem->beforeRender(); m_renderPageItem->setObjectName(QLatin1String("ReportPage")+QString::number(m_pageCount)); - m_maxHeightByColumn[m_currentColumn]=m_renderPageItem->pageRect().height(); - m_currentStartDataPos[m_currentColumn]=m_patternPageItem->topMargin()*Const::mmFACTOR; - m_currentIndex=0; + m_maxHeightByColumn[m_currentColumn] = m_renderPageItem->pageRect().height(); + m_currentStartDataPos[m_currentColumn] = m_patternPageItem->topMargin() * Const::mmFACTOR; + m_currentIndex = 0; if (isFirst) { renderReportHeader(m_patternPageItem, BeforePageHeader); @@ -1254,7 +1254,7 @@ void ReportRender::startNewPage(bool isFirst) m_pageFooterHeight = calcPageFooterHeight(m_patternPageItem)+2; m_maxHeightByColumn[m_currentColumn] -= m_pageFooterHeight; - m_currentIndex=10; + m_currentIndex = 10; m_dataAreaSize = m_maxHeightByColumn[m_currentColumn]; m_renderedDataBandCount = 0; @@ -1473,7 +1473,8 @@ void ReportRender::savePage(bool isLast) foreach (BandDesignIntf* band, m_renderPageItem->bands()) { pageHeight += band->height(); } - m_renderPageItem->setHeight(pageHeight+10+(m_patternPageItem->topMargin()+m_patternPageItem->bottomMargin())*Const::mmFACTOR); + m_renderPageItem->setHeight(pageHeight + 10 + + (m_patternPageItem->topMargin() + m_patternPageItem->bottomMargin()) * Const::mmFACTOR); } } diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 0e76ad6..e7bf04f 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -160,6 +160,7 @@ void QObjectPropertyModel::translatePropertyName() tr("fontLetterSpacing"); tr("hideText"); tr("option3"); + tr("units"); } void QObjectPropertyModel::clearObjectsList() diff --git a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp index 2c6c6b0..143ba38 100644 --- a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp @@ -143,6 +143,8 @@ void EnumPropItem::translateEnumItemName() tr("TitleAlignCenter"); tr("Layout"); tr("Table"); + tr("Millimeters"); + tr("Inches"); } void EnumPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const diff --git a/limereport/objectinspector/propertyItems/lrmarginpropitem.cpp b/limereport/objectinspector/propertyItems/lrmarginpropitem.cpp new file mode 100644 index 0000000..66bbc25 --- /dev/null +++ b/limereport/objectinspector/propertyItems/lrmarginpropitem.cpp @@ -0,0 +1,102 @@ +#include "lrmarginpropitem.h" +#include +#include +#include "lrbasedesignintf.h" + +namespace { + LimeReport::ObjectPropItem * createMarginPropItem( + QObject *object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly) + { + return new LimeReport::MarginPropItem(object, objects, name, displayName, data, parent, readonly); + } + bool VARIABLE_IS_NOT_USED registredTopMargin = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("topMargin","LimeReport::PageItemDesignIntf"), + QObject::tr("margin"),createMarginPropItem + ); + bool VARIABLE_IS_NOT_USED registredRightMargin = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("rightMargin","LimeReport::PageItemDesignIntf"), + QObject::tr("margin"),createMarginPropItem + ); + bool VARIABLE_IS_NOT_USED registredBottomMargin = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("bottomMargin","LimeReport::PageItemDesignIntf"), + QObject::tr("margin"),createMarginPropItem + ); + bool VARIABLE_IS_NOT_USED registredLeftMargin = LimeReport::ObjectPropFactory::instance().registerCreator( + LimeReport::APropIdent("leftMargin","LimeReport::PageItemDesignIntf"), + QObject::tr("margin"),createMarginPropItem + ); +} + +namespace LimeReport{ + + +QString MarginPropItem::displayValue() const +{ + LimeReport::BaseDesignIntf * item = dynamic_cast(object()); + switch (item->unitType()) { + case LimeReport::BaseDesignIntf::Millimeters: + + return QString("%1 %2").arg(propertyValue().toDouble(), 0, 'f', 2) + .arg(QObject::tr("mm")); + case LimeReport::BaseDesignIntf::Inches: + return QString("%1 %2").arg((propertyValue().toDouble() * Const::mmFACTOR) / (item->unitFactor() * 10), 0, 'f', 2) + .arg(QObject::tr("''")); + } +} + +QWidget *MarginPropItem::createProperyEditor(QWidget *parent) const +{ + QDoubleSpinBox *editor= new QDoubleSpinBox(parent); + editor->setMaximum(std::numeric_limits::max()); + editor->setMinimum(std::numeric_limits::max()*-1); + editor->setSuffix(" "+unitShortName()); + return editor; +} + +void MarginPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +{ + QDoubleSpinBox *editor =qobject_cast(propertyEditor); + editor->setValue(valueInUnits(propertyValue().toReal())); +} + +void MarginPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +{ + model->setData(index, valueInReportUnits(qobject_cast(propertyEditor)->value())); + setValueToObject(propertyName(), propertyValue()); +} + +qreal MarginPropItem::valueInUnits(qreal value) const +{ + BaseDesignIntf* item = dynamic_cast(object()); + switch (item->unitType()) { + case LimeReport::BaseDesignIntf::Millimeters: + return value; + case LimeReport::BaseDesignIntf::Inches: + return (value * Const::mmFACTOR) / (item->unitFactor() * 10); + } +} + +qreal MarginPropItem::valueInReportUnits(qreal value) const +{ + BaseDesignIntf* item = dynamic_cast(object()); + switch (item->unitType()) { + case LimeReport::BaseDesignIntf::Millimeters: + return value; + case LimeReport::BaseDesignIntf::Inches: + return (value * (item->unitFactor() * 10)) / Const::mmFACTOR; + + } +} + +QString MarginPropItem::unitShortName() const +{ + BaseDesignIntf* item = dynamic_cast(object()); + switch (item->unitType()) { + case LimeReport::BaseDesignIntf::Millimeters: + return QObject::tr("mm"); + case LimeReport::BaseDesignIntf::Inches: + return QObject::tr("''"); + } +} + +} // namespace LimeReport diff --git a/limereport/objectinspector/propertyItems/lrmarginpropitem.h b/limereport/objectinspector/propertyItems/lrmarginpropitem.h new file mode 100644 index 0000000..f511ce1 --- /dev/null +++ b/limereport/objectinspector/propertyItems/lrmarginpropitem.h @@ -0,0 +1,28 @@ +#ifndef LRMARGINPROPITEM_H +#define LRMARGINPROPITEM_H + +#include "lrobjectpropitem.h" + +namespace LimeReport { + +class MarginPropItem : public ObjectPropItem +{ + Q_OBJECT +public: + MarginPropItem():ObjectPropItem(){} + MarginPropItem(QObject* object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value,ObjectPropItem* parent, bool readonly) + :ObjectPropItem(object, objects, name, displayName, value, parent, readonly){} + QString displayValue() const; + QWidget* createProperyEditor(QWidget *parent) const; + void setPropertyEditorData(QWidget * propertyEditor, const QModelIndex &) const; + void setModelData(QWidget * propertyEditor, QAbstractItemModel * model, const QModelIndex & index); +private: + qreal valueInUnits(qreal value) const; + qreal valueInReportUnits(qreal value) const; + QString unitShortName() const; +}; + +} // namespace LimeReport + + +#endif // LRMARGINPROPITEM_H diff --git a/limereport/objectinspector/propertyItems/lrqrealpropitem.cpp b/limereport/objectinspector/propertyItems/lrqrealpropitem.cpp index 096c91d..2d27868 100644 --- a/limereport/objectinspector/propertyItems/lrqrealpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrqrealpropitem.cpp @@ -38,8 +38,9 @@ namespace{ { return new LimeReport::QRealPropItem(object, objects, name, displayName, data, parent, readonly); } + bool VARIABLE_IS_NOT_USED registred = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("qreal",""),QObject::tr("qreal"),createQRealPropItem); - bool VARIABLE_IS_NOT_USED registredDouble = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("double",""),QObject::tr("qreal"),createQRealPropItem); + bool VARIABLE_IS_NOT_USED registredDouble = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("double",""),QObject::tr("qreal"),createQRealPropItem); } namespace LimeReport{ @@ -61,7 +62,6 @@ void QRealPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelI void QRealPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) { model->setData(index,qobject_cast(propertyEditor)->value()); - //object()->setProperty(propertyName().toLatin1(),propertyValue()); setValueToObject(propertyName(),propertyValue()); } diff --git a/limereport/objectinspector/propertyItems/lrqrealpropitem.h b/limereport/objectinspector/propertyItems/lrqrealpropitem.h index d06872f..c8a2616 100644 --- a/limereport/objectinspector/propertyItems/lrqrealpropitem.h +++ b/limereport/objectinspector/propertyItems/lrqrealpropitem.h @@ -47,6 +47,4 @@ public: }; } - - #endif // LRQREALPROPITEM_H diff --git a/limereport/objectinspector/propertyItems/lrrectproptem.cpp b/limereport/objectinspector/propertyItems/lrrectproptem.cpp index 638dcab..5d2d13b 100644 --- a/limereport/objectinspector/propertyItems/lrrectproptem.cpp +++ b/limereport/objectinspector/propertyItems/lrrectproptem.cpp @@ -45,14 +45,14 @@ namespace{ ){ return new LimeReport::RectPropItem(object, objects, name, displayName, data, parent, readonly); } - LimeReport::ObjectPropItem * createReqtMMItem( + LimeReport::ObjectPropItem * createReqtUnitItem( QObject*object, LimeReport::ObjectPropItem::ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& data, LimeReport::ObjectPropItem* parent, bool readonly ){ - return new LimeReport::RectMMPropItem(object, objects, name, displayName, data, parent, readonly); + return new LimeReport::RectUnitPropItem(object, objects, name, displayName, data, parent, readonly); } bool VARIABLE_IS_NOT_USED registredRectProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("QRect",""),QObject::tr("QRect"),createReqtItem); bool VARIABLE_IS_NOT_USED registredRectFProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("QRectF",""),QObject::tr("QRectF"),createReqtItem); - bool VARIABLE_IS_NOT_USED registredRectMMProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("geometry","LimeReport::BaseDesignIntf"),QObject::tr("geometry"),createReqtMMItem); + bool VARIABLE_IS_NOT_USED registredRectMMProp = LimeReport::ObjectPropFactory::instance().registerCreator(LimeReport::APropIdent("geometry","LimeReport::BaseDesignIntf"),QObject::tr("geometry"),createReqtUnitItem); } namespace LimeReport{ @@ -63,9 +63,8 @@ template QString rectToString(T rect) } QRectF modifyRect(QRectF rect, const QString& name, qreal itemValue){ - - if (name=="x"){qreal width=rect.width(); rect.setX(itemValue);rect.setWidth(width);} - if (name=="y"){qreal heigh=rect.height(); rect.setY(itemValue);rect.setHeight(heigh);} + if (name=="x"){qreal width=rect.width(); rect.setX(itemValue); rect.setWidth(width);} + if (name=="y"){qreal heigh=rect.height(); rect.setY(itemValue); rect.setHeight(heigh);} if (name=="height"){rect.setHeight(itemValue);} if (name=="width"){rect.setWidth(itemValue);} @@ -89,118 +88,153 @@ QString LimeReport::RectPropItem::displayValue() const switch(propertyValue().type()){ case QVariant::Rect: return rectToString(propertyValue().toRect()); - break; case QVariant::RectF: return rectToString(propertyValue().toRect()); - break; default : return ObjectPropItem::displayValue(); - } } -LimeReport::RectMMPropItem::RectMMPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool /*readonly*/): +LimeReport::RectUnitPropItem::RectUnitPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool /*readonly*/): ObjectPropItem(object, objects, name, displayName, value,parent) { - QRectF rect=value.toRect(); + QRectF rect= value.toRect(); LimeReport::BandDesignIntf* band = dynamic_cast(object); - LimeReport::PageItemDesignIntf *page = dynamic_cast(object); - if(band){ - this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "x","x",rect.x()/10,this,true)); - this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "y","y",rect.y()/10,this,true)); - this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "width",tr("width"), rect.width()/10,this,true)); - this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "height",tr("height"), rect.height()/10,this,false)); - } else if(page){ - this->appendItem(new LimeReport::RectMMValuePropItem(object, 0, "x","x",rect.x()/10,this,true)); - this->appendItem(new LimeReport::RectMMValuePropItem(object, 0, "y","y",rect.y()/10,this,true)); - this->appendItem(new LimeReport::RectMMValuePropItem(object, 0,"width", tr("width"), rect.width()/10,this,false)); - this->appendItem(new LimeReport::RectMMValuePropItem(object, 0, "height", tr("height"), rect.height()/10,this,false)); + LimeReport::PageItemDesignIntf* page = dynamic_cast(object); + LimeReport::BaseDesignIntf* item = dynamic_cast(object); + + if (band){ + this->appendItem(new LimeReport::RectUnitValuePropItem(object, objects, "x", "x", rect.x(), this, true)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, objects, "y", "y", rect.y(), this, true)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, objects, "width", tr("width"), rect.width(), this, true)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, objects, "height", tr("height"), rect.height(), this, false)); + } else if (page){ + this->appendItem(new LimeReport::RectUnitValuePropItem(object, 0, "x", "x", rect.x(), this, true)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, 0, "y", "y",rect.y(), this, true)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, 0,"width", tr("width"), rect.width(), this, false)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, 0, "height", tr("height"), rect.height(), this, false)); } else { - this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "x","x",rect.x()/10,this,false)); - this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "y","y",rect.y()/10,this,false)); - this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "width", tr("width"), rect.width()/10,this,false)); - this->appendItem(new LimeReport::RectMMValuePropItem(object, objects, "height", tr("height"), rect.height()/10,this,false)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, objects, "x", "x", rect.x(), this, false)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, objects, "y", "y", rect.y(), this, false)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, objects, "width", tr("width"), rect.width(), this, false)); + this->appendItem(new LimeReport::RectUnitValuePropItem(object, objects, "height", tr("height"), rect.height(), this, false)); } - LimeReport::BaseDesignIntf * item = dynamic_cast(object); + if (item){ connect(item,SIGNAL(geometryChanged(QObject*,QRectF,QRectF)),this,SLOT(itemGeometryChanged(QObject*,QRectF,QRectF))); connect(item,SIGNAL(posChanged(QObject*,QPointF,QPointF)),this,SLOT(itemPosChanged(QObject*,QPointF,QPointF))); + connect(item,SIGNAL(posChanging(QObject*,QPointF,QPointF)),this,SLOT(itemPosChanged(QObject*,QPointF,QPointF))); } } -QString LimeReport::RectMMPropItem::displayValue() const +QString LimeReport::RectUnitPropItem::displayValue() const { - QRectF rect = propertyValue().toRectF(); - return QString("[%1,%2] %3x%4 mm") - .arg(rect.x()/10,0,'f',2) - .arg(rect.y()/10,0,'f',2) - .arg(rect.width()/10,0,'f',2) - .arg(rect.height()/10,0,'f',2); + QRectF rect = rectInUnits(propertyValue().toRectF()); + return QString("[%1,%2] %3x%4 %5") + .arg(rect.x(), 0, 'f', 2) + .arg(rect.y(), 0,'f', 2) + .arg(rect.width(), 0, 'f', 2) + .arg(rect.height(), 0, 'f', 2) + .arg(unitShortName()); } -LimeReport::RectMMValuePropItem::RectMMValuePropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly +LimeReport::RectUnitValuePropItem::RectUnitValuePropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly ):ObjectPropItem(object, objects, name, displayName, value,parent,readonly){} -QWidget * LimeReport::RectMMValuePropItem::createProperyEditor(QWidget *parent) const +QWidget * LimeReport::RectUnitValuePropItem::createProperyEditor(QWidget *parent) const { QDoubleSpinBox *editor= new QDoubleSpinBox(parent); editor->setMaximum(100000); - editor->setSuffix(" mm"); + editor->setSuffix(" "+unitShortName()); + BaseDesignIntf* item = dynamic_cast(object()); return editor; } -void LimeReport::RectMMValuePropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const +void LimeReport::RectUnitValuePropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const { QDoubleSpinBox *editor = qobject_cast(propertyEditor); - editor->setValue(propertyValue().toDouble()); + editor->setValue(valueInUnits(propertyValue().toReal())); } -void LimeReport::RectMMValuePropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) +void LimeReport::RectUnitValuePropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *model, const QModelIndex &index) { - model->setData(index,qobject_cast(propertyEditor)->value()); + model->setData(index,valueInReportUnits(qobject_cast(propertyEditor)->value())); QRectF rect=object()->property(parent()->propertyName().toLatin1()).toRectF(); - object()->setProperty(parent()->propertyName().toLatin1(),modifyRect(rect,propertyName(),propertyValue().toReal()*10)); + object()->setProperty(parent()->propertyName().toLatin1(), modifyRect(rect, propertyName(), propertyValue().toReal())); } -QString LimeReport::RectMMValuePropItem::displayValue() const +qreal LimeReport::RectUnitValuePropItem::valueInUnits(qreal value) const { - return QString::number(propertyValue().toReal())+" "+QObject::tr("mm"); -} - -void LimeReport::RectMMPropItem::itemPosChanged(QObject* /*object*/, QPointF newPos, QPointF oldPos) -{ - if (newPos.x()!=oldPos.x()){ - setValue("x",newPos.x()); - } - if (newPos.y()!=oldPos.y()){ - setValue("y",newPos.y()); + BaseDesignIntf* item = dynamic_cast(object()); + switch (item->unitType()) { + case LimeReport::BaseDesignIntf::Millimeters: + return value / item->unitFactor(); + case LimeReport::BaseDesignIntf::Inches: + return value / (item->unitFactor() * 10); } } -void LimeReport::RectMMPropItem::itemGeometryChanged(QObject * /*object*/, QRectF newGeometry, QRectF oldGeometry) +qreal LimeReport::RectUnitValuePropItem::valueInReportUnits(qreal value) const { - if (newGeometry.x()!=oldGeometry.x()){ - setValue("x",newGeometry.x()); - } - if (newGeometry.y()!=oldGeometry.y()){ - setValue("y",newGeometry.y()); - } - if (newGeometry.width()!=oldGeometry.width()){ - setValue("width",newGeometry.width()); - } - if (newGeometry.height()!=oldGeometry.height()){ - setValue("height",newGeometry.height()); + BaseDesignIntf* item = dynamic_cast(object()); + switch (item->unitType()) { + case LimeReport::BaseDesignIntf::Millimeters: + return value * item->unitFactor(); + case LimeReport::BaseDesignIntf::Inches: + return value * (item->unitFactor() * 10); } } -void LimeReport::RectMMPropItem::setValue(const QString &name, qreal value) +QString LimeReport::RectUnitValuePropItem::unitShortName() const { - if (name!=""){ + BaseDesignIntf* item = dynamic_cast(object()); + switch (item->unitType()) { + case LimeReport::BaseDesignIntf::Millimeters: + return QObject::tr("mm"); + case LimeReport::BaseDesignIntf::Inches: + return QObject::tr("''"); + } +} + +QString LimeReport::RectUnitValuePropItem::displayValue() const +{ + return QString("%1 %2").arg(valueInUnits(propertyValue().toReal()), 0, 'f', 2).arg(unitShortName()); +} + +void LimeReport::RectUnitPropItem::itemPosChanged(QObject* /*object*/, QPointF newPos, QPointF oldPos) +{ + if (newPos.x() != oldPos.x()){ + setValue("x", newPos.x()); + } + if (newPos.y() != oldPos.y()){ + setValue("y", newPos.y()); + } +} + +void LimeReport::RectUnitPropItem::itemGeometryChanged(QObject * /*object*/, QRectF newGeometry, QRectF oldGeometry) +{ + if (newGeometry.x() != oldGeometry.x()){ + setValue("x", newGeometry.x()); + } + if (newGeometry.y() != oldGeometry.y()){ + setValue("y", newGeometry.y()); + } + if (newGeometry.width() != oldGeometry.width()){ + setValue("width", newGeometry.width()); + } + if (newGeometry.height() != oldGeometry.height()){ + setValue("height", newGeometry.height()); + } +} + +void LimeReport::RectUnitPropItem::setValue(const QString &name, qreal value) +{ + if (name != ""){ LimeReport::ObjectPropItem* propItem = findChild(name); if (propItem) { - propItem->setPropertyValue(value/10); - setPropertyValue(LimeReport::modifyRect(propertyValue().toRectF(),name,value)); - LimeReport::QObjectPropertyModel *itemModel=dynamic_cast(model()); + propItem->setPropertyValue(value); + setPropertyValue(LimeReport::modifyRect(propertyValue().toRectF(), name, value)); + LimeReport::QObjectPropertyModel *itemModel = dynamic_cast(model()); if (itemModel) { itemModel->itemDataChanged(modelIndex()); if (propItem->modelIndex().isValid()) @@ -209,3 +243,31 @@ void LimeReport::RectMMPropItem::setValue(const QString &name, qreal value) } } } + +QRectF LimeReport::RectUnitPropItem::rectInUnits(QRectF rect) const +{ + BaseDesignIntf* item = dynamic_cast(object()); + switch (item->unitType()) { + case LimeReport::BaseDesignIntf::Millimeters: + return QRectF(rect.x() / item->unitFactor(), + rect.y() / item->unitFactor(), + rect.width() / item->unitFactor(), + rect.height() / item->unitFactor()); + case LimeReport::BaseDesignIntf::Inches: + return QRectF(rect.x() / (item->unitFactor() * 10), + rect.y() / (item->unitFactor() * 10), + rect.width() / (item->unitFactor() * 10), + rect.height() / (item->unitFactor() * 10)); + } +} + +QString LimeReport::RectUnitPropItem::unitShortName() const +{ + BaseDesignIntf* item = dynamic_cast(object()); + switch (item->unitType()) { + case LimeReport::BaseDesignIntf::Millimeters: + return QObject::tr("mm"); + case LimeReport::BaseDesignIntf::Inches: + return QObject::tr("''"); + } +} diff --git a/limereport/objectinspector/propertyItems/lrrectproptem.h b/limereport/objectinspector/propertyItems/lrrectproptem.h index 64d8d78..bd6915c 100644 --- a/limereport/objectinspector/propertyItems/lrrectproptem.h +++ b/limereport/objectinspector/propertyItems/lrrectproptem.h @@ -43,28 +43,35 @@ public: QString displayValue() const; }; -class RectMMPropItem : public ObjectPropItem{ +class RectUnitPropItem : public ObjectPropItem{ Q_OBJECT public: - RectMMPropItem():ObjectPropItem(){} - RectMMPropItem(QObject *object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly=true); + RectUnitPropItem():ObjectPropItem(){} + RectUnitPropItem(QObject *object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly=true); QString displayValue() const; public slots: void itemPosChanged(QObject* /*object*/, QPointF newPos, QPointF oldPos); void itemGeometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); private: - void setValue(const QString& propertyName, qreal propertyValue); + void setValue(const QString& propertyName, qreal propertyValue); + QRectF rectInUnits(QRectF rect) const; + QString unitShortName() const; }; -class RectMMValuePropItem : public ObjectPropItem{ +class RectUnitValuePropItem : public ObjectPropItem{ Q_OBJECT public: - RectMMValuePropItem():ObjectPropItem(){} - RectMMValuePropItem(QObject *object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly ); + RectUnitValuePropItem():ObjectPropItem(){} + RectUnitValuePropItem(QObject *object, ObjectsList* objects, const QString& name, const QString& displayName, const QVariant& value, ObjectPropItem* parent, bool readonly ); QString displayValue() const; QWidget* createProperyEditor(QWidget *) const; void setPropertyEditorData(QWidget *, const QModelIndex &) const; void setModelData(QWidget *, QAbstractItemModel *, const QModelIndex &); +private: + qreal valueInUnits(qreal value) const; + qreal valueInReportUnits(qreal value) const; + QString unitShortName() const; + }; } diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index 09d747fdbe26bd02019e13a453cff90be9979da7..3ce791a78c782c75fd3bb2702eeadd125a7c7ce9 100644 GIT binary patch delta 6335 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 delta 5417 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 Название по центру + + Millimeters + Миллиметры + + + Inches + Дюймы + LimeReport::FlagsPropItem @@ -1939,9 +1947,13 @@ p, li { white-space: pre-wrap; } option3 + + units + Единицы измерения + - LimeReport::RectMMPropItem + LimeReport::RectPropItem width ширина @@ -1952,7 +1964,7 @@ p, li { white-space: pre-wrap; } - LimeReport::RectPropItem + LimeReport::RectUnitPropItem width ширина @@ -3098,5 +3110,13 @@ This preview is no longer valid. Default По умолчанию + + margin + Поля + + + '' + + From ac154dbc03944c3b175d553c6fd62040b3a7c817 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Wed, 26 Jun 2019 02:23:12 +0300 Subject: [PATCH 330/347] Ruler has been fixed --- limereport/lrreportdesignwidget.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index c98c9da..a453f7d 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -1175,20 +1175,20 @@ void Ruler::drawItem(QPainter* painter, BaseDesignIntf *item) int hStartPos = view->mapFromScene(0,0).x(); int vStartPos = view->mapFromScene(0,0).y(); + int itemWidth = view->mapFromScene(item->mapToScene(item->geometry().width(),0).x() - item->mapToScene(0,0).x(), 0).x() - hStartPos; + int itemHeight = view->mapFromScene(0, item->mapToScene(0, item->geometry().height()).y() - item->mapToScene(0,0).y()).y() - vStartPos; + switch (m_type) { case Horizontal: if (item->isSelected()) - painter->drawRect(view->mapFromScene(item->mapToScene(0,0)).x() - hStartPos, 0, - view->mapFromScene(item->geometry().bottomRight().x() - item->pos().x(), 0).x() - hStartPos, 20); - - + painter->drawRect(view->mapFromScene(item->mapToScene(0,0)).x() - (hStartPos > 0 ? hStartPos : 0) , 0, + itemWidth, 20); break; case Vertical: if (item->isSelected()) - painter->drawRect(0, view->mapFromScene(item->mapToScene(0, 0)).y() - vStartPos, - 20, view->mapFromScene(0, item->geometry().bottomRight().y() - item->pos().y()).y() - vStartPos); + painter->drawRect(0, view->mapFromScene(item->mapToScene(0, 0)).y() - (vStartPos > 0 ? vStartPos : 0), + 20, itemHeight); break; - } } From 69369e3b0c948d6a9632870eeadcdfba92435be5 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 27 Jun 2019 10:45:26 +0300 Subject: [PATCH 331/347] Ruler has been fixed --- designer/designersettingmanager.h | 1 - limereport/items/lrbarcodeitem.cpp | 2 +- limereport/items/lrchartitem.cpp | 8 +------- limereport/items/lrverticallayout.cpp | 2 +- limereport/lrbanddesignintf.cpp | 1 - limereport/lrdatadesignintf.cpp | 2 +- limereport/lrdatasourcemanager.cpp | 4 ++-- limereport/lrgroupfunctions.cpp | 3 +-- limereport/lrpagedesignintf.cpp | 2 +- limereport/lrpageitemdesignintf.cpp | 1 - limereport/lrreportdesignwidget.cpp | 4 ++-- limereport/lrreportengine.cpp | 1 + limereport/lrreportrender.cpp | 6 +++--- .../objectinspector/propertyItems/lrrectproptem.cpp | 1 - 14 files changed, 14 insertions(+), 24 deletions(-) diff --git a/designer/designersettingmanager.h b/designer/designersettingmanager.h index d5c13c9..4c1d28c 100644 --- a/designer/designersettingmanager.h +++ b/designer/designersettingmanager.h @@ -18,7 +18,6 @@ public slots: QLocale::Language getCurrentDefaultLanguage(); void currentDefaultLanguageChanged(QLocale::Language language); private: - QApplication* m_app; QSettings* m_setting; }; diff --git a/limereport/items/lrbarcodeitem.cpp b/limereport/items/lrbarcodeitem.cpp index cd37d1a..73ebdae 100644 --- a/limereport/items/lrbarcodeitem.cpp +++ b/limereport/items/lrbarcodeitem.cpp @@ -49,7 +49,7 @@ BarcodeItem::BarcodeItem(QObject* owner,QGraphicsItem* parent) : ContentItemDesignIntf(xmlTag,owner,parent),m_designTestValue("1"), m_barcodeType(CODE128), m_foregroundColor(Qt::black), m_backgroundColor(Qt::white), m_whitespace(10), m_angle(Angle0), m_barcodeWidth(0), m_securityLevel(0), m_pdf417CodeWords(928), m_inputMode(UNICODE_INPUT_MODE), - m_option3(0) + m_hideText(false), m_option3(0) {} BarcodeItem::~BarcodeItem() diff --git a/limereport/items/lrchartitem.cpp b/limereport/items/lrchartitem.cpp index 62f9230..171d45c 100644 --- a/limereport/items/lrchartitem.cpp +++ b/limereport/items/lrchartitem.cpp @@ -515,15 +515,13 @@ void PieChart::paintChart(QPainter *painter, QRectF chartRect) } qreal onePercent = sum / 100; qreal currentDegree = 0; - int currentColor = 0; - for(int i=0; idata()->values().count();++i){ + for(int i=0; idata()->values().count(); ++i){ qreal value = si->data()->values().at(i); qreal sectorDegree = (value/onePercent)*3.6; painter->setBrush(si->data()->colors().at(i)); painter->drawPie(chartRect,currentDegree*16,sectorDegree*16); drawPercent(painter, chartRect, currentDegree, sectorDegree); currentDegree += sectorDegree; - currentColor++; } } else { painter->setBrush(color_map[0]); @@ -768,7 +766,6 @@ void VerticalBarChart::paintSerialLines(QPainter* painter, QRectF barsRect) qreal topShift = (delta - (maxValue()-minValue())) * vStep +barsRect.top(); if (!m_chartItem->series().isEmpty() && !m_chartItem->series().at(0)->data()->labels().isEmpty()){ - int curSeries = 0; foreach (SeriesItem* series, m_chartItem->series()) { if (series->preferredType() == SeriesItem::Line){ QPen pen(series->color()); @@ -791,7 +788,6 @@ void VerticalBarChart::paintSerialLines(QPainter* painter, QRectF barsRect) } } - curSeries++; } } painter->restore(); @@ -803,7 +799,6 @@ void VerticalBarChart::paintLabels(QPainter *painter, QRectF labelsRect) { painter->save(); qreal hStep = (labelsRect.width() / valuesCount()); - int curLabel = 0; if (!m_chartItem->labels().isEmpty()){ painter->rotate(270); @@ -811,7 +806,6 @@ void VerticalBarChart::paintLabels(QPainter *painter, QRectF labelsRect) foreach (QString label, m_chartItem->labels()) { painter->drawText(QRectF(QPoint(0,0), QSize(labelsRect.height()-4,hStep)),Qt::AlignVCenter|Qt::AlignRight,label); - curLabel++; painter->translate(0,hStep); } painter->rotate(-270); diff --git a/limereport/items/lrverticallayout.cpp b/limereport/items/lrverticallayout.cpp index 65d75d9..51cb533 100644 --- a/limereport/items/lrverticallayout.cpp +++ b/limereport/items/lrverticallayout.cpp @@ -134,8 +134,8 @@ BaseDesignIntf* VerticalLayout::cloneBottomPart(int height, QObject* owner, QGra } } - int currentHeight = 0; if (!bottomPart->isEmpty()){ + int currentHeight = 0; foreach (BaseDesignIntf* item, bottomPart->childBaseItems()) { currentHeight+=item->height(); } diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 47d73ea..3751f44 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -662,7 +662,6 @@ BaseDesignIntf* BandDesignIntf::cloneUpperPart(int height, QObject *owner, QGrap } } upperPart->setHeight(height); - height = maxBottom; return upperPart; } diff --git a/limereport/lrdatadesignintf.cpp b/limereport/lrdatadesignintf.cpp index 718f1f4..6fa78a5 100644 --- a/limereport/lrdatadesignintf.cpp +++ b/limereport/lrdatadesignintf.cpp @@ -718,10 +718,10 @@ QVariant CallbackDatasource::dataByRowIndex(const QString &columnName, int rowIn QVariant CallbackDatasource::dataByKeyField(const QString& columnName, const QString& keyColumnName, QVariant keyData) { int backupCurrentRow = m_currentRow; - int currentRow = 0; QVariant result = QVariant(); first(); if (!checkIfEmpty()){ + int currentRow = 0; do { QVariant key = callbackData(keyColumnName, currentRow); if (key == keyData){ diff --git a/limereport/lrdatasourcemanager.cpp b/limereport/lrdatasourcemanager.cpp index b020550..1fcc20d 100644 --- a/limereport/lrdatasourcemanager.cpp +++ b/limereport/lrdatasourcemanager.cpp @@ -485,8 +485,8 @@ QString DataSourceManager::replaceVariables(QString query, QMap QString DataSourceManager::replaceFields(QString query, QMap &aliasesToParam, QString masterDatasource) { QRegExp rx(Const::FIELD_RX); - int curentAliasIndex=0; if (query.contains(rx)){ + int curentAliasIndex=0; int pos; while ((pos=rx.indexIn(query))!=-1){ QString field=rx.cap(0); @@ -719,7 +719,7 @@ void DataSourceManager::removeConnection(const QString &connectionName) delete (*cit); cit = m_connections.erase(cit); } else { - cit++; + ++cit; } } m_hasChanges = true; diff --git a/limereport/lrgroupfunctions.cpp b/limereport/lrgroupfunctions.cpp index b3ea189..1061ea5 100644 --- a/limereport/lrgroupfunctions.cpp +++ b/limereport/lrgroupfunctions.cpp @@ -118,9 +118,8 @@ QVariant GroupFunction::multiplication(QVariant value1, QVariant value2) } GroupFunction::GroupFunction(const QString &expression, const QString &dataBandName, DataSourceManager* dataManager) - :m_dataBandName(dataBandName), m_dataManager(dataManager),m_isValid(true), m_errorMessage("") + :m_data(expression), m_dataBandName(dataBandName), m_dataManager(dataManager), m_isValid(true), m_errorMessage("") { - m_data = expression; QRegExp rxField(Const::FIELD_RX,Qt::CaseInsensitive); QRegExp rxVariable(Const::VARIABLE_RX,Qt::CaseInsensitive); QRegExp rxScript(Const::SCRIPT_RX,Qt::CaseInsensitive); diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 0e478bf..5fe7288 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -1334,9 +1334,9 @@ BaseDesignIntf* PageDesignIntf::findDestObject(BaseDesignIntf* item){ void PageDesignIntf::paste() { QClipboard *clipboard = QApplication::clipboard(); - BaseDesignIntf* destItem = 0; ItemsReaderIntf::Ptr reader = StringXMLreader::create(clipboard->text()); if (reader->first() && reader->itemType() == "Object"){ + BaseDesignIntf* destItem = 0; if (!selectedItems().isEmpty()) destItem = findDestObject(dynamic_cast(selectedItems().at(0))); else diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index ac3ba68..b9c5693 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -778,7 +778,6 @@ void PageItemDesignIntf::swapBands(BandDesignIntf* band, BandDesignIntf* bandToS BandDesignIntf* firstMoveBand = (bandToSwap->bandIndex() > band->bandIndex()) ? bandToSwap: band; firstMoveBand->changeBandIndex(firstIndex, true); - moveIndex = firstMoveBand->maxChildIndex() + 1; moveIndex = firstIndex; qSort(bandToMove.begin(), bandToMove.end(), bandIndexLessThen); diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index a453f7d..de897e7 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -1119,7 +1119,7 @@ void Ruler::paintEvent(QPaintEvent *event){ QString::number(i)); } } - painter.setPen(Qt::black); + painter.setPen(palette().foreground().color()); painter.drawLine(m_mousePos.x() - (hStartPos > 0 ? hStartPos : 0) , 0, m_mousePos.x() - (hStartPos > 0 ? hStartPos : 0) , 20); break; @@ -1148,7 +1148,7 @@ void Ruler::paintEvent(QPaintEvent *event){ painter.drawLine(10, vs5, 20, vs5); } } - painter.setPen(Qt::black); + painter.setPen(palette().foreground().color()); painter.drawLine(0, m_mousePos.y() - (vStartPos > 0 ? vStartPos : 0), 20, m_mousePos.y() - (vStartPos > 0 ? vStartPos : 0)); break; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index d997639..abcfc37 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -514,6 +514,7 @@ bool ReportEnginePrivate::showPreviewWindow(ReportPages pages, PreviewHints hint w->setSettings(settings()); w->setPages(pages); w->setLayoutDirection(m_previewLayoutDirection); + w->setStyleSheet(styleSheet()); if (!dataManager()->errorsList().isEmpty()){ w->setErrorMessages(dataManager()->errorsList()); diff --git a/limereport/lrreportrender.cpp b/limereport/lrreportrender.cpp index bf74151..ec608fd 100644 --- a/limereport/lrreportrender.cpp +++ b/limereport/lrreportrender.cpp @@ -901,7 +901,7 @@ void ReportRender::closeGroup(BandDesignIntf *band) bl->clear(); delete bl; } - it++; + ++it; } m_childBands.remove(band); @@ -931,7 +931,7 @@ void ReportRender::closeDataGroup(BandDesignIntf *band) if ((*it)->bandIndex()>band->bandIndex()) it = m_reprintableBands.erase(it); else - it++; + ++it; } } recalcIfNeeded(band); @@ -1573,7 +1573,7 @@ void PagesRanges::addTOCPage() if (tocRange.firstPage == 0) { tocRange.firstPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; tocRange.lastPage = tocRange.lastPage == 0 ? 1 : tocRange.lastPage; - if (tocRange.lastPage == 1 && tocRange.lastPage == 1) + if (tocRange.firstPage == 1 && tocRange.lastPage == 1) shiftRangesNextToTOC(); } else { tocRange.lastPage++; diff --git a/limereport/objectinspector/propertyItems/lrrectproptem.cpp b/limereport/objectinspector/propertyItems/lrrectproptem.cpp index 5d2d13b..a5503f7 100644 --- a/limereport/objectinspector/propertyItems/lrrectproptem.cpp +++ b/limereport/objectinspector/propertyItems/lrrectproptem.cpp @@ -146,7 +146,6 @@ QWidget * LimeReport::RectUnitValuePropItem::createProperyEditor(QWidget *parent QDoubleSpinBox *editor= new QDoubleSpinBox(parent); editor->setMaximum(100000); editor->setSuffix(" "+unitShortName()); - BaseDesignIntf* item = dynamic_cast(object()); return editor; } From 71256ccef68f64723f84492d795e4d663bb16a50 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 27 Jun 2019 23:23:05 +0300 Subject: [PATCH 332/347] ShapeItem has been fixed --- limereport/items/lrshapeitem.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/limereport/items/lrshapeitem.cpp b/limereport/items/lrshapeitem.cpp index a1b37d9..ab07113 100644 --- a/limereport/items/lrshapeitem.cpp +++ b/limereport/items/lrshapeitem.cpp @@ -83,6 +83,7 @@ void ShapeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QPen pen(m_shapeColor); pen.setWidthF(m_lineWidth); pen.setStyle(m_penStyle); + pen.setJoinStyle(Qt::MiterJoin); painter->setPen(pen); QBrush brush(m_shapeBrushColor,m_shapeBrushType); brush.setTransform(painter->worldTransform().inverted()); @@ -102,7 +103,7 @@ void ShapeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, painter->drawEllipse(rect()); break; case Rectangle: - if (m_cornerRadius!=0){ + if (m_cornerRadius != 0){ painter->setRenderHint(QPainter::Antialiasing); painter->drawRoundedRect(rect(),m_cornerRadius,m_cornerRadius); } else { From d79ca93d32a6a96c854d0bda1ebec996648e786d Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Thu, 27 Jun 2019 23:37:06 +0300 Subject: [PATCH 333/347] ShapeItem has been fixed --- limereport/items/lrshapeitem.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/limereport/items/lrshapeitem.cpp b/limereport/items/lrshapeitem.cpp index ab07113..182ea9e 100644 --- a/limereport/items/lrshapeitem.cpp +++ b/limereport/items/lrshapeitem.cpp @@ -90,6 +90,10 @@ void ShapeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, painter->setBrush(brush); painter->setBackground(QBrush(Qt::NoBrush)); painter->setOpacity(qreal(m_opacity)/100); + QRectF rectangleRect = rect().adjusted((lineWidth() / 2), + (lineWidth() / 2), + -(lineWidth() / 2), + -(lineWidth() / 2)); switch (m_shape){ case HorizontalLine: @@ -105,9 +109,9 @@ void ShapeItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, case Rectangle: if (m_cornerRadius != 0){ painter->setRenderHint(QPainter::Antialiasing); - painter->drawRoundedRect(rect(),m_cornerRadius,m_cornerRadius); + painter->drawRoundedRect(rectangleRect,m_cornerRadius,m_cornerRadius); } else { - painter->drawRect(rect()); + painter->drawRect(rectangleRect); } break; } From 9a3af52cd733d4cf4adf649051068f4508616435 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 28 Jun 2019 10:27:09 +0300 Subject: [PATCH 334/347] hideIfEmpty property has been added to BarcodeItem --- limereport/items/lrbarcodeitem.cpp | 36 +++++++++++++++++++++--------- limereport/items/lrbarcodeitem.h | 11 ++++----- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/limereport/items/lrbarcodeitem.cpp b/limereport/items/lrbarcodeitem.cpp index 73ebdae..f7adc02 100644 --- a/limereport/items/lrbarcodeitem.cpp +++ b/limereport/items/lrbarcodeitem.cpp @@ -315,6 +315,24 @@ void BarcodeItem::setOption3(int option3) } } +bool BarcodeItem::hideIfEmpty() const +{ + return m_hideIfEmpty; +} + +void BarcodeItem::setHideIfEmpty(bool hideIfEmpty) +{ + if (m_hideIfEmpty != hideIfEmpty){ + m_hideIfEmpty = hideIfEmpty; + notify("hideIfEmpty",!m_hideIfEmpty, m_hideIfEmpty); + } +} + +bool BarcodeItem::isEmpty() const +{ + return m_content.isEmpty(); +} + void BarcodeItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass, int maxHeight) { if (content().isEmpty()) @@ -338,19 +356,17 @@ void BarcodeItem::updateItemSize(DataSourceManager* dataManager, RenderPass pass } } } - } - else - { - switch(pass) - { - case FirstPass: - setContent(expandUserVariables(content(),pass,NoEscapeSymbols, dataManager)); - setContent(expandDataFields(content(), NoEscapeSymbols, dataManager)); - break; - default:; + } else { + switch(pass){ + case FirstPass: + setContent(expandUserVariables(content(),pass,NoEscapeSymbols, dataManager)); + setContent(expandDataFields(content(), NoEscapeSymbols, dataManager)); + break; + default:; } } BaseDesignIntf::updateItemSize(dataManager, pass, maxHeight); + if (isEmpty() && hideIfEmpty()) setVisible(false); } bool BarcodeItem::isNeedUpdateSize(RenderPass pass) const diff --git a/limereport/items/lrbarcodeitem.h b/limereport/items/lrbarcodeitem.h index dafbd34..3badbd5 100644 --- a/limereport/items/lrbarcodeitem.h +++ b/limereport/items/lrbarcodeitem.h @@ -53,12 +53,8 @@ class BarcodeItem : public LimeReport::ContentItemDesignIntf { Q_PROPERTY(InputMode inputMode READ inputMode WRITE setInputMode) Q_PROPERTY(bool hideText READ hideText WRITE setHideText) Q_PROPERTY(int option3 READ option3 WRITE setOption3) + Q_PROPERTY(bool hideIfEmpty READ hideIfEmpty WRITE setHideIfEmpty) public: -// enum BarcodeType {QRCODE=58,CODE128=20,DATAMATRIX=71,MAXICODE=57,MICROPDF417=84}; -// enum BarcodeType {CODE_11=1,C25MATRIX=2,QRCODE=58,CODE128=20,DATAMATRIX=71,MAXICODE=57,MICROPDF417=84, -// EAN=13,PDF417=55, TELEPEN_NUM=87,ITF14=89, KIX=90, MICROQR=97, -// EAN14=72,CHANNEL=140,CODEONE=141,GRIDMATRIX=142}; - enum BarcodeType { CODE11 =1, C25MATRIX =2, @@ -196,6 +192,10 @@ public: int option3() const; void setOption3(int option3); + bool hideIfEmpty() const; + void setHideIfEmpty(bool hideIfEmpty); + bool isEmpty() const; + private: QString m_content; QString m_datasource; @@ -212,6 +212,7 @@ private: InputMode m_inputMode; bool m_hideText; int m_option3; + bool m_hideIfEmpty; }; } From 99757097cc6afbf58c1017ebf126c96a7821d168 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 28 Jun 2019 13:08:33 +0300 Subject: [PATCH 335/347] Turn off translation for object properties ability has been added to the object inspector --- include/lrpreparedpagesintf.h | 17 +++++++++ limereport/lrreportdesignwidget.h | 4 +-- limereport/lrreportdesignwindow.cpp | 7 ++++ limereport/lrvariablesholder.cpp | 2 +- .../objectinspector/images/settings.png | Bin 0 -> 643 bytes .../objectinspector/lobjectinspector.qrc | 1 + .../lrobjectinspectorwidget.cpp | 33 ++++++++++++++++++ .../objectinspector/lrobjectinspectorwidget.h | 5 +++ .../objectinspector/lrobjectitemmodel.cpp | 22 +++++++++--- .../objectinspector/lrobjectitemmodel.h | 16 +++++---- .../objectinspector/lrobjectpropitem.cpp | 20 +++++++++-- limereport/objectinspector/lrobjectpropitem.h | 5 ++- .../propertyItems/lrenumpropitem.cpp | 2 +- .../propertyItems/lrflagspropitem.cpp | 4 +-- translations/limereport_ru.qm | Bin 121800 -> 121930 bytes translations/limereport_ru.ts | 4 +++ 16 files changed, 121 insertions(+), 21 deletions(-) create mode 100644 include/lrpreparedpagesintf.h create mode 100644 limereport/objectinspector/images/settings.png diff --git a/include/lrpreparedpagesintf.h b/include/lrpreparedpagesintf.h new file mode 100644 index 0000000..a079a9a --- /dev/null +++ b/include/lrpreparedpagesintf.h @@ -0,0 +1,17 @@ +#ifndef LRPREPAREDPAGESINTF_H +#define LRPREPAREDPAGESINTF_H +#include "lrglobal.h" +namespace LimeReport { +class LIMEREPORT_EXPORT IPreparedPages{ +public: + virtual ~IPreparedPages(){}; + virtual bool loadFromFile(const QString& fileName) = 0; + virtual bool loadFromString(const QString data) = 0; + virtual bool loadFromByteArray(QByteArray* data) = 0; + virtual bool saveToFile(const QString& fileName) = 0; + virtual QString saveToString() = 0; + virtual QByteArray saveToByteArray() = 0; + virtual void clear() = 0; +}; +} //namespace LimeReport +#endif // LRPREPAREDPAGESINTF_H diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 3429cae..149dcb5 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -95,9 +95,7 @@ public: } void setPageItem(PageItemDesignIntf* pageItem); protected: -// void mouseMoveEvent(QMouseEvent *event); -// void resizeEvent(QResizeEvent *event); - bool viewportEvent(QEvent *event); + bool viewportEvent(QEvent *event); private: PageItemDesignIntf* m_pageItem; Ruler* m_horizontalRuller; diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 1b79168..1fdc9e7 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -506,6 +506,7 @@ void ReportDesignWindow::createObjectInspector() m_validator = new ObjectNameValidator(); m_objectInspector->setValidator(m_validator); m_objectInspector->setSubclassesAsLevel(false); + m_objectInspector->setTranslateProperties(true); m_objectInspector->setAlternatingRowColors(true); m_objectInspector->setRootIsDecorated(!m_objectInspector->subclassesAsLevel()); QDockWidget *objectDoc = new QDockWidget(this); @@ -696,6 +697,7 @@ void ReportDesignWindow::writeState() settings()->setValue("ScriptEditorsState", m_editorsStates[ReportDesignWidget::Script]); settings()->setValue("TranslationEditorsState", m_editorsStates[ReportDesignWidget::Translations]); settings()->setValue("InspectorFirsColumnWidth", m_objectInspector->columnWidth(0)); + settings()->setValue("InspectorTranslateProperties", m_objectInspector->translateProperties()); settings()->endGroup(); settings()->beginGroup("RecentFiles"); settings()->setValue("filesCount",m_recentFiles.count()); @@ -811,6 +813,11 @@ void ReportDesignWindow::restoreSetting() m_objectInspector->setColumnWidth(0,v.toInt()); } + v = settings()->value("InspectorTranslateProperties"); + if (v.isValid()){ + m_objectInspector->setTranslateProperties(v.toBool()); + } + settings()->endGroup(); settings()->beginGroup("RecentFiles"); diff --git a/limereport/lrvariablesholder.cpp b/limereport/lrvariablesholder.cpp index c34dc4c..4e79084 100644 --- a/limereport/lrvariablesholder.cpp +++ b/limereport/lrvariablesholder.cpp @@ -44,7 +44,7 @@ VariablesHolder::~VariablesHolder() QMap::iterator it = m_varNames.begin(); while(it!=m_varNames.end()){ delete *it; - it++; + ++it; } m_varNames.clear(); m_userVariables.clear(); diff --git a/limereport/objectinspector/images/settings.png b/limereport/objectinspector/images/settings.png new file mode 100644 index 0000000000000000000000000000000000000000..226e2f05cf1d786f15e72732440179ef0b7fece1 GIT binary patch literal 643 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>6A+miNe1UogY2olJ}@-@Y<$-X>ODD8BvY`(NMx&G++Hr zvg7_I{Q^$p=Pn9f{NvHV14>WN?gQ#&O!9VjF><)%a{|cWEbxddW?hHk`9xP{d+!cEpIbDNac1)OYG~p;$&<_1Trn%?D zXSxafny~a-@7A=X*X@d%uh>MY9iFD!%2alZaW?a+1-8x2?Cxyp+ve0y>;55rYt7zi zPv35y)*ZT4J1l%(#OkWo7VCdM{#(J=n=7`jO*eC!1 literal 0 HcmV?d00001 diff --git a/limereport/objectinspector/lobjectinspector.qrc b/limereport/objectinspector/lobjectinspector.qrc index 7dd5e48..6b6f10f 100644 --- a/limereport/objectinspector/lobjectinspector.qrc +++ b/limereport/objectinspector/lobjectinspector.qrc @@ -6,5 +6,6 @@ images/uncheck.png images/check_w.png images/uncheck_w.png + images/settings.png diff --git a/limereport/objectinspector/lrobjectinspectorwidget.cpp b/limereport/objectinspector/lrobjectinspectorwidget.cpp index d4158f0..3997e16 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.cpp +++ b/limereport/objectinspector/lrobjectinspectorwidget.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include "lrglobal.h" #include "lrobjectinspectorwidget.h" @@ -183,10 +184,25 @@ ObjectInspectorWidget::ObjectInspectorWidget(QWidget *parent) connect(pbClear, SIGNAL(clicked()), le, SLOT(clear())); le->setPlaceholderText(tr("Filter")); connect(le, SIGNAL(textChanged(const QString&)), this, SLOT(slotFilterTextChanged(const QString&))); + + QToolButton* settingButton = new QToolButton(this); + settingButton->setIcon(QIcon(":/items/images/settings.png")); + QMenu* settingMenu = new QMenu(settingButton); + m_translateProperties = settingMenu->addAction(tr("Translate properties")); + m_translateProperties->setCheckable(true); + m_translateProperties->setChecked(translateProperties()); + + connect(m_translateProperties, SIGNAL(toggled(bool)), + this, SLOT(slotTranslatePropertiesChecked(bool))); + + settingButton->setMenu(settingMenu); + settingButton->setPopupMode(QToolButton::InstantPopup); + QHBoxLayout* h = new QHBoxLayout(); h->setSpacing(2); h->addWidget(le); h->addWidget(pbClear); + h->addWidget(settingButton); l->addLayout(h); l->addWidget(m_objectInspectorView); l->setMargin(Const::DOCKWIDGET_MARGINS); @@ -246,6 +262,18 @@ void ObjectInspectorWidget::setSubclassesAsLevel(bool value) m_propertyModel->setSubclassesAsLevel(value); } +bool ObjectInspectorWidget::translateProperties() +{ + return m_propertyModel->isTranslateProperties(); +} + +void ObjectInspectorWidget::setTranslateProperties(bool value) +{ + m_propertyModel->setTranslateProperties(value); + m_translateProperties->setChecked(value); + update(); +} + const QObject *ObjectInspectorWidget::object(){ return m_propertyModel->currentObject(); } @@ -276,4 +304,9 @@ void ObjectInspectorWidget::slotFilterTextChanged(const QString &filter) m_filterModel->setFilterRegExp(QRegExp(filter, Qt::CaseInsensitive, QRegExp::FixedString)); } +void ObjectInspectorWidget::slotTranslatePropertiesChecked(bool value) +{ + setTranslateProperties(value); +} + } //namespace LimeReport diff --git a/limereport/objectinspector/lrobjectinspectorwidget.h b/limereport/objectinspector/lrobjectinspectorwidget.h index 88ef97a..fb1d0a6 100644 --- a/limereport/objectinspector/lrobjectinspectorwidget.h +++ b/limereport/objectinspector/lrobjectinspectorwidget.h @@ -83,6 +83,8 @@ public: void setValidator(ValidatorIntf *validator); bool subclassesAsLevel(); void setSubclassesAsLevel(bool value); + bool translateProperties(); + void setTranslateProperties(bool value); void setObject(QObject* setObject); const QObject* object(); void setMultiObjects(QList* list); @@ -90,10 +92,13 @@ public: void updateProperty(const QString &propertyName); private slots: void slotFilterTextChanged(const QString& filter); + void slotTranslatePropertiesChecked(bool value); private: ObjectInspectorTreeView* m_objectInspectorView; QSortFilterProxyModel* m_filterModel; BaseDesignPropertyModel* m_propertyModel; + QAction* m_translateProperties; + }; } //namespace LimeReport diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index e7bf04f..9aff3a0 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -169,7 +169,8 @@ void QObjectPropertyModel::clearObjectsList() } QObjectPropertyModel::QObjectPropertyModel(QObject *parent/*=0*/) - :QAbstractItemModel(parent),m_rootNode(0),m_object(0),m_dataChanging(false), m_subclassesAsLevel(true), m_validator(0) + :QAbstractItemModel(parent),m_rootNode(0), m_object(0), m_dataChanging(false), + m_subclassesAsLevel(true), m_validator(0), m_translateProperties(true) {} QObjectPropertyModel::~QObjectPropertyModel() @@ -297,16 +298,17 @@ QVariant QObjectPropertyModel::data(const QModelIndex &index, int role) const switch (role) { case Qt::DisplayRole: if (!node) return QVariant(); + node->setTranslateProperty(isTranslateProperties()); if (index.column()==0){ return node->displayName(); - } else return node->displayValue(); - break; + } else { + return node->displayValue(); + } case Qt::DecorationRole : if (!node) return QIcon(); if (index.column()==1){ return node->iconValue(); - }else return QIcon(); - break; + } else return QIcon(); case Qt::UserRole: return QVariant::fromValue(node); default: @@ -418,6 +420,16 @@ ObjectPropItem * QObjectPropertyModel::createPropertyItem(QMetaProperty prop, QO } return propertyItem; } + +bool QObjectPropertyModel::isTranslateProperties() const +{ + return m_translateProperties; +} + +void QObjectPropertyModel::setTranslateProperties(bool translateProperties) +{ + m_translateProperties = translateProperties; +} ValidatorIntf *QObjectPropertyModel::validator() const { return m_validator; diff --git a/limereport/objectinspector/lrobjectitemmodel.h b/limereport/objectinspector/lrobjectitemmodel.h index bf01cb2..2aa1f8b 100644 --- a/limereport/objectinspector/lrobjectitemmodel.h +++ b/limereport/objectinspector/lrobjectitemmodel.h @@ -72,6 +72,9 @@ public: void setValidator(ValidatorIntf* validator); void translatePropertyName(); void clearObjectsList(); + bool isTranslateProperties() const; + void setTranslateProperties(bool isTranslateProperties); + signals: void objectPropetyChanged(const QString& , const QVariant&, const QVariant&); private slots: @@ -83,12 +86,13 @@ private: LimeReport::CreatePropItem propertyItemCreator(QMetaProperty prop); LimeReport::ObjectPropItem* createPropertyItem(QMetaProperty prop, QObject *object, ObjectPropItem::ObjectsList* objects, ObjectPropItem* parent); private: - LimeReport::ObjectPropItem* m_rootNode; - QObject* m_object; - QList m_objects; - bool m_dataChanging; - bool m_subclassesAsLevel; - ValidatorIntf* m_validator; + LimeReport::ObjectPropItem* m_rootNode; + QObject* m_object; + QList m_objects; + bool m_dataChanging; + bool m_subclassesAsLevel; + ValidatorIntf* m_validator; + bool m_translateProperties; }; } diff --git a/limereport/objectinspector/lrobjectpropitem.cpp b/limereport/objectinspector/lrobjectpropitem.cpp index 3fc212c..6ef6613 100644 --- a/limereport/objectinspector/lrobjectpropitem.cpp +++ b/limereport/objectinspector/lrobjectpropitem.cpp @@ -42,7 +42,8 @@ bool lesThen(ObjectPropItem* v1, ObjectPropItem* v2){ ObjectPropItem::ObjectPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, ObjectPropItem *parent, bool isClass) :m_object(object), m_name(name), m_displayName(displayName), m_haveValue(false), m_parent(parent), m_colorIndex(-1), - m_readonly(true), m_model(0), m_isClass(isClass), m_changingValue(false) + m_readonly(true), m_model(0), m_isClass(isClass), m_changingValue(false), + m_translatePropperty(true) { if (parent) setModel(parent->model()); m_index=QModelIndex(); @@ -60,7 +61,8 @@ ObjectPropItem::ObjectPropItem(QObject *object, ObjectsList* objects, const QStr ObjectPropItem::ObjectPropItem(QObject *object, ObjectsList* objects, const QString &name, const QString &displayName, const QVariant &value, ObjectPropItem *parent, bool readonly) :m_object(object), m_name(name), m_displayName(displayName), m_value(value), m_haveValue(true), m_parent(parent), m_colorIndex(-1), - m_readonly(readonly), m_model(0), m_isClass(false), m_changingValue(false) + m_readonly(readonly), m_model(0), m_isClass(false), m_changingValue(false), + m_translatePropperty(true) { if (parent) setModel(parent->model()); m_index=QModelIndex(); @@ -109,6 +111,10 @@ void ObjectPropItem::setPropertyValue(QVariant value){ } } +QString ObjectPropItem::displayName() const { + return isTranslateProperty() ? m_displayName : propertyName(); +} + int ObjectPropItem::row(){ if (m_parent) return m_parent->m_childItems.indexOf(const_cast(this)); @@ -155,6 +161,16 @@ void ObjectPropItem::setValueToObject(const QString &propertyName, QVariant prop } } +bool ObjectPropItem::isTranslateProperty() const +{ + return m_translatePropperty; +} + +void ObjectPropItem::setTranslateProperty(bool translatePropperty) +{ + m_translatePropperty = translatePropperty; +} + ObjectPropItem * ObjectPropItem::findChild(const QString &name) { foreach(ObjectPropItem* item,m_childItems){ diff --git a/limereport/objectinspector/lrobjectpropitem.h b/limereport/objectinspector/lrobjectpropitem.h index c5403cd..46392fc 100644 --- a/limereport/objectinspector/lrobjectpropitem.h +++ b/limereport/objectinspector/lrobjectpropitem.h @@ -56,7 +56,7 @@ namespace LimeReport{ virtual QVariant propertyValue() const; virtual void setPropertyValue(QVariant value); virtual QString propertyName() const {return m_name;} - virtual QString displayName() const {return m_displayName;} + virtual QString displayName() const; virtual QString displayValue() const; virtual QIcon iconValue() const{return QIcon();} virtual bool isHaveChildren() const {return m_childItems.count()>0;} @@ -90,6 +90,8 @@ namespace LimeReport{ void setModelIndex(const QModelIndex& index){m_index=index;} QModelIndex modelIndex(){return m_index;} bool isClass(){return m_isClass;} + bool isTranslateProperty() const; + void setTranslateProperty(bool translatePropperty); #ifdef INSPECT_BASEDESIGN private slots: void slotPropertyChanged(const QString& name, QVariant, QVariant newValue); @@ -120,6 +122,7 @@ namespace LimeReport{ QModelIndex m_index; bool m_isClass; bool m_changingValue; + bool m_translatePropperty; }; typedef QPair APropIdent; diff --git a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp index 143ba38..d38331d 100644 --- a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp @@ -162,7 +162,7 @@ void EnumPropItem::setModelData(QWidget *propertyEditor, QAbstractItemModel *mod QString EnumPropItem::nameByType(int value) const { QMetaEnum propEnum = object()->metaObject()->property(object()->metaObject()->indexOfProperty(propertyName().toLatin1())).enumerator(); - return tr(propEnum.valueToKey(value)); + return isTranslateProperty() ? tr(propEnum.valueToKey(value)) : propEnum.valueToKey(value); } int EnumPropItem::typeByName(const QString &value) const diff --git a/limereport/objectinspector/propertyItems/lrflagspropitem.cpp b/limereport/objectinspector/propertyItems/lrflagspropitem.cpp index de4af7c..91d142e 100644 --- a/limereport/objectinspector/propertyItems/lrflagspropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrflagspropitem.cpp @@ -97,8 +97,8 @@ QString FlagsPropItem::displayValue() const { if ((propEnum.keyToValue(propEnum.key(i)) == 0) ? propertyValue().toInt() == 0 : (propertyValue().toInt() & propEnum.keyToValue(propEnum.key(i))) == propEnum.keyToValue(propEnum.key(i))) { - if (result.isEmpty()) result+= tr(propEnum.key(i)); - else result=result+" | "+tr(propEnum.key(i)); + if (result.isEmpty()) result+= isTranslateProperty() ? tr(propEnum.key(i)) : propEnum.key(i); + else result=result+" | "+ (isTranslateProperty() ? tr(propEnum.key(i)) : propEnum.key(i)); } } diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index 3ce791a78c782c75fd3bb2702eeadd125a7c7ce9..35a81f92e28904a273ad7365cb11b47aeee80cfe 100644 GIT binary patch delta 4815 zcmXY!30zEj8^@n#&N63a&dhXMxLL}+Wl4*KQqd(uC`-1;q-)pWE!0FLBxx!lsf19- zQluz>WTMeQY~sw5WP2lf;T7}QE) zUPoZBECg&D1?<(%fWbq6y+x<>4U-uBUSjqM;zqz;6C|cAm6$qQ;*qw%K5qbY%WeRU zy#ly&32^dq!1-+?mURQp>L!^x8o1&1dDjMz-vGD2d;JVOLp;%&nYZ0WcPxbj1Q z(R+cbDg}782)HZf0UfpjpVA5N_cS7fqU;jz6(xY>uYqqe-ea-h4O%+ZgUxdvz+GLz zsUZ|FY!D1fNg|8h6DiO)tD1=m9KmDWG=N(Zz~ddATJX`}E_2X7f>Ein0N1)oTz_3+ z!WxMw4idLbm6$gbJQdl1CqIIhLk$JA7<`&+Ih_s@BFX@dWWj{>y8)gYY$jUeNesUR z6E@KIPCtT)3G{i}S1{>E1Ax9Z1AL8+15Q~7zTuP^}h~u1{bHR(QhVCQn8?L)eBDRItGizLmZ>{TPHl*8%!@!wRpXfOFbF#J@R! zb1nYQov_xE3|w7mC}Fzj?X4m4{7}FSTOs?;EWrI*$UgU!dc_$^9+I82OyCR={{8@! zY$Vlr0bE{B{jqN=+_1X}aQi3Jc3cIRv;pqA$^iSFAwCAQe+kdWJ_EF~hWCEt$C6z5 zWJU4m`BP%d3N+4r4SG~sp($O!?Mc{vC1v#$}>cPBOr=H8?$g zCE$)3sB1{4DtjVv%@bVI$r0fG3S1f&1ZdTWhOXBEr>(=J>V1HPVYoewa!c*3v zQUl1ImG%EhRlVI!=KRVPuvnCNq*hVj<{Lb@E_(NYvd~pzX0PwEFzyn$p_E0IodJwE zBip=_I$762mbj2Orbc2#tt{2%CZK0t)8*yE$@on{tb{zTc=iVA?54UA^>Q^4^? zjL~IEK$10MtR|8BwXB)AV6CAu-_^B_>9WljFiK#0MO#ogbByg|GAr7Jv0dW_*zPLR zuhm1q16!B@f6-}{_nE=%s9zcuGVU76(x`ogjl6|^=PbrAbvk*`$jmgMkL|z6_y>~e zZeGg-ymcop8D?I7PryOpYvxP>_% zN$R?6Ia4$JFklYD)Y?%}RunUJCx!q{ienzOng(dLgn2m0l&WdyP3Ea_M+&z&^Jd9V zYNK%G*DUfneksee*bQh>z*=jU0DN1@+SCOBhK8`V7dgPe`Ru?k^q_9xtgF`}z)dgM zp^7BHp$l2xE(-ywd$N8lCX!=vRu_hV$1bzW2F?aNv4vgzIEv&wfL%BDh91yUVB-$W zqOcpW2{)+@;;UK1%Vdf`HM`ZL7@&TAGchhy;$bT`&6mXU)=4()yA06$nZytqiA8tW zjE5fp7nQM@?}&>#ve_+<0CxA57_OCA@|@lMdKw+jdNf@SLlPyP>csBj%&DO(+5J<= zpmGOxe-(L}aztWkG<#smRlwsL+1#F#Q3z!7Vo5K2`m=|k$z!ITJzVJw=w51w5G)1^ zYsZ$z>G?fUC5A7Oc)BlpTB)Hn?bl4)*qXgMpp*jIm%U|JO>Jv#s1YpnTiIthl!keo zB}N3Wuli6Pk4$4fB~saW2eLoDw+Boc!?EdQfT|%Jo9hjjUdgq8Mox{hKL z>&{c%s4j5!O`^B+8rP4bbme{G99~sW9c6L-Kaoi2HgJw<7XY;yZa|AHKz&AgZdh0H zzGWdds-p?XY7XZWycyv8DbCy49k4|e=j%U<^nL~B*QBne&u{^EsE&T0z|FaRmh^uF z7g!Vnct*yB>;48fcbZ!_fF)Uf!L9cq13iv%aZAY%yVqQN><+-pQCxzH9l*m=TtZQk zYc6}^O`c>S?*ie9XdE8m|M!=3$ zTTmP_LSg@t^}&!&LuXY;Ki%c-yX81j@B`t%vR)rGw@l>f`y&ZTPhu;d5b zBr8|NO5Eozv9ulUVnN}ti{*!{O{D*8B<5U{c&>yWec>^ndLlnDYB6mSh5QV!oAh{V zi7|b6zwQx$;xFDmx;Kfr13xFDiu!k=mJdpz@p87BU$%t~UYRKI+$28sW)`3!g^&09 z324gmn|z6iQa)iS2}-V-Pl#e@{LJDL`zojqQuyuB6lS9vd{cYjkm-Edc~gLYwS2nl zcT)dt{LcGi;7kvGS3io|o$*a1k8>;d-ED#alY{vK2`woD1FDD@n^?O0?hctm%7gcEcp+A!NrjZ=MH~)pN{0WfWJEJ7oe9j-`o!) z=kRrh$YuB>2-|8^$fYq%8yhx)$;xu z$#I`}iIrXD!}3=H4*Mk^--SBK%2Pi5ojqXec=_BK>ZC)hnLE3eBTcP90f zzp9J_cz#-t4Ywm5{a4UTq`I1TUNH3-4>;Mu;HhqjnFgKOQvZ)IS)WKt?`>guWhhO~ zbYYzn6;-RhgiVq4q%hgSrYLeX@Qtu3o+7ZxTS%R54(M`CNPV$}G`NM37WWl!M7^*x zQwHdiBV_oIt$&nBEYA_Ln(pJb47ei zeXSEp{5z8{qzff+BoK*t!nui5_#@=P<)`lC_haFP8>P>;qwqW>o(kAQ;;Z6jVlpqh z8>^%BPa%AMI|Sg<8;QSq37;G2obj`Tuet4LF8T^z4^sS;U7Zw+kPSF{nqjxba&o<* z&)E>bqj8FXN63r`ISQxh`*d%s7`%u2!TUFb%VG^JbG{1Kx+gTOA1G!vwMD@xg)XHn z?f*rJfJ?M=9C@J#%)J4)a5#~w!|kM@t+tDPH7FuCn^2_sDPr#V0B%T8?C_&V-HfZ@;{7>} zhEA?hywwTtx1&naw13FVt4fP~hX6h_C_6P8Xd91Fc43Bqp;T*Zo}jd4S*pM7N~a4E zwEuZ22RE_LAj2DN%dtO|{t?Hi8;X?vh3>TV`YLtyWT=g`QkQEAxb36F!}E!DlxmH{ za!>|$qqrQ4R&I_nqiMKOnPwhJd&LifkCCOmR(X6&6uI?PS#aV5Ag)oKWRKFPot4FL zA%I+n#FH(RXJ^sV-9{@bp1-Bh7%TBzU^6kUx3bDzMLp@Ptnwze&9^G6baZcl5)VC5 z{&k6ZYlD%p`b08)E=hUCJd4Cwxk7oj)`mpkfbv=C6B3iD$}jf2NK6`3>@R!3xZ|o; zF0-kN@>Hz?1rl{u)tyhGmxWqY{~;uk&rMXGP0c#kLp62-8SHaSrL#7pX*FBoz{RQn zfgI}}sS0q~L&No>#FOJx0Y!}@pDj8!U!da|)r!gQ0e-}(B4avGYZw$3WcY;fs{DG& zUT-(mjk^@lJ)Ko|taLOk!zB)ArK(f?(o-c26meuJjj1o9Fy=8}`;nsf2ZeBRZ_y~B zf^_n{Xu^;O%fCrncTnP)VdC#IB55sNB$~g!NroL1JN9g(EqsaCdC3<#Z;RMntf0l< zlGxLPzQ1Cs#Pv#vXA;G}Gwta?BM*wU@){ZpYO!B1-3Of$`xmXE#ts(;^rgT1#)|_^ zx|4uC6Nm21r}cfVVYjifO@W6vW1KBHwo3G`_MpC1NvsGH7gWumLTeDCVnYB^&x^?} z{v^v~1~ZdB`p4oa45qDlfp~7uF+j)u;)RigfD2xT)dk0CEj1PIl=cSrDT?=gQFwQX z;s@t?QiF%$zsHc4K2H4p#ErgRr0x)XnWj~5b$5O>;Hi0P=MiM|qS@-f^)moI7OGu; z4yCB2s{iO3N-t$`>fv?tIoWbsLj{>}R=v)PX4Sxp64%(MGk(!5m^epW=*0qVoTDz9 zR7=^*QJ<|{3pllpx@;?no=lLqCRY9OCB?*LnfhxOncea?i33|`j5DbH?{3qW7ak<- zD$w*f+;sm<<4{88%wMmWZe&k&-=m#o_9|Q2GHNwzbYyqtR?XIuBXnRV&GordUa?i0 z+I!cjAzMg{yrX&Xt(=zO)|!TDic1?4%{LV#!{DI#5%q>-ZlzZ4X+wtY)wZ}y{V?rc zZTkuus>ScL-A9n2kxR9XkAi5*Bx`49CWAkAx~J9Invs5N*6O^dPFFpaSn98xlO0FP z@H_326J)Uorw#s0>k-b^>VqlWXBFE0`%P(Uuh$-kc|k9WJ+ucMZ;(fs+Ts?c>18iS zTUpYb{=eMdV`gcQrLFf4p;awLVwqn1>?qCDEk%FQ`*(VDqFG_08Afy)W6fH!_N)v2 z+OW>79owIEV@E+d;vo8)6KhS^uFd~*B)YLS0`1+v)32#_(9DIw^Jj+W+AR)Rv{)Au T@~19%OPUi}6>6RF41|T~En3(~<%?CgO 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 diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index 2bca21d..b6da993 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1235,6 +1235,10 @@ p, li { white-space: pre-wrap; } Filter Фильтр + + Translate properties + Переводить имена свойств + LimeReport::PDFExporter From f7e1a383e9c59536afda93cd2d6b3d641aa69d39 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 28 Jun 2019 20:12:47 +0300 Subject: [PATCH 336/347] geometryLocked property has been added to report items --- limereport/bands/lrdataband.cpp | 1 - limereport/bands/lrpagefooter.cpp | 1 + limereport/bands/lrpagefooter.h | 2 +- limereport/images/lock.png | Bin 0 -> 608 bytes limereport/images/unlock.png | Bin 0 -> 613 bytes limereport/items/lrimageitem.cpp | 1 + limereport/items/lrimageitem.h | 2 +- limereport/items/lrtextitem.cpp | 2 + limereport/items/lrtextitem.h | 2 +- limereport/lrbanddesignintf.cpp | 2 +- limereport/lrbasedesignintf.cpp | 60 ++++++++++++++++-- limereport/lrbasedesignintf.h | 15 ++++- limereport/lrpagedesignintf.cpp | 36 +++++++++++ limereport/lrpagedesignintf.h | 4 ++ limereport/lrreportdesignwidget.cpp | 18 ++++++ limereport/lrreportdesignwidget.h | 3 + limereport/lrreportdesignwindow.cpp | 44 ++++++++++++- limereport/lrreportdesignwindow.h | 8 +++ .../objectinspector/lrobjectitemmodel.cpp | 1 + limereport/report.qrc | 2 + translations/limereport_ru.qm | Bin 121930 -> 122748 bytes translations/limereport_ru.ts | 24 ++++++- 22 files changed, 208 insertions(+), 20 deletions(-) create mode 100644 limereport/images/lock.png create mode 100644 limereport/images/unlock.png diff --git a/limereport/bands/lrdataband.cpp b/limereport/bands/lrdataband.cpp index 2a6eaf7..7119440 100644 --- a/limereport/bands/lrdataband.cpp +++ b/limereport/bands/lrdataband.cpp @@ -142,7 +142,6 @@ void DataBand::processPopUpAction(QAction *action) if (action->text().compare(tr("Start from new page")) == 0){ setProperty("startFromNewPage",action->isChecked()); } - } BaseDesignIntf *DataBand::createSameTypeItem(QObject *owner, QGraphicsItem *parent) diff --git a/limereport/bands/lrpagefooter.cpp b/limereport/bands/lrpagefooter.cpp index 68b9f0a..8ee5959 100644 --- a/limereport/bands/lrpagefooter.cpp +++ b/limereport/bands/lrpagefooter.cpp @@ -87,6 +87,7 @@ void PageFooter::processPopUpAction(QAction *action) if (action->text().compare(tr("Print on last page")) == 0){ page()->setPropertyToSelectedItems("printOnLastPage",action->isChecked()); } + BandDesignIntf::processPopUpAction(action); } bool PageFooter::printOnFirstPage() const diff --git a/limereport/bands/lrpagefooter.h b/limereport/bands/lrpagefooter.h index 2f634a5..3422b60 100644 --- a/limereport/bands/lrpagefooter.h +++ b/limereport/bands/lrpagefooter.h @@ -35,7 +35,7 @@ #include namespace LimeReport{ -class PageFooter : public LimeReport::BandDesignIntf +class PageFooter : public BandDesignIntf { Q_OBJECT Q_PROPERTY(bool printOnFirstPage READ printOnFirstPage WRITE setPrintOnFirstPage) diff --git a/limereport/images/lock.png b/limereport/images/lock.png new file mode 100644 index 0000000000000000000000000000000000000000..5485df1b16e43e97ceedef2d3506427c7bb7c38a GIT binary patch literal 608 zcmV-m0-ybfP)EX>4Tx04R}tkv&MmKpe$iQ?-6n9PA*{AwzYtC@SJ8RV;#q(pG5I!Q|2}Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;i>s5OinMHhnTLl4F!X6muzVhU}?*F8LZy$kcK_UHZ_{YutkfJY>rW4d7xZxGLH zS~}-_;s7g13h_Ddm_ZjLe&o9B@*C&8!vfC?7^%cOae!FNx3Jv8tYE0b)5IY~)hJ&` zyR2~D;;fb`tZ`5NLVs3UNphWL5K$~4hB!pXsGx`vEQD#*NHLM1{YV@Cu;Y)DOD0zl zj2sInLxtq{!T;cQw`Oi?(oOP5fX)}&{ulv#yFk5a+uz5wT|WW5&%l+|^p|VE>?i5f zrWQH^2DX8V>!v2}0hc?#(3371k|TL(3b`Ecen#Jv0S0e@-Zi(k#y(CTfE0DLd;=UD z0;74#UT^d6?$+M^J=5s#2ZRuEu8TAp6951J24YJ`L;%nL&;ZbT>?6Ve000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jd1D4+IKEZnZ1`003M`L_t(I%VS`m5HO+(lEX>4Tx04R}tkv&MmKpe$iQ?-6n9PA*{AwzYtC@SJ8RV;#q(pG5I!Q|2}Xws0R zxHt-~1qVMCs}3&Cx;nTDg5U>;i>s5OinMHhnTLl4F!X6muzVhU}?*F8LZy$kcK_UHZ_{YutkfJY>rW4d7xZxGLH zS~}-_;s7g13h_Ddm_ZjLe&o9B@*C&8!vfC?7^%cOae!FNx3Jv8tYE0b)5IY~)hJ&` zyR2~D;;fb`tZ`5NLVs3UNphWL5K$~4hB!pXsGx`vEQD#*NHLM1{YV@Cu;Y)DOD0zl zj2sInLxtq{!T;cQw`Oi?(oOP5fX)}&{ulv#yFk5a+uz5wT|WW5&%l+|^p|VE>?i5f zrWQH^2DX8V>!v2}0hc?#(3371k|TL(3b`Ecen#Jv0S0e@-Zi(k#y(CTfE0DLd;=UD z0;74#UT^d6?$+M^J=5s#2ZRuEu8TAp6951J24YJ`L;%nL&;ZbT>?6Ve000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2jd1D4+RjS7kw81003c0L_t(I%VS`m5HO+(ltext().compare(tr("Watermark")) == 0){ page()->setPropertyToSelectedItems("watermark",action->isChecked()); } + ItemDesignIntf::processPopUpAction(action); } bool ImageItem::useExternalPainter() const diff --git a/limereport/items/lrimageitem.h b/limereport/items/lrimageitem.h index 91a3d92..5d474e2 100644 --- a/limereport/items/lrimageitem.h +++ b/limereport/items/lrimageitem.h @@ -33,7 +33,7 @@ namespace LimeReport{ -class ImageItem : public LimeReport::ItemDesignIntf, public IPainterProxy +class ImageItem : public ItemDesignIntf, public IPainterProxy { Q_OBJECT Q_ENUMS(Format) diff --git a/limereport/items/lrtextitem.cpp b/limereport/items/lrtextitem.cpp index 0376655..50de9d5 100644 --- a/limereport/items/lrtextitem.cpp +++ b/limereport/items/lrtextitem.cpp @@ -152,6 +152,8 @@ void TextItem::processPopUpAction(QAction *action) if (action->text().compare(tr("Hide if empty")) == 0){ page()->setPropertyToSelectedItems("hideIfEmpty",action->isChecked()); } + + ContentItemDesignIntf::processPopUpAction(action); } void TextItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* style, QWidget* widget) { diff --git a/limereport/items/lrtextitem.h b/limereport/items/lrtextitem.h index abc1211..aa624eb 100644 --- a/limereport/items/lrtextitem.h +++ b/limereport/items/lrtextitem.h @@ -41,7 +41,7 @@ namespace LimeReport { class Tag; -class TextItem : public LimeReport::ContentItemDesignIntf, IPageInit { +class TextItem : public ContentItemDesignIntf, IPageInit { Q_OBJECT Q_ENUMS(AutoWidth) Q_ENUMS(AngleType) diff --git a/limereport/lrbanddesignintf.cpp b/limereport/lrbanddesignintf.cpp index 3751f44..caac574 100644 --- a/limereport/lrbanddesignintf.cpp +++ b/limereport/lrbanddesignintf.cpp @@ -607,7 +607,7 @@ void BandDesignIntf::processPopUpAction(QAction *action) if (action->text().compare(tr("Print if empty")) == 0){ setProperty("printIfEmpty",action->isChecked()); } - + ItemsContainerDesignInft::processPopUpAction(action); } void BandDesignIntf::recalcItems(DataSourceManager* dataManager) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 18d5130..52970c2 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -83,7 +83,8 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q m_joinMarkerOn(false), m_selectionMarker(0), m_fillTransparentInDesignMode(true), - m_unitType(Millimeters) + m_unitType(Millimeters), + m_itemGeometryLocked(false) { setGeometry(QRectF(0, 0, m_width, m_height)); if (BaseDesignIntf *item = dynamic_cast(parent)) { @@ -96,12 +97,7 @@ BaseDesignIntf::BaseDesignIntf(const QString &storageTypeName, QObject *owner, Q QRectF BaseDesignIntf::boundingRect() const { - if (m_boundingRect.isNull()) { - qreal halfpw = pen().widthF() / 2; - halfpw += 2; - m_boundingRect = rect(); - }; - return m_boundingRect; + return rect(); } BaseDesignIntf::~BaseDesignIntf(void) { @@ -734,6 +730,32 @@ void BaseDesignIntf::updatePossibleDirectionFlags(){ } } +bool BaseDesignIntf::isItemGeometryLocked() const +{ + return m_itemGeometryLocked; +} + +void BaseDesignIntf::setItemGeometryLocked(bool itemLocked) +{ + if (m_itemGeometryLocked != itemLocked){ + m_itemGeometryLocked = itemLocked; + if (itemLocked){ + m_savedPossibleMoveDirectionFlags = m_possibleMoveDirectionFlags; + m_savedPossibleResizeDirectionFlags = m_possibleResizeDirectionFlags; + m_possibleMoveDirectionFlags = None; + m_possibleResizeDirectionFlags = Fixed; + } else { + m_possibleMoveDirectionFlags = m_savedPossibleMoveDirectionFlags; + m_possibleResizeDirectionFlags = m_savedPossibleResizeDirectionFlags; + } + if (!isLoading()){ + update(); + m_selectionMarker->update(); + notify("geometryLocked", !itemLocked, itemLocked); + } + } +} + bool BaseDesignIntf::fillTransparentInDesignMode() const { return m_fillTransparentInDesignMode; @@ -1287,6 +1309,13 @@ void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) this->setSelected(true); } QMenu menu(event->widget()); + + QAction* lockGeometryAction = menu.addAction(tr("Lock item geometry")); + lockGeometryAction->setCheckable(true); + lockGeometryAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L)); + lockGeometryAction->setChecked(isItemGeometryLocked()); + menu.addSeparator(); + QAction* copyAction = menu.addAction(QIcon(":/report/images/copy"), tr("Copy")); copyAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_C)); QAction* cutAction = menu.addAction(QIcon(":/report/images/cut"), tr("Cut")); @@ -1659,12 +1688,21 @@ void Marker::paint(QPainter* painter, const QStyleOptionGraphicsItem*, QWidget*) rect().bottom()-markerSize,markerSize*2,markerSize*2)); } +QColor Marker::color() const { + return m_color; +} + SelectionMarker::SelectionMarker(QGraphicsItem* parent, BaseDesignIntf* owner) : Marker(parent, owner) { setAcceptHoverEvents(true); } +QColor SelectionMarker::color() const +{ + return owner()->isItemGeometryLocked() ? Qt::darkGray : Marker::color(); +} + void SelectionMarker::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { if (owner()) owner()->hoverMoveEvent(event); @@ -1697,4 +1735,12 @@ void SelectionMarker::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (owner()) owner()->mouseMoveEvent(event); } +void BaseDesignIntf::processPopUpAction(QAction *action){ + if (page()){ + if (action->text().compare(tr("Lock item geometry")) == 0){ + page()->setPropertyToSelectedItems("geometryLocked",action->isChecked()); + } + } +} + } //namespace LimeReport diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 01dfc0f..646e00f 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -57,7 +57,7 @@ public: void setRect(QRectF rect){prepareGeometryChange();m_rect=rect;} void setColor(QColor color){m_color=color;} QRectF rect() const {return m_rect;} - QColor color() const {return m_color;} + virtual QColor color() const; BaseDesignIntf* owner() const {return m_owner;} private: QRectF m_rect; @@ -68,6 +68,7 @@ private: class SelectionMarker : public Marker{ public: SelectionMarker(QGraphicsItem* parent=0, BaseDesignIntf* owner = 0); + QColor color() const; protected: void hoverMoveEvent(QGraphicsSceneHoverEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event); @@ -97,6 +98,7 @@ class BaseDesignIntf : Q_PROPERTY(int borderLineSize READ borderLineSize WRITE setBorderLineSize) Q_PROPERTY(bool isVisible READ isVisible WRITE setItemVisible DESIGNABLE false) Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor) + Q_PROPERTY(bool geometryLocked READ isItemGeometryLocked WRITE setItemGeometryLocked) friend class ReportRender; public: @@ -124,7 +126,8 @@ public: ResizeBottom = 8, AllDirections = 15 }; - enum MoveFlags { LeftRight=1, + enum MoveFlags { None = 0, + LeftRight=1, TopBotom=2, All=3 }; @@ -302,6 +305,9 @@ public: void setFillTransparentInDesignMode(bool fillTransparentInDesignMode); void emitPosChanged(QPointF oldPos, QPointF newPos); + bool isItemGeometryLocked() const; + void setItemGeometryLocked(bool itemLocked); + protected: //ICollectionContainer @@ -361,7 +367,7 @@ protected: QVariant m_varValue; virtual void preparePopUpMenu(QMenu& menu){Q_UNUSED(menu)} - virtual void processPopUpAction(QAction* action){Q_UNUSED(action)} + virtual void processPopUpAction(QAction* action); void addChildItems(QList* list); qreal calcAbsolutePosY(qreal currentOffset, BaseDesignIntf* item); @@ -378,6 +384,8 @@ private: int m_selectionPenSize; int m_possibleResizeDirectionFlags; int m_possibleMoveDirectionFlags; + int m_savedPossibleResizeDirectionFlags; + int m_savedPossibleMoveDirectionFlags; int m_resizeDirectionFlags; qreal m_width; qreal m_height; @@ -427,6 +435,7 @@ private: bool m_fillTransparentInDesignMode; QRect m_itemGeometry; UnitType m_unitType; + bool m_itemGeometryLocked; signals: void geometryChanged(QObject* object, QRectF newGeometry, QRectF oldGeometry); void posChanging(QObject* object, QPointF newPos, QPointF oldPos); diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index 5fe7288..eade90c 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -1169,6 +1169,14 @@ void PageDesignIntf::activateItemToJoin(QRectF itemRect, QList& if (m_joinItem) m_joinItem->turnOnJoinMarker(true); } +void PageDesignIntf::selectAllChildren(BaseDesignIntf *item) +{ + if (item) + foreach(BaseDesignIntf* child, item->childBaseItems()){ + child->setSelected(true); + } +} + void PageDesignIntf::rectMoved(QRectF itemRect, BaseDesignIntf* container){ if (!container){ container = bandAt(QPointF(itemRect.topLeft())); @@ -1772,6 +1780,34 @@ void PageDesignIntf::setBorders(const BaseDesignIntf::BorderLines& border) changeSelectedGroupProperty("borders", (int)border); } +void PageDesignIntf::lockSelectedItems() +{ + foreach(QGraphicsItem* graphicItem, selectedItems()){ + BaseDesignIntf* item = dynamic_cast(graphicItem); + if (item) item->setProperty("geometryLocked", true); + } +} + +void PageDesignIntf::unlockSelectedItems() +{ + foreach(QGraphicsItem* graphicItem, selectedItems()){ + BaseDesignIntf* item = dynamic_cast(graphicItem); + if (item) item->setProperty("geometryLocked", false); + } +} + + +void PageDesignIntf::selectOneLevelItems() +{ + foreach(QGraphicsItem* graphicItem, selectedItems()){ + BaseDesignIntf* item = dynamic_cast(graphicItem->parentItem()); + if (item) + selectAllChildren(item); + else + selectAllChildren(dynamic_cast(graphicItem)); + } +} + void PageDesignIntf::removeAllItems() { pageItem()->clear(); diff --git a/limereport/lrpagedesignintf.h b/limereport/lrpagedesignintf.h index 0a3c914..2ed583c 100644 --- a/limereport/lrpagedesignintf.h +++ b/limereport/lrpagedesignintf.h @@ -252,6 +252,9 @@ namespace LimeReport { void setFont(const QFont &font); void setTextAlign(const Qt::Alignment& alignment); void setBorders(const BaseDesignIntf::BorderLines& border); + void lockSelectedItems(); + void unlockSelectedItems(); + void selectOneLevelItems(); private slots: void slotPageGeometryChanged(QObject*, QRectF, QRectF ); void slotItemPropertyChanged(QString propertyName, @@ -277,6 +280,7 @@ namespace LimeReport { const QVariant& newPropertyValue); void changeSelectedGroupProperty(const QString& name,const QVariant& value); void activateItemToJoin(QRectF itemRect, QList& items); + void selectAllChildren(BaseDesignIntf* item); private: enum JoinType{Width, Height}; LimeReport::PageItemDesignIntf::Ptr m_pageItem; diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index de897e7..c2d52b3 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -880,6 +880,24 @@ void ReportDesignWidget::slotDialogDeleted(QString dialogName) } } +void ReportDesignWidget::lockSelectedItems() +{ + if (activePage()) + activePage()->lockSelectedItems(); +} + +void ReportDesignWidget::unlockSelectedItems() +{ + if (activePage()) + activePage()->unlockSelectedItems(); +} + +void ReportDesignWidget::selectOneLevelItems() +{ + if (activePage()) + activePage()->selectOneLevelItems(); +} + void ReportDesignWidget::slotDatasourceCollectionLoaded(const QString & /*collectionName*/) { } diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 149dcb5..5de247e 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -201,6 +201,9 @@ public slots: void deleteCurrentPage(); void slotPagesLoadFinished(); void slotDialogDeleted(QString dialogName); + void lockSelectedItems(); + void unlockSelectedItems(); + void selectOneLevelItems(); #ifdef HAVE_QTDESIGNER_INTEGRATION void addNewDialog(); #endif diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 1fdc9e7..20d1273 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -256,6 +256,24 @@ void ReportDesignWindow::createActions() m_addNewDialogAction->setIcon(QIcon(":/report//images/addDialog")); connect(m_addNewDialogAction, SIGNAL(triggered()), this, SLOT(slotAddNewDialog())); #endif + + m_lockSelectedItemsAction = new QAction(tr("Lock selected items"), this); + m_lockSelectedItemsAction->setIcon(QIcon(":/report/images/lock")); + m_lockSelectedItemsAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L)); + connect(m_lockSelectedItemsAction, SIGNAL(triggered()), + this, SLOT(slotLockSelectedItems())); + + m_unlockSelectedItemsAction = new QAction(tr("Unlock selected items"), this); + m_unlockSelectedItemsAction->setIcon(QIcon(":/report/images/unlock")); + m_unlockSelectedItemsAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_L)); + connect(m_unlockSelectedItemsAction, SIGNAL(triggered()), + this, SLOT(slotUnlockSelectedItems())); + + m_selectOneLevelItems = new QAction(tr("Select one level items"), this); + //m_unlockSelectedItemsAction->setIcon(QIcon(":/report/images/unlock")); + m_selectOneLevelItems->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_A)); + connect(m_selectOneLevelItems, SIGNAL(triggered()), + this, SLOT(slotSelectOneLevelItems())); } void ReportDesignWindow::createReportToolBar() @@ -465,6 +483,10 @@ void ReportDesignWindow::createMainMenu() m_editMenu->addAction(m_pasteAction); m_editMenu->addAction(m_cutAction); m_editMenu->addAction(m_settingsAction); + m_editMenu->addSeparator(); + m_editMenu->addAction(m_lockSelectedItemsAction); + m_editMenu->addAction(m_unlockSelectedItemsAction); + m_editMenu->addAction(m_selectOneLevelItems); m_infoMenu = menuBar()->addMenu(tr("Info")); m_infoMenu->addAction(m_aboutAction); m_recentFilesMenu = m_fileMenu->addMenu(tr("Recent Files")); @@ -783,10 +805,10 @@ void ReportDesignWindow::restoreSetting() int screenWidth = desktop->screenGeometry().width(); int screenHeight = desktop->screenGeometry().height(); - int x = screenWidth*0.1; - int y = screenHeight*0.1; + int x = screenWidth * 0.1; + int y = screenHeight * 0.1; - resize(screenWidth*0.8, screenHeight*0.8); + resize(screenWidth * 0.8, screenHeight * 0.8); move(x, y); } v = settings()->value("PageEditorsState"); @@ -1495,8 +1517,24 @@ void ReportDesignWindow::slotAddNewDialog() { m_reportDesignWidget->addNewDialog(); } + #endif +void ReportDesignWindow::slotLockSelectedItems() +{ + m_reportDesignWidget->lockSelectedItems(); +} + +void ReportDesignWindow::slotUnlockSelectedItems() +{ + m_reportDesignWidget->unlockSelectedItems(); +} + +void ReportDesignWindow::slotSelectOneLevelItems() +{ + m_reportDesignWidget->selectOneLevelItems(); +} + void ReportDesignWindow::closeEvent(QCloseEvent * event) { if (checkNeedToSave()){ diff --git a/limereport/lrreportdesignwindow.h b/limereport/lrreportdesignwindow.h index d5dc790..5701894 100644 --- a/limereport/lrreportdesignwindow.h +++ b/limereport/lrreportdesignwindow.h @@ -125,6 +125,9 @@ private slots: void slotDeleteDialog(); void slotAddNewDialog(); #endif + void slotLockSelectedItems(); + void slotUnlockSelectedItems(); + void slotSelectOneLevelItems(); protected: void closeEvent(QCloseEvent *event); void resizeEvent(QResizeEvent *); @@ -232,6 +235,11 @@ private: QAction* m_deleteDialogAction; QAction* m_addNewDialogAction; #endif + + QAction* m_lockSelectedItemsAction; + QAction* m_unlockSelectedItemsAction; + QAction* m_selectOneLevelItems; + QMenu* m_recentFilesMenu; QSignalMapper* m_bandsAddSignalsMap; diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 9aff3a0..23fa281 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -161,6 +161,7 @@ void QObjectPropertyModel::translatePropertyName() tr("hideText"); tr("option3"); tr("units"); + tr("geometryLocked"); } void QObjectPropertyModel::clearObjectsList() diff --git a/limereport/report.qrc b/limereport/report.qrc index 57fbf96..89999d9 100644 --- a/limereport/report.qrc +++ b/limereport/report.qrc @@ -184,5 +184,7 @@ images/object.png images/vlayuot_4_24.png images/designer.png + images/lock.png + images/unlock.png diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index 35a81f92e28904a273ad7365cb11b47aeee80cfe..c1d81cb6d1805cd682ed2e52293f42f979d5ea9c 100644 GIT binary patch delta 6085 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 Hw)cMkCUh<+ delta 5565 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 Vertical Layout Создать Вертикальную Компановку + + Lock item geometry + Блокировать изменения геометрии + LimeReport::ConnectionDesc @@ -1949,12 +1953,16 @@ p, li { white-space: pre-wrap; } option3 - + units Единицы измерения + + geometryLocked + Геометрия заблокирована + LimeReport::RectPropItem @@ -2279,6 +2287,18 @@ p, li { white-space: pre-wrap; } Dialog Designer Tools Панель Инструментов + + Lock selected items + Заблокировать выбранные элементы + + + Unlock selected items + Разблокировать выбранные элементы + + + Select one level items + Выбрать все элементы одного уровня + LimeReport::ReportEnginePrivate @@ -2450,7 +2470,7 @@ This preview is no longer valid. CSV - + Separator From 9bf0ba0ded80a9862a41a44b720c98385a8f6dc4 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Fri, 28 Jun 2019 23:42:35 +0300 Subject: [PATCH 337/347] Print process has been changed and printBehavior property has been added. --- limereport/lrpageitemdesignintf.cpp | 14 ++++++++-- limereport/lrpageitemdesignintf.h | 9 +++++++ limereport/lrreportengine.cpp | 24 +++++++++++++----- .../objectinspector/lrobjectitemmodel.cpp | 1 + .../propertyItems/lrenumpropitem.cpp | 2 ++ translations/limereport_ru.qm | Bin 122748 -> 123030 bytes translations/limereport_ru.ts | 14 +++++++++- 7 files changed, 55 insertions(+), 9 deletions(-) diff --git a/limereport/lrpageitemdesignintf.cpp b/limereport/lrpageitemdesignintf.cpp index b9c5693..47715c8 100644 --- a/limereport/lrpageitemdesignintf.cpp +++ b/limereport/lrpageitemdesignintf.cpp @@ -51,7 +51,7 @@ PageItemDesignIntf::PageItemDesignIntf(QObject *owner, QGraphicsItem *parent) : m_pageOrientaion(Portrait), m_pageSize(A4), m_sizeChainging(false), m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false), m_setPageSizeToPrinter(false), - m_endlessHeight(false), m_printable(true), m_pageFooter(0) + m_endlessHeight(false), m_printable(true), m_pageFooter(0), m_printBehavior(Split) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -65,7 +65,7 @@ PageItemDesignIntf::PageItemDesignIntf(const PageSize pageSize, const QRectF &re m_pageOrientaion(Portrait), m_pageSize(pageSize), m_sizeChainging(false), m_fullPage(false), m_oldPrintMode(false), m_resetPageNumber(false), m_isExtendedInDesignMode(false), m_extendedHeight(1000), m_isTOC(false), m_setPageSizeToPrinter(false), - m_endlessHeight(false), m_printable(true), m_pageFooter(0) + m_endlessHeight(false), m_printable(true), m_pageFooter(0), m_printBehavior(Split) { setFixedPos(true); setPossibleResizeDirectionFlags(Fixed); @@ -344,6 +344,16 @@ void PageItemDesignIntf::initColumnsPos(QVector &posByColumns, qreal pos, } } +void PageItemDesignIntf::setPrintBehavior(const PrintBehavior &printBehavior) +{ + m_printBehavior = printBehavior; +} + +PageItemDesignIntf::PrintBehavior PageItemDesignIntf::printBehavior() const +{ + return m_printBehavior; +} + QString PageItemDesignIntf::printerName() const { return m_printerName; diff --git a/limereport/lrpageitemdesignintf.h b/limereport/lrpageitemdesignintf.h index 466b360..f804776 100644 --- a/limereport/lrpageitemdesignintf.h +++ b/limereport/lrpageitemdesignintf.h @@ -44,6 +44,7 @@ class PageItemDesignIntf : public ItemsContainerDesignInft Q_OBJECT Q_ENUMS(Orientation) Q_ENUMS(PageSize) + Q_ENUMS(PrintBehavior) Q_PROPERTY(int topMargin READ topMargin WRITE setTopMargin) Q_PROPERTY(int bottomMargin READ bottomMargin WRITE setBottomMargin) Q_PROPERTY(int rightMargin READ rightMargin WRITE setRightMargin) @@ -62,9 +63,11 @@ class PageItemDesignIntf : public ItemsContainerDesignInft Q_PROPERTY(bool printable READ isPrintable WRITE setPrintable) Q_PROPERTY(QString printerName READ printerName WRITE setPrinterName) Q_PROPERTY(UnitType units READ unitType WRITE setUnitTypeProperty) + Q_PROPERTY(PrintBehavior printBehavior READ printBehavior WRITE setPrintBehavior) friend class ReportRender; public: enum Orientation { Portrait = QPrinter::Portrait, Landscape = QPrinter::Landscape }; + enum PrintBehavior {Scale, Split}; enum PageSize { A4 = QPrinter::A4, B5 = QPrinter::B5, Letter = QPrinter::Letter, Legal = QPrinter::Legal, Executive = QPrinter::Executive, @@ -163,6 +166,9 @@ public: BandDesignIntf *pageFooter() const; void setPageFooter(BandDesignIntf *pageFooter); + PrintBehavior printBehavior() const; + void setPrintBehavior(const PrintBehavior &printBehavior); + signals: void beforeFirstPageRendered(); void afterLastPageRendered(); @@ -205,6 +211,9 @@ private: bool m_printable; QString m_printerName; BandDesignIntf* m_pageFooter; + PrintBehavior m_printBehavior; + + }; typedef QList ReportPages; diff --git a/limereport/lrreportengine.cpp b/limereport/lrreportengine.cpp index abcfc37..8006745 100644 --- a/limereport/lrreportengine.cpp +++ b/limereport/lrreportengine.cpp @@ -1790,16 +1790,28 @@ bool PrintProcessor::printPage(PageItemDesignIntf::Ptr page) printerPageRect = QRectF(0,0,(printerPageRect.size().width() + rightMargin + leftMargin) * page->unitFactor(), (printerPageRect.size().height() + bottomMargin +topMargin) * page->unitFactor()); - if (m_printer->pageSize() != static_cast(page->pageSize()) && + if (page->printBehavior() == PageItemDesignIntf::Split && m_printer->pageSize() != static_cast(page->pageSize()) && printerPageRect.width() < page->geometry().width()) { qreal pageWidth = page->geometry().width(); + qreal pageHeight = page->geometry().height(); QRectF currentPrintingRect = printerPageRect; - while (pageWidth>0){ - renderPage.render(m_painter, m_printer->pageRect(), currentPrintingRect); - currentPrintingRect.adjust(printerPageRect.size().width(),0,printerPageRect.size().width(),0); - pageWidth -= printerPageRect.size().width(); - if (pageWidth>0) m_printer->newPage(); + qreal curHeight = 0; + qreal curWidth = 0; + bool first = true; + while (pageHeight > 0){ + while (curWidth < pageWidth){ + if (!first) m_printer->newPage(); else first = false; + renderPage.render(m_painter, m_printer->pageRect(), currentPrintingRect); + currentPrintingRect.adjust(printerPageRect.size().width(), 0, printerPageRect.size().width(), 0); + curWidth += printerPageRect.size().width(); + + } + pageHeight -= printerPageRect.size().height(); + curHeight += printerPageRect.size().height(); + currentPrintingRect = printerPageRect; + currentPrintingRect.adjust(0, curHeight, 0, curHeight); + curWidth = 0; } } else { diff --git a/limereport/objectinspector/lrobjectitemmodel.cpp b/limereport/objectinspector/lrobjectitemmodel.cpp index 23fa281..ea92de3 100644 --- a/limereport/objectinspector/lrobjectitemmodel.cpp +++ b/limereport/objectinspector/lrobjectitemmodel.cpp @@ -162,6 +162,7 @@ void QObjectPropertyModel::translatePropertyName() tr("option3"); tr("units"); tr("geometryLocked"); + tr("printBehavior"); } void QObjectPropertyModel::clearObjectsList() diff --git a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp index d38331d..385b2d6 100644 --- a/limereport/objectinspector/propertyItems/lrenumpropitem.cpp +++ b/limereport/objectinspector/propertyItems/lrenumpropitem.cpp @@ -145,6 +145,8 @@ void EnumPropItem::translateEnumItemName() tr("Table"); tr("Millimeters"); tr("Inches"); + tr("Scale"); + tr("Split"); } void EnumPropItem::setPropertyEditorData(QWidget *propertyEditor, const QModelIndex &) const diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index c1d81cb6d1805cd682ed2e52293f42f979d5ea9c..18ad2b88ee1a568937de2e810ad9e816a30db67b 100644 GIT binary patch delta 5462 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 D)4+|t diff --git a/translations/limereport_ru.ts b/translations/limereport_ru.ts index d1ea17d..8d506fa 100644 --- a/translations/limereport_ru.ts +++ b/translations/limereport_ru.ts @@ -1001,6 +1001,14 @@ p, li { white-space: pre-wrap; } Inches Дюймы + + Scale + Масштабировать + + + Split + Разделять на части + LimeReport::FlagsPropItem @@ -1873,7 +1881,7 @@ p, li { white-space: pre-wrap; } setPageSizeToPrinter - Оправитьпараметры страницы в принтер + Отправить параметры страницы в принтер fillInSecondPass @@ -1963,6 +1971,10 @@ p, li { white-space: pre-wrap; } geometryLocked Геометрия заблокирована + + printBehavior + Режим печати + LimeReport::RectPropItem From 11cb5346086e660d816180d840b4226579bb23c2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 29 Jun 2019 18:11:00 +0300 Subject: [PATCH 338/347] Fix: geometry changing for locked items is prevented --- limereport/lrbasedesignintf.cpp | 8 ++++---- limereport/lrbasedesignintf.h | 6 +++--- limereport/lrpagedesignintf.cpp | 16 ++++++++-------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index 52970c2..a05d48a 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -730,12 +730,12 @@ void BaseDesignIntf::updatePossibleDirectionFlags(){ } } -bool BaseDesignIntf::isItemGeometryLocked() const +bool BaseDesignIntf::isGeometryLocked() const { return m_itemGeometryLocked; } -void BaseDesignIntf::setItemGeometryLocked(bool itemLocked) +void BaseDesignIntf::setGeometryLocked(bool itemLocked) { if (m_itemGeometryLocked != itemLocked){ m_itemGeometryLocked = itemLocked; @@ -1313,7 +1313,7 @@ void BaseDesignIntf::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) QAction* lockGeometryAction = menu.addAction(tr("Lock item geometry")); lockGeometryAction->setCheckable(true); lockGeometryAction->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_L)); - lockGeometryAction->setChecked(isItemGeometryLocked()); + lockGeometryAction->setChecked(isGeometryLocked()); menu.addSeparator(); QAction* copyAction = menu.addAction(QIcon(":/report/images/copy"), tr("Copy")); @@ -1700,7 +1700,7 @@ SelectionMarker::SelectionMarker(QGraphicsItem* parent, BaseDesignIntf* owner) QColor SelectionMarker::color() const { - return owner()->isItemGeometryLocked() ? Qt::darkGray : Marker::color(); + return owner()->isGeometryLocked() ? Qt::darkGray : Marker::color(); } void SelectionMarker::hoverMoveEvent(QGraphicsSceneHoverEvent *event) diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 646e00f..83890de 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -98,7 +98,7 @@ class BaseDesignIntf : Q_PROPERTY(int borderLineSize READ borderLineSize WRITE setBorderLineSize) Q_PROPERTY(bool isVisible READ isVisible WRITE setItemVisible DESIGNABLE false) Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor) - Q_PROPERTY(bool geometryLocked READ isItemGeometryLocked WRITE setItemGeometryLocked) + Q_PROPERTY(bool geometryLocked READ isGeometryLocked WRITE setGeometryLocked) friend class ReportRender; public: @@ -305,8 +305,8 @@ public: void setFillTransparentInDesignMode(bool fillTransparentInDesignMode); void emitPosChanged(QPointF oldPos, QPointF newPos); - bool isItemGeometryLocked() const; - void setItemGeometryLocked(bool itemLocked); + bool isGeometryLocked() const; + void setGeometryLocked(bool itemLocked); protected: diff --git a/limereport/lrpagedesignintf.cpp b/limereport/lrpagedesignintf.cpp index eade90c..720d7bb 100644 --- a/limereport/lrpagedesignintf.cpp +++ b/limereport/lrpagedesignintf.cpp @@ -1464,7 +1464,7 @@ void PageDesignIntf::alignToLeft() CommandGroup::Ptr cm = CommandGroup::create(); foreach(QGraphicsItem * item, selectedItems()) { BaseDesignIntf *bdItem = dynamic_cast(item); - if (bdItem) { + if (bdItem && !bdItem->isGeometryLocked()) { QRectF oldGeometry = bdItem->geometry(); bdItem->setPos(QPoint(m_firstSelectedItem->pos().x(), item->pos().y())); CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); @@ -1481,7 +1481,7 @@ void PageDesignIntf::alignToRigth() CommandGroup::Ptr cm = CommandGroup::create(); foreach(QGraphicsItem * item, selectedItems()) { BaseDesignIntf *bdItem = dynamic_cast(item); - if (bdItem) { + if (bdItem && !bdItem->isGeometryLocked()) { QRectF oldGeometry = bdItem->geometry(); bdItem->setPos(QPoint(m_firstSelectedItem->geometry().right() - bdItem->width(), bdItem->pos().y())); CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); @@ -1498,7 +1498,7 @@ void PageDesignIntf::alignToVCenter() CommandGroup::Ptr cm = CommandGroup::create(); foreach(QGraphicsItem * item, selectedItems()) { BaseDesignIntf *bdItem = dynamic_cast(item); - if (bdItem) { + if (bdItem && !bdItem->isGeometryLocked()) { QRectF oldGeometry = bdItem->geometry(); bdItem->setPos(QPoint((m_firstSelectedItem->geometry().right() - m_firstSelectedItem->width() / 2) - bdItem->width() / 2, bdItem->pos().y())); CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); @@ -1515,7 +1515,7 @@ void PageDesignIntf::alignToTop() CommandGroup::Ptr cm = CommandGroup::create(); foreach(QGraphicsItem * item, selectedItems()) { BaseDesignIntf *bdItem = dynamic_cast(item); - if (bdItem) { + if (bdItem && !bdItem->isGeometryLocked()) { QRectF oldGeometry = bdItem->geometry(); bdItem->setPos(QPoint(bdItem->pos().x(), m_firstSelectedItem->pos().y())); CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); @@ -1532,7 +1532,7 @@ void PageDesignIntf::alignToBottom() CommandGroup::Ptr cm = CommandGroup::create(); foreach(QGraphicsItem * item, selectedItems()) { BaseDesignIntf *bdItem = dynamic_cast(item); - if (bdItem) { + if (bdItem && !bdItem->isGeometryLocked()) { QRectF oldGeometry = bdItem->geometry(); bdItem->setPos(QPoint(bdItem->pos().x(), m_firstSelectedItem->geometry().bottom() - bdItem->height())); CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); @@ -1549,7 +1549,7 @@ void PageDesignIntf::alignToHCenter() CommandGroup::Ptr cm = CommandGroup::create(); foreach(QGraphicsItem * item, selectedItems()) { BaseDesignIntf *bdItem = dynamic_cast(item); - if (bdItem) { + if (bdItem && !bdItem->isGeometryLocked()) { QRectF oldGeometry = bdItem->geometry(); bdItem->setPos(QPoint(bdItem->pos().x(), (m_firstSelectedItem->geometry().bottom() - m_firstSelectedItem->height() / 2) - bdItem->height() / 2)); CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); @@ -1566,7 +1566,7 @@ void PageDesignIntf::sameWidth() CommandGroup::Ptr cm = CommandGroup::create(); foreach(QGraphicsItem * item, selectedItems()) { BaseDesignIntf *bdItem = dynamic_cast(item); - if (bdItem) { + if (bdItem && !bdItem->isGeometryLocked()) { QRectF oldGeometry = bdItem->geometry(); bdItem->setWidth(m_firstSelectedItem->width()); CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); @@ -1583,7 +1583,7 @@ void PageDesignIntf::sameHeight() CommandGroup::Ptr cm = CommandGroup::create(); foreach(QGraphicsItem * item, selectedItems()) { BaseDesignIntf *bdItem = dynamic_cast(item); - if (bdItem) { + if (bdItem && !bdItem->isGeometryLocked()) { QRectF oldGeometry = bdItem->geometry(); bdItem->setHeight(m_firstSelectedItem->height()); CommandIf::Ptr command = PropertyChangedCommand::create(this, bdItem->objectName(), "geometry", oldGeometry, bdItem->geometry()); From b8ac4de1fea76eaa597fd389e7ad9287b86aaf07 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sat, 29 Jun 2019 18:40:55 +0300 Subject: [PATCH 339/347] hideIfEmpty initialization for BarcodeItem has been fixed --- limereport/items/lrbarcodeitem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/limereport/items/lrbarcodeitem.cpp b/limereport/items/lrbarcodeitem.cpp index f7adc02..9161c20 100644 --- a/limereport/items/lrbarcodeitem.cpp +++ b/limereport/items/lrbarcodeitem.cpp @@ -49,7 +49,7 @@ BarcodeItem::BarcodeItem(QObject* owner,QGraphicsItem* parent) : ContentItemDesignIntf(xmlTag,owner,parent),m_designTestValue("1"), m_barcodeType(CODE128), m_foregroundColor(Qt::black), m_backgroundColor(Qt::white), m_whitespace(10), m_angle(Angle0), m_barcodeWidth(0), m_securityLevel(0), m_pdf417CodeWords(928), m_inputMode(UNICODE_INPUT_MODE), - m_hideText(false), m_option3(0) + m_hideText(false), m_option3(0), m_hideIfEmpty(false) {} BarcodeItem::~BarcodeItem() From a70e84bf508ccff5563c93330ac42533363eb1a0 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 30 Jun 2019 12:41:07 +0300 Subject: [PATCH 340/347] Locked items movement has been fixed --- limereport/lrbasedesignintf.cpp | 3 +++ limereport/lrbasedesignintf.h | 1 + 2 files changed, 4 insertions(+) diff --git a/limereport/lrbasedesignintf.cpp b/limereport/lrbasedesignintf.cpp index a05d48a..d76f341 100644 --- a/limereport/lrbasedesignintf.cpp +++ b/limereport/lrbasedesignintf.cpp @@ -744,9 +744,12 @@ void BaseDesignIntf::setGeometryLocked(bool itemLocked) m_savedPossibleResizeDirectionFlags = m_possibleResizeDirectionFlags; m_possibleMoveDirectionFlags = None; m_possibleResizeDirectionFlags = Fixed; + m_savedFixedPos = m_fixedPos; + m_fixedPos = true; } else { m_possibleMoveDirectionFlags = m_savedPossibleMoveDirectionFlags; m_possibleResizeDirectionFlags = m_savedPossibleResizeDirectionFlags; + m_fixedPos = m_savedFixedPos; } if (!isLoading()){ update(); diff --git a/limereport/lrbasedesignintf.h b/limereport/lrbasedesignintf.h index 83890de..462791f 100644 --- a/limereport/lrbasedesignintf.h +++ b/limereport/lrbasedesignintf.h @@ -386,6 +386,7 @@ private: int m_possibleMoveDirectionFlags; int m_savedPossibleResizeDirectionFlags; int m_savedPossibleMoveDirectionFlags; + int m_savedFixedPos; int m_resizeDirectionFlags; qreal m_width; qreal m_height; From fbb014f451e420ea93286a90194fc0e3e32ac956 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 30 Jun 2019 12:43:54 +0300 Subject: [PATCH 341/347] Light theme has been fixed. --- .../qlightstyle/rc/Hmovetoolbar.png | Bin 180 -> 98 bytes .../qlightstyle/rc/Hsepartoolbar.png | Bin 147 -> 77 bytes .../qlightstyle/rc/Vmovetoolbar.png | Bin 179 -> 96 bytes .../qlightstyle/rc/Vsepartoolbar.png | Bin 150 -> 77 bytes .../qlightstyle/rc/branch_closed-on.png | Bin 147 -> 7138 bytes .../qlightstyle/rc/branch_closed.png | Bin 160 -> 87 bytes .../qlightstyle/rc/branch_open-on.png | Bin 150 -> 7085 bytes .../qlightstyle/rc/branch_open.png | Bin 166 -> 81 bytes .../qlightstyle/rc/checkbox_checked.png | Bin 492 -> 303 bytes .../rc/checkbox_checked_disabled.png | Bin 491 -> 298 bytes .../qlightstyle/rc/checkbox_checked_focus.png | Bin 252 -> 185 bytes .../qlightstyle/rc/checkbox_indeterminate.png | Bin 493 -> 306 bytes .../rc/checkbox_indeterminate_disabled.png | Bin 492 -> 301 bytes .../rc/checkbox_indeterminate_focus.png | Bin 249 -> 185 bytes .../qlightstyle/rc/checkbox_unchecked.png | Bin 464 -> 296 bytes .../rc/checkbox_unchecked_disabled.png | Bin 464 -> 289 bytes .../rc/checkbox_unchecked_focus.png | Bin 240 -> 182 bytes .../light_style_sheet/qlightstyle/rc/cloce.png | Bin 1166 -> 285 bytes .../qlightstyle/rc/close-hover.png | Bin 763 -> 164 bytes .../qlightstyle/rc/close-pressed.png | Bin 598 -> 454 bytes .../light_style_sheet/qlightstyle/rc/close.png | Bin 771 -> 164 bytes .../qlightstyle/rc/down_arrow.png | Bin 165 -> 81 bytes .../qlightstyle/rc/down_arrow_disabled.png | Bin 166 -> 81 bytes .../qlightstyle/rc/extend.png | Bin 195 -> 95 bytes .../qlightstyle/rc/left_arrow.png | Bin 166 -> 7014 bytes .../qlightstyle/rc/left_arrow_disabled.png | Bin 166 -> 88 bytes .../qlightstyle/rc/radio_checked.png | Bin 940 -> 601 bytes .../qlightstyle/rc/radio_checked_disabled.png | Bin 972 -> 597 bytes .../qlightstyle/rc/radio_checked_focus.png | Bin 903 -> 565 bytes .../qlightstyle/rc/radio_unchecked.png | Bin 728 -> 470 bytes .../rc/radio_unchecked_disabled.png | Bin 760 -> 461 bytes .../qlightstyle/rc/radio_unchecked_focus.png | Bin 703 -> 437 bytes .../qlightstyle/rc/right_arrow.png | Bin 160 -> 7138 bytes .../qlightstyle/rc/right_arrow_disabled.png | Bin 160 -> 87 bytes .../qlightstyle/rc/sizegrip.png | Bin 129 -> 129 bytes .../qlightstyle/rc/stylesheet-branch-end.png | Bin 224 -> 133 bytes .../qlightstyle/rc/stylesheet-branch-more.png | Bin 182 -> 90 bytes .../qlightstyle/rc/stylesheet-vline.png | Bin 239 -> 128 bytes .../qlightstyle/rc/transparent.png | Bin 195 -> 87 bytes .../qlightstyle/rc/undock-hover.png | Bin 741 -> 160 bytes .../qlightstyle/rc/undock.png | Bin 760 -> 160 bytes .../qlightstyle/rc/up_arrow.png | Bin 158 -> 6992 bytes .../qlightstyle/rc/up_arrow_disabled.png | Bin 159 -> 84 bytes 43 files changed, 0 insertions(+), 0 deletions(-) diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/Hmovetoolbar.png b/3rdparty/light_style_sheet/qlightstyle/rc/Hmovetoolbar.png index 349b9f02cf57392ad3739b4e89eeb542747c26aa..231aba1e09e3405d7cc2dba8565afb141851e3da 100644 GIT binary patch delta 79 zcmdnOm^4AslZAnS;pl?z?LbP?)5S4F;&O6=0?#8!M}gHWdb0l?|DUYZc)Vzm>W4_V i^Jg4_9bD%Nb27Yc5$2ZIs|M7=z~JfX=d#Wzp$Pys02;Oc delta 162 zcmYe=!Z<;)o{fQlA%CSk50GL@@^*J&_z!{$_AZ|c6yYrJh%9Dc;1&j9Muu5)B!GhK zC7!;n><_t^1yqy@)35yk3ORbZIEHAPzdG?E7lVKR3%|V8{WAMkdpwl{ljN3{Wk*l+ zjPYi=xq20E^eKnl_dhsp_&hMsmVR5IXX||G#|>>jwq~uFcB5+TTqk1LYY! MUHx3vIVCg!0MiH&Hvj+t delta 128 zcmeaB%s4@^ij9GR;lZ`HH-HpdlDE4H!+#K5uy^@npa^GyM`SSr1Gg{;GcwGYBLNg- zFY)wsWq-)UEMO&*;{K%%D5T)&;uxZFJ~?55R!4vTe|dTN|MHPNofDP?vX%rpSTZpD X-NX`DGquPTsFuOg)z4*}Q$iB}ptUC? diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/Vmovetoolbar.png b/3rdparty/light_style_sheet/qlightstyle/rc/Vmovetoolbar.png index bc63f261f74638a95dacd592f8d1eba0c413a5b6..bbfbf206bdb621af1ff2323cdcfd3a045280c5d5 100644 GIT binary patch delta 77 zcmdnYm@q-oorQsc;i$B#IgnEKba4!kxSX6IaZBM}{hxXk?Rkdt1ZTE}3L0^H3Qn4N gCZp!q!I$L>q0YkG6Sov>18QOLboFyt=akR{0I)F`;{X5v delta 161 zcmYe;%s4@^o{fQlAz$e29w5b*|H(?D8gCb5n0T@z%2~Ij105pNB{-d zOFVsD*&lK-i}Lf_<$AImDCFSj;uxZF{_Vt#ybKCFhhr>Ewm-eJ$v~mSMO|&rQOTf{ zA1d9}I0iA@=)239TUJ@Lc2|aV?(=u2)V-x&O}G1(oXwNJPvV7`PH{8PFa}RoKbLh* G2~7aeX*W#( diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/Vsepartoolbar.png b/3rdparty/light_style_sheet/qlightstyle/rc/Vsepartoolbar.png index 14b9d1341d49d1afca119d4d53ad4eb7113d0d7a..5e8c3870b15bf5cf1da9e4a74a2f28537f2531c9 100644 GIT binary patch delta 58 zcmbQn=sQ8ugoS~DVe8&IN|H(?D8gCb5n0T@z%2~Ij105pNB{-d zOFVsD*&lK-iwcM^+Z5FUg_J#A978nDCnrdRH3%N-=CAD9my&HD<=lFq9-wB(k)l{6g7E$`WNs z(qc(Og(!&@Dm;=D?-_Z@^S-^$?|nX>_xE3zaqj!RzSsAAu5*3wb55+Iz13o=RZrZ zdai8r%+*6)3sRQo92`k2+h6u|8U}AOdkUP$*Ue8x$BMl1+D^ue&CGZXsCcP9VV?81 zU%R$p{c-oOSE^m_g5sO&$3iPxNfl*d^~a~AAGr9)OneC~ENpCOK>6Po?CJ{5{MMt{ zt4y-5GLV^~Ke%-b70Q*+s>L-xNv3tDDjTOX`_?b4D;)G?Q?` ztM~5Y;JxYbc+29Zs_@FuUJtcGebl=hwqksPnP7Z5oH_Fh|u+wG+hBFY#jGNGyF^V)rTIb1IS+6s0)c#JT2(pj)0*j1@utUb! zH0Mpcg@!jicP=lNduXtPL#>lzy`f1+a<26Hjcs__?17p-ZRrIul~^UZYJtRM>d})i zWiruuNwCf4$vO0OPR`aC@+NXyM{b@;<{=H&CXeEQMB4GRD+6gZmu{bkI2^k!*Z*Gj zQ4f4^{e7=v~`5byM|hwAD`L%Cg}50v1LA%s|cf7nf3<%YCY`i zdzvt&a}{~5wDyqA7LSTi?R=xnJi(JHlVK9K+N$YU&g8;JUKda~n2TSY)CS;_;+0}1 zUmI^TSg@p%-N+2ae2MR_Z&XmRmFO$aW^xX6#q9G*Yi{5=40$C^$s6n!%*Y$eEam!| zO?bonaQwo=sTE~%j>_YA0}LU1xkg;fp3CF9Itk z?kNrx88?-Pa2M;}i?vU>3Fnb4!lwhsYy$zTHz&bI>N= zEJH6@PW1sMEJeHAC8@P8kFZd(xI93vd1Ynit~A;VU$6Ai6ONjg=!ppnPpO^yBNut^ zKXz5#Z$Fu?c`V*tvrNWNQTki0z&`R+f(}=;SgJL7&n?T^{Sr-k+RyJ~G80hSa`P+X z+)ldLWW9JTqs)tJShZ#nJ;(-Wf1ME!YO$iq41TuwJjb%g^uasSocfa zS2K@tx-^v5?@TWlcZ4m|-m3T9B5-qB@v@1PfLn5*)mS+7vEK&0;e=}Wgr!<5OZP;sPMYH$K^`YOO6qU?(CfA29woE+iVA>c5 zByCDG5my;BHI^-|YPjvz&+%<=%X+usA-zggH^?Q?rgxy()|K6}dSdc(v1D$jhiLGV z=;D~kM=C6hvVo}QuYK-MT`6sJO3*A(`|_anJROcV1&=tJO$?3(;|$eNvN4yY+%RWD?Tbwn0+rpdlSutZn$T(AhGJ-IgW zHV^c1Doc1OU-p?0e*ufSckdP6PL?0;Qbll348C6bGrkuh-YufEw7 zCU0O^g-SPKemcIk<#O`5PNM@e&I60M4v-Zp_(VADztf+w|DR&J8>5E{;-y?juN9Ce@`XFYHuN zdD^)6NQPA^PVO;d)xzTjbv@%pm30bEn?>J?*RM*c4nDoI$%-)0S@0%(NOv7lvol88 z)ct*)5`RehK&$9L5VSXO`B@EDX%X}DBke~p!R#`GLG3Q}@%5*ORrNL>=%b=qW5#(i zP~^QBx3Pgbkt2b#V2o<|)1bw%7nihE z5QkTE->b|<=JNI}VlD~f7s#{>a#{xS!y}_oBe}T9XqUd6MQi&mJM(UBxH{g=6~v?0 z)a~6K9A0s+=hk6bW_IJd4OcA$Y0spmM&hC~yceHxJhpzJLT!1b@vHSs2M%RAL*L0> z>lw^gf(VJJQuU0|YId*KejUN24IQ;wm^ES=e}DLn>)nML$I4vqs^(;G=sZox?EjQ; zwtG|Mvve)_PV>|L3a4!}x2h$?aRrVxEj1NwW)JtBK9H#RK79Dn26EU6Rh7J)$%Mn< zRu)apmM`MO%oot6*LH!#9ePgL`*lzj}2tHm-jR1z+?PSa|-_wKirA9J2iS>5(J#YQSUu1pUXz$8K1+a^!xA^Du$*4S|Ye zYFz5K&WWD!rZcJD+S}L(BAO?jzN%1=8#0cybu~9FPwEQz=nu@SEs*v0iLb{Du&g*1 zyU~`c`ja0V2R6L)W)^#9Y;LSJX($)Z)?|DDAM^Zv`FzLV@M*&5JJKPHYy?_n;lzzd z&EnE^!@RuOn);fV=wl*QhtktthWD)S+=O@{x;Wk9jJNT2Q6g0HX6^lbZ9O+`Ch<>s zRn?HifUc)k6H(empKmG#Ny^}tLLeg13^OxFvY8po(aFJ*Y-<4~O52k}vc6>uz3uH> z67B*Wg0-re1zpk7?$dJBiHvUD;@^I=zZK=*nwWLXQ0kJX_(p|%S!8ns;hI$BbMctC z{FHNXM?Y6*wZJ>}zYM=|ed5|~afy;;&P@rD#_c+4OXFkSH0HhDZJ`+X+Dxu~t?%2S zeyUW!oyR0%Sf%t>!KcA#=(kNB^av~UGqeiIQudMuOb^1~o<7KWYpD_Z$Vn4L_3-|R zp;6_*8@CobkXe~qM+}T`Z!EjqU0dLjQ`c6fYSFIcZGF9f)6-XQT)QC9VcK->7Edxa z-FL}m9n}Md=67>4VwUMdG1{#$Ng3a)m1i!$Jd$Fg;kNWJR9ed{y8rXdndgEsU)GLR zyHTr%X2q`Ql_Fu+jVpI__1-DnzER}HgPLOOn;HsV7 zk7yQePDM~pR0xHG!XVM8fPlY5@c0(NKlA-Eg69IhYN4C}9y^Fj11y387GG_CQVuhS zH$P_(4-ihx*3G2*qQIhNGtZB)BHKCsh!M)@#|YreMhMaKk#yP*94Cm&oW;;-D1ZqB zfQ9ftX3SskVEm7OU!Kk^`K(X`b2cqV$U-(J!G#47=xiE;PMAHU8u}X2v3gVlnvT&$ z=+WuA2t%AN9)Y9cXjlpj(9^}>=24MZJU)d*1B6r{Ig$bLU@*EAx;_?KXVNBB(TwMNe24RhNoE z;PCo*Lp?gqfKD--r4kBDFmWW4;8-O3=Zqth!uMr!1HgV^u;^?7@8^;WBLHybQ-rc% z^l=zNT^t^b*40Pj(U_m0EdZAX`c}w_L4$v@D|8yc66B%wL;NpN9RFk$FyH^7KBuvO-o#gyWQnjI2Re+T{_OwRsn z0qg(9^Aq}m#e~Zju(>-OxDM1E0FD3mJih|}U~&StDIT92O8z$|_1|#B@5ZzSW7*u$ zdHJ1z!0)5)dkK>iB($=1*by0pLbC*Cl_>Gk#%M z0}K|2MdNi5SPTGq-Vo!9pkVcApx>wf1xv+I45_+*W#_Sd`2q?TF!2N12)xc<6U|;{ znAV)n*8LSP@CSq@LSygchJU}>Fd|C0HU4?FMB(OPXGfT?2T{1W z5XeHqIR|k#Oa{RHt4@FV=6}J>i=Xr8zYCua`yOq^=7fUX>d$u&u>LmvFM!_}Y#B6w z#bf_n>GL7qWtn#e0c-v~2i}>$8y)J$oo>!0!bbWJ{>-`WKbQfe{+;9>>HAx*-*WvU z1^yBEx4VAJ^^X+zN8sP?`hSy4>gT&MzyhE91mK&ncapk1_!ccjwXrgXvt_FEH-KGIfX_L)OTqGXTd}_o!%1%yO zDbi}!-ixx)T#lq+)bsY(>r$<27L8O$X+j|1jO3g;U!+ZeQ4q3)z4;|mpUD3L3KUN~ delta 104 zcmaE4KACZXq!S-xZJ%gvKpUXO@ GgeCxGz#v8d diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/branch_closed.png b/3rdparty/light_style_sheet/qlightstyle/rc/branch_closed.png index d652159a365396a046329cfc7695c89ee54431ca..bec595ad2e1a951bbf565cedb14c958f783ca95f 100644 GIT binary patch delta 57 zcmZ3$7(PM8SkBYMF@)oKa)JYEvE71#2|E<{=5RlB*ePLj!`GRC;m8MxgRAb^#xekb Mr>mdKI;Vst06tz65dZ)H delta 130 zcmWGvz&JsrhOs!v-HBn{IhmIX3=B+3-tI08bAnC&!~%Jo1s;*b3=G`DAk4@xYmNj^ zkiEpy*OmPahd8&i=4SVIEI=U@PZ!4!j_b(@4y?s?2O@k<#Hgi2s-+w)@atljGg+x2 dQHqO!L31j{`i?cbOn~YcJYD@<);T3K0RYb}BpCnz diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/branch_open-on.png b/3rdparty/light_style_sheet/qlightstyle/rc/branch_open-on.png index ec372b27d1adc1268321a1ffaa9a884daf6de7e6..201a67976c17decef1c1acf0503a78383f92db95 100644 GIT binary patch literal 7085 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 delta 107 zcmZ2$K8!T-gj1shLYnGjIH5vnM%Eu`R?M{oNXe%=QkIG9WxX)gzAVeoYI Kb6Mw<&;$TOkR-7H diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/branch_open.png b/3rdparty/light_style_sheet/qlightstyle/rc/branch_open.png index 66f8e1ac619d242f3d5a31ffb11291c09ea40468..e76b557f71aa958786c750c7216f18f55b71367f 100644 GIT binary patch delta 51 zcmZ3+7&t*iSHjc9F@)oKa>4<&XEhFO5=|0XhFgpuurVyVB5`mTXNx-n5O})!xvX)nsAfN=-*8+b114Mub5CI}U1c(3;@c#maG$cb>vc^|9z?8;t#19T*X3msW zK3AM}+o04Q?llrQ@_}Wpg*TWWG`O?SS?7Skq;@^6CR%??M+gn~eF_-Oy7R@;ol5|I aU02|KBBOVs{|%J@0000vcC{ma zpRJWV1OGje-KeTqV|+*CQsETXDTwnSFai3m?^_YkoPerIWX!FKbbvW9Lgcj&yy^ka z0vd>zj_37KiCS7?jqxRcKRUHq+jZS(A@FsgC~C&5)ezOdTKfPD0GzbI5xE5BF`O3- z2XI|?x{BjAuzwKMt1oW4P&ffbK@dC_4NueS^`3wc$^H5+0PF(qWx+Ff1NPEQZ9^dd z))?JZvngH>$fk2=)8TKV5~u_!fl8nfs01p3t^L5Z|M^do{Q@&Gol1$>U$b%o6QC7E zQL`+vwf2~#Js;-;1a5#vyjD%PDHLkV1i|ldMp3{ delta 465 zcmV;?0WSWk0_y{iB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$RXh}ptR9J=WmrYK>Kp2Lf zuMiZ}1E5zB6Skg1cF0(aCU74yF`;xwmv{`<#CQjB?+*fz&wquKAfPN9Txj3jOyBf* zrcKis`0tVVv2V-?Py-6UrX$WPa3>;-APg;_%LK$XCIl+L0O$fwjs&)WBCr9pTGpP% z5>o-+7#|1(ZqjdWrK>3FIf4UlUM}ZHp4UO-P{0J%wgJ4EP7N50MUGs<0j{E`C+Tzv z7^+A;o}U%i2Y zm-Z>%cNc#ni9jNd2qXfDKq8O`tlST*`k((avrnLpNbbv~GorTz^cMsa?ttQXxtw1Y zyHcs_p;`oP7X&Hun6j?WGZ2hhrL zT=oop2cX9t$q5dJd7};(b-<_tMjbHffKdmGI$-EHVC1!k2E0)^V9oLY@0if7YlarG egRFBp0002LLK`p`8WwN>0000niJ@d$=z|~ny9euti&ZV mEGw+kN?y;pXc5S7%fKMyXYnI#Ywk9nr3{{~elF{r5}E*xl|#`0 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_indeterminate.png b/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_indeterminate.png index 41024f7688c0623c853ee9ceb8138949cb167738..62ab3021afb7dcbd96bdacdccef597fb55ba9545 100644 GIT binary patch delta 279 zcmV+y0qFki1F`~;B!BryL_t(o!|hjF4uUWc#9R2dni{;9bXz!v;ZFs%j}I?HvG2V{LJkWq)(xxDx8YB26~js@Ug@ z$q5(V0=K^$K|sk|B0vOu6%g=yU8(&!uR1h!53`qb0002ovPDHLkV1ktfeWCyW delta 467 zcmV;^0WAKq0__8kB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$RYDq*vR9J=Wm&;DVKoo|* zLkM_%0Q42qgm;l;X$x_o?<207ai~jt2RE(>;T^=i7vz#27k{Ou2H2P(8128Bb|(G4 zPNvN{@ZTf(3sn_sOi&WJR5%589C1DbhCs&)0xKfAB%rDi8*{57O<)4_5qWijS3Lmg zKot?w^!;`wQO?#_V**LxkEL?C;d$Q334D<_j%&$$-a|FC);<7TfKs-gBytH%5;%7a z2k<;^G*6NSFn<-*t1oUgP&fhlVHiHUhG%KF+fP8B^n8660Cs`*O~G?{1NK%4Y$b)j z)&!u=YQ&?z?rJt?xh~@T&yI&+HbY)96j@oQ diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_indeterminate_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_indeterminate_disabled.png index abdc01d906626d5954b7eaa611fabcce80653251..6f3e27610771a6d3341e308c86bddb8e4ddb0fb9 100644 GIT binary patch delta 274 zcmV+t0qy?m1FZs(B!BctL_t(o!|j(z4#F@DMawN1t`_1X3r>Y9aSp@|DD*y*c9q(} zl^8Y0eCFY zE;|5vke2`mz(;_Dub{s-6aWDbfd2uImrwwH0r1V1tafV1#dw*SMN{P)zrc^ZFZe}hy zXJ(io1OGjeZwJO40;fO?SaHO81#U#-B1#eq=qv#Vj7fkN@CNjOM@ItdKpj{H;@H}w zOkyGs7!v@Iz_mXbHQH%<=LinKNwc{*^t>J-djcl1whQ1*)tmxvW08H=aDaB2-ihxw zfOi!+%lfAUc7K3=k|g)8;aQ?6x<#aqYHgN471if?!6zAypMcd_0t-nguy6stXdo~~ zi^hJE*xLN93;co=CK;Z_cpER4B z^J2GJt!-56z~GyJCvpia4=a_cFbucm0k4SkfF%{V$V>Y350efM0PkOauMbY>A{$>b zUsC8K)*h38m}I4)F$XGghUzX*bt3S&=L1yF<8C)~^vyq#58|F`Cn_9>DgXcg07*qo IM6N<$f`W>}8vp*>i(^Q{;p7yFgaZ~kWIjyHRY_bSWxM0d@mCC4(S7Inc-SwTDvJ5m zW0i1)vH3dVi=WdT9b!LwCy*T?a-VUr>cbVxZtIxY_5@lboc+Z3e#V8h*==H*n%5Lt bF)%PpQ2DJ`dQ(ds$Yk(z^>bP0l+XkKaAP$R delta 188 zcmdnV_>*yhiYHr=x4R3&e-K=-cll%n1_sUokH}&M2Hxu+%;=;sy8hD-T!z? iUaYZ|Xn`|31H)`)iytYyDIbA0GI+ZBxvXO!B!BNoL_t(o!|j(bP6I&+Knj2k}J>HPqqvH#iH3ai-@J0?K(IJPJ)=oPaPaO*ha+i*W#U->W4v4!}w&pAyf&5nX1vxg>tf7%5yyhL`* THz~&e0000^jqO+za34ZtnT;vK9cZYdD0d+Ad_q3*qknLWj7+%}5_l?GT6tzA z7w^G;M~W}1DmIS&hRCJDDX`@#KElHAe(#>X!YGAE>07d|f{6ItG5?H2i?ph9D zjG1rJvVP_+4k!jJC`>99vcGke0%kxrNs>-gW^3&+*?2xJ1qj>#?R34qkD}&^;^gkFue*1}`Td?!D2teUk?q*{8ScNK+@ zlLt?9+?3@a^=Q%48FLa369d55JD$=!*Zq3$m+a9yYcDZ?7Jj43{m5X>KDQV^;1M0N z1F#3Y6hHwKKmim$0Te(1{u1DqD_Q&T!4h4ul;+ro$1=vOhNU!iP=p5A+t1iuGnpeF z1h!g#3nrC7^fIb6!Q|PiAIyoilj#VdVZ5h=(QJ5M`~XW$zwh+`xDJx)V_N^E00000 LNkvXXu0mjf5?pz{ delta 438 zcmV;n0ZIO$0?-4HB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$RO-V#SR9J=W*G*2sKp4jH z|62$M>H*LzhzVQIA-l@h8cEz3Xli7-6*p9ifRRzq4Gv0mWT_Ur7o`0VyB_q<|EV z0#d*_V1h{T$4P6A&LJ?_0w|1tO5Jr!`|7UMYNx1HfZ-Ov5xEEQ^GxQ!_x+Q7lxIZx zKu$$k$^PcUqyu=sZ1wm0Vx?W=cy;rfLMM!(TQ(mi$uFpH%$15XQ9TC=Rsdh$e2D5@ gx7Uj;o%u)d2|jRSL6wK!X#fBK07*qoM6N<$f`z)cX#fBK diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_unchecked_focus.png b/3rdparty/light_style_sheet/qlightstyle/rc/checkbox_unchecked_focus.png index c037864f1f6e213f1b6e12c8fe3f253500f403f5..e698c337819fa581a52ad7a37fef0ae5cdb3779a 100644 GIT binary patch delta 9 QcmeysxQ%gw%EY)y02AT^-T(jq delta 65 zcmdnS_ngiE^$+1Sr~;Ty8_GaIY0wBPC~Y=5Rs!U{W_$PQ~Ko2d$~ zDxO9iHgW7%=pAtKtWPEfW`4yjyId8j{5{l~L@z54;#+S&E{ TPPJwL0000ttRyMK=fvX%U6A;Z z>$1yloQn<%JTq)$QuD-NVzJo4atE`Lp%PCMM-)|~d?D+y!g-6cTB)(tJ^2emd2J=l zb($lHV+jc)A%8+f4P{hdAxf)8iis5M$2|PQjz38*nOtQsax9<<6_Voz|AXJ%nuV!J zHz^bYf-koHF$#3;0?oQ@e;?a+^91le16NwxUu^)hpQP8@TI2}m-v%zO+nT%wTy{D4^000SaNLh0L01FcU01FcV0GgZ_00007 zbV*G`2jc}96Eiq_{FH70000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-} z0007JNqn8JBr_; z*=(wjkr9>WxryUg10+dO8e{V9?QOTVw&s4G4}X4M%+1Y(X__9MoSeLnW!b2;HU$uo zC=A0l#+cQqsi`lEi;LL-M;(B6yM0JRu2d?Oi`8oNv{Gsq2z@(q&h75+@4xEz`;V-( zEA#X7T>v>axmK%PjiTsA9LHnEm?K*2<67&w*1G1?iO3)@VXgf(K0f}s)9F}gHk+zm zuYWg&hK8=kaXc0T!F{FF1K!K`d&iVgF3YmfJkL!K$FcTmhhCF2z<+H|e(E&7f`OnZvl9VD6 z0U2O{XTTkQ?Q=fYeeIc_$wVYdlBCqem^=)_H_o|T;2m(+zyG|)cRhaW@jK_-uK!rM z)a!MMqWD;=)uu#bP;31`Db)aO0W-i+;3V+LIX6}m#i?$$yS}-(d2efLt1CM@JAKT~ z&gM}Rg}{V}%!tTk;ItQ20Ykvqq9{(KY5Jwt>n-*B{TIv2%T@q7osMm_T5qkj-^#Ka z2!f#EoGYDkiF59|bMA9lmb=|<<78VwIzj)zq%(Stwu^L6upUw2IcK!h{ WydI@3i5o`%0000ke#9|s1> zN#WDH9FJxgUXIle0ybl~1e>3c6)<4Ygf3=}Y``=E8n78S4cUNeIGoCWLo*0pqpATE rdx5e*q&OO>l8`7)%2dfrEX>4Tx04R}tkv&MmKpe$i(-uW54t7v+ z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JW zDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@;xRFsTNS%r5yTLB5r0BJVy2!*FJ|C5zV6}U z>s^#*d7t}p^eK6h0X~st?f%Ws^E4huXp zY-CdN#9?Bw*uioKvy!0_PZLKJRik_%>$1Xmi?dp(vDQ8L3qyHrCCzo3BZy-O2_zvx zMh#_DU?EDYMt_Ql6z#`6{KJkvNiLaOWiWCqpb8a|;|KqP-`$#psYy2}6a#`Uw*4^* zbnODox@~_S+jjE=@IM1rTH9Z30JEQ@*V|g;24l)$$E+a0rYQDSO@H-GAMkz5RQp)!z>mfO3MMb>NEt z000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Re1sN0+ z7I>gNK>z>%8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b0MkiCK~y-) zrIWi2!hbLjhCdz>J1_`cL>5RL#0+#)E~u}f%MOq_3nWq`Hemq$WFqfBfGfTOr;)Coz|}+6!G@Vo zj5}j~I&d@B(P&l~H_WA(NaH)mqr*1RM+4>nTU}36S`8sq*-v8)X2m*qXL@F~J$|V} zKsh3q1}Qs$b661-Xqt3}@~#Xu5N8r57)kuc#xEXi`#C4c3)lgN0W05BE6@Fz7RMJq WLO#TK^6)PJ0000mju#p z2e@Y{{6A4-4(NC4RLT$Xpu?;iV3LjcqU?g>I(L!&S#N^mO(iWpuKfg%RigrMl* zr3e%~xDTf8Vxm8LxGPK>gNvRe$dlf+_$4f?J;mpyt&- zYLFE|Yh5J-lK$_{8l{aOt>+9u41hq;D4zw;((79xXqJ0~pax)ppk1ChfM%mD-l!@7 zjX{sJ@s@qcKY|H>B!qQ`3Ik{fgZQLE0XU&h zLe&kR7QuR2-G3DT+2Q3IkbOXY1$+QZJr3|T5-bAbTp(wIxgH<}@Vp{a1t39~dQEWZ zRpAKx0xSRy!t^^s5%va~0BRAu?+%y3n*bo@^V~X{0g#I%h^cQAKx71!BQjAD@|2i1 zKqLf{gOX7YOpnTXhJYQG_K48sxV#qx>7|LhGNawFX(lgCSz?5`Hm3nH%*DwF&-4Hv XqdC-2+|Qp+00000NkvXXu0mjfry;f% delta 574 zcmV-E0>S;p1J(qPBYyw}VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_ z000McNliru-vk*D6fJ;ylHULT03B&mSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8() zNlj2>E@cM*00Fv5L_t(|+U=WLk^&(NMNJl_8_?B`8_%4sVqp zqk~&T$V~7(5@a^`RtdVc!V~s>%P0^l{P}i!<+z?s6jATrEPb~mLA@LH**G-3H54)Q zQ4)IcmKYQ@?|;1|Sn_SLn5V$j{PU8qmB+g7h*$5U8tIw$+k)t}2qH!TvgaZH1w17% z;J;1*k4=xY@ksd3X#m*@TSfw_=i#+Lj|4V6yclYc5CQ*h4L}t=B{(+x`#L}=hkMrq zMsYnla61%5%wg|*&_hwg0>&5#niZZU;b(%{X~3%I zt>5|eBWcK)V1|4}0hXIrsK)l@-D1(~J&(?Bz95l3N+Wq)k*Q6#Zi!7A>!M_9@?Bq* z%`Ad;SvNYPgpljbkGBWnX+V4pia~69Vl+wt@nj(Wj{}3` zr0{88jz=>LFUM*K0h=*gg3Zs!3K+0xLKm|~Heeb74cH8vhHSt!98P7xp&5j)QPlv7 ry+BzYQXGv`Nk|kYWvXN*asU7$b2!`&4ZSh|0000EX>4Tx04R}tkv&MmKpe$i(-uW54t7v+ z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JW zDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@;xRFsTNS%r5yTLB5r0BJVy2!*FJ|C5zV6}U z>s^#*d7t}p^eK6h0X~st?f%Ws^E4huXp zY-CdN#9?Bw*uioKvy!0_PZLKJRik_%>$1Xmi?dp(vDQ8L3qyHrCCzo3BZy-O2_zvx zMh#_DU?EDYMt_Ql6z#`6{KJkvNiLaOWiWCqpb8a|;|KqP-`$#psYy2}6a#`Uw*4^* zbnODox@~_S+jjE=@IM1rTH9Z30JEQ@*V|g;24l)$$E+a0rYQDSO@H-GAMkz5RQp)!z>mfO3MMb>NEt z000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Re1sN0* zA{JF&GXMYp8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b0NY7KK~y-) zrIRrdf`2d+M4#x4chE~fV=K3Sj=|asP*_vh(KG4b7EsZ`CA_=m9WAZaCtHXN~hBFAP1@yvMbg5oy2|^#=!SG;HVNe7v+Z; e<;|aIbG-o^1woF~4X1$s00004<&fAihjB$_0&47V6RU}HEgFY|EcWLJL%An>k)JS delta 136 zcmWGs$~Zx#p0PN{-HBn{IhmIX3=B+3-tI08bAnC&!~%Jo1s;*b3=G`DAk4@xYmNj^ zkiEpy*OmPahd4JAOYRKmOrVgar;B3<$Mxid0}MSpJpa!x=8!NlGEm?)k}@(daGD|D j=;kaU9I$mUBf~WT_DlL6_q~9c7(8A5T-G@;B{Ts5JN+XO diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/down_arrow_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/down_arrow_disabled.png index 5805d9842bb3c8bdf9ae741ebabc690a4929585a..e76b557f71aa958786c750c7216f18f55b71367f 100644 GIT binary patch delta 51 zcmZ3+7&t*iSHjc9F@)oKa>4<&XEhFO5=|0XhFgpuurVyVB5`mTXNx-n5O})!xvX<98V3p^r=85p>QL70(Y)*K0- zAbW|YuPgf<4si}q>pRvwvw=cdo-U3d9M_W*4lwla@D$rAa4+F7Ffvf!UdCZyVBj=E k;GhVjh;YEx#f%KccCt^1O_Og1>SFM8^>bOr?3B<10Mw}@F#rGn diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/extend.png b/3rdparty/light_style_sheet/qlightstyle/rc/extend.png index c5fd75afebe85042df42453ab749c6851d97542c..88472c2a8ac12e53c9cc975eae6b0a5130a3149f 100644 GIT binary patch delta 65 zcmX@i7(YS9TFukNF+}2Wa)JWely}?z^B>yrV~OUU|Nre1TNPYcM1@j?o^o}tGO%j| Uzopr09C^n2mk;8 delta 166 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 delta 123 zcmaE6wv2Itq%sQw1H@KMNN_S(D8n(iv61s&N4<&XEhE<98V3p^r=85p>QL70(Y)*K0- zAbW|YuPgf<4sj8Ag`K_SAYEFXE{-7_*OL1sM2iXLWBYy%QNklwCX>B8J9B65%$b?Z<+7En zY$aHYMq@TKW?8KL5L(*;b(MaEB6Sg2qRf9W4#RmE`VESz)_;D(Gl0Q$Qq`DkoVObo7wJ2O|E1x#v)Eu5h6{?FLShHB)J~neu1+*OPR6W^^hD0# zz`hUoS}ZT;{bVfclZ^L>2}dtrpGfY2NQY>44(cX|K*!O0%d@;3Ad=HMfbegC_s1s% zZHCV$1?U-Hor~=Frl3v$r3E3td;wlHc@W?Y6fW1gu)dB4er z!NT6|Hll$O?6HUB7ZW z9(eEYt&d1PPdkjtdfVb%a7;B0 z76scm%Q`FmA<a7hy9ibS%8rP(B+_84m;*0`#sU_4Y+J&>)x&#zJ9#f`1{}T P00000NkvXXu0mjfa-SZ$ delta 919 zcmV;I18Dr&1gr;;BYyw{b3#c}2nYxWdH%*YdHy!ED`BwMOch3FpIp>}WJ@oK@hjl{^ zf}nq^(HNK6m_ZI0inr>R{VJ$sv)NicpWk`v0;=WmTbL~X!v?nmH)K`^aKdm1vr)ka zaMxh&oacS@RDT2nLD09=Y%T!r8+>bFSUP+D{Mvq8-}g^Aa1l5KEZ*DLD9z8$hiU#Z zodm>(zb9$dot(Us#`Qe!Ch&UI_h*5N!$*z)%%$0+Mj#IRmu5C|u2A?KU}Q31%|9gl=}u0*0dVE= z<-=hnb3M*=2skl48k?>6wOXeqrl#ru72p5f%!UWD*<(qC>Fl=%u+?ac3tn)fkJ>j6 zGnwl$JHC%?dpz=YCi6`Y1pNT!I3FS%-EKC|B%PBeKxSjWTD#z$J#^@TU<4^SZPDIK zTaCsA0DsqYf5YrH(7gbIoJl|JS(+dUbvmTbB5r&Bqu`aU1z`4E`<=%)mdf9?a};sg zxR2RT5ggq zNtNMP)%sv4YUC%3}@jDjPy^W2Mq)Wg;)%U-vR;w>3aaYRa+!vL~4`%i$ z(RciDC;w0U&R2YYEHqn0IvTgv8-l-LC(k2|5;dSZGMgzB3WZ^X+i)1002ovPDHLkV1fk@#d81v diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/radio_checked_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/radio_checked_disabled.png index bf0051ede5f00d8cecf17b37c6bb9de38bb24e19..863b6dcbbb9431976ab4d3978feae34abd524151 100644 GIT binary patch delta 573 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 Hu0mjfA~~5; diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked.png b/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked.png index 9a4def65c64a9d55441f82fe66fc7f46e5b73a75..3018453c53d2d9e2c3df55ef70fdf0bbb8cfab5d 100644 GIT binary patch delta 445 zcmV;u0Yd)R1=a(QBYy#%NklcIY%!+)RfeZ}Xkr;v2t7CuYc z?b+|nYOUvR?%V=thG97Ae)CcBccausiI@gs2*O9(^Te3-vax&`#->^?i3x|64*=p+ zdI6C266Aao5tD2$Zt%mKkIfOs^Oid`33`s&wKIo|xdnhD3Hf>)FApScaZgB)zmm-! z0BkXr2mqPv3V#6Y-v)>m3GzPM=Ya!<(kJMUK&}8l=6e800>L7wbA-5FrNvXF7K*iu zg(g!z2n%<+qpM%wL1&4@7(q=3Ry#uV|cgN nmZOc?<-RA|#e}P@vVUtI5`k6)3*erQ00000NkvXXu0mjfBMH#k delta 705 zcmV;y0zUoL1K0(SBYyw{b3#c}2nYxWddMm!6dQpe>tJNvN6;E0^Nq=$x^St{=L-ks1BFZNcKxUJ` zR@8?(j#8=A7tFo`@c|4HCcQst@p$mK{SB0XVRt90;qNSy(oL9C-?}Ao*Faf^w*ZW{XL~Faoy!4ZGMk^9n`^`d07#`$ zFMw5G<+u=%tPliCX7&)sr_<@k@^=LQ*e#cHlGcEH(Ye>fV(~_l?|Kjo9}k>*Z^?2AtwZrKmxPYoRBI8 npCpy)jmAc&H}9#Zp8nMzKGg3-4ZQzl00000NkvXXu0mjf6J|y# diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked_disabled.png index 6ece890e750b0685bbd818f22e5fbf999ccd35e1..30a6368f324641da5d28a9f5c15255700bd2b9dc 100644 GIT binary patch delta 436 zcmV;l0Zab)1T z%>1+#h8wZ9=Ui)zX=hnB5$u3B{tjI$uxFin=tOYZedMc!_kNaUjI1>EfD?Iwo~i>7 zxr9EdfJwBw=yPiRo2(c!>$4CQuRW*+C$59pBhmwVjx-LC=bc~>ldk9!8qZ&e=1>Q~ zgiW5Ma)3xKfq%wZIOj#j>hCrA*UwN=u;y*NhZwz`kwh2u{q0(x}bBQoxD2H_kmf!PAf<6^HFQJcwMd zz2?>2r+q}@rHtcmv%bl};x8RNN3X973Eyx1zd>-?^DThM!2(nt!%*KhD{7zpo@iGC eu98art$YAu0P4{wx|f##00006Hyq3 zpRX0tGI#@4O=(z(ra$opASN0&l!V!~GsFupMi4Yn7A{E9xPNj(v~<{#nBvN~5jQN1 z+BOov5I_Tl3&2#PaXuHc(L|~&1bToEqPnOeJGF5H=m#zU8!9qZC={L@i-2jG z!IOrOQ`H*+FMkLI$MgAo<)Ex(SqXtDR4=RQbTk$lpPZa@8|{ChnLw@lIxw1doCl4v zg+ieWTp6*fQDExR<|e>cqcy=sLpzfh1|A8F&N|M+X0mlkQ8k@zkm_Y%ourCctr zd1XBxfoYnZ-CbR)z{gp~xq8_0zp=B~mq5?gYPHYnV1EX@7I%lkLqJS|!HHJN0RpPG zfL_Be20b%g0})B1TJbt?hvDhmTnSi4)xQ9cLgaO;<#j~$m8f3yEue5p{=DZci(Ony70gw)FKi^z1|aUM4cH~kt$W3lniTU)BC zIV+pJ6jU9r-EjY4+jdG^H>WTlBDu5C=NL;`ECY+cc5Qry{U4G( zU|ry5-f=t+UP}V7|AjORV^CZ-jYtZp-xE6u??koO5ehBL%*_1svu~R=|2Mw@N;loz TjPZhM00000NkvXXu0mjfUV}}g diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked_focus.png b/3rdparty/light_style_sheet/qlightstyle/rc/radio_unchecked_focus.png index b094c2621aad1ff88dbe16102a720263bade263a..5d07abddd348e3cf39fa4d64b4d9674e916ebb97 100644 GIT binary patch delta 412 zcmV;N0b~BZ1+@c^BYy#WNklk}`3{r@CC(mAqs!)Ag$Qb#>L`a^Adoo56OHm8JSg zunBa49`Gr60ou`7Q01CG2@diyg1iG6a1SJSR}&n|yA02-2Y+dP!z^&KyS4z*BME#7 ztd2=C!1u1Kjkn|Fd5fJh_!oAyH?0rWhxB0*7P3>;U4?H=e2Xpx_XdIshYehVW1uQb zsrGE#nNPuy7mkX?nOE)3wT8g)0Hhkn9D|1b=N7kU;`Zz^O*Msx*?oLH>eplvRz0gN40a6Fj}$nuG5RkFwDzENbN| zNh1jrz7a42)?LpqmcbIvu=7X;*rD?@P-GUfBNf8-Hhkr;N(ZxbMWx1wgVNkm8 zUYAEmFrzbWr}le&zxR8e`Td(8R8`ggE)mA~`h%8zwRJT~pc7~X>dny-FeN1J#(LQu z?kR3n9Kb2qm$YICXar_~aUoeU$Msrq4md3&i$aL>K-cuMiU16bowdHLZVqY1O<)Yj zfTr5Inhrl38F0T7nDHyP-G3<8?M(x7KqP=xA$eVaS@Q}w z69wRyR)6|@FZ#4?V1)ue$Z(S~z=w(gu&fmgdj-&ndSE#Uz&qev1yXPxcpDl(NL=8Q zQ?Tu*FFOUh6=)Wc(a-=J>t$C+7R_uAttV4gg!y?bSTQ*g8eq7mxTO_+K)adkp)@yJ z%$V@^_J3cVD*M@4K~5&z()&a*eh9deNXCCoxTQC{`SO!(mIL%lOXRaxy@x^e)=mza z+YY}xP#Zf4+)X6oZHZ*OIN_E`emVcLvRVMHNlWC{KL5Hs`C?61Y9Z;=iagL{#_PC{ zd^D|g+;mI}umJSty1mhVwUTvgTge)>tz?rz;vrfwITDofs;a8$Z~X?*+szlf)O_s# O0000@S diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/right_arrow.png b/3rdparty/light_style_sheet/qlightstyle/rc/right_arrow.png index 9b0a4e6a7a8097818d9c0626c84f19f4d690dd31..0b37a564810fb2e133d6b96ea956171730e9c38b 100644 GIT binary patch literal 7138 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 delta 117 zcmaE4zJPIpq%sQw1HmdKI;Vst06tz65dZ)H delta 130 zcmWGvz&JsrhOs!v-HBn{IhmIX3=B+3-tI08|J(b|><98V3p^r=85p>QL70(Y)*K0- zAbW|YuPgf<4sj8A-akRwbAUoBo-U3d9M_W*99WC(4n+8zh*3+4R7*Kp;Mc`4XR=a5 dq7)YcgXUC@^&M+=nE=%@c)I$ztaD0e0su=`C076d diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/sizegrip.png b/3rdparty/light_style_sheet/qlightstyle/rc/sizegrip.png index 350583aaac4aa474ac449eaea2cc7ddd060276b9..92a83f5525b5d50285a8ca39528653ba18fb4df4 100644 GIT binary patch delta 64 zcmZoaUHx3vIVCg!04Kp1rvLx| diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-branch-end.png b/3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-branch-end.png index cb5d3b51f8cf7fd0f0ed26cfea722fa5a632dc1a..45c3691bd1c9a5dd8cef4e844bd8bf35fe5bd42f 100644 GIT binary patch delta 115 zcmaFB*vdFTGKYnMfgx#YtqPFx@pN$v$+-9S`bJI$1s(>+#|!wLFN*5qb`jXSI;gch zq;t}We$%ZdZbzN|s^T?8BXE&Rr;sX$@kqaO;?A7^7x{EQ9(4g4#9)!YcW6R37#&FAr-gY z-rUH`puoZ4SQyZj9Qd}kRkgExspwA+*PdmovgYQ`l$1@M%Pi(EdF8VmvF&CX@A%e}M=bpY`_UHx3vIVCg!0H#+y$^ZZW diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-branch-more.png b/3rdparty/light_style_sheet/qlightstyle/rc/stylesheet-branch-more.png index 62711409d7ed69ec98979394795822630458d9eb..ad1504ae35ed8849fb541703a47ba5c9c554d1fd 100644 GIT binary patch delta 71 zcmdnS7&SrCk%fVQA-8bJZXl)T>EaloaXvZW0GHU`_%HJtMGRIoM)2NHG&Sux#w=^f Zz`!;m+R{|H(?D8gCb5n0T@ zz%2~Ij105pNB{-dOFVsD+3#?ObL;TRJFj{O6f*O4aSX9Iot&V+s1vp2#s5XF-Tx*p zYVT}3mT;v>Fo98d<;ju@KO0(QdMBZ_gPDG8k~M9Q>}& vym;XuM%NiPt(j-*gyo-Guc$;2#HpHP{Jv3?c9*dlXe5KDtDnm{r-UW|aVa0a literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^fk14@;zM~Ln>~) zy|9s&!GMF=@x%h2>!+5Xk@l literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPaH#?`E`G1!eAAmx#nIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P+Z;9#WAGf*4u-Oyg=Te1>gO1`OFspnaH4_oY}#FfpL8m Q-wTkir>mdKI;Vst0J6j{!2kdN diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/undock-hover.png b/3rdparty/light_style_sheet/qlightstyle/rc/undock-hover.png index 1dfd69895d1b7039b50a2a9ebc2992a37fd92679..8db83fec122631cfeb705c4e5b3f3ed974934be3 100644 GIT binary patch delta 132 zcmV-~0DJ%C1)u?tBYgm8Nkl(}4II6oc6I#AuWP;>ke#9|s1> zN#WDH9FJxgUXIle0ybl~1e>3c6)@ny$ZG774VZ?-fd2%QPlv7y+BzY mQXGv`Nk|kYWvXN*asU7v=3{_c&jg?V0000EX>4Tx04R}tkv&MmKpe$i(-uW54t7v+ z$WWauh>AE$6^me@v=v%)FuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|;_9U6A|?JW zDYS_3;J6>}?mh0_0Yam~R5LIEsG4P@;xRFsTNS%r5yTLB5r0BJVy2!*FJ|C5zV6}U z>s^#*d7t}p^eK6h0X~st?f%Ws^E4huXp zY-CdN#9?Bw*uioKvy!0_PZLKJRik_%>$1Xmi?dp(vDQ8L3qyHrCCzo3BZy-O2_zvx zMh#_DU?EDYMt_Ql6z#`6{KJkvNiLaOWiWCqpb8a|;|KqP-`$#psYy2}6a#`Uw*4^* zbnODox@~_S+jjE=@IM1rTH9Z30JEQ@*V|g;24l)$$E+a0rYQDSO@H-GAMkz5RQp)!z>mfO3MMb>NEt z000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Re1sN0; z23H|ZrvLx|8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b0KG{>K~y-) zrIWD@gMTm(MPC>rdr-#%(32t3xkA*)RXPt5dIo^ndt{BIIiibW1A#A{WZ8G$=YQXD z5U12;HHE?1QHWbkGBWnX+V4pia~69Vl+wt@nj(Wj{}3` zr0{88jz=>LFUM*K0h=*gg3Zs!3K(!;WHt84228_Zz<&Z_(~u3gMuq{`sA>SkUZ5-x mDUL>}BqWNHGF37YIRF6us4(P@700{)0000i!=cM delta 737 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 QfvOoiUHx3vIVCg!0BqhS8~^|S diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/up_arrow_disabled.png b/3rdparty/light_style_sheet/qlightstyle/rc/up_arrow_disabled.png index b9c8e3b53519f086536accd2e8adb193b66817d8..f99b6cc6e36594229122902bb20cb21046f4d5c0 100644 GIT binary patch delta 54 zcmbQw7&1Y{K-$yAF@z&JIpF~Bvzh|}430dEDvm7-v%FXs7^0p@9Q^!8#h3vIJYD@< J);T3K0RY505UT(H delta 129 zcmWHU&p1J)nz1;@-HBn{IhmIX3=B+3-tI08|J(b|><98V3p^r=85p>QL70(Y)*K0- zAbW|YuPgf<4si|<`Jc)+xq(8;o-U3d9M_W*4)8v!Y1k++ku`|rffI+QCKC@&&j}`u csTm9mYu2z&@JlsW160o7>FVdQ&MBb@01pc!6#xJL From e48cd4ce7988fed362da5404760c554d7efc95e2 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 30 Jun 2019 17:44:44 +0300 Subject: [PATCH 342/347] CRC error has been fixed --- .../qlightstyle/rc/branch_open-on.png | Bin 7085 -> 4907 bytes .../qlightstyle/rc/left_arrow.png | Bin 7014 -> 4947 bytes .../qlightstyle/rc/up_arrow.png | Bin 6992 -> 4946 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/branch_open-on.png b/3rdparty/light_style_sheet/qlightstyle/rc/branch_open-on.png index 201a67976c17decef1c1acf0503a78383f92db95..843c8e437cd5ad74488a05b7e29879a13aa6a326 100644 GIT binary patch literal 4907 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 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/left_arrow.png b/3rdparty/light_style_sheet/qlightstyle/rc/left_arrow.png index a20b496d4fb8668d2686076ab140da2cc71448c8..c443da7221b5078ff7597ed2a823b0977ec56ee6 100644 GIT binary patch literal 4947 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 PJ;0i>(IVe$Tg?9ep*7}J literal 7014 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 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/up_arrow.png b/3rdparty/light_style_sheet/qlightstyle/rc/up_arrow.png index 594c86a737b3a8a2334544012666944584583322..6b7223cb1f79c40bc7975b7231b3fa675a83cd24 100644 GIT binary patch literal 4946 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 PI09^Fww6Wa+hYF;s^RI= literal 6992 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 Date: Sun, 30 Jun 2019 18:00:28 +0300 Subject: [PATCH 343/347] CRC error has been fixed --- .../qlightstyle/rc/branch_closed-on.png | Bin 7138 -> 4950 bytes .../qlightstyle/rc/right_arrow.png | Bin 7138 -> 4950 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/branch_closed-on.png b/3rdparty/light_style_sheet/qlightstyle/rc/branch_closed-on.png index 679763a05d1fa5732f321ff6c5b806a53c071851..df2c8a4193f53fedd6cfdb682ffe6a38a5224902 100644 GIT binary patch literal 4950 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 diff --git a/3rdparty/light_style_sheet/qlightstyle/rc/right_arrow.png b/3rdparty/light_style_sheet/qlightstyle/rc/right_arrow.png index 0b37a564810fb2e133d6b96ea956171730e9c38b..02d0771b210559159c4e20eaf2431e72f7531560 100644 GIT binary patch literal 4950 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 From ca458dc9a859870a8ceffa15f9b7144f41a8cab7 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Sun, 30 Jun 2019 22:00:01 +0300 Subject: [PATCH 344/347] Report default units setting parameter has been added --- limereport/lrreportdesignwidget.cpp | 62 +++++++++++++++++----------- limereport/lrreportdesignwidget.h | 5 ++- limereport/lrreportdesignwindow.cpp | 1 + limereport/lrsettingdialog.cpp | 16 +++++++ limereport/lrsettingdialog.h | 2 + limereport/lrsettingdialog.ui | 23 ++++++++++- translations/limereport_ru.qm | Bin 123030 -> 123356 bytes translations/limereport_ru.ts | 20 +++++++++ 8 files changed, 103 insertions(+), 26 deletions(-) diff --git a/limereport/lrreportdesignwidget.cpp b/limereport/lrreportdesignwidget.cpp index c2d52b3..12d4116 100644 --- a/limereport/lrreportdesignwidget.cpp +++ b/limereport/lrreportdesignwidget.cpp @@ -57,7 +57,7 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QSe m_dialogDesignerManager(new DialogDesignerManager(this)), #endif m_mainWindow(mainWindow), m_verticalGridStep(10), m_horizontalGridStep(10), m_useGrid(false), - m_dialogChanged(false), m_theme("Default"), m_settings(settings) + m_dialogChanged(false), m_theme("Default"), m_settings(settings), m_defaultUnits(BaseDesignIntf::Millimeters) { #ifdef HAVE_QT4 m_tabWidget = new LimeReportTabWidget(this); @@ -74,10 +74,19 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QSe setLayout(mainLayout); m_report=report; - if (!m_report->pageCount()) m_report->appendPage("page1"); + + m_settings->beginGroup("DesignerWidget"); + QVariant v = m_settings->value("DefaultUnits"); + if (v.isValid()){ + m_defaultUnits = static_cast(v.toInt()); + } + m_settings->endGroup(); + + if (!m_report->pageCount()){ + createStartPage(); + } createTabs(); - connect(dynamic_cast(m_report), SIGNAL(pagesLoadFinished()),this,SLOT(slotPagesLoadFinished())); connect(dynamic_cast(m_report), SIGNAL(cleared()), this, SIGNAL(cleared())); connect(dynamic_cast(m_report), SIGNAL(loadFinished()), this, SLOT(slotReportLoaded())); @@ -102,6 +111,8 @@ ReportDesignWidget::ReportDesignWidget(ReportEnginePrivateInterface* report, QSe #endif m_themes.insert("Default",""); + m_localToEng.insert(QObject::tr("Dark"), "Dark"); + m_localToEng.insert(QObject::tr("Light"), "Light"); initThemeIfExist("Dark", ":/qdarkstyle/style.qss"); initThemeIfExist("Light", ":/qlightstyle/lightstyle.qss"); } @@ -135,8 +146,6 @@ QWidget *ReportDesignWidget::toolWindow(ReportDesignWidget::ToolWindowType windo return dialogDesignerManager()->resourcesEditor(); case SignalSlotEditor: return dialogDesignerManager()->signalSlotEditor(); - default: - return 0; } } @@ -191,6 +200,7 @@ void ReportDesignWidget::saveState() m_settings->setValue("useGrid",m_useGrid); m_settings->setValue("theme",m_theme); m_settings->setValue("ScriptEditorState", m_scriptEditor->saveState()); + m_settings->setValue("DefaultUnits", m_defaultUnits); m_settings->endGroup(); } @@ -264,10 +274,15 @@ void ReportDesignWidget::loadState() } v = m_settings->value("ScriptEditorState"); - if (v.isValid()){ + if (v.isValid() && m_scriptEditor){ m_scriptEditor->restoreState(v.toByteArray()); } + v = m_settings->value("DefaultUnits"); + if (v.isValid()){ + m_defaultUnits = static_cast(v.toInt()); + } + m_settings->endGroup(); applySettings(); } @@ -276,18 +291,13 @@ void ReportDesignWidget::loadState() void ReportDesignWidget::createTabs(){ m_tabWidget->clear(); int pageIndex = -1; - for (int i = 0; ipageCount();++i){ -// QGraphicsView* view = new QGraphicsView(qobject_cast(this)); + for (int i = 0; i < m_report->pageCount(); ++i){ PageView* view = new PageView(qobject_cast(this)); view->setBackgroundBrush(QBrush(Qt::gray)); view->setFrameShape(QFrame::NoFrame); view->setScene(m_report->pageAt(i)); view->setPageItem(m_report->pageAt(i)->pageItem()); -// foreach(QGraphicsItem* item, m_report->pageAt(i)->selectedItems()){ -// item->setSelected(false); -// } - m_report->pageAt(i)->clearSelection(); view->centerOn(0,0); @@ -301,13 +311,6 @@ void ReportDesignWidget::createTabs(){ m_scriptEditor = new ScriptEditor(this); -// m_settings->beginGroup("DesignerWidget"); -// QVariant v = m_settings->value("ScriptEditorState"); -// if (v.isValid()){ -// m_scriptEditor->restoreState(v.toByteArray()); -// } -// m_settings->endGroup(); - connect(m_scriptEditor, SIGNAL(textChanged()), this, SLOT(slotScriptTextChanged())); m_scriptEditor->setReportEngine(m_report); pageIndex = m_tabWidget->addTab(m_scriptEditor,QIcon(),tr("Script")); @@ -378,10 +381,12 @@ void ReportDesignWidget::connectPage(PageDesignIntf *page) emit activePageChanged(); } -void ReportDesignWidget::createStartPage() +PageDesignIntf* ReportDesignWidget::createStartPage() { - m_report->appendPage("page1"); - createTabs(); + PageDesignIntf* page = m_report->appendPage("page1"); + page->pageItem()->setUnitType(m_defaultUnits); +// createTabs(); + return page; } void ReportDesignWidget::removeDatasource(const QString &datasourceName) @@ -707,7 +712,6 @@ void ReportDesignWidget::initThemeIfExist(const QString &themeName, const QStrin theme.open(QIODevice::ReadOnly); QString styleSheet = theme.readAll(); m_themes.insert(themeName, styleSheet); - m_localToEng.insert(QObject::tr(themeName.toLatin1()), themeName); } } @@ -786,10 +790,22 @@ void ReportDesignWidget::editSetting() setting.setDesignerThemes(themes, QObject::tr(m_theme.toLatin1())); setting.setDesignerLanguages(m_report->designerLanguages(), m_report->currentDesignerLanguage()); + QList unitTypes; + unitTypes << QObject::tr("Millimeters") << QObject::tr("Inches"); + setting.setDesignerUnites(unitTypes, + m_defaultUnits == BaseDesignIntf::Millimeters ? + QObject::tr("Millimeters") : + QObject::tr("Inches")); + if (setting.exec()){ m_horizontalGridStep = setting.horizontalGridStep(); m_verticalGridStep = setting.verticalGridStep(); m_defaultFont = setting.defaultFont(); + if (setting.reportUnits().compare(QObject::tr("Millimeters")) == 0) + m_defaultUnits = BaseDesignIntf::Millimeters; + else { + m_defaultUnits = BaseDesignIntf::Inches; + } if (m_localToEng.contains(setting.theme())){ m_theme = m_localToEng.value(setting.theme()); } else { diff --git a/limereport/lrreportdesignwidget.h b/limereport/lrreportdesignwidget.h index 5de247e..f48879c 100644 --- a/limereport/lrreportdesignwidget.h +++ b/limereport/lrreportdesignwidget.h @@ -125,7 +125,8 @@ public: ReportDesignWidget(ReportEnginePrivateInterface* report, QSettings* settings, QMainWindow *mainWindow, QWidget *parent = 0); ~ReportDesignWidget(); - void createStartPage(); + PageDesignIntf *createStartPage(); + void createTabs(); void clear(); DataSourceManager* dataManager(); ScriptEngineManager* scriptManager(); @@ -240,7 +241,6 @@ signals: void pageAdded(PageDesignIntf* page); void pageDeleted(); protected: - void createTabs(); #ifdef HAVE_QTDESIGNER_INTEGRATION void createNewDialogTab(const QString& dialogName,const QByteArray& description); #endif @@ -274,6 +274,7 @@ private: QSettings* m_settings; QMap m_themes; QMap m_localToEng; + BaseDesignIntf::UnitType m_defaultUnits; }; } // namespace LimeReport diff --git a/limereport/lrreportdesignwindow.cpp b/limereport/lrreportdesignwindow.cpp index 20d1273..d98af07 100644 --- a/limereport/lrreportdesignwindow.cpp +++ b/limereport/lrreportdesignwindow.cpp @@ -677,6 +677,7 @@ void ReportDesignWindow::startNewReport() m_reportDesignWidget->saveState(); m_reportDesignWidget->clear(); m_reportDesignWidget->createStartPage(); + m_reportDesignWidget->createTabs(); m_lblReportName->setText(""); updateRedoUndo(); m_reportDesignWidget->slotPagesLoadFinished(); diff --git a/limereport/lrsettingdialog.cpp b/limereport/lrsettingdialog.cpp index ee54096..bff304c 100644 --- a/limereport/lrsettingdialog.cpp +++ b/limereport/lrsettingdialog.cpp @@ -75,6 +75,11 @@ QLocale::Language SettingDialog::designerLanguage() return QLocale().language(); } +QString SettingDialog::reportUnits() +{ + return ui->reportUnits->currentText(); +} + void SettingDialog::setSuppressAbsentFieldsAndVarsWarnings(bool value){ ui->cbSuppressWarnings->setChecked(value); } @@ -148,6 +153,17 @@ void SettingDialog::setDesignerThemes(QList themes, const QString &curr #endif } +void SettingDialog::setDesignerUnites(QList unitTypes, const QString currentUnitType) +{ + ui->reportUnits->clear(); + ui->reportUnits->addItems(unitTypes); +#ifdef HAVE_QT4 + ui->cbTheme->setCurrentIndex(ui->cbTheme->findText(currentUnitType)); +#else + ui->reportUnits->setCurrentText(currentUnitType); +#endif +} + void SettingDialog::setSettings(QSettings* settings){ m_settings = settings; if (m_settings){ diff --git a/limereport/lrsettingdialog.h b/limereport/lrsettingdialog.h index 3049d87..b10139f 100644 --- a/limereport/lrsettingdialog.h +++ b/limereport/lrsettingdialog.h @@ -26,6 +26,7 @@ public: QString theme(); bool suppressAbsentFieldsAndVarsWarnings(); QLocale::Language designerLanguage(); + QString reportUnits(); void setSuppressAbsentFieldsAndVarsWarnings(bool value); void setHorizontalGridStep(int value); void setVerticalGridStep(int value); @@ -35,6 +36,7 @@ public: void setTheme(const QString& theme); void setDesignerLanguages(QList languages, QLocale::Language currentLanguage); void setDesignerThemes(QList themes, const QString& currentTheme); + void setDesignerUnites(QList unitTypes, const QString currentUnitType); void setSettings(QSettings* settings); private slots: void on_bbOkCancel_accepted(); diff --git a/limereport/lrsettingdialog.ui b/limereport/lrsettingdialog.ui index 86fe2e2..3c197bf 100644 --- a/limereport/lrsettingdialog.ui +++ b/limereport/lrsettingdialog.ui @@ -23,7 +23,7 @@ - 2 + 0 @@ -174,6 +174,27 @@ + + + + + + Report units + + + + + + + + 0 + 0 + + + + + + diff --git a/translations/limereport_ru.qm b/translations/limereport_ru.qm index 18ad2b88ee1a568937de2e810ad9e816a30db67b..12ec7530b47fb12eeb917efec1ff743ed4673b60 100644 GIT binary patch delta 1257 zcmY+EeNa?Y7{=fCc=s-MSy&d?oJCm#1#&XXkHsd~lbIOFja27g!XP3QUvwBe7AlGGm4*nd#{Lt2=Y=Z_b?a-1DC2 zJm*yPEAKd!6#>!=0CNCdF0Kp;mI?usCcrDZDifnv>)Og90~;Bxta-^;2H0%`;cP9y zZ;j81?^?RlN_Bv}`{DJ~rA#L_=!2Uo;pLi3{*#XufCt%w@U_DU}aQEfs#HBZ69xMTC z8P_}irD+zWYFY?eX1ILFMaDTP%d%U(035Kw?x%|ZQ;y3VF~gpSUw9pM$bB}Y>yuvIn~dxqn&&NgR0dRuASg!H2+CP;SAoONnsn-kx3COb+eRe58yc$*%X;<Uv+=(hoT z=960)8&WKs-ZB6%(J7pM$^hp}GT+-S^P6oH<`vGIj8eVkEjcTErO@-e8x$Je`UueT zhS1<4z|YRftT`++ZoL86IYs4OR_0t!Q(l{}l}u8g_&Im8uY%I0NOoZ(l}JgU&ML+B zXGS=0DR$mk1E@csu>a5pxN46g`*JCuYXLoyl9+3njH*poPUWfy9H&<$y9ig>}6(7z4 zTwNlbTrL5g|D8s?qt=}d66+V_16J=98!P7VQp{r0>;^8*m)SHVb8v~++?)WI)+=_D z0uQuV?6YhJtoutGNX+6HsH9YNDZ3I+E?zE-_0Z6%M~ZS{`P6u{I-nIk93IQI+>>f~H2>sv#{fb05O8fEGV zz|1kt3)iywa>FzsZf;%wbqdm%*-#N>=nVeuMVf|&0Dfo=Xc|lJa}$nGxo)FoxLR}X zBELvZwdL@G)KUCE*Zx3%3=b($@AZ(hN|eedKHI1csV;`ZHrn4#5&3PvGD zFbS^+7BAqB$X{ViR^G1mwlRzo9AAfEu;czX?lSlaA;JniIzfp3-)O~#9D86vxl`@%#Oj-va*F<>9RIEM+A{2UMI%7ou7SrLE7OOs^HQi6%} z0`t|doCZeHoMs?u7nl%Xd95zHu&|6MLV?bR_Q1wQ8y$+NX`s6L`{#b<+&kxCH1jyr3bM4OUOCa3^14Qh`4S-;h}2CInMmtvn2Q> ztL;Ou=WmvR_iHlxW$O1Wt^&+F3XkZEfl~c1fWAz4`(cQzNhm*lh!wb>oPOr`0B9PV zWA&$i^T#m2y=icf5pK?dmp=@6{v2FB#^h-GoJ@QRmeB%VfDx1}L`(i$<|!XwdkIwv z`J8WxW`$(V_78=LdVG-#;sGS;64SYMFD;4D%r#QAp0oc)CRHNUsIt{PWBkFbdjSWC zZmUvb_5A5QZh+}t{`4XTxKdL1UZKJZGi3CS;|Axb)PH$=4F9d5V_AE7+bbV3O*is3 z9|1PDD?C%h+h3jl>^(|t{yCgGfdpwczC?M_3aXOUaUJv2CZ#{-E*AYmHNYzVS#)LP0yfQy zZsV(fgBE%>u!b9ZoR$KkF}yP}C=R*NCNeI&xx(?2w82#d==fCHdTupf?l#FVKFjP4 zWRRn@eGaLpJ`yl#Rw};48r^-HN@cU|3CVXU7~pP@bTvo|aAQci`xSe7U1RjSoP`Z! z2+q=#sEb-R0cIpB99dLb)+__;siNlK49%13ffFpO@P|TY2rUJtaGkfvpwVM46=~u) z?-ZTXq~Z=5XNL1EEokaF&ogvVo5FcMqj7CA=PD*4Bvoe&EZDgb&~`ZR_3=zV(|U!z zGRg~SK{E-VIo!no$_u@stCUryB*6Tua`@#Ez{1sX>@ZWvb&rf;DM{V}+1zvj@IaLO zP7iBp=o;Db*K17CeR7qBMHmufn=O=$Plar+`3g mtPOW)!|@}V(c%OyC Theme Тема + + Report units + Единицы измерения + LimeReport::SubDetailBand @@ -3154,5 +3158,21 @@ This preview is no longer valid. '' + + Millimeters + Миллиметры + + + Inches + Дюймы + + + Dark + Темная + + + Light + Светлая + From 77971b9d1c0422ca659eae967f2ccc47b2147734 Mon Sep 17 00:00:00 2001 From: fralx Date: Mon, 1 Jul 2019 10:57:09 +0300 Subject: [PATCH 345/347] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 00a80dd..c149dff 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ LimeReport v1.4.7 [![Build Status](https://api.travis-ci.org/fralx/LimeReport.svg?branch=master)](https://travis-ci.org/fralx/LimeReport) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/bc31412ea4814f30825b5ed3723e9a70)](https://app.codacy.com/app/fralx/LimeReport?utm_source=github.com&utm_medium=referral&utm_content=fralx/LimeReport&utm_campaign=Badge_Grade_Dashboard) ----------- Official LimeReport web site [http://limereport.ru](http://limereport.ru) ----------- From e6371efbec376b7817e7debe720b745254de8c2d Mon Sep 17 00:00:00 2001 From: fralx Date: Mon, 1 Jul 2019 10:59:18 +0300 Subject: [PATCH 346/347] Update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c149dff..6c6ee2b 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ LimeReport v1.4.7 [![Build Status](https://api.travis-ci.org/fralx/LimeReport Official LimeReport web site [http://limereport.ru](http://limereport.ru) ----------- -##Features +## Features * Multi-platform support * Pure Qt4/Qt5 compatible code * Embedded report designer @@ -22,7 +22,7 @@ Official LimeReport web site [http://limereport.ru](http://limereport.ru) * PDF output -##How to use it +## How to use it 1. Build limereport.pro. It will create a limereport shared library 2. In your project connect the limereport library then in source code add: @@ -41,7 +41,7 @@ For more samples see a demo ## Change log -###1.4.7 +### 1.4.7 1. Multipage 2. Dialogs 3. Render events @@ -52,21 +52,21 @@ For more samples see a demo 8. Editable report And many others minor fixes and improvements -###1.3.11 +### 1.3.11 1. LimeReport project structure has been changed 2. Preview widget has been added 3. New demo has been added 4. Landscape page orientation has been fixed 5. Other minor bugs has been fixed -###1.3.10 +### 1.3.10 1. Memory leak has been fixed 2. Grid & Settings have been added 3. Recent files menu has been added 4. Magnet feature has been added 5. Added ability to use variables in the connection settings -###1.3.9 +### 1.3.9 New functions: ```cpp QString::saveToString(), @@ -85,7 +85,7 @@ Performance has been improved From this version the item "Text" by default does not use HTML. To enable HTML support you need to use the property allowHTML -###1.3.1 +### 1.3.1 Added: 1. Columns Some bands can be divided into columns @@ -101,7 +101,7 @@ Fixed: 1. Postgresql connection 2. The error that prevented normal run of more than one instance of LimeReport::ReportEngine -###1.2.1 +### 1.2.1 1. Added buttons to open / hide sidebars; 2. Improved look-and-feel of report elements to clarify designing process; 3. Printing to PDF added. From e03175f6784566ae3f616db780ae5ea78b847a50 Mon Sep 17 00:00:00 2001 From: Arin Alexander Date: Mon, 1 Jul 2019 17:01:55 +0300 Subject: [PATCH 347/347] dateFormat and dateTimeFormat functions have been improved --- limereport/lrscriptenginemanager.cpp | 29 ++++++++++++++-------------- limereport/lrscriptenginemanager.h | 6 +++--- limereport/lrsimplecrypt.cpp | 2 +- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/limereport/lrscriptenginemanager.cpp b/limereport/lrscriptenginemanager.cpp index 8a8b1d1..cb6e219 100644 --- a/limereport/lrscriptenginemanager.cpp +++ b/limereport/lrscriptenginemanager.cpp @@ -640,24 +640,22 @@ bool ScriptEngineManager::createNumberFomatFunction() } bool ScriptEngineManager::createDateFormatFunction(){ -// addFunction("dateFormat",dateFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); JSFunctionDesc fd; fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); fd.setCategory(tr("DATE&TIME")); fd.setName("dateFormat"); - fd.setDescription("dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); - fd.setScriptWrapper(QString("function dateFormat(value, format){" + fd.setDescription("dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\", \""+tr("Locale")+"\")"); + fd.setScriptWrapper(QString("function dateFormat(value, format, locale){" " if(typeof(format)==='undefined') format = \"dd.MM.yyyy\"; " - "return %1.dateFormat(value,format);}" + "return %1.dateFormat(value,format, locale);}" ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); return addFunction(fd); } bool ScriptEngineManager::createTimeFormatFunction(){ -// addFunction("timeFormat",timeFormat,"DATE&TIME", "dateFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); JSFunctionDesc fd; fd.setManager(m_functionManager); @@ -674,17 +672,16 @@ bool ScriptEngineManager::createTimeFormatFunction(){ } bool ScriptEngineManager::createDateTimeFormatFunction(){ -// addFunction("dateTimeFormat", dateTimeFormat, "DATE&TIME", "dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); JSFunctionDesc fd; fd.setManager(m_functionManager); fd.setManagerName(LimeReport::Const::FUNCTION_MANAGER_NAME); fd.setCategory(tr("DATE&TIME")); fd.setName("dateTimeFormat"); - fd.setDescription("dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\")"); - fd.setScriptWrapper(QString("function dateTimeFormat(value, format){" + fd.setDescription("dateTimeFormat(\""+tr("Value")+"\",\""+tr("Format")+"\", \""+tr("Locale")+"\")"); + fd.setScriptWrapper(QString("function dateTimeFormat(value, format, locale){" " if(typeof(format)==='undefined') format = \"dd.MM.yyyy hh:mm\"; " - "return %1.dateTimeFormat(value,format);}" + "return %1.dateTimeFormat(value, format, locale);}" ).arg(LimeReport::Const::FUNCTION_MANAGER_NAME) ); return addFunction(fd); @@ -1583,13 +1580,14 @@ QVariant ScriptFunctionsManager::line(const QString &bandName) QVariant ScriptFunctionsManager::numberFormat(QVariant value, const char &format, int precision, const QString& locale) { - return (locale.isEmpty())?QString::number(value.toDouble(),format,precision): - QLocale(locale).toString(value.toDouble(),format,precision); + return (locale.isEmpty()) ? QString::number(value.toDouble(),format,precision): + QLocale(locale).toString(value.toDouble(),format,precision); } -QVariant ScriptFunctionsManager::dateFormat(QVariant value, const QString &format) +QVariant ScriptFunctionsManager::dateFormat(QVariant value, const QString &format, const QString& locale) { - return QLocale().toString(value.toDate(),format); + return (locale.isEmpty()) ? QLocale().toString(value.toDate(),format) : + QLocale(locale).toString(value.toDate(),format); } QVariant ScriptFunctionsManager::timeFormat(QVariant value, const QString &format) @@ -1597,9 +1595,10 @@ QVariant ScriptFunctionsManager::timeFormat(QVariant value, const QString &forma return QLocale().toString(value.toTime(),format); } -QVariant ScriptFunctionsManager::dateTimeFormat(QVariant value, const QString &format) +QVariant ScriptFunctionsManager::dateTimeFormat(QVariant value, const QString &format, const QString& locale) { - return QLocale().toString(value.toDateTime(),format); + return (locale.isEmpty()) ? QLocale().toString(value.toDateTime(),format) : + QLocale(locale).toString(value.toDateTime(),format); } QVariant ScriptFunctionsManager::sectotimeFormat(QVariant value, const QString &format) diff --git a/limereport/lrscriptenginemanager.h b/limereport/lrscriptenginemanager.h index 760ffc0..f59405c 100644 --- a/limereport/lrscriptenginemanager.h +++ b/limereport/lrscriptenginemanager.h @@ -355,10 +355,10 @@ public: Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName, QObject* currentPage); Q_INVOKABLE QVariant calcGroupFunction(const QString& name, const QString& expressionID, const QString& bandName); Q_INVOKABLE QVariant line(const QString& bandName); - Q_INVOKABLE QVariant numberFormat(QVariant value, const char &format, int precision, const QString &locale); - Q_INVOKABLE QVariant dateFormat(QVariant value, const QString& format); + Q_INVOKABLE QVariant numberFormat(QVariant value, const char &format, int precision, const QString& locale); + Q_INVOKABLE QVariant dateFormat(QVariant value, const QString& format, const QString& locale); Q_INVOKABLE QVariant timeFormat(QVariant value, const QString& format); - Q_INVOKABLE QVariant dateTimeFormat(QVariant value, const QString& format); + Q_INVOKABLE QVariant dateTimeFormat(QVariant value, const QString& format, const QString& locale); Q_INVOKABLE QVariant sectotimeFormat(QVariant value, const QString& format); Q_INVOKABLE QVariant date(); Q_INVOKABLE QVariant now(); diff --git a/limereport/lrsimplecrypt.cpp b/limereport/lrsimplecrypt.cpp index d79273e..f54cbb2 100644 --- a/limereport/lrsimplecrypt.cpp +++ b/limereport/lrsimplecrypt.cpp @@ -73,7 +73,7 @@ private: void RC5_SETUP(const char *K); void RC5_ENCRYPT(WORD *pt, WORD *ct); void RC5_DECRYPT(WORD *ct, WORD *pt); - WORD S[26]; + WORD S[26] = {0}; bool m_prepared; };